Важная информация

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: Estex DSS и shell

  1. #1

    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,577
    Спасибо Благодарностей отдано 
    63
    Спасибо Благодарностей получено 
    108
    Поблагодарили
    93 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Estex DSS и shell

    Из закрытой темы:

    Цитата Сообщение от Shaos Посмотреть сообщение
    перевёл в 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 какой-то другой аналог?
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,280
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    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. Можно и под эмулем. бреак ставится в дебагере даблкликом слева от адреса.
    Последний раз редактировалось Sayman; 05.02.2022 в 08:11.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  4. #3

    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,577
    Спасибо Благодарностей отдано 
    63
    Спасибо Благодарностей получено 
    108
    Поблагодарили
    93 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sayman Посмотреть сообщение
    Error404, давай код, чтоли, не работающий. файлик приатач.
    из мануала:

    нормально выводится, ничего не затирается. во всяком случае я с таким не сталкивался.
    отладчик есть: если на реале - demon.exe. Можно и под эмулем. бреак ставится в дебагере даблкликом слева от адреса.
    В этом самом примере вместо
    MSG: db "Hello, world!",0Dh,0Ah ;наша стока

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

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

    Некоторые из моих поделок тут: https://github.com/serge-404

  5. #4

    Регистрация
    05.06.2020
    Адрес
    г. Балашиха
    Сообщений
    332
    Спасибо Благодарностей отдано 
    142
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    78 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  6. #5

    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,280
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я понял. Спасибо. Завтра посмотрю и поправлю. Сёдня я не дома.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  7. #6

    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,577
    Спасибо Благодарностей отдано 
    63
    Спасибо Благодарностей получено 
    108
    Поблагодарили
    93 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Romych Посмотреть сообщение
    приложение должно подстраиваться под ОС для которой оно написано.
    А не получится подстроиться под 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), будет полезна всем. В т.ч. как и общий знаменатель чтобы не плодить зоопарк.
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

  8. #7

    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,577
    Спасибо Благодарностей отдано 
    63
    Спасибо Благодарностей получено 
    108
    Поблагодарили
    93 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Error404 Посмотреть сообщение
    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), и сразу надо начинать с операций над страницами (либо уживаться как есть если приложение маленькое).

    Цитата Сообщение от Error404 Посмотреть сообщение
    2) Как приложению передается строка параметров ОС (то что мы наколотили в строке ввода shell) - в каком-то буфере? Или адрес буфера не гарантирован и требуются функции типа 43h (67) GSWITCH (Get command line switch), довольно странного вида?
    Адрес буфера передается приложению параметром в регистре IX и обычно равен "адресу посадки" минус 128. Буфер хранится в виде такой структуры: <length>< cmdline>0000h<self>
    что похоже на то как командная строка передается в CP/M и MSDOS
    Последний раз редактировалось Error404; 05.02.2022 в 23:10.
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

  9. Этот пользователь поблагодарил Error404 за это полезное сообщение:

    Romych (06.02.2022)

  10. #8

    Регистрация
    16.01.2005
    Адрес
    California, USA
    Сообщений
    822
    Спасибо Благодарностей отдано 
    107
    Спасибо Благодарностей получено 
    113
    Поблагодарили
    72 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Error404 Посмотреть сообщение
    В этом самом примере вместо
    MSG: db "Hello, world!",0Dh,0Ah ;наша стока

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

    И эту строку не увидишь если запускать helloworld из промпта (приглашения) ОС, т.е. в CCP/shell
    ну вот тут извините-подвинтесь - это таки фича, а не баг
    если хочешь чтобы твоя строка вывелась, то по правилам всех терминалов и шеллов её надо закончить переводом
    Администратор сетевого сообщества nedoPC.org
    Урал 8/64К, Sp2000, ZX48K+, ZX16K (спалил), TS1000 (американский ZX81), TS2068, Дельта-С, 20 лет собираю ATM Turbo 2+
    Неспектрумы: Электроника МК-85 и МК-85М, ПК-01 Львов, БК-0011, Вектор-06Ц, Лик (спец), Апогеи, Radio-86RK SRAM 32K & 128K (всё ещё собираю)

  11. #9

    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,280
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Error404 Посмотреть сообщение
    Кстати, все еще актуален вопрос - чем в 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 делает ли предразбор строки
    есть функция разбора строки. но при запуске программы её нет смысла разбирать (не разбирает).

    установка текстовых режимов в начале каждого консольного приложения как я вижу в некоторых исходниках - это требование или перестраховка?
    какой то определённой системы в этом плане у нас не сформировалось. это конечно плохо. надо как то исправлять.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  12. Этот пользователь поблагодарил Sayman за это полезное сообщение:

    Error404 (06.02.2022)

  13. #10

    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,577
    Спасибо Благодарностей отдано 
    63
    Спасибо Благодарностей получено 
    108
    Поблагодарили
    93 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Shaos Посмотреть сообщение
    ну вот тут извините-подвинтесь - это таки фича, а не баг
    если хочешь чтобы твоя строка вывелась, то по правилам всех терминалов и шеллов её надо закончить переводом
    Не, не так.
    При вводе с клавиатуры - да, в некоторых случаях обработка буфера начинается после нажатия на 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). Командник для сборки (собираю на Винде с этим эмулятором) 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 - это кэш. Т.е. тут по русскому народному принципу "кто раньше встал того и тапки" - "быструю память" получит тот процесс, который резервирует первым. Мораль: ресурсоёмкое надо планировать, и запускать первым. Т.к. требовать у системы конкретные страницы - нельзя, можно только просить (как тут уже кто-то схохмил).

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

    Нажмите на изображение для увеличения. 

Название:	screenshot2.jpg 
Просмотров:	218 
Размер:	41.5 Кб 
ID:	76978Нажмите на изображение для увеличения. 

Название:	screenshot3.jpg 
Просмотров:	215 
Размер:	38.6 Кб 
ID:	76979

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

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

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

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

    Цитата Сообщение от Sayman Посмотреть сообщение
    по смещению -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
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Estex API
    от Smalovsky в разделе Sprinter
    Ответов: 11
    Последнее: 26.07.2021, 00:10

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •