|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Исходники ПЗУ Микроши и их модернизация
Author |
Message |
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 583 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Извиняюсь, только, что заметил Ваше сообщение (благодаря тому, что тему почистили).И не сразу понял, о чём оно. Что такое ПП и FR? Сначала подумал, что т.к упоминается SAVE и эмулятор, то возможно речь о том, что в конфиге эмуляторов секцию перехвата МГ-ввода надо настраивать для каждого конкретного ПЗУ, задав точки перехвата и возврата. В эмуляторах EMU и EMU80 точки перехвата для эмуляции МГ-ввода/вывода немного отличаются. В эмуляторе EMU задаются точки входа в МГ-процедуры - это адреса LDBYTE и WRBYTE и общая точка выхода из них, которая в моих исходниках называется @BAK. А в EMU80 принцип эмуляции не по-байтовый, а блочный, потому адреса входа в МГ-процедуры те же, а завершение ввода блока определяется чтением с клавиатуры, потому в EMU80 третьим адресом задаётся адрес точки CONIN. При модернизациях ПЗУ РК86 я подгоняю по адресу не только используемые внутренние точки, но и все точки перехвата МГ-процедур используемые в эмуляторах EMU и EMU80 (для реала это не надо, лишь для удобства, чтобы не менять конфиги эмуляторов, т.к не все знают и могут это делать). При добавке DIR_R на скорую руку в нестандартное ПЗУ Микроши я не подгонял внутренние точки ПЗУ РК86, т.к они и без того были сдвинуты, а точки перехвата эмуляторов просто не к чему подгонять, т.к в эмуляторах такого ПЗУ ещё не было и соответственно, не было и конфига с заданными точками перехвата. Вот такая секция CAS надеюсь поможет грузиться с МГ в эмуляторе EMU. cas : tape-recorder { biproc[FB8F-FCA4]=rk boproc[FC3F-FCA4]=rk # tproc[F89A-FCAB]=rk # tproc[FD0A-F89D]=rk } Зачем нужны строки tproc и что в них подставлять - не знаю, хотя F89D это WARM START Микроши. F89A это за 3 байта до WARMST причём 3 байта забиты NOP-ами, т.е это WARMST при сбросе. FCAB это WRBYTE, FD0A это точка выхода из МГ-подпрограмм. Это странные точки перехвата и выхода. Может быть будет загрузка и без них. А вот так надо изменить строки задающие точки перехвата МГ-ввода/вывода в эмуляторе EMU80: @F806_ADDR = 0xFB8F @F80C_ADDR = 0xFC3F @F803_ADDR = 0xFE69 Точка JJJ_01 в ПЗУ Микроши стоит на выходе из МГ-подпрограмм. В ПЗУ РК86 ей соответствует точка POPREG. А в дизассеблированном тексте дампа ПЗУ оказалась, как Вы верно заметили, вместо POP-ов команда LD BC,0E1C1H. Естественно при дизассемблировании я не вникал в алгоритмы, просто механически дизассемблировал и проставил имена меток. А заметив, что делается не POPREG, просто перименовал эту точку как JJJ_01 и сделал для себя ошибочный вывод, что в ПЗУ Микроши нет сохранения регистров в F82D. А в действительности: Точно. Точнее регистров. Просто мне дали неверный дамп. Код LD BC,nnnn это байт 01, а в журнале стояло D1, что является командой POP, как и коды E1 и C1. Таким образом вместо 01,C1,E1 в дампе должно стоять D1, C1, E1, т.е на выходе из МГ-подпрограмм стоит тот же самый код, как и в ПЗУ РК86 - POPREG. Адрес этой точки в журнальном ПЗУ FAC0, а в ПЗУ с директивой R - FAC1, там вместо 01 должен стоять байт D1. Это не понял, но не важно. Важно, что Вы помогли обнаружить ошибку в дампе. Спасибо.
Last edited by barsik on 19 Jun 2018 03:54, edited 2 times in total.
|
19 Jun 2018 01:18 |
|
|
azesmbog
Novelist
Joined: 15 Jun 2018 16:58 Posts: 26
|
Ну как же. Вот кусок той самой процедуры, хвостик, с правильными POP-ами комментим строку ld a, (VG75 + 1), ну или три ноп-а туда, чтобы не нарушать отчетности) ПП - Полигон Призраков FR - Fine Reader
|
19 Jun 2018 02:59 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 583 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
По логике загружать регистр А, чтобы сразу же испортить его по POP AF глупо, хотя можно думать, что это надо для ВГ75. Но сравнил с соответствующей точкой ПЗУ РК86, с которой это ПЗУ Микроши получена. Там такой строки нет. Посмотрел в заводском ПЗУ Микроши. Там сдуру целых 3 места, где инициализируется ВГ75, ни в одном из них такой строки нет. Вряд-ли в журнале опубликовали дохлый дамп. Хотя может быть в последующих статьях была поправка? Возможно это фатально только для эмулятора EMU. Надо проверить в эмуляторе EMU80 и, главное, в реале. Проверьте, происходит завис именно из-за этой строки или из-за последующего сдвига кода. EMU зависает, если МГ-точки перехвата в конфиге настроены неверно, тогда эмулятор уходит на ввод/вывод байта ожидая прогона точки выхода. Т.к официальных конфигов эмуляторов для такого ПЗУ пока нет, и других причин мешающих сдвигу внутреннего кода тоже нет, то эту строку в исходнике следует удалить и перетранслировать, особенно если она фатальна и для реала.
|
19 Jun 2018 04:12 |
|
|
azesmbog
Novelist
Joined: 15 Jun 2018 16:58 Posts: 26
|
Похоже это строчка фатальна только для emu Для реала вряд ли фатальна, ибо ТС бы наверняка сказал. Ну чтобы сдвига не было, я и предложил втуда 3 NOP. А так думаю и удалить - ничего не поменяется, да и кому интересна сейчас запись да и реальной Микроши у меня нет, это так. чисто спортивный интерес, а в железных эмулях эта фигня бесполезна от слова совсем.
|
19 Jun 2018 05:43 |
|
|
b2m
Devil
Joined: 26 May 2003 06:57 Posts: 863
|
Не фатальна. Я совсем другие байты исправил, связанные с ошибкой распознавания, о них писали на полигоне призраков: Первый байт - часть процедуры инициализации ПДП, без исправления настраивает экран на 26D0 Второй байт - вместо трёх команд POP выполняется LXI B,... Вот это - фатально Ну и перехват процедур в конфиге удалил (строчки с адресами в секции cas), процедуры по другим адресам. Всё работает, процедуры магнитофона тоже, т.е. полная эмуляция чтения/записи без перехвата процедур. Он сделал аналогичное исправление.
_________________Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
Last edited by b2m on 20 Jun 2018 04:25, edited 1 time in total.
|
19 Jun 2018 09:49 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 583 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
.В ранее выложенном дампе в исходнике адрес DOPPPA установлен на E000 (CS1), т.е предполагается, что ППА ROM-диска смонтирован как расширение. Если же в качестве ППА ROM-диска используется имеющийся запасной ППА, то надо, во-первых, отключить коммутацию фонтов с этого ППА (и другое управление железом, если оно есть), а также в исходнике в качестве адреса DOPPPA подставить число C800. Если коммутацию фонтов оставить портом, то после выполнения директивы R фонт переключается и вместо латинских букв в командах выводятся мелкие русские буквы. Т.е, если ROM-диск читать через резидентный ППА, то с данным ПЗУ неудобно одновременно иметь и два фонта и ROM-диск. В эмуляторе то же самое (т.е надо в конфиге рассчитанном для ROM-диска удалить строки про коммутацию фонтов). Потому, если ROM-диск подключен через резидентный запасной ППА, то коммутацию фонтов можно перенести как в РК86 - на PC3 ППА клавиатуры. Впрочем, можно решить проблему программно, - изменить код директивы R так, чтобы по её завершении перед возвратом в CCP восстанавливался стандартный фонт (а то, что во время считывания ROM-диска экран мигает можно стерпеть, т.к это не более секунды). Также исправить данный дефект можно, если порт B использовать на ввод (тогда схема ROM-диска иная). Во вложении исправленный исходник (в нём также ненужная строка в п/п-мме WRBYTE удалена), соответственно точки перехвата точек МГ-подпрограмм сдвинулись. Чтобы работал магнитофон для конфига EMU: А вот так надо изменить строки задающие точки перехвата МГ-ввода/вывода в эмуляторе EMU80: В исходнике специально, чтобы облегчить подстановку чисел в конфиги эмуляторов нужные метки выводятся первыми в таблице меток листинга трансляции (т.к метки упорядочены по алфавиту, для этого в начало интересующих меток, чтобы их долго не искать, подставляется символ @). Если будете менять исходник, то взгляните на начало листинга трансляции и если эти адреса изменились, то соответственно откорректируйте конфиг того эмулятора, которым пользуетесь. Во вложении также есть уже странслированные DAT-файлы для ROM-диска по адресу C800, готовые для прошивки. Рекомендую прошить альтернативный дамп, в котором курсор сделан не маленькой чёрточкой, а большим прямоугольником. Это намного приятнее. Сам я пользуюсь в РК86 монитором с таким курсором. Но учтите, что в обоих эмуляторах курсор будет уродливым, т.к в обоих эмуляторах ошибка. Монитор с таким курсором получается, если странслировать с ключом ORIG=0.
|
19 Jun 2018 10:11 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 583 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Занимаясь дизассемблированием ПЗУ (и других программ) для проверки правильно ли выполнено дизассемблирование приходится сравнивать код оригинала с кодом программы полученным после трансляции полученного исходника.
Для этого удобнее всего пользоваться программой сравнивающей два файла, неважно в MSDOS или в CP/M. Для MSDOS у меня нет такой программы, а в CP/M есть программа COMPARE.COM (иногда встречающаяся под именем FCOMP.COM). Потому для сравнения дампов я запускал эту программу в Win XP под резидентным эмулятором 22NICE. Я привык доверять программам CP/M, как хорошо проверенным за 40 лет эксплуатации, и раньше эти программы меня не подводили.
Сегодня дизассемблируя заводское ПЗУ Микроши обнаружил, что напрасно доверял этой программе. Оказалось, что при сравнении двух файлов размером в 2 кб, если разница в данных наступает ранее оффсета в 47F от начала файла, то это обнаруживается. Если же файлы отличаются в конце блоков, то выдаётся сообщение, что файлы одинаковы, хотя это и не так. Возможно при сравнении файлов другого размера что-то будет иначе.
Потому данную программу CP/M надо удалить со всех CP/M архивов. Можно дизассемблировать и попытаться исправить эту дохлую программу, но проще написать свой эквивалент (сделаю вскоре). Не имея такой программы сравнивать файлы остаётся отладчиком. В отладчиках DDT и ZSID нет команды сравнения. Но команда сравнения есть в ZSID3. Это доработанный ZSID от Digital Research. Добавлены команды поиска цепочки байт, сравнение блоков, возможность выбора номера RST для отладки и запись блока (W без параметров записывает загруженный файл). Для сравнения надо загрузить файлы в ОЗУ и сравнить директивой E. Во вложении ZSID3 для использования в Win XP (или в MSDOS). Если в MSDOS отладчике DEBUG есть команда сравнения, то можно воспользоваться им.
|
20 Jun 2018 12:08 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Для MSDOS и Win есть такая консольная утилита FC.EXE ( File Compare). И вроде как - это нативная утилита Win, поскольку находится в каталоге: C:\WINDOWS\COMMAND\Использовать: FC /b file1 file2 (ключ /b - бинарное сравнение). На диске дистрибутива Windows есть еще и оконное приложение WINDIFF.EXE, но для меня оно как-бы менее удобно, хотя и установлено.
_________________ iLavr
|
20 Jun 2018 12:44 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 583 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Спасибо за информацию, это решает проблему. Приложенная Вами FC.EXE оказалась неработоспособной, т.к она похоже от Windows ME. Но в Windows XP тоже оказалось есть эта программка. Только в Win XP нет папки Windows/Command, а файл FC.EXE и некоторые другие полезные утилитки (в т.числе и EXE2.BIN) находятся в каталоге /System32. Что глупость со стороны Microsoft, т.к в этом каталоге, например у меня, более 4000 файлов с объёмом более 700 мб и найти там что-то визуально проблематично. А вот этой программки в Win XP нет, ну и не надо... Не понял, как Вам удаётся из Windows ME выходить в Интернет? Даже для Win XP трудно найти браузер, что показывал бы самые современные накрученные сайты. А с Win ME годятся лишь очень старые браузеры, которыми в Интернете можно смотреть только сайты что были созданы давно и не менялись более 15 лет. Win 98 и Win ME лучше тем, что они понимают формат дискет на 1700 кб, отформатированных с помощью драйверов 800 и PU1700, а Win XP понимает только 1.44 мб (и даже формат 720 кб не читает), что было важно 17 лет назад, когда резервные копии архивов приходилось делать и восстанавливать при крахе винта с дискет.
|
20 Jun 2018 21:23 |
|
|
azesmbog
Novelist
Joined: 15 Jun 2018 16:58 Posts: 26
|
Как все сложно Я по старинке. IDA + SJAsm + Total Commander , который работает в любой версии форточек.
|
20 Jun 2018 23:02 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
У меня нет Windows ME, у меня Windows 98 и браузер Opera 9.64, который весьма неплохо всё показывает. И я бы не сказал, что браузер Opera 9.64 "очень старый". Также неплохо работают браузеры K-Meleon и D-Plus, тоже не "очень старые", слышали о таких? Ну и существует в интернете группа пользователей Windows 98, которые помогают ей жить дальше. Win98SE+KernelEx - это чуть хуже, чем Win ХР. Так что не могу сказать, что у меня уж совсем нативная Windows 98... А работаю я из-под такой Windows 98, поскольку она не создает мне проблем, которые характерны уже для Win ХР частично и в полной мере для Win 7 и выше. P.S. На всякий случай - в архиве WinDiff. Эту папку просто распаковать в Program Files.
_________________ iLavr
|
20 Jun 2018 23:14 |
|
|
petrenko
Doomed
Joined: 10 Mar 2012 16:21 Posts: 598 Location: РФ
|
^Уклонились в обсуждение инструментария, в т.ч. "подвиндовозного" [s] -/- Почитал лист, хотя и не по теме, но возник вопрос : а где описан упомянутый дважды "SYMBUF" ,какой адрес этого "SYMBUF" ? -/- [/s] \/\/ Ответ ясен, подредактировал комментарий, указав, что SYMBUF в данном случае односимвольный и потому синоним его LAST_K \/\/ ( Умещается не всё, часть в следующем сообщении )
| | | | Code: ; МОНИТОР МИКРОШИ СОВМЕСТИМЫЙ С РК86 (РАДИО 12.89) ; ---------------------------------------------------
; Last modify: 19.06.18 — 19:30
; Удалена лишняя команда в подпрограмме WRBYTE (ищи %%)
.Z80 0000' aseg ORG 100H
0000 ORIG EQU 0 ; если не 0, то оригинальный курсор C800 DOPPPA EQU 0C800H ; адрес дополнительного ППА
F800 RABADR EQU 0F800H 7600 BASE EQU 7600H ; \/"выше" служебные ячейки
7600 EK_ADR EQU BASE ; текущий адрес на экране 7602 POSX EQU BASE+02H 7603 POSY EQU BASE+03H 7604 ESC_F EQU BASE+04H ; Признак обработки ESC/Y последовательности 7605 KBDFLG EQU BASE+05H ; если =0, то есть символ в SYMBUF 7606 RUSLAT EQU BASE+06H ; SYMBUF в данном случае односимвольный, это LAST_K ; +7 , +8 -пусто-?? 7609 LAST_K EQU BASE+09H ; эти 2 байта должны следовать подряд 760A COUNT EQU BASE+0AH ; счетчик опросов (вначале 15) 760B APVFLG EQU BASE+0BH 760C FRELOC EQU BASE+0CH ; эта ячейка не используется 760D TMPSTK EQU BASE+0DH ; временно храним ук.стека при мг п/п-ммах
7614 POINT EQU BASE+14H ; адрес откуда произошел RST_30H ,т.е. PC для X и G 7616 R_HL EQU BASE+16H ; Хранение содержимого HL при работе директив X и G 7618 R_BC EQU BASE+18H ; Хранение содержимого BC при работе директив X и G 761A R_DE EQU BASE+1AH ; Хранение содержимого DE при работе директив X и G 761C R_SP EQU BASE+1CH ; Хранение содержимого SP при работе директив X и G 761E R_AF EQU BASE+1EH ; Хранение содержимого AF при работе директив X и G 7623 STOP_A EQU BASE+23H ; адрес останова для директивы G 7625 TMP_COD EQU BASE+25H ; здесь храним байт из стоп-точки 7626 P_JMP EQU BASE+26H ; байт C3H (JMP) используется в DIR_G 7627 PAR_HL EQU BASE+27H ; I параметр директив 7629 PAR_DE EQU BASE+29H ; II параметр директив 762B PAR_BC EQU BASE+2BH ; III параметр директив 762D FLG_P2 EQU BASE+2DH ; флаг, что есть параметры 2 или 2,3 762E INV_MG EQU BASE+2EH ; признак прямого/инверс. чтения с мг 762F KNS_RD EQU BASE+2FH ; константа для чтения мг 7630 KNS_WR EQU BASE+30H ; константа для записи мг 7631 RAMTOP EQU BASE+31H ; 7633 COMBUF EQU BASE+33H ; буфер ввода директивы 7652 BUFEND EQU COMBUF+1FH ; ввод ПО GETLIN только 32 символа 7653 IF_PRN EQU BASE+53H ; заглушка эхо-печати 7654 PRINT EQU BASE+54H ; драйвер принтера (или JMP на него) 76D0 STACK EQU BASE+0D0H ; стек монитора
76D0 SA EQU 076D0H ; начало экранной области (размер 30*78) 77C2 SCBASE EQU 077C2H ; левый верхний угол экрана
F800 VT_57 EQU 0F800H D000 VG_75 EQU 0D000H
C000 PKA EQU 0C000H C001 PKB EQU PKA+1 C002 PKC EQU PKA+2 C003 PKU EQU PKA+3
C800 PDA EQU DOPPPA C801 PDB EQU PDA+1 C802 PDC EQU PDA+2 C803 PDU EQU PDA+3
; ---------------------------------------------------
.msg MACRO ADDR LD HL,ADDR CALL MSSG ENDM
; ---------------------------------------------------
jmp_eq MACRO BYTE,ADDR CP BYTE JP Z,ADDR ENDM
; ---------------------------------------------------
loop MACRO ADDR DEC BC LD A,B OR C JP NZ,ADDR ENDM
; ---------------------------------------------------
.phase RABADR
F800 C3 F836 JP VHOD ; + 00 F803 C3 FE63 JP CONIN ; + 03 F806 C3 FB8C JP LDBYTE ; + 06 F809 C3 FCB1 JP COUT_C ; + 09 F80C C3 FC3C JP WRBYTE ; + 0C F80F C3 7654 JP PRINT ; + 0F F812 C3 FE01 JP STATUS ; + 12 F815 C3 FC9F JP HEX_A ; + 15 F818 C3 F920 JP MSSG ; + 18 F81B C3 FE72 JP XF81B ; + 1B опрос kbd без ожидания F81E C3 FA6F JP ASKCUR ; + 1E F821 C3 FA73 JP RD_SCR ; + 21 F824 C3 FAAA JP RD_BLK ; + 24 F827 C3 FB3D JP WR_BLK ; + 27 F82A C3 FB0A JP CHSUMM ; + 2A F82D C3 FAC2 JP PUSK_VG ; + 2D F830 C3 FF49 JP ASKTOP ; + 30 F833 C3 FF4D JP SETTOP ; + 33
; ---------------------------------------------------
F836 3E 98 VHOD: LD A,98H F838 32 C003 LD (PKU),A ; PKA,PKCH - ввод, PKB,PKCL - вывод
F83B 21 7600 LD HL,BASE F83E F9 LD SP,HL ; STACK
F83F 4D LD C,L ; LD C,0 F840 11 765F LD DE,COMBUF+2CH F843 CD F8D3 CALL DIR_F ; очистка всех служ.ячеек
F846 CD FAC2 CALL PUSK_VG
F849 3E C9 LD A,0C9H F84B 32 7653 LD (IF_PRN),A ; заглушка эхо-печати
F84E 21 76D0 LD HL,STACK F851 22 761C LD (R_SP),HL
.msg TITR F854 21 FF51 + LD HL,TITR F857 CD F920 + CALL MSSG
F85A 21 75FF LD HL,BASE-1 F85D 22 7631 LD (RAMTOP),HL
F860 21 1D21 LD HL,1D21H F863 22 762F LD (KNS_RD),HL
F866 3E C3 LD A,0C3H F868 32 7626 LD (P_JMP),A
F86B 00 NOP
if $ ne RABADR + 6CH if1
.printx * standard subroutine WARMST shifted ! * endif endif
F86C 31 76D0 WARMST: LD SP,STACK
.msg PROMPT F86F 21 FF5F + LD HL,PROMPT F872 CD F920 + CALL MSSG F875 32 C002 LD (PKC),A F878 32 7606 LD (RUSLAT),A
F87B CD F8EC CALL GETLIN
F87E 21 F86C LD HL,WARMST F881 E5 PUSH HL
F882 21 7633 LD HL,COMBUF F885 7E LD A,(HL) F886 FE 58 CP 'X' F888 CA FFCC JP Z,DIR_X
F88B F5 PUSH AF F88C CD F92A CALL GETPRM
F88F 2A 762B LD HL,(PAR_BC) F892 4D LD C,L F893 44 LD B,H F894 2A 7629 LD HL,(PAR_DE) F897 EB EX DE,HL F898 2A 7627 LD HL,(PAR_HL) F89B F1 POP AF
jmp_eq 'D',DIR_D F89C FE 44 + CP 'D' F89E CA F9C6 + JP Z,DIR_D jmp_eq 'C',DIR_C F8A1 FE 43 + CP 'C' F8A3 CA F9D8 + JP Z,DIR_C jmp_eq 'S',DIR_S F8A6 FE 53 + CP 'S' F8A8 CA F9EB + JP Z,DIR_S jmp_eq 'T',DIR_T F8AB FE 54 + CP 'T' F8AD CA F9F6 + JP Z,DIR_T jmp_eq 'M',DIR_M F8B0 FE 4D + CP 'M' F8B2 CA FA1D + JP Z,DIR_M jmp_eq 'G',DIR_G F8B5 FE 47 + CP 'G' F8B7 CA FA33 + JP Z,DIR_G jmp_eq 'I',DIR_I F8BA FE 49 + CP 'I' F8BC CA FA7A + JP Z,DIR_I jmp_eq 'O',DIR_O F8BF FE 4F + CP 'O'
F8C1 CA FB21 + JP Z,DIR_O jmp_eq 'L',DIR_L F8C4 FE 4C + CP 'L' F8C6 CA F9FF + JP Z,DIR_L jmp_eq 'R',DIR_R F8C9 FE 52 + CP 'R' F8CB CA FA5C + JP Z,DIR_R F8CE FE 46 CP 'F' F8D0 C2 FAA2 JP NZ,ERROR F8D3 71 DIR_F: LD (HL),C F8D4 CD F997 CALL AF999 F8D7 C3 F8D3 JP DIR_F
; ---------------------------------------------------
F8DA 3E 33 BAKSTP: LD A,low COMBUF F8DC BD CP L ; достигнуто начало буфера ввода ? F8DD CA F8EF JP Z,AF8F1 F8E0 E5 PUSH HL .msg TZABOJ F8E1 21 FF97 + LD HL,TZABOJ F8E4 CD F920 + CALL MSSG F8E7 E1 POP HL F8E8 2B DEC HL F8E9 C3 F8F1 JP AF8F3
; ---------------------------------------------------
F8EC 21 7633 GETLIN: LD HL,COMBUF F8EF 06 00 AF8F1: LD B,0 F8F1 CD FE63 AF8F3: CALL CONIN jmp_eq 8,BAKSTP F8F4 FE 08 + CP 8 F8F6 CA F8DA + JP Z,BAKSTP jmp_eq 7FH,BAKSTP F8F9 FE 7F + CP 7FH F8FB CA F8DA + JP Z,BAKSTP F8FE CD FCB0 CALL COUT_A F901 77 LD (HL),A jmp_eq 13,AF91A F902 FE 0D + CP 13 F904 CA F918 + JP Z,AF91A jmp_eq '.',WARMST F907 FE 2E + CP '.' F909 CA F86C + JP Z,WARMST F90C 06 FF LD B,255 F90E 3E 52 LD A,low BUFEND F910 BD CP L F911 CA FAA2 JP Z,ERROR F914 23 INC HL
F915 C3 F8F1 JP AF8F3
; ---------------------------------------------------
F918 78 AF91A: LD A,B F919 17 RLA F91A 11 7633 LD DE,COMBUF F91D 06 00 LD B,0 F91F C9 RET
; ---------------------------------------------------
F920 7E MSSG: LD A,(HL) F921 A7 AND A F922 C8 RET Z F923 CD FCB0 CALL COUT_A F926 23 INC HL F927 C3 F920 JP MSSG
; ---------------------------------------------------
F92A 21 7627 GETPRM: LD HL,PAR_HL F92D 11 762D LD DE,FLG_P2 F930 0E 00 LD C,0 F932 CD F8D3 CALL DIR_F F935 11 7634 LD DE,COMBUF+1 F938 CD F958 CALL GET_HL F93B 22 7627 LD (PAR_HL),HL F93E 22 7629 LD (PAR_DE),HL F941 D8 RET C F942 3E FF LD A,255 F944 32 762D LD (FLG_P2),A F947 CD F958 CALL GET_HL F94A 22 7629 LD (PAR_DE),HL F94D D8 RET C F94E CD F958 CALL GET_HL F951 22 762B LD (PAR_BC),HL F954 D8 RET C F955 C3 FAA2 JP ERROR
; ---------------------------------------------------
F958 21 0000 GET_HL: LD HL,0 F95B 1A AF95D: LD A,(DE) F95C 13 INC DE jmp_eq 13,RETCY1 F95D FE 0D + CP 13 F95F CA F98C + JP Z,RETCY1 F962 FE 2C CP ',' F964 C8 RET Z
jmp_eq 20H,AF95D F965 FE 20 + CP 20H F967 CA F95B + JP Z,AF95D F96A D6 30 SUB 30H F96C FA FAA2 JP M,ERROR F96F FE 0A CP 10 F971 FA F980 JP M,AF982 F974 FE 11 CP 11H F976 FA FAA2 JP M,ERROR F979 FE 17 CP 17H F97B F2 FAA2 JP P,ERROR F97E D6 07 SUB 7 F980 4F AF982: LD C,A F981 29 ADD HL,HL F982 29 ADD HL,HL F983 29 ADD HL,HL F984 29 ADD HL,HL F985 DA FAA2 JP C,ERROR F988 09 ADD HL,BC F989 C3 F95B JP AF95D
; ---------------------------------------------------
F98C 37 RETCY1: SCF F98D C9 RET
; ---------------------------------------------------
F98E 7C CMPDH: LD A,H F98F BA CP D F990 C0 RET NZ F991 7D LD A,L F992 BB CP E F993 C9 RET
; ---------------------------------------------------
F994 CD F9A2 AF996: CALL CHK_F4 F997 CD F98E AF999: CALL CMPDH F99A C2 F9A0 JP NZ,INC_HL F99D 33 POPAF: INC SP ; лучше POP AF F99E 33 INC SP F99F C9 RET
; ---------------------------------------------------
F9A0 23 INC_HL: INC HL F9A1 C9 RET
; ---------------------------------------------------
F9A2 CD FE72 CHK_F4: CALL XF81B F9A5 FE 03 CP 3 F9A7 C0 RET NZ F9A8 CD FAC2 CALL PUSK_VG F9AB C3 FAA2 JP ERROR
; ---------------------------------------------------
F9AE E5 RIGHT4: PUSH HL ; выводит ВК и вправо на 4 позиции .msg TRIGH4 F9AF 21 FF65 + LD HL,TRIGH4 F9B2 CD F920 + CALL MSSG F9B5 E1 POP HL F9B6 C9 RET
; ---------------------------------------------------
F9B7 CD FB6C JJJ_02: CALL HXHLBL
F9BA 7E LDXHX@: LD A,(HL) F9BB C5 HXA_BL: PUSH BC F9BC CD FC9F CALL HEX_A F9BF 3E 20 LD A,20H F9C1 CD FCB0 CALL COUT_A F9C4 C1 POP BC F9C5 C9 RET
; ---------------------------------------------------
F9C6 CD FB6C DIR_D: CALL HXHLBL F9C9 CD F9BA AF9C8: CALL LDXHX@ F9CC CD F994 CALL AF996 F9CF 7D LD A,L F9D0 E6 0F AND 00001111B F9D2 CA F9C6 JP Z,DIR_D F9D5 C3 F9C9 JP AF9C8
; ---------------------------------------------------
F9D8 0A DIR_C: LD A,(BC) F9D9 BE CP (HL) F9DA CA F9E4 JP Z,AF9E6
; CALL HXHLBL ; CALL LDXHX@ F9DD CD F9B7 CALL JJJ_02
F9E0 0A LD A,(BC) F9E1 CD F9BB CALL HXA_BL
F9E4 03 AF9E6: INC BC F9E5 CD F994 CALL AF996 F9E8 C3 F9D8 JP DIR_C
; ---------------------------------------------------
F9EB 79 DIR_S: LD A,C F9EC BE CP (HL) F9ED CC FB6C CALL Z,HXHLBL F9F0 CD F994 CALL AF996 F9F3 C3 F9EB JP DIR_S
; ---------------------------------------------------
F9F6 7E DIR_T: LD A,(HL) F9F7 02 LD (BC),A F9F8 03 INC BC F9F9 CD F997 CALL AF999 F9FC C3 F9F6 JP DIR_T
; ---------------------------------------------------
F9FF CD FB6C DIR_L: CALL HXHLBL FA02 7E AFA0B: LD A,(HL) FA03 B7 OR A FA04 FA FA0C JP M,AFA15 FA07 FE 20 CP 20H FA09 D2 FA0E JP NC,AFA17 FA0C 3E 2E AFA15: LD A,'.' FA0E CD FCB0 AFA17: CALL COUT_A FA11 CD F994 CALL AF996 FA14 7D LD A,L FA15 E6 0F AND 00001111B FA17 CA F9FF JP Z,DIR_L FA1A C3 FA02 JP AFA0B
; ---------------------------------------------------
FA1D DIR_M: ; CALL HXHLBL ; CALL LDXHX@ FA1D CD F9B7 CALL JJJ_02
FA20 E5 PUSH HL FA21 CD F8EC CALL GETLIN FA24 E1 POP HL FA25 D2 FA2F JP NC,AFA3B FA28 E5 PUSH HL FA29 CD F958 CALL GET_HL FA2C 7D LD A,L FA2D E1 POP HL FA2E 77 LD (HL),A FA2F 23 AFA3B: INC HL FA30 C3 FA1D JP DIR_M
; ---------------------------------------------------
FA33 CD F98E DIR_G: CALL CMPDH FA36 CA FA4E JP Z,AFA5A
FA39 EB EX DE,HL FA3A 22 7623 LD (STOP_A),HL
FA3D 7E LD A,(HL) FA3E 32 7625 LD (TMP_COD),A ; храним байт из точки останова
FA41 36 F7 LD (HL),0F7H ; код команды RST30
FA43 3E C3 LD A,0C3H FA45 32 0030 LD (0030H),A ; подготовка RST30
FA48 21 FF9B LD HL,BREAK FA4B 22 0031 LD (0031H),HL
FA4E 31 7618 AFA5A: LD SP,R_BC ; BASE+18H FA51 C1 POP BC ; BC <-- (BASE+18H) FA52 D1 POP DE ; DE <-- (BASE+1AH) FA53 E1 POP HL ; HL <-- (BASE+1CH) это стек FA54 F1 POP AF ; AF <-- (BASE+1DH) FA55 F9 LD SP,HL FA56 2A 7616 LD HL,(R_HL) FA59 C3 7626 JP P_JMP
; ---------------------------------------------------
FA5C 3E 90 DIR_R: LD A,90H ; MVI A,90h=10010000b FA5E 32 C803 LD (PDU),A ; STA PDU (PDB,PDC-вывод, PDA-ввод) FA61 22 C801 AFA6D: LD (PDB),HL ; команда с кодом 22(SHLD) должна грузить H в PDC и L в PDB FA64 3A C800 LD A,(PDA) ; 3A(LDA) читает из PDA в акк.(A) FA67 02 LD (BC),A ; пишет в память по адресу из BC FA68 03 INC BC ; FA69 CD F997 CALL AF999 ; вызов сравнения HL?DE и INX HL FA6C C3 FA61 JP AFA6D
; ---------------------------------------------------
FA6F 2A 7602 ASKCUR: LD HL,(POSX) FA72 C9 RET
; ---------------------------------------------------
FA73 E5 RD_SCR: PUSH HL FA74 2A 7600 LD HL,(EK_ADR) FA77 7E LD A,(HL) FA78 E1 POP HL FA79 C9 RET
; ---------------------------------------------------
FA7A 3A 762D DIR_I: LD A,(FLG_P2) FA7D B7 OR A FA7E CA FA85 JP Z,AFA91
FA81 7B LD A,E FA82 32 762F LD (KNS_RD),A FA85 CD FAAA AFA91: CALL RD_BLK FA88 CD FB6C CALL HXHLBL FA8B EB EX DE,HL FA8C CD FB6C CALL HXHLBL FA8F EB EX DE,HL FA90 C5 PUSH BC FA91 CD FB0A CALL CHSUMM FA94 60 LD H,B FA95 69 LD L,C FA96 CD FB6C CALL HXHLBL FA99 D1 POP DE FA9A CD F98E CALL CMPDH FA9D C8 RET Z FA9E EB EX DE,HL FA9F CD FB6C CALL HXHLBL FAA2 ERROR: FAA2 3E 3F LD A,'?' FAA4 CD FCB0 CALL COUT_A FAA7 C3 F86C JP WARMST
; ---------------------------------------------------
FAAA 3E FF RD_BLK: LD A,255 FAAC CD FAF3 CALL LD_BC FAAF E5 PUSH HL FAB0 09 ADD HL,BC FAB1 EB EX DE,HL FAB2 CD FAF1 CALL LDBCBS FAB5 E1 POP HL FAB6 09 ADD HL,BC FAB7 EB EX DE,HL FAB8 E5 PUSH HL FAB9 CD FAFE CALL LD_BLK FABC 3E FF LD A,255 FABE CD FAF3 CALL LD_BC FAC1 E1 POP HL FAC2 PUSK_VG: FAC2 E5 PUSH HL FAC3 21 D001 LD HL,VG_75+1 FAC6 36 00 LD (HL),0 ; RESET COMMANDO FAC8 2B DEC HL ; адрес VG_75 FAC9 36 4D LD (HL),4DH ; 0.1001101 77 (77+1 знакомест) FACB 36 1D LD (HL),1DH ; 00.011101 29 (29+1 строк)
if ORIG LD (HL),99H ; 1001.1001 9 9 (9+1 линия подчёрк-ия) ; (9+1 линий в знакоместе)
LD (HL),93H ; 1.0.01.0011 без смещ. ; курсор - мигающая линия подчеркивания ; атрибуты отображать пробелом ; 3 такта сдвига - длина обр хода в стр. else FACD 36 59 LD (HL),59H ; **** лучше 58H: линия подч-я - выше FACF 36 C3 LD (HL),0C3H ; 1.1.00.0011 - это мое изменение ; курсор - мигающее знакоместо ; атрибуты не отображать endif ; теперь большой курсор
FAD1 23 INC HL ; адрес VG_75+1 FAD2 36 27 LD (HL),27H ; VHOD DISPLAY COMMANDO
FAD4 7E LD A,(HL) ; read STATUS (зачем-то это надо) FAD5 7E AFAE1: LD A,(HL) ; read STATUS FAD6 E6 20 AND 20H ; mask 'interrupt request flag' FAD8 CA FAD5 JP Z,AFAE1 ; ждем конца строки
FADB 21 F808 LD HL,VT_57+8 FADE 36 80 LD (HL),80H FAE0 2E 04 LD L,4 ; VT_57+04 FAE2 36 D0 LD (HL),low SA ; 0D0H FAE4 36 76 LD (HL),HIGH SA ; 076H FAE6 2C INC L ; адрес VT_57+5 FAE7 36 23 LD (HL),23H ; число байтов FAE9 36 49 LD (HL),49H ; режим FAEB 2E 08 LD L,8 ; VT_57+8 FAED 36 A4 LD (HL),0A4H FAEF E1 POP HL FAF0 C9 RET
; ---------------------------------------------------
FAF1 3E 08 LDBCBS: LD A,8 FAF3 CD FB8C LD_BC: CALL LDBYTE FAF6 47 LD B,A FAF7 3E 08 LD A,8 FAF9 CD FB8C CALL LDBYTE FAFC 4F LD C,A FAFD C9 RET
; ---------------------------------------------------
FAFE 3E 08 LD_BLK: LD A,8 FB00 CD FB8C CALL LDBYTE FB03 77 LD (HL),A FB04 CD F997 CALL AF999 FB07 C3 FAFE JP LD_BLK
; ---------------------------------------------------
FB0A 01 0000 CHSUMM: LD BC,0 FB0D 7E AFB19: LD A,(HL) FB0E 81 ADD A,C FB0F 4F LD C,A
FB10 F5 PUSH AF FB11 CD F98E CALL CMPDH FB14 CA F99D JP Z,POPAF FB17 F1 POP AF FB18 78 LD A,B FB19 8E ADC A,(HL) FB1A 47 LD B,A FB1B CD F997 CALL AF999 FB1E C3 FB0D JP AFB19
; ---------------------------------------------------
FB21 79 DIR_O: LD A,C FB22 B7 OR A FB23 CA FB29 JP Z,AFB35 FB26 32 7630 LD (KNS_WR),A FB29 E5 AFB35: PUSH HL FB2A CD FB0A CALL CHSUMM FB2D E1 POP HL FB2E CD FB6C CALL HXHLBL FB31 EB EX DE,HL FB32 CD FB6C CALL HXHLBL FB35 EB EX DE,HL FB36 E5 PUSH HL FB37 60 LD H,B FB38 69 LD L,C FB39 CD FB6C CALL HXHLBL FB3C E1 POP HL ; КС FB3D WR_BLK: FB3D C5 PUSH BC ; КС FB3E 01 0000 LD BC,0 FB41 CD FC3C AFB4D: CALL WRBYTE ; выводим 256 байтов 00 (пилотон) FB44 05 DEC B FB45 E3 EX (SP),HL ; это задержка 38 тактов FB46 E3 EX (SP),HL FB47 C2 FB41 JP NZ,AFB4D
FB4A 0E E6 LD C,0E6H ; выводим синхробайт E6 FB4C CD FC3C CALL WRBYTE
FB4F CD FB84 CALL WR_HL ; выводим Н.А. FB52 EB EX DE,HL FB53 CD FB84 CALL WR_HL ; выводим К.А.
FB56 EB EX DE,HL FB57 CD FB7A CALL AFB86 ; выводим блок
FB5A 21 0000 LD HL,0 FB5D CD FB84 CALL WR_HL ; выводим 2 байта 00
FB60 0E E6 LD C,0E6H ; снова выводим с/байт E6 FB62 CD FC3C CALL WRBYTE
FB65 E1 POP HL FB66 CD FB84 CALL WR_HL ; выводим КС
FB69 C3 FAC2 JP PUSK_VG
; ---------------------------------------------------
FB6C C5 HXHLBL: PUSH BC ; right 4 pos, HEX_HL & blank FB6D CD F9AE CALL RIGHT4 FB70 7C LD A,H FB71 CD FC9F CALL HEX_A FB74 7D LD A,L FB75 CD F9BB CALL HXA_BL FB78 C1 POP BC FB79 C9 RET
; ---------------------------------------------------
FB7A 4E AFB86: LD C,(HL) FB7B CD FC3C CALL WRBYTE FB7E CD F997 CALL AF999 FB81 C3 FB7A JP AFB86
; ---------------------------------------------------
FB84 4C WR_HL: LD C,H FB85 CD FC3C CALL WRBYTE FB88 4D LD C,L FB89 C3 FC3C JP WRBYTE
; ---------------------------------------------------
FB8C @LDBYT EQU $
FB8C E5 LDBYTE: PUSH HL FB8D C5 PUSH BC FB8E D5 PUSH DE FB8F 57 LD D,A FB90 3E 80 AFB9C: LD A,80H FB92 32 F808 LD (VT_57+8),A FB95 21 0000 LD HL,0 FB98 4D LD C,L ; LD C,0 FB99 39 ADD HL,SP FB9A 22 760D LD (TMPSTK),HL FB9D 31 0000 LD SP,0 FBA0 3A C002 LD A,(PKC) FBA3 0F RRCA FBA4 0F RRCA FBA5 0F RRCA FBA6 0F RRCA FBA7 E6 01 AND 00000001B FBA9 5F LD E,A
FBAA F1 AFBB7: POP AF FBAB 79 LD A,C FBAC E6 7F AND 7FH FBAE 07 RLCA FBAF 4F LD C,A FBB0 26 00 LD H,0 FBB2 25 AFBBF: DEC H FBB3 CA FC2A JP Z,AFC34 FBB6 F1 POP AF ; регенерация ОЗУ FBB7 3A C002 LD A,(PKC) FBBA 0F RRCA FBBB 0F RRCA FBBC 0F RRCA FBBD 0F RRCA FBBE E6 01 AND 00000001B FBC0 BB CP E FBC1 CA FBB2 JP Z,AFBBF FBC4 B1 OR C FBC5 4F LD C,A FBC6 15 DEC D FBC7 3A 762F LD A,(KNS_RD) FBCA C2 FBCF JP NZ,AFBDC FBCD D6 12 SUB 12H FBCF 47 AFBDC: LD B,A FBD0 F1 AFBDD: POP AF ; регенерация ОЗУ FBD1 05 DEC B FBD2 C2 FBD0 JP NZ,AFBDD FBD5 14 INC D FBD6 3A C002 LD A,(PKC) FBD9 0F RRCA FBDA 0F RRCA FBDB 0F RRCA FBDC 0F RRCA FBDD E6 01 AND 00000001B FBDF 5F LD E,A FBE0 7A LD A,D FBE1 B7 OR A FBE2 F2 FBFE JP P,AFC0B FBE5 79 LD A,C FBE6 FE E6 CP 0E6H ; прямой синхро-байт ? FBE8 C2 FBF2 JP NZ,AFBFF FBEB AF XOR A FBEC 32 762E LD (INV_MG),A ; признак инверсии магнитофона FBEF C3 FBFC JP AFC09
; ---------------------------------------------------
FBF2 FE 19 AFBFF: CP 19H ; инверсный синхро-байт ? FBF4 C2 FBAA JP NZ,AFBB7 FBF7 3E FF LD A,255 FBF9 32 762E LD (INV_MG),A FBFC 16 09 AFC09: LD D,9 FBFE 15 AFC0B: DEC D FBFF C2 FBAA JP NZ,AFBB7 FC02 21 F804 LD HL,VT_57+4 FC05 36 D0 LD (HL),low SA ; 0D0H
FC07 36 76 LD (HL),HIGH SA ; 076H FC09 23 INC HL FC0A 36 23 LD (HL),23H FC0C 36 49 LD (HL),49H FC0E 3E 27 LD A,27H ; VHOD DISPLAY COMMANDO FC10 32 D001 LD (VG_75+1),A FC13 3E E0 LD A,0E0H ; RESET COUNT FC15 32 D001 LD (VG_75+1),A FC18 3A D001 LD A,(VG_75+1) FC1B 2E 08 LD L,8 FC1D 36 A4 LD (HL),0A4H FC1F 2A 760D LD HL,(TMPSTK) FC22 F9 LD SP,HL FC23 3A 762E LD A,(INV_MG) ; with Tape inverse flag FC26 A9 XOR C FC27 C3 FC9B JP POPREG
; ---------------------------------------------------
FC2A 2A 760D AFC34: LD HL,(TMPSTK) FC2D F9 LD SP,HL FC2E CD FAC2 CALL PUSK_VG FC31 7A LD A,D FC32 B7 OR A FC33 F2 FAA2 JP P,ERROR FC36 CD F9A2 CALL CHK_F4 FC39 C3 FB90 JP AFB9C
; ---------------------------------------------------
FC3C @WRBYT EQU $
FC3C E5 WRBYTE: PUSH HL FC3D C5 PUSH BC FC3E D5 PUSH DE FC3F F5 PUSH AF FC40 3E 80 LD A,80H FC42 32 F808 LD (VT_57+8),A FC45 21 0000 LD HL,0 FC48 39 ADD HL,SP FC49 31 0000 LD SP,0 FC4C 16 08 LD D,8 FC4E F1 AFC58: POP AF FC4F 79 LD A,C FC50 07 RLCA FC51 4F LD C,A FC52 3E 01 LD A,1 FC54 A9 XOR C FC55 E6 01 AND 1 FC57 32 C002 LD (PKC),A FC5A 3A 7630 LD A,(KNS_WR) FC5D 47 LD B,A FC5E F1 AFC66: POP AF FC5F 05 DEC B FC60 C2 FC5E JP NZ,AFC66 FC63 3E 00 LD A,0
FC65 A9 XOR C FC66 E6 01 AND 1 FC68 32 C002 LD (PKC),A FC6B 15 DEC D FC6C 3A 7630 LD A,(KNS_WR) FC6F C2 FC74 JP NZ,AFC7A FC72 D6 0E SUB 14 FC74 47 AFC7A: LD B,A
FC75 F1 AFC7B: POP AF ; подьём стека на [рег.B] ячеек FC76 05 DEC B FC77 C2 FC75 JP NZ,AFC7B FC7A 14 INC D FC7B 15 DEC D FC7C C2 FC4E JP NZ,AFC58 FC7F F9 LD SP,HL FC80 21 F804 LD HL,VT_57+4 FC83 36 D0 LD (HL),low SA FC85 36 76 LD (HL),HIGH SA FC87 23 INC HL ; VT_57+5 FC88 36 23 LD (HL),23H FC8A 36 49 LD (HL),49H FC8C 3E 27 LD A,27H ; VHOD DISPLAY COMMANDO FC8E 32 D001 LD (VG_75+1),A ; 001.SSS.BB 001.001.11 FC91 3E E0 LD A,0E0H ; сброс счетчиков строк и знакомест ??? FC93 32 D001 LD (VG_75+1),A ; LD A,(VG_75+1) ; это лишнее !!! %% FC96 2E 08 LD L,8 ; VT_57+8 FC98 36 A4 LD (HL),0A4H FC9A F1 POP AF FC9B D1 POPREG: POP DE FC9C C1 POP BC FC9D E1 POP HL FC9E @BAK EQU $ FC9E C9 RET
; ---------------------------------------------------
FC9F F5 HEX_A: PUSH AF FCA0 0F RRCA FCA1 0F RRCA FCA2 0F RRCA FCA3 0F RRCA FCA4 CD FCA8 CALL NIBBLE FCA7 F1 POP AF FCA8 E6 0F NIBBLE: AND 0FH FCAA FE 0A CP 10 FCAC 3F CCF FCAD CE 30 ADC A,30H FCAF 27 DAA
FCB0 4F COUT_A: LD C,A FCB1 F5 COUT_C: PUSH AF FCB2 C5 PUSH BC FCB3 D5 PUSH DE FCB4 E5 PUSH HL
FCB5 CD 7653 CALL IF_PRN
FCB8 21 FD85 LD HL,TOBACK FCBB E5 PUSH HL
FCBC 2A 7602 LD HL,(POSX) FCBF EB EX DE,HL FCC0 2A 7600 LD HL,(EK_ADR)
FCC3 3A 7604 LD A,(ESC_F) FCC6 3D DEC A FCC7 FA FCE5 JP M,NO_ESC
FCCA CA FD65 JP Z,AFD65 FCCD E2 FD73 JP PO,AFD73 FCD0 79 LD A,C FCD1 D6 20 SUB 20H FCD3 4F LD C,A FCD4 0D AFCDD: DEC C FCD5 FA FCE0 JP M,ESCRES FCD8 C5 PUSH BC FCD9 CD FDB9 CALL COD_18 FCDC C1 POP BC FCDD C3 FCD4 JP AFCDD
; ---------------------------------------------------
FCE0 AF ESCRES: XOR A FCE1 32 7604 SETESC: LD (ESC_F),A FCE4 C9 RET
; ---------------------------------------------------
FCE5 79 NO_ESC: LD A,C FCE6 E6 7F AND 7FH FCE8 4F LD C,A jmp_eq 1FH,CLS FCE9 FE 1F + CP 1FH FCEB CA FDA3 + JP Z,CLS jmp_eq 0CH,HOME FCEE FE 0C + CP 0CH FCF0 CA FDB2 + JP Z,HOME jmp_eq 0DH,COD_0D FCF3 FE 0D + CP 0DH FCF5 CA FDF3 + JP Z,COD_0D jmp_eq 0AH,COD_0A FCF8 FE 0A + CP 0AH FCFA CA FD47 + JP Z,COD_0A jmp_eq 8,COD_08 FCFD FE 08 + CP 8 FCFF CA FDD6 + JP Z,COD_08 jmp_eq 18H,COD_18 FD02 FE 18 + CP 18H FD04 CA FDB9 + JP Z,COD_18 jmp_eq 19H,COD_19 FD07 FE 19 + CP 19H FD09 CA FDE2 + JP Z,COD_19 jmp_eq 1AH,COD_1A FD0C FE 1A + CP 1AH FD0E CA FDC5 + JP Z,COD_1A jmp_eq 1BH,COD_1B FD11 FE 1B + CP 1BH FD13 CA FD9E + JP Z,COD_1B FD16 FE 07 CP 7 FD18 C2 FD38 JP NZ,PR_SYM FD1B BEEP: FD1B 01 05F0 LD BC,5F0H FD1E 3E FF BP1: LD A,255 FD20 32 C002 LD (PKC),A ; это отключает ВИ53 (GATE канала 2) FD23 78 LD A,B FD24 FB BP2: EI FD25 3D DEC A FD26 C2 FD24 JP NZ,BP2 FD29 AF XOR A FD2A 32 C002 LD (PKC),A FD2D 78 LD A,B FD2E F3 BP3: DI FD2F 3D DEC A FD30 C2 FD2E JP NZ,BP3 FD33 0D DEC C FD34 C2 FD1E JP NZ,BP1 FD37 C9 RET
; ---------------------------------------------------
FD38 71 PR_SYM: LD (HL),C ; видимый на экране символ FD39 CD FDB9 CALL COD_18 ; сместить на следующее знакоместо FD3C 7A LD A,D FD3D FE 03 CP 3 ; мы на первой строке ? FD3F C0 RET NZ ; если не на первой строке FD40 7B LD A,E FD41 FE 08 CP 8 ; мы в первой колонке ? FD43 C0 RET NZ ; если не на первой колонке FD44 CD FDE2 CALL COD_19 FD47 7A COD_0A: LD A,D FD48 FE 1B CP 3+24 ; мы на последней строке ? FD4A C2 FDC5 JP NZ,COD_1A ; если не на последней строке
; ДАЛЕЕ РОЛИК ЭКРАНА
FD4D E5 ROLL: PUSH HL FD4E D5 PUSH DE FD4F 21 7810 LD HL,SCBASE+78 FD52 11 77C2 LD DE,SCBASE FD55 01 079E LD BC,25*78 FD58 ROLLOO: FD58 7E LD A,(HL) ; пересылка блока размером [BC] FD59 12 LD (DE),A ; (HL) --> (DE) FD5A 23 INC HL FD5B 13 INC DE loop ROLLOO FD5C 0B + DEC BC FD5D 78 + LD A,B FD5E B1 + OR C FD5F C2 FD58 + JP NZ,ROLLOO FD62 D1 POP DE FD63 E1 POP HL FD64 C9 RET
; ---------------------------------------------------
FD65 79 AFD65: LD A,C FD66 FE 59 CP 'Y' FD68 C2 FCE0 JP NZ,ESCRES FD6B CD FDB2 CALL HOME FD6E 3E 02 LD A,2 ; принято 2 байта: ESC и 'Y' FD70 C3 FCE1 JP SETESC
; ---------------------------------------------------
FD73 79 AFD73: LD A,C FD74 D6 20 SUB 20H FD76 4F LD C,A FD77 0D AFD77: DEC C FD78 3E 04 LD A,4 FD7A FA FCE1 JP M,SETESC FD7D C5 PUSH BC FD7E CD FDC5 CALL COD_1A FD81 C1 POP BC FD82 C3 FD77 JP AFD77
; ---------------------------------------------------
; >> NO EXECUTION PATH TO HERE <<
FD85 22 7600 TOBACK: LD (EK_ADR),HL ; это выход из CONOUT FD88 EB EX DE,HL FD89 22 7602 LD (POSX),HL FD8C 3E 80 LD A,80H FD8E 32 D001 LD (VG_75+1),A FD91 7D LD A,L FD92 32 D000 LD (VG_75),A ; запись координат курсора в ВГ75 FD95 7C LD A,H FD96 32 D000 LD (VG_75),A FD99 E1 POP HL FD9A D1 POP DE FD9B C1 POP BC FD9C F1 POP AF FD9D C9 RET
; ---------------------------------------------------
FD9E 3E 01 COD_1B: LD A,1 ; началась ESC-последовательность FDA0 C3 FCE1 JP SETESC
; ---------------------------------------------------
FDA3 21 7FF4 CLS: LD HL,SA+30*78 ; байт за концом экрана FDA6 11 0925 LD DE,30*78 +1 ; длина экрана +1 FDA9 AF CLSLOO: XOR A FDAA 77 LD (HL),A FDAB 2B DEC HL FDAC 1B DEC DE FDAD 7B LD A,E FDAE B2 OR D FDAF C2 FDA9 JP NZ,CLSLOO FDB2 11 0308 HOME: LD DE,308H ; коорд. лев.верхн. угол FDB5 21 77C2 LD HL,SCBASE FDB8 C9 RET
; ---------------------------------------------------
FDB9 COD_18: ; ВХОД: E=POSX, D=POSY ; HL= экранный адрес FDB9 7B LD A,E ; POSX FDBA 23 INC HL ; следующий экранный адрес FDBB 1C INC E ; POSX++ FDBC FE 47 CP 8+63 ; последняя колонка ? FDBE C0 RET NZ ; если была не последняя колонка FDBF 1E 08 LD E,8 ; нач.позиция по X на новой строке FDC1 01 FFC0 LD BC,-64 FDC4 09 ADD HL,BC ; вычесть 64 = экр.поз в начало строки FDC5 7A COD_1A: LD A,D FDC6 FE 1B CP 1BH ; последняя строка ? FDC8 01 004E LD BC,78 FDCB C2 FDD3 JP NZ,AFDD3 ; если не последняя строка FDCE 16 02 LD D,2 ; если последняя строка, то на первую строку FDD0 01 F8B0 LD BC,-24*78 FDD3 14 AFDD3: INC D FDD4 09 ADD HL,BC ; вычесть 24*78 FDD5 C9 RET
; ---------------------------------------------------
FDD6 COD_08: ; ВХОД: E=POSX, D=POSY ; HL= экранный адрес FDD6 7B LD A,E FDD7 2B DEC HL FDD8 1D DEC E FDD9 FE 08 CP 8 ; Были в первой колонке ? FDDB C0 RET NZ ; Если были не в первой колонке FDDC 1E 47 LD E,8+63 ; X коорд-та последней колонки FDDE 01 0040 LD BC,64 FDE1 09 ADD HL,BC ; Экр.адрес в последнюю колонку FDE2 7A COD_19: LD A,D FDE3 FE 03 CP 3 ; Это первая строка ? FDE5 01 FFB2 LD BC,-78 FDE8 C2 FDF0 JP NZ,AFDF0 FDEB 16 1C LD D,3+25 FDED 01 0750 LD BC,24*78 FDF0 15 AFDF0: DEC D FDF1 09 ADD HL,BC ; вычесть 78 или прибавить 24*28 FDF2 C9 RET
; ---------------------------------------------------
FDF3 7D COD_0D: LD A,L FDF4 93 SUB E FDF5 D2 FDF9 JP NC,AFDF9 FDF8 25 DEC H FDF9 6F AFDF9: LD L,A FDFA 1E 08 LD E,8 ; лучше LD E,C после загрузки BC FDFC 01 0008 LD BC,8 FDFF 09 ADD HL,BC FE00 C9 RET
| | | | |
Last edited by petrenko on 26 Jun 2018 12:33, edited 2 times in total.
|
24 Jun 2018 14:51 |
|
|
petrenko
Doomed
Joined: 10 Mar 2012 16:21 Posts: 598 Location: РФ
|
\/ Продолжение "подспойлерного" листа \/ | | | | Code: ; ---------------------------------------------------
; После 15H вызовов STATUS при нажатой клавише выставляется флаг KBDFLG
FE01 3A C002 STATUS: LD A,(PKC) FE04 E6 20 AND 20H ; RUS/LAT нажат ? FE06 CA FE0E JP Z,AFE0E FE09 3A 7605 LD A,(KBDFLG) FE0C B7 OR A FE0D C0 RET NZ ; если в SYMBUF уже есть символ FE0E E5 AFE0E: PUSH HL FE0F 2A 7609 LD HL,(LAST_K) FE12 CD FE72 CALL XF81B FE15 BD CP L FE16 6F LD L,A FE17 CA FE2A JP Z,AFE2A FE1A 3E 01 AFE1A: LD A,1 FE1C 32 760B LD (APVFLG),A FE1F 26 15 LD H,15H ; число опросов, чтобы зафиксировать код FE21 AF AFE21: XOR A FE22 22 7609 AFE22: LD (LAST_K),HL FE25 E1 POP HL FE26 32 7605 LD (KBDFLG),A FE29 C9 RET
; ---------------------------------------------------
FE2A 25 AFE2A: DEC H ; В рег.A=код клав, в рег.H- COUNT FE2B C2 FE21 JP NZ,AFE21 FE2E 3C INC A FE2F CA FE22 JP Z,AFE22 ; если код FF, то сброс флагов FE32 3C INC A FE33 CA FE51 JP Z,KEY_FE ; если код FE (RUSLAT)
FE36 C5 PUSH BC ; клик FE37 01 5003 LD BC,5003H FE3A CD FD1E CALL BP1 FE3D C1 POP BC
FE3E 3A 760B LD A,(APVFLG) FE41 26 E0 LD H,0E0H FE43 3D DEC A FE44 32 760B LD (APVFLG),A FE47 CA FE4C JP Z,AFE4C FE4A 26 40 LD H,40H FE4C 3E FF AFE4C: LD A,255 FE4E C3 FE22 JP AFE22
; ---------------------------------------------------
FE51 3A C002 KEY_FE: LD A,(PKC) FE54 E6 20 AND 20H FE56 CA FE51 JP Z,KEY_FE ; Ждём отпускания РУС/ЛАТ FE59 3A 7606 LD A,(RUSLAT) FE5C 2F CPL FE5D 32 7606 LD (RUSLAT),A FE60 C3 FE1A JP AFE1A
; ---------------------------------------------------
FE63 @CONIN EQU $
FE63 CD FE01 CONIN: CALL STATUS FE66 B7 OR A FE67 CA FE63 JP Z,CONIN FE6A AF XOR A FE6B 32 7605 LD (KBDFLG),A FE6E 3A 7609 LD A,(LAST_K) FE71 C9 RET
; ---------------------------------------------------
FE72 3A C002 XF81B: LD A,(PKC) FE75 E6 20 AND 20H ; RUS/LAT нажат ? FE77 C2 FE7D JP NZ,AFE7D FE7A 3E FE LD A,0FEH FE7C C9 RET
; ---------------------------------------------------
FE7D AF AFE7D: XOR A FE7E 32 C001 LD (PKB),A FE81 32 C002 LD (PKC),A FE84 3A 7606 LD A,(RUSLAT) FE87 E6 01 AND 1 FE89 F6 06 OR 6 FE8B 32 C003 LD (PKU),A FE8E 3A C000 LD A,(PKA) FE91 3C INC A FE92 C2 FE97 JP NZ,AFE97 FE95 3D DEC A FE96 C9 RET
; ---------------------------------------------------
FE97 E5 AFE97: PUSH HL FE98 21 0701 LD HL,1 + 7 shl 8 FE9B 7D AFE9C: LD A,L FE9C 0F RRCA FE9D 6F LD L,A FE9E 2F CPL FE9F 32 C001 LD (PKB),A FEA2 3A C000 LD A,(PKA) FEA5 2F CPL FEA6 B7 OR A FEA7 C2 FEB2 JP NZ,AFEB3 FEAA 25 DEC H FEAB F2 FE9B JP P,AFE9C FEAE 3E FF AFEAF: LD A,255 FEB0 E1 POP HL FEB1 C9 RET
; ---------------------------------------------------
FEB2 2E 20 AFEB3: LD L,20H FEB4 3A C000 AFEB5: LD A,(PKA) FEB7 2F CPL FEB8 B7 OR A FEB9 CA FEAE JP Z,AFEAF FEBC 2D DEC L FEBD C2 FEB4 JP NZ,AFEB5 FEC0 2E 08 LD L,8 FEC2 2D AFEC3: DEC L FEC3 07 RLCA FEC4 D2 FEC2 JP NC,AFEC3 FEC7 7D LD A,L FEC8 FE 01 CP 1 FECA CA FEF1 JP Z,AFEFA FECD DA FEEA JP C,AFEF3 FED0 07 RLCA FED1 07 RLCA FED2 07 RLCA FED3 C6 20 ADD A,20H FED5 B4 OR H FED6 C3 FEFD JP AFF06
; ---------------------------------------------------
FED9 19 1A 0C 00 TABK1: defb 19H,1AH,0CH,0,1,2,3,4 FEDD 01 02 03 04 FEE1 20 1B 09 0A TABK2: defb 20H,1BH,9,0AH,0DH,1FH,8,18H,5 FEE5 0D 1F 08 18 FEE9 05
; ---------------------------------------------------
FEEA 7C AFEF3: LD A,H FEEB 21 FEE1 LD HL,TABK2 FEEE C3 FEF5 JP AFEFE
; ---------------------------------------------------
FEF1 7C AFEFA: LD A,H FEF2 21 FED9 LD HL,TABK1 FEF5 85 AFEFE: ADD A,L FEF6 6F LD L,A FEF7 7E LD A,(HL) FEF8 FE 40 CP 40H FEFA E1 POP HL FEFB D8 RET C FEFC E5 PUSH HL FEFD 6F AFF06: LD L,A FEFE 3A C002 LD A,(PKC) FF01 67 LD H,A FF02 E6 40 AND 40H FF04 C2 FF11 JP NZ,AFF1A FF07 7D LD A,L FF08 FE 40 CP 40H FF0A FA FF36 JP M,AFF3F FF0D E6 1F AND 1FH FF0F E1 POP HL FF10 C9 RET
; ---------------------------------------------------
FF11 3A 7606 AFF1A: LD A,(RUSLAT) FF14 B7 OR A FF15 CA FF21 JP Z,AFF2A FF18 7D LD A,L FF19 FE 40 CP 40H FF1B FA FF21 JP M,AFF2A FF1E F6 20 OR 20H FF20 6F LD L,A FF21 7C AFF2A: LD A,H FF22 E6 80 AND 80H FF24 C2 FF36 JP NZ,AFF3F FF27 7D LD A,L FF28 FE 40 CP 40H FF2A FA FF32 JP M,AFF3B FF2D 7D LD A,L FF2E EE 20 XOR 20H FF30 E1 POP HL FF31 C9 RET
; ---------------------------------------------------
FF32 7D AFF3B: LD A,L FF33 E6 2F AND 101111B FF35 6F LD L,A FF36 7D AFF3F: LD A,L FF37 FE 40 CP 40H FF39 E1 POP HL FF3A F0 RET P FF3B E5 PUSH HL FF3C 6F LD L,A FF3D E6 0F AND 0FH FF3F FE 0C CP 0CH FF41 7D LD A,L FF42 FA FF47 JP M,POPHL FF45 EE 10 XOR 10H FF47 E1 POPHL: POP HL FF48 C9 RET
; ---------------------------------------------------
FF49 2A 7631 ASKTOP: LD HL,(RAMTOP) FF4C C9 RET
; ---------------------------------------------------
FF4D 22 7631 SETTOP: LD (RAMTOP),HL FF50 C9 RET
; ---------------------------------------------------
FF51 1F 4D 49 4B TITR: defb 1FH,'МИКРОША-86RK',0 FF55 52 4F 5B 41 FF59 2D 38 36 52 FF5D 4B 00 FF5F 0D 0A 2D 2D PROMPT: defb 13,10,'-->',0 FF63 3E 00 FF65 0D 0A 18 18 TRIGH4: defb 13,10,18H,18H,18H,18H,0 FF69 18 18 00
; ---------------------------------------------------
FF6C 0D 0A T_REGS: defb 13,10 FF6E 20 50 43 2D defb ' PKC-',13,10 FF72 0D 0A FF74 20 48 4C 2D defb ' HL-',13,10 FF78 0D 0A FF7A 20 42 43 2D defb ' BC-',13,10 FF7E 0D 0A FF80 20 44 45 2D defb ' DE-',13,10 FF84 0D 0A FF86 20 53 50 2D defb ' SP-',13,10 FF8A 0D 0A FF8C 20 41 46 2D defb ' AF-' FF90 19 19 19 19 defb 19H,19H,19H,19H,19H,19H,0 FF94 19 19 00
; ---------------------------------------------------
FF97 08 20 08 00 TZABOJ: defb 8,32,8,0
; ---------------------------------------------------
FF9B 22 7616 BREAK: LD (R_HL),HL ; сюда попадаем по проходу стоп-точки FF9E F5 PUSH AF FF9F E1 POP HL FFA0 22 761E LD (R_AF),HL ; REG_AF FFA3 E1 POP HL FFA4 2B DEC HL FFA5 22 7614 LD (POINT),HL ; адрес останова по RST_30H FFA8 21 0000 LD HL,0 FFAB 39 ADD HL,SP FFAC 31 761E LD SP,R_AF FFAF E5 PUSH HL ; REG_SP FFB0 D5 PUSH DE ; REG_DE FFB1 C5 PUSH BC ; REG_BC FFB2 2A 7614 LD HL,(POINT) FFB5 31 76D0 LD SP,STACK FFB8 CD FB6C CALL HXHLBL ; Вывод точки с RST_30H FFBB EB EX DE,HL FFBC 2A 7623 LD HL,(STOP_A) FFBF CD F98E CALL CMPDH ; Случайный или стоп юзера ? FFC2 C2 F86C JP NZ,WARMST ; Если это USER_BREAK, то FFC5 3A 7625 LD A,(TMP_COD) FFC8 77 LD (HL),A ; восстанавливаем программу в СТОП-точке FFC9 C3 F86C JP WARMST
; ---------------------------------------------------
FFCC DIR_X: .msg T_REGS FFCC 21 FF6C + LD HL,T_REGS FFCF CD F920 + CALL MSSG FFD2 21 7614 LD HL,POINT FFD5 06 06 LD B,6 FFD7 5E AFFDE: LD E,(HL) FFD8 23 INC HL FFD9 56 LD D,(HL) FFDA C5 PUSH BC FFDB E5 PUSH HL FFDC EB EX DE,HL FFDD CD FB6C CALL HXHLBL FFE0 CD F8EC CALL GETLIN FFE3 D2 FFEF JP NC,AFFF6 FFE6 CD F958 CALL GET_HL FFE9 D1 POP DE FFEA D5 PUSH DE FFEB EB EX DE,HL FFEC 72 LD (HL),D FFED 2B DEC HL FFEE 73 LD (HL),E FFEF E1 AFFF6: POP HL FFF0 C1 POP BC FFF1 05 DEC B FFF2 23 INC HL FFF3 C2 FFD7 JP NZ,AFFDE FFF6 C9 RET
; ---------------------------------------------------
0000 @FREE aset 0 rept 100 if $ ne 0 defb 255 @FREE aset @FREE+1 endif ENDM
FFF7 FF + defb 255 FFF8 FF + defb 255 FFF9 FF + defb 255 FFFA FF + defb 255 FFFB FF + defb 255 FFFC FF + defb 255 FFFD FF + defb 255 FFFE FF + defb 255 FFFF FF + defb 255
if HIGH $-1 ne 0FFFFH if1 .printx * Code length over 2048 bytes ! * endif endif
; ---------------------------------------------------
.dephase
END Symbols:
@BAK FC9E @CONIN FE63 @FREE 0009 @LDBYT FB8C @WRBYT FC3C AF8F1 F8EF AF8F3 F8F1 AF91A F918 AF95D F95B AF982 F980 AF996 F994 AF999 F997 AF9C8 F9C9 AF9E6 F9E4 AFA0B FA02 AFA15 FA0C AFA17 FA0E AFA3B FA2F AFA5A FA4E AFA6D FA61 AFA91 FA85 AFAE1 FAD5 AFB19 FB0D AFB35 FB29 AFB4D FB41 AFB86 FB7A AFB9C FB90 AFBB7 FBAA AFBBF FBB2 AFBDC FBCF AFBDD FBD0 AFBFF FBF2 AFC09 FBFC AFC0B FBFE AFC34 FC2A AFC58 FC4E AFC66 FC5E AFC7A FC74 AFC7B FC75 AFCDD FCD4 AFD65 FD65 AFD73 FD73 AFD77 FD77 AFDD3 FDD3 AFDF0 FDF0 AFDF9 FDF9 AFE0E FE0E AFE1A FE1A AFE21 FE21 AFE22 FE22 AFE2A FE2A AFE4C FE4C AFE7D FE7D AFE97 FE97 AFE9C FE9B AFEAF FEAE AFEB3 FEB2 AFEB5 FEB4 AFEC3 FEC2 AFEF3 FEEA AFEFA FEF1 AFEFE FEF5 AFF06 FEFD AFF1A FF11 AFF2A FF21 AFF3B FF32 AFF3F FF36 AFFDE FFD7 AFFF6 FFEF APVFLG 760B ASKCUR FA6F ASKTOP FF49 BAKSTP F8DA BASE 7600 BEEP FD1B BP1 FD1E BP2 FD24 BP3 FD2E BREAK FF9B BUFEND 7652 CHK_F4 F9A2 CHSUMM FB0A CLS FDA3 CLSLOO FDA9 CMPDH F98E COD_08 FDD6 COD_0A FD47 COD_0D FDF3 COD_18 FDB9 COD_19 FDE2 COD_1A FDC5 COD_1B FD9E COMBUF 7633 CONIN FE63 COUNT 760A COUT_A FCB0 COUT_C FCB1 DIR_C F9D8 DIR_D F9C6 DIR_F F8D3 DIR_G FA33 DIR_I FA7A DIR_L F9FF DIR_M FA1D DIR_O FB21 DIR_R FA5C DIR_S F9EB DIR_T F9F6 DIR_X FFCC DOPPPA C800 EK_ADR 7600 ERROR FAA2 ESCRES FCE0 ESC_F 7604 FLG_P2 762D FRELOC 760C GETLIN F8EC GETPRM F92A GET_HL F958 HEX_A FC9F HOME FDB2 HXA_BL F9BB HXHLBL FB6C INC_HL F9A0 INV_MG 762E JJJ_02 F9B7 KBDFLG 7605 KEY_FE FE51 KNS_RD 762F KNS_WR 7630 LAST_K 7609 LDBCBS FAF1 LDBYTE FB8C LDXHX@ F9BA LD_BC FAF3 LD_BLK FAFE MSSG F920 NIBBLE FCA8 NO_ESC FCE5 ORD 0000 ORIG 0000 PKA C000 PAR_BC 762B PAR_DE 7629 PAR_HL 7627 PKB C001 PKC C002 PDA C800 PDB C801 PDC C802 PDU C803 POINT 7614 POPAF F99D POPHL FF47 POPREG FC9B POSX 7602 POSY 7603 PROMPT FF5F PR_SYM FD38 PKU C003 PUSK_V FAC2 P_JMP 7626 RABADR F800 RAMTOP 7631 RD_BLK FAAA RD_SCR FA73 RETCY1 F98C RIGHT4 F9AE ROLL FD4D ROLLOO FD58 RUSLAT 7606 R_AF 761E R_BC 7618 R_HL 7616 R_SP 761C SA 76D0 SCBASE 77C2 SETESC FCE1 SETTOP FF4D STACK 76D0 STATUS FE01 STOP_A 7623 TABK1 FED9 TABK2 FEE1 TITR FF51 TMPSTK 760D TMP_CO 7625 TOBACK FD85 TRIGH4 FF65 TZABOJ FF97 T_REGS FF6C VERBOS 0000 VG_75 D000 VHOD F836 VT_57 F800 WARMST F86C WRBYTE FC3C WR_BLK FB3D WR_HL FB84 XF81B FE72
No fatal error(s) | | | | |
^_Просьба не убирать, несмотря на размер кода, это может пригодиться многим, кто вдруг решит ( хоть и >38лет прошло ) поулучшать "микрошу"
|
24 Jun 2018 14:57 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 583 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Под SYMBUF имелся ввиду буфер на один символ, который заполняется при выполнении подпрограмм F812 и F81B. Этот буфер скопирован из консольных функций ROM-BIOS импортных компьютеров. Такой буфер есть и в CP/M. Дело в том, что импортные рэтро компьютеры использовали аппаратную клавиатуру, аналог которой это клавиатура от "Электроники-60" - 15ВВВ-97-006, Консул, клавиатура Агата и от всех DEC мини ЭВМ. Аппаратная рэтро клавиатура выдаёт по нажатию прямо код ASCII сопровождаемый сигналом строб STB=0. В компьютере стоит триггер статуса, который взводится по фронту STB, а данные защелкиваются в регистре. Вот этот регистр и есть односимвольный буфер аппаратной клавиатуры. Компьютер непрерывно читает триггер статуса продпрограммой STATUS (F812). И как только оттуда считан не 0, значит в этом односимвольном входном буфере есть код. Компьютер может этот ASCII-код считать не сразу, а спустя полчаса. При считывании ASCII-кода триггер статуса автоматически сбрасывается. В РК86 работа клавиатуры точно эмулирует эту идею. А вот ПЗУ Специалиста и ОРИОНА сделаны неправильно, - там нет буфера, потому, если определив по STATUS F812, что код в буфере есть, программа вслед за этим вызывает CONIN F803, чтобы этот код принять, то если пользователь к этому времени уже успел отпустить кнопку, то программа просто повисает на ожидании очередного нажатия. Для родных программ ОРИОНА это не вредит, т.к они уже знают о таком неправильном поведении подпрограмм. Понятно, что когда делалась CP/M для ОРИОНА и Специалиста это было легко учесть, - вместо STATUS вызывалась F81B, которая возвращает код нажатой именно в этот момент клавиши (чтение на лету). Полученный код кладётся в специально организуемый буфер. STATUS делается не прямым чтением, а за счёт вызова F81B. Потому, если STATUS выдал, что в буфере есть код, то вызов CONIN обязательно сразу вернёт код, немотря на то, что клавиша уже реально не нажимается. Комментарии, скорее всего были взяты мной из другого уже доработанного исходника РК86, где возможно и была ячейка SYMBUF (вспомнить нельзя, это было 30 лет назад). Но скорее всего, я просто дописывал комментарий и написал коротко SYMBUF, чтобы не писать долго "односимвольный буфер ввода с консоли" или листать исходник, чтобы найти название конкретной ячейки. Мне и так было понятно о чём речь. В качестве символьного буфера в данном исходнике служит ячейка LAST_K и Вы бы сами это увидели, посмотрев подпрограмму CONIN. Здесь ячейка KBDFLG это флаг о том, что ранее при вызовах п/п-мм STATUS или XF81B было обнаружено нажатие клавиши, код которой положен в ячейку LAST_K (от Last Key - это последний код, что был считан с клавиатуры при вызовах F81B или F812). Эта подпрограмма CONIN, если STATUS возвратил флаг, что символ в буфере есть, сбрасывает KBDFLG, а уже ранее подготовленный символ берёт из односимвольного буфера, ячейки LAST_K. Тем самым может считываться код клавиши, которую нажали час назад. Если же флаг KBDBUF не стоит, т.е ранее нажатий не было зафиксировано, то вызывается STATUS до тех пока не нажмут на какую-нибудь клавишу. Лучше переименовать ячейку LAST_K в SYMBUF. При желании легко доработать ПЗУ так, чтобы консольный буфер был не односимвольным, а как в IBM PC, 16-ти символьным. Но особой нужды в этом нет, т.к нет процедур настолько надолго прерывающих прогон РК-программ. Это в одноядерном PC, если, например, читается флоп или винт, то программа не реагирует на клавиши пока не закончится чтение. А это может быть от секунды до десятков секунд. Но если в это время нажимать на клавиши, то нажатия не пропадут, а уйдут в буфер клавиатуры. Если же Вы нажмёте клавишу более 16-ти раз, то буфер переполнится и клавиатура пискнет извещая Вас, что дальнейшие нажатия уже пропадут. Я думаю, что и в IBM без большого клавиатурного буфера могли обойтись. Потому даже, если поставить винт или флоп в РК, то всё-равно нет смысла вводить большой консольный буфер. Достаточно не быть идиотом и не набирать ничего на клавиатуре когда процессор занят чем-то другим более срочным и не обслуживает клавиатуру. А в обычных программах для РК86 процессор 99% времени проводит в опросе клавиатуры. В секунду делается ~3000 вызовов подпрограммы F812 или F81B. Потому нажатия и не пропадают.
Last edited by barsik on 24 Jun 2018 23:01, edited 1 time in total.
|
24 Jun 2018 18:32 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ничего не могу сказать по поводу ОРИОНА, а вот насчет ПЗУ Специалиста - должен возразить: Смотря какого Специалиста: в Мониторе DDT SP-580, насколько я помню, такой буфер был, есть он также и в BIOS/RAMFOS "Специалиста_MX", могу ошибиться по памяти, но кажется, даже не на одну ячейку, поскольку опрос нажатой клавиши входил в подпрограмму вывода символа на экран, чтобы оперативнее реагировать на клавиатуру. P.S. Да, действительно, в BIOS/RAMFOS "Специалиста_MX" такой буфер есть, нашел скан своих древних записей: И работало это примерно так: во время вывода символа на экран (а в "Специалисте_МХ" это, к примеру тот же моргающий курсор) проводилась проверка, не нажата ли клавиша. Если клавиша нажата, то код считывался, сохранялся в буфер и взводился флаг, что код клавиши считан. В этом случае подпрограмма чтения клавиатуры брала код из буфера, а не читала порт ВВ55. Но насколько я разбирался в BIOS/RAMFOS, они многое позаимствовали у DDT SP-580, значит, вполне возможно, что и в нём подобный буфер был.
_________________ iLavr
|
24 Jun 2018 19:05 |
|
|
Who is online |
Users browsing this forum: vital72 and 34 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|