{ "code": [ { "line": 1, "comment": ";============================================================================" }, { "line": 2, "comment": "; Монитор компьютера Радио-86РК (ПЗУ 2кБ)" }, { "line": 3, "comment": ";============================================================================" }, { "line": 5, "comment": ";----------------------------------------------------------------------------" }, { "line": 6, "comment": "; Адреса регистров периферийных БИС" }, { "line": 7, "comment": ";----------------------------------------------------------------------------" }, { "line": 9, "comment": "; ППА К580ВВ55 D20 (клавиатура)" }, { "line": 10, "label": "vv55_port_a", "op": "equ", "arg1": "8000h", "addr": "8000", "comment": "; Порт A клавиатуры (шина сканирования)" }, { "line": 11, "label": "vv55_port_b", "op": "equ", "arg1": "8001h", "addr": "8001", "comment": "; Порт B клавиатуры (состояние клавиш)" }, { "line": 12, "label": "vv55_port_c", "op": "equ", "arg1": "8002h", "addr": "8002", "comment": "; Порт C клавиатуры (вспомогательные клавиши, магнитофон)" }, { "line": 13, "label": "vv55_ctrl", "op": "equ", "arg1": "8003h", "addr": "8003", "comment": "; Регистр управляющего слова клавиатуры" }, { "line": 15, "comment": "; ППА К580ВВ55 D14 (дополнительный, для ROM-диска)" }, { "line": 16, "label": "vv55_d14_port_a", "op": "equ", "arg1": "0A000h", "addr": "A000", "comment": "; Порт A D14 (шина данных ROM-диска)" }, { "line": 17, "label": "vv55_d14_port_b", "op": "equ", "arg1": "0A001h", "addr": "A001", "comment": "; Порт B D14 (мл. байт адреса ROM-диска)" }, { "line": 18, "label": "vv55_d14_port_c", "op": "equ", "arg1": "0A002h", "addr": "A002", "comment": "; Порт C D14 (ст. байт адреса ROM-диска)" }, { "line": 19, "label": "vv55_d14_ctrl", "op": "equ", "arg1": "0A003h", "addr": "A003", "comment": "; Регистр управляющего слова D14" }, { "line": 21, "comment": "; Контроллер ЭЛТ К580ВГ75" }, { "line": 22, "label": "vg75_params", "op": "equ", "arg1": "0C000h", "addr": "C000", "comment": "; Регистр параметров" }, { "line": 23, "label": "vg75_cmd_reg", "op": "equ", "arg1": "0C001h", "addr": "C001", "comment": "; Регистр команд (запись) / состояния (чтение)" }, { "line": 25, "comment": "; Контроллер ПДП К580ВТ57" }, { "line": 26, "label": "vt57_ch2_addr", "op": "equ", "arg1": "0E004h", "addr": "E004", "comment": "; Регистр адреса канала 2" }, { "line": 27, "label": "vt57_ch2_ctrl", "op": "equ", "arg1": "0E005h", "addr": "E005", "comment": "; Регистр управления канала 2" }, { "line": 28, "label": "vt57_mode", "op": "equ", "arg1": "0E008h", "addr": "E008", "comment": "; Регистр режима контроллера ПДП" }, { "line": 30, "comment": ";----------------------------------------------------------------------------" }, { "line": 31, "comment": "; Стандартные константы" }, { "line": 32, "comment": ";----------------------------------------------------------------------------" }, { "line": 33, "label": "video_mem_size", "op": "equ", "arg1": "78*30", "addr": "0924", "comment": "; Количество байт в видео ОЗУ (2340)" }, { "line": 34, "label": "rst_6_addr", "op": "equ", "arg1": "30h", "addr": "0030", "comment": "; Адрес перехода по команде RST 6" }, { "line": 35, "label": "sync_byte", "op": "equ", "arg1": "0E6h", "addr": "00E6", "comment": "; Синхробайт для чтения с магнитофона" }, { "line": 36, "label": "const_read", "op": "equ", "arg1": "2Ah", "addr": "002A", "comment": "; Стандартная константа чтения с магнитофона" }, { "line": 37, "label": "const_write", "op": "equ", "arg1": "1Dh", "addr": "001D", "comment": "; Стандартная константа записи на магнитофон" }, { "line": 38, "label": "kb_click", "op": "equ", "arg1": "5003h", "addr": "5003", "comment": "; Щелчок от нажатия клавиши (B=50h, C=03h)" }, { "line": 39, "label": "beep", "op": "equ", "arg1": "5F0h", "addr": "05F0", "comment": "; Звуковой сигнал (B=05h, C=F0h)" }, { "line": 40, "label": "first_kb_delay", "op": "equ", "arg1": "224", "addr": "00E0", "comment": "; Начальная задержка автоповтора клавиатуры" }, { "line": 41, "label": "regular_kb_delay", "op": "equ", "arg1": "64", "addr": "0040", "comment": "; Стандартная задержка автоповтора клавиатуры" }, { "line": 42, "label": "bounce", "op": "equ", "arg1": "21", "addr": "0015", "comment": "; Задержка для устранения дребезга контактов" }, { "line": 44, "comment": ";----------------------------------------------------------------------------" }, { "line": 45, "comment": "; Область переменных Монитора (для ОЗУ 32кБ)" }, { "line": 46, "comment": ";----------------------------------------------------------------------------" }, { "line": 47, "label": "monitor_area", "op": "equ", "arg1": "7600h", "addr": "7600" }, { "line": 49, "label": "memory_top", "op": "equ", "arg1": "monitor_area-1", "addr": "75FF", "comment": "; 75FFh - Верхняя граница свободной памяти" }, { "line": 50, "label": "cursor_addr", "op": "equ", "arg1": "monitor_area+0", "addr": "7600", "comment": "; 7600h - Адрес знакоместа курсора в видео ОЗУ" }, { "line": 51, "label": "cursor_xy", "op": "equ", "arg1": "monitor_area+2", "addr": "7602", "comment": "; 7602h - Координаты курсора (ст. - Y, мл. - X)" }, { "line": 52, "label": "ap2_seq", "op": "equ", "arg1": "monitor_area+4", "addr": "7604", "comment": "; 7604h - Номер байта в АР2-последовательности" }, { "line": 53, "label": "pressed_key", "op": "equ", "arg1": "monitor_area+5", "addr": "7605", "comment": "; 7605h - FF - клавиша нажата, 0 - не нажата" }, { "line": 54, "label": "ruslat_flag", "op": "equ", "arg1": "monitor_area+6", "addr": "7606", "comment": "; 7606h - Флаг РУС/ЛАТ: 0 - лат, FF - рус" }, { "line": 55, "label": "keyboard_repeat", "op": "equ", "arg1": "monitor_area+9", "addr": "7609", "comment": "; 7609h - Мл. байт - код клавиши, ст. - счетчик автоповтора" }, { "line": 56, "label": "released", "op": "equ", "arg1": "monitor_area+0Bh", "addr": "760B", "comment": "; 760Bh - Признак, что клавиша была отпущена" }, { "line": 57, "label": "temp_sp", "op": "equ", "arg1": "monitor_area+0Dh", "addr": "760D", "comment": "; 760Dh - Временное хранение указателя стека" }, { "line": 58, "label": "pc_storage", "op": "equ", "arg1": "monitor_area+14h", "addr": "7614", "comment": "; 7614h - Хранение адреса останова (PC)" }, { "line": 59, "label": "hl_storage", "op": "equ", "arg1": "monitor_area+16h", "addr": "7616", "comment": "; 7616h - Хранение HL" }, { "line": 60, "label": "bc_storage", "op": "equ", "arg1": "monitor_area+18h", "addr": "7618", "comment": "; 7618h - Хранение BC" }, { "line": 61, "label": "de_storage", "op": "equ", "arg1": "monitor_area+1Ah", "addr": "761A", "comment": "; 761Ah - Хранение DE" }, { "line": 62, "label": "sp_storage", "op": "equ", "arg1": "monitor_area+1Ch", "addr": "761C", "comment": "; 761Ch - Хранение SP" }, { "line": 63, "label": "af_storage", "op": "equ", "arg1": "monitor_area+1Eh", "addr": "761E", "comment": "; 761Eh - Хранение A и PSW" }, { "line": 64, "label": "stop_addr", "op": "equ", "arg1": "monitor_area+23h", "addr": "7623", "comment": "; 7623h - Адрес останова отлаживаемой программы" }, { "line": 65, "label": "stop_addr_value", "op": "equ", "arg1": "monitor_area+25h", "addr": "7625", "comment": "; 7625h - Байт по адресу останова (сохраненный)" }, { "line": 66, "label": "jump_to_go", "op": "equ", "arg1": "monitor_area+26h", "addr": "7626", "comment": "; 7626h - Команда JMP (0C3h) для директивы G" }, { "line": 67, "label": "cmd_parameter_1", "op": "equ", "arg1": "monitor_area+27h", "addr": "7627", "comment": "; 7627h - Первый параметр команды" }, { "line": 68, "label": "cmd_parameter_2", "op": "equ", "arg1": "monitor_area+29h", "addr": "7629", "comment": "; 7629h - Второй параметр команды" }, { "line": 69, "label": "cmd_parameter_3", "op": "equ", "arg1": "monitor_area+2Bh", "addr": "762B", "comment": "; 762Bh - Третий параметр команды" }, { "line": 70, "label": "param_2_present", "op": "equ", "arg1": "monitor_area+2Dh", "addr": "762D", "comment": "; 762Dh - Второй параметр присутствует = FF" }, { "line": 71, "label": "tape_polarity", "op": "equ", "arg1": "monitor_area+2Eh", "addr": "762E", "comment": "; 762Eh - Полярность входных данных с магнитофона" }, { "line": 72, "label": "tape_read_const", "op": "equ", "arg1": "monitor_area+2Fh", "addr": "762F", "comment": "; 762Fh - Константа чтения с магнитофона" }, { "line": 73, "label": "tape_write_const", "op": "equ", "arg1": "monitor_area+30h", "addr": "7630", "comment": "; 7630h - Константа записи на магнитофон" }, { "line": 74, "label": "memory_limit", "op": "equ", "arg1": "monitor_area+31h", "addr": "7631", "comment": "; 7631h - Верхний адрес свободной памяти" }, { "line": 75, "label": "kbd_buf", "op": "equ", "arg1": "monitor_area+33h", "addr": "7633", "comment": "; 7633h - Буфер клавиатуры (32 байта)" }, { "line": 76, "label": "monitor_area_end", "op": "equ", "arg1": "monitor_area+5Fh", "addr": "765F", "comment": "; 765Fh - Конец области переменных" }, { "line": 77, "label": "stack_bottom", "op": "equ", "arg1": "monitor_area+0CFh", "addr": "76CF", "comment": "; 76CFh - Дно стека" }, { "line": 78, "label": "video_memory", "op": "equ", "arg1": "monitor_area+0D0h", "addr": "76D0", "comment": "; 76D0h - Начало видеопамяти" }, { "line": 79, "label": "video_memory_end", "op": "equ", "arg1": "video_memory+video_mem_size", "addr": "7FF4", "comment": "; 7FF4h - Конец видеопамяти" }, { "line": 81, "comment": "; Этот адрес используется как обращение к расширению ПЗУ Монитора," }, { "line": 82, "comment": "; которое так и не было реализовано. Из-за упрощенного декодирования" }, { "line": 83, "comment": "; адресов ПЗУ в реальном Радио-86РК с ПЗУ 2кБ переход происходит" }, { "line": 84, "comment": "; на \"холодный\" старт Монитора (start)." }, { "line": 85, "comment": "; Расширять ПЗУ можно вниз, вплоть до адреса 0E000h (8кБ)" }, { "line": 86, "comment": "; без каких-либо схемотехнических изменений." }, { "line": 87, "label": "ext_f000", "op": "equ", "arg1": "0F000h", "addr": "F000" }, { "line": 89, "comment": ";============================================================================" }, { "line": 90, "op": "org", "addr": "F800", "arg1": "0F800h" }, { "line": 91, "comment": ";============================================================================" }, { "line": 93, "comment": ";----------------------------------------------------------------------------" }, { "line": 94, "comment": "; \"Холодный\" старт программы Монитор (F800h)" }, { "line": 95, "comment": ";----------------------------------------------------------------------------" }, { "line": 96, "label": "start", "addr": "F800", "comment": "; F800" }, { "line": 97, "op": "jmp", "addr": "F800", "bytes": "C3 36 F8", "chars": ".6.", "arg1": "entry_start" }, { "line": 99, "comment": ";----------------------------------------------------------------------------" }, { "line": 100, "comment": "; Таблица стандартных подпрограмм Монитора" }, { "line": 101, "comment": ";----------------------------------------------------------------------------" }, { "line": 102, "label": "getc", "op": "jmp", "addr": "F803", "bytes": "C3 63 FE", "chars": ".c.", "arg1": "entry_getc", "comment": "; F803 - ввод символа с клавиатуры" }, { "line": 103, "label": "inpb", "op": "jmp", "addr": "F806", "bytes": "C3 98 FB", "chars": "...", "arg1": "entry_inpb", "comment": "; F806 - ввод байта с магнитофона" }, { "line": 104, "label": "putc", "op": "jmp", "addr": "F809", "bytes": "C3 BA FC", "chars": "...", "arg1": "entry_putc", "comment": "; F809 - вывод символа на экран" }, { "line": 105, "label": "outb", "op": "jmp", "addr": "F80C", "bytes": "C3 46 FC", "chars": ".F.", "arg1": "entry_outb", "comment": "; F80C - вывод байта на магнитофон" }, { "line": 106, "label": "temp", "op": "jmp", "addr": "F80F", "bytes": "C3 BA FC", "chars": "...", "arg1": "entry_putc", "comment": "; F80F - резерв (дублирует putc)" }, { "line": 107, "label": "kbhit", "op": "jmp", "addr": "F812", "bytes": "C3 01 FE", "chars": "...", "arg1": "entry_kbhit", "comment": "; F812 - опрос состояния клавиатуры" }, { "line": 108, "label": "hexb", "op": "jmp", "addr": "F815", "bytes": "C3 A5 FC", "chars": "...", "arg1": "entry_hexb", "comment": "; F815 - вывод байта в hex на экран" }, { "line": 109, "label": "puts", "op": "jmp", "addr": "F818", "bytes": "C3 22 F9", "chars": ".\".", "arg1": "entry_puts", "comment": "; F818 - вывод строки на экран" }, { "line": 110, "label": "scan_kbd", "op": "jmp", "addr": "F81B", "bytes": "C3 72 FE", "chars": ".r.", "arg1": "entry_scan_kbd", "comment": "; F81B - сканирование клавиатуры" }, { "line": 111, "label": "getxy", "op": "jmp", "addr": "F81E", "bytes": "C3 7B FA", "chars": ".{.", "arg1": "entry_getxy", "comment": "; F81E - получить координаты курсора" }, { "line": 112, "label": "curc", "op": "jmp", "addr": "F821", "bytes": "C3 7F FA", "chars": "...", "arg1": "entry_curc", "comment": "; F821 - получить символ под курсором" }, { "line": 113, "label": "inpblock", "op": "jmp", "addr": "F824", "bytes": "C3 B6 FA", "chars": "...", "arg1": "entry_inpblock", "comment": "; F824 - ввод блока с магнитофона" }, { "line": 114, "label": "outblock", "op": "jmp", "addr": "F827", "bytes": "C3 49 FB", "chars": ".I.", "arg1": "entry_outblock", "comment": "; F827 - вывод блока на магнитофон" }, { "line": 115, "label": "chksum", "op": "jmp", "addr": "F82A", "bytes": "C3 16 FB", "chars": "...", "arg1": "entry_chksum", "comment": "; F82A - подсчет контрольной суммы" }, { "line": 116, "label": "video", "op": "jmp", "addr": "F82D", "bytes": "C3 CE FA", "chars": "...", "arg1": "entry_video", "comment": "; F82D - настройка видеоконтроллера" }, { "line": 117, "label": "getlim", "op": "jmp", "addr": "F830", "bytes": "C3 52 FF", "chars": ".R.", "arg1": "entry_getlim", "comment": "; F830 - получить границу памяти" }, { "line": 118, "label": "setlim", "op": "jmp", "addr": "F833", "bytes": "C3 56 FF", "chars": ".V.", "arg1": "entry_setlim", "comment": "; F833 - установить границу памяти" }, { "line": 120, "comment": ";============================================================================" }, { "line": 121, "comment": "; Инициализация компьютера (Холодный старт)" }, { "line": 122, "comment": ";============================================================================" }, { "line": 123, "label": "entry_start", "addr": "F836", "comment": "; F836" }, { "line": 124, "comment": "; Настройка ППА клавиатуры D20: порт A - вывод, порт B - ввод," }, { "line": 125, "comment": "; C0-C4 - вывод, C5-C7 - ввод" }, { "line": 126, "op": "mvi", "addr": "F836", "bytes": "3E 8A", "chars": ">.", "arg1": "a", "arg2": "8Ah" }, { "line": 127, "op": "sta", "addr": "F838", "bytes": "32 03 80", "chars": "2..", "arg1": "vv55_ctrl" }, { "line": 129, "comment": "; Настраиваем указатель стека" }, { "line": 130, "op": "lxi", "addr": "F83B", "bytes": "31 CF 76", "chars": "1.v", "arg1": "sp", "arg2": "stack_bottom" }, { "line": 132, "comment": "; Настраиваем отображение видеопамяти на экране." }, { "line": 133, "comment": "; Это нужно делать в первую очередь, чтобы начать регенерацию ОЗУ" }, { "line": 134, "comment": "; после сброса." }, { "line": 135, "op": "call", "addr": "F83E", "bytes": "CD CE FA", "chars": "...", "arg1": "entry_video" }, { "line": 137, "comment": "; Обнуляем массив служебных ячеек Монитора" }, { "line": 138, "op": "lxi", "addr": "F841", "bytes": "21 00 76", "chars": "!.v", "arg1": "h", "arg2": "monitor_area" }, { "line": 139, "op": "lxi", "addr": "F844", "bytes": "11 5F 76", "chars": "._v", "arg1": "d", "arg2": "monitor_area_end" }, { "line": 140, "op": "mvi", "addr": "F847", "bytes": "0E 00", "chars": "..", "arg1": "c", "arg2": "0" }, { "line": 141, "op": "call", "addr": "F849", "bytes": "CD ED F9", "chars": "...", "arg1": "cmd_f", "comment": "; заполнить 'c' от hl до de" }, { "line": 143, "op": "lxi", "addr": "F84C", "bytes": "21 CF 76", "chars": "!.v", "arg1": "h", "arg2": "stack_bottom" }, { "line": 144, "op": "shld", "addr": "F84F", "bytes": "22 1C 76", "chars": "\".v", "arg1": "sp_storage" }, { "line": 146, "comment": "; Выводим на экран начальное сообщение \"РАДИО-86РК\"" }, { "line": 147, "op": "lxi", "addr": "F852", "bytes": "21 5A FF", "chars": "!Z.", "arg1": "h", "arg2": "radio_prompt" }, { "line": 148, "op": "call", "addr": "F855", "bytes": "CD 22 F9", "chars": ".\".", "arg1": "entry_puts" }, { "line": 150, "comment": "; Повторно настраиваем видеоконтроллер" }, { "line": 151, "op": "call", "addr": "F858", "bytes": "CD CE FA", "chars": "...", "arg1": "entry_video" }, { "line": 153, "comment": "; Устанавливаем верхнюю границу свободной памяти" }, { "line": 154, "op": "lxi", "addr": "F85B", "bytes": "21 FF 75", "chars": "!.u", "arg1": "h", "arg2": "memory_top" }, { "line": 155, "op": "shld", "addr": "F85E", "bytes": "22 31 76", "chars": "\"1v", "arg1": "memory_limit" }, { "line": 157, "comment": "; Устанавливаем константы по умолчанию для чтения и записи на магнитофон" }, { "line": 158, "comment": "; (L=2Ah - чтение, H=1Dh - запись, SHLD сохраняет L первым)" }, { "line": 159, "op": "lxi", "addr": "F861", "bytes": "21 2A 1D", "chars": "!*.", "arg1": "h", "arg2": "const_write * 256 + const_read" }, { "line": 160, "op": "shld", "addr": "F864", "bytes": "22 2F 76", "chars": "\"/v", "arg1": "tape_read_const" }, { "line": 162, "comment": "; Установка кода команды JMP для директивы G" }, { "line": 163, "op": "mvi", "addr": "F867", "bytes": "3E C3", "chars": ">.", "arg1": "a", "arg2": "0C3h" }, { "line": 164, "op": "sta", "addr": "F869", "bytes": "32 26 76", "chars": "2&v", "arg1": "jump_to_go" }, { "line": 166, "comment": ";============================================================================" }, { "line": 167, "comment": "; Выход на промт (Горячий старт)" }, { "line": 168, "comment": ";============================================================================" }, { "line": 169, "label": "prompt_loop", "addr": "F86C", "comment": "; F86C" }, { "line": 170, "op": "lxi", "addr": "F86C", "bytes": "31 CF 76", "chars": "1.v", "arg1": "sp", "arg2": "stack_bottom" }, { "line": 172, "op": "lxi", "addr": "F86F", "bytes": "21 66 FF", "chars": "!f.", "arg1": "h", "arg2": "prompt" }, { "line": 173, "op": "call", "addr": "F872", "bytes": "CD 22 F9", "chars": ".\".", "arg1": "entry_puts" }, { "line": 175, "comment": "; После выхода из entry_puts в A всегда 0" }, { "line": 176, "op": "sta", "addr": "F875", "bytes": "32 02 80", "chars": "2..", "arg1": "vv55_port_c", "comment": "; Все 0 в порт C клавиатуры" }, { "line": 177, "op": "dcr", "addr": "F878", "bytes": "3D", "chars": "=", "arg1": "a", "comment": "; A = FFh" }, { "line": 178, "op": "sta", "addr": "F879", "bytes": "32 02 A0", "chars": "2..", "arg1": "vv55_d14_port_c", "comment": "; Все 1 в порт C дополнительного ППА" }, { "line": 180, "comment": ";============================================================================" }, { "line": 181, "comment": "; Консольный процессор Монитора - ввод и выполнение команд" }, { "line": 182, "comment": ";============================================================================" }, { "line": 183, "op": "call", "addr": "F87C", "bytes": "CD EE F8", "chars": "...", "arg1": "input_string" }, { "line": 184, "op": "lxi", "addr": "F87F", "bytes": "21 6C F8", "chars": "!l.", "arg1": "h", "arg2": "prompt_loop" }, { "line": 185, "op": "push", "addr": "F882", "bytes": "E5", "chars": ".", "arg1": "h", "comment": "; Адрес возврата в стеке" }, { "line": 186, "op": "lxi", "addr": "F883", "bytes": "21 33 76", "chars": "!3v", "arg1": "h", "arg2": "kbd_buf" }, { "line": 187, "op": "mov", "addr": "F886", "bytes": "7E", "chars": "~", "arg1": "a", "arg2": "m", "comment": "; Первый символ команды" }, { "line": 189, "comment": "; Команды без параметров" }, { "line": 190, "op": "cpi", "addr": "F887", "bytes": "FE 58", "chars": ".X", "arg1": "'X'", "comment": "; Просмотр/изменение регистров" }, { "line": 191, "op": "jz", "addr": "F889", "bytes": "CA D3 FF", "chars": "...", "arg1": "print_regs" }, { "line": 192, "op": "cpi", "addr": "F88C", "bytes": "FE 55", "chars": ".U", "arg1": "'U'", "comment": "; Резервная команда -> расширение ПЗУ" }, { "line": 193, "op": "jz", "addr": "F88E", "bytes": "CA 00 F0", "chars": "...", "arg1": "ext_f000" }, { "line": 195, "comment": "; Получаем 3 параметра команды: 1 -> HL, 2 -> DE, 3 -> BC" }, { "line": 196, "op": "push", "addr": "F891", "bytes": "F5", "chars": ".", "arg1": "psw" }, { "line": 197, "op": "call", "addr": "F892", "bytes": "CD 2C F9", "chars": ".,.", "arg1": "parse_param" }, { "line": 198, "op": "lhld", "addr": "F895", "bytes": "2A 2B 76", "chars": "*+v", "arg1": "cmd_parameter_3" }, { "line": 199, "op": "mov", "addr": "F898", "bytes": "4D", "chars": "M", "arg1": "c", "arg2": "l" }, { "line": 200, "op": "mov", "addr": "F899", "bytes": "44", "chars": "D", "arg1": "b", "arg2": "h" }, { "line": 201, "op": "lhld", "addr": "F89A", "bytes": "2A 29 76", "chars": "*)v", "arg1": "cmd_parameter_2" }, { "line": 202, "op": "xchg", "addr": "F89D", "bytes": "EB", "chars": "." }, { "line": 203, "op": "lhld", "addr": "F89E", "bytes": "2A 27 76", "chars": "*'v", "arg1": "cmd_parameter_1" }, { "line": 204, "op": "pop", "addr": "F8A1", "bytes": "F1", "chars": ".", "arg1": "psw" }, { "line": 206, "comment": "; Команды с параметрами" }, { "line": 207, "op": "cpi", "addr": "F8A2", "bytes": "FE 44", "chars": ".D", "arg1": "'D'", "comment": "; dump - дамп памяти" }, { "line": 208, "op": "jz", "addr": "F8A4", "bytes": "CA C5 F9", "chars": "...", "arg1": "cmd_d" }, { "line": 209, "op": "cpi", "addr": "F8A7", "bytes": "FE 43", "chars": ".C", "arg1": "'C'", "comment": "; compare - сравнение областей памяти" }, { "line": 210, "op": "jz", "addr": "F8A9", "bytes": "CA D7 F9", "chars": "...", "arg1": "cmd_c" }, { "line": 211, "op": "cpi", "addr": "F8AC", "bytes": "FE 46", "chars": ".F", "arg1": "'F'", "comment": "; fill - заполнение области памяти" }, { "line": 212, "op": "jz", "addr": "F8AE", "bytes": "CA ED F9", "chars": "...", "arg1": "cmd_f" }, { "line": 213, "op": "cpi", "addr": "F8B1", "bytes": "FE 53", "chars": ".S", "arg1": "'S'", "comment": "; search - поиск байта в памяти" }, { "line": 214, "op": "jz", "addr": "F8B3", "bytes": "CA F4 F9", "chars": "...", "arg1": "cmd_s" }, { "line": 215, "op": "cpi", "addr": "F8B6", "bytes": "FE 54", "chars": ".T", "arg1": "'T'", "comment": "; transfer - пересылка области памяти" }, { "line": 216, "op": "jz", "addr": "F8B8", "bytes": "CA FF F9", "chars": "...", "arg1": "cmd_t" }, { "line": 217, "op": "cpi", "addr": "F8BB", "bytes": "FE 4D", "chars": ".M", "arg1": "'M'", "comment": "; modify - изменение содержимого памяти" }, { "line": 218, "op": "jz", "addr": "F8BD", "bytes": "CA 26 FA", "chars": ".&.", "arg1": "cmd_m" }, { "line": 219, "op": "cpi", "addr": "F8C0", "bytes": "FE 47", "chars": ".G", "arg1": "'G'", "comment": "; go - запуск программы" }, { "line": 220, "op": "jz", "addr": "F8C2", "bytes": "CA 3F FA", "chars": ".?.", "arg1": "cmd_g" }, { "line": 221, "op": "cpi", "addr": "F8C5", "bytes": "FE 49", "chars": ".I", "arg1": "'I'", "comment": "; input - загрузка с магнитофона" }, { "line": 222, "op": "jz", "addr": "F8C7", "bytes": "CA 86 FA", "chars": "...", "arg1": "cmd_i" }, { "line": 223, "op": "cpi", "addr": "F8CA", "bytes": "FE 4F", "chars": ".O", "arg1": "'O'", "comment": "; output - запись на магнитофон" }, { "line": 224, "op": "jz", "addr": "F8CC", "bytes": "CA 2D FB", "chars": ".-.", "arg1": "cmd_o" }, { "line": 225, "op": "cpi", "addr": "F8CF", "bytes": "FE 4C", "chars": ".L", "arg1": "'L'", "comment": "; literal - дамп в символьном виде" }, { "line": 226, "op": "jz", "addr": "F8D1", "bytes": "CA 08 FA", "chars": "...", "arg1": "cmd_l" }, { "line": 227, "op": "cpi", "addr": "F8D4", "bytes": "FE 52", "chars": ".R", "arg1": "'R'", "comment": "; read - загрузка из ROM-диска" }, { "line": 228, "op": "jz", "addr": "F8D6", "bytes": "CA 68 FA", "chars": ".h.", "arg1": "cmd_r" }, { "line": 230, "comment": "; Нераспознанная команда -> переход на расширение ПЗУ" }, { "line": 231, "op": "jmp", "addr": "F8D9", "bytes": "C3 00 F0", "chars": "...", "arg1": "ext_f000" }, { "line": 233, "comment": ";----------------------------------------------------------------------------" }, { "line": 234, "comment": "; Удаление предыдущего символа в буфере ввода" }, { "line": 235, "comment": ";----------------------------------------------------------------------------" }, { "line": 236, "label": "back_kbd_buf", "addr": "F8DC", "comment": "; F8DC" }, { "line": 237, "op": "mvi", "addr": "F8DC", "bytes": "3E 33", "chars": ">3", "arg1": "a", "arg2": "kbd_buf & 0FFh" }, { "line": 238, "op": "cmp", "addr": "F8DE", "bytes": "BD", "chars": ".", "arg1": "l", "comment": "; Если это первый символ," }, { "line": 239, "op": "jz", "addr": "F8DF", "bytes": "CA F1 F8", "chars": "...", "arg1": "input_next", "comment": "; то ничего не делать" }, { "line": 240, "op": "push", "addr": "F8E2", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 241, "op": "lxi", "addr": "F8E3", "bytes": "21 9E FF", "chars": "!..", "arg1": "h", "arg2": "back_clear", "comment": "; Затереть предыдущий символ на экране" }, { "line": 242, "op": "call", "addr": "F8E6", "bytes": "CD 22 F9", "chars": ".\".", "arg1": "entry_puts" }, { "line": 243, "op": "pop", "addr": "F8E9", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 244, "op": "dcx", "addr": "F8EA", "bytes": "2B", "chars": "+", "arg1": "h" }, { "line": 245, "op": "jmp", "addr": "F8EB", "bytes": "C3 F3 F8", "chars": "...", "arg1": "kbd_buf_loop" }, { "line": 247, "comment": ";----------------------------------------------------------------------------" }, { "line": 248, "comment": "; Ввод строки с клавиатуры." }, { "line": 249, "comment": "; Вводим максимум 31 символ в буфер клавиатуры." }, { "line": 250, "comment": "; Особо обрабатываемые клавиши:" }, { "line": 251, "comment": "; [<-] и [ЗБ] - удаление последнего символа" }, { "line": 252, "comment": "; [.] - выход на промт" }, { "line": 253, "comment": "; [ВК] - успешный возврат из п/п" }, { "line": 254, "comment": ";----------------------------------------------------------------------------" }, { "line": 255, "label": "input_string", "addr": "F8EE", "comment": "; F8EE" }, { "line": 256, "op": "lxi", "addr": "F8EE", "bytes": "21 33 76", "chars": "!3v", "arg1": "h", "arg2": "kbd_buf" }, { "line": 258, "label": "input_next", "addr": "F8F1", "comment": "; F8F1" }, { "line": 259, "op": "mvi", "addr": "F8F1", "bytes": "06 00", "chars": "..", "arg1": "b", "arg2": "0", "comment": "; Признак: ничего не введено" }, { "line": 261, "label": "kbd_buf_loop", "addr": "F8F3", "comment": "; F8F3" }, { "line": 262, "op": "call", "addr": "F8F3", "bytes": "CD 63 FE", "chars": ".c.", "arg1": "entry_getc" }, { "line": 264, "op": "cpi", "addr": "F8F6", "bytes": "FE 08", "chars": "..", "arg1": "8", "comment": "; Клавиша [<-]?" }, { "line": 265, "op": "jz", "addr": "F8F8", "bytes": "CA DC F8", "chars": "...", "arg1": "back_kbd_buf" }, { "line": 266, "op": "cpi", "addr": "F8FB", "bytes": "FE 7F", "chars": "..", "arg1": "7Fh", "comment": "; Клавиша [ЗБ]?" }, { "line": 267, "op": "jz", "addr": "F8FD", "bytes": "CA DC F8", "chars": "...", "arg1": "back_kbd_buf" }, { "line": 268, "op": "cnz", "addr": "F900", "bytes": "C4 B9 FC", "chars": "...", "arg1": "putc_from_a", "comment": "; Вывести символ на экран" }, { "line": 269, "op": "mov", "addr": "F903", "bytes": "77", "chars": "w", "arg1": "m", "arg2": "a", "comment": "; Сохранить в буфере" }, { "line": 270, "op": "cpi", "addr": "F904", "bytes": "FE 0D", "chars": "..", "arg1": "0Dh", "comment": "; Клавиша [ВК]?" }, { "line": 271, "op": "jz", "addr": "F906", "bytes": "CA 1A F9", "chars": "...", "arg1": "input_string_end" }, { "line": 272, "op": "cpi", "addr": "F909", "bytes": "FE 2E", "chars": "..", "arg1": "'.'", "comment": "; Точка -> выход на промт" }, { "line": 273, "op": "jz", "addr": "F90B", "bytes": "CA 6C F8", "chars": ".l.", "arg1": "prompt_loop" }, { "line": 274, "op": "mvi", "addr": "F90E", "bytes": "06 FF", "chars": "..", "arg1": "b", "arg2": "0FFh", "comment": "; Признак: что-то введено" }, { "line": 275, "op": "mvi", "addr": "F910", "bytes": "3E 52", "chars": ">R", "arg1": "a", "arg2": "(kbd_buf+1Fh) & 0FFh" }, { "line": 276, "op": "cmp", "addr": "F912", "bytes": "BD", "chars": ".", "arg1": "l", "comment": "; Буфер полон?" }, { "line": 277, "op": "jz", "addr": "F913", "bytes": "CA AE FA", "chars": "...", "arg1": "print_error", "comment": "; Если полон, то ошибка (?)" }, { "line": 278, "op": "inx", "addr": "F916", "bytes": "23", "chars": "#", "arg1": "h" }, { "line": 279, "op": "jmp", "addr": "F917", "bytes": "C3 F3 F8", "chars": "...", "arg1": "kbd_buf_loop" }, { "line": 281, "label": "input_string_end", "addr": "F91A", "comment": "; F91A" }, { "line": 282, "op": "mov", "addr": "F91A", "bytes": "78", "chars": "x", "arg1": "a", "arg2": "b", "comment": "; Флаг: CF=1 если что-то введено" }, { "line": 283, "op": "ral", "addr": "F91B", "bytes": "17", "chars": "." }, { "line": 284, "op": "lxi", "addr": "F91C", "bytes": "11 33 76", "chars": ".3v", "arg1": "d", "arg2": "kbd_buf" }, { "line": 285, "op": "mvi", "addr": "F91F", "bytes": "06 00", "chars": "..", "arg1": "b", "arg2": "0" }, { "line": 286, "op": "ret", "addr": "F921", "bytes": "C9", "chars": "." }, { "line": 288, "comment": ";----------------------------------------------------------------------------" }, { "line": 289, "comment": "; Вывод строки на экран." }, { "line": 290, "comment": "; Указатель на начало строки в HL. Строка завершается нулевым байтом." }, { "line": 291, "comment": ";----------------------------------------------------------------------------" }, { "line": 292, "label": "entry_puts", "addr": "F922", "comment": "; F922" }, { "line": 293, "op": "mov", "addr": "F922", "bytes": "7E", "chars": "~", "arg1": "a", "arg2": "m" }, { "line": 294, "op": "ana", "addr": "F923", "bytes": "A7", "chars": ".", "arg1": "a", "comment": "; Нулевой байт?" }, { "line": 295, "op": "rz", "addr": "F924", "bytes": "C8", "chars": ".", "comment": "; Если да, то выход" }, { "line": 296, "op": "call", "addr": "F925", "bytes": "CD B9 FC", "chars": "...", "arg1": "putc_from_a" }, { "line": 297, "op": "inx", "addr": "F928", "bytes": "23", "chars": "#", "arg1": "h" }, { "line": 298, "op": "jmp", "addr": "F929", "bytes": "C3 22 F9", "chars": ".\".", "arg1": "entry_puts" }, { "line": 300, "comment": ";----------------------------------------------------------------------------" }, { "line": 301, "comment": "; Анализ параметров команд Монитора." }, { "line": 302, "comment": "; Разбирает до 3 параметров, разделенных запятыми." }, { "line": 303, "comment": ";----------------------------------------------------------------------------" }, { "line": 304, "label": "parse_param", "addr": "F92C", "comment": "; F92C" }, { "line": 305, "op": "lxi", "addr": "F92C", "bytes": "21 27 76", "chars": "!'v", "arg1": "h", "arg2": "cmd_parameter_1", "comment": "; Обнуляем область параметров" }, { "line": 306, "op": "lxi", "addr": "F92F", "bytes": "11 2D 76", "chars": ".-v", "arg1": "d", "arg2": "cmd_parameter_1+2*3" }, { "line": 307, "op": "mvi", "addr": "F932", "bytes": "0E 00", "chars": "..", "arg1": "c", "arg2": "0" }, { "line": 308, "op": "call", "addr": "F934", "bytes": "CD ED F9", "chars": "...", "arg1": "cmd_f" }, { "line": 309, "op": "lxi", "addr": "F937", "bytes": "11 34 76", "chars": ".4v", "arg1": "d", "arg2": "kbd_buf+1", "comment": "; Указатель на второй символ" }, { "line": 310, "op": "call", "addr": "F93A", "bytes": "CD 5A F9", "chars": ".Z.", "arg1": "parse_hex", "comment": "; Получаем первый параметр" }, { "line": 311, "op": "shld", "addr": "F93D", "bytes": "22 27 76", "chars": "\"'v", "arg1": "cmd_parameter_1" }, { "line": 312, "op": "shld", "addr": "F940", "bytes": "22 29 76", "chars": "\")v", "arg1": "cmd_parameter_2", "comment": "; По умолчанию = первому" }, { "line": 313, "op": "rc", "addr": "F943", "bytes": "D8", "chars": ".", "comment": "; Если больше ничего, выходим" }, { "line": 315, "comment": "; Признак наличия второго параметра (так как он может быть равен 0)" }, { "line": 316, "comment": "; Здесь вводится признак наличия второго параметра." }, { "line": 317, "comment": "; Поскольку невведенные параметры у нас = 0, то признак указывает," }, { "line": 318, "comment": "; что второй параметр введен и возможно равен нулю" }, { "line": 319, "op": "mvi", "addr": "F944", "bytes": "3E FF", "chars": ">.", "arg1": "a", "arg2": "0FFh" }, { "line": 320, "op": "sta", "addr": "F946", "bytes": "32 2D 76", "chars": "2-v", "arg1": "param_2_present" }, { "line": 321, "op": "call", "addr": "F949", "bytes": "CD 5A F9", "chars": ".Z.", "arg1": "parse_hex" }, { "line": 322, "op": "shld", "addr": "F94C", "bytes": "22 29 76", "chars": "\")v", "arg1": "cmd_parameter_2" }, { "line": 323, "op": "rc", "addr": "F94F", "bytes": "D8", "chars": "." }, { "line": 325, "op": "call", "addr": "F950", "bytes": "CD 5A F9", "chars": ".Z.", "arg1": "parse_hex" }, { "line": 326, "op": "shld", "addr": "F953", "bytes": "22 2B 76", "chars": "\"+v", "arg1": "cmd_parameter_3" }, { "line": 327, "op": "rc", "addr": "F956", "bytes": "D8", "chars": "." }, { "line": 329, "op": "jmp", "addr": "F957", "bytes": "C3 AE FA", "chars": "...", "arg1": "print_error", "comment": "; Лишние параметры -> ошибка" }, { "line": 331, "comment": ";----------------------------------------------------------------------------" }, { "line": 332, "comment": "; Обработка строки с hex-числом (параметром), на которую указывает DE." }, { "line": 333, "comment": "; Результат в HL. CF=1 если параметра не было (встретился ВК)." }, { "line": 334, "comment": ";----------------------------------------------------------------------------" }, { "line": 335, "label": "parse_hex", "addr": "F95A", "comment": "; F95A" }, { "line": 336, "op": "lxi", "addr": "F95A", "bytes": "21 00 00", "chars": "!..", "arg1": "h", "arg2": "0" }, { "line": 338, "label": "parse_hex_loop", "addr": "F95D", "comment": "; F95D" }, { "line": 339, "op": "ldax", "addr": "F95D", "bytes": "1A", "chars": ".", "arg1": "d" }, { "line": 340, "op": "inx", "addr": "F95E", "bytes": "13", "chars": ".", "arg1": "d" }, { "line": 341, "op": "cpi", "addr": "F95F", "bytes": "FE 0D", "chars": "..", "arg1": "0Dh", "comment": "; [ВК] - конец строки" }, { "line": 342, "op": "jz", "addr": "F961", "bytes": "CA 8E F9", "chars": "...", "arg1": "parse_hex_end" }, { "line": 343, "op": "cpi", "addr": "F964", "bytes": "FE 2C", "chars": ".,", "arg1": "','", "comment": "; Запятая - разделитель параметров" }, { "line": 344, "op": "rz", "addr": "F966", "bytes": "C8", "chars": "." }, { "line": 345, "op": "cpi", "addr": "F967", "bytes": "FE 20", "chars": ". ", "arg1": "' '", "comment": "; Пробелы игнорируются" }, { "line": 346, "op": "jz", "addr": "F969", "bytes": "CA 5D F9", "chars": ".].", "arg1": "parse_hex_loop" }, { "line": 347, "op": "sui", "addr": "F96C", "bytes": "D6 30", "chars": ".0", "arg1": "'0'", "comment": "; Получаем цифру из кода символа" }, { "line": 348, "op": "jm", "addr": "F96E", "bytes": "FA AE FA", "chars": "...", "arg1": "print_error", "comment": "; Код < 30h -> ошибка" }, { "line": 349, "op": "cpi", "addr": "F971", "bytes": "FE 0A", "chars": "..", "arg1": "0Ah", "comment": "; Цифра 0-9?" }, { "line": 350, "op": "jm", "addr": "F973", "bytes": "FA 82 F9", "chars": "...", "arg1": "parse_hex_char" }, { "line": 351, "op": "cpi", "addr": "F976", "bytes": "FE 11", "chars": "..", "arg1": "11h", "comment": "; Код < 41h (A) -> ошибка" }, { "line": 352, "op": "jm", "addr": "F978", "bytes": "FA AE FA", "chars": "...", "arg1": "print_error" }, { "line": 353, "op": "cpi", "addr": "F97B", "bytes": "FE 17", "chars": "..", "arg1": "17h", "comment": "; Код > 46h (F) -> ошибка" }, { "line": 354, "op": "jp", "addr": "F97D", "bytes": "F2 AE FA", "chars": "...", "arg1": "print_error" }, { "line": 355, "op": "sui", "addr": "F980", "bytes": "D6 07", "chars": "..", "arg1": "7", "comment": "; Корректировка для цифр A-F" }, { "line": 357, "comment": "; Добавляем очередную hex-цифру в число" }, { "line": 358, "label": "parse_hex_char", "addr": "F982", "comment": "; F982" }, { "line": 359, "op": "mov", "addr": "F982", "bytes": "4F", "chars": "O", "arg1": "c", "arg2": "a" }, { "line": 360, "op": "dad", "addr": "F983", "bytes": "29", "chars": ")", "arg1": "h", "comment": "; Число * 16" }, { "line": 361, "op": "dad", "addr": "F984", "bytes": "29", "chars": ")", "arg1": "h" }, { "line": 362, "op": "dad", "addr": "F985", "bytes": "29", "chars": ")", "arg1": "h" }, { "line": 363, "op": "dad", "addr": "F986", "bytes": "29", "chars": ")", "arg1": "h" }, { "line": 364, "op": "jc", "addr": "F987", "bytes": "DA AE FA", "chars": "...", "arg1": "print_error", "comment": "; Переполнение -> ошибка" }, { "line": 365, "op": "dad", "addr": "F98A", "bytes": "09", "chars": ".", "arg1": "b", "comment": "; Прибавляем очередную цифру" }, { "line": 366, "op": "jmp", "addr": "F98B", "bytes": "C3 5D F9", "chars": ".].", "arg1": "parse_hex_loop" }, { "line": 368, "comment": "; Выход с признаком CF=1 (параметра не было)" }, { "line": 369, "label": "parse_hex_end", "addr": "F98E", "comment": "; F98E" }, { "line": 370, "op": "stc", "addr": "F98E", "bytes": "37", "chars": "7" }, { "line": 371, "op": "ret", "addr": "F98F", "bytes": "C9", "chars": "." }, { "line": 373, "comment": ";----------------------------------------------------------------------------" }, { "line": 374, "comment": "; Сравнение регистровых пар HL и DE." }, { "line": 375, "comment": "; Если равны, устанавливается флаг Z." }, { "line": 376, "comment": ";----------------------------------------------------------------------------" }, { "line": 377, "label": "cmp_hl_de", "addr": "F990", "comment": "; F990" }, { "line": 378, "op": "mov", "addr": "F990", "bytes": "7C", "chars": "|", "arg1": "a", "arg2": "h" }, { "line": 379, "op": "cmp", "addr": "F991", "bytes": "BA", "chars": ".", "arg1": "d" }, { "line": 380, "op": "rnz", "addr": "F992", "bytes": "C0", "chars": "." }, { "line": 381, "op": "mov", "addr": "F993", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l" }, { "line": 382, "op": "cmp", "addr": "F994", "bytes": "BB", "chars": ".", "arg1": "e" }, { "line": 383, "op": "ret", "addr": "F995", "bytes": "C9", "chars": "." }, { "line": 385, "comment": ";----------------------------------------------------------------------------" }, { "line": 386, "comment": "; Проверка на окончание адреса + сканирование на нажатие [F4]." }, { "line": 387, "comment": ";----------------------------------------------------------------------------" }, { "line": 388, "label": "end_of_addr_or_f4", "addr": "F996", "comment": "; F996" }, { "line": 389, "op": "call", "addr": "F996", "bytes": "CD A4 F9", "chars": "...", "arg1": "check_press_f4" }, { "line": 391, "comment": ";----------------------------------------------------------------------------" }, { "line": 392, "comment": "; Инкремент текущего адреса с проверкой на конец." }, { "line": 393, "comment": "; Сравнивает HL с DE. Если равны - удаляет адрес возврата и выходит" }, { "line": 394, "comment": "; к предыдущему вызывающему. Если не равны - инкремент HL." }, { "line": 395, "comment": ";----------------------------------------------------------------------------" }, { "line": 396, "label": "cmp_hl_de_loop", "addr": "F999", "comment": "; F999" }, { "line": 397, "op": "call", "addr": "F999", "bytes": "CD 90 F9", "chars": "...", "arg1": "cmp_hl_de" }, { "line": 398, "op": "jnz", "addr": "F99C", "bytes": "C2 A2 F9", "chars": "...", "arg1": "cmp_hl_de_end" }, { "line": 400, "label": "cmp_hl_de_ret", "addr": "F99F", "comment": "; F99F" }, { "line": 401, "op": "inx", "addr": "F99F", "bytes": "33", "chars": "3", "arg1": "sp", "comment": "; Удаляем текущий адрес возврата" }, { "line": 402, "op": "inx", "addr": "F9A0", "bytes": "33", "chars": "3", "arg1": "sp" }, { "line": 403, "op": "ret", "addr": "F9A1", "bytes": "C9", "chars": "." }, { "line": 405, "label": "cmp_hl_de_end", "addr": "F9A2", "comment": "; F9A2" }, { "line": 406, "op": "inx", "addr": "F9A2", "bytes": "23", "chars": "#", "arg1": "h" }, { "line": 407, "op": "ret", "addr": "F9A3", "bytes": "C9", "chars": "." }, { "line": 409, "comment": ";----------------------------------------------------------------------------" }, { "line": 410, "comment": "; Проверка на нажатие клавиши [F4] (код 3) для прерывания команды." }, { "line": 411, "comment": "; Клавиша [РУС/ЛАТ] приостанавливает вывод на экран (удержание)." }, { "line": 412, "comment": "; [F4] -> выход на промт со знаком вопроса." }, { "line": 413, "comment": "; Подпрограмма применяется для выхода из затянувшейся по времени команды." }, { "line": 414, "comment": "; Так же можно использовать для приостановки вывода на экран удержание" }, { "line": 415, "comment": "; клавиши [РУС/ЛАТ], поскольку она срабатывает при отпускании." }, { "line": 416, "comment": "; Если клавиша [F4] не нажата, происходит просто выход из подпрограммы." }, { "line": 417, "comment": "; Если нажата, то выход на промт с выдачей знака вопроса." }, { "line": 418, "comment": ";----------------------------------------------------------------------------" }, { "line": 419, "label": "check_press_f4", "addr": "F9A4", "comment": "; F9A4" }, { "line": 420, "op": "call", "addr": "F9A4", "bytes": "CD 72 FE", "chars": ".r.", "arg1": "entry_scan_kbd" }, { "line": 421, "op": "cpi", "addr": "F9A7", "bytes": "FE 03", "chars": "..", "arg1": "3", "comment": "; Код клавиши [F4]" }, { "line": 422, "op": "rnz", "addr": "F9A9", "bytes": "C0", "chars": "." }, { "line": 423, "op": "call", "addr": "F9AA", "bytes": "CD CE FA", "chars": "...", "arg1": "entry_video", "comment": "; Восстанавливаем видео" }, { "line": 424, "op": "jmp", "addr": "F9AD", "bytes": "C3 AE FA", "chars": "...", "arg1": "print_error" }, { "line": 426, "comment": ";----------------------------------------------------------------------------" }, { "line": 427, "comment": "; Переход на новую строку с отступом в 4 символа для вывода адреса." }, { "line": 428, "comment": ";----------------------------------------------------------------------------" }, { "line": 429, "label": "print_next_line_prefix", "addr": "F9B0", "comment": "; F9B0" }, { "line": 430, "op": "push", "addr": "F9B0", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 431, "op": "lxi", "addr": "F9B1", "bytes": "21 6C FF", "chars": "!l.", "arg1": "h", "arg2": "next_line_prefix" }, { "line": 432, "op": "call", "addr": "F9B4", "bytes": "CD 22 F9", "chars": ".\".", "arg1": "entry_puts" }, { "line": 433, "op": "pop", "addr": "F9B7", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 434, "op": "ret", "addr": "F9B8", "bytes": "C9", "chars": "." }, { "line": 436, "comment": ";----------------------------------------------------------------------------" }, { "line": 437, "comment": "; Вывод байта [HL] на экран в hex + пробел" }, { "line": 438, "comment": ";----------------------------------------------------------------------------" }, { "line": 439, "label": "print_hex_mem_and_space", "addr": "F9B9", "comment": "; F9B9" }, { "line": 440, "op": "mov", "addr": "F9B9", "bytes": "7E", "chars": "~", "arg1": "a", "arg2": "m" }, { "line": 442, "comment": "; Вывод байта из A на экран в hex + пробел" }, { "line": 443, "label": "print_hex_byte_and_space", "addr": "F9BA", "comment": "; F9BA" }, { "line": 444, "op": "push", "addr": "F9BA", "bytes": "C5", "chars": ".", "arg1": "b" }, { "line": 445, "op": "call", "addr": "F9BB", "bytes": "CD A5 FC", "chars": "...", "arg1": "entry_hexb" }, { "line": 446, "op": "mvi", "addr": "F9BE", "bytes": "3E 20", "chars": "> ", "arg1": "a", "arg2": "' '" }, { "line": 447, "op": "call", "addr": "F9C0", "bytes": "CD B9 FC", "chars": "...", "arg1": "putc_from_a" }, { "line": 448, "op": "pop", "addr": "F9C3", "bytes": "C1", "chars": ".", "arg1": "b" }, { "line": 449, "op": "ret", "addr": "F9C4", "bytes": "C9", "chars": "." }, { "line": 451, "comment": ";============================================================================" }, { "line": 452, "comment": "; Команда D (Dump). Вывод дампа памяти в hex." }, { "line": 453, "comment": "; По 16 байт в строке. В начале строки - адрес первой ячейки." }, { "line": 454, "comment": "; Адрес строки округляется до 0 в младшей hex-цифре." }, { "line": 455, "comment": ";============================================================================" }, { "line": 456, "label": "cmd_d", "addr": "F9C5", "comment": "; F9C5" }, { "line": 457, "op": "call", "addr": "F9C5", "bytes": "CD 78 FB", "chars": ".x.", "arg1": "print_addr_from_hl" }, { "line": 459, "label": "cmd_d_loop", "addr": "F9C8", "comment": "; F9C8" }, { "line": 460, "op": "call", "addr": "F9C8", "bytes": "CD B9 F9", "chars": "...", "arg1": "print_hex_mem_and_space" }, { "line": 461, "op": "call", "addr": "F9CB", "bytes": "CD 96 F9", "chars": "...", "arg1": "end_of_addr_or_f4" }, { "line": 462, "op": "mov", "addr": "F9CE", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l" }, { "line": 463, "op": "ani", "addr": "F9CF", "bytes": "E6 0F", "chars": "..", "arg1": "0Fh", "comment": "; Граница 16 байт?" }, { "line": 464, "op": "jz", "addr": "F9D1", "bytes": "CA C5 F9", "chars": "...", "arg1": "cmd_d", "comment": "; Да -> новая строка с адресом" }, { "line": 465, "op": "jmp", "addr": "F9D4", "bytes": "C3 C8 F9", "chars": "...", "arg1": "cmd_d_loop" }, { "line": 467, "comment": ";============================================================================" }, { "line": 468, "comment": "; Команда C (Compare). Сравнение двух областей памяти." }, { "line": 469, "comment": "; Сравнивает [HL] с [BC], выводит только различающиеся байты." }, { "line": 470, "comment": "; В строке: адрес, значение из первой области, значение из второй." }, { "line": 471, "comment": ";============================================================================" }, { "line": 472, "label": "cmd_c", "addr": "F9D7", "comment": "; F9D7" }, { "line": 473, "op": "ldax", "addr": "F9D7", "bytes": "0A", "chars": ".", "arg1": "b" }, { "line": 474, "op": "cmp", "addr": "F9D8", "bytes": "BE", "chars": ".", "arg1": "m" }, { "line": 475, "op": "jz", "addr": "F9D9", "bytes": "CA E6 F9", "chars": "...", "arg1": "cmd_c_equal", "comment": "; Байты равны - пропускаем" }, { "line": 476, "op": "call", "addr": "F9DC", "bytes": "CD 78 FB", "chars": ".x.", "arg1": "print_addr_from_hl" }, { "line": 477, "op": "call", "addr": "F9DF", "bytes": "CD B9 F9", "chars": "...", "arg1": "print_hex_mem_and_space" }, { "line": 478, "op": "ldax", "addr": "F9E2", "bytes": "0A", "chars": ".", "arg1": "b" }, { "line": 479, "op": "call", "addr": "F9E3", "bytes": "CD BA F9", "chars": "...", "arg1": "print_hex_byte_and_space" }, { "line": 481, "label": "cmd_c_equal", "addr": "F9E6", "comment": "; F9E6" }, { "line": 482, "op": "inx", "addr": "F9E6", "bytes": "03", "chars": ".", "arg1": "b" }, { "line": 483, "op": "call", "addr": "F9E7", "bytes": "CD 96 F9", "chars": "...", "arg1": "end_of_addr_or_f4" }, { "line": 484, "op": "jmp", "addr": "F9EA", "bytes": "C3 D7 F9", "chars": "...", "arg1": "cmd_c" }, { "line": 486, "comment": ";============================================================================" }, { "line": 487, "comment": "; Команда F (Fill). Заполнение области памяти." }, { "line": 488, "comment": "; Заполняет память от HL до DE байтом из C (третий параметр)." }, { "line": 489, "comment": ";============================================================================" }, { "line": 490, "label": "cmd_f", "addr": "F9ED", "comment": "; F9ED" }, { "line": 491, "op": "mov", "addr": "F9ED", "bytes": "71", "chars": "q", "arg1": "m", "arg2": "c" }, { "line": 492, "op": "call", "addr": "F9EE", "bytes": "CD 99 F9", "chars": "...", "arg1": "cmp_hl_de_loop" }, { "line": 493, "op": "jmp", "addr": "F9F1", "bytes": "C3 ED F9", "chars": "...", "arg1": "cmd_f" }, { "line": 495, "comment": ";============================================================================" }, { "line": 496, "comment": "; Команда S (Search). Поиск байта в памяти." }, { "line": 497, "comment": "; Ищет байт из C в области от HL до DE." }, { "line": 498, "comment": "; Выводит адреса найденных совпадений." }, { "line": 499, "comment": ";============================================================================" }, { "line": 500, "label": "cmd_s", "addr": "F9F4", "comment": "; F9F4" }, { "line": 501, "op": "mov", "addr": "F9F4", "bytes": "79", "chars": "y", "arg1": "a", "arg2": "c" }, { "line": 502, "op": "cmp", "addr": "F9F5", "bytes": "BE", "chars": ".", "arg1": "m" }, { "line": 503, "op": "cz", "addr": "F9F6", "bytes": "CC 78 FB", "chars": ".x.", "arg1": "print_addr_from_hl" }, { "line": 504, "op": "call", "addr": "F9F9", "bytes": "CD 96 F9", "chars": "...", "arg1": "end_of_addr_or_f4" }, { "line": 505, "op": "jmp", "addr": "F9FC", "bytes": "C3 F4 F9", "chars": "...", "arg1": "cmd_s" }, { "line": 507, "comment": ";============================================================================" }, { "line": 508, "comment": "; Команда T (Transfer). Пересылка области памяти." }, { "line": 509, "comment": "; Пересылает байты из [HL..DE] в область, начиная с [BC]." }, { "line": 510, "comment": ";============================================================================" }, { "line": 511, "label": "cmd_t", "addr": "F9FF", "comment": "; F9FF" }, { "line": 512, "op": "mov", "addr": "F9FF", "bytes": "7E", "chars": "~", "arg1": "a", "arg2": "m" }, { "line": 513, "op": "stax", "addr": "FA00", "bytes": "02", "chars": ".", "arg1": "b" }, { "line": 514, "op": "inx", "addr": "FA01", "bytes": "03", "chars": ".", "arg1": "b" }, { "line": 515, "op": "call", "addr": "FA02", "bytes": "CD 99 F9", "chars": "...", "arg1": "cmp_hl_de_loop" }, { "line": 516, "op": "jmp", "addr": "FA05", "bytes": "C3 FF F9", "chars": "...", "arg1": "cmd_t" }, { "line": 518, "comment": ";============================================================================" }, { "line": 519, "comment": "; Команда L (Literal). Вывод содержимого памяти в символьном виде." }, { "line": 520, "comment": "; По 16 символов в строке. Непечатные символы заменяются точками." }, { "line": 521, "comment": ";============================================================================" }, { "line": 522, "label": "cmd_l", "addr": "FA08", "comment": "; FA08" }, { "line": 523, "op": "call", "addr": "FA08", "bytes": "CD 78 FB", "chars": ".x.", "arg1": "print_addr_from_hl" }, { "line": 525, "label": "cmd_l_loop", "addr": "FA0B", "comment": "; FA0B" }, { "line": 526, "op": "mov", "addr": "FA0B", "bytes": "7E", "chars": "~", "arg1": "a", "arg2": "m" }, { "line": 527, "op": "ora", "addr": "FA0C", "bytes": "B7", "chars": ".", "arg1": "a", "comment": "; Код > 7Fh?" }, { "line": 528, "op": "jm", "addr": "FA0D", "bytes": "FA 15 FA", "chars": "...", "arg1": "cmd_l_period", "comment": "; Да -> точка" }, { "line": 529, "op": "cpi", "addr": "FA10", "bytes": "FE 20", "chars": ". ", "arg1": "' '", "comment": "; Код < 20h (управляющий)?" }, { "line": 530, "op": "jnc", "addr": "FA12", "bytes": "D2 17 FA", "chars": "...", "arg1": "cmd_l_char", "comment": "; Нет -> выводим как есть" }, { "line": 532, "label": "cmd_l_period", "addr": "FA15", "comment": "; FA15" }, { "line": 533, "op": "mvi", "addr": "FA15", "bytes": "3E 2E", "chars": ">.", "arg1": "a", "arg2": "'.'" }, { "line": 535, "label": "cmd_l_char", "addr": "FA17", "comment": "; FA17" }, { "line": 536, "op": "call", "addr": "FA17", "bytes": "CD B9 FC", "chars": "...", "arg1": "putc_from_a" }, { "line": 537, "op": "call", "addr": "FA1A", "bytes": "CD 96 F9", "chars": "...", "arg1": "end_of_addr_or_f4" }, { "line": 538, "op": "mov", "addr": "FA1D", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l" }, { "line": 539, "op": "ani", "addr": "FA1E", "bytes": "E6 0F", "chars": "..", "arg1": "0Fh" }, { "line": 540, "op": "jz", "addr": "FA20", "bytes": "CA 08 FA", "chars": "...", "arg1": "cmd_l" }, { "line": 541, "op": "jmp", "addr": "FA23", "bytes": "C3 0B FA", "chars": "...", "arg1": "cmd_l_loop" }, { "line": 543, "comment": ";============================================================================" }, { "line": 544, "comment": "; Команда M (Modify). Изменение содержимого памяти." }, { "line": 545, "comment": "; Выводит адрес и содержимое ячейки, ожидает ввод нового значения." }, { "line": 546, "comment": "; [ВК] - перейти к следующей, [.] - выход из команды." }, { "line": 547, "comment": ";============================================================================" }, { "line": 548, "label": "cmd_m", "addr": "FA26", "comment": "; FA26" }, { "line": 549, "op": "call", "addr": "FA26", "bytes": "CD 78 FB", "chars": ".x.", "arg1": "print_addr_from_hl" }, { "line": 550, "op": "call", "addr": "FA29", "bytes": "CD B9 F9", "chars": "...", "arg1": "print_hex_mem_and_space" }, { "line": 551, "op": "push", "addr": "FA2C", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 552, "op": "call", "addr": "FA2D", "bytes": "CD EE F8", "chars": "...", "arg1": "input_string" }, { "line": 553, "op": "pop", "addr": "FA30", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 554, "op": "jnc", "addr": "FA31", "bytes": "D2 3B FA", "chars": ".;.", "arg1": "cmd_m_next", "comment": "; Ничего не введено -> следующий адрес" }, { "line": 556, "op": "push", "addr": "FA34", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 557, "op": "call", "addr": "FA35", "bytes": "CD 5A F9", "chars": ".Z.", "arg1": "parse_hex", "comment": "; Получаем новое значение в HL" }, { "line": 558, "op": "mov", "addr": "FA38", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l" }, { "line": 559, "op": "pop", "addr": "FA39", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 560, "op": "mov", "addr": "FA3A", "bytes": "77", "chars": "w", "arg1": "m", "arg2": "a", "comment": "; Записываем в память" }, { "line": 562, "label": "cmd_m_next", "addr": "FA3B", "comment": "; FA3B" }, { "line": 563, "op": "inx", "addr": "FA3B", "bytes": "23", "chars": "#", "arg1": "h" }, { "line": 564, "op": "jmp", "addr": "FA3C", "bytes": "C3 26 FA", "chars": ".&.", "arg1": "cmd_m" }, { "line": 566, "comment": ";============================================================================" }, { "line": 567, "comment": "; Команда G (Go). Запуск программы." }, { "line": 568, "comment": "; 1-й параметр: адрес старта." }, { "line": 569, "comment": "; 2-й параметр (необязательный): адрес останова." }, { "line": 570, "comment": "; Если адрес останова указан, по нему записывается RST 6 (F7h)," }, { "line": 571, "comment": "; а по адресу 0030h - JMP return_address. После останова регистры" }, { "line": 572, "comment": "; сохраняются в служебных ячейках (доступны по команде X)." }, { "line": 573, "comment": ";============================================================================" }, { "line": 574, "label": "cmd_g", "addr": "FA3F", "comment": "; FA3F" }, { "line": 575, "op": "call", "addr": "FA3F", "bytes": "CD 90 F9", "chars": "...", "arg1": "cmp_hl_de", "comment": "; Указан ли адрес останова?" }, { "line": 576, "op": "jz", "addr": "FA42", "bytes": "CA 5A FA", "chars": ".Z.", "arg1": "cmd_g_run", "comment": "; Нет -> сразу запуск" }, { "line": 578, "comment": "; Настройка механизма останова через адрес 0030h" }, { "line": 579, "op": "xchg", "addr": "FA45", "bytes": "EB", "chars": "." }, { "line": 580, "op": "shld", "addr": "FA46", "bytes": "22 23 76", "chars": "\"#v", "arg1": "stop_addr", "comment": "; Сохраняем адрес останова" }, { "line": 581, "op": "mov", "addr": "FA49", "bytes": "7E", "chars": "~", "arg1": "a", "arg2": "m" }, { "line": 582, "op": "sta", "addr": "FA4A", "bytes": "32 25 76", "chars": "2%v", "arg1": "stop_addr_value", "comment": "; Сохраняем байт по этому адресу" }, { "line": 583, "op": "mvi", "addr": "FA4D", "bytes": "36 F7", "chars": "6.", "arg1": "m", "arg2": "0F7h", "comment": "; RST 6 по адресу останова" }, { "line": 584, "op": "mvi", "addr": "FA4F", "bytes": "3E C3", "chars": ">.", "arg1": "a", "arg2": "0C3h", "comment": "; Команда JMP" }, { "line": 585, "op": "sta", "addr": "FA51", "bytes": "32 30 00", "chars": "20.", "arg1": "rst_6_addr", "comment": "; по адресу 0030h" }, { "line": 586, "op": "lxi", "addr": "FA54", "bytes": "21 A2 FF", "chars": "!..", "arg1": "h", "arg2": "return_address" }, { "line": 587, "op": "shld", "addr": "FA57", "bytes": "22 31 00", "chars": "\"1.", "arg1": "rst_6_addr+1", "comment": "; Адрес возврата" }, { "line": 589, "comment": "; Загрузка регистров из служебных ячеек и запуск программы" }, { "line": 590, "label": "cmd_g_run", "addr": "FA5A", "comment": "; FA5A" }, { "line": 591, "op": "lxi", "addr": "FA5A", "bytes": "31 18 76", "chars": "1.v", "arg1": "sp", "arg2": "bc_storage" }, { "line": 592, "op": "pop", "addr": "FA5D", "bytes": "C1", "chars": ".", "arg1": "b" }, { "line": 593, "op": "pop", "addr": "FA5E", "bytes": "D1", "chars": ".", "arg1": "d" }, { "line": 594, "op": "pop", "addr": "FA5F", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 595, "op": "pop", "addr": "FA60", "bytes": "F1", "chars": ".", "arg1": "psw" }, { "line": 596, "op": "sphl", "addr": "FA61", "bytes": "F9", "chars": ".", "comment": "; Загружаем SP" }, { "line": 597, "op": "lhld", "addr": "FA62", "bytes": "2A 16 76", "chars": "*.v", "arg1": "hl_storage" }, { "line": 598, "op": "jmp", "addr": "FA65", "bytes": "C3 26 76", "chars": ".&v", "arg1": "jump_to_go", "comment": "; JMP на адрес старта" }, { "line": 600, "comment": ";============================================================================" }, { "line": 601, "comment": "; Команда R (Read). Загрузка из ROM-диска (ПЗУ через доп. ППА D14)." }, { "line": 602, "comment": "; Шина данных -> порт A, шина адреса -> порты B и C." }, { "line": 603, "comment": "; 1-й параметр: начальный адрес в ОЗУ, 2-й: конечный, 3-й: адрес в ПЗУ." }, { "line": 604, "comment": ";============================================================================" }, { "line": 605, "label": "cmd_r", "addr": "FA68", "comment": "; FA68" }, { "line": 606, "op": "mvi", "addr": "FA68", "bytes": "3E 90", "chars": ">.", "arg1": "a", "arg2": "90h", "comment": "; Порт A - ввод, B и C - вывод" }, { "line": 607, "op": "sta", "addr": "FA6A", "bytes": "32 03 A0", "chars": "2..", "arg1": "vv55_d14_ctrl" }, { "line": 609, "label": "cmd_r_loop", "addr": "FA6D", "comment": "; FA6D" }, { "line": 610, "op": "shld", "addr": "FA6D", "bytes": "22 01 A0", "chars": "\"..", "arg1": "vv55_d14_port_b", "comment": "; Адрес в ПЗУ (мл. в B, ст. в C)" }, { "line": 611, "op": "lda", "addr": "FA70", "bytes": "3A 00 A0", "chars": ":..", "arg1": "vv55_d14_port_a", "comment": "; Читаем байт" }, { "line": 612, "op": "stax", "addr": "FA73", "bytes": "02", "chars": ".", "arg1": "b", "comment": "; Сохраняем в ОЗУ" }, { "line": 613, "op": "inx", "addr": "FA74", "bytes": "03", "chars": ".", "arg1": "b", "comment": "; Перейти к след. адресу ОЗУ" }, { "line": 614, "op": "call", "addr": "FA75", "bytes": "CD 99 F9", "chars": "...", "arg1": "cmp_hl_de_loop", "comment": "; Проверка на конец" }, { "line": 615, "op": "jmp", "addr": "FA78", "bytes": "C3 6D FA", "chars": ".m.", "arg1": "cmd_r_loop" }, { "line": 617, "comment": ";----------------------------------------------------------------------------" }, { "line": 618, "comment": "; Получить координаты курсора в HL (H=Y, L=X)" }, { "line": 619, "comment": ";----------------------------------------------------------------------------" }, { "line": 620, "label": "entry_getxy", "addr": "FA7B", "comment": "; FA7B" }, { "line": 621, "op": "lhld", "addr": "FA7B", "bytes": "2A 02 76", "chars": "*.v", "arg1": "cursor_xy" }, { "line": 622, "op": "ret", "addr": "FA7E", "bytes": "C9", "chars": "." }, { "line": 624, "comment": ";----------------------------------------------------------------------------" }, { "line": 625, "comment": "; Получить символ с экрана по адресу курсора в A" }, { "line": 626, "comment": ";----------------------------------------------------------------------------" }, { "line": 627, "label": "entry_curc", "addr": "FA7F", "comment": "; FA7F" }, { "line": 628, "op": "push", "addr": "FA7F", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 629, "op": "lhld", "addr": "FA80", "bytes": "2A 00 76", "chars": "*.v", "arg1": "cursor_addr" }, { "line": 630, "op": "mov", "addr": "FA83", "bytes": "7E", "chars": "~", "arg1": "a", "arg2": "m" }, { "line": 631, "op": "pop", "addr": "FA84", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 632, "op": "ret", "addr": "FA85", "bytes": "C9", "chars": "." }, { "line": 634, "comment": ";============================================================================" }, { "line": 635, "comment": "; Команда I (Input). Загрузка блока данных с магнитофона." }, { "line": 636, "comment": "; 1-й параметр: смещение относительно адреса на ленте." }, { "line": 637, "comment": "; 2-й параметр (необязательный): новая константа чтения." }, { "line": 638, "comment": ";============================================================================" }, { "line": 639, "label": "cmd_i", "addr": "FA86", "comment": "; FA86" }, { "line": 640, "op": "lda", "addr": "FA86", "bytes": "3A 2D 76", "chars": ":-v", "arg1": "param_2_present" }, { "line": 641, "op": "ora", "addr": "FA89", "bytes": "B7", "chars": ".", "arg1": "a" }, { "line": 642, "op": "jz", "addr": "FA8A", "bytes": "CA 91 FA", "chars": "...", "arg1": "cmd_i_cr" }, { "line": 643, "op": "mov", "addr": "FA8D", "bytes": "7B", "chars": "{", "arg1": "a", "arg2": "e" }, { "line": 644, "op": "sta", "addr": "FA8E", "bytes": "32 2F 76", "chars": "2/v", "arg1": "tape_read_const", "comment": "; Новая константа чтения" }, { "line": 646, "label": "cmd_i_cr", "addr": "FA91", "comment": "; FA91" }, { "line": 647, "op": "call", "addr": "FA91", "bytes": "CD B6 FA", "chars": "...", "arg1": "entry_inpblock", "comment": "; Читаем блок с магнитофона" }, { "line": 648, "op": "call", "addr": "FA94", "bytes": "CD 78 FB", "chars": ".x.", "arg1": "print_addr_from_hl", "comment": "; Выводим адрес начала" }, { "line": 649, "op": "xchg", "addr": "FA97", "bytes": "EB", "chars": "." }, { "line": 650, "op": "call", "addr": "FA98", "bytes": "CD 78 FB", "chars": ".x.", "arg1": "print_addr_from_hl", "comment": "; Выводим адрес конца" }, { "line": 651, "op": "xchg", "addr": "FA9B", "bytes": "EB", "chars": "." }, { "line": 652, "op": "push", "addr": "FA9C", "bytes": "C5", "chars": ".", "arg1": "b" }, { "line": 653, "op": "call", "addr": "FA9D", "bytes": "CD 16 FB", "chars": "...", "arg1": "entry_chksum", "comment": "; Считаем контрольную сумму" }, { "line": 654, "op": "mov", "addr": "FAA0", "bytes": "60", "chars": "`", "arg1": "h", "arg2": "b" }, { "line": 655, "op": "mov", "addr": "FAA1", "bytes": "69", "chars": "i", "arg1": "l", "arg2": "c" }, { "line": 656, "op": "call", "addr": "FAA2", "bytes": "CD 78 FB", "chars": ".x.", "arg1": "print_addr_from_hl", "comment": "; Выводим вычисленную КС" }, { "line": 657, "op": "pop", "addr": "FAA5", "bytes": "D1", "chars": ".", "arg1": "d", "comment": "; Считанная КС" }, { "line": 658, "op": "call", "addr": "FAA6", "bytes": "CD 90 F9", "chars": "...", "arg1": "cmp_hl_de", "comment": "; Совпадают?" }, { "line": 659, "op": "rz", "addr": "FAA9", "bytes": "C8", "chars": ".", "comment": "; Да -> выход" }, { "line": 660, "op": "xchg", "addr": "FAAA", "bytes": "EB", "chars": "." }, { "line": 661, "op": "call", "addr": "FAAB", "bytes": "CD 78 FB", "chars": ".x.", "arg1": "print_addr_from_hl", "comment": "; Нет -> выводим считанную КС" }, { "line": 663, "comment": ";----------------------------------------------------------------------------" }, { "line": 664, "comment": "; Выход из команды с ошибкой - знак вопроса и возврат на промт" }, { "line": 665, "comment": ";----------------------------------------------------------------------------" }, { "line": 666, "label": "print_error", "addr": "FAAE", "comment": "; FAAE" }, { "line": 667, "op": "mvi", "addr": "FAAE", "bytes": "3E 3F", "chars": ">?", "arg1": "a", "arg2": "'?'" }, { "line": 668, "op": "call", "addr": "FAB0", "bytes": "CD B9 FC", "chars": "...", "arg1": "putc_from_a" }, { "line": 669, "op": "jmp", "addr": "FAB3", "bytes": "C3 6C F8", "chars": ".l.", "arg1": "prompt_loop" }, { "line": 671, "comment": ";============================================================================" }, { "line": 672, "comment": "; Ввод блока данных с магнитофона." }, { "line": 673, "comment": "; Вход: HL - смещение" }, { "line": 674, "comment": "; Выход: HL - адрес начала, DE - адрес конца, BC - контрольная сумма" }, { "line": 675, "comment": "; Структура блока на ленте:" }, { "line": 676, "comment": "; раккорд, синхробайт, начальный адрес, конечный адрес, данные," }, { "line": 677, "comment": "; раккорд, синхробайт, контрольная сумма" }, { "line": 678, "comment": ";============================================================================" }, { "line": 679, "label": "entry_inpblock", "addr": "FAB6", "comment": "; FAB6" }, { "line": 680, "op": "mvi", "addr": "FAB6", "bytes": "3E FF", "chars": ">.", "arg1": "a", "arg2": "0FFh", "comment": "; Признак поиска синхробайта" }, { "line": 681, "op": "call", "addr": "FAB8", "bytes": "CD FF FA", "chars": "...", "arg1": "input_bc", "comment": "; Вводим начальный адрес в BC" }, { "line": 682, "op": "push", "addr": "FABB", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 683, "op": "dad", "addr": "FABC", "bytes": "09", "chars": ".", "arg1": "b", "comment": "; Начальный адрес = адрес с ленты + смещение" }, { "line": 684, "op": "xchg", "addr": "FABD", "bytes": "EB", "chars": ".", "comment": "; DE = начальный адрес" }, { "line": 685, "op": "call", "addr": "FABE", "bytes": "CD FD FA", "chars": "...", "arg1": "input_bc_no_sync", "comment": "; Вводим конечный адрес в BC" }, { "line": 686, "op": "pop", "addr": "FAC1", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 687, "op": "dad", "addr": "FAC2", "bytes": "09", "chars": ".", "arg1": "b", "comment": "; Конечный адрес = адрес с ленты + смещение" }, { "line": 688, "op": "xchg", "addr": "FAC3", "bytes": "EB", "chars": ".", "comment": "; HL = начальный, DE = конечный" }, { "line": 689, "op": "push", "addr": "FAC4", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 690, "op": "call", "addr": "FAC5", "bytes": "CD 0A FB", "chars": "...", "arg1": "read_block", "comment": "; Вводим массив данных" }, { "line": 691, "op": "mvi", "addr": "FAC8", "bytes": "3E FF", "chars": ">.", "arg1": "a", "arg2": "0FFh" }, { "line": 692, "op": "call", "addr": "FACA", "bytes": "CD FF FA", "chars": "...", "arg1": "input_bc", "comment": "; Вводим контрольную сумму в BC" }, { "line": 693, "op": "pop", "addr": "FACD", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 695, "comment": ";============================================================================" }, { "line": 696, "comment": "; Настройка отображения на экране (видеоконтроллер ВГ75 + ПДП ВТ57)" }, { "line": 697, "comment": ";============================================================================" }, { "line": 698, "label": "entry_video", "addr": "FACE", "comment": "; FACE" }, { "line": 699, "op": "push", "addr": "FACE", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 701, "comment": "; Настраиваем контроллер ЭЛТ ВГ75" }, { "line": 702, "op": "lxi", "addr": "FACF", "bytes": "21 01 C0", "chars": "!..", "arg1": "h", "arg2": "vg75_cmd_reg" }, { "line": 703, "op": "mvi", "addr": "FAD2", "bytes": "36 00", "chars": "6.", "arg1": "m", "arg2": "0", "comment": "; Команда Reset" }, { "line": 704, "op": "dcx", "addr": "FAD4", "bytes": "2B", "chars": "+", "arg1": "h", "comment": "; Передаем параметры:" }, { "line": 705, "op": "mvi", "addr": "FAD5", "bytes": "36 4D", "chars": "6M", "arg1": "m", "arg2": "4Dh", "comment": "; 78-1 = 77 символов в строке" }, { "line": 706, "op": "mvi", "addr": "FAD7", "bytes": "36 1D", "chars": "6.", "arg1": "m", "arg2": "1Dh", "comment": "; 30-1 = 29 знакорядов в кадре" }, { "line": 707, "op": "mvi", "addr": "FAD9", "bytes": "36 99", "chars": "6.", "arg1": "m", "arg2": "99h", "comment": "; Высота символа 10 строк, подчеркивание на 10-й" }, { "line": 708, "comment": "; (10-1) << 4 | 9" }, { "line": 709, "comment": "; Задаем режим отображения: 0 - без сдига номеров строк" }, { "line": 710, "comment": "; Атрибуты поля: не прозрачные" }, { "line": 711, "comment": "; Тип курсора: мигающее подчеркивание" }, { "line": 712, "comment": "; Количество символов в строчном синхроимпульсе: 8 интервалов (6 мкс)" }, { "line": 713, "op": "mvi", "addr": "FADB", "bytes": "36 93", "chars": "6.", "arg1": "m", "arg2": "93h", "comment": "; Режим: мигающее подчеркивание, 8 интервалов" }, { "line": 714, "comment": "; (1 << 7) | (1 << 4) | ((8/2)-1)" }, { "line": 715, "op": "inx", "addr": "FADD", "bytes": "23", "chars": "#", "arg1": "h" }, { "line": 716, "comment": "; Команда \"начать отображение\":" }, { "line": 717, "comment": "; интервал между запросами ПДП: 7 символов, 8 байт в пакете" }, { "line": 718, "op": "mvi", "addr": "FADE", "bytes": "36 27", "chars": "6'", "arg1": "m", "arg2": "27h", "comment": "; (1 << 5) | (((7+1)/8) << 2) | 3" }, { "line": 719, "op": "mov", "addr": "FAE0", "bytes": "7E", "chars": "~", "arg1": "a", "arg2": "m", "comment": "; Чтение статуса" }, { "line": 721, "comment": "; Ожидаем начало кадра (бит IR в статусном регистре ВГ75)" }, { "line": 722, "comment": "; Бит IR статусного регистра устанавливается после начала последнего знакоряда в кадре." }, { "line": 723, "comment": "; Как раз в это время и нужно загружать данные первого знакоряда на экране." }, { "line": 724, "label": "wait_frame_start", "addr": "FAE1", "comment": "; FAE1" }, { "line": 725, "op": "mov", "addr": "FAE1", "bytes": "7E", "chars": "~", "arg1": "a", "arg2": "m" }, { "line": 726, "op": "ani", "addr": "FAE2", "bytes": "E6 20", "chars": ". ", "arg1": "20h", "comment": "; Флаг IR" }, { "line": 727, "op": "jz", "addr": "FAE4", "bytes": "CA E1 FA", "chars": "...", "arg1": "wait_frame_start" }, { "line": 729, "comment": "; Настраиваем канал 2 ПДП ВТ57 для пересылки видеоданных" }, { "line": 730, "comment": "; Режим: чтение ОЗУ с автозагрузкой (регистры канала 3)" }, { "line": 731, "comment": "; Для пересылки используется канал 2 в режиме чтения ОЗУ с автозагрузкой." }, { "line": 732, "comment": "; Для автозагрузки используются регистры канала 3." }, { "line": 733, "comment": "; После пересылки последнего байта экрана начальные данные ПДП (начальный" }, { "line": 734, "comment": "; адрес и количество байт пересылки) снова автоматически загружаются в регистры" }, { "line": 735, "comment": "; 2 канала и пересылка продолжается постоянно." }, { "line": 736, "op": "lxi", "addr": "FAE7", "bytes": "21 08 E0", "chars": "!..", "arg1": "h", "arg2": "vt57_mode" }, { "line": 737, "op": "mvi", "addr": "FAEA", "bytes": "36 80", "chars": "6.", "arg1": "m", "arg2": "80h", "comment": "; Остановить ПДП, включить автозагрузку" }, { "line": 738, "comment": "; Адрес начала пересылки: начало видео ОЗУ" }, { "line": 739, "op": "mvi", "addr": "FAEC", "bytes": "2E 04", "chars": "..", "arg1": "l", "arg2": "vt57_ch2_addr & 0FFh", "comment": "; 4" }, { "line": 740, "op": "mvi", "addr": "FAEE", "bytes": "36 D0", "chars": "6.", "arg1": "m", "arg2": "video_memory & 0FFh", "comment": "; 0Dh" }, { "line": 741, "op": "mvi", "addr": "FAF0", "bytes": "36 76", "chars": "6v", "arg1": "m", "arg2": "video_memory / 256", "comment": "; 76h" }, { "line": 742, "comment": "; Количество байт пересылки и режим (запись в ОЗУ)" }, { "line": 743, "op": "inr", "addr": "FAF2", "bytes": "2C", "chars": ",", "arg1": "l" }, { "line": 744, "op": "mvi", "addr": "FAF3", "bytes": "36 23", "chars": "6#", "arg1": "m", "arg2": "(video_mem_size-1) & 0FFh", "comment": "; 23h" }, { "line": 745, "op": "mvi", "addr": "FAF5", "bytes": "36 49", "chars": "6I", "arg1": "m", "arg2": "40h | ((video_mem_size-1) / 256)", "comment": "; 49h" }, { "line": 746, "comment": "; Запускаем ПДП: автозагрузка, удлиненная запись, канал 2." }, { "line": 747, "op": "mvi", "addr": "FAF7", "bytes": "2E 08", "chars": "..", "arg1": "l", "arg2": "vt57_mode & 0FFh", "comment": "; 8" }, { "line": 748, "op": "mvi", "addr": "FAF9", "bytes": "36 A4", "chars": "6.", "arg1": "m", "arg2": "0A4h" }, { "line": 750, "op": "pop", "addr": "FAFB", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 751, "op": "ret", "addr": "FAFC", "bytes": "C9", "chars": "." }, { "line": 753, "comment": ";----------------------------------------------------------------------------" }, { "line": 754, "comment": "; Ввод 16-битного слова в BC с магнитофона (без синхробайта)" }, { "line": 755, "comment": ";----------------------------------------------------------------------------" }, { "line": 756, "label": "input_bc_no_sync", "addr": "FAFD", "comment": "; FAFD" }, { "line": 757, "op": "mvi", "addr": "FAFD", "bytes": "3E 08", "chars": ">.", "arg1": "a", "arg2": "8", "comment": "; 8 бит, без поиска синхробайта" }, { "line": 759, "comment": "; Ввод 16-битного слова в BC с магнитофона (с синхробайтом если A=FFh)" }, { "line": 760, "label": "input_bc", "addr": "FAFF", "comment": "; FAFF" }, { "line": 761, "op": "call", "addr": "FAFF", "bytes": "CD 98 FB", "chars": "...", "arg1": "entry_inpb", "comment": "; Читаем старший байт" }, { "line": 762, "op": "mov", "addr": "FB02", "bytes": "47", "chars": "G", "arg1": "b", "arg2": "a" }, { "line": 763, "op": "mvi", "addr": "FB03", "bytes": "3E 08", "chars": ">.", "arg1": "a", "arg2": "8" }, { "line": 764, "op": "call", "addr": "FB05", "bytes": "CD 98 FB", "chars": "...", "arg1": "entry_inpb", "comment": "; Читаем младший байт" }, { "line": 765, "op": "mov", "addr": "FB08", "bytes": "4F", "chars": "O", "arg1": "c", "arg2": "a" }, { "line": 766, "op": "ret", "addr": "FB09", "bytes": "C9", "chars": "." }, { "line": 768, "comment": ";----------------------------------------------------------------------------" }, { "line": 769, "comment": "; Чтение массива данных с магнитофона." }, { "line": 770, "comment": "; HL - начальный адрес, DE - конечный адрес." }, { "line": 771, "comment": ";----------------------------------------------------------------------------" }, { "line": 772, "label": "read_block", "addr": "FB0A", "comment": "; FB0A" }, { "line": 773, "op": "mvi", "addr": "FB0A", "bytes": "3E 08", "chars": ">.", "arg1": "a", "arg2": "8", "comment": "; Без поиска синхробайта" }, { "line": 774, "op": "call", "addr": "FB0C", "bytes": "CD 98 FB", "chars": "...", "arg1": "entry_inpb" }, { "line": 775, "op": "mov", "addr": "FB0F", "bytes": "77", "chars": "w", "arg1": "m", "arg2": "a", "comment": "; Сохраняем в память" }, { "line": 776, "op": "call", "addr": "FB10", "bytes": "CD 99 F9", "chars": "...", "arg1": "cmp_hl_de_loop" }, { "line": 777, "op": "jmp", "addr": "FB13", "bytes": "C3 0A FB", "chars": "...", "arg1": "read_block" }, { "line": 779, "comment": ";============================================================================" }, { "line": 780, "comment": "; Подсчет контрольной суммы." }, { "line": 781, "comment": "; Вход: HL - начальный адрес, DE - конечный адрес." }, { "line": 782, "comment": "; Выход: BC - контрольная сумма." }, { "line": 783, "comment": "; Алгоритм:" }, { "line": 784, "comment": "; Младший байт (C): сумма всех байтов без учета переноса." }, { "line": 785, "comment": "; Старший байт (B): сумма всех байтов (кроме последнего) + переносы из C." }, { "line": 786, "comment": ";============================================================================" }, { "line": 787, "label": "entry_chksum", "addr": "FB16", "comment": "; FB16" }, { "line": 788, "op": "lxi", "addr": "FB16", "bytes": "01 00 00", "chars": "...", "arg1": "b", "arg2": "0" }, { "line": 790, "label": "checksum_loop", "addr": "FB19", "comment": "; FB19" }, { "line": 791, "comment": "; Обработка младшего байта" }, { "line": 792, "op": "mov", "addr": "FB19", "bytes": "7E", "chars": "~", "arg1": "a", "arg2": "m" }, { "line": 793, "op": "add", "addr": "FB1A", "bytes": "81", "chars": ".", "arg1": "c" }, { "line": 794, "op": "mov", "addr": "FB1B", "bytes": "4F", "chars": "O", "arg1": "c", "arg2": "a" }, { "line": 795, "op": "push", "addr": "FB1C", "bytes": "F5", "chars": ".", "arg1": "psw", "comment": "; Сохраняем признак переноса" }, { "line": 796, "op": "call", "addr": "FB1D", "bytes": "CD 90 F9", "chars": "...", "arg1": "cmp_hl_de" }, { "line": 797, "op": "jz", "addr": "FB20", "bytes": "CA 9F F9", "chars": "...", "arg1": "cmp_hl_de_ret", "comment": "; Последний байт -> дост аем PSW и выходим" }, { "line": 798, "op": "pop", "addr": "FB23", "bytes": "F1", "chars": ".", "arg1": "psw" }, { "line": 799, "comment": "; Обработка старшего байта" }, { "line": 800, "op": "mov", "addr": "FB24", "bytes": "78", "chars": "x", "arg1": "a", "arg2": "b" }, { "line": 801, "op": "adc", "addr": "FB25", "bytes": "8E", "chars": ".", "arg1": "m", "comment": "; Суммируем + перенос из младшего" }, { "line": 802, "op": "mov", "addr": "FB26", "bytes": "47", "chars": "G", "arg1": "b", "arg2": "a" }, { "line": 803, "op": "call", "addr": "FB27", "bytes": "CD 99 F9", "chars": "...", "arg1": "cmp_hl_de_loop" }, { "line": 804, "op": "jmp", "addr": "FB2A", "bytes": "C3 19 FB", "chars": "...", "arg1": "checksum_loop" }, { "line": 806, "comment": ";============================================================================" }, { "line": 807, "comment": "; Команда O (Output). Запись блока памяти на магнитную ленту." }, { "line": 808, "comment": "; 1-й параметр: начальный адрес, 2-й: конечный." }, { "line": 809, "comment": "; 3-й (необязательный): новая константа записи." }, { "line": 810, "comment": ";============================================================================" }, { "line": 811, "label": "cmd_o", "addr": "FB2D", "comment": "; FB2D" }, { "line": 812, "op": "mov", "addr": "FB2D", "bytes": "79", "chars": "y", "arg1": "a", "arg2": "c" }, { "line": 813, "op": "ora", "addr": "FB2E", "bytes": "B7", "chars": ".", "arg1": "a" }, { "line": 814, "op": "jz", "addr": "FB2F", "bytes": "CA 35 FB", "chars": ".5.", "arg1": "cmd_o_no_change" }, { "line": 815, "op": "sta", "addr": "FB32", "bytes": "32 30 76", "chars": "20v", "arg1": "tape_write_const", "comment": "; Новая константа записи" }, { "line": 817, "label": "cmd_o_no_change", "addr": "FB35", "comment": "; FB35" }, { "line": 818, "op": "push", "addr": "FB35", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 819, "op": "call", "addr": "FB36", "bytes": "CD 16 FB", "chars": "...", "arg1": "entry_chksum", "comment": "; Вычисляем контрольную сумму" }, { "line": 820, "op": "pop", "addr": "FB39", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 821, "op": "call", "addr": "FB3A", "bytes": "CD 78 FB", "chars": ".x.", "arg1": "print_addr_from_hl", "comment": "; Выводим начальный адрес" }, { "line": 822, "op": "xchg", "addr": "FB3D", "bytes": "EB", "chars": "." }, { "line": 823, "op": "call", "addr": "FB3E", "bytes": "CD 78 FB", "chars": ".x.", "arg1": "print_addr_from_hl", "comment": "; Выводим конечный адрес" }, { "line": 824, "op": "xchg", "addr": "FB41", "bytes": "EB", "chars": "." }, { "line": 825, "op": "push", "addr": "FB42", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 826, "op": "mov", "addr": "FB43", "bytes": "60", "chars": "`", "arg1": "h", "arg2": "b" }, { "line": 827, "op": "mov", "addr": "FB44", "bytes": "69", "chars": "i", "arg1": "l", "arg2": "c" }, { "line": 828, "op": "call", "addr": "FB45", "bytes": "CD 78 FB", "chars": ".x.", "arg1": "print_addr_from_hl", "comment": "; Выводим контрольную сумму" }, { "line": 829, "op": "pop", "addr": "FB48", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 831, "comment": ";============================================================================" }, { "line": 832, "comment": "; Вывод блока данных на магнитную ленту." }, { "line": 833, "comment": "; Вход: HL - начальный адрес, DE - конечный адрес, BC - контрольная сумма." }, { "line": 834, "comment": "; Структура блока:" }, { "line": 835, "comment": "; 256 байт раккорда (00), синхробайт, нач.адрес, кон.адрес," }, { "line": 836, "comment": "; данные, 2 байта раккорда (00), синхробайт, контрольная сумма" }, { "line": 837, "comment": ";============================================================================" }, { "line": 838, "label": "entry_outblock", "addr": "FB49", "comment": "; FB49" }, { "line": 839, "op": "push", "addr": "FB49", "bytes": "C5", "chars": ".", "arg1": "b", "comment": "; Сохраняем контрольную сумму" }, { "line": 840, "op": "lxi", "addr": "FB4A", "bytes": "01 00 00", "chars": "...", "arg1": "b", "arg2": "0" }, { "line": 842, "comment": "; Вывод раккорда (256 нулевых байт)" }, { "line": 843, "label": "zero_block_loop", "addr": "FB4D", "comment": "; FB4D" }, { "line": 844, "op": "call", "addr": "FB4D", "bytes": "CD 46 FC", "chars": ".F.", "arg1": "entry_outb" }, { "line": 845, "op": "dcr", "addr": "FB50", "bytes": "05", "chars": ".", "arg1": "b", "comment": "; Счетчик 256 байт" }, { "line": 846, "op": "xthl", "addr": "FB51", "bytes": "E3", "chars": ".", "comment": "; Задержка 18 тактов" }, { "line": 847, "op": "xthl", "addr": "FB52", "bytes": "E3", "chars": ".", "comment": "; Задержка 18 тактов" }, { "line": 848, "op": "jnz", "addr": "FB53", "bytes": "C2 4D FB", "chars": ".M.", "arg1": "zero_block_loop" }, { "line": 850, "op": "mvi", "addr": "FB56", "bytes": "0E E6", "chars": "..", "arg1": "c", "arg2": "sync_byte", "comment": "; Синхробайт" }, { "line": 851, "op": "call", "addr": "FB58", "bytes": "CD 46 FC", "chars": ".F.", "arg1": "entry_outb" }, { "line": 852, "op": "call", "addr": "FB5B", "bytes": "CD 90 FB", "chars": "...", "arg1": "out_addr_from_hl", "comment": "; Начальный адрес" }, { "line": 853, "op": "xchg", "addr": "FB5E", "bytes": "EB", "chars": "." }, { "line": 854, "op": "call", "addr": "FB5F", "bytes": "CD 90 FB", "chars": "...", "arg1": "out_addr_from_hl", "comment": "; Конечный адрес" }, { "line": 855, "op": "xchg", "addr": "FB62", "bytes": "EB", "chars": "." }, { "line": 856, "op": "call", "addr": "FB63", "bytes": "CD 86 FB", "chars": "...", "arg1": "out_block_loop", "comment": "; Массив данных" }, { "line": 857, "op": "lxi", "addr": "FB66", "bytes": "21 00 00", "chars": "!..", "arg1": "h", "arg2": "0" }, { "line": 858, "op": "call", "addr": "FB69", "bytes": "CD 90 FB", "chars": "...", "arg1": "out_addr_from_hl", "comment": "; 2 байта раккорда (0000)" }, { "line": 859, "op": "mvi", "addr": "FB6C", "bytes": "0E E6", "chars": "..", "arg1": "c", "arg2": "sync_byte" }, { "line": 860, "op": "call", "addr": "FB6E", "bytes": "CD 46 FC", "chars": ".F.", "arg1": "entry_outb", "comment": "; Синхробайт" }, { "line": 861, "op": "pop", "addr": "FB71", "bytes": "E1", "chars": ".", "arg1": "h", "comment": "; Контрольная сумма" }, { "line": 862, "op": "call", "addr": "FB72", "bytes": "CD 90 FB", "chars": "...", "arg1": "out_addr_from_hl", "comment": "; Выводим КС" }, { "line": 863, "op": "jmp", "addr": "FB75", "bytes": "C3 CE FA", "chars": "...", "arg1": "entry_video", "comment": "; Восстанавливаем видео и выходим" }, { "line": 865, "comment": ";----------------------------------------------------------------------------" }, { "line": 866, "comment": "; Вывод адреса с новой строки (с отступом). Адрес в HL." }, { "line": 867, "comment": ";----------------------------------------------------------------------------" }, { "line": 868, "label": "print_addr_from_hl", "addr": "FB78", "comment": "; FB78" }, { "line": 869, "op": "push", "addr": "FB78", "bytes": "C5", "chars": ".", "arg1": "b" }, { "line": 870, "op": "call", "addr": "FB79", "bytes": "CD B0 F9", "chars": "...", "arg1": "print_next_line_prefix" }, { "line": 871, "op": "mov", "addr": "FB7C", "bytes": "7C", "chars": "|", "arg1": "a", "arg2": "h" }, { "line": 872, "op": "call", "addr": "FB7D", "bytes": "CD A5 FC", "chars": "...", "arg1": "entry_hexb", "comment": "; Старший байт" }, { "line": 873, "op": "mov", "addr": "FB80", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l" }, { "line": 874, "op": "call", "addr": "FB81", "bytes": "CD BA F9", "chars": "...", "arg1": "print_hex_byte_and_space", "comment": "; Младший байт и ' '" }, { "line": 875, "op": "pop", "addr": "FB84", "bytes": "C1", "chars": ".", "arg1": "b" }, { "line": 876, "op": "ret", "addr": "FB85", "bytes": "C9", "chars": "." }, { "line": 878, "comment": ";----------------------------------------------------------------------------" }, { "line": 879, "comment": "; Вывод массива байт на магнитофон. HL - начало, DE - конец." }, { "line": 880, "comment": ";----------------------------------------------------------------------------" }, { "line": 881, "label": "out_block_loop", "addr": "FB86", "comment": "; FB86" }, { "line": 882, "op": "mov", "addr": "FB86", "bytes": "4E", "chars": "N", "arg1": "c", "arg2": "m" }, { "line": 883, "op": "call", "addr": "FB87", "bytes": "CD 46 FC", "chars": ".F.", "arg1": "entry_outb" }, { "line": 884, "op": "call", "addr": "FB8A", "bytes": "CD 99 F9", "chars": "...", "arg1": "cmp_hl_de_loop" }, { "line": 885, "op": "jmp", "addr": "FB8D", "bytes": "C3 86 FB", "chars": "...", "arg1": "out_block_loop" }, { "line": 887, "comment": ";----------------------------------------------------------------------------" }, { "line": 888, "comment": "; Вывод 16-разрядного слова из HL на магнитофон (старший байт первым)." }, { "line": 889, "comment": ";----------------------------------------------------------------------------" }, { "line": 890, "label": "out_addr_from_hl", "addr": "FB90", "comment": "; FB90" }, { "line": 891, "op": "mov", "addr": "FB90", "bytes": "4C", "chars": "L", "arg1": "c", "arg2": "h" }, { "line": 892, "op": "call", "addr": "FB91", "bytes": "CD 46 FC", "chars": ".F.", "arg1": "entry_outb", "comment": "; Старший байт" }, { "line": 893, "op": "mov", "addr": "FB94", "bytes": "4D", "chars": "M", "arg1": "c", "arg2": "l" }, { "line": 894, "op": "jmp", "addr": "FB95", "bytes": "C3 46 FC", "chars": ".F.", "arg1": "entry_outb", "comment": "; Младший байт и выход" }, { "line": 896, "comment": ";============================================================================" }, { "line": 897, "comment": "; Ввод байта данных с магнитофона." }, { "line": 898, "comment": "; Вход: A = 8 - без поиска синхробайта (8 бит)" }, { "line": 899, "comment": "; A = 80h..FFh - с поиском синхробайта" }, { "line": 900, "comment": "; Выход: A - введенный байт" }, { "line": 901, "comment": "; Если ввод был с поиском синхробайта, то выдается байт, следующий" }, { "line": 902, "comment": "; непосредственно за синхробайтом." }, { "line": 903, "comment": "; Обработка последнего бита укорачивается на 450 тактов, чтобы" }, { "line": 904, "comment": "; предоставить время на обработку введенного байта." }, { "line": 905, "comment": ";============================================================================" }, { "line": 906, "label": "entry_inpb", "addr": "FB98", "comment": "; FB98" }, { "line": 907, "op": "push", "addr": "FB98", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 908, "op": "push", "addr": "FB99", "bytes": "C5", "chars": ".", "arg1": "b" }, { "line": 909, "op": "push", "addr": "FB9A", "bytes": "D5", "chars": ".", "arg1": "d" }, { "line": 910, "op": "mov", "addr": "FB9B", "bytes": "57", "chars": "W", "arg1": "d", "arg2": "a", "comment": "; D = признак синхробайта / счетчик бит" }, { "line": 912, "comment": "; Отслеживаем изменение уровня на входе магнитофона." }, { "line": 913, "comment": "; SP используется нетрадиционно - для регенерации ОЗУ через POP PSW." }, { "line": 914, "comment": "; Его содержимое записывается в служебной ячейке, а в SP записывается 0000h." }, { "line": 915, "comment": "; Далее мы периодически выполняя инструкцию POP PSW, выполняем регенерацию ОЗУ." }, { "line": 916, "label": "seek_change", "addr": "FB9C", "comment": "; FB9C" }, { "line": 917, "op": "mvi", "addr": "FB9C", "bytes": "3E 80", "chars": ">.", "arg1": "a", "arg2": "80h" }, { "line": 918, "op": "sta", "addr": "FB9E", "bytes": "32 08 E0", "chars": "2..", "arg1": "vt57_mode", "comment": "; Останавливаем отображение на экране" }, { "line": 920, "op": "lxi", "addr": "FBA1", "bytes": "21 00 00", "chars": "!..", "arg1": "h", "arg2": "0" }, { "line": 921, "op": "dad", "addr": "FBA4", "bytes": "39", "chars": "9", "arg1": "sp", "comment": "; Сохраняем SP" }, { "line": 922, "op": "lxi", "addr": "FBA5", "bytes": "31 00 00", "chars": "1..", "arg1": "sp", "arg2": "0", "comment": "; SP = 0 для регенерации ОЗУ" }, { "line": 923, "op": "shld", "addr": "FBA8", "bytes": "22 0D 76", "chars": "\".v", "arg1": "temp_sp" }, { "line": 925, "op": "mvi", "addr": "FBAB", "bytes": "0E 00", "chars": "..", "arg1": "c", "arg2": "0", "comment": "; Заготовка под вводимый байт" }, { "line": 926, "op": "lda", "addr": "FBAD", "bytes": "3A 02 80", "chars": ":..", "arg1": "vv55_port_c", "comment": "; Читаем состояние входа магнитофона" }, { "line": 927, "op": "rrc", "addr": "FBB0", "bytes": "0F", "chars": "." }, { "line": 928, "op": "rrc", "addr": "FBB1", "bytes": "0F", "chars": "." }, { "line": 929, "op": "rrc", "addr": "FBB2", "bytes": "0F", "chars": "." }, { "line": 930, "op": "rrc", "addr": "FBB3", "bytes": "0F", "chars": ".", "comment": "; Сдвигаем бит C4 -> d0" }, { "line": 931, "op": "ani", "addr": "FBB4", "bytes": "E6 01", "chars": "..", "arg1": "1" }, { "line": 932, "op": "mov", "addr": "FBB6", "bytes": "5F", "chars": "_", "arg1": "e", "arg2": "a", "comment": "; E = текущий уровень сигнала" }, { "line": 934, "comment": "; Обработка очередного бита" }, { "line": 935, "label": "next_bit", "addr": "FBB7", "comment": "; FBB7" }, { "line": 936, "op": "pop", "addr": "FBB7", "bytes": "F1", "chars": ".", "arg1": "psw", "comment": "; Регенерация ОЗУ" }, { "line": 937, "op": "mov", "addr": "FBB8", "bytes": "79", "chars": "y", "arg1": "a", "arg2": "c", "comment": "; Сдвигаем заготовку байта" }, { "line": 938, "op": "ani", "addr": "FBB9", "bytes": "E6 7F", "chars": "..", "arg1": "7Fh", "comment": "; влево на 1 бит," }, { "line": 939, "op": "rlc", "addr": "FBBB", "bytes": "07", "chars": ".", "comment": "; очищая d0" }, { "line": 940, "op": "mov", "addr": "FBBC", "bytes": "4F", "chars": "O", "arg1": "c", "arg2": "a" }, { "line": 941, "op": "mvi", "addr": "FBBD", "bytes": "26 00", "chars": "&.", "arg1": "h", "arg2": "0", "comment": "; Счетчик попыток чтения" }, { "line": 943, "comment": "; Цикл ожидания изменения уровня на входе C4 (вход с магнитофона)" }, { "line": 944, "label": "change_loop", "addr": "FBBF", "comment": "; FBBF" }, { "line": 945, "op": "dcr", "addr": "FBBF", "bytes": "25", "chars": "%", "arg1": "h" }, { "line": 946, "op": "jz", "addr": "FBC0", "bytes": "CA 34 FC", "chars": ".4.", "arg1": "input_timeout", "comment": "; Тайм-аут -> обработка" }, { "line": 947, "op": "pop", "addr": "FBC3", "bytes": "F1", "chars": ".", "arg1": "psw", "comment": "; Регенерация ОЗУ" }, { "line": 948, "op": "lda", "addr": "FBC4", "bytes": "3A 02 80", "chars": ":..", "arg1": "vv55_port_c" }, { "line": 949, "op": "rrc", "addr": "FBC7", "bytes": "0F", "chars": "." }, { "line": 950, "op": "rrc", "addr": "FBC8", "bytes": "0F", "chars": "." }, { "line": 951, "op": "rrc", "addr": "FBC9", "bytes": "0F", "chars": "." }, { "line": 952, "op": "rrc", "addr": "FBCA", "bytes": "0F", "chars": ".", "comment": "; Бит C4 -> d0" }, { "line": 953, "op": "ani", "addr": "FBCB", "bytes": "E6 01", "chars": "..", "arg1": "1" }, { "line": 954, "op": "cmp", "addr": "FBCD", "bytes": "BB", "chars": ".", "arg1": "e", "comment": "; Уровень изменился?" }, { "line": 955, "op": "jz", "addr": "FBCE", "bytes": "CA BF FB", "chars": "...", "arg1": "change_loop", "comment": "; Нет -> ждем" }, { "line": 957, "op": "ora", "addr": "FBD1", "bytes": "B1", "chars": ".", "arg1": "c", "comment": "; Да -> помещаем бит в заготовку" }, { "line": 958, "op": "mov", "addr": "FBD2", "bytes": "4F", "chars": "O", "arg1": "c", "arg2": "a" }, { "line": 959, "op": "dcr", "addr": "FBD3", "bytes": "15", "chars": ".", "arg1": "d", "comment": "; Счетчик бит--" }, { "line": 960, "op": "lda", "addr": "FBD4", "bytes": "3A 2F 76", "chars": ":/v", "arg1": "tape_read_const", "comment": "; Константа чтения (2Ah = 42)" }, { "line": 961, "op": "jnz", "addr": "FBD7", "bytes": "C2 DC FB", "chars": "...", "arg1": "normal_delay", "comment": "; Не последний бит -> полная задержка" }, { "line": 962, "op": "sui", "addr": "FBDA", "bytes": "D6 12", "chars": "..", "arg1": "12h", "comment": "; Последний бит -> укороченная задержка" }, { "line": 964, "comment": "; Цикл задержки чтения" }, { "line": 965, "comment": "; Один проход: POP(10) + DCR(5) + JNZ(10) = 25 тактов" }, { "line": 966, "comment": "; При f=16МГц: T_такта = 0.56мкс, T_цикла = 14мкс" }, { "line": 967, "comment": "; Для const_read=2Ah(42): задержка = 42*14мкс = 591мкс ~ 0.6мс" }, { "line": 968, "comment": "; Для последнего бита: (2Ah-12h)*14мкс = 336мкс" }, { "line": 969, "label": "normal_delay", "addr": "FBDC", "comment": "; FBDC" }, { "line": 970, "op": "mov", "addr": "FBDC", "bytes": "47", "chars": "G", "arg1": "b", "arg2": "a", "comment": "; значение задержки (5) ------+ 1055 (T)" }, { "line": 971, "label": "read_delay_loop", "addr": "FBDD", "comment": "; FBDD |" }, { "line": 972, "op": "pop", "addr": "FBDD", "bytes": "F1", "chars": ".", "arg1": "psw", "comment": "; (10) + Регенерация ОЗУ |" }, { "line": 973, "op": "dcr", "addr": "FBDE", "bytes": "05", "chars": ".", "arg1": "b", "comment": "; (5) | 25*42 = 1050 -------+" }, { "line": 974, "op": "jnz", "addr": "FBDF", "bytes": "C2 DD FB", "chars": "...", "arg1": "read_delay_loop", "comment": "; (10) +" }, { "line": 976, "op": "inr", "addr": "FBE2", "bytes": "14", "chars": ".", "arg1": "d", "comment": "; Восстанавливаем счетчик бит" }, { "line": 977, "op": "lda", "addr": "FBE3", "bytes": "3A 02 80", "chars": ":..", "arg1": "vv55_port_c", "comment": "; Читаем текущий уровень" }, { "line": 978, "op": "rrc", "addr": "FBE6", "bytes": "0F", "chars": "." }, { "line": 979, "op": "rrc", "addr": "FBE7", "bytes": "0F", "chars": "." }, { "line": 980, "op": "rrc", "addr": "FBE8", "bytes": "0F", "chars": "." }, { "line": 981, "op": "rrc", "addr": "FBE9", "bytes": "0F", "chars": "." }, { "line": 982, "op": "ani", "addr": "FBEA", "bytes": "E6 01", "chars": "..", "arg1": "1" }, { "line": 983, "op": "mov", "addr": "FBEC", "bytes": "5F", "chars": "_", "arg1": "e", "arg2": "a", "comment": "; Сохраняем уровень" }, { "line": 984, "op": "mov", "addr": "FBED", "bytes": "7A", "chars": "z", "arg1": "a", "arg2": "d" }, { "line": 985, "op": "ora", "addr": "FBEE", "bytes": "B7", "chars": ".", "arg1": "a", "comment": "; Ждем синхробайт?" }, { "line": 986, "op": "jp", "addr": "FBEF", "bytes": "F2 0B FC", "chars": "...", "arg1": "check_bit_count", "comment": "; Нет -> считаем биты" }, { "line": 988, "comment": "; Проверка на синхробайт" }, { "line": 989, "op": "mov", "addr": "FBF2", "bytes": "79", "chars": "y", "arg1": "a", "arg2": "c" }, { "line": 990, "op": "cpi", "addr": "FBF3", "bytes": "FE E6", "chars": "..", "arg1": "sync_byte", "comment": "; Синхробайт (E6h)?" }, { "line": 991, "op": "jnz", "addr": "FBF5", "bytes": "C2 FF FB", "chars": "...", "arg1": "invert_polarity", "comment": "; Нет -> проверим инверсию" }, { "line": 992, "op": "xra", "addr": "FBF8", "bytes": "AF", "chars": ".", "arg1": "a" }, { "line": 993, "op": "sta", "addr": "FBF9", "bytes": "32 2E 76", "chars": "2.v", "arg1": "tape_polarity", "comment": "; Полярность = прямая" }, { "line": 994, "op": "jmp", "addr": "FBFC", "bytes": "C3 09 FC", "chars": "...", "arg1": "set_bit_count" }, { "line": 996, "label": "invert_polarity", "addr": "FBFF", "comment": "; FBFF" }, { "line": 997, "op": "cpi", "addr": "FBFF", "bytes": "FE 19", "chars": "..", "arg1": "19h", "comment": "; Инверсный синхробайт (19h)?" }, { "line": 998, "op": "jnz", "addr": "FC01", "bytes": "C2 B7 FB", "chars": "...", "arg1": "next_bit", "comment": "; Нет -> продолжаем искать" }, { "line": 999, "op": "mvi", "addr": "FC04", "bytes": "3E FF", "chars": ">.", "arg1": "a", "arg2": "0FFh" }, { "line": 1000, "op": "sta", "addr": "FC06", "bytes": "32 2E 76", "chars": "2.v", "arg1": "tape_polarity", "comment": "; Полярность = инверсная" }, { "line": 1002, "comment": "; После получения синхробайта вводим байт данных" }, { "line": 1003, "label": "set_bit_count", "addr": "FC09", "comment": "; FC09" }, { "line": 1004, "op": "mvi", "addr": "FC09", "bytes": "16 09", "chars": "..", "arg1": "d", "arg2": "9", "comment": "; 8 бит + 1 (декремент перед проверкой)" }, { "line": 1006, "label": "check_bit_count", "addr": "FC0B", "comment": "; FC0B" }, { "line": 1007, "op": "dcr", "addr": "FC0B", "bytes": "15", "chars": ".", "arg1": "d", "comment": "; Подсчет бит" }, { "line": 1008, "op": "jnz", "addr": "FC0C", "bytes": "C2 B7 FB", "chars": "...", "arg1": "next_bit", "comment": "; Не последний -> продолжаем ввод" }, { "line": 1010, "comment": "; Ввод байта закончен. Восстанавливаем отображение на экране." }, { "line": 1011, "comment": "; Настраиваем канал 2 ПДП для видео" }, { "line": 1012, "op": "lxi", "addr": "FC0F", "bytes": "21 04 E0", "chars": "!..", "arg1": "h", "arg2": "vt57_ch2_addr" }, { "line": 1013, "op": "mvi", "addr": "FC12", "bytes": "36 D0", "chars": "6.", "arg1": "m", "arg2": "video_memory & 0FFh" }, { "line": 1014, "op": "mvi", "addr": "FC14", "bytes": "36 76", "chars": "6v", "arg1": "m", "arg2": "video_memory / 256" }, { "line": 1015, "op": "inx", "addr": "FC16", "bytes": "23", "chars": "#", "arg1": "h" }, { "line": 1016, "op": "mvi", "addr": "FC17", "bytes": "36 23", "chars": "6#", "arg1": "m", "arg2": "(video_mem_size-1) & 0FFh" }, { "line": 1017, "op": "mvi", "addr": "FC19", "bytes": "36 49", "chars": "6I", "arg1": "m", "arg2": "40h | ((video_mem_size-1) / 256)" }, { "line": 1018, "comment": "; Начать отображение" }, { "line": 1019, "op": "mvi", "addr": "FC1B", "bytes": "3E 27", "chars": ">'", "arg1": "a", "arg2": "27h" }, { "line": 1020, "op": "sta", "addr": "FC1D", "bytes": "32 01 C0", "chars": "2..", "arg1": "vg75_cmd_reg" }, { "line": 1021, "comment": "; Команда \"установить счетчики\"" }, { "line": 1022, "op": "mvi", "addr": "FC20", "bytes": "3E E0", "chars": ">.", "arg1": "a", "arg2": "0E0h" }, { "line": 1023, "op": "sta", "addr": "FC22", "bytes": "32 01 C0", "chars": "2..", "arg1": "vg75_cmd_reg" }, { "line": 1024, "comment": "; Запуск ПДП" }, { "line": 1025, "op": "mvi", "addr": "FC25", "bytes": "2E 08", "chars": "..", "arg1": "l", "arg2": "vt57_mode & 0FFh" }, { "line": 1026, "op": "mvi", "addr": "FC27", "bytes": "36 A4", "chars": "6.", "arg1": "m", "arg2": "0A4h" }, { "line": 1028, "op": "lhld", "addr": "FC29", "bytes": "2A 0D 76", "chars": "*.v", "arg1": "temp_sp", "comment": "; Восстанавливаем SP" }, { "line": 1029, "op": "sphl", "addr": "FC2C", "bytes": "F9", "chars": "." }, { "line": 1031, "op": "lda", "addr": "FC2D", "bytes": "3A 2E 76", "chars": ":.v", "arg1": "tape_polarity", "comment": "; Учитываем полярность" }, { "line": 1032, "op": "xra", "addr": "FC30", "bytes": "A9", "chars": ".", "arg1": "c", "comment": "; и выдаем байт данных" }, { "line": 1033, "op": "jmp", "addr": "FC31", "bytes": "C3 A1 FC", "chars": "...", "arg1": "restore_ret" }, { "line": 1035, "comment": "; Тайм-аут: на входе нет сигнала (уровень не меняется)" }, { "line": 1036, "label": "input_timeout", "addr": "FC34", "comment": "; FC34" }, { "line": 1037, "op": "lhld", "addr": "FC34", "bytes": "2A 0D 76", "chars": "*.v", "arg1": "temp_sp" }, { "line": 1038, "op": "sphl", "addr": "FC37", "bytes": "F9", "chars": ".", "comment": "; Восстанавливаем SP" }, { "line": 1039, "op": "call", "addr": "FC38", "bytes": "CD CE FA", "chars": "...", "arg1": "entry_video", "comment": "; Восстанавливаем видео" }, { "line": 1040, "op": "mov", "addr": "FC3B", "bytes": "7A", "chars": "z", "arg1": "a", "arg2": "d" }, { "line": 1041, "op": "ora", "addr": "FC3C", "bytes": "B7", "chars": ".", "arg1": "a", "comment": "; Ожидали синхробайт?" }, { "line": 1042, "op": "jp", "addr": "FC3D", "bytes": "F2 AE FA", "chars": "...", "arg1": "print_error", "comment": "; Нет -> ошибка" }, { "line": 1043, "op": "call", "addr": "FC40", "bytes": "CD A4 F9", "chars": "...", "arg1": "check_press_f4", "comment": "; Проверяем [F4]" }, { "line": 1044, "op": "jmp", "addr": "FC43", "bytes": "C3 9C FB", "chars": "...", "arg1": "seek_change", "comment": "; Продолжаем искать сигнал" }, { "line": 1046, "comment": ";============================================================================" }, { "line": 1047, "comment": "; Вывод байта из C на магнитофон." }, { "line": 1048, "comment": "; Информация выводится последовательно, начиная со старшего бита," }, { "line": 1049, "comment": "; на выход C0 D20. Параллельно выводится на C1-C3 (к C3 подключен" }, { "line": 1050, "comment": "; светодиод РУС/ЛАТ, он мигает при записи)." }, { "line": 1051, "comment": ";============================================================================" }, { "line": 1052, "label": "entry_outb", "addr": "FC46", "comment": "; FC46" }, { "line": 1053, "op": "push", "addr": "FC46", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 1054, "op": "push", "addr": "FC47", "bytes": "C5", "chars": ".", "arg1": "b" }, { "line": 1055, "op": "push", "addr": "FC48", "bytes": "D5", "chars": ".", "arg1": "d" }, { "line": 1056, "op": "push", "addr": "FC49", "bytes": "F5", "chars": ".", "arg1": "psw" }, { "line": 1057, "op": "mvi", "addr": "FC4A", "bytes": "3E 80", "chars": ">.", "arg1": "a", "arg2": "80h" }, { "line": 1058, "op": "sta", "addr": "FC4C", "bytes": "32 08 E0", "chars": "2..", "arg1": "vt57_mode", "comment": "; Останавливаем видео" }, { "line": 1060, "comment": "; SP используется для регенерации ОЗУ" }, { "line": 1061, "op": "lxi", "addr": "FC4F", "bytes": "21 00 00", "chars": "!..", "arg1": "h", "arg2": "0" }, { "line": 1062, "op": "dad", "addr": "FC52", "bytes": "39", "chars": "9", "arg1": "sp", "comment": "; Сохраняем SP в HL" }, { "line": 1063, "op": "lxi", "addr": "FC53", "bytes": "31 00 00", "chars": "1..", "arg1": "sp", "arg2": "0" }, { "line": 1064, "op": "mvi", "addr": "FC56", "bytes": "16 08", "chars": "..", "arg1": "d", "arg2": "8", "comment": "; Счетчик бит" }, { "line": 1066, "comment": "; Вывод первого (инвертированного) полупериода бита" }, { "line": 1067, "label": "out_next_bit", "addr": "FC58", "comment": "; FC58" }, { "line": 1068, "op": "pop", "addr": "FC58", "bytes": "F1", "chars": ".", "arg1": "psw", "comment": "; Регенерация ОЗУ" }, { "line": 1069, "op": "mov", "addr": "FC59", "bytes": "79", "chars": "y", "arg1": "a", "arg2": "c" }, { "line": 1070, "op": "rlc", "addr": "FC5A", "bytes": "07", "chars": ".", "comment": "; Очередной бит в d0" }, { "line": 1071, "op": "mov", "addr": "FC5B", "bytes": "4F", "chars": "O", "arg1": "c", "arg2": "a" }, { "line": 1072, "op": "mvi", "addr": "FC5C", "bytes": "3E 01", "chars": ">.", "arg1": "a", "arg2": "1" }, { "line": 1073, "op": "xra", "addr": "FC5E", "bytes": "A9", "chars": ".", "arg1": "c", "comment": "; Инвертируем бит" }, { "line": 1074, "op": "sta", "addr": "FC5F", "bytes": "32 02 80", "chars": "2..", "arg1": "vv55_port_c" }, { "line": 1075, "op": "lda", "addr": "FC62", "bytes": "3A 30 76", "chars": ":0v", "arg1": "tape_write_const" }, { "line": 1076, "op": "mov", "addr": "FC65", "bytes": "47", "chars": "G", "arg1": "b", "arg2": "a" }, { "line": 1078, "comment": "; Цикл задержки инвертированного полупериода" }, { "line": 1079, "comment": "; Один проход: POP(10) + DCR(5) + JNZ(10) = 25 тактов" }, { "line": 1080, "comment": "; При const_write=1Dh(29): задержка = 29*14мкс = 406мкс ~ 0.4мс" }, { "line": 1081, "comment": "; Полный период ~ 0.8мс, частота ~ 1.2кГц" }, { "line": 1083, "comment": "; Задержка на один проход цикла 10+5+10=25 тактов, что при тактовой частоте" }, { "line": 1084, "comment": "; РК 16МГц составляет: Ft=16/9=1.7777МГц" }, { "line": 1085, "comment": "; Tt=1/1.7777=0.56мкс T=25*0.56мкс=14мкс" }, { "line": 1086, "comment": "; Для стандартной константы записи const_write=1Dh=29 общая задержка составляет" }, { "line": 1087, "comment": "; Tr=29*14мкс=406мкс или ~0.4мс" }, { "line": 1089, "comment": "; Эта задержка составляет половину периода вывода бита, значит период ~=0.8мкс" }, { "line": 1090, "comment": "; Частота колебаний при выводе однородных бит (00000... или 11111...) составляет 1.2кГц" }, { "line": 1091, "comment": "; При выводе чередующихся бит (0101010101....) частота в 2 раз ниже ~600Гц." }, { "line": 1092, "comment": "; При выводе случайной последовательности бит выдается шумоподобный сигнал," }, { "line": 1093, "comment": "; при этом спектр распределяется между этими двумя частотами." }, { "line": 1095, "label": "out_bit_loop1", "addr": "FC66", "comment": "; FC66" }, { "line": 1096, "op": "pop", "addr": "FC66", "bytes": "F1", "chars": ".", "arg1": "psw", "comment": "; Регенерация ОЗУ" }, { "line": 1097, "op": "dcr", "addr": "FC67", "bytes": "05", "chars": ".", "arg1": "b" }, { "line": 1098, "op": "jnz", "addr": "FC68", "bytes": "C2 66 FC", "chars": ".f.", "arg1": "out_bit_loop1" }, { "line": 1100, "comment": "; Вывод второго (прямого) полупериода бита" }, { "line": 1101, "op": "mvi", "addr": "FC6B", "bytes": "3E 00", "chars": ">.", "arg1": "a", "arg2": "0" }, { "line": 1102, "op": "xra", "addr": "FC6D", "bytes": "A9", "chars": ".", "arg1": "c", "comment": "; Прямой бит" }, { "line": 1103, "op": "sta", "addr": "FC6E", "bytes": "32 02 80", "chars": "2..", "arg1": "vv55_port_c" }, { "line": 1104, "op": "dcr", "addr": "FC71", "bytes": "15", "chars": ".", "arg1": "d", "comment": "; Счетчик бит--" }, { "line": 1105, "op": "lda", "addr": "FC72", "bytes": "3A 30 76", "chars": ":0v", "arg1": "tape_write_const" }, { "line": 1106, "op": "jnz", "addr": "FC75", "bytes": "C2 7A FC", "chars": ".z.", "arg1": "not_last_bit", "comment": "; Не последний бит -> полная задержка" }, { "line": 1107, "op": "sui", "addr": "FC78", "bytes": "D6 0E", "chars": "..", "arg1": "0Eh", "comment": "; Последний бит -> укороченная" }, { "line": 1109, "label": "not_last_bit", "addr": "FC7A", "comment": "; FC7A" }, { "line": 1110, "op": "mov", "addr": "FC7A", "bytes": "47", "chars": "G", "arg1": "b", "arg2": "a" }, { "line": 1112, "comment": "; Цикл задержки прямого полупериода" }, { "line": 1113, "label": "out_bite_loop2", "addr": "FC7B", "comment": "; FC7B" }, { "line": 1114, "op": "pop", "addr": "FC7B", "bytes": "F1", "chars": ".", "arg1": "psw", "comment": "; Регенерация ОЗУ" }, { "line": 1115, "op": "dcr", "addr": "FC7C", "bytes": "05", "chars": ".", "arg1": "b" }, { "line": 1116, "op": "jnz", "addr": "FC7D", "bytes": "C2 7B FC", "chars": ".{.", "arg1": "out_bite_loop2" }, { "line": 1118, "op": "inr", "addr": "FC80", "bytes": "14", "chars": ".", "arg1": "d", "comment": "; Проверка на последний бит" }, { "line": 1119, "op": "dcr", "addr": "FC81", "bytes": "15", "chars": ".", "arg1": "d" }, { "line": 1120, "op": "jnz", "addr": "FC82", "bytes": "C2 58 FC", "chars": ".X.", "arg1": "out_next_bit" }, { "line": 1122, "comment": "; Восстанавливаем SP и видео" }, { "line": 1123, "op": "sphl", "addr": "FC85", "bytes": "F9", "chars": "." }, { "line": 1124, "op": "lxi", "addr": "FC86", "bytes": "21 04 E0", "chars": "!..", "arg1": "h", "arg2": "vt57_ch2_addr", "comment": "; E004h" }, { "line": 1125, "op": "mvi", "addr": "FC89", "bytes": "36 D0", "chars": "6.", "arg1": "m", "arg2": "video_memory & 0FFh", "comment": "; 0D0h" }, { "line": 1126, "op": "mvi", "addr": "FC8B", "bytes": "36 76", "chars": "6v", "arg1": "m", "arg2": "video_memory / 256", "comment": "; 76h" }, { "line": 1127, "op": "inx", "addr": "FC8D", "bytes": "23", "chars": "#", "arg1": "h" }, { "line": 1128, "op": "mvi", "addr": "FC8E", "bytes": "36 23", "chars": "6#", "arg1": "m", "arg2": "(video_mem_size-1) & 0FFh", "comment": "; 23h" }, { "line": 1129, "op": "mvi", "addr": "FC90", "bytes": "36 49", "chars": "6I", "arg1": "m", "arg2": "40h | ((video_mem_size-1) / 256)", "comment": "; 49h" }, { "line": 1130, "op": "mvi", "addr": "FC92", "bytes": "3E 27", "chars": ">'", "arg1": "a", "arg2": "27h" }, { "line": 1131, "op": "sta", "addr": "FC94", "bytes": "32 01 C0", "chars": "2..", "arg1": "vg75_cmd_reg", "comment": "; 0C001h" }, { "line": 1132, "op": "mvi", "addr": "FC97", "bytes": "3E E0", "chars": ">.", "arg1": "a", "arg2": "0E0h" }, { "line": 1133, "op": "sta", "addr": "FC99", "bytes": "32 01 C0", "chars": "2..", "arg1": "vg75_cmd_reg", "comment": "; 0C001h" }, { "line": 1134, "op": "mvi", "addr": "FC9C", "bytes": "2E 08", "chars": "..", "arg1": "l", "arg2": "vt57_mode & 0FFh", "comment": "; 8" }, { "line": 1135, "op": "mvi", "addr": "FC9E", "bytes": "36 A4", "chars": "6.", "arg1": "m", "arg2": "0A4h" }, { "line": 1136, "op": "pop", "addr": "FCA0", "bytes": "F1", "chars": ".", "arg1": "psw" }, { "line": 1138, "comment": "; Общий выход с восстановлением регистров" }, { "line": 1139, "label": "restore_ret", "addr": "FCA1", "comment": "; FCA1" }, { "line": 1140, "op": "pop", "addr": "FCA1", "bytes": "D1", "chars": ".", "arg1": "d" }, { "line": 1141, "op": "pop", "addr": "FCA2", "bytes": "C1", "chars": ".", "arg1": "b" }, { "line": 1142, "op": "pop", "addr": "FCA3", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 1143, "op": "ret", "addr": "FCA4", "bytes": "C9", "chars": "." }, { "line": 1145, "comment": ";============================================================================" }, { "line": 1146, "comment": "; Вывод байта из A на экран в шестнадцатеричной форме" }, { "line": 1147, "comment": ";============================================================================" }, { "line": 1148, "label": "entry_hexb", "addr": "FCA5", "comment": "; FCA5" }, { "line": 1149, "op": "push", "addr": "FCA5", "bytes": "F5", "chars": ".", "arg1": "psw" }, { "line": 1150, "op": "rrc", "addr": "FCA6", "bytes": "0F", "chars": ".", "comment": "; Старшая тетрада" }, { "line": 1151, "op": "rrc", "addr": "FCA7", "bytes": "0F", "chars": "." }, { "line": 1152, "op": "rrc", "addr": "FCA8", "bytes": "0F", "chars": "." }, { "line": 1153, "op": "rrc", "addr": "FCA9", "bytes": "0F", "chars": "." }, { "line": 1154, "op": "call", "addr": "FCAA", "bytes": "CD AE FC", "chars": "...", "arg1": "hexb_nibble" }, { "line": 1155, "op": "pop", "addr": "FCAD", "bytes": "F1", "chars": ".", "arg1": "psw" }, { "line": 1157, "comment": "; Вывод тетрады (младшей) как hex-цифры" }, { "line": 1158, "label": "hexb_nibble", "addr": "FCAE", "comment": "; FCAE" }, { "line": 1159, "op": "ani", "addr": "FCAE", "bytes": "E6 0F", "chars": "..", "arg1": "0Fh" }, { "line": 1160, "op": "cpi", "addr": "FCB0", "bytes": "FE 0A", "chars": "..", "arg1": "0Ah" }, { "line": 1161, "op": "jm", "addr": "FCB2", "bytes": "FA B7 FC", "chars": "...", "arg1": "hexb_make_char" }, { "line": 1162, "op": "adi", "addr": "FCB5", "bytes": "C6 07", "chars": "..", "arg1": "7", "comment": "; Коррекция для A-F" }, { "line": 1164, "label": "hexb_make_char", "addr": "FCB7", "comment": "; FCB7" }, { "line": 1165, "op": "adi", "addr": "FCB7", "bytes": "C6 30", "chars": ".0", "arg1": "30h", "comment": "; Преобразуем в ASCII-символ" }, { "line": 1167, "comment": "; Вывод символа из A (перенос в C и вызов entry_putc)" }, { "line": 1168, "label": "putc_from_a", "addr": "FCB9", "comment": "; FCB9" }, { "line": 1169, "op": "mov", "addr": "FCB9", "bytes": "4F", "chars": "O", "arg1": "c", "arg2": "a" }, { "line": 1171, "comment": ";============================================================================" }, { "line": 1172, "comment": "; Вывод символа на экран из регистра C." }, { "line": 1173, "comment": "; Обрабатывает управляющие коды, АР2-последовательности и печатные символы." }, { "line": 1174, "comment": "; Клавиша [РУС/ЛАТ] приостанавливает вывод, [F4] прерывает." }, { "line": 1175, "comment": ";============================================================================" }, { "line": 1176, "label": "entry_putc", "addr": "FCBA", "comment": "; FCBA" }, { "line": 1177, "op": "push", "addr": "FCBA", "bytes": "F5", "chars": ".", "arg1": "psw" }, { "line": 1178, "op": "push", "addr": "FCBB", "bytes": "C5", "chars": ".", "arg1": "b" }, { "line": 1179, "op": "push", "addr": "FCBC", "bytes": "D5", "chars": ".", "arg1": "d" }, { "line": 1180, "op": "push", "addr": "FCBD", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 1181, "op": "call", "addr": "FCBE", "bytes": "CD 01 FE", "chars": "...", "arg1": "entry_kbhit", "comment": "; Проверка на приостановку/прерывание" }, { "line": 1183, "comment": "; Адрес сохранения курсора в стеке (выполняется при любом выходе)" }, { "line": 1184, "op": "lxi", "addr": "FCC1", "bytes": "21 85 FD", "chars": "!..", "arg1": "h", "arg2": "set_cursor_and_exit" }, { "line": 1185, "op": "push", "addr": "FCC4", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 1187, "op": "lhld", "addr": "FCC5", "bytes": "2A 02 76", "chars": "*.v", "arg1": "cursor_xy" }, { "line": 1188, "op": "xchg", "addr": "FCC8", "bytes": "EB", "chars": ".", "comment": "; DE = координаты курсора" }, { "line": 1189, "op": "lhld", "addr": "FCC9", "bytes": "2A 00 76", "chars": "*.v", "arg1": "cursor_addr", "comment": "; HL = адрес в видео ОЗУ" }, { "line": 1190, "op": "lda", "addr": "FCCC", "bytes": "3A 04 76", "chars": ":.v", "arg1": "ap2_seq" }, { "line": 1191, "op": "dcr", "addr": "FCCF", "bytes": "3D", "chars": "=", "arg1": "a" }, { "line": 1192, "op": "jm", "addr": "FCD0", "bytes": "FA EE FC", "chars": "...", "arg1": "ap2_not_found", "comment": "; АР2 не используется (= 0)" }, { "line": 1193, "op": "jz", "addr": "FCD3", "bytes": "CA 65 FD", "chars": ".e.", "arg1": "ap2_byte_1", "comment": "; 1-й байт АР2 (\"Y\")" }, { "line": 1194, "op": "jpo", "addr": "FCD6", "bytes": "E2 73 FD", "chars": ".s.", "arg1": "ap2_byte_2", "comment": "; 2-й байт АР2 (смещение по Y)" }, { "line": 1196, "comment": ";----------------------------------------------------------------------------" }, { "line": 1197, "comment": "; Обработка 3-го байта АР2-последовательности (смещение по X + 20h)" }, { "line": 1198, "comment": ";----------------------------------------------------------------------------" }, { "line": 1199, "op": "mov", "addr": "FCD9", "bytes": "79", "chars": "y", "arg1": "a", "arg2": "c" }, { "line": 1200, "op": "sui", "addr": "FCDA", "bytes": "D6 20", "chars": ". ", "arg1": "20h", "comment": "; Действительное смещение по X" }, { "line": 1201, "op": "mov", "addr": "FCDC", "bytes": "4F", "chars": "O", "arg1": "c", "arg2": "a" }, { "line": 1203, "label": "ap2_move_x_loop", "addr": "FCDD", "comment": "; FCDD" }, { "line": 1204, "op": "dcr", "addr": "FCDD", "bytes": "0D", "chars": ".", "arg1": "c" }, { "line": 1205, "op": "jm", "addr": "FCDE", "bytes": "FA E9 FC", "chars": "...", "arg1": "reset_ap2_seq", "comment": "; Все -> сброс АР2" }, { "line": 1206, "op": "push", "addr": "FCE1", "bytes": "C5", "chars": ".", "arg1": "b" }, { "line": 1207, "op": "call", "addr": "FCE2", "bytes": "CD B9 FD", "chars": "...", "arg1": "move_right" }, { "line": 1208, "op": "pop", "addr": "FCE5", "bytes": "C1", "chars": ".", "arg1": "b" }, { "line": 1209, "op": "jmp", "addr": "FCE6", "bytes": "C3 DD FC", "chars": "...", "arg1": "ap2_move_x_loop" }, { "line": 1211, "comment": "; Сброс АР2-последовательности" }, { "line": 1212, "label": "reset_ap2_seq", "addr": "FCE9", "comment": "; FCE9" }, { "line": 1213, "op": "xra", "addr": "FCE9", "bytes": "AF", "chars": ".", "arg1": "a" }, { "line": 1215, "label": "update_ap2_and_exit", "addr": "FCEA", "comment": "; FCEA" }, { "line": 1216, "op": "sta", "addr": "FCEA", "bytes": "32 04 76", "chars": "2.v", "arg1": "ap2_seq" }, { "line": 1217, "op": "ret", "addr": "FCED", "bytes": "C9", "chars": "." }, { "line": 1219, "comment": ";----------------------------------------------------------------------------" }, { "line": 1220, "comment": "; АР2 не используется - проверяем управляющие символы" }, { "line": 1221, "comment": ";----------------------------------------------------------------------------" }, { "line": 1222, "label": "ap2_not_found", "addr": "FCEE", "comment": "; FCEE" }, { "line": 1223, "op": "mov", "addr": "FCEE", "bytes": "79", "chars": "y", "arg1": "a", "arg2": "c" }, { "line": 1224, "op": "ani", "addr": "FCEF", "bytes": "E6 7F", "chars": "..", "arg1": "7Fh", "comment": "; Сбрасываем старший бит" }, { "line": 1225, "op": "mov", "addr": "FCF1", "bytes": "4F", "chars": "O", "arg1": "c", "arg2": "a" }, { "line": 1226, "op": "cpi", "addr": "FCF2", "bytes": "FE 1F", "chars": "..", "arg1": "1Fh", "comment": "; СТР - очистка экрана" }, { "line": 1227, "op": "jz", "addr": "FCF4", "bytes": "CA A3 FD", "chars": "...", "arg1": "clear_screen" }, { "line": 1228, "op": "cpi", "addr": "FCF7", "bytes": "FE 0C", "chars": "..", "arg1": "0Ch", "comment": "; Курсор в начало экрана" }, { "line": 1229, "op": "jz", "addr": "FCF9", "bytes": "CA B2 FD", "chars": "...", "arg1": "cursor_home" }, { "line": 1230, "op": "cpi", "addr": "FCFC", "bytes": "FE 0D", "chars": "..", "arg1": "0Dh", "comment": "; ВК - возврат каретки" }, { "line": 1231, "op": "jz", "addr": "FCFE", "bytes": "CA F3 FD", "chars": "...", "arg1": "carrage_return" }, { "line": 1232, "op": "cpi", "addr": "FD01", "bytes": "FE 0A", "chars": "..", "arg1": "0Ah", "comment": "; ПС - перевод строки" }, { "line": 1233, "op": "jz", "addr": "FD03", "bytes": "CA 47 FD", "chars": ".G.", "arg1": "new_line" }, { "line": 1234, "op": "cpi", "addr": "FD06", "bytes": "FE 08", "chars": "..", "arg1": "8", "comment": "; Стрелка влево" }, { "line": 1235, "op": "jz", "addr": "FD08", "bytes": "CA D6 FD", "chars": "...", "arg1": "move_left" }, { "line": 1236, "op": "cpi", "addr": "FD0B", "bytes": "FE 18", "chars": "..", "arg1": "18h", "comment": "; Стрелка вправо" }, { "line": 1237, "op": "jz", "addr": "FD0D", "bytes": "CA B9 FD", "chars": "...", "arg1": "move_right" }, { "line": 1238, "op": "cpi", "addr": "FD10", "bytes": "FE 19", "chars": "..", "arg1": "19h", "comment": "; Стрелка вверх" }, { "line": 1239, "op": "jz", "addr": "FD12", "bytes": "CA E2 FD", "chars": "...", "arg1": "move_up" }, { "line": 1240, "op": "cpi", "addr": "FD15", "bytes": "FE 1A", "chars": "..", "arg1": "1Ah", "comment": "; Стрелка вниз" }, { "line": 1241, "op": "jz", "addr": "FD17", "bytes": "CA C5 FD", "chars": "...", "arg1": "move_down" }, { "line": 1242, "op": "cpi", "addr": "FD1A", "bytes": "FE 1B", "chars": "..", "arg1": "1Bh", "comment": "; АР2" }, { "line": 1243, "op": "jz", "addr": "FD1C", "bytes": "CA 9E FD", "chars": "...", "arg1": "ap2_seq_start" }, { "line": 1244, "op": "cpi", "addr": "FD1F", "bytes": "FE 07", "chars": "..", "arg1": "7", "comment": "; Звуковой сигнал" }, { "line": 1245, "op": "jnz", "addr": "FD21", "bytes": "C2 38 FD", "chars": ".8.", "arg1": "print_char", "comment": "; Нет -> печатный символ" }, { "line": 1247, "comment": "; Звуковой сигнал (B = высота тона, C = длительность)" }, { "line": 1248, "op": "lxi", "addr": "FD24", "bytes": "01 F0 05", "chars": "...", "arg1": "b", "arg2": "beep" }, { "line": 1250, "comment": ";----------------------------------------------------------------------------" }, { "line": 1251, "comment": "; Подпрограмма звукового сигнала." }, { "line": 1252, "comment": "; B - задержка периода (высота тона)" }, { "line": 1253, "comment": "; C - количество периодов (длительность)" }, { "line": 1254, "comment": "; Звук формируется сменой уровня на выходе INTE процессора" }, { "line": 1255, "comment": "; командами EI (высокий) и DI (низкий)." }, { "line": 1256, "comment": "; Формулы: b = 47/f(кГц), c = t(мс)/(b*0.021)" }, { "line": 1257, "comment": "; Диапазон частот: 184Гц - 47кГц" }, { "line": 1258, "comment": ";----------------------------------------------------------------------------" }, { "line": 1259, "label": "sound", "addr": "FD27", "comment": "; FD27" }, { "line": 1260, "op": "mov", "addr": "FD27", "bytes": "78", "chars": "x", "arg1": "a", "arg2": "b" }, { "line": 1261, "label": "sound_on_loop", "addr": "FD28", "comment": "; FD28" }, { "line": 1262, "op": "ei", "addr": "FD28", "bytes": "FB", "chars": ".", "comment": "; Верхний полупериод" }, { "line": 1263, "op": "dcr", "addr": "FD29", "bytes": "3D", "chars": "=", "arg1": "a" }, { "line": 1264, "op": "jnz", "addr": "FD2A", "bytes": "C2 28 FD", "chars": ".(.", "arg1": "sound_on_loop" }, { "line": 1266, "op": "mov", "addr": "FD2D", "bytes": "78", "chars": "x", "arg1": "a", "arg2": "b" }, { "line": 1267, "label": "sound_off_loop", "addr": "FD2E", "comment": "; FD2E" }, { "line": 1268, "op": "di", "addr": "FD2E", "bytes": "F3", "chars": ".", "comment": "; Нижний полупериод" }, { "line": 1269, "op": "dcr", "addr": "FD2F", "bytes": "3D", "chars": "=", "arg1": "a" }, { "line": 1270, "op": "jnz", "addr": "FD30", "bytes": "C2 2E FD", "chars": "...", "arg1": "sound_off_loop" }, { "line": 1271, "op": "dcr", "addr": "FD33", "bytes": "0D", "chars": ".", "arg1": "c" }, { "line": 1272, "op": "jnz", "addr": "FD34", "bytes": "C2 27 FD", "chars": ".'.", "arg1": "sound" }, { "line": 1273, "op": "ret", "addr": "FD37", "bytes": "C9", "chars": "." }, { "line": 1275, "comment": ";----------------------------------------------------------------------------" }, { "line": 1276, "comment": "; Печать символа на экран и перемещение курсора" }, { "line": 1277, "comment": ";----------------------------------------------------------------------------" }, { "line": 1278, "label": "print_char", "addr": "FD38", "comment": "; FD38" }, { "line": 1279, "op": "mov", "addr": "FD38", "bytes": "71", "chars": "q", "arg1": "m", "arg2": "c", "comment": "; Выводим символ в видео ОЗУ" }, { "line": 1280, "op": "call", "addr": "FD39", "bytes": "CD B9 FD", "chars": "...", "arg1": "move_right", "comment": "; Перемещаем курсор вправо" }, { "line": 1281, "comment": "; Если курсор вернулся в начало экрана -> скроллинг" }, { "line": 1282, "op": "mov", "addr": "FD3C", "bytes": "7A", "chars": "z", "arg1": "a", "arg2": "d" }, { "line": 1283, "op": "cpi", "addr": "FD3D", "bytes": "FE 03", "chars": "..", "arg1": "3", "comment": "; Верхняя строка?" }, { "line": 1284, "op": "rnz", "addr": "FD3F", "bytes": "C0", "chars": "." }, { "line": 1285, "op": "mov", "addr": "FD40", "bytes": "7B", "chars": "{", "arg1": "a", "arg2": "e" }, { "line": 1286, "op": "cpi", "addr": "FD41", "bytes": "FE 08", "chars": "..", "arg1": "8", "comment": "; Первая позиция?" }, { "line": 1287, "op": "rnz", "addr": "FD43", "bytes": "C0", "chars": "." }, { "line": 1288, "op": "call", "addr": "FD44", "bytes": "CD E2 FD", "chars": "...", "arg1": "move_up", "comment": "; Переходим на нижнюю строку" }, { "line": 1290, "comment": ";----------------------------------------------------------------------------" }, { "line": 1291, "comment": "; Перевод строки (ПС)." }, { "line": 1292, "comment": "; Если курсор в нижней строке -> скроллинг экрана вверх на 1 строку." }, { "line": 1293, "comment": ";----------------------------------------------------------------------------" }, { "line": 1294, "label": "new_line", "addr": "FD47", "comment": "; FD47" }, { "line": 1295, "op": "mov", "addr": "FD47", "bytes": "7A", "chars": "z", "arg1": "a", "arg2": "d" }, { "line": 1296, "op": "cpi", "addr": "FD48", "bytes": "FE 1B", "chars": "..", "arg1": "1Bh", "comment": "; 3+25-1 = самая нижняя строка" }, { "line": 1297, "op": "jnz", "addr": "FD4A", "bytes": "C2 C5 FD", "chars": "...", "arg1": "move_down", "comment": "; Нет -> просто вниз" }, { "line": 1298, "op": "push", "addr": "FD4D", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 1299, "op": "push", "addr": "FD4E", "bytes": "D5", "chars": ".", "arg1": "d" }, { "line": 1301, "comment": "; Смещение экрана на 1 строку вверх" }, { "line": 1302, "op": "lxi", "addr": "FD4F", "bytes": "21 C2 77", "chars": "!.w", "arg1": "h", "arg2": "video_memory+(78*3)+8", "comment": "; Начало 1-й видимой строки" }, { "line": 1303, "op": "lxi", "addr": "FD52", "bytes": "11 10 78", "chars": "..x", "arg1": "d", "arg2": "video_memory+(78*4)+8", "comment": "; Начало 2-й видимой строки" }, { "line": 1304, "op": "lxi", "addr": "FD55", "bytes": "01 9E 07", "chars": "...", "arg1": "b", "arg2": "25*78", "comment": "; 25 строк по 78 символов" }, { "line": 1306, "label": "scroll_loop", "addr": "FD58", "comment": "; FD58" }, { "line": 1307, "op": "ldax", "addr": "FD58", "bytes": "1A", "chars": ".", "arg1": "d" }, { "line": 1308, "op": "mov", "addr": "FD59", "bytes": "77", "chars": "w", "arg1": "m", "arg2": "a" }, { "line": 1309, "op": "inx", "addr": "FD5A", "bytes": "23", "chars": "#", "arg1": "h" }, { "line": 1310, "op": "inx", "addr": "FD5B", "bytes": "13", "chars": ".", "arg1": "d" }, { "line": 1311, "op": "dcx", "addr": "FD5C", "bytes": "0B", "chars": ".", "arg1": "b" }, { "line": 1312, "op": "mov", "addr": "FD5D", "bytes": "79", "chars": "y", "arg1": "a", "arg2": "c" }, { "line": 1313, "op": "ora", "addr": "FD5E", "bytes": "B0", "chars": ".", "arg1": "b" }, { "line": 1314, "op": "jnz", "addr": "FD5F", "bytes": "C2 58 FD", "chars": ".X.", "arg1": "scroll_loop" }, { "line": 1316, "op": "pop", "addr": "FD62", "bytes": "D1", "chars": ".", "arg1": "d" }, { "line": 1317, "op": "pop", "addr": "FD63", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 1318, "op": "ret", "addr": "FD64", "bytes": "C9", "chars": "." }, { "line": 1320, "comment": ";----------------------------------------------------------------------------" }, { "line": 1321, "comment": "; Обработка 1-го байта АР2-последовательности (должен быть \"Y\")" }, { "line": 1322, "comment": ";----------------------------------------------------------------------------" }, { "line": 1323, "label": "ap2_byte_1", "addr": "FD65", "comment": "; FD65" }, { "line": 1324, "op": "mov", "addr": "FD65", "bytes": "79", "chars": "y", "arg1": "a", "arg2": "c" }, { "line": 1325, "op": "cpi", "addr": "FD66", "bytes": "FE 59", "chars": ".Y", "arg1": "'Y'" }, { "line": 1326, "op": "jnz", "addr": "FD68", "bytes": "C2 E9 FC", "chars": "...", "arg1": "reset_ap2_seq", "comment": "; Не \"Y\" -> сброс АР2" }, { "line": 1327, "op": "call", "addr": "FD6B", "bytes": "CD B2 FD", "chars": "...", "arg1": "cursor_home" }, { "line": 1328, "op": "mvi", "addr": "FD6E", "bytes": "3E 02", "chars": ">.", "arg1": "a", "arg2": "2", "comment": "; Ожидаем 2-й байт" }, { "line": 1329, "op": "jmp", "addr": "FD70", "bytes": "C3 EA FC", "chars": "...", "arg1": "update_ap2_and_exit" }, { "line": 1331, "comment": ";----------------------------------------------------------------------------" }, { "line": 1332, "comment": "; Обработка 2-го байта АР2-последовательности (смещение по Y + 20h)" }, { "line": 1333, "comment": ";----------------------------------------------------------------------------" }, { "line": 1334, "label": "ap2_byte_2", "addr": "FD73", "comment": "; FD73" }, { "line": 1335, "op": "mov", "addr": "FD73", "bytes": "79", "chars": "y", "arg1": "a", "arg2": "c" }, { "line": 1336, "op": "sui", "addr": "FD74", "bytes": "D6 20", "chars": ". ", "arg1": "20h", "comment": "; Действительное смещение по Y" }, { "line": 1337, "op": "mov", "addr": "FD76", "bytes": "4F", "chars": "O", "arg1": "c", "arg2": "a" }, { "line": 1339, "label": "ap2_move_y_loop", "addr": "FD77", "comment": "; FD77" }, { "line": 1340, "op": "dcr", "addr": "FD77", "bytes": "0D", "chars": ".", "arg1": "c" }, { "line": 1341, "op": "mvi", "addr": "FD78", "bytes": "3E 04", "chars": ">.", "arg1": "a", "arg2": "4", "comment": "; Признак для следующего этапа" }, { "line": 1342, "op": "jm", "addr": "FD7A", "bytes": "FA EA FC", "chars": "...", "arg1": "update_ap2_and_exit", "comment": "; Все -> ожидаем 3-й байт (X)" }, { "line": 1343, "op": "push", "addr": "FD7D", "bytes": "C5", "chars": ".", "arg1": "b" }, { "line": 1344, "op": "call", "addr": "FD7E", "bytes": "CD C5 FD", "chars": "...", "arg1": "move_down" }, { "line": 1345, "op": "pop", "addr": "FD81", "bytes": "C1", "chars": ".", "arg1": "b" }, { "line": 1346, "op": "jmp", "addr": "FD82", "bytes": "C3 77 FD", "chars": ".w.", "arg1": "ap2_move_y_loop" }, { "line": 1348, "comment": ";----------------------------------------------------------------------------" }, { "line": 1349, "comment": "; Сохранение параметров курсора и выход из entry_putc" }, { "line": 1350, "comment": ";----------------------------------------------------------------------------" }, { "line": 1351, "label": "set_cursor_and_exit", "addr": "FD85", "comment": "; FD85" }, { "line": 1352, "op": "shld", "addr": "FD85", "bytes": "22 00 76", "chars": "\".v", "arg1": "cursor_addr" }, { "line": 1353, "op": "xchg", "addr": "FD88", "bytes": "EB", "chars": "." }, { "line": 1354, "op": "shld", "addr": "FD89", "bytes": "22 02 76", "chars": "\".v", "arg1": "cursor_xy" }, { "line": 1355, "comment": "; Передаем координаты курсора контроллеру ВГ75" }, { "line": 1356, "op": "mvi", "addr": "FD8C", "bytes": "3E 80", "chars": ">.", "arg1": "a", "arg2": "80h", "comment": "; Команда \"установить курсор\"" }, { "line": 1357, "op": "sta", "addr": "FD8E", "bytes": "32 01 C0", "chars": "2..", "arg1": "vg75_cmd_reg" }, { "line": 1358, "op": "mov", "addr": "FD91", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l", "comment": "; Координата X" }, { "line": 1359, "op": "sta", "addr": "FD92", "bytes": "32 00 C0", "chars": "2..", "arg1": "vg75_params" }, { "line": 1360, "op": "mov", "addr": "FD95", "bytes": "7C", "chars": "|", "arg1": "a", "arg2": "h", "comment": "; Координата Y" }, { "line": 1361, "op": "sta", "addr": "FD96", "bytes": "32 00 C0", "chars": "2..", "arg1": "vg75_params" }, { "line": 1362, "op": "pop", "addr": "FD99", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 1363, "op": "pop", "addr": "FD9A", "bytes": "D1", "chars": ".", "arg1": "d" }, { "line": 1364, "op": "pop", "addr": "FD9B", "bytes": "C1", "chars": ".", "arg1": "b" }, { "line": 1365, "op": "pop", "addr": "FD9C", "bytes": "F1", "chars": ".", "arg1": "psw" }, { "line": 1366, "op": "ret", "addr": "FD9D", "bytes": "C9", "chars": "." }, { "line": 1368, "comment": ";----------------------------------------------------------------------------" }, { "line": 1369, "comment": "; Начало АР2-последовательности" }, { "line": 1370, "comment": "; Был прочитан код символа АР2, необходимо прочитать АР2 последовательность." }, { "line": 1371, "comment": "; Реализована только одна АР2 последовательность:" }, { "line": 1372, "comment": "; Установка курсора в заданные координаты АР2+'Y'+(x+20h)+(y+20h):" }, { "line": 1373, "comment": "; где x - номер позиции в строке (0 - 63)," }, { "line": 1374, "comment": "; y - номер строки (0 - 24)." }, { "line": 1375, "comment": "; Отсчет начинается с верхнего левого угла экрана." }, { "line": 1376, "comment": ";----------------------------------------------------------------------------" }, { "line": 1377, "label": "ap2_seq_start", "addr": "FD9E", "comment": "; FD9E" }, { "line": 1378, "op": "mvi", "addr": "FD9E", "bytes": "3E 01", "chars": ">.", "arg1": "a", "arg2": "1", "comment": "; Ожидаем 1-й байт" }, { "line": 1379, "op": "jmp", "addr": "FDA0", "bytes": "C3 EA FC", "chars": "...", "arg1": "update_ap2_and_exit" }, { "line": 1381, "comment": ";----------------------------------------------------------------------------" }, { "line": 1382, "comment": "; Инициализация дисплея (СТР)." }, { "line": 1383, "comment": "; Обработка управляющего символа инициализации дисплея СТР." }, { "line": 1384, "comment": "; Очистка видео ОЗУ и установка курсора в начало." }, { "line": 1385, "comment": "; Выполняются следующие действия:" }, { "line": 1386, "comment": "; - вся экранная область ОЗУ (2342 байта) обнуляется," }, { "line": 1387, "comment": "; - курсор устанавливается в нулевую позицию." }, { "line": 1388, "comment": "; Очистка начинается с конечного адреса видео ОЗУ, с нижнего правого угла экрана." }, { "line": 1389, "comment": ";----------------------------------------------------------------------------" }, { "line": 1390, "label": "clear_screen", "addr": "FDA3", "comment": "; FDA3" }, { "line": 1391, "op": "lxi", "addr": "FDA3", "bytes": "21 F4 7F", "chars": "!..", "arg1": "h", "arg2": "video_memory_end" }, { "line": 1392, "op": "lxi", "addr": "FDA6", "bytes": "11 25 09", "chars": ".%.", "arg1": "d", "arg2": "video_mem_size+1" }, { "line": 1394, "label": "clear_screen_loop", "addr": "FDA9", "comment": "; FDA9" }, { "line": 1395, "op": "xra", "addr": "FDA9", "bytes": "AF", "chars": ".", "arg1": "a" }, { "line": 1396, "op": "mov", "addr": "FDAA", "bytes": "77", "chars": "w", "arg1": "m", "arg2": "a" }, { "line": 1397, "op": "dcx", "addr": "FDAB", "bytes": "2B", "chars": "+", "arg1": "h" }, { "line": 1398, "op": "dcx", "addr": "FDAC", "bytes": "1B", "chars": ".", "arg1": "d" }, { "line": 1399, "op": "mov", "addr": "FDAD", "bytes": "7B", "chars": "{", "arg1": "a", "arg2": "e" }, { "line": 1400, "op": "ora", "addr": "FDAE", "bytes": "B2", "chars": ".", "arg1": "d" }, { "line": 1401, "op": "jnz", "addr": "FDAF", "bytes": "C2 A9 FD", "chars": "...", "arg1": "clear_screen_loop" }, { "line": 1403, "comment": ";----------------------------------------------------------------------------" }, { "line": 1404, "comment": "; Установка курсора в начальную позицию (верхний левый угол)." }, { "line": 1405, "comment": "; Реально: позиция X=8, Y=3 (с учетом служебных строк и отступа)." }, { "line": 1406, "comment": ";----------------------------------------------------------------------------" }, { "line": 1407, "label": "cursor_home", "addr": "FDB2", "comment": "; FDB2" }, { "line": 1408, "op": "lxi", "addr": "FDB2", "bytes": "11 08 03", "chars": "...", "arg1": "d", "arg2": "308h" }, { "line": 1409, "op": "lxi", "addr": "FDB5", "bytes": "21 C2 77", "chars": "!.w", "arg1": "h", "arg2": "video_memory+(78*3)+8" }, { "line": 1410, "op": "ret", "addr": "FDB8", "bytes": "C9", "chars": "." }, { "line": 1412, "comment": ";----------------------------------------------------------------------------" }, { "line": 1413, "comment": "; Перемещение курсора вправо на одну позицию" }, { "line": 1414, "comment": ";----------------------------------------------------------------------------" }, { "line": 1415, "label": "move_right", "addr": "FDB9", "comment": "; FDB9" }, { "line": 1416, "op": "mov", "addr": "FDB9", "bytes": "7B", "chars": "{", "arg1": "a", "arg2": "e" }, { "line": 1417, "op": "inx", "addr": "FDBA", "bytes": "23", "chars": "#", "arg1": "h", "comment": "; Адрес в видео ОЗУ += 1" }, { "line": 1418, "op": "inr", "addr": "FDBB", "bytes": "1C", "chars": ".", "arg1": "e", "comment": "; Позиция X += 1" }, { "line": 1419, "op": "cpi", "addr": "FDBC", "bytes": "FE 47", "chars": ".G", "arg1": "8+64-1", "comment": "; Правая граница? (71)" }, { "line": 1420, "op": "rnz", "addr": "FDBE", "bytes": "C0", "chars": "." }, { "line": 1421, "op": "mvi", "addr": "FDBF", "bytes": "1E 08", "chars": "..", "arg1": "e", "arg2": "8", "comment": "; Переход на левый край" }, { "line": 1422, "op": "lxi", "addr": "FDC1", "bytes": "01 C0 FF", "chars": "...", "arg1": "b", "arg2": "-64", "comment": "; Отмотка адреса" }, { "line": 1423, "op": "dad", "addr": "FDC4", "bytes": "09", "chars": ".", "arg1": "b" }, { "line": 1425, "comment": ";----------------------------------------------------------------------------" }, { "line": 1426, "comment": "; Перемещение курсора вниз на одну строку" }, { "line": 1427, "comment": ";----------------------------------------------------------------------------" }, { "line": 1428, "label": "move_down", "addr": "FDC5", "comment": "; FDC5" }, { "line": 1429, "op": "mov", "addr": "FDC5", "bytes": "7A", "chars": "z", "arg1": "a", "arg2": "d" }, { "line": 1430, "op": "cpi", "addr": "FDC6", "bytes": "FE 1B", "chars": "..", "arg1": "1Bh", "comment": "; 3+25-1 = нижняя строка" }, { "line": 1431, "op": "lxi", "addr": "FDC8", "bytes": "01 4E 00", "chars": ".N.", "arg1": "b", "arg2": "78", "comment": "; Смещение: +1 строка" }, { "line": 1432, "op": "jnz", "addr": "FDCB", "bytes": "C2 D3 FD", "chars": "...", "arg1": "move_down_skip" }, { "line": 1433, "op": "mvi", "addr": "FDCE", "bytes": "16 02", "chars": "..", "arg1": "d", "arg2": "2", "comment": "; Переход на верхнюю строку (будет 3)" }, { "line": 1434, "op": "lxi", "addr": "FDD0", "bytes": "01 B0 F8", "chars": "...", "arg1": "b", "arg2": "-24*78", "comment": "; Смещение наверх" }, { "line": 1436, "label": "move_down_skip", "addr": "FDD3", "comment": "; FDD3" }, { "line": 1437, "op": "inr", "addr": "FDD3", "bytes": "14", "chars": ".", "arg1": "d" }, { "line": 1438, "op": "dad", "addr": "FDD4", "bytes": "09", "chars": ".", "arg1": "b" }, { "line": 1439, "op": "ret", "addr": "FDD5", "bytes": "C9", "chars": "." }, { "line": 1441, "comment": ";----------------------------------------------------------------------------" }, { "line": 1442, "comment": "; Перемещение курсора влево на одну позицию" }, { "line": 1443, "comment": ";----------------------------------------------------------------------------" }, { "line": 1444, "label": "move_left", "addr": "FDD6", "comment": "; FDD6" }, { "line": 1445, "op": "mov", "addr": "FDD6", "bytes": "7B", "chars": "{", "arg1": "a", "arg2": "e" }, { "line": 1446, "op": "dcx", "addr": "FDD7", "bytes": "2B", "chars": "+", "arg1": "h" }, { "line": 1447, "op": "dcr", "addr": "FDD8", "bytes": "1D", "chars": ".", "arg1": "e" }, { "line": 1448, "op": "cpi", "addr": "FDD9", "bytes": "FE 08", "chars": "..", "arg1": "8", "comment": "; Левая граница?" }, { "line": 1449, "op": "rnz", "addr": "FDDB", "bytes": "C0", "chars": "." }, { "line": 1450, "op": "mvi", "addr": "FDDC", "bytes": "1E 47", "chars": ".G", "arg1": "e", "arg2": "8+64-1", "comment": "; Переход на правый край (71)" }, { "line": 1451, "op": "lxi", "addr": "FDDE", "bytes": "01 40 00", "chars": ".@.", "arg1": "b", "arg2": "64" }, { "line": 1452, "op": "dad", "addr": "FDE1", "bytes": "09", "chars": ".", "arg1": "b" }, { "line": 1454, "comment": ";----------------------------------------------------------------------------" }, { "line": 1455, "comment": "; Перемещение курсора вверх на одну строку" }, { "line": 1456, "comment": ";----------------------------------------------------------------------------" }, { "line": 1457, "label": "move_up", "addr": "FDE2", "comment": "; FDE2" }, { "line": 1458, "op": "mov", "addr": "FDE2", "bytes": "7A", "chars": "z", "arg1": "a", "arg2": "d" }, { "line": 1459, "op": "cpi", "addr": "FDE3", "bytes": "FE 03", "chars": "..", "arg1": "3", "comment": "; Верхняя строка?" }, { "line": 1460, "op": "lxi", "addr": "FDE5", "bytes": "01 B2 FF", "chars": "...", "arg1": "b", "arg2": "-78", "comment": "; Смещение: -1 строка" }, { "line": 1461, "op": "jnz", "addr": "FDE8", "bytes": "C2 F0 FD", "chars": "...", "arg1": "move_up_skip" }, { "line": 1462, "op": "mvi", "addr": "FDEB", "bytes": "16 1C", "chars": "..", "arg1": "d", "arg2": "1Bh+1", "comment": "; Переход на нижнюю строку (будет 1Bh)" }, { "line": 1463, "op": "lxi", "addr": "FDED", "bytes": "01 50 07", "chars": ".P.", "arg1": "b", "arg2": "24*78", "comment": "; Смещение вниз" }, { "line": 1465, "label": "move_up_skip", "addr": "FDF0", "comment": "; FDF0" }, { "line": 1466, "op": "dcr", "addr": "FDF0", "bytes": "15", "chars": ".", "arg1": "d" }, { "line": 1467, "op": "dad", "addr": "FDF1", "bytes": "09", "chars": ".", "arg1": "b" }, { "line": 1468, "op": "ret", "addr": "FDF2", "bytes": "C9", "chars": "." }, { "line": 1470, "comment": ";----------------------------------------------------------------------------" }, { "line": 1471, "comment": "; Возврат каретки (ВК). Курсор в начало текущей строки." }, { "line": 1472, "comment": ";----------------------------------------------------------------------------" }, { "line": 1473, "label": "carrage_return", "addr": "FDF3", "comment": "; FDF3" }, { "line": 1474, "op": "mov", "addr": "FDF3", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l" }, { "line": 1475, "op": "sub", "addr": "FDF4", "bytes": "93", "chars": ".", "arg1": "e", "comment": "; Вычитаем позицию в строке" }, { "line": 1476, "op": "jnc", "addr": "FDF5", "bytes": "D2 F9 FD", "chars": "...", "arg1": "carrage_return_borrow" }, { "line": 1477, "op": "dcr", "addr": "FDF8", "bytes": "25", "chars": "%", "arg1": "h", "comment": "; Заем из старшего байта" }, { "line": 1479, "label": "carrage_return_borrow", "addr": "FDF9", "comment": "; FDF9" }, { "line": 1480, "op": "mov", "addr": "FDF9", "bytes": "6F", "chars": "o", "arg1": "l", "arg2": "a" }, { "line": 1481, "op": "mvi", "addr": "FDFA", "bytes": "1E 08", "chars": "..", "arg1": "e", "arg2": "8", "comment": "; Первая позиция" }, { "line": 1482, "op": "lxi", "addr": "FDFC", "bytes": "01 08 00", "chars": "...", "arg1": "b", "arg2": "8" }, { "line": 1483, "op": "dad", "addr": "FDFF", "bytes": "09", "chars": ".", "arg1": "b" }, { "line": 1484, "op": "ret", "addr": "FE00", "bytes": "C9", "chars": "." }, { "line": 1486, "comment": ";============================================================================" }, { "line": 1487, "comment": "; Опрос состояния клавиатуры." }, { "line": 1488, "comment": "; Выход: A = FFh - клавиша нажата, A = 0 - не нажата." }, { "line": 1489, "comment": "; Реализует автоповтор и устранение дребезга контактов." }, { "line": 1490, "comment": "; Счетчик обращений:" }, { "line": 1491, "comment": "; 21 - устранение дребезга" }, { "line": 1492, "comment": "; 21+224 - начальная задержка автоповтора" }, { "line": 1493, "comment": "; 21+224+64*N - стандартный период автоповтора" }, { "line": 1494, "comment": "; Стандартная задержка между обращениями к подпрограмме составляет 31 такт." }, { "line": 1495, "comment": ";============================================================================" }, { "line": 1496, "label": "entry_kbhit", "addr": "FE01", "comment": "; FE01" }, { "line": 1497, "comment": "; Проверка на нажатие [РУС/ЛАТ]" }, { "line": 1498, "op": "lda", "addr": "FE01", "bytes": "3A 02 80", "chars": ":..", "arg1": "vv55_port_c" }, { "line": 1499, "op": "ani", "addr": "FE04", "bytes": "E6 80", "chars": "..", "arg1": "80h" }, { "line": 1500, "op": "jz", "addr": "FE06", "bytes": "CA 0E FE", "chars": "...", "arg1": "ruslat_not_pressed", "comment": "; Отпущена -> продолжаем" }, { "line": 1501, "op": "lda", "addr": "FE09", "bytes": "3A 05 76", "chars": ":.v", "arg1": "pressed_key", "comment": "; Если нажата и ранее была нажата" }, { "line": 1502, "op": "ora", "addr": "FE0C", "bytes": "B7", "chars": ".", "arg1": "a", "comment": "; другая клавиша," }, { "line": 1503, "op": "rnz", "addr": "FE0D", "bytes": "C0", "chars": ".", "comment": "; то выходим" }, { "line": 1505, "label": "ruslat_not_pressed", "addr": "FE0E", "comment": "; FE0E" }, { "line": 1506, "op": "push", "addr": "FE0E", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 1507, "op": "lhld", "addr": "FE0F", "bytes": "2A 09 76", "chars": "*.v", "arg1": "keyboard_repeat", "comment": "; Параметры автоповтора (L=код, H=счетчик)" }, { "line": 1508, "op": "call", "addr": "FE12", "bytes": "CD 72 FE", "chars": ".r.", "arg1": "entry_scan_kbd", "comment": "; Получить код клавиши" }, { "line": 1509, "comment": "; FFh - не нажата" }, { "line": 1510, "comment": "; FEh - [РУС/ЛАТ]" }, { "line": 1511, "comment": "; xx - код символа" }, { "line": 1512, "op": "cmp", "addr": "FE15", "bytes": "BD", "chars": ".", "arg1": "l", "comment": "; Та же клавиша?" }, { "line": 1513, "op": "mov", "addr": "FE16", "bytes": "6F", "chars": "o", "arg1": "l", "arg2": "a" }, { "line": 1514, "op": "jz", "addr": "FE17", "bytes": "CA 2A FE", "chars": ".*.", "arg1": "keyboard_retention", "comment": "; Да -> удержание" }, { "line": 1516, "comment": "; Клавиша отпущена или нажата другая" }, { "line": 1517, "label": "release_ruslat", "addr": "FE1A", "comment": "; FE1A" }, { "line": 1518, "op": "mvi", "addr": "FE1A", "bytes": "3E 01", "chars": ">.", "arg1": "a", "arg2": "1" }, { "line": 1519, "op": "sta", "addr": "FE1C", "bytes": "32 0B 76", "chars": "2.v", "arg1": "released", "comment": "; Признак отпускания" }, { "line": 1520, "op": "mvi", "addr": "FE1F", "bytes": "26 15", "chars": "&.", "arg1": "h", "arg2": "bounce", "comment": "; Задержка дребезга (21)" }, { "line": 1522, "label": "not_pr_exit", "addr": "FE21", "comment": "; FE21" }, { "line": 1523, "op": "xra", "addr": "FE21", "bytes": "AF", "chars": ".", "arg1": "a", "comment": "; Клавиша не нажата" }, { "line": 1525, "label": "entry_kbhit_exit", "addr": "FE22", "comment": "; FE22" }, { "line": 1526, "op": "shld", "addr": "FE22", "bytes": "22 09 76", "chars": "\".v", "arg1": "keyboard_repeat" }, { "line": 1527, "op": "pop", "addr": "FE25", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 1528, "op": "sta", "addr": "FE26", "bytes": "32 05 76", "chars": "2.v", "arg1": "pressed_key" }, { "line": 1529, "op": "ret", "addr": "FE29", "bytes": "C9", "chars": "." }, { "line": 1531, "comment": ";----------------------------------------------------------------------------" }, { "line": 1532, "comment": "; Обработка удержания клавиши" }, { "line": 1533, "comment": ";----------------------------------------------------------------------------" }, { "line": 1534, "label": "keyboard_retention", "addr": "FE2A", "comment": "; FE2A" }, { "line": 1535, "op": "dcr", "addr": "FE2A", "bytes": "25", "chars": "%", "arg1": "h", "comment": "; Счетчик задержки--" }, { "line": 1536, "op": "jnz", "addr": "FE2B", "bytes": "C2 21 FE", "chars": ".!.", "arg1": "not_pr_exit", "comment": "; Время не вышло -> не нажата" }, { "line": 1537, "op": "inr", "addr": "FE2E", "bytes": "3C", "chars": "<", "arg1": "a", "comment": "; A = FFh?" }, { "line": 1538, "op": "jz", "addr": "FE2F", "bytes": "CA 22 FE", "chars": ".\".", "arg1": "entry_kbhit_exit", "comment": "; Клавиша не нажата -> выход" }, { "line": 1539, "op": "inr", "addr": "FE32", "bytes": "3C", "chars": "<", "arg1": "a", "comment": "; A = FEh?" }, { "line": 1540, "op": "jz", "addr": "FE33", "bytes": "CA 51 FE", "chars": ".Q.", "arg1": "process_ruslat", "comment": "; [РУС/ЛАТ] -> обработать" }, { "line": 1542, "comment": "; Нажата клавиша" }, { "line": 1543, "op": "push", "addr": "FE36", "bytes": "C5", "chars": ".", "arg1": "b" }, { "line": 1544, "op": "lxi", "addr": "FE37", "bytes": "01 03 50", "chars": "..P", "arg1": "b", "arg2": "kb_click", "comment": "; Щелчок нажатия" }, { "line": 1545, "op": "call", "addr": "FE3A", "bytes": "CD 27 FD", "chars": ".'.", "arg1": "sound" }, { "line": 1546, "op": "pop", "addr": "FE3D", "bytes": "C1", "chars": ".", "arg1": "b" }, { "line": 1548, "op": "lda", "addr": "FE3E", "bytes": "3A 0B 76", "chars": ":.v", "arg1": "released" }, { "line": 1549, "op": "mvi", "addr": "FE41", "bytes": "26 E0", "chars": "&.", "arg1": "h", "arg2": "first_kb_delay", "comment": "; Начальная задержка (224)" }, { "line": 1550, "op": "dcr", "addr": "FE43", "bytes": "3D", "chars": "=", "arg1": "a" }, { "line": 1551, "op": "sta", "addr": "FE44", "bytes": "32 0B 76", "chars": "2.v", "arg1": "released" }, { "line": 1552, "op": "jz", "addr": "FE47", "bytes": "CA 4C FE", "chars": ".L.", "arg1": "keyboard_first_press", "comment": "; Первое нажатие -> начальная задержка" }, { "line": 1553, "op": "mvi", "addr": "FE4A", "bytes": "26 40", "chars": "&@", "arg1": "h", "arg2": "regular_kb_delay", "comment": "; Автоповтор -> стандартная (64)" }, { "line": 1555, "label": "keyboard_first_press", "addr": "FE4C", "comment": "; FE4C" }, { "line": 1556, "op": "mvi", "addr": "FE4C", "bytes": "3E FF", "chars": ">.", "arg1": "a", "arg2": "0FFh", "comment": "; Признак: клавиша нажата" }, { "line": 1557, "op": "jmp", "addr": "FE4E", "bytes": "C3 22 FE", "chars": ".\".", "arg1": "entry_kbhit_exit" }, { "line": 1559, "comment": ";----------------------------------------------------------------------------" }, { "line": 1560, "comment": "; Обработка клавиши [РУС/ЛАТ]" }, { "line": 1561, "comment": "; Бесконечный цикл ожидания отпускания, затем инверсия флага." }, { "line": 1562, "comment": ";----------------------------------------------------------------------------" }, { "line": 1563, "label": "process_ruslat", "addr": "FE51", "comment": "; FE51" }, { "line": 1564, "op": "lda", "addr": "FE51", "bytes": "3A 02 80", "chars": ":..", "arg1": "vv55_port_c" }, { "line": 1565, "op": "ani", "addr": "FE54", "bytes": "E6 80", "chars": "..", "arg1": "80h" }, { "line": 1566, "op": "jz", "addr": "FE56", "bytes": "CA 51 FE", "chars": ".Q.", "arg1": "process_ruslat", "comment": "; Ждем отпускания" }, { "line": 1568, "op": "lda", "addr": "FE59", "bytes": "3A 06 76", "chars": ":.v", "arg1": "ruslat_flag", "comment": "; Инверсия флага РУС/ЛАТ" }, { "line": 1569, "op": "cma", "addr": "FE5C", "bytes": "2F", "chars": "/" }, { "line": 1570, "op": "sta", "addr": "FE5D", "bytes": "32 06 76", "chars": "2.v", "arg1": "ruslat_flag" }, { "line": 1571, "op": "jmp", "addr": "FE60", "bytes": "C3 1A FE", "chars": "...", "arg1": "release_ruslat" }, { "line": 1573, "comment": ";============================================================================" }, { "line": 1574, "comment": "; Ввод символа с клавиатуры." }, { "line": 1575, "comment": "; Выход: A - введенный символ." }, { "line": 1576, "comment": "; Ожидает нажатия клавиши в бесконечном цикле." }, { "line": 1577, "comment": ";============================================================================" }, { "line": 1578, "label": "entry_getc", "addr": "FE63", "comment": "; FE63" }, { "line": 1579, "op": "call", "addr": "FE63", "bytes": "CD 01 FE", "chars": "...", "arg1": "entry_kbhit" }, { "line": 1580, "op": "ora", "addr": "FE66", "bytes": "B7", "chars": ".", "arg1": "a" }, { "line": 1581, "op": "jz", "addr": "FE67", "bytes": "CA 63 FE", "chars": ".c.", "arg1": "entry_getc", "comment": "; Не нажата -> ждем" }, { "line": 1583, "op": "xra", "addr": "FE6A", "bytes": "AF", "chars": ".", "arg1": "a" }, { "line": 1584, "op": "sta", "addr": "FE6B", "bytes": "32 05 76", "chars": "2.v", "arg1": "pressed_key", "comment": "; Сбрасываем признак нажатия" }, { "line": 1585, "op": "lda", "addr": "FE6E", "bytes": "3A 09 76", "chars": ":.v", "arg1": "keyboard_repeat", "comment": "; Код клавиши" }, { "line": 1586, "op": "ret", "addr": "FE71", "bytes": "C9", "chars": "." }, { "line": 1588, "comment": ";============================================================================" }, { "line": 1589, "comment": "; Сканирование матрицы клавиатуры 8x8." }, { "line": 1590, "comment": "; Выход: A = FFh - не нажата" }, { "line": 1591, "comment": "; A = FEh - [РУС/ЛАТ]" }, { "line": 1592, "comment": "; A = код - код символа" }, { "line": 1593, "comment": ";============================================================================" }, { "line": 1594, "label": "entry_scan_kbd", "addr": "FE72", "comment": "; FE72" }, { "line": 1595, "comment": "; Проверка [РУС/ЛАТ]" }, { "line": 1596, "op": "lda", "addr": "FE72", "bytes": "3A 02 80", "chars": ":..", "arg1": "vv55_port_c" }, { "line": 1597, "op": "ani", "addr": "FE75", "bytes": "E6 80", "chars": "..", "arg1": "80h" }, { "line": 1598, "op": "jnz", "addr": "FE77", "bytes": "C2 7D FE", "chars": ".}.", "arg1": "fast_kbd_contrl" }, { "line": 1599, "op": "mvi", "addr": "FE7A", "bytes": "3E FE", "chars": ">.", "arg1": "a", "arg2": "0FEh", "comment": "; Код [РУС/ЛАТ]" }, { "line": 1600, "op": "ret", "addr": "FE7C", "bytes": "C9", "chars": "." }, { "line": 1602, "comment": "; Быстрая проверка: нажата ли хоть одна клавиша?" }, { "line": 1603, "label": "fast_kbd_contrl", "addr": "FE7D", "comment": "; FE7D" }, { "line": 1604, "op": "xra", "addr": "FE7D", "bytes": "AF", "chars": ".", "arg1": "a" }, { "line": 1605, "op": "sta", "addr": "FE7E", "bytes": "32 00 80", "chars": "2..", "arg1": "vv55_port_a", "comment": "; Все линии сканирования = 0" }, { "line": 1606, "op": "sta", "addr": "FE81", "bytes": "32 02 80", "chars": "2..", "arg1": "vv55_port_c", "comment": "; Погасить светодиод" }, { "line": 1607, "op": "lda", "addr": "FE84", "bytes": "3A 06 76", "chars": ":.v", "arg1": "ruslat_flag", "comment": "; Управление светодиодом РУС/ЛАТ" }, { "line": 1608, "op": "ani", "addr": "FE87", "bytes": "E6 01", "chars": "..", "arg1": "1" }, { "line": 1609, "op": "ori", "addr": "FE89", "bytes": "F6 06", "chars": "..", "arg1": "6", "comment": "; Команда: зажечь/погасить" }, { "line": 1610, "op": "sta", "addr": "FE8B", "bytes": "32 03 80", "chars": "2..", "arg1": "vv55_ctrl" }, { "line": 1611, "op": "lda", "addr": "FE8E", "bytes": "3A 01 80", "chars": ":..", "arg1": "vv55_port_b", "comment": "; Читаем состояние матрицы" }, { "line": 1612, "op": "inr", "addr": "FE91", "bytes": "3C", "chars": "<", "arg1": "a", "comment": "; Если хоть одна нажата, A != FFh" }, { "line": 1613, "op": "jnz", "addr": "FE92", "bytes": "C2 97 FE", "chars": "...", "arg1": "key_is_pressed" }, { "line": 1614, "op": "dcr", "addr": "FE95", "bytes": "3D", "chars": "=", "arg1": "a", "comment": "; FFh = не нажата" }, { "line": 1615, "op": "ret", "addr": "FE96", "bytes": "C9", "chars": "." }, { "line": 1617, "comment": "; Сканирование матрицы клавиатуры" }, { "line": 1618, "comment": ";--------------------------------------------------------------------" }, { "line": 1619, "comment": "; Таблица скан-кодов клавиатуры РК:" }, { "line": 1620, "comment": "; Столбец: 0 1 2 3 4 5 6 7" }, { "line": 1621, "comment": "; Клавиша" }, { "line": 1622, "comment": "; в столбце:" }, { "line": 1623, "comment": "; 0: ↖︎ ТАБ 0 8 Ю Х П Ь" }, { "line": 1624, "comment": "; 1: СТР ПС 1 9 А И Я Ы" }, { "line": 1625, "comment": "; 2: AP2 ВК 2 : Б Й Р З" }, { "line": 1626, "comment": "; 3: F1 ЗБ 3 ; Ц К С Ш" }, { "line": 1627, "comment": "; 4: F2 <- 4 , Д Л Т Э" }, { "line": 1628, "comment": "; 5: F3 ^ 5 - Е М У Щ" }, { "line": 1629, "comment": "; 6: F4 -> 6 . Ф Н Ж Ч" }, { "line": 1630, "comment": "; 7: F5 v 7 / Г О В пробел" }, { "line": 1631, "comment": ";--------------------------------------------------------------------" }, { "line": 1632, "comment": "; Для столбцов 0 и 1 скан коды одинаковы потому, что перекодировка" }, { "line": 1633, "comment": "; происходит табличным способом в отдельных ветках для каждого столбца." }, { "line": 1634, "comment": "; В столбцах 2 - 7 к номеру клавиши: 00SSSNNNb, где SSS - номер столбца," }, { "line": 1635, "comment": "; NNN - номер клавиши, прибавляется 20h, чтобы упростить декодирование." }, { "line": 1637, "label": "key_is_pressed", "addr": "FE97", "comment": "; FE97" }, { "line": 1638, "op": "push", "addr": "FE97", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 1639, "op": "mvi", "addr": "FE98", "bytes": "2E 01", "chars": "..", "arg1": "l", "arg2": "1", "comment": "; Бегущая единица для сканирования" }, { "line": 1640, "op": "mvi", "addr": "FE9A", "bytes": "26 07", "chars": "&.", "arg1": "h", "arg2": "8-1", "comment": "; Количество столбцов" }, { "line": 1642, "comment": "; Цикл сканирования столбцов" }, { "line": 1643, "label": "scan_kbd_loop", "addr": "FE9C", "comment": "; FE9C" }, { "line": 1644, "op": "mov", "addr": "FE9C", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l" }, { "line": 1645, "op": "rrc", "addr": "FE9D", "bytes": "0F", "chars": "." }, { "line": 1646, "op": "mov", "addr": "FE9E", "bytes": "6F", "chars": "o", "arg1": "l", "arg2": "a" }, { "line": 1647, "op": "cma", "addr": "FE9F", "bytes": "2F", "chars": "/" }, { "line": 1648, "op": "sta", "addr": "FEA0", "bytes": "32 00 80", "chars": "2..", "arg1": "vv55_port_a", "comment": "; Активируем столбец" }, { "line": 1649, "op": "lda", "addr": "FEA3", "bytes": "3A 01 80", "chars": ":..", "arg1": "vv55_port_b", "comment": "; Читаем строки" }, { "line": 1650, "op": "cma", "addr": "FEA6", "bytes": "2F", "chars": "/" }, { "line": 1651, "op": "ora", "addr": "FEA7", "bytes": "B7", "chars": ".", "arg1": "a" }, { "line": 1652, "op": "jnz", "addr": "FEA8", "bytes": "C2 B3 FE", "chars": "...", "arg1": "scan_bounce", "comment": "; Есть нажатие -> устранение дребезга" }, { "line": 1653, "op": "dcr", "addr": "FEAB", "bytes": "25", "chars": "%", "arg1": "h" }, { "line": 1654, "op": "jp", "addr": "FEAC", "bytes": "F2 9C FE", "chars": "...", "arg1": "scan_kbd_loop", "comment": "; Следующий столбец" }, { "line": 1656, "comment": "; Клавиша не нажата (или дребезг)" }, { "line": 1657, "label": "key_not_press", "addr": "FEAF", "comment": "; FEAF" }, { "line": 1658, "op": "mvi", "addr": "FEAF", "bytes": "3E FF", "chars": ">.", "arg1": "a", "arg2": "0FFh" }, { "line": 1659, "op": "pop", "addr": "FEB1", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 1660, "op": "ret", "addr": "FEB2", "bytes": "C9", "chars": "." }, { "line": 1662, "comment": "; Устранение дребезга: 32 повторных опроса" }, { "line": 1663, "label": "scan_bounce", "addr": "FEB3", "comment": "; FEB3" }, { "line": 1664, "op": "mvi", "addr": "FEB3", "bytes": "2E 20", "chars": ". ", "arg1": "l", "arg2": "32" }, { "line": 1666, "label": "scan_boun_loop", "addr": "FEB5", "comment": "; FEB5" }, { "line": 1667, "op": "lda", "addr": "FEB5", "bytes": "3A 01 80", "chars": ":..", "arg1": "vv55_port_b" }, { "line": 1668, "op": "cma", "addr": "FEB8", "bytes": "2F", "chars": "/" }, { "line": 1669, "op": "ora", "addr": "FEB9", "bytes": "B7", "chars": ".", "arg1": "a" }, { "line": 1670, "op": "jz", "addr": "FEBA", "bytes": "CA AF FE", "chars": "...", "arg1": "key_not_press", "comment": "; Не подтвердилось -> не нажата" }, { "line": 1671, "op": "dcr", "addr": "FEBD", "bytes": "2D", "chars": "-", "arg1": "l" }, { "line": 1672, "op": "jnz", "addr": "FEBE", "bytes": "C2 B5 FE", "chars": "...", "arg1": "scan_boun_loop" }, { "line": 1674, "op": "mvi", "addr": "FEC1", "bytes": "2E 08", "chars": "..", "arg1": "l", "arg2": "8", "comment": "; Количество клавиш в столбце" }, { "line": 1676, "comment": "; Определение номера клавиши (из позиционного кода в порядковый)" }, { "line": 1677, "comment": "; Цикл определения номера клавиши в столбце" }, { "line": 1678, "comment": "; Здесь из позиционного кода, считанного с порта B D20, мы" }, { "line": 1679, "comment": "; получаем номер клавиши в столбце (начиная со старших номеров)." }, { "line": 1680, "label": "num_kbd_loop", "addr": "FEC3", "comment": "; FEC3" }, { "line": 1681, "op": "dcr", "addr": "FEC3", "bytes": "2D", "chars": "-", "arg1": "l" }, { "line": 1682, "op": "rlc", "addr": "FEC4", "bytes": "07", "chars": "." }, { "line": 1683, "op": "jnc", "addr": "FEC5", "bytes": "D2 C3 FE", "chars": "...", "arg1": "num_kbd_loop", "comment": "; Сдвигаем пока не найдем нажатую" }, { "line": 1685, "op": "mov", "addr": "FEC8", "bytes": "7C", "chars": "|", "arg1": "a", "arg2": "h", "comment": "; H <-> L (H = номер клавиши," }, { "line": 1686, "op": "mov", "addr": "FEC9", "bytes": "65", "chars": "e", "arg1": "h", "arg2": "l", "comment": "; L = номер столбца)" }, { "line": 1687, "op": "mov", "addr": "FECA", "bytes": "6F", "chars": "o", "arg1": "l", "arg2": "a" }, { "line": 1689, "comment": "; Столбцы 0 и 1 - управляющие клавиши (перекодировка по таблице)" }, { "line": 1690, "comment": "; Колонки 0 и 1 это управляющие символы, используемые в стандартных" }, { "line": 1691, "comment": "; дисплеях. Для перекодировки используются специальные таблицы." }, { "line": 1692, "op": "cpi", "addr": "FECB", "bytes": "FE 01", "chars": "..", "arg1": "1", "comment": "; Столбец 1?" }, { "line": 1693, "op": "jz", "addr": "FECD", "bytes": "CA FA FE", "chars": "...", "arg1": "make_1_column" }, { "line": 1694, "op": "jc", "addr": "FED0", "bytes": "DA F3 FE", "chars": "...", "arg1": "make_0_column", "comment": "; Столбец 0?" }, { "line": 1696, "comment": "; Остальные клавиши используются для ввода отображаемых символов." }, { "line": 1697, "comment": "; Столбцы 2-7: код = столбец*8 + 20h + номер клавиши" }, { "line": 1698, "op": "rlc", "addr": "FED3", "bytes": "07", "chars": "." }, { "line": 1699, "op": "rlc", "addr": "FED4", "bytes": "07", "chars": "." }, { "line": 1700, "op": "rlc", "addr": "FED5", "bytes": "07", "chars": "." }, { "line": 1701, "op": "adi", "addr": "FED6", "bytes": "C6 20", "chars": ". ", "arg1": "20h" }, { "line": 1702, "op": "ora", "addr": "FED8", "bytes": "B4", "chars": ".", "arg1": "h", "comment": "; Прибавляем номер клавиши" }, { "line": 1703, "op": "cpi", "addr": "FED9", "bytes": "FE 5F", "chars": "._", "arg1": "5Fh", "comment": "; Пробел?" }, { "line": 1704, "op": "jnz", "addr": "FEDB", "bytes": "C2 06 FF", "chars": "...", "arg1": "scan_others" }, { "line": 1705, "op": "mvi", "addr": "FEDE", "bytes": "3E 20", "chars": "> ", "arg1": "a", "arg2": "20h", "comment": "; Код пробела" }, { "line": 1706, "op": "pop", "addr": "FEE0", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 1707, "op": "ret", "addr": "FEE1", "bytes": "C9", "chars": "." }, { "line": 1709, "comment": ";----------------------------------------------------------------------------" }, { "line": 1710, "comment": "; Таблицы перекодировки управляющих клавиш" }, { "line": 1711, "comment": ";----------------------------------------------------------------------------" }, { "line": 1712, "comment": "; Столбец 1 (клавиши 0-7):" }, { "line": 1713, "label": "table_column_1", "op": "db", "addr": "FEE2", "bytes": "09", "chars": ".", "data": "9", "comment": "; FEE2 - ТАБ" }, { "line": 1714, "op": "db", "addr": "FEE3", "bytes": "0A", "chars": ".", "data": "0Ah", "comment": "; ПС" }, { "line": 1715, "op": "db", "addr": "FEE4", "bytes": "0D", "chars": ".", "data": "0Dh", "comment": "; ВК" }, { "line": 1716, "op": "db", "addr": "FEE5", "bytes": "7F", "chars": ".", "data": "7Fh", "comment": "; ЗБ" }, { "line": 1717, "op": "db", "addr": "FEE6", "bytes": "08", "chars": ".", "data": "8", "comment": "; Стрелка влево" }, { "line": 1718, "op": "db", "addr": "FEE7", "bytes": "19", "chars": ".", "data": "19h", "comment": "; Стрелка вверх" }, { "line": 1719, "op": "db", "addr": "FEE8", "bytes": "18", "chars": ".", "data": "18h", "comment": "; Стрелка вправо" }, { "line": 1720, "op": "db", "addr": "FEE9", "bytes": "1A", "chars": ".", "data": "1Ah", "comment": "; Стрелка вниз" }, { "line": 1722, "comment": "; Столбец 0 (клавиши 0-8):" }, { "line": 1723, "label": "table_column_0", "op": "db", "addr": "FEEA", "bytes": "0C", "chars": ".", "data": "0Ch", "comment": "; FEEA - Курсор в начало (↖︎)" }, { "line": 1724, "op": "db", "addr": "FEEB", "bytes": "1F", "chars": ".", "data": "1Fh", "comment": "; СТР" }, { "line": 1725, "op": "db", "addr": "FEEC", "bytes": "1B", "chars": ".", "data": "1Bh", "comment": "; АР2" }, { "line": 1726, "op": "db", "addr": "FEED", "bytes": "00", "chars": ".", "data": "0", "comment": "; F1" }, { "line": 1727, "op": "db", "addr": "FEEE", "bytes": "01", "chars": ".", "data": "1", "comment": "; F2" }, { "line": 1728, "op": "db", "addr": "FEEF", "bytes": "02", "chars": ".", "data": "2", "comment": "; F3" }, { "line": 1729, "op": "db", "addr": "FEF0", "bytes": "03", "chars": ".", "data": "3", "comment": "; F4" }, { "line": 1730, "op": "db", "addr": "FEF1", "bytes": "04", "chars": ".", "data": "4", "comment": "; F5 (нет на клавиатуре)" }, { "line": 1731, "op": "db", "addr": "FEF2", "bytes": "05", "chars": ".", "data": "5", "comment": "; (не используется)" }, { "line": 1733, "comment": "; Перекодировка столбца 0" }, { "line": 1734, "label": "make_0_column", "addr": "FEF3", "comment": "; FEF3" }, { "line": 1735, "op": "mov", "addr": "FEF3", "bytes": "7C", "chars": "|", "arg1": "a", "arg2": "h" }, { "line": 1736, "op": "lxi", "addr": "FEF4", "bytes": "21 EA FE", "chars": "!..", "arg1": "h", "arg2": "table_column_0" }, { "line": 1737, "op": "jmp", "addr": "FEF7", "bytes": "C3 FE FE", "chars": "...", "arg1": "scan_table" }, { "line": 1739, "comment": "; Перекодировка столбца 1" }, { "line": 1740, "label": "make_1_column", "addr": "FEFA", "comment": "; FEFA" }, { "line": 1741, "op": "mov", "addr": "FEFA", "bytes": "7C", "chars": "|", "arg1": "a", "arg2": "h" }, { "line": 1742, "op": "lxi", "addr": "FEFB", "bytes": "21 E2 FE", "chars": "!..", "arg1": "h", "arg2": "table_column_1" }, { "line": 1744, "label": "scan_table", "addr": "FEFE", "comment": "; FEFE" }, { "line": 1745, "op": "add", "addr": "FEFE", "bytes": "85", "chars": ".", "arg1": "l", "comment": "; Индекс в таблице" }, { "line": 1746, "op": "mov", "addr": "FEFF", "bytes": "6F", "chars": "o", "arg1": "l", "arg2": "a" }, { "line": 1747, "op": "mov", "addr": "FF00", "bytes": "7E", "chars": "~", "arg1": "a", "arg2": "m", "comment": "; Код из таблицы" }, { "line": 1748, "op": "cpi", "addr": "FF01", "bytes": "FE 40", "chars": ".@", "arg1": "40h", "comment": "; Управляющая клавиша?" }, { "line": 1749, "op": "pop", "addr": "FF03", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 1750, "op": "rc", "addr": "FF04", "bytes": "D8", "chars": ".", "comment": "; Да -> выход" }, { "line": 1752, "op": "push", "addr": "FF05", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 1754, "comment": ";----------------------------------------------------------------------------" }, { "line": 1755, "comment": "; Обработка клавиш с модификаторами [УС], [СС] и режимом РУС/ЛАТ." }, { "line": 1756, "comment": "; Скан-код в L, состояние вспомогательных клавиш в H." }, { "line": 1757, "comment": "; Здесь происходит выдача кода для всех клавиш, кроме управляющих, [ЗБ] и пробела." }, { "line": 1758, "comment": "; Эти клавиши выдают 1 из 2-х символов в зависимости от состояния клавиш [СС], [УС]" }, { "line": 1759, "comment": "; и режима рус/лат. Скан код клавиши находится в L, состояние клавиш [СС] и [УС] в H." }, { "line": 1760, "comment": ";----------------------------------------------------------------------------" }, { "line": 1761, "label": "scan_others", "addr": "FF06", "comment": "; FF06" }, { "line": 1762, "op": "mov", "addr": "FF06", "bytes": "6F", "chars": "o", "arg1": "l", "arg2": "a" }, { "line": 1763, "op": "lda", "addr": "FF07", "bytes": "3A 02 80", "chars": ":..", "arg1": "vv55_port_c", "comment": "; Читаем модификаторы" }, { "line": 1764, "op": "mov", "addr": "FF0A", "bytes": "67", "chars": "g", "arg1": "h", "arg2": "a" }, { "line": 1765, "op": "ani", "addr": "FF0B", "bytes": "E6 40", "chars": ".@", "arg1": "40h", "comment": "; [УС] нажата?" }, { "line": 1766, "op": "jnz", "addr": "FF0D", "bytes": "C2 1A FF", "chars": "...", "arg1": "rus_or_lat", "comment": "; Нет -> проверяем РУС/ЛАТ" }, { "line": 1768, "comment": "; Клавиша [УС]: буквы (40h-5Fh) -> управляющие коды (00h-1Fh)" }, { "line": 1769, "comment": "; Обслуживание модификационной клавиши [УС]." }, { "line": 1770, "comment": "; Она работает только с буквенными клавишами с кодом 40h - 5Fh." }, { "line": 1771, "comment": "; Если нажата одна из этих клавиш в сочетании с [УС], то" }, { "line": 1772, "comment": "; выдается код на 30h меньше, т.е. 00h-1Fh (управляющие коды)" }, { "line": 1773, "comment": "; Признак рус/лат на управляющие коды не влияет." }, { "line": 1774, "op": "mov", "addr": "FF10", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l" }, { "line": 1775, "op": "cpi", "addr": "FF11", "bytes": "FE 40", "chars": ".@", "arg1": "40h" }, { "line": 1776, "op": "jm", "addr": "FF13", "bytes": "FA 3F FF", "chars": ".?.", "arg1": "not_press_us_ss", "comment": "; Не буква -> пропускаем" }, { "line": 1777, "op": "ani", "addr": "FF16", "bytes": "E6 1F", "chars": "..", "arg1": "1Fh", "comment": "; Обнуляем старшие биты" }, { "line": 1778, "op": "pop", "addr": "FF18", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 1779, "op": "ret", "addr": "FF19", "bytes": "C9", "chars": "." }, { "line": 1781, "comment": "; Режим РУС/ЛАТ: буквы переводятся в русский регистр (+20h)" }, { "line": 1782, "comment": "; Выдача кода в зависимости от состояния рус/лат" }, { "line": 1783, "comment": "; Действует только на буквенные клавиши со кодом 40h - 5Fh." }, { "line": 1784, "comment": "; Если признак рус/лат в состоянии лат (=0), то скан код = код." }, { "line": 1785, "comment": "; Если рус/лат = рус (=0FFh), то код больше от скан кода на 20h." }, { "line": 1786, "label": "rus_or_lat", "addr": "FF1A", "comment": "; FF1A" }, { "line": 1787, "op": "lda", "addr": "FF1A", "bytes": "3A 06 76", "chars": ":.v", "arg1": "ruslat_flag" }, { "line": 1788, "op": "ora", "addr": "FF1D", "bytes": "B7", "chars": ".", "arg1": "a" }, { "line": 1789, "op": "jz", "addr": "FF1E", "bytes": "CA 2A FF", "chars": ".*.", "arg1": "scan_ss", "comment": "; ЛАТ -> без изменений" }, { "line": 1790, "op": "mov", "addr": "FF21", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l" }, { "line": 1791, "op": "cpi", "addr": "FF22", "bytes": "FE 40", "chars": ".@", "arg1": "40h" }, { "line": 1792, "op": "jm", "addr": "FF24", "bytes": "FA 2A FF", "chars": ".*.", "arg1": "scan_ss", "comment": "; Не буква -> без изменений" }, { "line": 1793, "op": "ori", "addr": "FF27", "bytes": "F6 20", "chars": ". ", "arg1": "20h", "comment": "; Перевод в русский регистр" }, { "line": 1794, "op": "mov", "addr": "FF29", "bytes": "6F", "chars": "o", "arg1": "l", "arg2": "a" }, { "line": 1796, "comment": "; Клавиша [СС]: буквы меняют раскладку, символы - верхний/нижний регистр" }, { "line": 1797, "comment": "; Обслуживание модификационной клавиши [СС]." }, { "line": 1798, "comment": "; Действие клавиши зависит от назначения (кода) клавиши." }, { "line": 1799, "comment": "; Буквенные клавиши меняют раскладку рус <-> лат" }, { "line": 1800, "comment": "; Символьные и цифровые клавиши выдают один из 2-х символов" }, { "line": 1801, "comment": "; которые она обозначает." }, { "line": 1802, "label": "scan_ss", "addr": "FF2A", "comment": "; FF2A" }, { "line": 1803, "op": "mov", "addr": "FF2A", "bytes": "7C", "chars": "|", "arg1": "a", "arg2": "h" }, { "line": 1804, "op": "ani", "addr": "FF2B", "bytes": "E6 20", "chars": ". ", "arg1": "20h", "comment": "; [СС] нажата?" }, { "line": 1805, "op": "jnz", "addr": "FF2D", "bytes": "C2 3F FF", "chars": ".?.", "arg1": "not_press_us_ss", "comment": "; Нет -> выход" }, { "line": 1806, "op": "mov", "addr": "FF30", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l" }, { "line": 1807, "op": "cpi", "addr": "FF31", "bytes": "FE 40", "chars": ".@", "arg1": "40h" }, { "line": 1808, "op": "jm", "addr": "FF33", "bytes": "FA 3B FF", "chars": ".;.", "arg1": "not_pressed_ss", "comment": "; Символ/цифра" }, { "line": 1809, "op": "mov", "addr": "FF36", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l" }, { "line": 1810, "op": "xri", "addr": "FF37", "bytes": "EE 20", "chars": ". ", "arg1": "20h", "comment": "; Буква: лат <-> рус" }, { "line": 1811, "op": "pop", "addr": "FF39", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 1812, "op": "ret", "addr": "FF3A", "bytes": "C9", "chars": "." }, { "line": 1814, "comment": "; Если модификационные клавиши УС и СС не нажаты" }, { "line": 1815, "label": "not_pressed_ss", "addr": "FF3B", "comment": "; FF3B" }, { "line": 1816, "op": "mov", "addr": "FF3B", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l", "comment": "; Цифры/символы: сбрасываем бит" }, { "line": 1817, "op": "ani", "addr": "FF3C", "bytes": "E6 2F", "chars": "./", "arg1": "2Fh" }, { "line": 1818, "op": "mov", "addr": "FF3E", "bytes": "6F", "chars": "o", "arg1": "l", "arg2": "a" }, { "line": 1820, "comment": "; Модификаторы не нажаты" }, { "line": 1821, "label": "not_press_us_ss", "addr": "FF3F", "comment": "; FF3F" }, { "line": 1822, "op": "mov", "addr": "FF3F", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l" }, { "line": 1823, "op": "cpi", "addr": "FF40", "bytes": "FE 40", "chars": ".@", "arg1": "40h", "comment": "; Буква?" }, { "line": 1824, "op": "pop", "addr": "FF42", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 1825, "op": "rp", "addr": "FF43", "bytes": "F0", "chars": ".", "comment": "; Да -> выход" }, { "line": 1827, "comment": "; Если модификационные клавиши УС и СС не нажаты" }, { "line": 1828, "comment": "; Обработка цифровых и символьных клавиш." }, { "line": 1829, "op": "push", "addr": "FF44", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 1830, "op": "mov", "addr": "FF45", "bytes": "6F", "chars": "o", "arg1": "l", "arg2": "a", "comment": "; сохранить код в L" }, { "line": 1831, "op": "ani", "addr": "FF46", "bytes": "E6 0F", "chars": "..", "arg1": "0Fh", "comment": "; сбрасываем ненужные биты" }, { "line": 1832, "op": "cpi", "addr": "FF48", "bytes": "FE 0C", "chars": "..", "arg1": "0Ch", "comment": "; для клавиш с кодом" }, { "line": 1833, "op": "mov", "addr": "FF4A", "bytes": "7D", "chars": "}", "arg1": "a", "arg2": "l", "comment": "; 20h - 2Ch и 30h - 3Ch" }, { "line": 1834, "op": "jm", "addr": "FF4B", "bytes": "FA 50 FF", "chars": ".P.", "arg1": "not_high", "comment": "; меняются местами" }, { "line": 1835, "op": "xri", "addr": "FF4E", "bytes": "EE 10", "chars": "..", "arg1": "10h" }, { "line": 1837, "label": "not_high", "addr": "FF50", "comment": "; FF50" }, { "line": 1838, "op": "pop", "addr": "FF50", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 1839, "op": "ret", "addr": "FF51", "bytes": "C9", "chars": "." }, { "line": 1841, "comment": ";============================================================================" }, { "line": 1842, "comment": "; Определение верхней границы свободной памяти." }, { "line": 1843, "comment": "; Используется для программ с большими буферами (например, текстовых)." }, { "line": 1844, "comment": "; Если в ОЗУ необходимо разместить какую либо программу (резидентную или" }, { "line": 1845, "comment": "; драйвер), ее размещают в верхней области (ниже служебной области Монитора)," }, { "line": 1846, "comment": "; а границу верхней свободной памяти устанавливают на байт ниже." }, { "line": 1847, "comment": "; Это предотвратит затирание кода программы растущим буфером." }, { "line": 1848, "comment": ";============================================================================" }, { "line": 1849, "label": "entry_getlim", "addr": "FF52", "comment": "; FF52" }, { "line": 1850, "op": "lhld", "addr": "FF52", "bytes": "2A 31 76", "chars": "*1v", "arg1": "memory_limit" }, { "line": 1851, "op": "ret", "addr": "FF55", "bytes": "C9", "chars": "." }, { "line": 1853, "comment": ";----------------------------------------------------------------------------" }, { "line": 1854, "comment": "; Установка верхней границы свободной памяти" }, { "line": 1855, "comment": ";----------------------------------------------------------------------------" }, { "line": 1856, "label": "entry_setlim", "addr": "FF56", "comment": "; FF56" }, { "line": 1857, "op": "shld", "addr": "FF56", "bytes": "22 31 76", "chars": "\"1v", "arg1": "memory_limit" }, { "line": 1858, "op": "ret", "addr": "FF59", "bytes": "C9", "chars": "." }, { "line": 1860, "comment": ";============================================================================" }, { "line": 1861, "comment": "; Строковые константы (завершаются нулевым байтом)" }, { "line": 1862, "comment": ";============================================================================" }, { "line": 1864, "comment": "; Начальное сообщение при включении" }, { "line": 1865, "label": "radio_prompt", "op": "db", "addr": "FF5A", "bytes": "1F 72 61 64 69 6F 2D 38 36 72 6B 00", "chars": ".radio-86rk.", "data": "1Fh, \"radio-86rk\", 0", "comment": "; FF5A" }, { "line": 1867, "comment": "; Промт: готовность к вводу команды" }, { "line": 1868, "label": "prompt", "op": "dw", "addr": "FF66", "bytes": "0D 0A", "chars": "..", "data": "0A0Dh", "comment": "; FF66" }, { "line": 1869, "op": "db", "addr": "FF68", "bytes": "2D 2D 3E 00", "chars": "-->.", "data": "\"-->\", 0" }, { "line": 1871, "comment": "; Отступ для вывода адреса с новой строки (ВК, ПС, 4x стрелка вправо)" }, { "line": 1872, "label": "next_line_prefix", "op": "dw", "addr": "FF6C", "bytes": "0D 0A", "chars": "..", "data": "0A0Dh", "comment": "; FF6C" }, { "line": 1873, "op": "db", "addr": "FF6E", "bytes": "18 18 18 18 00", "chars": ".....", "data": "18h, 18h, 18h, 18h, 0" }, { "line": 1875, "comment": "; Имена регистров для команды X (с возвратом курсора на 6 строк вверх)" }, { "line": 1876, "label": "registers", "op": "dw", "addr": "FF73", "bytes": "0D 0A", "chars": "..", "data": "0A0Dh", "comment": "; FF73" }, { "line": 1877, "op": "db", "addr": "FF75", "bytes": "20 50 43 2D", "chars": " PC-", "data": "\" PC-\"" }, { "line": 1878, "op": "dw", "addr": "FF79", "bytes": "0D 0A", "chars": "..", "data": "0A0Dh" }, { "line": 1879, "op": "db", "addr": "FF7B", "bytes": "20 48 4C 2D", "chars": " HL-", "data": "\" HL-\"" }, { "line": 1880, "op": "dw", "addr": "FF7F", "bytes": "0D 0A", "chars": "..", "data": "0A0Dh" }, { "line": 1881, "op": "db", "addr": "FF81", "bytes": "20 42 43 2D", "chars": " BC-", "data": "\" BC-\"" }, { "line": 1882, "op": "dw", "addr": "FF85", "bytes": "0D 0A", "chars": "..", "data": "0A0Dh" }, { "line": 1883, "op": "db", "addr": "FF87", "bytes": "20 44 45 2D", "chars": " DE-", "data": "\" DE-\"" }, { "line": 1884, "op": "dw", "addr": "FF8B", "bytes": "0D 0A", "chars": "..", "data": "0A0Dh" }, { "line": 1885, "op": "db", "addr": "FF8D", "bytes": "20 53 50 2D", "chars": " SP-", "data": "\" SP-\"" }, { "line": 1886, "op": "dw", "addr": "FF91", "bytes": "0D 0A", "chars": "..", "data": "0A0Dh" }, { "line": 1887, "op": "db", "addr": "FF93", "bytes": "20 41 46 2D", "chars": " AF-", "data": "\" AF-\"" }, { "line": 1888, "op": "db", "addr": "FF97", "bytes": "19 19 19 19 19 19 00", "chars": ".......", "data": "19h, 19h, 19h, 19h, 19h, 19h, 0" }, { "line": 1890, "comment": "; Затирание предыдущего символа (backspace, пробел, backspace)" }, { "line": 1891, "label": "back_clear", "op": "db", "addr": "FF9E", "bytes": "08 20 08 00", "chars": ". ..", "data": "8, 20h, 8, 0", "comment": "; FF9E" }, { "line": 1893, "comment": ";============================================================================" }, { "line": 1894, "comment": "; Адрес возврата из отлаживаемой программы." }, { "line": 1895, "comment": "; Выполняется при срабатывании RST 6, установленной командой G." }, { "line": 1896, "comment": "; Сохраняет регистры в служебных ячейках (доступны по команде X)" }, { "line": 1897, "comment": "; и выводит на экран адрес останова." }, { "line": 1898, "comment": "; Содержимое регистров сохраняется в служебных ячейках Монитора." }, { "line": 1899, "comment": "; В последствии его можно просмотреть командой X Монитора." }, { "line": 1900, "comment": "; На экран выдается адрес останова. И управление передается на" }, { "line": 1901, "comment": "; \"горячий\" старт Монитора (prompt_loop)." }, { "line": 1902, "comment": ";============================================================================" }, { "line": 1903, "label": "return_address", "addr": "FFA2", "comment": "; FFA2" }, { "line": 1904, "op": "shld", "addr": "FFA2", "bytes": "22 16 76", "chars": "\".v", "arg1": "hl_storage" }, { "line": 1905, "op": "push", "addr": "FFA5", "bytes": "F5", "chars": ".", "arg1": "psw" }, { "line": 1906, "op": "pop", "addr": "FFA6", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 1907, "op": "shld", "addr": "FFA7", "bytes": "22 1E 76", "chars": "\".v", "arg1": "af_storage" }, { "line": 1909, "comment": "; Реальный адрес останова (из стека, на 1 больше из-за RST 6)" }, { "line": 1910, "comment": "; Возвращаем из стека реальный адрес останова, он может отличаться от" }, { "line": 1911, "comment": "; указанного в команде G. Он сохраняется в стеке, поскольку мы" }, { "line": 1912, "comment": "; используем команду RST 6, и больше на 1." }, { "line": 1913, "op": "pop", "addr": "FFAA", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 1914, "op": "dcx", "addr": "FFAB", "bytes": "2B", "chars": "+", "arg1": "h" }, { "line": 1915, "op": "shld", "addr": "FFAC", "bytes": "22 14 76", "chars": "\".v", "arg1": "pc_storage" }, { "line": 1917, "comment": "; Сохраняем остальные регистры через SP" }, { "line": 1918, "comment": "; Через HL получаем значение указателя стека и используя последний" }, { "line": 1919, "comment": "; сохраняем значения всех остальных регистров" }, { "line": 1920, "op": "lxi", "addr": "FFAF", "bytes": "21 00 00", "chars": "!..", "arg1": "h", "arg2": "0" }, { "line": 1921, "op": "dad", "addr": "FFB2", "bytes": "39", "chars": "9", "arg1": "sp" }, { "line": 1922, "op": "lxi", "addr": "FFB3", "bytes": "31 1E 76", "chars": "1.v", "arg1": "sp", "arg2": "sp_storage+2" }, { "line": 1923, "op": "push", "addr": "FFB6", "bytes": "E5", "chars": ".", "arg1": "h", "comment": "; SP" }, { "line": 1924, "op": "push", "addr": "FFB7", "bytes": "D5", "chars": ".", "arg1": "d", "comment": "; DE" }, { "line": 1925, "op": "push", "addr": "FFB8", "bytes": "C5", "chars": ".", "arg1": "b", "comment": "; BC" }, { "line": 1927, "op": "lhld", "addr": "FFB9", "bytes": "2A 14 76", "chars": "*.v", "arg1": "pc_storage" }, { "line": 1928, "op": "lxi", "addr": "FFBC", "bytes": "31 CF 76", "chars": "1.v", "arg1": "sp", "arg2": "stack_bottom" }, { "line": 1929, "op": "call", "addr": "FFBF", "bytes": "CD 78 FB", "chars": ".x.", "arg1": "print_addr_from_hl", "comment": "; Выводим адрес останова" }, { "line": 1931, "comment": "; Проверяем: совпадает ли реальный адрес с заданным в команде G?" }, { "line": 1932, "comment": "; Если они равны, восстанавливаем значение байта по этому адресу," }, { "line": 1933, "comment": "; сохраненное ранее командой G." }, { "line": 1934, "op": "xchg", "addr": "FFC2", "bytes": "EB", "chars": "." }, { "line": 1935, "op": "lhld", "addr": "FFC3", "bytes": "2A 23 76", "chars": "*#v", "arg1": "stop_addr" }, { "line": 1936, "op": "call", "addr": "FFC6", "bytes": "CD 90 F9", "chars": "...", "arg1": "cmp_hl_de" }, { "line": 1937, "op": "jnz", "addr": "FFC9", "bytes": "C2 6C F8", "chars": ".l.", "arg1": "prompt_loop", "comment": "; Не совпадает -> промт" }, { "line": 1939, "comment": "; Восстанавливаем байт по адресу останова" }, { "line": 1940, "op": "lda", "addr": "FFCC", "bytes": "3A 25 76", "chars": ":%v", "arg1": "stop_addr_value" }, { "line": 1941, "op": "mov", "addr": "FFCF", "bytes": "77", "chars": "w", "arg1": "m", "arg2": "a" }, { "line": 1942, "op": "jmp", "addr": "FFD0", "bytes": "C3 6C F8", "chars": ".l.", "arg1": "prompt_loop" }, { "line": 1944, "comment": ";============================================================================" }, { "line": 1945, "comment": "; Команда X. Просмотр и изменение регистров процессора." }, { "line": 1946, "comment": "; Выводит содержимое регистровых пар (PC, HL, BC, DE, SP, AF)" }, { "line": 1947, "comment": "; из служебных ячеек с возможностью изменения." }, { "line": 1948, "comment": ";============================================================================" }, { "line": 1949, "label": "print_regs", "addr": "FFD3", "comment": "; FFD3" }, { "line": 1950, "op": "lxi", "addr": "FFD3", "bytes": "21 73 FF", "chars": "!s.", "arg1": "h", "arg2": "registers" }, { "line": 1951, "op": "call", "addr": "FFD6", "bytes": "CD 22 F9", "chars": ".\".", "arg1": "entry_puts" }, { "line": 1952, "op": "lxi", "addr": "FFD9", "bytes": "21 14 76", "chars": "!.v", "arg1": "h", "arg2": "pc_storage" }, { "line": 1953, "op": "mvi", "addr": "FFDC", "bytes": "06 06", "chars": "..", "arg1": "b", "arg2": "6", "comment": "; 6 регистровых пар" }, { "line": 1955, "label": "print_regs_loop", "addr": "FFDE", "comment": "; FFDE" }, { "line": 1956, "op": "mov", "addr": "FFDE", "bytes": "5E", "chars": "^", "arg1": "e", "arg2": "m", "comment": "; Содержимое" }, { "line": 1957, "op": "inx", "addr": "FFDF", "bytes": "23", "chars": "#", "arg1": "h", "comment": "; регистровой пары" }, { "line": 1958, "op": "mov", "addr": "FFE0", "bytes": "56", "chars": "V", "arg1": "d", "arg2": "m", "comment": "; в DE" }, { "line": 1959, "op": "push", "addr": "FFE1", "bytes": "C5", "chars": ".", "arg1": "b" }, { "line": 1960, "op": "push", "addr": "FFE2", "bytes": "E5", "chars": ".", "arg1": "h" }, { "line": 1961, "op": "xchg", "addr": "FFE3", "bytes": "EB", "chars": "." }, { "line": 1962, "op": "call", "addr": "FFE4", "bytes": "CD 78 FB", "chars": ".x.", "arg1": "print_addr_from_hl", "comment": "; Выводим значение" }, { "line": 1963, "op": "call", "addr": "FFE7", "bytes": "CD EE F8", "chars": "...", "arg1": "input_string", "comment": "; Ввод нового значения" }, { "line": 1964, "op": "jnc", "addr": "FFEA", "bytes": "D2 F6 FF", "chars": "...", "arg1": "regs_not_changed", "comment": "; Ничего не введено" }, { "line": 1966, "op": "call", "addr": "FFED", "bytes": "CD 5A F9", "chars": ".Z.", "arg1": "parse_hex", "comment": "; Новое значение в HL" }, { "line": 1967, "op": "pop", "addr": "FFF0", "bytes": "D1", "chars": ".", "arg1": "d" }, { "line": 1968, "op": "push", "addr": "FFF1", "bytes": "D5", "chars": ".", "arg1": "d" }, { "line": 1969, "op": "xchg", "addr": "FFF2", "bytes": "EB", "chars": "." }, { "line": 1970, "op": "mov", "addr": "FFF3", "bytes": "72", "chars": "r", "arg1": "m", "arg2": "d", "comment": "; Сохраняем" }, { "line": 1971, "op": "dcx", "addr": "FFF4", "bytes": "2B", "chars": "+", "arg1": "h" }, { "line": 1972, "op": "mov", "addr": "FFF5", "bytes": "73", "chars": "s", "arg1": "m", "arg2": "e" }, { "line": 1974, "label": "regs_not_changed", "addr": "FFF6", "comment": "; FFF6" }, { "line": 1975, "op": "pop", "addr": "FFF6", "bytes": "E1", "chars": ".", "arg1": "h" }, { "line": 1976, "op": "pop", "addr": "FFF7", "bytes": "C1", "chars": ".", "arg1": "b" }, { "line": 1977, "op": "dcr", "addr": "FFF8", "bytes": "05", "chars": ".", "arg1": "b" }, { "line": 1978, "op": "inx", "addr": "FFF9", "bytes": "23", "chars": "#", "arg1": "h" }, { "line": 1979, "op": "jnz", "addr": "FFFA", "bytes": "C2 DE FF", "chars": "...", "arg1": "print_regs_loop" }, { "line": 1980, "op": "ret", "addr": "FFFD", "bytes": "C9", "chars": "." }, { "line": 1982, "comment": ";----------------------------------------------------------------------------" }, { "line": 1983, "comment": "; Неиспользуемые 2 байта в конце ПЗУ." }, { "line": 1984, "comment": "; В журнале \"Радио\" №8 1986г.: FFFFh" }, { "line": 1985, "comment": "; В книге \"Домашний компьютер\" МРБ: 89BBh" }, { "line": 1986, "comment": ";----------------------------------------------------------------------------" }, { "line": 1987, "op": "dw", "addr": "FFFE", "bytes": "FF FF", "chars": "..", "data": "0FFFFh" }, { "line": 1989, "op": "end" } ], "symbols": { "AF_STORAGE": "761E", "AP2_BYTE_1": "FD65", "AP2_BYTE_2": "FD73", "AP2_MOVE_X_LOOP": "FCDD", "AP2_MOVE_Y_LOOP": "FD77", "AP2_NOT_FOUND": "FCEE", "AP2_SEQ": "7604", "AP2_SEQ_START": "FD9E", "BACK_CLEAR": "FF9E", "BACK_KBD_BUF": "F8DC", "BC_STORAGE": "7618", "BEEP": "05F0", "BOUNCE": "0015", "CARRAGE_RETURN": "FDF3", "CARRAGE_RETURN_BORROW": "FDF9", "CHANGE_LOOP": "FBBF", "CHECK_BIT_COUNT": "FC0B", "CHECK_PRESS_F4": "F9A4", "CHECKSUM_LOOP": "FB19", "CHKSUM": "F82A", "CLEAR_SCREEN": "FDA3", "CLEAR_SCREEN_LOOP": "FDA9", "CMD_C": "F9D7", "CMD_C_EQUAL": "F9E6", "CMD_D": "F9C5", "CMD_D_LOOP": "F9C8", "CMD_F": "F9ED", "CMD_G": "FA3F", "CMD_G_RUN": "FA5A", "CMD_I": "FA86", "CMD_I_CR": "FA91", "CMD_L": "FA08", "CMD_L_CHAR": "FA17", "CMD_L_LOOP": "FA0B", "CMD_L_PERIOD": "FA15", "CMD_M": "FA26", "CMD_M_NEXT": "FA3B", "CMD_O": "FB2D", "CMD_O_NO_CHANGE": "FB35", "CMD_PARAMETER_1": "7627", "CMD_PARAMETER_2": "7629", "CMD_PARAMETER_3": "762B", "CMD_R": "FA68", "CMD_R_LOOP": "FA6D", "CMD_S": "F9F4", "CMD_T": "F9FF", "CMP_HL_DE": "F990", "CMP_HL_DE_END": "F9A2", "CMP_HL_DE_LOOP": "F999", "CMP_HL_DE_RET": "F99F", "CONST_READ": "002A", "CONST_WRITE": "001D", "CURC": "F821", "CURSOR_ADDR": "7600", "CURSOR_HOME": "FDB2", "CURSOR_XY": "7602", "DE_STORAGE": "761A", "END_OF_ADDR_OR_F4": "F996", "ENTRY_CHKSUM": "FB16", "ENTRY_CURC": "FA7F", "ENTRY_GETC": "FE63", "ENTRY_GETLIM": "FF52", "ENTRY_GETXY": "FA7B", "ENTRY_HEXB": "FCA5", "ENTRY_INPB": "FB98", "ENTRY_INPBLOCK": "FAB6", "ENTRY_KBHIT": "FE01", "ENTRY_KBHIT_EXIT": "FE22", "ENTRY_OUTB": "FC46", "ENTRY_OUTBLOCK": "FB49", "ENTRY_PUTC": "FCBA", "ENTRY_PUTS": "F922", "ENTRY_SCAN_KBD": "FE72", "ENTRY_SETLIM": "FF56", "ENTRY_START": "F836", "ENTRY_VIDEO": "FACE", "EXT_F000": "F000", "FAST_KBD_CONTRL": "FE7D", "FIRST_KB_DELAY": "00E0", "GETC": "F803", "GETLIM": "F830", "GETXY": "F81E", "HEXB": "F815", "HEXB_MAKE_CHAR": "FCB7", "HEXB_NIBBLE": "FCAE", "HL_STORAGE": "7616", "INPB": "F806", "INPBLOCK": "F824", "INPUT_BC": "FAFF", "INPUT_BC_NO_SYNC": "FAFD", "INPUT_NEXT": "F8F1", "INPUT_STRING": "F8EE", "INPUT_STRING_END": "F91A", "INPUT_TIMEOUT": "FC34", "INVERT_POLARITY": "FBFF", "JUMP_TO_GO": "7626", "KB_CLICK": "5003", "KBD_BUF": "7633", "KBD_BUF_LOOP": "F8F3", "KBHIT": "F812", "KEY_IS_PRESSED": "FE97", "KEY_NOT_PRESS": "FEAF", "KEYBOARD_FIRST_PRESS": "FE4C", "KEYBOARD_REPEAT": "7609", "KEYBOARD_RETENTION": "FE2A", "MAKE_0_COLUMN": "FEF3", "MAKE_1_COLUMN": "FEFA", "MEMORY_LIMIT": "7631", "MEMORY_TOP": "75FF", "MONITOR_AREA": "7600", "MONITOR_AREA_END": "765F", "MOVE_DOWN": "FDC5", "MOVE_DOWN_SKIP": "FDD3", "MOVE_LEFT": "FDD6", "MOVE_RIGHT": "FDB9", "MOVE_UP": "FDE2", "MOVE_UP_SKIP": "FDF0", "NEW_LINE": "FD47", "NEXT_BIT": "FBB7", "NEXT_LINE_PREFIX": "FF6C", "NORMAL_DELAY": "FBDC", "NOT_HIGH": "FF50", "NOT_LAST_BIT": "FC7A", "NOT_PR_EXIT": "FE21", "NOT_PRESS_US_SS": "FF3F", "NOT_PRESSED_SS": "FF3B", "NUM_KBD_LOOP": "FEC3", "OUT_ADDR_FROM_HL": "FB90", "OUT_BIT_LOOP1": "FC66", "OUT_BITE_LOOP2": "FC7B", "OUT_BLOCK_LOOP": "FB86", "OUT_NEXT_BIT": "FC58", "OUTB": "F80C", "OUTBLOCK": "F827", "PARAM_2_PRESENT": "762D", "PARSE_HEX": "F95A", "PARSE_HEX_CHAR": "F982", "PARSE_HEX_END": "F98E", "PARSE_HEX_LOOP": "F95D", "PARSE_PARAM": "F92C", "PC_STORAGE": "7614", "PRESSED_KEY": "7605", "PRINT_ADDR_FROM_HL": "FB78", "PRINT_CHAR": "FD38", "PRINT_ERROR": "FAAE", "PRINT_HEX_BYTE_AND_SPACE": "F9BA", "PRINT_HEX_MEM_AND_SPACE": "F9B9", "PRINT_NEXT_LINE_PREFIX": "F9B0", "PRINT_REGS": "FFD3", "PRINT_REGS_LOOP": "FFDE", "PROCESS_RUSLAT": "FE51", "PROMPT": "FF66", "PROMPT_LOOP": "F86C", "PUTC": "F809", "PUTC_FROM_A": "FCB9", "PUTS": "F818", "RADIO_PROMPT": "FF5A", "READ_BLOCK": "FB0A", "READ_DELAY_LOOP": "FBDD", "REGISTERS": "FF73", "REGS_NOT_CHANGED": "FFF6", "REGULAR_KB_DELAY": "0040", "RELEASE_RUSLAT": "FE1A", "RELEASED": "760B", "RESET_AP2_SEQ": "FCE9", "RESTORE_RET": "FCA1", "RETURN_ADDRESS": "FFA2", "RST_6_ADDR": "0030", "RUS_OR_LAT": "FF1A", "RUSLAT_FLAG": "7606", "RUSLAT_NOT_PRESSED": "FE0E", "SCAN_BOUN_LOOP": "FEB5", "SCAN_BOUNCE": "FEB3", "SCAN_KBD": "F81B", "SCAN_KBD_LOOP": "FE9C", "SCAN_OTHERS": "FF06", "SCAN_SS": "FF2A", "SCAN_TABLE": "FEFE", "SCROLL_LOOP": "FD58", "SEEK_CHANGE": "FB9C", "SET_BIT_COUNT": "FC09", "SET_CURSOR_AND_EXIT": "FD85", "SETLIM": "F833", "SOUND": "FD27", "SOUND_OFF_LOOP": "FD2E", "SOUND_ON_LOOP": "FD28", "SP_STORAGE": "761C", "STACK_BOTTOM": "76CF", "START": "F800", "STOP_ADDR": "7623", "STOP_ADDR_VALUE": "7625", "SYNC_BYTE": "00E6", "TABLE_COLUMN_0": "FEEA", "TABLE_COLUMN_1": "FEE2", "TAPE_POLARITY": "762E", "TAPE_READ_CONST": "762F", "TAPE_WRITE_CONST": "7630", "TEMP": "F80F", "TEMP_SP": "760D", "UPDATE_AP2_AND_EXIT": "FCEA", "VG75_CMD_REG": "C001", "VG75_PARAMS": "C000", "VIDEO": "F82D", "VIDEO_MEM_SIZE": "0924", "VIDEO_MEMORY": "76D0", "VIDEO_MEMORY_END": "7FF4", "VT57_CH2_ADDR": "E004", "VT57_CH2_CTRL": "E005", "VT57_MODE": "E008", "VV55_CTRL": "8003", "VV55_D14_CTRL": "A003", "VV55_D14_PORT_A": "A000", "VV55_D14_PORT_B": "A001", "VV55_D14_PORT_C": "A002", "VV55_PORT_A": "8000", "VV55_PORT_B": "8001", "VV55_PORT_C": "8002", "WAIT_FRAME_START": "FAE1", "ZERO_BLOCK_LOOP": "FB4D" }, "map": { "sections": [ { "start": "F800", "end": "FFFF", "size": 2048 } ], "total": 2048 } }