DEVICE ZXSPECTRUM128 INCLUDE "!AllConst.asm" INCLUDE "!ram8.asm" ORG #0000 ;#0000 rst #00 запись байта в память пользователя ;#0006 переход на обработку входа в монитор по NMI/rst 8 ;#0008 rst #08 печать сообщения по номеру в BC ;#000B переход в другой rom ;#000D обработка NMI при активной rom2 ;#0010 rst #10 печать символа в окне ;*not used* #0013 ds 2 ;#0015 вход по rst #08 из basic 48k ;#0018 rst #18 вызов п/п Tr-Dos ;#001B для проверки размера ПЗУ ;#001E вход при включении/reset ;#0020 rst #20 печать строки ;*not used* #0023 ds 3 ;#0026 вход по rst #08 из basic 128k ;#0028 rst #28 чтение байта из памяти пользователя ;*not used* #002D обработка входа в монитор по NMI/rst 8 ;#0030 rst #30 вызов п/п из другого rom ;*not used* #0033 ds 2 ;*not used* #0035 обработка входа в монитор по NMI/rst 8 ;#0038 rst #38 переход на обработку прерываний im 1 ;#003B вход при включении/reset ;#0092 обработка прерываний im 1 ;#009C обработка NMI при активной странице монитора ;#00B6 вход в монитор по NMI/rst 8 ;#00F1 переменные различного характера ;#0101 номер текущего rom ;#0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) ;#0110 Таблица переходов ПрофПЗУ ;#0114 вход в монитор по rst #08 ;#0116 вызов п/п по адресу в BC с задержкой call (bc) ;#011D вход в монитор по кнопке NMI ;#013A выход из монитора ;#0167 вход в монитор по rst #08 ;#01F5 вызов функции rst #08 ;#0241 пауза 26698t ;#024C установка номера дисковода ;#025E определение наличия Турбои и оригинальности (колво тактов) ;#02A5 печать сообщения по номеру в BC ;#02AA rst 8: db #8B загрузка zs-snap с диска (без возврата) ;#02AE rst 8: db #8D хрень какая-то непонятная ;#02CC rst 8: db #8C автостарт с дискеты ;#02D1 установка двойной скорости (rst 8: db #87) ;#02D7 установка обычной скорости (rst 8: db #88) ;не используется??? #02EB rst 8: db #8A вызов п/п работы с графическим курсором !!!ОШИБКА!!! ;#02F4 rst 8: db #81 вызов функции R8DOS ;#0310 сохранение регистров для основной программы ;#0321 работа с микросхемой CMOS (rst 8: db #89) ;#032A чтение регистров основной программы ;#0339 установка переменных монитора (rst 8: db #82) ;#035F вывод символа на экран пользователя (rst 8: db #84) ;#0368 отключение монитора - отладчика (rst 8: db #85) ;#0370 возврат в отладчик ;#0373 установка текущим блока дисководов монитора ;#0398 запись в регистр 7 AY числа #FF ;#03A7 Запись регистра AY ;#03B6 чтение регистра AY ;#03C2 восстановление содержимого регистра 7 AY ;#03CE сохранение регистров и стэка в ram 8 ;#04CE восстановление режима Турбо ;#04D5 включение Турбо-режима ;#04D9 выключение Турбо-режима ;#04E2 восстановление регистров пользователя ;#0550 сохранение экрана из страницы 5 ;#0557 вход в монитор после трассировки команды ;#055B сохранение экрана из страницы 5 ;#0581 восстановление экрана в странице 5 ;#0589 установка зеленого бордюра (индикация ошибки) ;#058E чтение/запись байта в память пользователя ;#0603 копирование памяти с #8000 в страницу пользователя ;#0606 копирование страницы пользователя в #8000 ;#0665 включение режима 48k only ;#066D повторная инициализация страниц (если битая) ;#0732 установка координат печати crdY=рег C, crdX=#24 ;#0739 копирование части закодированных процедур в ram 8 с раскодированием ;#0749 восстановление области памяти из ram 8 ;#0753 сохранение области памяти в ram 8 ;#08B7 таблица с адресами обработки функций rst 8 ;#08D3 rst 8: db #86 Копия графического экрана на принтер ;#08D7 печать текущего меню монитора ;#0911 rst 8: db #80 Вывод символа из аккумулятора на принтер ;#0922 вывод символа из аккумулятора на принтер (???по запросу от внешенего устройства???) ;#0950 вывод символа на принтер ;#0A33 проверка нажатия BREAK ;#0A51 печать экрана на принтер ;#0AD7 Команда: EXit выход из отладчика в меню ;#0AE0 печать/обновление окна отладчика ;#0AEB вызов отладчика M. Monitor ;#0AF2 полное обновление окна отладчика ;#0AFB обновление окна отладчика, без информационного окна ;#0B06 ввод и обработка команды отладчика ;#0C98 чтение числового операнда из строки команды ;#0D3E проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) ;#0D42 проверка символа в (hl) #20/#2C/#3B/#00/#0D ;#0D46 проверка символа в (hl) #2C/#3B/#00/#0D ;#0D55 чтение из строки команды чилового/байта строкового значения ;#0DEC таблица префиксов и основания систем счислений ;#0DF4 преобразование строки в число ;#0E73 деление bc=hl/de с проверкой de на ноль ;#0E85 умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) ;#0EBA выделение из строки числовых операндов (не более 6) ;#0EE3 поиск в буфере ввода строки первого печатного символа ;#0EE6 поиск в строке первого печатного символа ;#0EF0 поиск заданной команды в списке ;#0F91 названия регистров для монитора ;#0FA0 названия регистров для монитора ;#1037 инициализация системы и чтение настроек Autoconfig ;#1101 редактирование дампа памяти в окне монитора ;#1107 таблица мнемоник ;#1196 операнды/флаги ассемблера ;#11F7 мнемоники ассемблера ;#12D2 таблица для формирования команд дизасма ;#14B2 таблица для формирования команд дизасма ;#14F6 проверка значения аккумулятора ;#14FD проверка значения аккумулятора ;#1504 проверка значения аккумулятора ;#150B проверка значения аккумулятора ;#1512 печать команды ассемблера ;#1570 печать мнемоники ассемблера с пробелом на конце ;#157F печать операнда/числа команды ассемблера ;#15B3 печать сообщения из hl длиной b ;#15B9 печать сообщения из hl с заменой непечатных символов на ? ;#15C7 печать сообщения из hl ;#15D0 печать сообщения по номеру (на экран/в буфер) ;#15DB печать сообщения из hl ;#15DD печать сообщения не менее заданной длины ;#15F3 печать нескольких пробелов (в B) ;#15FA печать сообщения по номеру в A ;#15FC печать сообщения по номеру в A, не менее заданной длины в С ;#1612 печать числа в hl (dec/hex) с префиксом ;#1614 печать числа в bc (dec/hex) с префиксом ;#1626 печать числа из (hl) (dec/hex) с префиксом ;#1629 печать числа в bc (bin/oct/dec/hex) с префиксом ;#162C печать числа в заданной системе счисления ;#1658 печать числа A с предварительным пробелом ;#165E печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом ;#1661 печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом ;#1669 печать десятичного числа bc [0..65535] с ведущими пробелами ;#166E печать десятичного числа bc [0..65535] с ведущими пробелами ;#1673 печать числа bc (на экран/в буфер) ;#1677 печать числа bc (на экран/в буфер) ;#16AA деление bc=ac/de ;#16D0 печать строки (rst #20) ;#16DE печать числа hl=[#0000..#FFFF] ;#16E3 печать числа a=[#00..#FF] ;#16EC печать числа a=[#0..#F] ;#16FF исполнение зарезервированных слов анализатора st0-st9 ;#17F0 выполнение одной команды по адресу в PC ;#191E проверка попадания адреса на адреса #3D00-#3DFF ;#197F анализ команды ассемблера ;#1DD0 список команд отладчика ;#1DE5 выполнение слова анализатора ;#1E0F установка кода команды в программу анализатора ;#1E45 Команда: FLOAD track, sector, start, length ;#1E4F Команда: FSAVE track, sector, start, length ;#1E59 открытие файла для чтения/записи программы анализатора ;#1E76 Команда: DEFSave filename ;#1EA5 Команда: DEFLoad filename ;#1F25 Команда: CLear ;#1F42 Команда: ANalyser boolean ;#1F5B поиск введенного слова в словаре/программе пользователя ;#1FB0 Команда: WORD word[:] program ;#2093 Команда: EDit ;#20C8 печать редактируемого слова ;#2104 печать слова анализатора ;#2112 поиск начала и печать слова анализатора ;#2121 чтение ld bc,(hl+1): hl=hl+2 ;#2148 Команда: WORD word[:] program Продолжение (для переопределения уже определенных слов) ;#2214 Команда: PDEFinition вывод на принтер Форт - программы ;#2218 Команда: LDEFinition вывод на экран Форт - программы ;#2297 Команда: EVal word выполнить слово word ;#234D запись элемента на стэк анализатора ;#2364 установка нового значения вершины стэка анализатора ;#236A запись на стэк анализатора байта из ячейки памяти пользователя ;#2374 запись на стэк анализатора слова из ячеек памяти пользователя ;#237F чтение элемента с вершины стэка анализатора ;#2398 чтение двух элементов с вершины стэка анализатора ;#23A3 базовые слова анализатора ;#27DC список управляющих кодов ;#27E7 таблица с адресами обработки управляющих кодов ;#27FD удаление курсора и печать символа в окне ;#2800 печать символа в окне ;#28B8 восстановление экрана под курсором, если нужно (6 пикселей символ) ;#28C5 сохранение экрана под курсором (6 пикселей символ) ;#28E8 печать/удаление курсора в окне ;#28F6 мигание текстового курсора в строке ввода ;#292F расчет экранного адреса курсора в окне для символов 6 пикселей ;#2959 расчет координат курсора на экране для символов шириной 8 пикселей ;#2969 расчет адреса курсора в области атрибутов для символов 8 пикселей ;#297C расчет экранного адреса курсора в окне для символов 8 пикселей ;#298E скроллинг окна вверх ;#29D0 скроллинг строки данных окна ;#29FB скроллинг строки атрибутов окна ;#2A1B обработка управляющего кода #1E (скроллинг окна ввниз) ;#2A5B очистка окна пользователя (rst 8: db #83) ;#2A5E обработка управляющего кода #0C (очистка текущего окна) ;#2A85 очистка знакоместной строки по координатам курсора ;#2AAD обработка управляющего кода #04 (вывод с выравниванием) ;#2ABB расчет для выравнивания строки ;#2ACA печать строки из буфера с выравниваем по центру окна #05 ;#2AED печать строки из буфера с выравниваем по правому краюу окна #06 ;#2AF2 обработка байта после управляющего кода #04 ;#2B07 возврат из п/п печати символа ;#2B0B печать символа со сбросом 7го бита (rst #10) ;#2B10 печать пробела (rst #10) ;#2B12 печать символа (rst #10) ;#2B63 установка адреса п/п обработки управляющего кода ;#2B6E обработка управляющего кода #0D (возврат каретки) ;#2B7D обработка управляющего кода #0A (перевод строки) ;#2B9D установка начальных координат ;#2BA8 короткий звуковой сигнал c установкой бордюра ;#2BCA обработка управляющего кода #1B (позиционирование курсора внутри окна) ;#2BF8 обработка управляющего кода #01 (установка атрибутов) ;#2C18 обработка управляющего кода #02 (восстановление атрибутов) ;#2C1F определение турбо-режима ;#2C30 определение турбо-режима вкл/выкл ;#2C4D копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ ;не используется #2C7A чтение байта по адресу #00FB ;#2C7E поиск и вызов процедуры обработки без возврата(если не найдено возврат) ;#2C92 выполнение одной команды ассемблера с контролем ловушек ;#2CA8 печать/обновление монитора-отладчика ;#2E25 печать байта из L в двоичном виде ;#2E38 печать дампа памяти в окне ;#2E76 удаление курсора на предыдущей ячейке дампа ;#2E3D печать дампа памяти в окне ;#2EBA печать одной строки дампа памяти (8 байт) ;#2EBE печать одной строки дампа памяти (8 байт) ;#2F74 вывод дисасма памяти по адресу в de ;#2F96 анализ команды ассемблера ;#2FAC печать строки дизасма ;#2FED печать пробелов до правого края окна ;#2FF1 печать пробелов до заданной координаты X ;#2FFB установка текущим окна: ввод числа ;#3005 установка текущим окна: main menu ;#300A ix = адрес дескриптора окна монитора: вывод на принтер ;#300F чтение содержимого регистра ix основной программы ;#3014 ix = адрес дескриптора окна монитора: ввод строки низу экрана ;#3019 ix = адрес дескриптора окна монитора: дамп памяти ;#301C ix = адрес дескриптора окна монитора из hl ;#3023 ожидание действий пользователя (опрос управления, вывод часов) ;#302E ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне ;#303C выполнение команды, на которую указывает PC (cs+3) ;#303F выполнение команды, на которую указывает PC с быстрым выполнением подпрограмм (cs+4) ;#3052 заглушка входа в монитор при несовпадении контрольной суммы ;#305B блокировка работы при ошибке контрольной суммы ;#3065 установка регистров для загрузки/сохранения ;#3074 Команда: ERAse filespec ;#3085 Команда: SAVE filespec start,length ;#3095 Команда: LOAD filespec [start[,length]] ;#30D8 чтение файла в память ;#3107 запись области памяти в файл ;#3135 подсчет контрольной суммы страницы ;#3161 список команд отладчика ;#318C Команда III (работа с контроллером прерываний) ;#3194 Команда OOO (работа с контроллером прерываний) ;#319C Команда CMOS (работа с контроллером прерываний) ;#31A4 Команда RESNVRAM (что-то пишет в NVRAM) ;#31AB Команда: SLOW type автоматическая трассировка ;#31C1 Команда: LISTBreak/LBreak ;#3201 печать ON/OFF от флага nz-ON/z-OFF ;#3210 определение адреса ловушки ;#3222 восстановление памяти пользователя под всеми ловушками ;#3228 сохранение памяти пользователя под всеми ловушками и установка ловушек ;#3281 установка начала списка ловушек ;#328B проверка срабатывания ловушки ;#32AF Команда: DELBreak number ;#32E2 Команда: BRK number, [on|off] ;#3303 Команда: BREak number, type, addr, int_count[,bank] ;#330B установка ловушки #8, по текущему адресу листинга дизасма ;#3326 удаление ловушки #8 ;#3333 Команда: OPTion bit on|off ;#3360 Команда: OUT addr, data ;#336C Команда: OUTD addr, data ;#337A Команда: IND addr ;#3383 Команда: IN addr ;#3389 Команда: ?data ;#33BB установка и очистка информационного окна отладчика ;#33CD печать информационного окна отладчика ;#33D2 Команда: SHow ;#3432 Команда: BASE 0|2|8|10|16 ;#344F Команда: WORKspace addr ;#3461 Команда: SEarch addr_st, addr_end, bank, data ;#346A Команда: FINd addr_st, addr_end, data ;#3517 продолжение поиска в отладчике (для команд FIND/SEARCH) ;#352F Команда: MOVe addr_st1, addr_fin1, addr_st2 [,bank] ;#356F Команда: CHeck addr_st1, addr_fin1, addr_st2 [,bank] ;#35D3 сравнение ix=xE075 ;#35E0 сохранение переменной с состоянием портов #1FFD/#7FFD пользователя ;#35F5 Команда: FILl addr_st, addr_end, byte [,bank] ;#360D Команда: DATA addr, data ;#3614 Команда: .PC data ;#361E Команда: .data ;#3640 pop de со стэка пользователя ;#364D Команда: POP ;#3655 переход на адрес, содержащийся в команде, расположенный в текущей ячейке памяти ;#365C Команда: MEMory addr ;#3662 Команда: EXX ;#3666 Команда: EX AF ;#3683 Команда: INTerrupt on|off ;#3699 Команда: CALl [[addr],bank] ;#36B4 Команда: Jump [[addr],bank] ;#36C3 запись стандартного Magic-файла ;#36DB Команда: ROM bank ;#36F9 получение номера логической страницы пользователя a=[#0..#F] ;#3707 сравнение страницы пользователя с заданной ;#370C Команда: RAM ;#3713 если параметр задан, установка страницы пользователя равной номеру страницы в HL ;#371D установка страницы пользователя равной номеру страницы в HL ;#3732 установка страницы пользователя равной номеру страницы в L ;#3778 Команда: SCReen [on|off|5|7] ;#37B9 управление выводиммым листингом (опрос клавиш space, s, cs+1) ;#3807 пауза 40416t ;#382E ожидание отжатия всех клавиш ;#3837 копирование блока памяти в ram 8 с раскодированием ;не используется #385D не используется ;не используется #3860 не используется ;#3870 печать сообщения и продолжение работы текущего меню монитора ;#3884 получить адрес, на который ссылается команда ассемблера ;#38D8 быстрый вход в команду DASM ;#38E2 Команда: DASm вывод листинга дизасма ;#39A8 Печать одной строки листинга дизасма ;#39EB Команда: LCATalogue [num_drive] ;#39EF Команда: CATalogue [num_drive] ;#3A10 Команда: PUSH data ;#3A14 запись de на стэк пользователя ;#3A21 копирование активного экрана пользователя в #4000 ;#3A4E восстановление переменной с состоянием портов #1FFD/#7FFD пользователя ;#3A57 Команда: LDISs [addr_st[,addr_end]] реассемблирование блока памяти на принтер. ;#3A60 Команда: DISs [addr_st [,addr_end]] реассемблирование блока памяти с адреса addr_st по addr_end включительно ;#3A68 Команда: LDUmp [addr_st[,addr_end]] ;#3A71 Команда: DUmp [addr_st[,addr_end]] ;#3A93 вызов п/п по адресу в bc - call (bc) ;#3A95 подготовка переменных к выводу на экран/принтер ;#3AC8 Команда: VList ;#3AD0 Команда: Help ;#3AF9 вызов п/п по адресу в de - call (de) ;#3AFB печать команды отладчика ;#3B55 Команда: IM ;#3B75 определение типа прерываний im 1/2 ;#3B7F установка переменных по конкретным адресам ;#3B92 закодированные процедуры переключения страниц -> ram 8 xE3BE ;#3C01 некодированные процедуры переключения страниц -> ram 8 xE42D ;#3D01 список команд отладчика ;#3E25 чтение портов #1FFD/#7FFD ;#3E2C адреса обработки команд отладчика ;#3ED2 закодированный блок атрибутов меню монитора -> ram 8 xEAED ;#3EDA данные для установки переменных по конкретным адресам ;#3EE6 названия месяцев ;#3F0A Названия дней недели ;#3F1F free #00E1(225) bytes ;#4000 ;АДРЕС: #0000 запись байта в память пользователя (rst #00) ;вх: hl - адрес в памяти ; a - байт для записи x0000 scf bit 7,h x0003 jp x058E x0006 jr x0069 x0008 jp x02A5 ;rst #08 печать сообщения по номеру в BC x000B out (c),a ;переход в другой rom x000D jp x009C ;обработка NMI при активной rom2 x0010 jp x2B12 ;rst #10 печать символа в окне x0013 nop nop x0015 jp x00B6 ;вход по rst #08 из basic 48k x0018 jp xE41B ;rst #18 вызов п/п Tr-Dos x001B ld a,#00 ;для проверки размера ПЗУ ret x001E jr x003B ;вход при включении/reset x0020 jp x16D0 ;rst #20 печать строки x0023 nop nop nop x0026 jr x0069 ;вход по rst #08 из basic 128k ;АДРЕС: #0028 чтение байта из памяти пользователя (rst #28) ;вх: hl - адрес в памяти x0028 or a bit 7,h jr x0003 x002D jp x00B6 x0030 jp xE3D3 ;rst #30 вызов п/п из другого rom x0033 nop nop x0035 jp x00B6 ;сюда переходим по NMI из Tr-Dos x0038 jp x0092 ;переход на обработку прерываний im 1 ;АДРЕС: #003B вход при включении/reset ;вх: bc=#1FFD x003B ld b,#7F xor a out (c),a ;ram 8 x0040 ld sp,#5BFF ld b,#00 jr x0049 x0047 out (c),a ;завершение инициализации и переход в basic 128k x0049 ld hl,#EAF5 ;проверим память 8й страницы x004C ld a,b cp (hl) inc hl jr nz,x007B ;ram 8 испорчена. полный сброс djnz x004C ld hl,(#E028) x0056 push hl ;hl=#0000 при полной инициализации call x1037 ;инициализация системы и чтение настроек Autoconfig pop hl ld bc,#7FFD xor a ld (x5B88),a out (c),a ;ram 0/8 jr x006C x0066 jp x000D ;нажатие Magic при активной rom2 x0069 jp x00B6 x006C ld b,#1F rlc l ld hl,#00C7 jr nc,x0078 ld hl,#00ED x0078 push hl jr x0047 ;rom 0 (basic 128k) ;8я страница испорчена. полная иницаиализация x007B call x0672 pop bc ;bc=x3135 call x3A93 ;вызов п/п по адресу в bc (подсчет контрольной суммы страницы) xor a ;hl=#00F6 ld l,a ;hl=#0000 ld i,a im 0 ei halt im 1 halt im 2 halt jr x0056 ;АДРЕС: #0092 обработка прерываний im 1 ;вых: a=0, b=0, d=d+1 x0092 ld a,#00 djnz $ cp b jr nz,x009A inc d x009A ei ret ;АДРЕС: #009C обработка NMI при активной странице монитора x009C push af ld a,r push af ld a,#08 ;вход при активной странице монитора push af inc sp push bc push hl ld hl,(xC001) ex (sp),hl ld a,#55 ld (xC001),a cpl ld (xC001+1),a ld bc,#1FFD ;АДРЕС: #00B6 вход в монитор по NMI/rst 8 x00B6 di ld a,#12 out (c),a ;rom 2 ld b,#7F ld a,#10 out (c),a ;ram 8 ld (xDD6D),sp ld (xDDF7),sp ;сохраним адрес стэка ld sp,xE38D ;новый стэк ld bc,(xC064) ld a,c or b jr nz,x0116 ;вызов процедуры вместо входа в монитор call x03CE ;сохранение регистров и стэка в ram 8 call x0398 ;запись в регистр 7 AY числа #FF ld a,(xDD86) ;номер rom откуда зашли cp #80 jp z,x0922 call x3222 ;восстановление памяти пользователя под всеми ловушками ld a,(xDD86) ;номер rom откуда зашли and #03 jr nz,x0114 ;вход по rst #08 из basic 128k или basic 48k call x0373 ;установка текущим блока дисководов монитора jr x011D ;вход в монитор по кнопке NMI x00F1 db #61 ;второй байт сигнатуры программы анализатора x00F2 db #6F x00F3 db #08 x00F4 db #35 ;байт для раскодирования x00F5 db #CA ;байт для раскодирования блока атрибутов монитора x00F6 db #80 x00F7 db #71 x00F8 db #1A x00F9 db #6B x00FA db #D7 x00FB db #01 x00FC db #05 ;байт для раскодирования процедур x00FD db #07 ;байт для раскодирования процедур x00FE db #61 ;байт для раскодирования процедур x00FF dw xE516 ;адрес п/п обработки прерываний im 2 ;АДРЕС: #0101 номер текущего rom x0101 db #02 ;АДРЕС: #0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) x0102 ds #0E ;АДРЕС: #0110 Таблица переходов ПрофПЗУ x0110 db #00,#0C,#08,#04 ;АДРЕС: #0114 вход в монитор по rst #08 x0114 jr x0167 ;АДРЕС: #0116 вызов п/п по адресу в BC с задержкой call (bc) x0116 push bc x0117 dec bc ld a,b or c jr nz,x0117 ret ;АДРЕС: #011D вход в монитор по кнопке NMI x011D ld a,(xE039) ;значение NMI debouncing ld b,a x0121 call x0241 ;пауза 26698t djnz x0121 call x2C30 ;определение турбо-режима вкл/выкл x0129 bit 0,(iy+#12) jr z,x0136 ;отладчик не запущен ld a,(xC063) or a jp z,x0AF2 ;печать окна отладчика x0136 rst #30 ;отладчик отключен dw rom5_x0EB5 ;печать текущего меню монитора (без возврата) db #05 ;АДРЕС: #013A выход из монитора x013A call x0370 ;возврат в отладчик x013D ld sp,xE38D call x0581 ;восстановление экрана в странице 5 x0143 call x3228 ;сохранение памяти пользователя под всеми ловушками и установка ловушек x0146 call x024C ;установка номера дисковода res 3,(iy+#12) ;сброс признака сохранения экрана в ram 8 ld a,(xDD86) ;номер rom откуда зашли and #0C call nz,xE483 ; call x03C2 ;восстановление содержимого регистра 7 AY res 7,(iy+#12) ; call x04E2 ;восстановление регистров пользователя xor a ld sp,(xDD6D) ;указатель вершины стэка программы пользователя, с учетом 11 байт уже сохраненных на стэке jp x000B ;возврат в rom пользователя ;АДРЕС: #0167 вход в монитор по rst #08 x0167 ld hl,(xDD6B) ;pc программы пользователя dec hl ld (xDD6B),hl ;назад, на длину команды rst 8 ld a,(xE026) bit 5,a jr z,x018E ;выполняется трассировка команды из отладчика ex de,hl ld hl,(xE11A) ;адрес начала буфера для трассировки команды push hl scf sbc hl,de ex de,hl pop de ;адрес начала буфера для трассировки команды jr nc,x018E ;PC не в пределах буфера ex de,hl push de ld de,#0008 add hl,de pop de sbc hl,de ex de,hl jp nc,x0557 ;PC пользователя попадает на буфер с командой трассировки -> значит это выход из трассировки ;проверка ловушек x018E bit 4,a res 4,(iy+#12) jr nz,x01F2 ;при вызове команды CALL отладчика call x328B ;проверка срабатывания ловушки ld e,#00 ;de=#0000, b - обратный номер ловушки jr c,x01F5 ;нет сработавших ловушек. вызов функции rst #08 ; проверка проходов по ловушке x019D ld l,(ix+#07) ld h,(ix+#08) ld a,l or h jr z,x01B2 ;нужный проход по ловушке dec hl ;уменьшим счетчик проходов ld (ix+#07),l ld (ix+#08),h ld a,h or l jr nz,x01E0 ;счетчик проходов еще не пустой ; сработала ловушка x01B2 ld l,(ix+#05) ld (ix+#07),l ld h,(ix+#06) ld (ix+#08),h push ix pop hl bit 1,(hl) jr nz,x01C7 ;ловушка не активна res 7,(hl) ;ловушка больше не задана x01C7 ld a,#09 ;b - обратный номер ловушки sub b ;a - номер ловушки call x3210 ;определение адреса ловушки ; работа анализатора push af call nz,x1DE5 ;выполнение слова анализатора pop af ; вход в отладчик по сработавшей ловушке x01D2 ld l,a ld a,#83 ;сообщение: breackpoint _число_ x01D5 ld h,#00 ld (xDDA7),hl ;число для печати call x0373 ;установка текущим блока дисководов монитора jp x0B06 ;ввод и обработка команды отладчика x01E0 bit 7,e jp nz,x2C9D ;печать отладчика ld sp,xE336 res 7,(iy+#16) call x17F0 ;выполнение одной команды по адресу в PC x01EF jp x0143 ;выход из монитора x01F2 xor a jr x01D2 ;АДРЕС: #01F5 вызов функции rst #08 ;вх: 7,e =1 - трассировка в отладчике ; =0 - вызов функции rst #08 ; hl - PC пользователя x01F5 push de inc hl rst #28 ;чтение номера функции rst #08 cp #FF jr z,x0200 sla a jr c,x0225 ;это функция rst #08 ;обработчик ошибок стандартного Basic x0200 ex de,hl call x3A14 ;запись de на стэк пользователя bit 4,(iy-#02) jr z,x01F2 ;был включен Basic 128k при вызове rst #08 ld hl,(#5C5D) ld (#5C5F),hl ld hl,#0053 ;новый pc программы пользователя ld (xDD6B),hl ;возврат после отработки функции, вызванной пользователем x0216 res 5,(iy+#0B) ;функции вызываются из монитора pop de bit 7,e jr z,x01EF ;;выход из монитора ld hl,(xDD6B) ;PC программы пользователя jp x18C0 ;исполнение зарезервированных слов анализатора st0-st9 ;определение адреса и вызов функции rst #08 x0225 cp #1B jr nc,x0200 ;не существующий номер функции inc hl ld (xDD6B),hl ;PC пользщователя ld hl,x0216 ;сюда вернемся после отработки push hl set 5,(iy+#0B) ;функция вызвана пользователем ld hl,x08B7 ;таблица с адресами обработки функций rst 8 ld e,a ld d,#00 add hl,de ld a,(hl) inc hl ld h,(hl) ld l,a jp (hl) ;АДРЕС: #0241 пауза 26698t x0241 push bc ld bc,#0400 x0245 dec bc ld a,c or b jr nz,x0245 pop bc ret ;АДРЕС: #024C установка номера дисковода x024C ld a,(xFFDC) bit 5,a ld a,(xFFCA) jr nz,x025A ;блок дисководов монитора ld (xE9F2),a ;блок дисководов пользователя ret x025A ld (xE9F1),a ret ;АДРЕС: #025E определение наличия Турбои и оригинальности (колво тактов) x025E call x04D9 ;выключение Турбо-режима call x04D5 ;включение Турбо-режима ld a,#AF ;xor a ld (xE516),a call x2C1F ;определение турбо-режима jr z,x0276 ;турбо выключен ld a,(xE02D) ;турбо включен и доступен or %11000000 ld (xE02D),a x0276 ld (xE523+#08),hl ;!!! непонятно !!! ld a,#CD ;call #nnnn ld (xE51C),a ld c,#FF ;???определение скорости??? xor a ld e,a ld d,a inc a ld b,a ei halt inc a ld b,a x0289 call xE483 ;ret db #ED,#70 ;in (c) call xE483 dec de or a jr nz,x0289 di rst #30 dw rom4_x02E8 ;проверка оригинальный/совместимый компьютер db #04 ld (xDFFC),de xor a jp nz,x3052 ;!!!тут перехда не будет никогда!!! jp x0056 ;АДРЕС: #02A5 печать сообщения по номеру в BC x02A5 rst #30 dw rom5_x11CD ;печать сообщения по номеру в BC db #05 ret ;АДРЕС: #02AA rst 8: db #8B загрузка zs-snap с диска (без возврата) ;вх: +1 =#00 используем имя bootm ; a - номер дисковода ;вх: +1 ="filename",#00 - имя файла x02AA rst #30 dw rom6_x093F ;rst 8:db #8B загрузка zs-snap с диска db #06 ;АДРЕС: #02AE rst 8: db #8D хрень какая-то непонятная ;вых: a =#07 x02AE ld a,#07 ld (xDD7F+#01),a ;регистр A пользователя rst #30 dw rom7_x155A ;чтение заголовка первого попавшегося сектора дисковода A db #07 rst #30 dw rom7_x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу db #07 ret nz ;подключен образ ld hl,#E005 x02BF in a,(#1F) and h jr z,x02BF ret m ;7,a =1 ВГ93 готов ret pe ;7-5,a =011 res 5,h ;7-5,a =000/010 inc (hl) inc hl ld (hl),l ret ;АДРЕС: #02CC rst 8: db #8C автостарт с дискеты ;вх: a =#0C -> вых: нажатие Enter и переход на rom 0: #259F ; =#08 -> вых: bc - длина бейсик-строки для автостарта ; =#nn -> вых: копирование строки автостарта по адресу в de и переход на rom 0: #1B11 x02CC rst #30 dw rom7_x01AF ;автостарт с дискеты db #07 ret ;АДРЕС: #02D1 установка двойной скорости (rst 8: db #87) x02D1 call x02DD set 6,(hl) ret ;АДРЕС: #02D7 установка обычной скорости (rst 8: db #88) x02D7 call x02DD res 6,(hl) ret x02DD xor a ld hl,xE02D bit 7,(hl) jr nz,x02E7 inc a pop bc x02E7 ld (xDD7F),a ;регистр f, флаг c ret ;АДРЕС: #02EB rst 8: db #8A вызов п/п работы с графическим курсором !!!ОШИБКА!!! x02EB call x032A ;чтение регистров основной программы rst #30 dw rom5_x043B ;ОШИБКА!!!! вызов процедуры по номеру в C db #05 jr x0310 ;сохранение регистров для основной программы ;АДРЕС: #02F4 rst 8: db #81 вызов функции R8DOS x02F4 ld hl,xEA49 ;блок пользовательский дисководов ld (xE9F3),hl ld hl,xFFDC bit 5,(hl) jr z,x0309 res 5,(hl) ;работа с дисководом пользователя ld a,(xE9F2) call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ x0309 call x032A ;чтение регистров основной программы rst #30 ;обработка функции rst8dos #81 dw rom7_x0229 ;вызов функции R8DOS db #07 ;АДРЕС: #0310 сохранение регистров для основной программы x0310 ld (xDD77),bc ld (xDD75),de ld (xDD73),hl push af pop hl ld (xDD7F),hl ret ;АДРЕС: #0321 работа с микросхемой CMOS (rst 8: db #89) x0321 call x032A rst #30 dw rom5_x1C0D db %00000101 jr x0310 ;АДРЕС: #032A чтение регистров основной программы x032A ld hl,(xDD73) ld de,(xDD75) ld bc,(xDD77) ld a,(xDD7F+#01) ret ;АДРЕС: #0339 установка переменных монитора (rst 8: db #82) ;вх: --- ; x0339 ld de,x0357 ld hl,(xDD75) ;регистр de (номер блока переменных) add hl,de ld e,(hl) inc hl ld d,(hl) ;адрес начала блока переменных ld hl,(xDD77) ;регистр bc (номер переменной) add hl,de ;адрес переменной ld a,(xDD7F) ;регистр f (флаг cy) rrca jr c,x0352 ;запись ld a,(hl) ;чтение ld (xDD7F+#01),a ;регистр a (результат) ret x0352 ld a,(xDD7F+#01) ;запись ld (hl),a ret x0357 dw xE014 ;de =0 dw xE04E ;de =2 dw xFFC0 ;de =4 dw xEAED ;de =6 ;АДРЕС: #035F вывод символа на экран пользователя (rst 8: db #84) x035F call x300F ;регистр ix ld a,(xDD7F+#01) ;регистр a jp x2B12 ;печать символа ;АДРЕС: #0368 отключение монитора - отладчика (rst 8: db #85) ;вх: a<>0 ; x0368 ld (xC063),a res 7,(iy+#14) ret ;АДРЕС: #0370 возврат в отладчик x0370 push af jr x0388 ;АДРЕС: #0373 установка текущим блока дисководов монитора x0373 push af ld hl,xE9F5 ld (xE9F3),hl ;установка блока описателей дисководов ld hl,xFFDC set 5,(hl) ld a,(xE9F1) call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ call x0550 ;сохранение экрана из страницы 5 x0388 ld a,(x00FB) ;проврека страницы ld hl,xE00D cp (hl) call nz,x2BA8 ;это не страница с монитором. короткий звуковой сигнал c установкой бордюра pop af pop hl ld sp,xE336 jp (hl) ;возврат (ret) ;АДРЕС: #0398 Запись в регистр 7 AY числа #FF x0398 bit 0,(iy+#14) ret nz ld b,#07 ;чтение регистра #7 AY call x03B6 ld (xE004),a ld a,#FF ;АДРЕС: #03A7 Запись регистра AY x03A7 push bc push af ld a,b ld bc,#FFFD out (c),a pop af ld b,#BF out (c),a pop bc ret ;АДРЕС: #03B6 чтение регистра AY ;вх: b - номер регистра ;вых: a - значение регистра ; x03B6 push bc ld a,b ld bc,#FFFD out (c),a nop in a,(c) pop bc ret ;АДРЕС: #03C2 Восстановление содержимого регистра 7 AY x03C2 bit 0,(iy+#14) ret nz ld b,#07 ld a,(xE004) jr x03A7 ;АДРЕС: #03CE Сохранение регистров и стэка в ram 8 x03CE ld bc,#1FFD ld (xDDA7),sp ld sp,xDD83 ex af,af' push af ex af,af' push af exx push bc push de push hl exx push bc push de push hl push iy push ix ld iy,xE014 ld hl,(xDD6D) ;поиск страницы установленной при входе в монитор ld de,#0200 ;и определение конфигурации 128k/48k x03F2 ld bc,#7FFD out (c),e ld b,#1F out (c),d ;rom 2, ram 0 ld a,(#C001) cp #55 x0400 jr z,x0412 x0402 inc e bit 3,e jr z,x03F2 ld e,#00 bit 4,d jp nz,x0589 ;не найдено зеленый бордюр и выход ld d,#12 jr x03F2 x0412 ld a,(#C002) cp #AA jr nz,x0402 ld sp,hl ;страница найдена pop hl ld (#C001),hl ;восстановим байты на этой странице ld b,#1F ld a,#12 out (c),a ld b,#7F ld a,#10 out (c),a ;rom 2, ram 8 res 1,d ld (xE012),de ld a,#15 ;проверим достуна ди память выше 128k out (c),a ;ram #D ld hl,(#C001) ld (#C001),a ld a,#10 out (c),a ;ram 8 ld (#C001),a ld a,#15 out (c),a ;ram #D ld a,(#C001) ld (#C001),hl cp #15 jr z,x0453 ;память доступна ld a,e ;режим 48k or #30 ld e,a x0453 ld a,#10 out (c),a ;ram 8 ld sp,(xDDA7) ld a,(#5B5C) ;определяем активный экран по переменной bas128k and %00001000 bit 5,e jr nz,x0466 ;only 48k or e ;scr 5/7 при входе ld e,a x0466 ld a,(xE012) or e ld (xE012),a ld hl,(xDD6D) ;коррекция вершины стэка программы push hl ld bc,#000B add hl,bc ld (xDD6D),hl pop hl ld de,xDD99 ;сохранение стэка в ram 8 call x0753 ld hl,(xDDA2) ;адрес возврата ld (xDD6B),hl ld hl,(xDDA0) ;регистр af ld (xDD7F),hl ld hl,(xDD9E) ;коррекция регистра r ld a,h sub #04 rlca sla h rra ld h,a ld (xDD83),hl ld hl,(xDD9B) ;регистр bc ld (xDD77),hl ld a,i ;сохраним регистр i ld (xDD85),a xor a ld i,a ld a,(xDD9D) ;номер rom откуда зашли ld (xDD86),a and %00000110 ld a,(xE012) jr z,x04B6 or #10 x04B6 ld (xE012),a ld hl,xE026 bit 7,(hl) set 7,(hl) jr z,x04CD ld b,#00 x04C4 ld a,#06 out (#FE),a xor a out (#FE),a djnz x04C4 x04CD ret ;АДРЕС: #04CE восстановление режима Турбо ; x04CE ld a,(xE02D) bit 6,a jr z,x04D9 ;турбо выключено ;АДРЕС: #04D5 Включение Турбо-режима ; x04D5 ld b,#7F jr x04DB ;АДРЕС: #04D9 Выключение Турбо-режима ; x04D9 ld b,#1F x04DB ld c,#FD in a,(c) in a,(c) ret ;АДРЕС: #04E2 восстановление регистров пользователя x04E2 ld hl,(xDD75) ;de пользователя ld (xDD99),hl ld hl,(xDD77) ;bc пользователя ld (xDD9B),hl ld a,(xDD85) ;i пользователя ld i,a ld (xDD9D),a ld hl,(xDD83) ;r и IFFF2 пользователя ld a,h ;коррекция регистра r sub #06 rlca sla h rra ld h,a ld (xDD9E),hl ld hl,(xDD7F) ;af пользователя ld (xDDA0),hl ld hl,(xDD6B) ;PC пользователя ld (xDDA2),hl ld hl,(xDD6D) ;SP пользователя ld bc,#FFF5 ;bc = -#0B add hl,bc ld (xDD6D),hl ld de,xDD99 ex de,hl ld bc,#000B call x0749 ;восстановление стэка из ram 8 ld (xDDA7),sp ld sp,xDD6F pop ix pop iy pop hl pop de pop bc exx pop hl pop de pop bc exx pop af ex af,af' pop af ex af,af' ld sp,(xDDA7) call x04CE ;восстановление режима Турбо ld de,(xE012) ;ПЗУ пользователя ld a,e ld b,#7F and #10 out (c),a ld b,#1F ret ;АДРЕС: #0550 сохранение экрана из страницы 5 x0550 bit 3,(iy+#12) ret nz ;экран уже сохранен в ram 8 jr x055B ;АДРЕС: #0557 вход в монитор после трассировки команды x0557 ld sp,(xE38D) ;АДРЕС: #055B сохранение экрана из страницы 5 x055B ld hl,xE026 ;сохраняем экран bit 1,(hl) ret nz ;запрет на сохранение экрана set 3,(hl) or a x0564 ld bc,#7FFD ld a,#10 out (c),a ;ram 8, scr 5 ld hl,#4000 ld de,#C069 jr nc,x0574 ;cy =1/0 восстанавливаем/сохраняем ex de,hl x0574 ld bc,#1B00 ldir ld bc,#7FFD ld a,#10 out (c),a ;ram 8, scr 5 ret ;АДРЕС: #0581 восстановление экрана в странице 5 x0581 bit 1,(iy+#12) ;восстанавливаем экран ret nz scf jr x0564 ;АДРЕС: #0589 установка зеленого бордюра (индикация ошибки) ; x0589 ld a,#04 ;зеленый бордюр out (#FE),a halt ;ОШИБКА??? должен быть ret после halt ;АДРЕС: #058E чтение/запись байта в память пользователя ;вх: hl - адрес в памяти ; cy =1/0 запись/чтение ; a - байт для записи ; x058E jr nz,x05CD ;адрес >=#8000 ex af,af' push bc push de bit 6,h jr nz,x05A5 ;адрес [#4000..#7FFF] ld de,(xE012) ;адрес [#0000..#3FFF] ld bc,#7FFD jp xE4CF ;выход x05A1 pop de pop bc ex af,af' ret ;чтение/запись байта из памяти [#4000..#7FFF] x05A5 ld de,#5B00 or a sbc hl,de add hl,de jr nc,x05FB ;адрес [#5B00..#7FFF] bit 3,(iy+#12) jr z,x05FB ;экран не сохранен в ram 8 ld de,#8069 add hl,de ld bc,#7FFD ld a,#10 out (c),a ;ram 8 ex af,af' jr c,x05C3 ;запись ld a,(hl) x05C3 ld (hl),a ex af,af' and #10 out (c),a sbc hl,de jr x05A1 ;чтение/запись байта из памяти [#8000..#FFFF] x05CD bit 6,h jr z,x05FE ;адрес [#8000..#BFFF] ex af,af' ;адрес >=#C000 push bc push de ld de,(xE012) ld bc,#7FFD ld a,e and #17 out (c),a ld a,d and #10 or #02 ld b,#1F out (c),a ;страница пользователя ex af,af' jr c,x05ED ;запись ld a,(hl) x05ED ld (hl),a ex af,af' ld a,#12 out (c),a ld b,#7F ld a,#10 out (c),a ;rom 2, ram 8 jr x05A1 x05FB pop de ;адрес [#5B00..#7FFF] pop bc ex af,af' x05FE jr c,x0601 ;запись ld a,(hl) x0601 ld (hl),a ret ;АДРЕС: #0603 копирование памяти с #8000 в страницу пользователя x0603 scf jr x0607 ;АДРЕС: #0606 копирование страницы пользователя в #8000 ;вх: a - номер страницы x0606 or a x0607 ex af,af' push de ld l,#05 ;номер логической страницы call x3707 ;сравнение страницы пользователя с заданной jr z,x0644 ;страница совпадает ;сохранение/восстановление страницы пользователя x0610 ld de,(xE012) ld bc,#7FFD ld a,e and #17 out (c),a ld a,d and #10 or #02 ld b,#1F out (c),a ;rom 2, ram пользователя ld hl,#C000 ld de,#8000 ld bc,#4000 ex af,af' jr nc,x0632 ex de,hl x0632 ex af,af' ldir ld bc,#1FFD ld a,#12 out (c),a ld b,#7F ld a,#10 out (c),a ;rom 2, ram 8 pop de ret ;сохранение/восстановление 5й страницы x0644 ld hl,#4000 ld de,#8000 ld c,l ld b,h ex af,af' jr nc,x0650 ex de,hl x0650 ex af,af' ldir ld hl,xC069 ;копируем экран ld de,#8000 ld bc,#1B00 ex af,af' jr nc,x0660 ex de,hl x0660 ex af,af' ldir pop de ret ;АДРЕС: #0665 включение режима 48k only x0665 ld bc,#7FFD ld a,#30 out (c),a ret ;АДРЕС: #066D повторная инициализация страниц (если битая) x066D ld a,#04 out (#FE),a halt ;зеленый бордюр ;АДРЕС: #0672 инициализация ram 8 (вход при холодном сбросе) x0672 ld iy,xE014 ;блок переменных call x04D5 ;включим Турбо-режим ;очистка всех страниц памяти ld bc,#1FFD ld a,#12 out (c),a ;rom 2 ld a,#18 jr x0691 x0684 ld hl,#C000 ;очистка страницы ld (hl),#00 ld de,#C001 ld bc,#3FFF ldir x0691 dec a ;очистка страниц #0F-#09 ld bc,#7FFD out (c),a cp #10 jr nz,x0684 xor a ;очистка части 8й страницы ld hl,#C069 ;#C000-#C068 не очищаются push hl ld (hl),a ld de,xC069+1 ld bc,#3F96 ldir pop hl x06AA cp (hl) ;проверка целостности ram 8 страницы inc hl jr nz,x066D ;если битая, зеленый бордюр и тест сначала cp h jr nz,x06AA ;копирование блока атрибутов меню монитора в ram8 ld hl,x3ED2 ;закодированный блок атрибутов меню монитора ld de,xEAED ;блок атрибуты для монитора call x3837 ;копирование блока памяти ram 8 с раскодированием db #DD db #2A db #08 ;длина db #F5 ;адрес байта для раскодирования ;копирование процедур переключения страниц в ram 8 call x0739 ;копирование части закодированных процедур в ram 8 с раскодированием ld bc,#0100 ldir rst #30 dw rom7_x0CFF ;установка переменных дисковой BIOS db #07 rst #30 dw rom4_x057F ;распаковка шрифта в rom 8 db #04 rst #30 dw rom4_x0122 ;копирование переменных монитора и проверка чтения портов #7FFD/#1FFD db #04 call x3B7F ;установка переменных по конкретным адресам ld (iy+#08),#30 ;для перевода времени в ASCII =#30 ;формирование строки с версией монитора ld hl,xE17B+#02 res 7,(hl) inc hl ld (xE3BC),hl set 6,(iy+#09) ;для п/п печати: чтение данных после управляющего кода ld c,#00 call x0732 ;установка координат печати crdY=#00, crdX=#24 rst #20 dc "N" ld l,#F4 ld h,c ld a,(hl) db #ED,#6C ;neg inc hl ld h,(hl) ld l,a ;hl=#CACB call x16DE ;печать числа hl=[#0000..#FFFF] ld c,#01 call x0732 ;установка координат печати crdY=#01, crdX=#24 ld e,#FC ld d,c dec d ;de=#00FC ld a,(de) ;a=#05 inc de push de ;de=#00FD ld b,#02 call x1658 ;печать числа A с предварительным пробелом rst #20 dc "-" pop de ld a,(de) ;a=#07 ld b,#02 call x1658 ;печать числа A с предварительным пробелом ld c,#02 call x0732 ;установка координат печати crdY=#02, crdX=#24 rst #20 dc "V" rst #20 dc "4." rst #20 dc "01" ld hl,(xE3BC) dec hl set 7,(hl) res 6,(iy+#09) call x1F25 ;Команда: CLear ld hl,x3135 ex (sp),hl jp (hl) ;АДРЕС: #0732 установка координат печати crdY=рег C, crdX=#24 x0732 rst #20 db #9B ;признак передачи координат печати ld a,c rst #10 ;crd Y rst #20 db #A4 ;crd X=#24 ret ;АДРЕС: #0739 копирование части закодированных процедур в ram 8 с раскодированием x0739 ld hl,x3B92 ld de,xE3BE call x3837 ;копирование блока памяти ram 8 с раскодированием db #DD db #E9 db #6F ;длина db #F4 ;адрес в ПЗУ ret ;возврат из п/п x0749 x0747 ex de,hl ret ;АДРЕС: #0749 восстановление области памяти из ram 8 ;вх: hl - начало области ; de - адрес буфера для сохранения ; bc - размер для сохранения ; cy =1/0 восстановление/сохранение ; x0749 scf ;cy =1 восстановление ex de,hl exx ld hl,x0747 push hl exx jr x0754 ;АДРЕС: #0753 сохранение области памяти в ram 8 ;вх: hl - начало области ; de - адрес буфера для сохранения ; bc - размер для сохранения ; x0753 or a ;cy =0 сохранение ;восстановление стэка из буфера в ram 8 x0754 ex af,af' bit 7,h jr nz,x079D ;вершина стэка >= #8000 bit 6,h jr nz,x0775 ;вершина стэка >= #4000 push hl ;вершина стэка < #4000 add hl,bc dec hl bit 6,h pop hl jp z,x07F1 ;весь стэк в пределах [#0000..#3FFF] push bc ld bc,#4000 ex de,hl ex (sp),hl call x07E0 ex (sp),hl ex de,hl call x07F1 ;сохранение стэка из окна [#0000..#3FFF] pop bc ;сохранение стэка из окна [#4000..#7FFF] x0775 push hl call x07D7 ;проверка попадания стэка на экран pop hl jr nc,x07A1 ;стэк не на экране bit 3,(iy+#12) jr z,x07A1 ;копируем из памяти push hl ;копируем из области сохраненного экрана add hl,bc dec hl call x07D7 pop hl jp c,x0807 ;весь стэк в пределах [#4000..#5AFF] push bc ld bc,#5B00 ex de,hl ex (sp),hl call x07E0 ex (sp),hl ex de,hl call x0807 pop bc jr x07A1 ;сохранение стэка из окна [#8000..#FFFF] x079D bit 6,h jr nz,x07BC ;вершина стэка >= #C000 ;сохранение стэка из окна [#5B00..#BFFF] x07A1 push hl add hl,bc dec hl ld a,h and #C0 cp #C0 pop hl jp nz,x07FC ;весь стэк в пределах [#8000..#BFFF].сохраняем push bc ld bc,#C000 ;вычисление размера стэка до #C000 ex de,hl ex (sp),hl call x07E0 ex (sp),hl ex de,hl call x07FC ;сохраняем часть стэка pop bc x07BC push hl ;сохранение стэка из окна [#С000..#FFFF] add hl,bc ;проверим не выходит ли стэк за пределы окна dec hl bit 6,h pop hl jp nz,x0821 ;стэк за пределы окна не выходит push bc ;стэк выходит за пределы #FFFF ld bc,#0000 ex de,hl ex (sp),hl call x07E0 ex (sp),hl ex de,hl call x0821 pop bc jp x07F1 ;проверка адреса на принадлежность экрану x07D7 push de ld de,#5B00 or a sbc hl,de pop de ret ;вычисление размеров на границе окон памяти ;вых: hl = hl-(bc-de) ; bc = bc-de x07E0 ex de,hl or a push hl ld l,c ld h,b pop bc sbc hl,bc push bc ld c,l ld b,h pop hl ex de,hl or a sbc hl,bc ret ;сохранение стэка из окна [#0000..#3FFF] x07F1 exx ld de,(xE012) ;страница при входе ld bc,#7FFD jp xE4F0 ;сохранение стэка из памяти x07FC ex af,af' jr nc,x0800 ex de,hl x0800 ldir jr nc,x0805 ex de,hl x0805 ex af,af' ret ;сохранение стэка из копии окна [#4000..#5AFF] x0807 push bc ld bc,#8069 ;адрес в копии экрана add hl,bc pop bc push hl ld hl,x081A ;адрес возврата ex (sp),hl push iy ld iy,#1010 ;rom 1, ram 8, scr 5 jr x0827 x081A push bc ld bc,#7F97 ;-#8069 add hl,bc pop bc ret ;сохранение стэка из окна [#C000..#FFFF] x0821 push iy ld iy,(xE012) ;номер страницы при входе x0827 push hl ld hl,(#8000) ex (sp),hl ;сохраним (#8000/1) push ix ld xh,b ld xl,c exx ld bc,#7FFD ld a,#10 out (c),a ;ram 8 ld b,xh ld c,xl ld hl,#8002 ld de,xDB69 ldir ld hl,#1210 ;сохраним/восстановим область памяти ld a,yl and %00010111 ld e,a ld a,yh and %00010000 or %00000010 ld d,a ;de = rom 2, ram при входе ex af,af' jr nc,x0859 ;сохраняем ex de,hl x0859 ld bc,#7FFD out (c),e ld b,#1F out (c),d exx jr nc,x0866 ;сохраняем ex de,hl x0866 ld (#8000),de ld de,#8002 ldir ;сохраним/восстановим стэк/память ld de,(#8000) ld b,xh ld c,xl exx out (c),h ld b,#7F out (c),l ;меняем страницу exx ld (#8000),hl ld hl,#8002 ldir ld hl,(#8000) jr nc,x088D ;сохраняем ex de,hl x088D ex af,af' exx ld a,#10 out (c),a ld b,#1F ld a,#12 out (c),a ;rom 2, ram 8 ld hl,xDB69 ;восстанавливаем память ld de,#8002 ld b,xh ld c,xl ldir ld bc,#7FFD ld a,#10 out (c),a exx pop ix ex (sp),hl ld (#8000),hl pop hl pop iy ret ;АДРЕС: #08B7 таблица с адресами обработки функций rst 8 x08B7 dw x0911 ;rst 8: db #80 Вывод символа из аккумулятора на принтер dw x02F4 ;rst 8: db #81 Вызов фунций встроенной дисковой BIOS dw x0339 ;rst 8: db #82 установка переменных монитора dw x2A5B ;rst 8: db #83 очистка окна пользователя dw x035F ;rst 8: db #84 Вывод символа на экран пользователя dw x0368 ;rst 8: db #85 Отключение монитора - отладчика dw x08D3 ;rst 8: db #86 Копия графического экрана на принтер dw x02D1 ;rst 8: db #87 Установка двойной скорости dw x02D7 ;rst 8: db #88 Установка обычной скорости dw x0321 ;rst 8: db #89 Работа с микросхемой CMOS dw x02EB ;rst 8: db #8A вызов п/п работы с графическим курсором !!!ОШИБКА!!! dw x02AA ;rst 8: db #8B загрузка zs-snap с диска (без возврата) dw x02CC ;rst 8: db #8C автостарт с дискеты dw x02AE ;rst 8: db #8D хрень какая-то непонятная ;АДРЕС: #08D3 rst 8: db #86 Копия графического экрана на принтер x08D3 xor a scf jr x08D8 ;АДРЕС: #08D7 печать текущего меню монитора x08D7 xor a x08D8 ld hl,x08F7 ;адрес возврата по Break ld (xDE12),hl ld hl,(xE3B7) ;адрес дескриптора текущего окна push hl call x300A ;ix = адрес дескриптора окна монитора: вывод на принтер push af ld (xDDA7),sp set 4,(iy+#09) ;вместо экрана вывод на принтер call nc,x3A21 ;копирование активного экрана пользователя в #4000 call x0A51 ;печать экрана на принтер pop af jr x08FE ;возврат по Break x08F7 ld sp,(xDDA7) pop af ld a,#01 ;вх: a =#00/#01 x08FE ld hl,xE01D res 4,(hl) ;вывод на экран res 5,(hl) pop ix ld (xE3B7),ix ;восстановим адрес дескриптора окна ret nc ;печать текущего меню монитора or a jr z,x0937 ;успешно напечатали jr x091E ;выход по Break ;АДРЕС: #0911 rst 8: db #80 Вывод символа из аккумулятора на принтер x0911 ld hl,x091A ld (xDDA7),sp jr x0929 ;возврат по Break x091A ld sp,(xDDA7) x091E ld a,#01 ;новые флаги программы cy=1 jr x0939 ;АДРЕС: #0922 вывод символа из аккумулятора на принтер (???по запросу от внешенего устройства???) x0922 ld hl,#0146 ;выход из монитора push hl ld hl,#0941 x0929 ld (xDE12),hl ;прерывание по Break call x300A ;ix = адрес дескриптора окна монитора: вывод на принтер set 4,(iy+9) ;вывод на принтер ld a,(xDD7F+#01) ;регистр a программы rst #10 x0937 ld a,%01000000 ;новые флаги программы Z x0939 ld (xDD7F),a x093C res 4,(iy+9) ;вывод на экран ret ;прерывание по Break x0941 ld sp,xE336 call x093C ld hl,#05E2 ld (xDD6B),hl jp x0146 ;АДРЕС: #0950 вывод символа на принтер ;вх: ix - адрес дескриптора окна ; a - код символа/управляющий код x0950 bit 5,(iy+9) jr nz,x09A9 ;есть управляющие коды cp #0D jr nz,x0987 ;это не перевод строки ld (ix+#01),#00 ;crd X =#00 call x0A05 ;передача кода "возврата каретки" для принтера bit 2,(ix+#07) jr z,x0970 ;выполнять автоматический перевод строки при приходе символа возврат каретки ld a,(xE055) ;код символа "перевода строки" для принтера or a jr z,x0970 call x09A9 ;перевод строки на принтере ; перевод строки, если вышли за пределы окна x0970 ld a,(ix+#04) or a ret z ;высота окна в знакоместах inc (ix+#00) cp (ix+#00) ret nc ld (ix+#00),#00 ld a,(xE056) ;код символа "перевода формата" для принтера or a ret z jr x09A9 ;печать символа на принтере ;вх: a - код символа/управляющий код x0987 cp #20 jr c,x09A9 ;это управляющий код cp #7F ;коррекция печатного символа jr nz,x0991 ld a,#2E ;"." x0991 ld e,a ; возврат каретки, если вышли за пределы окна ld a,(ix+#05) ;ширина окна в знакоместах or a jr z,x09A8 inc (ix+#01) ;crd X +1 cp (ix+#01) jr nc,x09A8 push de ;перевод строки rst #20 db #8D pop de xor a ld (ix+#01),a ;crd X =#00 x09A8 ld a,e ;печать символа на принтере ;вх: a - код символа/управляющий код x09A9 ld d,(iy+#15) bit 7,d jr z,x09B1 ;positive cpl x09B1 bit 0,d jr z,x0A10 ;Centronics ;интерфейс RS232 push af xor #FF rlca rlca rlca push af call x04D9 ;выключение Турбо-режима pop bc ld c,b ;символ для печати ; ожидание готовности??? x09C1 call x0A33 ;проверка нажатия BREAK jr nc,x0A2F ;нажат BREAK ld a,#FF in a,(#FE) bit 5,a jr z,x09C1 ;ожидание готовности??? ; побитовая передача кода символа ld b,#08 bit 2,d jr z,x09D5 ;data bits 8 dec b x09D5 push bc ld bc,#1FFD ld a,%00011010 out (c),a pop bc x09DE call x0A3F ;задержка при передаче данных на принтер push bc ld a,c ld bc,#1FFD and %00001000 or %00010010 out (c),a pop bc rrc c djnz x09DE ; завершение печати call x0A3F ;задержка при передаче данных на принтер ld bc,#1FFD ld a,%00010010 out (c),a call x0A3F ;задержка при передаче данных на принтер bit 3,d ;stop bits 2/1 call z,x0A3F ;задержка при передаче данных на принтер pop af ret ;передача кода "возврата каретки" для принтера x0A05 ld a,(xE054) ;код символа "возврата каретки" для принтера or a ret z push bc call x09A9 pop bc ret ;интерфейс Centronics x0A10 ld c,a x0A11 call x0A33 ;проверка нажатия BREAK jr nc,x0A2F ;нажат ld a,#FF in a,(#FE) rlca jr c,x0A11 ;ожидание готовности??? ld a,c ;вывод символа на принтер ld bc,#FFDD out (c),a ld bc,#1FFD ld a,%00110010 out (c),a ld a,%00010010 out (c),a ret ;прерывание по Break x0A2F ld hl,(xDE12) jp (hl) ;АДРЕС: #0A33 проверка нажатия BREAK ;вых: cy=0 нажат BREAK ; x0A33 ld a,#7F ;проверка нажатия пробела in a,(#FE) rra ret c ;не нажат ld a,#FE ;проверка нажатия CapsShift in a,(#FE) rra ret ;задержка при передаче данных на принтер x0A3F push af ld hl,(xE057) bit 1,d jr z,x0A4A ld hl,(xE059) x0A4A dec hl ld a,h or l jr nz,x0A4A pop af ret ;АДРЕС: #0A51 печать экрана на принтер x0A51 ld bc,#0000 x0A54 set 5,(iy+#09) ;прочие управляющие коды ;режим печати x0A58 bit 5,(iy+#15) ;режим печати ld a,#01 jr z,x0A62 ;одна точка ld a,#03 x0A62 ld (xE05B+#06),a ;передача управляющих кодов push bc ld hl,xE05B ;список кодов для перевода принтера в графический режим call x0AD2 ;передача кодов на принтер pop bc ;печать строчки экрана x0A6D push bc bit 5,(iy+#15) ld d,#08 jr z,x0A78 ld d,#04 ;печать одного байта x0A78 push bc ; расчет экранного адреса из пиксельных координат ld a,b and a rra scf rra and a rra xor b and #F8 xor b ld h,a ld a,c rlca rlca rlca xor b and #C7 xor b rlca rlca ld l,a ;hl - адрес ld a,c and #07 ; получение байта для печати ld b,a inc b ld a,(hl) x0A96 rlca djnz x0A96 push af rl e pop af bit 5,(iy+#15) ;режим печати jr z,x0AA5 ;одна точка rl e x0AA5 pop bc inc b dec d x0AA8 jr nz,x0A78 ;e - байт для печати ; установка positive/negative ld a,e x0AAB bit 2,(iy+#12) jr z,x0AB2 ;печать positive/negative cpl ; печать байта x0AB2 rst #10 bit 5,(iy+#15) jr z,x0ABB ;режим печати одна точка rst #10 rst #10 x0ABB inc c ld a,c jr z,x0AC3 pop bc ld c,a jr x0A6D x0AC3 pop de ;следующая строка x0AC4 res 5,(iy+#09) rst #20 dc #8D ld a,#BF cp b jr nc,x0A54 ;первод в текстовый режим и выход ld hl,xE063 ;список кодов для перевода принтера в текстовый режим ;передача кодов на принтер x0AD2 ld b,(hl) inc hl jp x15B3 ;АДРЕС: #0AD7 Команда: EXit выход из отладчика в меню x0AD7 res 0,(iy+#12) rst #30 dw rom5_x0EB5 ;печать текущего меню монитора db #05 ret ;АДРЕС: #0AE0 печать/обновление окна отладчика ;вх: a - номер сообщения для печати над строкой ввода x0AE0 ld (iy+#0A),#00 push af call x2CA8 ;печать/обновление монитора-отладчика pop af jr x0B06 ;АДРЕС: #0AEB вызов отладчика M. Monitor x0AEB ld sp,xE336 set 0,(iy+#12) ;АДРЕС: #0AF2 полное обновление окна отладчика x0AF2 call x04D5 ;включение Турбо-режима xor a ld (xE01E),a ;настройки отладчика jr x0AFC ;АДРЕС: #0AFB обновление окна отладчика, без информационного окна x0AFB scf x0AFC push af call x2CA8 ;печать/обновление монитора-отладчика pop af call nc,x33CD ;печать информационного окна отладчика ld a,#81 ;сообщение: enter command ;АДРЕС: #0B06 ввод и обработка команды отладчика x0B06 ld sp,xE336 call x0550 ;сохранение экрана из страницы 5 ld hl,x0B06 ;сюда вернемся push hl rst #30 ;ввод команды отладчика dw rom5_x1C73 ;ввод текстовой строки в нижней строке экрана db #05 jr nc,x0B40 ;команду ввели call x2C7E ;поиск и вызов процедуры обработки клавиши без возврата(если не найдено возврата) db #87 ;cs+3 dw x303C ;выполнение команды, на которую указывает PC db #88 ;cs+4 dw x303F ;выполнение команды с быстрым выполнением подпрограмм db #89 ;cs+9 dw x1019 ;пропуск программы, содержание регистра PC увеличивается на длину текущей команды (сама команда не выполняется) db #8A ;ss+a dw x0FFF ;на следующую команду (если команда не выполняется) db #1C ;ss+q dw x0FF5 ;на один байт влево db #1E ;ss+e dw x0FFA ;на один байт вправо db #1D ;ss+w dw x0FEB ;на одну строку вверх db #8B ;ss+s dw x0FF0 ;на одну строку вниз db #8C ;ss+f dw x3517 ;продолжение поиска в отладчике (для команд FIND/SEARCH) db #8E ;ss+d dw x38D8 ;быстрый вход в команду DASM db #8D ;ss+g dw x3655 ;переход на адрес, содержащийся в команде, расположенный в текущей ячейке памяти db #04 ;cs+1+d dw x1101 ;редактирование дампа памяти db #FF xor a ret ;анализ введенной команды ;hl - введенная строка x0B40 call x0EE3 ;поиск в буфере ввода строки первого печатного символа ld e,#00 cp #0D jp z,x0AF2 ;пустая строка. полное обновление окна отладчика cp "[" jr z,x0B56 ; cp "(" jr nz,x0B59 ld e,#04 jr x0B58 x0B56 ld e,#84 x0B58 inc hl x0B59 ld (iy+#00),e bit 2,e jr nz,x0BCC ;команда начинается со скобки ;определение кода команды (для установки регистров и переменной MEM) ld de,x0FA5 ld bc,x0F66 call x0F2E ;определение кода команды по введенной строке jp z,x0C0F ;выполнение введенной команды ex de,hl ;de адрес введенной строки cp #21 jr nc,x0B7D ;регистр R или I cp #0D jr nc,x0B7E ;8 бит регистр set 3,(iy+#00) ;16 бит регистр sla c jr x0B82 x0B7D inc bc x0B7E ld a,c sub #07 ld c,a ;bc смещение до регистра пользователя ;присвоение значения, если есть знак = x0B82 ld a,(de) cp #3D ;= jp nz,x0C0F ;выполнение введенной команды inc de ex de,hl ;hl адрес введенной строки push bc call x0EBA ;выделение из строки числовых операндов (не более 6) pop bc ;de значение операнда cp #01 ld a,#0A ;сообщение: too few operands ret c ;ошибка. нет операндов ld a,#0B ;сообщение: too many operands ret nz ;ошибка. слишком много операндов bit 2,(iy+#00) jr nz,x0BF0 ;есть незакрытая скобка ld hl,xDD69 add hl,bc ;адрес регистра пользователя bit 3,(iy+#00) jr nz,x0BB1 ;16 бит значение команды ; 8 бит значение команды ld a,d or a jr nz,x0BC9 ;ошибка: out of range call x0EAA ;установка флагов обновления: регистров ld (hl),e jr x0BC6 ; 16 бит значение команды x0BB1 ld a,c cp #02 jr nz,x0BBA ;это не регистр PC res 6,(iy+#0A) ;обновить дизассемблер в мониторе x0BBA or a push af ;a=#00 это указатель MEM call z,x0EB1 ;обновить дамп памяти и обновлять дизассемблер памяти pop af call nz,x0EAA ;обновить регистры ld (hl),e inc hl ld (hl),d x0BC6 jp x0AFB ;обновление монитора-отладчика ;ошибка x0BC9 ld a,#0C ;сообщение: out of range ret ;вычисление значения операнда в скобках ;вх: hl - адрес введенной строки (начало операнда) x0BCC call x0C98 ;вычисление значения в введенной строке ret c ;ошибка в строке: operand not found ex de,hl ;hl - вычисленное значение ld c,l ld b,h ld a,(de) inc de ld hl,xE014 cp #29 ;) jr z,x0BE9 cp #5D jp nz,x0C0F ;выполнение введенной команды ; закрытие скобки ] bit 7,(hl) jr z,x0BED ;ошибка: invalid type brackets set 3,(hl) jr x0B82 ;присвоение значения, если есть знак = ; закрытие скобки ) x0BE9 bit 7,(hl) jr z,x0B82 ;присвоение значения, если есть знак = ; ошибка: invalid type brackets x0BED ld a,#15 ret ;есть незакрытая скобка x0BF0 bit 3,(iy+#00) ld l,c ld h,b jr nz,x0C08 ;16 бит значение команды ; 8 бит значение команды ld a,d or a jr nz,x0BC9 ;ошибка: out of range ld a,e rst #00 ;запись байта в память пользователя ; обновить все значения в отладчике x0BFE ld a,(xE01E) and #81 ld (xE01E),a jr x0BC6 ;обновление монитора-отладчика ; 16 бит значение команды x0C08 ld a,e rst #00 ;запись байта в память пользователя inc hl ld a,d rst #00 ;запись байта в память пользователя jr x0BFE ;обновить все значения в отладчике ;выполнение введенной команды x0C0F ld hl,xE11E ld b,#03 x0C14 ld e,(hl) inc hl ld d,(hl) inc hl ld (xDDA7),de ;de - адрес таблицы с адресами процедур обработки команды ld a,e or d jr z,x0C32 ;ошибка: command not found ld e,(hl) inc hl ld d,(hl) inc hl ;de - адрес списка команд push hl push bc call x0EE3 ;поиск в буфере ввода строки первого печатного символа call x0EF0 ;поиск заданной команды в списке jr nz,x0C37 ;команда найдена pop bc pop hl djnz x0C14 ; ошибка: command not found x0C32 ld a,#16 ;сообщение: command not found jp x0B06 ;полное обновление окна отладчика ;команда найдена. выполнение команды x0C37 pop de ex (sp),hl ;(sp) следующий адрес в строке add a,c add a,c ld c,a ;*3 ld hl,(xDDA7) ;hl - адрес таблицы с адресами процедур обработки команды add hl,bc ld e,(hl) inc hl ld d,(hl) ;de - процедура обработки команды inc hl ld c,(hl) ;c - флаги команды pop hl ;следующий адрес в строке push de bit 7,c jr nz,x0C67 ;проверка корректности команды. в параметрах команды есть строка bit 5,c ret nz ;переход на обработку команды push bc call x0EBA ;выделение из строки числовых операндов (не более 6) pop bc ;de - первый операнд, hl - второй операнд, a - количество операндов [0..5] bit 6,c jr nz,x0C62 ;переход на обработку команды cp c jr z,x0C62 ;количество прочитанных операндов совпадает ld a,#0A ;ошибка: too few operands jr c,x0C5F ;введено меньше операндов чем надо inc a ;ошибка: too many operands x0C5F jp x0B06 ;полное обновление окна отладчика x0C62 ld bc,(xDD9D) ;bc - третий операнд ret ;переход на обработку команды ;проверка строки команды (в параметрах команды есть строка) ;вых: b - количествор параметров в строке x0C67 ld b,#00 push hl x0C6A dec c bit 7,c jr nz,x0C73 ;это еще числовое значение set 1,(iy+#00) ;читаем из параметров строку x0C73 bit 1,(iy+#00) push bc jr nz,x0C7F ;читаем из параметров строку call x0C98 ;читаем из параметров число jr x0C82 x0C7F call x0D55 ;читаем из параметров строку x0C82 pop bc jr z,x0C8A ;прочитано без ошибок jp nc,x0B06 ;полное обновление окна отладчика ; конец строки команды pop hl ret ;переход на обработку команды x0C8A inc b bit 7,c jr nz,x0C6A ;прочитан числовой операнд ld a,d or a jr z,x0C6A ld a,#0C ;ошибка: out of range jp x0B06 ;полное обновление окна отладчика ;АДРЕС: #0C98 чтение числового операнда из строки команды ;вх: hl - адрес введенной строки ;вых: de - вычисленное значение ; hl - следующий адрес в введенной строке ; nz - были ошибки ; cy=1 - ошибка в строке: operand not found x0C98 dec hl x0C99 inc hl call x0D42 ;проверка символа в (hl) пробел , ; #00 #0D jr nz,x0CA7 ;cy=1 символ =#00/#0D jr nc,x0C99 xor a inc a ld a,#12 ;сообщение: operand not found scf ret x0CA7 ld (iy+#0F),#00 ;количество незакрытых скобок x0CAB ld de,#0000 ;базовое число (к нему будем прибавлять/отнимать) push de ;проверка знака в строке ld d,#2B ;"+" ld a,(hl) call x0D38 ;проверка A = "+" или "-" jr nz,x0CB9 inc hl x0CB8 ld d,a ;знак +/- ;проверка открыия скобки x0CB9 push de ld a,(hl) cp #28 ;( jr z,x0CC3 cp #5B ;[ jr nz,x0CCC x0CC3 inc hl inc (iy+#0F) pop de ld e,a ;открытая скобка ( или [ push de jr x0CAB ;скобка открыта, читаем следующий символ ;выделение числа из строки по адресу в hl x0CCC call x0D55 ;z a =#00 успешно -> de - число jr nz,x0CF8 ;не число. в a - сообщение об ошибке. полное обновление окна отладчика ;вычисление суммы/разности чисел ;de - число x0CD1 pop af ;знак операции +/- ex (sp),hl ;второе число cp #2D ;- jr z,x0CDA add hl,de jr x0CDD x0CDA or a sbc hl,de x0CDD ex (sp),hl ;проверка знака в строке ld a,(hl) inc hl call x0D38 ;проверка A = "+" или "-" jr z,x0CB8 ;повторим сложение/вычитание cp #29 ;) jr z,x0CFB ;закроем скобку ) cp #5D ;] jr z,x0D0E ;закроем скобку ] dec hl xor a cp (iy+#0F) jr nz,x0CF6 ;лишняя скобка pop de ret x0CF6 ld a,#13 ;сообщение: quit operand not found x0CF8 jp x0B06 ;закроем скобку ) x0CFB pop de ;полученное число call x0D22 ;уменьшим количество незакрытых скобок pop af ;f=код скобки 1,f(cy) =1/0 квадратная/круглая push af ld a,#15 ;сообщение: invalid type brackets jr c,x0CF8 ;несоответствие скобок. ошибка. полное обновление окна отладчика ; чтение байта из памяти пользователя push hl ex de,hl rst #28 ;чтение байта из памяти пользователя ld e,a ld d,#00 pop hl jr x0CD1 ;продолжим анализ ;закроем скобку ] x0D0E pop de call x0D22 ;уменьшим количество незакрытых скобок pop af ;f=код скобки 1,f(cy) =1/0 квадратная/круглая push af ld a,#15 ;сообщение: invalid type brackets jr nc,x0CF8 ;несоответствие скобок. ошибка. полное обновление окна отладчика ; чтение слова из памяти пользователя push hl ex de,hl rst #28 ;чтение байта из памяти пользователя ld e,a inc hl rst #28 ;чтение байта из памяти пользователя ld d,a pop hl jr x0CD1 ;продолжим анализ ;уменьшим количество незакрытых скобок x0D22 xor a cp (iy+#0F) jr z,x0D2C ;нет открытых скобок dec (iy+#0F) ret x0D2C bit 2,(iy+#00) ld a,#14 ;сообщение: too many > jr z,x0CF8 ;ошибка. много скобок pop bc dec hl xor a ret ;проверка A = "+" или "-" x0D38 cp #2B ;+ ret z cp #2D ;- ret ;АДРЕС: #0D3E проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) ;вых: z - это разделитель ; cy=1 это конец строки x0D3E ld a,(hl) cp #3A ;: ret z ;АДРЕС: #0D42 проверка символа в (hl) #20/#2C/#3B/#00/#0D ;вых: z - это разделитель ; cy=1 это конец строки x0D42 ld a,(hl) cp #20 ;" " ret z ;АДРЕС: #0D46 проверка символа в (hl) #2C/#3B/#00/#0D ;вых: z - это разделитель ; cy=1 это конец строки x0D46 ld a,(hl) cp #2C ;"," ret z cp #3B ;";" ret z or a scf ret z cp #0D ret nz scf ret ;АДРЕС: #0D55 чтение из строки команды чилового/байта строкового значения ;вх: hl - адрес введенной строки (начало параметра команды) ;вых: nz - ошибка. в A - код ошибки ; cy=1 синтаксическая ошибка ; z a =#00 успешно -> de - число ; hl - адрес начала следующего слова в введенной строке x0D55 bit 0,(iy+#00) ld a,#10 ld (xE024),a ;делитель для выделения разряда числа jr nz,x0D74 ;анализ строки после кавычек ;поиск значимого символа в строке dec hl x0D61 inc hl res 0,(iy+#00) call x0D42 ;проверка символа в (hl) z -> пробел , ; #00 #0D jr nz,x0D6F ;cy=1 символ =#00/#0D jr c,x0DA6 ;ошибка: syntax error jr x0D61 x0D6F cp #22 ;" jr nz,x0DAC ;не кавычки. чтение числа из введенной строки ;анализ строки в кавычках (допустим только один символ чило=код символа) inc hl x0D74 ld a,(hl) cp #0D jr z,x0DA2 ;конец строки. ошибка: bad string cp #22 ;" jr z,x0D9C ;кавычки закрыли ld e,a ld d,#00 ;код символа из строки bit 1,(iy+#00) jr nz,x0D8E ;параметр =строка inc hl ld a,#22 ;" cp (hl) jr nz,x0DA2 ;ошибка: bad string jr x0D92 ; читаем параметр-строку x0D8E set 0,(iy+#00) ; выход x0D92 inc hl xor a ld (xE024),a ret ;ошибка: known number ld a,#0D ;сообщение: known number or a ret ;кавычки закрыли x0D9C bit 1,(iy+#00) jr nz,x0D61 ;параметр-строка. ;ошибка: bad string x0DA2 ld a,#0E ;сообщение: bad string or a ret ;ошибка: syntax error x0DA6 xor a inc a ld a,#0F ;сообщение: syntax error scf ret ;чтение числа из введенной строки ;вх: hl - адрес строки ;вых: z a =#00 успешно -> de - число ; nz a =#10 не число. сообщение: not number ; nz a =#11 результат более 16 бит. сообщение: number too big ; hl - адрес начала следующего слова в введенной строке x0DAC ld de,x0FA0 ld bc,x0F41 call x0F2E ;определение кода команды по введенной строке jr nz,x0DBD ;команда(регистр) найдена в списке call x0DF4 ;преобразование строки в число ret z or a ret x0DBD ld de,#0001 ld a,c or a ret z ;ON -> de=#0001, a=#00 dec de dec a ret z ;OFF -> de=#0000, a=#00 push hl ld hl,xDD83+#01 ;адрес регистра R пользователя ld a,c sub #23 jr nc,x0DE4 ;регитр R или I ld hl,xDD6F ;начало списка регистров ползьзователя ld a,c sub #0F jr nc,x0DE4 ;регистр 8 bit ; 16 бит регистр dec bc dec bc ld hl,xDD6F-#06 add hl,bc add hl,bc ld e,(hl) inc hl ld d,(hl) x0DE1 pop hl xor a ret ; 8 бит регистр x0DE4 add a,l ld l,a jr nc,x0DE9 inc h x0DE9 ld e,(hl) jr x0DE1 ;АДРЕС: #0DEC таблица префиксов и основания систем счислений x0DEC db "%",#02 db "@",#08 db ".",#0A db "#",#10 ;АДРЕС: #0DF4 преобразование строки в число (!!!при base 0 работает неверно!!!) ;вх: hl - адрес строки ;вых: z a =#00 успешно -> de - результат ; nz a =#10 не число. сообщение: not number ; nz a =#11 результат более 16 бит. сообщение: number too big ; x0DF4 ld a,(xE02B) ;текущая система счисления =2/8/10/16 ld b,#0A or a jr z,x0DFD ld b,a x0DFD call x0E51 ;проверка в (hl) цифра или нет (cy=1 не цифра) jr nc,x0E17 ;это цифра ld de,x0DEC ;проверим является ли симовол префиксом системы счисления ld b,#04 x0E07 ld a,(de) inc de cp (hl) ld a,(de) inc de jr z,x0E15 ;да, это префикс. в A основание системы счислений djnz x0E07 ld b,(iy+#17) jr x0E17 x0E15 inc hl ;строка после префикса ld b,a ;основание системы счислений x0E17 ld (iy+#10),b ;делитель для выделения разряда числа call x0E1F ;преобразование строки в число or a ret ;преобразование строки в число (!!!при base 0 работает неверно!!!) ;вх: hl - строка чисел ;вых: a =#00 успешно -> de - результат ; a =#10 не число ; a =#11 результат более 16 бит x0E1F call x0E59 ;преобразование символа в число, с учетом системы счисления ld a,#10 ret c ;выход. не число ld b,#00 ld d,b ld e,c inc hl x0E2A call x0E59 ;преобразование символа в число, с учетом системы счисления jr c,x0E45 ;числа кончились push hl ld hl,(xE024) ;делитель для выделения разряда числа ld h,#00 ex de,hl push bc call x0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) pop bc jr nz,x0E4D ;результат более 16 бит add hl,bc jr c,x0E4D ;результат более 16 бит ex de,hl pop hl inc hl jr x0E2A x0E45 call x0E51 ;проверка в (hl) цифра или нет (cy=1 не цифра) ld a,#10 ret nc xor a ret ;-результат более 16 бит x0E4D pop hl ld a,#11 ret ;-проверка в (hl) цифра или нет (cy=1 не цифра) ;вх: hl - адрес в строке x0E51 ld a,(hl) cp #30 ret c cp #3A ccf ret ;-преобразование символа в число, с учетом системы счисления ;вх: hl - адрес строки чисел ;вых: c - число ; cy=1 ошибка. это не число x0E59 ld a,(hl) cp #61 jr c,x0E60 sub #20 ;буква в верхнем регистре x0E60 sub #30 ret c ;неизвестный символ cp #0A jr c,x0E6C ;это цифра cp #11 ret c ;неизвестный символ sub #07 x0E6C ld c,a ld a,(xE024) ;делитель для выделения разряда числа dec a cp c ret ;АДРЕС: #0E73 деление bc=hl/de с проверкой de на ноль ; x0E73 res 2,(iy+#0E) ld a,d or e jr z,x0E80 ld a,h ld c,l jp x16AA x0E80 set 2,(iy+#0E) ret ;АДРЕС: #0E85 умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) ;вых: ahl - результат ; 0,(iy+#0E)=1 результат более 16 бит ; x0E85 res 0,(iy+#0E) ld c,h ld a,l ld b,#10 ld hl,#0000 x0E90 add hl,hl jr nc,x0E97 set 0,(iy+#0E) x0E97 rla rl c jr nc,x0EA3 add hl,de jr nc,x0EA3 set 0,(iy+#0E) x0EA3 djnz x0E90 bit 0,(iy+#0E) ret ;установка флагов обновления: содержимого регистров и дамп по содержимому регистров x0EAA ld a,(xE01E) and #F5 ;%11110101 jr x0EB6 ;установка флагов обновления: обновлять дамп памяти и обновлять дизассемблер памяти по содержимому ячейки памяти x0EB1 ld a,(xE01E) and #CF ;%11001111 x0EB6 ld (xE01E),a ret ;АДРЕС: #0EBA выделение из строки числовых операндов (не более 6) ;вх: hl - адрес введенной строки ;вых: de - первый операнд ; hl - второй операнд ; a - количество операндов [0..5] x0EBA xor a ld bc,xDD99 x0EBE push af push bc call x0C98 ;вычисление значения в введенной строке pop bc ;de вычисленное значение jr c,x0EDA ;ошибка в строке jp nz,x0B06 ;ошибка. полное обновление окна отладчика ld a,e ld (bc),a inc bc ld a,d ld (bc),a inc bc pop af inc a cp #06 jr nz,x0EBE ld a,#0B ;ошибка: too many operands jp x0B06 ;полное обновление окна отладчика x0EDA pop af ld de,(xDD99) ld hl,(xDD99+#02) ret ;АДРЕС: #0EE3 поиск в буфере ввода строки первого печатного символа ;вых: hl - адрес в буфере ; z - этот символ перевод строки x0EE3 ld hl,xDE17 ;буфер для ввода строки ;АДРЕС: #0EE6 поиск в строке первого печатного символа ;вых: hl - адрес в строке ; z - этот символ перевод строки x0EE6 ld a,(hl) cp " " inc hl jr z,x0EE6 dec hl cp #0D ret ;АДРЕС: #0EF0 поиск заданной команды в списке ;вх: hl - строка с введенной командой ; de - список команд ;вых: nz - команда найдена в списке ; a,bc - номер найденной команды в списке x0EF0 ld c,#00 x0EF2 push hl ld a,(de) ;пропуск служебных байтов cp #20 ;space jr nc,x0EFA inc de inc de x0EFA ld a,(de) ld b,a and #7F cp #61 ;a jr c,x0F04 ;буква в контрольном слове в верхнем регистре set 7,c ;если в нижнем, то не является значимой x0F04 ld a,b call x0F89 ;перевод символа в верхний регистр ld b,a ld a,(hl) call x0F89 ;перевод символа в верхний регистр cp b jr nz,x0F1E ;нет совпадения ld a,(de) bit 7,a inc hl inc de jr z,x0EFA ;следующая буква ;слово найдено x0F17 pop de res 7,c ld a,c ld b,#00 ret x0F1E bit 7,c jr nz,x0F17 ;буква в контрольном слове в нижнем регистре ;сравниваем со следующим словом pop hl x0F23 ld a,(de) rlca inc de jr nc,x0F23 inc c ld a,(de) or a jr nz,x0EF2 ret ;определение кода команды по введенной строке ;вх: hl - адрес строки с введенной командой ; de - список команд ; bc - список кодов соответствующих команде ;вых: z - команда не найдена в списке ; nz - команда найдена в списке ; a,bc - код найденной команды в списке ; hl - адрес начала следующего слова в введенной строке x0F2E push bc call x0EF0 ;поиск заданной команды в списке pop de ret z ;команда не найдена push de ex (sp),hl push af add a,l ld l,a jr nc,x0F3C inc h x0F3C pop af ld a,(hl) ld c,a pop hl ret ;номера кодов соответсвующих списку x0FA0 (названия регистров для монитора) x0F41 db #00,#01,#02,#23 ;ON / OFF/ MEM/ R db #0E,#0D,#22,#20 ;AF'/ AF / A' / A db #21,#1F,#0F,#10 ;F' / F / IXL/ IXH db #11,#12,#05,#06 ;IYL/ IYH/ IX / IY db #03,#04,#0A,#0B ;PC / SP / HL'/ DE' db #0C,#07,#08,#09 ;BC'/ HL / DE / BC db #19,#1A,#1B,#1C ;L' / H' / E' / D' db #1D,#1E,#13,#14 ;C' / B' / L / H db #15,#16,#17,#18 ;E / D / C / B db #24 ;I ;номера кодов соответсвующих списку x0FA5 (названия регистров для монитора) x0F66 db #00,#21,#0C,#0B ;MEM/ R / AF'/ AF db #20,#1E,#1F,#1D ;A' / A / F' / F db #0D,#0E,#0F,#10 ;IXL/ IXH/ IYL/ IYH db #03,#04,#01,#02 ;IX / IY / PC / SP db #08,#09,#0A,#05 ;HL'/ DE'/ BC'/ HL" db #06,#07,#17,#18 ;DE / BC / L' / H' db #19,#1A,#1B,#1C ;E' / D' / C' / B' db #11,#12,#13,#14 ;L / H / E / D db #15,#16,#22 ;C / B / I ;перевод символа в нижний регистр x0F89 and #7F cp #40 ret c and #5F ret ;АДРЕС: #0F91 названия регистров для монитора x0F91 dc "PC" dc "SP" dc "IX" dc "IY" dc "HL" dc "DE" dc "BC" db #00 ;АДРЕС: #0FA0 названия команд/регистров x0FA0 dc "ON" x0FA2 dc "OFF" x0FA5 dc "MEM" dc "R" dc "AF'" dc "AF" dc "A'" dc "A" dc "F'" dc "F" dc "IXL" dc "IXH" dc "IYL" dc "IYH" dc "IX" dc "IY" dc "PC" dc "SP" dc "HL'" dc "DE'" dc "BC'" dc "HL" dc "DE" dc "BC" dc "L'" dc "H'" dc "E'" dc "D'" dc "C'" dc "B'" dc "L" dc "H" dc "E" dc "D" dc "C" dc "B" dc "I" db #00 ;АДРЕС: #0FEB на одну строку вверх в отладчике x0FEB ld bc,#FFF8 jr x1005 ;АДРЕС: #0FF0 на одну строку вниз в отладчике x0FF0 ld bc,#0008 jr x1005 ;АДРЕС: #0FF5 на один байт влево в отладчике x0FF5 ld bc,#FFFF jr x1005 ;АДРЕС: #0FFA на один байт вправо в отладчике x0FFA ld bc,#0001 jr x1005 ;АДРЕС: #0FFF на следующую команду (если команда не выполняется) x0FFF ld hl,(xDD69) ;ячейка mem call x2F96 ;анализ команды ассемблера x1005 ld hl,(xDD69) ;ячейка mem add hl,bc ld (xDD69),hl ld a,#01 bit 0,(iy+#0A) jr z,x102B ;очищать экран монитора при обновлении информации call x2E3D ;печать дампа памяти в окне xor a ret ;АДРЕС: #1019 пропуск программы, содержание регистра PC увеличивается на длину ; текущей команды (сама команда не выполняется) x1019 ld hl,(xDD6B) ;PC call x2F96 ;анализ команды ассемблера ld (xDD6B),hl ld a,(iy+#0A) and %10110101 ld (iy+#0A),a xor a x102B push af call x2CA8 ;печать/обновление монитора-отладчика pop af ret ;нажата стрелка влево. полный сброс x1031 ld (xEAF5+#18),hl ;портим память в ram 8 jp x0040 ;инициализация ;АДРЕС: #1037 инициализация системы и чтение настроек Autoconfig x1037 call x1048 ;инициализация системы и чтение настроек Autoconfig set 6,(iy+#14) ;"теплый" сброс ld b,#00 ld hl,xEAF5 ;байты - признак целостности страницы x1043 ld (hl),b inc hl djnz x1043 ret ;инициализация системы и чтение настроек Autoconfig x1048 ld iy,xE014 call x0739 ;копирование процедуры в ram 8 с раскодированием ld bc,#FEFE ;проверка нажатия CapsShift+5 in a,(c) rrca jr c,x105F ;не нажата ld b,#F7 ;проверка нажатия 5 in a,(c) bit 4,a jr z,x1031 ;cs+5 нажата x105F scf jr x107A ;чтение настроек Autoconfig x1062 ld de,xC006 ld a,(de) sub e dec de jr z,x1073 call x3E25 ;чтение портов #1FFD/#7FFD scf jr x107A ;чтение настроек Autoconfig x1070 ex de,hl inc (hl) ex de,hl x1073 ld a,(de) sbc a,e and #07 jp z,x001E ;сброс ;инициализация системы и чтение настроек Autoconfig ;cy=1 чтение настроек Autoconfig в соответствии с параметрами переменной ; =0 безусловное чтение настроек Autoconfig x107A push af ; подсчет контрольной суммы Basic128 с адреса #500-#5FF ld hl,#0000 ld b,h ld c,#FE ld (xE012),hl ;rom 0, ram 0 пользователя ld h,#05 ;hl=#0500 адрес откуда читаем x1086 rst #28 ;чтение байта из памяти пользователя add a,b ld b,a inc hl ld a,h sub #06 jr nz,x1086 ld a,(x2BB2) sub b jp nz,x001E ;не совпадает. сброс call x04CE ;восстановление режима Турбо rst #30 dw rom4_x0A5A ;инициализация системы и печать сооветствующих сообщений db #04 pop af jr nc,x10B5 ;чтение и установка настроек из конфигурационного сектора bit 1,(iy+#14) ret nz ;Autoconfig Off ld a,(xFFD0) push af call x10B5 ;чтение и установка настроек из конфигурационного сектора rst #30 dw rom5_x08EF ;установка доступности мыши db #05 pop af ld (xFFD0),a ret ;чтение и установка настроек из конфигурационного сектора x10B5 xor a call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ ld bc,#FEFE in a,(c) rrca jr c,x10C8 ;cs не нажата ld b,#EF in a,(c) bit 2,a ret z ;нажато cs+8 x10C8 bit 6,(iy+#14) jr nz,x10D6 ;"теплый" сброс ld d,#02 ld c,#0E ;физическое позиционирование на трек, номер которого задан в регистре D rst #30 dw rom7_x0229 ;вызов функции R8DOS db #07 x10D6 rst #30 dw rom7_x107B ;инициализация дисковода и настройка на дискету db #07 ret c ;ошибка ld (ix+1),#00 ;crd X ld bc,#5D00 ;сообщение: "boot record" rst #08 ;печать сообщения call x2FED ;печать пробелов до правого края окна ; чтение конфигурационного сектора ld hl,xDB69 push hl ld bc,#0105 ld de,#000F ;trk 0, sec #0F rst #30 dw rom7_x0229 ;R8DOS #05(5) чтение группы секторов db #07 pop hl ret c ;ошибка чтения ld a,"A" cpi ret nz ld a,"M" cpi ret nz jp (hl) ;установка настроек из конфигурационного сектора ;АДРЕС: #1101 редактирование дампа памяти в окне монитора x1101 rst #30 dw rom5_x2278 ;редактирование дампа памяти в окне монитора db #05 xor a ret ;АДРЕС: #1107 таблица мнемоник x1107 db #5C,#01 ;#00 ;#30 LD IXH db #5C,#02 ;#30 LD IXL db #5C,#03 ;#30 LD IYH db #5C,#04 ;#30 LD IYL db #53,#15 ;#27 JP Z db #53,#14 ;#27 JP NZ db #53,#0D ;#27 JP C db #53,#16 ;#27 JP NC db #53,#17 ;#08 ;#27 JP M db #53,#1A ;#27 JP P db #53,#19 ;#27 JP PE db #53,#18 ;#27 JP PO db #53,#22 ;#27 JP (HL) db #53,#23 ;#27 JP (IX) db #53,#24 ;#27 JP (IY) db #54,#15 ;#28 JR Z db #54,#14 ;#10 ;#28 JR NZ db #54,#0D ;#28 JR C db #54,#16 ;#28 JR NC db #55,#15 ;#29 CALL Z db #55,#14 ;#29 CALL NZ db #55,#0D ;#29 CALL C db #55,#16 ;#29 CALL NC db #55,#17 ;#29 CALL M db #55,#1A ;#18 ;#29 CALL P db #55,#19 ;#29 CALL PE db #55,#18 ;#29 CALL PO db #56,#0B ;#2A ADC A db #56,#07 ;#2A ADC HL db #57,#0B ;#2B ADD A db #57,#07 ;#2B ADD HL db #57,#12 ;#2B ADD IX db #57,#13 ;#20 ;#2B ADD IY db #58,#0B ;#2C SBC A db #58,#07 ;#2C SBC HL db #59,#0B ;#2D IN A db #59,#0C ;#2D IN B db #59,#0D ;#2D IN C db #59,#0E ;#2D IN D db #59,#0F ;#2D IN E db #59,#10 ;#28 ;#2D IN H db #59,#11 ;#2D IN L db #5A,#26 ;#2E OUT (C) db #5A,#2B ;#2E OUT ( db #5B,#06 ;#2C ;#2F EX DE db #5B,#0A ;#2F EX AF db #5B,#25 ;#2F EX (SP) db #5C,#20 ;#30 LD (BC) db #5C,#21 ;#30 ;#30 LD (DE) db #5C,#22 ;#30 LD (HL) db #5C,#29 ;#30 LD (IY+ db #5C,#2A ;#30 LD (IY- db #5C,#27 ;#30 LD (IX+ db #5C,#28 ;#30 LD (IX- db #5C,#2B ;#30 LD ( db #5C,#0B ;#30 LD A db #5C,#0C ;#38 ;#30 LD B db #5C,#0D ;#30 LD C db #5C,#0E ;#30 LD D db #5C,#0F ;#30 LD E db #5C,#10 ;#30 LD H db #5C,#11 ;#30 LD L db #5C,#05 ;#30 LD BC db #5C,#06 ;#30 LD DE db #5C,#07 ;#40 ;#30 LD HL db #5C,#13 ;#30 LD IY db #5C,#12 ;#30 LD IX db #5C,#1B ;#30 LD I db #5C,#1C ;#30 LD R db #5C,#08 ;#30 LD SP db #59,#22 ;#46 ;#2D IN (HL) db #00 ;АДРЕС: #1196 операнды/флаги ассемблера x1196 dc "IXH" ;#00 dc "IXL" dc "IYH" dc "IYL" dc "BC" dc "DE" dc "HL" dc "SP" dc "AF'" ;#08 dc "AF" dc "A" dc "B" dc "C" dc "D" dc "E" dc "H" dc "L" ;#10 dc "IX" dc "IY" dc "NZ" dc "Z" dc "NC" dc "M" dc "PO" dc "PE" ;#18 dc "P" dc "I" dc "R" dc "F" db #80 db #80 dc "(BC)" dc "(DE)" ;#20 dc "(HL)" dc "(IX)" dc "(IY)" dc "(SP)" dc "(C)" dc "(IX+" dc "(IX-" dc "(IY+" ;#28 dc "(IY-" dc "(" ;#2A db #00 ;#2B ;АДРЕС: #11F7 мнемоники ассемблера x11F7 dc "CCF" ;#00 / #2C dc "CPL" dc "DAA" dc "DI" dc "EI" dc "EXX" dc "HALT" dc "NOP" dc "RLA" ;#08 / #34 dc "RLCA" dc "RRA" dc "RRCA" dc "SCF" dc "LDIR" dc "LDDR" dc "CPIR" dc "CPDR" ;#10 / #3C dc "INIR" dc "INDR" dc "OTIR" dc "OTDR" dc "LDI" dc "LDD" dc "CPI" dc "CPD" ;#18 / #44 dc "INI" dc "IND" dc "OUTI" dc "OUTD" dc "RLD" dc "RRD" dc "RETI" dc "RETN" ;#20 / #4C dc "NEG" db #80 db #80 db #80 dc "DEC" dc "INC" dc "JP" dc "JR" ;#28 / #54 dc "CALL" dc "ADC" dc "ADD" dc "SBC" dc "IN" dc "OUT" dc "EX" dc "LD" ;#30 / #5C dc "ORG" dc "AND" dc "OR" dc "XOR" dc "SUB" dc "CP" dc "PUSH" dc "POP" ;#38 / #64 dc "DJNZ" dc "RET" dc "BIT" dc "SET" dc "RES" dc "RLC" dc "RL" dc "RRC" ;#40 / #6C dc "RR" dc "SLA" dc "SRA" dc "SRL" dc "IM" dc "RST" dc "DB" dc "SLI" ;#48 / #74 db #00 ;АДРЕС: #12D2 таблица для формирования команд дизасма x12D2 db %00000111,%00000001 ;#01 dw x135E db %00111000,%00000001 ;#02 dw x135E db %00111000,%00000001 ;#03 dw x1366 db %00110000,%00000001 ;#04 dw x136E db %00110000,%00000001 ;#05 dw x1372 db %00111000,%00000001 ;#06 dw x1376 db %00111000,%00000001 ;#07 dw x137E db %00111000,%00000001 ;#08 dw x1386 db %11000000,%00000010 ;#09 dw x138E db %00111000,%00000001 ;#0A dw x1396 db %00111000,%00000001 ;#0B dw x139E db %00001111,%00000010 ;#0C dw x13A6 db %00111000,%00000010 ;#0D dw x13C6 db %00111000,%00000001 ;#0E dw x13D6 db %00110000,%00000001 ;#0F dw x13DE db %00110000,%00000010 ;#10 dw x13E2 db %00110000,%00000010 ;#11 dw x13EA db %00001111,%00000010 ;#12 dw x13F2 db %00111000,%00000010 ;#13 dw x1412 db %00110000,%00000010 ;#14 dw x1422 db %00110000,%00000010 ;#15 dw x142A db %11000000,%00000010 ;#16 dw x1432 db %00111000,%00000001 ;#17 dw x143A db %11100000,%00000001 ;#18 dw x1442 db %00001111,%00000010 ;#19 dw x144A db %00000111,%00000001 ;#1A dw x146A db %00111000,%00000001 ;#1B dw x1472 db %00111000,%00000001 ;#1C dw x147A db %00111000,%00000001 ;#1D dw x1482 db %00111000,%00000001 ;#1E dw x148A db %00111000,%00000010 ;#1F dw x1492 db %00011000,%00000001 ;#20 dw x14A2 db %00011000,%00000001 ;#21 dw x14A6 db %00011000,%00000001 ;#22 dw x14AA db %00011000,%00000001 ;#23 dw x14AE x135E db #0C,#0D,#0E,#0F,#10,#11,#22,#0B x1366 db #0C,#0D,#0E,#0F,#10,#11,#EA,#0B x136E db #05,#06,#07,#08 x1372 db #05,#06,#07,#0A x1376 db #14,#15,#16,#0D,#18,#19,#1A,#17 x137E db #83,#82,#85,#84,#89,#88,#87,#86 x1386 db #92,#91,#94,#93,#98,#97,#96,#95 x138E db #D2,#00,#D0,#C7,#D1,#C7,#D8,#00 x1396 db #B6,#B7,#B8,#B9,#BA,#BB,#AF,#B5 x139E db #9B,#99,#61,#9F,#5E,#60,#5F,#62 x13A6 db #D3,#00,#D5,#EB,#D6,#00,#52,#CA db #52,#C8,#51,#C8,#D0,#EC,#D4,#00 db #D3,#00,#9C,#CA,#D7,#00,#51,#CA db #52,#C8,#51,#C8,#D0,#EC,#D4,#00 x13C6 db #33,#00,#AB,#09,#65,#ED,#54,#ED db #8E,#ED,#8D,#ED,#90,#ED,#8F,#ED x13D6 db #35,#37,#34,#36,#2E,#2D,#38,#2C x13DE db #BC,#BD,#BE,#C3 x13E2 db #AD,#0B,#AE,#0B,#B4,#07,#B4,#0B x13EA db #B5,#20,#B5,#21,#BE,#2B,#B5,#2B x13F2 db #66,#CC,#64,#CB,#CD,#EB,#D9,#00 db #CE,#EB,#63,#CB,#D1,#EC,#72,#00 db #66,#CC,#DA,#00,#CD,#EB,#D9,#00 db #CE,#EB,#DB,#00,#D1,#EC,#72,#00 x1412 db #53,#EB,#EA,#00,#A9,#0B,#A1,#2B db #AC,#07,#EA,#00,#2F,#00,#30,#00 x1422 db #66,#00,#31,#00,#8A,#00,#C3,#07 x142A db #55,#EB,#EA,#00,#EA,#00,#EA,#00 x1432 db #DD,#C7,#67,#C7,#69,#C7,#68,#C7 x143A db #6A,#6C,#6B,#6D,#6E,#6F,#74,#70 x1442 db #EA,#EA,#DF,#DF,#EA,#E0,#EA,#EA x144A db #E1,#26,#A8,#C8,#A0,#CA,#B4,#CA db #E2,#00,#E3,#00,#E4,#00,#E5,#00 db #E1,#26,#A8,#C8,#9A,#CA,#D5,#2B db #E2,#00,#E3,#00,#E4,#00,#E5,#00 x146A db #E6,#E7,#E8,#E9,#EA,#EA,#EA,#EA x1472 db #A2,#A3,#A4,#A5,#A6,#A7,#C4,#A1 x147A db #4D,#4E,#4E,#4E,#4E,#4E,#4E,#4E x1482 db #4C,#4B,#4F,#4F,#4F,#4F,#4F,#4F x148A db #71,#71,#71,#71,#71,#71,#71,#71 x1492 db #C1,#0B,#C2,#0B,#B5,#1B,#B5,#1C db #4A,#00,#49,#00,#50,#00,#50,#00 x14A2 db #41,#42,#39,#3A x14A6 db #43,#44,#3B,#3C x14AA db #45,#46,#3D,#3E x14AE db #47,#48,#3F,#40 ;АДРЕС: #14B2 таблицы для формирования команд дизасма x14B2 db #4E,#74,#BB,#BA,#11,#10,#31,#AB db #18,#19,#1A,#17,#16,#0D,#14,#15 db #66,#4C,#4B,#07,#BE,#8A,#9C,#22 db #AF x14CB db #71,#72,#67,#68,#69,#2B,#B4,#A9 db #EC,#EB,#ED,#B2,#27,#9D,#8B,#C0 db #12,#B0,#29,#9E,#8C,#BF,#13 x14E2 db #49,#4A,#B4,#AE,#AD,#AF,#2B,#21 db #20,#22 x14EC db #52,#51,#6A,#6C,#6B,#6D,#6E,#6F db #70,#74 ;АДРЕС: #14F6 проверка значения аккумулятора ;вых: cy=1 -> a<#7E или a>#C4 x14F6 cp #7E ret c cp #C5 ccf ret ;АДРЕС: #14FD проверка значения аккумулятора ;вых: cy=1 -> a<#2C или a>#74 x14FD cp #2C ret c cp #75 ccf ret ;АДРЕС: #1504 проверка значения аккумулятора ;вых: cy=1 -> a<#2C или a>#C4 x1504 cp #2C ret c cp #C5 ccf ret ;АДРЕС: #150B проверка значения аккумулятора ;вых: cy=1 -> a<#01 или a>#2B x150B cp #01 ret c cp #2C ccf ret ;АДРЕС: #1512 печать команды ассемблера ;вх: hl - адрес строки дизассемблированной команды x1512 res 6,(iy+#0E) ;запятая не напечатана call x2B10 ;печать пробела ld a,(hl) call x14F6 ;cy=1 -> a<#7E или a>#C4 jr c,x1538 ;печать мнемоники из таблицы x1107 push hl ;a=[#7E..#C4] -> a=a-#7E =[#00..#46] из таблицы x1107 ld hl,x1107 sub #7E add a,a ld e,a ld d,#00 add hl,de ld a,(hl) ;мнемоника (номер сообщения) call x1570 ;печать мнемоники ассемблера с пробелом на конце ld a,(hl) ;начало операнда команды and #7F pop hl ;печать первого операнда inc hl call x157F ;печать операнда/числа команды ассемблера jr x1543 x1538 call x14FD ;cy=1 -> a<#2C или a>#74 jr c,x1548 ;+0 =[#00..#2C][#74..#7D][#C5..#FF] call x1570 ;мнемоника без операндов x1540 call x1599 ;печать операнда/числа x1543 ld a,(hl) call x1504 ;cy=1 -> a<#2C или a>#C4 ret nc ;a=[#2C..#C4] x1548 cp #F1 ret z cp #F7 ret z cp #EE jr nz,x1561 ;печать комментария (для db #nn ;BAD) call x2B10 ;печать пробела ld a,";" rst #10 inc hl x1559 ld a,(hl) inc hl cp #F0 ret z rst #10 jr x1559 ;печать зяпятой, если еще не напечатана x1561 bit 6,(iy+#0E) set 6,(iy+#0E) jr nz,x1540 ld a,"," rst #10 jr x1540 ;АДРЕС: #1570 печать мнемоники ассемблера с пробелом на конце ;вх: a - номер сообщения с мнемоникой =[#2C..#74] ;вых: hl=hl+1 x1570 ld c,(iy+#06) sub #2C ld de,x11F7 call x15FC ;печать сообщения по номеру в A, не менее заданной длины в С inc hl jp x2B10 ;печать пробела ;АДРЕС: #157F печать операнда/числа команды ассемблера ;вх: a - номер операнда/числа команды ассемблера ;вых: a - номер следующего операнда/числа команды ассемблера x157F call x150B ;cy=1 -> a<#01 или a>#2B jr c,x159D ;печать операнда a=[#01..#2B] из списка x1196 push af sub #01 ld de,x1196 call x15FA ;печать сообщения по номеру в A pop af cp #27 ;a=[#01..#26] jr c,x15B1 ;нет смещения для команд (ix/iy+nn), ;печатам число с закрывающей скобкой call x1599 ;a=[#27..#2B] ld a,")" rst #10 ret ;печать операнда x1599 ld a,(hl) inc hl jr x157F ;печать числа (a<#01 или a>#2B) x159D cp #F8 jr c,x15A6 ;a=[#00,#2C..#F7] call x1626 ;a=[#F8..#FF] печать числа из (hl) (dec/hex) с префиксом jr x15B1 ;печать сообщения (a=[#00,#2C..#F7]) x15A6 cp #EC jr nz,x15AF call x15DB ;a=#EC печать сообщения из hl jr x15B1 ;выход x15AF dec hl ret x15B1 ld a,(hl) ret ;АДРЕС: #15B3 печать сообщения из hl ;вх: hl - адрес начала сообщения ; b - длина сообщения ; x15B3 ld a,(hl) rst #10 inc hl djnz x15B3 ret ;АДРЕС: #15B9 печать сообщения из hl с заменой непечатных символов на ? ;вх: hl - адрес начала сообщения ; b - длина сообщения ; x15B9 ld a,(hl) cp #20 jr nc,x15C0 ld a,"?" x15C0 call x2B0B ;печать символа inc hl djnz x15B9 ret ;АДРЕС: #15C7 печать сообщения из hl ;вх: hl - адрес начала сообщения ; x15C7 ld a,(hl) call x2B0B ;печать символа inc hl rlca ret c jr x15C7 ;АДРЕС: #15D0 печать сообщения по номеру (на экран/в буфер) ;вх: a,e - номер сообщения ; hl - адрес начала блока сообщений ; x15D0 inc a ;поиск сообщения по номеру x15D1 dec a jr z,x15DB x15D4 bit 7,(hl) inc hl jr z,x15D4 jr x15D1 ;АДРЕС: #15DB печать сообщения из hl ;вх: hl - адрес сообщения ; x15DB ld b,#01 ;АДРЕС: #15DD печать сообщения не менее заданной длины ;вх: b - минимальная длина сообщения (дополняется пробелами) ; hl - адрес сообщения ; x15DD or a x15DE ld a,(hl) bit 7,a call x2B0B ;печать символа со сбросом 7го бита (rst #10) inc hl jr z,x15EC ret c ld a," " ;напечатаем пробел jr x15F6 x15EC djnz x15DE scf ld b,#00 jr x15DE ;АДРЕС: #15F3 печать нескольких провелов (в B) ;вх: b - количество пробелов ; x15F3 ld a," " x15F5 rst #10 x15F6 djnz x15F5 or a ret ;АДРЕС: #15FA печать сообщения по номеру в A ;вх: de - адрес блока сообщений ; a - номер сообщения ; x15FA ld c,#01 ;АДРЕС: #15FC печать сообщения по номеру в A, не менее заданной длины в С ;вх: c - минимальная длина сообщения (дополняется пробелами) ; de - адрес блока сообщений ; a - номер сообщения ; x15FC ex de,hl call x1606 ;поиск сообщения по номеру в A ld b,c call x15DD ex de,hl ret ;поиск сообщения по номеру в A x1606 or a ret z ld b,a x1609 bit 7,(hl) inc hl jp z,x1609 djnz x1609 ret ;АДРЕС: #1612 печать числа в hl (dec/hex) с префиксом ;вх: hl - число ; x1612 ld c,l ld b,h ;АДРЕС: #1614 печать числа в bc (dec/hex) с префиксом ;вх: bc - число ; x1614 push de bit 0,(iy+5) ld de,#0A00 ;десятичное, без префикса jr nz,x1621 ld de,#1023 ;шестнадцатиричное, префикс # x1621 call x162C ;печать числа с префиксом pop de ret ;АДРЕС: #1626 печать числа из (hl) (dec/hex) с префиксом ;вх: 0,a =0/1 двухбайтное/однобайтное число ; 1-2,a - система счисления (bin/oct/dec/hex) ; hl - адрес ячейки с числом ; x1626 call x1638 ;загрузка числа в bc ;АДРЕС: #1629 печать числа в bc (bin/oct/dec/hex) с префиксом ;вх: bc - число ; 1-2,a - система счисления ; x1629 call x1642 ;установка префикса ;АДРЕС: #162C печать числа в заданной системе счисления ; bc - число ; d - делитель для выделения разряда числа ; e - код префикса x162C ld a,d ld (xE024),a ld a,e rst #10 ;печать префикса ld (iy+7),#01 jr x1673 ;печать числа ;загрузка числа в bc x1638 ld b,#00 ld c,(hl) inc hl bit 0,a ret nz ld b,(hl) inc hl ret ;установка префикса для системы счисления x1642 and %00000110 ld de,#0225 ;bin cp #02 ret c ld de,#0840 ;oct ret z cp #06 ld de,#0A00 ;dec ret c ld de,#1023 ;hex ret ;АДРЕС: #1658 печать числа A с предварительным пробелом ;вх: a - число ; b - минимальная длина ; x1658 ld c,a ld a,b ld b,#00 jr x166B ;АДРЕС: #165E печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом ;вх: bc - число ; x165E scf jr x1662 ;АДРЕС: #1661 печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом ;вх: bc - число ; x1661 or a x1662 ld a," " ;cy=1/0 минимальная длина 1/5 rst #10 ;печать пробела ld a,#01 jr c,x166B ;АДРЕС: #1669 печать десятичного числа bc [0..65535] с ведущими пробелами ;вх: bc - число ; (xE3BC) адрес строки ; x1669 ld a,#05 x166B ld (iy+#07),a ;АДРЕС: #166E печать десятичного числа bc [0..65535] с ведущими пробелами ;вх: bc - число ; (xE3BC) адрес строки x166E ld de,#000A jr x1677 ;АДРЕС: #1673 печать числа bc (на экран/в буфер) ;вх: bc - число ; (xE024) делитель для выделения разрядов ; (xE01B) количестов разрядов ; (xE3BC) адрес строки ; x1673 ld de,(xE024) ;делитель для выделения разрядов ;АДРЕС: #1677 печать числа bc (на экран/в буфер) ;вх: bc - число ; de - делитель для выделения разрядов ; (xE01B) количестов разрядов ; (xE3BC) адрес строки ; x1677 push hl call x1681 ;преобразование числа в строку pop hl ret x167D ld a,b or c jr z,x169E x1681 dec (iy+7) ;преобразование числа в строку ld a,b call x16AA ;деление bc=ac/de push hl ;hl остаток от деления call x167D pop hl ld a,l add a,#90 daa adc a,#40 daa and #7F cp #20 jr nc,x169C ld a," " x169C rst #10 ret x169E dec (iy+7) ret m call x167D ld a,(iy+8) rst #10 ret ;АДРЕС: #16AA деление bc=ac/de ;вых: bc=ac/de ; hl остаток от деления ; x16AA ld hl,#0000 ld b,#10 x16AF rl c rla adc hl,hl sbc hl,de ccf jr nc,x16C8 x16B9 djnz x16AF rl c rla ld b,a ret x16C0 rl c rla adc hl,hl add hl,de jr c,x16B9 x16C8 djnz x16C0 rl c rla add hl,de ld b,a ret ;АДРЕС: #16D0 печать строки (rst #20) ;вх: ix - адрес дескриптора окна ; x16D0 ex (sp),hl push af x16D2 ld a,(hl) call x2B0B ;печать символа со сбросом 7го бита (rst #10) and #80 inc hl jr z,x16D2 pop af ex (sp),hl ret ;АДРЕС: #16DE печать числа hl=[#0000..#FFFF] ;вх: hl - число ; x16DE ld a,h call x16E3 ld a,l ;АДРЕС: #16E3 печать числа [#00..#FF] ;вх: a - число ; x16E3 push af rlca rlca rlca rlca call x16EC pop af ;АДРЕС: #16EC печать числа [#0..#F] ;вх: 0-3,a - число ; x16EC and #0F add a,#90 daa adc a,#40 daa rst #10 ret ;коррекция регистра r пользователя x16F6 ld l,(iy+#02) ;длина команды для дизасма в байтах jr x1744 ;коррекция регистра r пользователя x16FB ld l,#01 jr x1744 ;АДРЕС: #16FF исполнение зарезервированных слов анализатора st0-st9 x16FF bit 4,(iy+#14) ret z ;анализатор выключен ld hl,xE9A9 ;таблица адресов слов st0-st9 анализатора xor a x1708 push af ld e,(hl) inc hl ld d,(hl) inc hl push hl ld a,d or e call nz,x1DE5 ;выполнение слова анализатора pop hl pop af inc a cp #0A jr nz,x1708 ret ;АДРЕС: #171B выполнение(трассировка) сформированной команды в отладчике x171B ld hl,(xDD6B) ;pc программы пользователя push hl ld hl,(xE11A) ;адрес начала сормированной команды для трассировки ld (xDD6B),hl ;новый PC ld hl,x173A ;адрес возврата push hl ld (xE38D),sp ;сохраним стэк ld hl,xE026 set 5,(hl) ;выполняется трассировка из отладчика bit 3,(hl) call nz,x0581 ;восстановление экрана в странице 5 jp x0143 ;выход из монитора и выполнение команды x173A res 5,(iy+#12) pop hl ld (xDD6B),hl ;восстановим PC пользователя ;коррекция регистра r пользователя x1742 ld l,#FF x1744 ld a,(xDD83+#01) ;коррекция регистра r пользователя ld h,a add a,l rlca sla h rra ld (xDD83+#01),a ret ;трассировка команд с условием перехода jr cc ;вых: cy=1 условие выполнено x1751 ld hl,(xE11A) inc hl inc hl ld (hl),#02 ;jr cc,$+4 jr x1782 ;быстрая трассировка команды call x175A ld hl,(xDDAA) rst #28 ;чтение байта из памяти пользователя ld e,a inc hl rst #28 ;чтение байта из памяти пользователя ld d,a inc hl ld (xDDAA),hl ld hl,(xE11A) inc hl inc hl ld (hl),e inc hl ld (hl),d inc hl ld (hl),#CF ;rst #08 jr x171B ;выполнение(трассировка) сформированной команды в отладчике ;трассировка команд с условием перехода jp cc/call cc/ret cc ;вых: cy=1 условие выполнено x1773 ld hl,(xE11A) inc hl inc hl push hl ;установка команды: jp cc,$+5 ld de,#0004 add hl,de ex de,hl pop hl ld (hl),e inc hl ld (hl),d x1782 inc hl ld (hl),#B7 ;or a inc hl ld (hl),#CF ;rst #08 inc hl ld (hl),#37 ;scf inc hl ld (hl),#CF ;rst #08 ld a,(xDD7F) ;флаги пользователя push af call x171B ;выполнение(трассировка) сформированной команды в отладчике call x1742 ;коррекция регистра r пользователя ld a,(xDD7F) ;регистр f rrca ;флаг CY пользователя pop hl ld a,h ld (xDD7F),a ;восстановим флаги ret ;exx регистров пользователя x17A2 ld hl,xDD73 ;регистр hl ld de,xDD79 ;регистр hl' ld b,#06 x17AA ld a,(de) ld c,(hl) ex de,hl ld (de),a ld (hl),c inc de inc hl djnz x17AA ret ;ex af,af' регистров пользователя x17B4 ld hl,xDD7F ;регистр af ld de,xDD81 ;регистр af' ld b,#02 jr x17AA ;трассировка команды rst #08 x17BE ld de,#0008 ld hl,(xDDD0) ;адрес следующей команды дизасма or a sbc hl,de jr nz,x1807 ;формируем команду для исполнения ld hl,(xDD6B) ;pc программы пользователя ld e,#FF jp x01F5 ;вызов обработчика ошибок Basic 48k ;трассировка команды halt x17D1 ld a,(xDD83) ;флаг IFFF2 bit 2,a jr nz,x17EA ;прерываения разрешены ld a,#AB ;di:halt -> сообщение: finish program jp x0AE0 ;печать/обновление окна отладчика ;команды: ex af,af' и exx x17DD ld a,(xDDB4) ;1й байт команды дизассемблера без префиксов cp #08 ;команда ex af,af' push af call z,x17B4 ;ex af,af' регистров пользователя pop af call nz,x17A2 ;exx регистров пользователя x17EA call x16FB ;коррекция регистра r пользователя jp x18BD ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 ;АДРЕС: #17F0 выполнение одной команды по адресу в PC x17F0 ld hl,(xDD6B) ;pc программы пользователя call x191E ;проверка попадания адреса на адреса #3D00-#3DFF jp nc,x18F1 ;возможна только быстрая трассировка, pc пользователя в пределах #3D00..#3DFF call x2F96 ;анализ команды ассемблера по адресу в hl ld a,(xDDB7) cp #32 ;это halt jr z,x17D1 cp #72 ;это rst #08 jr z,x17BE ;формируем команду для исполнения ; сохраним память в буфере x1807 ld hl,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки push hl ld de,xE39A ;буфер для сохранения памяти пользователя при трассировке команды дизасма ld bc,#0008 ldir pop de ; установим режим прерываний ld a,(xDD83) ;флаг IFFF2 bit 2,a ld a,#F3 ;di jr z,x181F ld a,#FB ;ei x181F ld (de),a inc de ; копируем команду в буфер для исполнения ld hl,(xDD6B) ;pc программы пользователя ld c,(iy+#02) ;длина команды в байтах ld b,#00 call x0753 ;сохранение области памяти в ram 8 ; ставим rst #08 для возврата ld a,#CF ;rst #08 ld (de),a ld a,(iy+#03) or a jp z,x18BA ;выполнение команды при трассировке ;для команды exx/ex af,af' bit 7,a jr nz,x17DD ;команды: ex af,af' и exx ;для команды ret/ret cc bit 1,a jr z,x185A ;это не ret bit 5,a jr z,x1851 ;это команда ret ; команда ret cc ld hl,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки inc hl ;поправка на di/ei ld a,(hl) and %00111000 or %11000010 ld (hl),a call x1773 ;трассировка команд с условием перехода jp cc/jr cc/call cc/ret cc jr nc,x1861 ;условие не выполнено x1851 call nc,x16F6 ;коррекция регистра r пользователя call x3640 ;pop de со стэка пользователя ex de,hl jr x18C0 ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 ;для команд jr cc x185A bit 2,a jr z,x1865 call x1751 ;трассировка команд с условием перехода jr cc x1861 jr nc,x18BD ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 jr x18A7 ;условие выполнено ;для команд call/call cc x1865 bit 0,a jr z,x1894 bit 7,(iy+#16) jr nz,x18D5 ;выполнение команды в отладчике с быстрым выполнением подпрограмм ; пошаговая трассировка call x190F jr c,x18DA ;только быстрая трассировка x1874 ld hl,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки inc hl ld a,(hl) or a bit 0,a jr nz,x1888 ;это call and %00111000 ;это call cc or %11000010 ld (hl),a call x1773 ;трассировка команд с условием перехода jp cc/call cc/ret cc jr nc,x18BD ;условие не выполнено ; установка регистров и стэка для вызова команды call x1888 call nc,x16FB ;коррекция регистра r пользователя ld de,(xDDAA) ;текущий адрес команды ассемблера для дизасма call x3A14 ;запись de на стэк пользователя jr x18A7 ;для команд jp/jp cc x1894 bit 3,a jr z,x18AC call x1773 ;трассировка команд с условием перехода jp cc/call cc/ret cc jr nc,x18BD ;условие не выполнено call x190F ;проверка возможности пошаговой трассировки команд call push af call c,x1742 ;коррекция регистра r пользователя pop af jr c,x18F4 ;только быстрая трассировка x18A7 ld hl,(xDDD0) ;адрес следующей команды дизасма jr x18C0 ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 ;для пустых команд??? x18AC bit 4,a jr z,x18B5 call x16FB ;коррекция регистра r пользователя jr x18A7 ;неизвестная команда x18B5 ld a,#AA jp x0AE0 ;печать/обновление окна отладчика ;выполнение команды при трассировке x18BA call x171B ;выполнение(трассировка) сформированной команды в отладчике x18BD ld hl,(xDDAA) ;текущий адрес команды ассемблера для дизасма ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 ;вх: hl - PC пользователя x18C0 ld (xDD6B),hl ;новый PC пользователя push hl ld hl,xE39A ;буфер для сохранения памяти пользователя при трассировке команды дизасма ld de,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки ld bc,#0008 ldir call x16FF ;исполнение зарезервированных слов анализатора st0-st9 pop hl ret ;выполнение команды в отладчике с быстрым выполнением подпрограмм ; вызов call x18D5 call x191B ;проверка попадания адреса команды на адреса #3D00-#3DFF jr nc,x1874 ;вызов невозможен, это Tr-Dos x18DA ld hl,(xDDD0) ld de,#0028 or a sbc hl,de jr nz,x18BA ;выполнение команды при трассировке ; это call #28/rst #28 bit 4,(iy-#02) jp nz,x1874 ;это Basic 48k call x175A ;быстрая трассировка команды call jr x18BD ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 ;только быстрая трассировка ;вх: hl - PC программы пользователя x18F1 ld (xDDD0),hl ;адрес следующей команды дизасма x18F4 ld hl,(xE11A) inc hl ld (hl),#CD ;call #nnnn inc hl ld de,(xDDD0) ld (hl),e inc hl ld (hl),d inc hl ld (hl),#CF ;rst #08 call x3640 ;pop de со стэка пользователя push de call x171B ;выполнение(трассировка) сформированной команды в отладчике pop hl jr x18C0 ;проверка возможности пошаговой трассировки команд call ;вых: cy=1 возможна только быстрая трассировка x190F or a bit 3,(iy+#05) ;Не трассировать (выполнять сразу) подпрограммы, расположенные в ПЗУ ret z ld a,(xDDD0+#01) cp #40 ret nc ;это не ПЗУ ;АДРЕС: #191B проверка попадания адреса команды на адреса #3D00-#3DFF ;вых: cy=0 pc программы пользователя в памяти #3D00-#3DFF селлектор включения tr-dos x191B ld hl,(xDDD0) ;адрес следующей команды дизасма ;АДРЕС: #191E проверка попадания адреса на адреса #3D00-#3DFF ;вх: hl - pc программы пользователя ;вых: cy=0 pc программы пользователя в памяти #3D00-#3DFF селлектор включения tr-dos x191E bit 4,(iy-#02) ;4,#7FFD пользователя scf ret z ;ПЗУ Basic128 пользователя ld de,#3D00 or a sbc hl,de add hl,de ret c ld de,#3E00 sbc hl,de add hl,de ccf ret ;сообщение дизасма для неопознанной команды x1934 db #73 ;DB db #FF ;признак числа hex 1 байт db #00 ;число db #EE,"BAD",#F0 ;сообщение ;выход из п/п x197F анализа команды ассемблера x193C ld (ix+0),#F7 ;признак конца команды pop ix ret ;команда ex de,hl x1943 ld (ix+0),#AA ;первая часть: ex de inc ix ld (ix+0),#07 ;вторая часть: hl x194D inc ix x194F ld (iy+2),#01 ;длина команды в байтах jp x1A78 ;команда halt x1956 ld (ix+0),#32 ;номер сообщения мнемоники: halt ld a,(hl) or a jr z,x194D ;если был префикс, команда неизвестна ;неизвестная команда x195E ld hl,x1934 ;команда неизвестна ld de,xDDB7 ld bc,#0008 ldir push de pop ix xor a ld (iy+#01),a ;нет префикса ld (iy+#04),a ld (iy+#03),#40 ld a,(xDDAC) ;код первого байта команды ld (xDDB7+#02),a ;отобразится в сообщении DB #?? jr x194F ;АДРЕС: #197F анализ команды ассемблера ; формирование сообщения для печати дизасма команды ;вых: bc - длина команды ассеблера x197F push ix ;установка регистров ld ix,xDDB7 ;буфер сообщения ld de,(xDDAA) ;адрес команды ld hl,x193C ;адрес возврата push hl ld (xDDCB),sp bit 4,(iy+#00) jr z,x199F call x1DB3 ;поиск чего-то cy=1 найдено ld b,#F1 call c,x1D88 ;обнуление дизасма команды ассемблера x199F ld e,#09 ld hl,xE015 ;iy+#01 xor a ld d,a ;начальная длина команды =0 ld (hl),a ld (xDDCD),a ld (xE017),a ld (xE018),a ;проверка наличия префиксов ld bc,xDDAC ;начало команды ld a,(bc) cp #EB jr z,x1943 ;это ex de,hl cp #DD ;проверка на префикс #DD jr nz,x19C2 ;нет префикса ld (hl),#02 ;префикс #DD inc bc inc d ;длина команды jr x19CA x19C2 cp #FD ;проверка на префикс #FD jr nz,x19CA ;нет префикса ld (hl),#03 ;префикс #FD inc bc inc d ;длина команды x19CA ld a,(bc) cp #76 ;halt jr z,x1956 ;это команда halt cp #CB ;проверка на префикс #CB jr nz,x19DB ;нет префикса set 3,(hl) ;префикс #CB ld e,#16 inc bc inc d ;длина команды jr x19EA x19DB cp #ED ;проверка на префикс #ED jr nz,x19EA ;нет префикса set 2,(hl) ;префикс #ED bit 1,(hl) jp nz,x195E ;есть префикс #DD/#FD. неизвестная команда inc bc ld e,#18 inc d ;длина команды x19EA inc d ;длина команды ld (iy+#02),d ;длина команды ;копируем команду в буфер без префикса push de ld de,xDDB4 ;копируем в буфер команду без префиксов ld h,b ld l,c ld bc,#0003 ldir pop de ld a,(xE015) ;корректировка команды без учета префиксов and %00001010 cp %00001010 jr nz,x1A09 ld a,(xDDB4+#01) ;два префикса #CB и #DD/#FD ld (xDDB4),a ;код команды ;формирование команды дизасма по таблице x1A09 xor a push af push af ld a,e ;e=#09/#16/#18 x1A0D add a,a add a,a ld b,#00 ld c,a ld hl,x12D2-#04 add hl,bc ld c,(hl) inc hl ld d,(hl) inc hl ld a,(hl) inc hl ld h,(hl) ld l,a ;hl - адрес начала таблицы ld a,(xDDB4) ;код команды без учета префиксов ld b,#00 and c x1A24 inc b srl c jr nc,x1A24 or a x1A2A dec b jr z,x1A30 rrca jr x1A2A x1A30 bit 0,d jr nz,x1A35 add a,a x1A35 ld b,#00 ld c,a add hl,bc x1A39 ld a,(hl) inc hl dec d or a jr z,x1A62 cp #EA jp z,x195E ;неизвестная команда cp #C5 jr c,x1A94 cp #EA jr nc,x1A94 sub #C6 cp #17 jr nz,x1A56 set 6,(iy+#04) x1A56 bit 0,d jr z,x1A0D push de push hl jr x1A0D x1A5E ld a,d or a jr nz,x1A39 x1A62 pop hl pop de ld a,d or a jr nz,x1A39 ld hl,xE015 bit 1,(hl) jr z,x1A78 ;нет префикса #DD/#FD bit 4,(hl) jr nz,x1A78 bit 7,(hl) jp z,x195E ;;неизвестная команда x1A78 ld bc,(xE016) ;длина команды ld b,#00 ld sp,(xDDCB) ;восстановим стэк ret x1A83 cp #20 jr nc,x1AA7 ld (ix+#00),a inc ix set 5,(iy+#01) ld a,#22 jr x1AA7 x1A94 push de push hl bit 1,(iy+#01) jr z,x1AA7 ;нет префикса #DD/#FD ld hl,xE018 bit 7,(hl) jr nz,x1A83 bit 6,(hl) jr nz,x1A83 x1AA7 push af x1AA8 ld hl,x14B2 ld bc,#0024 cpir ld b,a jp nz,x1BD1 ld a,c cp #1E jr nc,x1AD5 cp #1C jr nc,x1B27 cp #0B jp c,x1C5B cp #14 ld hl,xE017 jr nc,x1B2D cp #11 jr c,x1B3A set 1,(hl) jp x1BD1 x1AD2 dec b jr x1B0E x1AD5 ld hl,xE015 cp #23 jr z,x1AD2 jr c,x1AE9 cp #2C jr nc,x1B13 set 3,(iy+#04) jp x1BD1 x1AE9 cp #22 jr z,x1B0E bit 1,(hl) jr z,x1B10 bit 3,(hl) jr nz,x1B10 ;есть префикс #СВ sub #1D cp #03 jr nc,x1B23 bit 7,(hl) jr nz,x1B10 bit 5,(iy+#04) jr nz,x1B10 x1B05 bit 0,(hl) jr z,x1B0B ;это префикс #DD add a,#02 x1B0B ld b,a set 4,(hl) x1B0E set 5,(hl) x1B10 jp x1BD1 x1B13 set 5,(hl) cp #2D jr nc,x1B1E ld a,#66 jp x1AA8 x1B1E ld b,#33 jp x1BD1 x1B23 add a,#7B jr x1B05 x1B27 set 7,(iy+#03) ;это ex af,af' либо exx jr x1B10 x1B2D bit 1,(hl) jr z,x1B10 ;нет префикса #DD/#FD set 5,(hl) sub #14 ld (xE032),a jr x1B10 x1B3A ld hl,(xDD73) ;регистр hl ld (xDDCE),hl cp #0E jr nz,x1B60 set 4,(iy+#03) ;это jp (hl) bit 1,(iy+#01) jr z,x1B5D ;нет префикса #DD/#FD ld hl,(xDD6F) ;регистр ix bit 0,(iy+#01) jr z,x1B5A ld hl,(xDD71) ;регистр iy x1B5A ld (xDDCE),hl x1B5D ld (xDDD0),hl x1B60 ld hl,xE015 ld a,(hl) bit 1,a jr z,x1B10 ;нет префикса #DD/#FD set 7,(hl) ld e,c ld hl,x14CB bit 0,a ld b,#00 jr z,x1B78 ;префикс #DD ld a,c add a,#06 ld c,a x1B78 add hl,bc ld b,(hl) ld (ix+#00),b inc ix ld a,e cp #0D jr nc,x1BD6 cp #0C jr nz,x1BA0 bit 4,(iy+#01) jr z,x1BA0 ld a,#01 and (ix-#02) add a,#BA ld (ix-#02),a res 4,(iy+#01) res 5,(iy+#01) x1BA0 inc (iy+#02) ld a,(xDDAC+#02) or a jp p,x1BAF inc (ix-#01) neg x1BAF ld (ix+#00),#FD inc ix ld b,a ld hl,(xDD6F) ;регистр ix bit 0,(iy+#01) jr z,x1BC2 ;префикс #DD ld hl,(xDD71) ;регистр ix x1BC2 ld de,(xDDAC+#02) ld d,#00 bit 7,e jr z,x1BCD dec d x1BCD add hl,de ld (xDDCE),hl ;адрес перехода при дизасме x1BD1 ld (ix+#00),b inc ix x1BD6 pop af push af ld hl,x14E2 ld bc,#000A cpir jr nz,x1C3C ld a,c cp #08 jr nc,x1C45 and #03 jr z,x1C00 dec a jr z,x1BF6 dec a jr z,x1BFB ld hl,(xDDD0) jr x1C03 x1BF6 ld hl,(xDD77) ;регистр bc jr x1C03 x1BFB ld hl,(xDD75) ;регистр de jr x1C03 x1C00 ld hl,(xDDCE) ;адрес перехода при дизасме x1C03 ld (xDDD2),hl ;адрес на который ссылаются команды работающие с ячейками памяти ld a,c cp #04 ld b,#02 jr nc,x1C35 dec b cp #03 jr nz,x1C1B ld a,(xDDCD) ;код команды дизасма cp #A1 jr nz,x1C35 jr x1C3C x1C1B or a jr nz,x1C35 ld a,(xDDCD) ;код команды дизасма ld hl,x14EC ld bc,#000A cpir jr z,x1C33 bit 7,(iy+#04) ld b,#01 jr z,x1C35 x1C33 ld b,#03 x1C35 ld a,b or (iy+#04) ld (iy+#04),a x1C3C pop af ld (xDDCD),a ;код команды дизасма pop hl pop de jp x1A5E x1C45 ld b,#03 ld hl,(xDD73) ;регистр hl ld (xDDD2),hl ;адрес на который ссылаются команды работающие с ячейками памяти jr x1C35 x1C4F ld (xDDD0),de ld b,#EC call x1D88 jp x1BD6 x1C5B cp #03 jr c,x1C64 ld (ix+#00),b inc ix x1C64 ld d,#00 ld hl,xE017 cp #01 jp c,x1D00 jr z,x1C8E cp #04 jr c,x1CC9 cp #06 jr c,x1C8E cp #08 jr c,x1CE4 jr z,x1CE8 cp #0A jp z,x1D58 ld a,(xDDB4) ;команда дизассемблера без префиксов and #38 set 0,(hl) ;это команда call/call cc ld e,a jp x1D44 x1C8E ld a,(xDDCD) ;код команды дизасма cp #A1 jr z,x1CC9 cp #55 jr z,x1CBB cp #53 jr z,x1CAC cp #91 jr nc,x1CB0 cp #82 jr c,x1CBD set 5,(hl) ;это команда ret cc sub #82 ld (xE032),a x1CAC set 3,(hl) ;это команда jp/jp cc jr x1CBD x1CB0 cp #99 jr nc,x1CBD set 5,(hl) ;это команда ret cc sub #91 ld (xE032),a x1CBB set 0,(hl) ;это команда call/call cc x1CBD ld de,(xDDB4+#01) inc (iy+#02) inc (iy+#02) jr x1D2C x1CC9 inc (iy+#02) ld b,#FF ld hl,xE015 bit 1,(hl) jr z,x1CDE ;нет префикса #DD/#FD bit 4,(hl) jr nz,x1CDE ld a,(xDDB4+#02) jr x1CE1 x1CDE ld a,(xDDB4+#01) x1CE1 ld e,a jr x1CF7 x1CE4 set 7,(iy+#04) x1CE8 ld a,(xDDB4) set 5,(iy+#04) and #38 rrca rrca rrca ld e,a x1CF5 ld b,#FD x1CF7 ld (ix+#00),b inc ix ld b,e jp x1BD1 ;байтовое смещение в команде x1D00 ld a,(xDDCD) cp #65 jr nz,x1D0B set 2,(iy+#04) x1D0B sub #8D jr c,x1D14 ld (xE032),a set 5,(hl) x1D14 inc (iy+#02) set 2,(hl) ld a,(xDDB4+#01) ;второй байт команды ld d,#00 or a jp p,x1D23 dec d x1D23 ld e,a ld hl,(xDDAA) ;адрес команды inc hl inc hl add hl,de ld e,l ld d,h x1D2C set 6,(iy+#01) ;байтовое смещение в команде bit 4,(iy+#00) jr z,x1D3C call x1DB3 jp c,x1C4F x1D3C ld b,#FC bit 0,(iy+#05) jr nz,x1D46 ;число в десятичной x1D44 ld b,#FE x1D46 ld (ix+#00),b inc ix ld (ix+#00),e inc ix ld b,d ld (xDDD0),de ;адрес следующей команды дизасма jp x1BD1 x1D58 ld e,#00 ld b,#FC ld a,(xDDB4) cp #46 jr z,x1CF5 inc e cp #56 jr z,x1CF5 inc e cp #5E jr z,x1CF5 set 5,(iy+#01) ld e,#00 cp #4E jr z,x1D85 cp #66 jr z,x1D85 cp #6E jr z,x1D85 inc e cp #76 jr z,x1D85 inc e x1D85 jp x1CF5 x1D88 ld (ix+0),b ld (ix+1),#4C inc ix inc ix ld c,#04 x1D95 ld l,#04 xor a x1D98 sla e rl d rla dec l jr nz,x1D98 add a,#90 daa adc a,#40 daa ld (ix+0),a inc ix dec c jr nz,x1D95 set 7,(ix-1) ret ;вх: de - данные для поиска (адрес команды для дизасма) x1DB3 or a bit 4,(iy+#00) ret z ld bc,(xDDD4) ;счетчик ld hl,(xDDD6) ;адрес чего-то x1DC0 ld a,b or c ret z ld a,(hl) inc hl cp e jr nz,x1DCC ld a,(hl) cp d scf ret z x1DCC inc hl dec bc jr x1DC0 ;АДРЕС: #1DD0 список команд отладчика x1DD0 dc "$" dc "FLOAD" dc "FSAVE" db #00 x1DDC dw x1FB0: db %00100000 ;$ (аналог WORD) dw x1E45: db %00000100 ;FLOAD dw x1E4F: db %00000100 ;FSAVE ;АДРЕС: #1DE5 выполнение слова анализатора ;вх: de - адрес слова анализатора x1DE5 ld hl,(xE11C) ;адрес первого свободного байта программы анализатора x1DE8 inc hl ld (xE9D9),hl ;адрес начала стэка анализатора inc hl ld (xE9DB),hl ;адрес вершины стэка анализатора (адрес первой свободной ячейки) ;исполнение команды анализатора ld hl,#0000 push hl push de ex de,hl x1DF6 ld a,(hl) or a inc hl jr z,x1E04 x1DFB ld e,(hl) inc hl ld d,(hl) inc hl push hl push de ex de,hl jr x1DF6 ;исполнение слова из команды анализатора x1E04 ld (xE9DD),sp call x1E0E ;call (hl) jp x2261 x1E0E jp (hl) ;АДРЕС: #1E0F установка кода команды в программу анализатора ;вх: de - адрес программы анализатора ; a - байт программы ;вых: de - адрес программы анализатора +1 (если успешно) x1E0F push hl or a ld hl,xF6C0+#FF sbc hl,de jr z,x1E1C ld (de),a inc de pop hl ret x1E1C ld a,#2D ;ошибка: insufficient program space jp x0B06 ;ввод и обработка команды отладчика ;установка параметров буфера fcb ;вх: a - способ открытия файла ; hl - номер сектора ; de - номер дорожки ;вых: hl=bc вх ; bc - четвертый параметр x1E21 call x306F ;ix=буфер fcb ld (ix+#17),a ld h,e ld (xE7A9+#0E),hl ;номер первого сектора и дорожки файла push bc ld hl,#0000 ld (xE7A9+#13),hl ;указатель в файле dec l ld (ix+#0D),l ;объем файла в секторах =#FF ld (ix+#1B),l ;максимальный объем файла в секторах =#FF ld hl,xE8A9 ld (xE7A9+#15),hl ;адрес буфера dma pop hl ld bc,(xDD99+#06) ;размер загружаемого файла (4й параметр) ret ;АДРЕС: #1E45 Команда: FLOAD track, sector, start, length ; прямое чтение с диска ;вх: de - номер дорожки ; hl - номер сектора ; bc - адрес загрузки ; a - количество операндов [0..5] x1E45 ld a,#05 call x1E21 ;установка параметров буфера fcb call x30D8 ;чтение файла в память jr x1E9B ;обработка ошибок и выход в отладчик ;АДРЕС: #1E4F Команда: FSAVE track, sector, start, length ; прямая запись на диск ;вх: de - номер дорожки ; hl - номер сектора ; bc - адрес загрузки ; a - количество операндов [0..5] x1E4F ld a,#07 call x1E21 ;установка параметров буфера fcb call x3107 ;запись области памяти на диск jr x1E9B ;обработка ошибок и выход в отладчик ;АДРЕС: #1E59 открытие файла для чтения/записи программы анализатора ;вх: hl - адрес строки имени файла ; b - способ открытия ;вых: hl - стартовый адрес файла ; bc - длина файла в байтах x1E59 call x3065 ;установка регистров для загрузки/сохранения ;hl - адрес строки имени файла ;ix - адрес буфера создаваемого fcb ;de - адрес буфера dma =xE8A9 rst #30 dw rom7_x11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) db #07 jr c,x1E9E ;ошибка чтения/записи call x0EBA ;выделение из строки числовых операндов (не более 6) or a jr z,x1E6C ;больше нет операндов ld a,#0B ;ошибка: too many operands jr x1EA2 ;полное обновление окна отладчика ;открываем файл x1E6C rst #30 dw rom7_x11DF ;открыть файл для последующих операций с ним db #07 jr c,x1E9E ;ошибка чтения/записи ld hl,(xE7A9+#09) ;стартовый адрес файла ret ;АДРЕС: #1E76 Команда: DEFSave filename x1E76 bit 3,(iy+#14) ld a,#2E ;ошибка: program undefined ret z ;ошибка: программы нет ld b,#02 ;откроем файлна запись call x1E59 ;открытие файла для записи программы анализатора ld hl,(xE11C) ;конец программы ld bc,xF6C0 ;начало программы push bc sbc hl,bc ld a,#2E ;ошибка: program undefined jr z,x1EA2 ;нулевая длина ld b,h ld c,l pop hl call x1ED6 ;запись программы анализатора в файл x1E95 jr c,x1E9E ;ошибка чтения/записи ;закрываем файл. продолжение работы отладчика x1E97 rst #30 dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 db #07 x1E9B jp nc,x0AFB x1E9E rst #30 dw rom6_x066C ;установка код дисковой ошибки в переменной для печати числа db #06 x1EA2 jp x0B06 ;полное обновление окна отладчика ;АДРЕС: #1EA5 Команда: DEFLoad filename x1EA5 ld b,#01 ;для чтения call x1E59 ;открытие файла для чтения ld de,xF6C0 ;расположение программы анализатора push de sbc hl,de pop hl ld a,#2E ;сообщение: program undefined jr nz,x1EA2 ;ошибка: несовпадение адреса загрузки dec bc dec bc ;bc - длина файла в байтах -2 ld a,b cp #04 ld a,#2D ;сообщение: insufficient program space jr nc,x1EA2 ;ошибка: слишком длинная программа push bc push bc push hl call x1F25 ;Команда: CLear (очистим область программы) pop hl pop bc call x1EFB ;чтение программы анализатора из файла jr c,x1E95 ;ошибка чтения pop de ;длина программы ld hl,xF6C0 add hl,de ex de,hl ;de - адрес первого свободного байта в буфере программы call x1F28 ;установка первого свободного байта адреса начала программы анализатора jr x1E97 ;закрываем файл. продолжение работы отладчика ;запись программы анализатора в файл ;вх: hl - адрес буфера программы анализатора ; bc - размер для записи ;вых: cy=1 ошибка записи x1ED6 ld (xE7A9+#09),hl ;стартовый адрес файла ld a,#41 ;первый байт сигнатуры call x1EF2 ;запись очередного байта в файл ret c ;ошибка записи ld a,(x00F1) ;второй байт сигнатуры call x1EF2 ;запись очередного байта в файл ret c ;ошибка записи x1EE6 ld a,(hl) call x1EF2 ;запись очередного байта в файл ret c ;ошибка записи inc hl dec bc ld a,b or c jr nz,x1EE6 ret ;запись очередного байта в файл x1EF2 push hl push bc rst #30 dw rom7_x128C ;R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" db #07 pop bc pop hl ret ;чтение программы анализатора из файла ;вх: hl - адрес буфера программы анализатора ; bc - размер для загрузки ;вых: cy=1 ошибка чтения x1EFB call x1F1C ;чтение очередного байта из файла ret c ;ошибка чтения cp #41 x1F01 ld a,#55 ;ошибка: illegal fromat file jr nz,x1EA2 ;ошибка сигнатуры файла call x1F1C ;чтение очередного байта из файла ret c ;ошибка чтения ld e,a ld a,(x00F1) cp e jr nz,x1F01 x1F10 call x1F1C ;чтение очередного байта из файла ret c ;ошибка чтения ld (hl),a inc hl dec bc ld a,b or c jr nz,x1F10 ret ;чтение очередного байта из файла x1F1C push hl push bc rst #30 dw rom7_x1240 ;R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". db #07 pop bc pop hl ret ;АДРЕС: #1F25 Команда: CLear x1F25 ld de,xF6C0 x1F28 call x205F ;установка первого свободного байта адреса начала программы анализатора xor a call x1E0F ;установка кода команды в программу анализатора call x1E0F ;установка кода команды в программу анализатора ld hl,xE9A9 ld b,#28 ;очистка буфера программы x1F37 ld (hl),a inc hl djnz x1F37 x1F3B set 3,(iy+#14) ;есть пустая программа ld a,#81 ;сообщение: enter command ret ;АДРЕС: #1F42 Команда: ANalyser boolean x1F42 ld hl,xE028 bit 3,(hl) ld a,#2E ;сообщение: program undefined ret z ;программа не задана ld a,e and #FE or d ld a,#0C ;сообщение: out of range ret nz ld a,#81 ;сообщение: enter command res 4,(hl) ;выключим анализатор bit 0,e ret z set 4,(hl) ;включим анализатор ret ;АДРЕС: #1F5B поиск введенного слова в словаре/программе пользователя ;вх: hl - адрес строки с началом слова ;вых: z - слово в словаре не найдено ; hl - адрес начала введенной строки ; de - не определен ; bc =#0000 ; nz - слово в словаре найдено ; hl - адрес начала параметра в введенной строке ; de - адрес конца слова в словаре (указывает на #00) ; bc - адрес начала введенной строки x1F5B call x0EE6 ;поиск в строке первого печатного символа push hl x1F5F call x1F9B ;проверка является ли символ буквой или цифрой ld a,#2F ;ошибка: illegal word name jp c,#0B06 ;ввод и обработка команды отладчика inc hl call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) jr nz,x1F5F ;это не разделитель pop hl ;АДРЕС: #1F6E поиск слова по словарю ;вых: z - слово в словаре не найдено ; hl - адрес начала введенной строки ; de - не определен ; bc =#0000 ; nz - слово в словаре найдено ; hl - адрес начала параметра в введенной строке ; de - адрес конца слова в словаре (указывает на #00) ; bc - адрес начала введенной строки ; a - код разделителя в строке #3A/#20/#2C/#3B/#00/#0D (: space , ;) x1F6E ld de,x23A3 ;начало базовых слов анализатора call x1F78 ;поиск слова в словаре ret nz ;слово найдено в словаре ;поиск слова в программе пользователя ld de,xF6C0 ;программа анализатора ;поиск слова по словарю ;вых: z - слово в словаре не найдено ; hl - адрес начала введенной строки ; de - не определен ; bc =#0000 ; a=#00 ; nz - слово в словаре найдено ; hl - адрес начала параметра в введенной строке ; de - адрес конца слова в словаре (указывает на #00) ; bc - адрес начала введенной строки ; определение адреса следующего слова x1F78 ld a,(de) inc de ld c,a ld a,(de) inc de ld b,a or c ;bc - адрес следующего слова ret z ;конец списка ; сравнение введенного слова сос словом из словаря push hl ;адрес введенной строки x1F81 ld a,(de) and #7F cp #20 jr c,x1F92 ;конец названия слова в словаре (слово найдено) cp (hl) inc de inc hl jr z,x1F81 x1F8D pop hl ; слово не соответствует введенному, будем проверять следующее слово в словаре ld e,c ld d,b jr x1F78 ; проверяем наличие разделителя после введенного слова x1F92 call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) jr nz,x1F8D ;это не разделитель, сравниваем со следующим словом в словаре inc hl pop bc or a ret ;проверка является ли символ буквой или цифрой ;вх: a - код символа ;вых: cy=1 - этоне буква/цифра x1F9B cp #30 ;"0" ret c cp #3A ;":" ccf ret nc cp #41 ;"A" ret c cp #5B ;"Z"+1 ccf ret nc cp #61 ;"a" ret c cp #7B ;"z"+1 ccf ret ;АДРЕС: #1FB0 Команда: WORD word[:] program ;вх: hl - адрес начала строки с параметрами команды x1FB0 call x1F5B ;поиск введенного слова в словаре/программе пользователя jp nz,x2148 ;слово найдено ;проверка на совпадение с зарезервированными словами x1FB6 ld de,(xE11C) ;адрес первого свободного байта программы анализатора inc de inc de push hl ld bc,xE9A9 ;буфер программы анализатора ld a,#73 ;"s" cp (hl) jr nz,x1FCD ld a,#74 ;"t" x1FC7 inc hl cp (hl) jr nz,x2001 jr x1FD9 ;это зарезервированное слово: st?/br? x1FCD ld bc,xE9BD ld a,#62 ;"b" cp (hl) jr nz,x2001 ld a,#72 ;"r" jr x1FC7 ; есть ли цифра после букв x1FD9 inc hl ld a,(hl) sub #30 jr c,x2001 cp #0A jr nc,x2001 inc hl push bc ;адрес буфера адресов зарезервированных слов ld c,a ;номер слова call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) jr nz,x2000 ;таки не принадлежит зарезервированным словам ; задаваемое слово - из зарезервированных слов sla c ld b,#00 pop hl ;адрес буфера адресов зарезервированных слов add hl,bc ex (sp),hl call x2002 ;запись нового слова в программу-анализатор pop hl ;адрес буфера адресов зарезервированных слов ld de,(xE9D1) ;адрес начала параметров-слов в программе анализатора ld (hl),e inc hl ld (hl),d jp x1F3B ;запись нового слова в программу-анализатор ;вх: de - адрес начала программы анализатора x2000 pop hl x2001 pop hl ;установка названия слова-программы анализатора x2002 ld a,(hl) or #80 ;первый символ слова call x1E0F ;установка кода команды в программу анализатора x2008 inc hl ld a,(hl) ;очередной символ слова call x1E0F ;установка кода команды в программу анализатора call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) jr nz,x2008 ;это еще не разделитель cp #0D x2014 ld a,#30 ;сообщение: no definition jp z,x0B06 ;конец строки. есть имя, но нет содержания x2019 ld a,#01 dec de ld (de),a ;признак конца названия слова ld (xE9D1),de inc de ;установка слов-параметров программы inc hl call x0EE6 ;поиск в строке первого печатного символа jr z,x2014 ;нет параметров в пограмме. выход x2028 push de ;адрес в программе анализатора call x1F6E ;поиск слова по словарю ld b,a ;код разделителя в строке #3A/#20/#2C/#3B/#00/#0D (: space , ;) ld a,e ld c,d ;ca - адрес конца слова в словаре (указывает на #00) pop de ;адрес программы анализатора jr z,x2064 ;слова в словаре нет ; установка адреса конца слова в словаре call x1E0F ;установка кода команды в программу анализатора ld a,c call x1E0F ;установка кода команды в программу анализатора ; проверка конца строки ld a,b cp #0D jr z,x2043 ;больше нет слов в параметрах x203E call x0EE6 ;поиск в строке первого печатного символа jr nz,x2028 ;слово найдено ; слова-параметры закончились x2043 ld hl,x225D ;п/п прерывания выполнения слова ld a,l call x1E0F ;установка кода команды в программу анализатора ld a,h call x1E0F ;установка кода команды в программу анализатора xor a call x1E0F ;установка кода команды в программу анализатора call x1E0F ;установка кода команды в программу анализатора dec de dec de ;указывает на маркер конца определяемого слова ;установка свободного адреса в программе анализаторе ld hl,(xE11C) ld (hl),e inc hl ld (hl),d ld a,#81 ;сообщение: enter command ;АДРЕС: #205F установка адреса начала программы анализатора ;вх: de - адрес программы анализатора x205F ld (xE11C),de ret ;если число, записываем п/п обработки числа, если отсутствующее слово, то выход ;вх: de - первый свободный адрес в программе анализатора ; hl - адрес слова-параметра в введенной строке ; bc =#0000 x2064 push de call x0DF4 ;преобразование строки в число (!!!при base 0 работает неверно!!!) ld c,e ld b,d ;bc - число pop de jr z,x2076 ;это число cp #0D ;!!!ОШИБКА!!! A не может быть =#0D jr nz,x2073 ld a,#31 ;сообщение: word not known x2073 jp x0B06 ; установка в программу п/п обработки числа x2076 push hl ld hl,x2340 ;п/п обработки числа в программе анализатора ld a,l call x1E0F ld a,h call x1E0F ld a,(xE024) ;делитель для выделения разряда числа call x1E0F ld a,c call x1E0F ld a,b call x1E0F pop hl jr x203E ;АДРЕС: #2093 Команда: EDit ;вх: hl - адрес начала строки с параметрами команды x2093 call x1F5B ;поиск введенного слова в словаре/программе пользователя ld a,#31 ;ошибка: word not known ret z ;слово не найдено dec hl ;следующий адрес в введенной строке (после найденного слова) call x0EE6 ;поиск в строке первого печатного символа ld a,#0B ;ошибка: too many operands ret nz ;выход ex de,hl ld a,(hl) or a jr z,x20BD ;слово в базовом словаре есть !!!ОШИБКА(убрать???)!!! приводит к зависанию ld a,#32 ;ошибка: forbidden type word ret z ;!!!ОШИБКА!!! тут выхода не будет никогда call x20AE ld a,#06 ;_Working ... ret ;печать слова из словаря пользователя ;вх: hl - адрес конца команды/слова анализатора x20AE ld de,x20FF ;адрес выхода из п/п push de ld de,xDE17 ;буфер для печати ld (xE3BC),de ld a,#20 ;" " ld b,#2B ;"+" ;слово есть в базовом словаре x20BD ld (de),a inc de djnz x20BD set 6,(iy+#09) ;чтение данных после управляющего кода ld a,#24 ;"$" rst #10 ;печать символа ;АДРЕС: #20C8 печать редактируемого слова ;вх: hl - адрес конца команды/слова анализатора ;печать названия программы(слова) x20C8 call x2112 ;поиск начала и печать слова анализатора ld a,":" rst #10 ;печать слов программы x20CE ld a," " rst #10 call x2121 ;чтение ld bc,(hl+1): hl=hl+2 push hl ld hl,x225D ;п/п зхавершения выполнения слова or a sbc hl,bc jr z,x20ED ;это конец программы ld hl,x2340 ;п/п обработки числа or a sbc hl,bc jr z,x20EF ;это число, а не слово ld l,c ld h,b call x2112 ;поиск начала и печать слова анализатора x20EA pop hl jr x20CE ;следующее слово программы ;конец программы x20ED pop hl ret ;это число, а не слово x20EF pop hl inc hl ld e,(hl) ;система счисления call x2121 ;чтение ld bc,(hl+1): hl=hl+2 ld a,e or a push hl jr z,x2126 ;печать однобайтного числа в кавычках x20FA call x2130 ;печать числа в заданной системе счисления jr x20EA ;выход из п/п x20FF res 6,(iy+#09) ret ;АДРЕС: #2104 печать слова анализатора ;вх: hl - адрес слова анализатора ;вых: hl - адрес начала следующего слова ; cy=1 слово напечатано ; cy=0 нет больше слов для печати x2104 ld e,(hl) inc hl ld d,(hl) inc hl ld a,e or d ret z rst #20 db #8D ;перевод строки call x2117 ;печать сообщения из hl. конец сообщения [#00..#1F] ex de,hl ret ;АДРЕС: #2112 поиск начала и печать команды отладчика/слова анализатора ;вх: hl - адрес конца команды/слова анализатора ;вх: hl - не изменяется x2112 dec hl bit 7,(hl) jr z,x2112 ;печать сообщения из hl. конец сообщения [#00..#1F] x2117 ld a,(hl) and #7F cp #20 ret c rst #10 inc hl jr x2117 ;АДРЕС: #2121 чтение ld bc,(hl+1): hl=hl+2 x2121 inc hl ld c,(hl) inc hl ld b,(hl) ret ;печать однобайтного числа в кавычках x2126 ld a,#22 ;'"' push af rst #10 ld a,c rst #10 pop af rst #10 jr x20EA ;печать числа в заданной системе счисления ;вх: bc - число ; a - основание системы счисления x2130 ld hl,x162C ;п/п печати числа в заданной системе счисления push hl ld d,a ld e,"%" cp #02 ret z ;двоичная ld e,"@" cp #08 ret z ;восьмеричная ld e,#2E ;"." cp #0A ret z ;десятичная ld de,#1023 ret ;шестнадцатиричная ;АДРЕС: #2148 Команда: WORD word[:] program ; Продолжение (для переопределения уже определенных слов) ;Вх: de - адрес конца слова в программе (указывает на #01) ; bc - адрес начала введенной строки x2148 ld (xE9D3),de ;адрес конца названия слова в программе (указывает на #01) ld hl,(xE11C) ;адрес первого свободного байта программы анализатора push hl ex de,hl ;ищем начало слова x2151 bit 7,(hl) dec hl jr z,x2151 dec hl ld (xE9D5),hl ;адрес первой ячейки переопределяемого слова ;записываем новое слов в программу ld h,b ld l,c ;адрес начала введенной строки call x1FB6 ;установка слова праграммы ;удаление переопределяемого слова ld hl,(xE9D5) ;адрес первой ячейки переопределяемого слова ld e,(hl) inc hl ld d,(hl) dec hl ex de,hl push de ;de - адрес начала переопределяемого слова push hl ;hl - адрес начала следующего слова, после переопределяемого push hl ld b,h ld c,l ;bc - адрес начала следующего слова, после переопределяемого ld hl,(xE11C) ;адрес первого свободного байта программы анализатора or a sbc hl,bc ld b,h ld c,l ;bc - длина перемещаемого блока программы inc bc inc bc pop hl ldir dec de dec de ld (xE11C),de pop de ;de - адрес начала следующего слова, после переопределяемого pop hl ;hl - адрес начала переопределяемого слова or a sbc hl,de ld b,h ld c,l pop hl add hl,bc inc hl x2189 inc hl ld a,(hl) cp #20 jr nc,x2189 ld (xE9D7),hl ;адрес конца названия переопределенного слова в программе (указывает на #01) ;коррекция адресов слов в программе ld hl,xF6C0 ;начало программы x2195 ld e,(hl) inc hl ld d,(hl) ld a,d or e ;адрес следующего слова jr z,x21D7 ;конец программы push hl ;адрес ячейки с указанием на следующее слово ld hl,(xE9D5) ;адрес первой ячейки переопределяемого слова or a sbc hl,de jr nc,x21AE ld h,b ld l,c ;на сколько сократилась программа add hl,de ex de,hl pop hl push hl ld (hl),d dec hl ld (hl),e x21AE pop hl inc hl ; ищем конец слова x21B0 ld a,(hl) inc hl cp #20 jr nc,x21B0 x21B6 ld e,(hl) inc hl ld d,(hl) ;de - адрес слова программы inc hl push hl ld hl,x2340 or a sbc hl,de jr nz,x21C9 ;это не число pop hl ;для числа оставляем как есть inc hl inc hl inc hl jr x21B6 x21C9 ld hl,x225D ;прерывание выполнения слова or a sbc hl,de pop hl jr z,x2195 ;это конец слова-программы call x21F3 ;коррекция адреса конца пользовательского слова в программе jr x21B6 ;завершение. коррекция адресов зарезервированных слов в программе x21D7 ld hl,xE9A9 ;адреса зарезервированных слов анализатора st0-st9 call x21E0 ld hl,xE9BD ;адреса зарезервированных слов анализатора br0-br9 x21E0 ld a,#0A x21E2 push af ld e,(hl) inc hl ld d,(hl) inc hl ld a,d or e call nz,x21F3 pop af dec a jr nz,x21E2 ld a,#88 ;сообщение: word redefined ret ;коррекция адреса конца пользовательского слова в программе x21F3 push hl ld hl,(xE9D3) or a sbc hl,de jr z,x220E jr nc,x220C ld a,(de) or a jr z,x220C ld h,b ld l,c add hl,de ex de,hl x2206 pop hl push hl dec hl ld (hl),d dec hl ld (hl),e x220C pop hl ret x220E ld de,(xE9D7) jr x2206 ;АДРЕС: #2214 Команда: PDEFinition вывод на принтер Форт - программы x2214 set 4,(iy+#09) ;АДРЕС: #2218 Команда: LDEFinition вывод на экран Форт - программы x2218 call x3A95 ;подготовка переменных к выводу на экран/принтер ld bc,#3300 ;сообщение: analyser definitions: rst #08 rst #20 db #0D,#8D ;печать размера свободной области ld hl,xF6C0+#FF ;адрес конца стэка анализатора ld de,(xE11C) ;адрес первого свободного байта стэка анализатора scf sbc hl,de ld (xDDA7),hl ld bc,#3400 ;сообщение: space left for stack _число_ rst #08 ld a," " rst #10 ld bc,#3500 ;сообщение: bytes rst #08 rst #20 db #0D,#8D ;печать списка заданных слов ld hl,xF6C0 x2240 ld c,(hl) inc hl ld b,(hl) ld a,b or c jr z,x2256 ;конец программы push bc ;адрес следующего слова inc hl inc hl call x20C8 ;печать редактируемого слова ld a,#0D rst #10 ;перевод строки call x37B9 ;управление выводимым листингом (опрос клавиш space, s, cs+1) pop hl jr x2240 ;завершение печати x2256 res 4,(iy+#09) ;печать в экран ld a,#81 ;сообщение: enter command ret ;АДРЕС: #225D прерывание выполнения слова/завершение работы форт программы x225D nop pop hl pop hl pop hl ;АДРЕС: #2261 переход к обработке следующего слова в программе анализатора ; или выход, если слов больше нет x2261 pop de pop hl ld a,l or h jp nz,x1DFB ;слов в программе больше нет bit 5,(iy+#14) ret nz ;вызов был из команды EVal push hl push de ld (xE9DD),sp ld hl,(xE9DB) ld de,(xE11C) inc de inc de inc de inc de or a sbc hl,de ld a,#36 ;сообщение: stack not empty jp nz,x2307 ;обработка ошибок при работе программы анализатора call x237F ;чтение элемента с вершины стэка анализатора ld a,c or b pop hl pop hl ret z pop hl pop hl pop af ld l,a ;число для сообщения ld a,#85 ;сообщение: stop number _число_ jp x01D5 ;АДРЕС: #2297 Команда: EVal word выполнить слово word ;вх: hl - адрес строки с параметрами x2297 bit 3,(iy+#14) ld a,#2E ;сообщение: program undefined ret z ;программа анализатора не задана ;анализ команды ассемблера по адресу PC push hl ld hl,(xDD6B) ;pc программы пользователя call x2F96 ;анализ команды ассемблера по адресу в hl pop hl ;установка слов команды в программу анализатора ld de,(xE11C) ;адрес первого свободного байта программы анализатора push de push hl inc de inc de ;поправка на адрес ld hl,x2301 ld b,#07 x22B3 ld a,(hl) call x1E0F ;установка кода команды в программу анализатора inc hl djnz x22B3 pop hl ;hl - адрес строки с параметрами команды (список слов на выполнение) dec hl ;de - адрес первого свободного байта программы анализатора push de call x2019 ;установка слов в программу pop de dec de ;выполнение введенных слов ld hl,(xE11C) ;адрес первого свободного байта программы анализатора ex (sp),hl ld (xE11C),hl xor a ld (hl),a inc hl ld (hl),a ;нет больше слов, только эти set 5,(iy+#14) ;работает команда EVal word pop hl call x1DE8 ;выполнение слова анализатора res 5,(iy+#14) ;печать содержимого стэка анализатора call x3A95 ;подготовка переменных к выводу на экран/принтер ld bc,#3700 ;сообщение: state of stack rst #08 ;печать сообщения ld a,#0D rst #10 ;перевод строки ld de,(xE9D9) ;адрес начала стэка анализатора inc de x22E8 ld hl,(xE9DB) ;адрес вершины стэка анализатора or a sbc hl,de ld a,#81 ;сообщение: enter command ret z ;стэк пустой push de ld a,#0D rst #10 ;перевод строки call x237F ;чтение элемента с вершины стэка анализатора call x1614 ;печать числа в bc (dec/hex) с префиксом call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) pop de jr x22E8 x2301 db #80+"*","eval*" ;обработка ошибок при работе программы анализатора ;вх: a - номер сообщения об ошибке x2307 ld (xDDA7),a ld sp,(xE9DD) call x0550 ;сохранение экрана из страницы 5 call x3A95 ;подготовка переменных к выводу на экран/принтер ld bc,#3800 ;сообщение: workspace insufficient rst #08 ;печать сообщения по номеру в BC rst #20 db #0D,#8D ;два перевода строки x231B pop hl push hl ld de,x2340 or a sbc hl,de pop hl jr z,x2332 push hl rst #20 dc "in " pop hl call x2112 ;поиск начала и печать слова анализатора ld a,#0D rst #10 ;перевод строки x2332 call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) pop hl ld a,h or l jr nz,x231B ld a,(xDDA7) jp x0B06 ; обработки числа в программе анализатора x2340 nop pop ix pop de pop hl call x2121 ;чтение ld bc,(hl+1): hl=hl+2 inc hl push hl push de push ix ;АДРЕС: #234D запись элемента на стэк анализатора ;вх: bc - значение для помещения на стэк анализатора x234D push hl push de ld hl,(xE9DB) ;адрес вершины стэка анализатора push hl inc hl inc hl ld de,xF6C0+#FF ;xF7BF адрес конца стэка анализатора or a sbc hl,de ld a,#39 ;сообщение: out of stack space jr nc,x2307 ;нет места на стэке pop hl ld (hl),c ;пишем значение на стэк inc hl ld (hl),b inc hl ;АДРЕС: #2364 установка нового значения вершины стэка анализатора ;вх: hl - адрес новой вершины стэка x2364 ld (xE9DB),hl pop de pop hl ret ;АДРЕС: #236A запись на стэк анализатора байта из ячейки памяти пользователя ;вх: bc - адрес памяти x236A push hl ld l,c ld h,b ;адрес в памяти пользователя rst #28 ;чтение байта из памяти пользователя pop hl ld c,a ld b,#00 jr x234D ;запись элемента на стэк анализатора ;АДРЕС: #2374 запись на стэк анализатора слова из ячеек памяти пользователя ;вх: bc - адрес памяти x2374 push hl ld l,c ld h,b rst #28 ;чтение байта из памяти пользователя ld c,a inc hl rst #28 ;чтение байта из памяти пользователя ld b,a pop hl jr x234D ;запись элемента на стэк анализатора ;АДРЕС: #237F чтение элемента с вершины стэка анализатора ;вых: bc - считанное значение x237F push hl push de ld hl,(xE9DB) ;адрес вершины стэка анализатора dec hl push hl or a ld de,(xE9D9) ;адрес начала стэка анализатора sbc hl,de ld a,#3A ;сообщение: stack empty jp z,x2307 ;выход по ошибке pop hl ld b,(hl) dec hl ld c,(hl) ;bc - содержимое вершины стэка анализатора jr x2364 ;АДРЕС: #2398 чтение двух элементов с вершины стэка анализатора ;вых: hl,de - первое значение ; bc - второе значение x2398 call x237F ;чтение элемента с вершины стэка анализатора push bc call x237F ;чтение элемента с вершины стэка анализатора pop de ld l,e ld h,d ret ;АДРЕС: #23A3 базовые слова анализатора ;слово: NOP нет операции ; +0 2 адрес следующего слова (=#0000 это конец списка) ; +2 n слово анализатора (в первом байте 7,=1), #00 признак конча слова ; +2+n процедура обработки слова x23A3 dw x23AA db #80+"N","OP",#00 ; процедура обработки ret ;слово: DUP Дублировать содержимое вершины стека. На стеке создается копия ; верхнего элемента x23AA dw x23B8 db #80+"D","UP",#00 ; процедура обработки x23B0 call x237F ;чтение элемента с вершины стэка анализатора call x234D ;запись элемента на стэк анализатора jr x234D ;запись элемента на стэк анализатора ;слово: SWAP перестановка двух элементов на вершине стека x23B8 dw x23CC db #80+"S","WAP",#00 ; процедура обработки x23BF call x2398 ;чтение двух элементов с вершины стэка анализатора push bc ld c,l ld b,h call x234D ;запись элемента на стэк анализатора pop bc x23C9 jp x234D ;запись элемента на стэк анализатора ;слово: OVER копирование второго от вершины элемента стека. Копия помещается ; на вершину стека x23CC dw x23E0 db #80+"O","VER",#00 ; процедура обработки call x237F ;чтение элемента с вершины стэка анализатора push bc call x23B0 ;слово: DUP pop bc call x234D ;запись элемента на стэк анализатора jr x23BF ;слово: SWAP ;слово: ROT циклический сдвиг трех верхних элементов стека. Третий от вершины ; стека элемент помещается на вершину стека. x23E0 dw x23FE db #80+"R","OT",#00 ; процедура обработки x23E6 call x2398 ;чтение двух элементов с вершины стэка анализатора push hl push bc call x237F ;чтение элемента с вершины стэка анализатора pop hl push bc ld c,l ld b,h call x234D ;запись элемента на стэк анализатора pop de pop bc push de call x234D ;запись элемента на стэк анализатора pop bc jr x23C9 ;запись значения на стэк анализатора ;слово: DROP удаление верхнего элемента стека x23FE dw x2408 db #80+"D","ROP",#00 ; процедура обработки jp x237F ;чтение элемента с вершины стэка анализатора ;слово: + получить значение суммы двух верхних элементов стека x2408 dw x2414 db #80+"+",#00 ; процедура обработки call x2398 ;чтение двух элементов с вершины стэка анализатора add hl,bc x2410 ld c,l ld b,h jr x23C9 ;запись значения на стэк анализатора ;слово: - получить значение разности двух верхних элементов стека x2414 dw x2422 db #80+"-",#00 ; процедура обработки x2418 call x2398 ;чтение двух элементов с вершины стэка анализатора ld h,b ld l,c or a sbc hl,de jr x2410 ;запись значения на стэк анализатора ;слово: / получить значение частного от целочисленного деления двух верхних ; элементов стека x2422 dw x2439 db #80+"/",#00 ; процедура обработки call x2398 ;чтение двух элементов с вершины стэка анализатора ld l,c ld h,b call x0E73 ;деление bc=hl/de с проверкой de на ноль bit 2,(iy+#0E) ;=1 ошибка. деление на ноль jr z,x2456 ;запись элемента на стэк анализатора ld a,#40 ;сообщение: devision by zero jp x2307 ;слово: * получить значение произведения двух верхних элементов стека x2439 dw x2447 db #80+"*",#00 ; процедура обработки call x2398 ;чтение двух элементов с вершины стэка анализатора ld l,c ld h,b call x0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) jr x2410 ;запись значения на стэк анализатора ;слово: AND получить значение операции поразрядного логического "И" над двумя ; верхними элементами стека x2447 dw x2459 db #80+"A","ND",#00 ; процедура обработки call x2398 ;чтение двух элементов с вершины стэка анализатора ld a,c and l ld c,a ld a,b and h ld b,a x2456 jp x234D ;запись элемента на стэк анализатора ;слово: OR получить значение операции поразрядного логического "ИЛИ" над двумя ; верхними элементами стека x2459 dw x2469 db #80+"O","R",#00 ; процедура обработки call x2398 ;чтение двух элементов с вершины стэка анализатора ld a,c or l ld c,a ld a,b or h ld b,a jr x2456 ;запись элемента на стэк анализатора ;слово: XOR получить значение операции поразрядного логического "Исключающее ; ИЛИ" над двумя верхними элементами стека x2469 dw x247A db #80+"X","OR",#00 ; процедура обработки call x2398 ;чтение двух элементов с вершины стэка анализатора ld a,c xor l ld c,a ld a,b xor h ld b,a jr x2456 ;запись элемента на стэк анализатора ;слово: NOT инвертировать значение находящееся на вершине стека x247A dw x248B db #80+"N","OT",#00 ; процедура обработки call x237F ;чтение элемента с вершины стэка анализатора ld a,b cpl ld b,a ld a,c cpl ld c,a jr x2456 ;запись элемента на стэк анализатора ;слово: = истина при равенстве двух элементов, в противном случае Ложь x248B dw x2494 db #80+"=",#00 ; процедура обработки call x2418 ;слово: - jr x24CB ;слово: 0= ;слово: 0> истина, если элемент положителен (больше нуля), в противном случае ; Ложь x2494 dw x24A7 db #80+"0",">",#00 ; процедура обработки x2499 call x237F ;чтение элемента с вершины стэка анализатора ld a,c or b x249E ld bc,#0000 jr z,x24A4 x24A3 inc bc x24A4 jp x234D ;запись элемента на стэк анализатора ;слово: < истина, если n1 меньше чем n2, в противном случае Ложь x24A7 dw x24BA db #80+"<",#00 ; процедура обработки x24AB call x2398 ;чтение двух элементов с вершины стэка анализатора ld l,c ld h,b or a sbc hl,de x24B3 ld bc,#0000 jr c,x24A3 ;запись =1 на стэк анализатора jr x24A4 ;запись =0 на стэк анализатора ;слово: > истина, если n1 больше чем n2, в противном случае Ложь x24BA dw x24C6 db #80+">",#00 ; процедура обработки x24BE call x2398 ;чтение двух элементов с вершины стэка анализатора or a sbc hl,bc jr x24B3 ;слово: 0= истина, если элемент равен нулю, в противном случае Ложь x24C6 dw x24D8 db #80+"0","=",#00 ; процедура обработки x24CB call x237F ;чтение элемента с вершины стэка анализатора ld a,c or b inc bc jr z,x24D6 ld bc,#0000 x24D6 jr x24A4 ;запись элемента на стэк анализатора ;слово: <= истина, если n1 меньше или равно n2, в противном случае Ложь x24D8 dw x24E2 db #80+"<","=",#00 ; процедура обработки x24DD call x24BE ;слово: > jr x24CB ;слово: 0= ;слово: >= истина, если n1 больше или равно n2, в противном случае Лож x24E2 dw x24EC db #80+">","=",#00 ; процедура обработки call x24AB ;слово: < jr x24CB ;слово: 0= ;слово: <> истина, если n1 не равно n2, в противном случае Ложь x24EC dw x24F6 db #80+"<",">",#00 ; процедура обработки call x2418 ;слово: - jr x2499 ;слово: 0> ;слово: & поместить на вершину стека значение операции логическое "И" над двумя ; верхними элементами стека, сами элементы при этом удаляются. В ; отличие от слова AND, слово & работает с логическими величинами ; (Истина и Ложь) x24F6 dw x2505 db #80+"&",#00 ; процедура обработки call x2398 ;чтение двух элементов с вершины стэка анализатора ld a,b or c jr z,x249E ld a,l or h jr x249E ;слово: C@ разместить на вершине стека байт, считанный по адресу n1 x2505 dw x2510 db #80+"C","@",#00 ; процедура обработки call x237F ;чтение элемента с вершины стэка анализатора jp x236A ;запись на стэк анализатора байта из ячейки памяти пользователя ;слово: C@ разместить на вершине стека байт, считанный по адресу n1 x2510 dw x251A db #80+"@",#00 ; процедура обработки call x237F ;чтение элемента с вершины стэка анализатора jp x2374 ;запись на стэк анализатора слова из ячеек памяти пользователя ;слово: BIT разместить на вершине стека значение бита с номером n1 в элементе n2 x251A dw x253D db #80+"B","IT",#00 ; процедура обработки call x2398 ;чтение двух элементов с вершины стэка анализатора ld h,#00 ld a,l and #0F ld de,#0001 jr x2531 x252D sla e rl d x2531 dec a jp p,x252D ld a,e and c ld c,a ld a,d and b or c jr x255E ;запись значения на стэк анализатора ;слово: ADDR разместить на вершине стека значение адреса на который ссылаются ; команды работающие с ячейками памяти, такие как LD ( ),reg или ; SET b,(IX+d). Для других команд на стек помещается значение 0 x253D dw x2555 db #80+"A","DDR",#00 ; процедура обработки ld a,(iy+#04) ld bc,#0000 and %00000011 jr z,x2552 ld bc,(xDDD2) x2552 jp x234D ;запись значения на стэк анализатора ;слово: RD истина, если команда считывает из памяти, и Ложь, если считывания ; не происходит x2555 dw x2561 db #80+"R","D",#00 ; процедура обработки bit 0,(iy+#04) x255E jp x249E ;запись значения на стэк анализатора ;слово: WR истина, если команда производит запись в память, и Ложь, если запись ; не выполняется x2561 dw x256C db #80+"W","R",#00 ; процедура обработки bit 1,(iy+#04) jr x255E ;слово: ACF помещает на вершину стека значение Истина, если команда использует ; доступ к ячейке памяти, для других команд - помещается значение Ложь x256C dw x2579 db #80+"A","CF",#00 ; процедура обработки ld a,(xE018) and %00000011 jr x255E ;слово: CF значение флага переноса x2579 dw x2586 db #80+"C","F",#00 ; процедура обработки ld a,#01 x2580 ld hl,xDD7F and (hl) jr x255E ;слово: NF значение флага команды вычитания x2586 dw x258F db #80+"N","F",#00 ; процедура обработки ld a,#02 jr x2580 ;слово: PVF значение флага четности/переполнения x258F dw x2599 db #80+"P","VF",#00 ; процедура обработки ld a,#04 jr x2580 ;слово: HF значения флага двоично - десятичного переноса x2599 dw x25A2 db #80+"H","F",#00 ; процедура обработки ld a,#10 jr x2580 ;слово: ZF значение флага нулевого результата x25A2 dw x25AB db #80+"Z","F",#00 ; процедура обработки ld a,#40 jr x2580 ;слово: SF значение флага отрицательного результата x25AB dw x25B4 db #80+"S","F",#00 ; процедура обработки ld a,#80 jr x2580 ;слово: REG размещает на вершине стека значение регистровой пары, соответствующей коду n1 x25B4 dw x25CC db #80+"R","EG",#00 ; процедура обработки call x237F ;чтение элемента с вершины стэка анализатора ;запись регистровой пары на стэк анализатора ;вх: c - код регистровой пары/ячейки MEM x25BD ld hl,xDD69 ;адрес текущей ячейки в мониторе ld b,#00 add hl,bc ld c,(hl) inc hl ld b,(hl) ;bc - значение регистровой пары/ячейки MEM jr x2552 ;запись элемента на стэк анализатора ;чтение кода и запись регистровой пары на стэк анализатора x25C8 pop hl ld c,(hl) jr x25BD ;запись регистровой пары на стэк анализатора ;слово: CREG размещает на вершине стека значение регистра, выбираемого кодом n1 x25CC dw x25E6 db #80+"C","REG",#00 ; процедура обработки call x237F ;чтение элемента с вершины стэка анализатора x25D6 ld hl,xDD69 ld b,#00 add hl,bc ld c,(hl) ld b,#00 jp x234D ;запись элемента на стэк анализатора x25E2 pop hl ld c,(hl) jr x25D6 ;слово: SP размещает на вершине стека значение регистра SP x25E6 dw x25EF db #80+"S","P",#00 ; процедура обработки call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора db #04 ;слово: PC размещает на вершине стека значение регистра PC x25EF dw x25F8 db #80+"P","C",#00 ; процедура обработки call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора db #02 ;слово: IX размещает на вершине стека значение регистра IX x25F8 dw x2601 db #80+"I","X",#00 ; процедура обработки call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора db #06 ;слово: IY размещает на вершине стека значение регистра IY x2601 dw x260A db #80+"I","Y",#00 ; процедура обработки call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора db #08 ;слово: BC размещает на вершине стека значение регистра BC x260A dw x2613 db #80+"B","C",#00 ; процедура обработки call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора db #0E ;слово: DE размещает на вершине стека значение регистра DE x2613 dw x261C db #80+"D","E",#00 ; процедура обработки call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора db #0C ;слово: HL размещает на вершине стека значение регистра HL x261C dw x2625 db #80+"H","L",#00 ; процедура обработки call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора db #0A ;слово: AF размещает на вершине стека значение регистра AF x2625 dw x262E db #80+"A","F",#00 ; процедура обработки call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора db #16 ;слово: C размещает на вершине стека значение регистра C x262E dw x2636 db #80+"C",#00 ; процедура обработки call x25E2 db #0E ;слово: B размещает на вершине стека значение регистра B x2636 dw x263E db #80+"B",#00 ; процедура обработки call x25E2 db #0F ;слово: E размещает на вершине стека значение регистра E x263E dw x2646 db #80+"E",#00 ; процедура обработки call x25E2 db #0C ;слово: D размещает на вершине стека значение регистра D x2646 dw x264E db #80+"D",#00 ; процедура обработки call x25E2 db #0D ;слово: L размещает на вершине стека значение регистра L x264E dw x2656 db #80+"L",#00 ; процедура обработки call x25E2 db #0A ;слово: H размещает на вершине стека значение регистра H x2656 dw x265E db #80+"H",#00 ; процедура обработки call x25E2 db #0B ;слово: F размещает на вершине стека значение регистра F x265E dw x2666 db #80+"F",#00 ; процедура обработки call x25E2 db #16 ;слово: A размещает на вершине стека значение регистра A x2666 dw x266E db #80+"A",#00 ; процедура обработки call x25E2 db #17 ;слово: MEM поместить на вершину стека значение текущей ячейки монитора x266E dw x2678 db #80+"M","EM",#00 ; процедура обработки call x25C8 ;чтение кода и запись номера ячейки на стэк анализатора db #00 ;код ячейки MEM ;слово: CALL выполнить подпрограмму, расположенную по адресу n1 x2678 dw x269A db #80+"C","ALL",#00 ; процедура обработки push iy push ix call x268B pop ix pop iy ret x268B call x237F ;чтение элемента с вершины стэка анализатора push bc ld ix,xDD69 ld de,x234D ;п/п записи элемента на стэк анализатора ld hl,x237F ;п/п чтения элемента с вершины стэка анализатора ret ;слово: ! слово (два смежных байта) n1 поместить в память по адресу n2 x269A dw x26A7 db #80+"!",#00 ; процедура обработки call x2398 ;чтение двух элементов с вершины стэка анализатора ld a,c rst #00 ;запись байта в память пользователя inc hl ld a,b x26A5 rst #00 ;запись байта в память пользователя ret ;слово: C! байт n1 поместить в ячейку памяти, адресуемую n2 x26A7 dw x26B2 db #80+"C","!",#00 ; процедура обработки call x2398 ;чтение двух элементов с вершины стэка анализатора ld a,c jr x26A5 ;слово: IF если верхний элемент стека имеет значение Ложь (равен нулю), то ; выполнение слова, содержащего IF, прекращается. Управление передается ; вызвавшему слову (либо происходит окончание выполнения ; Форт - программы, если слово является первым). В противном случае ; (верхний элемент - Истина) продолжается выполнение текущего слова x26B2 dw x26C0 db #80+"I","F",#00 ; процедура обработки call x237F ;чтение элемента с вершины стэка анализатора ld a,b or c ret nz ;продолжаем выполнять jp x225D ;прерывание выполнения слова ;слово: MEM! установить адрес текущей ячейкой монитора n1 x26C0 dw x26CF db #80+"M","EM!",#00 ; процедура обработки call x237F ;чтение элемента с вершины стэка анализатора ld (xDD69),bc ret ;слово: ?PAUSE ожидание нажатия на любую клавишу, если верхний элемент стека ; имеет значение Истина (не равен нулю). После нажатия на клавишу ; выполнение программы продолжается. Если вовремя ожидания ввести ; комбинацию EDIT/C, то выполнение Форт - программы будет прервано, ; а управление передано монитору x26CF dw x26EA db #80+"?","PAUSE",#00 ; процедура обработки call x237F ;чтение элемента с вершины стэка анализатора ld a,c or b ret z rst #30 dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) db #06 cp #03 ;cs+1+c ret nz ld a,#9A ;сообщение: command abandoned jp x2307 ;слово: KEY ожидание нажатия на какую-либо клавишу, код клавиш будет помещен на ; вершину стека x26EA dw x26FA db #80+"K","EY",#00 ; процедура обработки rst #30 dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) db #06 x26F4 ld c,a ld b,#00 x26F7 jp x234D ;запись элемента на стэк анализатора ;слово: ?MEM обновить (перевывести) вывести дамп памяти на экран (используется ; экран дампа памяти теневого монитора), если n1 истина ; (не равно нулю) x26FA dw x270C db #80+"?","MEM",#00 ; процедура обработки call x2736 and #CF ;обновлять дамп памяти, обновлять дизассемблер памяти по содержимому ячейки памяти x2706 ld (xE01E),a jp x2CA8 ;печать/обновление монитора-отладчика ;слово: ?REG обновить (перевывести) информацию о содержимом регистров на экране ; монитора, если n1 истина (не равно нулю) x270C dw x271A db #80+"?","REG",#00 ; процедура обработки call x2736 and #F5 jr x2706 ;слово: ?DIS вывести реассемблер трассируемых команд (в правый верхний угол ; экрана). Реассемблер выводится по содержимому регистра PC, если ; n1 истина (не равно нулю) x271A dw x2728 db #80+"?","DIS",#00 ; процедура обработки call x2736 and #BF jr x2706 ;слово: ?SCR полностью перевывести экран теневого монитора, если n1 истина ; (не равно нулю) x2728 dw x2742 db #80+"?","SCR",#00 ; процедура обработки call x2736 and #80 jr x2706 ;чтение переменной (xE01E) x2736 call x237F ;чтение элемента с вершины стэка анализатора ld a,c or b pop hl ret z push hl ld a,(xE01E) ret ;слово: SYS1 на вершину стека помещается значение системного регистра #7FFD x2742 dw x2750 db #80+"S","YS1",#00 ; процедура обработки ld c,(iy-#02) x274C ld b,#00 jr x26F7 ;запись элемента на стэк анализатора ;слово: SYS2 на вершину стека помещается значение системного регистра #1FFD x2750 dw x275C db #80+"S","YS2",#00 ; процедура обработки ld c,(iy-#01) jr x274C ;слово: !SYS1 значение верхнего элемента стека устанавливается в системном ; регистре #7FFD x275C dw x276B db #80+"!","SYS1",#00 ; процедура обработки call x237F ;чтение элемента с вершины стэка анализатора ld (iy-#02),c ret ;слово: !SYS2 значение верхнего элемента стека устанавливается в системном ; регистре #1FFD x276B dw x277A db #80+"!","SYS2",#00 ; процедура обработки call x237F ;чтение элемента с вершины стэка анализатора ld (iy-#01),c ret ;слово: IFF на вершину стека помещается состояние флага разрешения прерываний ; в отлаживаемой программе x277A dw x278A db #80+"I","FF",#00 ; процедура обработки ld a,(xDD83) and #04 rrca rrca jp x26F4 ;запись элемента на стэк анализатора ;слово: RAM поместить на вершину стека номер установленного банка x278A dw x2796 db #80+"R","AM",#00 ; процедура обработки call x36F9 ;получение номера логической страницы пользователя a=[#0..#F] jp x26F4 ;запись элемента на стэк анализатора ;слово: !RAM изменить номер установленного банка на банк, указываемый верхним ; элементом стека x2796 dw x27A4 db #80+"!","RAM",#00 ; процедура обработки call x237F ;чтение элемента с вершины стэка анализатора ld l,c jp x3732 ;установка страницы пользователя равной номеру страницы в L ;слово: IN поместить на вершину стека данные, считанные из порта ввода, ; адресуемого значением верхнего элемента стека x27A4 dw x27B0 db #80+"I","N",#00 ; процедура обработки call x237F ;чтение элемента с вершины стэка анализатора in c,(c) jr x274C ;слово: OUT вывести в порт вывода с адресом n2 данные n1 x27B0 dw x27BC db #80+"O","UT",#00 ; процедура обработки call x2398 ;чтение двух элементов с вершины стэка анализатора out (c),l ret ;слово: DIN поместить на вершину стека данные, считанные из порта ввода Tr-Dos, ; адресуемого значением верхнего элемента стека x27BC dw x27CB db #80+"D","IN",#00 ; процедура обработки call x237F ;чтение элемента с вершины стэка анализатора rst #18 ;вызов п/п Tr-Dos dw rom3_x3FF3 ;чтение порта ld c,a jr x274C ;запись элемента на стэк анализатора ;слово: DOUT вывести в порт вывода Tr-Dos с адресом n2 данные n1 x27CB dw x27DA db #80+"D","OUT",#00 ; процедура обработки call x2398 ;чтение двух элементов с вершины стэка анализатора ld a,l rst #18 ;вызов п/п Tr-Dos dw rom3_x3FF0 ;запись в порт ret ;конец списка слов x27DA dw #0000 ;список управляющих кодов x27DC db #01 ;установка атрибутов для последующих символов db #02 ;восстановление запомненных атрибутов db #04 ;вывод с выравниванием db #05 ;вывод строки по центру окна db #06 ;вывод строки выровненной по правому краю окна db #07 ;звонок db #0A ;перевод строки db #0C ;очистка окна db #0D ;перевод каретки db #1B ;позиционирование курсора внутри окна x27E6 db #1E ;"обратный свиток" ;таблица с адресами обработки управляющих кодов x27E7 dw x2BF8 ;#01 dw x2C18 ;#02 dw x2AAD ;#04 dw x2ACA ;#05 dw x2AED ;#06 dw x2BA8 ;#07 dw x2B7D ;#0A dw x2A5E ;#0C dw x2B6E ;#0D dw x2BCA ;#1B dw x2A1B ;#1E ;АДРЕС: #27FD удаление курсора и печать символа в окне ;вх: ix - адрес дескриптора окна ; a - код символа ;вых: nz - следующие координаты печати не установлены ; x27FD call x28B8 ;признак печати и восстановление экрана ;АДРЕС: #2800 печать символа в окне ;вх: ix - адрес дескриптора окна ; a - код символа ;вых: nz - следующие координаты печати не установлены ; x2800 ld l,a ld c,a ;!!! лишняя команда ld h,#00 add hl,hl add hl,hl add hl,hl ld de,(xE9E5) add hl,de ;адрес данных символа ld a,(ix+#0A) cp #08 jr nz,x2847 ;символ 6 пикселей push hl call x297C ;расчет экранного адреса курсора pop de ld b,#08 ;печать символа 8pix x281A ld a,(de) ld (hl),a inc de inc h djnz x281A x2820 bit 1,(ix+7) ;печать атрибутов, если нужно jr z,x2834 ;атрибуты не печатаем dec h ld a,h rrca rrca rrca and #03 xor #58 ld h,a ;адрес в области атрибутов ld a,(ix+6) ld (hl),a x2834 bit 1,(iy+9) ;установим следующие координаты печати ret nz inc (ix+1) ;crd X+1 ld a,(ix+#0B) ;ширина окна в символах cp (ix+1) ret nc ;еще не вышли за пределы окна dec (ix+1) ret ;печать символа шириной 6 пикселей x2847 push hl ;адрес данных символа call x292F ;расчет экранного адреса курсора pop de ld a,b ;печать символа ld b,#08 or a jr z,x28A8 ;нет сдвига символа cp #04 jr c,x2896 ;сдвиг 2 пикселя jr z,x2876 ;сдвиг 4 пикселя ; координата в знакоместе 6 x2858 ld a,(de) rlca rlca push af ;левая часть and %00000011 ld c,a ld a,(hl) and %11111100 or c ld (hl),a inc hl pop af and %11110000 ;правая часть ld c,a ld a,(hl) and %00001111 or c ld (hl),a dec hl inc h inc de djnz x2858 jp x2820 ;печать атрибутов и выход ; координата в знакоместе 4 x2876 ld a,(de) rlca rlca rlca rlca push af ;левая часть and %00001111 ld c,a ld a,(hl) and %11110000 or c ld (hl),a inc hl pop af ;правая часть and %11000000 ld c,a ld a,(hl) and %00111111 or c ld (hl),a dec hl inc h inc de djnz x2876 jp x2820 ;печать атрибутов и выход ; координата в знакоместе 2 x2896 ld a,(hl) and %11000000 ld c,a ld a,(de) rrca rrca and %00111111 or c ld (hl),a inc h inc de djnz x2896 jp x2820 ;печать атрибутов и выход ; координата в знакоместе 0 x28A8 ld a,(hl) and %00000011 ld c,a ld a,(de) and %11111100 or c ld (hl),a inc h inc de djnz x28A8 jp x2820 ;печать атрибутов и выход ;АДРЕС: #28B8 восстановление экрана под курсором, если нужно (6 пикселей символ) ;вх: ix - адрес дескриптора окна ; x28B8 set 2,(iy+9) bit 0,(iy+9) ret z res 0,(iy+9) ;АДРЕС: #28C5 сохранение экрана под курсором (6 пикселей символ) ;вх: ix - адрес дескриптора окна ; x28C5 push af call x292F ;расчет экранного адреса курсора в окне для символов 6 пикселей ld de,xE3A4 ;начало буфера ld b,#08 x28CE ld c,#02 x28D0 bit 0,(iy+9) jr z,x28DA ld a,(hl) ld (de),a jr x28DC x28DA ld a,(de) ld (hl),a x28DC inc l inc de dec c jr nz,x28D0 dec l dec l inc h djnz x28CE pop af ret ;АДРЕС: #28E8 печать/удаление курсора в окне ; x28E8 ld a,#01 res 2,(iy+9) bit 0,(iy+9) ret nz ld (xE3B6),a ;АДРЕС: #28F6 мигание текстового курсора в строке ввода ; x28F6 ld ix,(xE3B7) bit 0,(ix+7) ret nz ;символ курсора не выводим ld hl,xE01D bit 2,(hl) res 2,(hl) ld hl,xE3B6 jr nz,x292C ;что-то печатается dec (hl) ret nz ;счетчик ld (hl),#0C ld hl,xE01D bit 0,(hl) res 0,(hl) jr nz,x28C5 ;восстановление экрана под курсором (6 пикселей символ) ;печать курсора set 0,(hl) push hl call x28C5 ;сохранение экрана под курсором (6 пикселей символ) pop hl ld a,(ix+#0C) ;код курсора set 1,(hl) ;запрет изменения координат печати push hl call x2800 ;печать символа в окне pop hl res 1,(hl) ret x292C ld (hl),#0A ret ;АДРЕС: #292F Расчет экранного адреса курсора в окне для символов 6 пикселей ;вх: ix - адрес дескриптора окна ;вых: b - смещение в знакоместе ; hl - адрес на экране ; x292F ld a,(ix+2) ;координата Y add a,(ix+0) ld h,a rrca rrca rrca and #E0 ld l,a ld c,(ix+1) ;координата X ld a,c add a,c add a,c add a,a ld c,a ;c=X*6 and #07 ld b,a ;смещение в знакоместе ld a,c rrca rrca rrca add a,(ix+3) and #1F or l ld l,a ld a,h and #18 or #40 ld h,a ret ;АДРЕС: #2959 Расчет координат курсора на экране для символов шириной 8 пикселей ;вх: ix - адрес дескриптора окна ;вых: bc - координаты курсора ; x2959 ld l,(ix+0) ld h,(ix+1) ld c,(ix+2) ld b,(ix+3) add hl,bc ld c,l ld b,h ret ;АДРЕС: #2969 Расчет адреса курсора в области атрибутов для символов 8 пикселей ;вх: ix - адрес дескриптора окна ;вых: hl - адрес в области атрибутов ; x2969 call x2959 ;координаты курсора на экране ld a,c rrca rrca rrca ld c,a and #E0 xor b ld l,a ld a,c and #03 xor #58 ld h,a ret ;АДРЕС: #297C Расчет экранного адреса курсора в окне для символов 8 пикселей ;вх: ix - адрес дескриптора окна ;вых: bc - координаты курсора на экране ; hl - адрес на экране ; x297C call x2959 ;координаты курсора на экране ld a,c rrca rrca rrca and #E0 xor b ld l,a ld a,c and #18 xor #40 ld h,a ret ;АДРЕС: #298E скроллинг окна вверх ;вх: ix - адрес дескриптора окна ; x298E ld c,(ix+0) ld b,(ix+1) push bc ;сохраним координаты курсора ld (ix+0),#01 ;crdY=1 ld (ix+1),#00 ;crdX=0 ld b,(ix+4) ;высота окна x29A0 dec b jr z,x29BE ;скроллинг вверх push bc call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей or a call x29D0 ;скроллинг строки данных окна вверх bit 1,(ix+7) jr z,x29B8 ;атрибуты не меняются call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей or a call x29FB ;скроллинг строки атрибутов окна вверх x29B8 inc (ix+0) pop bc jr x29A0 ;очистка нижней знакоместной строки x29BE ld a,(ix+4) ;высота окна dec a ld (ix+0),a ;координата Y в самом низу call x2A81 ;очистка знакоместной строки по координатам курсора pop bc ld (ix+0),c ;восстановление координат ld (ix+1),b ret ;АДРЕС: #29D0 скроллинг строки данных окна ;вх: ix - адрес дескриптора окна ; hl - экранный адрес начала строки ; cy=1 скроллинг вниз ; =0 скроллинг вверх ; x29D0 push hl ld a,(ix+0) ;координата Y курсора push af jr c,x29DA dec a jr x29DB x29DA inc a x29DB ld (ix+0),a call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей pop af ld (ix+0),a ld e,l ld d,h pop hl ld a,#08 ;копирование строки x29EA ld b,#00 ld c,(ix+5) ;ширина окна в знакоместах push hl push de ldir pop de pop hl inc h inc d dec a jr nz,x29EA ret ;АДРЕС: #29FB скроллинг строки атрибутов окна ;вх: ix - адрес дескриптора окна ; hl - адрес атрибутов начала строки ; cy=1 скроллинг вниз ; =0 скроллинг вверх ; x29FB push hl ld a,(ix+0) push af jr c,x2A05 dec a jr x2A06 x2A05 inc a x2A06 ld (ix+0),a call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей pop af ld (ix+0),a ld e,l ;копирование строки атрибутов ld d,h pop hl ld b,#00 ld c,(ix+5) ldir ret ;АДРЕС: #2A1B обработка управляющего кода #1E (скроллинг окна ввниз) ;вх: ix - адрес дескриптора окна ; x2A1B ld c,(ix+0) ld b,(ix+1) push bc ;сохраним координаты курсора ld (ix+1),#00 ;координата X=0 ld b,(ix+4) ;высота окна dec b jr z,x2A4C ;высота =1 просто очищаем строку dec b ld (ix+0),b inc b ;скроллим окно вниз x2A31 push bc call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей scf call x29D0 bit 1,(ix+7) jr z,x2A46 ;атрибуты не скроллим call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей scf call x29FB ;скроллинг строки атрибутов окна x2A46 dec (ix+0) pop bc djnz x2A31 ;очищаем верхнюю строку x2A4C ld (ix+0),#00 ;crdY=0 call x2A81 ;очистка строки по координатам курсора pop bc ;восстановим координаты ld (ix+0),c ld (ix+1),b ret ;АДРЕС: #2A5B очистка окна пользователя (rst 8: db #83) ; x2A5B call x300F ;читаем ix ;АДРЕС: #2A5E обработка управляющего кода #0C (очистка текущего окна) ;вх: ix - адрес дескриптора окна ; x2A5E xor a ;координаты курсора =0 ld (ix+0),a ld (ix+1),a ld b,(ix+4) ;высота окна x2A68 push bc ;очистка окна call x2A85 ;очистка знакоместной строки по координатам курсора pop bc inc (ix+0) djnz x2A68 ld (ix+0),#00 ;crd X =0 call x28E8 ;печать курсора ret ;очистка верхней знакоместной строки окна x2A7A call x28B8 ;признак печати и восстановление экрана ld (ix+1),0 ;crd Y =0 ;очистка знакоместной строки по координатам курсора x2A81 res 3,(iy+9) ;АДРЕС: #2A85 очистка знакоместной строки по координатам курсора x2A85 call x28B8 ;признак печати и восстановление экрана call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей ld a,(ix+5) ;ширина окна sub (ix+1) ld c,#08 ;очистка знакоместной строки ld d,a ;ширина очищаемой части окна ld e,l x2A95 ld b,d ld l,e x2A97 ld (hl),#00 ;очистка пиксельной строки inc l djnz x2A97 inc h dec c jr nz,x2A95 push de call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей pop bc ld d,(ix+6) ;атрибуты x2AA8 ld (hl),d ;очистка атрибутной строки inc hl djnz x2AA8 ret ;АДРЕС: #2AAD обработка управляющего кода #04 (вывод с выравниванием) ;вх: ix - адрес дескриптора окна ; x2AAD ld hl,xE01D set 6,(hl) set 7,(hl) ld hl,xE1A6 ld (xE3BC),hl ret ;АДРЕС: #2ABB расчет для выравнивания строки ;вх: ix - адрес дескриптора окна ; x2ABB ld de,xE1A6 ;начало буфера ld hl,(xE3BC) ;конец буфера or a sbc hl,de ld b,l ;длина строки ld a,(ix+#0B) ;размер окна в символах sub l ret ;АДРЕС: #2ACA печать строки из буфера с выравниваем по центру окна #05 ;вх: ix - адрес дескриптора окна ; x2ACA call x2ABB srl a ;координата X печати в окне ;печать с выравниванием x2ACF ld (ix+1),a ;a=crdX, b=длина строки push bc call x28B8 ;признак печати и восстановление экрана pop bc ld hl,xE1A6 ;печать строки x2ADA ld a,(hl) push hl push bc call x2800 ;печать символа в окне pop bc pop hl inc hl djnz x2ADA ld hl,xE01D ;завершение управляющего кода #05 и #04 res 6,(hl) res 7,(hl) ret ;АДРЕС: #2AED печать строки из буфера с выравниваем по правому краюу окна #06 ;вх: ix - адрес дескриптора окна ; x2AED call x2ABB jr x2ACF ;АДРЕС: #2AF2 обработка байта после управляющего кода #04 ;вх: ix - адрес дескриптора окна ; x2AF2 bit 5,(hl) jr nz,x2B57 ;обработка значения байта управляющего кода bit 7,(hl) jr z,x2AFE cp #20 ;байт после кода #04 jr c,x2B42 ;управляющий код x2AFE ld hl,(xE3BC) ;печатный символ в буфер ld (hl),a inc hl ld (xE3BC),hl ret ;АДРЕС: #2B07 возврат из п/п печати символа x2B07 pop bc pop de pop hl ret ;АДРЕС: #2B0B печать символа со сбросом 7го бита (rst #10) ;вх: ix - адрес дескриптора окна ; a - код символа/управляющий код ; x2B0B push af and #7F jr x2B13 ;АДРЕС: #2B10 печать пробела (rst #10) ;вх: ix - адрес дескриптора окна ; x2B10 ld a,#20 ;АДРЕС: #2B12 печать символа (rst #10) ;вх: ix - адрес дескриптора окна ; a - код символа/управляющий код ; x2B12 push af x2B13 call x2B18 pop af ret ;печать символа в окне. ix - адрес дескриптора окна, a - код символа/управляющий код x2B18 push hl push de push bc ld hl,x2B07 ;адрес возврата push hl ld hl,xE01D bit 6,(hl) jr nz,x2AF2 ;байт(ы) после управляющего кода bit 5,(ix+7) ret nz ;запрет вывода в окно bit 4,(hl) jp nz,x0950 ;вывод на принтер cp #20 jr c,x2B42 ;это управляющий код call x27FD ;удаление курсора и печать символа в окне ret nz ;следующие координаты печати не установлены bit 4,(ix+7) ret z call x2B75 ;возрат каретки jr x2B84 ;перевод строки со скроллингом вверх ;переход на п/п обработки управляющего кода x2B42 ld hl,x27DC+#0A ld bc,#000B ld e,l ld d,h cpdr ret nz ;код не найден inc de ex de,hl sla c add hl,bc ld e,(hl) inc hl ld d,(hl) ex de,hl jp (hl) ;обработка значения байта управляющего кода x2B57 bit 7,(hl) jr nz,x2B5D ;если в рамках кода #04 res 6,(hl) ;сброс признака управляющего кода x2B5D res 5,(hl) ld hl,(xE3B9) ;обработка значения байта управляющего кода jp (hl) ;АДРЕС: #2B63 установка адреса п/п обработки управляющего кода ; x2B63 ld (xE3B9),hl ld hl,xE01D set 5,(hl) set 6,(hl) ret ;АДРЕС: #2B6E обработка управляющего кода #0D (возврат каретки) ;вх: ix - адрес дескриптора окна ; x2B6E bit 2,(ix+7) call nz,x2B84 ;перевод строки со скроллингом вверх ;возрат каретки x2B75 call x28B8 ;признак печати и восстановление экрана xor a ld (ix+1),a ;crdX =0 ret ;АДРЕС: #2B7D обработка управляющего кода #0A (перевод строки) ;вх: ix - адрес дескриптора окна ; x2B7D bit 3,(ix+7) call nz,x2B75 ;возрат каретки ;перевод строки со скроллингом вверх x2B84 call x2B8E ;перевод строки ret nz ;перевод строки выполнен call x28B8 ;признак печати и восстановление экрана jp x298E ;скроллинг окна вверх ;перевод строки x2B8E ld a,(ix+4) ;высота окна dec a cp (ix+0) ret z ;в последней строке нет перевода строки call x28B8 ;признак печати и восстановление экрана inc (ix+0) ;координата Y+1 ret ;АДРЕС: #2B9D установка начальных координат ;вх: ix - адрес дескриптора окна ; x2B9D call x28B8 ;признак печати и восстановление экрана xor a ld (ix+1),a ld (ix+0),a ret ;АДРЕС: #2BA8 короткий звуковой сигнал c установкой бордюра ; x2BA8 push de ld de,#7060 push bc push af ld a,(xE053) push af x2BB2 out (#FE),a xor #10 push af ld a,r and #01 add a,e ld b,a djnz $ pop af dec d jr nz,x2BB2 pop af out (#FE),a pop af pop bc pop de ret ;АДРЕС: #2BCA обработка управляющего кода #1B (позиционирование курсора внутри окна) ;вх: ix - адрес дескриптора окна ; x2BCA ld hl,x2BD0 jp x2B63 ;установка координаты Y курсора x2BD0 ld c,(ix+0) cp (ix+4) jr nc,x2BD9 ;за пределами она ld c,a x2BD9 ld a,c ld (xE3BB),a ld hl,x2BE3 jp x2B63 ;установка координаты X курсора x2BE3 call x28B8 ;признак печати и восстановление экрана ld c,(ix+#0B) ;ширина окна в символах dec c cp c jr nc,x2BEE ;за пределами она ld c,a x2BEE ld (ix+1),c ld a,(xE3BB) ld (ix+0),a ret ;АДРЕС: #2BF8 обработка управляющего кода #01 (установка атрибутов) ;вх: ix - адрес дескриптора окна ; x2BF8 ld a,(ix+6) ;сохраним текущие атрибуты ld (xE3B4),a ld hl,x2C04 jp x2B63 x2C04 or (ix+6) ;маска устанавливаемых атрибутов ld (ix+6),a ld hl,x2C10 jp x2B63 x2C10 cpl ;маска сбрасываемых атрибутов and (ix+6) ld (ix+6),a ret ;АДРЕС: #2C18 обработка управляющего кода #02 (восстановление атрибутов) ;вх: ix - адрес дескриптора окна ; x2C18 ld a,(xE3B4) ld (ix+6),a ret ;АДРЕС: #2C1F определение турбо-режима ;вых: nz - турбо включен ; z - выключен ; x2C1F xor a ld h,a ld e,#0E inc a x2C24 or a jr z,x2C2E dec h jr nz,x2C24 dec e jr nz,x2C24 inc e x2C2E di ret ;АДРЕС: #2C30 определение турбо-режима вкл/выкл ; x2C30 bit 7,(iy+#19) ret z ;турбо-режим недоступен call x3B75 ;определение типа прерываний im 1/2 push af im 1 ei call x2C1F ;определение турбо-режима ld hl,xE02D res 6,(hl) jr z,x2C48 ;турбо выключено set 6,(hl) x2C48 pop af ret nz im 2 ret ;АДРЕС: #2C4D копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ ;вх: a - номер дисковода ; x2C4D and #03 ld (xFFCA),a ;номер текущего дисковода push hl ld l,a rlca rlca ld h,a rlca rlca add a,h add a,l ;a=a*#15 ld hl,(xE9F3) ;адрес блока описателей дисковода add a,l ld l,a jr nc,x2C63 inc h ;hl адрес блока описателя текущего дисковода x2C63 ld a,(hl) or a jr z,x2C75 ;нет примонтированного образа push de ;копируем дескриптор дисковода в рабочий буфер ld de,xE590 push bc ld bc,#0015 ldir pop bc pop de pop hl ret x2C75 ld (xE590),a pop hl ret ;АДРЕС: #2C7A чтение байта по адресу #00FB x2C7A ld a,(x00FB) ret ;АДРЕС: #2C7E поиск и вызов процедуры обработки без возврата(если не найдено ; возврат) x2C7E pop hl jr x2C83 x2C81 inc hl inc hl x2C83 ld e,(hl) inc e jr z,x2C90 ;конец списка. выход cp (hl) inc hl jr nz,x2C81 ;не сответствует коду клавиши ld e,(hl) inc hl ld d,(hl) dec de ex de,hl x2C90 inc hl jp (hl) ;АДРЕС: #2C92 выполнение одной команды ассемблера с контролем ловушек x2C92 call x17F0 ;выполнение одной команды по адресу в PC call x328B ;проверка срабатывания ловушки ld e,#FF jp nc,x019D ;ловушка сработала x2C9D ld a,(xE02A) and #7F bit 2,a ret nz ;не обновлять экран монитора ld (xE01E),a ;АДРЕС: #2CA8 печать/обновление монитора-отладчика x2CA8 call x0550 ;сохранение экрана из страницы 5 ;обновление окна регистров call x3000 bit 0,(iy+#0A) jr nz,x2CE9 ;ОШИБКА!!! должно быть x2CEC call x2A5E ;очистка текущего окна rst #20 db "IR" db #1B,#08,#0A ;crd Y,X db "SZ-H-PNC" db #0D,#0D db "INT RAM ROM SCR" db #1B,#00,#0B ;crd Y,X dc "ZX " bit 5,(iy-#02) jr z,x2CE6 ;128K rst #20 ;only 48k dc "4" jr x2CE9 x2CE6 rst #20 dc "12" x2CE9 rst #20 dc "8k" x2CEC ld (ix+0),#00 ;crd Y =0 ld (ix+1),#04 ;crd X =4 ld hl,(xDD83+#01) ;регистры i,r пользователя call x16DE ;печать числа inc (ix+0) ;crd Y +1 ld (ix+1),#00 ;crd X =0 call x2D70 ;печать названия регистра, его значения и области памяти адресуемой этим регистром ld (ix+0),#09 ;crd Y =9 call x2DF6 ;;печать названия регистра af, его значения флагов в двоичном виде ld hl,xE01E ;iy+#0A set 1,(hl) ;не обновлять содержимое регистров set 2,(hl) ;не обновлять экран монитора ld (ix+0),#0B ;печать режима прерываний разрешены/запрещены ld hl,x0FA0 ;on ld a,(xDD83) and #04 jr nz,x2D23 x2D20 ld hl,x0FA2 ;off x2D23 call x15C7 ;печать сообщения из hl x2D26 call x2B10 ;печать пробела ld (ix+1),#05 ;печать номера страницы ОЗУ ld a,(xE012) and #07 ld c,a ld a,(xE012+1) rrca and #08 or c call x16EC ;печать числа a=[#0..#F] ld (ix+1),#09 ;печать номера страницы ПЗУ ld a,(xE012) rrca rrca rrca rrca and #01 call x16EC ;печать числа a=[#0..#F] ld (ix+1),#0D ;печать номера экрана ld c,#35 ld a,(xE012) and #08 jr z,x2D5C ld c,#37 x2D5C ld a,c rst #10 ld (iy+6),4 call x2E38 ;обновление окна дампа памяти call x2F30 ;обновление окна дизассемблера ld hl,xE01E ;iy+#0A ld a,(hl) ;установка флагов or %01010001 ld (hl),a ret ;печать названия регистра, его значения и области памяти адресуемой этим регистром x2D70 bit 1,(iy+#0A) ret nz ld hl,x0F91 ld c,(iy+#0C) ld b,#07 ld de,xDD6B jr x2D85 x2D82 inc (ix+0) x2D85 ld a,#03 cp b jr nz,x2D93 bit 0,(iy+#0B) jr z,x2D93 ld de,xDD79 ;отображаются регистры альтернативного набора x2D93 sla c jr nc,x2D9B inc hl ;этот регистр не выводим inc hl jr x2DDF x2D9B bit 2,(iy+#0A) jr nz,x2DAE ;название регистра не печатать call x15C7 ;печать названия регистра ld a,#03 cp b jr c,x2DB0 call x2DE8 ;печать признака альтернативного набора регистров jr x2DB0 x2DAE inc hl inc hl x2DB0 ld (ix+1),4 ;crd X =4 push hl push de ;печать значения регистра ex de,hl ld a,(hl) inc hl ld h,(hl) ld l,a ;hl-значение регистра call x16DE ;печать числа ;печать содержимого памяти адресуемой текущим регистром bit 3,(iy+#0A) jr nz,x2DDD ;содержимое памяти адресуемой текущим регистром не печатать push bc ld bc,#0004 ld de,xDDAC push de call x0753 ;сохранение области памяти в ram 8 pop hl ld b,#04 x2DD2 inc (ix+1) ld a,(hl) call x16E3 ;печать числа a=[#00..#FF] inc hl djnz x2DD2 pop bc x2DDD pop de pop hl ;следующий регистр x2DDF inc de inc de ld (ix+1),#00 djnz x2D82 ret ;печать признака альтернативного набора регистров x2DE8 bit 0,(iy+#0B) x2DEC ld a," " jp z,x2B12 ;печать символа ld a,#27 ;' jp x2B12 ;печать символа ;печать названия регистра af, его значения флагов в двоичном виде x2DF6 ld b,(iy+#0A) bit 1,b ret nz ;все регистры в мониторе не выводятся bit 0,(iy+#0C) ret nz ;регистр af не выводится bit 2,b ld b,(iy+#0B) jr nz,x2E10 ;название регистра не печатать rst #20 ;печать названия регистра dc "AF" bit 1,b call x2DEC x2E10 ld (ix+1),#04 ;crd X =4 bit 1,b ;;печать значения af/af' ld hl,(xDD7F) jr z,x2E1E ld hl,(xDD81) x2E1E call x16DE ;печать числа hl=[#0000..#FFFF] ld (ix+1),#0A ;crd X =10 ;АДРЕС: #2E25 печать байта в двоичном виде ;вх: l - байт ; x2E25 ld b,#08 ;печать значения f/f' в двоичном виде x2E27 ld a,#30 sla l jr nc,x2E2E inc a x2E2E call x2B12 ;печать символа djnz x2E27 ld (ix+1),#00 ;crd X =0 ret ;АДРЕС: #2E38 печать дампа памяти в окне ; x2E38 bit 4,(iy+#0A) ret nz ;АДРЕС: #2E3D печать дампа памяти в окне ; x2E3D call x3019 ;ix = адрес дескриптора окна монитора: дамп памяти call x2E9D ;;определение нового адреса начала дампа от смещения курсора bit 5,(iy+#0A) call z,x2F74 ;обновим дизасм под курсором в дампе call x3019 ;ix = адрес дескриптора окна монитора: дамп памяти call x2B9D ;установка начальных координат Y=0,X=0 ;печать дампа памяти ld hl,(xDD87) ld b,#08 x2E55 push bc call x2EBA ;печать одной строки дампа памяти в окне inc (ix+0) pop bc djnz x2E55 ;печать курсора на текущей ячейке дампа ld bc,#3E3C ;>< (коды двух символов курсора) ld hl,(xDD69) x2E65 call x2E7E ;расчет координат печати курсора в окне дампа памяти ld a,b ;печать курсора call x2B12 ;печать символа inc (ix+1) inc (ix+1) ld a,c jp x2B12 ;печать символа ;АДРЕС: #2E76 удаление курсора на предыдущей ячейке дампа x2E76 ld bc,#2020 ld hl,(xDD89) jr x2E65 ;расчет координат печати курсора в окне дампа памяти ;вх: hl адрес текущей ячейки в дампе памяти x2E7E ld (xDD89),hl ld de,(xDD87) or a sbc hl,de ;смещение в дампе от начала отображения ld a,l and #07 ld h,a add a,a add a,h add a,#07 ld (ix+1),a ;crd X ld a,l and #38 rra rra rra ld (ix+0),a ;crd Y ret ;определение нового адреса начала дампа от смещения курсора x2E9D call x2E76 ;удаление курсора на предыдущей ячейке дампа ld hl,(xDD87) ;адрес начала дампа памяти ld de,(xDD69) ;адрес текущей ячейки в дампе памяти ld bc,#003F or a sbc hl,de ret z ;позиция курсора в дампе не изменилась jr nc,x2EB2 ;нужен скроллинг add hl,bc ret c ;скроллинг не нужен x2EB2 ld hl,#FFE8 add hl,de ld (xDD87),hl ;новый адрес начала дампа ret ;АДРЕС: #2EBA печать одной строки дампа памяти (8 байт) ;вх: hl - адрес памяти (начала дампа) ;вых: hl - следующий адрес памяти (начала дампа) ; x2EBA ld (ix+1),#02 ;crd X =2 ;АДРЕС: #2EBE печать одной строки дампа памяти (8 байт) ;вх: hl - адрес памяти (начала дампа) ;вых: hl - следующий адрес памяти (начала дампа) ; x2EBE call x16DE ;печать адреса начала дампа памяти hl=[#0000..#FFFF] call x2F22 ;если вывод на принтер, печатаем пробел call x2F22 ;если вывод на принтер, печатаем пробел ld de,xDDAC ld bc,#0008 push de call x0753 ;сохранение области памяти в ram 8 pop de push de ;печать строки дампа ld b,#08 call x2EE6 pop de call x2F22 ;если вывод на принтер, печатаем пробел ld b,#08 call x2EF1 ;печать строки символов дампа памяти ld (ix+1),#00 ret ;печать строки дампа x2EE6 ld a,(de) inc de call x16E3 ;печать числа a=[#00..#FF] call x2F22 ;если вывод на принтер, печатаем пробел djnz x2EE6 ret ;печать строки символов дампа памяти x2EF1 ld c,(iy+#05) x2EF4 ld a,(de) inc de bit 7,c jr nz,x2F02 and #7F cp #20 jr nc,x2F02 ld a,#2E ;. x2F02 bit 4,(iy+#09) jr nz,x2F14 ;вывод на принтер push bc push de push hl call x27FD ;удаление курсора и печать символа в окне pop hl pop de pop bc djnz x2EF4 ret x2F14 and #7F ;вывод на принтер cp #20 jr nc,x2F1C ld a,#2E ;. x2F1C call x2B12 ;печать символа djnz x2EF4 ret ;если вывод на принтер, печатаем пробел x2F22 inc (ix+1) bit 4,(iy+#09) ret z dec (ix+1) jp x2B10 ;печать пробела ;обновление окна дизассемблера x2F30 ld b,(iy+#0A) bit 6,b ret nz ;не надо обновлять bit 0,b jr nz,x2F47 ld hl,#5830 ;подсветка текущей строки дизассемблера ld (hl),%00110000 ld bc,#000F ld de,#5831 ldir x2F47 ld hl,xE091 call x301C ;ix = дескриптор окна монитора: дизассембер bit 0,(iy+#0A) call nz,x298E ;скроллинг окна вверх ld (ix+0),#01 ;crd Y =1 ld (ix+1),#00 ;crd X =0 ; печать дизассемблированных команд ld hl,(xDD6B) ;значение pc программы пользователя ld b,#05 bit 2,(iy+#05) jr z,x2F69 ld b,#01 x2F69 push bc call x2F80 ;печать одной строки дизасма inc (ix+0) pop bc djnz x2F69 ret ;АДРЕС: #2F74 вывод дисасма памяти по адресу в de ;вх: de - адрес памяти x2F74 call x3000 ;ix = адрес дескриптора окна монитора: регистры ld (ix+0),#0B ld (ix+1),#15 ex de,hl ;печать одной строки дизасма ;вх: hl - адрес памяти x2F80 call x16DE ;печать адреса памяти hl=[#0000..#FFFF] call x2F96 ;анализ команды ассемблера по адресу в hl push hl ld hl,xDDB7 ;текстовая строка с командой дизасма call x1512 ;печать команды ассемблера call x2FED ;печать пробелов до правого края окна pop hl ld (ix+1),#00 ret ;АДРЕС: #2F96 анализ команды ассемблера ;вх: hl - адрес команды ассемблера для дизасма x2F96 ld (xDDAA),hl push hl ld de,xDDAC ld bc,#0004 call x0753 ;сохранение области памяти в ram 8 call x197F ;анализ команды ассемблера pop hl add hl,bc ld (xDDAA),hl ;адрес следующей команды ret ;АДРЕС: #2FAC печать строки дизасма ;вх: a - x2FAC bit 0,(iy+#05) ;печать адреса команды push af call z,x16DE ;печать числа hl=[#0000..#FFFF] pop af ld c,l ld b,h ld (iy+#08),#20 call nz,x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами ;печать команды ассемблера call x2F96 ;анализ команды и преобразование в строку для печати push hl push bc ld hl,xDDB7 call x1512 ;печать команды ассемблера pop bc ;вывод дополнительной информации bit 1,(iy+#05) jr z,x2FEB ld a,#17 call x2FF1 ;печать пробелов до заданной координаты X ld a,";" rst #10 ld b,c push bc ld de,xDDAC push de call x2EE6 ;печать строки дампа ld a,#25 call x2FF1 ;печать пробелов до заданной координаты X pop de pop bc call x2EF1 ;печать пробелов до заданной координаты X x2FEB pop hl ret ;АДРЕС: #2FED печать пробелов до правого края окна ;вх: a - crd X x2FED ld a,(ix+#0B) dec a ;АДРЕС: #2FF1 печать пробелов до заданной координаты X ;вх: a - crd X x2FF1 ld b,(ix+1) ;crd X sub b ret z ret c ld b,a jp x15F3 ;печать нескольких провелов (в B) ;АДРЕС: #2FFB ix = адрес дескриптора окна монитора: дескриптор окна: ввод числа x2FFB ld hl,xE0E5 jr x301C ;АДРЕС: #3000 ix = адрес дескриптора окна монитора: регистры x3000 ld hl,xE075 jr x301C ;АДРЕС: #3005 установка текущим окна: main menu x3005 ld hl,xE0C9 jr x301C ;АДРЕС: #300A ix = адрес дескриптора окна монитора: вывод на принтер x300A ld hl,xE067 jr x301C ;АДРЕС: #300F чтение содержимого регистра ix основной программы x300F ld hl,(xDD6F) jr x301C ;АДРЕС: #3014 ix = адрес дескриптора окна монитора: ввод строки низу экрана x3014 ld hl,xE083 jr x301C ;АДРЕС: #3019 ix = адрес дескриптора окна монитора: дамп памяти x3019 ld hl,xE09F ;АДРЕС: #301C ix = адрес дескриптора окна монитора из hl x301C ld (xE3B7),hl push hl pop ix ret ;АДРЕС: #3023 ожидание действий пользователя (опрос управления, вывод часов) x3023 push hl push de push bc rst #30 dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) db #06 pop bc pop de pop hl ret ;АДРЕС: #302E ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне x302E ld e,(ix+7) set 0,(ix+7) ;не выводить символ курсора call x3023 ld (ix+7),e ret ;АДРЕС: #303C выполнение команды, на которую указывает PC (cs+3) x303C xor a jr x3041 ;АДРЕС: #303F выполнение команды, на которую указывает PC с быстрым выполнением ; подпрограмм (cs+4) x303F ld a,#80 x3041 bit 1,(iy+#12) jr z,x3049 ;экран не сохранен в ram 8 or #01 x3049 ld (xE02A),a call x2C92 ;выполнение одной команды ассемблера с контролем ловушек ld a,#81 ;сообщение: enter command ret ;АДРЕС: #3052 заглушка входа в монитор при несовпадении контрольной суммы x3052 di call x305B ld hl,x0040 push hl ret ;АДРЕС: #305B блокировка работы при ошибке контрольной суммы x305B ld hl,x3052 ld (xC064),hl ;блокируем вызов NMI pop de ;адрес откуда пришли ld sp,hl ;стэк в ПЗУ ???? ex de,hl jp (hl) ;вернемся ;АДРЕС: #3065 установка регистров для загрузки/сохранения ;вх: hl - адрес строки ;вых: de - буфер для дисковых операций ; ix - буфер fcb x3065 call x0EE6 ;поиск в строке первого печатного символа ld (iy+#0A),#00 ;обновить на экране весь отладчик ld de,xE8A9 ;буфер для дисковых операций x306F ld ix,xE7A9 ;буфер fcb ret ;АДРЕС: #3074 Команда: ERAse filespec ; удаление заданного файла с диска x3074 call x3065 ;установка регистров для работы с диском rst #30 dw rom7_x14C0 ;R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl db #07 x307B jp nc,x0AFB ;ошибок нет. обновление отладчика x307E rst #30 dw rom6_x066C ;установка код дисковой ошибки в переменной для печати числа db #06 x3082 jp x0B06 ;обновление отладчика ;АДРЕС: #3085 Команда: SAVE filespec start,length ; запись на диск заданной последовательности байт x3085 ld b,#02 call x309F ;определение адреса загрузки/сохранения и размера данных call x3107 ;запись области памяти в файл x308D jr c,x307E ;ошибка диска. выход rst #30 dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 db #07 jr x307B ;выход в отладчик ;АДРЕС: #3095 Команда: LOAD filespec [start[,length]] ; загрузка с диска заданной последовательности байт x3095 ld b,#01 call x309F ;определение адреса загрузки/сохранения и размера данных call x30D8 ;чтение файла в память jr x308D ;выход в отладчик ;определение адреса загрузки/сохранения и размера данных ;вх: b - способ открытия файла ;вых: hl - адрес загрузки ; bc - размер загружаемого файла x309F call x3065 ;установка регистров для работы с диском rst #30 dw rom7_x11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) db #07 jr c,x307E ;ошибка диска call x0EBA ;выделение из строки числовых операндов (не более 6) cp #02 jr z,x30BB ;два параметра jr nc,x30D4 ;слиишком много параметров. выход bit 0,(ix+#17) jr nz,x30BB ;файл для чтения ld a,#0A ;сообщение: too few operands jr x3082 ;выход. мало параметров для записи x30BB push hl push de push af rst #30 dw rom7_x11DF ;открыть файл для последующих операций с ним db #07 jr c,x307E ;ошибка диска ld e,c ld d,b ;длина файла в байтах pop af pop hl pop bc cp #01 jr z,x30D1 ;только один параметр: адрес загрузки ret nc ;два параметра. запись файла ld hl,(xE7A9+#09) ;адрес загрузки из заголовка файла x30D1 ld b,d ld c,e ;длина файла в байтах ret x30D4 ld a,#0B ;сообщение: too many operands jr x3082 ;АДРЕС: #30D8 чтение файла в память ;вх: ix - адрес буфера fcb ; hl - адрес загрузки ; bc - размер загружаемого файла ;вых: cy=1 ошибки записи ; a - код ошибки x30D8 ld a,b or a jr z,x30F4 ;менее сектора ;чтение целых секторов x30DC push bc push hl rst #30 dw rom7_x1365 ;R8DOS #1C(28) последовательное чтение очередного сектора из файла db #07 pop hl pop bc ret c ;ошибка диска push bc ld de,xE8A9 ;буфер для загрузки ex de,hl ld bc,#0100 call x0749 ;копирование сектора в память пользователя ex de,hl pop bc djnz x30DC x30F4 ld a,c or a ret z ;закончилась загрузка ;чтение неполного сектора x30F7 push hl push bc rst #30 dw rom7_x1240 ;R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". db #07 pop bc pop hl ret c ;ошибка диска rst #00 ;запись байта в память пользователя inc hl dec c jr nz,x30F7 or a ret ;АДРЕС: #3107 запись области памяти в файл ;вх: ix - адрес буфера fcb ; hl - адрес начала области памяти ; bc - длина области памяти ;вых: cy=1 ошибки записи ; a - код ошибки x3107 ld (xE7B2),hl ;стартовый адрес ld a,b or a jr z,x3122 ;1 сектор ; запись целых секторов области памяти x310E push bc ld de,xE8A9 ;буфер для сохранения ld bc,#0100 call x0753 ;сохранение области памяти в ram 8 push hl rst #30 dw rom7_x1395 ;R8DOS #1D(29) последовательная запись одного сектора из памяти db #07 pop hl pop bc ret c ;ошибка записи djnz x310E x3122 ld a,c or a ret z ;область памяти кратна размеру сектора x3125 push hl push bc rst #28 ;чтение байта из памяти пользователя rst #30 dw rom7_x128C ;R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" db #07 pop bc pop hl ret c ;ошибка записи inc hl dec c jr nz,x3125 or a ret ;АДРЕС: #3135 подсчет контрольной суммы страницы ;вых: hl=#00F6 x3135 xor a ld l,a ld h,a ;hl=#0000 ld bc,#00F6 push bc call x315A inc hl ;hl=#00F7, a=#6D ld bc,#000D call x315A ;hl=#0104, a=#A5 ld de,#000C add hl,de ;hl=#0110 ld bc,#3EF0 call x315A ;a=#80 pop hl ;hl=#00F6 cp (hl) jp z,x04D9 ;контрольная сумма совпала.выключим турбои возврат call x305B ;блокировка работы при ошибке контрольной суммы jr x3135 ;вечный цикл x315A add a,(hl) cpi jp pe,x315A ;пока bc<>0 ret ;АДРЕС: #3161 список команд отладчика x3161 dc "Help" dc "?" dc "III" dc "OOO" dc "CMOS" dc "RESNVRAM" db #00 x3179 dw x3AD0: db %00000000 ;Help dw x3389: db %00000001 ;? dw x318C: db %00000000 ;III dw x3194: db %00000000 ;OOO dw x319C: db %00000000 ;CMOS dw x31A4: db %00000000 ;RESNVRAM db #00 ;АДРЕС: #318C Команда III (работа с контроллером прерываний) x318C rst #30 dw rom7_x16B9 ;работа с контроллером прерываний db #07 ret c ;ошибка ld a,#81 ;сообщение: enter command ret ;АДРЕС: #3194 Команда OOO (работа с контроллером прерываний) x3194 rst #30 dw rom7_x0DC7 ;запись всей памяти NVRAM из памяти #7530 db #07 ret c ;ошибка ld a,#81 ;сообщение: enter command ret ;АДРЕС: #319C Команда CMOS (работа с контроллером прерываний) x319C rst #30 dw rom7_x0DAD ;чтение всей памяти NVRAM в память #7530 db #07 ret c ;ошибка ld a,#81 ;сообщение: enter command ret ;АДРЕС: #31A4 Команда RESNVRAM (что-то пишет в NVRAM) x31A4 rst #30 dw rom7_x0E72 ;что-то пишет в NVRAM db #07 ld a,#81 ;сообщение: enter command ret ;АДРЕС: #31AB Команда: SLOW type автоматическая трассировка ;вх: de - параметры команды x31AB ld a,d or a ld a,#2C ;сообщение: bad operand ret nz ld (iy+#16),e ld hl,(xDD6B) ;pc программы пользователя call x18C0 ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 x31B9 call x2C92 ;выполнение одной команды ассемблера с контролем ловушек call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) jr x31B9 ;АДРЕС: #31C1 Команда: LISTBreak/LBreak ; вывод на экран информации о ловушках x31C1 ld hl,xE52D ld de,#2827 ld bc,x31FC ld a,#09 push bc push af push hl push de call x3A95 ;подготовка переменных к выводу на экран/принтер ld b,e ld c,#00 ;сообщение: curent breackpoint selections: rst #08 rst #20 db #0D,#8D pop bc ld c,#00 ;сообщение: no address bank type state init count word rst #08 rst #20 db #0D,#8D pop hl pop de ld e,#01 pop bc ;hl - адрес ловушки ;d - количество ловушек+1 ;e =#01 номер текщей ловушки ;bc адрес п/п x31E6 push de push bc call x3A93 ;вызов п/п по адресу в bc - call (bc) jr c,x31F9 ;закончена печать call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) rst #20 db #8D pop bc pop de inc e ld a,d cp e jr nz,x31E6 x31F9 ld a,#81 ;сообщение: enter command ret ;печать информации об одной ловушке x31FC rst #30 dw rom6_x0156 ;печать информации о ловушке db #06 ret ;АДРЕС #3201 печать ON/OFF от флага nz-ON/z-OFF x3201 push hl jr nz,x320A rst #20 dc "OFF" pop hl ret x320A rst #20 dc "ON " pop hl ret ;АДРЕС: #3210 определение адреса ловушки ;вх: a - номер ловушки ;вых: de - адрес ловушки ; hl - адрес ячейки с адресом ловушки ; z - нет ловушки x3210 ld de,xE9BD ld l,a ld h,#00 add hl,hl ;a*2 add hl,de ;hl=xE9BD + a*2 ld e,(hl) push hl inc hl ld d,(hl) ld l,a ld a,d or e ld a,l pop hl ret ;АДРЕС: #3222 восстановление памяти пользователя под всеми ловушками x3222 res 7,(iy+#0B) jr x322C ;АДРЕС: #3228 сохранение памяти пользователя под всеми ловушками и установка ловушек x3228 set 7,(iy+#0B) x322C call x3281 ;установка начала списка breackpoint`ов x322F call x326C ;проверка наличия текущей ловушки jr nc,x3267 ;нет ловушки с этим номером call x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя exx ld a,h exx and #C0 jr z,x3250 ;адрес ловушки [#0000..#3FFF] bit 5,(iy-#02) jr z,x324B ;zx128k call x3707 ;zx48k сравнение страницы пользователя с заданной exx jr nz,x3264 exx x324B push bc call x3732 ;установка страницы пользователя равной номеру страницы в L pop bc x3250 exx bit 7,(iy+#0B) jr z,x3260 rst #28 ;чтение байта из памяти пользователя ld (ix+4),a ;сохраним байт в описании ловушки ld a,#CF ;rst 8 rst #00 ;запись байта в память пользователя jr x3264 ;установка байта ловушки x3260 ld a,(ix+4) ;восстановление памяти пользователя под ловушкой rst #00 ;запись байта в память пользователя x3264 call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя x3267 add ix,de ;следующая ловушка djnz x322F ret ;проверка наличия текущей ловушки ;вых: cy=0 нет ловушки ; =1 есть ловушка ; hl' - адрес ловушки ; l - логический номер страницы с ловушкой ; x326C ld a,(ix+0) rlca ret nc ccf bit 1,a ret nz ld l,(ix+2) ld h,(ix+3) exx ld l,(ix+1) ccf ret ;АДРЕС: #3281 установка начала списка ловушек x3281 ld ix,xE52D ld b,#08 ;количество блоков ld de,#000B ;длина одного блока ret ;АДРЕС: #328B проверка срабатывания ловушки ;вх: hl - адрес PC пользователя ;вых: cy=1 нет сработавших ловушек ; =0 ловушка сработала -> ix адрес ловушки ; de=#000B ; b - обратный номер ловушки x328B call x3281 ;установка начала списка ловушек x328E ld a,(ix+#00) rlca jr nc,x32A9 ;ловушки нет exx ld l,(ix+#01) call x3707 ;сравнение страницы пользователя с заданной в l exx jr nz,x32A9 ;не та страница ld a,(ix+#02) cp l jr nz,x32A9 ;не тот адрес ld a,(ix+#03) cp h ret z ;ловушка сработала x32A9 add ix,de djnz x328E scf ret ;АДРЕС: #32AF Команда: DELBreak number ; удаление информации о ловушке с номером number x32AF call x32C2 ;проверка номера и определение адреса описания ловушки ld (ix+#00),#00 ld a,(xDD99) ;номер ловушки call x3210 xor a ld (hl),a inc hl ld (hl),a jr x32FB ;возврат в отладчик ;проверка номера и определение адреса описания ловушки ;вх: de - номер ловушки [1..8] ;вых: ix - адрес ловушки ; z - ловушка не задана x32C2 push af dec e ld a,e and #F8 or d ld a,#22 ;сообщение: invalid number breackpoint jr nz,x3300 ;выход в отладчик push hl ld l,e ld h,d add hl,hl add hl,hl add hl,de add hl,hl add hl,de ;hl=hl*11 ld de,xE52D add hl,de ;адрес ловушки push hl pop ix pop hl pop af bit 6,(ix+#00) ret ;АДРЕС: #32E2 Команда: BRK number, [on|off] ; включение (on)/выключение (off) ловушки x32E2 call x32C2 ;проверка номера и определение адреса описания ловушки ld a,#26 ;сообщение: breackpoint undefined jr z,x3300 ;ловушка не определена. выход в отладчик ld a,l and #FE or h ld a,#23 ;сообщение: invalid state breackpoint jr nz,x3300 ;неверный параметр. выход в отладчик x32F1 sla (ix+#00) srl l rr (ix+#00) x32FB ld a,#81 ;сообщение: enter command ret ;ошибка мало параметров. выход в отладчик x32FE ld a,#0A ;сообщение: too few operands x3300 jp x0B06 ;обновление отладчика ;АДРЕС: #3303 Команда: BREak number, type, addr, int_count[,bank] ; установка ловушки на адрес addr ;вх: de - первый операнд ; hl - второй операнд ; bc - третий операнд ; a - количество операндов [0..5] x3303 call x32C2 ;проверка номера и определение адреса описания ловушки rst #30 dw rom6_x01E4 ;установка новой ловушки в отладчике db #06 ret ;АДРЕС: #330B установка ловушки #8, по текущему адресу листинга дизасма x330B ld de,#0008 ;номер ловушки ld bc,(xDD8B) ;адрес памяти ld a,b and #C0 ld hl,#0001 ;тип ловушки ld (xDD99+#06),hl ;4й параметр, счетчик jr z,x331E ;адрес в ПЗУ dec hl x331E ld a,#04 ;кол-во параметров call x3303 ;Команда: BREak number, type, addr, int_count[,bank] x3323 jp x3960 ;АДРЕС: #3326 удаление ловушки #8 x3326 ld de,#0008 call x32C2 ;проверка номера и определение адреса описания ловушки ld l,#00 call x32F1 ;удаление ловушки jr x3323 ;АДРЕС: #3333 Команда: OPTion bit on|off ; задание некоторых режимов монитора (переменная xE019) x3333 ld a,e and #F8 or d ld a,#0D ;сообщение: known number ret nz ;неверный номер бита. выход в отладчик ld a,l and #FE or h ld a,#17 ;сообщение: illegal value operand ret nz ;неверное значение бита. выход в отладчик ;определение маски по номеру бита inc h ld a,e x3343 or a jr z,x334B dec a sla h jr x3343 ;установка/сброс бита x334B ld a,h bit 0,l jr nz,x335B xor #FF and (iy+#05) x3355 ld (iy+#05),a ld a,#81 ;сообщение: enter command ret x335B or (iy+#05) jr x3355 ;АДРЕС: #3360 Команда: OUT addr, data ; запись байта данных data в порт ввода/вывода x3360 ld a,h or a ld a,#11 ;сообщение: number too big ret nz ;в порт можно вывести только байт ld c,e ld b,d out (c),l x3369 ld a,#81 ;сообщение: enter command ret ;АДРЕС: #336C Команда: OUTD addr, data ; запись байта данных data в порт ввода/вывода в адресном пространстве trdos x336C ld a,h or a ld a,#11 ;сообщение: number too big ret nz ;в порт можно вывести только байт ld c,e ld b,d ld a,l rst #30 dw rom3_x3FF0 ;вывод в порт db #03 jr x3369 ;АДРЕС: #337A Команда: IND addr ; чтение байта из порта ввода/вывода в адресном пространстве trdos x337A ld c,e ld b,d rst #30 dw rom3_x3FF3 ;чтение порта db #03 ld e,a jr x3387 ;АДРЕС: #3383 Команда: IN addr ; чтение байта из порта ввода/вывода x3383 ld c,e ld b,d in e,(c) x3387 ld d,#00 ;АДРЕС: #3389 Команда: ?data ; вывод параметра data в различных системах счисления ;вх: de - параметр data x3389 call x33BB ;установка и очистка информационного окна отладчика ld c,e ld b,d ;вывод печатного символа заданного значения, если возможно ld a,b or a jr nz,x33A3 ;16 бит ld a,c rlca jr c,x33A3 rrca cp #20 jr c,x33A3 push af rst #20 db #0D db #80+'"' pop af rst #10 rst #20 db #80+'"' ;вывод значения в разных системах счисления x33A3 ld hl,x33B6 x33A6 ld a,(hl) cp #81 ret z ;выход push bc push af rst #20 db #8D pop af call x1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом pop bc inc hl jr x33A6 x33B6 db #00,#02,#04,#06,#81 ;АДРЕС: #33BB установка и очистка информационного окна отладчика x33BB push de push bc push hl ld hl,xE0AD call x301C ;ix = дескриптор окна call x2A5E ;очистка окна rst #20 db #8D ;перевод строки в окне pop hl pop bc pop de ret ;АДРЕС: #33CD печать информационного окна отладчика x33CD bit 5,(iy+5) ret nz ;запрет автоматического выполнения команды SHOW ;АДРЕС: #33D2 Команда: SHow ; вывод информации о состоянии монитора x33D2 call x33BB ;установка и очистка окна rst #20 ;печать сообщения dc "Analyser " bit 4,(iy+#14) call x3201 ;печать ON/OFF от флага nz-ON/z-OFF ;печать текущей системы счисления rst #20 db #0D dc "base " ld de,#000A ld c,(iy+#17) ld b,d call x1677 ;печать десятичного числа bc rst #20 db #8D ;перевод строки ;печать workspace nnnnn ld bc,#3C00 ;сообщение: workspace rst #08 ;печать сообщения по номеру в BC ld bc,(xE11A) call x1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом ;печать состояния настроек отладчика rst #20 db #0D dc "option " ld l,(iy+5) call x2E25 ;печать байта из L в двоичном виде ;печать режима прерываний rst #20 db #0D dc "Int mode " call x3B75 ;определение типа прерываний im 1/2 ld a,"2" sub d rst #10 bit 6,(iy+#19) jr z,x3447 ;турбо режим выключен/отсутсвует rst #20 dc "(t)" jr x3447 ;АДРЕС: #3432 Команда: BASE 0|2|8|10|16 (установка основания системы счисления) x3432 ld a,d or a jr nz,x3441 ;ошибка ld a,e ld bc,#0005 ld hl,x344A cpir jr z,x3444 ;система счисления найдена в списке x3441 ld a,#0D ;сообщение: known number ret x3444 ld (iy+#17),e ;установка системы счисления x3447 ld a,#81 ;сообщение: enter command ret x344A db #00,#02,#08,#0A,#10 ;АДРЕС: #344F Команда: WORKspace addr (задание адреса начала свободного буфера ; для команд трассировки. объем буфера 8 байт) x344F ld a,d cp #5B ld a,#3B ;сообщение: workspace insufficient ret c ld a,d cp #C0 ld a,#3B ;сообщение: workspace insufficient ret nc ld (xE11A),de ;установка адреса jr x3447 ;выход ;АДРЕС: #3461 Команда: SEarch addr_st, addr_end, bank, data ; поиск списка байтовых значений data в памяти ;вх: b - количество параметров в строке x3461 ld de,#0318 set 0,(iy+#13) jr x3471 ;АДРЕС: #346A Команда: FINd addr_st, addr_end, data ; поиск списка байтовых значений data в памяти ;вх: b - количество параметров в строке x346A ld de,#0217 res 0,(iy+#13) x3471 ld a,b cp d ld a,#0A ;сообщение: too few operands ret c ;нехватает параметров в команде ret z ;нехватает параметров в команде ld a,b cp e ld a,#1F ;сообщение: string too long ret nc ;слишком длинная строка ld a,b sub d ;a - длина искомой строки push af xor a ld (xDDE0),a ;начальная длина искомой строки ;проверка начального и конечного адреса поиска call x0C98 ;чтение в de адреса начала поиска push de call x0C98 ;чтение в de адреса конца поиска ex (sp),hl ex de,hl call x375C ;сравнение hl>=de, в противном случае отмена команды ld (xDDDC),de ;адрес начала поиска ld (xDDDE),hl ;адрес конца поиска ld hl,(xE012) ;сохраним порты пользователя ld (xDDE1),hl ld (xE010),hl pop hl bit 0,(iy+#13) jr z,x34B7 ;ищем только в текущей странице ;установка страницы для поиска call x0C98 ;чтение номера страницы поиска ex de,hl call x37EB ;установка страницы для поиска call x35EC ;установка страницы для команд поиска в отладчике ld hl,(xE012) ld (xDDE1),hl ex de,hl ;чтение в буфер искомой строки x34B7 ld bc,xDDE3 pop af ld (xDDE0),a ;длина искомой строки x34BE push bc call x0D55 ;чтение из строки команды чилового/байта строкового значения pop bc jr c,x34CA ;конец искомой строки ld a,e ld (bc),a inc bc jr x34BE ;сравнение строки с памятью x34CA ld hl,(xDDDC) ;адрес в памяти x34CD ld bc,(xDDE0-#01) ;b - длина искомой строки push hl ld de,xDDE3 ;адрес строки для поиска x34D5 rst #28 ;чтение байта из памяти пользователя ld c,a ld a,(de) cp c jr nz,x3502 ;нет совпадения inc hl inc de djnz x34D5 ld (xDDDC),hl pop hl bit 0,(iy+#13) jr nz,x34EC ;без установки указателя MEM ld (xDD69),hl ;установим указатель x34EC ld (xDDA7),hl ld a,#84 ;сообщение: found at _число_ ; обновление экрана отладчика x34F1 push af call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя ld a,(iy+#0A) and #CF ld (iy+#0A),a ;обновить дамп и дизассемблер call x2CA8 ;обновление монитора-отладчика pop af ret ; следующий адрес для поиска x3502 pop hl push hl or a ld de,(xDDDE) ;адрес последней ячейки для поиска sbc hl,de pop hl inc hl jr c,x34CD ;еще не конец области памяти xor a ld (xDDE0),a ld a,#A0 ;сообщение: string not found jr x34F1 ;АДРЕС: #3517 продолжение поиска в отладчике (для команд FIND/SEARCH) x3517 ld a,(xDDE0) ;длина искомой строки or a ld a,#A1 ;сообщение: no search string ret z ld a,#0C ;атрибуты rst #30 dw rom5_x1C84 ;инициализация окна ввода db #05 call x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя ld hl,(xDDE1) ld (xE012),hl jr x34CA ;АДРЕС: #352F Команда: MOVe addr_st1, addr_fin1, addr_st2 [,bank] ; копирование области памяти ;вх: de - первый операнд ; hl - второй операнд ; bc - третий операнд ; a - количество операндов [0..5] x352F call x3766 ;установка заданной страницы и сравнение hl>=de, с отменой команды inc hl or a sbc hl,de ;длина переносимого блока push bc push hl pop bc pop hl ex de,hl ;de - адрес, куда копируем; hl - откуда ld a,c or b ld a,#42 ;сообщение: too few blocks ret z ;нулевая длина push hl sbc hl,de pop hl jr c,x3551 ;копирование области памяти с инкрементом x3546 call x3563 ;копирование одного байта с переключением страницы inc hl inc de ld a,c or b jr nz,x3546 jr x3560 ;копирование области памяти с декрементом x3551 dec bc add hl,bc ex de,hl add hl,bc ex de,hl inc bc x3557 call x3563 ;копирование одного байта с переключением страницы dec hl dec de ld a,b or c jr nz,x3557 x3560 jp x3679 ;восстановление страницы пользователя и обновление отладчика ;копирование одного байта с переключением страницы x3563 call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя rst #28 ;чтение байта из памяти пользователя call x35EC ;установка страницы для команды в отладчике ex de,hl rst #00 ;запись байта в память пользователя ex de,hl dec bc ret ;АДРЕС: #356F Команда: CHeck addr_st1, addr_fin1, addr_st2 [,bank] ; сравнение двух областей памяти ;вх: de - первый операнд ; hl - второй операнд ; bc - третий операнд ; a - количество операндов [0..5] x356F call x3766 ;установка заданной страницы и сравнение hl>=de, с отменой команды push bc push hl pop bc ;addr_fin1 pop hl ; ex de,hl ;de=addr_st2; hl=addr_st1 x3577 ex de,hl call x35EC ;установка страницы rst #28 ;чтение байта из памяти пользователя ex de,hl call x3A4E ;восстановление страницы push bc ld c,a rst #28 ;чтение байта из памяти пользователя cp c jr nz,x3598 ;не равны ;следующие адреса x3586 pop bc push hl or a sbc hl,bc pop hl inc de inc hl jr nz,x3577 ;искомая строка найдена call x35D3 ;сравнение ix=xE075 ld a,#82 ;сообщение: block identical ret nz dec a ;сообщение: enter command ret ;вывод сообщение о несовпадении x3598 ld b,a push hl push de push bc call x35D3 ;сравнение ix=xE075 call nz,x3A95 ;подготовка переменных к выводу на экран/принтер ld bc,#4100 ;сообщение: failed at _число_ rst #08 pop bc pop de pop hl push hl push de push bc call x1612 ;печать числа в hl (dec/hex) с префиксом rst #20 dc " #" pop af push af call x16E3 ;печать числа a=[#00..#FF] rst #20 dc " : " pop bc pop hl push hl push bc call x1612 ;печать числа в hl (dec/hex) с префиксом rst #20 dc " #" pop hl ld a,l call x16E3 ;печать числа a=[#00..#FF] rst #20 db #8D call x37B9 ;управление выводимым листингом (опрос клавиш space, s, cs+1) pop de pop hl jr x3586 ;АДРЕС: #35D3 сравнение ix=xE075 ;вых: z - ix=xE075 x35D3 push de push ix ex (sp),hl ld de,xE075 or a sbc hl,de pop hl pop de ret ;АДРЕС: #35E0 сохранение переменной с состоянием портов #1FFD/#7FFD пользователя x35E0 push hl ld hl,(xE012) ld (xE010),hl ld (xE00E),hl pop hl ret ;установка страницы для команд поиска в отладчике x35EC push hl ld hl,(xE00E) ld (xE012),hl pop hl ret ;АДРЕС: #35F5 Команда: FILl addr_st, addr_end, byte [,bank] ; заполнение области памяти ;вх: de - первый операнд ; hl - второй операнд ; bc - третий операнд ; a - количество операндов [0..5] x35F5 call x3766 ;установка заданной страницы и сравнение hl>=de, с отменой команды ld a,b or a ld a,#0C ;сообщение: out of range ret nz ;слишком большое значение для заполнения call x35EC ;;установка страницы ex de,hl ;заполнение области памяти x3601 ld a,c rst #00 ;запись байта в память пользователя push hl or a sbc hl,de pop hl inc hl jr nz,x3601 jr x3679 ;восстановление страницы и обновление отладчика ;АДРЕС: #360D Команда: DATA addr, data ; запись списка data, начиная с адреса addr x360D call x0C98 ;чтение адреса начала области ld c,e ld b,d jr x3618 ;АДРЕС: #3614 Команда: .PC data ; запись списка data, начиная с адреса в регистре PC x3614 ld bc,(xDD6B) ;pc программы пользователя x3618 set 1,(iy+#13) jr x3626 ;АДРЕС: #361E Команда: .data ; запись списка data, начиная начиная с текущей ячейки памяти MEM x361E ld bc,(xDD69) ;адрес текущей ячейки MEM res 1,(iy+#13) ;запись строки данных по заданному адресу x3626 push bc ;адрес куда пишем call x0D55 ;очередного байта data pop bc jr c,x367C ;нет больше байтов для чтения. обновление отладчика push hl ld l,c ld h,b ld a,e rst #00 ;запись байта в память пользователя inc bc bit 1,(iy+#13) jr nz,x363D ld (xDD69),bc ;новый адрес MEM x363D pop hl ;следующий байт jr x3626 ;АДРЕС: #3640 pop de со стэка пользователя x3640 ld hl,(xDD6D) ;указатель вершины стэка программы пользователя rst #28 ;чтение байта из памяти пользователя ld e,a inc hl rst #28 ;чтение байта из памяти пользователя ld d,a inc hl ld (xDD6D),hl ;новый указатель вершины стэка программы пользователя ret ;АДРЕС: #364D Команда: POP ; извлечение значения из стека пользователя x364D call x3640 ;pop de со стэка пользователя call x3389 ;вывод числа в de в различных системах счисления jr x366E ;обновление отладчика ;АДРЕС: #3655 переход на адрес, содержащийся в команде, расположенный в текущей ; ячейке памяти x3655 ld hl,(xDD69) ;адрес текущей ячейки в дампе памяти call x3884 ;получить адрес, на который ссылается команда ассемблера ex de,hl ;АДРЕС: #365C Команда: MEMory addr ; установка адреса текущей ячейки памяти mem x365C ld (xDD69),de jr x367C ;выход и обновленеи отладчика ;АДРЕС: #3662 Команда: EXX ; смена индикации регистров ВС, DE и HL на альтернативные x3662 ld a,#01 jr x3668 ;выход и обновленеи отладчика ;АДРЕС: #3666 Команда: EX AF ; смена индикации регистров AF на альтернативные. Команды x3666 ld a,#02 x3668 xor (iy+#0B) ld (iy+#0B),a x366E ld a,(iy+#0A) x3671 and #F1 ld (iy+#0A),a x3676 jp x0AFB x3679 call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя x367C ld a,(iy+#0A) and #8F jr x3671 ;АДРЕС: #3683 Команда: INTerrupt on|off ; управление прерываниями x3683 ld a,e and #FE or d ld a,#17 ;сообщение: illegal value operand ret nz ;недопустимый параметр ld hl,xDD83 ld a,e or e jr z,x3695 set 2,(hl) ;прерывания разрешены jr x3676 ;выход и обновление отладчика x3695 res 2,(hl) ;прерывания запрещены jr x3676 ;выход и обновление отладчика ;АДРЕС: #3699 Команда: CALl [[addr],bank] ; вызов подпрограммы x3699 call x3713 ;установка страницы, если задана в команде set 4,(iy+#12) push af push de ld de,(xDD6B) ;pc программы пользователя inc de call x3A14 ;запись de на стэк пользователя ld de,#0008 ;возврат по адресу #08 call x3A14 ;запись de на стэк пользователя pop de pop af jr x36B7 ;АДРЕС: #36B4 Команда: Jump [[addr],bank] ; передача управления программе x36B4 call x3713 ;установка страницы, если задана в команде x36B7 jr c,x36BD ;нет параметров, вызов по адресу PC ld (xDD6B),de x36BD call x382E ;ожидание отжатия всех клавиш jp x013D ;выход из монитора ;АДРЕС: #36C3 запись стандартного Magic-файла x36C3 ei halt di ld de,(xDD6B) ;pc программы пользователя call x3A14 ;запись de на стэк пользователя ld de,rom3_x0FF3 ;п/п Tr-Dos Запись памяти на диск call x3A14 ;запись de на стэк пользователя ld hl,rom3_x3D30 ;вызов страницы tr-dos ld (xDD6B),hl ;новый PC jr x36BD ;выход из монитора ;АДРЕС: #36DB Команда: ROM bank ; изменение текущего банка ПЗУ x36DB ld a,e and #FE or d ld a,#19 ;сообщение: invalid bank ROM ret nz ;недопустимый номер ROM ld a,#1B ;сообщение: forbidden bank ROM bit 5,(iy-#02) ret nz ;only 48k ld hl,x367C ;сюда вернемся ex (sp),hl res 4,(iy-#02) ;rom 0 bit 0,e ret z set 4,(iy-#02) ret ;АДРЕС: #36F9 получение номера логической страницы пользователя a=[#0..#F] x36F9 push hl ld hl,(xE012) ;страница пользователя ld a,%00000111 and l bit 4,h pop hl ret z ;включена была страница [0..7] or %00001000 ret ;АДРЕС: #3707 сравнение страницы пользователя с заданной ;вых: a - логическая страница пользователя ; z страница совпадает ; nz не совпадает ; x3707 call x36F9 ;a - логическая страница пользователя cp l ret ;АДРЕС: #370C Команда: RAM x370C ld bc,x367C ;обновление отладчика push bc ;сюда вернемся ex de,hl jr x371D ;установка страницы пользователя равной номеру страницы в HL ;АДРЕС: #3713 если параметр задан, установка страницы пользователя равной номеру страницы в HL ;вх: a - количество параметров x3713 cp #01 ret c ;нет параметров ret z ;1 параметр cp #02 x3719 ld a,#0B ;сообщение: too many operands jr nz,x3763 ;слишком много параметров ;АДРЕС: #371D установка страницы пользователя равной номеру страницы в HL x371D ld a,l and #F0 or h ld a,#18 jr nz,x3763 ;сообщение: invalid bank RAM ld a,l and #07 jr z,x3732 ld a,#1C ;сообщение: forbidden bank RAM bit 5,(iy-#02) jr nz,x3763 ;only 48k ;АДРЕС: #3732 установка страницы пользователя равной номеру страницы в L x3732 ld bc,(xE012) res 4,b bit 3,l jr z,x373E ;RAM 0-7 set 4,b x373E res 3,l ld a,c and %11111000 or l ld c,a ld (xE012),bc xor a ret ;проверка допустимости заданных адресов ;вх: de - адрес начала блока памяти ; hl - адрес конца блока памяти ; a - количество операндов [0..5] x374B cp #02 jr z,x375C ;если два параметра jr nc,x3719 ;большк двух параметров. выход в отладчик ld hl,#FFFF cp #01 jr z,x375C ld de,(xDD69) ;указатель MEM ;сравнение hl>=de, в противном случае отмена команды x375C or a sbc hl,de add hl,de ret nc ld a,#1D ;сообщение: start > _число_ x3763 jp x0B06 ;полное обновление монитора ;установка заданной страницы и сравнение hl>=de, с отменой команды ;a - количество операндов [0..5] x3766 call x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя cp #04 call z,x37F0 ;установка страницы по прочтенному четвертому операнду jr z,x375C ;сравнение hl>=de, в противном случае отмена команды cp #03 jr z,x375C ;сравнение hl>=de, в противном случае отмена команды ld a,#0A ;сообщение: too few operands x3776 jr x3763 ;полное обновление монитора ;АДРЕС: #3778 Команда: SCReen [on|off|5|7] ; установка/отображение экрана пользователя x3778 cp #01 jr z,x3787 ;есть параметр jr nc,x3719 ;много параметров. выход в отладчик call x3A21 ;копирование активного экрана пользователя в #4000 call x302E ;ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне jp x0AF2 ;возврат в монитор с обновлением экрана x3787 ld a,e and #FE or d jr nz,x379A ld a,#81 ;сообщение: enter command ld hl,xE026 set 1,(hl) bit 0,e ret z res 1,(hl) ret x379A ld a,d or a ld a,#17 ;сообщение: illegal value operand ret nz ;ошибка. выход в отладчик ld hl,xE012 ld a,e cp #05 jr z,x37AE ;установка экрана из страницы 5 cp #07 jr z,x37B5 ;установка экрана из страницы 7 ld a,#17 ;сообщение: illegal value operand ret x37AE res 3,(hl) x37B0 ld a,#81 ;сообщение: enter command jp x0AFB x37B5 set 3,(hl) jr x37B0 ;АДРЕС: #37B9 управление выводимым листингом (опрос клавиш space, s, cs+1) x37B9 push hl ld hl,xE02D bit 3,(hl) res 3,(hl) push af call nz,x381C ;проверка нажатия клавиш space и s pop af call z,x3813 pop hl ld a,#FE in a,(#FE) rrca ret c ;cs не нажата ld a,#F7 in a,(#FE) rrca ret c ;1 не нажата res 3,(iy+#19) ;нажата cs+1 call x382E ;ожидание отжатия всех клавиш x37DD call x093C ;вывод на экран ld a,#9A bit 0,(iy+#12) jr nz,x3776 ;ввод и обработка команды отладчика jp x0AD7 ;печать меню ;установка страницы по номеру hl x37EB push af push hl push bc jr x37F6 ;установка страницы по прочтенному четвертому операнду x37F0 push af push hl push bc ld hl,(xDD99+#06) ;третий операнд в команде (bank) x37F6 call x371D ;установка страницы пользователя равной номеру страницы в HL ld hl,(xE012) ld (xE00E),hl call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя pop bc pop hl pop af scf ret ;АДРЕС: #3807 пауза 40416t x3807 ld a,#C0 x3809 push bc ld b,#00 djnz $ pop bc dec a jr nz,x3809 ret ;проверка нажатия клавиш space и s x3813 ld a,#7F in a,(#FE) rrca ret c ;Space не нажат call x382E ;ожидание отжатия всех клавиш ;проверка нажатия клавиш space и s x381C call x3807 ;пауза 40416t call x3023 ;ожидание действий пользователя (опрос управления, вывод часов) cp #20 jr z,x382B ;нажат пробел and #5F cp "S" ret nz x382B set 3,(hl) ret ;АДРЕС: #382E ожидание отжатия всех клавиш x382E xor a in a,(#FE) cpl and #1F ret z jr x382E ;АДРЕС: #3837 копирование блока памяти в ram 8 с раскодированием ;вх: hl - адрес закодированной процедуры/данных ; de - адрес этой процедуры/данных для размещения в ram 8 ; db ?,?,n,? - длина ; db ?,?,?,n - адрес байта для раскодирования x3837 ex (sp),hl inc hl inc hl ld b,(hl) inc hl push de ld e,(hl) inc hl ld d,#00 ld a,(de) ;байт по заданному адресу pop de ex (sp),hl ld c,a ;байт по заданному адресу ld a,(x00FE) xor c ld c,a ld a,(x00FD) xor c ld c,a ld a,(x00FC) xor c ld c,a x3854 ld a,c xor b xor (hl) ld (de),a inc hl inc de djnz x3854 ret ;АДРЕС: #385D не используется x385D scf jr x3861 ;АДРЕС: #3860 не используется x3860 or a x3861 pop hl ld e,(hl) inc hl ld d,(hl) inc hl push hl ex de,hl jr c,x3880 ld a,(hl) or a jr nz,x3883 ld a,#3D ;сообщение: Professional program not found ;АДРЕС: #3870 печать сообщения и продолжение работы текущего меню монитора ;вх: a - номер сообщения из блока 0 x3870 sla a call x3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана scf ;cy=1 с очисткой буфера ввода rst #30 dw rom5_x1C84 ;инициализация окна ввода db #05 call x302E ;ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне jp x0129 ;печать текущего меню монитора x3880 ld a,(hl) or a ret z x3883 jp (hl) ;АДРЕС: #3884 получить адрес, на который ссылается команда ассемблера ;вх: hl - адрес команды ассемблера ;вх: z - команда не ссылается на память ; nz -> hl - адрес на который ссылается команда x3884 push hl call x2F96 ;анализ команды ассемблера pop hl bit 6,(iy+#01) ret z ;в команде нет ссылки на адрес памяти ld hl,(xDDD0) ret ;переход на адрес, на который ссылается команда ассемблера x3892 xor a call x38C6 ;запись в таблицу текущего адреса дизасма ex de,hl call x3884 ;получить адрес, на который ссылается команда ассемблера jr x38C3 ;переход на новый адрес ;расчет адреса в таблице с записями адресов дизасма ;вх: a - номер ячейки в таблице ;вых: hl - адрес в таблице x389C ld l,a ld h,#00 ld de,xDD8D add hl,hl add hl,de ret ;ввод нового адреса листинга x38A5 ld a,#C3 x38A7 rst #30 dw rom6_x06AD ;ввод текстовой строки внизу экрана db #06 jr c,x38D1 ;нажата Break. Выход из режима bit 4,(iy+#05) push af call z,x0D55 ;вводить адрес выражением pop af call nz,x0DF4 ;вводить адрес числом jr nz,x38A7 ;не верный адрес push de ld a,#0C ;сообщение: _Working ... rst #30 dw rom5_x1C84 ;инициализация окна ввода db #05 pop hl x38C3 jp x394F ;запись в таблицу текущего адреса дизасма ;вх: a - номер ячейки в таблице x38C6 call x389C ;расчет адреса в таблице ld de,(xDD8B) ld (hl),e inc hl ld (hl),d ret ;выход из режима дизасма x38D1 res 1,(ix+#07) jp x37DD ;АДРЕС: #38D8 быстрый вход в команду DASM (ss+D) x38D8 xor a ld hl,(xDD6B) ;pc программы пользователя bit 6,(iy+#05) jr nz,x38E5 ;адрес команды SS/D, берется из регистра PC ;АДРЕС: #38E2 Команда: DASm [addr] вывод листинга дизасма x38E2 ld hl,(xDD69) ;адрес команды SS/D. берется из ячейки (mem) x38E5 or a jr z,x38EE ;нет параметров, с текущего адреса cp #02 ld a,#0B ;сообщение: too many operands ret nc ;много параметров ex de,hl x38EE ld (xDD8B),hl ;адрес начала для команды DASM ld a,#0C ;сообщение: _Working ... rst #30 dw rom5_x1C84 ;инициализация окна ввода db #05 x38F7 call x3A95 ;подготовка переменных к выводу на экран/принтер ld (ix+#00),#00 ;crd Y set 1,(ix+#07) ;Изменять атрибуты при выводе каждого символа ld hl,(xDD8B) ;адрес начала для команды DASM ld b,#16 ;кол-во строк для вывода jr x390C ;печать листинга дизасма x3909 inc (ix+#00) x390C push bc call x39A8 ;печать одной строки листинга дизасма pop bc djnz x3909 ;опрос клавиатуры и реакция на клавиши x3913 ld hl,x3913 ;сюда вернемся push hl rst #30 dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) db #06 call x2C7E ;поиск и вызов процедуры обработки без возврата(если не найдено возврат) db #8E ;ss+D dw x38D1 ;выход из режима дизасма db #03 ;Break dw x38D1 ;выход из режима дизасма db #85 ;cs+5 dw x3951 ;переход на один байт назад db #83 ;cs+8 dw x3956 ;переход на один байт вперед db #86 ;cs+6 dw x398F ;переход на одну команду вперед db #84 ;cs+7 dw x3963 ;переход на одну команду назад db #0D ;Enter dw x38A5 ;ввод нового адреса db #8D ;ss+G dw x3892 ;переход на адрес, на который ссылается команда ассемблера db #62 ;b dw x330B ;установка ловушки #8, по текущему адресу листинга дизасма db #6E ;n dw x3326 ;удаление ловушки #8 db #FF sub #30 ret c ld c,#05 cp c jr c,x38C6 ;нажато 0..4 - запись текущего адреса дизасма sub c cp c ret nc ;не цифра call x389C ;нажато 5..9 - восстановление адреса дизасма ld e,(hl) inc hl ld d,(hl) ex de,hl x394F jr x395D ;переход на один байт назад x3951 ld bc,#FFFF jr x3959 ;переход на один байт вперед x3956 ld bc,#0001 x3959 ld hl,(xDD8B) add hl,bc x395D ld (xDD8B),hl ;адрес начала листинга x3960 pop hl jr x38F7 ;обновление окна с листингом ;переход на одну команду назад x3963 call x2A1B ;скроллинг окна вниз ld (ix+#00),#00 ;crd Y ld bc,#FFFB ;-5 x396D inc bc ld hl,(xDD8B) add hl,bc push bc call x2F96 ;анализ команды ассемблера pop bc ld de,(xDD8B) or a sbc hl,de jr z,x3982 ;команда найдена jr nc,x398B x3982 add hl,de jr nz,x396D ;команда найдена add hl,bc ld (xDD8B),hl ;адрес начала листинга jr x39A8 ;ищем дальше x398B add hl,de add hl,bc jr x395D ;переход на одну команду вперед x398F call x298E ;скроллинг окна вверх ld (ix+#00),#15 ;crd Y ld hl,(xDD8B) call x2F96 ;анализ команды ассемблера ld (xDD8B),hl ;адрес начала листинга ;ищем команду для печати в нижней строке ld b,#15 x39A1 push bc call x2F96 ;анализ команды ассемблера pop bc djnz x39A1 ;АДРЕС: #39A8 Печать одной строки листинга дизасма x39A8 ld a,(ix+#06) ;цифровые атрибуты окна push af ld (ix+#01),#00 ;crd X =#00 push ix call x3281 ;установка начала списка ловушек ;обработка ловушек, для подсветки строки x39B5 bit 7,(ix+#00) jr z,x39DD ;ловушка не активна ; ловушка активна push hl ld l,(ix+#01) ;номер страницы в которой установлена ловушка call x3707 ;сравнение страницы пользователя с заданной pop hl jr nz,x39DD ;в другой странице push de ld e,(ix+#02) ld d,(ix+#03) ;адрес ловушки or a sbc hl,de add hl,de pop de jr nz,x39DD ;не по текущему адресу ld a,(xE114) ;атрибуты для подсветки ловушки при выводе дизасма ex (sp),ix ld (ix+#06),a ex (sp),ix x39DD add ix,de djnz x39B5 pop ix call x2FAC ;печать строки дизасма pop af ld (ix+#06),a ret ;АДРЕС: #39EB Команда: LCATalogue [num_drive] ; вывод каталога дискеты на принтер ;вх: de - первый операнд ; a - количество операндов [0..5] x39EB set 4,(iy+#09) ;вывод на принтер ;АДРЕС: #39EF Команда: CATalogue [num_drive] ; вывод каталога дискеты ;вх: de - первый операнд ; a - количество операндов [0..5] x39EF or a jr z,x3A04 ;используем текущий дисковод cp #04 ;!!!ОШИБКА параметр всего один ld a,#0B ;сообщение: too many operands jr nc,x3A08 ;много параметров. выход в отладчик ld a,e and #FC or d ld a,#3E ;сообщение: known disk jr nz,x3A08 ;неврный номер дисковода. выход в отладчик ld a,e call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ x3A04 rst #30 dw rom6_x0249 ;вывод каталога текущего дисковода (на экран/принтер) db #06 x3A08 call x093C ;вывод на экран ld a,#81 ;сообщение: enter command jp x0AE0 ;выход в отладчик ;АДРЕС: #3A10 Команда: PUSH data ; занесение в стек программы значения data x3A10 ld hl,x367C ;сюда вернемся ex (sp),hl ;АДРЕС: #3A14 запись de на стэк пользователя ;вх: de - число ; x3A14 ld hl,(xDD6D) ;адрес вершины стэка пользователя dec hl ld a,d rst #00 dec hl ld a,e rst #00 ld (xDD6D),hl ret ;АДРЕС: #3A21 копирование активного экрана пользователя в #4000 ; x3A21 bit 3,(iy-2) jp z,x0581 ;был scr 5 при входе ld bc,#1FFD ;был scr 7 при входе ld a,#02 out (c),a ld b,#7F ld a,#17 out (c),a ;rom 2, ram 7 ld hl,#C000 ld de,#4000 ld bc,#1B00 ldir ;копируем экран из ram 7 ld bc,#7FFD ld a,#10 out (c),a ld b,#1F ld a,#12 out (c),a ;rom 2, ram 8 ret ;АДРЕС: #3A4E восстановление переменной с состоянием портов #1FFD/#7FFD пользователя x3A4E push hl ld hl,(xE010) ld (xE012),hl pop hl ret ;АДРЕС: #3A57 Команда: LDISs [addr_st[,addr_end]] реассемблирование блока памяти ; на принтер. ;вх: de - первый операнд ; hl - второй операнд ; a - количество операндов [0..5] x3A57 call x374B ;;проверка допустимости заданных адресов set 4,(iy+#09) ;вывод на принтер jr x3A63 ;АДРЕС: #3A60 Команда: DISs [addr_st [,addr_end]] ; реассемблирование блока памяти с адреса addr_st по addr_end ; включительно ;вх: de - первый операнд ; hl - второй операнд ; a - количество операндов [0..5] x3A60 call x374B ;проверка допустимости заданных адресов x3A63 ld bc,x2FAC ;п/п печать строки дизасма jr x3A77 ;АДРЕС: #3A68 Команда: LDUmp [addr_st[,addr_end]] ; выдача дампа памяти на принтер с адреса addr_st по addr_end включительно ;вх: de - первый операнд ; hl - второй операнд ; a - количество операндов [0..5] x3A68 call x374B ;проверка допустимости заданных адресов set 4,(iy+#09) ;вывод на принтер jr x3A74 ;АДРЕС: #3A71 Команда: DUmp [addr_st[,addr_end]] ; выдача дампа памяти с адреса addr_st по addr_end включительно ;вх: de - первый операнд ; hl - второй операнд ; a - количество операндов [0..5] x3A71 call x374B ;проверка допустимости заданных адресов x3A74 ld bc,x2EBE ;п/п печати одной строки дампа памяти (8 байт) x3A77 ex de,hl call x3A95 ;подготовка переменных к выводу на экран/принтер x3A7B call x37B9 ;управление выводимым листингом (опрос клавиш space, s, cs+1) rst #20 db #8D push de push bc call x3A93 ;вызов п/п по адресу в bc - call (bc) pop bc pop de or a sbc hl,de add hl,de jr c,x3A7B ;еще не конец call x093C ;вывод на экран ld a,#81 ;сообщение: enter command ret ;АДРЕС: #3A93 вызов п/п по адресу в bc - call (bc) x3A93 push bc ret ;АДРЕС: #3A95 подготовка переменных к выводу на экран/принтер x3A95 push hl push de push bc bit 4,(iy+#09) ld hl,xE075 jr z,x3AA4 ;вывод на экран ld hl,xE067 ;вывод на принтер x3AA4 call x301C ;ix = адрес дескриптора окна из hl push af call z,x2A5E ;обработка управляющего кода #0C (очистка текущего окна) ld (iy+#0A),#00 pop af jr nz,x3AB6 ;вывод на принтер ld (ix+#00),#15 ;crd Y x3AB6 ld hl,x3AC0 ld (xDE12),hl pop bc pop de pop hl ret x3AC0 call x093C ld a,#9E jp x0B06 ;АДРЕС: #3AC8 Команда: VList x3AC8 ld hl,x23A3 ld de,x2104 ;п/п печати слова анализатора jr x3AD8 ;АДРЕС: #3AD0 Команда: Help x3AD0 ld hl,x3D01 ld c,#00 ld de,x3AFB ;печать команд отладчика/слов анализатора x3AD8 call x33BB ;установка и очистка информационного окна отладчика x3ADB ld b,(ix+#04) ;высота окна в знакоместах x3ADE push de call x3AF9 ;вызов п/п по адресу в de - call (de) pop de ld a,#81 ;сообщение: enter command ret nc ;завершили печать djnz x3ADE ; ожидание нажатия клавиши push hl push bc push de rst #30 dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) db #06 pop de pop bc pop hl cp #03 jr nz,x3ADB ;если не Break печатаем следующую страницу ld a,#9A ;сообщение: command abandoned ret ;АДРЕС: #3AF9 вызов п/п по адресу в de - call (de) x3AF9 push de ret ;АДРЕС: #3AFB печать команды отладчика ;вх: hl - адрес команды отладчика ; c - номер команды в списке ;вых: hl - адрес начала следующей команды ; c - номер следующей команды в списке ; cy=1 слово напечатано ; cy=0 нет больше слов для печати x3AFB ld a,(hl) or a ret z ;выход если конец списка cp #20 jr nc,x3B12 ;печать команды ;печать названия группы команд push bc ld c,a dec c ;номер блока соообщений rst #20 db #0D dc "- " inc hl ld b,(hl) ;номер сообщения inc hl push hl rst #08 pop hl pop bc jr x3B53 ;выход ;печать команды x3B12 push bc rst #20 db #8D ld b,#0A call x15DD ;печать сообщения из hl не менее заданной длины pop bc push bc push hl ld hl,x3E2C ld a,c add a,a add a,c ld c,a inc c inc c ld b,#00 add hl,bc ld a,(hl) ;флаг описателя команды bit 7,a jr z,x3B30 ;в параметрах нет строки jr x3B34 ;в параметрах команды есть строка x3B30 bit 5,a jr z,x3B3C ; в параметрах команды есть строка: печать comp. x3B34 rst #20 dc "comp." jr x3B50 ; печать количества параметров команды x3B3C bit 6,a push af jr nz,x3B46 ;в команде есть необязательные параметры rst #20 dc " " jr x3B49 x3B46 rst #20 dc "<=" x3B49 pop af and #1F rst #30 dw rom6_x03A1 ;печать числа в десятичной системе счисления db #06 x3B50 pop hl pop bc inc c ;выход x3B53 scf ret ;АДРЕС: #3B55 Команда: IM x3B55 ld a,e and #FC or d ld a,#17 ;сообщение: illegal value operand ret nz ld a,#81 ;сообщение: enter command ld hl,#0000 add hl,de add hl,de add hl,de ld de,x3B69 add hl,de jp (hl) ;процедуры для установки режима прерываний x3B69 im 0 ret im 1 ret im 2 ret ld a,#17 ;сообщение: illegal value operand ret ;АДРЕС: #3B75 определение типа прерываний im 1/2 ;вых: z режим im 2 ; nz режим im 1 ; a=0 - im 2 ; a=1 - im 1 x3B75 xor a ld d,a ld b,#01 ei halt ;если im 2, то d=0 di ;если im 1, то d=1 ld a,d or a ret ;АДРЕС: #3B7F установка переменных по конкретным адресам x3B7F ld hl,x3EDA ld b,#03 x3B84 ld e,(hl) inc hl ld d,(hl) inc hl ld a,(hl) ld (de),a inc hl inc de ld a,(hl) ld (de),a inc hl djnz x3B84 ret ;АДРЕС: #3B92 закодированные процедуры переключения страниц -> ram 8 xE3BE x3B92 db #CE,#38,#3B,#3A,#F4,#75,#DB,#73 db #D5,#F5,#D7,#29,#D1,#AD,#D3,#BF db #ED,#8B,#EF,#8E,#E9,#E9,#25,#0F db #00,#E3,#E6,#23,#03,#04,#F2,#3F db #CC,#DD,#45,#39,#4B,#F7,#51,#3D db #57,#33,#6D,#DF,#6D,#F0,#34,#FD db #1B,#43,#18,#87,#2E,#64,#8B,#A3 db #CB,#84,#42,#A1,#86,#A9,#DF,#82 db #5B,#7E,#9F,#BB,#AC,#8D,#9E,#B3 db #71,#70,#73,#72,#96,#81,#B2,#0B db #84,#E2,#AF,#6B,#86,#AF,#82,#F6 db #A5,#81,#B2,#A1,#8C,#A7,#92,#18 db #7A,#0E,#78,#B7,#0E,#61,#BB,#8F db #B2,#B5,#79,#6F,#B1,#B7,#A2 ;АДРЕС: #3C01 некодированные процедуры переключения страниц -> ram 8 xE42D x3C01 db #3E,#10,#32,#69,#E4,#F1,#E3,#22 db #3D,#E4,#21,#78,#E4,#E3,#E5,#21 db #01,#32,#E3,#ED,#43,#3D,#E4,#01 db #30,#3D,#18,#1A,#F5,#AF,#18,#03 db #F5,#3E,#10,#32,#69,#E4,#F1,#ED db #43,#3D,#E4,#E3,#4E,#23,#46,#23 db #E3,#E5,#21,#78,#E4,#E3,#C5,#F5 db #01,#FD,#7F,#3E,#00,#ED,#79,#3E db #10,#06,#1F,#ED,#79,#F1,#ED,#4B db #3D,#E4,#C9,#C5,#F5,#01,#FD,#1F db #3E,#12,#ED,#79,#F1,#C1,#C9,#E5 db #21,#30,#3D,#E3,#C5,#F5,#01,#FD db #1F,#3E,#10,#ED,#79,#06,#7F,#ED db #79,#F1,#C1,#C9,#C5,#F5,#01,#FD db #1F,#3E,#10,#ED,#79,#AF,#06,#7F db #ED,#79,#F1,#C1,#C9,#4F,#21,#10 db #01,#0F,#0F,#E6,#03,#85,#6F,#6E db #6E,#79,#C9,#E6,#03,#17,#85,#6F db #30,#01,#24,#7E,#23,#66,#6F,#C9 db #E3,#23,#23,#E3,#E5,#2A,#08,#E4 db #E3,#C9,#7B,#E6,#10,#ED,#79,#06 db #1F,#7A,#E6,#03,#F6,#10,#ED,#79 db #08,#38,#01,#7E,#77,#08,#3E,#12 db #ED,#79,#06,#7F,#3E,#10,#ED,#79 db #C3,#A1,#05,#7B,#E6,#10,#ED,#79 db #06,#1F,#7A,#E6,#03,#F6,#10,#ED db #79,#D9,#08,#30,#01,#EB,#ED,#B0 db #30,#01,#EB,#08,#D9,#3E,#12,#ED db #79,#06,#7F,#3E,#10,#ED,#79,#D9 db #C9,#00,#33,#33,#FB,#3C,#32,#0D db #E0,#3E,#C9,#32,#18,#E5,#3E,#FB db #32,#17,#E5,#ED,#56,#C3,#5E,#02 ;АДРЕС: #3D01 список команд отладчика x3D01 db #01,"L" ;номер блока сообщений+1, номер сообщения в блоке dc "ANalyser" dc "CLear" dc "DEFLoad" dc "DEFSave" dc "EDit" dc "EVal" dc "LDEFinition" dc "PDEFinition" dc "VList" dc "WORD" db #01,"M" dc "BREak" dc "BRK" dc "DELBreak" dc "LBreak" dc "LISTBreak" db #01,"N" dc "Jump" dc "CALl" dc "SLOW" dc "WORKspace" db #01,"O" dc "BASE" dc "EXX" dc "EX AF" dc "EXit" dc "OPTion" dc "SHow" db #01,"Q" dc ".PC" dc "." dc "CHeck" dc "DASm" dc "DATA" dc "DISs" dc "DUmp" dc "FILl" dc "FINd" dc "LDISs" dc "LDUmp" dc "MEMory" dc "MOVe" dc "PUSH" dc "POP" dc "RAM" dc "ROM" dc "SEarch" db #01,"R" dc "CATalogue" dc "ERAse" dc "LCATalogue" dc "LOAD" dc "SAVE" db #01,"S" dc "IM" dc "INTerrupt" dc "IND" dc "OUTD" dc "IN" dc "OUT" dc "SCReen" db #00 ;АДРЕС: #3E25 чтение портов #1FFD/#7FFD ;вых: cy=1 x3E25 ld b,#0E call x03B6 ;чтение регистра AY rlca ret ;АДРЕС: #3E2C адреса обработки команд отладчика ; 7,=1 в параметрах есть строка -> 0-2,=nnn количество числовых параметров перед строкой ; 6,=1 операнды передаются в регистрах de,hl,bc. кол-во операндлов в A ; 5,=1 обрабатывать команду без проверки синтаксиса ; 7-5,=000 -> 0-4,=nnnnn количество операндов x3E2C dw x1F42: db %00000001 ;ANalyser dw x1F25: db %00000000 ;CLear dw x1EA5: db %00100000 ;DEFLoad dw x1E76: db %00100000 ;DEFSave dw x2093: db %00100000 ;EDit dw x2297: db %00100000 ;EVal dw x2218: db %00000000 ;LDEFinition dw x2214: db %00000000 ;PDEFinition dw x3AC8: db %00000000 ;VList dw x1FB0: db %00100000 ;WORD dw x3303: db %01000101 ;BREak dw x32E2: db %00000010 ;BRK dw x32AF: db %00000001 ;DELBreak dw x31C1: db %00000000 ;LBreak dw x31C1: db %00000000 ;LISTBreak dw x36B4: db %01000010 ;Jump dw x3699: db %01000010 ;CALl dw x31AB: db %00000001 ;SLOW dw x344F: db %00000001 ;WORKspace dw x3432: db %00000001 ;BASE dw x3662: db %00000000 ;EXX dw x3666: db %00000000 ;EX AF dw x0AD7: db %00000000 ;EXit dw x3333: db %00000010 ;OPTion dw x33D2: db %00000000 ;SHow dw x3614: db %10000000 ;.PC dw x361E: db %10000000 ;. dw x356F: db %01000100 ;CHeck dw x38E2: db %01000001 ;DASm dw x360D: db %10000001 ;DATA dw x3A60: db %01000010 ;DISs dw x3A71: db %01000010 ;DUmp dw x35F5: db %01000100 ;FILl dw x346A: db %10000010 ;FINd dw x3A57: db %01000010 ;LDISs dw x3A68: db %01000010 ;LDUmp dw x365C: db %00000001 ;MEMory dw x352F: db %01000100 ;MOVe dw x3A10: db %00000001 ;PUSH dw x364D: db %00000000 ;POP dw x370C: db %00000001 ;RAM dw x36DB: db %00000001 ;ROM dw x3461: db %10000011 ;SEarch dw x39EF: db %01000001 ;CATalogue dw x3074: db %00100000 ;ERAse dw x39EB: db %01000001 ;LCATalogue dw x3095: db %00100000 ;LOAD dw x3085: db %00100000 ;SAVE dw x3B55: db %00000001 ;IM dw x3683: db %00000001 ;INTerrupt dw x337A: db %00000001 ;IND dw x336C: db %00000010 ;OUTD dw x3383: db %00000001 ;IN dw x3360: db %00000010 ;OUT dw x3778: db %01000001 ;SCReen db #00 ;АДРЕС: #3ED2 закодированный блок атрибутов меню монитора -> ram 8 xEAED x3ED2 db #A1,#AF,#AD,#AF,#A9,#AF,#AD,#AF ;АДРЕС: #3EDA данные для установки переменных по конкретным адресам x3EDA dw xC063 ;адрес dw #0000 ;включение отладчика dw xC064 ;адрес dw #0000 ;отключение мерехвата NMI dw xE9E5 ;адрес dw xF7C0 ;установка адреса шрифта ;АДРЕС: #3FE6 названия месяцев x3EE6 dc "Jan" dc "Feb" dc "Mar" dc "Apr" dc "May" dc "Jun" dc "Jul" dc "Aug" dc "Sep" dc "Oct" dc "Nov" dc "Dec" ;АДРЕС: #3F0A названия дней недели x3F0A dc "Sun" dc "Mon" dc "Tue" dc "Wed" dc "Thu" dc "Fri" dc "Sat" x3F1F DISPLAY "Free space at ",$,": ",/D,#4000-$," byte(s)" ds #4000-$,#00 SAVEBIN "../Build/scorp/NewROM2.bin",#0000,#4000