nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 09:11



Reply to topic  [ 38 posts ]  Go to page Previous  1, 2, 3  Next
Исходники ПЗУ Микроши и их модернизация 
Author Message
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
azesmbog wrote:
Не только лишь все на ПП могут пользоваться FR. А уж выискивать ошибки сканирования - видимо еще меньше.
Извиняюсь, только, что заметил Ваше сообщение (благодаря тому, что тему почистили).

И не сразу понял, о чём оно. Что такое ПП и 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. А в действительности:
azesmbog wrote:
Там восстановление стека, есичо
Точно. Точнее регистров. Просто мне дали неверный дамп. Код LD BC,nnnn это байт 01, а в журнале стояло D1, что является командой POP, как и коды E1 и C1. Таким образом вместо 01,C1,E1 в дампе должно стоять D1, C1, E1, т.е на выходе из МГ-подпрограмм стоит тот же самый код, как и в ПЗУ РК86 - POPREG. Адрес этой точки в журнальном ПЗУ FAC0, а в ПЗУ с директивой R - FAC1, там вместо 01 должен стоять байт D1.
azesmbog wrote:
Помогло заткнуть не всю процедуру TapeWriteBlock, а всего лишь чтение в ней
Это не понял, но не важно. Важно, что Вы помогли обнаружить ошибку в дампе. Спасибо.


Last edited by barsik on 19 Jun 2018 03:54, edited 2 times in total.



19 Jun 2018 01:18
Profile
Novelist

Joined: 15 Jun 2018 16:58
Posts: 26
Reply with quote
Post Re:
barsik wrote:
Это не понял, но не важно.

Ну как же. Вот кусок той самой процедуры, хвостик, с правильными POP-ами :)
Code:
            ld      a, 27h
            ld      (VG75 + 1), a
            ld      a, 0E0h
            ld      (VG75 + 1), a
;            ld      a, (VG75 + 1)
            ld      l, 8
            ld      (hl), 0A4h
            pop     af

loop_35:    pop     de
            pop     bc
            pop     hl
            ret

комментим строку ld a, (VG75 + 1), ну или три ноп-а туда, чтобы не нарушать отчетности)
ПП - Полигон Призраков
FR - Fine Reader


19 Jun 2018 02:59
Profile
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
azesmbog wrote:
комментим строку ld a, (VG75 + 1), ну или три ноп-а туда, чтобы не нарушать адреса точки выхода для эмулятора.
По логике загружать регистр А, чтобы сразу же испортить его по POP AF глупо, хотя можно думать, что это надо для ВГ75. Но сравнил с соответствующей точкой ПЗУ РК86, с которой это ПЗУ Микроши получена. Там такой строки нет. Посмотрел в заводском ПЗУ Микроши. Там сдуру целых 3 места, где инициализируется ВГ75, ни в одном из них такой строки нет.

Вряд-ли в журнале опубликовали дохлый дамп. Хотя может быть в последующих статьях была поправка? Возможно это фатально только для эмулятора EMU. Надо проверить в эмуляторе EMU80 и, главное, в реале. Проверьте, происходит завис именно из-за этой строки или из-за последующего сдвига кода. EMU зависает, если МГ-точки перехвата в конфиге настроены неверно, тогда эмулятор уходит на ввод/вывод байта ожидая прогона точки выхода.

Т.к официальных конфигов эмуляторов для такого ПЗУ пока нет, и других причин мешающих сдвигу внутреннего кода тоже нет, то эту строку в исходнике следует удалить и перетранслировать, особенно если она фатальна и для реала.


19 Jun 2018 04:12
Profile
Novelist

