PDA

Просмотр полной версии : Estex DSS и shell



Error404
05.02.2022, 01:16
Из закрытой темы:


перевёл в git собираемую Estex DSS из официальных исходников (вплоть до 1.70) с поверсионными коммитами чтобы отслеживать изменения от версии к версии, а также исходники всех утилит, с комментами (где были) переведёнными в utf8, чтобы можно было с веба читать:

https://gitlab.com/sprinter-computer/dos

Проверил всё собирается и выдаёт бинари идентичные версии 1.60R (разные версии SYSTEM.DOS, SYSTEM.EXE и BOOT.EXE тоже проверил на собираемость и корректность)

Тоже самое планирую сделать с биосом и другими приложениями для Спринтера, исходники которых доступны:

https://gitlab.com/sprinter-computer/bios
https://gitlab.com/sprinter-computer/apps

Для сохранения исторического наследия так сказать...

P.S. Но за "правильными" версиями DSS со всеми последними изменениями надо всё также идти к Sayman-у


Поэтому не стал заводить issue, уж кто и как из Сашей разрулит пустяковый кейс - сами решат :)
Кто-то же, я краем слышал (и сразу забыл), пилит по-малу шелл?
Собрал такой забавный баг (возможно, известный): в helloworld.mac получаю строку версии BIOS и сразу вывожу эту строку на экран функцией DSS (благо оно заявлено как ASCIIZ). Вроде все написал правильно, ошибаться там в принципе негде (сначала hello и следом сразу строка версии BIOS, оба раза через одинаковую функцию DSS).

А не выводится строка версии. Уж и так и сяк - не выводится. В коде есть, на экране - нет. Хотел дебажить, спасло отсутствие в estex дебагера. :)
Потом уже пришла мысль воткнуть inkey перед возвратом в shell - и строка версии вывелась, и разгадка в следующем: шелл при в начале вывода промпта вместо CR-LF"промпт" (как оно принято), делает CR"промпт", и счастливо (и моментально) промптом перетирает поверх (причем до конца строки) то, что выводилось на экран в крайней строке - в моем случае строке версии (т.к. эта строка не содержит LF).

Поправьте на CR-LF"промпт", пожалуйста, т.к. оно не только в таких случаях будет так отрабатывать, но и последнюю строку файла в команде type будет затирать если например файл не заканчивается на LF. Кстати, а где команда type ? В DSS какой-то другой аналог?

Sayman
05.02.2022, 08:04
Error404, давай код, чтоли, не работающий. файлик приатач.
из мануала:


LD HL,MSG ;сообщение для вывода
LD C,5Ch ;номер системного вызова (PCHARS)
RST 10h ;вызов подсистемы

LD C,41h ;номер системного вызова (EXIT)
RST 10h ;вызов подсистемы
JP $ ;ловля багов.

MSG: db "Hello, world!",0Dh,0Ah ;наша стока
db 0 ;конец строки

нормально выводится, ничего не затирается. во всяком случае я с таким не сталкивался.
отладчик есть: если на реале - demon.exe. Можно и под эмулем. бреак ставится в дебагере даблкликом слева от адреса.

Error404
05.02.2022, 10:06
Error404, давай код, чтоли, не работающий. файлик приатач.
из мануала:

нормально выводится, ничего не затирается. во всяком случае я с таким не сталкивался.
отладчик есть: если на реале - demon.exe. Можно и под эмулем. бреак ставится в дебагере даблкликом слева от адреса.

В этом самом примере вместо
MSG: db "Hello, world!",0Dh,0Ah ;наша стока

Напиши
MSG: db "Hello, world!" ;наша стока

И эту строку не увидишь если запускать helloworld из промпта (приглашения) ОС, т.е. в CCP/shell

Romych
05.02.2022, 10:28
Sayman, Error404 имеет в виду другое. Если приложение выводит строку и само не делает в конце CR+LF, то при выходе из программы, дос промпт начиная вывод с начала строки затрет вывод программы.
Баг это или политика поведения дос, это большой вопрос. Я считаю, что приложение должно подстраиваться под ОС для которой оно написано.

Sayman
05.02.2022, 10:34
Я понял. Спасибо. Завтра посмотрю и поправлю. Сёдня я не дома.

Error404
05.02.2022, 11:35
приложение должно подстраиваться под ОС для которой оно написано.

А не получится подстроиться под CCP. Ведь это может быть требуемым условием - чтобы файл не оканчивался переводом строки (например если этот файл - часть полученная split-ом большого файла), и тогда type (если оно аналог CPM и MSDOS) или cat (если аналог unix) пришлось бы чтобы подстраиваясь к выводу на экран добавлять в конце вывода отсебятину. Что не давало бы обратно собрать из кусочков оригинальный файл: внедрялась бы отсебятина.

Кстати, все еще актуален вопрос - чем в estex принято просматривать файл в CCP (type,cat,...) ?

Сразу задам еще вопросики. Потом объединю в первом посте, будет шпаргалка для начинающих.
Есть ли дока по устройству estex? В которой было бы описано:

1) откуда стартует и где заканчивается TPA (область в адресном пространстве процессора где программа пользователя может использовать ОЗУ адресного пространства CPU без подключения доп. страниц и с гарантией что ее там никто не пропилит). Интересует окружение когда прога запущена из CCP как "стандарт" (FN по-хорошему при старте чужой проги должен отдавать ей такое же окружение, да FN и вообще может не быть. FN же для запуска DSS 40h (64) EXEC использует или что-то своё? А DSS 40h (64) EXEC - стандарт окружения или тоже не гарантия?).
Ну т.е. по остаточной памяти в 16к сегменте 0 сидит BIOS/DSS, с 4000h где-то еще вкрапления экранов, и с какого то адреса должна начаться "безопасная область". 8000..BFFF "взятые с потолка" как в большинстве примеров, это слишком мало. Вопрос со стеком тут ранее уже задавали, тоже осталось не совсем понятно: DSS при выполнении "чреватых" операций уносит стек на свой безопасный с восстановлением оригинального при выходе из п/п или нет? Стек ниже BFFF - это неудобно.

2) Как приложению передается строка параметров ОС (то что мы наколотили в строке ввода shell) - в каком-то буфере? Или адрес буфера не гарантирован и требуются функции типа 43h (67) GSWITCH (Get command line switch), довольно странного вида?

3) Estex делает ли предразбор строки (как делали CPM и MSDOS заполняя FCB1 и FCB2)?

4) установка текстовых режимов в начале каждого консольного приложения как я вижу в некоторых исходниках - это требование или перестраховка? По логике вряд ли могло так случиться, чтобы каждый командер позволял себе запускать стартуемое приложение в абы как включенных экранных режимах и абы каких страницах?

Это вопросы, сразу возникающие при первом helloworld, и сходу (без лазания в чужие проги) не освещенные (или не на поверхности). Т.е. to be continued... :) КМК, статья, которая тут получится (или FAQ), будет полезна всем. В т.ч. как и общий знаменатель чтобы не плодить зоопарк.

Error404
05.02.2022, 23:05
1) откуда стартует и где заканчивается TPA (область в адресном пространстве процессора где программа пользователя может использовать ОЗУ адресного пространства CPU без подключения доп. страниц и с гарантией что ее там никто не пропилит). Интересует окружение когда прога запущена из CCP как "стандарт" (FN по-хорошему при старте чужой проги должен отдавать ей такое же окружение, да FN и вообще может не быть. FN же для запуска DSS 40h (64) EXEC использует или что-то своё? А DSS 40h (64) EXEC - стандарт окружения или тоже не гарантия?).
Ну т.е. по остаточной памяти в 16к сегменте 0 сидит BIOS/DSS, с 4000h где-то еще вкрапления экранов, и с какого то адреса должна начаться "безопасная область". 8000..BFFF "взятые с потолка" как в большинстве примеров, это слишком мало. Вопрос со стеком тут ранее уже задавали, тоже осталось не совсем понятно: DSS при выполнении "чреватых" операций уносит стек на свой безопасный с восстановлением оригинального при выходе из п/п или нет? Стек ниже BFFF - это неудобно.


При старте из шелла простейшее приложение helloworld из примера стартует с таким набором страниц:
0000..3fff = FB:82 {page:xframe}
4000..7fff = FF:A2
8000..bfff = F6:C2
c000..ffff = FF:E2