Joined: 15 Jun 2018 16:58
Posts: 26
Reply with quote
Похоже это строчка фатальна только для emu :(
Для реала вряд ли фатальна, ибо ТС бы наверняка сказал.
Ну чтобы сдвига не было, я и предложил втуда 3 NOP. А так думаю и удалить - ничего не поменяется, да и кому интересна сейчас запись :no:
да и реальной Микроши у меня нет, это так. чисто спортивный интерес, а в железных эмулях эта фигня бесполезна от слова совсем.


19 Jun 2018 05:43
Profile
Devil

Joined: 26 May 2003 06:57
Posts: 859
Reply with quote
azesmbog wrote:
Похоже это строчка фатальна только для emu :(

Не фатальна. Я совсем другие байты исправил, связанные с ошибкой распознавания, о них писали на полигоне призраков:
Code:
000002E6: 26 76
000004A0: 01 D1

Первый байт - часть процедуры инициализации ПДП, без исправления настраивает экран на 26D0
Второй байт - вместо трёх команд POP выполняется LXI B,... Вот это - фатально :)

Ну и перехват процедур в конфиге удалил (строчки с адресами в секции cas), процедуры по другим адресам.
Всё работает, процедуры магнитофона тоже, т.е. полная эмуляция чтения/записи без перехвата процедур.

azesmbog wrote:
Для реала вряд ли фатальна, ибо ТС бы наверняка сказал.

Он сделал аналогичное исправление.

_________________
Страничка эмулятора наших компьютеров
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
Profile WWW
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
.
В ранее выложенном дампе в исходнике адрес DOPPPA установлен на E000 (CS1), т.е предполагается, что ППА ROM-диска смонтирован как расширение. Если же в качестве ППА ROM-диска используется имеющийся запасной ППА, то надо, во-первых, отключить коммутацию фонтов с этого ППА (и другое управление железом, если оно есть), а также в исходнике в качестве адреса DOPPPA подставить число C800.

Если коммутацию фонтов оставить портом, то после выполнения директивы R фонт переключается и вместо латинских букв в командах выводятся мелкие русские буквы. Т.е, если ROM-диск читать через резидентный ППА, то с данным ПЗУ неудобно одновременно иметь и два фонта и ROM-диск. В эмуляторе то же самое (т.е надо в конфиге рассчитанном для ROM-диска удалить строки про коммутацию фонтов).

Потому, если ROM-диск подключен через резидентный запасной ППА, то коммутацию фонтов можно перенести как в РК86 - на PC3 ППА клавиатуры. Впрочем, можно решить проблему программно, - изменить код директивы R так, чтобы по её завершении перед возвратом в CCP восстанавливался стандартный фонт (а то, что во время считывания ROM-диска экран мигает можно стерпеть, т.к это не более секунды). Также исправить данный дефект можно, если порт B использовать на ввод (тогда схема ROM-диска иная).

Во вложении исправленный исходник (в нём также ненужная строка в п/п-мме WRBYTE удалена), соответственно точки перехвата точек МГ-подпрограмм сдвинулись. Чтобы работал магнитофон для конфига EMU:
Code:
cas : tape-recorder {
   biproc[FB8C-FC9E]=rk
   boproc[FC3C-FC9E]=rk
#  tproc[F89A-FCAB]=rk
#  tproc[FD0A-F89D]=rk
}
А вот так надо изменить строки задающие точки перехвата МГ-ввода/вывода в эмуляторе EMU80:
Code:
@F806_ADDR = 0xFB8C     здесь подставляется @LDBYTE
@F80C_ADDR = 0xFC3C     здесь подставляется @WRBYTE
@F803_ADDR = 0xFE63     здесь подставляется @CONIN

В исходнике специально, чтобы облегчить подстановку чисел в конфиги эмуляторов нужные метки выводятся первыми в таблице меток листинга трансляции (т.к метки упорядочены по алфавиту, для этого в начало интересующих меток, чтобы их долго не искать, подставляется символ @). Если будете менять исходник, то взгляните на начало листинга трансляции и если эти адреса изменились, то соответственно откорректируйте конфиг того эмулятора, которым пользуетесь.

Во вложении также есть уже странслированные DAT-файлы для ROM-диска по адресу C800, готовые для прошивки. Рекомендую прошить альтернативный дамп, в котором курсор сделан не маленькой чёрточкой, а большим прямоугольником. Это намного приятнее. Сам я пользуюсь в РК86 монитором с таким курсором. Но учтите, что в обоих эмуляторах курсор будет уродливым, т.к в обоих эмуляторах ошибка. Монитор с таким курсором получается, если странслировать с ключом ORIG=0.


Attachments:
MIKROSHA with DIR_R.rar [7.22 KiB]
Downloaded 393 times
19 Jun 2018 10:11
Profile
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Занимаясь дизассемблированием ПЗУ (и других программ) для проверки правильно ли выполнено дизассемблирование приходится сравнивать код оригинала с кодом программы полученным после трансляции полученного исходника.

Для этого удобнее всего пользоваться программой сравнивающей два файла, неважно в 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 есть команда сравнения, то можно воспользоваться им.


Attachments:
Сравнение блоков в ZSID3.png
Сравнение блоков в ZSID3.png [ 11.25 KiB | Viewed 9999 times ]
ZSID3.rar [22.9 KiB]
Downloaded 372 times
20 Jun 2018 12:08
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post Re:
barsik wrote:
... удобнее всего пользоваться программой сравнивающей два файла, неважно в MSDOS или в CP/M.
Для MSDOS у меня нет такой программы,...

Для MSDOS и Win есть такая консольная утилита FC.EXE (File Compare).
И вроде как - это нативная утилита Win, поскольку находится в каталоге:
C:\WINDOWS\COMMAND\

Использовать: FC /b file1 file2 (ключ /b - бинарное сравнение).

Attachment:
FC.zip [13.83 KiB]
Downloaded 367 times


На диске дистрибутива Windows есть еще и оконное приложение WINDIFF.EXE,
но для меня оно как-бы менее удобно, хотя и установлено.
Attachment:
WDiff.gif
WDiff.gif [ 4.83 KiB | Viewed 9994 times ]

_________________
iLavr


20 Jun 2018 12:44
Profile
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Lavr wrote:
Для MSDOS и Win есть такая консольная утилита FC.EXE
Спасибо за информацию, это решает проблему.

Приложенная Вами FC.EXE оказалась неработоспособной, т.к она похоже от Windows ME. Но в Windows XP тоже оказалось есть эта программка. Только в Win XP нет папки Windows/Command, а файл FC.EXE и некоторые другие полезные утилитки (в т.числе и EXE2.BIN) находятся в каталоге /System32. Что глупость со стороны Microsoft, т.к в этом каталоге, например у меня, более 4000 файлов с объёмом более 700 мб и найти там что-то визуально проблематично.
Lavr wrote:
На диске дистрибутива Windows есть еще и оконное приложение WINDIFF.EXE
А вот этой программки в Win XP нет, ну и не надо...

Не понял, как Вам удаётся из Windows ME выходить в Интернет? Даже для Win XP трудно найти браузер, что показывал бы самые современные накрученные сайты. А с Win ME годятся лишь очень старые браузеры, которыми в Интернете можно смотреть только сайты что были созданы давно и не менялись более 15 лет. Win 98 и Win ME лучше тем, что они понимают формат дискет на 1700 кб, отформатированных с помощью драйверов 800 и PU1700, а Win XP понимает только 1.44 мб (и даже формат 720 кб не читает), что было важно 17 лет назад, когда резервные копии архивов приходилось делать и восстанавливать при крахе винта с дискет.


Attachments:
Сравнение файлов с помощью FC.EXE.png
Сравнение файлов с помощью FC.EXE.png [ 6.05 KiB | Viewed 9982 times ]
Неправильная FC.png
Неправильная FC.png [ 6.67 KiB | Viewed 9982 times ]
20 Jun 2018 21:23
Profile
Novelist

Joined: 15 Jun 2018 16:58
Posts: 26
Reply with quote
Post Re:
barsik wrote:
Занимаясь дизассемблированием ПЗУ (и других программ) для проверки правильно ли выполнено дизассемблирование приходится сравнивать код оригинала с кодом программы полученным после трансляции полученного исходника.

Для этого удобнее всего пользоваться программой сравнивающей два файла, неважно в MSDOS или в CP/M.


Как все сложно :( Я по старинке. IDA + SJAsm + Total Commander , который работает в любой версии форточек.


20 Jun 2018 23:02
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post Re:
barsik wrote:
Не понял, как Вам удаётся из Windows ME выходить в Интернет? Даже для Win XP трудно найти браузер, что показывал бы самые современные накрученные сайты. А с Win ME годятся лишь очень старые браузеры, которыми в Интернете можно смотреть только сайты что были созданы давно и не менялись более 15 лет.

У меня нет Windows ME, у меня Windows 98 и браузер Opera 9.64, который весьма неплохо всё показывает.
И я бы не сказал, что браузер Opera 9.64 "очень старый".

Также неплохо работают браузеры K-Meleon и D-Plus, тоже не "очень старые", слышали о таких? :wink:

Ну и существует в интернете группа пользователей Windows 98, которые помогают ей жить дальше.
Win98SE+KernelEx - это чуть хуже, чем Win ХР. Так что не могу сказать, что у меня уж совсем нативная Windows 98... :lol:

А работаю я из-под такой Windows 98, поскольку она не создает мне проблем, которые характерны
уже для Win ХР частично и в полной мере для Win 7 и выше.


P.S. На всякий случай - в архиве WinDiff. Эту папку просто распаковать в Program Files.
Attachment:
Win98RK.zip [88.64 KiB]
Downloaded 362 times

_________________
iLavr


20 Jun 2018 23:14
Profile
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
^Уклонились в обсуждение инструментария, в т.ч. "подвиндовозного" :neutral:

[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
Profile
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
\/ Продолжение "подспойлерного" листа \/

 
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
Profile
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
petrenko wrote:
где описан упомянутый дважды "SYMBUF", какой адрес этого "SYMBUF" ?

Под 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.
Code:
CONIN:  CALL    STATUS
        OR      A
        JP      Z,CONIN
        XOR     A
        LD      (KBDFLG),A
        LD      A,(LAST_K)
        RET

Здесь ячейка 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
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
barsik wrote:
Вот этот регистр и есть односимвольный буфер аппаратной клавиатуры. Компьютер непрерывно читает триггер статуса продпрограммой STATUS (F812). И как только оттуда считан не 0, значит в этом односимвольном входном буфере есть код. Компьютер может этот ASCII-код считать не сразу, а спустя полчаса. При считывании ASCII-кода триггер статуса автоматически сбрасывается.

В РК86 работа клавиатуры точно эмулирует эту идею. А вот ПЗУ Специалиста и ОРИОНА сделаны неправильно, - там нет буфера, ...

Ничего не могу сказать по поводу ОРИОНА, а вот насчет ПЗУ Специалиста - должен возразить:
Смотря какого Специалиста: в Мониторе DDT SP-580, насколько я помню, такой буфер был,
есть он также и в BIOS/RAMFOS "Специалиста_MX", могу ошибиться по памяти, но кажется,
даже не на одну ячейку, поскольку опрос нажатой клавиши входил в подпрограмму вывода
символа на экран, чтобы оперативнее реагировать на клавиатуру.


P.S. Да, действительно, в BIOS/RAMFOS "Специалиста_MX" такой буфер есть, нашел скан
своих древних записей
: :wink:
Attachment:
ramfos1.gif
ramfos1.gif [ 47.56 KiB | Viewed 9883 times ]
И работало это примерно так: во время вывода символа на экран (а в "Специалисте_МХ" это, к примеру
тот же моргающий курсор) проводилась проверка, не нажата ли клавиша. Если клавиша нажата,
то код считывался, сохранялся в буфер и взводился флаг, что код клавиши считан.
В этом случае подпрограмма чтения клавиатуры брала код из буфера, а не читала порт ВВ55.
Но насколько я разбирался в BIOS/RAMFOS, они многое позаимствовали у DDT SP-580, значит,
вполне возможно, что и в нём подобный буфер был.

_________________
iLavr


24 Jun 2018 19:05
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 38 posts ]  Go to page Previous  1, 2, 3  Next

Who is online

Users browsing this forum: No registered users and 12 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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.