что прискорбно (т.к. это фактически с 16кб ОЗУ TPA), и сразу надо начинать с операций над страницами (либо уживаться как есть если приложение маленькое).



2) Как приложению передается строка параметров ОС (то что мы наколотили в строке ввода shell) - в каком-то буфере? Или адрес буфера не гарантирован и требуются функции типа 43h (67) GSWITCH (Get command line switch), довольно странного вида?


Адрес буфера передается приложению параметром в регистре IX и обычно равен "адресу посадки" минус 128. Буфер хранится в виде такой структуры: <length>< cmdline>0000h<self>
что похоже на то как командная строка передается в CP/M и MSDOS

Shaos
06.02.2022, 14:01
В этом самом примере вместо
MSG: db "Hello, world!",0Dh,0Ah ;наша стока

Напиши
MSG: db "Hello, world!" ;наша стока

И эту строку не увидишь если запускать helloworld из промпта (приглашения) ОС, т.е. в CCP/shell
ну вот тут извините-подвинтесь - это таки фича, а не баг :)
если хочешь чтобы твоя строка вывелась, то по правилам всех терминалов и шеллов её надо закончить переводом ;)

Sayman
06.02.2022, 15:33
Кстати, все еще актуален вопрос - чем в estex принято просматривать файл в CCP (type,cat,...) ?
type чёто поломался. толи исходник битый, толи не понятно. не работает. надо чинить.


откуда стартует и где заканчивается TPA
так исторически сложилось, что "система" при запуске какой то программы выдаёт этой проге N памяти. если она до 16кб, то 1 страница. если больше, то больше. например, зачем твоему helloword`у тпа в 60кб? не нужно. а если вдруг потребовалось, то, опять же, так сложилось, что прога запрашивает у системы сколько ей нужно памяти. Вопрос - правильно это или нет тут не стоит. оно просто есть 20 лет как и меняться уже не будет. страницу воткнуть можно 2мя способами - системный вызов (медленно) и "ручками" через порты (быстро) можно перед установкой нужной страницы, старое содержимое прочитать и запомнить. вообще, тпа тут такая штука, что если надо, то все 64кб тебе доступны. ведь выделенную страницу можно воткнуть в 0е окно. но, при выходе надо восстановить в ней системную страницу.


Как приложению передается строка параметров ОС
ты почти всё верно сказал, кроме одного момента - строка ком.строки начинается по смещению -128 от адреса старта программы. а вот по смещению -3 от комстроки есть ещё 3 переменные:
CMD line size(IX+0)
File handle for preloader(IX-3)
Memory handle(IX-2)
Level(IX-1)

Estex делает ли предразбор строки
есть функция разбора строки. но при запуске программы её нет смысла разбирать (не разбирает).


установка текстовых режимов в начале каждого консольного приложения как я вижу в некоторых исходниках - это требование или перестраховка?
какой то определённой системы в этом плане у нас не сформировалось. это конечно плохо. надо как то исправлять.

Error404
06.02.2022, 23:19
ну вот тут извините-подвинтесь - это таки фича, а не баг :)
если хочешь чтобы твоя строка вывелась, то по правилам всех терминалов и шеллов её надо закончить переводом ;)

Не, не так. :)
При вводе с клавиатуры - да, в некоторых случаях обработка буфера начинается после нажатия на Enter.

А заканчивать строку переводом строки при выводе ваще не обязательно. Как и файл не обязан заканчиваться переводом строки или символом ^Z (EOF) - в этом случае type/cat выводит его до физического конца.

А вот при выводе промпта ведут себя шелы действительно по-разному:
- либо делают CR-LF перед промптом как например cmd.exe в Win/MSDOS:


C:\WINDOWS\system32>echo HELLO
HELLO

C:\WINDOWS\system32>


- либо не делают ни CR ни LF перед промптом, как например bash:


[centos8@cc1 ~]$ echo hello
hello
[centos8@cc1 ~]$ echo -n hello
hello[centos8@cc1 ~]$


В обоих случаях, они текст не затирают. А если делать один CR (или как достигается такой эффект) - то текст будет затираться.

Как бы там ни было, я таки вставил в том "спорном" месте перевод строки LF (0Ah). И тут же наступил на еще одну мину: часть текста (одиночные символы) я выводил через BIOS (т.к. поначалу была мысль все сделать через BIOS), и оказалось, что BIOS код 0Ah как перевод строки не воспринимает, а выводит "рожицу". То, что в BIOS не работает базовое управление кареткой, конечно было сюрпризом. Ну то есть это управление как-то зачаточно работает (следующий символ же таки печатается правее предыдущего, а не долбит в то же место), но на этом и всё. И пришлось все символы выводить через BDOS.

- - - Добавлено - - -

На всякий случай размещу тут же свой hello.mac. Как иллюстрацию (на что ссылаться) и для шпаргалки таким же начинающим



.Z80
ASEG
ORG 0100h
WORKADDR EQU 08100h
STACK equ buffer+512

;EXE-file header:
HEADER:
DB 'EXE' ; EXE Signature
DB 0 ; Version of EXE file
DW CODE-HEADER,0 ; Code offset (32bit)
DW 0 ; Primary loader size or 0 (no primary loader)
DW 0,0,0 ; Reserved
DW LOAD ; Loading address
DW START ; Starting address (register PC)
DW STACK ; Stack address (register SP)
DS 490,0 ; round to 512
CODE:

.phase WORKADDR

LOAD:
START: push ix ; IX=cmdline ptr (START-80h)
ld hl,cmdln
call puts
pop de ; cmdline=<length>< line>0000h<self>
push de
call hexde ; display cmdline address (hex)
ld a,':'
call putchar
pop hl ; hl=cmdline ptr
inc hl ; skip <length> byte
call puts ; display cmdline content
ld hl,pages
call puts
xor a ; 0000..3fff
call cpupage ; FB:82 ; display default page,xframe
ld a,1 ; 4000..7fff
call cpupage ; FF:A2
ld a,2 ; 8000..bfff
call cpupage ; F6:C2
ld a,3 ; c000..ffff
call cpupage ; FF:E2
;
ld b,4
ld hl,hmem0
call alloc ; allocate next 4 pages for 64kb TPA (page0..3)
jr c,cerr
ld hl,npages
call puts
ld hl,page0
call showpg ; display page0, page1
ld hl,page2
call showpg ; display page2, page3
;
ld hl,msg
call puts
;
; get BIOS version
ld c,0efh
ld hl,buffer ; ASCIIZ returned here
push hl
call sbios
push af
call nc,hexde ; if no error, DE = BIOS version number0
call space
pop af
pop hl ; hl=buffer
push af
call nc,puts ; if no error
pop af
cerr: ld hl,err ; if error
call c,puts
;
ld a,10
call putchar ; LF to move shell prompt line down
call inkey
;
ld b,4
ld hl,hmem0
call free ; free page0..3
jp exit
;
cpupage:call getcpupage
jr c,cerr
call hexbc
space: ld a,' '
jp putchar
;
showpg: ld d,(hl)
inc hl
inc hl
ld e,(hl)
call hexde ; display pageX, pageX+1
jp space
;
alloc: push bc ; reserve by 1 page, r.B times, i.e. B*16 kb
push hl
call getmem1
pop hl
jr c,retc
ld (hl),a ; store segment handle
inc hl
push hl
call getpage ; decode handle to phis. pageN
pop hl
retc: pop bc
ret c
ld (hl),a ; store pageN
inc hl
djnz alloc
ret
;
free: push bc
ld a,(hl)
or a
push hl
call nz,freemem
pop hl
inc hl
inc hl
pop bc
djnz free
ret
;
INCLUDE funcs
;
hmem0: db 0
page0: db 0
hmem1: db 0
page1: db 0
hmem2: db 0
page2: db 0
hmem3: db 0
page3: db 0
err: db "Error",0dh,0ah,0
cmdln: db 0dh,0ah,"CommandLine params: ",0
pages: db 0dh,0ah,0ah,"CPU 16kb default RAM pages:xframe(0,1,2,3): ",0
npages: db 0dh,0ah,0ah,"CPU 16kb reserved RAM pages(0,1,2,3): ",0
msg: db 0dh,0ah,0ah,"Hello, world!",0dh,0ah,0ah,"Press any key..."
crlf: db 0dh,0ah,0
buffer:
.dephase

END



- - - Добавлено - - -

Используемые функции funcs.mac:



; Console stdout
;
; Print symbol through BDOS
;Input:
; A - symbol
; C - 5Bh
;
putchar:ld c,5bh
sbdos: jp 10h ; TODO: BDOS call wrapper
;
; Print symbol through BIOS without attributes and control codes
; inp: A=symbol
;
putc: ld b,1 ; put one symbol
putb: ld c,82h ; put <B> symbols
sbios: jp 8 ; TODO: BIOS call wraper
;
; Prints string
; inp: HL=stringz
;
puts: ld c,5ch
jr sbdos
;
; Wait keypress (BDOS). Returns: see scankey except ZF
;
inkey: ld c,30h
jr sbdos
;
; SCANKEY (BDOS). Check the console for a recent keystroke
; Input: C = 31h
; Output:
; ZF=1 if no inputs, ZF=0 if key pressed
; A = symbol code (ASCII code)
; D = key code
; C = keyboard mode,bits: 7=RusLat, 3=NumLock, 2=ScrollLock, 1=Insert, 0=CapsLock
; B = shifts state, bits: 7=LShift, 6=RShift, 5=Ctrl, 4=Alt, 3=LCtrl, 2=LAlt, 1=RCtrl, 0=RAlt
;
scankey:ld c,31h
jr sbdos
;
; Exit program
exit: ld c,41h
jr sbdos
;
; Memory management routines
;
;0C6h (198) EMM_FN6 Detect ports for CPU memory frames
;input:
; C=0C6h
; A - number of CPU memory frame - 0,1,2 or 3
;output:
; CF=0 - no errors:
; C - 8 bit address of CPU frame port
; B - physical number of memory page which set to CPU frame
; CF=1 - error - incorrect number of CPU frame
;
getcpupage:
ld c,0C6h
jr sbios
;
;3Dh (61) GETMEM (Allocate a memory block)
;Input:
;B - size of requred memory block in 16K pages
;C - 3Dh
;Output:
;A - error code, if CF=1
;A - memory block handle, if CF=0
;
getmem1:ld b,1
getmem: ld c,3Dh
jr sbdos
;
;3Eh (62) FREEMEM (Deallocate a memory block that was previously allocated by GETMEM)
;Input:
;A - memory block handle
;C - 3Eh
;Output:
;A - error code, if CF=1
;
freemem:ld c,3Eh
jr sbdos
;
;0C4h (196) EMM_FN4 Get physical page number from the memory block by logic number
;input:
; C=0C4h
; A - handle of memory block
; B - logic page number
;output:
; CF=0 - A - physical page number
; CF=1 - error:
; A=0 - incorrect memory handle
; A=255 - incorrect logic number (too big)
;
getpage:ld bc,0C4h
jr sbios
;
; MISC
;
; hex output
; Inp: BC
;
hexbc: ld d,b
ld e,c
;
; Inp: DE
;
hexde: ld a,d
call houtF0
ld a,d
call hout0F
ld a,e
call houtF0
ld a,e
jr hout0F
;
houtF0: rrca
rrca
rrca
rrca
hout0F: and 0fH
add a,'0'
cp '9'+1
jr c,hout
add a,7
hout: push de
call putchar
pop de
ret



- - - Добавлено - - -

Как видно из листинга, я использую пакет M80/L80 (классические от CP/M (https://github.com/serge-404/AltairDOS/tree/master/App/bin)). Командник для сборки (собираю на Винде с этим эмулятором (https://github.com/serge-404/CPM32)) asm.bat:



echo off
echo Compiling %1.MAC
cpm m80n %1,=%1
echo Linking %1.REL
cpm l80m %1,%1/n/e
echo Delete %1.REL
del %1.rel
del %1.exe
ren %1.com %1.exe
echo Completed %1.exe
echo on



- - - Добавлено - - -

В листинге также присутствует резервирование 16к страниц (и отображение что выдала система).
Что интересного видно в этом процессе: системы выдает страницы от больших номеров к меньшим. В моем случае - F5..F2 (см. скриншот ниже). Насколько я понял, станицы F0..FF - это кэш. Т.е. тут по русскому народному принципу "кто раньше встал того и тапки" - "быструю память" получит тот процесс, который резервирует первым. Мораль: ресурсоёмкое надо планировать, и запускать первым. Т.к. требовать у системы конкретные страницы - нельзя, можно только просить (как тут уже кто-то схохмил). :)

- - - Добавлено - - -

7697876979

Еще из интересных "фич".
Я никак не использую управление атрибутами символов, прога работает так как ее выпульнул шелл.
Запускаю прогу 4 раза из тимплета ("стрелка вверх, ентер", "стрелка вверх, ентер", "стрелка вверх, ентер", "стрелка вверх, ентер"). Два раза прога выводит текст белым по черному. И остальные разы эта же самая прога - зеленым по черному, "окрашиваясь в те цвета, в которые оно себя окрасило"(с)

Т.е. установку режимов похоже таки надо рекомендовать.
И возможно не только установку режимов, а похоже еще и контроль скролируемого, ибо тут явно что-то не то вырисовывается.

- - - Добавлено - - -



страницу воткнуть можно 2мя способами - системный вызов (медленно) и "ручками" через порты (быстро) можно перед установкой нужной страницы, старое содержимое прочитать и запомнить. вообще, тпа тут такая штука, что если надо, то все 64кб тебе доступны. ведь выделенную страницу можно воткнуть в 0е окно. но, при выходе надо восстановить в ней системную страницу.


Медленно - это насколько медленно, и почему так считаешь? Если порядка пары сотен тактов, то это не страшно, КМК. Плата за системность (возможность правки логики в едином месте не меняя всех миллиардов спринтеровских программ). Врядли мне это понадобится делать интенсивно, так что если это не прямо ужас-ужас, то я голосую за функции BIOS/BDOS.



по смещению -3 от комстроки есть ещё 3 переменные:
CMD line size(IX+0)
File handle for preloader(IX-3)
Memory handle(IX-2)
Level(IX-1)


А что здесь такое "Level" ?
А "File handle for preloader" означает ли что большой (очень) EXE-файл шеллом будет загружен не до конца (а насколько не до конца?) и некий встроенный в файл загрузчик его должен сам дозагрузить?

- - - Добавлено - - -

Вот еще такой момент.
Мне понравился хак ИванМака, когда чтобы вызвать BIOS, "накрытый" в окне 0000.3FFF другой страницей пользователя, в области 8h..0Eh кладется код "переключалки" и делая RST 8 в эту п\п, можно попадать в BIOS и обратно. Почему так же не сделано для BDOS (rst 10h)? Это архиудобно, КМК.

- - - Добавлено - - -

Вот оно:


Вызов BIOS из ОЗУ осуществляется через RST 8. При этом на адресе 8 должна
располагаться такая программа:


PUSH AF
LD A,0
OUT (07Ch),A ; в этом месте вместо ОЗУ подключится ПЗУ биоса и
; программа уйдет в него.
POP AF ; На эту команду происходит возврат при таком
; вызове биоса.
RET

; Оптимизация кода в этом месте недопустима. Вместо LD A,0 можно установить
; две команды XOR A и DI

Shaos
07.02.2022, 07:22
> Как видно из листинга, я использую пакет M80/L80 (классические от CP/M).

На спринтере есть портированные M80/L80 - можно прям там юзать

> Насколько я понял, станицы F0..FF - это кэш.

Нет - это не так

Кэш подключается особым образом и только в нулевое окно

- - - Добавлено - - -

> type чёто поломался. толи исходник битый, толи не понятно. не работает. надо чинить.

type (точнее sptype) вообще левая фигня написанная какими-то западно-европейцами (как и spmore)

> установка текстовых режимов в начале каждого консольного приложения

да вроде нету такого - если утилита консольная, то она режим не меняет - см. сюда:

https://gitlab.com/sprinter-computer/dos/-/tree/master/utils

ни одна из DSS-овских утилит от Петерсов не вызывает SETVMOD

режим надо менять если приложение графическое (и в конце соответственно надо режим вернуть)

Sayman
07.02.2022, 08:46
Error404
поправил шелл по части cr lf.


И тут же наступил на еще одну мину: часть текста (одиночные символы) я выводил через BIOS (т.к. поначалу была мысль все сделать через BIOS), и оказалось, что BIOS код 0Ah как перевод строки не воспринимает, а выводит "рожицу".
да. биос на спринтере это прям совсем низкий уровень. никакого управления кареткой/курсором тут нет. всё, что ему не дашь, он всё будет воспринимать как символ для вывода. для управления курсором нужно управлять координатами вывода (если через биос печатать). т.е. через биос получить координату, изменить координату и/или печать в координатах.


системы выдает страницы от больших номеров к меньшим.
это обусловлено тем, что у нас есть типа режима всяких там спектрумов, а там память вся крутится снизу. чтобы не было разных затираний, когда то давно сделали распределение памяти в DSS сверху вниз.


Насколько я понял, станицы F0..FF - это кэш.
на самом деле страницы резервируются через БИОС. не подлежат выдачи страницы 0xFF, 0xFE, 0xFD и кажется 0xFC. всё остальное могло бы выдаваться, но - дос тоже занимает 4 страницы (1 страница сама дос и 3 страницы под разные таблицы, кэши и прочая петрушка), 1 страница - шелл. если более ничего не загружено, то остальное выдаётся. Опять же - НО... не выдаются страницы 0x50 - 0x5f (экранная область), страницы 0x00 - 0x1f, 0x41 - 0x47 - резерв под режим Спектрума. Страница 0x40 - вообще смерти подобно выдавать её - страница дешифратора!!!
Однако, страницы резервированные под спектрум можно снять с резерва через утилиту memhack. она снимает с них резерв в биосе. остальное нельзя трогать физически. Страницы 0xFF и 0xFE - принадлежат БИОСу (переменные, кэши и прочая петрушка).



"быструю память" получит тот процесс, который резервирует первым.
системно, быстрая память не резервируется и не выдаётся вообще. просто потому, что её сложнее контролировать. порт быстрой памяти не доступен на чтение и любая программа легко может сама взять любую из 4х страниц этой быстрой памяти. примерно так же обстоит ситуация и с памятью ISA. её в общем-то нет, до тех пор, пока не вставишь ISA-RAM карточку. но это отдельная тема.



Т.к. требовать у системы конкретные страницы - нельзя, можно только просить (как тут уже кто-то схохмил).
ну политика забирания у системы тех страниц, какие хочется в целом не допустима. может быть ситуация при которой 2 процесса попросят одну и туже страницу. и что тогда делать? поэтому страницы выдаются вот так. в БИОСЕ есть так называемая RAT (Ram Allocation Table), по аналогии с FAT. Разница в том, что FAT даёт кластера снизу вверх (образно говоря, или слева на право), а наш RAT наоборот, сверху вниз (справа на лево).
Потому, какая там будет у тебя страница на момент запроса - а фиг его знает...



зеленым по черному, "окрашиваясь в те цвета, в которые оно себя окрасило"(с)
похоже у тебя какая-то старая сборка шелла. этот баг был пофикшен.



Почему так же не сделано для BDOS (rst 10h)? Это архиудобно, КМК.
надо над этим подумать. быть может вкарячу в следующей глобальной версии.


А что здесь такое "Level" ?
Process ID проще говоря.


А "File handle for preloader" означает ли что большой (очень) EXE-файл шеллом будет загружен не до конца (а насколько не до конца?) и некий встроенный в файл загрузчик его должен сам дозагрузить?

строго говоря - шелл вообще ничего не загружает, если только это не BAT файл. ЕХЕшники передаются в DSS, в функцию 40h. вот она уже грузит. ПО факту - 48кб это предел линейной загрузки. Если ЕХЕшник большой, то да - внутри должен быть самозагрузчик. примером такой программы является инсталяха игры TITD (файл под мегабайт размером) или Flex Navigator, который без перепаковки Дмитрием имеет размер 85кб.

- - - Добавлено - - -

проверил щас more и type. нет, работают.
прикину сюда.