From b7a39665e211b85365da5b36943bc09a7bafabd7 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 27 Jun 2023 01:29:58 +1000 Subject: [PATCH] profROM --- ProfRom_Disasm/!AllConst.asm | 226 + ProfRom_Disasm/!RomDisk.asm | 50 + ProfRom_Disasm/!ram8.asm | 1248 +++ ProfRom_Disasm/!roms.mac | 56 + ProfRom_Disasm/ROM_MAP.TXT | 38 + ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin | Bin 0 -> 12800 bytes ProfRom_Disasm/prof_roms/rom4_fnt.bin | Bin 0 -> 1211 bytes ProfRom_Disasm/prof_roms/rom4_vars.bin | Bin 0 -> 371 bytes ProfRom_Disasm/prof_roms/rom5_ROMdisk.bin | Bin 0 -> 3328 bytes ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin | Bin 0 -> 11776 bytes ProfRom_Disasm/prof_roms/rom7_ROMdisk.bin | Bin 0 -> 6912 bytes ProfRom_Disasm/prof_roms/rom7_data4CRC.bin | Bin 0 -> 512 bytes ProfRom_Disasm/rom0.a80 | 10229 ++++++++++++++++++ ProfRom_Disasm/rom0.bat | 4 + ProfRom_Disasm/rom2.bat | 4 + ProfRom_Disasm/rom2_SrvMon.a80 | 10349 +++++++++++++++++++ ProfRom_Disasm/rom3.bat | 5 + ProfRom_Disasm/rom3_trdos.a80 | 7186 +++++++++++++ ProfRom_Disasm/rom4.a80 | 1082 ++ ProfRom_Disasm/rom4.bat | 4 + ProfRom_Disasm/rom5.a80 | 7671 ++++++++++++++ ProfRom_Disasm/rom5.bat | 4 + ProfRom_Disasm/rom6.a80 | 2902 ++++++ ProfRom_Disasm/rom6.bat | 4 + ProfRom_Disasm/rom7.a80 | 5903 +++++++++++ ProfRom_Disasm/rom7.bat | 4 + 26 files changed, 46969 insertions(+) create mode 100755 ProfRom_Disasm/!AllConst.asm create mode 100755 ProfRom_Disasm/!RomDisk.asm create mode 100755 ProfRom_Disasm/!ram8.asm create mode 100755 ProfRom_Disasm/!roms.mac create mode 100644 ProfRom_Disasm/ROM_MAP.TXT create mode 100755 ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin create mode 100755 ProfRom_Disasm/prof_roms/rom4_fnt.bin create mode 100755 ProfRom_Disasm/prof_roms/rom4_vars.bin create mode 100755 ProfRom_Disasm/prof_roms/rom5_ROMdisk.bin create mode 100755 ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin create mode 100755 ProfRom_Disasm/prof_roms/rom7_ROMdisk.bin create mode 100755 ProfRom_Disasm/prof_roms/rom7_data4CRC.bin create mode 100755 ProfRom_Disasm/rom0.a80 create mode 100755 ProfRom_Disasm/rom0.bat create mode 100755 ProfRom_Disasm/rom2.bat create mode 100755 ProfRom_Disasm/rom2_SrvMon.a80 create mode 100755 ProfRom_Disasm/rom3.bat create mode 100755 ProfRom_Disasm/rom3_trdos.a80 create mode 100755 ProfRom_Disasm/rom4.a80 create mode 100755 ProfRom_Disasm/rom4.bat create mode 100755 ProfRom_Disasm/rom5.a80 create mode 100755 ProfRom_Disasm/rom5.bat create mode 100755 ProfRom_Disasm/rom6.a80 create mode 100755 ProfRom_Disasm/rom6.bat create mode 100755 ProfRom_Disasm/rom7.a80 create mode 100755 ProfRom_Disasm/rom7.bat diff --git a/ProfRom_Disasm/!AllConst.asm b/ProfRom_Disasm/!AllConst.asm new file mode 100755 index 0000000..a865920 --- /dev/null +++ b/ProfRom_Disasm/!AllConst.asm @@ -0,0 +1,226 @@ + +romROMx0073 equ #0073 ;загрузка блока из ROM-Disk + +rom0_x1B11 equ #1B11 ;автостарт с диска +rom0_x259F equ #259F ; + +rom2_x0000 equ #0000 ;запись байта в память пользователя (rst #00) +rom2_x0028 equ #0028 ;чтение байта из памяти пользователя +rom2_x001B equ #001B ;для провреки размера ПЗУ: выдаст A=0 +rom2_x013A equ #013A ;выход из монитора +rom2_x03A7 equ #03A7 ;Запись регистра AY +rom2_x03B6 equ #03B6 ;чтение регистра AY +rom2_x04CE equ #04CE ;восстановление Турбо-режима +rom2_x04D5 equ #04D5 ;включение Турбо-режима +rom2_x05A1 equ #05A1 ;????????? +rom2_x0603 equ #0603 ;копирование памяти с #8000 в страницу пользователя +rom2_x0606 equ #0606 ;копирование страницы пользователя в #8000 +rom2_x0665 equ #0665 ;включение режима 48k only +rom2_x0749 equ #0749 ;восстановление области памяти из ram 8 +rom2_x0753 equ #0753 ;сохранение области памяти в ram 8 +rom2_x08D7 equ #08D7 ; печать текущего меню монитора +rom2_x0B06 equ #0B06 ;ввод и обработка команды отладчика +rom2_x0D42 equ #0D42 ;проверка символа в (hl) #20/#2C/#3B/#00/#0D +rom2_x0D46 equ #0D46 ;проверка символа в (hl) #2C/#3B/#00/#0D +rom2_x0DF4 equ #0DF4 ;преобразование строки в число +rom2_x0E73 equ #0E73 ;деление bc=hl/de с проверкой de на ноль +rom2_x0E85 equ #0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) +rom2_x0EE3 equ #0EE3 ;поиск в буфере ввода строки первого печатного символа +rom2_x15B3 equ #15B3 ;печать сообщения из hl длиной b +rom2_x15B9 equ #15B9 ;печать сообщения из hl с заменой непечатных символов на ? +rom2_x15D0 equ #15D0 ;печать сообщения по номеру (на экран/в буфер) +rom2_x15DB equ #15DB ;печать сообщения из hl +rom2_x15F3 equ #15F3 ;печать нескольких пробелов (в B) +rom2_x1612 equ #1612 ;печать числа в hl (dec/hex) с префиксом +rom2_x1629 equ #1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом +rom2_x162C equ #162C ;печать числа в заданной системе счисления +rom2_x165E equ #165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом +rom2_x1661 equ #1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом +rom2_x1669 equ #1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами +rom2_x166E equ #166E ;печать десятичного числа bc [0..65535] с ведущими пробелами +rom2_x1673 equ #1673 ;печать числа bc (на экран/в буфер) +rom2_x16AA equ #16AA ;деление bc=ac/de +rom2_x16DE equ #16DE ;печать числа hl=[#0000..#FFFF] +rom2_x16E3 equ #16E3 ;печать числа a=[#00..#FF] +rom2_x16EC equ #16EC ;печать числа a=[#0..#F] +rom2_x2800 equ #2800 ;печать символа в окне +rom2_x28F6 equ #28F6 ;мигание текстового курсора в строке ввода +rom2_x28B8 equ #28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) +rom2_x28E8 equ #28E8 ;печать/удаление курсора в окне +rom2_x2969 equ #2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей +rom2_x298E equ #298E ;скроллинг окна вверх +rom2_x2A1B equ #2A1B ;обработка управляющего кода #1E (скроллинг окна ввниз) +rom2_x2A5E equ #2A5E ;обработка управляющего кода #0C (очистка текущего окна) +rom2_x2A85 equ #2A85 ;очистка знакоместной строки по координатам курсора +rom2_x2B0B equ #2B0B ;печать символа со сбросом 7го бита (rst #10) +rom2_x2B10 equ #2B10 ;печать пробела (rst #10) +rom2_x2B12 equ #2B12 ;печать символа (rst #10) +rom2_x2C4D equ #2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ +rom2_x2E3D equ #2E3D ;печать дампа памяти в окне +rom2_x2E76 equ #2E76 ;удаление курсора на предыдущей ячейке дампа +rom2_x2EBA equ #2EBA ;печать одной строки дампа памяти (8 байт) +rom2_x2F74 equ #2F74 ;вывод дисасма памяти по адресу в de +rom2_x2FED equ #2FED ;печать пробелов до правого края окна +rom2_x2FF1 equ #2FF1 ;печать пробелов до заданной координаты X +rom2_x2FFB equ #2FFB ;установка текущим окна: ввод числа +rom2_x3005 equ #3005 ;установка текущим окна: main menu +rom2_x300F equ #300F ;чтение содержимого регистра ix основной программы +rom2_x3014 equ #3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана +rom2_x3019 equ #3019 ;ix = адрес дескриптора окна монитора: дамп памяти +rom2_x301C equ #301C ;ix = адрес дескриптора окна монитора из hl +rom2_x3107 equ #3107 ;запись области памяти в файл +rom2_x3201 equ #3201 ;печать ON/OFF от флага nz-ON/z-OFF +rom2_x3210 equ #3210 ;определение адреса ловушки +rom2_x35D3 equ #35D3 ;сравнение ix=xE075 +rom2_x35E0 equ #35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя +rom2_x36C3 equ #36C3 ;запись стандартного Magic-файла +rom2_x36F9 equ #36F9 ;получение номера логической страницы пользователя a=[#0..#F] +rom2_x3707 equ #3707 ;сравнение страницы пользователя с заданной +rom2_x3732 equ #3732 ;установка страницы пользователя равной номеру страницы в L +rom2_x37B9 equ #37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) +rom2_x3807 equ #3807 ;пауза 40416t +rom2_x382E equ #382E ;ожидание отжатия всех клавиш +rom2_x3870 equ #3870 ;печать сообщения и продолжение работы текущего меню монитора +rom2_x3A21 equ #3A21 ;копирование активного экрана пользователя в #4000 +rom2_x3A4E equ #3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя +rom2_x3A95 equ #3A95 ;подготовка переменных к выводу на экран/принтер +rom2_x3B75 equ #3B75 ;определение типа прерываний im 1/2 +rom2_x3EE6 equ #3EE6 ;названия месяцев +rom2_x3F0A equ #3F0A ;Названия дней недели + +rom3_x0FF3 equ #0FF3 ;Запись памяти на диск +rom3_x3D30 equ #3D30 ;вызов страницы tr-dos +rom3_x3FF0 equ #3FF0 ;вывод в порт +rom3_x3FF3 equ #3FF3 ;чтение порта + +rom4_x0122 equ #0122 ;копирование переменных монитора и проверка чтения портов #7FFD/#1FFD +rom4_x02E8 equ #02E8 ;проверка оригинальный/совместимый компьютер +rom4_x0305 equ #0305 ;установка переменных из NVRAM/CMOS128 +rom4_x0312 equ #0312 ;установка переменных по данным в CMOS +rom4_x0315 equ #0315 ;установка переменных по данным в CMOS +rom4_x036C equ #036C ;запись переменных в CMOS и в NVRAM +rom4_x0378 equ #0378 ;запись переменных в NVRAM +rom4_x0398 equ #0398 ;запись переменных в CMOS +rom4_x0512 equ #0512 ;запись на диск сектора с конфигурацией (C. save Set Up to disk) +rom4_x057F equ #057F ;распаковка шрифта в rom 8 +rom4_x0A5A equ #0A5A ;инициализация системы и печать сооветствующих сообщений + +rom5_x0110 equ #0110 ;опрос Break. cy=1 не нажата +rom5_x011C equ #011C ;опрос манипуляторов и печать курсора +rom5_x0176 equ #0176 ;восстановление экрана под курсором мыши +rom5_x0381 equ #0381 ;ожидание нажатия клавиш и обработка реакции на них +rom5_x043B equ #043B ;ОШИБКА!!!! вызов процедуры по номеру в C +rom5_x08EF equ #08EF ;доступность опции K. kempston joystick +rom5_x0C22 equ #0C22 ;установка параметров окна для ввода строки в меню монитора +rom5_x0EB5 equ #0EB5 ;печать текущего меню монитора +rom5_x1061 equ #1061 ;печать закодированного сообщения из hl +rom5_x1095 equ #1095 ;заксоренное сообщение +rom5_x10AB equ #10AB ;заксоренное сообщение +rom5_x11CD equ #11CD ;печать сообщения по номеру в BC +rom5_x1A4C equ #1A4C ;печать даты и времени в окне монитора +rom5_x1AA6 equ #1AA6 ;читаем время в строку в формате ASCII +rom5_x1B18 equ #1B18 ;читаем дату в строку в формате ASCII +rom5_x1C0D equ #1C0D +rom5_x1C73 equ #1C73 ;ввод текстовой строки в нижней строке экрана +rom5_x1C84 equ #1C84 ;инициализация окна ввода +rom5_x1CB3 equ #1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) +rom5_x1CB8 equ #1CB8 ;ввод строки (вых: hl адрес введенной строки) +rom5_x2054 equ #2054 ;печать рамки вокруг окна +rom5_x2278 equ #2278 ;редактирование дампа памяти в окне монитора +rom5_x2503 equ #2503 ;монтирование всех образов с винчестера +rom5_x25EB equ #25EB ;формирование в буфере xEBF5 списка образов коллекции +rom5_x2620 equ #2620 ;формирование в буфере xEBF5 списка подразделов MFS +rom5_x271A equ #271A ;подсчет количества подразделов в MFS +rom5_x2AA4 equ #2AA4 ;преобразование количества секторов в мегабайты +rom5_x302A equ #302A ;декремент (hl)=(hl)-1 +rom5_x3052 equ #3052 ;сложение двух 4х байтных чисел +rom5_x30B9 equ #30B9 ;идентификация жесткого диска +rom5_x30C6 equ #30C6 ;печать окна для тестирования HDD +rom5_x30F3 equ #30F3 ;печать кода ошибки винчестера +rom5_x3135 equ #3135 ;печать сообщения об ошибке несовпадения данных при чтении/записи на HDD +rom5_x3163 equ #3163 ;печать текущего номера цилиндра +rom5_x31AA equ #31AA ;удаление всех разделов MBR + + +rom6_x0156 equ #0156 ;печать информации о ловушке +rom6_x01E4 equ #01E4 ;установка новой ловушки в отладчике +rom6_x0249 equ #0249 ;вывод каталога текущего дисковода (на экран/принтер) +rom6_x03A1 equ #03A1 ;печать числа в десятичной системе счисления +rom6_x03A9 equ #03A9 ;форматирование/проверка текущей дискеты +rom6_x04E5 equ #04E5 ;быстрое форматирование текущей дискеты (очистка каталога) +rom6_x064D equ #064D ;установка дескриптора окна: запрос на запись MBR +rom6_x066C equ #066C ;установка код дисковой ошибки в переменной для печати числа +rom6_x067F equ #067F ;сохранение экрана пользователя на диск +rom6_x06A6 equ #06A6 ;печать сообщения об ошибке и продолжение работы монитора +rom6_x06AD equ #06AD ;ввод текстовой строки внизу экрана +rom6_x074A equ #074A ;ожидание действий пользователя (опрос управления, вывод часов) +rom6_x093F equ #093F ;rst 8:db #8B загрузка zs-snap с диска +rom6_x0976 equ #0976 ;загрузка zs-snap (S. load ... snap) +rom6_x097E equ #097E ;сохранение zs-snap (S. save ... snap) +rom6_x0D60 equ #0D60 ;установка п/п jp #addr по адресу xE338 +rom6_x0E3B equ #0E3B ;загрузка из ROM-disk +rom6_x1108 equ #1108 ;распаковка блока + +rom7_x01AF equ #01AF ;автостарт с дискеты +rom7_x0229 equ #0229 ;вызов функции R8DOS +rom7_x0394 equ #0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу +rom7_x0CFF equ #0CFF ;усттановка переменных дисковой BIOS +rom7_x0D62 equ #0D62 ;определение наличия NVRAM +rom7_x0DAD equ #0DAD ;чтение всей памяти NVRAM в память #7530 +rom7_x0DB6 equ #0DB6 ;чтение данных из NVRAM +rom7_x0DC7 equ #0DC7 ;запись всей памяти NVRAM из памяти #7530 +rom7_x0DD0 equ #0DD0 ;запись данных в NVRAM +rom7_x0E72 equ #0E72 ;что-то пишет в NVRAM +rom7_x0F55 equ #0F55 ;для сравнения чисел +rom7_x0F59 equ #0F59 ;для сравнения чисел +rom7_x0F5D equ #0F5D ;деление hl=dehl'/bc +rom7_x0FB7 equ #0FB7 ;умножение dehl=de'hl' * bc +rom7_x1003 equ #1003 ;копирование из (hl) в (de) 4х байт +rom7_x1035 equ #1035 ;сравнение двух чисел в памяти по адресам в de и hl +rom7_x1065 equ #1065 ;инициализация дисковода +rom7_x107B equ #107B ;инициализация дисковода и настройка на дискету +rom7_x1166 equ #1166 ;загрузка очередного дескриптора файла в буфер +rom7_x11B0 equ #11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) +rom7_x11D4 equ #11D4 ;открытие файла для внутренних нужд +rom7_x11DF equ #11DF ;открыть файл для последующих операций с ним +rom7_x1240 equ #1240 ;R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". +rom7_x128C equ #128C ;R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" +rom7_x1307 equ #1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 +rom7_x1360 equ #1360 ;R8DOS #1E(30) последовательное считывание заданного количества секторов +rom7_x1365 equ #1365 ;R8DOS #1C(28) последовательное чтение очередного сектора из файла +rom7_x1390 equ #1390 ;R8DOS #1F(31) последовательная запись заданного количества секторов +rom7_x1395 equ #1395 ;R8DOS #1D(29) последовательная запись одного сектора из памяти +rom7_x1405 equ #1405 ;новое значение указателя в файле R8DOS #22 +rom7_x14C0 equ #14C0 ;R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl +rom7_x155A equ #155A ;чтение заголовка первого попавшегося сектора дисковода A +rom7_x1572 equ #1572 ;определение наличия interrupt controller +rom7_x15C7 equ #15C7 ;определение наличия последовательного порта/модема +rom7_x16B9 equ #16B9 ;работа с контроллером прерываний +rom7_x1768 equ #1768 ;поиск раздела MFS +rom7_x17BB equ #17BB ;чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела +rom7_x17EF equ #17EF ;запись 2х секторов из буфера xEBF5 +rom7_x18C0 equ #18C0 ;R8DOS #28(40) подключение раздела к драйверу HDD +rom7_x1AB1 equ #1AB1 ;определение адреса начала записи для заданного дисковода в буфере xE5A9 +rom7_x1B04 equ #1B04 ;расчет адреса блока описателя заданного дисковода +rom7_x1D2A equ #1D2A ;подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер +rom7_x1D45 equ #1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl +rom7_x1D73 equ #1D73 ;чтение сектора с винчестера в буфер xE5A9 +rom7_x1DDF equ #1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек +rom7_x1E3D equ #1E3D ;чтение сектора 3 в буфер xE5A9 и проверка контрольной суммы +rom7_x1E74 equ #1E74 ;R8DOS #22(34) идентификация жесткого диска +rom7_x1F08 equ #1F08 ;проверка геометрии винчестера +rom7_x1F2D equ #1F2D ;расчет произведения головок и секторов +rom7_x1F41 equ #1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора +rom7_x1F59 equ #1F59 ;чтение ячейки CMOS +rom7_x1F76 equ #1F76 ;чтение из CMOS времени и даты, в случае готовности CMOS +rom7_x1F93 equ #1F93 +rom7_x1FB2 equ #1FB2 ;запись в CMOS времени и даты +rom7_x2023 equ #2023 ;запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F +rom7_x2047 equ #2047 ;определение наличия CMOS +rom7_x20F1 equ #20F1 ;тестирование HDD (2. test) (тест на чтение/запись) +rom7_x2105 equ #2105 ;тестирование HDD (1. test) (тест только на чтение) +rom7_x2422 equ #2422 ;определение наличия SMUC + + +romA_x001B equ #001B ;для провреки размера ПЗУ: выдаст A=2 + diff --git a/ProfRom_Disasm/!RomDisk.asm b/ProfRom_Disasm/!RomDisk.asm new file mode 100755 index 0000000..7ab59ae --- /dev/null +++ b/ProfRom_Disasm/!RomDisk.asm @@ -0,0 +1,50 @@ +;АДРЕС: #0073 загрузка блока из ROM-Disk +;вх: h - номер страницы с файлом +; l - смещение в параграфах от начала ROM-disk в этой странице +; b - размер в параграфах +;вых: b - осталось незагруженных параграфов +; l - номер очередного параграфа +; +x0073 ld c,#00 + ld de,(#0070) ;e - начало ROM-disk в параграфах, d - всего параграфов + ld a,l + or a + jr nz,x007F + ld l,e + ld a,e +x007F sub e + ld e,a + ld a,d + sub e + ld e,a ;e - параграфов от начала блока до конца страницы + ld a,b + sub e + jr nc,x008F ;продолжение блока в следующей странице + xor a ;блок целиком в этой странице + push af + call x0099 ;копирование блока в память + pop bc + ret +x008F inc h ;увеличим номер страницы + push af ;запомним кол-во незагруженных параграфов + ld b,e + call x0099 ;копирование блока в память + pop bc + ld l,#00 + ret +;копирование блока в память +;вх: l - номер первого параграфа +; b - кол-во параграфов +; c=#00 +;вых: a,l - номер очередного параграфа +x0099 push hl + ld h,l + ld l,c + ld de,(xE7BE) + ldir + ld (xE7BE),de + ld a,h + pop hl + ld l,a + ret +;x00AA diff --git a/ProfRom_Disasm/!ram8.asm b/ProfRom_Disasm/!ram8.asm new file mode 100755 index 0000000..5ac2559 --- /dev/null +++ b/ProfRom_Disasm/!ram8.asm @@ -0,0 +1,1248 @@ + +x5B88 equ #5B88 ;содержимое порта #7FFD +x7530 equ #7530 ;для контролера прерываний +x9C40 equ #9C40 ;для контролера прерываний + +xC000 +xC001 equ #C001 ;2 для маркера страницы +xC006 equ #C006 ; + +xC063 equ #C063 ;1 <>0 отладчик отключен +xC064 equ #C064 ;2 адрес п/п вызываемой при входе в монитор +xC066 +xC069 equ #C069 ;#1B00 сохраненный экран +xDB69 equ #DB69 ;область для сохранения памяти с адреса #8002 + ;буфер для чтения даты и времени в формате ASCII + ;буфер для загрузки конфигурационного сектора +xDD69 equ #DD69 ;2 адрес текущей ячейки в дампе памяти +xDD6B equ #DD6B ;2 адрес возврата из монитора/ pc программы пользователя +xDD6D equ #DD6D ;2 указатель вершины стэка программы пользователя, с учетом 11 байт уже сохраненных на стэке +xDD6F equ #DD6F ;2 регистр ix +xDD71 equ #DD71 ;2 регистр iy +xDD73 equ #DD73 ;2 регистр hl +xDD75 equ #DD75 ;2 регистр de +xDD77 equ #DD77 ;2 регистр bc +xDD79 equ #DD79 ;2 регистр hl' +xDD7B equ #DD7B ;2 регистр de' +xDD7D equ #DD7D ;2 регистр bc' +xDD7F equ #DD7F ;2 регистр af +xDD81 equ #DD81 ;2 регистр af' +xDD83 equ #DD83 ;2 вершина стэка для сохранения регистров при входе в монитор + ;2 регистр r и флаг IFFF2 +xDD85 equ #DD85 ;1 i +xDD86 equ #DD86 ;1 номер rom откуда зашли + ; =#01 rom 0 Basic 128k + ; =#02 rom 0 Basic 48k + ; =#04 rom 3 Tr-Dos + ; =#08 rom 2 SrvMon + ; =#80 запрос от принтера +xDD87 equ #DD87 ;2 адрес начала дампа памяти +xDD89 equ #DD89 ;2 адрес текущей ячейки в дампе памяти + ; адрес начала дизасма в дампе памяти + ; номер последней записи в каталоге ROM-disk + ; количество подразделов в разделе MFS +xDD8B equ #DD8B ;2 адрес начала листинга для команды DASM +xDD8D equ #DD8D ;#0A таблица закладок в листинге дизасма +xDD97 +;область для сохранения стэка 11 байт +xDD99 equ #DD99 ;2 (#C001) + ;#0C 6 числовых операндов для команд отладчика +xDD9B equ #DD9B ;2 bc +xDD9D equ #DD9D ;1 номер rom откуда зашли +xDD9E equ #DD9E ;2 af флаг IFFF2 и регистр r +xDDA0 equ #DDA0 ;2 af +xDDA2 equ #DDA2 ;2 адрес возврата из монитора +xDDA4 +xDDA7 equ #DDA7 ;2 для временного сохранения указателя стэка/регистров + ; для печати числа в сообщениях +xDDA9 +xDDAA equ #DDAA ;2 текущий адрес команды ассемблера для дизасма +xDDAC equ #DDAC ;4 буфер для содержимого памяти адресуемой текущим регистром + ;4 буфер команды для дизассемблирования + ;8 буфер вывода строки дампа памяти +xDDB4 equ #DDB4 ;3 команда дизассемблера без префиксов +xDDB7 equ #DDB7 ;9 сообщение для печати команды дизасма + ; +0 =[#7E..#C4] -> -#7E =[#00..#46] из таблицы x1107 + ; +1 код сообщения второго операнда + ;=[#01..#2B] код операнда + ;=[#27..#2B] в операнде есть число в скобках + ;=[#2C..#74] код мнемоники + ;=[#7E..#C4] код команды ассемблера + ;=[#EC] за этим байтом следует адрес сообщения + ;=[#EE] печать db #nn ;BAD + ;=[#F1] прерываем печать команды + ;=[#F7] признак конца команды + ;=[#F8..#FF] за этим байтом следует число + ; ;вх: 0,a =0/1 двухбайтное/однобайтное число + ; ; 1-2,a - система счисления (bin/oct/dec/hex) + ;=[#00,#75..#EB,#ED..#F7] выход без печати hl=hl-1 + +xDDC0 equ #DDC0 ; + +xDDCB equ #DDCB ;2 для сохранения стэка, при формировании команды дизасма +xDDCD equ #DDCD ;1 код команды дизасма +xDDCE equ #DDCE ;2 адрес перехода при дизасме +xDDD0 equ #DDD0 ;2 адрес следующей команды дизасма +xDDD2 equ #DDD2 ;2 адрес на который ссылаются команды работающие с ячейками + ; памяти, такие как LD ( ),reg или SET b,(IX+d). +xDDD4 equ #DDD4 ;2 +xDDD6 equ #DDD6 ;2 +xDDD8 equ #DDD8 ;2 адрес начала текущего блока сообщений +xDDDA equ #DDDA ;2 адрес начала текущего блока слов +xDDDC equ #DDDC ;2 для команд поиска в отладчике: адрес начала поиска +xDDDE equ #DDDE ;2 для команд поиска в отладчике: адрес конца поиска +xDDE0 equ #DDE0 ;1 для команд поиска в отладчике: длина искомой строки +xDDE1 equ #DDE1 ;2 для команд поиска в отладчике: состояние портов #7FFD/#1FFD пользователя +xDDE3 equ #DDE3 ;#14 для команд поиска в оладчике: искомая строка +xDDF7 equ #DDF7 ;2 указатель стэка при входе в монитор, с учетом 11 байт уже сохраненных на стэке +xDDF9 +xDDFF equ #DDFF ;1 номер текущего меню +xDE00 equ #DE00 ;8 номер текущей опции для каждого меню из списка номеров меню +xDE08 equ #DE08 ;8 список номеров меню для возврата в предыдущее +xDE10 equ #DE10 ;2 для сохранения hl +xDE12 equ #DE12 ;2 для сохранения адреса возврата +xDE14 equ #DE14 ;1 код предыдущего нажатия при просмотре списка введенных строк +xDE15 equ #DE15 ;2 адрес буфера ввода строки +xDE17 equ #DE17 ;43 буфер для ввода строки +xDE42 equ #DE42 ;400 список последних введенных строк +xDFD2 equ #DFD2 ;24 буфер для сохранения экрана под курсором мыши +;xDFE9 equ #DFE9 ; +xDFEA equ #DFEA ;4 буфер нажатых клавиш +xDFEE equ #DFEE ;-26 копия порта #7FBA + ; 6,=0/1 образ к дисководу B подключен/не подключен + ; 7,=0/1 образ к дисководу A подключен/не подключен + ; =#FF при инициализации +xDFEF equ #DFEF ;-25 +xDFF0 equ #DFF0 ;-24 1 состояние порта #FFBA + ; 7,=0 активен регистр адреса CMOS + ; =1 активен регистр данных CMOS + ; =#F7 при включении компьютера +xDFF1 equ #DFF1 ;-23 =0..3 с какого диска делать автостарт +xDFF2 equ #DFF2 ;-22 значение Cylinders HDD (2 байта) +xDFF4 equ #DFF4 ;-20 значение head HDD +xDFF5 equ #DFF5 ;-1F значение sector HDD +xDFF6 equ #DFF6 ;-1E значение seconds +xDFF7 equ #DFF7 ;-1D значение minutes +xDFF8 equ #DFF8 ;-1C значение hours +xDFF9 equ #DFF9 ;-1B значение days +xDFFA equ #DFFA ;-1A значение months +xDFFB equ #DFFB ;-19 значение years +xDFFC equ #DFFC ;-18 2 =#FC9D/#FC8B (64669/64651) оригинальный иначе совместимый +xDFFD equ #DFFD ;-17 +xDFFE equ #DFFE ;-16 2 сбойных секторов на диске + ; 1 поиск файла: номер загруженного в буфер сектора [#00..#0F] +xDFFF equ #DFFF ;-15 1 поиск файла: номер загруженного в буфер сектора [#01..#10] +xE000 equ #E000 ;-14 2 всего секторов на диске + ; 1 ROM-disk: смещение в параграфах от начала ROM-disk в этой странице + ; 1 поиск файла: номер текущего файла в считанном секторе [#00..#0F] +xE001 equ #E001 ;-13 1 ROM-disk: номер страницы с файлом ROM-disk +xE002 equ #E002 ;-12 0, + ; 1,=1 загружать/сохранять в zs-snap регистры AY +xE003 equ #E003 ;-11 +xE004 equ #E004 ;-10 1 содержимое регистра 7 AY +xE005 equ #E005 ;-0F 0,=1 эта же клавиша была нажата и в предыдущем цикле + ; 1,=1 работает автоповтор нажатой клавиши + ; 2,=1 клавиша была нажата. код клавиши еще не обработан + ; 3, + ; 4, + ; 5,=1 ????для рисования рамок???? + ; 6,=1 было нажато cs+ss + ; 7,=1 нажат CapsLock (cs+2) +xE006 equ #E006 ;-0E 1 код нажатой клавиши +xE007 equ #E007 ;-0D 1 код нажатой клавиши +xE008 equ #E008 ;-0C координата X курсора мыши в текущем окне (в знакоместах) +xE009 equ #E009 ;-0B координата Y курсора мыши в текущем окне (в знакоместах) +xE00A equ #E00A ;-0A 0-4, - величина задержки для куросра + ; 5,=1 + ; 6,=1 работает счетчик before repeat + ; 7,=1 курсор(стрелка) напечатан на экране +xE00B equ #E00B ;-09 1 координата Y выделенной опции меню +xE00C equ #E00C ;-08 1 номер блока сообщений текущей опции +xE00D equ #E00D ;-07 1 копия байта (#00FB) rom 2 +xE00E equ #E00E ;-6/5 2 копия xE012 +xE010 equ #E010 ;-4/3 2 копия xE012 +xE012 equ #E012 ;-02 1 состояние порта #7FFD при входе в монитор +xE013 equ #E013 ;-01 1 состояние порта #1FFD при входе в монитор + +;d порт #1f 000?0000 +;e порт #7f 001????? / 000????? + + +;значение iy при работе в мониторе (переменные???) +;переменные код 0 +xE014 equ #E014 ;+00 =#84 - [ + ; =#04 - ( + ; =#00 - это не скобка + ; 4,=1 + ; 3,=1/0 - 16/8 бит значение команды + ; 1,=1/0 - чтение из строки команды строкового/числового значения + ; 0,=1/0 - читается из параметра число/строка +xE015 equ #E015 ;+01 0,=0/1 префикс #DD/#FD + ; 1,=1 есть префикс #DD/#FD -> e=#09 + ; 2,=1 есть префикс #ED -> e=#18 если есть #DD/#FD + ; 3,=1 есть префикс #CB -> e=#16 + ; 4,= + ; 5,= + ; 6,=1 байтовое смещение в команде + ; =1 в команде есть ссылка на адрес памяти + ; 7,= +xE016 equ #E016 ;+02 длина команды для дизасма в байтах +xE017 equ #E017 ;+03 тип текущй команды дизасма + ; 0,=1 это команда call/call cc + ; 1,=1 это команда ret/ret cc + ; 2,=1 это команда jr cc + ; 3,=1 это команда jp/jp cc + ; 4,=1 это команда jp (hl)/jp (ix)/jp (iy) + ; 5,=1 при 1,=1 это команда ret cc + ; 6,=1 это неизвестная команда + ; 7,=1 это ex af,af' либо exx +xE018 equ #E018 ;+04 0-1,=00 в дизасме команда не ссылается на память (см xDDD2) + ; 0,=1 если команда считывает из памяти, и Ложь, если считывания не происходит + ; 1,=1 если команда производит запись в память, и Ложь, если запись не выполняется + ; 6,=1 ето команда сдвига с префиксом +xE019 equ #E019 ;+05 0,=1/0 число в десятичной/шестнадцатиричной системе + ; 1,=1 Расширить вывод реассемблера в командах DISS, LDISS и + ; DASM, кроме адреса и мнемоники команды, будут + ; представлены значения байт и их эквиваленты в ASCII + ; 2,=1/0 печатать 1/5 комманд в дизасме монитора + ; 3,=1 Не трассировать (выполнять сразу) подпрограммы, + ; расположенные в ПЗУ + ; 4,=1/0 вводить адрес в команде DASM числом/выражением + ; 5,=1/0 Запретить/разрешить автоматическое выполнение команды SHOW + ; 6,=1 начальный адрес команды SS/D, берется из регистра PC. + ; =0 начальный адрес команды SS/D. Берется из указателя текущей ячейки (mem) + ; 7,=1 печатать в дампе символы из полного набора + ; =0 печатать символы с кодами res 7,[#20..#7F] остальные точками +xE01A equ #E01A ;+06 минимальная длина сообщения с мнемоникой ассемблера +xE01B equ #E01B ;+07 минимум разрядов в числе при переводе в ASCII +xE01C equ #E01C ;+08 для перевода времени в ASCII =#30 +xE01D equ #E01D ;+09 0,=1 экран под курсором сохранен в буфере + ; =0 восстановление экрана под курсором из буфера + ; 1,=1 запрет на установку следующих координа печати в окне + ; 2,=1 печатаем символ + ; 3,=1 курсор напечатан ???? + ; 4,=1 вместо экрана вывод на принтер + ; 5,=1 прочие управляющие коды + ; 6,=1 чтение данных после управляющего кода + ; 7,=1 управляющий код вывод строки #04 +xE01E equ #E01E ;+0A 0,=1 новую информацию записывать поверх старой + ; =0 очищать экран монитора при обновлении информации + ; 1,=1 не обновлять содержимое регистров + ; 2,=1 не обновлять экран монитора + ; =0 обновлять содержимое экрана монитора согласно битам 0, 1, 3:6 + ; 3,=1 не обновлять дамп по содержимому регистров + ; 4,=1 не обновлять дамп памяти + ; 5,=1 не обновлять дизассемблер памяти по содержимому ячейки памяти + ; 6,=1 не выводить дизассемблер в мониторе + ; 7,=1 трассировать все команды + ; =0 не выводить подпрограммы (автоматическое выполнение подрограмм) +xE01F equ #E01F ;+0B 0,=1 отображаются регистры альтернативного набора + ; 1,=1 отображается AF' + ; 4,=0 при вызове функций #00-#13 R8DOS + ; =1 сектор прочитан с HDD + ; 5,=0 функции вызываются из монитора + ; =1 функция rst 8 вызвана пользователем + ; 7,=0 восстанавливать память пользователя под всеми ловушками + ; =1 сохранять память пользователя под всеми ловушками и установка ловушек + ; =0/1 меню mount/dismount +xE020 equ #E020 ;+0C байт управления индикацией регистров =1 не выводится + ; 7 - pc + ; 6 - sp + ; 5 - ix + ; 4 - iy + ; 3 - hl(hl') + ; 2 - de(de') + ; 1 - bc(bc') + ; 0 - af(af') +xE021 equ #E021 ;+0D +xE022 equ #E022 ;+0E 0,=0 используется при компрессии + ; 2,=1 ошибка. деление на ноль + ; 5,=0 ввод параметров в меню + ; =1 ввод строки в окне создания разделов + ; 6,=1 в команде ассемблера нет запятой + ; 7,=0/1 редактирование hex дампа/символьного представления +xE023 equ #E023 ;+0F количество незакрытых скобок в выражении в отладчике +xE024 equ #E024 ;+10/11 делитель для выделения разряда числа +xE025 equ #E025 ;+11 +xE026 equ #E026 ;+12 0,=1 запущен отладчик + ; 1,=1 экран не надо сохранять в ram 8 (экран не сохранен в ram 8) + ; 2,=0/1 print screen positive/negative + ; 3,=1 экран сохранен в ram 8 + ; 4,=1 при вызове команды CALL отладчика + ; 5,=1 выполняется трассировка из отладчика + ; 6,= + ; 7,=1 желто/черный бордюр при входе +xE027 equ #E027 ;+13 0,=1/0 работает команда отладчика search/find + ; 1,=0 запись строки данных в память идет по адресу в MEM + ; 3,=1 продолжаем запись zs-snap после записи 48k + ; =0 ошибка: undefined file + ; 5,=1/0 compression on/off + ; 6,=1/0 запись/чтение + ; 7,=1/0 при сохранении/загрузке zs-snap использовать сжатие + ; =1/0 форматирование/проверка дискеты +xE028 equ #E028 ;+14 0,=1 не трогать регистр 7 AY (sound on/off) + ; 1,=0/1 Autoconfig On/Off + ; 2,=1/0 после загрузки снапа вернуться в монитор/выйти из монитора (запуск снапа) + ; 3,=0 программа анализатора не задана + ; 4,=1 анализатор включен + ; 5,=1 работает команда EVal word + ; 6,=1 "теплый" сброс + ; 7,=0 отладчик отключен / reset RAM on/off +xE029 equ #E029 ;+15 отдельные биты этого байта позволяют управлять выводом на принтер + ; 0,=0/1 interface Centronics/RS232 + ; 1,=0/1 speed 9600/1200 + ; 2,=0/1 data bits 8/7 + ; 3,=0/1 stop bits 2/1 + ; 5,=0/1 режим вывода 1 точка/3 точки + ; 7,=0/1 positive/negative +xE02A equ #E02A ;+16 при отладке, аналог xE01E (параметры команды SLOW) + ; 0,=1 восстанавливать экран + ; 1,= + ; 2,= + ; 3,= + ; 4,= + ; 5,= + ; 6,= + ; 7,=1 выполнение команды в отладчике с быстрым выполнением подпрограмм +xE02B equ #E02B ;+17 текущая система счисления =2/8/10/16 +xE02C equ #E02C ;+18 значение interleaving 1..26 +xE02D equ #E02D ;+19 0,= + ; 3,=1 пауза в водимом листинге + ; 5,=1 чтение порта #7FFD/#1FFD недоступно + ; 6,=1 включено Turbo + ; 7,=1 турбо-режим доступен +xE02E equ #E02E ;+1A 0,=1 было обновление времени и даты в буфере + ; 1, + ; 2, + ; 3, + ; 4,=1 interrupt controller found + ; 5,=1 HDD есть и работоспособен + ; =1 NVRAM найден + ; =1 modem found + ; 6,=1 микросхема CMOS обнаружена + ; 7,=1 HDD физичиски присутствует +xE02F equ #E02F ;+#1B + ; 4,=1 interrupt controller найден. но не совсем???? + ; 6,=1 CMOS 128 байт + ; 7,=1 проверка геометрии винчестера пройдена +xE030 equ #E030 ;+#1C master HDD + ; 0,=1/0 autostart on/off + ; 1,=1/0 автоопределение HDD при старте on/off + ; 2,=1/0 LBA mode on/off + ; 4,=1/0 TRDOS mirror on/off + ; 5,=1/0 HDD обнаружен/отсутствует + ; =1 сектор MBR записан + ; 6,=0 в буфере xEBF5 список разделов без изменений + ; =1 в буфере xEBF5 список разделов изменен + ; 7,=1 на винчестере есть раздел MFS +xE031 equ #E031 ;+#1D slave HDD +xE032 equ #E032 ;+#1E +xE033 equ #E033 ;+#1F/#20 адрес текущего меню в списке номеров меню для возврата в предыдущее +xE035 equ #E035 ;+#21/#22 первый свободный адрес в буфере последних введенных строк(команд) +xE037 equ #E037 ;+#23/#23 адрес начала следующей введенной строки +xE038 equ #E038 ;+#24 + +xE039 equ #E039 ;+#25 значение NMI debouncing +xE03A equ #E03A ;+#26 размер окна сжатия для снапа +xE03B equ #E03B ;+#27 0,=1 нажата fire на джойстике и знакоместные координаты курсора в окне изменились + ; 1,=1 нажата fire на джойстике + ; 2,=1 курсор мыши вне пределов текущего окна + ; 3,=1/0 indicator времени в мониторе on/off + ; 5,=1/0 mouse on/off + ; 6,=1/0 kempston joystick on/off + ; 7,=1/0 manipulators on/off +xE03C equ #E03C ;+#28 crd X графического курсора +xE03D equ #E03D ;+#29 crd Y графического мыши +xE03E equ #E03E ;+#2A значение first debouncing +xE03F equ #E03F ;+#2B значение before repeat +xE040 equ #E040 ;+#2C значение second wait +xE041 equ #E041 ;+#2D значение second debouncing +xE042 equ #E042 ;+#2E значение size of step +xE043 equ #E043 ;+#2F +xE044 equ #E044 ;+#30 содержимое регистра дополнительных возможностей #F9BE (не реализовано) + ; =#00 всегда +xE045 equ #E045 ;+#31 содержимое регистра счетчика секторов (#FABE) + ; число передаваемых секторов данных при операциях чтения/записи (=#00->=#100) +xE046 equ #E046 ;+#32 LBA адрес на HDD(двойное слово) младший байт + ; CHS - номер сектора +xE047 equ #E047 ;+#33 LBA адрес на HDD + ; CHS - номер цилиндра (младший байт) +xE048 equ #E048 ;+#34 LBA адрес на HDD + ; CHS - номер цилиндра (старший байт) +xE049 equ #E049 ;+#35 3-0, - LBA адрес на HDD старший байт + ; CHS номер головки + ; 4,=0/1 текущий винчестер master/slave + ; 5,=1 всегда + ; 6,=0/1 это CHS/LBA адрес + ; 7,=1 всегда +xE04A equ #E04A ;+#36 =#20 код команды винчестера: чтение сектора +xE04B equ #E04B ;+#37 =#30 код команды винчестера: запись сектора +xE04C equ #E04C ;+#38 #90 144 +xE04D equ #E04D ;+#39 количество дополнительных попыток чтения/записи сектора с винчестера + +;переменные код 2 +xE04E equ #E04E ;+00 1 константа антидребезговой задержки монитора +xE04F equ #E04F ;+01 1 константа задержки перед автоповтором +xE050 equ #E050 ;+02 1 счетчик до срабатывания автоповтора (базовое =(xE04F)) +xE051 equ #E051 ;+03 1 период автоповтора +xE052 equ #E052 ;+04 1 счетчик периода автоповтора (базовое =(xE051)) +xE053 equ #E053 ;+05 1 цвет бордюра, устанавливаемый монитором, при подаче звукового сигнала ошибки +xE054 equ #E054 ;+06 1 код символа "возврата каретки" для принтера +xE055 equ #E055 ;+07 1 код символа "перевода строки" для принтера +xE056 equ #E056 ;+08 1 код символа "перевода формата" для принтера +xE057 equ #E057 ;+09 2 код, определяющий скорость передачи для последовательного интерфейса (для 9600 бод - 0bh) +xE059 equ #E059 ;+0B 2 код, определяющий скорость передачи для последовательного интерфейса (для 1200 бод - 6аh) +xE05B equ #E05B ;+0D 11 коды, служащие для перевода принтера в графический режим + ; (непосредственно за ними будет выдано 768 байт + ; графической информации при печати экрана из монитора). + ; Байт +0dh хранит количество управляющих кодов + ; +#06 =#01/#03 режим печати 1 точки/3 точки +xE063 equ #E063 ;+15 4 коды, служащие для перевода принтера в текстовый режим, + ; завершающие печать экрана. Байт +015h хранит количество + ; управляющих кодов +xE067 equ #E067 ;2 =0000 + ;дескриптор окна монитора: вывод каталога диска на принтер + ;дескриптор окна монитора: вывод на принтер +xE06B equ #E06B ;+1D 1 число строк на странице при печати на принтере +xE06C equ #E06C ;+1E 1 число символов в строке при печати на принтере +xE06D + +xE075 equ #E075 ;дескриптор окна монитора: регистры/вывод каталога диска +xE083 equ #E083 ;дескриптор окна монитора: ввод строки низу экрана +xE091 equ #E091 ;дескриптор окна монитора: дизассембер +xE09F equ #E09F ;дескриптор окна монитора: дамп памяти +xE0AD equ #E0AD ;дескриптор окна монитора: информационное окно отладчика +xE0BB +xE0C9 equ #E0C9 ;дескриптор окна: menu +xE0D7 equ #E0D7 ;дескриптор окна: запрос на запись MBR +xE0E5 equ #E0E5 ;дескриптор окна: ввод числа +xE0F3 equ #E0F3 ;дескриптор окна: переименование раздела HDD/каталог ROM-disk +xE101 equ #E101 ;1 атрибуты для выделенной позиции в каталоге ROM-disk +xE102 equ #E102 ;#D дескриптор окна при включении +xE10F +xE110 equ #E110 ;1 атрибуты для печати опции меню +xE111 equ #E111 ;1 атрибуты для печати названия меню, времени +xE112 equ #E112 ;1 атрибуты для печати неактивной опции меню +xE113 equ #E113 ;1 атрибуты для печати выделенной опции меню +xE114 equ #E114 ;1 атрибуты для подсветки ловушки при выводе дизасма +xE115 equ #E115 ;1 атрибуты для печати информационного сообщения внизу экрана +xE116 equ #E116 ;2 очередной(первый пустой) адрес в буфере нажатых клавиш +xE118 equ #E118 ;2 текущий(первый не обработанный) адрес в буфере клавиатуры +xE11A equ #E11A ;2 адрес вершины стэка при входе в монитор + ;2 адрес памяти(8 байт) начала сормированной команды для трассировки +xE11C equ #E11C ;2 адрес первого свободного байта программы анализатора +xE11E equ #E11E ;#0C + ;=x3E2C,x3D01 + ;=x3179,x3161 + ;=x1DDC,x1DD0 +xE12A equ #E12A ;2 адрес изображения текущего графического курсора +xE12C equ #E12C ;последнее состояние порта мыши #FBDF (ось X) +xE12D equ #E12D ;последнее состояние порта мыши #FFDF (ось Y) +xE12E equ #E12E ;#20 изображение графического курсора №1 с маской +xE14E equ #E14E ;#20 изображение графического курсора №2 с маской +xE16E equ #E16E ; +xE17B equ #E17B ; +/* +xE16E db #7F ;знак копирайта + db " 1993" + db #1B,#01,#00 ;координаты + db "-97 " +xE17B db "MOA" + db #1B,#00,#24 ;координаты + db "NCACB" + db #1B,#01,#24 ;координаты + db "05-07" + db #1B,#02,#24 ;координаты + dc "V4.01" +*/ +xE196 + +xE1A6 equ #E1A6 ;#?? буфер для вывода строки с выравниванием +;x +xE336 equ #E336 ;вершина стэка для каких-то задач + ;при работе отладчика +xE338 equ #E338 ;#0E для сохранения дескриптора окна +xE33B equ #E33B ;2 для временного сохранения регистров +xE346 +xE38D equ #E38D ;2 вершина стэка при работе в мониторе +xE38F equ #E38F ;#0B буфер клавиатуры +xE39A equ #E39A ;8 буфер для сохранения памяти пользователя при трассировке + ; команды дизасма +xE3A2 +xE3A4 equ #E3A4 ;#10 буфер для сохранения экрана под символом 6 pix +xE3B4 equ #E3B4 ;1 предыдущие атрибуты окна +;x +xE3B6 equ #E3B6 ;1 счетчик для мигания курсора окна +xE3B7 equ #E3B7 ;2 адрес дескриптора текущего окна +xE3B9 equ #E3B9 ;2 адрес п/п обработки текущего управляющего кода +xE3BB equ #E3BB ;1 новая координата Y курсора +xE3BC equ #E3BC ;2 первый свободный адрес в буфере печати (xE1A6/буфер CMOS) + + ORG #E3BE + +xE3BE rst #30 + dw #0000 + db #00 + ret +xE3C3 dw #E449 ;rom 0, ram 8 текущей плоскости + dw #E44D ;rom 1, ram 8 текущей плоскости + dw #E4C5 ;текущая страница ПЗУ в новой плоскости (rom 2 ???) + dw #E41B ;rom 3(tr-dos), ram 8 и вызов п/п с возвратом в xE478 +xE3CB dw #E499 + dw #E489 + dw #E483 + dw #E484 + +;обработка rst #30 +;переключение плоскости +xE3D3 push hl + ld hl,(#0101) ;номер текущей страницы + ex (sp),hl + push hl + ld hl,#0006 + push af + add hl,sp + push de + push bc + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + ld c,(hl) + inc hl + ld b,(hl) ;адрес вызываемой п/п + inc hl + ld a,(hl) ;плоскость и страница вызываемой п/п +xE3E9 call xE478 ;включим страницу ПЗУ с монитором + inc hl + ex de,hl + ld (hl),d ;сохраним новый адрес возврата + dec hl + ld (hl),e + ld (xE408),bc + call xE4AA ;установим плоскость + ld hl,xE3C3 + call xE4B8 ;адрес п/п включения страницы ПЗУ по ее номеру в A + ld (xE405+1),hl + pop bc + pop de + pop af + pop hl +xE405 call #0000 +xE408 db 0 ;адрес вызываемой п/п + db 0 + +;включение предыдущей плоскости + ex (sp),hl + push af + push bc + ld a,l + call xE4AA + ld hl,xE3CB + call xE4B8 + pop bc + pop af + ex (sp),hl + ret + + +;включение rom 3(tr-dos), ram 8 и вызов п/п с возвратом в xE478 +xE41B ex (sp),hl + push de + ld e,(hl) + inc hl + ld d,(hl) + inc hl + ld (xE43C+1),de ;de адрес вызываемой п/п + pop de + ex (sp),hl + push hl + ld hl,(xE43C+1) + ex (sp),hl ;(sp) адрес вызываемой п/п +xE42C push af +xE42D ld a,#10 + ld (xE468+1),a + pop af + ex (sp),hl + ld (xE43C+1),hl + ld hl,xE478 + ex (sp),hl + push hl +xE43C ld hl,#0000 + ex (sp),hl + ld (xE43C+1),bc + ld bc,#3D30 + jr xE463 + +;включение rom 0, ram 8 и вызов п/п с возвратом в xE478 +xE449 push af + xor a + jr xE450 +;включение rom 1, ram 8 и вызов п/п с возвратом в xE478 +xE44D push af + ld a,#10 +xE450 ld (xE468+1),a + pop af + ld (xE43C+1),bc ;сохраним BC + ex (sp),hl ;берем адрес п/п + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ex (sp),hl ;bc адрес вызываемой п/п + push hl + ld hl,xE478 + ex (sp),hl ;(sp) возврат в xE478 +xE463 push bc ;(sp) адрес вызываемой п/п + push af + ld bc,#7FFD +xE468 ld a,#00 + out (c),a + ld a,#10 + ld b,#1F + out (c),a + pop af + ld bc,(xE43C+1) + ret + +;возврат после обработки rst #30 +;включаем ПЗУ с монитором +xE478 push bc + push af + ld bc,#1FFD + ld a,#12 + out (c),a + pop af + pop bc +xE483 ret + +xE484 push hl ;rom 1, ram 8 с возвратом в x3D30 + ld hl,#3D30 + ex (sp),hl + +xE489 push bc ;включим rom 1, ram 8 + push af + ld bc,#1FFD + ld a,#10 + out (c),a + ld b,#7F + out (c),a + pop af + pop bc + ret + + +xE499 push bc ;rom 0, ram 8 + push af + ld bc,#1FFD + ld a,#10 + out (c),a + xor a + ld b,#7F + out (c),a + pop af + pop bc + ret + +;установка заданной плоскости +;bit 2-3,a - номер плоскости +xE4AA ld c,a + ld hl,#0110 + rrca + rrca + and #03 + add a,l + ld l,a + ld l,(hl) + ld l,(hl) + ld a,c + ret + +;определение адреса п/п по номеру +;вх: bit 0-1,a - номер п/п +; hl - адрес таблицы с адресами п/п +;вых: hl - адрес п/п +xE4B8 and #03 + rla + add a,l + ld l,a + jr nc,xE4C0 + inc h +xE4C0 ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ret + +;вызов п/п +xE4C5 ex (sp),hl + inc hl + inc hl + ex (sp),hl + push hl + ld hl,(xE408) + ex (sp),hl + ret + +;bc =#7FFD +;de - заданная страница +xE4CF ld a,e + and #10 + out (c),a + ld b,#1F + ld a,d + and #03 + or #10 + out (c),a ;rom пользователя, ram 8 + ex af,af' + jr c,xE4E1 + ld a,(hl) +xE4E1 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 + jp rom2_x05A1 ;rom 2 + + + + +;АДРЕС: #E4F0 +;сохранение/восстановление стэка из окна [#0000..#3FFF] +;вх: hl' - адрес вершины стэка +; de' - буфер для сохранения +; bc' - размер для сохранения +; de - страница при входе +; bc=#7ffd +; cy'=0 сохранять +; =1 восстанавливать +;вых: hl - адрес вершины стэка+n +; de - буфер для сохранения+n +; +xE4F0 ld a,e + and #10 + out (c),a ;ram 0/8 + ld b,#1F + ld a,d + and #03 + or #10 + out (c),a ;rom при входе, ram 8 + exx + ex af,af' + jr nc,xE503 ;сохраняем + ex de,hl +xE503 ldir + jr nc,xE508 +xE507 ex de,hl +xE508 ex af,af' + exx + ld a,#12 + out (c),a + ld b,#7F + ld a,#10 + out (c),a ;rom 2, ram 8 + exx + ret + +;обработчик прерываний im 2 +xE516 xor a +xE517 ei +xE518 ret + +xE519 ei + inc a +xE51B db #32 + +xE51C call #0000;x0212 + ret + +xE520 ld (xE518),a +xE523 ld a,#FB ;ei + ld (xE517),a + im 1 + jp #0000;xF300;x025E + +xE52D equ #E52D ;8 блоков по 11 байт breackpoints + ;+#00 0-1,=nn номер типа ловушки + ; 6,=1 ловушка задана + ; 7,=1 ловушка активна + ;+#01 номер страницы в которой установлена ловушка + ;+#02 адрес ловушки (2 байта) + ;+#04 + ;+#05 начальное значение счетчика проходов по ловушке (2 байта) + ;+#07 текущее значение счетчика проходов (2 байта) + ;+#09 + ;+#0A +xE538 +xE543 +xE54E +xE559 +xE564 +xE56F +xE57A +xE585 equ #E585 ;буфер для установки ловушки + ;+0 #C0+тип ловушки + ;+1 номер страницы ловушки 5,=1 задана в команде 5,=0 текущая страница + ;+2/3 адрес ловушки + ;+4 + ;+5/6 количество проходов + ;+7/8 количество проходов + ;+9 =#00 + ;+10 =#00 +xE590 equ #E590 ;#15 описатель текущего дисковода +xE5A5 equ #E5A5 ;2 head * sector активного HDD +xE5A7 equ #E5A7 ;2 +xE5A9 equ #E5A9 ;#100 каталог ROM-диска + ; временные буферы + ;#200 буфер для чтения сектора HDD +xE6A9 equ #E6A9 ;#100 буфер +xE7A9 equ #E7A9 ;#1C буфер fcb +xE7B2=xE7A9+#09 ;2 адрес начала области памяти при сохранении экрана на диск +xE7BE=xE7A9+#15 ;2 =xE8A9 адрес памяти для копирования из ROM-disk +xE7C5 equ #E7C5 ;2 координаты следующего блока файла ROM-disk + ; текущий адрес на диске (сектор, дорожка) +xE7C7 equ #E7C7 ;#10? строка пути к образу диска +;x +xE7DB equ #E7DB ;6+6 имя полдарздела + имя раздела +xE7E7 +xE81B equ #E81B ;#10 описатель раздела MFS + ; заголовок подраздела, при выборе образа +;x +xE8A9 equ #E8A9 ;#100 первый параграф файла ROM-disk + ; буфер для дисковых операций + ; дескриптор подраздела +xE8E9 equ #E8E9 ;#70 битовая карта параграфов. по 8 байт на страницу + ; =0 параграф пустой +xE9A9 equ #E9A9 ;#14 буфер программы анализатора + ; для зарезервированных слов анализатора st0-st9 +xE9BD equ #E9BD ;#14 адреса ловушек + ; для зарезервированных слов анализатора br0-br9 +xE9D1 equ #E9D1 ;2 адрес начала параметров-слов в программе анализатора +xE9D3 equ #E9D3 ;2 адрес конца названия слова в программе (указывает на #01) +xE9D5 equ #E9D5 ;2 адрес первой ячейки переопределяемого слова +xE9D7 equ #E9D7 ;2 адрес конца названия переопределенного слова в программе (указывает на #01) +x +xE9D9 equ #E9D9 ;2 адрес начала стэка анализатора +xE9DB equ #E9DB ;2 адрес вершины стэка анализатора (адрес первой свободной ячейки) + ; стэк анализатора растет вверх!!! +xE9DD equ #E9DD ;2 для сохранения SP в анализаторе +xE9DF equ #E9DF ;2 для временного сохранения регистров + ; +xE9E1 equ #E9E1 ;2 адрес таблицы со списком процедур для п/п x2028 +xE9E3 equ #E9E3 ;2 номер записи каталога ROM-disk, с которой начинаем печать +xE9E5 equ #E9E5 ;2 адрес шрифта +xE9E7 equ #E9E7 ;4 смещение от начала образа в секторах (512b) +1 + ; размер создаваемого раздела в секторах +xE9EB equ #E9EB ;4 4 байта из дескриптора xE591 + ; смещение первого сектора выбранного подраздела MFS/образа в подразделе +xE9EF equ #E9EF ;1 смещение ширина поля в символах от края окна для переименования раздела HDD +xE9F0 equ #E9F0 ;1 ширина в символах окна для переименования раздела HDD +xE9F1 equ #E9F1 ;1 номер дисковода +xE9F2 equ #E9F2 ;1 номер дисковода (пользовательский для rst 8: db #81) +xE9F3 equ #E9F3 ;2 адрес блока описателей дисковода +xE9F5 equ #E9F5 ;#15 описатель дисковода A + ; +#00 код подраздела (для образа =#01) + ; 2-0,=??? тип подраздела + ; 4,=1 подключен раздел TR-DOS (не образ) + ; 5,=1 образ защищен от записи + ; =#00 - реальный дисковод + ; +#01 4 адрес первого сектора подраздела/образа + ; +#05 4 адрес последнего сектора подраздела/образа + ; +#09 6 имя подраздела + ; 6 имя диска в подразделе +xEA0A equ #EA0A ;#15 описатель дисковода B +xEA1F equ #EA1F ;#15 описатель дисковода C +xEA34 equ #EA34 ;#15 описатель дисковода D +xEA49 equ #EA49 ;#15 описатель дисковода A (пользовательский для rst 8: db #81) +xEA5E equ #EA5E ;#15 описатель дисковода B (пользовательский для rst 8: db #81) +xEA73 equ #EA73 ;#15 описатель дисковода C (пользовательский для rst 8: db #81) +xEA88 equ #EA88 ;#15 описатель дисковода D (пользовательский для rst 8: db #81) +xEA9D equ #EA9D ;буфер для определения последовательного порта/модема +;переменные код 6 ??? +xEAED equ #EAED ;8 список атрибутов Ink для печати опций меню +xEAF5 equ #EAF5 ;#100 признак целостности страницы (байты от #100 до #00) +xEBF5 equ #EBF5 ;#400 буфер для загрузки/записи + ; буфер для первых двух секторов раздела MFS (каталога подразделов) + ; буфер для таблицы секторов пользователя +xEFF5 equ #EFF5 ;#200 буфер для чтения сектора с винчестера +xF1F5 +xF6C0 equ #F6C0 ;#100 программа анализатора +xF7C0 equ #F7C0 ;шрифт 2048 + +;переменные код 4 +;переменные дисковой BIOS +xFFC0 equ #FFC0 ;+00 1 MFM максимальное число секторов на дорожке для сектора 128 +xFFC1 equ #FFC1 ;+01 1 MFM максимальное число секторов на дорожке для сектора 256 +xFFC2 equ #FFC2 ;+02 1 MFM максимальное число секторов на дорожке для сектора 512 +xFFC3 equ #FFC3 ;+03 1 MFM максимальное число секторов на дорожке для сектора 1024 +xFFC4 equ #FFC4 ;+04 1 FM максимальное число секторов на дорожке для сектора 128 +xFFC5 equ #FFC5 ;+05 1 FM максимальное число секторов на дорожке для сектора 256 +xFFC6 equ #FFC6 ;+06 1 FM максимальное число секторов на дорожке для сектора 512 +xFFC7 equ #FFC7 ;+07 1 FM максимальное число секторов на дорожке для сектора 1024 +xFFC8 equ #FFC8 ; 2 адрес таблицы с количеством секторов на дорожке +xFFCA equ #FFCA ;+0A 1 номер текущего дисковода: 0 - дисковода А, 1 - В +xFFCB equ #FFCB ;+0B 1 количество попыток считывания при ошибке, начальное значение 3 +xFFCC equ #FFCC ;+0C 1 коды, определяющие тип дисковода (спецификацию) А + ; =#FF - еще не инициализирован??? + ; =#E0 - если подключен образ диска (без защиты от записи) + ; =#C0/#00 - для реальных дисководов A-B/C-D + ; 0-1, -время перемещения на шаг + ; 1, + ; 4, + ; 5,-0/1 образ не подключен/подключен + ; 6,=0/1 дисковод на 40/80 дорожек + ; 7,=0/1 односторонний/двустронний дисковод +xFFCD equ #FFCD ;+0D 1 коды, определяющие тип дисковода (спецификацию) B +xFFCE equ #FFCE ;+0E 1 коды, определяющие тип дисковода (спецификацию) C +xFFCF equ #FFCF ;+0F 1 коды, определяющие тип дисковода (спецификацию) D +xFFD0 equ #FFD0 ;+10 1 коды, определяющие тип дискеты в дисководе А + ; 0-1,=00/01/10/11 размер сектора в байтах 128/256/512/1024 + ; 2,=1 диск 40 работает на дисководе 80 + ; 5,=0/1 40/80 дорожек на диске + ; 6,=0/1 метод записи FM/MFM + ; 7,=0/1 односторонняя/двустронняя дискета +xFFD1 equ #FFD1 ;+11 1 код, определяющий тип дискеты в дисководе В +xFFD2 equ #FFD2 ;+12 1 код, определяющий тип дискеты в дисководе C +xFFD3 equ #FFD2 ;+13 1 код, определяющий тип дискеты в дисководе D +xFFD4 equ #FFD4 ;+14 1 текущий номер дорожки для дисковода A +xFFD5 equ #FFD5 ;+15 1 текущий номер дорожки для дисковода B +xFFD6 equ #FFD6 ;+16 1 текущий номер дорожки для дисковода C +xFFD7 equ #FFD7 ;+17 1 текущий номер дорожки для дисковода D +xFFD8 equ #FFD8 ;+18 1 код time-out для дисковода А +xFFD9 equ #FFD9 ;+19 1 код time-out для дисковода В +xFFDA equ #FFDA ;+1A 1 код time-out для дисковода C +xFFDB equ #FFDB ;+1B 1 код time-out для дисковода D +xFFDC equ #FFDC ;+1C 0,=0 при вызове функций #00-#13 R8DOS + ; 4,=0 после завершения функций #00..#13 R8DOS + ; =1 текущий диск инициализирован + ; головка на заданной дорожке + ; =1/0 головка на нижней/верхней стороне диска + ; 5,=1/0 работа с дисководами монитора/пользователя + ; 6,=0 при инициализации + ; 7,=1 к текущему дисководу подключен образ +xFFDD equ #FFDD ;+1D 1 код ошибки дискового интерпретатора + ; =#FF при вызове функций #00-#13 R8DOS + ; =#01 нет диска в дисководе + ; =#02 попытка записи на защищенную дискету + ; =#03 нажата Break + ; =#04 ошибка при чтении или записи сектора функциями 5 или 6 + ; =#05 ошибка позицирования (не соответствует номер дорожки) + ; =#06 ошибка позицирования (не считался адресной маркер дорожки/сектора) + ; =#07 неверный номер сектора + ; =#08 ошибка позицирования, не соответствие типов (попытка использовать 80 дорожечный диск на 40 дорожечном дисководе) + ; ошибка позицирования, не соответствие типов (попытка использовать двустронний диск на одностороннем дисководе) + ; =#09 неформатированная дискета (функции 7, 8) + ; =#10 дискета не соответствует формату TR - DOS по физическим параметрам: размер сектора, плотность записи либо нет кода идентификатора - 10h (функция 8) + ; =#11 несовпадение кода типа дискеты TR - DOS реальному формату + ; =#12 не открыт рабочий буфер (функция 8) + ; =#14 были ошибки при чтении/записи дорожки (функции 12, 13) + ; =#21 ошибка образа диска + ; =#22 сектор за пределами образа диска + ; =#3F дискета не соответствует формату TR - DOS по физическим параметрам: размер сектора, плотность записи либо нет кода идентификатора + ; =#45 неверный путь + ; =#46 конец файла + ; =#48 файл не найден + ; =#49 попытка записи после конца файла + ; =#4A попытка чтения из файла открытого на запись + ; попытка записи в файл открытого на чтение + ; =#50 HDD не вышел в готовность + ; =#55 ошибка заголовка файла zs-snap + ; =#56 нет раздела MFS/винчестер не найден + ; =#57 не прочитался сектор идентификации + ; =#57 ошибки при чтении с HDD + ; =#58 ошибка в секторе идентификации + ; =#61 HDD не вышел в готовность к принятию команды + ; =#62 HDD не вышел в готовность к передаче данных + ; =#63 раздел MFS не найден + ; =#66 путь не найден + ; =#67 к дисководу образ не примонтирован + ; =#FD размер сектора не соответствует (для образа диска) +xFFDE equ #FFDE ;2 адрес стэка при вызове функций #00-#13 R8DOS +xFFE0 equ #FFE0 ;1 количество секторов на дорожке +xFFE1 equ #FFE1 ;1 =#80/#A0 чтение/запись группы секторов +xFFE2 equ #FFE2 ;2 адрес в памяти для чтения/записи группы секторов + ; текущий адрес записи при формировании таблицы секторов на дискете +xFFE4 equ #FFE4 ;2 начальные дорожка и сектор для чтения/записи группы секторов + ; текущий адрес в записи при формировании таблицы секторов на дискете +xFFE6 equ #FFE6 ;1 количество секторов для чтения/записи + ; код при формировании таблицы секторов на дискете +xFFE7 equ #FFE7 ;2 адрес рабочего буфера для функции 8 +xFFE9 equ #FFE9 ;6 буфер для чтения заголовка сектора + ; +0 номер дорожки + ; +1 номер стороны + ; +2 номер сектора + ; +3 длина сектора 0/1/2/3 + ; +4/5 констрольный код +xFFED equ #FFED ;2 размер сектора в байтах +xFFEF equ #FFEF ;1 ret для вызова п/п опроса Break из rom 5 + ;1 код последней команды ВГ93 + ;1 для временного сохранения регистра A при вызове функции R8DOS +xFFF0 equ #FFF0 ;2 адрес рабочего буфера для функции 8 +;x + + +/* +окно пользователя: ++00 координата Y курсора в окне ++01 координата X курсора в окне ++02 координата Y начала окна (в знакоместах) ++03 координата X начала окна (в знакоместах) ++04 высота окна в знакоместах ++05 ширина окна в знакоместах ++06 цифровые атрибуты окна ++07 системные атрибуты окна: + 7-6,??? + 5 Запрет вывода, все выводимые символы игнорируются + 4 Произвольный формат, по достижению правого края окна будут автоматически + выполнены команды перевода строки и возврат каретки + 3 Выполнять автоматический возврат каретки при приходе символа перевода + строки + 2 Выполнять автоматический перевод строки при приходе символа возврат + каретки + 1 Изменять атрибуты при выводе каждого символа (в противном случае атрибуты + устанавливаются только во время очистки окна) + 0 Не выводить символ курсора ++08 + 5-3, номер рамки + 7,=0 нет рамки вокруг окна ++09 атрибуты рамки ++0A размер символов в пикселях 6/8 ++0B размер окна в символах. Для символов в 8 точек этот размер совпадает с + шириной окна. Если размер символа 6 точек, то перед инициализацией + (очисткой) необходимо рассчитать размер окна и поместить в этот байт. ++0C код символа курсора. Код с этим символом будет выводиться вместе, отмечая + положение курсора, если сброшен 0 бит в системных атрибутах окна ++0D 1,=0/1 режим вставки/замены при вводе строки + +*/ + +/* +точки останова (ловушки) ++00 1,=1 ловушка задана но не активна + 7,=0 ловушка не задана ++01 логический номер страницы, где стоит ловушка ++02/03 адрес ловушки ++03 ++04 состояние памяти пользователя по адресу ловушки ++05/06 ++07/08 адрес ++09 ++0A +*/ + + +/*дескриптор файла: fcb + ++#00 8 имя файла ++#08 1 тип файла ++#09 2 при типе C стартовый адрес, при типе B длина бейсик-программы ++#0B 2 длина файла ++#0D 1 объем файла в секторах ++#0E 1 номер первого сектора файла ++#0F 1 номер первой дорожки файла ++#10 ++#13 2 указатель в файле ++#15 2 адрес буфера dma ++#17 1 b - способ открытия + 0-1,=11 файл для модификации + 0,=1 файл для чтения + 1,=1 файл для записи + 2,=1 обмен целыми секторами "физический" файл + (если сброшен - обмен будет вестись байтами "логический" файл) + 7,=1 файл был изменен, но не сохранен ++#18 1 номер текущего дисковода ++#19 1 номер файла на диске ++#1A 1 кол-во секторов для чтения/записи ++#1B 1 максимальный объем файла в секторах + + +*/ + + +/* Формат таблицы расположения секторов. + ++0 Идентификационный байт + #00 - информация о секторе достоверна + #FF - информация о секторе не достоверна (сбойный сектор) + #FE - конец таблицы секторов + #FD и #FC - см. функцию 12 ++1 Физический номер дорожки (0:х) ++2 Номер стороны (0/1) ++3 Номер сектора (1:х) ++4 Код длины сектора + 00 - 128 + 01 - 256 + 02 - 512 + 03 - 1024 +*/ + +/* описатель дисковода (для примонтированных образов) + ++00 =#00 ничего не подмонтировано + =#01 что-то подмонтировано + + +*/ + +/* описатель подраздела раздела MFS + ++00 0-2,=nnn тип подраздела + 7,=1 при печати типа подраздела перед ним печатать "*" ++01 4 смещение первого сектора подраздела ++05 ++06 размер подраздела ++0A 6 имя подраздела + +*/ + +/* описатель подраздела MFS/ + ++00 0-2,=nnn тип подраздела + 7,=1 при печати типа подраздела перед ним печатать "*" ++01 4 смещение первого сектора от начала винчестера (LBA адрес) ++05 для образа =#00 ++06 2 размер подраздела ++08 2 ++0A 6 имя подраздела + +*/ + +/* структура HDD + +сектор 1 - MBR +сектор 3 - данные примонтированных образов + +*/ + + +/* структура раздела MFS + +2 сектора каталог подразделов +n подраздел +n подраздел +n подраздел + + структура подраздела MFS +2 сектора каталог образов дисков +501 секторов на каждый образ (1й сектор пустой) + +*/ + + +/* сектор 3. примонтированне разделы/образы ++#00 1 тип подраздела/образа (для образа =#01) + =#00 ничего не примонтировано ++#01 4 смещение первого сектора от начала винчестера (LBA адрес) ++#05 1 тип подраздела/образа (для образа =#01) ++#06 4 размер подраздела/образа ++#0A 6 имя подраздела ++#10 6 если это подраздел, то имя подраздела + 6 если это образ, то имя образа + +*/ + + + +/* +Формат таблицы расположения секторов. ++0 Идентификационный байт + =#00 - информация о секторе достоверна + =#FF - информация о секторе не достоверна (сбойный сектор) + =#FE - конец таблицы секторов + =#FD/#FC - см. функцию 12 ++1 Физический номер дорожки (0..х) ++2 Номер стороны (0/1) ++3 Номер сектора (1..х) ++4 Код длины сектора + =#00 - 128 + =#01 - 256 + =#02 - 512 + =#03 - 1024 + +*/ + + +/* формат заголовка zs-snap ++#00 =#4D/#41 без компрессии/с компрессией ++#01 =#33 сигнатура с загрузкой регистров AY + =#31 сигнатура без загрузки регистров AY ++#02 (xDD69) 2 адрес текущей ячейки в дампе памяти ++#04 (xDD6B) 2 адрес возврата из монитора/ pc программы пользователя ++#06 (xDD6D) 2 указатель вершины стэка программы пользователя, с учетом 11 байт уже сохраненных на стэке ++#08 (xDD6F) 2 регистр ix ++#0A (xDD71) 2 регистр iy ++#0C (xDD73) 2 регистр hl ++#0E (xDD75) 2 регистр de ++#10 (xDD77) 2 регистр bc ++#12 (xDD79) 2 регистр hl' ++#14 (xDD7B) 2 регистр de' ++#16 (xDD7D) 2 регистр bc' ++#18 (xDD7F) 2 регистр af ++#1A (xDD81) 2 регистр af' ++#1C (xDD83) 2 регистр r и флаг IFFF2 ++#1E (xDD85) 1 регистр i ++#1F (xDD86) 1 номер rom откуда зашли ++#20 (xE02D) 1 переменная =iy+#19 ++#21 =#00/#01 режим прерываний im 2/im 1 ++#22 цвет paper #5800 (для установки бордюра) ++#23 содержимое регистра 7 AY ++#24 состояние порта #7FFD ++#25 состояние порта #1FFD ++#26 регистр #00 ay ++#27 регистр #01 ay ++#28 регистр #02 ay ++#29 регистр #03 ay ++#2A регистр #04 ay ++#2B регистр #05 ay ++#2C регистр #06 ay ++#2D регистр #08 ay ++#2E регистр #09 ay ++#2F регистр #0A ay ++#30 регистр #0B ay ++#31 регистр #0C ay ++#32 регистр #0D ay ++#33..+#3F не используется +при записи без компрессии ++#40 битовая карта параграфов страниц + по 8 байт на страницу + последовательность соответствует порядку записи страниц + если бит =0 параграф пустой (не сохраняется, при загрузке забивается нулями) +при записи с запаковкой страниц ++#40 размер запакованных страниц + по 8 байт на страницу + +0 количество байт в последнем секторе страницы (=#00 - 256 байт) + +1 количество секторов занимаемых страницей + +2..+7 не используется ++#B0..+#FF не используется + +порядок сохранения страниц: для 48k режима +ram #02 +ram #05 +ram страница включенная при входе в монитор + +порядок сохранения страниц: для 128-256k режима +ram #02 +ram #05 +ram страница включенная при входе в монитор +ram #00-#0F (кроме 8й, 9й и уже сохраненных) + + + +*/ + +/* структура программы в анализаторе +2 #mmmm адрес начала следующего слова +n #80+"W"+"ORD" +1 #01 +2 #nnnn адрес конца слова в словаре (указывает на #00) +2 x2340 (xE024) #????(число) +2 #.... +2 #nnnn адрес конца слова в словаре (указывает на #00) +2 x225D п/п прерывания выполнения слова + +#0000 конец слова + +*/ + diff --git a/ProfRom_Disasm/!roms.mac b/ProfRom_Disasm/!roms.mac new file mode 100755 index 0000000..44d1f70 --- /dev/null +++ b/ProfRom_Disasm/!roms.mac @@ -0,0 +1,56 @@ + DEVICE ZXSPECTRUM128 + org #4000 + + defarray nKeys #1A,#1B,#1C,#1D,#1E,#1F,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#00,#01,#02,#03,#04,#05,#06,#07,#08,#09,#0A,#0B,#0C,#0D,#0E,#0F,#10,#11,#12,#13,#14,#15,#16,#17,#18,#19 + +/* +;текст слова анализатора + MACRO Word text +;.nTxt = $ +; db text +;.eTxt = $ +; org .nTxt + LUA + sj.add_byte(sj.get_byte(sj.current_address) + 128) + ENDLUA +; org .eTxt + ENDM +*/ + +;текст слова анализатора + MACRO Word text + LUA + sj.add_byte(sj.get_byte(sj.current_address) + 128) + ENDLUA + ENDM + + +;дескриптор опции +;=0 цифра/буква выбора опции 0-5/A-Z +;=1 номер атрибутов в таблице +;=2 адрес п/п определения доступности опции +;=3 адрес п/п + MACRO dOption Key, nAttr, Proc1, Proc2 +.tKey DEFL Key-#30 + db nAttr*#20+nKeys[.tKey] + db (Proc1-#8DD)/#100*#04+(Proc2-#468)/#100*#10 + db (Proc1-#8DD)%#100 + db (Proc2-#468)%#100 + ENDM + + +; dOption "0",0,#947,#533 + +/* +.nTxt1 equ $ + db "TEXT" +.eTxt1 equ $ + org .nTxt1 + LUA + sj.add_byte(sj.get_byte(sj.current_address) + 128) + ENDLUA + org .eTxt1 +*/ + + Word "NOP1" + diff --git a/ProfRom_Disasm/ROM_MAP.TXT b/ProfRom_Disasm/ROM_MAP.TXT new file mode 100644 index 0000000..73cb8f4 --- /dev/null +++ b/ProfRom_Disasm/ROM_MAP.TXT @@ -0,0 +1,38 @@ +ROM MAP +| --- | --------------- | ------- | +| № | File Name | Address | +| --- | --------------- | ------- | +| 0 | rom0.a80 | 0x0000 | +| 1 | | 0x4000 | +| 2 | rom2_SrvMon.a80 | 0x8000 | +| 3 | rom3_trdos.a80 | 0xC000 | +| 4 | rom4.a80 | 1x0000 | +| 5 | rom5.a80 | 1x4000 | +| 6 | rom6.a80 | 1x8000 | +| 7 | rom7.a80 | 1xC000 | +| 8 | | 2x0000 | +| 9 | | 2x4000 | +| A | | 2x8000 | +| B | | 2xC000 | +| C | | 3x0000 | +| D | | 3x4000 | +| E | | 3x8000 | +| F | | 3xC000 | +| 10 | rom0.a80 | 4x0000 | +| 11 | | 4x4000 | +| 12 | rom2_SrvMon.a80 | 4x8000 | +| 13 | rom3_trdos.a80 | 4xC000 | +| 14 | | 5x0000 | +| 15 | | 5x4000 | +| 16 | | 5x8000 | +| 17 | | 5xC000 | +| 18 | | 6x0000 | +| 19 | | 6x4000 | +| 1A | | 6x8000 | +| 1B | | 6xC000 | +| 1C | | 7x0000 | +| 1D | | 7x4000 | +| 1E | | 7x8000 | +| 1F | | 7xC000 | +| 20 | | | +| --- | --------------- | ------- | diff --git a/ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin b/ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin new file mode 100755 index 0000000000000000000000000000000000000000..00ab98fa3b03d038406c9fd70c264e15b770f41e GIT binary patch literal 12800 zcmc(ld0Z3c+V}6t9@d!z!hj0*BuE3egjA8H5(8@0x)8;!E)}X#0+@s>BrIZPlCX(N zwTtcPLTh_US7@z=YOR8nmPpe_PsIa0O-qiAwWT?QS}e8_-kY9&-p~7apXdGi&2Y_4 zW|B!VncUa)`~I%A_X7Z&pa`x1`wd&d8OFdA{@?ffKetT%apV6_`$zw$jsL&5-KId% zU2O7TuUZnS8les{z6WVyzZyWJ%{WjpYVtxzDZ)Owsru>P~u#d9R1lay?sIy0nhpIXV4!|P7e=$mrLHU9~ zeMxz72X&%EdTEEc^^1dF?83g83Kj8w50!93j*lSk3CLE8D}07(>YUS;uUCmHy5vHi zw}g_==q}Yfy}q>fpak%@ZQZnP+bS)TZ%Bs^hiVW2NpW&NMuLMMGEYVva z`qNoVy50KXa;V#*w@$xvli66Q-=o_D_Zra~&|9o#{bRQ2J;fGiDmGi8aW5>~Z8V#v zAH1y)Di>z|=alHp`?nOEbuiy(uvxUlW%Ht=AzZZ=RvB%uq_`4&Dnk{lu<0z*2eUwQ z^xek&`*jAZ1r|SMv{|G7Ji&9|?&9)tXf?uOo3+GfRz>4c|NXq7jiwT#L8pS5i{|EJ zDd#F5cwp}R3$m1G$6oy&w8yG~O4UNe{fhbbXDjDrflolasd2Ee-2?>giS~&>An<4> zCQJ|{Gti_ExJ~U75TxKZ6o4c=r2$M#3=U3A;CYNzi$l*uV|#le!0SoU)Y@8vZ*?`I zXFlx7k>|i7fWPQi=~y{92td0@+o(0Q184W}=y10a;0n{INrA&6yt+rr04-23?Iqpv zMgWSOMd&zSJp(}ZsP;a30=9NTaD;|1#|;$|3iyGmXrc(dL_6UN9-tjWZ@2)zqWMKJ zydG052NU>gT)|9e0UHBPjJAzxM>U|e6>3^r0noH*uC(DKt-Q6adH`^!ae_ftYv&b0&Y%zTDdzMPwcec(qS0!0gZmP6p59hW1o<|PCF?8PM}v{4bw1hIG+P>tdn@wU4)xj*?@KuMHpa! z34F)K!9r{saT>I5_#NAMv5gtU6+f{CFSc`> z3IQzuw_HV9Eyq#c*x1+J-dAyj8OB-9vIae^?YG+7MV&+e)tEJb8M9iM?lv}Ciql0h zQUv1c`5+6EDriV`6BwtR!l>4)3E~mz7QHoZVrfyugjC>a2kkh=1KPFiTAbtR94rBB zrgN|l(!&})6cU?e&*1VE0xij0!C~UZ+BiyqqkrQZMDN1WVCBMb%~l5HESu7iTJruX zcB%$y6Yxati}Y57(Y00MNL$W0Gzx+qRAjNY(}Nm_r;E!ZX*k45+^E25?ebOtH73oc za0@i0y{d5Fdd+uGjz6t=SMv{$E{XhjBKssWG0{8Ro1>j+rI(H_@LIGYn)4Os`voOZ zn&p(f6u(v6m;fL;QDQw^Byvt~OD01>hLm+E$=lzLnNKR^$RekiCj?hSu;@ zlG$myz>e7$=+U$q7u1YO?EE&meKzECWpdufv?&|#FYvFpS_da)o9M=bHm);4y|+p9 zQ~So4ji0k3HV>u?4h~c7wi|4&G^0eI2IIaZB?4t)iEnWUHK!za37nu+AjY+%WK0p? zF7UoaVvBq)8O9qLjAtqj6qKdH`Y$VjF#zB02sLFT7;02i{1szI! zr!sbDu2Qu_FiEL)1gY~SH$s-&9X@gH?LcVhlO-Ud69d3|V_aQ^@}@faoII)H9OSC; zkK}|p;V}V89u^Zmop&Ied0NB|wWVG@$-nF>(m446x|@IL7+48c zYE~Albgpb$*}ZajCD8IRUeXq6o!T~Sx3>48f-0Z06#q@uQzz@{3rEN&!V(x&2Od5w zt5Y5*m65l?(J;OPY;&s)lr9D$Pnd)Q9U$p2`CnlHj8fH>cFB8lK~)QRA&f(g8j^2? z36v^)2K*)CD~d(g8pmK^ZmyR{~;I zDLEuvr^s+GFD3c#e&&HvFrT3|;ykeM@i3G}grnuWo8N>B;ZOT+1WgY;Ip&3{3>F>A zvKFJwyjwS&fXlk)(LkGUXwP)!G!#!~&!U;2x^b-$CEK}kp*HIAxpIYKcKTdUXe!>V zn`_WH!1|`$X2YE222@2T@RoADK{uyxuBA+Gnio-XVQR`B3=Z^$w%3+s)RlIHHjJl% z(sYbhCajZfP6K7>=~#A|@Nc_h>tuDZy~Z)W(Vqs?0J78*$}6S*chdc6>BT^iU)aMF z^!n?-zky$t7X$k5>nHHvRwTXpu1K8pN~dT>Tn|2stvotMt^5cI=Ydo;c@APatkBbQ zHQ*0aO#Wxdn>;zJ1p@vQU{5T;cs)}X7LH|cMh~+2t|>O_UJ8dhJjDf&o(|rh!AGOu z&k&+90%-n-NHk7I6pH9SBL zM0NT4tKD3UK1I@^KnW+ z`B;~Hc$@+lfdk*I^06>We$^ki+7m#}Z1DOvluOv-fcI?A2k>@09Pje_ipqz4M_9gO z_RwI57ZYmWwpY9>)CW;9$8yNC!wPwPSSgg<)Sfx{n90D++{l-d&VNmO4A_K6(0@Pv5S~Sh54u z9C-BL+|1m0a~_m}#kK04^Fh&e)$IfQx&68GZ?X$`09EbfexW*Edw~-b4JTukaN)$i z@h`&53i|g!LG`J=s;4Ge;>pIKzJi4R6`y=^E_nXzi|R}zK8dVWMceR^*lx- zR>Zt4?htvyP6ay*uc()J2mBQ*zllB470Mq%*?R5rAq5u*j*;=ayE``~4uu{b!tbUJ zg-VAY*K@V{6y$*W8ob!lRA|ExSnv{C@vFYbU)$AP8)gqe&Vlf)LFzlUSD@wz21qDS za{=EyU!dloIa94>gE-g2Y8FUxtyg0JKD%`wc|O+tk?`};nK{3O^1mJ}sJSW4uy&c6rTokY2)9&a41gThyQUtH40N8*28BSVNx^s0Dc~9dlW^`+Le*!+uFrlo zkx_)(m*^L>#_xQyG_yrD0g2Y>1E2FH0nKjYh&lEe1BYmBVw?EUOr zqYrHFfg@u+)^=?o5H-Nt0WbBrQNnXo8ppHw?y)}fjlRfa0WSHZSAr#MG3%{5xVP9= zZiPCt*=XjTXDapFfv2?_)nH2L zr0i|U40?$~bgb6@4lvgE-@*1(``=;h@^5Big)Q()>3LJAu*Won^8R8P{Zc%K3_a0N zq9~fjQqX~XUK6*%tDfrm_yIFF;xCZ=LkN%i_L#A6ehWG7+*>Ta<=bk>DHz8SpZj>d zdCX7sSMX-~&jXm{-^=nFu-g7}2+St?Qpc>wldjXph~uNLB8r0 zTke^huYK#y>fiqPO-hcycj`i=FU3qgmy+|lFWyexS^sX$ivF54Rh8?Um3g_=4c}Qd zMp~E6vM!fe3+G!4KC`UlS+}jVYVTR|<87Nhv~4-*w`H5g7dN?ed8V$^@s#5!!BgauP4kVl^Y`%tNpA~E>9+*>!}xg5)v#4t;uT4&7d zqkgN&m8VjLMluE9o~~|Hp%LKP$oeqrN*A>^>c(+uqoHnbn4N=l*f0InL9H{Aqeb(d z@1`hI-F!QFld3k5cc{z*K1XfN5aK`NH7XlMw|s_ZkngV!mB$c+aWzZ~$z9&+^Hi&+ zlxHfH$88j5;t3>4uHUI}+&eDnvNh=}^R<=xtcL>K7|z+>^omU?t_&@eRElz+o~V@G zuu;i2Q*{^Q)`Vknu!S}6!6>l0!MCT9I%~ZYG4bY}O4XUlu8+BuK4)derEjegX~a4s zoW@6c_2oJXkihstT{(g~aGo|kBC{!G1<6%@V~uh2G#oXifpp^9)77y zeldB9pQxbdYaq{!MFU}4DI*tx0$PTpG2|(jHs4KSYm!i=I$^Xu}9r>Qa20h{EAlsc{nbictFkLMfZ*ajY3sF*0UHN^tTXGTF=k8xU1C^^r2-L3_qT zCGW2;D#y+`$}%LV+!kH=JgL(yx1@vo)t*-z(x)8QWJ756H&z}H_N3SM-|PPci^BR3 zz3d3JO)qsZ0@BemvO{{@?x%oLsB{sSDPlhp>XfCrhcPaTeCF`0j0C5oH z*ZYOOl>LFEC+q8E;d~gGQc25t#BP!+lcl(hSI?X!#}=QLvo|LLnco8ZW-Rt79pvw! zF^+|Kl*NyA4futi@QAN_zrT(ZhLGdWW+^yNFn&9TIK-ak&*skdXY)V?c&6FL_ge+3 zR~>#k#|~`=bq$cZ}rzFeSs+7V`bdCb0SE`v@$ zPwWSD2WPG8lHEGvpPVll$|*eCETmqp%9XRJ$E#u^;(l_&Na_?G^$hh>6k@{ zG;8Qd_-ON96E$Ad1=-YHSX}>2m5MTTfm-?&G%Xlp9ypk?n~9I)3LAZnDk>pL^#T+! z9s>|IpO;5;D60)rNj2v}(m#$sF14|m{F%~Jlc7)YVz2P(T#^`Wtei0ybGnv&S|7u$ z)a&f2y|g9q1d!6!Sm%P9kYL38*ex!d&Hy7_CbK?e7cOy?8~3H&0hDKtSzoEca~mRr z#g^TAJuW=-nBD*+m=K={48ot7y?bLnc$_7KmW@^AIu$P5Z``0mC`#-xR_Zp`RS(5K z^0*2DyWUy?i!EiqpsUoGljeGg%k9Ng;Kk!W!i(Oc-@8|5MxYkLWk`;4o11yj&|0E{ zmg4=ujmJUxvp5bqz6eu5Ltq*VkoHg~HpR+b5$g2j-DbGL$d>vJ2K2J9Kr#A~VY> zWMg*O2-&FA)(Cf{|Bw;e7=A>a6<#Nwn-Nd{6cL}^;8Dy-$@v$#&lL~m;g(Hr(jMz9taWv_|1H}QN)HF6$RR>Pk$16{fEb0f-KSE!>fnU2Gg z>$y}@4LK}`cZXSUJ%~zZYS?;!00GRw*%$3RG5(pMdThKPw0)wI%C)O8UtGypw=ePl z?_Vxox}EnGfA3)eNJ53Rr34rrz_K_mxH?3EsDqI$E@W+hbsitArJ5m+d9enMqTAqJ z1~bh(2~r!pC29;IA^b70(?tbqXMR{8dEip6HAp5fc?Y8U>40#BOL@AsqCB#u@p@hk zC(Oy2Ur|n#(#jZBw`f+v$pVuO zSsl}E0pk6pa%5@DgIcrBg0Md_1j=+(^T3STbnJt-XFTRX!czVtev{sW|5Z5KEn!71 zV>h|d#J_GP{Yxsikh1XE1U!F=yi*)aKI=dqa`n-ljJ}%b?ZO4o7|rZiE|MwBG$g|V;!U1hE0VCz z4m4vTfPr-=!{$FZ<8+duM#qDQ@%j6~LnwI&$vghK1iQ>%N8;S46Ya7YsARg8YY$A* z$vRo6@IkY31=KVn18-(u(6`7O(5!oz{0bRy#ApS=27+ljizlQ;E3$X>2B{kr{~>PR z;M;ctJ&2;s4#&V)weW-NUGm{<$jQv!MGkTyx*-3~vCGt~59F-uUHB(R_R~<23m$$U zNKj@3C6Ijhezz&>m#z;b)!Av#%*1iMtjne1M z0RnXMSfS4UNNH7YN5&j8O3(a^40Dg{={a*%^UOQs*vt>*?0I0H)M3h)Z8e1Ds;hh*l05|Pno(%h6om8SobU!XatDqh(mED4^o7lk>$6rMQd%Wvv+jr6 z>#L&Vq8JfIx+uy_B+^3cXgwKJABhoQbKDtUBZ~0NliZ4of9+5Ob|@dUh7bOIR%K}W zJhKEJt^aaXrPN{7sL;&fZTDTUBKU)dLMD>0(jHR>LJUX>s}q!+Cg1$ZFm}1p7G_

U7 z{QZU!TgF0j8t6%P6Te#%#agDsM%-;cX_ZH9vVor&YB|hk@|OH*Q-h1lJ{22x1Gvcm z|E0y5O$JbkCfBke2(sL!a^oJ2!nILn(LU&wBuN%$#d<8pa-CX>(B3}IlX7QzZ=GF>*H5IO0q_!n-nm-1_gmfF$<-`bFx2*~p|Uzm!#ly=IN2e9`C^Pcfq3%f0GR8+fX4SZ zp51cQ@ox86|5=1G^H*~p1F45PylO)EMrDWcmrAgV9s;xMdP;&zHOXY%ilSkt033yFqrZRc}tU0PCcz`R9M;Jpb z=E|dSfjf>X=i+!nLSO~TpAPKVdZ3XmwD-aaa1kGdkGayEJxKmxTmY_mI=rF65Xf#- zifgKr8>&$0u;dR+7*|Y_;>ku3CIkTEV&ZXEAS~rf(j%g~hh@?VJ8`kf_t}2xT-Cyy zzl1uex2ws>TsfEWSCc}@ZIr%QO&zY5o~;sZY@|TIcczL`qS9e^HHd1ME-$FdRjJT} zBy&szceH4hi@I5b&!^*H6i3zAP%Uk$mL94GA4vKoAG%rJosV@i+>L!Ah9 z%3@-Z(?XreWDF1BM<0#yZ;nl;An(bB>Jfr9+~GU3-~VWge{-y=r8=V- z&T_X@OPj$gTBMleu1gAYuosVU3L5AJ8j)yfPqmN`4#)7p-pBiA)XBN(45eV$UpM0> zoBEQQ?V*ONl2f476?{w&Zh8EHo=AdU)|gn;dGWTLTCVsMzC|a)x7-z(*|WjZ;CXcE zG*^dKw^Z})b3LQra?@TU*X-Olgmn4FokQ=RmM`JmMFe^qBG4Vv2>R%dg6G;2S`F1* z?{-$B68{#POc)BSZmQ;iAtV?P!A2Ar42c!vBLq2&Bo&o3T!%CjD_bF}%bq8*XT@WT z%lGE~EKWT^4Ex^Ok7=>LzODvg)}ZQ#9m?-_sBZ1(lHW)Duwy|+Fq|n3hK*@c*-5f& z5WLF6#Mm#5U@ElzmmL^SD&@~?2!yF`!*vVz>sUEZGFx*PL1yCX9atlWoL$VC zZE1PSFEFe2$FFheHW}icrwuv#MAuoZM?;;cTCMAn^L%eq%g8&t4emFp)e&HNtIuqI;7mg@I4EZg(U^3_+UI~q06(d*-SGh^O8dGd@ zvvbK1L=xsjGhU3_=pgtDeM9jweFKV^sT<%VeFMM99C)9X3%&w_iff7hSZAV46tM(< zpAKkFyGJsQOfPH82HCh4BJ>vV+N~HRLt9N{bX(LTwZI7#7 zcYGihsIi%5o93wN+Wlx*Mu7DyEUxiKxzQ(g7m=UzFj{^m(n#qaP z^thbzrL08^`K4HDGO#pYo+8)X<149T|JxH0P$IAz#j3Opc3Kk1)ZW1=3k@E^d*Y zUc(p&iKdzt1C4V_^YFF)hTSl&`1e#?5`)a~`$VmhJA0goSnip_gi@f8Ue>XPSbH>&D{#lVr=_ow9=@uCX4yc{Enr zyCh&l$icBA%tz)pi))PhP84#D_XdTVA6Gk{6t1ZA6(F{aq}!Ocmu=G|)ECrk+&P06 zbE`!(mU}hOL*Byvl`@b*rg2wTTHyrBNSN8F!#*9t}`OA35+gNHt zhlaT1wNsNr)6 z&vz4X;vo*}`R>Gp3oh?A4}~5Xs++Wf$;_e9`k_RmyW`^J^Y9dxnivAb%z}lc*$kGp)kLUH}b#cLJF%MOqOlfkP8M3{sT58=NsB#q5| z2AbzWf@-rYpblCVQtg&S{gO+rin(w**d1+4(7P1a2Ay!j?8?SQ2odw$V(ePh70}^cl~ zM&i)m*cch)#60VhSo{>$?cX~^rVh zWuz+l)j5X}?<6pX_^%q}-C+>yQDlLgOb%a@`<#C->Y6E8R@J|_e^xHMs|GYO_9`uE z@XEd+RxvZ=XBE+2lO5RU9Fv_?L<-DQS&39UDV&Q)IEXV*lz+jte~!dw;Bl9*TWGdSm26Etx|# zDK9DuDni>qcgkO43mG0OVqa_*6S%5e=n8cXiS9Nc*ueWisNk}eF>q;0^Mx^68ZP~@ zBCS>WYeib8G;E{h+oUgB)k~CbT2TW)uUVa^{N0KSoL8-?f(q(E3$eh`g&gm_7Gjr$ z%yCgbfiI;YiZ&FjC?14M>4RuwqsT|W2TPyvNzBv+3$fZVK!C?F4e0g7S$YsUISvGj zuaSMp<0LSrEp~P60_-dLD*K`v_@1(|rOl!3zgBdFHuSAs7OSI2xIR~BpeKqrM1ZF# zs|5pC?*LeRi~vsrdVJR{#1u$-s;n;U;dH^+iLfwjA}2FCN-ouBPZ`xqUOFI;zRoGq z_oO$hN&Ah&uk-Ne<7?9Hk=&Kn1!-Zuvet}Ypr69tIMI*ST2iyYY~eZiuShA*B44Ax z;{<30=Riq41&$Nom?FwUECFf9fz`7r-Jm>g(ztQ;oqa|5Z>oVy$+MKDJzkf#GF>`g z&H#Wn8W!dx&Yc7K<<|wgU&xqXQT9~eItPEDp`7<~ky2;C;vROB4AERLL$`4)F?OE9!lV3l&MBhu~Gxz}i%&wBD+Xf@xOBsOL)!0(pu z@Q!*r>IO`tV~BQPUgo2#XC&o{KEZb>u(&Fb#EFOeRID?!T441HC#e{EQaCBhi-|qF zmc$ZKUz$Jjj6AA<8|zxspCoIFpKP>ZlbMs5_&1_GZhr>XiknH@Az7L;vu=Sgoxth% z!TK1yU)(Pu*{*0fuF3JpCS~|FUdoYxw?pZ$@lgMb?_JxMk^glF6e!PG)!?M^q7{hh n%hG;bH`~DfvK6G~!h33P+9;LSP*0@|%xguylQ?a(tnPmSC~bvB literal 0 HcmV?d00001 diff --git a/ProfRom_Disasm/prof_roms/rom4_fnt.bin b/ProfRom_Disasm/prof_roms/rom4_fnt.bin new file mode 100755 index 0000000000000000000000000000000000000000..918007f0f808cc296627ef8348ed290d71c42846 GIT binary patch literal 1211 zcmWO5{cjUx0KoC5bKq@GcY`R!OnL&cMiOZ-#51UzWVqW;9MMVw5v!38vkqwi^rAmbu<_8+Uyf596*U|HAi^uMM1< z&~vTl(m;=Zt*>8>4FN0z<2NI2 zv^I5rCP@Lniy|?IyW^D4O9fP!2(!&KCG7?wolA3h2S62DScTo7zV)DWu(ke$V~9c< zMApGe;2=V-px0RgS&E}tVmp&Zdehd|I7v9c`uCLCT_h$u#~IAL3=YZi?QI^P-%$os}l7c6%R2m4V#MT67*oZp;If~neI9x1LmV`}Z8h{{lv8L+s zlxhEX)9vjVYi{~*k>n+>S=adR7bFNs5bj{KC(S|&D(U}x1l&$m(g%P}20Tey0t{e^ zj_(ic6J4gjWniWB0%%Agr{%y{XELVdo;Fn4yc2WpHYK!1j+8(EUj3LGE4Y4l(zeLG4l{;4ZEFd83|=1Aiq z0qFkYW(JhpmE9N1m{6@kc4f4Tg7#ek$P9CjXW3v;L1<8cx^JGKomfsnsDO~P0|?1n zz)vjpW#jps8UOcLD)YD=Ecu-ZxZ{+-(!Z)kk^JNXrazYSnNEc<{lwge>8?1Hub8qy z7)=XhMO!P@EPsErW=$WcS?_mNf0}wpJ5!Y3Se2=!yoxclvTf3bMg1wgQzr^`ZK_!# z4NEEN6F@OmPwDD@t#RT$?=;!$y1^YSUw`}P`Fw#aZoA>AwG(+yJ19Iav`K9pGSHtj ztdZpP(GdIPB$XBi<24m_c)b+0@1|jU+Ycx0F_9lttRr4`(AxIOH+x1si+j&bc-&S; zyjJDxb7P;|6t&rLZ03Afb!<=6v2WG*TQCtN|9fsaHX|io@1BFXfSnO${QU_j-zvD!Ae<*$vGTFKYQB-pRbAIt308Ak^N!D+lA JF2leD!2f*pt^EK1 literal 0 HcmV?d00001 diff --git a/ProfRom_Disasm/prof_roms/rom4_vars.bin b/ProfRom_Disasm/prof_roms/rom4_vars.bin new file mode 100755 index 0000000000000000000000000000000000000000..2d9e35f8b2ea5f6b510997367b03a207fdab34e5 GIT binary patch literal 371 zcmdTs&l4NFJWMJpz;^AP(W?+*xl=fj@W?+&w zVt@is1_lmB1u#cU!Ge{6flUj<6JuafuwVi4ZiD0m*aX0Gq98e51`eo7kQ|!;tAHg) zr2t3{Xc|}_hXRBrp`ghQGZSd4f*}%*kH*nr&nhWZ2b59B|v|7`sK u;Q!D64Gs+o4FU<~kUjXxk+ z5xn;t+O*PyOWDL9{lgln7SVNa|Jcf;FeQXQ+$bZ!+EQ9?i5N^Bv+5Ag!b;-Zz*Qy&A9hTcxxYZmG4q~< zlZUEHbTtdsamBCRtSvDL0Zm%X(vySAecM50njF_(6RMS8<}Fe!pXooztO!>X4&-e& zM)KcQf7hyeyL0Ymm->V`i7mQPRU`%Xj>h@6P&qd-HWqJttID`4@7|jxycbWtsLLqP z=V!i2{=Qx`ytQihK*;vQ(T@ifkB1nQ88EJWaq-{wWh8R{Q2Ry4;=k_egTm}<8Fy&# zdB*UX@z5+;e`@x7GW{gDwCd0 zGphiew*xG+FSI{z7wuMiHJvpS5$Q>^KXt5uXudJmGmk)A2lZ5!hgY~lkiN9>99Kw< zRQ*$C`l%A_bW!icGLf--)e!$ib7oENNT=@@yU3b5#&h`>)p$IA!|m#GVLCvD@``jt z78Uxup~g=A)d0-;SKWtuhfEE8b{RWgz_@`oJS<>4!u6 z2m>JX80^0eP4M8j$4ng_5DSv+xA=qVuvKB_UZym`-%n?O-oOIv^pp-+hvpAGG4!NB z#N?^1;_3Hxh~Z!C67hX6`BNeUi6D~*XcB%cdq16+Yr;W3ps?`D50bGyktEx@*$iN2 z!9~^b>26DEx7cqv+rXc2756uYkt>I<>|p+wPCE2oC!2N2wlk-TGW=DL?~#XJ za9f#{4@->0aTlMj&?EoG4DByCRKR3ztKYWTh9w&oA>vBE+Zl8(-RyJG1vdvhEuLUI z#kaWq0gty8%a#b1HhL~uxd_XaFMqC-l1jw2p2lXUy9L*HTU~xtv3{KqtoT|1>Jshxr6S;pxZ_N4~K>hBX=`z66^WQ^2k1_=$3LIGDaQ+7&ZcHh z0O{in_}q;iXA8Prp5RR6KEHRr$K`fmla~hI2?YI~ouL_yGk`v)KZxEY+}P;#`(}i< zZA43X#eh!zu1#fF8U~}$SVlpAFZo+nN2%DYzX;!W6xG&@m%oqzGwchC6 zyVu!NDlALNU;qYeM*t>a5=ppTYQrbPDKbLo2uWdSxJ|0Z zQl%aZK1mtDk_!-?gsZq&xr#Ph^T6l;j(~5eAor%OLKuCMSVvw~Cw*WD3zGub(t(ai zhp=6#lA3Knr3x#}f>kGNpasYAR5WEvNf3#k6o~*xQE4PfI7O1=J_#-; z*hk34BT;EoiZWXj2@JLcLaF0|>Ts|JItWTK%;|{4Mj}8|bTGM!kB~5N$jt5zM+Aw$ zg`?3F^K>{Rk0R-C$fFS=C@E5llHx!Ddeuj;p8QzKB=5p5l`0(O`yh+-fJ2o4&K>c^ zVo@2})JTeqs-qEbF!QNlStci-mFmk1-Jtu?ZXgrNbkj-2_55B|(Vpq$yp z{tCL7s3NeRviC_LvkwIgry?+YL;wr>8%5@soJq@%HfIKcVBO literal 0 HcmV?d00001 diff --git a/ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin b/ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin new file mode 100755 index 0000000000000000000000000000000000000000..460760d07cbb2d46bfefd4d39eff5aa3b1cc4493 GIT binary patch literal 11776 zcmYkC2~-p3`v2d_GD%pHNdjTQI+Fl~pcqm_%!P=E($*>{E>&==fU;x<*^!wf1O)eL z?W$ew|F*qtv8|TcMWGZ+nvS>j7He#$HMQZ_UOKI`;!gMv{oV6F|MQ-Q_izpgnaMlP z^L;+wXYk=`4}%hp_QjHIC7mTFO9o3umKQfuTdI(I>Y)zxz-TB;b0?(0B09jM`_vu! zvMM$Db0`vv?gyJ(hO(+$AajRMY^)!|?nD0-5@HdCO;rP$kv!1chn^217|)2IZ-k^k z=;olWgk%75%FyS)wx`jTq&F+Io2r61h*52-nxG0Qsqc2;=PQAT2mooHR{>%WJ&=Z1 zp?+)*Ij2geJ`}<*xnJb&XlAaxQ^W0_T`bxVF>8qwNv!oR`n`% zhq}r#Nn7YtU<4S)ct`(M6`e-Ekw&MDKwuj!8iIu*bO-ni(CQ^(;G5%`Y{35w0lN$T8zOcO1NnbNIJ?hA1RIh64Kce* zz_z~vVfWdPvLX9#$k{y#bp935>^>U`He&u8D7!1c$-g3&-De|?jrjjY0=p-I!P#&H zN5=es=ca>VCBoT%;69bO>(ioLA)xGwjSd~DMz-Xi0kZ$smp zCQWuor-=^fHSwV(SBi|GZ$n8ZegjRTzTdrAq}!;wVif0xzplSxsMs}MU$M)`@#4?! z3W-NU*k~wn6b6@d#i9=HRy<#woRT_6llJi6-|EmVE(fjcTlUOL&&!zmHx=n-(wTV|RW-{v9eT_U*)kE$@ytuZ*LA zSs6k95`=_6bUi3CVz40n9L7QJ@d6!`rdpJ z+c>n9J2Ai%_;CPMF7xa7KzJC9hVO1(tMoIE`jNY7ex}Bc@!gkN-oikl%rI;G zAnQf0?soMyx@};vEyTTo@!CT_U%~%}>lGSd;TVbujeH<*%@-PZKO}{?3W*F4rxit$i`5zp|>2j1y2LrIss6D41MD80mof|Yhq6U0tiTa!Z zJ{B3Ffp~ssItfRBpT_6bQ2T3;`wBJpC)dCzy&z@yg)E5f;P^2Cy?{e!LxWrWVz9Bp z&s4*En2mlJB081CZ1=0>k=QR@V`->#)CdMXJy~fi)qhrF1Y&5ow!-jPO{j3x@I}qQ zrz4fdLQLsFgV$A}+5qo(*AyL`4*Gd7x`b0gKm0>iK$TcKDdasw`lor>#3U~lz6oFB zx4VE80Nx30$`qps;p&7 z*VQhkTr@tv2KkoM;2?Rv7V-Cb6*6u`W!3hEy87@vUB;P#PcaiO_E`)yKy?F}DQblY`r#habn8K` z=4WcLIj49EQU3GO9MdF?e^>`A>2mio4j0F;HbFAct{5eb$F#jitC3I8{f7P40nL6xc~uC@@q~0=!F7hsRhQwMKSGhZ zKlDm_u|a7azyyX9*1WShG?k+}a6TzVNWEpFU=#XGQqBhyVn=VSerk8o+q)mDx2GvCrSeD3y938)(?%;Z*JU}av>kGYHC~*@vNnOHK&ne)}nY)fVSHFP|C9dRS znK1$=aj6JOJYO0HB`ynx5(~vp;u-`>TrYzXACp6gtD+%fbu^M#B*!uphUA*uajrhO zX85cFAK%?EzY(3nzoQ9^Mdn>NAT3ZG%errga11)HM2a87jMsBr%b$jvGECU)Ye#SB^dbMw>jcT>^ z5C32>9Jhe^yaEsUxna^Up+X{@n;t1CLH1(NrImG+JL<8Fl4#MxJ>nvi zufJ*$Hw}3XSW-cn^y|l!aF|VvJn+ih?D4!I`#1T$RcbB0h=*`6_aN=vQ#05nH5x>#JtkH--F`52g~FK$a5|;1f4fz^s{o&N+2I zDG@ISu&U)f61~hbx#7qGjK{N(MI#G-d4XB+y|ww2hNlci?+gX$fDzU|ZqskJO^uA< z>uupqm?qTHZx+aHm zksDrUwNpHUq6%VV<_gzo+rS`av%6XUoK4Fy?=6$sm=!0i*+3cn5pf6FO`>g(g&&U( zNS`Gh=W~#B@K0oZNk4wn%~R%~ce$~B17b`%Go#^&#d10Hmiq#{Gh<%#b4~!1h$((6 zk+Q9`8_T0Uv<=ro<1;&s-@X>?VmR4m1_JUJLf9Lob;>9QCXLvI_T0k(m=rq z_kct7yaSr{Fe|QFU?3VwbNL=X5s-J^8Ap&gIlBTLa?|a{odW{ZVqO$>z2SG^}EuyA(1(fHyI@F;8EIhHD zP!GvnC||8k+ z?huCY=xmOTcbcRdL0B(0gU;rs(AhB1f~R{M1a!U7@Vy1?O;rMeyF|Aj;CSvVK4# z!cFygyasY}y*PoNMB?or+9|<3>`xJX2#X`0MdFkRk|C!F!dguUtFYtq_8c1Z0H||n%n$EC;yM3% zWkU@X>8H1Z)9WLYy8nqlfAU|NaH#ESn|ktAXQO%oKW@q5XTT?jK@s06y;U1=dcRO6 zM;^c;{8nxD){!6-D1PAPXzm7vB%yz#gv6M{D0)A8tL9oZ#!JuMieBMkTps!ruTgE} zyszP8Z$&P!>X*PciSTKse(7$}6KTI|qq;*IHJPDRnt9q-;`gxFy~car{*a`LOUn5X zbvUE3Z$+PVUj{i}heWzBg>}S6_CBwwnSUU((W`)>5&r6i>Ux9^Km-!D&rr6p(y_U0 zm1Q$fARy6IWIuf_ zAKC?f?WB_J@I}Gvd$H2W?e-nJs?9rNHt#oJPq4kRy&0>oY^ujVsr=ZXZ<|#=H8BoX z3odS>t~cR}F__%Z3?e*IaBU2aY(y9KoWkF5h(*k)z_tV@KHh}PC!(;3u!s9R&8nVe zRc|x1;!j)DJrC^z%Risn1Uq}LNug_y9%N(8DMj^Ou_Q5-IhBZtVSpUi5<#zzH1srU zJ&cS*c(J5_J+%ro}B`o0?#{{vc2FNvadNZlX!Y@oa?d8YyCo^XYFSH z=`)(e@LfqNv5AfTq&dWa`5N~D{|06SW^}%Ns)bkD_cIrb@iQxWnqlCFM;Xj8yL2>*@}pr7`BR+Lx4}`5!lGQd{I7P6_;S!GB04( zB}mfCrS&ZNsK6fERAR4mI7)Zf8_c!XBPMH|rJ{13xz=oHG%x#lX-njz+;(CO8%rGR zj&^lB5%W+xk;MKk=C*qT#w9wAagC#$T;r7;Q1v7y=9C9LYFZt zI3<3%n_8Qc!=+MM#OnPcU!=59plk@6n4~ymB}yRkV1EX@cy3EnS=YYiDVF%4pSeew zR#yx6dsoZ`dv)~1jFl%V?RJYDtEk*v%_5zWHLEbJY)xgoy?Jxlk|!+o`puGMGCy+g z82)0*0xX95ypjb%{7e8AdPA5oCgODh;=b5zRIs>;@>WPcbQV+s?)&mO@^p*54#30? zXxyz}N;g$u*N9BrweUHvVQ)n+CWl zq{52?$ht@%yo=otx-VHOz|G;OJMT6vwtypE1t+ZVFW{5`6dX}0OQXPlo&{Kiy?S@0 zp=`#GAGj;)yN&G*;Q<*}lPs_UCEY<;EOfjHfn89IH_6Myz-mZo8u zixy?g1AJm3cUN!qj$PX;>#!9Ta|L+U*<881G@%=o#`9n)Hym*Lq`Yt`p9dk_P1V+T zKZ%(I?;SEA5fD^wDS-+s^^kSvIxFD!RctUr0%^QRAmv5??g1$;Ldq9G7}jX9*J3NV z%X0zuePC`E3UW)dd#U6%n7Lb^n&#t9+u`BBy|Ym_z7x(U2P ztP$>ZZLh!_dT!5-?e*L1EISdNb@Mhiv0e#vSsLoC4fRXot#0d^T@V60Dj!Su#JRn$ zE^nMf;B8Mi`3ZCt>c`bUu$KHK%{+d9lqsk zT1Rh%i+ml-NsVYI{Y^2K6=r$ZkNVe4d9uIg14Y+}QL47W7_NsmQ@H5bYkmP-EP$%W%VN-wQxS*MKHI4pp+0 zNBcd}>@)<*L7Nl*%mP$I5Xg^BD1DV0PKHFKH8Z7VtM$>L%&GDboc zU_AI67Zp(Vt<-u;Kb2+1vymDi4{AIx%rW&(&7z(X>twD*B#j}ANLOZfuZnN>ol|d7 zuUB^zc^8~fUj2t{P8DNR=_aNu_t*qQU-Wr^O zhRCcAFuoW4MuX`xbSY^7x(=1Q2XN3i3T=1GnNpP*s&+!`;kxa#c&Ct+kh}{L1LhPC zf?ceB$3LpY1jKnv;GSgF(j0(#j8bTN57R6S<7|JHIr-xuv(NtN*JfWE_D60=hC#WZ z=vhoKg3ak0N*zSM^?mTDR$voxilM{Ztpgf}JH-@0|MV;o!%Ugh435ak58o_TnXQw0 z*rpN8`@?I_kfcCYK%HlnCwYS-;4CuF3BmdK^GNpZ*EyklkpDQg=J-&6ZEC&Rl$!oC zZEPDLm7)}GNtA!e=7lJP&+_50z34yja7+r3Mg_!mQ>SY$1*8j(Y-Ba*&qcP98|vzCnW5A} z3T(2%J`JP}wiUUXbWmyhLZk%g#@Z)~z)qKkU@T4Dx=>8X%_mE28D>rSTPS zOtU%<6H*V`sU3FBooRE-bQL2T35Lj+EqDrEcXbOtku*Qv^6S&U7u@b z%3zz4|C}2a+V(d_|HG43qteu%(&%@{zu7@D@-(p)Jnf|V?7AHH=`)}7+8)|s8;n}j z1py#p*6<&44wqV=h;tRPBt_=t5QnF?h^N;}{^~BhT7%t?Yv)e@C+KOomvT?{Vid{p zwO5^*8VKYOBB`d&Ysj)Qg&MY)FR=4kvdle9S&lvRB-=p4Huth(E&CaMIv_9@>}PdQ z@rYre-I96|EbQ8<=wwc{LhDO%2{`I?*QEgrW{<%FyY6t*txVBqOTWmjT4=|%l9~jtfn*A~dk$-O(OZo?ru3pif5Ac3Ik5ZOeV~mT7`48f|1!z; zZLg5U%aEhIjn;#@gB;t@AdP?Qpqd>48b9eUN~wL0QKKA#XT>@ZlQNH_f8o7)h&2M* z&wg3VIw?;&n1ZR`lIX<{N{ZpakZXZGFjzhkk^)_SuAcwo{xvy5DR>0}5vWqBh=9Wm=J3Xb&@g3sdYf83a3?s#HqB%F0goZG zhG~YAqSx?CT=_~kf_H=H2lC|C2wHIKSYT*GaerisI(F7Y5e?09=t(*lbuQY|H)Nb) z3UYP#L&7Wlpc&3~UtpQWBpTcIbGac{&hiO?cD#H@O|}n26R#E<{!@Nd!_5FYRVlTh zp{-EVU{ekZ$vYo6&gexAP5S7DW_?0KE4p$2&GN+j&=MUNhPECVS-tGJZUw@u9$6~p z<8!$sEI1#U^#+ibLqn0sMK8;5Rp)C}AJwW=n&{`zmyWKhopl*ziOH;+zygjKI-3h3 z2p))V@_}~-{Qv8B;KUQ^V~MaI5A-@x2UTSb%4MQFj;np}#9lycw@`QORGN*I%Q;(u z{y>pmr|6z)Kdq5X1}`BfYx1R%=x;#Nh31a=F9k(M5BRafN&ov(ek{g6Nxf>tvYdDA z{``mC3iNF46S@s`g3h(csY&BjwNPSQz^q{x9 zSSH3Ak2<+$0{suovS9A$v8ek-sYn-Tl#6siW0Xk8HO7dTg0y2#jRe!uRu-m-hC~n; z6iNT6V__ftOQ{z;Kc)S%&M0|h=cIQ^d$$g~IiF)n$xQEj(olIZuM#NH|Vk2>j}b=d%l2y^^>BtX4Wrz*9m)>%{=EUJwb)oP2X z%%a+C>DOo0~y^b z3n!@0OhcEjMAqa1J9Lk+hx}3ZEDfE|$w>4kwq4T_L1Z^(0gsTvTQ}(4VLc<|S(64045Yt(O}>HHJ{#cqeuX z5%lZ{K^o>(r#=J~A9|+_>I6ZiAm_UPw828%u>jaLK`pdOlPTaFnJTiboh_S(41d(U zuMrxdoL`MI=+BcwUg-?6ReDyu3pzoTnxscucUtv-AVFdg4v6c}6{2NzB(|UQ6~vdj zAr0qNCz1f3TJj5c*X7%zi36B3W_*t>hP~dmoJ>Igt_5$B3$3b5A}Ebp)QBhqi!@2brdQ%|hOEF}X$py7zX;saw-BNN-IJ3drnvW^ch zv5dDjNIhhlu%|oJmm*(xeuzl{N<`{VLWH5jC0QE#EvNAE2n2~nE)&;F$}{_Pal}LU zaYUQyJUKMU32@cYhcowj7VGMQ6aB@RuM)D=Ysu0HR+sz-T6cI{yV{~w`zq2kf?61SL7jeDnw9yvJD?LnrP9wyG!nl_Xz;ntJC;fA7Q!o; zOQN^AvF^4rpMPMJKhdpyP^VTssGErUUHz0@?hNR{kw@5Df;{Fb4{FyTW}r)agOKD8 zIXg8=ISWbjs$69?bMirkF3&YYU9oY0b2CfJEF-$(GLH2bj-%i^_H>k4#J{<!a+>-vYy&CUlZZU zKN6*?v)wS4Hgo7IuH0fx;D^gD@1xbMKllS3nD9=G1m!6Bz!@+KB`@!b^hNukm=#+r zV!*bZk0Fwi?C8bqBEvSz8H-`7rL!m`%!#-xENZ7VIO?`Hp*Pz3`-mp~eljowF9s?n z3pc<#kQjEB{IfT`!qcv1`EuxDc z!nP3_$yHMI0haE;YFSs}p%IHga#NDGsa;&_>`;e;^j>CZuS0*y5%GoJ0UjldAiVU2 z@Y;o5*8XKy^g8;Pf<$y>q39w=!0x3TNIL+}AT9AP^zw9fjTP@>5FbxRc}G*{H(d@( z*4@8gu(Yv5JMFV3o?VhPUwI%!rvpMEFpBi^t@x95Nw2v&A=O%5!ahv(p(z!pzOwe~ zF>6wgkfs-R4@#lI254q+c&RgwZ72YlY6Wr^#9N##Io(aYP{*uTYYK95dUFtV9D_=- z;t)V!*L-VM0Eh`K$Z&%}mRlxmWr>1N3N3Vru0C3`#DFgnce{seHI7}9kBC~yzq`O+ zj<{fDufJb^u}m+P}@b^ivUwEGI3({G899<^5wEpTJL5r0tJBy&0aIgvtvV1Ptzf-gz*e~^A+ z42mHyl|o;U8e_z69xN7vCJR{;X0bs84tF>n9BikN9miOcq^)HS=rr&Ff_<^L=;Ha}vqR~V^=q}1pF3h5bi%XsO<0;`_&x*f6?36!|i@d&YnPj8(2vAtv3(a)KT~HDo~{su{q6p9 zI=09Vez1l}k4-21+j_eF&HhGzlV1&*K|YC+`KN)A%qc|-uAG&c70@8wEj{Zzt%0SV zcA?++PWwK>?9!L;^T=k`^>+V+&Wr6LCXn;aR(}9|*VW>09A0j=dJdrHrh{}4*Rf#6 z4naKG_dVLRCTJ!k3Jyt^s$yh&#fykE>=Mx-UfL}Mjmj+>#>Q-yISogoI=k|^QSkQ+ zkh{H>pAbrQ z_efux?AI=%6ysdr$o_?D36lG+{+|3S!I7VJ(}C%Lm)A~W@)(7%n0v!z1eb-p=w388 zIN?+KWO>+K?l(k-HpIQ^E;h`!5*W^l>n<9M@pL*F5lrpU`!D?5GG{4@jhlXp+y)9?#&?>e-~)CLW@L=&F$adE;6uu5!k3w(M$?!Se9Qujl2|hTV-V{KNb}EH zqny&tvmnFOuTQWozbS5a4yp)6QT8T5xtQz-yeZnYAE}z5l!C&91KMzbLxm z-((8LUH!B?D|qYJZ6M<&M`zE;Sya>d*z@KjkxU)MHVu$U9TlCua97VW-{$gV^1>02 zPI4fSur2z{uvP&a2Y(o`f-4e)i^4?$g+K`NVFAp~7ARuE!(d@pI3JGY!7=C>Z&?u+n{-e z4^5{}rz1ZI(%pd8-Z3F|WqqGIwKKgV%aSHV2qiCfpBVAUeKKFXFCh|}%Fl7Dr`5>U z$uj2%48)T?jHQ^_nH!xp3)k-G#^reXIUTVT1-hvIU$OA++`X5-JCzy zrDXkeOzy!`Eeq~_Y!N*hcG{H+G;(gVQ`wQr-_Mmoh0j#gq8y_rO-;31X*GJukYF1a zEiys^WSaAD=X;H6&dnZgux&hFAh;mszbD+|QvGDn@}AVRlfmhQbmZ5w13jeB3X*eN z>L~f`>&B{Vn3z6)PqaZ7t#&ahMExRa#Drggwp1Go;KPdyMcy=faLH5)wnOnJn-^ z_2SRN=j}@gUKX-bu*`~h8;>ur@)Jqq9>>ymhBfi&dWcp}2I?RQk&57CXR%dnRTItO z4kw3J!zh_x6LGoIY+wJk-O}Bn*44X3v3P7fIkT9@(v~jcpq{jPW4+L`&f$1Fet<2H zwgXEJ;Jw}cIA4o@a5&YPnt6sdLZn$!XXh9-?@P}1vU50(w}yneQhyxCIV$&KMZqzq z^k)aH9zN&@jB$h8s$=DzoOgm7OXAYN?Y&U`Sy2Z*{gJXu6}=Y%ABghK1$2ieIcLc9 zAuQui&Sx7-0)DxlR*t0w*-2g@2bb#ksid+)W+Xe$s*FgCGYA#Lf6)`160!4X1?=43 zModi_J}yxclMz3&lP+(&#{7W^vEDi1zZ0iR9Cn{*SeF`+P)u%t!m^Jj=`9>OomSnj zKe0tS#kt%h3?@wHvgC;j!<&N!irvwa)K$nYnO6>KfHTi z0Gj?`T14Hl=uov92*{kfxw6}_2Ksex0P(D1_)Eakh5QSzI)fbZ{7FSy8pa&*IV7+ zI{WPJxA*sbdw*-~Z-09?lPp8=oV^(??y5w7U?CT{RA8qbK<$gSwzztJO6%clR0|EX zYShao5*?<}TsNTsw8WB(Onr;)6=$&jB@TtR@L~D=FS7JLCOt104G^sX0UAOt;LyS~ z`deRQA>XNQoepH32ne`!A}i#0cGJv>EQ66^hX!Z-VZMRrJ|t$E6F$qiNd%y{LB}%Yktf zg86E`qeRP9#O+l#XS$tw`L`P<)gxYBlO+aYtCzQCYm_(0>KFFc`K&OAf`bt!QLt;? zIpm247j0R%OKo$0*;2Bd;*-t`sb;Yo+!qQqp8#dIZ-Oj3X#NFky%-qQ*d5v z^v}qoC7`Li1T;yOfX1dJsC#pH3F>#>@=HJ$`z0u3C`pr55F{gzYT+-**v;8pqT`>U zB_Zq88=4hKykt#xn1rcFQKY1$pi)Iji4<@_nx7gCoyT6_QF4^3kbB=$f0v_>)8y)t z*;&I1IZBC=tH}|C+<_INjvk&IB^B~`E1K<>z>_Nyc>9CjK-+1}Sw_W{7Zmvv%~ovD z=hmpQfgE@uTI_8VfHJ=)K26($y#6XFZZ zuMgzA+65O1*li0~B_jKFKu3KRMxdjdmpJ=tBfSD=yZPNd-Tz$hQy?=?U55F;e<&b; zwbf;k5+5~v4)KbDnXKH7yEo;5?O@TNqHxB`lU z7=ZIXFE%s+z&3#`MFt&XAPFg(0eCeTfMvv$py4N3I%%qFO#mC*YX!d>Gv0m zqxqcsf}i+r<9L6L27f*N|C)p5gO{r$;vo1<6+T?ym@E{4Q3~A||43VDE*NYK5Bhyo z(3e$)NYmi-+!I4FXkv@khl%}_Ru&nF_)zNj{YDqk>|$sJ2pv)lBL0|x5JQSxDe*Sv z`?JH6gnb|T9yff9w^cAM_SSsSa(Q|j|KOu(U*C@;SkRRu*e_rw7q4>!QJ&cOs)|%; z5vu(Y5|ZNEO8}KC{*m#~($@#AJS(|qm4DQhgx9ano#;bv zmv7qgM)cifC7m|6vY*xWF0CuSVRNs#X-8VrM~;vB!-Sn%iO6lmGU*K`EN9lI&@9GmJJIy*%SVbDT!hi{$?*{y-w2KZAE z`|<|}CL5kj_qAXoB3>ymPA&uKD+(cZeVLC5s)oG$7|i<;sIlA%)D#b}`?oD(!U65* zx!ggHeFS@J$j^g)OUcuCjOKrp>vv(!wh-&^?Y56&mOzi)Ka7sBKN+!)m7W@&I|YG@ z@ou}pDA} zZJ9mSL!ey(xOSZQp889N#$+H`CoSI-lJe0&CrMa2gO&fSjNr_0q`khRJdk=7iDaZs z6|kmy;FMrc(=4Wmpol*$D#o4^Lv7);g6^WLa@d~S(Sc!|oe)p@<{MBtX&{Yh_etMC zHxjya9V;c>yU53-{6%;=dd6ZU`C{JhEr#4HlydzH&^BFj4khds>{UVlB4ne<0r*d7 zxu7q$G0&d+3TX>l+2_X@zWC6xTVv7lVO6`)d{AFHKD!#oXD#V_8AW^}w6QtEE5WHD z)sT$?2{^F&##<7~?E*4n%|*-2kl@)LEH{eA1pv$nQ#A*4M5`7qDs2o()d+T5G{KXS zg=E++ON(}ork|YrLTBm6ikqT4?`bX5aLgj&Tg?SwFv*?^FeeW-8vuqgJDg-Qz`O9X zIr7-sV7YKK7Yc=djV#MiDy?&1>JzT+lPM)gZE)I0|II#IUt;2NKUgRR`P=h%?qnZZ z0i=7BH}^;ZSel(}vu7*?x$w@t#2s-vfKw{d$)1(Vl4lVYgkJ-&D$)=7MYdxtwG9!z z833fGPdS|dy=r(n;}2LDok^ejF*7oYM`R^WOvnk-Sd8-RVX?J}9l=Tt|uVsmsXdq;d$e7x^! zuwa3=_mb}ch~69o6K_6&8T+(}iTj>YAlM^|PmS9S_JHiAP!zcux;ZDRR9k#s%jNm` zMQPvMTp_6AE(DJB&=JwuA6vME&P)IzHu6=nJuuaC?GD)*072l!z0n(`j9)-x#M>&A zM^ipgMJS^i))uuYnWJNS68HAnRA5b1@m4Yp;h@x|^^mMvQ{Tq(&H*M7;9^ri7HXkkl(ISQ(Vw z;$PB2*_NPcGDkwIU3uSDQAom;`=C<7G3ReQDDj%r+Voc=_DLX5J5}L-xJ9HA&H;Sd ziU~hxdAGH3J;b;%M?y{njLC z7?w2pT(`gbgz$D;XK z^CU0`=`ppCRf|rF#m(i&%M8|+ql;_{IJS<0fzgzMY!ih8v}Er0_pyR0b_(>;$_{%# z42(#m_@l}>i$B$rB;>DbI&pZyLarpVds=~)Ah?RsRzq=r9g}SIv;3?p{_S-IHRDa9V;g);PO$hhf@i59s#&gCdR}5k2AI#cjA%x#F{-$&BQ4b?L%Id3gw$?fB^!2Ws`fuK? zhRnixtiHbEcd*`lOFiveJspB0jD`lcLk*C9p#dxWV@nbI8M|wi->ShMzgMkW-x)q` zb5j$8_ST0Jc~YlNzqDP~U%UN_Y@^Su8^b+1Xg z;#~Dm25lUlx^F!7*>1DaaiQ{_lz0d6JsbzCjmw|H4K>>Y5DIUlHVgE^n=@Y<1idxo zjfPxc52VacLtmP5!cQ$pi)p~GkoAUcr%i2zd9~9qZEu83Z*Tk8Pset(-HI{2-4w0#W>0QpqICJJ7T-ozhaVjpZy){+8xRm{xpAyzH{^3%KIPI8E4w#^j;RcsxG{hz>BImgQ4#iQ%mw&P zv)HoJBe366RNc#&!L)c1`hZFbbVF6uIH-e+h+;?Dz{E$=Q4weI!B8sH{AXIT4qO%m z6IxU4c=<7%`C!1O@KOnbY2pcx2f%0gpRoD!FNMc3t_I*E-DvHhp}XAoC##F;x(Ew( zE|_0mZOE#x@zrH#WG_WbIk{a>yh(LSiH zcx}tXo5}9TIK=R0HTdFM9PZKJO?BF@>KxJI?ernRy6SKSw^<|}6KVWyNL?@9+c25u z&NP&PhfGUuq(%8iYpt8lTsL?c)&lp>n>x)_>I%!%pDbWC89o@y9wZ~|zXbncUrQPD zi>)7|{JU8>J9HiYx(5G#QuX{(OR_m~0P#SGdr;tzq=r^BXpVzy1cHR=)(V3xz4n#JZH zy&Ny4JvE~9#F;`46x&JIKvY$WM0Wl}%6;L7IQa0xLD8Ivp+hFu!BLSN!~2@+VobnL zM*TUFSck-zdK<{$xiva2eq^)6s;n2&j}hh{r%aD+?9EG_Cd*`^hm0)3e(Ba9;iMzF zrR@61f~{Pr(c5Dun=qVmRMNa^LT{D_SCeD9FR?axuhuWW4kMOp z(@_wzXyj;9+p(iR=()=s5lwZRS)?=iU$qzNzUbnb^YJ2M&66jF8j1J%dd!@kq!aSK zB0jw}acwJx&1nN*JsIEi`B8G?XxCXXvdeeVhh%hDA~_o;=8y?pz9YXO-|TusnzwY_ k`w*L5h3{z~upPJDQvUAy)?dBF{N2*O3jFGUe<%<92T;*R#Q*>R literal 0 HcmV?d00001 diff --git a/ProfRom_Disasm/prof_roms/rom7_data4CRC.bin b/ProfRom_Disasm/prof_roms/rom7_data4CRC.bin new file mode 100755 index 0000000000000000000000000000000000000000..f4e2f89a5b33f9fc6c1f9a8a97ec873ca76e7c38 GIT binary patch literal 512 zcmV+b0{{I003i@UAY(9uK&4Q|VCQfMfhmznp=+^>!L8BG;qUP=5)cA&GEyS7Qj|jX za@JxwlNf`0vs$CQ)11Tq^WNiPBttYH1OXK0WXE)*M1@pprAxIag$b4J<96@niD{V%sVlklTGUFndX{Q&8c+%|Iua`V+uX~)`=0B0n^=oGyBe#eY=?a0OvPLx zECW1X3_%>O?T`KJ&CT5^tqZ+qjY*xCeztDaUi3~AJ~A#*9&iqy|Gw|t-~7)TzdEm3 zpLmamk*R^ovFo7>(JjGF@o(XP5TO9VFykNuP$fV{aA#n-gP4>1quR4Q!yMCp<6iTz z0+15(BGNK7LKISWVpekMwacZbm5GIJ^-tw2)eXhsG{YpI6oCY0bVp<)R0Txar~0>< zhq#wt=YIDc$2`~5Ch|6s2Cx=aW_ETJMl@DT*=@-V`7i0nndym&xvQx}SY=2CcqeGU z7~u$lIHM?i%Us((>mK|0i`bjHtD3uYN>o}mY8HC&3eXy}Dv~-b{SWPI-A&D^y^F2r zoym_%s&wSsTue!h4kNBS#ZZ>{ZPIO+AF0ww+4)7kp CQ~v<~ literal 0 HcmV?d00001 diff --git a/ProfRom_Disasm/rom0.a80 b/ProfRom_Disasm/rom0.a80 new file mode 100755 index 0000000..7146488 --- /dev/null +++ b/ProfRom_Disasm/rom0.a80 @@ -0,0 +1,10229 @@ + DEVICE ZXSPECTRUM128 +; INCLUDE "!AllConst.asm" +; INCLUDE "!ram8.asm" + ORG #0000 + +x5B00 equ #5B00 ; п/п переключения страниц rom0/1 (=x006B) +x5B14 equ #5B14 ; п/п возврата из basic48 (=x007F) +x5B1D equ #5B1D ; п/п on error +x5B2F equ #5B2F ; п/п ввода rs232 +x5B34 equ #5B34 ; п/п вывода rs232 +x5B4A equ #5B4A ; п/п включения предыдущего rom bacic48/128 (=x00B5) + ; rs232 вывод символов +x5B58 equ #5B58 ;2 адрес вызываемой п/п из basic48 +x5B5A equ #5B5A ;2 адрес возврата в basic128 +x5B5C equ #5B5C ;1 содержимое порта #7FFD +x5B5D equ #5B5D ;1 =#CF rst 8 +x5B5E equ #5B5E ;1 код ошибки для rst 8 basic48 +x5B5F equ #5B5F ;2 rs232 битный период +x5B61 equ #5B61 ;2 флаг состояния второго принимаемого символа и данные +x5B63 equ #5B63 ;1 текущая колонка +x5B64 equ #5B64 ;1 ширина печатной страницы +x5B65 equ #5B65 ;1 номер параметра ожидаемого rs232 +x5B66 equ #5B66 ;1 флаги +x5B67 equ #5B67 ;10 имя файла +x5B71 equ #5B71 ;1 тип файла +x5B72 equ #5B72 ;2 длина блока +x5B74 equ #5B74 ;2 начальный адрес блока +x5B76 equ #5B76 ;2 длина программы +x5B78 equ #5B78 ;2 номер строки +x5B7A equ #5B7A ;1 тип файла +x5B7B equ #5B7B ;??? +x5B7E equ #5B7E ;??? 2 длина блока +x5B7F equ #5B7F ;2 длина программы +x5B81 equ #5B81 ;2 старый SP при использовании TSTACK +x5B83 equ #5B83 ;2 поинтер свободногоместа в directory +x5B85 equ #5B85 ;3 количество свободный байт +x5B88 equ #5B88 ;1 +x5B89 equ #5B89 ;1 +x5B8A equ #5B8A ;1 +x5B8B equ #5B8B ;2 возврат адреса для on err 32768 +x5B8D equ #5B8D ;5 последняя длина, выводимая при вычислениях +x5B92 equ #5B92 ;2 номер строки для renumber +x5B94 equ #5B94 ;2 новый номер строки начала при перенумерации +x5B96 equ #5B96 ;2 приращение номера строки для перенумерации +x5B98 equ #5B98 ;8 STRIP1 +x5BA0 equ #5BA0 ;8 STRIP2 +x5BA8 equ #5BA8 ;стэк +x5BFF equ #5BFF ;вершина стэка + +;Ram7. +;#EC0C - 1 номер текущей опции меню basic128 +;#EC0D - 1 флаги +; 1,=1 текущее меню: основное меню basic128 +;#EC0E - 1 ??? +;#EC0F - 2 постоянные атрибуты экрана для 128 TR-DOS +;#EC11 - 2 временные атрибуты экрана для 128 TR-DOS +;#EC13 - 1 параметры вывода на экран для 128 TR-DOS +;#F6EC - 2 адрес списка опций меню + +Rom1.x0010 equ #0010 ;печать символа из A +Rom1.x0013 equ #0013 ;адрес с байтом #FF в rom 1 +Rom1.x0018 equ #0018 ;чтение очередного символа строки программы +Rom1.x0020 equ #0020 ;чтение следующего символа строки программы +Rom1.x0028 equ #0028 ;вызов калькулятора +Rom1.x0030 equ #0030 ;резервирование памяти +Rom1.x0038 equ #0038 ;обработчик прерываний +Rom1.x0095 equ #0095 ;токены бейсика +Rom1.x03B5 equ #03B5 ;beep +Rom1.x0761 equ #0761 ;LOAD/MERGE/VERIFY +Rom1.x08CE equ #08CE ;MERGE +Rom1.x0970 equ #0970 ;SAVE +Rom1.x0B52 equ #0B52 ;печать токена +Rom1.x0C0A equ #0C0A ;печать сообщения +Rom1.x0D4D equ #0D4D ;копиравоние атрибутов +Rom1.x0D6B equ #0D6B ;CLS +Rom1.x0D6E equ #0D6E ;открыть канал +Rom1.x0DAF equ #0DAF ;очистить экран +Rom1.x0E88 equ #0E88 ;расчет адреса в атрибутах по координатам +Rom1.x0E9B equ #0E9B ;расчет адреса на экране по координатам +Rom1.x0F85 equ #0F85 ;добавить код в строку +Rom1.x107F equ #107F +Rom1.x1097 equ #1097 ;очистка памяти +Rom1.x10DB equ #10DB ;обработка кода клавиши +Rom1.x1303 equ #1303 ;основной цикл basic 48 +Rom1.x1391 equ #1391 +Rom1.x1536 equ #1536 +Rom1.x15EF equ #15EF ;печать символа из a +Rom1.x1601 equ #1601 ;открыть канал +Rom1.x1615 equ #1615 ;установка флагов канала (возврат предыдущего канала) +Rom1.x1655 equ #1655 ;резервирование места (длина в bc) +Rom1.x1661 equ #1661 ;lddr, ret +Rom1.x1664 equ #1664 ;обновление системных переменных +Rom1.x1695 equ #1695 ;получить адрес первой строки программы +Rom1.x16B0 equ #16B0 ;очистка различных областей памяти +Rom1.x16BF equ #16BF ;очистка рабочего буфера +Rom1.x16C5 equ #16C5 ;восстановление стэка +Rom1.x1825 equ #1825 ;LIST-5 +Rom1.x18B6 equ #18B6 ;пропуск натурального числа +Rom1.x196E equ #196E ;получить начальный адрес строки программы +Rom1.x198B equ #198B ;поиск команды в строке +Rom1.x19B8 equ #19B8 ;поиск адрес начала следующей строки программы +Rom1.x19E5 equ #19E5 ;удалить переменные +Rom1.x19E8 equ #19E8 ;удалить массив DIM +Rom1.x19FB equ #19FB ;получить номер редактиремой строки +Rom1.x1A1B equ #1A1B ;печать номера строки +Rom1.x1C1F equ #1C1F ;обработка класса #01 +Rom1.x1C56 equ #1C56 ;полкчить значение параметра +Rom1.x1C6C equ #1C6C ;FOR i +Rom1.x1C7A equ #1C7A ;получение двух значений +Rom1.x1C82 equ #1C82 ;получение числового значения +Rom1.x1C8C equ #1C8C ;параметр - строка +Rom1.x1CBE equ #1CBE ;установка необязательных атрибутов для печати +Rom1.x1CDE equ #1CDE ;получение параметра-числа +Rom1.x1CE6 equ #1CE6 ;ноль на стэк калькулятора +Rom1.x1D16 equ #1D16 ; +Rom1.x1D86 equ #1D86 ;поиск оператора +Rom1.x1E39 equ #1E39 ;проверить инструкцию DATA или DEF FN +Rom1.x1E45 equ #1E45 +Rom1.x1E67 equ #1E67 ;команда GO TO +Rom1.x1E99 equ #1E99 ;извлечь операнд +Rom1.x1F05 equ #1F05 ;проверка наличия свободной памяти +Rom1.x1FDF equ #1FDF ;PRINT_2 +Rom1.x2048 equ #2048 ;PR-ST-END +Rom1.x2070 equ #2070 ;нужно ли изменять поток? +Rom1.x20A0 equ #20A0 ;ввод с клавиатуры +Rom1.x20C1 equ #20C1 ;ввод данных по input +Rom1.x21FC equ #21FC ;изменение временных атрибутов +Rom1.x22AA equ #22AA ;рассчитать адрес на экране по координатам +Rom1.x22E9 equ #22E9 ;печать точки +Rom1.x232D equ #232D ;печать окружности +Rom1.x2394 equ #2394 ;печать линии +Rom1.x2477 equ #2477 ;печать линии +Rom1.x24FB equ #24FB ;ищем следующее выражение +Rom1.x2530 equ #2530 ;проверка флага проверка/исполнение программы +Rom1.x28B2 equ #28B2 ;LOOK-VARS +Rom1.x2996 equ #2996 ;проверкае синтаксиса выражения, заключенного в скобки +Rom1.x2BF1 equ #2BF1 ;прочитать значение со стэка калькулятора +Rom1.x2C15 equ #2C15 ;D-RUN +Rom1.x2C8D equ #2C8D ;это буква? +Rom1.x2D1B equ #2D1B ;это цифра? +Rom1.x2D2B equ #2D2B ;bc на стэк калькулятора +Rom1.x2DA2 equ #2DA2 ;извлечь значение со стэка калькулятора +Rom1.x2DE3 equ #2DE3 ;печать числа с плавающей точкой +Rom1.x30A9 equ #30A9 ;hl=hl*de +Rom1.x33B4 equ #33B4 ;поместить число на смэк калькулятора +Rom1.x34E9 equ #34E9 ;проверка значения на ноль +Rom1.x3B01 equ #3B01 ; +Rom1.x3C04 equ #3C04 ;проверка Break и вызов теста экрана + +Rom1.x03F8 equ #03F8 ; BEEP routine in ROM 1. +;Rom1.x0D6B equ #0D6B ; CLS routine in ROM 1 +Rom1.x16E5 equ #16E5 ; CLOSE # routine in ROM 1 +Rom1.x1736 equ #1736 ; OPEN # routine in ROM 1 +Rom1.x1A0D equ #1A0D ; CLEAR routine in ROM 0 +Rom1.x1CEE equ #1CEE ; STOP routine in ROM 1 +Rom1.x1DAB equ #1DAB ; NEXT routine in ROM 1 +Rom1.x1E42 equ #1E42 ; RESTORE routine in ROM 1 +Rom1.x1E4F equ #1E4F ; RANDOMIZE routine in ROM 1 +Rom1.x1E5F equ #1E5F ; CONTINUE routine in ROM 1 +;Rom1.x1E67 equ #1E67 ; GO TO routine in ROM 1 +Rom1.x1E7A equ #1E7A ; OUT routine in ROM 1 +Rom1.x1E80 equ #1E80 ; POKE routine in ROM 1 +Rom1.x1F3A equ #1F3A ; PAUSE routine in ROM 1 +Rom1.x2294 equ #2294 ; BORDER routine in ROM 1 +Rom1.x22DC equ #22DC ; PLOT routine in ROM 1 + + + +;#0000 включение компьютера/"холодный" старт +;#0004 вход в монитор NMI/rst 8 +;#0008 rst #08 вызов функции монитора +;#000D возврат из монитора +;#0010 rst #10 печать символа из A +;#0014 rst #08 вызов функции монитора +;#0018 чтение очередного символа строки программы +;#001C переход в rom2 при ресете +;#0020 получение следующего символа из бейсик программы +;#0024 переход в rom2 при rst #08 +;#0028 вызов процедуры из basic 48k +;#0038 обработчик прерываний +;#004A обработчик ошибок basic 128 +;#005C вызов процедуры (продолжение rst #28) +;#006B п/п переключения страниц rom0/1 копируется (адрес x5B00) +;#007F сюда возврат после отработки п/п по rst #28 (=#5B14) +;#0088 обработчик ошибок basic 128k +;#009A ввод из канала "P" +;#009F вывод в канал "P" +;#00B5 выход из процедуры ввода/вывода в канал "P" (включение предыдущего rom basic48/128) +;#00C3 обработчик ошибок basic 128k +;#00C7 вход из монитора после "холодного старта" +;#00ED вход из монитора после "теплого старта" +;#0100 !!!NOT USED!!! керналь процедур +;#0131 ошбка проверки памяти (битая память) +;#0137 инициализация переменных и печать меню 128k +;#019D команда NEW +;#026B выполненение введенной строки +;#02BA сюда возвращаемся после проверки синтаксиса бейсика +;#0321 обработчик ошибок +;#03EF обработчик ошибок +;#03F7 вставка строки программы +;#046C адреса сообщений об ошибках +;#048C сообщения об ошибках +;#057D печать строки из de +;#0589 информация о каналах +;#059E информация о потоках +;#05AC обработка ошибки +;#05D6 проверка нажатия break и печать сообщения +;#05E6 RS232 ввод и вывод +;#0641 команда FORMAT +;#06D8 процедура ввода из RS232 +;#06E5 чтение байта из RS232 +;#07CA процедура вывода в RS232 +;#0822 перевод строки на принтере +;#082B !!!NOT USED!!! взврат каретки на принтере +;#0830 продолжение x07CA процедура вывода в RS232 +;#08A3 передача байта на принтер +;#08B1 rst #08 вызов функции монитора +;#08D1 включение компьютера/"холодный" старт +;#08E1 !!!NOT USED!!! вход куда-то +;#08EE возврат из x08A3 +;#08F0 команда COPY +;#0915 печать половины строки +;#095F передача на принтер управляющего кода +;#096D проверить пиксель на экране +;#0979 управляющие коды принтера Epson +;#0985 команда PLAY +;!!!not used!!! #0E89 чтение регистра AY +;#0E93 гасим звуки во всех каналах +;#11EB команда SAVE +;#11F2 команда LOAD +;#11F2 команда VERIFY +;#1200 команда MERGE +;#1219 ошибка C Nonsense in BASIC +;#121D работа с RAM диском +;#137E загрузка данных с RAM диска +;#1385 получить выражения из строки бейсика +;#1393 проверка и копирование имени файла +;#13BE работа с лентой/RAM диском +;#152F печать бейсик программы от текущей строки +;#1630 очистка окна редактирования +;#1639 сдвиг всех строк в буфере редактирования верх и обновление экрана +;#1648 сдвиг всех строк в буфере редактирования верх и обновление экрана +;#166F сдвиг всех строк в буфер редактирования вниз с обновлением экрана +;#1675 сдвиг всех строк в буфер редактирования вниз с обновлением экрана +;#16AC вставка символа в строку буфера редактирования +;#16C1 вставка символа в строку буфера редактирования со сдвигом влево +;#16DC смещения до параметров команды +;#170E синтаксические параметры команд (аналогично basic 48 #1A7A) +;#17AF анализ и выполнение бейсик программы +;#18B5 таблица смещений до процедур обработки класса оператора +;#18C4 процедуры обработки классов +;#1967 процедуры обработки команд бейсика +;#1AF1 пункт меню Tape Loader +;#1B11 анализ и выполненение введенной строки +;#1B14 пункт меню редактора Print (печать на принтер) +;#1B2B команда SPECTRUM +;#1B47 пунт меню BASIC 48. включение basic48, блокировка #7FFD и переход на адрес #0000 +;#1B4A включение basic48, блокировка #7FFD и переход на адрес в hl +;#1B53 установка канала 'P' +;#1B6E данные для команды LOAD "" +;#1B71 команда LIST +;#1B75 команда LIST +;#1BAD команда RAM disk SAVE! +;#1BE5 команда RAM disk CAT! +;#1C0C команда RAM disk EARSE! +;#1C2E загрузка заголовка файла из RAM диска +;#1C4B загрузка из RAM диска +;#1C64 включение логической страницы в A +;#1C87 сравнение имени файла с заданным +;#1C97 создание новой записи в каталоге RAM-диска +;#1CF3 коррекция сводного места на RAM диске +;#1D12 поиск имени файла в каталоге +;#1D35 поиск файла на RAM диске +;#1D56 обновление записи каталога +;#1DAC сохранение данных на RAM диске +;#1E37 загрузка данных с RAM диска +;#1ECF !!!NOT USED!!! запись данных в RAM 7 +;#1F04 !!!NOT USED!!! чтение данных из RAM 7 +;#1F20 установка другого стэка и ram 0 +;#1F3A включение страницы ram +;#1F45 установка другого стэка и ram 7 +;#1F5F удаление файла из RAM диска +;#20D2 печать каталога RAM диска +;#2135 печать одной записи каталога RAM диска +;#2174 команда LPRINT +;#2178 команда PRINT +;#218C команда INPUT +;#21A7 команда COPY +;#21AA команда NEW +;#21AE команда CIRCLE +;#21BE команда DRAW +;#21D5 команда DIM +;#21EF очистка экрана +;#21F8 вычисличть числовое выражение +;#226F обработка нажатой клавиши +;#228E поиск начала бейсик команды +;#2297 проверка это команда LET? (калькулятор basic 128) +;#22AB проверка это оператор? +;#22BD список токенов операторов +;#22CB проверка это токен? +;#22E0 проверка это число или функция +;#230A проверка это цифра или нет +;#2317 команда PLAY +;#2336 !!!NOT USED!!! возврат в редактор +;#2342 !!!NOT USED!!! bc=hl-de +;#234A !!!NOT USED!!! зарезервировать память на 1 байт +;#2358 !!!NOT USED!!! проверка доступности места в памяти размером в bc +;#236F !!!NOT USED!!! hl=a*#20 +;#2371 !!!NOT USED!!! hl=a*#08 +;#2378 !!!NOT USED!!! расчет свободного места +;#2384 !!!NOT USED!!! печать на экране строки из буфера +;#23B8 !!!NOT USED!!! печать в буфере #FF +;#23CB !!!NOT USED!!! копирование буфера на экран +;#23E1 !!!NOT USED!!! печать символов из буфера на экране +;#2456 !!!NOT USED!!! переключение страниц rom 0/1 +;#2464 !!!NOT USED!!! переключение страниц rom 0/1 +;#246F !!!NOT USED!!! копирование п/п в ram 7 +;#2488 !!!NOT USED!!! установка атрибутов из буфера экрана +;#249B !!!NOT USED!!! установка атрибутов из буфера экрана +;#2513 !!!NOT USED!!! поменять местами ink и paper +;#2537 таблица адресов обработки нажатий в режиме редактирования +;#2577 таблица адресов обработки нажатий в основном меню basic 128k +;#2584 подготовка переменных +;#259F печать главного меню basic 128 и выбор опции +;#25CB возврат в редактор/калькулятор/меню после обработки ошибки +;#2653 основной цикл в basic128/калькулятор +;#2669 обработка нажатия клавиши +;#269B ext+ss+8/Graph+Z переключение между редактированием внизу и вверху +;#26BB выбор нижнего экрана +;#26CE выбор верхнего экрана +;#26E7 звуковой сигнал +;#26EC звуковой сигнал +;#26FA звуковой сигнал +;#2704 cs+1 вызов меню +;#2717 нажатие cs+1/enter в главном меню +;#272E курсор вверх в главном меню +;#2731 курсор вниз в главном меню +;#2744 адреса процедур обработки опций основного меню basic 128k +;#2754 текст основного меню basic 128k +;#278D !!!NOT USED!!! +;#2790 адреса процедур обработки опций меню в редакторе basic 128 +;#27A0 текст меню в редакторе basic 128 +;#27CB адреса процедур обработки опций меню в калькуляторе +;#27D2 текст меню в калькуляторе +;#27EB !!!NOT USED!!! +;#2811 смена области редактирования низ/верх +;#2816 выбор опции 128 TR-DOS +;#281С выход из редактора/калькулятора в главное меню +;#2831 выбор опции 48 TR-DOS (вход в Tr-Dos 48k) +;#283E !!!NOT USED!!! +;#2851 перенумерация строк программы +;#2862 печать программы на принтере +;#286C выбор опции 128 BASIC +;#2885 выбор опции калькулятор +;#28BE инициализация курсора для верхнего окна +;#28C7 возврат в главное меню +;#28DF инициализация настроек нижнего окна +;#28E8 инициализация настроек верхнего окна +;#28F1 обработка нажатия символьной клавиши +;#291B ext+ss+K удаление символа справа от курсора +;#292B delete удаление символа слева от курсора +;#2944 enter ввод строки +;#2983 ext+N/Graph+W переход к первой строке бейсик программы +;#29AB ext+T/Graph+V переход к последней строке бейсик программы +;#29D4 ext+I переход к началу текущего слова +;#29E1 ext+shift+J переход к началу следующего слова +;#29EC удаление курсора, восстановление атрибутов +;#29F2 напечатать курсор +;#29F8 напечатать курсор +;#2A07 получение позиции курсора +;#2A11 сохранить позицию курсора +;#2A1A получение текущего символа в буфере редактирования +;#2A25 ss+I перемещение курсора вниз на 10 строк в поле редактирования +;#2A4F ext+P перемещение курсора вверх на 10 строк в поле редактирования +;#2A7A ext+M/graph+X перемещение курсора в конец строки в поле редактирования +;#2A87 ext+ss+2/Graph+Y переход к началу строки редактирования +;#2A94 перемещение курсора вверх в поле редактирования +;#2AB5 перемещение курсора вниз в поле редактирования +;#2AD7 перемещение курсора влево в поле редактирования +;#2AE3 перемещение курсора вправо в поле редактирования +;#2AF9 найти в строке ближайшую редактируемую позицию +;#2B02 найти в строке ближайшую редактируемую позицию +;#2B0B вставить строку бейсик программы, если требуется сдвинуть строки в буфере вниз и обновить эекран +;#2B30 вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран +;#2B5B поиск редактируемой позиции слева от курсора во всем буфере +;#2B78 поиск редактируемой позиции справа от курсора во всем буфере +;#2BD4 поиск редактируемого символа в строке справа от курсора +;#2BDF поиск в строке влево от курсора редактируемого символа +;#2BEA поиск начала слова слева от курсора +;#2C09 поиск начала слова справа от курсора +;#2C31 поиск начала строки редактирования в буфере +;#2C4C поиск конца строки в буфере редактирования +;#2C68 вставить строку бейсик программы, если были изменения +;#2C7C вставить строку в бейсик программу, если были изменения +;#2C8E вставить строку бейсик программы +;#2D54 получить очередной символ из строки бейсик программы +;#2D8F получить символ из текущей позиции курсора в буфере редактирования +;#2E0E получить символ из строки буфера редактирования +;#2E1F сброс верхнего окна редактирования +;#2E2D сброс нижнего окна редактирования +;#2E41 поиск в строке вправо от курсора редактируемого символа +;#2E63 поиск в строке влево от курсора редактируемого символа +;#2E7B чтение символа из буфера редактирования +;#2E81 вставка символа в буфер редактирования +;#2ECE вставка пустой строки в буфер редактирования +;#2ED3 вставка пустой строки в буфер редактирования +;#2F12 удаление символа в строке в буфере редактирования +;#2F80 сдвиг строк вверх в буфере при удалении строки +;#2FBC ext+E удаление символов от курсора до начала текущего слова +;#3017 ext+W удаление символов от курсора до начала следующего слова +;#303E ext+K удаление символов до наала строки +;#3072 ext+J удаление символов до конца строки +;#3084 удаление курсора и запрет на обновление экрана +;#3095 проверка наличия предыдущего символа в буфере +;#30B4 расчет адреса начала строки в буфере редактирования +;#30C6 !!!NOT USED!!! +;#30D0 параметры для установки буфера редактирования строки внизу экрана +;#30D6 установка буфера редактирования внизу экрана +;#30DF сдвиг строк в буфере редактирования вверх +;#311E сдвиг строк в буфере редактирования вниз +;#316E вставка символа в нижний буфер редактирования +;#31C3 расчет адреса начала строки в буфере редактирования +;#31C9 удаление символа в нижнем буфере редактирования +;#321E параметры для установки буфера редактирования строки вверху экрана +;#3222 установка буфера редактирования в верху экрана +;#322B перемещение курсора вверх в верхнем буфере редактирования +;#326A копирование строки бейсик программы в буфер редактирования вверзу экрана +;#32B7 расчет адреса начала строки в буфере редактирования +;#32BD таблица обработки управляющих кодов при редактировании строки +;#32D6 копирование строки программы в буфер редактирования +;#3331 перенос части строки на следующую строку +;#334A поиск адреса строки бейсик программы +;#3352 преобразование номера строки в ASCII и помещение в буфер +;#335A преобразование токена в текст +;#335F копирование процедур в ram +;#3374 копирование токена в буфер токенов (=#FCAE) +;#33C3 копирование токена (=#FCFD) +;#33F4 распознавание токена (=#FD2E) +;#3430 преобразование номера строки в ASCII и помещение в буфер +;#3495 выделение разряда числа и занесение его в буфер +;#34B6 поиск адрес строки программы с заданным номером или следущей строки, если строка с заданным номером не существует +;#34CF расчет адреса следущей строки бейсик программы +;#34D9 проверка на конец бейсик программы +;#34E0 сравнение номера строки с заданным +;#34EA обнуление указателей в бейсик строке +;#34F6 поиск адрес строки бейсик программы в памяти +;#3517 преобразование токена в текст +;#3594 токены basic128 +;#35BC установка параметров отступа +;#35C5 сохранить символ в указанном столбце текущей строки буфера редактирования +;#35CC процедура обработки нажатия 'enter' в строке +;#35DA процедура обработки зануления до конца строки +;#35E6 зануление до конца строки в буфере редактирования +;#35F4 создание отступа в строке в буфере редактирования +;#3604 печать строки редактируемого буфера, при необходимости +;#3618 сдвиг вверх строк в буфере редактирования при необходимости +;#362C сдвиг вниз строк в буфере редактирования при необходимости +;#3640 печать атрибутов курсора +;#364F восстановление атрибутов под курсором +;#365E установка переменных для ввода символа +;#367F ожидание нажатия клавиши +;#36A8 печать меню basic 128k +;#3719 печать одной линии вокруг меню +;#372B установка координат печати из bc +;#3733 печать строки из hl +;#373B сохранение окна экрана 14*12 в буфере +;#373E восстановление окна экрана 14*12 из буфера +;#377E сохранение/восстановление 14 знакомест экана в буфере +;#37A7 клавиша вверх в меню basic128 +;#37B6 клавиша вниз в меню basic128 +;#37CA инвертирование атрибутов опции меню +;#37EC управляющие коды для печати меню +;#37FA управляющие коды для печати меню +;#3802 данные потоков для печати эмблемы +;#3812 управляющие коды для печати косых полос в меню +;#3822 печать эмблемы ZX (косые цветные полосы) в меню +;#3848 печать информационной строки 128 BASIC +;#384D печать информационной строки Calculator +;#3852 печать информационной строки 48 TR-DOS +;#3857 печать информационной строки 128 TR-DOS +;#3881 очистка двух нижних строк экрана +;#3888 перенумерация строк программы +;#390E анализ строки и перенумерование ссылок на номера строк +;#3A05 подсчет количества строк в бейсик программе +;#3A35 пропуск пробелов в строке +;#3A3C номер строки в ASCII +;#3A60 получить один разря числа в ASCII +;#3A7F установка настроек курсора для верхнего окна +;#3A88 установка настроек курсора для нижнего окна +;#3A91 !!!NOT USED!!! +;#3A96 сохранить атрибуты курсора +;#3A9D печать атрибутов курсора +;#3AB2 восстановление атрибутов под курсором +;#3ABF сдвиг вверх строк в буфере редактирования +;#3AC6 сдвиг вниз строк в буфере редактирования +;#3B1E печать строки редактируемого буфера +;#3B5E очистка строк экрана +;#3B94 расчет количества строк и столцов до конца экрана +;#3B98 расчет количества строк от заданной до низа экрана +;#3BA0 расчет адреса атрибутов +;#3BB8 обмен атрибутов basic 128 с основными атрибутами +;#3BE9 запуск команды randomize 15619: rem: load "boot" +;#3C1C !!!NOT USED!!! копирование и выполненение бейсик строки +;#3C20 !!!NOT USED!!! бейсик строка +;#3C35 возврат из монтора +;#3C4A !!!NOT USED!!! вход в монитор (продолжение x08E1) +;#3C56 пауза 25 фреймов +;#3C63 токенизация строки бейсик программы с синтаксической ошибкой +;#3C67 токенизация строки бейсик программы +;#3D9D получить очередной символ из строки бейсик программы и определить его тип +;#3DC6 проверка символа на принадлежность к буквам нижнего регистра +;#3DCD копирование слова из буфера в строку бейсик программы +;#3DE9 вставить символ в буфер редактирования +;#3E16 вставка символа в сроку бейсик программы с обработкой < и > +;#3E64 вставка символа в сроку бейсик программы с обработко REM и кавычек +;#3E9C вставка символа в сроку бейсик программы с игнорированием пробелов +;#3EFB вставка символа в сроку бейсик программы +;#3F66 проверка наличия свободного места в памяти +;#3F7E распознавание токена +;#3FBA копирование строки из hl в de в (hl+0) кол-во байт +;#3FC3 !!!NOT USED!!! преобразование ASCII в цифру +;#3FCE обработка нажатой управляющей клавиши +;#3FEE вызов call (hl) +;#3FEF инициалы программистов +;#4000 + + + + +;АДРЕС: #0000 включение компьютера/"холодный" старт +x0000 di + jp x08D1 + +;АДРЕС: #0004 вход в монитор +x0004 out (c),a + nop + nop + +;АДРЕС: #0008 rst #08 вызов функции монитора +x0008 jp x0014 + nop + nop + +;АДРЕС: #000D возврат из монитора +x000D jp x3C35 + +;АДРЕС: #0010 rst #10 печать символа из A +x0010 rst #28 ;вызов п/п из basic 48k + dw Rom1.x0010 + ret + +;АДРЕС: #0014 rst #08 вызов функции монитора +x0014 jp x08B1 + nop + +;АДРЕС: #0018 чтение очередного символа строки программы +x0018 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0018 + ret + +;АДРЕС: #001C переход в rom2 при ресете +x001C out (c),a + nop + nop + +;АДРЕС: #0020 получение следующего символа из бейсик программы +x0020 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0020 + ret + +;АДРЕС: #0024 переход в rom2 при rst #08 +x0024 out (c),a + nop + nop + +;АДРЕС: #0028 вызов процедуры из basic 48k +x0028 ex (sp),hl + push af + ld a,(hl) + inc hl + inc hl + ld (x5B5A),hl + dec hl + ld h,(hl) + ld l,a + pop af + jp x005C + nop ;not use + +;АДРЕС: #0038 обработчик прерываний +x0038 push hl + ld hl,x0048 + push hl + ld hl,x5B00 + push hl + ld hl,Rom1.x0038 + push hl + jp x5B00 +x0048 pop hl + ret + +;АДРЕС: #004A обработчик ошибок basic 128 +x004A ld bc,#7FFD + xor a + di + out (c),a ;rom 0(128k), ram 0, scr 5, 128k + ld (x5B5C),a + ei + dec a + ld (iy+#00),a ;no error + jp x0321 + +;АДРЕС: #005C вызов процедуры (продолжение rst #28) +x005C ld (x5B58),hl + ld hl,x5B14 + ex (sp),hl + push hl + ld hl,(x5B58) + ex (sp),hl + jp x5B00 + +;АДРЕС: #006B п/п переключения страниц rom0/1 копируется в адрес x5B00 +x006B push af + push bc + ld bc,#7FFD + ld a,(x5B5C) + xor #10 + di + ld (x5B5C),a + out (c),a + ei + pop bc + pop af + ret +;АДРЕС: #007F сюда возврат после отработки п/п по rst #28 (=#5B14) +x007F call x5B00 + push hl + ld hl,(x5B5A) ;адрес возврата в процедуру при вызове rst #28 + ex (sp),hl + ret +;АДРЕС: #0088 обработчик ошибок basic 128k +x0088 di + ld a,(x5B5C) + and #EF + ld (x5B5C),a + ld bc,#7FFD + out (c),a + ei + jp x00C3 +;АДРЕС: #009A ввод из канала "P" +x009A ld hl,x06D8 + jr x00A2 +;АДРЕС: #009F вывод в канал "P" +x009F ld hl,x07CA +x00A2 ex af,af' + ld bc,#7FFD + ld a,(x5B5C) + push af + and #EF + di + ld (x5B5C),a + out (c),a + jp x05E6 ;RS232 ввод и вывод +;АДРЕС: #00B5 выход из процедуры ввода/вывода в канал "P" +; (включение предыдущего rom basic48/128) +x00B5 ex af,af' + pop af + ld bc,#7FFD + di + ld (x5B5C),a + out (c),a + ei + ex af,af' + ret + +;АДРЕС: #00C3 обработчик ошибок basic 128k +x00C3 ld hl,(#5B8B) + jp (hl) + +;АДРЕС: #00C7 вход из монитора после "холодного старта" +x00C7 ld b,#08 +x00C9 ld a,b ;проверка и зануление всех страниц[0..7] памяти + exx + dec a + ld bc,#7FFD + out (c),a + ld hl,#C000 + ld de,#C001 + ld bc,#3FFF + ld a,#FF + ld (hl),a + cp (hl) + jr nz,x0131 ;битая память + xor a + ld (hl),a + cp (hl) + jr nz,x0131 ;битая память + ldir + exx + djnz x00C9 + ld (x5B88),a + +;АДРЕС: #00ED вход из монитора после "теплого старта" +x00ED ld c,#FD + ld d,#FF + ld e,#BF + ld b,d + ld a,#0E ;регистр AY #0E + out (c),a ;bc=#FFFD + ld b,e ;bc=#BFFD + ld a,#FF + out (c),a + jr x0137 +x00FF nop ;not used + +;АДРЕС: #0100 !!!NOT USED!!! керналь процедур +x0100 jp x17AF ;парсер бейсик программы + jp x1838 ;выполнение команды из строки редактирования + jp x1ECF ;запись данных в RAM 7 + jp x1F04 ;чтение данных из RAM 7 + jp x004A ;обработчик ошибок basic 128 + jp x03A2 ;обработчик ошибок + jp x182A ;RETURN + jp x18A8 ;NEXT + jp x012D ;опрос клавиатуры + jp x0A05 ;команда PLAY + jp x11A3 ;загрузка байта в порт MIDI + jp x06D8 ;процедура ввода из RS232 + jp x07CA ;процедура вывода в RS232 + jp x08A3 ;передача байта на принтер + jp x08F0 ;команда COPY +x012D rst #28 ;вызов процедуры из basic 48k + dw Rom1.x3B01 ;опрос клавиатуры + ret + +;АДРЕС: #0131 ошбка проверки памяти (битая память) +x0131 exx + ld a,b + out (#FE),a + jr $ + +;АДРЕС: #0137 инициализация переменных и печать меню 128k +; de=#FFBF +; c=#FD +x0137 ld b,d ;установка регистра #07 AY + ld a,#07 + out (c),a + ld b,e + ld a,#FF + out (c),a ;выключим звук в AY + ld de,#5B00 + ld hl,x006B ;п/п переключения страниц памяти + ld bc,#0058 + ldir + ld a,#CF ;обработчик ошибок basic 48 + ld (x5B5D),a + ld sp,#5BFF + ld a,#04 + call x1C64 ;включим ram 7 + ld ix,#EBEC ;адрес начала каталога rom-disk + ld (x5B83),ix + ld (ix+#0A),#00 + ld (ix+#0B),#C0 + ld (ix+#0C),#00 + ld hl,#2BEC ;свободное место на rom-disk + ld a,#01 + ld (x5B85),hl + ld (x5B85+2),a + ld a,#05 ;ram 0 + call x1C64 + ld hl,#FFFF ;адрес последнего байта физического ОЗУ + ld (#5CB4),hl + ld de,#3D00+#01AF ;адрес последнего байта символа "U" в basic 48 + ld bc,#00A8 ;копирование символов шрифта [A..U] + ex de,hl + rst #28 ;вызов п/п из basic 48k + dw Rom1.x1661 ;lddr, ret + ex de,hl + inc hl + ld (#5C7B),hl ;адрес начала определяемых пользователем символов + dec hl + ld bc,#0040 + ld (#5C38),bc + ld (#5CB2),hl ;последний адрес в ОЗУ разрешенный для basic + +;АДРЕС: #019D команда NEW +x019D ld hl,#3D00-#100 ;адрес символьного набора + ld (#5C36),hl + ld hl,(#5CB2) ;Последний адрес в ОЗУ, разрешенный к использованию интерпретатором Бейсика + inc hl + ld sp,hl + im 1 + ld iy,#5C3A + set 4,(iy+#01) ;режим 128k + ei + ld hl,#000B + ld (x5B5F),hl ;скорость принтера 9600 бод + xor a + ld (x5B61),a + ld (x5B63),a + ld (x5B65),a + ld hl,#EC00 ;!!!ОШИБКА!!! должно писаться в rqm 7 + ld (#FF24),hl + ld a,#50 ;ширна печати 80 символов + ld (x5B64),a + ld hl,#000A + ld (x5B94),hl + ld (x5B96),hl + ld hl,#5CB6 ;копируем нформацию о каналах + ld (#5C4F),hl + ld de,x0589 + ld bc,#0015 + ex de,hl + ldir + ex de,hl + dec hl + ld (#5C57),hl ;Адрес начала следующей строки бейсик-программы + inc hl + ld (#5C53),hl ;Адрес начала бейсик-программы + ld (#5C4B),hl ;Адрес начала области переменных бейсик-программы + ld (hl),#80 ;признак конца переменных бейсика + inc hl + ld (#5C59),hl ;Адрес начала редактируемой строки + ld (hl),#0D + inc hl + ld (hl),#80 + inc hl + ld (#5C61),hl ;Адрес начала рабочей области бейсик-программы + ld (#5C63),hl ;Адрес начала стека калькулятора + ld (#5C65),hl ;Адрес вершины стека калькулятора + ld a,#38 + ld (#5C8D),a ;Постоянные атрибуты экрана + ld (#5C8F),a ;Временные атрибуты, используемые при выводе на экран + ld (#5C48),a ;Атрибуты служебного экрана + xor a + ld (#EC13),a ;!!!ОШИБКА!!! должно писаться в rqm 7 + ld a,#07 + out (#FE),a ;бордюр + ld hl,#0523 ;автоповтор и период задержки + ld (#5C09),hl + dec (iy-#3A) ;x5C00 + dec (iy-#36) ;x5C04 + ld hl,x059E + ld de,#5C10 ;Область хранения информации о потоках + ld bc,#000E + ldir + res 1,(iy+#01) + ld (iy+#00),#FF ;no error + ld (iy+#31),#02 ;Количество строк в служебном экране + rst #28 ;вызов п/п x0D6B из basic 48k + dw Rom1.x0D6B ;CLS + rst #28 ;вызов п/п из basic 48k + dw Rom1.x3C04 ;проверка Break и вызов теста экрана + ld de,x0561 ;1992-94 Scorpion ZS 256 + call x057D ;печать строки из de + ld (iy+#31),#02 ;Количество строк в служебном экране + set 5,(iy+#02) + ld hl,x5BFF + ld (x5B81),hl + call x1F45 ;установка другого стэка и ram 7 + ld a,#38 + ld (#EC11),a + ld (#EC0F),a + call x2584 ;подготовка переменных 2-3,1=%11 + call x1F20 ;установка другого стэка и ram 0 + rst #08 ;вызов функции монитора + db #8C ;нажатие Enter и переход на rom 0: #259F + nop + +;АДРЕС: #026B выполненение введенной строки +x026B ld hl,x5B66 ;флаги + set 0,(hl) ;режим + ld (iy+#00),#FF ;код ошибки + ld (iy+#31),#02 ;количество строк в служебном экране + ld hl,x5B1D ;сюда вернемся при ошибке + push hl + ld (#5C3D),sp + ld hl,x02BA + ld (x5B8B),hl ;сюда вернемся при ошибке + call x228E ;поиск начала бейсик команды + call x22CB ;проверка токена + jp z,x21F8 ;вычисличть числовое выражение + cp "(" + jp z,x21F8 ;вычисличть числовое выражение + cp "-" + jp z,x21F8 ;вычисличть числовое выражение + cp "+" + jp z,x21F8 ;вычисличть числовое выражение + call x22E0 ;проверка это число или функция + jp z,x21F8 ;вычисличть числовое выражение + call x1F45 ;установка другого стэка и ram 7 + ld a,(#EC0E) + call x1F20 ;установка другого стэка и ram 0 + cp #04 + jp nz,x17AF ;анализ и выполнение программы + call x2297 ;проверка это команда LET? (калькулятор basic 128) + jp z,x17AF ;анализ и выполнение программы + pop hl + ret + +;АДРЕС: #02BA сюда возвращаемся после проверки синтаксиса бейсика +x02BA bit 7,(iy+#00) + jr nz,x02C1 + ret ;ошибок не было +x02C1 ld hl,(#5C59) + ld (#5C5D),hl + rst #28 + dw Rom1.x19FB ;получить номер редактиремой строки + ld a,b + or c + jp nz,x03F7 + rst #18 ;чтение очередного символа строки программы + cp #0D + ret z + call x21EF ;очистка экрана + bit 6,(iy+#02) + jr nz,x02DF + rst #28 + dw Rom1.x0D6E ;открыть канал +x02DF res 6,(iy+#02) + call x1F45 ;установка другого стэка и ram 7 + ld hl,#EC0D + bit 6,(hl) + jr nz,x02F4 + inc hl + ld a,(hl) + cp #00 + call z,x3881 ;очистка двух нижних строк экрана +x02F4 call x1F20 ;установка другого стэка и ram 0 + ld hl,#5C3C + res 3,(hl) + ld a,#19 + sub (iy+#4F) + ld (#5C8C),a + set 7,(iy+#01) + ld (iy+#0A),#01 ;!!!ОШИБКА!!! + ld hl,#3E00 + push hl + ld hl,x5B1D + push hl + ld (#5C3D),sp + ld hl,x0321 + ld (x5B8B),hl + jp x1838 ;выполнение команды из строки редактирования + +;АДРЕС: #0321 обработчик ошибок +x0321 ld sp,(#5CB2) + inc sp + ld hl,x5BFF + ld (x5B81),hl + halt + res 5,(iy+#01) + ld hl,x5B66 + bit 2,(hl) + jr z,x034A + call x1F45 ;установка другого стэка и ram 7 + ld ix,(x5B83) + ld bc,#0014 + add ix,bc + call x1D56 ;обновление записи каталога + call x1F20 ;установка другого стэка и ram 0 +x034A ld a,(#5C3A) + inc a +x034E push af + ld hl,#0000 + ld (iy+#37),h + ld (iy+#26),h + ld (#5C0B),hl + ld hl,#0001 + ld (#5C16),hl + rst #28 + dw Rom1.x16B0 ;очистка различных областей памяти + res 5,(iy+#37) + rst #28 + dw Rom1.x0D6E ;открыть канал + set 5,(iy+#02) + pop af + ld b,a + cp #0A + jr c,x037F + cp #1D + jr c,x037D + add a,#14 + jr x037F +x037D add a,#07 +x037F rst #28 + dw Rom1.x15EF ;печать символа из a + ld a," " + rst #10 + ld a,b + cp #1D + jr c,x039C + sub #1D + ld b,#00 + ld c,a + ld hl,x046C + add hl,bc + add hl,bc + ld e,(hl) + inc hl + ld d,(hl) + call x057D ;печать строки из de + jr x03A2 +x039C ld de,Rom1.x1391 + rst #28 + dw Rom1.x0C0A ;печать сообщения +x03A2 xor a + ld de,Rom1.x1536 + rst #28 + dw Rom1.x0C0A ;печать сообщения + ld bc,(#5C45) + rst #28 + dw Rom1.x1A1B ;печать номера строки + ld a,":" + rst #10 + ld c,(iy+#0D) + ld b,#00 + rst #28 + dw Rom1.x1A1B ;печать номера строки + rst #28 + dw Rom1.x1097 ;очистка памяти + ld a,(#5C3A) + inc a + jr z,x03DF + cp #09 + jr z,x03CC + cp #15 + jr nz,x03CF +x03CC inc (iy+#0D) +x03CF ld bc,#0003 + ld de,#5C70 + ld hl,#5C44 + bit 7,(hl) + jr z,x03DD + add hl,bc +x03DD lddr +x03DF ld (iy+#0A),#FF + res 3,(iy+#01) + ld hl,x5B66 + res 0,(hl) + jp x25CB + +;АДРЕС: #03EF обработчик ошибок +x03EF ld a,#10 + ld bc,#0000 + jp x034E + +;АДРЕС: #03F7 вставка строки программы +x03F7 ld (#5C49),bc + call x1F45 ;установка другого стэка и ram 7 + ld a,b + or c + jr z,x040A + ld (#5C49),bc + ld (#EC08),bc +x040A call x1F20 ;установка другого стэка и ram 0 + ld hl,(#5C5D) + ex de,hl + ld hl,x03EF + push hl + ld hl,(#5C61) + scf + sbc hl,de + push hl + ld h,b + ld l,c + rst #28 + dw Rom1.x196E ;получить начальный адрес строки программы + jr nz,x0429 + rst #28 + dw Rom1.x19B8 ;поиск адрес начала следующей строки программы + rst #28 + dw Rom1.x19E8 ;удалить массив DIM +x0429 pop bc + ld a,c + dec a + or b + jr nz,x0442 + call x1F45 ;установка другого стэка и ram 7 + push hl + ld hl,(#5C49) + call x334A ;поиск адреса строки бейсик программы + ld (#5C49),hl + pop hl + call x1F20 ;установка другого стэка и ram 0 + jr x046A +x0442 push bc + inc bc + inc bc + inc bc + inc bc +x0447 dec hl + ld de,(#5C53) + push de + rst #28 + dw Rom1.x1655 ;резервирование места (длина в bc) + pop hl + ld (#5C53),hl + pop bc + push bc + inc de + ld hl,(#5C61) + dec hl + dec hl + lddr + ld hl,(#5C49) + ex de,hl + pop bc + ld (hl),b + dec hl + ld (hl),c + dec hl + ld (hl),e + dec hl + ld (hl),d +x046A pop af + ret + +;АДРЕС: #046C адреса сообщений об ошибках +x046C dw x048C + dw x0497 + dw x04A6 + dw x04B0 + dw x04C1 + dw x04D4 + dw x04E0 + dw x04E0 + dw x04F3 + dw x0501 + dw x0512 + dw x0523 + dw x0531 + dw x0542 + dw x054E + dw x0561 + +;АДРЕС: #048C сообщения об ошибках +x048C dc "MERGE error" +x0497 dc "Wrong file type" +x04A6 dc "CODE error" +x04B0 dc "Too many brackets" +x04C1 dc "File already exists" +x04D4 dc "Invalid name" +x04E0 dc "File does not exist" +x04F3 dc "Invalid device" +x0501 dc "Invalid baud rate" +x0512 dc "Invalid note name" +x0523 dc "Number too big" +x0531 dc "Note out of range" +x0542 dc "Out of range" +x054E dc "Too many tied notes" +x0561 dc " 1992-94 Scorpion ZS 256 " + +;АДРЕС: #057D печать строки из de +;вх: de - адрес строки для печати +x057D ld a,(de) + and #7F + push de + rst #10 ;печать символа из A + pop de + ld a,(de) + inc de + add a,a + jr nc,x057D + ret + +;АДРЕС: #0589 информация о каналах +x0589 dw #09F4,#10A8: db "K" + dw #09F4,#15C4: db "S" + dw #0F81,#15C4: db "R" + dw x5B34,x5B2F: db "P" + db #80 + +;АДРЕС: #059E информация о потоках +x059E db #01,#00 ; + db #06,#00 + db #0B,#00 + db #01,#00 + db #01,#00 + db #06,#00 + db #10,#00 + +;АДРЕС: #05AC обработка ошибки +x05AC pop hl + ld bc,#7FFD + xor a + di + ld (x5B5C),a + out (c),a ;rom 0, ram 0, scr 5 + ei + ld sp,(#5C3D) + ld a,(hl) ;код ошибки + ld (x5B5E),a ;код сообщения для rst 8 basic48 + inc a + cp #1E ;!!!ОШИБКА!!! должно быть cp #1D + jr nc,x05C8 + rst #28 ;вызов процедуры из basic 48k + dw #5B5D +x05C8 dec a + ld (iy+#00),a ;код ошибки + ld hl,(#5C5D) ;адрес следущего символа в бейсик-программе + ld (#5C5F),hl ;адрес синтаксической ошибки + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x16C5 ;восстановление стэка + ret + +;АДРЕС: #05D6 проверка нажатия break и печать сообщения +x05D6 ld a,#7F +x05D8 in a,(#FE) + rra + ret c ;пробел не нажат + ld a,#FE + in a,(#FE) + rra + ret c ;cs не нажата + call x05AC ;без возврата + db #14 ;L BREAK into program, n:m + +;АДРЕС: #05E6 RS232 ввод и вывод +x05E6 ei + ex af,af' + ld de,x5B4A ;п/п включения предыдущего rom bacic48/128 + push de + res 3,(iy+#02) ;проверка режима вывода не экран не требуется + push hl + ld hl,(#5C3D) ;адрес стэка при запуске обработки ошибок + ld e,(hl) + inc hl + ld d,(hl) + and a + ld hl,Rom1.x107F + sbc hl,de + jr nz,x0637 ;обработчик ошибок в basic128 + pop hl + ld sp,(#5C3D) + pop de + pop de + ld (#5C3D),de +x060A push hl + ld de,x0610 + push de + jp (hl) +x0610 jr c,x061B + jr z,x0618 +x0614 call x05AC ;без возврата + db #07 ;8 End of file, n:m +x0618 pop hl + jr x060A +x061B cp #0D + jr z,x062D + ld hl,(x5B5A) ;адрес возврата в basic128 + push hl + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0F85 ;добавить код в строку + pop hl + ld (x5B5A),hl + pop hl + jr x060A +x062D pop hl + ld a,(x5B5C) + or #10 + push af + jp x5B4A ;включение basic48 +x0637 pop hl + ld de,x063D + push de + jp (hl) +x063D ret c + ret z + jr x0614 + +;АДРЕС: #0641 команда FORMAT +; FORMAT "P";9600 +x0641 rst #28 + dw Rom1.x0018 ;чтение очередного символа строки программы + rst #28 + dw Rom1.x1C8C ;параметр - строка + bit 7,(iy+#01) + jr z,x0661 ;проверка синтаксиса + rst #28 + dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора + ld a,c + dec a + or b + jr z,x0659 ;длина строки 1 байт + call x05AC ;ошибка + db #24 ;i Invalid device +x0659 ld a,(de) + and #DF + cp "P" + jp nz,x1912 ;ошибка C Nonsense in BASIC +x0661 ld hl,(#5C5D) + ld a,(hl) + cp ";" + jp nz,x1912 ;ошибка C Nonsense in BASIC + rst #28 + dw Rom1.x0020 ;чтение следующего символа строки программы +x066D rst #28 + dw Rom1.x1C82 ;получение числового значения + bit 7,(iy+#01) + jr z,x067D ;проверка синтаксиса + rst #28 + dw Rom1.x1E99 ;извлечь операнд + ld (x5B71),bc +x067D rst #28 + dw Rom1.x0018 ;чтение очередного символа строки программы + cp #0D + jr z,x0689 + cp ":" + jp nz,x1912 ;ошибка C Nonsense in BASIC +x0689 call x18A1 + ld bc,(x5B71) + ld a,b + or c + jr nz,x0698 + call x05AC ;ошибка + db #25 ;j invalid baud rate +x0698 ld hl,x06B8 +x069B ld e,(hl) + inc hl + ld d,(hl) + inc hl + ex de,hl + ld a,h + cp #25 + jr nc,x06AF + and a + sbc hl,bc + jr nc,x06AF + ex de,hl + inc hl + inc hl + jr x069B +x06AF ex de,hl + ld e,(hl) + inc hl + ld d,(hl) + ld (x5B5F),de + ret +x06B8 dw #0032,#0AA5 ;Baud=50. + dw #006E,#04D4 ;Baud=110. + dw #012C,#01C3 ;Baud=300. + dw #0258,#00E0 ;Baud=600. + dw #04B0,#006E ;Baud=1200. + dw #0960,#0036 ;Baud=2400. + dw #12C0,#0019 ;Baud=4800. + dw #2580,#000B ;Baud=9600. + +;АДРЕС: #06D8 процедура ввода из RS232 +x06D8 ld hl,x5B61 + ld a,(hl) + and a + jr z,x06E5 + ld (hl),#00 + inc hl + ld a,(hl) + scf + ret + +;АДРЕС: #06E5 чтение байта из RS232 +x06E5 call x05D6 ;проверка нажатия break и печать сообщения + di + exx + ld de,(x5B5F) + ld hl,(x5B5F) + srl h + rr l + or a + ld b,#FA + exx + ld c,#FD + ld d,#FF + ld e,#BF + ld b,d + ld a,#0E + out (c),a ;выбор 14 регистра AY + in a,(c) + or #F0 + and #FB + ld b,e + out (c),a + ld h,a +x070E ld b,d + in a,(c) + and #80 + jr z,x071E ;стартовый бит получен +x0715 exx + dec b + exx + jr nz,x070E + xor a + push af + jr x0757 ;выход по тайиауту +x071E in a,(c) + and #80 + jr nz,x0715 + in a,(c) + and #80 + jr nz,x0715 + exx + ld bc,#FFFD + ld a,#80 + ex af,af' +x0731 add hl,de + nop + nop + nop + nop +x0736 dec hl + ld a,h + or l + jr nz,x0736 + in a,(c) + and #80 + jp z,x074B + ex af,af' + scf + rra + jr c,x0754 + ex af,af' + jp x0731 +x074B ex af,af' + or a + rra + jr c,x0754 + ex af,af' + jp x0731 +x0754 scf + push af + exx +x0757 ld a,h + or #04 + ld b,e + out (c),a + exx + ld h,d + ld l,e + ld bc,#0007 + or a + sbc hl,bc +x0766 dec hl + ld a,h + or l + jr nz,x0766 + ld bc,#FFFD + add hl,de + add hl,de + add hl,de +x0771 in a,(c) + and #80 + jr z,x077F + dec hl + ld a,h + or l + jr nz,x0771 + pop af + ei + ret +x077F in a,(c) + and #80 + jr nz,x0771 + in a,(c) + and #80 + jr nz,x0771 + ld h,d + ld l,e + ld bc,#0002 + srl h + rr l + or a + sbc hl,bc + ld bc,#FFFD + ld a,#80 + ex af,af' +x079D nop + nop + nop + nop + add hl,de +x07A2 dec hl + ld a,h + or l + jr nz,x07A2 + in a,(c) + and #80 + jp z,x07B7 + ex af,af' + scf + rra + jr c,x07C0 + ex af,af' + jp x079D +x07B7 ex af,af' + or a + rra + jr c,x07C0 + ex af,af' + jp x079D +x07C0 ld hl,x5B61 + ld (hl),#01 + inc hl + ld (hl),a + pop af + ei + ret + +;АДРЕС: #07CA процедура вывода в RS232 +x07CA push af + ld a,(x5B65) + or a + jr z,x07E0 + dec a + ld (x5B65),a + jr nz,x07DB + pop af + jp x0872 +x07DB pop af + ld (#5C0F),a + ret +x07E0 pop af + cp #A3 ;SPECTRUM? + jr c,x07F2 ;не токен + ld hl,(x5B5A) + push hl + rst #28 + dw Rom1.x0B52 ;печать токена + pop hl + ld (x5B5A),hl + scf + ret +x07F2 ld hl,#5C3B + res 0,(hl) + cp #20 + jr nz,x07FD + set 0,(hl) +x07FD cp #7F + jr c,x0803 + ld a,"?" +x0803 cp " " + jr c,x081E + push af + ld hl,x5B63 + inc (hl) + ld a,(x5B64) + cp (hl) + jr nc,x081A + call x0822 ;перевод строки + ld a,#01 + ld (x5B63),a +x081A pop af + jp x08A3 ;передача байта на принтер +x081E cp #0D + jr nz,x0830 + +;АДРЕС: #0822 перевод строки на принтере +x0822 xor a + ld (x5B63),a + ld a,#0D + jp x08A3 + +;АДРЕС: #082B !!!NOT USED!!! взврат каретки на принтере +x082B ld a,#0A + jp x08A3 + +;АДРЕС: #0830 продолжение x07CA процедура вывода в RS232 +x0830 cp #06 + jr nz,x0853 + ld bc,(x5B63) + ld e,#00 +x083A inc e + inc c + ld a,c + cp b + jr z,x0848 +x0840 sub #08 + jr z,x0848 + jr nc,x0840 + jr x083A +x0848 push de + ld a," " + call x07CA ;вывод в RS232 + pop de + dec e + ret z + jr x0848 +x0853 cp #16 + jr z,x0860 + cp #17 + jr z,x0860 + cp #10 + ret c + jr x0869 +x0860 ld (#5C0E),a + ld a,#02 + ld (x5B65),a + ret +x0869 ld (#5C0E),a + ld a,#02 + ld (x5B65),a + ret +x0872 ld d,a + ld a,(#5C0E) + cp #16 + jr z,x0882 + cp #17 + ccf + ret nz + ld a,(#5C0F) + ld d,a +x0882 ld a,(x5B64) + cp d + jr z,x088A + jr nc,x0890 +x088A ld b,a + ld a,d + sub b + ld d,a + jr x0882 +x0890 ld a,d + or a + jp z,x0822 +x0895 ld a,(x5B63) + cp d + ret z + push de + ld a," " + call x07CA ;вывод в RS232 + pop de + jr x0895 + +;АДРЕС: #08A3 передача байта на принтер +x08A3 push hl + ld hl,x08EE + ex (sp),hl + push af + ld a,r + di + push af + ld a,#80 + jr x08B8 + +;АДРЕС: #08B1 rst #08 вызов функции монитора +x08B1 push af + ld a,r + di + push af + ld a,#01 +x08B8 push af + inc sp + push bc + ld bc,#1FFD + push hl + ld hl,(#C001) + ex (sp),hl + ld a,#55 + ld (#C001),a + cpl + ld (#C002),a + ld a,#12 + jp x0024 ;переход в rom 2 + +;АДРЕС: #08D1 включение компьютера/"холодный" старт +x08D1 ld bc,#692B +x08D4 dec bc ;пауза + ld a,c + or b + jr nz,x08D4 + ld bc,#1FFD + ld a,#12 + jp x001C ;переход в rom2: monitor (инициализация) + +;АДРЕС: #08E1 !!!NOT USED!!! вход куда-то +x08E1 ld bc,#1FFD + push hl + ld hl,(#C001) + ex (sp),hl + ld a,#55 + jp x3C4A + +;АДРЕС: #08EE возврат из x08A3 +x08EE ei + ret + +;АДРЕС: #08F0 команда COPY +x08F0 ld hl,x5B72 + ld (hl),#2B +x08F5 ld hl,x0979 + call x095F ;передача на принтер управляющего кода + call x0915 ;печать половины строки + ld hl,x0980 ;!!!not used + call x0822 ;перевод строки + ld hl,x5B72 + xor a + cp (hl) + jr z,x090E + dec (hl) + jr x08F5 +x090E ld hl,x0982 + call x095F ;передача на принтер управляющего кода + ret + +;АДРЕС: #0915 печать половины строки +x0915 ld hl,x5B71 + ld (hl),#FF +x091A call x0926 ;печать столбца пикселей (с двойной высотой) + ld hl,x5B71 + xor a + cp (hl) + ret z + dec (hl) + jr x091A +;печать столбца пикселей (с двойной высотой) +x0926 ld de,#C000 + ld bc,(x5B71) + scf + rl b + scf + rl b + ld a,c + cpl + ld c,a + xor a + push af + push de + push bc +x093A call x096D ;проверить пиксель на экране + pop bc + pop de + ld e,#00 + jr z,x0944 + ld e,d +x0944 pop af + or e + push af + dec b + srl d + srl d + push de + push bc + jr nc,x093A + pop bc + pop de + pop af + ld b,#03 +x0955 push bc + push af + call x08A3 ;передача байта на принтер + pop af + pop bc + djnz x0955 + ret + +;АДРЕС: #095F передача на принтер управляющего кода +x095F ld b,(hl) + inc hl +x0961 ld a,(hl) + push hl + push bc + call x08A3 ;передача байта на принтер + pop bc + pop hl + inc hl + djnz x0961 + ret + +;АДРЕС: #096D проверить пиксель на экране +;вых: a =#00 пикселя нет +x096D rst #28 + dw Rom1.x22AA ;рассчитать адрес на экране по координатам + ld b,a + inc b + xor a + scf +x0974 rra + djnz x0974 + and (hl) + ret + +;АДРЕС: #0979 управляющие коды принтера Epson +x0979 db #06 ;размер в байтах + db #1B,#31 ;ESC '1' - 7/72 дюйма интервал между строками + db #1B,#4C,#00,#03 ;ESC 'L' 0 3 - двойная плотность (768 байт на строку) +x0980 db #01 ;размер в байтах + db #0A ;код перевода строки LF +x0982 db #02 ;размер в байтах + db #1B,#32 ;ESC '2' - 1/6 дюйма интервал между строками + +;АДРЕС: #0985 команда PLAY +x0985 di + push bc + ld de,#0037 + ld hl,#003C +x098D add hl,de ;hl=#003C + (#0037 * b). + djnz x098D + ld c,l + ld b,h + rst #28 + dw Rom1.x0030 ;резервирование памяти + di + push de + pop iy + push hl + pop ix + ld (iy+#10),#FF +x09A0 ld bc,#FFC9 ;-#37 + add ix,bc + ld (ix+#03),#3C + ld (ix+#01),#FF + ld (ix+#04),#0F + ld (ix+#05),#05 + ld (ix+#21),#00 + ld (ix+#0A),#00 + ld (ix+#0B),#00 + ld (ix+#16),#FF + ld (ix+#17),#00 + ld (ix+#18),#00 + rst #28 ;!!!ошибка!!! + dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора + di + ld (ix+#06),e + ld (ix+#07),d + ld (ix+#0C),e + ld (ix+#0D),d + ex de,hl + add hl,bc + ld (ix+#08),l + ld (ix+#09),h + pop bc + push bc + dec b + ld c,b + ld b,#00 + sla c + push iy + pop hl + add hl,bc + push ix + pop bc +x09F4 ld (hl),c + inc hl + ld (hl),b + or a + rl (iy+#10) + pop bc + dec b + push bc + ld (ix+#02),b + jr nz,x09A0 + pop bc +x0A05 ld (iy+#27),#1A + ld (iy+#28),#0B + push iy + pop hl + ld bc,#002B + add hl,bc + ex de,hl + ld hl,x0A31 + ld bc,#000D + ldir + ld d,#07 + ld e,#F8 + call x0E7C ;вывод значения в регистр AY + ld d,#0B + ld e,#FF + call x0E7C ;вывод значения в регистр AY + inc d + call x0E7C ;вывод значения в регистр AY + jr x0A7D + +;АДРЕС: #0A31 расчет задержки +x0A31 rst #28 + db #A4 ; stk-ten. = x, 10 + db #01 ; exchange. = 10, x + db #05 ; division. = 10/x + db #34 ; stk-data. = 10/x, 7.33e-6 + db #DF ; - exponent $6F (floating point number 7.33e-6). + db #75 ; - mantissa byte 1 + db #F4 ; - mantissa byte 2 + db #38 ; - mantissa byte 3 + db #75 ; - mantissa byte 4 + db #05 ; division. = (10/x)/7.33e-6 + db #38 ; end-calc. + ret + +;АДРЕС: #0A3E опрос клавиши Break +x0A3E ld a,#7F + in a,(#FE) + rra + ret c + ld a,#FE + in a,(#FE) + rra + ret + +;АДРЕС: #0A4A установка указателя на данные для канала AY +x0A4A ld bc,#0011 + jr x0A52 + +;АДРЕС: #0A4F установка указателя на данные для канала AY +x0A4F ld bc,#0000 +x0A52 push iy + pop hl + add hl,bc + ld (iy+#23),l + ld (iy+#24),h + ld a,(iy+#10) + ld (iy+#22),a + ld (iy+#21),#01 + ret + +;АДРЕС: #0A67 установить адрес блока данных канала +x0A67 ld e,(hl) + inc hl + ld d,(hl) + push de + pop ix + ret + +;АДРЕС: #0A6E следующий канал +x0A6E ld l,(iy+#23) + ld h,(iy+#24) + inc hl + inc hl + ld (iy+#23),l + ld (iy+#24),h + ret + +x0A7D call x0A4F ;установка указателя на данные для канала AY +x0A80 rr (iy+#22) + jr c,x0A8C + call x0A67 ;установить адрес блокаданных канала + call x0B5C ;найти следующую ноту +x0A8C sla (iy+#21) + jr c,x0A97 + call x0A6E ;следующий канал + jr x0A80 +x0A97 call x0F91 ;найти наименьшую длительность + push de + call x0F42 ;проиграть ноты во всех каналах + pop de +x0A9F ld a,(iy+#10) + cp #FF + jr nz,x0AAB + call x0E93 ;гасим звуки во всех каналах + ei + ret +x0AAB dec de + call x0F76 ;ожидание + call x0FC1 ;проиграть ноты во всех каналах + call x0F91 ;найти наименьшую длительность + jr x0A9F + +;АДРЕС: #0AB7 список команд +x0AB7 db "HZYXWUVMT)(NO!" + +;АДРЕС: #0AC5 прочитать текущий символ из строки воспроизведения с инкрементом +;вых: cy=1 данных больше нет +x0AC5 call x0EE3 ;прочитать текущий символ из строки воспроизведения + ret c ;нет данных + inc (ix+#06) + ret nz + inc (ix+#07) + ret + +;АДРЕС: #0AD1 получить ноту в полутонах +x0AD1 push hl + ld c,#00 +x0AD4 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом + jr c,x0AE1 + cp "&" + jr nz,x0AEC + ld a,#80 +x0ADF pop hl + ret +x0AE1 ld a,(iy+#21) + or (iy+#10) + ld (iy+#10),a + jr x0ADF +x0AEC cp "#" + jr nz,x0AF3 + inc c + jr x0AD4 +x0AF3 cp "$" + jr nz,x0AFA + dec c + jr x0AD4 +x0AFA bit 5,a + jr nz,x0B04 + push af + ld a,#0C + add a,c + ld c,a + pop af +x0B04 and #DF + sub "A" + jp c,x0F22 ;k Invalid note name + cp #07 + jp nc,x0F22 ;k Invalid note name + push bc + ld b,#00 + ld c,a + ld hl,x0DF9 + add hl,bc + ld a,(hl) + pop bc + add a,c + pop hl + ret + +;АДРЕС: #0B1D получить числовое значение параметра +x0B1D push hl + push de + ld l,(ix+#06) + ld h,(ix+#07) + ld de,#0000 +x0B28 ld a,(hl) + cp "0" + jr c,x0B45 + cp "9"+1 + jr nc,x0B45 + inc hl + push hl + call x0B50 ;умножение de=de*10 + sub #30 + ld h,#00 + ld l,a + add hl,de + jr c,x0B42 ;переполнение + ex de,hl + pop hl + jr x0B28 +x0B42 jp x0F1A ;l number too big +x0B45 ld (ix+#06),l + ld (ix+#07),h + push de + pop bc + pop de + pop hl + ret + +;АДРЕС: #0B50 умножение de=de*10 +x0B50 ld hl,#0000 + ld b,#0A +x0B55 add hl,de + jr c,x0B42 ;переполнение + djnz x0B55 + ex de,hl + ret + +;АДРЕС: #0B5C найти следующую ноту +x0B5C call x0A3E ;опрос клавиши Break + jr c,x0B69 ;не нажата + call x0E93 ;гасим звуки во всех каналах + ei + call x05AC + db #14 ;L Break into program +x0B69 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом + jp c,x0DA2 ;нет данных + call x0DF0 ;идентификация команды + ld b,#00 + sla c + ld hl,x0DCA + add hl,bc + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + call x0B84 ;call (hl) + jr x0B5C +x0B83 ret +x0B84 jp (hl) + +;АДРЕС: #0B85 команда ! (коментарий) +x0B85 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом + jp c,x0DA1 ;конец строки + cp "!" + ret z + jr x0B85 + +;АДРЕС: #0B85 команда O (октава) +x0B90 call x0B1D ;получить числовое значение параметра + ld a,c + cp #09 + jp nc,x0F12 ;n Out of range + sla a + sla a + ld b,a + sla a + add a,b + ld (ix+#03),a + ret + +;АДРЕС: #0BA5 команда N (разделитель) +x0BA5 ret + +;АДРЕС: #0BA6 команда ( (начало цикла) +x0BA6 ld a,(ix+#0B) + inc a + cp #05 + jp z,x0F2A ;d Too many brackets + ld (ix+#0B),a + ld de,#000C + call x0C27 ;получить адрес указателя + ld a,(ix+#06) + ld (hl),a + inc hl + ld a,(ix+#07) + ld (hl),a + ret + +;АДРЕС: #0BC2 команда ) (конец цикла) +x0BC2 ld a,(ix+#16) + ld de,#0017 + or a + jp m,x0BF0 + call x0C27 ;получить адрес указателя + ld a,(ix+#06) + cp (hl) + jr nz,x0BF0 + inc hl + ld a,(ix+#07) + cp (hl) + jr nz,x0BF0 + dec (ix+#16) + ld a,(ix+#16) + or a + ret p + bit 0,(ix+#0A) + ret z + ld (ix+#16),#00 + xor a + jr x0C0B +x0BF0 ld a,(ix+#16) + inc a + cp #05 + jp z,x0F2A ;d Too many brackets + ld (ix+#16),a + call x0C27 ;получить адрес указателя + ld a,(ix+#06) + ld (hl),a + inc hl + ld a,(ix+#07) + ld (hl),a + ld a,(ix+#0B) +x0C0B ld de,#000C + call x0C27 ;получить адрес указателя + ld a,(hl) + ld (ix+#06),a + inc hl + ld a,(hl) + ld (ix+#07),a + dec (ix+#0B) + ret p + ld (ix+#0B),#00 + set 0,(ix+#0A) + ret + +;АДРЕС: #0C27 получить адрес указателя +x0C27 push ix + pop hl + add hl,de + ld b,#00 + ld c,a + sla c + add hl,bc + ret + +;АДРЕС: #0C32 команда T (темп) +x0C32 call x0B1D ;получить числовое значение параметра + ld a,b + or a + jp nz,x0F12 ;n Out of range + ld a,c + cp #3C + jp c,x0F12 ;n Out of range + cp #F1 + jp nc,x0F12 ;n Out of range + ld a,(ix+#02) + or a + ret nz + ld b,#00 + push bc + pop hl + add hl,hl + add hl,hl + push hl + pop bc + push iy + rst #28 + dw Rom1.x2D2B ;bc на стэк калькулятора + di + pop iy + push iy + push iy + pop hl + ld bc,#002B + add hl,bc + ld iy,#5C3A + push hl + ld hl,x0C76 + ld (x5B5A),hl + ld hl,x5B14 + ex (sp),hl + push hl + jp x5B00 +x0C76 di + rst #28 + dw Rom1.x2DA2 ;извлечь значение со стэка калькулятора + di + pop iy + ld (iy+#27),c + ld (iy+#28),b + ret + +;АДРЕС: #0C84 команда M (микшер) +x0C84 call x0B1D ;получить числовое значение параметра + ld a,c + cp #40 + jp nc,x0F12 ;n Out of range + cpl + ld e,a + ld d,#07 + call x0E7C ;вывод значения в регистр AY + ret + +;АДРЕС: #0C95 команда V (громкость) +x0C95 call x0B1D ;получить числовое значение параметра + ld a,c + cp #10 + jp nc,x0F12 ;n Out of range + ld (ix+#04),a ;!!!ОШИБКА!!! + ld e,(ix+#02) + ld a,#08 + add a,e + ld d,a + ld e,c + call x0E7C ;вывод значения в регистр AY + ret + +;АДРЕС: #0CAD команда U (эффекты) +x0CAD ld e,(ix+#02) + ld a,#08 + add a,e + ld d,a + ld e,#1F + ld (ix+#04),e + ret + +;АДРЕС: #0CBA команда W (эффекты) +x0CBA call x0B1D ;получить числовое значение параметра + ld a,c + cp #08 + jp nc,x0F12 ;n Out of range + ld b,#00 + ld hl,x0DE8 + add hl,bc + ld a,(hl) + ld (iy+#29),a + ret + +;АДРЕС: #0CCE команда X (эффекты) +x0CCE call x0B1D ;получить числовое значение параметра + ld d,#0B + ld e,c + call x0E7C ;вывод значения в регистр AY + inc d + ld e,b + call x0E7C ;вывод значения в регистр AY + ret + +;АДРЕС: #0CDD команда Y (MIDI канал) +x0CDD call x0B1D ;получить числовое значение параметра + ld a,c + dec a + jp m,x0F12 ;n Out of range + cp #10 + jp nc,x0F12 ;n Out of range + ld (ix+#01),a + ret + +;АДРЕС: #0CEE команда Z (MIDI код) +x0CEE call x0B1D ;получить числовое значение параметра + ld a,c + call x11A3 ;загрузка байта в порт MIDI + ret + +;АДРЕС: #0CF6 команда H (стоп) +x0CF6 ld (iy+#10),#FF + ret + +;АДРЕС: #0CFB команды 'a'..'g', 'A'..'G', '1'.."12", '&', '_' +x0CFB call x0E19 ;это цифра? + jp c,x0D81 ;нет + call x0DAC ;расчет указателя на длительность + call x0DB4 ;установка длительности + xor a + ld (ix+#21),a + call x0EC8 ;получение предыдущего параматра + call x0B1D ;получить числовое значение параметра + ld a,c + or a + jp z,x0F12 ;n Out of range + cp #0D + jp nc,x0F12 ;n Out of range + cp #0A + jr c,x0D32 + call x0E00 ;получить длительность ноты + call x0D74 ;увеличение счетчика нот + ld (hl),e + inc hl + ld (hl),d +x0D28 call x0D74 ;увеличение счетчика нот + inc hl + ld (hl),e + inc hl + ld (hl),d + inc hl + jr x0D38 +x0D32 ld (ix+#05),c + call x0E00 ;получить длительность ноты +x0D38 call x0D74 ;увеличение счетчика нот +x0D3B call x0EE3 ;прочитать текущий символ из строки воспроизведения + cp "_" + jr nz,x0D6E + call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом + call x0B1D ;получить числовое значение параметра + ld a,c + cp #0A + jr c,x0D5F + push hl + push de + call x0E00 ;получить длительность ноты + pop hl + add hl,de + ld c,e + ld b,d + ex de,hl + pop hl + ld (hl),e + inc hl + ld (hl),d + ld e,c + ld d,b + jr x0D28 +x0D5F ld (ix+#05),c + push hl + push de + call x0E00 ;получить длительность ноты + pop hl + add hl,de + ex de,hl + pop hl + jp x0D3B +x0D6E ld (hl),e + inc hl + ld (hl),d + jp x0D9C + +;АДРЕС: #0D74 увеличение счетчика нот +x0D74 ld a,(ix+#21) + inc a + cp #0B + jp z,x0F3A ;o Too many tied notes + ld (ix+#21),a + ret + +x0D81 call x0EC8 ;получение предыдущего параматра + ld (ix+#21),#01 + call x0DAC ;расчет указателя на длительность + call x0DB4 ;установка длительности + ld c,(ix+#05) + push hl + call x0E00 ;получить длительность ноты + pop hl + ld (hl),e + inc hl + ld (hl),d + jp x0D9C ;!!!можно убрать +x0D9C pop hl + inc hl + inc hl + push hl + ret + +;АДРЕС: #0DA1 конец строки +x0DA1 pop hl +x0DA2 ld a,(iy+#21) + or (iy+#10) + ld (iy+#10),a + ret + +;АДРЕС: #0DAC расчет указателя на длительность +x0DAC push ix + pop hl + ld bc,#0022 + add hl,bc + ret + +;АДРЕС: #0DB4 установка длительности +x0DB4 push hl + push iy + pop hl + ld bc,#0011 + add hl,bc + ld b,#00 + ld c,(ix+#02) + sla c + add hl,bc + pop de + ld (hl),e + inc hl + ld (hl),d + ex de,hl + ret + +;АДРЕС: #0DCA таблица адресов обработки команд +x0DCA dw x0CFB ;прочие команды + dw x0B85 ; '!' + dw x0B90 ; 'O' + dw x0BA5 ; 'N' + dw x0BA6 ; '(' + dw x0BC2 ; ')' + dw x0C32 ; 'T' + dw x0C84 ; 'M' + dw x0C95 ; 'V' + dw x0CAD ; 'U' + dw x0CBA ; 'W' + dw x0CCE ; 'X' + dw x0CDD ; 'Y' + dw x0CEE ; 'Z' + dw x0CF6 ; 'H' + +;таблица огибающих +x0DE8 db #00 ; W0 - Single decay then off. (Continue off, attack off, alternate off, hold off) + db #04 ; W1 - Single attack then off. (Continue off, attack on, alternate off, hold off) + db #0B ; W2 - Single decay then hold. (Continue on, attack off, alternate on, hold on) + db #0D ; W3 - Single attack then hold. (Continue on, attack on, alternate off, hold on) + db #08 ; W4 - Repeated decay. (Continue on, attack off, alternate off, hold off) + db #0C ; W5 - Repeated attack. (Continue on, attack on, alternate off, hold off) + db #0E ; W6 - Repeated attack-decay. (Continue on, attack on, alternate on, hold off) + db #0A ; W7 - Repeated decay-attack. (Continue on, attack off, alternate on, hold off) + +;АДРЕС: #0DF0 идентификация команды +;вых: z - команда найдена +x0DF0 ld bc,#000F + ld hl,x0AB7 + cpir + ret + +;таблица полутонов +x0DF9 db #09 ; 'A' + db #0B ; 'B' + db #00 ; 'C' + db #02 ; 'D' + db #04 ; 'E' + db #05 ; 'F' + db #07 ; 'G' + +;АДРЕС: #0E00 получить длительность ноты +x0E00 push hl + ld b,#00 + ld hl,x0E0C + add hl,bc + ld d,#00 + ld e,(hl) + pop hl + ret +;длительность нот +x0E0C db #80 ; Rest [Not used since table is always indexed into with a value of 1 or more] + db #06 ; Semi-quaver (sixteenth note). + db #09 ; Dotted semi-quaver (3/32th note). + db #0C ; Quaver (eighth note). + db #12 ; Dotted quaver (3/16th note). + db #18 ; Crotchet (quarter note). + db #24 ; Dotted crotchet (3/8th note). + db #30 ; Minim (half note). + db #48 ; Dotted minim (3/4th note). + db #60 ; Semi-breve (whole note). + db #04 ; Triplet semi-quaver (1/24th note). + db #08 ; Triplet quaver (1/12th note). + db #10 ; Triplet crochet (1/6th note). + +;АДРЕС: #0E19 это цифра? +;вых: cy=0 это цифра +x0E19 cp "0" + ret c + cp "9"+1 + ccf + ret + +;АДРЕС: #0E20 проиграть ноту в канале +x0E20 ld c,a + ld a,(ix+#03) + add a,c + cp #80 + jp nc,x0F32 ;m Note out of range + ld c,a + ld a,(ix+#02) + or a + jr nz,x0E3F + ld a,c + cpl + and #7F + srl a + srl a + ld d,#06 + ld e,a + call x0E7C ;вывод значения в регистр AY +x0E3F ld (ix+#00),c + ld a,(ix+#02) + cp #03 + ret nc + ld hl,x1096 + ld b,#00 + ld a,c + sub #15 + jr nc,x0E57 + ld de,#0FBF + jr x0E5E +x0E57 ld c,a + sla c + add hl,bc + ld e,(hl) + inc hl + ld d,(hl) +x0E5E ex de,hl + ld d,(ix+#02) + sla d + ld e,l + call x0E7C ;вывод значения в регистр AY + inc d + ld e,h + call x0E7C ;вывод значения в регистр AY + bit 4,(ix+#04) + ret z + ld d,#0D + ld a,(iy+#29) + ld e,a + call x0E7C ;вывод значения в регистр AY + ret + +;АДРЕС: #0E7C вывод значения в регистр AY +x0E7C push bc + ld bc,#FFFD + out (c),d + ld bc,#BFFD + out (c),e + pop bc + ret + +;АДРЕС: #0E89 чтение регистра AY +x0E89 push bc + ld bc,#FFFD + out (c),a + in a,(c) + pop bc + ret + +;АДРЕС: #0E93 гасим звуки во всех каналах +x0E93 ld d,#07 + ld e,#FF + call x0E7C ;вывод значения в регистр AY + ld d,#08 + ld e,#00 + call x0E7C ;вывод значения в регистр AY + inc d + call x0E7C ;вывод значения в регистр AY + inc d + call x0E7C ;вывод значения в регистр AY + call x0A4F ;установка указателя на данные для канала AY +x0EAC rr (iy+#22) + jr c,x0EB8 + call x0A67 ;установить адрес блока данных канала + call x118D ;гасим звук в канале MIDI +x0EB8 sla (iy+#21) + jr c,x0EC3 + call x0A6E ;следующий канал + jr x0EAC +x0EC3 ld iy,#5C3A + ret + +;АДРЕС: #0EC8 получение предыдущего параматра +x0EC8 push hl + push de + ld l,(ix+#06) + ld h,(ix+#07) +x0ED0 dec hl + ld a,(hl) + cp " " + jr z,x0ED0 + cp #0D + jr z,x0ED0 + ld (ix+#06),l + ld (ix+#07),h + pop de + pop hl + ret + +;АДРЕС: #0EE3 прочитать текущий символ из строки воспроизведения +;вых: cy=1 данных больше нет +x0EE3 push hl + push de + push bc + ld l,(ix+#06) + ld h,(ix+#07) +x0EEC ld a,h + cp (ix+#09) + jr nz,x0EFB + ld a,l + cp (ix+#08) + jr nz,x0EFB + scf + jr x0F05 +x0EFB ld a,(hl) + cp " " + jr z,x0F09 + cp #0D + jr z,x0F09 + or a +x0F05 pop bc + pop de + pop hl + ret +x0F09 inc hl + ld (ix+#06),l + ld (ix+#07),h + jr x0EEC + +;АДРЕС: #0F12 обработка ошибок +x0F12 call x0E93 ;гасим звуки во всех каналах + ei + call x05AC + db #29 ;n Out of range +x0F1A call x0E93 ;гасим звуки во всех каналах + ei + call x05AC + db #27 ;l Number too big +x0F22 call x0E93 ;гасим звуки во всех каналах + ei + call x05AC + db #26 ;k Invalid note name +x0F2A call x0E93 ;гасим звуки во всех каналах + ei + call x05AC + db #1F ;d Too many brackets +x0F32 call x0E93 ;гасим звуки во всех каналах + ei + call x05AC + db #28 ;m Note out of range +x0F3A call x0E93 ;гасим звуки во всех каналах + ei + call x05AC + db #2A ;o Too many tied notes + +;АДРЕС: #0F42 проиграть ноты во всех каналах +x0F42 call x0A4F ;установка указателя на данные для канала AY +x0F45 rr (iy+#22) + jr c,x0F6C + call x0A67 ;установить адрес блока данных канала + call x0AD1 ;получить ноту в полутонах + cp #80 + jr z,x0F6C + call x0E20 ;проиграть ноту в канале + ld a,(ix+#02) + cp #03 + jr nc,x0F69 + ld d,#08 + add a,d + ld d,a + ld e,(ix+#04) + call x0E7C ;вывод значения в регистр AY +x0F69 call x116E ;проиграть ноту в канале MIDI +x0F6C sla (iy+#21) + ret c + call x0A6E ;следующий канал + jr x0F45 + +;АДРЕС: #0F76 ожидание +x0F76 push hl + ld l,(iy+#27) + ld h,(iy+#28) + ld bc,#0064 + or a + sbc hl,bc + push hl + pop bc + pop hl +x0F86 dec bc + ld a,b + or c + jr nz,x0F86 + dec de + ld a,d + or e + jr nz,x0F76 + ret + +;АДРЕС: #0F91 найти наименьшую длительность +x0F91 ld de,#FFFF + call x0A4A ;установка указателя на данные для канала AY +x0F97 rr (iy+#22) + jr c,x0FAF + push de + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + ld e,(hl) + inc hl + ld d,(hl) + push de + pop hl + pop bc + or a + sbc hl,bc + jr c,x0FAF + push bc + pop de +x0FAF sla (iy+#21) + jr c,x0FBA + call x0A6E ;следующий канал + jr x0F97 +x0FBA ld (iy+#25),e + ld (iy+#26),d + ret + +;АДРЕС: #0FC1 проиграть ноты во всех каналах +x0FC1 xor a + ld (iy+#2A),a + call x0A4F ;установка указателя на данные для канала AY +x0FC8 rr (iy+#22) + jp c,x105A + call x0A67 ;установить адрес блока данных канала + push iy + pop hl + ld bc,#0011 + add hl,bc + ld b,#00 + ld c,(ix+#02) + sla c + add hl,bc + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + push hl + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + ld e,(iy+#25) + ld d,(iy+#26) + or a + sbc hl,de + ex de,hl + pop hl + jr z,x0FFC + ld (hl),e + inc hl + ld (hl),d + jr x105A +x0FFC ld a,(ix+#02) + cp #03 + jr nc,x100C + ld d,#08 + add a,d + ld d,a + ld e,#00 + call x0E7C ;вывод значения в регистр AY +x100C call x118D ;гасим звук в канале MIDI + push ix + pop hl + ld bc,#0021 + add hl,bc + dec (hl) + jr nz,x1026 + call x0B5C ;найти следующую ноту + ld a,(iy+#21) + and (iy+#10) + jr nz,x105A + jr x103D +x1026 push iy + pop hl + ld bc,#0011 + add hl,bc + ld b,#00 + ld c,(ix+#02) + sla c + add hl,bc + ld e,(hl) + inc hl + ld d,(hl) + inc de + inc de + ld (hl),d + dec hl + ld (hl),e +x103D call x0AD1 ;получить ноту в полутонах + ld c,a + ld a,(iy+#21) + and (iy+#10) + jr nz,x105A + ld a,c + cp #80 + jr z,x105A + call x0E20 ;проиграть ноту в канале + ld a,(iy+#21) + or (iy+#2A) + ld (iy+#2A),a +x105A sla (iy+#21) + jr c,x1066 + call x0A6E ;следующий канал + jp x0FC8 +x1066 ld de,#0001 + call x0F76 ;ожидание + call x0A4F ;установка указателя на данные для канала AY +x106F rr (iy+#2A) + jr nc,x108C + call x0A67 ;установить адрес блока данных канала + ld a,(ix+#02) + cp #03 + jr nc,x1089 + ld d,#08 + add a,d + ld d,a + ld e,(ix+#04) + call x0E7C ;вывод значения в регистр AY +x1089 call x116E ;проиграть ноту в канале MIDI +x108C sla (iy+#21) + ret c + call x0A6E ;следующий канал + jr x106F + +;таблица нот +x1096 dw #0FBF; Octave 1, Note 21 - A (27.50 Hz, Ideal=27.50 Hz, Error=-0.01%) C0 + dw #0EDC; Octave 1, Note 22 - A# (29.14 Hz, Ideal=29.16 Hz, Error=-0.08%) + dw #0E07; Octave 1, Note 23 - B (30.87 Hz, Ideal=30.87 Hz, Error=-0.00%) + + dw #0D3D; Octave 2, Note 24 - C (32.71 Hz, Ideal=32.70 Hz, Error=+0.01%) C1 + dw #0C7F; Octave 2, Note 25 - C# (34.65 Hz, Ideal=34.65 Hz, Error=-0.00%) + dw #0BCC; Octave 2, Note 26 - D (36.70 Hz, Ideal=36.71 Hz, Error=-0.01%) + dw #0B22; Octave 2, Note 27 - D# (38.89 Hz, Ideal=38.89 Hz, Error=+0.01%) + dw #0A82; Octave 2, Note 28 - E (41.20 Hz, Ideal=41.20 Hz, Error=+0.00%) + dw #09EB; Octave 2, Note 29 - F (43.66 Hz, Ideal=43.65 Hz, Error=+0.00%) + dw #095D; Octave 2, Note 30 - F# (46.24 Hz, Ideal=46.25 Hz, Error=-0.02%) + dw #08D6; Octave 2, Note 31 - G (49.00 Hz, Ideal=49.00 Hz, Error=+0.00%) + dw #0857; Octave 2, Note 32 - G# (51.92 Hz, Ideal=51.91 Hz, Error=+0.01%) + dw #07DF; Octave 2, Note 33 - A (55.01 Hz, Ideal=55.00 Hz, Error=+0.01%) + dw #076E; Octave 2, Note 34 - A# (58.28 Hz, Ideal=58.33 Hz, Error=-0.08%) + dw #0703; Octave 2, Note 35 - B (61.75 Hz, Ideal=61.74 Hz, Error=+0.02%) + + dw #069F; Octave 3, Note 36 - C ( 65.39 Hz, Ideal= 65.41 Hz, Error=-0.02%) C2 + dw #0640; Octave 3, Note 37 - C# ( 69.28 Hz, Ideal= 69.30 Hz, Error=-0.04%) + dw #05E6; Octave 3, Note 38 - D ( 73.40 Hz, Ideal= 73.42 Hz, Error=-0.01%) + dw #0591; Octave 3, Note 39 - D# ( 77.78 Hz, Ideal= 77.78 Hz, Error=+0.01%) + dw #0541; Octave 3, Note 40 - E ( 82.41 Hz, Ideal= 82.41 Hz, Error=+0.00%) + dw #04F6; Octave 3, Note 41 - F ( 87.28 Hz, Ideal= 87.31 Hz, Error=-0.04%) + dw #04AE; Octave 3, Note 42 - F# ( 92.52 Hz, Ideal= 92.50 Hz, Error=+0.02%) + dw #046B; Octave 3, Note 43 - G ( 98.00 Hz, Ideal= 98.00 Hz, Error=+0.00%) + dw #042C; Octave 3, Note 44 - G# (103.78 Hz, Ideal=103.83 Hz, Error=-0.04%) + dw #03F0; Octave 3, Note 45 - A (109.96 Hz, Ideal=110.00 Hz, Error=-0.04%) + dw #03B7; Octave 3, Note 46 - A# (116.55 Hz, Ideal=116.65 Hz, Error=-0.08%) + dw #0382; Octave 3, Note 47 - B (123.43 Hz, Ideal=123.47 Hz, Error=-0.03%) + + dw #034F; Octave 4, Note 48 - C (130.86 Hz, Ideal=130.82 Hz, Error=+0.04%) C3 + dw #0320; Octave 4, Note 49 - C# (138.55 Hz, Ideal=138.60 Hz, Error=-0.04%) + dw #02F3; Octave 4, Note 50 - D (146.81 Hz, Ideal=146.83 Hz, Error=-0.01%) + dw #02C8; Octave 4, Note 51 - D# (155.68 Hz, Ideal=155.55 Hz, Error=+0.08%) + dw #02A1; Octave 4, Note 52 - E (164.70 Hz, Ideal=164.82 Hz, Error=-0.07%) + dw #027B; Octave 4, Note 53 - F (174.55 Hz, Ideal=174.62 Hz, Error=-0.04%) + dw #0257; Octave 4, Note 54 - F# (185.04 Hz, Ideal=185.00 Hz, Error=+0.02%) + dw #0236; Octave 4, Note 55 - G (195.83 Hz, Ideal=196.00 Hz, Error=-0.09%) + dw #0216; Octave 4, Note 56 - G# (207.57 Hz, Ideal=207.65 Hz, Error=-0.04%) + dw #01F8; Octave 4, Note 57 - A (219.92 Hz, Ideal=220.00 Hz, Error=-0.04%) + dw #01DC; Octave 4, Note 58 - A# (232.86 Hz, Ideal=233.30 Hz, Error=-0.19%) + dw #01C1; Octave 4, Note 59 - B (246.86 Hz, Ideal=246.94 Hz, Error=-0.03%) + + dw #01A8; Octave 5, Note 60 - C (261.42 Hz, Ideal=261.63 Hz, Error=-0.08%) C4 Middle C + dw #0190; Octave 5, Note 61 - C# (277.10 Hz, Ideal=277.20 Hz, Error=-0.04%) + dw #0179; Octave 5, Note 62 - D (294.01 Hz, Ideal=293.66 Hz, Error=+0.12%) + dw #0164; Octave 5, Note 63 - D# (311.35 Hz, Ideal=311.10 Hz, Error=+0.08%) + dw #0150; Octave 5, Note 64 - E (329.88 Hz, Ideal=329.63 Hz, Error=+0.08%) + dw #013D; Octave 5, Note 65 - F (349.65 Hz, Ideal=349.23 Hz, Error=+0.12%) + dw #012C; Octave 5, Note 66 - F# (369.47 Hz, Ideal=370.00 Hz, Error=-0.14%) + dw #011B; Octave 5, Note 67 - G (391.66 Hz, Ideal=392.00 Hz, Error=-0.09%) + dw #010B; Octave 5, Note 68 - G# (415.13 Hz, Ideal=415.30 Hz, Error=-0.04%) + dw #00FC; Octave 5, Note 69 - A (439.84 Hz, Ideal=440.00 Hz, Error=-0.04%) + dw #00EE; Octave 5, Note 70 - A# (465.72 Hz, Ideal=466.60 Hz, Error=-0.19%) + dw #00E0; Octave 5, Note 71 - B (494.82 Hz, Ideal=493.88 Hz, Error=+0.19%) + + dw #00D4; Octave 6, Note 72 - C (522.83 Hz, Ideal=523.26 Hz, Error=-0.08%) C5 + dw #00C8; Octave 6, Note 73 - C# (554.20 Hz, Ideal=554.40 Hz, Error=-0.04%) + dw #00BD; Octave 6, Note 74 - D (586.46 Hz, Ideal=587.32 Hz, Error=-0.15%) + dw #00B2; Octave 6, Note 75 - D# (622.70 Hz, Ideal=622.20 Hz, Error=+0.08%) + dw #00A8; Octave 6, Note 76 - E (659.77 Hz, Ideal=659.26 Hz, Error=+0.08%) + dw #009F; Octave 6, Note 77 - F (697.11 Hz, Ideal=698.46 Hz, Error=-0.19%) + dw #0096; Octave 6, Note 78 - F# (738.94 Hz, Ideal=740.00 Hz, Error=-0.14%) + dw #008D; Octave 6, Note 79 - G (786.10 Hz, Ideal=784.00 Hz, Error=+0.27%) + dw #0085; Octave 6, Note 80 - G# (833.39 Hz, Ideal=830.60 Hz, Error=+0.34%) + dw #007E; Octave 6, Note 81 - A (879.69 Hz, Ideal=880.00 Hz, Error=-0.04%) + dw #0077; Octave 6, Note 82 - A# (931.43 Hz, Ideal=933.20 Hz, Error=-0.19%) + dw #0070; Octave 6, Note 83 - B (989.65 Hz, Ideal=987.76 Hz, Error=+0.19%) + + dw #006A; Octave 7, Note 84 - C (1045.67 Hz, Ideal=1046.52 Hz, Error=-0.08%) C6 + dw #0064; Octave 7, Note 85 - C# (1108.41 Hz, Ideal=1108.80 Hz, Error=-0.04%) + dw #005E; Octave 7, Note 86 - D (1179.16 Hz, Ideal=1174.64 Hz, Error=+0.38%) + dw #0059; Octave 7, Note 87 - D# (1245.40 Hz, Ideal=1244.40 Hz, Error=+0.08%) + dw #0054; Octave 7, Note 88 - E (1319.53 Hz, Ideal=1318.52 Hz, Error=+0.08%) + dw #004F; Octave 7, Note 89 - F (1403.05 Hz, Ideal=1396.92 Hz, Error=+0.44%) + dw #004B; Octave 7, Note 90 - F# (1477.88 Hz, Ideal=1480.00 Hz, Error=-0.14%) + dw #0047; Octave 7, Note 91 - G (1561.14 Hz, Ideal=1568.00 Hz, Error=-0.44%) + dw #0043; Octave 7, Note 92 - G# (1654.34 Hz, Ideal=1661.20 Hz, Error=-0.41%) + dw #003F; Octave 7, Note 93 - A (1759.38 Hz, Ideal=1760.00 Hz, Error=-0.04%) + dw #003B; Octave 7, Note 94 - A# (1878.65 Hz, Ideal=1866.40 Hz, Error=+0.66%) + dw #0038; Octave 7, Note 95 - B (1979.30 Hz, Ideal=1975.52 Hz, Error=+0.19%) + + dw #0035; Octave 8, Note 96 - C (2091.33 Hz, Ideal=2093.04 Hz, Error=-0.08%) C7 + dw #0032; Octave 8, Note 97 - C# (2216.81 Hz, Ideal=2217.60 Hz, Error=-0.04%) + dw #002F; Octave 8, Note 98 - D (2358.31 Hz, Ideal=2349.28 Hz, Error=+0.38%) + dw #002D; Octave 8, Note 99 - D# (2463.13 Hz, Ideal=2488.80 Hz, Error=-1.03%) + dw #002A; Octave 8, Note 100 - E (2639.06 Hz, Ideal=2637.04 Hz, Error=+0.08%) + dw #0028; Octave 8, Note 101 - F (2771.02 Hz, Ideal=2793.84 Hz, Error=-0.82%) + dw #0025; Octave 8, Note 102 - F# (2995.69 Hz, Ideal=2960.00 Hz, Error=+1.21%) + dw #0023; Octave 8, Note 103 - G (3166.88 Hz, Ideal=3136.00 Hz, Error=+0.98%) + dw #0021; Octave 8, Note 104 - G# (3358.81 Hz, Ideal=3322.40 Hz, Error=+1.10%) + dw #001F; Octave 8, Note 105 - A (3575.50 Hz, Ideal=3520.00 Hz, Error=+1.58%) + dw #001E; Octave 8, Note 106 - A# (3694.69 Hz, Ideal=3732.80 Hz, Error=-1.02%) + dw #001C; Octave 8, Note 107 - B (3958.59 Hz, Ideal=3951.04 Hz, Error=+0.19%) + + dw #001A; Octave 9, Note 108 - C (4263.10 Hz, Ideal=4186.08 Hz, Error=+1.84%) C8 + dw #0019; Octave 9, Note 109 - C# (4433.63 Hz, Ideal=4435.20 Hz, Error=-0.04%) + dw #0018; Octave 9, Note 110 - D (4618.36 Hz, Ideal=4698.56 Hz, Error=-1.71%) + dw #0016; Octave 9, Note 111 - D# (5038.21 Hz, Ideal=4977.60 Hz, Error=+1.22%) + dw #0015; Octave 9, Note 112 - E (5278.13 Hz, Ideal=5274.08 Hz, Error=+0.08%) + dw #0014; Octave 9, Note 113 - F (5542.03 Hz, Ideal=5587.68 Hz, Error=-0.82%) + dw #0013; Octave 9, Note 114 - F# (5833.72 Hz, Ideal=5920.00 Hz, Error=-1.46%) + dw #0012; Octave 9, Note 115 - G (6157.81 Hz, Ideal=6272.00 Hz, Error=-1.82%) + dw #0011; Octave 9, Note 116 - G# (6520.04 Hz, Ideal=6644.80 Hz, Error=-1.88%) + dw #0010; Octave 9, Note 117 - A (6927.54 Hz, Ideal=7040.00 Hz, Error=-1.60%) + dw #000F; Octave 9, Note 118 - A# (7389.38 Hz, Ideal=7465.60 Hz, Error=-1.02%) + dw #000E; Octave 9, Note 119 - B (7917.19 Hz, Ideal=7902.08 Hz, Error=+0.19%) + + dw #000D; Octave 10, Note 120 - C ( 8526.20 Hz, Ideal= 8372.16 Hz, Error=+1.84%) C9 + dw #000C; Octave 10, Note 121 - C# ( 9236.72 Hz, Ideal= 8870.40 Hz, Error=+4.13%) + dw #000C; Octave 10, Note 122 - D ( 9236.72 Hz, Ideal= 9397.12 Hz, Error=-1.71%) + dw #000B; Octave 10, Note 123 - D# (10076.42 Hz, Ideal= 9955.20 Hz, Error=+1.22%) + dw #000B; Octave 10, Note 124 - E (10076.42 Hz, Ideal=10548.16 Hz, Error=-4.47%) + dw #000A; Octave 10, Note 125 - F (11084.06 Hz, Ideal=11175.36 Hz, Error=-0.82%) + dw #0009; Octave 10, Note 126 - F# (12315.63 Hz, Ideal=11840.00 Hz, Error=+4.02%) + dw #0009; Octave 10, Note 127 - G (12315.63 Hz, Ideal=12544.00 Hz, Error=-1.82%) + dw #0008; Octave 10, Note 128 - G# (13855.08 Hz, Ideal=13289.60 Hz, Error=+4.26%) + +;АДРЕС: #116E проиграть ноту в канале MIDI +x116E ld a,(ix+#01) + or a + ret m + or #90 + call x11A3 ;загрузка байта в порт MIDI + ld a,(ix+#00) + call x11A3 ;загрузка байта в порт MIDI + ld a,(ix+#04) + res 4,a + sla a + sla a + sla a + call x11A3 ;загрузка байта в порт MIDI + ret + +;АДРЕС: #118D гасим звук в канале MIDI +x118D ld a,(ix+#01) + or a + ret m + or #80 + call x11A3 ;загрузка байта в порт MIDI + ld a,(ix+#00) + call x11A3 ;загрузка байта в порт MIDI + ld a,#40 + call x11A3 ;загрузка байта в порт MIDI + ret ;!!!можно оптимизировать + +;АДРЕС: #11A3 загрузка байта в порт MIDI +x11A3 ld l,a + ld bc,#FFFD + ld a,#0E + out (c),a + ld bc,#BFFD + ld a,#FA ;Set RS232 'RXD' transmit line to 0 + out (c),a + ld e,#03 ;задержка 113 тактов +x11B4 dec e + jr nz,x11B4 + nop + nop + nop + nop + ld a,l + ld d,#08 +x11BE rra + ld l,a + jp nc,x11C9 + ld a,#FE ;Set RS232 'RXD' transmit line to 1 + out (c),a + jr x11CF +x11C9 ld a,#FA ;Set RS232 'RXD' transmit line to 0 + out (c),a + jr x11CF +x11CF ld e,#02 +x11D1 dec e + jr nz,x11D1 + nop + add a,#00 + ld a,l + dec d + jr nz,x11BE + nop + nop + add a,#00 + nop + nop + ld a,#FE ;Set RS232 'RXD' transmit line to 0 + out (c),a + ld e,#06 +x11E7 dec e + jr nz,x11E7 + ret + +;АДРЕС: #11EB команда SAVE +x11EB ld hl,x5B66 + set 5,(hl) + jr x1205 + +;АДРЕС: #11F2 команда LOAD +x11F2 ld hl,x5B66 + set 4,(hl) + jr x1205 + +;АДРЕС: #11F2 команда VERIFY +x11F9 ld hl,x5B66 + set 7,(hl) + jr x1205 + +;АДРЕС: #1200 команда MERGE +x1200 ld hl,x5B66 + set 6,(hl) +x1205 ld hl,x5B66 ;!!!лишнее + res 3,(hl) + rst #18 ;чтение очередного символа строки программы + cp "!" + jp nz,x13BE ;работа с лентой + ld hl,x5B66 + set 3,(hl) + rst #20 ;получение следующего символа из бейсик программы + jp x13BE ;работа с RAM диском + +;АДРЕС: #1219 ошибка C Nonsense in BASIC +x1219 call x05AC + db #0B ;C Nonsense in BASIC + +;АДРЕС: #121D работа с RAM диском +x121D ld (x5B74),hl + ld a,(ix+#00) + ld (x5B71),a + ld l,(ix+#0B) + ld h,(ix+#0C) + ld (x5B72),hl + ld l,(ix+#0D) + ld h,(ix+#0E) + ld (x5B78),hl + ld l,(ix+#0F) + ld h,(ix+#10) + ld (x5B76),hl + or a + jr z,x124E ;BASIC + cp #03 + jr z,x124E ;CODE/SCREEN$ + ld a,(ix+#0E) ;DATA + ld (x5B76),a +x124E push ix + pop hl + inc hl + ld de,x5B67 + ld bc,#000A + ldir + ld hl,x5B66 + bit 5,(hl) + jp nz,x1BAD ;SAVE + ld hl,x5B71 + ld de,x5B7A + ld bc,#0007 + ldir + call x1C2E ;загрузка заголовка файла из RAM диска + ld a,(x5B7A) + ld b,a + ld a,(x5B71) + cp b + jr nz,x1280 ;b Wrong file type + cp #03 + jr z,x1290 + jr c,x1284 +x1280 call x05AC + db #1D ;b Wrong file type +x1284 ld a,(x5B66) + bit 6,a + jr nz,x12C5 + bit 7,a + jp z,x12DB +x1290 ld a,(x5B66) + bit 6,a + jr z,x129B + call x05AC + db #1C ;a MERGE error +x129B ld hl,(x5B7B) + ld de,(x5B72) + ld a,h + or l + jr z,x12AE + sbc hl,de + jr nc,x12AE + call x05AC + db #1E ;c CODE error +x12AE ld hl,(x5B7B+2) + ld a,h + or l + jr nz,x12B8 + ld hl,(x5B74) +x12B8 ld a,(x5B71) + and a + jr nz,x12C1 + ld hl,(#5C53) +x12C1 call x137E ;загрузка данных с RAM диска + ret +x12C5 ld bc,(x5B72) + push bc + inc bc + rst #28 + dw Rom1.x0030 ;резервирование памяти +x12CE ld (hl),#80 + ex de,hl + pop de + push hl + call x137E ;загрузка данных с RAM диска + pop hl + rst #28 + dw Rom1.x08CE ;MERGE + ret +x12DB ld de,(x5B72) + ld hl,(x5B7B+2) + push hl + ld a,h + or l + jr nz,x12ED + inc de + inc de + inc de + ex de,hl + jr x12F6 +x12ED ld hl,(x5B7B) + ex de,hl + scf + sbc hl,de + jr c,x12FF +x12F6 ld de,#0005 + add hl,de + ld b,h + ld c,l + rst #28 + dw Rom1.x1F05 ;проверка наличия свободной памяти +x12FF pop hl + ld a,(x5B71) + and a + jr z,x1335 + ld a,h + or l + jr z,x1315 + dec hl + ld b,(hl) + dec hl + ld c,(hl) + dec hl + inc bc + inc bc + inc bc + rst #28 + dw Rom1.x19E8 ;удалить массив DIM +x1315 ld hl,(#5C59) + dec hl + ld bc,(x5B72) + push bc + inc bc + inc bc + inc bc + ld a,(x5B7F) + push af + rst #28 + dw Rom1.x1655 ;резервирование места (длина в bc) + inc hl + pop af + ld (hl),a + pop de + inc hl + ld (hl),e + inc hl + ld (hl),d + inc hl +x1331 call x137E ;загрузка данных с RAM диска + ret +x1335 ld hl,x5B66 + res 1,(hl) + ld de,(#5C53) + ld hl,(#5C59) + dec hl + rst #28 + dw Rom1.x19E5 ;удалить переменные + ld bc,(x5B72) + ld hl,(#5C53) + rst #28 + dw Rom1.x1655 ;резервирование места (длина в bc) + inc hl + ld bc,(x5B76) + add hl,bc + ld (#5C4B),hl + ld a,(x5B78+1) + ld h,a + and #C0 + jr nz,x1370 + ld a,(x5B78) + ld l,a + ld (#5C42),hl + ld (iy+#0A),#00 + ld hl,x5B66 + set 1,(hl) +x1370 ld hl,(#5C53) + ld de,(x5B72) + dec hl + ld (#5C57),hl + inc hl + jr x1331 ;!!!можно удалить + +;АДРЕС: #137E загрузка данных с RAM диска +x137E ld a,d + or e + ret z + call x1C4B ;загрузка из RAM диска + ret + +;АДРЕС: #1385 получить выражения из строки бейсика +x1385 rst #28 + dw Rom1.x1C8C ;параметр - строка + bit 7,(iy+#01) + ret z ;проверка синтаксиса + push af + rst #28 + dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора + pop af + ret + +;АДРЕС: #1393 проверка и копирование имени файла +x1393 rst #20 + call x1385 ;получить выражения из строки бейсика + ret z ;проверка синтаксиса + push af + ld a,c + or b + jr z,x13BA ;ошибка в имени файла + ld hl,#000A + sbc hl,bc + jr c,x13BA ;ошибка в имени файла + push de + push bc + ld hl,x5B67 + ld b,#0A + ld a," " +x13AD ld (hl),a + inc hl + djnz x13AD + pop bc + pop hl + ld de,x5B67 + ldir + pop af + ret +x13BA call x05AC + db #21 ;f Invalid name + +;АДРЕС: #13BE работа с лентой/RAM диском +x13BE rst #28 + dw Rom1.x1C8C ;параметр - строка + bit 7,(iy+#01) + jr z,x1407 ;проверка синтаксиса + ld bc,#0011 + ld a,(#5C74) + and a + jr z,x13D2 ;SAVE + ld c,#22 ;" +x13D2 rst #28 + dw Rom1.x0030 ;резервирование памяти + push de + pop ix + ld b,#0B + ld a," " +x13DC ld (de),a + inc de + djnz x13DC + ld (ix+#01),#FF + rst #28 + dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора + ld hl,-10 + dec bc + add hl,bc + inc bc + jr nc,x1400 + ld a,(#5C74) + and a + jr nz,x13F9 ;не SAVE + call x05AC ;ошибка + db #0E ;F Invalid file name +x13F9 ld a,b + or c + jr z,x1407 + ld bc,#000A +x1400 push ix + pop hl + inc hl + ex de,hl + ldir +x1407 rst #18 ;чтение очередного символа строки программы + cp #E4 ;это DATA? + jr nz,x145F ;нет + ld a,(#5C74) ; 'xxx' "name" DATA + cp #03 ;это MERGE? + jp z,x1219 ;C Nonsense in BASIC + rst #20 ;чтение следующего символа строки программы + rst #28 + dw Rom1.x28B2 ;LOOK-VARS + jr nc,x142F + ld hl,#0000 + bit 6,(iy+#01) + jr z,x1425 + set 7,c +x1425 ld a,(#5C74) + dec a + jr z,x1444 + call x05AC ;ошибка запись или проверка пустого массива + db #01 ;2 Variable not found +x142F jp nz,x1219 ;C Nonsense in BASIC + bit 7,(iy+#01) + jr z,x1451 ;проверка синтаксиса + ld c,(hl) + inc hl + ld a,(hl) + ld (ix+#0B),a + inc hl + ld a,(hl) + ld (ix+#0C),a + inc hl +x1444 ld (ix+#0E),c + ld a,#01 ;числовой массив + bit 6,c + jr z,x144E + inc a ;символьный массив +x144E ld (ix+#00),a +x1451 ex de,hl + rst #20 ;чтение следующего символа строки программы + cp ")" + jr nz,x142F + rst #20 ;чтение следующего символа строки программы + call x18A1 + ex de,hl + jp x1519 +x145F cp #AA ;SCREEN$ ? + jr nz,x1482 ;нет + ld a,(#5C74) ; 'xxx' "name" SCREEN$ + cp #03 ;это MERGE? + jp z,x1219 ;C Nonsense in BASIC + rst #20 ;чтение следующего символа строки программы + call x18A1 + ld (ix+#0B),#00 + ld (ix+#0C),#1B + ld hl,#4000 + ld (ix+#0D),l + ld (ix+#0E),h + jr x14CF +x1482 cp #AF ;CODE ? + jr nz,x14D5 ;нет + ld a,(#5C74) ; 'xxx' "name" CODE + cp #03 ;это MERGE? + jp z,x1219 ;C Nonsense in BASIC + rst #20 ;чтение следующего символа строки программы + rst #28 + dw Rom1.x2048 ;PR-ST-END + jr nz,x14A0 + ld a,(#5C74) + and a + jp z,x1219 ;C Nonsense in BASIC + rst #28 + dw Rom1.x1CE6 ;ноль на стэк калькулятора + jr x14AF +x14A0 rst #28 + dw Rom1.x1C82 ;получение числового значения + rst #18 ;чтение очередного символа строки программы + cp "," + jr z,x14B4 + ld a,(#5C74) + and a + jp z,x1219 ;C Nonsense in BASIC +x14AF rst #28 + dw Rom1.x1CE6 ;ноль на стэк калькулятора + jr x14B8 +x14B4 rst #20 ;чтение следующего символа строки программы + rst #28 + dw Rom1.x1C82 ;получение числового значения +x14B8 call x18A1 + rst #28 + dw Rom1.x1E99 ;извлечь операнд + ld (ix+#0B),c + ld (ix+#0C),b + rst #28 + dw Rom1.x1E99 ;извлечь операнд + ld (ix+#0D),c + ld (ix+#0E),b + ld h,b + ld l,c +x14CF ld (ix+#00),#03 + jr x1519 +x14D5 cp #CA ;LINE ? + jr z,x14E2 ;да + call x18A1 ;'xxx "name"' / 'SAVE "name" LINE' + ld (ix+#0E),#80 + jr x14F9 +x14E2 ld a,(#5C74) + and a ;SAVE ? + jp nz,x1219 ;C Nonsense in BASIC + rst #20 ;чтение следующего символа строки программы + rst #28 + dw Rom1.x1C82 ;получение числового значения + call x18A1 + rst #28 + dw Rom1.x1E99 ;извлечь операнд + ld (ix+#0D),c + ld (ix+#0E),b +x14F9 ld (ix+#00),#00 + ld hl,(#5C59) + ld de,(#5C53) + scf + sbc hl,de + ld (ix+#0B),l + ld (ix+#0C),h + ld hl,(#5C4B) + sbc hl,de + ld (ix+#0F),l + ld (ix+#10),h + ex de,hl +x1519 ld a,(x5B66) + bit 3,a + jp nz,x121D ;операция с RAM диском + ld a,(#5C74) + and a ;это SAVE ? + jr nz,x152B ;нет + rst #28 + dw Rom1.x0970 ;SAVE + ret +x152B rst #28 + dw Rom1.x0761 ;LOAD/MERGE/VERIFY + ret + +;АДРЕС: #152F печать бейсик программы от текущей строки +x152F ld hl,#EEF5 + res 0,(hl) + set 1,(hl) +x1536 ld hl,(#5C49) ;номер строки + ld a,h + or l + jr nz,x1540 + ld (#EC06),hl +x1540 ld a,(#F9DB) + push af + ld hl,(#FC9A) + call x334A ;поиск адреса строки бейсик программы + ld (#F9D7),hl + call x3222 ;установка буфера редактирования в верху экрана + call x30D6 ;установка буфера редактирования внизу экрана + pop af +x1554 or a + jr z,x1563 + push af + call x30DF ;сдвиг строк в буфере редактирования вверх + ex de,hl + call x326A ;копирование строки бейсик программы в буфер редактирования вверзу экрана + pop af + dec a + jr x1554 +x1563 ld c,#00 + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld b,c + ld a,(#EC15) + ld c,a + push bc + push de +x156F call x30DF ;сдвиг строк в буфере редактирования вверх + ld a,(#EEF5) + bit 1,a + jr z,x1596 + push de + push hl + ld de,#0020 + add hl,de + bit 0,(hl) + jr z,x1594 + inc hl + ld d,(hl) + inc hl + ld e,(hl) + or a + ld hl,(#5C49) + sbc hl,de + jr nz,x1594 + ld hl,#EEF5 + set 0,(hl) +x1594 pop hl + pop de +x1596 push bc + push hl + ld bc,#0023 + ldir + pop hl + pop bc + push de + push bc + ex de,hl + ld hl,#EEF5 + bit 0,(hl) + jr z,x15D3 + ld b,#00 +x15AB ld hl,(#EC06) + ld a,h + or l + jr z,x15C0 + push hl ;!!!ОШИБКА!!! + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + pop hl + jr nc,x15CB + dec hl + inc b + ld (#EC06),hl + jr x15AB +x15C0 call x2E41 ;поиск в строке вправо от курсора редактируемого символа + call nc,x2E63 ;поиск в строке влево от курсора редактируемого символа + ld hl,#EEF5 + ld (hl),#00 +x15CB ld a,b + pop bc + push bc + ld c,b + ld b,a + call x2A11 ;сохранить позицию курсора +x15D3 pop bc + pop de + ld a,c + inc b + cp b + jr nc,x156F + ld a,(#EEF5) + bit 1,a + jr z,x1602 + bit 0,a + jr nz,x1602 + ld hl,(#5C49) + ld a,h + or l + jr z,x15F4 + ld (#FC9A),hl + call x3222 ;установка буфера редактирования в верху экрана + jr x15FD +x15F4 ld (#FC9A),hl + call x3352 ;преобразование номера строки в ASCII и помещение в буфер + ld (#5C49),hl +x15FD pop de + pop bc + jp x1536 +x1602 pop de + pop bc + cp a +x1605 push af + ld a,c + ld c,b + call x30B4 ;расчет адреса начала строки в буфере редактирования + ex de,hl +x160C push af + call x3604 ;печать строки редактируемого буфера + pop af + ld de,#0023 + add hl,de + inc c + cp c + jr nc,x160C + pop af + ret z + call x2A07 ;получение позиции курсора +x161E call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере + ld hl,(#EC06) + dec hl + ld a,h + or l + ld (#EC06),hl + jr nz,x161E + jp x2A11 ;сохранить позицию курсора + ret ;!!!не используется!!! + +;АДРЕС: #1630 очистка окна редактирования +x1630 ld b,#00 + ld a,(#EC15) + ld d,a + jp x3B5E ;очистка строк экрана + +;АДРЕС: #1639 сдвиг всех строк в буфере редактирования верх и обновление экрана +x1639 ld b,#00 + push hl + ld c,b + call x30B4 ;расчет адреса начала строки в буфере редактирования + call x326A ;копирование строки бейсик программы в буфер редактирования вверзу экрана + pop hl + ret nc + call x30DF ;сдвиг строк в буфере редактирования вверх +x1648 push bc + push hl + ld hl,#0023 + add hl,de + ld a,(#EC15) + ld c,a + cp b + jr z,x1663 + push bc +x1656 push bc + ld bc,#0023 + ldir + pop bc + ld a,c + inc b + cp b + jr nz,x1656 + pop bc +x1663 pop hl + call x3618 ;сдвиг вверх строк в буфере редактирования при необходимости + ld bc,#0023 + ldir + scf + pop bc + ret + +;АДРЕС: #166F сдвиг всех строк в буфер редактирования вниз с обновлением экрана +x166F ld b,#00 + call x322B ;перемещение курсора вверх в верхнем буфере редактирования + ret nc + +;АДРЕС: #1675 сдвиг всех строк в буфер редактирования вниз с обновлением экрана +;вых: cy=0 буфер переполнен +; b - последняя строка +x1675 push bc + push hl +;сдвиг всех строк в буфере вниз + ld a,(#EC15) ;номер строки в буфере редактирования + ld c,a + call x30B4 ;расчет адреса начала строки в буфере редактирования + call x311E ;сдвиг строк в буфере редактирования вниз + jr nc,x16A9 ;буфер переполнен + dec de + ld hl,#0023 + add hl,de + ex de,hl + push bc + ld a,b + cp c + jr z,x169A +x168E push bc + ld bc,#0023 + lddr + pop bc + ld a,b + dec c + cp c + jr c,x168E +;все строки сдвинуты вниз +x169A ex de,hl + inc de + pop bc ;c - номер строки + pop hl ;адрес следуюющей строки + call x362C ;сдвиг вниз строк в буфере редактирования при необходимости + ld bc,#0023 + ldir + scf + pop bc + ret +;буфер переполнен +x16A9 pop hl + pop bc + ret + +;АДРЕС: #16AC вставка символа в строку буфера редактирования +;вх: de - адрес начала строки в буфере +; a - код символа +; b - crd X +;вых: a - код последнего символа строки +; z - сждвигать больше нечего +x16AC push de + ld h,#00 + ld l,b + add hl,de ;адрес символа в буфере + ld d,a + ld a,b +x16B3 ld e,(hl) + ld (hl),d + ld d,e + inc hl + inc a + cp #20 + jr c,x16B3 + ld a,e + cp #00 + pop de + ret + +;АДРЕС: #16C1 вставка символа в строку буфера редактирования со сдвигом влево +x16C1 push de + ld hl,#0020 + add hl,de + push hl + ld d,a + ld a,#1F + jr x16D3 +x16CC ld e,(hl) + ld (hl),d + ld d,e + cp b + jr z,x16D6 + dec a +x16D3 dec hl + jr x16CC +x16D6 ld a,e + cp #00 + pop hl + pop de + ret + +;АДРЕС: #16DC смещения до параметров команды +x16DC db #B1 ; DEF FN -> #178D (ROM 0) + db #C9 ; CAT -> #17A6 (ROM 0) + db #BC ; FORMAT -> #179A (ROM 0) + db #BE ; MOVE -> #179D (ROM 0) + db #C3 ; ERASE -> #17A3 (ROM 0) + db #AF ; OPEN # -> #1790 (ROM 0) + db #B4 ; CLOSE # -> #1796 (ROM 0) + db #93 ; MERGE -> #1776 (ROM 0) + db #91 ; VERIFY -> #1775 (ROM 0) + db #92 ; BEEP -> #1777 (ROM 0) + db #95 ; CIRCLE -> #177B (ROM 0) + db #98 ; INK -> #177F (ROM 0) + db #98 ; PAPER -> #1780 (ROM 0) + db #98 ; FLASH -> #1781 (ROM 0) + db #98 ; BRIGHT -> #1782 (ROM 0) + db #98 ; INVERSE -> #1783 (ROM 0) + db #98 ; OVER -> #1784 (ROM 0) + db #98 ; OUT -> #1785 (ROM 0) + db #7F ; LPRINT -> #176D (ROM 0) + db #81 ; LLIST -> #1770 (ROM 0) + db #2E ; STOP -> #171E (ROM 0) + db #6C ; READ -> #175D (ROM 0) + db #6E ; DATA -> #1760 (ROM 0) + db #70 ; RESTORE -> #1763 (ROM 0) + db #48 ; NEW -> #173C (ROM 0) + db #94 ; BORDER -> #1789 (ROM 0) + db #56 ; CONTINUE -> #174C (ROM 0) + db #3F ; DIM -> #1736 (ROM 0) + db #41 ; REM -> #1739 (ROM 0) + db #2B ; FOR -> #1724 (ROM 0) + db #17 ; GO TO -> #1711 (ROM 0) + db #1F ; GO SUB -> #171A (ROM 0) + db #37 ; INPUT -> #1733 (ROM 0) + db #77 ; LOAD -> #1774 (ROM 0) + db #44 ; LIST -> #1742 (ROM 0) + db #0F ; LET -> #170E (ROM 0) + db #59 ; PAUSE -> #1759 (ROM 0) + db #2B ; NEXT -> #172C (ROM 0) + db #43 ; POKE -> #1745 (ROM 0) + db #2D ; PRINT -> #1730 (ROM 0) + db #51 ; PLOT -> #1755 (ROM 0) + db #3A ; RUN -> #173F (ROM 0) + db #6D ; SAVE -> #1773 (ROM 0) + db #42 ; RANDOMIZE -> #1749 (ROM 0) + db #0D ; IF -> #1715 (ROM 0) + db #49 ; CLS -> #1752 (ROM 0) + db #5C ; DRAW -> #1766 (ROM 0) + db #44 ; CLEAR -> #174F (ROM 0) + db #15 ; RETURN -> #1721 (ROM 0) + db #5D ; COPY -> #176A (ROM 0) + +;АДРЕС: #170E синтаксические параметры команд (аналогично basic 48 #1A7A) +; CLASS-00 - больше нет операндов +; CLASS-01 - используется в LET. требуется переменная +; CLASS-02 - используется в LET. за ним выражение числовое или строковое +; CLASS-03 - за этим следует числовое выражение (=0 при отсутствии) +; CLASS-04 - за этим следует односимвольная переменная +; CLASS-05 - +; CLASS-06 - за этим следует числовое выражение +; CLASS-07 - работа с атрибутами +; CLASS-08 - два числа через запятую +; CLASS-09 - два числа через запятую (могут быть упраляющие цветом коды) +; CLASS-0A - строка +; CLASS-0B - для работы с кассетой/RAM-диском +; CLASS-0C - то же что и CLASS-00, но вызывается из ROM 0 +; CLASS-0D - то же что и CLASS-06, но вызывается из ROM 0 +; CLASS-0E - обрабатывается в ROM 0 +x170E db #01 ; CLASS-01 LET + db "=" ; = + db #02 ; CLASS-02 +x1711 db #06 ; CLASS-06 GO TO + db #00 ; CLASS-00 + dw Rom1.x1E67 ; GO TO routine in ROM 1 +x1715 db #06 ; CLASS-06 IF + db #CB ; 'THEN' + db #0E ; CLASS-0E + dw x1967 ; IF routine in ROM 0 +x171A db #06 ; CLASS-06 GO SUB + db #0C ; CLASS-0C + dw x1A53 ; GO SUB routine in ROM 0 +x171E db #00 ; CLASS-00 STOP + dw Rom1.x1CEE ; STOP routine in ROM 1 +x1721 db #0C ; CLASS-0C RETURN + dw x1A6F ; RETURN routine in ROM 0 +x1724 db #04 ; CLASS-04 FOR + db "=" ; '=' + db #06 ; CLASS-06 + db #CC ; 'TO' + db #06 ; CLASS-06 + db #0E ; CLASS-0E + dw x1981 ; FOR routine in ROM 0 +x172C db #04 ; CLASS-04 NEXT + db #00 ; CLASS-00 + dw Rom1.x1DAB ; NEXT routine in ROM 1 +x1730 db #0E ; CLASS-0E PRINT + dw x2178 ; PRINT routine in ROM 0 +x1733: db #0E ; CLASS-0E INPUT + dw x218C ; INPUT routine in ROM 0 +x1736 db #0E ; CLASS-0E DIM + dw x21D5 ; DIM routine in ROM 0 +x1739 db #0E ; CLASS-0E REM + dw x1862 ; REM routine in ROM 0 +x173C db #0C ; CLASS-0C NEW + dw x21AA ; NEW routine in ROM 0 +x173F db #0D ; CLASS-0D RUN + dw x1A02 ; RUN routine in ROM 0 +x1742 db #0E ; CLASS-0E LIST + dw x1B75 ; LIST routine in ROM 0 +x1745 db #08 ; CLASS-08 POKE + db #00 ; CLASS-00 + dw Rom1.x1E80 ; POKE routine in ROM 1 +x1749 db #03 ; CLASS-03 RANDOMIZE + dw Rom1.x1E4F ; RANDOMIZE routine in ROM 1 +x174C db #00 ; CLASS-00 CONTINUE + dw Rom1.x1E5F ; CONTINUE routine in ROM 1 +x174F db #0D ; CLASS-0D CLEAR + dw Rom1.x1A0D ; CLEAR routine in ROM 0 +x1752 db #00 ; CLASS-00 CLS + dw Rom1.x0D6B ; CLS routine in ROM 1 +x1755 db #09 ; CLASS-09 PLOT + db #00 ; CLASS-00 + dw Rom1.x22DC ; PLOT routine in ROM 1 +x1759 db #06 ; CLASS-06 PAUSE + db #00 ; CLASS-00 + dw Rom1.x1F3A ; PAUSE routine in ROM 1 +x175D db #0E ; CLASS-0E READ + dw x19AB ; READ routine in ROM 0 +x1760 db #0E ; CLASS-0E DATA + dw x19EB ; DATA routine in ROM 0 +x1763 db #03 ; CLASS-03 RESTORE + dw Rom1.x1E42 ; RESTORE routine in ROM 1 +x1766 db #09 ; CLASS-09 DRAW + db #0E ; CLASS-0E + dw x21BE ; DRAW routine in ROM 0 +x176A db #0C ; CLASS-0C COPY + dw x21A7 ; New COPY routine in ROM 0. +x176D db #0E ; CLASS-0E LPRINT + dw x2174 ; LPRINT routine in ROM 0 +x1770 db #0E ; CLASS-0E LLIST + dw x1B71 ; LLIST routine in ROM 0 +x1773 db #0B ; CLASS-0B SAVE +x1774 db #0B ; CLASS-0B LOAD +x1775 db #0B ; CLASS-0B VERIFY +x1776 db #0B ; CLASS-0B MERGE +x1777 db #08 ; CLASS-08 BEEP + db #00 ; CLASS-00 + dw Rom1.x03F8 ; BEEP routine in ROM 1 +x177B db #09 ; CLASS-09 CIRCLE + db #0E ; CLASS-0E + dw x21AE ; CIRCLE routine in ROM 0 +x177F db #07 ; CLASS-07 INK +x1780 db #07 ; CLASS-07 PAPER +x1781 db #07 ; CLASS-07 FLASH +x1782 db #07 ; CLASS-07 BRIGHT +x1783 db #07 ; CLASS-07 INVERSE +x1784 db #07 ; CLASS-07 OVER +x1785 db #08 ; CLASS-08 OUT + db #00 ; CLASS-00 + dw Rom1.x1E7A ; OUT routine in ROM 1 +x1789 db #06 ; CLASS-06 BORDER + db #00 ; CLASS-00 + dw Rom1.x2294 ; BORDER routine in ROM 1 +x178D db #0E ; CLASS-0E DEF FN + dw x1A8C ; DEF FN routine in ROM 0 +x1790 db #06 ; CLASS-06 OPEN # + db "," ; ',' + db #0A ; CLASS-0A + db #00 ; CLASS-00 + dw Rom1.x1736 ; OPEN # routine in ROM 1 +x1796 db #06 ; CLASS-06 CLOSE # + db #00 ; CLASS-00 + dw Rom1.x16E5 ; CLOSE # routine in ROM 1 +x179A db #0E ; CLASS-0E FORMAT + dw x0641 ; FORMAT routine in ROM 0 +x179D db #0A ; CLASS-0A MOVE + db "," ; ',' + db #0A ; CLASS-0A + db #0C ; CLASS-0C + dw x1AF0 ; Just execute a RET +x17A3 db #0E ; CLASS-0E ERASE + dw x1C0C ; ERASE routine in ROM 0 +x17A6 db #0E ; CLASS-0E CAT + dw x1BE5 ; CAT routine in ROM 0 +x17A9 db #0C ; CLASS-0C SPECTRUM + dw x1B2B ; SPECTRUM routine in ROM 0 +x17AC: db #0E ; CLASS-0E PLAY + dw x2317 ; PLAY routine in ROM 0 + +;АДРЕС: #17AF анализ и выполнение бейсик программы +x17AF res 7,(iy+#01) + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x19FB ;получить номер редактиремой строки + xor a + ld (#5C47),a + dec a + ld (#5C3A),a + jr x17C1 +x17C0 rst #20 ;получить следующий символ +x17C1 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x16BF ;очистка рабочего буфера + inc (iy+#0D) ;номер оператора в строке + jp m,x1912 ;слишком много операторов. ошибка + rst #18 ;получение кода символа + ld b,#00 + cp #0D + jp z,x1863 ;это enter - конец строки + cp ":" + jr z,x17C0 ;следующая команда + ld hl,x1821 ;сюда вернемся + push hl + ld c,a + rst #20 ;получить следующий символ + ld a,c + sub #CE + jr nc,x17F4 ;это DEF FN и дальше + add a,#CE + ld hl,x17A9 + cp #A3 + jr z,x1800 ;это SPECTRUM + ld hl,x17AC + cp #A4 + jr z,x1800 ;это PLAY + jp x1912 ;ошибка +x17F4 ld c,a + ld hl,x16DC + add hl,bc + ld c,(hl) + add hl,bc + jr x1800 +x17FD ld hl,(#5C74) +;вызов п/п обработки команды +x1800 ld a,(hl) + inc hl + ld (#5C74),hl + ld bc,x17FD ;сюда вернемся + push bc + ld c,a + cp #20 + jr nc,x181A ;это разделитель + ld hl,x18B5 + ld b,#00 + add hl,bc + ld c,(hl) + add hl,bc + push hl ;п/п обработки класса + rst #18 ;читаем код команды + dec b + ret +x181A rst #18 ;читаем код команды + cp c + jp nz,x1912 + rst #20 ;читаем код следующей команды + ret +x1821 call x05D6 ;проверка нажатия break и печать сообщения + jr c,x182A + call x05AC ;обработка ошибки без возврата + db #14 ;L Break into program +x182A bit 7,(iy+#0A) + jp nz,x18A8 + ld hl,(#5C42) ;номер строки бейсик программы + bit 7,h + jr z,x184C ;это строка программы +x1838 ld hl,#FFFE ;выполнение команды из строки редактирования + ld (#5C45),hl + ld hl,(#5C61) + dec hl + ld de,(#5C59) + dec de + ld a,(#5C44) + jr x1882 ;следующая строка программы + +;новая строка программы +x184C rst #28 ;вызов процедуры из basic 48k + dw Rom1.x196E ;получить начальный адрес строки программы + ld a,(#5C44) + jr z,x1870 ;поиск следующей строки + and a + jr nz,x189D ;N Statement lost + ld b,a + ld a,(hl) + and #C0 + ld a,b + jr z,x1870 ;еще не конец программы + call x05AC ;обработка ошибки без возврата + db #FF ;0 OK +;обработка команды: REM +x1862 pop bc +;обработка конца строки программы +x1863 bit 7,(iy+#01) + ret z ;это проверка синтаксиса + ld hl,(#5C55) ;адрес следующей строки программы + ld a,#C0 + and (hl) + ret nz ;следующая строка программы в RAM + xor a +;поиск следующей строки +x1870 cp #01 + adc a,#00 + ld d,(hl) + inc hl + ld e,(hl) ;номер строки программы + ld (#5C45),de + inc hl + ld e,(hl) + inc hl + ld d,(hl) ;длина строки программы + ex de,hl + add hl,de + inc hl +;следующая строка программы +x1882 ld (#5C55),hl ;адрес следующей строки + ex de,hl + ld (#5C5D),hl + ld d,a + ld e,#00 + ld (iy+#0A),#FF ;номер следующего оператора в строке + dec d + ld (iy+#0D),d ;номер выполняемого оператора + jp z,x17C0 ;первая команда в строке + inc d + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x198B ;поиск команды в строке + jr z,x18A8 ;команда найдена +x189D call x05AC + db #16 ;N Statement lost +;следующая строка программы +x18A1 bit 7,(iy+#01) + ret nz ;выполнение программы + pop bc + pop bc +;следующая команда в строке программы +x18A8 rst #18 ;читаем символ из строки + cp #0D + jr z,x1863 ;конец строки + cp ":" + jp z,x17C0 ;следующая команда + jp x1912 ;ошибка: noncens in basic + +;АДРЕС: #18B5 таблица смещений до процедур обработки класса оператора +x18B5 db x18D9-$ ;CLASS-00 -> x18D9 = #24 + db x18F9-$ ;CLASS-01 -> x18F9 = #43 + db x18FD-$ ;CLASS-02 -> x18FD = #46 + db x18D6-$ ;CLASS-03 -> x18D6 = #1E + db x1905-$ ;CLASS-04 -> x1905 = #4C + db x18DA-$ ;CLASS-05 -> x18DA = #20 + db x190E-$ ;CLASS-06 -> x190E = #53 + db x191A-$ ;CLASS-07 -> x191A = #5E + db x190A-$ ;CLASS-08 -> x190A = #4D + db x1944-$ ;CLASS-09 -> x1944 = #86 + db x1916-$ ;CLASS-0A -> x1916 = #57 + db x1948-$ ;CLASS-0B -> x1948 = #88 + db x18C7-$ ;CLASS-0C -> x18C7 = #06 + db x18C4-$ ;CLASS-0D -> x18C4 = #02 + db x18C8-$ ;CLASS-0E -> x18C8 = #05 + +;АДРЕС: #18C4 классы #0C,#0D,#0E +x18C4 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1CDE ;получение параметра-числа +x18C7 cp a +x18C8 pop bc + call z,x18A1 ;если проверка синтаксиса, переход к следующей команде + ex de,hl + ld hl,(#5C74) + ld c,(hl) + inc hl + ld b,(hl) + ex de,hl + push bc + ret + +;АДРЕС: #18D6 классы #00,#03,#05 +x18D6 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1CDE ;получение параметра-числа +x18D9 cp a +x18DA pop bc + call z,x18A1 ;если проверка синтаксиса, переход к следующей команде + ex de,hl + ld hl,(#5C74) + ld c,(hl) + inc hl + ld b,(hl) + ex de,hl + push hl + ld hl,x18F8 ;сюда вернемся + ld (x5B5A),hl + ld hl,x5B14 + ex (sp),hl + push hl + ld h,b + ld l,c + ex (sp),hl + jp x5B00 +x18F8 ret + +;АДРЕС: #18F9 класс #01 +x18F9 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1C1F ;идентификация переменной + ret + +;АДРЕС: #18FD класс #02 +x18FD pop bc + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1C56 ;получить значение параметра + call x18A1 ;если проверка синтаксиса, переход к следующей команде + ret + +;АДРЕС: #1905 класс #04 FOR/NEXT +x1905 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1C6C ;FOR i + ret + +;АДРЕС: #1909 класс #08 +x1909 rst #20 +x190A rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1C7A ;получение двух значений + ret + +;АДРЕС: #190E класс #06 +x190E rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1C82 ;получение числового значения + ret + +;АДРЕС: #1912 ошибка C Nonsense in BASIC +x1912 call x05AC + db #0B ;C Nonsense in BASIC + +;АДРЕС: #1916 класс #0A +x1916 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1C8C ;параметр - строка + ret + +;АДРЕС: #191A класс #07 +x191A bit 7,(iy+#01) + res 0,(iy+#02) + jr z,x1927 ;проверка синтаксиса + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0D4D ;копирование атрибутов +x1927 pop af + ld a,(#5C74) + sub #28+(low x177F) ;#A7 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x21FC ;изменение временных атрибутов + call x18A1 ;если проверка синтаксиса, переход к следующей команде + ld hl,(#5C8F) ;ATTR_T + ld (#5C8D),hl ;ATTR_P + ld hl,#5C91 ;P_FLAG + ld a,(hl) + rlca + xor (hl) + and #AA + xor (hl) + ld (hl),a + ret + +;АДРЕС: #1944 класс #09 +x1944 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1CBE ;установка необязательных атрибутов для печати + ret + +;АДРЕС: #1948 класс #0B +x1948 pop af + ld a,(x5B66) + and #0F + ld (x5B66),a + ld a,(#5C74) + sub 1+(low x1773) ;#74 + ld (#5C74),a + jp z,x11EB ;SAVE + dec a + jp z,x11F2 ;LOAD + dec a + jp z,x11F9 ;VERIFY + jp x1200 ;MERGE + +;АДРЕС: #1967 команда IF +x1967 pop bc + bit 7,(iy+#01) + jr z,x197E ;проверка синтаксиса + ld hl,(#5C65) + ld de,-5 + add hl,de + ld (#5C65),hl + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x34E9 ;проверка значения на ноль + jp c,x1863 ;если не ноль переход на следующую строку +x197E jp x17C1 ;перехд на следующую команду (THEN) + +;АДРЕС: #1981 команда FOR +x1981 cp #CD + jr nz,x198E ;ищем оператор STEP + rst #20 + call x190E ;получение числового значения + call x18A1 ;если проверка синтаксиса, переход к следующей команде + jr x19A6 +x198E call x18A1 ;если проверка синтаксиса, переход к следующей команде + ld hl,(#5C65) + ld (hl),#00 ;поместим значение на стэк калькулятора + inc hl + ld (hl),#00 + inc hl + ld (hl),#01 + inc hl + ld (hl),#00 + inc hl + ld (hl),#00 + inc hl + ld (#5C65),hl +x19A6 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1D16 + ret + +;АДРЕС: #19AA команда READ +x19AA rst #20 +x19AB call x18F9 ;идентификация переменной + bit 7,(iy+#01) + jr z,x19E2 ;проверка синтаксиса + rst #18 + ld (#5C5F),hl + ld hl,(#5C57) + ld a,(hl) + cp "," + jr z,x19CB + ld e,#E4 ;поиск оператора DATA + rst #28 + dw Rom1.x1D86 ;поиск оператора + jr nc,x19CB ;оператор найден + call x05AC + db #0D ;E Out of Data +x19CB inc hl + ld (#5C5D),hl + ld a,(hl) + rst #28 + dw Rom1.x1C56 ;извлечь значение + rst #18 + ld (#5C57),hl + ld hl,(#5C5F) + ld (iy+#26),#00 + ld (#5C5D),hl + ld a,(hl) +x19E2 rst #18 + cp "," + jr z,x19AA + call x18A1 ;если проверка синтаксиса, переход к следующей команде + ret + +;АДРЕС: #19EB команда DATA +x19EB bit 7,(iy+#01) + jr nz,x19FC ;исполнение программы +x19F1 rst #28 + dw Rom1.x24FB ;ищем следующее выражение + cp "," + call nz,x18A1 ;если проверка синтаксиса, переход к следующей команде + rst #20 + jr x19F1 +x19FC ld a,#E4 +x19FE rst #28 + dw Rom1.x1E39 ;проверить инструкцию DATA или DEF FN + ret + +;АДРЕС: #1A02 команда RUN +x1A02 rst #28 + dw Rom1.x1E67 ;команда GO TO + ld bc,#0000 + rst #28 + dw Rom1.x1E45 + jr x1A10 + +;АДРЕС: #1A0D команда CLEAR +x1A0D rst #28 + dw Rom1.x1E99 ;извлечь операнд +x1A10 ld a,b + or c + jr nz,x1A18 + ld bc,(#5CB2) +x1A18 push bc + ld de,(#5C4B) + ld hl,(#5C59) + dec hl + rst #28 + dw Rom1.x19E5 ;удалить переменные + rst #28 + dw Rom1.x0D6B ;CLS + ld hl,(#5C65) + ld de,#0032 + add hl,de + pop de + sbc hl,de + jr nc,x1A3B + ld hl,(#5CB4) + and a + sbc hl,de + jr nc,x1A3F +x1A3B call x05AC + db #15 ;M Ramtop no good +x1A3F ld (#5CB2),de + pop de + pop hl + pop bc + ld sp,(#5CB2) + inc sp + push bc + push hl + ld (#5C3D),sp + push de + ret + +;АДРЕС: #1A53 команда GO SUB +x1A53 pop de + ld h,(iy+#0D) + inc h + ex (sp),hl + inc sp + ld bc,(#5C45) + push bc + push hl + ld (#5C3D),sp + push de + rst #28 + dw Rom1.x1E67 ;команда GO TO + ld bc,#0014 + rst #28 + dw Rom1.x1F05 ;проверка наличия свободной памяти + ret + +;АДРЕС: #1A6F команда RETURN +x1A6F pop bc + pop hl + pop de + ld a,d + cp #3E + jr z,x1A86 + dec sp + ex (sp),hl + ex de,hl + ld (#5C3D),sp + push bc + ld (#5C42),hl + ld (iy+#0A),d + ret +x1A86 push de + push hl + call x05AC + db #06 ;7 RETURN without GO SUB + +;АДРЕС: #1A8C команда DEF FN +x1A8C bit 7,(iy+#01) + jr z,x1A97 ;проверка синтаксиса + ld a,#CE + jp x19FE +x1A97 set 6,(iy+#01) + rst #28 + dw Rom1.x2C8D ;это буква? + jr nc,x1AB6 ;нет + rst #20 + cp "$" + jr nz,x1AAA + res 6,(iy+#01) + rst #20 +x1AAA cp "(" + jr nz,x1AEA + rst #20 + cp ")" + jr z,x1AD3 +x1AB3 rst #28 + dw Rom1.x2C8D ;это буква? +x1AB6 jp nc,x1912 ;ошибка + ex de,hl + rst #20 + cp "$" + jr nz,x1AC1 + ex de,hl + rst #20 +x1AC1 ex de,hl + ld bc,#0006 + rst #28 + dw Rom1.x1655 ;резервирование места (длина в bc) + inc hl + inc hl + ld (hl),#0E + cp "," + jr nz,x1AD3 + rst #20 + jr x1AB3 +x1AD3 cp ")" + jr nz,x1AEA + rst #20 + cp "=" + jr nz,x1AEA + rst #20 + ld a,(#5C3B) + push af + rst #28 + dw Rom1.x24FB ;ищем следующее выражение + pop af + xor (iy+#01) + and #40 +x1AEA jp nz,x1912 ;ошибка + call x18A1 + +;АДРЕС: #1AF0 команда MOVE +x1AF0 ret + +;АДРЕС: #1AF1 пункт меню Tape Loader +x1AF1 ld hl,#EC0E + ld (hl),#FF + call x1F20 ;установка другого стэка и ram 0 + rst #28 + dw Rom1.x16B0 ;очистка различных областей памяти + ld hl,(#5C59) + ld bc,#0003 + rst #28 + dw Rom1.x1655 ;резервирование места (длина в bc) + ld hl,x1B6E + ld de,(#5C59) + ld bc,#0003 +x1B0F ldir + +;АДРЕС: #1B11 анализ и выполненение введенной строки +x1B11 call x026B ;анализ и выполненение введенной строки + +;АДРЕС: #1B14 пункт меню редактора Print (печать на принтер) +x1B14 call x1F20 ;установка другого стэка и ram 0 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x16B0 ;очистка различных областей памяти + ld hl,(#5C59) ;адрес начала редактируемой строки + ld bc,#0001 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1655 ;резервирование места (длина в bc) + ld hl,(#5C59) ;адрес начала редактируемой строки + ld (hl),#E1 ;команда LLIST + call x026B ;исполнение команды (без возврата) + +;АДРЕС: #1B2B команда SPECTRUM +x1B2B call x1B53 ;установка канала 'P' + ld sp,(#5C3D) + pop hl + ld hl,Rom1.x1303 ;основной цикл basic 48 + push hl + ld hl,Rom1.x0013 ;адрес с байтом #FF в rom 1 + push hl + ld hl,x0008 ;обработчик ошибок + push hl ;!!!ОШИБКА!!! + ld a,#20 ;basic48, блокировка #7FFD, ram 0 + ld (x5B5C),a + jp x5B00 + +;АДРЕС: #1B47 пунт меню BASIC 48. включение basic48, блокировка #7FFD и переход на адрес #0000 +x1B47 ld hl,#0000 + +;АДРЕС: #1B4A включение basic48, блокировка #7FFD и переход на адрес в hl +x1B4A push hl + ld a,#20 + ld (x5B5C),a + jp x5B00 + +;АДРЕС: #1B53 установка канала 'P' +x1B53 ld hl,(#5C4F) ;адрес начала области информации о каналах + ld de,#0005 + add hl,de ;канал S + ld de,#000A + ex de,hl + add hl,de + ex de,hl ;канал P + ld bc,#0004 + ldir + res 3,(iy+#30) ;курсор L + res 4,(iy+#01) ;режим zx-48 + ret + +;АДРЕС: #1B6E данные для команды LOAD "" +x1B6E db #EF,#22,#22 ;load "" + +;АДРЕС: #1B71 команда LLIST +x1B71 ld a,#03 + jr x1B77 + +;АДРЕС: #1B75 команда LIST +x1B75 ld a,#02 +x1B77 ld (iy+#02),#00 + rst #28 + dw Rom1.x2530 ;проверка флага проверка/исполнение программы + jr z,x1B83 ;проверка + rst #28 + dw Rom1.x1601 ;открыть канал +x1B83 rst #28 ;!!!можно rst #18 + dw Rom1.x0018 ;чтение очередного символа строки программы +x1B86 rst #28 + dw Rom1.x2070 ;нужно ли изменять поток? + jr c,x1BA3 ;не нужно + rst #28 ;!!!можно rst #18 + dw Rom1.x0018 ;чтение очередного символа строки программы +x1B8E cp ";" + jr z,x1B96 + cp "," + jr nz,x1B9E +x1B96 rst #28 + dw Rom1.x0020 ;чтение следующего символа строки программы +x1B99 call x190E ;получение числового значения + jr x1BA6 +x1B9E rst #28 + dw Rom1.x1CE6 ;ноль на стэк калькулятора + jr x1BA6 +x1BA3 rst #28 + dw Rom1.x1CDE ;получение параметра-числа +x1BA6 call x18A1 + rst #28 + dw Rom1.x1825 ;LIST-5+3 + ret + +;АДРЕС: #1BAD команда RAM disk SAVE! +x1BAD ld (x5B81),sp + ld sp,x5BFF + call x1C97 ;создание новой записи в каталоге RAM-диска + ld bc,(x5B72) + ld hl,-9 + or #FF + sbc hl,bc + call x1CF3 ;коррекция сводного места на RAM диске + ld bc,#0009 + ld hl,x5B71 + call x1DAC ;сохранение данных на RAM диске + ld hl,(x5B74) + ld bc,(x5B72) + call x1DAC ;сохранение данных на RAM диске + call x1D56 ;обновление записи каталога + ld a,#05 ;ram 0 + call x1C64 + ld sp,(x5B81) + ret + +;АДРЕС: #1BE5 команда RAM disk CAT! +x1BE5 rst #28 + dw Rom1.x0018 ;чтение очередного символа строки программы + cp "!" + jp nz,x1912 ;ошибка + rst #28 + dw Rom1.x0020 ;чтение следующего символа строки программы + call x18A1 + ld a,#02 ;канал #02 + rst #28 + dw Rom1.x1601 ;открыть канал + ld (x5B81),sp + ld sp,x5BFF + call x20D2 ;печать каталога RAM диска + ld a,#05 ;ram 0 + call x1C64 + ld sp,(x5B81) + ret + +;АДРЕС: #1C0C команда RAM disk EARSE! +x1C0C rst #28 + dw Rom1.x0018 ;чтение очередного символа строки программы + cp "!" + jp nz,x1912 ;ошибка + call x1393 ;проверка и копирование имени файла + call x18A1 + ld (x5B81),sp + ld sp,x5BFF + call x1F5F ;удаление файла из RAM диска + ld a,#05 ;ram 0 + call x1C64 + ld sp,(x5B81) + ret + +;АДРЕС: #1C2E загрузка заголовка файла из RAM диска +x1C2E ld (x5B81),sp + ld sp,x5BFF + call x1D35 ;поиск файла на RAM диске + ld hl,x5B71 + ld bc,#0009 + call x1E37 ;загрузка данных с RAM диска + ld a,#05 ;ram 0 + call x1C64 + ld sp,(x5B81) + ret + +;АДРЕС: #1C4B загрузка из RAM диска +x1C4B ld (x5B81),sp + ld sp,x5BFF + ld b,d + ld c,e + call x1E37 ;загрузка данных с RAM диска + call x1D56 ;обновление записи каталога + ld a,#05 ;ram 0 + call x1C64 + ld sp,(x5B81) + ret + +;АДРЕС: #1C64 включение логической страницы в A +x1C64 push hl + push bc + ld hl,x1C81 + ld b,#00 + ld c,a + add hl,bc + ld c,(hl) + di + ld a,(x5B5C) + and #F8 + or c + ld (x5B5C),a + ld bc,#7FFD + out (c),a + ei + pop bc + pop hl + ret +x1C81 db #01,#03,#04,#06,#07,#00 + +;АДРЕС: #1C87 сравнение имени файла с заданным +;вых: z - имена совпадают +x1C87 ld de,x5B67 +x1C8A push ix + pop hl + ld b,#0A +x1C8F ld a,(de) + inc de + cp (hl) + inc hl + ret nz + djnz x1C8F + ret + +;АДРЕС: #1C97 создание новой записи в каталоге RAM-диска +x1C97 call x1D12 ;поиск имени файла в каталоге + jr z,x1CA0 ;имя не найдено + call x05AC + db #20 ;e File already exists +x1CA0 push ix + ld bc,#3FEC ;максимальный размер каталога + add ix,bc + pop ix + jr nc,x1D0E ;нехватает памяти + ld hl,-20 + ld a,#FF + call x1CF3 ;коррекция сводного места на RAM диске + ld hl,x5B66 + set 2,(hl) + push ix ;копируем имя файла + pop de + ld hl,x5B67 + ld bc,#000A + ldir + set 0,(ix+#13) ;запись обновлена + ld a,(ix+#0A) ;адрес начала файла = адрес конца файла + ld (ix+#10),a + ld a,(ix+#0B) + ld (ix+#11),a + ld a,(ix+#0C) + ld (ix+#12),a + xor a + ld (ix+#0D),a ;длина файла =#000000 + ld (ix+#0E),a + ld (ix+#0F),a + ld a,#05 + call x1C64 ;ram 0 + push ix + pop hl + ld bc,-20 + add hl,bc + ld (x5B83),hl + ret + +;АДРЕС: #1CF3 коррекция сводного места на RAM диске +x1CF3 ld de,(x5B85) + ex af,af' + ld a,(x5B85+2) + ld c,a + ex af,af' + bit 7,a + jr nz,x1D0A + add hl,de + adc a,c +x1D03 ld (x5B85),hl + ld (x5B85+2),a + ret +x1D0A add hl,de + adc a,c + jr c,x1D03 +x1D0E call x05AC + db #03 ;4 Out of memory + +;АДРЕС: #1D12 поиск имени файла в каталоге +;вых: z - файл не найден +; nz - файл наден -> ix - адрес дескриптора +x1D12 ld a,#04 ;ram 7 + call x1C64 + ld ix,#EBEC ;адрес первой записи в каталоге +x1D1B ld de,(x5B83) + or a + push ix + pop hl + sbc hl,de + ret z + call x1C87 ;сравнение имени файла с заданным + jr nz,x1D2E ;имя не совпало + or #FF + ret +x1D2E ld bc,-20 + add ix,bc + jr x1D1B + +;АДРЕС: #1D35 поиск файла на RAM диске +x1D35 call x1D12 ;поиск имени файла в каталоге + jr nz,x1D3E ;найден + call x05AC + db #23 ;h File does not exist +x1D3E ld a,(ix+#0A) + ld (ix+#10),a + ld a,(ix+#0B) + ld (ix+#11),a + ld a,(ix+#0C) + ld (ix+#12),a + ld a,#05 ;ram 0 + call x1C64 + ret + +;АДРЕС: #1D56 обновление записи каталога +x1D56 ld a,#04 ;ram 7 + call x1C64 + bit 0,(ix+#13) + ret z ;обновлять не надо + res 0,(ix+#13) + ld hl,x5B66 + res 2,(hl) + ld l,(ix+#10) + ld h,(ix+#11) + ld a,(ix+#12) + ld e,(ix+#0A) + ld d,(ix+#0B) + ld b,(ix+#0C) + or a + sbc hl,de + sbc a,b + rl h + rl h + sra a + rr h + sra a + rr h + ld (ix+#0D),l + ld (ix+#0E),h + ld (ix+#0F),a + ld l,(ix+#10) + ld h,(ix+#11) + ld a,(ix+#12) + ld bc,-20 + add ix,bc + ld (ix+#0A),l + ld (ix+#0B),h + ld (ix+#0C),a + ret + +;АДРЕС: #1DAC сохранение данных на RAM диске +;вх: hl - откуда +; bc - сколько +x1DAC ld a,b + or c + ret z + push hl + ld de,#C000 + ex de,hl + sbc hl,de + jr z,x1DD5 + jr c,x1DD5 + push hl + sbc hl,bc + jr nc,x1DCC + ld h,b + ld l,c + pop bc + or a + sbc hl,bc + ex (sp),hl + ld de,#C000 + push de + jr x1DF4 +x1DCC pop hl + pop hl + ld de,#0000 + push de + push de + jr x1DF4 +x1DD5 ld h,b + ld l,c + ld de,#0020 + or a + sbc hl,de + jr c,x1DE4 + ex (sp),hl + ld b,d + ld c,e + jr x1DE9 +x1DE4 pop hl + ld de,#0000 + push de +x1DE9 push bc + ld de,x5B98 + ldir + pop bc + push hl + ld hl,x5B98 +x1DF4 ld a,#04 + call x1C64 ;ram 7 + ld e,(ix+#10) + ld d,(ix+#11) + ld a,(ix+#12) + call x1C64 +x1E05 ldi + ld a,d + or e + jr z,x1E24 +x1E0B ld a,b + or c + jp nz,x1E05 + ld a,#04 ;ram 7 + call x1C64 + ld (ix+#10),e + ld (ix+#11),d + ld a,#05 ;ram 0 + call x1C64 + pop hl + pop bc + jr x1DAC +x1E24 ld a,#04 ;ram 7 + call x1C64 + inc (ix+#12) + ld a,(ix+#12) + ld de,#C000 + call x1C64 + jr x1E0B + +;АДРЕС: #1E37 загрузка данных с RAM диска +;вх: hl - куда +; bc - сколько +x1E37 ld a,b + or c + ret z + push hl + ld de,#C000 + ex de,hl + sbc hl,de + jr z,x1E67 + jr c,x1E67 + push hl + sbc hl,bc + jr nc,x1E5C + ld h,b + ld l,c + pop bc + or a + sbc hl,bc + ex (sp),hl + ld de,#0000 + push de + ld de,#C000 + push de + ex de,hl + jr x1E80 +x1E5C pop hl + pop hl + ld de,#0000 + push de + push de + push de + ex de,hl + jr x1E80 +x1E67 ld h,b + ld l,c + ld de,#0020 + or a + sbc hl,de + jr c,x1E76 + ex (sp),hl + ld b,d + ld c,e + jr x1E7B +x1E76 pop hl + ld de,#0000 + push de +x1E7B push bc + push hl + ld de,x5B98 +x1E80 ld a,#04 ;ram 7 + call x1C64 + ld l,(ix+#10) + ld h,(ix+#11) + ld a,(ix+#12) + call x1C64 +x1E91 ldi + ld a,h + or l + jr z,x1EBC +x1E97 ld a,b + or c + jp nz,x1E91 + ld a,#04 ;ram 0 + call x1C64 + ld (ix+#10),l + ld (ix+#11),h + ld a,#05 ;ram 7 + call x1C64 + pop de + pop bc + ld hl,x5B98 + ld a,b + or c + jr z,x1EB7 + ldir +x1EB7 ex de,hl + pop bc + jp x1E37 +x1EBC ld a,#04 ;ram 0 + call x1C64 + inc (ix+#12) + ld a,(ix+#12) + ld hl,#C000 + call x1C64 + jr x1E97 + +;АДРЕС: #1ECF !!!NOT USED!!! запись данных в RAM 7 +;вх: hl - откуда +; de - куда +; bc - сколько +x1ECF push af + ld a,(x5B5C) + push af + push hl + push de + push bc + ld ix,x5B67+3 ;x5B6A + ld (ix+#10),e + ld (ix+#11),d + ld (ix+#12),#04 + call x1DAC ;сохранение данных на RAM диске +x1EE8 ld a,#05 ;ram 0 + call x1C64 + pop bc + pop de + pop hl + add hl,bc + ex de,hl + add hl,bc + ex de,hl + pop af + ld bc,#7FFD + di + out (c),a + ld (x5B5C),a + ei + ld bc,#0000 + pop af + ret + +;АДРЕС: #1F04 !!!NOT USED!!! чтение данных из RAM 7 +x1F04 push af + ld a,(x5B5C) + push af + push hl + push de + push bc + ld ix,x5B67+3 ;x5B6A + ld (ix+#10),l + ld (ix+#11),h + ld (ix+#12),#04 + ex de,hl + call x1E37 ;загрузка данных с RAM диска + jr x1EE8 + +;АДРЕС: #1F20 установка другого стэка и ram 0 +x1F20 ex af,af' + ld a,#00 + di + call x1F3A ;включение страницы ram 0 + pop af + ld (x5B58),hl + ld hl,(x5B81) + ld (x5B81),sp + ld sp,hl + ei + ld hl,(x5B58) + push af + ex af,af' + ret + +;АДРЕС: #1F3A включение физической страницы ram +;вх: a - номер страницы +x1F3A push bc + ld bc,#7FFD + out (c),a + ld (x5B5C),a + pop bc + ret + +;АДРЕС: #1F45 установка другого стэка и ram 7 +;вх: (x5B81) - адрес другого стэка +x1F45 ex af,af' + di + pop af + ld (x5B58),hl + ld hl,(x5B81) + ld (x5B81),sp + ld sp,hl + ld hl,(x5B58) + push af + ld a,#07 + call x1F3A ;включение страницы ram + ei + ex af,af' + ret + +;АДРЕС: #1F5F удаление файла из RAM диска +x1F5F call x1D12 ;поиск имени файла в каталоге + jr nz,x1F68 ;файл найден + call x05AC + db #23 ;h File does not exist +x1F68 ld l,(ix+#0D) + ld h,(ix+#0E) + ld a,(ix+#0F) + call x1CF3 ;коррекция свободного места на RAM диске + push iy + ld iy,(x5B83) + ld bc,-20 + add ix,bc + ld l,(iy+#0A) + ld h,(iy+#0B) + ld a,(iy+#0C) + pop iy + ld e,(ix+#0A) + ld d,(ix+#0B) + ld b,(ix+#0C) + or a + sbc hl,de + sbc a,b + rl h + rl h + sra a + rr h + sra a + rr h + ld bc,#0014 + add ix,bc + ld (ix+#10),l + ld (ix+#11),h + ld (ix+#12),a + ld bc,-20 + add ix,bc + ld l,(ix+#0A) + ld h,(ix+#0B) + ld d,(ix+#0C) + ld bc,#0014 + add ix,bc + ld a,d + call x1C64 + ld a,(x5B5C) + ld e,a + ld bc,#7FFD + ld a,#07 ;rom 0, ram 7 + di + out (c),a + exx + ld l,(ix+#0A) + ld h,(ix+#0B) + ld d,(ix+#0C) + ld a,d + call x1C64 + ld a,(x5B5C) + ld e,a + ld bc,#7FFD + exx +x1FEA ld a,#07 ;rom 0, ram 7 + di + out (c),a + ld a,(ix+#10) + sub #01 + ld (ix+#10),a + jr nc,x200D + ld a,(ix+#11) + sub #01 + ld (ix+#11),a + jr nc,x200D + ld a,(ix+#12) + sub #01 + ld (ix+#12),a + jr c,x203E +x200D out (c),e + ld a,(hl) + inc l + jr nz,x2024 + inc h + jr nz,x2024 + ex af,af' + inc d + ld a,d + call x1C64 + ld a,(x5B5C) + ld e,a + ld hl,#C000 + ex af,af' +x2024 exx + di + out (c),e + ld (hl),a + inc l + jr nz,x203B + inc h + jr nz,x203B + inc d + ld a,d + call x1C64 + ld a,(x5B5C) + ld e,a + ld hl,#C000 +x203B exx + jr x1FEA +x203E ld a,#04 + call x1C64 + ld a,#00 + ld hl,#0014 + call x1CF3 ;коррекция свободного места на RAM диске + ld e,(ix+#0D) + ld d,(ix+#0E) + ld c,(ix+#0F) + ld a,d + rlca + rl c + rlca + rl c + ld a,d + and #3F + ld d,a + push ix +x2061 push de + ld de,-20 + add ix,de + pop de + ld l,(ix+#0A) + ld h,(ix+#0B) + ld a,(ix+#0C) + or a + sbc hl,de + sub c + bit 6,h + jr nz,x207C + set 6,h + dec a +x207C ld (ix+#0A),l + ld (ix+#0B),h + ld (ix+#0C),a + ld l,(ix+#10) + ld h,(ix+#11) + ld a,(ix+#12) + or a + sbc hl,de + sub c + bit 6,h + jr nz,x2099 + set 6,h + dec a +x2099 ld (ix+#10),l + ld (ix+#11),h + ld (ix+#12),a + push ix + pop hl + push de + ld de,(x5B83) + or a + sbc hl,de + pop de + jr nz,x2061 + ld de,(x5B83) + pop hl + push hl + or a + sbc hl,de + ld b,h + ld c,l + pop hl + push hl + ld de,#0014 + add hl,de + ex de,hl + pop hl + dec de + dec hl + lddr + ld hl,(x5B83) + ld de,#0014 + add hl,de + ld (x5B83),hl + ret + +;АДРЕС: #20D2 печать каталога RAM диска +x20D2 ld a,#04 ;ram 7 + call x1C64 + ld hl,x2121 +x20DA ld bc,x212B + ld ix,#EBEC +x20E1 call x05D6 ;проверка нажатия break и печать сообщения + push ix + ex (sp),hl + ld de,(x5B83) + or a + sbc hl,de + pop hl + jr z,x2111 + ld d,h + ld e,l + push hl + push bc + call x1C8A ;сравнение имени файла с заданным + pop bc + pop hl + jr nc,x210A + ld d,b + ld e,c + push hl + push bc + call x1C8A ;сравнение имени файла с заданным + pop bc + pop hl + jr c,x210A + push ix + pop bc +x210A ld de,-20 + add ix,de + jr x20E1 +x2111 push hl + ld hl,x212B + or a + sbc hl,bc + pop hl + ret z + ld h,b + ld l,c + call x2135 ;печать одной записи каталога RAM диска + jr x20DA +x2121 ds #0A,#00 +x212B ds #0A,#FF + +;АДРЕС: #2135 печать одной записи каталога RAM диска +x2135 push hl + push bc + pop hl + ld de,x5B67 + ld bc,#000A + ldir + ld a,#05 + call x1C64 ;rom 0 + ld hl,(x5B81) + ld (x5B81),sp + ld sp,hl + ld hl,x5B67 + ld b,#0A +x2152 ld a,(hl) + push hl + push bc + rst #28 + dw Rom1.x0010 ;печать символа из A + pop bc + pop hl + inc hl + djnz x2152 + ld a,#0D + rst #28 + dw Rom1.x0010 ;перевод строки + rst #28 + dw Rom1.x0D4D ;копиравоние атрибутов + ld hl,(x5B81) + ld (x5B81),sp + ld sp,hl + ld a,#04 ;ram 7 + call x1C64 + pop hl + ret + +;АДРЕС: #2174 команда LPRINT +x2174 ld a,#03 + jr x217A + +;АДРЕС: #2178 команда PRINT +x2178 ld a,#02 +x217A rst #28 + dw Rom1.x2530 ;проверка флага проверка/исполнение программы + jr z,x2182 + rst #28 + dw Rom1.x1601 ;открыть канал +x2182 rst #28 + dw Rom1.x0D4D ;копиравоние атрибутов + rst #28 + dw Rom1.x1FDF ;PRINT_2 + call x18A1 + ret + +;АДРЕС: #218C команда INPUT +x218C rst #28 + dw Rom1.x2530 ;проверка флага проверка/исполнение программы + jr z,x2199 + ld a,#01 + rst #28 + dw Rom1.x1601 ;открыть канал + rst #28 ;!!!ОШИБКА!!! + dw Rom1.x0D6E +x2199 ld (iy+#02),#01 + rst #28 + dw Rom1.x20C1 ;ввод данных по input + call x18A1 + rst #28 + dw Rom1.x20A0 ;ввод с клавиатуры + ret + +;АДРЕС: #21A7 команда COPY +x21A7 jp x08F0 + +;АДРЕС: #21AA команда NEW +x21AA di + jp x019D + +;АДРЕС: #21AE команда CIRCLE +x21AE rst #18 + cp "," + jr nz,x21EB ;ошибка + rst #20 + rst #28 + dw Rom1.x1C82 ;получение числового значения + call x18A1 + rst #28 + dw Rom1.x232D ;печать окружности + ret + +;АДРЕС: #21BE команда DRAW +x21BE rst #18 + cp "," + jr z,x21CA + call x18A1 + rst #28 + dw Rom1.x2477 ;печать линии + ret +x21CA rst #20 + rst #28 + dw Rom1.x1C82 ;получение числового значения + call x18A1 + rst #28 + dw Rom1.x2394 ;печать линии + ret + +;АДРЕС: #21D5 команда DIM +x21D5 rst #28 + dw Rom1.x28B2 ;LOOK-VARS + jr nz,x21EB + rst #28 + dw Rom1.x2530 ;проверка флага проверка/исполнение программы + jr nz,x21E7 + res 6,c + rst #28 + dw Rom1.x2996 ;проверкае синтаксиса выражения, заключенного в скобки + call x18A1 +x21E7 rst #28 + dw Rom1.x2C15 ;D-RUN + ret + +x21EB call x05AC + db #0B ;C Nonsense in BASIC + +;АДРЕС: #21EF очистка экрана +x21EF bit 0,(iy+#30) + ret z + rst #28 + dw Rom1.x0DAF ;очистить экран + ret + +;АДРЕС: #21F8 вычисличть числовое выражение +x21F8 ld hl,#FFFE + ld (#5C45),hl ;выполнение оператора в непосредственном режиме + res 7,(iy+#01) ;проверка синтаксиса + call x228E ;поиск начала бейсик команды + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x24FB ;анализ строки + bit 6,(iy+#01) + jr z,x223A ;обработка символьного выражения + rst #18 ;получить символ + cp #0D + jr nz,x223A + set 7,(iy+#01) ;выполнение программы + call x228E ;поиск начала бейсик команды + ld hl,x0321 ;адрес возврата при ошибке + ld (x5B8B),hl + rst #28 + dw Rom1.x24FB ;анализ строки + bit 6,(iy+#01) + jr z,x223A ;обработка символьного выражения + ld de,x5B8D ;адрес последней длины, выводимой при вычислениях + ld hl,(#5C65) ;адрес вершины стэка калькулятора + ld bc,#0005 + or a + sbc hl,bc + ldir + jp x223E +x223A call x05AC ;без возврата + db #19 ;Q Parameter error, n:m +x223E ld a,#0D + call x226F ;обработка нажатой клавиши + ld bc,#0001 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0030 ;резервирование места +x2249 ld (#5C5B),hl ;адрес символа редактируемой строки + push hl + ld hl,(#5C51) ;адрес описателя текущего канала + push hl + ld a,#FF ;канал -1 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1601 ;открыть канал + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x2DE3 ;печать числа с плавающей точкой + pop hl + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1615 ;установка флагов канала (возврат предыдущего канала) + pop de + ld hl,(#5C5B) ;адрес символа редактируемой строки + and a + sbc hl,de +x2264 ld a,(de) + call x226F ;обработка нажатой клавиши + inc de + dec hl + ld a,h + or l + jr nz,x2264 + ret + +;АДРЕС: #226F обработка нажатой клавиши +;вх: a - код клавиши +x226F push hl + push de + call x1F45 ;установка другого стэка и ram 7 + ld hl,#EC0D + res 3,(hl) + push af + ld a,#02 + rst #28 + dw Rom1.x1601 ;открыть канал #02 + pop af + call x2669 ;обработка нажатия клавиши + ld hl,#EC0D + res 3,(hl) + call x1F20 ;установка другого стэка и ram 0 + pop de + pop hl + ret + +;АДРЕС: #228E поиск начала бейсик команды +x228E ld hl,(#5C59) + dec hl + ld (#5C5D),hl + rst #20 ;получение следующего символа в бейсик программе + ret + +;АДРЕС: #2297 проверка это команда LET? (калькулятор basic 128) +;вых: z - это только команда LET +x2297 call x228E ;поиск начала бейсик команды + cp #F1 ;LET ? + ret nz + ld hl,(#5C5D) +x22A0 ld a,(hl) + inc hl + cp #0D + ret z + cp ":" + jr nz,x22A0 + or a + ret + +;АДРЕС: #22AB проверка это оператор? +x22AB ld b,a + ld hl,x22BD +x22AF ld a,(hl) + inc hl + or a + jr z,x22B9 + cp b + jr nz,x22AF + ld a,b + ret +x22B9 or #FF + ld a,b + ret + +;АДРЕС: #22BD список токенов операторов +x22BD db #2B,#2D,#2A ; '+', '-', '*' + db #2F,#5E,#3D ; '/', '^', '=' + db #3E,#3C,#C7 ; '>', '<', '<=' + db #C8,#C9,#C5 ; '>=', '<>', 'OR' + db #C6 ; 'AND' + db #00 ;маркер конца таблицы + +;АДРЕС: #22CB проверка это токен? +;вых: z - это токен +x22CB cp #A5 + jr c,x22DD + cp #C4 + jr nc,x22DD + cp #AC + jr z,x22DD + cp #AD + jr z,x22DD + cp a + ret +x22DD cp #A5 + ret + +;АДРЕС: #22E0 проверка это число или функция? +x22E0 ld b,a + or #20 + cp "a" + jr c,x22ED ;это не буква + cp "z"+1 + jr nc,x22ED ;это не буква + cp a + ret +x22ED ld a,b + cp "." + ret z + call x230A ;проверка это цифра или нет + jr nz,x2307 ;не цифра +x22F6 rst #20 ;читаем следующий симввол + call x230A ;проверка это цифра или нет + jr z,x22F6 ;это цифра + cp "." + ret z + cp "E" + ret z + cp "e" + ret z + jr x22AB ;проверка это оператор? +x2307 or #FF + ret + +;АДРЕС: #230A проверка это цифра или нет +;вых: z - это цифра +x230A cp "0" + jr c,x2314 ;это не цифра + cp "9"+1 + jr nc,x2314 ;это не цифра + cp a + ret +x2314 cp "0" + ret + +;АДРЕС: #2317 команда PLAY +x2317 ld b,#00 + rst #18 +x231A push bc + rst #28 + dw Rom1.x1C8C ;параметр - строка + pop bc + inc b + cp "," + jr nz,x2327 + rst #20 + jr x231A +x2327 ld a,b + cp #09 + jr c,x2330 + call x05AC + db #2B ;!!!ОШИБКА!!! +x2330 call x18A1 + jp x0985 + +;АДРЕС: #2336 !!!NOT USED!!! возврат в редактор +x2336 ld hl,x5BFF + ld (x5B81),hl + call x1F45 + jp x25CB + +;АДРЕС: #2342 !!!NOT USED!!! bc=hl-de +x2342 and a + sbc hl,de + ld b,h + ld c,l + add hl,de + ex de,hl + ret + +;АДРЕС: #234A !!!NOT USED!!! зарезервировать память на 1 байт +x234A ld bc,#0001 + push hl + push de + call x2358 + pop de + pop hl + rst #28 + dw Rom1.x1655 ;резервирование места (длина в bc) + ret + +;АДРЕС: #2358 !!!NOT USED!!! проверка доступности места в памяти размером в bc +x2358 ld hl,(#5C65) + add hl,bc + jr c,x2368 + ex de,hl + ld hl,#0082 + add hl,de + jr c,x2368 + sbc hl,sp + ret c +x2368 ld (iy+#00),#03 ;4 Out of Memory + jp x0321 + +;АДРЕС: #236F !!!NOT USED!!! hl=a*#20 +x236F add a,a + add a,a + +;АДРЕС: #2371 !!!NOT USED!!! hl=a*#08 +x2371 ld l,a + ld h,#00 + add hl,hl + add hl,hl + add hl,hl + ret + +;АДРЕС: #2378 !!!NOT USED!!! расчет свободного места +x2378 ld hl,#0000 + add hl,sp + ld de,(#5C65) + or a + sbc hl,de + ret + +;АДРЕС: #2384 !!!NOT USED!!! печать на экране строки из буфера +x2384 res 0,(iy-#39) + call x236F + push hl + ld de,(#FF24) + add hl,de + ld d,h + ld e,l + ex (sp),hl + push hl + push de + ld de,#5800 + add hl,de + ex de,hl + pop hl + ld bc,#0020 + ld a,(#5C8F) + call x249B + pop hl + ld a,h + ld h,#00 + add a,a + add a,a + add a,a + add a,#40 + ld d,a + ld e,h + add hl,de + ex de,hl + pop hl + ld b,#20 + jp x23E1 + +;АДРЕС: #23B8 !!!NOT USED!!! печать в буфере #FF +x23B8 ld d,#FF + call x236F + ld a,d + ld de,(#FF24) + add hl,de + ld e,l + ld d,h + inc de + ld (hl),a + dec bc + ldir + ret + +;АДРЕС: #23CB !!!NOT USED!!! копирование буфера на экран +x23CB call x2488 + ld de,#4000 + ld hl,(#FF24) + ld b,e + call x23E1 + ld d,#48 + call x23E1 + ld d,#50 + ld b,#C0 + +;АДРЕС: #23E1 !!!NOT USED!!! печать символов из буфера на экране +x23E1 ld a,(hl) + push hl + push de + cp #FE + jr c,x23EC + sub #FE + jr x2422 +x23EC cp #20 + jr nc,x23F7 + ld hl,x2527 + and a + ex af,af' + jr x242B +x23F7 cp #80 + jr nc,x2409 + call x2371 + ld de,(#5C36) + add hl,de + pop de + call #FF28 + jr x2450 +x2409 cp #90 + jr nc,x2411 + sub #7F + jr x2422 +x2411 sub #90 + call x2371 + pop de + call x1F20 + push de + ld de,(#5C7B) + scf + jr x2429 +x2422 ld de,x252F + call x2371 + and a +x2429 ex af,af' + add hl,de +x242B pop de +x242C ld c,d + ld a,(hl) + ld (de),a + inc hl + inc d + ld a,(hl) + ld (de),a + inc hl + inc d + ld a,(hl) + ld (de),a + inc hl + inc d + ld a,(hl) + ld (de),a + inc hl + inc d + ld a,(hl) + ld (de),a + inc hl + inc d + ld a,(hl) + ld (de),a + inc hl + inc d + ld a,(hl) + ld (de),a + inc hl + inc d + ld a,(hl) + ld (de),a + ld d,c + ex af,af' + call c,x1F45 +x2450 pop hl + inc hl + inc de + djnz x23E1 + ret + +;АДРЕС: #2456 !!!NOT USED!!! переключение страниц rom 0/1 +x2456 push bc + di + ld bc,#7FFD + ld a,(x5B5C) + xor #10 + out (c),a + ei + ex af,af' + +;АДРЕС: #2464 !!!NOT USED!!! переключение страниц rom 0/1 +x2464 ex af,af' + di + ld c,#FD + xor #10 + out (c),a + ei + pop bc + ret + +;АДРЕС: #246F !!!NOT USED!!! копирование п/п в ram 7 +x246F ld hl,x2456 + ld de,#FF28 + ld bc,#000E + ldir + push hl + ld hl,x242C + ld c,#20 + ldir + pop hl + ld c,#0B + ldir + ret + +;АДРЕС: #2488 !!!NOT USED!!! установка атрибутов из буфера экрана +x2488 res 0,(iy-#39) + ld de,#5800 + ld bc,#02C0 + ld hl,(#FF24) + ld a,(#5C8D) + ld (#5C8F),a + +;АДРЕС: #249B !!!NOT USED!!! установка атрибутов из буфера экрана +x249B ex af,af' +x249C push bc + ld a,(hl) + cp #FF + jr nz,x24AA + ld a,(#5C8D) + ld (de),a + inc hl + inc de + jr x2507 +x24AA ex af,af' + ld (de),a + inc de + ex af,af' + inc hl + cp #15 + jr nc,x2507 + cp #10 + jr c,x2507 + dec hl + jr nz,x24C2 + inc hl + ld a,(hl) + ld c,a + ex af,af' + and #F8 + jr x2505 +x24C2 cp #11 + jr nz,x24D1 + inc hl + ld a,(hl) + add a,a + add a,a + add a,a + ld c,a + ex af,af' + and #C7 + jr x2505 +x24D1 cp #12 + jr nz,x24DE + inc hl + ld a,(hl) + rrca + ld c,a + ex af,af' + and #7F + jr x2505 +x24DE cp #13 + jr nz,x24EC + inc hl + ld a,(hl) + rrca + rrca + ld c,a + ex af,af' + and #BF + jr x2505 +x24EC cp #14 + inc hl + jr nz,x2507 + ld c,(hl) + ld a,(#5C01) + xor c + rra + jr nc,x2507 + ld a,#01 + xor (iy-#39) + ld (#5C01),a + ex af,af' + call x2513 +x2505 or c + ex af,af' +x2507 pop bc + dec bc + ld a,b + or c + jp nz,x249C + ex af,af' + ld (#5C8F),a + ret + +;АДРЕС: #2513 !!!NOT USED!!! поменять местами ink и paper +x2513 ld b,a + and #C0 + ld c,a + ld a,b + add a,a + add a,a + add a,a + and #38 + or c + ld c,a + ld a,b + rra + rra + rra + and #07 + or c + ret + +x2527 db %00000000 ; + db %00111100 ; XXXX + db %01100010 ; XX X + db %01100000 ; XX + db %01101110 ; XX XXX + db %01100010 ; XX X + db %00111110 ; XXXX + db %00000000 ; + +x252F db %00000000 ; + db %01101100 ; XX XX + db %00010000 ; X + db %01010100 ; X X X + db %10111010 ; X XXX X + db %00111000 ; XXX + db %01010100 ; X X X + db %10000010 ; X X + +;АДРЕС: #2537 таблица адресов обработки нажатий в режиме редактирования +x2537 db #15 ;размер таблицы + db #0B: dw #2A94 ;перемещение курсора вверх в поле редактирования + db #0A: dw #2AB5 ;перемещение курсора вниз в поле редактирования + db #08: dw #2AD7 ;перемещение курсора влево в поле редактирования + db #09: dw #2AE3 ;перемещение курсора вправо в поле редактирования + db #AD: dw #2A4F ;ext+P перемещение курсора вверх на 10 строк в поле редактирования + db #AC: dw #2A25 ;ss+I перемещение курсора вниз на 10 строк в поле редактирования + db #AF: dw #29D4 ;ext+I переход к началу текущего слова + db #AE: dw #29E1 ;ext+shift+J переход к началу следующего слова + db #A6: dw #2983 ;ext+N/Graph+W переход к первой строке бейсик программы + db #A5: dw #29AB ;ext+T/Graph+V переход к последней строке бейсик программы + db #A8: dw #2A87 ;ext+ss+2/Graph+Y переход к началу строки редактирования + db #A7: dw #2A7A ;ext+M/graph+X перемещение курсора в конец строки в поле редактирования + db #AA: dw #291B ;ext+ss+K удаление символа справа от курсора + db #0C: dw #292B ;delete удаление символа слева от курсора + db #B3: dw #3017 ;ext+W удаление символов от курсора до начала следующего слова + db #B4: dw #2FBC ;ext+E удаление символов от курсора до начала текущего слова + db #B0: dw #3072 ;ext+J удаление символов до конца строки + db #B1: dw #303E ;ext+K удаление символов до наала строки + db #0D: dw #2944 ;enter ввод строки + db #A9: dw #269B ;ext+ss+8/Graph+Z переключение между редактированием внизу и вверху + db #07: dw #2704 ;cs+1 вызов меню + +;АДРЕС: #2577 таблица адресов обработки нажатий в основном меню basic 128k +x2577 db #04 ;размер таблицы + db #0B: dw x272E ;вверх + db #0A: dw x2731 ;вниз + db #07: dw x2717 ;cs+1 + db #0D: dw x2717 ;enter + +;АДРЕС: #2584 подготовка переменных +x2584 call x28BE ;инициализация курсора для верхнего окна + ld hl,#0000 + ld (#FC9A),hl + ld a,#82 + ld (#EC0D),a + ld hl,#0000 + ld (#5C49),hl ;Номер строки бейсик-программы, отмеченной курсором + call x35BC ;установка параметров отступа + call x365E ;установка переменных для ввода символа + ret + +;АДРЕС: #259F печать главного меню basic 128 и выбор опции +x259F ld hl,x5BFF + ld (x5B81),hl + call x1F45 ;установка другого стэка и ram 7 + ld a,#02 ;канал #02 (основной экран) + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1601 ;открыть канал +x25AD ld hl,x2744 ;п/п обработки главного меню + ld (#F6EA),hl + ld hl,x2754 ;текст основного меню basic 128k + ld (#F6EC),hl + push hl + ld hl,#EC0D + set 1,(hl) ;на отображено меню + res 4,(hl) ;возврат в главное меню + dec hl + ld (hl),#00 ;номер опции меню + pop hl + call x36A8 ;печать главного меню basic 128k + jp x2653 ;основной цикл в basic128/калькулятор + +;АДРЕС: #25CB возврат в редактор/калькулятор/меню после обработки ошибки +x25CB ld ix,#FD6C + ld hl,x5BFF + ld (x5B81),hl + call x1F45 ;установка другого стэка и ram 7 + ld a,#02 + rst #28 + dw Rom1.x1601 ;открыть канал + call x3668 ;установка переменных для ввода символа + ld hl,#5C3B +x25E3 bit 5,(hl) + jr z,x25E3 + ld hl,#EC0D + res 3,(hl) + bit 6,(hl) + jr nz,x2604 + ld a,(#EC0E) + cp #04 + jr z,x2601 ;это калькулятор + cp #00 + jp nz,x28C7 + call x3848 ;печать информационной строки 128 BASIC + jr x2604 +x2601 call x384D ;печать информационной строки Calculator +x2604 call x30D6 ;установка буфера редактирования внизу экрана + call x3222 ;установка буфера редактирования в верху экрана + ld a,(#EC0E) + cp #04 + jr z,x2653 ;калькулятор + ld hl,(#5C49) + ld a,h + or l + jr nz,x262D + ld hl,(#5C53) + ld bc,(#5C4B) + and a + sbc hl,bc + jr nz,x262A + ld hl,#0000 + ld (#EC08),hl +x262A ld hl,(#EC08) +x262D call x1F20 ;установка другого стэка и ram 0 + rst #28 + dw Rom1.x196E ;получить начальный адрес строки программы + rst #28 + dw Rom1.x1695 ;получить адрес первой строки программы + call x1F45 ;установка другого стэка и ram 7 + ld (#5C49),de + ld hl,#EC0D + bit 5,(hl) + jr nz,x2653 + ld hl,#0000 + ld (#EC06),hl + call x152F ;печать бейсик программы от текущей строки + call x29F2 ;напечатать курсор + call x2944 ;enter ввод строки + +;АДРЕС: #2653 основной цикл в basic128/калькулятор +x2653 ld sp,#5BFF + call x3668 ;установка переменных для ввода символа + call x367F ;ожидание нажатия клавиши + push af ;код клавиши + ld a,(#5C39) ;звук нажатия на клавишу + call x26EC ;звуковой сигнал + pop af + call x2669 ;обработка нажатия клавиши + jr x2653 ;основной цикл в basic128/калькулятор + +;АДРЕС: #2669 обработка нажатия клавиши +;вх: a - код клавиши +;вых: z - отображено меню +x2669 ld hl,#EC0D + bit 1,(hl) + push af + ld hl,x2577 ;основное меню basic 128k + jr nz,x2677 ;отображено меню + ld hl,x2537 ;клавиши для режима редактирования +x2677 call x3FCE ;обработка нажатой управляющей клавиши в меню + jr nz,x2681 ;не найден обработчик клавиши + call nc,x26E7 ;звуковой сигнал + pop af + ret +;не найден обработчик клавиши +x2681 pop af + jr z,x2689 ;это режим редактирования + xor a ;курсор K,L или C + ld (#5C41),a + ret +x2689 ld hl,#EC0D + bit 0,(hl) + jr z,x2694 ;буфер редактирования не переполнен + call x26E7 ;звуковой сигнал + ret ;!!!тут можно сократить!!! +x2694 cp #A3 + jr nc,x2653 ;!!!ОШИБКА!!! должно быть ret nc + jp x28F1 ;обрабока нажатия символьной клавиши + +;АДРЕС: #269B ext+ss+8/Graph+Z переключение между редактированием внизу и вверху +x269B ld a,(#EC0E) + cp #04 + ret z ;это калькулятор + call x1630 ;очистка окна редактирования + ld hl,#EC0D + res 3,(hl) + ld a,(hl) + xor #40 + ld (hl),a + and #40 + jr z,x26B6 + call x26BB ;выбор нижнего экрана + jr x26B9 +x26B6 call x26CE ;выбор верхнего экрана +x26B9 scf + ret + +;АДРЕС: #26BB выбор нижнего экрана +x26BB call x3881 ;очистка двух нижних строк экрана + ld hl,#EC0D + set 6,(hl) + call x2E2D ;сброс нижнего окна редактирования + call x3A88 ;установка настроек курсора для нижнего окна + call x28DF ;инициализация настроек нижнего окна + jr x26D9 + +;АДРЕС: #26CE выбор верхнего экрана +x26CE ld hl,#EC0D + res 6,(hl) + call x28BE ;инициализация курсора для верхнего окна + call x3848 ;печать информационной строки 128 BASIC +x26D9 ld hl,(#FC9A) + ld a,h + or l + call nz,x334A ;поиск адреса строки бейсик программы + call x152F ;печать бейсик программы от текущей строки + jp x29F2 ;напечатать курсор + +;АДРЕС: #26E7 звуковой сигнал +x26E7 ld a,(#5C38) ;заполнение буфера редактора + srl a + +;АДРЕС: #26EC звуковой сигнал +x26EC push ix + ld d,#00 + ld e,a + ld hl,#0C80 +x26F4 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x03B5 ;beep + pop ix + ret + +;АДРЕС: #26FA звуковой сигнал +x26FA push ix + ld de,#0030 + ld hl,#0300 + jr x26F4 + +;АДРЕС: #2704 cs+1 вызов меню +x2704 call x29EC ;удаление курсора, восстановление атрибутов + ld hl,#EC0D + set 1,(hl) + dec hl + ld (hl),#00 + ld hl,(#F6EC) + call x36A8 ;печать меню basic 128k + scf + ret + +;АДРЕС: #2717 нажатие cs+1/enter в главном меню +x2717 ld hl,#EC0D + res 1,(hl) + dec hl + ld a,(hl) + ld hl,(#F6EA) + push hl + push af + call x373E ;восстановление окна экрана 14*12 из буфера + pop af + pop hl + call x3FCE ;обработка нажатой управляющей клавиши в меню + jp x29F2 + +;АДРЕС: #272E курсор вверх в главном меню +x272E scf + jr x2732 + +;АДРЕС: #2731 курсор вниз в главном меню +x2731 and a +x2732 ld hl,#EC0C + ld a,(hl) + push hl + ld hl,(#F6EC) ;адрес списка опций меню + call c,x37A7 ;вверх + call nc,x37B6 ;вниз + pop hl + ld (hl),a +x2742 scf + ret + +;АДРЕС: #2744 адреса процедур обработки опций основного меню basic 128k +x2744 db #05 ;кол-во опций + db #00: dw x2816 ;выбор опции 128 TR-DOS + db #01: dw x286C ;выбор опции 128 BASIC + db #02: dw x2885 ;выбор опции калькулятор + db #03: dw x1B47 ;выбор опции 48 BASIC + db #04: dw x2831 ;выбор опции 48 TR-DOS (вход в Tr-Dos 48k) + +;АДРЕС: #2754 текст основного меню basic 128k +x2754 db #06 ;кол-во строк + db "128 ",#FF +x275E dc "128 TR-DOS" +x2768 dc "128 BASIC" +x2771 dc "Calculator" + dc "48 BASIC" +x2783 dc "48 TR-DOS" + dc " " ;признак окончания + +;АДРЕС: #278D !!!NOT USED!!! +x278D db #20,#80,#A0 + +;АДРЕС: #2790 адреса процедур обработки опций меню в редакторе basic 128 +x2790 db #05 ;кол-во опций + db #00: dw x2742 ;возврат к редактированию + db #01: dw x2851 ;перенумерация строк программы + db #02: dw x2811 ;смена области редактирования низ/верх + db #03: dw x2862 ;печать программы на принтере + db #04: dw x281C ;выход из редактора + +;АДРЕС: #27A0 текст меню в редакторе basic 128 +x27A0 db #06 + db "Options ",#FF + dc "128 BASIC" + dc "Renumber" + dc "Screen" + dc "Print" + dc "Exit" + dc " " ;признак окончания + +;АДРЕС: #27CB адреса процедур обработки опций меню в калькуляторе +x27CB db #02 + db #00: dw x2742 ;возврат к редактированию + db #01: dw x281C ;выход в главное меню + +;АДРЕС: #27D2 текст меню в калькуляторе +x27D2 db #03 + db "Options ",#FF + dc "Calculator" + dc "Exit" + dc " " ;признак окончания + +;АДРЕС: #27EB !!!NOT USED!!! +x27EB db #16,#01,#00 ;AT 1,0 + db #10,#00 ;ink 0 + db #11,#07 ;paper 7 + db #13,#00 ;bright 0 + dc "To cancel - press BREAK twice" + +;АДРЕС: #2811 смена области редактирования низ/верх +x2811 call x269B ;ext+ss+8/Graph+Z переключение между редактированием внизу и вверху + jr x2874 ; + +;АДРЕС: #2816 выбор опции 128 TR-DOS +x2816 call x3857 ;печать информационной строки 128 TR-DOS + call x3BE9 ;запуск команды randomize 15619: rem: load "boot" + +;АДРЕС: #281С выход из редактора/калькулятора в главное меню +x281C ld hl,#EC0D + res 6,(hl) + call x28BE ;инициализация курсора для верхнего окна + ld b,#00 + ld d,#17 + call x3B5E ;очистка строк экрана + call x1F20 ;установка другого стэка и ram 0 + jp x259F ;печать главного меню basic 128 и выбор опции + +;АДРЕС: #2831 выбор опции 48 TR-DOS (вход в Tr-Dos 48k) +x2831 call x3852 ;печать информационной строки 48 TR-DOS + ld hl,#0000 + push hl + ld hl,#3D30 + jp x1B4A ;включение basic48, блокировка #7FFD и переход на адрес в hl + +;АДРЕС: #283E !!!NOT USED!!! +x283E dec b + res 0,(hl) + set 6,(hl) + ld a,#07 + ld (#EC0E),a + ld bc,#0000 + call x372B + jp x1AF1 + +;АДРЕС: #2851 перенумерация строк программы +x2851 call x3888 ;перенумерация строк программы + call nc,x26E7 ;звуковой сигнал + ld hl,#0000 + ld (#5C49),hl + ld (#EC08),hl + jr x2865 + +;АДРЕС: #2862 печать программы на принтере +x2862 call x1B14 ;пункт меню редактора Print (печать на принтер) +x2865 ld hl,#EC0D + bit 6,(hl) + jr nz,x2874 + +;АДРЕС: #286C выбор опции 128 BASIC +x286C ld hl,#5C3C + res 0,(hl) + call x3848 ;печать информационной строки 128 BASIC +x2874 ld hl,#EC0D + res 5,(hl) + res 4,(hl) + ld a,#00 + ld hl,x2790 + ld de,x27A0 + jr x28B1 + +;АДРЕС: #2885 выбор опции калькулятор +x2885 ld hl,#EC0D + set 5,(hl) + set 4,(hl) + res 6,(hl) + call x28BE ;инициализация курсора для верхнего окна + call x384D ;печать информационной строки Calculator + ld a,#04 + ld (#EC0E),a + ld hl,#0000 + ld (#5C49),hl + call x152F ;печать бейсик программы от текущей строки + ld bc,#0000 + ld a,b + call x29F8 ;напечатать курсор + ld a,#04 + ld hl,x27CB + ld de,x27D2 +x28B1 ld (#EC0E),a + ld (#F6EA),hl + ld (#F6EC),de + jp x2604 + +;АДРЕС: #28BE инициализация курсора для верхнего окна +x28BE call x2E1F ;сброс верхнего окна редактирования + call x3A7F ;установка настроек курсора для верхнего окна + jp x28E8 ;инициализация настроек верхнего окна + +;АДРЕС: #28C7 возврат в главное меню +x28C7 ld b,#00 + ld d,#17 + call x3B5E ;очистка строк экрана + jp x25AD + +;настройки верхнего окна +x28D1 db #06 + db #00,#00,#00,#04,#10,#14 + +;настройки нижнего окна +x28D8 db #06 + db #00,#00,#00,#00,#01,#01 + +;АДРЕС: #28DF инициализация настроек нижнего окна +x28DF ld hl,x28D8 + ld de,#F6EE + jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт + +;АДРЕС: #28E8 инициализация настроек верхнего окна +x28E8 ld hl,x28D1 + ld de,#F6EE + jp x3FBA + +;АДРЕС: #28F1 обработка нажатия символьной клавиши +x28F1 ld hl,#EC0D + or a ;!!!ЛИШНЕЕ!!! + or a ;!!!ЛИШНЕЕ!!! + bit 0,(hl) + jp nz,x29F2 + res 7,(hl) + set 3,(hl) + push hl + push af + call x29EC ;удаление курсора, восстановление атрибутов + pop af + push af + call x2E81 ;вставка символа в буфер редактирования + pop af + ld a,b + call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере + pop hl + set 7,(hl) + jp nc,x29F2 + ld a,b + jp c,x29F8 + jp x29F2 + +;АДРЕС: #291B ext+ss+K удаление символа справа от курсора +x291B ld hl,#EC0D + set 3,(hl) + call x29EC ;удаление курсора, восстановление атрибутов + call x2F12 ;удаление символа в строке в буфере редактирования + scf + ld a,b + jp x29F8 ;напечатать курсор + +;АДРЕС: #292B delete удаление символа слева от курсора +x292B ld hl,#EC0D + res 0,(hl) + set 3,(hl) + call x29EC ;удаление курсора, восстановление атрибутов + call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + ccf + jp c,x29F2 ;напечатать курсор + call x2F12 ;удаление символа в строке в буфере редактирования + scf + ld a,b + jp x29F8 ;напечатать курсор + +;АДРЕС: #2944 enter ввод строки +x2944 call x29EC ;удаление курсора, восстановление атрибутов + push af + call x30B4 ;расчет адреса начала строки в буфере редактирования + push bc + ld b,#00 + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + pop bc + jr c,x295E + ld hl,#0020 + add hl,de + ld a,(hl) + cpl + and #09 + jr z,x297A +x295E ld a,(#EC0D) + bit 3,a + jr z,x296A + call x2C8E ;вставить строку бейсик программы + jr nc,x297F +x296A call x2C4C ;поиск конца строки в буфере редактирования + call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере + call x2ECE ;вставка пустой строки в буфер редактирования + ld b,#00 + pop af + scf + jp x29F8 ;напечатать курсор +x297A pop af + scf + jp x29F2 ;напечатать курсор +x297F pop af + jp x29F2 ;напечатать курсор + +;АДРЕС: #2983 ext+N/Graph+W переход к первой строке бейсик программы +x2983 ld a,(#EC0E) + cp #04 + ret z ;это калькулятор + call x29EC ;удаление курсора, восстановление атрибутов + ld hl,#0000 + call x1F20 ;установка другого стэка и ram 0 + rst #28 + dw Rom1.x196E ;получить начальный адрес строки программы + rst #28 + dw Rom1.x1695 ;получить адрес первой строки программы + call x1F45 ;установка другого стэка и ram 7 + ld (#5C49),de + ld a,#0F + call x3A96 ;сохранить атрибуты курсора + call x152F ;печать бейсик программы от текущей строки + scf + jp x29F2 ;напечатать курсор + +;АДРЕС: #29AB ext+T/Graph+V переход к последней строке бейсик программы +x29AB ld a,(#EC0E) + cp #04 + ret z ;это калькулятор + call x29EC ;удаление курсора, восстановление атрибутов + ld hl,#270F ;9999 + call x1F20 ;установка другого стэка и ram 0 + rst #28 + dw Rom1.x196E ;получить начальный адрес строки программы + ex de,hl + rst #28 + dw Rom1.x1695 ;получить адрес первой строки программы + call x1F45 ;установка другого стэка и ram 7 + ld (#5C49),de + ld a,#0F + call x3A96 ;сохранить атрибуты курсора + call x152F ;печать бейсик программы от текущей строки + scf + jp x29F2 ;напечатать курсор + +;АДРЕС: #29D4 ext+I переход к началу текущего слова +x29D4 call x29EC ;удаление курсора, восстановление атрибутов + call x2BEA ;поиск начала слова слева от курсора + jp nc,x29F2 ;напечатать курсор + ld a,b + jp x29F8 ;напечатать курсор + +;АДРЕС: #29E1 ext+shift+J переход к началу следующего слова +x29E1 call x29EC ;удаление курсора, восстановление атрибутов + call x2C09 ;поиск начала слова справа от курсора + jr nc,x29F2 ;напечатать курсор + ld a,b + jr x29F8 ;напечатать курсор + +;АДРЕС: #29EC удаление курсора, восстановление атрибутов +x29EC call x2A07 ;получение позиции курсора + jp x364F ;восстановление атрибутов под курсором + +;АДРЕС: #29F2 напечатать курсор +x29F2 call x2A07 ;получение позиции курсора + jp x3640 ;печать атрибутов курсора + +;АДРЕС: #29F8 напечатать курсор +x29F8 call x2A11 ;сохранить позицию курсора + push af + push bc + ld a,#0F ;paper 1, ink 7 + call x3A96 ;сохранить атрибуты курсора + pop bc + pop af + jp x3640 ;печать атрибутов курсора + +;АДРЕС: #2A07 получение позиции курсора +;вых: c - номер строки +; b - номер столбца +; a - предпочтительный номер столбца +x2A07 ld hl,#F6EE + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ld a,(hl) + inc hl + ret + +;АДРЕС: #2A11 сохранить позицию курсора +x2A11 ld hl,#F6EE + ld (hl),c + inc hl + ld (hl),b + inc hl + ld (hl),a + ret + +;АДРЕС: #2A1A получение текущего символа в буфере редактирования +x2A1A push hl + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld h,#00 + ld l,b + add hl,de + ld a,(hl) + pop hl + ret + +;АДРЕС: #2A25 ss+I перемещение курсора вниз на 10 строк в поле редактирования +x2A25 call x29EC ;удаление курсора, восстановление атрибутов + ld e,a + ld d,#0A +x2A2B push de + call x2B30 ;вставить строку бейсик программы + pop de + jr nc,x29F2 ;напечатать курсор + ld a,e + call x2A11 ;сохранить позицию курсора + ld b,e + call x2AF9 ;найти в строке ближайшую редактируемую позицию + jr nc,x2A42 + dec d + jr nz,x2A2B + ld a,e + jr c,x29F8 ;напечатать курсор +x2A42 push de + call x2B0B ;вставить строку бейсик программы + pop de + ld b,e + call x2AF9 ;найти в строке ближайшую редактируемую позицию + ld a,e + or a + jr x29F8 ;напечатать курсор + +;АДРЕС: #2A4F ext+P перемещение курсора вверх на 10 строк в поле редактирования +x2A4F call x29EC ;удаление курсора, восстановление атрибутов + ld e,a + ld d,#0A +x2A55 push de + call x2B0B ;вставить строку бейсик программы + pop de + jr nc,x29F2 ;напечатать курсор + ld a,e + call x2A11 ;сохранить позицию курсора + ld b,e + call x2B02 ;найти в строке ближайшую редактируемую позицию + jr nc,x2A6D + dec d + jr nz,x2A55 + ld a,e + jp c,x29F8 ;напечатать курсор +x2A6D push af + call x2B30 ;вставить строку бейсик программы + ld b,#00 + call x2BD4 ;поиск редактируемого символа в строке справа от курсора + pop af + jp x29F8 ;напечатать курсор + +;АДРЕС: #2A7A ext+M/graph+X перемещение курсора в конец строки в поле редактирования +x2A7A call x29EC ;удаление курсора, восстановление атрибутов + call x2C4C ;поиск конца строки в буфере редактирования + jp nc,x29F2 ;напечатать курсор + ld a,b + jp x29F8 ;напечатать курсор + +;АДРЕС: #2A87 ext+ss+2/Graph+Y переход к началу строки редактирования +x2A87 call x29EC ;удаление курсора, восстановление атрибутов + call x2C31 ;поиск начала строки редактирования в буфере + jp nc,x29F2 ;напечатать курсор + ld a,b + jp x29F8 ;напечатать курсор + +;АДРЕС: #2A94 перемещение курсора вверх в поле редактирования +x2A94 call x29EC ;удаление курсора, восстановление атрибутов + ld e,a + push de + call x2B0B ;вставить строку бейсик программы + pop de + jp nc,x29F2 ;напечатать курсор + ld b,e + call x2B02 ;найти в строке ближайшую редактируемую позицию + ld a,e + jp c,x29F8 ;напечатать курсор + push af + call x2B30 ;вставить строку бейсик программы + ld b,#00 + call x2AF9 ;найти в строке ближайшую редактируемую позицию + pop af + jp x29F8 ;напечатать курсор + +;АДРЕС: #2AB5 перемещение курсора вниз в поле редактирования +x2AB5 call x29EC ;удаление курсора, восстановление атрибутов + ld e,a + push de + call x2B30 ;вставить строку бейсик программы + pop de + jp nc,x29F2 ;напечатать курсор + ld b,e + call x2B02 ;найти в строке ближайшую редактируемую позицию + ld a,e + jp c,x29F8 ;напечатать курсор + push de + call x2B0B ;вставить строку бейсик программы + pop de + ld b,e + call x2AF9 ;найти в строке ближайшую редактируемую позицию + ld a,e + or a + jp x29F8 ;напечатать курсор + +;АДРЕС: #2AD7 перемещение курсора влево в поле редактирования +x2AD7 call x29EC ;удаление курсора, восстановление атрибутов + call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + jp c,x29F8 ;напечатать курсор + jp x29F2 ;напечатать курсор + +;АДРЕС: #2AE3 перемещение курсора вправо в поле редактирования +x2AE3 call x29EC ;удаление курсора, восстановление атрибутов + call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере + jp c,x29F8 ;напечатать курсор + push af + call x2B0B ;вставить строку бейсик программы + ld b,#1F + call x2BDF ;поиск в строке влево от курсора редактируемого символа + pop af + jp x29F8 ;напечатать курсор + +;АДРЕС: #2AF9 найти в строке ближайшую редактируемую позицию +x2AF9 push de + call x2BD4 ;поиск редактируемого символа в строке справа от курсора + call nc,x2BDF ;поиск в строке влево от курсора редактируемого символа + pop de + ret + +;АДРЕС: #2B02 найти в строке ближайшую редактируемую позицию +x2B02 push de + call x2BDF ;поиск в строке влево от курсора редактируемого символа + call nc,x2BD4 ;поиск редактируемого символа в строке справа от курсора + pop de + ret + +;АДРЕС: #2B0B вставить строку бейсик программы, если требуется сдвинуть строки +; в буфере вниз и обновить экран +x2B0B call x2C7C ;вставить строку в бейсик программу, если были изменения + jr nc,x2B2F + push bc + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld b,#00 + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + call nc,x2F80 ;сдивг строк вверх в буфере при удалении строки + pop bc + ld hl,#F6F1 + ld a,(hl) + cp c + jr c,x2B2D + push bc + call x166F ;сдвиг всех строк в буфер редактирования вниз с обновлением экрана + pop bc + ret c + ld a,c + or a + ret z +x2B2D dec c + scf +x2B2F ret + +;АДРЕС: #2B30 вставить строку бейсик программы, если требуется сдвинуть строки +; в буфере вверх и обновить экран +x2B30 push bc + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld b,#00 + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + pop bc + jr c,x2B3F ;!!!можно оптимизировать + jp x2F80 +x2B3F call x2C68 ;вставить строку бейсик программы, если были изменения + jr nc,x2B5A + ld hl,#F6F1 + inc hl + ld a,c + cp (hl) + jr c,x2B58 + push bc + push hl + call x1639 ;сдвиг всех строк в буфере редактирования верх и обновление экрана + pop hl + pop bc + ret c + inc hl + ld a,(hl) + cp c + ret z +x2B58 inc c + scf +x2B5A ret + +;АДРЕС: #2B5B поиск редактируемой позиции слева от курсора во всем буфере +x2B5B ld d,a + dec b + jp m,x2B66 + ld e,b + call x2BDF ;поиск в строке влево от курсора редактируемого символа + ld a,e + ret c +x2B66 push de + call x2B0B ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вниз и обновить эекран + pop de + ld a,e + ret nc + ld b,#1F + call x2BDF ;поиск в строке влево от курсора редактируемого символа + ld a,b + ret c + ld a,d + ld b,#00 + ret + +;АДРЕС: #2B78 поиск редактируемой позиции справа от курсора во всем буфере +;вх: b - номер столбца +; c - номер строки +;вых: cy=1 справа есть символ +; b - номер столбца с символом +; a - новый номер столбца +; hl - адрес ноовго редактируемого символа +x2B78 ld d,a + inc b + ld a,#1F + cp b + jr c,x2B85 + ld e,b + call x2BD4 ;поиск редактируемого символа в строке справа от курсора + ld a,e + ret c +;переход к следующей строке +x2B85 dec b + push bc + push hl + ld hl,#EC0D + bit 7,(hl) + jr nz,x2BC0 ;клавиша не нажата +;нажата клавиша. вставим новую строку + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + ld a,(hl) + bit 1,a + jr nz,x2BC0 + set 1,(hl) + res 3,(hl) + ld hl,#0023 + add hl,de + ex de,hl + pop hl + pop bc + push af + call x2B30 ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран + pop af + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0023 + add hl,de + ex de,hl + res 0,a + set 3,a + call x2ED3 ;вставка пустой строки в буфер редактирования + call x35F4 ;создание отступа в строке в буфере редактирования + ld a,b + scf + ret +x2BC0 pop hl + pop bc + push de + call x2B30 ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран + pop de + ld a,b + ret nc + ld b,#00 + call x2BD4 ;поиск редактируемого символа в строке справа от курсора + ld a,b + ret c + ld a,e + ld b,#00 + ret + +;АДРЕС: #2BD4 поиск редактируемого символа в строке справа от курсора +;вх: b - номер столбца +; c - номер строки +;вых: cy=1 справа есть символ +; b - номер столбца с символом +x2BD4 push de + push hl + call x30B4 ;расчет адреса начала строки в буфере редактирования + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + jp x2C65 + +;АДРЕС: #2BDF поиск в строке влево от курсора редактируемого символа +x2BDF push de + push hl + call x30B4 ;расчет адреса начала строки в буфере редактирования + call x2E63 ;поиск в строке влево от курсора редактируемого символа + jp x2C65 + +;АДРЕС: #2BEA поиск начала слова слева от курсора +x2BEA push de + push hl +x2BEC call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + jr nc,x2C07 + call x2A1A ;получение текущего символа в буфере редактирования + cp " " + jr z,x2BEC +x2BF8 call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + jr nc,x2C07 + call x2A1A ;получение текущего символа в буфере редактирования + cp " " + jr nz,x2BF8 + call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере +x2C07 jr x2C65 + +;АДРЕС: #2C09 поиск начала слова справа от курсора +x2C09 push de + push hl +x2C0B call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере + jr nc,x2C2B + call x2A1A ;получение текущего символа в буфере редактирования + cp " " + jr nz,x2C0B +x2C17 call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере + jr nc,x2C2B + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + jr nc,x2C2B + call x2A1A ;получение текущего символа в буфере редактирования + cp " " + jr z,x2C17 + scf + jr x2C65 +x2C2B call nc,x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + or a + jr x2C65 + +;АДРЕС: #2C31 поиск начала строки редактирования в буфере +x2C31 push de + push hl +x2C33 call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + bit 0,(hl) + jr nz,x2C45 + call x2B0B ;вставить строку бейсик программы + jr c,x2C33 + jr x2C65 +x2C45 ld b,#00 + call x2BD4 ;поиск редактируемого символа в строке справа от курсора + jr x2C65 + +;АДРЕС: #2C4C поиск конца строки в буфере редактирования +x2C4C push de + push hl +x2C4E call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + bit 3,(hl) + jr nz,x2C60 + call x2B30 ;вставить строку бейсик программы + jr c,x2C4E + jr x2C65 +x2C60 ld b,#1F + call x2BDF ;поиск в строке влево от курсора редактируемого символа +x2C65 pop hl + pop de + ret + +;АДРЕС: #2C68 вставить строку бейсик программы, если были изменения +;вх: c - номер строки +;вых: cy=0 строка вставлена +x2C68 ld a,(#EC0D) + bit 3,a + scf + ret z ;изменений не было + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + bit 3,(hl) + scf + ret z + jr x2C8E + +;АДРЕС: #2C7C вставить строку в бейсик программу, если были изменения +x2C7C ld a,(#EC0D) + bit 3,a + scf + ret z + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + bit 0,(hl) + scf + ret z + +;АДРЕС: #2C8E вставить строку бейсик программы +;вх: c - номер строки +;вых: cy=0 синтаксическая ошибка +; cy=1 строка вставлена +; bc - координаты курсора +; a - номер столбца +x2C8E ld a,#02 +x2C90 call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + bit 0,(hl) + jr nz,x2CA3 ;это первая строка + dec c + jp p,x2C90 + ld c,#00 + ld a,#01 +x2CA3 ld hl,#EC00 + ld de,#EC03 + or #80 + ld (hl),a + ld (de),a + inc hl + inc de + ld a,#00 ;!!!можно записать xor a + ld (hl),a + ld (de),a + inc hl + inc de + ld a,c + ld (hl),a + ld (de),a + ld hl,#0000 + ld (#EC06),hl + call x335F ;копирование процедур в ram + call x3C67 ;токенизация строки бейсик программы + push ix + call x1F20 ;установка другого стэка и ram 0 + call x026B ;выполненение введенной строки + call x1F45 ;установка другого стэка и ram 7 + pop ix + ld a,(#5C3A) + inc a + jr nz,x2CEF ;есть ошибка + ld hl,#EC0D + res 3,(hl) + call x365E ;установка переменных для ввода символа + ld a,(#EC0E) + cp #04 + call nz,x152F ;печать бейсик программы от текущей строки + call x26FA ;звуковой сигнал + call x2A07 ;получение позиции курсора + scf + ret +x2CEF ld hl,#EC00 + ld de,#EC03 + ld a,(de) + res 7,a + ld (hl),a + inc hl + inc de + ld a,(de) + ld (hl),a + inc hl + inc de + ld a,(de) + ld (hl),a + call x3C63 ;токенизация строки бейсик программы с синтаксической ошибкой + jr c,x2D0A + ld bc,(#EC06) +x2D0A ld hl,(#EC06) + or a + sbc hl,bc + push af + push hl + call x2A07 ;получение позиции курсора + pop hl + pop af + jr c,x2D2A + jr z,x2D45 +x2D1B push hl + ld a,b + call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + pop hl + jr nc,x2D45 + dec hl + ld a,h + or l + jr nz,x2D1B + jr x2D45 +x2D2A push hl + ld hl,#EC0D + res 7,(hl) + pop hl + ex de,hl + ld hl,#0000 + or a + sbc hl,de +x2D38 push hl + ld a,b + call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере + pop hl + jr nc,x2D45 + dec hl + ld a,h + or l + jr nz,x2D38 +x2D45 ld hl,#EC0D + set 7,(hl) + call x2A11 ;сохранить позицию курсора + ld a,#17 ;paper 2, ink 7 + call x3A96 ;сохранить атрибуты курсора + or a + ret + +;АДРЕС: #2D54 получить очередной символ из строки бейсик программы +;вых: a - код символа +x2D54 ld hl,#EC00 + bit 7,(hl) + jr z,x2D62 + ld hl,(#EC06) ;увеличим количество редактируемых символов в строке + inc hl + ld (#EC06),hl +x2D62 ld hl,#EC00 + ld a,(hl) ;флаги + inc hl + ld b,(hl) ;столбец + inc hl + ld c,(hl) ;строка + push hl + and #0F + ld hl,x2D85 ;таблица адресов процедур + call x3FCE ;обработка управляющего кода + ld e,l + pop hl + jr z,x2D79 + ld a,#0D +x2D79 ld (hl),c + dec hl + ld (hl),b + dec hl + push af + ld a,(hl) + and #F0 + or e + ld (hl),a + pop af + ret +;таблица адресов процедур +x2D85 db #03 ;размер таблицы + db #02: dw x2DAC + db #04: dw x2DE9 + db #01: dw x2D8F + +;АДРЕС: #2D8F получить символ из текущей позиции курсора в буфере редактирования +;вх: c - номер строки +;вых: l=#01 -> a - код символа из верхнего буфера +; =#02 -> a - код символа из буфера +; =#04 -> a - код символа из нижнего буфера +; =#08 -> a - =#0D конец буфера редактирования +x2D8F call x32B7 ;расчет адреса начала строки в буфере редактирования +x2D92 call x2E0E ;получить символ из строки буфера редактирования + jr nc,x2D9E ;вне пределов строки + cp #00 + jr z,x2D92 ;нет символа + ld l,#01 + ret +x2D9E inc c ;следующая строка + ld b,#00 + ld hl,(#F9DB) ;!!!ОШИБКА!!! должно быть ld hl,#F9DB + ld a,c + cp (hl) + jr c,x2D8F + ld b,#00 + ld c,#00 +;на отображаемой строчке строки бейсик программы +x2DAC push hl + ld hl,#F6EE + ld a,(hl) + cp c + jr nz,x2DBE + inc hl + ld a,(hl) + cp b + jr nz,x2DBE + ld hl,#EC00 + res 7,(hl) +x2DBE pop hl +x2DBF call x30B4 ;расчет адреса начала строки в буфере редактирования + call x2E0E ;получить символ из строки буфера редактирования + jr nc,x2DCE ;вне пределов строки + cp #00 + jr z,x2DAC + ld l,#02 + ret +x2DCE ld hl,#0020 + add hl,de + bit 3,(hl) + jr z,x2DDB + ld l,#08 + ld a,#0D + ret +x2DDB ld hl,#F6F3 + inc c + ld a,(hl) + cp c + ld b,#00 + jr nc,x2DBF + ld b,#00 + ld c,#01 +;используется нижний экран +x2DE9 call x31C3 ;расчет адреса начала строки в буфере редактирования +x2DEC call x2E0E ;получить символ из строки буфера редактирования + jr nc,x2DF8 ;вне пределов строки + cp #00 + jr z,x2DEC + ld l,#04 + ret +x2DF8 ld hl,#0020 + add hl,de + bit 3,(hl) + jr nz,x2E09 + inc c + ld b,#00 + ld a,(#F6F5) + cp c + jr nc,x2DE9 +x2E09 ld l,#08 + ld a,#0D + ret + +;АДРЕС: #2E0E получить символ из строки буфера редактирования +;вх: b - номер столбца +; de - адрес начала строки +;вых: cy=1 символ получен -> a - код символа +x2E0E ld a,#1F + cp b + ccf + ret nc + ld l,b + ld h,#00 + add hl,de + ld a,(hl) + inc b + scf + ret + +;настройки верхнего окна редактирования +x2E1B db #01 ;количество байт + db #14 ;количество редактируемых строк + +;настройки нижнего окна редактирования +x2E1D db #01 ;количество байт + db #01 ;количество редактируемых строк + +;АДРЕС: #2E1F сброс верхнего окна редактирования +x2E1F ld hl,#5C3C + res 0,(hl) ;вывод на основной экран + ld hl,x2E1B + ld de,#EC15 + jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт + +;АДРЕС: #2E2D сброс нижнего окна редактирования +x2E2D ld hl,#5C3C + set 0,(hl) + ld bc,#0000 + call x372B ;установка координат печати из bc + ld hl,x2E1D + ld de,#EC15 + jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт + +;АДРЕС: #2E41 поиск в строке вправо от курсора редактируемого символа +;вх: b - номер столбца, с которого следует начать поиск +; de - начало строки в буфере редактирования +;вых: cy=1 символ найден +; hl - адрес редактируемой позиции +; b - номер столбца +x2E41 ld h,#00 ;!!!можно сократить!!! call x2E7B + ld l,b + add hl,de + ld a,(hl) + cp #00 + scf + ret nz + ld a,b + or a + jr z,x2E5B + push hl + dec hl + ld a,(hl) + cp #00 + scf + pop hl + ret nz +x2E56 ld a,(hl) + cp #00 + scf + ret nz +x2E5B inc hl + inc b + ld a,b + cp #1F + jr c,x2E56 + ret + +;АДРЕС: #2E63 поиск в строке влево от курсора редактируемого символа +;вх: b - номер столбца, с которого следует начать поиск +; de - начало строки в буфере редактирования +;вых: cy=1 символ найден +; hl - адрес редактируемой позиции +; b - номер столбца +x2E63 ld h,#00 ;!!!можно сократить!!! call x2E7B + ld l,b + add hl,de + ld a,(hl) + cp #00 + scf + ret nz +x2E6C ld a,(hl) + cp #00 + jr nz,x2E78 + ld a,b + or a + ret z + dec hl + dec b + jr x2E6C +x2E78 inc b + scf + ret + +;АДРЕС: #2E7B чтение символа из буфера редактирования +;вх: b - номер столбца +; de - начало строки в буфере редактирования +;вых: a - символ по заданному адресу +x2E7B ld h,#00 + ld l,b + add hl,de + ld a,(hl) + ret + +;АДРЕС: #2E81 вставка символа в буфер редактирования +;вх: a - код символа +; bc - координаты курсора +x2E81 ld hl,#EC0D + or a ;!!!ЛИШНЕЕ!!! + bit 0,(hl) + ret nz ;буфер строки переполнен + push bc + push af + call x30B4 ;расчет адреса начала строки в буфере редактирования + pop af +x2E8E call x16AC ;вставка символа в строку буфера редактирования + push af + ex de,hl + call x3604 ;печать строки редактируемого буфера + ex de,hl + pop af + ccf + jr z,x2ECC ;буфер бельше не надо раздвигать + push af + ld b,#00 + inc c + ld a,(#EC15) + cp c + jr c,x2EC8 + ld a,(hl) + ld e,a + and #D7 + cp (hl) + ld (hl),a + ld a,e + set 1,(hl) + push af + call x30B4 ;расчет адреса начала строки в буфере редактирования + pop af + jr z,x2EC2 + res 0,a + call x2ED3 ;вставка пустой строки в буфер редактирования + jr nc,x2ECC ;буфер переполнен + call x35F4 ;создание отступа в строке в буфере редактирования + pop af + jr x2E8E +x2EC2 call x2E41 ;поиск в строке вправо от курсора редактируемого символа + pop af + jr x2E8E +x2EC8 pop af + call x316E ;вставка символа в нижний буфер редактирования +x2ECC pop bc + ret + +;АДРЕС: #2ECE вставка пустой строки в буфер редактирования +x2ECE call x30B4 + ld a,#09 + +;АДРЕС: #2ED3 вставка пустой строки в буфер редактирования +;вх: de - адрес строки в бефере редактирования +; a - флаги +; c - номер строки для вставки +x2ED3 push bc + push de + ld b,c + ld hl,x2EEF ;пустая строка + ld c,a + push bc + call x1675 ;сдвиг всех строк в буфер редактирования вниз с обновлением экрана + pop bc + ld a,c + jr nc,x2EEC ;буфер переполнен + ld c,b + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + ld (hl),a + scf +x2EEC pop de + pop bc + ret +x2EEF ds #20,#00 + db #09: dw #0000 + +;АДРЕС: #2F12 удаление символа в строке в буфере редактирования +x2F12 push bc + call x30B4 ;расчет адреса начала строки в буфере редактирования + push bc +x2F17 ld hl,#0020 + add hl,de + bit 1,(hl) + ld a,#00 + jr z,x2F31 + inc c + ld hl,#0023 + add hl,de + ex de,hl + ld a,(#EC15) + cp c + jr nc,x2F17 + dec c + call x31C9 ;удаление символа в нижнем буфере редактирования +x2F31 pop hl +x2F32 push hl + call x30B4 ;расчет адреса начала строки в буфере редактирования + pop hl + ld b,a + ld a,c + cp l + ld a,b + push af + jr nz,x2F41 + ld b,h + jr x2F4A +x2F41 push af + push hl + ld b,#00 + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + pop hl + pop af +x2F4A push hl + ld hl,#F6F4 + set 0,(hl) + jr z,x2F54 + res 0,(hl) +x2F54 call x16C1 ;вставка символа в строку буфера редактирования со сдвигом влево + push af + push bc + push de + ld hl,#F6F4 + bit 0,(hl) + jr nz,x2F6F + ld b,#00 + call x2BD4 ;поиск редактируемого символа в строке справа от курсора + jr c,x2F6F + call x2F80 ;сдивг строк вверх в буфере при удалении строки + pop de + pop bc + jr x2F74 +x2F6F pop hl + pop bc + call x3604 ;печать строки редактируемого буфера, при необходимости +x2F74 pop af + dec c + ld b,a + pop hl + pop af + ld a,b + jp nz,x2F32 + scf + pop bc + ret + +;АДРЕС: #2F80 сдивг строк вверх в буфере при удалении строки +x2F80 ld hl,#0020 + add hl,de + ld a,(hl) + bit 0,(hl) + jr nz,x2FB2 + push af + push bc + ld a,c + or a + jr nz,x2FA4 + push bc + ld hl,(#FC9A) + call x334A ;поиск адреса строки бейсик программы + ld (#FC9A),hl + ld a,(#F9DB) + ld c,a + dec c + call x32B7 ;расчет адреса начала строки в буфере редактирования + pop bc + jr x2FA8 +x2FA4 dec c + call x30B4 ;расчет адреса начала строки в буфере редактирования +x2FA8 pop bc + pop af + ld hl,#0020 + add hl,de + res 1,(hl) + or (hl) + ld (hl),a +x2FB2 ld b,c + call x30B4 ;расчет адреса начала строки в буфере редактирования + call x30DF ;сдвиг строк в буфере редактирования вверх + jp x1648 ;сдвиг всех строк в буфере редактирования верх и обновление экрана + +;АДРЕС: #2FBC ext+E удаление символов от курсора до начала текущего слова +x2FBC call x3084 ;удаление курсора и запрет на обновление экрана +x2FBF push hl + call x3095 ;проверка наличия предыдущего символа в буфере + jr z,x2FF7 + call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + pop hl + jr nc,x2FF8 + call x2A1A ;получение текущего символа в буфере редактирования + push af + push hl + call x2F12 ;удаление символа в строке в буфере редактирования + pop hl + pop af + cp " " + jr z,x2FBF +x2FD9 push hl + call x3095 ;проверка наличия предыдущего символа в буфере + jr z,x2FF7 + call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + pop hl + jr nc,x2FF8 + call x2A1A ;получение текущего символа в буфере редактирования + cp " " + jr z,x2FF3 + push hl + call x2F12 ;удаление символа в строке в буфере редактирования + pop hl + jr x2FD9 +x2FF3 push hl + call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере +x2FF7 pop hl +x2FF8 ld a,b + push af + push hl + ld hl,#EEF5 + res 2,(hl) + ld a,(#EC15) + push bc + ld b,#00 + ld c,a + cp a + call x1605 ;печать буфера редактирования на экране + pop bc + ld hl,#EC0D + set 3,(hl) + pop hl + call x29F8 ;напечатать курсор + pop af + ret + +;АДРЕС: #3017 ext+W удаление символов от курсора до начала следующего слова +x3017 call x3084 ;удаление курсора и запрет на обновление экрана +x301A push hl + call x2A1A ;получение текущего символа в буфере редактирования + pop hl + cp #00 + scf + jr z,x2FF8 + push af + push hl + call x2F12 ;удаление символа в строке в буфере редактирования + pop hl + pop af + cp " " + jr nz,x301A +x302F call x2A1A ;получение текущего символа в буфере редактирования + cp " " + scf + jr nz,x2FF8 + push hl + call x2F12 ;удаление символа в строке в буфере редактирования + pop hl + jr x302F + +;АДРЕС: #303E ext+K удаление символов до наала строки +x303E call x3084 ;удаление курсора и запрет на обновление экрана +x3041 push hl + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + bit 0,(hl) + jr nz,x3059 + call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + jr nc,x306D + call x2F12 ;удаление символа в строке в буфере редактирования + pop hl + jr x3041 + push hl ;!!!не используется!!! +x3059 ld a,b + cp #00 + jr z,x306D + dec b + call x2A1A ;получение текущего символа в буфере редактирования + inc b + cp #00 + jr z,x306D + dec b + call x2F12 ;удаление символа в строке в буфере редактирования + jr x3059 +x306D pop hl +x306E scf + jp x2FF8 + +;АДРЕС: #3072 ext+J удаление символов до конца строки +x3072 call x3084 ;удаление курсора и запрет на обновление экрана +x3075 call x2A1A ;получение текущего символа в буфере редактирования + cp #00 + scf + jr z,x306E + push hl + call x2F12 ;удаление символа в строке в буфере редактирования + pop hl + jr x3075 + +;АДРЕС: #3084 удаление курсора и запрет на обновление экрана +x3084 ld hl,#EC0D + res 0,(hl) + call x29EC ;удаление курсора, восстановление атрибутов + ld hl,#EEF5 + set 2,(hl) + ld hl,#F6F1 + ret + +;АДРЕС: #3095 проверка наличия предыдущего символа в буфере +x3095 call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + bit 0,(hl) + jr z,x30AE + ld a,b + cp #00 + jr z,x30B2 + dec b + call x2A1A ;получение текущего символа в буфере редактирования + inc b + cp #00 + jr z,x30B2 +x30AE ld a,#01 + or a + ret +x30B2 xor a + ret + +;АДРЕС: #30B4 расчет адреса начала строки в буфере редактирования +;вх: c - номер строки +;вых: de - адрес начала строки +x30B4 ld hl,#EC16 ;буфер редактируемой строки +x30B7 push af + ld a,c + ld de,#0023 +x30BC or a + jr z,x30C3 + add hl,de + dec a + jr x30BC +x30C3 ex de,hl + pop af + ret + +;АДРЕС: #30C6 !!!NOT USED!!! +x30C6 push de + call x30B4 + ld h,#00 + ld l,b + add hl,de + pop de + ret + +;АДРЕС: #30D0 параметры для установки буфера редактирования строки внизу экрана +x30D0 db #05 + db #00 + dw #0000 + dw #F6F8 + +;АДРЕС: #30D6 установка буфера редактирования внизу экрана +x30D6 ld hl,x30D0 + ld de,#F6F5 + jp x3FBA + +;АДРЕС: #30DF сдвиг строк в буфере редактирования вверх +x30DF push bc + push de + ld hl,#F6F5 ;колво строк в буфере редактирования + push hl + ld a,(hl) ;кол-во строк в буфере редактирования + or a + jr nz,x3101 + push hl + call x335F ;копирование процедур в ram + ld hl,(#F9D7) ;номер строки в редактируемой строке программы + call x3352 ;преобразование номера строки в ASCII и помещение в буфер + jr nc,x30F8 ;строка не существует + ld (#F9D7),hl ;сохраним номер строки +x30F8 ld b,h + ld c,l + pop hl + call x32D6 ;копирование строки программы в буфер редактирования + dec a + jr x3116 +x3101 ld hl,#EC0D ;сдвиг всех строк вверх + res 0,(hl) + ld hl,#F6F8 + ld d,h + ld e,l + ld bc,#0023 + add hl,bc + ld bc,#02BC + ldir + dec a + scf +x3116 pop de + ld (de),a + ld hl,#F6F8 + pop de + pop bc + ret + +;АДРЕС: #311E сдвиг строк в буфере редактирования вниз +;вх: de - адрес последней строки в буфере редактирования +;вых: cy=0 буфер переполнен +; a - количество строк в буфере редактирования +; hl - fдрес первой строки в буфере редактирования +x311E push bc + push de + ld hl,#0020 + add hl,de + ld a,(hl) + cpl + and #11 + jr nz,x313F ;это не первая строка + push hl + push de + inc hl + ld d,(hl) + inc hl + ld e,(hl) ;de номер строки бейсик программы + push de + call x335F ;копирование процедур в ram + pop hl + call x334A ;поиск адреса строки бейсик программы + jr nc,x313D ;строка не существует + ld (#F9D7),hl +x313D pop de + pop hl +x313F bit 0,(hl) + ld hl,#F6F5 + push hl + jr z,x314C ;это не первая строка в буфере + ld a,#00 + scf + jr x3116 +x314C ld a,(hl) + cp #14 + jr z,x3116 ;это конец буфера + ld bc,#0023 + ld hl,#F6F8 + ex de,hl + ldir + ld hl,#F9D6 + ld d,h + ld e,l + ld bc,#0023 + or a + sbc hl,bc + ld bc,#02BC + lddr + inc a + scf + jr x3116 + +;АДРЕС: #316E вставка символа в нижний буфер редактирования +;вх: hl - адрес флага текущей строки +; a - код символа для вставки в буфер +x316E push bc + push de + push af + ld b,#00 + ld c,#01 + push hl + call x31C3 ;расчет адреса начала строки в буфере редактирования + pop hl + bit 3,(hl) + res 3,(hl) + jr nz,x31A0 +x3180 call x2E41 ;поиск в строке вправо от курсора редактируемого символа + pop af +x3184 call x16AC ;вставка символа в строку буфера редактирования + jr z,x31BA + push af + ld b,#00 + inc c + ld a,c + cp #15 + jr c,x31A0 + dec hl + ld a,(hl) + inc hl + cp #00 + jr z,x31A0 + push hl + ld hl,#EC0D + set 0,(hl) ;буфер заполнен + pop hl +x31A0 bit 1,(hl) + set 1,(hl) + res 3,(hl) + call x31C3 ;расчет адреса начала строки в буфере редактирования + jr nz,x3180 + push bc + push de + call x35E6 ;зануление до конца строки в буфере редактирования + ld (hl),#08 + pop de + pop bc + call x35F4 ;создание отступа в строке в буфере редактирования + pop af + jr x3184 +x31BA ld a,c + ld (#F6F5),a + set 3,(hl) + pop de + pop bc + ret + +;АДРЕС: #31C3 расчет адреса начала строки в буфере редактирования +;вх: c - номер строки +;вых: de - адрес начала строки +x31C3 ld hl,#F6F8 + jp x30B7 + +;АДРЕС: #31C9 удаление символа в нижнем буфере редактирования +x31C9 push bc + push de + ld hl,#EC0D + res 0,(hl) + ld a,(#F6F5) + ld c,a + or a + ld a,#00 + jr z,x321B +x31D9 call x31C3 ;расчет адреса начала строки в буфере редактирования + push af + ld b,#00 + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + jr nc,x31F2 + pop af + call x16C1 ;вставка символа в строку буфера редактирования со сдвигом влево + push af + push bc + ld b,#00 + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + pop bc + jr c,x3216 +x31F2 inc hl + ld a,(hl) + push af + push bc + ld a,c + cp #01 + jr nz,x3204 + ld a,(#EC15) + ld c,a + call x30B4 ;расчет адреса начала строки в буфере редактирования + jr x3208 +x3204 dec c + call x31C3 ;расчет адреса начала строки в буфере редактирования +x3208 pop bc + pop af + ld hl,#0020 + add hl,de + res 1,(hl) + or (hl) + ld (hl),a + ld hl,#F6F5 + dec (hl) +x3216 pop af + dec c + jr nz,x31D9 + scf +x321B pop de + pop bc + ret + +;АДРЕС: #321E параметры для установки буфера редактирования строки вверху экрана +x321E db #03 + db #00: dw #F9DE + +;АДРЕС: #3222 установка буфера редактирования в верху экрана +x3222 ld hl,x321E + ld de,#F9DB + jp x3FBA + +;АДРЕС: #322B перемещение курсора вверх в верхнем буфере редактирования +x322B push bc + push de + ld hl,#F9DB + push hl + ld a,(hl) + or a + jr nz,x3253 + push hl + call x335F ;копирование процедур в ram + ld hl,(#FC9A) + call x334A ;поиск адреса строки бейсик программы + jr nc,x3244 + ld (#FC9A),hl +x3244 ld b,h + ld c,l + pop hl + inc hl + inc hl + inc hl + jr nc,x325D ;!!!ОШИБКА!!! + call x32D6 ;копирование строки программы в буфер редактирования + dec a + ex de,hl + jr x325D +x3253 ld hl,(#F9DC) + ld bc,#0023 + sbc hl,bc + scf + dec a +x325D ex de,hl + pop hl + jr nc,x3262 + ld (hl),a +x3262 inc hl + ld (hl),e + inc hl + ld (hl),d + ex de,hl + pop de + pop bc + ret + +;АДРЕС: #326A копирование строки бейсик программы в буфер редактирования вверзу экрана +x326A push bc + push de + ld hl,#0020 + add hl,de + ld a,(hl) + cpl + and #11 + jr nz,x3282 + push de + push hl + inc hl + ld d,(hl) + inc hl + ld e,(hl) + ld (#FC9A),de + pop hl + pop de +x3282 bit 3,(hl) + ld hl,#F9DB + push hl + jr z,x32A0 + push hl + call x335F ;копирование процедур в ram + ld hl,(#FC9A) + call x3352 ;преобразование номера строки в ASCII и помещение в буфер + ld (#FC9A),hl + pop hl + inc hl + inc hl + inc hl + ld a,#00 + scf + jr x325D +x32A0 ld a,(hl) + cp #14 + jr z,x32B3 + inc a + ld hl,(#F9DC) + ld bc,#0023 + ex de,hl + ldir + ex de,hl + scf + jr x325D +x32B3 pop hl + pop de + pop bc + ret + +;АДРЕС: #32B7 расчет адреса начала строки в буфере редактирования +;вх: c - номер строки +;вых: de - адрес начала строки +x32B7 ld hl,#F9DE + jp x30B7 + +;АДРЕС: #32DB таблица обработки управляющих кодов при редактировании строки +x32BD db #08 ;всего функций + db #0D: dw x35CC ;enter + db #01: dw x35DA ;null + db #12: dw x335A ;flash + db #13: dw x335A ;bright + db #14: dw x335A ;inverse + db #15: dw x335A ;over + db #10: dw x335A ;ink + db #11: dw x335A ;paper + +;АДРЕС: #32D6 копирование строки программы в буфер редактирования +;вх: hl - адрес флагов предыдущей строки в буфере редактирования +; bc - номер редактируемой строки в буфере редактирования +;вых: a - количество строк в буфере редактирования +; hl - адрес первой строки +; de - адрес последней строки +x32D6 ld d,h + ld e,l + inc de + inc de + inc de ;адрес редактируемой строки в буфере редактирования + push de + ld hl,#0020 + add hl,de ;адрес флагов редактируемой строки + ld (hl),#01 ;первая строка + inc hl + ld (hl),b + inc hl + ld (hl),c ;номер строки + ld c,#01 ;строка 1 + ld b,#00 ;колонка 0 +x32EA push bc + push de + ld a,(#EC0E) + cp #04 ;это режим калькулятора + call nz,x3517 ;нет. преобразование токена в текст + pop de + pop bc + jr c,x3307 ;токен преобразован + ld a,c + cp #01 + ld a,#0D + jr nz,x3307 ;это не 'enter' + ld a,b + or a + ld a,#01 + jr z,x3307 + ld a,#0D +x3307 ld hl,x32BD + call x3FCE ;обработка управляющего кода + jr c,x332C ;код обработан + jr z,x32EA ;следующий символ + push af + ld a,#1F + cp b + jr nc,x3326 + ld a,#12 + call x3331 ;перенос части строки на следующую строку + jr c,x3323 + pop af + ld a,#0D + jr x3307 +x3323 call x35F4 ;создание отступа в строке в буфере редактирования +x3326 pop af + call x35C5 ;сохранить символ в указанном столбце текущей строки буфера редактирования + jr x32EA +x332C pop hl + ld a,c + ret z + scf + ret + +;АДРЕС: #3331 перенос части строки на следующую строку +;вх: de - адрес начала строки в буфере редактирования строки +; b - номер столбца +; c - номер строки +; a - новое значение байта флага +;вых: cy=0 - нижняя строка в буфере +; hl - адрес байта флага для новой строки +x3331 push af + call x35E6 ;зануление до конца строки в буфере редактирования + pop af + xor (hl) + ld (hl),a + ld a,c + cp #14 + ret nc + inc c + ld hl,#0023 + add hl,de + ex de,hl + ld hl,#0020 + add hl,de + ld (hl),#00 + scf + ret + +;АДРЕС: #334A поиск адреса строки бейсик программы +;вх: hl - номер строки +;вых: cy=1 строка существует +; de - адрес первой команды в строке +x334A call x34B6 ;поиск адреса строки программы с заданным номером + ret c + ld hl,#0000 + ret + +;АДРЕС: #3352 преобразование номера строки в ASCII и помещение в буфер +;вх: hl - номер строки +;вых: cy=1 строка существует +; de - адрес начала команд в строке +; hl - номер строки (=#0000 строка не существует) +x3352 call x3430 ;преобразование номера строки в ASCII и помещение в буфер + ret c + ld hl,#0000 + ret + +;АДРЕС: #335A преобразование токена в текст +;вых: cy=0 токен преобразован +x335A call x3517 ;преобразование токена в текст + ccf + ret nc ;!!!ОШИБКА!!! должно быть ret??? + +;АДРЕС: #335F копирование процедур в ram +x335F ld hl,#0000 + ld (#FC9F),hl ;адрес следующего символа в строке бейсик программы + ld (#FCA1),hl ;адрес следующего символа в буфере ключевго слова + ld hl,x3374 + ld de,#FCAE + ld bc,#00BC + ldir + ret + +;АДРЕС: #3374 копирование токена в буфер токенов (=#FCAE) +;вх: a - номер токена -#A5 +; de - адрес в буфере +x3374 di + ld bc,#7FFD + ld d,#17 ;rom 0, ram 7, scr 5 + out (c),d + cp #50 + jr nc,x33B1 ;токен =>#F5 + cp #40 + jr nc,x33AA ;токен =>#E5 + cp #30 + jr nc,x33A3 ;токен =>#D5 + cp #20 + jr nc,x339C ;токен =>#C5 + cp #10 + jr nc,x3395 ;токен =>#B5 + ld hl,Rom1.x0095+#01 + jr x33B6 +x3395 sub #10 + ld hl,Rom1.x0095+#3A + jr x33B6 +x339C sub #20 + ld hl,Rom1.x0095+#6B + jr x33B6 +x33A3 sub #30 + ld hl,Rom1.x0095+#A9 + jr x33B6 +x33AA sub #40 + ld hl,Rom1.x0095+#F6 + jr x33B6 +x33B1 sub #50 + ld hl,Rom1.x0095+#13F +x33B6 ld b,a + or a +x33B8 jr z,x33C3 +x33BA ld a,(hl) + inc hl + and #80 + jr z,x33BA + dec b + jr x33B8 + +;АДРЕС: #33C3 копирование токена (=#FCFD) +;вх: - адрес токена в rom 1 +x33C3 ld de,#FCA3 + ld (#FCA1),de + ld a,(#FC9E) + or a + ld a,#00 + ld (#FC9E),a + jr nz,x33D9 + ld a," " + ld (de),a + inc de +x33D9 ld a,(hl) + ld b,a + inc hl + ld (de),a + inc de + and #80 + jr z,x33D9 + ld a,b + and #7F + dec de + ld (de),a + inc de + ld a," "+#80 + ld (de),a + ld a,#07 ;rom 0, ram 7, scr 5 + ld bc,#7FFD + out (c),a + ei + ret + +;АДРЕС: #33F4 распознавание токена (=#FD2E) +;вых: cy=1 токен найден -> a - код токена +x33F4 di + ld bc,#7FFD + ld d,#17 ;rom 0, ram 7, scr 5 + out (c),d + ld hl,Rom1.x0095+#01 + ld b,#A5 +x3401 ld de,#FD74 ;адрес слова +x3404 ld a,(de) + and #7F + cp #61 + ld a,(de) + jr c,x340E + and #DF ;в верхний регистр +x340E cp (hl) + jr nz,x341A ;не совпадает + inc hl + inc de + and #80 + jr z,x3404 ;совпадает, следующий символ + scf + jr x3426 ;токен найден +x341A inc b + jr z,x3425 +x341D ld a,(hl) ;ищем следующий токен + and #80 + inc hl + jr z,x341D + jr x3401 +x3425 or a +x3426 ld a,b + ld d,#07 ;rom 0, ram 7, scr 5 + ld bc,#7FFD + out (c),d + ei + ret + +;АДРЕС: #3430 преобразование номера строки в ASCII и помещение в буфер +;вх: hl - номер строки +;вых: cy=1 строка существует +; de - адрес начала команд в строке +; hl - номер строки +x3430 call x34EA ;обнуление указателей в бейсик строке + or a ;!!!ОШИБКА!!! должно быть xor a + ld (#FC9E),a + call x1F20 ;установка другого стэка и ram 0 + call x34F6 ;поиск адрес строки бейсик программы в памяти + jr nc,x3491 ;строка не найдена + jr nz,x344D ;строка не найдена, но есть следующая + ld a,b + or c + jr z,x344D ;это первая строки программы + call x34CF ;расчет адреса следущей строки бейсик программы + call x34D9 ;проверка на конец бейсик программы + jr nc,x3491 ;это последняя строка программы +x344D ld d,(hl) + inc hl + ld e,(hl) ;de - номер строки + call x1F45 ;установка другого стэка и ram 7 + push de + push hl + push ix + ld ix,#FCA3 ;буфер токена + ld (#FCA1),ix + ex de,hl + ld b,#00 + ld de,-1000 + call x3495 ;выделение разряда числа и занесение его в буфер + ld de,-100 + call x3495 ;выделение разряда числа и занесение его в буфер + ld de,-10 + call x3495 ;выделение разряда числа и занесение его в буфер + ld de,-1 + call x3495 ;выделение разряда числа и занесение его в буфер + dec ix ;!!!можно оптимизировать set 7,(ix-1) + ld a,(ix+#00) ;!!!можно оптимизировать + or #80 ;!!!можно оптимизировать + ld (ix+#00),a ;!!!можно оптимизировать + pop ix + pop hl + pop de + inc hl + inc hl + inc hl + ld (#FC9F),hl + ex de,hl + scf + ret +x3491 call x1F45 ;установка другого стэка и ram 7 + ret + +;АДРЕС: #3495 выделение разряда числа и занесение его в буфер +;вх: de - делитель +; hl - номер строки +; ix - адрес в буфере для записи номера строки в ASCII +; b =#00 старший разряд числа еще не найден +;вых: ix - следующий адрес в буфере +; b =#01 старший разряд числа найден +x3495 xor a +x3496 add hl,de + inc a + jr c,x3496 + sbc hl,de + dec a + add a,#30 + ld (ix+#00),a + cp "0" + jr nz,x34B1 + ld a,b + or a + jr nz,x34B3 + ld a,#00 + ld (ix+#00),a + jr x34B3 +x34B1 ld b,#01 +x34B3 inc ix + ret + +;АДРЕС: #34B6 поиск адрес строки программы с заданным номером или следущей +; строки, если строка с заданным номером не существует +;вх: hl - номер строки +;вых: cy=1 строка найдена +; de - адрес начала команд в строке +; hl - номер строки +x34B6 call x34EA ;обнуление указателей в бейсик строке + or a ;!!!ОШИБКА!!! должно быть xor a + ld (#FC9E),a + call x1F20 ;установка другого стэка и ram 0 + call x34F6 ;поиск адрес строки бейсик программы в памяти + jr nc,x3491 ;строка не существует + ex de,hl + ld a,l + or h + scf + jp nz,x344D + ccf + jr x3491 + +;АДРЕС: #34CF расчет адреса следущей строки бейсик программы +;вх: hl - адрес текущей строки +;вых: de - адрес текущей строки +; hl - адрес следующей строки +x34CF push hl + inc hl + inc hl + ld e,(hl) + inc hl + ld d,(hl) + inc hl + add hl,de + pop de + ret + +;АДРЕС: #34D9 проверка на конец бейсик программы +;вх: hl - адрес в строке +;вых: cy=0 - это конец строки +x34D9 ld a,(hl) + and #C0 + scf + ret z + ccf + ret + +;АДРЕС: #34E0 сравнение номера строки с заданным +;вх: hl - адрес номера строки в бейсик программе +; bc - номер строки +;вых: z, cy=1 - строка найдена +; nz, cy=1 - bc<(hl) +; nz, cy=0 - bc>(hl) +x34E0 ld a,b + cp (hl) + ret nz + ld a,c + inc hl + cp (hl) + dec hl + ret nz + scf + ret + +;АДРЕС: #34EA обнуление указателей в бейсик строке +x34EA push hl + ld hl,#0000 + ld (#FCA1),hl + ld (#FC9F),hl + pop hl + ret + +;АДРЕС: #34F6 поиск адрес строки бейсик программы в памяти +;вх: hl - номер строки (=#0000 первая строка) +;вых: cy=1 - искомая или следующая строка существует +; nz - строка не найдена +; hl - адрес строки программы (=#0000 строка не существует) +; de - адрес предыдущей строки программы (=#0000 строка не существует) +; bc - номер строки (=#0000 первая строка) +x34F6 push hl + pop bc + ld de,#0000 + ld hl,(#5C53) + call x34D9 ;проверка на конец бейсик программы + ret nc ;конец программы + call x34E0 ;сравнение номера строки с заданным + ret c + ld a,b + or c + scf + ret z ;нужна первая строка +x350A call x34CF ;расчет адреса следущей строки бейсик программы + call x34D9 ;проверка на конец бейсик программы + ret nc ;это конец программы + call x34E0 ;сравнение номера строки с заданным + jr nc,x350A ;не та строка, ищем дальше + ret + +;АДРЕС: #3517 преобразование токена в текст +;вых: cy=1 токен преобразован +x3517 ld hl,(#FCA1) ;адрес следующего символа + ld a,l + or h + jr z,x353C ;нет символа + ld a,(hl) + inc hl + cp " "+#80 + ld b,a + ld a,#00 + jr nz,x3529 ;не последний символ + ld a,#FF +x3529 ld (#FC9E),a ;флаг + ld a,b + bit 7,a + jr z,x3534 ;не последний символ +x3531 ld hl,#0000 +x3534 ld (#FCA1),hl + and #7F + jp x358F +x353C ld hl,(#FC9F) + ld a,l + or h + jp z,x3591 ;больше нечего обрабатывать + call x1F20 ;установка другого стэка и ram 0 +x3547 ld a,(hl) + cp #0E + jr nz,x3554 ;это не число с плавающей точкой + inc hl + inc hl + inc hl + inc hl + inc hl + inc hl + jr x3547 +x3554 call x1F45 ;установка другого стэка и ram 7 + inc hl + ld (#FC9F),hl + cp #A5 ;'RND' + jr c,x3567 ;не токен basic48 + sub #A5 ;!!!ОШИБКА + call #FCAE ;x335F копирование токена в буфер + jp x3517 +x3567 cp #A3 ;токены basic128: SPECTRUM или PLAY + jr c,x357B + jr nz,x3572 ;PLAY + ld hl,x3594 + jr x3575 +x3572 ld hl,x359C ;SPECTRUM +x3575 call #FCFD ;x33C3 копирование токена + jp x3517 +x357B push af + ld a,#00 + ld (#FC9E),a + pop af + cp #0D + jr nz,x358F + ld hl,#0000 ;конец строки + ld (#FCA1),hl + ld (#FC9F),hl +x358F scf + ret +x3591 scf + ccf + ret + +;АДРЕС: #3594 токены basic128 +x3594 dc "SPECTRUM" +x359C dc "PLAY" +x35A0 dc "GOTO" +x35A4 dc "GOSUB" +x35A9 dc "DEFFN" +x35AE dc "OPEN#" +x35B3 dc "CLOSE#" + +;АДРЕС: #35BC установка параметров отступа +x35B9 db #02 + db #01,#05 +x35BC ld hl,x35B9 + ld de,#FD6A + jp x3FBA + +;АДРЕС: #35C5 сохранить символ в указанном столбце текущей строки буфера редактирования +;вх: b - номер столбца +; de - начальный адрес строки +; a - код символа +;вых: b - номер следующего столбца +x35C5 ld l,b + ld h,#00 + add hl,de + ld (hl),a + inc b + ret + +;АДРЕС: #35CC процедура обработки нажатия 'enter' в строке +;вых: cy=1 +x35CC call x35E6 ;зануление до конца строки в буфере редактирования + ld a,(hl) + or #18 + ld (hl),a + ld hl,#FD6A + set 0,(hl) + scf + ret + +;АДРЕС: #35DA процедура обработки зануления до конца строки +;вых: cy=1 +x35DA call x35E6 ;зануление до конца строки в буфере редактирования + set 3,(hl) + ld hl,#FD6A ;!!!можно сократить jr x35CC+nn + set 0,(hl) + scf + ret + +;АДРЕС: #35E6 зануление до конца строки в буфере редактирования +;вх: b - номер первого столбца +; de - адрес начала строки редактирования +;вых: hl - адрес байта флага строки +x35E6 ld l,b + ld h,#00 + add hl,de + ld a," " +x35EC cp b + ret z + ld (hl),#00 + inc hl + inc b + jr x35EC + +;АДРЕС: #35F4 создание отступа в строке в буфере редактирования +;вх: de - адрес строки в буфере редактирования +;вых: b - первый используемый номер столбца в строке +x35F4 ld a,(#FD6B) + ld b,#00 +x35F9 ld h,#00 + ld l,b + add hl,de + ld (hl),#00 + inc b + dec a + jr nz,x35F9 + ret + +;АДРЕС: #3604 печать строки редактируемого буфера, при необходимости +x3604 push bc + push de + push hl + push hl + ld hl,#EEF5 + bit 2,(hl) + pop hl + jr nz,x3614 ;обновлять экран не надо + ld b,c + call x3B1E ;печать строки редактируемого буфера +x3614 pop hl + pop de + pop bc + ret + +;АДРЕС: #3618 сдвиг вверх строк в буфере редактирования при необходимости +;вх: hl - адрес первой строки в буфере +; c - количество строк +; b - номер строки от которой будет сдвиг +x3618 push bc + push de + push hl + push hl + ld hl,#EEF5 + bit 2,(hl) + pop hl + jr nz,x3628 + ld e,c + call x3ABF ;сдвиг вверх строк в буфере редактирования +x3628 pop hl + pop de + pop bc + ret + +;АДРЕС: #362C сдвиг вниз строк в буфере редактирования при необходимости +;вх: hl - адрес первой строки в буфере +; c - количество строк +; b - номер строки от которой будет сдвиг +x362C push bc + push de + push hl + push hl + ld hl,#EEF5 + bit 2,(hl) + pop hl + jr nz,x363C + ld e,c + call x3AC6 ;сдвиг вниз строк в буфере редактирования +x363C pop hl + pop de + pop bc + ret + +;АДРЕС: #3640 печать атрибутов курсора +;вх: c - номер строки +; b - номер столбца +x3640 push af + push bc + push de + push hl + ld a,b + ld b,c + ld c,a + call x3A9D ;печать атрибутов курсора + pop hl + pop de + pop bc + pop af + ret + +;АДРЕС: #364F восстановление атрибутов под курсором +;вх: c - crd Y, b - crd X +x364F push af + push bc + push de + push hl + ld a,b + ld b,c + ld c,a + call x3AB2 ;восстановление атрибутов под курсором + pop hl + pop de + pop bc + pop af + ret + +;АДРЕС: #365E установка переменных для ввода символа +x365E ld a,#00 + ld (#5C41),a ;Число, определяющее режим ввода с клавиатуры + ld a,#02 + ld (#5C0A),a ;Период автоповтора +x3668 ld hl,#5C3B + ld a,(hl) + or #0C + ld (hl),a ;ввод символа + ld hl,#EC0D + bit 4,(hl) + ld hl,x5B66 + jr nz,x367C + res 0,(hl) + ret +x367C set 0,(hl) + ret + +;АДРЕС: #367F ожидание нажатия клавиши +;вых: a - код клавиши +x367F push hl +x3680 ld hl,#5C3B +x3683 bit 5,(hl) + jr z,x3683 ;клавиша не нажата + res 5,(hl) + ld a,(#5C08) ;Код нажатой клавиши + ld hl,#5C41 + res 0,(hl) + cp #20 + jr nc,x36A2 ;символьная клавиша + cp #10 + jr nc,x3680 ;нет реакции + cp #06 + jr c,x3680 + call x36A4 + jr nc,x3680 +x36A2 pop hl + ret +x36A4 rst #28 ;вызов п/п из basic 48 + dw Rom1.x10DB ;обработка кода клавиши + ret + +;АДРЕС: #36A8 печать меню basic 128k +;вх: hl - адрес описания меню +x36A8 push hl + call x373B ;сохранение окна экрана 14*12 в буфере + ld hl,#5C3C + res 0,(hl) + pop hl + ld e,(hl) + inc hl + push hl + ld hl,x37EC ;управляющие коды для печати меню + call x3733 ;печать строки из hl + pop hl + call x3733 + push hl + call x3822 ;печать эмблемы ZX (косые цветные полосы) в меню + ld hl,x37FA ;управляющие коды для печати меню + call x3733 ;печать строки из hl + pop hl +;печать строчек меню + push de + ld bc,#0807 + call x372B ;установка координат печати из bc +x36D1 push bc + ld b,#0C + ld a,#20 + rst #10 ;пробел +x36D7 ld a,(hl) ;печать строчки меню + inc hl + cp #80 + jr nc,x36E0 + rst #10 + djnz x36D7 +x36E0 and #7F + rst #10 +x36E3 ld a,#20 ;дополняем пробелами + rst #10 + djnz x36E3 + pop bc + inc b + call x372B ;установка координат печати из bc + dec e + jr nz,x36D1 + ld hl,#6F38 + pop de +;печать рамки вокруг меню + sla e + sla e + sla e + ld d,e + dec d + ld e,#6F + ld bc,#FF00 + ld a,d + call x3719 ;печать одной линии вокруг меню + ld bc,#0001 + ld a,e + call x3719 ;печать одной линии вокруг меню + ld bc,#0100 + ld a,d + inc a + call x3719 ;печать одной линии вокруг меню + xor a + call x37CA ;атрибутов опции меню + ret + +;АДРЕС: #3719 печать одной линии вокруг меню +;вх: hl - координаты +; bc - приращение координат +x3719 push af + push hl + push de + push bc + ld b,h + ld c,l + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x22E9 ;печать точки + pop bc + pop de + pop hl + pop af + add hl,bc + dec a + jr nz,x3719 + ret + +;АДРЕС: #372B установка координат печати из bc +;вх: bc - координаты печати +x372B ld a,#16 + rst #10 + ld a,b + rst #10 + ld a,c + rst #10 + ret + +;АДРЕС: #3733 печать строки из hl +;вх: hl - адрес строки +x3733 ld a,(hl) + inc hl + cp #FF + ret z + rst #10 ;печать символа из A + jr x3733 + +;АДРЕС: #373B сохранение окна экрана 14*12 в буфере +x373B scf + jr x373F + +;АДРЕС: #373E восстановление окна экрана 14*12 из буфера +x373E and a +x373F ld de,#EEF6 + ld hl,#5C3C + jr c,x3748 + ex de,hl +x3748 ldi + jr c,x374D + ex de,hl +x374D ld hl,#5C7D ;Координаты X и Y последней изображенной на экране точки + jr c,x3753 + ex de,hl +x3753 ld bc,#0014 + ldir + jr c,x375B + ex de,hl +x375B ex af,af' + ld bc,#0707 + call x3B94 + ld a,(ix+#01) + add a,b + ld b,a + ld a,#0C +x3769 push bc + push af + push de + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E9B ;расчет адреса на экране по координатам + ld bc,#0007 + add hl,bc + pop de + call x377E ;сохранение/восстановление 14 знакомест экана в буфере + pop af + pop bc + dec b + dec a + jr nz,x3769 + ret + +;АДРЕС: #377E сохранение/восстановление 14 знакомест экана в буфере +;вх: cy' =1 сохранение части экрана в буфере +; =0 восстановление части экрана из буфера +; hl - адрес на экране +; de - адрес в буфере +x377E ld bc,#080E +x3781 push bc + ld b,#00 + push hl + ex af,af' + jr c,x3789 + ex de,hl +x3789 ldir + jr c,x378E + ex de,hl +x378E ex af,af' + pop hl + inc h + pop bc + djnz x3781 + push bc + push de + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам + ex de,hl + pop de + pop bc + ex af,af' + jr c,x37A0 + ex de,hl +x37A0 ldir + jr c,x37A5 + ex de,hl +x37A5 ex af,af' + ret + +;АДРЕС: #37A7 клавиша вверх в меню basic128 +;вх: a - номер опции +; hl - адрес списка опций меню +x37A7 call x37CA ;инвертирование атрибутов опции меню + dec a + jp p,x37B1 + ld a,(hl) + dec a + dec a +x37B1 call x37CA ;инвертирование атрибутов опции меню + scf + ret + +;АДРЕС: #37B6 клавиша вниз в меню basic128 +;вх: a - номер опции +; hl - адрес списка опций меню +x37B6 push de + call x37CA ;инвертирование атрибутов опции меню + inc a + ld d,a + ld a,(hl) + dec a + dec a + cp d + ld a,d + jp p,x37C5 + xor a +x37C5 call x37CA ;инвертирование атрибутов опции меню + pop de + ret + +;АДРЕС: #37CA инвертирование атрибутов опции меню +;вх: a - номер опции +x37CA push af + push hl + push de + ld hl,#5907 + ld de,#0020 + and a + jr z,x37DA +x37D6 add hl,de + dec a + jr nz,x37D6 +x37DA ld a,%01111000 ;bright 1, paper 7, ink 0 + cp (hl) + jr nz,x37E1 + ld a,%01101000 ;bright 1, paper 5, ink 0 +;печать атрибутов опции +x37E1 ld d,#0E +x37E3 ld (hl),a + inc hl + dec d + jr nz,x37E3 + pop de + pop hl + pop af + ret + +;АДРЕС: #37EC управляющие коды для печати меню +x37EC db #16,#07,#07 ;координаты + db #15,#00 ;over 0 + db #14,#00 ;inverse 0 + db #10,#07 ;ink 7 + db #11,#00 ;paper 0 + db #13,#01 ;bright 1 + db #FF + +;АДРЕС: #37FA управляющие коды для печати меню +x37FA db #11,#00,#20 ;paper 0 + db #11,#07 ;paper 7 + db #10,#00 ;ink 0 + db #FF + +;АДРЕС: #3802 данные потоков для печати эмблемы +x3802 db #01,#03,#07,#0F,#1F,#3F,#7F,#FF + db #FE,#FC,#F8,#F0,#E0,#C0,#80,#00 + +;АДРЕС: #3812 управляющие коды для печати косых полос в меню +x3812 db #10,#02,#20 ;ink 2 + db #11,#06,#21 ;paper 6 + db #10,#04,#20 ;ink 4 + db #11,#05,#21 ;paper 5 + db #10,#00,#20 ;ink 0 + db #FF + +;АДРЕС: #3822 печать эмблемы ZX (косые цветные полосы) в меню +x3822 push bc + push de + push hl + ld hl,x3802 + ld de,x5B98 + ld bc,#0010 + ldir + ld hl,(#5C36) + push hl + ld hl,#5A98 + ld (#5C36),hl + ld hl,x3812 ;управляющие коды для печати косых полос в меню + call x3733 ;печать строки из hl + pop hl + ld (#5C36),hl + pop hl + pop de + pop bc + ret + +;АДРЕС: #3848 печать информационной строки 128 BASIC +x3848 ld hl,x2768 + jr x385A + +;АДРЕС: #384D печать информационной строки Calculator +x384D ld hl,x2771 + jr x385A + +;АДРЕС: #3852 печать информационной строки 48 TR-DOS +x3852 ld hl,x2783 + jr x385A + +;АДРЕС: #3857 печать информационной строки 128 TR-DOS +x3857 ld hl,x275E ;сообщение "128 TR-DOS" +x385A push hl + call x3881 ;очистка двух нижних строк экрана + ld hl,#5AA0 ;установка атрибутов в строке + ld b,#20 + ld a,#40 ;bright 1, paper 0, ink 0 +x3865 ld (hl),a + inc hl + djnz x3865 + ld hl,x37EC ;управляющие коды для печати меню + call x3733 ;печать строки из hl + ld bc,#1500 + call x372B ;установка координат печати из bc + pop de + call x057D ;печать строки из de + ld c,#1A + call x372B ;установка координат печати из bc + jp x3822 ;печать эмблемы ZX (косые цветные полосы) в меню + +;АДРЕС: #3881 очистка двух нижних строк экрана +x3881 ld b,#15 + ld d,#17 + jp x3B5E + +;АДРЕС: #3888 перенумерация строк программы +x3888 call x1F20 ;установка другого стэка и ram 0 + call x3A05 ;подсчет количества строк в бейсик программе + ld a,d + or e + jp z,x39C0 + ld hl,(x5B96) + rst #28 ;!!!ОШИБКА!!! + dw Rom1.x30A9 ;hl=hl*de + ex de,hl + ld hl,(x5B94) + add hl,de + ld de,10000 + or a + sbc hl,de + jp nc,x39C0 + ld hl,(#5C53) +x38AA rst #28 + dw Rom1.x19B8 ;поиск адрес начала следующей строки программы + inc hl + inc hl + ld (x5B92),hl + inc hl + inc hl + ld (x5B67+4),de +x38B8 ld a,(hl) + rst #28 + dw Rom1.x18B6 ;пропуск натурального числа + cp #0D + jr z,x38C5 + call x390E ;анализ строки и перенумерование ссылок на номера строк + jr x38B8 +x38C5 ld de,(x5B67+4) + ld hl,(#5C4B) + and a + sbc hl,de + ex de,hl + jr nz,x38AA +x38D2 call x3A05 ;подсчет количества строк в бейсик программе + ld b,d + ld c,e + ld de,#0000 + ld hl,(#5C53) +x38DD push bc + push de + push hl + ld hl,(x5B96) + rst #28 + dw Rom1.x30A9 ;hl=hl*de + ld de,(x5B94) + add hl,de + ex de,hl + pop hl + ld (hl),d + inc hl + ld (hl),e + inc hl + ld c,(hl) + inc hl + ld b,(hl) + inc hl + add hl,bc + pop de + inc de + pop bc + dec bc + ld a,b + or c + jr nz,x38DD + call x1F45 ;установка другого стэка и ram 7 + ld (x5B92),bc + scf + ret + +;токены, использующие ссылки на строки +x3907 db #CA ;LINE + db #F0 ;LIST + db #E1 ;LLIST + db #EC ;GO TO + db #ED ;GO SUB + db #E5 ;RESTORE + db #F7 ;RUN + +;АДРЕС: #390E анализ строки и перенумерование ссылок на номера строк +x390E inc hl + ld (x5B78+1),hl + ex de,hl + ld bc,#0007 + ld hl,x3907 +x3919 cpir + ex de,hl + ret nz + ld c,#00 +x391F ld a,(hl) + cp " " + jr z,x393F + rst #28 + dw Rom1.x2D1B ;это цифра? + jr nc,x393F + cp "." + jr z,x393F + cp #0E + jr z,x3943 + or #20 + cp "e" + jr nz,x393B + ld a,b + or c + jr nz,x393F +x393B ld hl,(x5B78+1) + ret +x393F inc bc + inc hl + jr x391F +x3943 ld (x5B71),bc + push hl + rst #28 + dw Rom1.x18B6 ;пропуск натурального числа + call x3A36 ;пропуск пробелов в строке + ld a,(hl) + pop hl + cp ":" + jr z,x3957 + cp #0D + ret nz +x3957 inc hl + rst #28 + dw Rom1.x33B4 ;поместить число на смэк калькулятора + rst #28 + dw Rom1.x2DA2 ;извлечь значение со стэка калькулятора + ld h,b + ld l,c + rst #28 + dw Rom1.x196E ;получить начальный адрес строки программы + jr z,x396F + ld a,(hl) + cp #80 + jr nz,x396F + ld hl,#270F ;9999 + jr x3980 +x396F ld (x5B76+1),hl + call x3A0B ;подсчет количества строк + ld hl,(x5B96) + rst #28 + dw Rom1.x30A9 ;hl=hl*de + ld de,(x5B94) + add hl,de +x3980 ld de,x5B72+1 + push hl + call x3A3C ;номер строки в ASCII + ld e,b + inc e + ld d,#00 + push de + push hl + ld l,e + ld h,#00 + ld bc,(x5B71) + or a + sbc hl,bc + ld (x5B71),hl + jr z,x39CF + jr c,x39C5 + ld b,h + ld c,l + ld hl,(x5B78+1) + push hl + push de + ld hl,(#5C65) + add hl,bc + jr c,x39BE + ex de,hl + ld hl,#0082 + add hl,de + jr c,x39BE + sbc hl,sp + ccf + jr c,x39BE + pop de + pop hl + rst #28 + dw Rom1.x1655 ;резервирование места (длина в bc) + jr x39CF +x39BE pop de + pop hl +x39C0 call x1F45 ;установка другого стэка и ram 7 + and a + ret +x39C5 dec bc + dec e + jr nz,x39C5 + ld hl,(x5B78+1) + rst #28 + dw Rom1.x19E8 ;удалить массив DIM +x39CF ld de,(x5B78+1) + pop hl + pop bc + ldir + ex de,hl + ld (hl),#0E + pop bc + inc hl + push hl + rst #28 + dw Rom1.x2D2B ;bc на стэк калькулятора + pop de + ld bc,#0005 + ldir + ex de,hl + push hl + ld hl,(x5B92) + push hl + ld e,(hl) + inc hl + ld d,(hl) + ld hl,(x5B71) + add hl,de + ex de,hl + pop hl + ld (hl),e + inc hl + ld (hl),d + ld hl,(x5B67+4) + ld de,(x5B71) + add hl,de + ld (x5B67+4),hl + pop hl + ret + +;АДРЕС: #3A05 подсчет количества строк в бейсик программе +x3A05 ld hl,(#5C4B) + ld (x5B76+1),hl +x3A0B ld hl,(#5C53) + ld de,(x5B76+1) + or a + sbc hl,de + jr z,x3A31 + ld hl,(#5C53) + ld bc,#0000 +x3A1D push bc + rst #28 + dw Rom1.x19B8 ;поиск адрес начала следующей строки программы + ld hl,(x5B76+1) + and a + sbc hl,de + jr z,x3A2E + ex de,hl + pop bc + inc bc + jr x3A1D +x3A2E pop de + inc de + ret +x3A31 ld de,#0000 + ret + +;АДРЕС: #3A35 пропуск пробелов в строке +x3A35 inc hl +x3A36 ld a,(hl) + cp " " + jr z,x3A35 + ret + +;АДРЕС: #3A3C номер строки в ASCII +x3A3C push de + ld bc,-1000 + call x3A60 ;получить один разря числа в ASCII + ld bc,-100 + call x3A60 ;получить один разря числа в ASCII + ld c,-10 + call x3A60 ;получить один разря числа в ASCII + ld a,l + add a,"0" + ld (de),a + inc de + ld b,#03 + pop hl +x3A56 ld a,(hl) + cp "0" + ret nz + ld (hl)," " + inc hl + djnz x3A56 + ret + +;АДРЕС: #3A60 получить один разря числа в ASCII +x3A60 xor a +x3A61 add hl,bc + inc a + jr c,x3A61 + sbc hl,bc + dec a + add a,"0" + ld (de),a + inc de + ret + +;настройки курсора +x3A6D db #08 + db #00,#00,#14,#00,#00,#00,#0F,#00 + +;настройки курсора +x3A76 db #08 + db #00,#16,#01,#00,#00,#00,#0F,#00 + +;АДРЕС: #3A7F установка настроек курсора для верхнего окна +x3A7F ld ix,#FD6C + ld hl,x3A6D + jr x3A8B + +;АДРЕС: #3A88 установка настроек курсора для нижнего окна +x3A88 ld hl,x3A76 +x3A8B ld de,#FD6C + jp x3FBA + +;АДРЕС: #3A91 !!!NOT USED!!! +x3A91 rst #10 + ld a,d + rst #10 + scf + ret + +;АДРЕС: #3A96 сохранить атрибуты курсора +x3A96 and #3F + ld (ix+#06),a + scf + ret + +;АДРЕС: #3A9D печать атрибутов курсора +;вх: b - номер строки +; c - номер столбца +; ix - адрес дескриптора курсора +x3A9D ld a,(ix+#01) + add a,b + ld b,a + call x3BA0 ;расчет адреса атрибутов + ld a,(hl) + ld (ix+#07),a ;сохраним атрибуты + cpl + and #C0 + or (ix+#06) + ld (hl),a + scf + ret + +;АДРЕС: #3AB2 восстановление атрибутов под курсором +;вх: b - crd Y +; c - crd X +; ix - адрес описания курсора +x3AB2 ld a,(ix+#01) + add a,b + ld b,a + call x3BA0 ;расчет адреса атрибутов + ld a,(ix+#07) + ld (hl),a + ret + +;АДРЕС: #3ABF сдвиг вверх строк в буфере редактирования +;вх: hl - адрес первой строки в буфере +; e - количество строк +; b - номер строки от которой будет сдвиг +x3ABF push hl + ld h,#00 ;сдвиг вверх + ld a,e + sub b ;a - количество строк для сдвига + jr x3ACD + +;АДРЕС: #3AC6 сдвиг вниз строк в буфере редактирования +;вх: hl - адрес первой строки в буфере +; e - количество строк +; b - номер строки от которой будет сдвиг +x3AC6 push hl + ld a,e + ld e,b + ld b,a + sub e ;a - количество строк для сдвига + ld h,#FF ;сдвиг вниз + +;сдвиг строк +x3ACD ld c,a + ld a,b + cp e + jr z,x3B1D ;сдвигать не надо + push de + call x3B98 ;расчет количества строк от заданной до низа экрана +x3AD6 push bc + ld c,h + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E9B ;расчет адреса на экране по координатам + ex de,hl + xor a + or c + jr z,x3AE3 ;вверх + inc b ;вниз + jr x3AE4 +x3AE3 dec b +x3AE4 push de + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E9B ;расчет адреса на экране по координатам + pop de + ld a,c + ld c,#20 + ld b,#08 +x3AEE push bc ;скролл знакоместной строки + push hl + push de + ld b,#00 + ldir + pop de + pop hl + pop bc + inc h + inc d + djnz x3AEE + push af ;скролл атрибутной строки + push de + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам + ex de,hl + ex (sp),hl + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам + ex de,hl + ex (sp),hl + pop de + ld bc,#0020 + ldir + pop af + pop bc + and a + jr z,x3B16 ;вверх + inc b + jr x3B17 +x3B16 dec b +x3B17 dec c + ld h,a + jr nz,x3AD6 + pop de + ld b,e +x3B1D pop hl + +;АДРЕС: #3B1E печать строки редактируемого буфера +;вх: b - координата печати Y +; hl - адрес начала строки +x3B1E call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами + ex de,hl + ld a,(#5C3C) ;TVFLAG + push af + ld hl,#EC0D + bit 6,(hl) ;в какой области идет редактирование буфера + res 0,a + jr z,x3B31 + set 0,a +x3B31 ld (#5C3C),a + ld c,#00 + call x372B ;установка координат печати из bc + ex de,hl + ld b,#20 +x3B3C ld a,(hl) + and a + jr nz,x3B42 + ld a,#20 +x3B42 cp #90 + jr nc,x3B55 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0010 ;!!!можно заменить на rst #10!!! +x3B49 inc hl + djnz x3B3C + pop af + ld (#5C3C),a + call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами + scf ;!!!ЛИШНЕЕ!!! + ret ;!!!тоже тогда убрать!!! +x3B55 call x1F20 ;установка другого стэка и ram 0 + rst #10 + call x1F45 ;установка другого стэка и ram 7 + jr x3B49 + +;АДРЕС: #3B5E очистка строк экрана +;вх: b - номер первой строки экрана +; d - номер последней строки экрана +x3B5E call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами + ld a,d + sub b + inc a + ld c,a ;количество строк + call x3B98 ;b - номер начальной строки экрана +x3B68 push bc ;c - кол-во строк + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E9B ;расчет адреса на экране по координатам + ld c,#08 ;занулим строку занкомест +x3B6E push hl + ld b,#20 ;занулим строку пикселей + xor a +x3B72 ld (hl),a + inc hl + djnz x3B72 + pop hl + inc h + dec c + jr nz,x3B6E + ld b,#20 + push bc + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам + ex de,hl + pop bc + ld a,(#5C8D) ;установим атрибуты строки +x3B86 ld (hl),a + inc hl + djnz x3B86 + pop bc + dec b + dec c + jr nz,x3B68 + call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами + scf + ret + +;АДРЕС: #3B94 расчет количества строк и столцов до конца экрана +x3B94 ld a,#21 + sub c + ld c,a + +;АДРЕС: #3B98 расчет количества строк от заданной до низа экрана +;вх: b - номер строки +; ix - адрес описателя курсора +;вых: b - количество строк до низа экрана +x3B98 ld a,#18 + sub b + sub (ix+#01) + ld b,a + ret + +;АДРЕС: #3BA0 расчет адреса атрибутов +;вх: b - crd Y +; c - crd X +;вых: hl - адрес атрибутов +x3BA0 push bc + xor a + ld d,b + ld e,a + rr d + rr e + rr d + rr e + rr d + rr e + ld hl,#5800 + ld b,a + add hl,bc + add hl,de + pop bc + ret + +;АДРЕС: #3BB8 обмен атрибутов basic 128 с основными атрибутами +x3BB8 push af + push hl + push de + ld hl,(#5C8D) ;постоянные атрибуты экрана + ld de,(#5C8F) ;временные атрибуты экрана + exx + ld hl,(#EC0F) + ld de,(#EC11) + ld (#5C8D),hl + ld (#5C8F),de + exx + ld (#EC0F),hl + ld (#EC11),de + ld hl,#EC13 + ld a,(#5C91) ;параметры вывода на экран + ld d,(hl) + ld (hl),a + ld a,d + ld (#5C91),a + pop de + pop hl + pop af + ret + +;АДРЕС: #3BE9 запуск команды randomize 15619: rem: load "boot" +x3BE9 call x3C56 ;пауза 25 фреймов + set 6,(iy+#02) + res 0,(iy+#02) ;вывод на основной экран + rst #08 + db #8D + ld (#EC0E),a ;a=#07 + ld bc,#0000 + call x372B ;установка координат печати из bc + ld hl,#EC0E + ld (hl),#FF + call x1F20 ;установка другого стэка и ram 0 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x16B0 ;очистка различных областей памяти + ld hl,(#5C59) ;адрес начала строки basic + ld a,#08 + rst #08 + db #8C ;bc - длина бейсик-строки для автостарта + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1655 ;резервирование места (длина в bc) + ld de,(#5C59) ;адрес начала строки basic + ld a,#04 + rst #08 ;копирование строки автостарта по адресу в de + db #8C ; и переход на rom 0: #1B11 + ; анализ и выполненение введенной строки +;АДРЕС: #3C1C !!!NOT USED!!! копирование и выполненение бейсик строки +x3C1C nop + jp x1B0F + +;АДРЕС: #3C20 !!!NOT USED!!! бейсик строка +x3C20 db #F9 ;RANDOMIZE + db #C0 ;USR + db #B0 ;VAL + db '"15619":' + db #EA ;REM + db ":" + db #F7 ;RUN + db "92,3MOA" + +;АДРЕС: #3C35 возврат из монтора +x3C35 out (c),d + ld b,#7F + out (c),e + pop de + pop bc + inc sp + pop af + ld r,a + jp po,x3C47 + pop af + ei + ret +x3C47 pop af + di + ret + +;АДРЕС: #3C4A !!!NOT USED!!! вход куда-то (продолжение x08E1) +x3C4A ld (#C001),a + cpl + ld (#C002),a + ld a,#04 + jp x0004 + +;АДРЕС: #3C56 пауза 25 фреймов +x3C56 ei + ld b,#19 +x3C59 halt + djnz x3C59 + ld hl,#5C3B + res 5,(hl) ;клавиша не нажата + scf + ret + +;АДРЕС: #3C63 токенизация строки бейсик программы с синтаксической ошибкой +x3C63 ld a,#01 + jr x3C69 + +;АДРЕС: #3C67 токенизация строки бейсик программы +x3C67 ld a,#00 ;!!! можно xor a +x3C69 ld (#FD8A),a + ld hl,#0000 + ld (#FD85),hl + ld (#FD87),hl + add hl,sp + ld (#FD8B),hl + call x34EA ;обнуление указателей в бейсик строке + ld a,#00 ;!!! можно xor a + ld (#FD84),a + ld hl,#FD74 + ld (#FD7D),hl + call x1F20 ;установка другого стэка и ram 0 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x16B0 ;очистка различных областей памяти + call x1F45 ;установка другого стэка и ram 7 + ld a,#00 ;!!! можно xor a + ld (#FD81),a + ld hl,(#5C59) + ld (#FD82),hl + ld hl,#0000 ;!!! можно ld h,a: ld l,a + ld (#FD7F),hl +x3CA1 ld hl,(#FD85) + inc hl + ld (#FD85),hl + call x3D9D ;получить очередной символ из строки бейсик программы и определить его тип + ld c,a + ld a,(#FD81) + cp #00 + jr nz,x3CF4 +x3CB3 ld a,c + and #04 + jr z,x3CED ;это не буква +x3CB8 call x3DE9 ;!!!ОШИБКА + jr nc,x3CC4 ;в буфере нет места + ld a,#01 + ld (#FD81),a + jr x3CA1 +x3CC4 ld hl,(#FD7F) + ld a,l + or h + jp nz,x3D1E ;!!! млжно jr +x3CCC push bc + call x3DCD ;копирование слова из буфера в строку бейсик программы + pop bc + ld a,#00 + ld (#FD81),a +x3CD6 ld a,c + and #01 + jr nz,x3CB3 + ld a,b + call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > + ret nc + ld hl,(#FD85) + inc hl + ld (#FD85),hl + call x3D9D ;получить очередной символ из строки бейсик программы и определить его тип + ld c,a + jr x3CD6 +x3CED ld a,b + call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > + ret nc + jr x3CA1 +x3CF4 cp #01 + jr nz,x3CED + ld a,c + and #01 + jr z,x3CB8 + push bc +x3CFE call x3F7E ;распознавание токена + pop bc + jr c,x3D7D ;токен распознан + ld hl,(#FD7F) + ld a,h + or l + jr nz,x3D1E + ld a,c + and #02 + jr z,x3CCC + call x3DE9 ;вставить символ в буфер редактирования + jr nc,x3CC4 ;нет места в памяти + ld hl,(#FD7D) + dec hl + ld (#FD7F),hl + jr x3CA1 +x3D1E push bc + ld hl,#FD74 + ld de,(#FD7F) + ld a,d ;!!!можно оптимизировать + cp h + jr nz,x3D2F + ld a,e + cp l + jr nz,x3D2F + inc de +x3D2F dec de + jr x3D33 +x3D32 inc hl +x3D33 ld a,(hl) + and #7F + push hl + push de + call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > + pop de + pop hl + ld a,h + cp d + jr nz,x3D32 + ld a,l + cp e + jr nz,x3D32 + ld de,(#FD7F) + ld hl,#FD74 + ld (#FD7F),hl + ld bc,(#FD7D) + dec bc + ld a,d + cp h + jr nz,x3D70 + ld a,e + cp l + jr nz,x3D70 + inc de + push hl + ld hl,#0000 + ld (#FD7F),hl + pop hl + ld a,b + cp h + jr nz,x3D70 + ld a,c + cp l + jr nz,x3D70 + pop bc + jr x3D8F +x3D70 ld a,(de) + ld (hl),a + inc hl + inc de + and #80 + jr z,x3D70 + ld (#FD7D),hl + jr x3CFE +x3D7D push bc + call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > + pop bc + ld hl,#0000 + ld (#FD7F),hl + ld a,(#FD81) + cp #04 + jr z,x3D94 +x3D8F ld a,#00 + ld (#FD81),a +x3D94 ld hl,#FD74 + ld (#FD7D),hl + jp x3CB3 + +;АДРЕС: #3D9D получить очередной символ из строки бейсик программы и определить его тип +;вых: b - код символа +; a=#01 - прочие символы +; a=#02 - это # или $ +; a=#03 - это пробел +; a=#06 - это буква +x3D9D call x2D54 ;получить очередной символ из строки бейсик программы + ld b,a + cp #3F + jr c,x3DAF + or #20 + call x3DC6 ;проверка символа на принадлежность к буквам нижнего регистра + jr c,x3DC3 ;это буква +x3DAC ld a,#01 ;прочее + ret +x3DAF cp #20 + jr z,x3DC0 ;это пробел + cp "#" + jr z,x3DBD + jr c,x3DAC + cp "$" + jr nz,x3DAC +x3DBD ld a,#02 ;это # или $ + ret +x3DC0 ld a,#03 ;это пробел + ret +x3DC3 ld a,#06 ;это буква + ret + +;АДРЕС: #3DC6 проверка символа на принадлежность к буквам нижнего регистра +;вх: a - клод символа +;вых: cy=1 символ это буква в нижнем регистре +x3DC6 cp #7B + ret nc + cp #61 + ccf + ret + +;АДРЕС: #3DCD копирование слова из буфера в строку бейсик программы +x3DCD ld hl,#FD74 + ld (#FD7D),hl + sub a + ld (#FD7F),a + ld (#FD80),a +x3DDA ld a,(hl) + and #7F + push hl + call x3E9C ;вставка символа в сроку бейсик программы с игнорированием пробелов + pop hl + ld a,(hl) + and #80 + ret nz + inc hl + jr x3DDA + +;АДРЕС: #3DE9 вставить символ в буфер редактирования +;вх: b - код символа +; cy=0 нет места в буфере +x3DE9 ld hl,(#FD7D) + ld de,#FD7D + ld a,d + cp h + jr nz,x3DF8 + ld a,e + cp l + jp z,x3E13 ;!!!можно jr +x3DF8 ld de,#FD74 + ld a,d + cp h + jr nz,x3E03 + ld a,e + cp l + jr z,x3E09 +x3E03 dec hl + ld a,(hl) + and #7F + ld (hl),a + inc hl +x3E09 ld a,b + or #80 + ld (hl),a + inc hl + ld (#FD7D),hl + scf + ret +x3E13 scf + ccf + ret + +;АДРЕС: #3E16 вставка символа в сроку бейсик программы с обработкой < и > +;вх: a - код символа +x3E16 push af ;!!!ОШИБКА!!! + ld a,(#FD89) + or a + jr nz,x3E2F + pop af + cp ">" + jr z,x3E2A + cp "<" + jr z,x3E2A +x3E26 call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек + ret ;!!!можно сократить +x3E2A ld (#FD89),a + scf + ret +x3E2F cp "<" + ld a,#00 + ld (#FD89),a + jr nz,x3E52 + pop af + cp ">" + jr nz,x3E41 + ld a,#C9 ;токен <> + jr x3E26 +x3E41 cp "=" + jr nz,x3E49 + ld a,#C7 ;токен <= + jr x3E26 +x3E49 push af + ld a,"<" + call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек + pop af + jr x3E26 +x3E52 pop af + cp "=" + jr nz,x3E5B + ld a,#C8 ;токен >= + jr x3E26 +x3E5B push af + ld a,">" + call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек + pop af + jr x3E26 + +;АДРЕС: #3E64 вставка символа в сроку бейсик программы с обработко REM и кавычек +;вх: a - код символа +x3E64 cp #0D + jr z,x3E88 ;это enter + cp #EA + ld b,a + jr nz,x3E74 ;это не REM + ld a,#04 + ld (#FD81),a + jr x3E82 +x3E74 cp #22 ;" + jr nz,x3E82 ;это не " + ld a,(#FD81) + and #FE + xor #02 + ld (#FD81),a +x3E82 ld a,b + call x3E9C ;вставка символа в сроку бейсик программы с игнорированием пробелов + scf + ret +x3E88 ld a,(#FD8A) + cp #00 + jr z,x3E99 + ld bc,(#FD85) ;!!!ОШИБКА!!! + ld hl,(#FD8B) + ld sp,hl + scf + ret +x3E99 scf + ccf + ret + +;АДРЕС: #3E9C вставка символа в сроку бейсик программы с игнорированием пробелов +;вх: a - код символа +;вых: a - новые флаги строки +x3E9C ld e,a + ld a,(#FD84) + ld d,a + ld a,e + cp " " + jr nz,x3EC6 ;это не пробел + ld a,d + and #01 + jr nz,x3EBF ;предыдущий символ был токеном + ld a,d + and #02 + jr nz,x3EB7 ;предыдущий символ был пробелом + ld a,d + or #02 + ld (#FD84),a + ret +x3EB7 ld a,e + call x3EFB ;вставка символа в сроку бейсик программы + ld a,(#FD84) + ret +x3EBF ld a,d + and #FE + ld (#FD84),a + ret +x3EC6 cp #A3 + jr nc,x3EEE ;это токен + ld a,d + and #02 + jr nz,x3EDA ;последний символ был пробелом + ld a,d + and #FE + ld (#FD84),a + ld a,e + call x3EFB ;вставка символа в сроку бейсик программы + ret ;!!!можно сократить +x3EDA push de + ld a," " + call x3EFB ;вставка символа в сроку бейсик программы + pop de + ld a,d + and #FE ;!!!можно сократить + and #FD + ld (#FD84),a + ld a,e ;!!!можно сократить jr x3ED2 + call x3EFB ;вставка символа в сроку бейсик программы + ret ;!!!можно сократить +x3EEE ld a,d + and #FD + or #01 + ld (#FD84),a ;!!!можно сократить jr x3ECF + ld a,e + call x3EFB ;вставка символа в сроку бейсик программы + ret + +;АДРЕС: #3EFB вставка символа в сроку бейсик программы +;вх: a - код символа +; de - адрес в строке для вставки +x3EFB ld hl,(#FD87) + inc hl + ld (#FD87),hl + ld hl,(#FD82) ;адрес в строке для следующей вставки + ld b,a + ld a,(#FD8A) + cp #00 ;!!! можно or a + ld a,b + jr z,x3F33 + ld de,(#5C5F) ;адрес символа после маркера ошибки + ld a,h ;!!! можно оптимизировать + cp d + jr nz,x3F30 + ld a,l + cp e + jr nz,x3F30 + ld bc,(#FD85) ;!!!ОШИБКА!!! + ld hl,(#FD87) + and a + sbc hl,bc + jr nc,x3F2A + ld bc,(#FD87) +x3F2A ld hl,(#FD8B) + ld sp,hl + scf + ret +x3F30 scf + jr x3F35 +x3F33 scf + ccf +x3F35 call x1F20 ;установка другого стэка и ram 0 + jr nc,x3F47 + ld a,(hl) ;!!!ОШИБКА!!! inc hl:ld a,(hl):dec hl + ex de,hl + cp #0E + jr nz,x3F5D ;не число + inc de + inc de + inc de + inc de + inc de + jr x3F5D +x3F47 push af + ld bc,#0001 + push hl + push de + call x3F66 ;проверка наличия свободного места в памяти + pop de + pop hl + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1664 ;обновление системных переменных + ld hl,(#5C65) + ex de,hl + lddr + pop af + ld (de),a +x3F5D inc de + call x1F45 ;установка другого стэка и ram 7 + ld (#FD82),de + ret + +;АДРЕС: #3F66 проверка наличия свободного места в памяти +;вх: bc - количество байт +;вых: если места в памяти нет, переход на обработку ошибки: 4 Out of memory +x3F66 ld hl,(#5C65) + add hl,bc + jr c,x3F76 + ex de,hl + ld hl,#0082 + add hl,de + jr c,x3F76 + sbc hl,sp + ret c +x3F76 ld a,#03 + ld (#5C3A),a + jp x0321 + +;АДРЕС: #3F7E распознавание токена +;вых: cy=1 токен распознан -> a - код токена +x3F7E call #FD2E ;распознавание токена (x33F4) + ret c ;токен не распознан + ld b,#F9 + ld de,#FD74 + ld hl,x3594 ;токены basic 128 + call #FD3B ;распознавание токена (x3401) + ret nc ;токен не распознан + cp #FF ;это CLOSE# ? + jr nz,x3F96 + ld a,#D4 ;CLOSE # + jr x3FB8 +x3F96 cp #FE ;это OPEN# ? + jr nz,x3F9E + ld a,#D3 ;OPEN # + jr x3FB8 +x3F9E cp #FD ;это DEFFN ? + jr nz,x3FA6 + ld a,#CE ;DEF FN + jr x3FB8 +x3FA6 cp #FC ;это GOSUB ? + jr nz,x3FAE + ld a,#ED ;GO SUB + jr x3FB8 +x3FAE cp #FB ;это GOTO ? + jr nz,x3FB6 + ld a,#EC ;GO TO + jr x3FB8 +x3FB6 sub #56 +x3FB8 scf + ret + +;АДРЕС: #3FBA копирование строки из hl в de в (hl+0) кол-во байт +x3FBA ld b,(hl) + inc hl +x3FBC ld a,(hl) + ld (de),a + inc de + inc hl + djnz x3FBC + ret + +;АДРЕС: #3FC3 !!!NOT USED!!! преобразование ASCII в цифру +x3FC3 cp "0" + ccf + ret nc + cp "9"+1 + ret nc + sub #30 + scf + ret + +;АДРЕС: #3FCE обработка нажатой управляющей клавиши +;вых: cy=0, nz - не найден обработчик клавиши +; cy=0, z - клавиша обработана, нужен звуковой сигнал +; cy=1, z - клавиша обработана звуковой сигнал не нужен +x3FCE push bc + push de + ld b,(hl) + inc hl +x3FD2 cp (hl) + inc hl + ld e,(hl) + inc hl + ld d,(hl) + jr z,x3FE1 ;клавиша найдена. в de адрес + inc hl + djnz x3FD2 + scf + ccf + pop de + pop bc + ret +x3FE1 ex de,hl + pop de + pop bc + call x3FEE ;call (hl) + jr c,x3FEB + cp a + ret +x3FEB cp a + scf + ret + +;АДРЕС: #3FEE вызов call (hl) +x3FEE jp (hl) + +;АДРЕС: #3FEF инициалы программистов +x3FEF db #00,"MB" ;Martin Brennan + db #00,"SB" ;Steve Berry + db #00,"AC" ;Andrew Cummins + db #00,"RG" ;Rupert Goodwins + db #00,"KM" ;Kevin Males + db #00,#01 ;end of rom marker + + SAVEBIN "../Build/scorp/NewROM0.bin",#0000,#4000 + diff --git a/ProfRom_Disasm/rom0.bat b/ProfRom_Disasm/rom0.bat new file mode 100755 index 0000000..160677f --- /dev/null +++ b/ProfRom_Disasm/rom0.bat @@ -0,0 +1,4 @@ +MkDir !bin +MkDir !log +DEL /Q !log\*.* +..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom0.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom2.bat b/ProfRom_Disasm/rom2.bat new file mode 100755 index 0000000..bac81ea --- /dev/null +++ b/ProfRom_Disasm/rom2.bat @@ -0,0 +1,4 @@ +MkDir !bin +MkDir !log +DEL /Q !log\*.* +..\..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom2_SrvMon.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom2_SrvMon.a80 b/ProfRom_Disasm/rom2_SrvMon.a80 new file mode 100755 index 0000000..506c561 --- /dev/null +++ b/ProfRom_Disasm/rom2_SrvMon.a80 @@ -0,0 +1,10349 @@ + 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 + diff --git a/ProfRom_Disasm/rom3.bat b/ProfRom_Disasm/rom3.bat new file mode 100755 index 0000000..3eb1896 --- /dev/null +++ b/ProfRom_Disasm/rom3.bat @@ -0,0 +1,5 @@ +MkDir !bin +MkDir !log +DEL /Q !log\*.* +..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom3_trdos.a80 >> !log\error.txt + diff --git a/ProfRom_Disasm/rom3_trdos.a80 b/ProfRom_Disasm/rom3_trdos.a80 new file mode 100755 index 0000000..7c1223e --- /dev/null +++ b/ProfRom_Disasm/rom3_trdos.a80 @@ -0,0 +1,7186 @@ +;АДРЕС: #3FF0 вывод в порт +;АДРЕС: #3FF3 чтение порта + + +;ИСХОДНЫЙ ТЕКСТ TR-DOS 5.03 для SjASMPlus + +;Основано на книге "ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ПЗУ TR-DOS 5.04T (5.03) ДЛЯ ПРОФЕССИОНАЛОВ, А ТАКЖЕ ДЛЯ ТЕХ, КТО ХОЧЕТ ИМИ СТАТЬ." +;Автор книги: Федин Павел Юрьевич, 04.04.1996. +;Перевод всех чисел в шестнадцатеричный формат, переформатирование: Spectre, 19.10.2005 +;Исправление, переформатирование: Keeper, 21.06.2009 +;Кодировка: CP-1251 +;Правка под версию Tr-Dos 5.03: PLM, 2022.04.03 + + DEVICE ZXSPECTRUM48 + +;Адрес 0. Полная инициализация системы. + + ORG 0 + +x0000 DI + JP x0844 ;new + LD A,7 + JR x0009 + +;Адрес 8. Инициализация системы. В DE поместите адрес вершины памяти, в A - 7 и запретите прерывания. Используется также с адреса 9. + +x0008 NOP +x0009 NOP + NOP +x000B LD A,#3F +x000D JR x0013 +x000F NOP + +;Адрес #10. Переход к подпрограмме печати символа из регистра A. + +x0010 JP x3D82 + +;Адрес #13. Инициализация системы. В DE поместите адрес вершины памяти, установите белый бордюр, поместите в A старший байт низшего адреса памяти и запретите прерывания. + +x0013 LD I,A + JP x001B + +;Адрес #18. Переход к подпрограмме печати строки. + +x0018 JP x2707 + +;Адрес #1B. То же, что и #24. + +x001B ld h,d + ld l,e + inc de + JR x0024 + +;Адрес #20. Переход к подпрограмме вызова подпрограмм из ПЗУ бейсика. Адрес вызываемой подпрограммы поместите в двух байтах после команды RST #20. Например: + +x0020 JP x2F72 +x0023 RET + +;Адрес #24. Инициализация системы. В DE поместите адрес вершины памяти, установите белый бордюр, поместите в A старший байт низшего адреса памяти и запретите прерывания. + +x0024 ld (hl),#00 + JR x002B ;инициализация системы + +;Адрес #28. Выборка адреса текущего канала с учетом сдвига, заданного в регистре C. + +x0028 JP x2323 + +;Адрес #2B. Инициализация системы. В DE и HL поместите адрес вершины памяти, установите белый бордюр, поместите в A старший байт низшего адреса памяти и запретите прерывания. + +x002B ld bc,#BFFF + jr x003A +x0030 nop + nop + nop +x0033 out (c),a + nop + halt + rst #38 + +;Адрес #38. Обработка маскируемого прерывания. + +x0038 ei + ret + +;Адрес #3A. Инициализация системы. В DE поместите адрес вершины памяти в HL - адрес дна, установите белый бордюр, заполните обозначенную область памяти байтом 2 и запретите прерывания. + +x003A ldir + jr x0048 + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + +x0048 LD (#5CB4),HL ;установка P_RAMT + LD DE,#3EAF ;адрес символов для UDG + LD BC,#A8 ;длина UDG - #A8 байтов + LD A,E + EX DE,HL ;переброска адреса символов для UDG в HL + LD SP,#6000 ;установка временного стека + LD (#5F00),HL ;сохранение адреса символов для UDG + LD HL,#79 ;возвращаться в #79 + PUSH HL ;помещение его на стек + LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS + PUSH HL ;помещение его на стек + LD HL,#B8ED ;код команды LDDR + JR x0069 ;установка UDG + +;Адрес #66. Подпрограмма обработки немаскируемого прерывания. + +x0066 JP x2A56 + +;Адрес #69. Выполнение любой команды процессора. Поместите в HL коды команды, установите регистры (#5F00 вместо HL) и поместите в HL коды команды. + +x0069 LD (#5F10),HL ;помещение кодов команды в память + PUSH AF ;сохранение AF + LD A,#C9 ;код команды RET + LD (#5F12),A ;помещение его в память + POP AF ;восстановление AF + LD HL,(#5F00) ;берем адрес символов для UDG + JP #5F10 ;выполнение команды и возврат + +;Адрес #79. Инициализация системы. Установите P_RAMT, знакогенератор пользователя, белый бордюр, поместите в DE адрес начала знакогенератора минус 1 и запретите прерывания. + +x0079 EX DE,HL ;загрузка адреса UDG в HL + INC HL + LD (#5C7B),HL ;установка переменной UDG + DEC HL ;следующий адрес + LD BC,#1E40 ;установка RASP и PIP + LD (#5C38),BC + LD (#5CB2),HL ;установка RAMTOP + LD HL,#3C00 ;установка CHARS + LD (#5C36),HL + LD HL,(#5CB2) ;берем адрес RAMTOP + LD (HL),#3E ;признак конца стека GO SUB + DEC HL ;следующий адрес + LD SP,HL ;установка постоянного стека + DEC HL ;установка ERR_SP + DEC HL + LD (#5C3D),HL + LD DE,#1303 ;адрес подпрограммы обработки ошибок + PUSH DE ;установка его + IM 1 ;установка первого режима прерываний + LD IY,#5C3A ;установка регистра IY + LD HL,#5CB6 ;установка CHANS + LD (#5C4F),HL + LD DE,#15AF ;адрес области описателей каналов в ПЗУ бейсика + LD BC,#15 ;ее длина - #15 байт + EX DE,HL + CALL x0117 ;перенос области описателей каналов в ОЗУ + EX DE,HL + DEC HL ;установка DATADD + LD (#5C57),HL + INC HL ;следующий адрес + LD (#5C53),HL ;установка PROG + LD (#5C4B),HL ;установка VARS + LD (HL),#80 ;конец области + INC HL ;следующий адрес + LD (#5C59),HL ;установка E_LINE + LD (HL),#D ;конец строки + INC HL ;следующий адрес + LD (HL),#80 ;конец области + INC HL ;следующий адрес + LD (#5C61),HL ;установка WORKSP + LD (#5C63),HL ;установка STKBOT + LD (#5C65),HL ;установка STKEND + LD A,#38 ;атрибуты экрана + LD (#5C8D),A ;установка ATTR_P + LD (#5C8F),A ;установка ATTR_T + LD (#5C48),A ;установка BORDER + LD HL,#523 ;установка REPDEL и REPPER + LD (#5C09),HL + DEC (IY-#3A) ;клавиши не нажаты + DEC (IY-#36) + LD HL,#15C6 ;адрес таблицы STRMS в ПЗУ бейсика + LD DE,#5C10 ;адрес переменной STRMS + LD BC,#0E ;длина таблицы - #18 байта + CALL x0117 ;перенос таблицы в ОЗУ + SET 1,(IY+1) ;открыт поток 3 + LD HL,#5CC2 ;помещение команды RET в ОЗУ + LD (HL),#C9 + +;Внимание!!! Системных переменных TR-DOS пока еще нет, и это портит память. + + RST #20 ;инициализация буфера принтера и экрана + DW #0EDF + LD HL,#5C6B ;буфер принтера использовался + LD (HL),2 + LD HL,#128B ;возвращаться в #128B + PUSH HL + LD A,#AA ;выполнять команду RUN "boot" + LD (#5B00),A + EI ;разрешение прерываний + JP x3D31 ;вход в TR-DOS + +;Адрес #117. Выполнение команды LDIR. Установите HL, DE и BC и поместите байт #C9 по адресу #5F12. + +x0117 LD (#5F00),HL ;сохранение HL + LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS + PUSH HL ;помещение его на стек + LD HL,#B0ED ;коды команды LDIR + LD (#5F10),HL ;помещение команды в ОЗУ + LD HL,(#5F00) ;восстановление HL + JP #5F10 ;выполнение команды и возврат + +;Адрес #12A. Обработка номера строки автостарта программы на бейсике. Установите #5D10 и загрузите программу. + +x012A CALL x20E5 ;изменение памяти и удаление буфера + CALL x1D97 ;очистка экрана + LD HL,(#5C59) ;берем адрес, по которому находится номер + INC HL ;строки автозапуска программы + LD E,(HL) ;берем этот номер + INC HL + LD D,(HL) + LD A,D ;это 0? + OR E + EX DE,HL ;переброска его в HL + JR Z,x0140 ;если это не 0, то программу запускать + XOR A + LD (#5D10),A +x0140 PUSH HL ;сохранение номера строки автостарта + CALL x0232 ;восстановление старого адреса подпрограммы обработки ошибок + POP HL ;восстановление номера строки автостарта + LD (#5C42),HL ;установка его + XOR A ;строку запускать с первого оператора + LD (#5C44),A + RST #20 ;очистка рабочей области памяти, стека калькулятора и буфера редактора + DW #16B0 + LD HL,(#5C53) ;выполнение RESTORE + DEC HL + LD (#5C57),HL + LD SP,(#5C3D) ;очистка стека + LD A,(#5D10) ;программу запускать? + OR A + LD HL,#1B76 ;адрес подпрограммы выполнения программы на бейсике + JR Z,x0166 ;если можно, то запуск программы + RST #20 ;сообщение O.K. + DW #1BB0 +x0166 PUSH HL ;помещение на стек адреса подпрограммы выполнения программы на бейсике + LD HL,#5CC2 ;помещение на стек адреса переключателя ПЗУ на бейсик + PUSH HL + RET ;переход к подпрограмме выполнения программы на бейсике + +;Адрес #16C. То же, что и #3D1A, но не создает системные переменные. + +x016C CALL x20F1 ;изменение памяти + CALL x294A ;создание буфера + LD A,#FF ;сообщения не печатать + LD (#5D15),A + XOR A ;обнуление #5CF7 + LD (#5CF7),A + LD A,#AA ;заставку не выводить + LD (#5D17),A + LD HL,#201 ;возвращаться в бейсик + LD (#5D1A),HL + LD HL,0 ;сохранение SP + ADD HL,SP + LD (#5D1C),HL + DEC HL ;выделение места для адреса подпрограммы + DEC HL ;обработки ошибок + LD SP,HL + CALL x021D ;установка адреса подпрограммы обработки ошибок + LD HL,(#5CB2) ;командная строка находится выше RAMTOP? + LD DE,(#5C5D) + SBC HL,DE + EX DE,HL + JR NC,x01A5 ;если да, то при выделении буфера она не + OR A ;перемещалась + LD DE,#101 + SBC HL,DE +x01A5 LD (#5C5D),HL +x01A8 CALL x01C7 ;следующий символ строки ENTER? +x01AB JP Z,x01D3 ;если да, то завершение + CP #EA ;это REM? + INC HL ;следующий символ + JR NZ,x01A8 ;если нет, то следующий символ + CALL x01C7 ;следующий символ строки ENTER? + JR Z,x01AB ;если да, то завершение + CP ":" ;это двоеточие? + JP NZ,x01D3 ;если нет, то возврат + INC HL ;следующий символ + CALL x3048 ;сжатие строки + LD HL,(#5D11) + JP x030A ;выполнение команды + +;Адрес #1C7. берет символ по адресу из HL и возвращает его в аккумуляторе плюс флаг Z если это 0, #D или #80, иначе NZ. + +x01C7 LD A,(HL) ;берем байт по нужному адресу + CP #D ;это #D? + RET Z ;если да, то возврат + CP #80 ;это #80? + RET Z ;если да, то возврат + OR A ;сравнение его с нулем + RET ;возврат + +x01D0 CALL x1E43 + +;Адрес #1D3. Подпрограмма завершения. Вход: установить #5CB6, #5D0C, #5D0F, #5D11, #5D18, #5D1A, #5D1C и #5D1F. Выход: в SP адрес из #5D1C, а в BC код ошибки. + +x01D3 LD HL,0 ;буфер убирать, память изменять + LD (#5CF8),HL + CALL x20E5 ;если есть буфер, то уберем его + CALL x1D63 ;если надо, то очистка рабочей области памяти + LD HL,#5D17 ;заставку не выводить + LD (HL),#AA + LD HL,#5D1F ;команда поступила из машинного кода? + LD A,(HL) + OR A + LD (HL),0 ;следующая команда будет не из машинного кода + JR NZ,x01F3 ;если команда была не из машинного кода, то + CALL x1E1C ;удаление из строки 5-байтовых чисел + CALL x0212 ;и прогон символов до конца строки +x01F3 LD SP,(#5D1C) ;помещаем в SP адрес из #5D1C + LD HL,(#5D1A) ;берем адрес выхода из этой подпрограммы + LD BC,(#5D0F) ;помещаем в BC код ошибки + LD B,0 + JP (HL) ;переход по назначенному адресу + +;Адрес #201. Проверка на ошибку. Вход: установите #5C3A и #5D13. + +x0201 CALL x0232 ;помещение в #5C3D адреса из #5D13 + BIT 7,(IY+0) ;была ошибка? + RET NZ ;если нет, то возврат + LD DE,#5CC2 ;адрес команды RET в ОЗУ + LD SP,(#5C3D) ;установка SP на дно стека + PUSH DE ;переход на обработку ошибок + RET + +;Адрес #212. Прогон символов до конца строки. Установите в #5C5D адрес одного из символов строки. На выходе там будет адрес конца строки. + +x0212 CALL x1D8C ;берем текущий символ строки + CP #D ;это ENTER? + RET Z ;если да, то возврат + CALL x1E2A ;берем следующий символ строки + JR x0212 ;повтор + +;Адрес #21D. Установка адреса обработки ошибок. Вход: в #5D1C должен быть адрес на 2 больше того, по которому размещаете адрес подпрограммы обработки ошибок. Выход: старое содержимое #5C3D копируется в #5D13, а в #5C3D помещается адрес, по которому находится размещенный адрес. + +x021D LD HL,(#5C3D) ;сохранение старого содержимого #5C3D + LD (#5D13),HL + LD HL,(#5D1C) ;берем адрес из #5D12 + DEC HL ;берем нужный нам адрес + DEC HL + LD (#5C3D),HL ;установка #5C3D + LD DE,x3D16 ;адрес подпрограммы обработки ошибок + LD (HL),E ;запись его в наши ячейки + INC HL + LD (HL),D + RET ;возврат + +;Адрес #232. Помещение в #5C3D адреса из #5D13. Установите #5D13. + +x0232 LD HL,(#5D13) + LD (#5C3D),HL + RET + +;Адрес #239. Вход в командный процессор. Используется также с адреса #27B (запуск файла "boot"). + +x0239 LD HL,0 ;обнуление #5CF7 и #5CF8 + LD (#5CF7),HL + ADD HL,SP ;сохранение SP + LD (#5D1C),HL + DEC HL ;выделение места для адреса подпрограммы + DEC HL ;обработки ошибок + LD SP,HL + CALL x021D ;установка адреса подпрограммы обработки ошибок + LD HL,#5D17 ;заставку выводить? + LD A,(HL) + CP #AA + LD A,0 ;ошибок нет + LD (#5D0F),A + JP Z,x02CB ;если заставка не нужна, то переход к командному процессору + LD (HL),#AA ;в следующий раз заставку не выводить + CALL x1D97 ;очистка экрана + CALL x1D88 ;открытие потока 2 + LD HL,x0360 ;вывод текста заставки + RST #18 + CALL x106E ;вывод цветных полос + LD A,(#5CB6) ;интерфейс-1 есть? + CP #F4 + JR Z,x0271 ;если да, то + LD HL,x1000 ;вывод "Interface one fitted" + RST #18 +x0271 LD A,(#5B00) ;файл "boot" запускать? + CP #AA + JR NZ,x02CB ;если нет, то вход в командный процессор + CALL x20F1 ;изменение памяти +x027B LD HL,(#5C59) ;берем адрес буфера команд + LD A,#FE ;был запущен файл "boot" + LD (#5D0E),A + LD (HL),#F7 ;ввод команды RUN "boot" + INC HL + LD (HL),#22 + INC HL + LD (HL),"b" + INC HL + LD (HL),"o" + INC HL + LD (HL),"o" + INC HL + LD (HL),"t" + INC HL + LD (HL),#22 + INC HL + LD (#5C5B),HL ;установка адреса курсора + LD (HL),#D ;ENTER + INC HL + LD (HL),#80 ;конец области + INC HL + LD (#5C61),HL ;установка переменной WORKSP + LD (#5C63),HL ;установка и очистка стека калькулятора + LD (#5C65),HL + SET 3,(IY+1) ;установка режима L + JR x02EF ;выполнение команды + +;Адрес #2B0. Перенос трех байтов из адреса HL по адресу DE. + +x02B0 LD B,3 ;количество байтов +x02B2 LD A,(HL) ;перенос байта + LD (DE),A + INC HL ;адреса следующих байтов + INC DE + DJNZ x02B2 ;повтор до конца + RET ;возврат + +;Адрес #2B9. Остановка дисковода. В A поместите значение системного регистра. + +x02B9 LD B,#20 ;#20 повтора +x02BB PUSH BC ;сохранение количества повторов + XOR 8 ;переключение бита 3 + OUT (#FF),A ;загрузка системного регистра + PUSH AF ;сохранение значения системного регистра + LD A,5 ;задержка в #462A такта + CALL x3DFF + POP AF ;восстановление значения системного регистра + POP BC ;и количества повторов + DJNZ x02BB ;повтор до конца + RET ;возврат + +;Адрес #2CB. Командный процессор. Используется также с адресов: +;#2EF - исполнение команды. Сжатую команду поместите в буфер командной строки; +;#30A - исполнение команды. Установите все для #1D3, #5D11 и загрузите из #5D11 HL. + +x02CB LD HL,(#5D1C) ;очистка стека + DEC HL + DEC HL + LD SP,HL + CALL x20F1 ;изменение памяти + CALL x1D83 ;открытие потока 0 + LD A,(#5D16) ;выбор дисковода D: + OR 3 + CALL x02B9 ;остановка его + LD A,(#5D16) ;остановка текущего дисковода + CALL x02B9 + XOR A ;сообщения об ошибках печатать + LD (#5D15),A + CALL x2135 ;принятие команды + CALL x3032 ;сжатие командной строки +x02EF CALL x1D9F ;очистка низа экрана + LD HL,x02CB ;возвращаться в командный процессор + LD (#5D1A),HL + XOR A ;ошибок не было + LD (#5D0F),A + LD HL,(#5C59) ;берем адрес командной строки + PUSH HL ;сохраняем его + LD DE,#5D20 ;адрес буфера + CALL x02B0 ;сохранение трех первых символов строки + POP HL ;восстановление адреса строки + LD (#5D11),HL ;установка адреса командной строки +x030A LD A,(HL) ;берем первый символ строки + LD B,A ;сохраняем его + AND #80 ;его код меньше #80? + LD A,B ;восстановление символа + JR Z,x031A ;если его код меньше #80, то дисковод не устанавливать + CP #FE ;это RETURN? + JR Z,x031A ;если да, то дисковод не устанавливать + PUSH AF ;сохранение символа + CALL x3DC8 ;активизация дисковода по умолчанию + POP AF ;восстановление символа +x031A LD HL,x2FF3 ;адрес таблицы команд + DEC HL + LD C,0 ;проверка первой команды +x0320 INC C + LD D,A ;сохранение символа + LD A,#15 ;пройдена вся таблица? + CP C + JP C,x01D3 ;если да, то завершение + +;Лучше было бы поставить здесь JP C,#1D1A для выдачи сообщения "*ERROR*". + + LD A,D ;восстановление символа + INC HL ;адрес следующей команды в таблице + CP (HL) ;символы совпали? + JR NZ,x0320 ;если нет, то повтор + CP #FE ;введена команда RETURN? + CALL NZ,x294A ;если нет, то создание буфера + LD A,9 ;поиск файла вести по 9 байтам + LD (#5D06),A + XOR A ;ошибок не было + LD (#5D0F),A + LD (#5CD6),A ;расширение файла принимать + LD (#5D10),A ;на случай загрузки или верификации файла + LD HL,#5C3B ;проверка строки на синтаксис + RES 7,(HL) + LD B,0 ;перевод номера команды в двухбайтную форму + LD HL,x3008 ;адрес таблицы адресов подпрограмм + DEC C ;команды считать с нуля + SLA C ;умножение номера подпрограммы на 2 + ADD HL,BC ;определение адреса в таблице + LD E,(HL) ;берем адрес подпрограммы + INC HL + LD D,(HL) + EX DE,HL ;переносим его в HL + PUSH HL ;сохраняем его + LD DE,x0359 ;возврат будет в #359 + PUSH DE + JP (HL) ;вызов подпрограммы +x0359 LD HL,#5C3B ;выполнение команды + SET 7,(HL) + POP HL ;восстановление адреса подпрограммы + JP (HL) ;вызов подпрограммы + +;Адрес #360. Текст заставки TR-DOS. + +x0360 DB #16,1,#5 + DB "* TR-DOS Ver 5.03 *" + DB #D,#D,#7F + DB " 1986 Technology Research Ltd." + DB #16,5,#B + DB "(U.K.)" + DB #16,7,5 + DB "BETA 128" + DB 0 + +;Адрес #3AC. Завершение выдачи каталога. + +x03AC CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 + CALL x3D80 ;перевод строки + CALL x3D80 ;еще раз + LD BC,(#5E0A) ;берем количество свободных секторов на диске + CALL x1DA9 ;печать его + LD HL,x29D2 ;печать FREE + RST #18 + +;Адрес #3C0. Переход к подпрограмме завершения. + +x03C0 JP x01D3 + +;Адрес #3C3. Печать сообщения об ошибке. В HL установите адрес сообщения, в A - код ошибки. + +x03C3 PUSH AF ;сохранение кода ошибки + LD A,(#5D0E) ;ошибка произошла при автозагрузке? + CP #FE + JR NZ,x03CD ;если нет, то установка кода ошибки + POP AF ;снятие со стека кода ошибки + RET ;возврат +x03CD POP AF ;восстановление кода ошибки + LD (#5D0F),A ;установка кода ошибки + LD A,(#5D15) ;печать сообщений разрешена? + OR A + CALL Z,x2707 ;если да, то печать сообщения + +;Ошибка!!! Перед печатью надо открыть поток 0 и очистить низ экрана. + + RET ;возврат + +x03D9 LD HL,x2A28 + LD A,1 + JP x1C4A + +;Адрес #3E1. Вывод сообщения O.K. + +x03E1 LD HL,x2766 ;адрес сообщения O.K. + XOR A ;код ошибки - 0 + JP x1C4A ;выдача сообщения и завершение + +;Адрес #3E8. Загрузка сектора 0 дорожки 0 в буфер. Обнуляет #5CCC. Используется также с адресов: +;#3EC - загрузка сектора дорожки 0 в буфер. Установите #5CCC. +;#3F2 - загрузка сектора в буфер, номер сектора в E, дорожки ? в D). + +x03E8 XOR A ;текущий сектор 0 + LD (#5CCC),A +x03EC LD DE,(#5CCC) ;берем номер сектора + LD D,0 ;дорожка 0 +x03F2 CALL x294A ;создание буфера + LD HL,#5D25 ;загружать в буфер + LD B,1 ;1 сектор + JP x1E3D ;загрузка сектора + +;Адрес #3FD. Загрузка в буфер сектора 8 дорожки 0. Установите #5D0C. + +x03FD CALL x294A ;создание буфера, если его нет + LD DE,8 ;дорожка 0, сектор 8 + JR x03F2 ;загрузка сектора в буфер + +;Адрес #405. Настройка на диск. Меняет переменную с типом дисковода. + +x0405 CALL x03FD ;чтение в буфер сектора 8 дорожки 0 + LD A,(#5E0C) ;диск от TR-DOS? + CP #10 + JR Z,x0415 ;если да, то установка типа дисковода + LD HL,x29E2 ;адрес сообщения DISC ERROR + RST #18 ;печать сообщения + JR x03C0 ;завершение + +;Внимание, ошибка!!! Неправильно обрабатывается ошибка. Здесь программа должна быть такой: +; LD HL,#29E2 +; LD A,7 +; JP #1C4A +;А в этом случае ваша программа не получит код ошибки, а внизу экрана совершенно не к месту появится DISC ERROR. + +x0415 CALL x3E11 ;берем тип дисковода + RES 0,(HL) ;установка типа дисковода под тип диска + RES 1,(HL) ;и возврат + LD A,(#5E08) + BIT 0,A + JR NZ,x0425 + SET 0,(HL) +x0425 BIT 3,A + RET NZ + SET 1,(HL) + RET + +;Ошибка!!! Перед установкой типа надо бы проверить совместимость диска и дисковода. + +;Адрес #42B. Проверка второго символа командной строки. Вход: установите #5D11. На выходе будет установлен флаг Z, если это ENTER и сброшен, если нет. + +x042B LD HL,(#5D11) ;берем адрес начала строки команды + INC HL ;берем адрес ее второго символа + LD A,(HL) ;берем этот символ + CP #D ;сравнение его с ENTER + RET ;возврат + +;Адрес #433. Выполнение команды CAT. Установите #5D11 и #5C3B. Используется также с адреса: +;#479 (вывод каталога диска; в A - номер потока, в буфере - сектор 8 дорожки 0). + +x0433 CALL x042B ;второй символ строки команды ENTER? + LD BC,2 ;каталог выводить в поток 2 + LD (#5CDB),BC + JR Z,x046A ;если второй символ строки ENTER, то вывод каталога + CP "#" ;второй символ строки "#"? + JR NZ,x045D ;если нет, то установка дисковода и вывод каталога + LD (#5C5D),HL ;установка CH_ADD на второй символ строки + CALL x1E0B ;установка номера потока + CALL x1D8C ;берем текущий символ + CP #D ;это ENTER? + JR Z,x046A ;если да, то вывод каталога + CP "," ;это запятая? + JP NZ,x1D1A ;если нет, то синтаксическая ошибка + CALL x1E2A ;берем следующий символ + CALL x1DBD ;помещение имени дисковода на стек калькулятора + JR x0460 ;установка дисковода и вывод каталога +x045D CALL x1DDF ;установка CH_ADD и помещение имени дисковода на стек калькулятора +x0460 CALL x1D75 ;если строка проверяется на синтаксис, то возврат + CALL x1DB5 ;снятие имени дисковода со стека калькулятора + EX DE,HL + CALL x1C81 ;установка дисковода +x046A CALL x1D75 ;если проверка на синтаксис, то возврат + LD A,(#5CF6) ;помещение номера дисковода в #5CF9 + LD (#5CF9),A + CALL x0405 ;настройка на диск + LD A,(#5CDB) ;берем номер потока +x0479 CP 2 ;выводим в поток 2? + PUSH AF ;сохранение номера потока + CALL Z,x1D97 ;если назначен поток 2, то очистка экрана + POP AF ;восстановление номера потока + CP #11 ;он больше #10? + +;Ошибка!!! Всего потоков #F, а не #10. + + JP NC,x1D1A ;если да, то ошибка + CALL x1D84 ;открытие потока + +;Ошибка!!! Надо бы проверить, подключен ли куда-нибудь этот поток. + + LD A,#FF ;установка #5CF8 в #FF + LD (#5CF8),A + LD HL,x29F7 ;печать TITLE: + RST #18 + LD HL,#5E1A ;печать имени диска + RST #18 + CALL x3D80 ;перевод строки + LD A,(#5E09) ;вычисление количества нестертых файлов на диске + LD HL,#5E19 + SUB (HL) + PUSH HL + CALL x1DA3 ;печать его + LD HL,x2A2B ;печать FILES + RST #18 + POP HL + LD C,(HL) ;берем количество стертых файлов + CALL x1DA4 ;печать его + LD HL,x2A1D ;печать DEL.FILES + RST #18 + CALL x03E8 ;загрузка в буфер сектора 0 дорожки 0 + LD HL,#5D25 ;берем начало буфера +x04B6 CALL x04F6 ;проверка достижения конца каталога + CALL x3D80 ;перевод строки + LD A,(#5CF6) ;печать имени дисковода + ADD A,"A" + RST #10 + LD B,2 ;печатаем по 2 имени в строке +x04C4 CALL x04F6 ;если файл стерт, то пропуск его + PUSH BC ;сохранение количества имен файлов в строке + LD A,":" ;печать двоеточия + RST #10 + PUSH HL ;сохранение адреса текущего описателя файла в буфере + CALL x2938 ;печать имени и расширения файла + LD BC,#D ;вычисление адреса, по которому находится + POP HL ;размер файла в секторах + PUSH HL + ADD HL,BC + LD C,(HL) ;берем размер файла + PUSH BC ;сохраним его + LD A,C ;перегрузим его в A + LD B,2 ;вычисление количества пробелов перед числом + CP #A + JR C,x04DF + DEC B +x04DF CP #64 + JR NC,x04E8 +x04E3 LD A," " ;печать пробелов + RST #10 + DJNZ x04E3 +x04E8 POP BC ;восстановление размера файла + CALL x1DA9 ;печать его + POP HL ;восстановление адреса текущего описателя файла + POP BC ;восстановление количества имен файлов в строке + LD DE,#10 ;следующий описатель + ADD HL,DE + DJNZ x04C4 ;если напечатали только 1 файл, то печать второго + JR x04B6 ;следующая строка + +;Адрес #4F6. Проверка переменной #5CF9 и проверка достижения конца каталога при его печати. + +x04F6 PUSH HL ;сохранение HL и BC + PUSH BC + LD A,(#5CF9) ;берем номер дисковода для выдачи каталога + LD HL,#5CF6 ;назначен этот дисковод? + CP (HL) + CALL NZ,x3DCB ;если нет, то о последствиях читайте в конце + +;Ошибка в программе!!! Об этом особо в конце текста. + + POP BC ;восстановление HL и BC + POP HL + JP x2FC6 ;проверка достижения конца каталога и возврат + +;Обратите особое внимание на команду CALL NZ,#3DCB. В аналогичной подпpогpамме для LIST стоит CALL NZ,#3DCB. В нашем же случае упpавление будет передано в подпрограмму печати символа (ее адрес #3D80) на адрес, где находятся 2 байта адреса от команды CALL #3D94. Программа с этого адреса будет такой: +;SUB H +;DEC A +;CALL #20F1 +;POP DE +;POP BC +;POP HL +;RET +;Таким образом, произойдет изменение памяти, если оно разрешено, затем со стека будут сняты 3 адреса и помещены в регистры и затем произойдет возврат. Последствия всего этого определяются программой, вызвавшей #4F6. + +;Адрес #507. Прибавление #10 к HL. + +x0507 LD DE,#10 + ADD HL,DE + RET + +;Адрес #50C. Проверка и обработка достижения конца буфера при работе с каталогом. Установите #5CCC и поместите в HL текущее место буфера. Если достигнут его конец, то в HL будет начало буфера и в него будет загружен следующий сектор каталога. + +x050C PUSH HL ;сохранение HL и BC + PUSH BC + LD BC,#A1DB ;достигнут конец буфера? + ADD HL,BC + JR C,x0517 ;если да, то загрузка следующего сектора + POP BC ;восстановление HL и BC + POP HL + RET ;возврат +x0517 LD HL,#5CCC ;следующий сектор + INC (HL) + CALL x03EC ;загрузка его в буфер + POP BC ;восстановление BC и HL + POP HL + LD HL,#5D25 ;помещение в HL адреса начала буфера + RET ;возврат + +;Адрес #524. Вычисление номера дисковода по его имени. Имя поместите в А, на выходе там будет номер. + +x0524 AND #DF ;буква заглавная + SBC A,#41 ;вычисление номера дисковода + JP C,x1D1A ;если именем был символ меньше "A", то ошибка + CP 4 ;номер получился больше 3? + JP NC,x1D1A ;если да, то ошибка + RET ;возврат + +x0531 CALL x1DB5 + LD A,C + CP B + JP Z,x1D1A + RET + +;Адрес #53A. Выполнение команды NEW. Установите #5D11 и #5C3B. Используется также с адреса #569 (запись информации о файле; номер файла задайте в регистре C). + +x053A CALL x1DCD ;прием имен файлов на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x102E ;прием расширения файла + CALL x1CB0 ;установка старого имени файла + LD A,(#5CF6) ;берем номер дисковода + LD (#5CF8),A ;сохраняем его + JP NZ,x03D9 ;если файл не найден, то ошибка + PUSH BC ;сохранение номера файла + CALL x165D ;загрузка описателя файла + CALL x1CB0 ;установка нового имени файла + PUSH AF ;сохранение результата проверки имени файла + LD A,(#5CF8) ;в новом имени файла назначен другой дисковод + LD HL,#5CF6 + CP (HL) + JP NZ,x1D1A ;если да, то ошибка + CALL x0405 ;настройка на диск + POP AF ;восстановление результата проверки имени файла + JP Z,x1C50 ;если такой файл уже есть, то ошибка + POP BC ;восстановление номера файла +x0569 CALL x166B ;загрузка сектора с описателем файла и замена описателя + CALL x1E43 ;перезапись сектора + JP x03E1 ;сообщение O.K. + +;Адрес #572. Проверка переменной #5D10. Соответственно содержимому будет установлен флаг Z, а само содержимое будет в аккумуляторе. + +x0572 LD A,(#5D10) + OR A + RET + +;Адрес #577. Проверка количества стертых файлов. Установите #5D11. Если там 0, то будет сообщение NO FILE, иначе O.K. + +x0577 LD A,(#5D07) ;берем количество стертых файлов + OR A ;оно равно 0? + JP Z,x03D9 ;если да, то NO FILE + JP x03E1 ;иначе O.K. + +;Адрес #581. Запрос на стирание файла. Установите #5CDD и #5CF6, а в регистр C поместите номер файла. При ответе Y файл будет стерт и включится флаг Z, иначе он будет выключен. + +x0581 PUSH BC ;сохранение номера файла + CALL x1D97 ;очистка экрана и открытие потока 0. + LD A,(#5CF6) ;берем номер дисковода + ADD A,"A" ;вычисляем имя дисковода + CALL x3D82 ;печать его + LD A,":" ;печать двоеточия + CALL x3D82 + LD HL,#5CDD ;адрес переменной с именем и расширением файла + CALL x2938 ;печать имени и расширения файла + LD HL,x2820 ;печать FILE EXISTS. OVERWRITE? + CALL x2707 + CALL x1052 ;ввод клавиши + CP "Y" ;это "Y"? + PUSH AF ;сохранение результата проверки + CALL x1D97 ;очистка экрана + POP AF ;восстановление AF и номера файла + POP BC + RET NZ ;если был ответ N, то возврат + PUSH BC ;сохранение номера файла + CALL x1D97 ;очистка экрана + POP BC ;восстановление номера файла + CALL x0781 ;стирание файла + XOR A ;включение флага Z + RET ;возврат + +;Адрес #5B4. Проверка на существование блока файла с расширением #. Установите #5CDD, #5CE5 и #5CE6. Если блок найден или у файла другое расширение, то включается флаг Z, иначе он будет выключен. + +x05B4 LD A,(#5CE5) ;берем расширение файла + CP "#" ;это "#"? + JR Z,x05BD ;если нет, то + XOR A ;включение флага Z + RET ;и возврат +x05BD LD A,#A ;файл ищем по #A байтам + LD (#5D06),A + CALL x1CB3 ;поиск файла + LD A,9 ;файл ищем по 9 байтам + LD (#5D06),A + RET ;возврат + +;Адрес #5CB. Выполнение команды COPY "*","*". Первую звездочку поместите в #5CDD, вторую - на стек калькулятора и установите #5CF8, #5D23 и #5CCF. + +x05CB LD A,(#5CDD) ;берем первый символ имени файла + CP "*" ;это "*"? + JP NZ,x03D9 ;если нет, то NO FILE + CALL x1DB5 ;снятие строки со стека калькулятора + EX DE,HL + CALL x1C81 ;установка дисковода-приемника + LD A,(HL) ;берем следующий символ строки + CP "*" ;это "*"? + JP NZ,x1D1A ;если нет, то ошибка + LD A,(#5CF6) ;сохранение номера дисковода-приемника + LD (#5CF9),A + LD A,(#5CF9) ;выбор дисковода-приемника + CALL x3DCB + CALL x0405 ;настройка на диск + LD A,#FF ;начнем с файла 0 + LD (#5D0D),A +x05F4 LD A,(#5CF8) ;выбор дисковода-источника + CALL x3DCB + CALL x0405 ;настройка на диск + LD A,(#5D0D) ;следующий файл + INC A + LD (#5D0D),A + LD C,A + CALL x165D ;чтение его описателя + LD A,(#5CDD) ;берем первый символ его имени + CP 0 ;это конец каталога? + JP Z,x03E1 ;если да, то O.K. + CP 1 ;файл стерт? + JR Z,x05F4 ;если да, то следующий файл + LD HL,#5CE6 ;сохранение части описателя файла + LD DE,#5CED + LD BC,7 + LDIR + LD A,(#5CF9) ;выбор дисковода-приемника + CALL x3DCB + CALL x1CB3 ;поиск файла + JR NZ,x0634 ;если не нашли, то копирование файла + CALL x05B4 ;проверка файла с расширением "#" + JR NZ,x0634 ;если копируется другой блок, то копируем его + CALL x0581 ;запрос OVERWRITE? + JR NZ,x05F4 ;если был ответ N, то следующий файл +x0634 CALL x063C ;копирование файла + CALL x1E43 ;перезапись сектора с описателем файла + JR x05F4 ;повтор до конца каталога + +;Адрес #63C. Копирование файла при двух дисководах. Поместите описатель файла в #5CDD и его часть в #5CED. + +x063C CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 + LD A,(#5E09) ;берем количество файлов на диске + CP #80 ;уже есть #80 файлов? + JP Z,x1C45 ;если да, то NO SPACE + +;Ошибка!!! Надо выводить DIRECTORY FULL. + + LD HL,#5CED ;восстановление описателя файла + LD DE,#5CE6 + LD BC,7 + LDIR + LD DE,(#5CEA) ;берем длину файла в секторах + LD D,0 + OR A + LD HL,(#5E0A) ;берем количество свободных секторов на диске + SBC HL,DE ;уменьшаем свободное место + JP C,x1C45 ;если места не хватило, то NO SPACE + LD (#5E0A),HL ;установка нового количества свободных секторов + LD HL,(#5E06) ;берем адрес свободного пространства на диске + LD (#5CEB),HL ;установка адреса файла на диске + PUSH HL ;сохранение его + CALL x072F ;копирование файла + POP HL ;восстановление адреса файла на диске + LD (#5CEB),HL ;установка его + LD HL,(#5CF4) ;берем новый адрес свободного места на диске + LD (#5E06),HL ;установка его + LD HL,#5E09 ;записали 1 файл + INC (HL) + LD C,(HL) ;берем номер записываемого файла + DEC C + LD B,0 + PUSH BC ;сохраняем его + LD DE,9 ;записывать сектор 8 дорожки 0 + LD (#5CF4),DE + CALL x1E43 ;запись сектора + POP BC ;восстановление номера файла + CALL x166B ;установка описателя файла + RET ;возврат + +;Адрес #690. Выполнение команды COPY. Установите #5D11 и #5C3B. + +x0690 LD HL,(#5D11) ;берем адрес второго символа командной строки + INC HL + LD A,(HL) ;берем этот символ + AND #DF ;буква заглавная + CP "S" ;это "S"? + JP Z,x1360 ;если да, то копируем 1 файл на одном дисководе + CP "B" ;это "B"? + JP Z,x152C ;если да, то копирование всего диска на одном дисководе + CALL x1DCD ;прием имен файлов + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x166F ;выделение места в памяти + CALL x102E ;прием расширения файла + CALL x1CB0 ;установка старого имени файла + LD A,(#5CF6) ;сохранение номера дисковода - источника + LD (#5CF8),A + JP NZ,x05CB ;если файл не найден, то проверка COPY "*","*" + +;Ошибка!!! COPY "*","*" надо проверять всегда, иначе при наличии на диске файла с именем "*" скопируется только этот файл, а в целом тут должно быть так: +;LD (#5CF8),A +;PUSH AF +;CALL #5CB +;POP AF +;JP NZ,#3D9 +;А в подпрограмме #5CB вместо JP NZ,#3D9 должно быть RET NZ. + + CALL x165D ;чтение описателя файла + LD HL,#5CE6 ;сохранение его части + LD DE,#5CED + LD BC,7 + LDIR + CALL x1CB0 ;установка нового имени файла + PUSH AF ;сохранение результата проверки + PUSH BC ;и номера файла + LD A,(#5CF6) ;сохранение номера дисковода - приемника + LD (#5CF9),A + LD A,(#5CF8) ;выбор дисковода - источника + CALL x3DCB + CALL x0405 ;настройка на диск + LD A,(#5CF9) ;выбор дисковода - приемника + CALL x3DCB + CALL x0405 ;настройка на диск + POP BC ;восстановление номера файла + POP AF ;и результата проверки нового имени файла + JR NZ,x06F3 ;если файл не найден, то копирование файла + CALL x05B4 ;проверка файла с расширением "#" + JR NZ,x06F3 ;если копируется другой блок, то копируем его + CALL x0581 ;запрос OVERWRITE? + JP NZ,x03E1 ;если был ответ N, то O.K. +x06F3 CALL x063C ;копирование файла + CALL x1E43 ;перезапись сектора с описателем файла + LD A,(#5CE5) ;берем расширение файла + CP "#" ;это "#"? + JP NZ,x03E1 ;если нет, то O.K. + LD A,#A ;файл искать по #A байтам + LD (#5D06),A + LD HL,#5CE6 ;следующий блок + INC (HL) + LD A,(#5CF8) ;выбор дисковода - источника + CALL x3DCB + CALL x05B4 ;поиск блока + JP NZ,x03E1 ;если не нашли, то O.K. + CALL x165D ;чтение его описателя + LD HL,#5CE6 ;сохранение его части + LD DE,#5CED + LD BC,7 + LDIR + LD A,(#5CF9) ;выбор дисковода - приемника + CALL x3DCB + CALL x0405 ;настройка на диск + JR x06F3 ;повтор + +;Адрес #72F. Копирование файла при двух дисководах. Установите +;#5CF1, #5D23, #5CF8, #5CF9, #5CF2, #5CCF и #5CEB. + +x072F LD A,(#5CF1) ;берем количество секторов + OR A ;все скопировали? + RET Z ;если да, то возврат + PUSH HL ;сохранение HL + LD HL,#5D23 ;адрес переменной с длиной рабочей области памяти + SUB (HL) ;области хватит? + POP HL ;восстановление HL + JR NC,x0775 ;если рабочей области не хватит, то копируем часть файла + LD A,(#5CF1) ;копируем весь остаток + LD B,A + XOR A ;скопировали все + LD (#5CF1),A +x0744 PUSH BC ;сохранение количества копируемых сектоpов + LD A,(#5CF8) ;выбор дисковода-источника + CALL x3DCB + POP BC ;восстановление количества копируемых секторов + PUSH BC ;и снова сохранение его + LD HL,(#5CCF) ;берем адрес рабочей области памяти + PUSH HL ;сохраняем его + LD DE,(#5CF2) ;берем адрес части файла на диске-источнике + CALL x1E3D ;загрузка секторов + LD HL,(#5CF4) ;установка адреса следующей группы секторов + LD (#5CF2),HL ;на диске-источнике + LD A,(#5CF9) ;выбор дисковода-приемника + CALL x3DCB + POP HL ;восстановление адреса рабочей области памяти + POP BC ;и количества копируемых секторов + LD DE,(#5CEB) ;берем адрес части файла на диске-приемнике + CALL x1E4D ;запись секторов + LD HL,(#5CF4) ;установка адреса следующей группы секторов + LD (#5CEB),HL ;на диске-приемнике + JR x072F ;повтор +x0775 LD (#5CF1),A ;установка оставшегося количества секторов + PUSH HL ;сохранение HL + LD HL,#5D23 ;копируем столько секторов, сколько + LD B,(HL) ;поместится в рабочую область + POP HL ;восстановление HL + XOR A ;обнуление аккумулятора + JR x0744 ;копирование секторов + +;Адрес #781. Стирание файлов. Вход: установите #5CDD, #5CE5, и произведите поиск файла. Программа устанавливает #5D08 и #5D07. + +x0781 XOR A ;обнуление количества стертых файлов + LD (#5D07),A + JR x07A0 ;стирание файлов + +;Адрес #787. Выполнение команды ERASE. Установите #5D11 и #5C3B. + +x0787 CALL x1DDF ;прием имени файла на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x102E ;прием расширения файла + XOR A ;пока ничего не стерто + LD (#5D07),A + CALL x292F ;установка и проверка имени стираемого файла + CALL x07A0 ;стирание файла + JP NZ,x0577 ;если стерли файл не в конце каталога, то проверка, сколько файлов стерли + JP x03E1 ;сообщение O.K. + +;Адрес #7A0. Стирание файлов. Вход: установите #5CDD, #5CE5, обнулите #5D07 и произведите поиск файла. Программа устанавливает #5D08 и #5D07. + +x07A0 LD A,(#5CDD) ;сохранение первого символа имени файла + LD (#5D08),A + RET NZ ;если файл не был найден, то возврат + LD HL,#5D07 ;стерт еще один файл + INC (HL) + PUSH BC ;сохранение номера файла + CALL x03FD ;чтение в буфер сектора 8 дорожки 0 + LD A,(#5E09) ;берем количество файлов на диске + POP BC ;восстановление номера файла + INC C ;этот файл последний? + CP C + JR NZ,x07BC ;если нет, то стирание обычным порядком + DEC A ;на диске теперь на 1 файл меньше + LD (#5E09),A + XOR A ;стираемый файл в конце каталога +x07BC PUSH AF ;сохранение признака метода стирания + JR Z,x07C3 ;если файл не в конце каталога, + LD HL,#5E19 ;то увеличение на 1 количества стертых файлов + INC (HL) +x07C3 PUSH BC ;сохранение номера стираемого файла + CALL x1E43 ;перезапись сектора 8 дорожки 0 + POP BC ;восстановление номера стираемого файла + DEC C + CALL x165D ;загрузка описателя файла + POP AF ;восстановление флага метода стирания + JP Z,x07D2 ;если файл в конце каталога, то первый символ имени будет CHR$ 0 + LD A,1 ;иначе он будет CHR$ 1 +x07D2 LD (#5CDD),A ;установка первого символа имени + PUSH AF ;сохранение метода стирания + CALL x1E40 ;запись описателя файла + LD A,(#5D08) ;восстановление первого символа имени файла + LD (#5CDD),A + POP AF ;восстановление метода стирания + JR Z,x07E7 ;если стерт файл в конце каталога, то реорганизация описателя диска + CALL x1CB3 ;поиск следующего файла с таким именем + JR x07A0 ;стирание его, если он есть +x07E7 CALL x03FD ;чтение сектора 8 дорожки 0 + LD HL,(#5CEB) ;установка нового начала свободного места + LD (#5E06),HL + LD DE,(#5CEA) ;установка нового количества свободных секторов + LD HL,(#5E0A) + LD D,0 + ADD HL,DE + LD (#5E0A),HL + JP x1E43 ;перезапись сектора 8 дорожки 0 и возврат + +;Адрес #800. Позиционирование с быстрой скоростью перемещения головки. Поместите физический номер дорожки в регистр данных, а команду позиционирования - в аккумулятор. + +x0800 and #FC ;позиционировать с быстрой скоростью + jp x3D9A ;выдача команды и ожидание INTRQ + +x0805 db #FF,#FF + +;new Адpес #807. нажатие magic + +x0807 push af + ld a,r + push af + ld a,#04 + push af + inc sp + push bc + ld bc,#1FFD + push hl + ld hl,(#C001) + ex (sp),hl + ld a,#55 + ld (#C001),a + cpl + ld (#C002),a + ld a,#12 + jp x0033 + +;new Адрес #826. Вызов функции rst 8 +; a - номер дисковода + +x0826 ex (sp),hl + push af + ld a,#CF ;rst 8 + ld (#5CBF),a + ld a,(hl) + inc hl + ld (#5CC0),a + ld a,#C9 + ld (#5CC1),a + pop af + ex (sp),hl + push hl + ld hl,x3D2F + ex (sp), hl + push hl + ld hl,#5CBF + ex (sp),hl + ret + +;new Адрес #844. + +x0844 ld de,#4000 + ld a,#07 + jp x000B + +;new Адрес #84C. + +x084C rst #20 + dw #1F54 + ret c + rst #20 + dw #1B7B + +;new Адрес #853. + +x0853 ld a,(#5CF6) + ld bc,#7FBA + in c,(c) + cp #01 + jr z,x0867 + jr nc,x086B + bit 7,c + jr nz,x08A3 + jr x086F +x0867 bit 6,c + jr nz,x08A3 +x086B cp #04 + jr nc,x08A3 +x086F ld de,(#5CF4) + ld hl,(#5D00) + ld bc,#0105 + ld a,(#5CFE) + cp #A0 + jr nz,x0881 + inc c +x0881 call x0826 + db #81 + jr c,x088B + pop hl + pop de + ei + ret +x088B call x0A64 + ld b,#40 + cp #02 + jr z,x089C + ld b,#01 + cp #01 + jr z,x089C + ld b,#04 +x089C ld a,b + pop hl + pop de + ei + jp x3F39 +x08A3 ld hl,(#5D00) + ret + +;new Адрес #8A7. + +x08A7 ld a,(#5CF6) + ld bc,#7FBA + in c,(c) + cp #01 + jr z,x08BB + jr nc,x08BF + bit 7,c + jr nz,x08C7 + jr x08C3 +x08BB bit 6,c + jr nz,x08C7 +x08BF cp #04 + jr nc,x08C7 +x08C3 xor a + jp x3E63 +x08C7 jp x3D98 + +;new Адрес #8CA. + +x08CA ld (#5CCA),hl ;для дисководов C и D =#00 + ld a,#FF + ld (#5CD1),a ; + ld hl,#8282 + ret + +x08D6 DISPLAY "Free space at ",$,": ",/D,#901-$," byte(s)" + ds #08FF-$,#00 + ds #0901-$,#FF + +;new Адрес #901. +; a - номер дисковода + +x0901 ld (#5CF6),a ;номер дисковода + ld bc,#7FBA + in c,(c) + cp 1 ;дисковод B? + jr z,x0914 ;если да, то переход + jr nc,x0917 ;если дисковод C или D + bit 7,c ;дисковод A + ret nz ;если реальный дисковод, выход + jr x091A +x0914 bit 6,c + ret nz ;если реальный дисковод, выход +x0917 cp #04 + ret nc ;выход, если дисковод >3 +x091A or #80 + ld c,#28 ;подфункция #28 + call x0826 ;вызов rst 8 + db #81 + ld a,(#5CF6) ;номер дисковода + jr nc,x092D ;нет ошибки + cp #02 + ret c ;ошибка +x092A jp x3EE7 ;ошибка no disk +x092D ld hl,#5D16 + ld c,a + ld a,%00111100 + or c + ld (hl),a + ld a,(#5CF6) ;номер дисковода + ld c,#01 ;подфункция #01 (выбор текущего дисковода) + call x0826 ;вызов rst 8 + db #81 + jr c,x092A ;ошибка no disk + call x3E08 ;выборка времени перемещения головки текущего дисковода + ld (hl),#00 + call x3E11 ;выборка типа дисковода + ld (hl),#83 + ld a,#80 + ld (#5CCD),a ;гтовность дисковода + pop hl + ret + +x0951 DISPLAY "Free space at ",$,": ",/D,#A01-$," byte(s)" + ds #09FF-$,#00 + ds #0A01-$,#FF + +;new Адрес #A01. + +x0A01 ld a,(#5CF6) + push bc + ld bc,#7FBA + in c,(c) + cp 1 ;дисковод B? + jr z,x0A16 ;если да, то переход + jr nc,x0A1A ;если дисковод C или D + bit 7,c ;дисковод A + jr nz,x0A2D + jr x0A1E +x0A16 bit 6,c + jr nz,x0A2D ;если реальный дисковод +x0A1A cp #04 + jr nc,x0A2D ;если дисковод >3 +x0A1E pop bc + ld d,c + push bc + ld c,#02 + call x0826 + db #81 + pop bc + jp c,x3EE7 + pop hl + ret +x0A2D pop bc + jp x1FEB + +;new Адрес #A31. + +x0A31 ld a,(#5CF6) + ld bc,#7FBA + in c,(c) + cp 1 ;дисковод B? + jr z,x0A45 ;если да, то переход + jr nc,x0A49 ;если дисковод C или D + bit 7,c ;дисковод A + jr nz,x0A4F + jr x0A4D +x0A45 bit 6,c + jr nz,x0A4F +x0A49 cp #04 + jr nc,x0A4F +x0A4D pop hl + ret +x0A4F jp x3EB2 + +;new Адрес #A52. Чтение переменной монитора + +x0A52 push de + push bc + push hl + ld bc,#000D + ld de,#0004 + or a + call x0826 + db #82 + bit 5,a + jr x0A72 + +;new Адрес #A64. Чтение переменной монитора + +x0A64 push de + push bc + push hl + ld bc,#001D + ld de,#0004 + or a + call x0826 + db #82 +x0A72 pop hl + pop bc + pop de + ret + +;new Адрес #A76. + +x0A76 ld a,(#5CF6) + push bc + ld bc,#7FBA + in c,(c) + cp 1 ;дисковод B? + jr z,x0A8B ;если да, то переход + jr nc,x0A8F ;если дисковод C или D + bit 7,c ;дисковод A + jr nz,x0A97 + jr x0A93 +x0A8B bit 6,c + jr nz,x0A97 +x0A8F cp #04 + jr nc,x0A97 +x0A93 pop bc + xor a + inc a + ret +x0A97 pop bc + xor a + ret + +x0A9A DISPLAY "Free space at ",$,": ",/D,#B01-$," byte(s)" + ds #0AFF-$,#00 + ds #0B01-$,#FF + +;new Адрес #B01. + +x0B01 call x0A76 + jp z,x1FF6 + pop hl + jp x1F16 + +;new Адрес #B0B. + +x0B0B call x0A76 + ld hl,#5CD7 + ret z + inc hl + ld (hl),#00 + pop hl + ld hl,#5D25 + ld (hl),#00 + ld de,#5D26 + ld bc,#00FF + ldir + ld d,#00 +x0B25 ld e,#00 +x0B27 call x084C + ld hl,#5D25 + ld bc,#0106 + push de + call x0826 + db #81 + jr nc,x0B44 + call x0A64 + ld c,a + ld b,#00 + call x1DA9 + ld hl,#5CD6 + inc (hl) +x0B44 pop de + inc e + bit 4,e + jr z,x0B27 + ld a,#2B + rst #10 +xxx inc d + ld a,d + cp #A0 + jr nz,x0B25 + ret + +;new Адрес #B54. + +x0B54 call x0A76 + jp z,x1FEB + ret + +x0B5B DISPLAY "Free space at ",$,": ",/D,#C01-$," byte(s)" + ds #0BFF-$,#00 + ds #0C01-$,#FF + +;new Адрес #C01. + +x0C01 ld bc,#7FBA + in a,(c) + and %00000100 + jr z,x0C1C + ld bc,#047F +x0C0D in a,(#FF) + and #C0 + jp nz,x3FD1 + inc de + ld a,e + or d + jr nz,x0C0D + djnz x0C0D + ret +x0C1C ret + +;new Адрес #C1D. + +x0C1D ld bc,#7FBA + in a,(c) + and %00000100 + jr z,x0C38 + ld bc,#047F +x0C29 in a,(#FF) + and #C0 + jp nz,x3FEC + inc de + ld a,e + or d + jr nz,x0C29 + djnz x0C29 + ret +x0C38 ret + +x0C39 DISPLAY "Free space at ",$,": ",/D,#FF3-$," byte(s)" + ds #0CFF-$,#00 + ds #0D01-$,#FF + ds #0DFF-$,#00 + ds #0E01-$,#FF + ds #0EFF-$,#00 + ds #0F01-$,#FF + ds #0FF3-$,#00 + +x0FF3 push af + push bc + push de + jp x2A59 + +x0FF9 DISPLAY "Free space at ",$,": ",/D,#1000-$," byte(s)" + ds #FFF-$,#00 + ds #1000-$,#FF + + + DISPLAY "Free space at ",$,": ",/D,#1000-$," byte(s)" + DS #1000-$,#FF + +;Адрес #1000. Текст "Interface one fitted" + +x1000 DB #16,9,5 + DB "Interface one fitted" + DB 0 + +;Адрес #1018. Выполнение команды "*". Установите #5D11 и #5C3B. + +x1018 CALL x1DDF ;установка CH_ADD и прием имени дисковода на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x0531 ;снятие имени дисковода со стека калькулятора + LD A,(DE) ;берем первый символ имени + CALL x0524 ;вычисление номера дисковода + LD (#5D19),A ;установка дисковода по умолчанию + CALL x3DCB ;выбор дисковода + JP x03E1 ;сообщение O.K. + +;Адрес #102E. Прием расширения файла. Установите #5C5D и #5CD6. + +x102E LD B,"C" ;расширение C + LD A,(#5CD6) ;расширение принимать? + OR A + JR NZ,x104D ;если нет, то установка расширения файла + CALL x1D8C ;берем текущий символ + CP #AF ;это CODE? + LD B,"C" ;расширение C + JR Z,x104D ;если да, то установка расширения файла + CP #E4 ;это DATA? + LD B,"D" ;расширение D + JR Z,x104D ;если да, то установка расширения файла + CP "#" ;это #? + LD B,"#" ;расширение # + JR Z,x104D ;если да, то установка расширения файла + LD B,"B" ;расширение B +x104D LD HL,#5CE5 ;адрес переменной с расширением файла + LD (HL),B ;установка расширения + RET ;возврат + +;Адрес #1052. Ввод клавиши с ожиданием. + +x1052 DI ;запрет прерываний + PUSH HL ;сохранение регистров + PUSH BC + PUSH DE +x1056 RST #20 ;определение номера нажатой клавиши + DW #028E + LD C,0 ;режим клавиатуры - C или L + JR NZ,x1056 ;если нажата бессмысленная комбинация клавиш, то повтор + RST #20 ;определение кода нажатой клавиши + DW #031E + JR NC,x1056 ;если ничего не нажато, то повтор + DEC D ;режим клавиатуры - C или L + LD E,A ;помещение кода клавиши в регистр E + RST #20 ;обработка клавиш CAPS SHIFT и SYMBOL SHIFT + DW #0333 + POP DE ;восстановление регистров + POP BC + POP HL + AND #DF ;буква будет заглавная + EI ;разрешение прерываний + RET ;возврат + +;Адрес #106E. Вывод цветных полос для заставки. + +x106E LD HL,#58E5 ;адрес линии атрибутов + LD B,#A ;установка атрибутов +x1073 LD (HL),7 + INC HL + DJNZ x1073 + LD (HL),2 + INC HL + LD (HL),#16 + INC HL + LD (HL),#34 + INC HL + LD (HL),#25 + INC HL + LD (HL),#28 + INC HL + LD (HL),7 + LD HL,#40EE ;адрес верхней линии пикселей + LD B,8 ;8 линий пикселей в знакоместе + XOR A ;обнуление аккумулятора +x108F PUSH BC ;сохранение количества линий + SCF ;сдвиг пикселей + RLA + PUSH HL ;сохранение адреса линии пикселей + PUSH AF ;и байта для заполнения + LD B,5 ;в линии 5 байтов +x1096 INC HL ;заполнение линии + LD (HL),A + DJNZ x1096 + POP AF ;восстановление байта для заполнения линии, + POP HL ;адреса линии + POP BC ;и количества линий + LD DE,#100 ;берем адрес следующей линии + ADD HL,DE + DJNZ x108F ;повтор до конца + RET ;возврат + +x10A4 RET + +;Адрес #10A5. Сообщения команды LIST. + +x10A5 DB " Del." +x10AA DB " File(s)" + DB 0 +x10B3 DB "Title:" + DB #A0 +x10BA DB #17,#11 + DB " Disk Drive: " + DB 0 +x10CA DB #17,#10," ",0 +x10CE DB #17,#10," 40 Track S. Side" + DB 0 +x10E2 DB #17,#10," 80 Track S. Side" + DB 0 +x10F6 DB #17,#10," 40 Track D. Side" + DB 0 +x110A DB #17,#10," 80 Track D. Side" + DB 0 +x111E DB #17,#10 + DB " Free Sector " + DB 0 +x112E DB #D,#D + DB " File Name Start Length Line" + DB 0 + +;Адрес #1151. Выделение #222 байтов в рабочей области. Устанавливает #5CCF. + +x1151 LD HL,(#5C61) ;берем адрес рабочей области + LD (#5CCF),HL ;установка адреса пространства + LD BC,#222 ;выделять #222 байтов + JP x1E23 ;выделение области и возврат + +;Адрес #115D. Печать числа из HL с нулями. + +x115D XOR A ;в числе 0 десятков тысяч + LD DE,#2710 +x1161 SBC HL,DE ;вычитание из числа 10000 + JR C,x1168 ;если получилось число меньше 10000, то следующий разряд + INC A ;следующий десяток тысяч + JR x1161 ;повтор +x1168 ADD A,"0" ;печать десятков тысяч + CALL x11A8 + ADD HL,DE ;восстановление остатка числа + XOR A ;в числе 0 тысяч +x116F LD DE,#3E8 +x1172 SBC HL,DE ;вычитание из числа 1000 + JR C,x1179 ;если получилось число меньше 1000, то следующий разряд + INC A ;следующая тысяча + JR x1172 ;повтор +x1179 ADD A,"0" ;печать тысяч + CALL x11A8 + ADD HL,DE ;восстановление остатка числа + XOR A ;в числе 0 сотен + LD DE,#64 +x1183 SBC HL,DE ;вычитание из числа 100 + JR C,x118A ;если получилось число меньше 100, то следующий разряд + INC A ;следующая сотня + JR x1183 ;повтор +x118A ADD A,"0" ;печать сотен + CALL x11A8 + ADD HL,DE ;восстановление остатка числа + XOR A ;в числе 0 десятков + LD DE,#A +x1194 SBC HL,DE ;вычитание из числа 10 + JR C,x119B ;если получилось число меньше 10, то следующий разряд + INC A ;следующий десяток + JR x1194 ;повтор +x119B ADD A,"0" ;печать десятков + CALL x11A8 + ADD HL,DE ;восстановление остатка числа + LD A,L ;печать единиц + ADD A,"0" + CALL x11A8 + RET ;возврат + +;Адрес #11A8. То же, что и #3D82. + +x11A8 PUSH HL ;сохранение HL и DE + PUSH DE + CALL x3D82 ;печать символа + POP DE ;восстановление DE и HL + POP HL + RET ;возврат + +;Адрес #11B0. Проверка достижения конца буфера при работе с каталогом. Установите #5CF9 и #5CCC, а в HL поместите текущий адрес буфера. Если конец буфера достигнут, то в буфер загрузится следующий сектор каталога, а в HL будет #5D25. + +x11B0 PUSH HL ;сохранение HL и BC + PUSH BC + LD A,(#5CF9) ;берем номер дисковода из #5CF9 + LD HL,#5CF6 ;берем номер текущего дисковода + CP (HL) ;назначен другой дисковод? + CALL NZ,x3DCB ;если да, то выбор назначенного дисковода + POP BC ;восстановление HL и BC + POP HL + CALL x050C ;проверка достижения конца буфера + LD A,(HL) ;берем первый символ имени файла + OR A ;конец каталога? + JP Z,x01D3 ;если да, то завершение + CP 1 ;файл стерт? + CALL Z,x0507 ;если да, то пропуск файла + RET NZ ;иначе возврат + JR x11B0 ;если файл был пропущен, то повтор + +;Адрес #11CE. Выполнение команды LIST. Установите #5D11 и #5C3B. + +x11CE CALL x042B ;проверка второго символа строки + LD BC,2 ;по умолчанию печатать в поток 2 + LD (#5CDB),BC + JR Z,x1205 ;если второй символ строки ENTER, то вывод каталога + CP "#" ;если второй символ строки "#"? + JR NZ,x11F8 ;если нет, то установка дисковода + LD (#5C5D),HL ;установка CH_ADD + CALL x1E0B ;прием номера потока + CALL x1D8C ;берем текущий символ + CP #D ;это ENTER? + JR Z,x1205 ;если да, то вывод каталога + CP "," ;это ","? + JP NZ,x1D1A ;если нет, то ошибка + CALL x1E2A ;следующий символ + CALL x1DBD ;прием имени дисковода на стек калькулятора + JR x11FB ;установка дисковода +x11F8 CALL x1DDF ;установка CH_ADD и прием имени дисковода на стек калькулятора +x11FB CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x1DB5 ;снятие имени дисковода со стека калькулятора + EX DE,HL ;переброска его адреса в HL + CALL x1C81 ;установка дисковода +x1205 CALL x1D75 ;если идет проверка на синтаксис, то возврат + LD A,(#5CF6) ;загрузка имени дисковода в #5CF9 + LD (#5CF9),A + CALL x0405 ;настройка на диск + LD A,(#5CDB) ;берем номер потока + CP 2 ;это 2? + PUSH AF ;сохраняем его + CALL Z,x1D97 ;если да, то очистка экрана + POP AF ;восстановление номера потока + CP #11 ;он больше #10? + JP NC,x1D1A ;если да, то ошибка + CALL x1D84 ;открытие потока + LD A,#FF ;буфер не убирать, память не изменять + LD (#5CF8),A + CALL x1151 ;выделение памяти в рабочей области + LD HL,#5E06 ;начало описателя диска в буфере + LD DE,(#5CCF) ;берем адрес WORKSP + LD BC,#20 ;длина описателя диска + LDIR ;сохранение описателя диска + CALL x03E8 ;загрузка в буфер сектора 0 дорожки 0 + LD HL,#5D25 ;адрес буфера + PUSH HL ;сохранение его +x123E LD HL,x10B3 ;адрес сообщения TITLE: + PUSH BC ;сохранение BC + RST #18 ;печать TITLE: + LD HL,(#5CCF) ;берем адрес WORKSP + LD BC,#14 ;#14-й байт + ADD HL,BC + RST #18 ;печать имени диска + LD HL,x10BA ;печать DISC DRIVE: + RST #18 + LD A,(#5CF6) ;берем номер дисковода + ADD A,"A" ;вычисление имени дисковода + CALL x3D82 ;печать его + CALL x3D80 ;перевод строки + LD HL,(#5CCF) ;3-й байт описателя диска + LD BC,3 + ADD HL,BC + LD A,(HL) ;берем количество файлов на диске + LD HL,(#5CCF) ;#13-й байт + LD BC,#13 + ADD HL,BC + SUB (HL) ;вычисление количества нестертых файлов + PUSH HL ;сохранение адреса #13-го байта описателя диска + CALL x1DA3 ;печать количества нестертых файлов + LD HL,x10AA ;печать FILE(S) + RST #18 + LD HL,(#5CCF) ;2-й байт описателя диска + LD BC,2 + ADD HL,BC + LD A,(HL) ;берем тип диска + LD HL,x10CE ;адрес сообщения 40 TRACKS, S.SIDE + CP #19 ;это #19? + JR Z,x1292 ;если да, то печать сообщения + LD HL,x10E2 ;адрес сообщения 80 TRACKS, S.SIDE + CP #18 ;это #18? + JR Z,x1292 ;если да, то печать сообщения + LD HL,x10F6 ;адрес сообщения 40 TRACKS, D.SIDE + CP #17 ;это #17? + JR Z,x1292 ;если да, то печать сообщения + LD HL,x110A ;адpес сообщения 80 TRACKS, D.SIDE +x1292 RST #18 ;печать сообщения + POP HL ;восстановление адреса #13-го байта описателя диска + LD C,(HL) ;берем количество стертых файлов + CALL x1DA4 ;печать его + LD HL,x10A5 ;печать DEL.FILES + RST #18 + LD HL,x111E ;печать FREE SECTORS: + RST #18 + LD HL,(#5CCF) ;4-й байт + LD BC,4 + ADD HL,BC + LD C,(HL) ;берем количество свободных секторов + INC HL + LD B,(HL) + CALL x1DA9 ;печать его + LD HL,x112E ;печать FILE NAME, START, LENGTH, LINE + RST #18 + POP BC ;восстановление BC и текущего адреса в буфеpе + POP HL + LD B,#10 ;печатать информацию о #10 файлах +x12B5 CALL x11B0 ;проверка достижения конца буфера + CALL x3D80 ;перевод строки + PUSH BC ;сохранение количества оставшихся файлов + PUSH HL ;и текущего адреса в буфеpе + CALL x2938 ;печать имени и расширения файла + LD BC,#D ;#D-й байт описателя файла + POP HL ;восстановление текущего адреса в буфере + PUSH HL + ADD HL,BC + LD C,(HL) ;берем размер файла в секторах + PUSH BC ;сохраняем его + LD A,C ;загружаем его в C + LD B,2 ;печатать 2 пробела перед числом + CP #A ;длина файла меньше 10 секторов? + JR C,x12D0 ;если да, то печать пробелов + DEC B ;печатать один пробел +x12D0 CP #64 ;длина файла меньше 100 сектоpов? + JR NC,x12D9 ;если нет, то пробелы не печатать +x12D4 LD A," " ;печать пробелов + RST #10 + DJNZ x12D4 +x12D9 POP BC ;восстановление длины файла в секторах + CALL x1DA9 ;печать ее + LD HL,x10CA ;#10 пробелов + RST #18 + POP HL ;восстановление адреса описателя файла в буфере + PUSH HL ;и снова сохранение его + LD BC,9 ;9-й байт описателя + ADD HL,BC + LD E,(HL) ;берем адрес загрузки файла + INC HL + LD D,(HL) + PUSH HL ;сохранение текущего адреса в описателе файла + EX DE,HL ;переброска адреса загрузки файла в HL + CALL x115D ;печать его + LD A," " ;пробел + CALL x3D82 + POP HL ;восстановление текущего адреса в описателе файла + INC HL ;следующий адрес + LD E,(HL) ;берем длину файла + INC HL + LD D,(HL) + EX DE,HL ;перенос ее в HL + CALL x115D ;печать ее + POP HL ;восстановление адреса описателя файла + PUSH HL ;и снова сохранение его + LD BC,8 ;8-й байт + ADD HL,BC + LD A,(HL) ;берем расширение файла + CP "B" ;это "B"? + CALL Z,x131B ;если да, то печать строки автозапуска + POP HL ;восстановление адреса описателя файла + POP BC ;и счетчика файлов + LD DE,#10 ;адрес следующего описателя файла + ADD HL,DE + DJNZ x12B5 ;повтор до конца + PUSH HL ;сохранение адреса описателя файла + CALL x3D80 ;2 раза перевод строки + CALL x3D80 + JP x123E ;повтор с самого начала + +;Адрес #131B. Печать строки автостарта прогpаммы на бейсике. В HL поместите адрес описателя файла плюс 8 и установите #5CCF. + +x131B LD BC,5 ;берем адрес длины файла в секторах + ADD HL,BC + LD B,(HL) ;берем эту длину + INC HL ;следующий адрес в описателе + LD E,(HL) ;берем адрес файла на диске + INC HL + LD D,(HL) + DEC B ;загружать будем 2 сектоpа + JR Z,x1335 + DEC B + JR Z,x1335 ;если длина файла не больше 2-х секторов, то загрузка секторов + LD A,#10 ;на дорожке #10 секторов +x132C INC E ;следующий сектор + CP E ;конец дорожки? + JR NZ,x1333 ;если да, то + LD E,0 ;следующий сектор 0 + INC D ;и берем следующую дорожку +x1333 DJNZ x132C ;повтор до конца +x1335 LD HL,(#5CCF) ;берем адрес рабочей области + LD BC,#21 ;#21 байт уже занято + ADD HL,BC + LD B,2 ;загружать 2 сектора + PUSH HL ;сохранение адреса загрузки секторов + CALL x1E3D ;загрузка секторов + LD A,#80 ;будем искать конец программы + POP HL ;восстановление адреса секторов в памяти + LD BC,#200 ;длина области - #200 байтов + CPIR ;поиск конца программы + LD A,(HL) ;берем следующий байт + CP #AA ;это #AA? + RET NZ ;если нет, то возврат + INC HL ;берем номер строки автостарта + LD C,(HL) + INC HL + LD B,(HL) + LD A,B ;это 0? + OR C + RET Z ;если да, то возврат + PUSH BC ;сохранение номера строки автостарта + LD A," " ;печать пробела + CALL x3D82 + POP BC ;восстановление номера строки автостарта + CALL x1DA9 ;печать его + RET ;возврат + +;Адрес #1360. Выполнение команды COPY S. Установите #5D11 и #5C3B. + +x1360 CALL x1DC5 ;установка CH_ADD + CALL x1E2A ;следующий символ + CALL x1DBD ;прием имени файла на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x166F ;резервирование места в памяти + LD HL,x27AA ;печать INSERT SOURCE DISC + CALL x2707 +x1375 CALL x1052 ;ввод символа с клавиатуры + CP "Y" ;это "Y"? + JR NZ,x1375 ;если нет, то повтор + CALL x1D9F ;очистка низа экрана + CALL x102E ;прием расширения файла + CALL x1CB0 ;установка имени файла + JP NZ,x03D9 ;если такого файла нет, то ошибка + CALL x13B7 ;копирование файла + LD A,(#5CE5) ;расширение файла #? + CP "#" + JP NZ,x03E1 ;если нет, то O.K. +x1393 LD A,#A ;файл искать по #A символам + LD (#5D06),A + LD HL,#5CE6 ;следующий блок + INC (HL) + CALL x1D97 ;очистка экрана + LD HL,x27AA ;печать INSERT SOURCE DISC + CALL x2707 +x13A5 CALL x1052 ;ввод клавиши + CP "Y" ;это "Y"? + JR NZ,x13A5 ;если да, то повтор + CALL x1CB3 ;поиск блока + JP NZ,x03E1 ;если не нашли, то O.K. + CALL x13B7 ;копирование блока + JR x1393 ;повтор + +;Адрес #13B7. Копирование файла при одном дисководе. Номер файла поместите в регистр C. + +x13B7 CALL x165D ;чтение описателя файла + LD HL,#5CE6 ;сохранение его части + LD DE,#5CED + LD BC,7 + LDIR + LD A,(#5CF1) ;установка объема файла в секторах + LD (#5D10),A + CALL x0405 ;настройка на диск + CALL x3E11 ;сохранение режима дисковода + LD (#5CD9),A + LD A,#FF ;первый проход + LD (#5D21),A + +;Внимание!!! Эта переменная уже занята. В ней хранятся первые 3 символа командной строки. + + CALL x1451 ;копирование файла + LD HL,(#5D1F) ;берем адрес файла на диске - приемнике + LD (#5CEB),HL ;устанавливаем его + LD HL,(#5CF4) ;берем новый адрес свободного места на диске + LD (#5E06),HL ;устанавливаем его + LD HL,#5E09 ;записали 1 файл + INC (HL) + LD C,(HL) ;берем номер файла + DEC C + LD B,0 ;переводим его в двухбайтную форму + PUSH BC ;сохраняем его + LD DE,9 ;записывать сектор 8 дорожки 0 + LD (#5CF4),DE + CALL x1E43 ;запись сектора + POP BC ;восстановление номера файла + CALL x166B ;чтение и замена описателя файла + CALL x1E43 ;запись сектора с описателем + RET ;возврат + +;Адрес #1403. Проверка наличия свободного места на диске-приемнике для команды COPY S. Поместите описатель файла в #5CDD и его часть в #5CED и установите #5D10. В дисководе должен быть диск-приемник. Подпрограмма устанавливает #5CEA, #5CEB и #5D1F. + +x1403 XOR A ;не первый проход + LD (#5D21),A + CALL x0405 ;настройка на диск + CALL x3E11 ;берем режим дисковода + LD (#5CDA),A ;сохраняем его + CALL x1CB3 ;поиск файла + JP Z,x1C50 ;если нашли, то FILE EXISTS + CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 + LD A,(#5E09) ;берем количество файлов на диске + CP #80 ;их 128? + JP Z,x2723 ;если да, то DIRECTORY FULL + LD HL,#5CED ;восстановление описателя файла + LD DE,#5CE6 + LD BC,7 + LDIR + CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 + LD A,(#5D10) ;восстановление длины файла в секторах + LD (#5CEA),A + LD DE,(#5CEA) ;перевод ее в двухбайтную форму + LD D,0 + OR A ;сброс флага C + LD HL,(#5E0A) ;уменьшаем свободное место на диске + SBC HL,DE + JP C,x1C45 ;если его не хватило, то NO SPACE + LD (#5E0A),HL ;установка нового количества свободного места на диске + LD HL,(#5E06) ;берем адрес свободного места на диске + LD (#5CEB),HL ;установка адреса файла на диске-приемнике + LD (#5D1F),HL ;сохранение его + +;Боже мой!!! Ну что это такое! Ведь эта переменная - флаг способа вызова TR-DOS. И на этом DOS все работают. Ужас какой-то. + + RET ;возвpат + +;Адрес #1451. Копирование файла на одном дисководе. Поместите описатель файла в #5CDD и его часть в #5CED и установите #5CF1, #5D21, #5D23 и #5CCF. Подпрограмма устанавливает #5CBB, #5CD9, #5CDA и #5C92. + +x1451 LD A,(#5CF1) ;все скопировали? + OR A + RET Z ;если да, то возврат + LD A,(#5D21) ;первый проход? + OR A + JR NZ,x146F ;если да, то диск - источник уже в дисководе + CALL x1D97 ;очистка экрана + LD HL,x27AA ;печать INSERT SOURCE DISC + CALL x2707 +x1465 CALL x1052 ;ожидание клавиши "Y" + CP "Y" + JR NZ,x1465 + CALL x1D9F ;очистка низа экрана +x146F LD A,(#5CF1) ;все скопировали? + OR A + RET Z ;если да, то возврат + PUSH HL ;сохранение HL + LD HL,#5D23 ;копируется часть файла + SUB (HL) + POP HL ;восстановление HL + JR NC,x14CB ;если еще не конец, то копируется часть файла + LD A,(#5CF1) ;копируем остаток + LD B,A + XOR A ;скопировали все + LD (#5CF1),A +x1484 PUSH BC ;сохранение количества копируемых секторов + LD (#5CCE),A ;обнуление #5CCE + LD HL,(#5CCF) ;берем адрес рабочего пространства + PUSH HL ;сохраняем его + LD DE,(#5CF2) ;берем адрес копируемого участка диска + CALL x14D8 ;настройка дисковода под диск-источник + CALL x1E3D ;загрузка секторов + LD HL,(#5CF4) ;установка адреса на диске следующего сектора + LD (#5CF2),HL + CALL x1D97 ;очистка экрана + LD HL,x2785 ;печать INSERT DESTINATION DISC + CALL x2707 +x14A5 CALL x1052 ;ожидание клавиши "Y" + CP "Y" + JR NZ,x14A5 + CALL x1D9F ;очистка низа экрана + LD A,(#5D21) ;первый проход? + OR A + CALL NZ,x1403 ;если да, то проверка наличия места на диске + POP HL ;восстановление адреса рабочего пространства + POP BC ;и количества копируемых секторов + LD DE,(#5CEB) ;берем адрес текущего участка диска + CALL x14E4 ;настройка дисковода под диск-приемник + CALL x1E4D ;запись секторов + LD HL,(#5CF4) ;установка адреса на диске следующего сектора + LD (#5CEB),HL + JP x1451 ;повтор +x14CB LD (#5CF1),A ;установка длины оставшейся части файла + PUSH HL ;сохранение HL + LD HL,#5D23 ;берем длину рабочей области + LD B,(HL) + POP HL ;восстановление HL + XOR A ;обнуление аккумулятора + JP x1484 ;копирование + +;Адрес #14D8. Помещение значения #5CD9 в переменную режима дисковода. Установите #5CD9. + +x14D8 PUSH HL ;сохранение DE и HL + PUSH DE + CALL x3E11 ;берем адрес переменной с типом дисковода + LD A,(#5CD9) ;берем тип дисковода из #5CD9 + LD (HL),A ;установка типа дисковода + POP DE ;восстановление DE и HL + POP HL + RET ;возврат + +;Адрес #14E4. Помещение значения #5CDA в переменную режима дисковода. Установите #5CDA. + +x14E4 PUSH HL ;сохранение DE и HL + PUSH DE + CALL x3E11 ;берем адрес переменной с типом дисковода + LD A,(#5CDA) ;берем тип дисковода из #5CD9 + LD (HL),A ;установка типа дисковода + POP DE ;восстановление DE и HL + POP HL + RET ;возврат + +;Адрес #14F0. Проверка наличия места на диске-приемнике для команды COPY B. Установите #5CDF и поместите в дисковод диск-приемник. Устанавливает #5CDA, #5CE7, #5CDD и обнуляет #5D21. + +x14F0 XOR A ;обнуление #5D21 + LD (#5D21),A + CALL x0405 ;настройка на диск + CALL x3E11 ;берем режим дисковода + LD (#5CDA),A ;сохраняем его + LD A,(#5E08) ;сохраняем тип диска + LD (#5CE7),A + LD HL,#280 ;вычисление количества секторов на + CP #19 ;диске-приемнике + JR Z,x151F + LD HL,#500 + CP #18 + JR Z,x151F + CP #17 + JR Z,x151F + LD HL,#A00 + CP #16 + JR Z,x151F + JP x1D1A ;если в качестве типа диска стоит неопределенное значение, то *ERROR* + +;Лучше DISC ERROR. + +x151F LD (#5CDD),HL ;сохранение количества секторов на диске-приемнике + LD BC,(#5CDF) ;берем количество копируемых секторов + SBC HL,BC ;места хватит? + JP C,x1C45 ;если нет, то NO SPACE + RET ;возврат + +;Адрес #152C. Выполнение команды COPY B. Установите #5C3B. + +x152C CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x166F ;резервирование места в памяти + LD HL,x2779 ;печать BACKUP DISC + CALL x2707 + LD HL,x27AA ;печать INSERT SOURCE DISC + CALL x2707 +x153E CALL x1052 ;ввод клавиши + CP "Y" ;это "Y"? + JR NZ,x153E ;если да, то повтор + CALL x1D9F ;очистка низа экрана + LD A,#FF ;первый проход + LD (#5D21),A + +;Внимание!!! Эта переменная уже занята. В ней хранятся первые 3 символа командной строки. + + CALL x0405 ;настройка на диск + CALL x3E11 ;берем режим дисковода + LD (#5CD9),A ;сохраняем его + LD A,(#5E08) ;берем тип диска + CP #19 ;диск 40-дорожечный односторонний? + LD HL,#280 ;всего на диске #280 секторов + JR Z,x1575 ;если да, то копирование + LD HL,#500 ;всего на диске #500 секторов + CP #18 ;диск 80-дорожечный односторонний? + JR Z,x1575 ;если да, то копирование + CP #17 ;диск 40-дорожечный двухсторонний? + JR Z,x1575 ;если да, то копирование + LD HL,#A00 ;всего на диске #A00 секторов + CP #16 ;диск 80-дорожечный двухсторонний? + JR Z,x1575 ;если да, то копирование + JP x1D1A ;иначе *ERROR* + +;Внимание!!! Лучше выдавать сообщение DISC ERROR. + +x1575 LD BC,(#5E0A) ;берем количество свободных секторов + SBC HL,BC ;вычисляем количество занятых секторов + LD (#5CE5),HL ;установка количества секторов + LD (#5CDF),HL + LD HL,0 ;скопировано 0 секторов + LD (#5CE1),HL + LD (#5CE3),HL + CALL x15B8 ;копирование секторов + CALL x0405 ;настройка на диск + LD A,(#5CE7) ;установка нового типа диска-приемника + LD (#5E08),A + LD HL,(#5CDD) ;берем общее число секторов на диске-приемнике + LD BC,(#5CDF) ;берем число скопированных секторов + SBC HL,BC ;вычисление числа свободных секторов на диске - приемнике + LD (#5E0A),HL ;установка его + CALL x14E4 ;настройка дисковода под диск-приемник + LD DE,9 ;записывали сектор 8 дорожки 0 + LD (#5CF4),DE + CALL x1E43 ;запись сектора + JP x03E1 ;O.K. + +;Адрес #15B2. Проверка переменной #5CE5. Соответственно содержимому будет установлен флаг Z, а само содержимое будет в HL. + +x15B2 LD HL,(#5CE5) ;берем содержимое переменной #5CE5 + LD A,H ;проверка его на 0 + OR L + RET ;возврат + +;Адрес #15B8. Копирование секторов. Установите #5CD9, #5CCF, #5CE5, #5D21, #5D23 и #5CDB + +x15B8 CALL x15B2 ;все скопировали? + RET Z ;если да, то возврат + LD A,(#5D21) ;первый проход? + OR A + JR NZ,x15DB ;если да, то диск-источник уже в дисководе + CALL x1D97 + LD HL,x2779 ;печать BACKUP DISC + CALL x2707 + LD HL,x27AA ;печать INSERT SOURCE DISC + CALL x2707 +x15D1 CALL x1052 ;ожидание нажатия "Y" + CP "Y" + JR NZ,x15D1 + CALL x1D9F ;очистка низа экрана + +x15DB CALL x15B2 ;все скопировали? + RET Z ;если да, то возврат + PUSH BC ;сохранение BC и количества секторов + PUSH HL + LD HL,#5D23 ;берем длину рабочей области в секторах + LD C,(HL) + LD B,0 + POP HL ;восстановление количества секторов + SBC HL,BC ;уменьшение количества секторов + POP BC ;восстановление BC + JP NC,x1644 ;если рабочего пространства мало, то это еще не конец + LD BC,(#5CE5) ;берем оставшееся количество секторов + LD HL,0 ;все скопировали + LD (#5CE5),HL +x15F8 PUSH BC ;сохранение количества секторов + LD HL,(#5CCF) ;берем адрес рабочей области + PUSH HL ;сохраняем его + CALL x14D8 ;настройка дисковода под диск-источник + LD DE,(#5CE1) ;берем адрес группы секторов на диске-источнике + LD B,C + CALL x1E3D ;загрузка секторов + LD HL,(#5CF4) ;установка адреса следующей группы секторов + LD (#5CE1),HL ;на диске-источнике + CALL x1D97 ;очистка экрана + LD HL,x2779 ;печать BACKUP DISC + CALL x2707 + LD HL,x2785 ;печать INSERT DESTINATION DISC + CALL x2707 +x161D CALL x1052 ;ожидание нажатия "Y" + CP "Y" + JR NZ,x161D + CALL x1D9F ;очистка низа экрана + LD A,(#5D21) ;первый проход? + OR A + CALL NZ,x14F0 ;если да, то проверка наличия места на диске + POP HL ;восстановление адреса рабочей области + POP BC ;и количества копируемых секторов + LD DE,(#5CE3) ;берем адрес группы секторов на диске-приемнике + LD B,C + CALL x14E4 ;настройка дисковода под диск-приемник + CALL x1E4D ;запись секторов + LD HL,(#5CF4) ;установка адреса следующей группы секторов + LD (#5CE3),HL ;на диске-приемнике + JP x15B8 ;повтор +x1644 LD (#5CE5),HL ;установка оставшегося количества секторов + PUSH HL ;сохранение его + LD HL,#5D23 ;берем длину рабочей области + LD C,(HL) ;столько секторов будем копировать + LD B,0 + POP HL ;восстановление оставшегося количества секторов + XOR A ;обнуление аккумулятора + JP x15F8 ;копирование + +;Адрес #1653. Проверка состояния файла. Номер файла задайте в регистре A. Возвращает Z, если файл стерт и NZ, если нет, а в A будет первый символ имени файла. + +x1653 CALL x165D ;чтение описателя файла + LD A,(#5CDD) ;берем первый символ имени файла + CP 1 ;проверка состояния файла + RET ;возврат + +;Адрес #165C. Чтение описателя файла. На входе в регистр A поместите номер файла. Описатель будет загружен по адресу #5CE5. Используется также с адресов: +;#165D - то же, что и #165C, но номер файла в регистре C. +;#165E - то же, что и #17E9, но сохраняет номер файла. + +x165C LD C,A ;перенос номера файла в рег. C +x165D XOR A ;переносим описатель из буфера в память +x165E PUSH BC ;сохранение номера файла + CALL x17E9 ;чтение сектора с описателем и перенос описателя + POP BC ;восстановление номера файла + RET ;возврат + +;Адрес #1664. запись информации о файле. Вход: описатель расположить по адресу #5CDD, а в аккумулятор поместить номер файла. + +x1664 LD C,A ;перенос в C номера файла + CALL x166B ;чтение сектора и замена описателя файла в нем + JP x1E43 ;перезапись сектора + +;Адрес #166B. Чтение в буфер сектора с описателем файла и замена описателя. Поместите описатель по адресу #5CDD. + +x166B LD A,#FF ;описатель перемещать из переменных в буфер + JR x165E ;то же, что и #17E9, но с сохранением BC + +;Адрес #166F. Резервирование места в памяти. Устанавливает #5CCF и #5D23. + +x166F LD A,#FF ;WORKSP использовалась + LD (#5D0E),A + CALL x1680 ;вычисление размера доступной памяти + LD HL,(#5C61) ;установка адреса рабочей области + LD (#5CCF),HL + JP x1E23 ;выделение места в памяти и возврат + +;Адрес #1680. Вычисление количества свободной памяти в секторах. Размер свободной памяти в байтах будет в BC, а в секторах ? в #5D23. + +x1680 RST #20 ;берем количество свободной памяти в байтах + DW #1F1A + LD HL,#FFFF + SBC HL,BC + LD A,H ;свободно меньше 16 секторов? + CP #10 + JR NC,x168F ;если да, то + LD A,#11 ;будем выделять 16 секторов +x168F DEC A ;1 сектор на всякий случай + LD (#5D23),A ;установка размера свободной памяти в секторах + LD B,A ;установка размера свободной памяти в байтах + LD C,0 + RET ;возврат + +;Адрес #1697. Помещает HL в #5CD7 и #5CDB и прибавляет #5CEA (1 байт) к #5CD9 (2 байта). + +x1697 LD (#5CD7),HL ;установка #5CD7 и #5CD9 + LD (#5CDB),HL + LD DE,(#5CEA) ;сложение #5CEA и #5CD9 + LD HL,(#5CD9) + LD D,0 + ADD HL,DE + LD (#5CD9),HL + RET ;возврат + +;Адрес #16AB. Выполнение команды MOVE. Установите #5C3B. + +x16AB CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x166F ;резервирование места в памяти + CALL x0405 ;настройка на диск + LD A,(#5E19) ;стертые файлы на диске есть? + OR A + JP Z,x03E1 ;если нет, то сообщение O.K. + LD HL,0 ;пока освободилось 0 секторов + LD (#5CD9),HL + LD C,#FF ;начнем с файла номер 0 +x16C3 INC C ;следующий файл + CALL x1653 ;он стерт? + JR NZ,x16C3 ;если нет, то следующий файл + LD A,C ;сохранение номера стираемого файла + LD (#5CD4),A + LD HL,(#5CEB) ;берем адрес стираемого файла на диске + LD (#5CD5),HL ;сохраняем его + CALL x1697 ;приращение счетчика освободившихся секторов +x16D6 INC C ;следующий файл + CALL x1653 ;он стерт? + JR Z,x16D6 ;если да, то следующий файл + CP 0 ;это конец каталога? + JP NZ,x1710 ;если нет, то меняем файлы местами + LD A,(#5CD4) ;берем номер стираемого файла + LD C,A +x16E5 INC C ;следующий файл + CALL x1653 ;это конец каталога? + CP 0 + JR Z,x176C ;если да, то реорганизация описателя диска + XOR A ;конец каталога + LD (#5CDD),A + CALL x1E40 ;запись описателя файла + CALL x1697 ;приращение счетчика освободившихся секторов + JR x16E5 ;повтор + +x16F9 call x1701 + ret nz + jr x170D + +x16FF db #FF,#FF + +x1701 in a,(#1F) + and #02 + cp b + ret nz + inc de + ld a,e + or d + jr nz,x1701 + ret + +x170D jp x3EE7 + + +x1710 LD A,(#5CEA) ;берем размер перемещаемого файла в секторах + LD (#5CD3),A ;сохраняем его + LD (#5CD1),A + LD HL,(#5CEB) ;берем адрес перемещаемого файла на диске + LD (#5CD5),HL ;сохраняем его + PUSH BC ;сохранение номера перемещаемого файла + CALL x17A5 ;перемещение файла + POP BC ;восстановление номера перемещаемого файла + LD HL,(#5CF4) ;перемещение продолжится с этого места + LD (#5CD5),HL + LD (#5CEB),HL + XOR A ;размер стертого файла - 0 секторов + LD (#5CEA),A + LD A,(#5CDD) ;сохранение первого символа имени файла + PUSH AF + LD A,1 ;файл стерт + LD (#5CDD),A + CALL x1E40 ;запись описателя стертого файла + POP AF ;восстановление первого символа имени файла + LD (#5CDD),A + LD A,(#5CD4) ;берем номер стертого файла + LD C,A + LD HL,(#5CDB) ;установка нового адреса перемещенного файла + LD (#5CEB),HL ;на диске + LD A,(#5CD1) ;восстановление размера перемещенного файла + LD (#5CEA),A ;на диске + CALL x1E40 ;запись описателя перемещенного файла + LD A,(#5CD4) ;берем номер файла после перемещенного + INC A + LD C,A + CALL x165D ;чтение его описателя + LD HL,(#5CD5) ;установка его нового адреса на диске + LD (#5CEB),HL + CALL x1E40 ;запись его описателя + LD A,(#5CD4) ;берем номер перемещенного файла + LD C,A + JP x16C3 ;повтор + +;Адpес #176C. Реорганизация описателя диска. Установите #5CCF, #5CD9 и #5CD5. + +x176C LD HL,(#5CCF) ;берем адрес рабочего пространства + LD BC,#1000 ;сокращаем его на #1000 байтов + CALL x1E2E + CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 + LD HL,(#5E0A) ;увеличение количества свободного места на + LD DE,(#5CD9) ;диске + ADD HL,DE + LD (#5E0A),HL + LD A,(#5E09) ;уменьшение количества файлов на диске на + LD HL,#5E19 ;число стертых + SUB (HL) + LD (#5E09),A + LD (HL),0 ;на диске больше нет стертых файлов + LD HL,(#5CD5) ;установка нового адреса свободного места на + LD (#5E06),HL ;диске + PUSH AF ;сохранение количества файлов на диске + CALL x1E43 ;запись сектора 8 дорожки 0 + POP AF ;восстановление количества файлов на диске + LD C,A + CALL x165D ;чтение описателя файла за последним + XOR A ;это конец каталога + LD (#5CDD),A + JP x0569 ;запись описателя файла и завершение + +;Адрес #17A5. Перемещение файла. Установите #5CD3, #5D23, #5CCF, #5CD5 и #5CD7. + +x17A5 LD A,(#5CD3) ;перемещен весь файл? + OR A + RET Z ;если да, то возврат + PUSH HL ;сохранение HL + LD HL,#5D23 ;буфера хватит на остаток? + SUB (HL) + POP HL ;восстановление HL + JR NC,x17DD ;если буфера не хватит, то перемещаем часть файла + LD A,(#5CD3) ;берем количество оставшихся секторов + LD B,A + XOR A ;переместили все + LD (#5CD3),A +x17BA PUSH BC ;сохранение количества перемещаемых секторов + LD HL,(#5CCF) ;берем адрес рабочей области + PUSH HL ;сохранение его + LD DE,(#5CD5) ;берем адрес части перемещаемого файла на старом месте + CALL x1E3D ;загрузка секторов + LD HL,(#5CF4) ;установка адреса следующей части файла + LD (#5CD5),HL + POP HL ;восстановление адреса рабочей области + POP BC ;и количества перемещаемых секторов + LD DE,(#5CD7) ;берем адрес части перемещаемого файла на новом месте + CALL x1E4D ;запись секторов + LD HL,(#5CF4) ;установка адреса следующей части файла + LD (#5CD7),HL + JR x17A5 ;повтор +x17DD LD (#5CD3),A ;установка количества оставшихся секторов + PUSH HL ;сохранение HL + LD HL,#5D23 ;берем длину рабочей области в секторах + LD B,(HL) + POP HL ;восстановление HL + XOR A ;обнуление аккумулятора + JR x17BA ;перемещение секторов + +;Адрес #17E9. Загрузка в буфер сектора с описателем файла и перенос описателя. В регистре C - номер файла, в A - направление перемещения (0 - в переменные, иначе - в прочитанный сектор). + +x17E9 PUSH AF ;сохранение направления перемещения + LD HL,#5CCC ;первый сектор каталога - 0 + LD (HL),0 + LD A,C ;определение номера сектора с описателем файла +x17F0 SUB #10 + JR C,x17F7 + INC (HL) + JR x17F0 +x17F7 ADD A,#10 ;берем номер описателя в секторе + LD C,A + PUSH BC ;сохраним его + CALL x03EC ;загрузка в буфер сектора с описателем + POP BC ;восстановление номера описателя в секторе + POP AF ;и направление перемещения + CALL x1CA4 ;определение адреса описателя файла в буфере + LD DE,#5CDD ;берем второй адрес для LDIR + LD BC,#10 ;берем длину описателя + OR A ;установка направления перемещения + JR Z,x180D + EX DE,HL +x180D LDIR ;перенос описателя файла + RET ;возврат + +;Адрес #1810. Выполнение команды VERIFY. Установите #5D11 и #5C3B. Используется также с адресов: +;#1815 - выполнение команды LOAD. Установите #5D11 и #5C3B; +;#1818 - выполнение команды LOAD, PEEK или POKE; Установите #5D11, #5C3B и #5D10. + +x1810 LD A,#FF ;верификация файла + LD (#5CF9),A +x1815 CALL x1852 ;обнуление #5D10 +x1818 CALL x1836 ;обработка параметров и загрузка файла + CALL x1D75 ;если идет проверка на синтаксис, то возврат + LD A,#FF ;выполняется команда LOAD + LD (#5D10),A + LD A,(#5CF9) ;выполняется VERIFY? + CP #FF + JP Z,x03E1 ;если да, то O.K. + LD A,(#5CE5) ;расширение файла B? + CP "B" + +;Внимание!!! Если была операция с одним сектором файла, то надо выходить независимо от расширения. + + JP Z,x012A ;если да, то обработка строки автостарта + JP x03E1 ;иначе O.K. + +;Адрес #1836. Обработка параметров для команды LOAD и загрузка файла. Установите #5D11, #5C3B, #5CF9 и #5D10. + +x1836 CALL x187A ;принятие параметров + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x18AB ;проверка параметров + JP x1921 ;загрузка файла и возврат + +;Адрес #1842. Обработка параметров для команды LOAD...CODE. Установите #5C5D на расширение файла. На выходе устанавливает #5CD6, #5CD9 и #5CDB. + +x1842 LD HL,(#5C5D) ;следующий символ строки ENTER? + INC HL + LD A,(HL) + CP #D + RET Z ;если да, то возврат + LD A,1 ;задан адрес загрузки + LD (#5CD6),A + CALL x1DEB ;прием одного или двух чисел +x1852 XOR A ;обнуление #5D10 + LD (#5D10),A + RET ;возврат + +x1857 CALL x102E ;прием расширения файла + LD A,"B" ;это "B"? + CP B + JR NZ,x1866 ;если да, то декремент CH_ADD, так как для + LD HL,(#5C5D) ;программы на бейсике расширение не + DEC HL ;указывается + LD (#5C5D),HL +x1866 CALL x1DEB ;прием чисел + LD HL,(#5CD9) ;установка адреса загрузки/записи сектора + LD (#5CD7),HL + LD HL,(#5CDB) ;установка номера сектора + LD (#5CD9),HL + XOR A ;обнуление #5CD6 + LD (#5CD6),A + RET ;возврат + +;Адрес #187A. Принятие параметров для команды LOAD. Вход: установите #5D11 и #5C3B. Выход: устанавливает #5CD2, #5CD7, #5CD9, #5CE5 и #5CD6 и читает описатель файла. + +x187A CALL x042B ;второй символ командной строки ENTER? + JP Z,x027B ;если да, то вход в командный процессор с вводом команды RUN "boot" + +;Ошибка!!! это некорректно, так как при ошибке вы попадете в командный процессор TR-DOS, а не вернетесь в бейсик. + + CALL x1DDF ;помещение имени файла на стек калькулятора + CALL x0572 ;операция со всем файлом? + CALL NZ,x1857 ;если нет, то прием расширения и двух чисел + CALL x1D8C ;берем текущий символ строки + CP #AF ;это CODE? + CALL Z,x1842 ;если да, то прием чисел, если они есть + CP #E4 ;это DATA? + PUSH AF ;сохранение результата проверки + CALL x0572 ;операция со всем файлом? + CALL Z,x102E ;если да, то прием расширения + POP AF ;восстановление результата проверки + CALL Z,x1BFC ;если символ DATA, то прием имени массива + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x292F ;установка имени файла и поиск файла + +;Адрес #18A4. Чтение описателя файла, если он был найден. Установите #5CDD, #5CE5 и флаг Z: при Z=1 происходит чтение описателя, иначе ошибка NO FILE. + +x18A4 JP NZ,x03D9 ;если файл не найден, то NO FILE + CALL x165D ;чтение описателя файла + RET ;возврат + +;Адрес #18AB. Обработка параметров для подпрограммы загрузки файла. На входе установите #5CD6, #5CD9 и #5CDB ; считайте описатель нужного вам файла. На выходе в #5CDB будет длина файла для загрузки, в #5CD6 0, если длина менялась, иначе 3. В HL будет адрес загрузки файла, в DE - его адрес на диске, в B - количество секторов для загрузки. При загрузке массива или программы на бейсике будет произведена подготовка памяти к загрузке. + +x18AB LD A,(#5CD6) ;берем флаг загрузки + OR A ;начало и длину брать из каталога? + LD HL,(#5CE6) ;берем начало файла из описателя + JR Z,x18B7 ;если параметры берем не из каталога, то + LD HL,(#5CD9) ;берем начальный адрес, назначенный нами +x18B7 LD DE,(#5CEB) ;берем адрес файла на диске + CP 3 ;все параметры назначены пользователем? + LD A,(#5CEA) ;берем размер файла в секторах + PUSH DE ;сохранение адреса файла на диске + LD DE,(#5CE8) ;берем длину файла из описателя + JR NZ,x18CB ;если нужно брать ее не оттуда, то берем + LD DE,(#5CDB) ;длину загрузки, назначенную нами +x18CB LD B,A ;сохранение размера файла в секторах + LD (#5CDB),DE ;установка длины файла для загрузки + LD A,(#5CE5) ;расширение файла C? + CP "C" + LD A,B ;восстановление длины файла в секторах + JR NZ,x18FD ;если расширение не C, то длину не менять + LD A,B ;если длина файла в байтах соответствует его + CP D ;размеру в секторах, то длина загрузки не меняется + JR Z,x18F6 + DEC A + CP D + LD A,B + JR Z,x18F6 + LD A,(#5CD6) ;длина назначена пользователем? + CP 3 + LD A,B ;восстановление размера файла в секторах + JR Z,x18F6 ;если мы сами назначили длину загрузки, то она не меняется + XOR A ;грузить только полностью заполненные сектора + LD (#5CD6),A + LD D,B ;вычисление длины файла в байтах из его длины + LD E,0 ;в секторах + LD (#5CDB),DE ;установка новой длины + JR x18F9 +x18F6 CALL x191B ;файл загружать весь +x18F9 LD A,B ;восстановление размера файла в секторах + CALL x1EAC ;вычисление количества секторов для загрузки +x18FD LD B,A ;сохранение его + LD A,(#5CE5) ;расширение файла C? + CP "C" + POP DE ;восстановление адреса файла на диске + RET Z ;если расширение файла C, то возврат + +;Ошибка!!! Если выполняется чтение или запись сектора файла, то здесь должен быть возврат. Из-за этой ошибки нельзя прочитать или записать сектор файла с расширением B или D. + + PUSH DE ;сохранение адреса файла на диске + CP "B" ;расширение B? + PUSH AF ;сохранение расширения файла + CALL Z,x1A01 ;если расширение B, то подготовка к загрузке программы на бейсике + POP AF ;восстановление расширения + CP "D" ;расширение D? + CALL Z,x1A4C ;если да, то подготовка к загрузке массива + CALL x191B ;длина загрузки не менялась + LD A,(#5CDC) ;берем количество секторов для загрузки + LD B,A + POP DE ;восстановление адреса файла на диске + RET ;возврат + +;Адрес #191B. Помещает число 3 по адресу #5CD6. + +x191B LD A,3 + LD (#5CD6),A + RET + +;Адрес #1921. Загрузка/верификация файла, а также загрузка/запись сектора файла. Вход: установите #5CF9, #5D10, #5CD7, #5CDB, в HL - адрес загрузки, в DE - адрес файла на диске, в B - количество секторов для загрузки. + +x1921 CALL x0572 ;выполняется загрузка или верификация? + JR Z,x192D ;если да, то выполнение операций со всем файлом + PUSH AF ;сохранение флага операции + CALL x1A94 ;вычисление адреса сектора на диске + POP AF ;восстановление флага операции + CP #FF ;чтение сектора файла? +x192D PUSH AF + CALL Z,x195C ;если да, то чтение сектора или операция с файлом + POP AF + JR Z,x1937 ;и завершение загрузки или верификации + JP x1E4D ;иначе запись сектора и возврат +x1937 LD A,(#5CD6) ;загружать весь файл? + CP 3 + +;Не нужно этого делать!!! Лучше так: +;LD A,(#5D10) +;OR A +;и PEEK будет работать правильно. Не будет грузится мусор после загруженного сектора. ведь если в #5CD6 находится 0, то младший байт длины всегда равен 0 и #1946 не будет работать. + + CALL Z,x1946 ;если да, то загрузка или верификация конца файла + LD HL,(#5C59) ;отметка конца программы на бейсике + DEC HL + LD (HL),#80 + RET ;возврат + +;Адрес #1946. Загрузка или верификация конца файла. Установите #5CF4, #5CDB и #5CF9. + +x1946 LD A,(#5CF9) ;верификация? + CP #FF + JP NZ,x2FDE ;если нет, то загрузка конца файла + LD A,(#5CDB) ;файл занимает сектора без остатка? + OR A + RET Z ;если да, то возврат + LD C,A ;берем длину остатка + LD B,1 ;1 сектор + LD DE,(#5CF4) ;текущее место диска + JR x196A ;верификация конца файла и возврат + +;Адрес #195C. Загрузка/верификация файла, а также загрузка сектора файла. Установите #5CF9 ,в DE поместите адрес файла на диске, в HL - адрес файла в памяти, в B - длину файла в секторах. Используется также с адреса #196A для верификации заданного количества байтов (все для #195C, кроме #5CF9 плюс в B ? количество байтов). + +x195C LD A,(#5CF9) ;верификация? + CP #FF + JP NZ,x1E3D ;если нет, то загрузка секторов и возврат + LD (#5CF4),DE ;запомним адрес файла на диске + LD C,0 ;в секторе #100 байтов +x196A LD A,B ;верифицируем 0 секторов? + OR A + RET Z ;если да, то возврат + LD (#5CD7),HL ;сохранение адреса файла в памяти + LD (#5CD9),DE ;сохранение адреса файла на диске +x1974 PUSH BC ;сохранение количества секторов + LD B,1 ;загружать 1 сектор + LD DE,(#5CD9) ;с текущего места диска + LD HL,#5D25 ;в буфер + CALL x1E3D ;загрузка сектора + LD HL,(#5CF4) ;адрес следующего сектора на диске + LD (#5CD9),HL + POP BC ;восстановление количества секторов + LD HL,(#5CD7) ;берем адрес файла в памяти + LD DE,#5D25 ;адрес сектора в буфере +x198E LD A,(DE) ;сравнение их + CP (HL) + JR NZ,x199D ;если несовпадение, то VERIFY ERROR + INC HL ;следующие байты + INC DE + DEC C + JR NZ,x198E ;повтор до конца + LD (#5CD7),HL ;установка следующего адреса + DJNZ x1974 ;повтор до конца + RET ;возврат +x199D LD HL,x276B ;адрес сообщения VERIFY ERROR + LD A,#D ;код ошибки - #D + JP x1C4A ;обработка ошибок + +;Адрес #19A5. Выполнение команды PEEK. Установите #5D11 и #5C3B. + +x19A5 LD A,#FF ;код функции PEEK + JR x19AB ;выполнение команды + +;Адрес #19A9. Выполнение команды POKE. Установите #5D11 и #5C3B. Используется также с адреса #19AB (выполнение команды LOAD, PEEK или POKE; Установите #5D11 и #5C3B, а в аккумулятор поместите код функции). + +x19A9 LD A,#EE ;код функции POKE +x19AB LD (#5D10),A ;установка кода функции + JP x1818 ;выполнение команды + +;Адрес #19B1. Выполнение команды MERGE. Установите #5D11 и #5C3B. + +x19B1 LD A,#FF ;использовалась рабочая область + LD (#5D1F),A + +;Ошибка!!! Флаг состояния рабочей области находится по адресу #5D15. + + CALL x187A ;обработка параметров + CALL x1D75 ;если идет проверка на синтаксис, то возврат + LD A,(#5CE5) ;расширение файла B? + CP "B" + JP NZ,x1D1A ;если нет, то ошибка + LD BC,(#5CE6) ;установка длины файла для загрузки + LD (#5CDB),BC + PUSH BC ;сохранение ее + INC BC ;оставим место для байта #80 + RST #20 ;выделение места в рабочей области + DW #0030 + LD (HL),#80 ;маркер конца программы + EX DE,HL ;переброска адреса загрузки в HL + POP DE ;снятие со стека длины файла + PUSH HL ;сохранение адреса загрузки + LD DE,(#5CEB) ;берем адрес файла на диске + CALL x191B ;загружать весь файл + LD A,(#5CDC) ;берем длину файла в блоках + LD B,A + CALL x1852 ;операция со всем файлом + CALL x1921 ;загрузка файла + POP HL ;восстанавливаем адрес загрузки + LD DE,(#5C53) ;берем адрес программы на бейсике + RST #20 ;объединение программ + DW #08D2 + JP x03E1 ;сообщение O.K. + +;Адрес #19F2. Проверка места в памяти для резервирования нового пространства вместо старого. В HL - старая длина, в DE - новая. Используется также с адреса: +;#19FD (проверка наличия пространства в памяти; длина пространства должна быть в DE). + +x19F2 EX DE,HL + SCF ;вычисление разности длин + SBC HL,DE + RET C ;если новая длина меньше старой, то возврат + LD DE,#A ;должно остаться еще #A байтов + ADD HL,DE + LD B,H ;переброска разности длин в BC + LD C,L +x19FD RST #20 ;проверка наличия пространства в памяти + DW #1F05 + RET ;возврат + +;Адрес #1A01. Подготовка к загрузке программы на бейсике. + +x1A01 LD DE,(#5C53) ;берем адрес начала программы на бейсике + LD HL,(#5C59) ;берем адрес конца программы на бейсике + DEC HL + PUSH HL ;сохранение начала и конца программы + PUSH DE + SBC HL,DE ;вычисление длины программы на бейсике + LD DE,(#5CE6) ;берем длину программы с переменными + PUSH DE ;сохраняем ее + PUSH HL ;сохранение длины старой программы + LD HL,0 ;идет верификация? + LD A,(#5CF9) + CP #FF + JR Z,x1A20 ;если да, то длину не меняем + LD HL,5 ;иначе увеличим ее на 5 байтов +x1A20 ADD HL,DE + LD (#5CDB),HL ;установка длины загрузки + POP HL ;восстановление длины старой программы + LD A,(#5CF9) ;верификация? + CP #FF + JR NZ,x1A31 ;если нет, то подготовка памяти + POP DE ;снятие регистров со стека + POP DE + POP HL + JR x1A48 ;возврат +x1A31 CALL x19F2 ;проверка наличия места для программы + POP BC ;восстановление длины программы с переменными + POP DE ;восстановление начала программы + POP HL ;восстановление конца программы + PUSH BC ;сохранение длины программы + RST #20 ;стирание старой программы + DW #19E5 + POP BC ;восстановление длины программы + CALL x1E32 ;резервирование места для новой программы + INC HL ;установка переменной VARS + LD BC,(#5CE8) + ADD HL,BC + LD (#5C4B),HL +x1A48 LD HL,(#5C53) ;берем адрес загрузки программы + RET ;возврат + +;Адрес #1A4C. Подготовка памяти к загрузке массива. Установите #5CE8, #5CD7, #5CD9 и #5CF9. + +x1A4C LD DE,(#5CE8) ;загружать весь файл + LD (#5CDB),DE + LD HL,(#5CD7) ;берем адрес массива в памяти + LD A,(#5CF9) ;верификация? + CP #FF + RET Z ;если да, то возврат + LD HL,(#5CD9) ;берем адрес загрузки файла + PUSH HL ;сохраняем его +x1A61 CALL x19F2 ;проверка наличия места для массива + POP HL ;восстановление адреса загрузки файла + LD A,H ;он равен 0? + OR L + JR Z,x1A79 ;если да, то старый массив не убираем + LD HL,(#5CD7) ;берем начало старого массива + DEC HL + DEC HL + DEC HL + LD BC,(#5CD9) ;берем его длину + INC BC + INC BC + INC BC + CALL x1E2E ;стирание старого массива +x1A79 LD HL,(#5C59) ;берем начало области переменных + DEC HL + LD BC,(#5CE8) ;берем длину файла + PUSH BC ;сохраняем ее + INC BC + INC BC + INC BC + CALL x1E32 ;резервирование места для нового массива + INC HL ;установка имени массива + LD A,(#5CD2) + LD (HL),A + INC HL ;восстановление и установка длины массива + POP DE + LD (HL),E + INC HL + LD (HL),D + INC HL ;берем адрес тела массива + RET ;возврат + +;Адрес #1A94. Вычисление адреса сектора файла на диске по его номеру в файле. Вход: установите #5CD7 и #5CD9 и поместите в регистр B длину файла в секторах, а в DE - адрес файла на диске. Выход: в DE будет адрес сектора на диске, а в B помещается 1. + +x1A94 LD A,(#5CD9) ;берем номер сектора в файле + LD C,B + LD B,A + LD A,C + CP B ;он меньше, чем количество секторов в файле? + JR C,x1AB6 ;если нет, то ошибка + +;Внимание, ошибка!!! Вы не сможете загрузить последний сектор файла, т.к. его номер равен количеству секторов в файле. + + LD A,B ;он равен 0? + OR A + JP Z,x1D1A ;если да, то синтаксическая ошибка + DEC B ;он был равен 1? + JR Z,x1AB0 ;если да, то его адресом будет адрес файла + LD A,#10 ;на дорожке 16 секторов +x1AA7 INC E ;вычисление адреса сектора на диске + CP E + JR NZ,x1AAE + LD E,0 + INC D +x1AAE DJNZ x1AA7 +x1AB0 LD B,1 ;загружать надо 1 сектор + LD HL,(#5CD7) ;берем адрес загрузки сектора + RET ;возврат +x1AB6 LD HL,x29ED ;адрес сообщения REC.O/F + LD A,5 ;код ошибки - 5 + JP x1C4A ;обработка ошибки + +;Адрес #1ABE. Проверка наличия файла и свободного места в каталоге. Имя файла поместите на стек калькулятора. Используется также с адреса #1AC4 (проверка наличия свободного места в каталоге диска). + +x1ABE CALL x292F ;установка имени и поиск файла + JP Z,x1C50 ;если нашли, то FILE EXISTS +x1AC4 CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 + LD A,(#5E09) ;на диске 128 файлов? + CP #80 + JP Z,x2723 ;если да, то сообщение DIRECTORY FULL + RET ;иначе возврат + +;Адрес #1AD0. Выполнение команды SAVE. Установите #5C3B и #5D11. Используется также с адресов: +;#1B27 - запись программы на бейсике. Установите #5CDD и #5CE5. +;#1B53 - запись файла. Установите #5CDD, #5CE5, #5CD7, #5CD9 и #5CDB. + +x1AD0 CALL x1852 ;обнуление #5D10 + LD HL,0 ;автостарт бейсика не производить + LD (#5CD1),HL + CALL x1DDF ;помещение имени файла на стек калькулятора + CALL x1D8C ;берем текущий символ + CP #AF ;это CODE? + JR Z,x1B39 ;если да, то прием начала и длины + CP #CA ;это LINE? + JR NZ,x1AF8 ;если нет, то проверка остальных расширений + CALL x1E0B ;прием строки автостарта бейсика + CALL x1D75 ;если проверка на синтаксис, то возврат + LD HL,(#5CDB) ;установка строки автостарта бейсика + LD (#5CD1),HL + LD HL,#5CE5 + JR x1B1F ;переход на запись бейсика +x1AF8 CP #AA ;текущий символ SCREEN$? + JR NZ,x1B0D ;если нет, то проверка расширения DATA + LD HL,#4000 ;начало файла - #4000 + LD (#5CD7),HL + LD HL,#1B00 ;его длина - #1B00 байтов + LD (#5CD9),HL + LD (#5CDB),HL + JR x1B48 ;запись файла с расширением C +x1B0D CALL x1D75 ;если проверка на синтаксис, то возврат + CALL x1D8C ;берем текущий символ + LD HL,#5CE5 + CP #E4 ;это DATA? + JR Z,x1B2C ;если да, то запись массива + CP #D ;это ENTER? + JP NZ,x1D1A ;если нет, то ошибка +x1B1F LD (HL),"B" ;расширение B + CALL x1ABE ;проверка наличия такого файла и свободного места в каталоге + CALL x1E1C ;удаление из командной строки пятибайтных чисел +x1B27 CALL x1BDE ;установка начала и длины файла + JR x1B53 ;запись файла +x1B2C LD (HL),"D" ;расширение D + CALL x1ABE ;проверка наличия файла и места в каталоге + CALL x1C0F ;установка начала и длины файла + JR NC,x1B53 ;если все в порядке, то запись файла + JP C,x1D1A ;иначе ошибка +x1B39 CALL x1DE5 ;принятие начала и длины файла + LD HL,(#5CD9) ;установка начала файла + LD (#5CD7),HL + LD HL,(#5CDB) ;установка длины файла + LD (#5CD9),HL +x1B48 CALL x1D75 ;если проверка на синтаксис, то возврат + LD A,"C" ;расширение C + LD (#5CE5),A + CALL x1ABE ;проверка наличия файла и места в каталоге +x1B53 CALL x1B59 ;запись файла + JP x0569 ;запись информации о нем + +;Адрес #1B59. Запись файла. Установите #5CD1, #5CD7, #5CD9 и #5CDB, а в буфер загрузите сектор 8 дорожки 0. + +x1B59 LD HL,(#5CD7) ;установка начала файла + LD (#5CE6),HL + EX DE,HL ;переброска его в DE + LD HL,(#5CD9) ;берем длину файла + LD A,L ;она равна 0? + OR H + JP Z,x1D1A ;если да, то ошибка + LD A,L ;вычисление длины файла в секторах + OR A + JR Z,x1B6D + INC H +x1B6D LD A,H ;установка длины файла в секторах + LD (#5CEA),A + LD E,A ;вычисление нового количества свободных секторов + LD D,0 + LD HL,(#5E0A) + SBC HL,DE + JP C,x1C45 ;если на диске нет места, то ошибка +x1B7B PUSH HL ;сохранение нового количества свободных секторов + LD HL,(#5C59) ;добавление к программе на бейсике байта #AA + LD (HL),#AA + INC HL + LD DE,(#5CD1) ;и номера строки автостарта + LD (HL),E + INC HL + LD (HL),D + LD HL,(#5CDB) ;установка длины файла + LD (#5CE8),HL + LD HL,(#5E06) ;установка адреса файла на диске + LD (#5CEB),HL + EX DE,HL ;переброска его в DE + LD HL,(#5CE6) ;берем начало файла + LD A,(#5CEA) ;берем его длину в секторах + LD B,A + CALL x1E4D ;запись файла + LD HL,(#5CF4) ;берем адрес свободного пространства диска + PUSH HL ;сохраняем его + CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 + POP HL ;восстановление адреса свободного места на диске + LD (#5E06),HL ;установка его + POP HL ;восстановление количества свободных секторов + LD (#5E0A),HL ;установка его + LD HL,#5E09 ;берем номер файла + LD A,(HL) + LD (#5D1E),A ;установка его + INC (HL) ;записали еще 1 файл + PUSH HL ;сохранение адреса с кол-вом файлов на диске + CALL x1E43 ;перезапись сектора 8 дорожки 0 + POP HL ;восстановление адреса с кол-вом файлов + LD C,(HL) ;берем номер записанного файла + DEC C + LD A,(#5CE5) ;расширение файла B? + CP "B" + CALL Z,x1BC8 ;если да, то установка длины программы без переменных + RET ;возврат + +;Адрес #1BC8. Установка длины программы на бейсике без переменных. Длину с переменными программа помещает в #5CE6, длину без переменных - в #5CE8. + +x1BC8 LD HL,(#5C59) ;вычисление длины программы с переменными + LD DE,(#5C53) + SCF + SBC HL,DE + LD (#5CE6),HL ;установка ее + LD HL,(#5C4B) ;вычисление длины только программы + SBC HL,DE + LD (#5CE8),HL ;установка ее + RET ;возврат + +;Адрес #1BDE. Установка начала и длины файла для записи программы на бейсике. + +x1BDE LD HL,(#5C4B) ;вычисление длины программы с переменными + LD DE,(#5C53) + SBC HL,DE + LD (#5CDB),HL ;установка длины файла для каталога + LD HL,(#5C53) ;установка начала файла + LD (#5CD7),HL + LD HL,(#5C59) ;вычисление длины файла с параметрами автозапуска + INC HL + INC HL + INC HL + SBC HL,DE + LD (#5CD9),HL ;установка действительной длины файла + RET ;возврат + +;Адрес #1BFC. Прием имени массива для команды LOAD...DATA. Вход: установите #5C5D на расширение файла и установите #5CF9. Выход: устанавливает #5CD2, #5CD7, #5CD9 и #5CDB. Используется также с адреса #1C0F (то же, что и #1C1B, но с обработкой ошибок). + +x1BFC CALL x1C1B ;поиск массива + RET NC ;если массив найден, то возврат + LD HL,0 ;старого массива нет + LD (#5CD9),HL + LD A,(#5CF9) ;идет загрузка? + CP #FF + RET NZ ;если да, то возврат + JP x1C13 ;ошибка +x1C0F CALL x1C1B ;поиск массива + RET NC ;если массив найден, то возврат +x1C13 LD A,#E ;код ошибки - #E + LD HL,x27DD ;адрес сообщения ARRAY NOT FOUND + JP x1C4A ;обработка ошибок + +;Адрес #1C1B. Поиск массива без обработки ошибок. Будут установлены #5CD2, #5CD7, #5CD9 и #5CDB. При ошибке флаг C будет установлен, иначе сброшен. + +x1C1B CALL x1E2A ;берем следующий символ + CALL x1D9B ;поиск массива + SET 7,C ;установка бита 7 в его имени + LD A,C ;установка его имени + LD (#5CD2),A + JR NC,x1C2B ;если массив найден, то установка его параметров +x1C29 SCF ;была ошибка + RET ;возврат +x1C2B JR NZ,x1C29 ;если флаг Z сброшен, то ошибка + INC HL ;берем длину массива + LD E,(HL) ;установка длины массива + INC HL + LD D,(HL) + INC HL + LD (#5CD7),HL ;установка адреса тела массива + LD (#5CDB),DE ;установка длины массива + LD (#5CD9),DE + CALL x1E2A ;следующий символ + CP ")" ;это ")"? + JR NZ,x1C2B ;если нет, то ошибка + RET ;возврат + +;Адрес #1C45. Обработка ошибки NO SPACE. Используется также с адреса #1C4A (обработка ошибок; в A - код ошибки, в HL - адрес сообщения). + +x1C45 LD HL,x29BB ;адрес сообщения NO SPACE + LD A,3 ;код ошибки - 3 +x1C4A CALL x03C3 ;если надо, то печать сообщения + JP x01D3 ;завершение + +;Адрес #1C50. Обработка ошибки FILE EXISTS. + +x1C50 LD HL,x29C5 ;адрес сообщения FILE EXISTS + LD A,2 ;код ошибки - 2 + JR x1C4A ;обработка ошибок + +;Адрес #1C57. Установка имени файла. Установите #5C5D на имя файла. Будет выбран дисковод и установлена переменная #5CDD. + +x1C57 LD HL,#5CDD ;адрес переменной с именем файла + LD B,8 ;ее длина - 8 байтов +x1C5C LD (HL)," " ;очистка ее + INC HL + DJNZ x1C5C + CALL x0531 ;снятие строки со стека калькулятора + EX DE,HL + CALL x1C81 ;установка дисковода + LD A,C ;имя файла - пустая строка? + OR A + +;Ошибка в программе!!! Здесь должно быть OR B. + + JP Z,x1D1A ;если да, то ошибка + CP 9 ;в имени файла больше 8 символов + JR C,x1C73 ;если да, то обрезаем его + LD C,8 + +;Внимание!!! Это будет работать неправильно при длине имени файла больше #FF символов. + +x1C73 LD A,(HL) ;берем первый символ имени файла + CP " " ;его код меньше #20? + JP C,x1D1A ;если да, то ошибка + LD DE,#5CDD ;адрес переменной с именем файла + PUSH BC ;сохранение длины имени + LDIR ;установка имени + POP BC ;восстановление длины имени + RET ;возврат + +;Адрес #1C81. Установка дисковода для операции с файлом. В HL поместите начало имени файла в ASCII представлении, а в BC ? его длину. HL установится на начало имени без дисковода, а в BC будет его длина. + +x1C81 INC HL ;берем адрес следующего символа имени + LD A,(HL) ;берем этот символ + CP ":" ;это двоеточие? + JR NZ,x1C98 ;если нет, то активизация дисковода по умолчанию + DEC HL ;берем адрес имени дисковода + LD A,(HL) ;берем имя дисковода + CALL x0524 ;преобразование имени дисковода в его номер + PUSH BC ;сохранение длины имени файла + PUSH HL ;и адреса имени дисковода + CALL x3DCB ;выбор дисковода + POP HL ;восстановление адреса имени дисковода + POP BC ;и длины имени файла + DEC BC ;отсекли 2 символа + DEC BC + INC HL ;берем адрес имени файла без дисковода + INC HL + RET ;возврат +x1C98 DEC HL ;берем адрес имени файла + LD A,(#5D19) ;берем дисковод по умолчанию + PUSH BC ;сохранение длины и адреса имени файла + PUSH HL + CALL x3DCB ;выбор дисковода + POP HL ;восстановление длины и адреса имени файла + POP BC + RET ;возврат + +;Адрес #1CA4. Определение адреса описателя файла в буфере по его номеру в секторе. В C должен быть номер описателя в секторе. На выходе в HL будет его адрес. + +x1CA4 LD L,C ;перевод номера описателя файла в двухбайтную + LD H,0 ;форму + ADD HL,HL ;умножение его на #10 + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD BC,#5D25 ;адресуемся от начала буфера + ADD HL,BC + RET ;возврат + +;Адрес #1CB0. Установка и проверка имени файла. Имя файла должно быть помещено на стек калькулятора. Выход: если файл с таким именем есть, то будет установлен флаг Z, а в рег. C и в #5D1E будет его номер, а если такого файла нет, то флаг Z сбросится. Используется также с адреса: +;#1CB3 (поиск файла, установите #5CDD и #5CE5, выход как и из #1CB0). + +x1CB0 CALL x1C57 ;установка имени файла +x1CB3 CALL x03E8 ;начнем с сектора 0 + LD B,#80 ;всего 128 файлов + LD C,0 ;начнем с нулевого описателя в секторе +x1CBA PUSH BC ;сохраним номер файла и счетчик + CALL x1CA4 ;определим начало описателя в буфере + CALL x050C ;проверка и обработка достижения конца буфера + POP BC ;восстановление номера описателя в секторе и + PUSH BC ;счетчика файлов без изменения стека + LD A,C ;просмотрен весь сектор? + CP #10 + JR NZ,x1CCD ;если да, то + POP BC ;снятие номера описателя и счетчика со стека + LD C,0 ;нулевой описатель в секторе + JR x1CBA ;повтор проверки +x1CCD LD DE,#5CDD ;берем адрес части описателя для проверки + LD A,(#5D06) ;берем длину этой части + LD B,A + XOR A ;конец каталога? + CP (HL) + JR NZ,x1CDB ;если нет, то переход на проверку описателя + POP BC ;снятие номера описателя и счетчика со стека + JR x1CE4 ;выход с флагом NZ +x1CDB CALL x2713 ;сравнение частей описателей + POP BC ;восстановление номера описателя и счетчика + JR Z,x1CE7 ;если части описателей совпали, то на выход + INC C ;следующий описатель + DJNZ x1CBA ;повтор до конца +x1CE4 OR #FF ;выключение флага Z + RET ;возврат +x1CE7 LD A,#80 ;определение номера файла + SUB B + LD C,A + LD (#5D1E),A ;помещение его в #5D1E + XOR A ;сброс флага Z + RET Z ;возврат + +;Адрес #1CF0. Поиск файла. Часть описателя, подлежащую проверке, установите по адресу #5CDD и установите #5D06. Если файл не найден, то будет сброшен флаг Z и в #5D0F будет #FF, а если найден, то включится флаг Z, а номер файла будет в рег. C и по адресам #5D0F и #5D1E. + +x1CF0 CALL x1CB3 ;поиск файла + LD HL,#5D0F + LD (HL),C ;загрузка регистра C в #5D0F + RET Z ;если файл найден, то возврат + LD (HL),#FF ;помещаем в #5D0F #FF + RET ;возврат + +;Адpес #1CFB. Выполнение команды RETURN. Установите #5C3B, #5D1C и #5D13. + +x1CFB CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x20E5 ;изменение памяти + RES 3,(IY+1) ;установка режима ввода "K" + CALL x0232 ;восстановление старого ERR_SP + LD SP,(#5D1C) ;восстановление стека + LD HL,(#5C3D) ;берем адрес перед адресом из ERR_SP + DEC HL + LD A,#12 ;там находится #12? + CP (HL) + JR NZ,x1D19 ;если нет, то возврат + DEC HL ;установка ERR_SP на адрес ниже + LD (#5C3D),HL +x1D19 RET ;возврат + +;Адрес #1D1A. Обработка синтаксической ошибки. Установите #5C3A, #5D0E, #5D15, и все для подпрограммы #1D3. Используется также с адреса: +;#1D29 (обработка ошибок; в A - код ошибки, в HL ? адрес сообщения). + +x1D1A BIT 7,(IY+0) ;код ошибки бейсика уже назначен? + JR Z,x1D25 ;если нет, то установка ошибки + LD A,#B ;NONSENCE IN BASIC + LD (#5C3A),A +x1D25 INC A ;получение кода ошибки DOS + LD HL,x29B2 ;адрес сообщения ERROR +x1D29 CALL x03C3 ;печать сообщения, если можно + JP x01D3 ;завершение + +;Адрес #1D2F. Обработка ошибки, поступившей из пзу бейсика без очистки стека. Установите #5C3A. + +x1D2F LD A,(#5C3A) ;берем код ошибки бейсика + LD HL,x27CA ;адрес сообщения *BREAK* + CP #14 ;BREAK INTO PROGRAM? + JR Z,x1D29 ;если да, то печать сообщения + CP #C ;BREAK - CONT REPEATS? + JR Z,x1D29 ;если да, то печать сообщения + LD HL,x27D2 ;адрес сообщения OUT OF RAM + CP 3 ;OUT OF MEMORY? + JR Z,x1D29 ;если да, то печать сообщения + LD HL,x27DD ;адрес сообщения ARRAY NOT FOUND + CP 1 ;VARIABLE NOT FOUND? + JR Z,x1D29 ;если да, то печать сообщения + JR x1D1A ;иначе сообщение *ERROR* + +;Адрес #1D4D. Выполнение команды RUN. Установите #5D11 и #5C3B. + +x1D4D CALL x1852 ;выполнять загрузку файла + CALL x1836 ;обработка параметров и загрузка файла + CALL x1D75 ;если идет проверка на синтаксис, то возврат + LD HL,(#5CE6) ;берем адрес загрузки файла по умолчанию + +;Ошибка!!! Ведь файл могли загрузить и по другому адресу. В подпрограмме #18AB надо сохранять в #5D20 действительный адрес загрузки файла, а здесь восстанавливать его. + + LD A,(#5CE5) ;расширение файла B? + CP "B" + JP Z,x012A ;если да, то запуск программы на бейсике + PUSH HL ;запуск программы в кодах + RET + +;Боже!!! Ну кто так делает!!! Во-первых, адрес программы при запуске должен быть в BC; во-вторых, надо совсем выйти из TR-DOS, иначе программа спятит при вызове #3D13; в третьих, куда программа будет возвращаться?; в четвертых... В общем, надо так (после CALL #1D75): +; LD A,(#5CE5) +; CP "D" +; JP Z,#1D1A +; CP "B" +; JP Z,#12A +; LD HL,START +; LD (#5D1A),HL +; JP #1D3 +; +;START CALL #232 +; LD BC,(#5D20) +; PUSH BC +; RET + +;Адрес #1D63. Очистка рабочей области памяти. + +x1D63 LD HL,#5D0E ;рабочую область очищать? + LD A,(HL) + CP #FF + LD (HL),0 ;рабочая область очищена + RET NZ ;если рабочая область очищена, то возврат + RST #20 ;очистка рабочей области + DW #16BF + RET ;возврат + +;Адрес #1D70. Проверка, идет ли проверка строки на синтаксис или выполнение команды. Если идет выполнение, то флаг Z будет сброшен, иначе установлен. + +x1D70 BIT 7,(IY+1) + RET + +;Адрес #1D75. Если идет проверка на синтаксис, то возврат из программы, вызвавшей эту подпрограмму. Установите #5C3B. + +x1D75 CALL x1D70 ;проверка, что делается + RET NZ ;если идет выполнение, то возврат + POP HL ;снятие адреса возврата в вашу программу + RET ;возврат по следующему адресу + +;Адрес #1D7B. Помещение числа на стек калькулятора. Установите #5C5D на символ перед числом. Если строка проверяется на синтаксис, то будет установлен флаг Z, а при выполнении он сброшен. + +x1D7B CALL x1E2A ;берем следующий символ строки + CALL x1DC1 ;помещение числа на стек калькулятора + JR x1D70 ;проверка, идет выполнение или проверка и возврат + +;Адрес #1D83. Открытие потока 0. Используется также с адреса #1D84 (открытие потока; номер в регистре A). + +x1D83 XOR A ;номер потока - 0 +x1D84 RST #20 ;открытие потока + DW #1601 + RET ;возврат + +;Адрес #1D88. Открытие потока 2. + +x1D88 LD A,2 ;номер потока - 2 + JR x1D84 ;открытие потока + +;Адрес #1D8C. Выборка текущего символа строки. Поместите его адрес в #5C5D. + +x1D8C RST #20 + DW #0018 + RET + +;Адрес #1D90. Ввод команды. + +x1D90 CALL x1D83 ;открытие потока 0 + RST #20 ;редактирование командной строки + DW #0F2C + RET ;возврат + +;Адрес #1D97. Очистка экрана и открытие потока 0. + +x1D97 RST #20 + DW #0D6B + RET + +;Адрес #1D9B. Поиск массива. Установите #5C5D на имя массива. Если массив найден, то в HL будет его адрес. + +x1D9B RST #20 + DW #28B2 + RET + +;Адpес #1D9F. Очистка низа экрана. + +x1D9F RST #20 + DW #0D6E + RET + +;Адрес #1DA3. Печать числа из регистра A. Используется также с адресов: +;#1DA4 (печать числа из регистра C), +;#1DA9 (печать числа из регистра BC). + +x1DA3 LD C,A ;переброска числа в C +x1DA4 LD B,0 ;перевод числа в двухбайтную форму + JP x1DA9 ;странная команда! +x1DA9 PUSH BC ;сохранение числа + CALL x20F1 ;изменение памяти + POP BC ;восстановление числа + RST #20 ;печать числа + DW #1A1B + CALL x20F1 ;восстановление памяти + RET ;возврат + +;Адрес #1DB5. Снятие строки со стека калькулятора. В DE будет адрес строки, в BC - ее длина. + +x1DB5 RST #20 + DW #2BF1 + RET + +x1DB9 RST #20 + DW #1E99 + RET + +;Адрес #1DBD. Помещение строки на стек калькулятора. Установите #5C5D на начало строки. + +x1DBD RST #20 + DW #1C8C + RET + +;Адрес #1DC1. Помещение числа из BC на стек калькулятора. + +x1DC1 RST #20 + DW #1C82 + RET + +;Адрес #1DC5. Установка CH_ADD на второй символ строки. Установите #5D11. + +x1DC5 LD HL,(#5D11) ;берем адрес строки команды + INC HL ;берем адрес ее второго символа + LD (#5C5D),HL ;помещаем его в CH_ADD + RET ;возврат + +;Адрес #1DCD. Принятие 2-х строк на стек калькулятора. Поместите в #5D11 адрес первой строки. + +x1DCD CALL x1DDF ;прием первой строки на стек калькулятора +x1DD0 CALL x1D8C ;берем текущий символ + CP "," ;это запятая? + JP NZ,x1D1A ;если нет, то ошибка + CALL x1E2A ;следующий символ + CALL x1DBD ;прием второй строки на стек калькулятора + RET ;возврат + +;Адрес #1DDF. Установка CH_ADD и помещение строки на стек калькулятора. Установите #5D11. + +x1DDF CALL x1DC5 ;установка CH_ADD + JP x1DBD ;помещение строки на стек калькулятора + +;Адрес #1DE5. Принятие одного или двух чисел после символа CODE. Первое число будет в #5CD9, второе - в #5CDB. Если было одно число, то оно будет в обеих ячейках. Если принято 2 числа, то в #5CD6 будет 3. На входе установите #5C5D и #5C3B. Используется также с адреса: +;#1E0B (принятие числа; установите #5C5D и #5C3B; число будет в #5CDB, а в #5CD6 будет 3). + +x1DE5 CALL x1D8C ;берем текущий символ строки + CP #AF ;это CODE? + RET NZ ;если нет, то возврат +x1DEB CALL x1D7B ;принятие числа на стек калькулятора + JR Z,x1DFB ;если идет проверка на синтаксис, то дальнейшая проверка + CALL x1DB9 ;снятие числа со стека калькулятора + LD (#5CD9),BC ;установка первого числа + LD (#5CDB),BC +x1DFB CALL x1D8C ;берем текущий символ + CP "," ;это запятая? + JR Z,x1E0B ;если да, то принятие второго числа + CP #D ;это ENTER? + JP NZ,x1D1A ;если нет, то ошибка + CALL x1D75 ;если строка проверяется на синтаксис, то возврат + RET ;возврат +x1E0B CALL x1D7B ;прием второго числа на стек калькулятора + RET Z ;если проверка на синтаксис, то возврат + CALL x1DB9 ;снятие числа со стека калькулятора + LD (#5CDB),BC ;помещение его в #5CDB + LD A,3 ;приняли 2 числа + LD (#5CD6),A + RET ;возврат + +;Адрес #1E1C. Удаление из командной стpоки пятибайтных чисел + +x1E1C LD HL,(#5D11) ;берем адрес строки команды + RST #20 ;удаление из нее пятибайтных чисел + DW #11A7 + RET ;возврат + +;Адрес #1E23. Выделение пространства в рабочей области. В BC поместите длину требуемого пространства. + +x1E23 LD HL,(#5C61) ;загрузка HL из #5C61 + RST #20 ;выделение пространства + DW #0030 + RET ;возврат + +;Адрес #1E2A. Выборка следующего символа строки. Установите #5C5D. + +x1E2A RST #20 + DW #0020 + RET + +;Адрес #1E2E. Удаление области памяти. В HL поместите начало области, в BC - длину. + +x1E2E RST #20 + DW #19E8 + RET + +x1E32 RST #20 + DW #1655 + RET + +;Адрес #1E36. Загрузка регистра дорожки. Установите #5CD1. При выходе по ошибке в #5D17 помещается #FF. Можно использовать с адреса: +;#1E3A для прямого вывода в порт #3F. + +x1E36 CALL x0A31 ;new определение номера дорожки, на которой стоит головка + LD A,H ;установка регистра дорожки +x1E3A OUT (#3F),A + RET ;возврат + +;Адрес #1E3D. Загрузка секторов. Вход: в HL - адрес загрузки, в D - номер дорожки, в E - номер сектора, в B - кол-во секторов. + +x1E3D XOR A ;признак загрузки + JR x1E64 ;переход к подпрограмме загрузки/записи секторов + +;Адрес #1E40. Запись информации о файле. На входе в C должен быть номер файла. Используется также с адресов: +;#1E43 - запись сектора из буфера. Вход: в #5CF4 установите номер сектора+1, а в #5CF5 - номер дорожки. +;#1E4D - запись секторов. В HL - адрес, в D - номер дорожки, в E - номер сектора, в B - кол-во секторов. +;#1E64 - загрузка/запись секторов. Предварительные установки как и для предыдущей подпрограммы плюс в A установите 0 для загрузки или что-нибудь другое для записи. + +x1E40 CALL x166B ;чтение сектора с описателем файла и замена описателя +x1E43 LD DE,(#5CF4) ;берем номер сектора для записи + DEC DE + LD B,1 ;записывать 1 сектор + LD HL,#5D25 ;записывать будем из буфера +x1E4D PUSH HL ;сохраним адрес секторов на диске и в памяти + PUSH DE + CALL x3E11 ;берем тип дисковода + BIT 7,(HL) ;он 40-дорожечный? + JR Z,x1E60 ;если да, то записывать можно + BIT 0,(HL) ;используем 40 дорожек на 80-дорожечном? + JR NZ,x1E60 ;если нет, то записывать можно + LD HL,x29D8 ;адрес сообщения READ ONLY + JP x1D29 ;переход на обработку ошибок + +;Внимание, ошибка!!! В аккумуляторе забыли установить код ошибки. + +x1E60 POP DE ;восстановление адресов секторов + POP HL +x1E62 LD A,#FF ;признак записи +x1E64 LD (#5CCE),A ;установка признака операции +x1E67 LD (#5CF4),DE ;установка адреса секторов на диске + PUSH BC ;сохранение количества секторов + PUSH HL ;и адреса загрузки / записи + CALL x1E36 ;чтение индексной области дорожки + POP HL ;восстановление адреса загрузки / записи + POP BC ;и количества секторов + XOR A ;количество секторов равно 0? + OR B + RET Z ;если да, то возврат +x1E75 PUSH BC ;сохраняем адрес и кол-во секторов + PUSH HL + CALL x3F06 ;установка адреса загрузки / записи секторов + LD A,(#5CF4) ;установка номера сектора + CALL x3F02 + LD A,(#5CF5) ;позиционирование головки на дорожку + CALL x3E63 + LD A,(#5CCE) ;берем флаг операции + OR A ;загрузка? + PUSH AF + CALL Z,x3F0E ;если да, то загрузка сектора + POP AF + CALL NZ,x3F0A ;иначе запись сектора + POP HL ;берем адрес следующего сектора + LD DE,#100 + ADD HL,DE + PUSH HL ;сохраняем его + LD A,#10 ;на дорожке 16 секторов + LD HL,#5CF4 + INC (HL) ;следующий сектор + CP (HL) ;конец дорожки? + JR NZ,x1EA7 ;если да, то номер следующего сектора 0 + LD (HL),0 + LD HL,#5CF5 ;и берем следующую дорожку + INC (HL) +x1EA7 POP HL ;восстановление адреса следующего сектора + POP BC ;и количества секторов + DJNZ x1E75 ;если не все, то повтор + RET ;возврат + +;Адрес #1EAC. Вычисление количества полных секторов файла из его длины в байтах. В A должно быть количество секторов файла, а в DE - длина загружаемой части файла. + +x1EAC PUSH HL ;сохранение HL + LD H,A ;берем полную длину файла + LD L,0 + PUSH HL ;сохраняем ее + SBC HL,DE ;она меньше длины загрузки? + CALL C,x1EBC ;если да, то загружать весь файл + POP HL ;восстановление полной длины файла + LD A,H ;вычисление количества полных секторов из полной длины файла + POP HL ;восстановление HL + RET C ;если полная длина файла больше длины загрузки, + LD A,D ;то количество полных секторов берем из длины загрузки + RET ;возврат + +;Адрес #1EBC. Обнуление #5CD6 и установка флага C. + +x1EBC XOR A + LD (#5CD6),A + SCF + RET + +;Адрес #1EC2. Выполнение команды FORMAT. Установите #5D11 и #5C3B. Используется также с адреса #1EDD (повторение форматирования; установите #5CDD). + +x1EC2 LD HL,#FFFF + LD (#5CD7),HL ;дорожки не проверять + LD (#5CD9),HL ;форматировать одну сторону диска + LD (#5CD1),HL ;ошибку при чтении адресного маркера игнорировать + CALL x042B ;следующий символ ENTER? + JP Z,x1D1A ;если да, то ошибка + CALL x1DDF ;прием имени диска на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x1C57 ;установка имени диска +x1EDD CALL x3E11 ;берем тип дисковода + AND #80 ;дисковод 40-дорожечный? + LD A,#28 ;форматировать 40 дорожек + JR Z,x1EE8 ;если дисковод 80-дорожечный, + LD A,#50 ;то форматировать 80 дорожек +x1EE8 LD (#5CD7),A ;установка количества дорожек + CALL x08A7 ;new восстановление + CALL x0B01 ;new выбор нижней стороны диска + CALL x3EA0 ;задержка в 3135098 тактов + LD E,1 ;форматирование дорожки с номером 1 + CALL x1FFD + CALL x1FEB ;выбор верхней стороны диска + LD E,0 ;форматирование дорожки с номером 0 + CALL x1FFD + LD A,(#5CDD) ;форматировать только одну сторону диска + CP "$" + JR Z,x1F1B ;если да, то форматирование диска + CALL x1FF6 ;выбор нижней стороны диска + CALL x3EA0 ;задержка в 3135098 тактов + CALL x3EB5 ;чтение адресного маркера + LD A,H ;номер дорожки - 1? + CP 1 + JR NZ,x1F1B ;если нет, то форматирование диска +x1F16 LD A,#80 ;форматировать обе стороны диска + LD (#5CDA),A +x1F1B CALL x20BD ;форматирование диска + LD HL,#5D25 ;адрес начала буфера + LD (HL),0 ;очистка первого байта + LD DE,#5D26 ;адрес второго байта буфера + LD BC,#FF ;осталось очистить #FF байтов + LDIR ;очистка буфера + LD BC,#5CD7 ;адрес переменной с количеством дорожек + LD DE,#5CDA ;адрес переменной с количеством сторон + LD A,(BC) ;форматировали 80 дорожек? + CP #50 + JR Z,x1F49 ;если да, то диск 80-дорожечный + LD A,(DE) ;форматировали 2 стоpоны? + CP #80 + JR Z,x1F42 ;если да, то диск 40-дорожечный двухстоpонний + LD A,#19 ;диск 40-дорожечный односторонний + LD HL,#270 ;свободно #270 сектора + JR x1F55 ;создание описателя диска +x1F42 LD A,#17 ;диск 40-дорожечный двухсторонний +x1F44 LD HL,#4F0 ;свободно #4F0 сектора + JR x1F55 ;создание описателя диска +x1F49 LD A,(DE) ;форматировали 2 стороны? + CP #80 + LD A,#18 ;если нет, то диск 80-дорожечный односторонний + JR NZ,x1F44 + LD A,#16 ;иначе диск 80-дорожечный двухсторонний + LD HL,#9F0 ;свободно #9F0 сектора +x1F55 LD (#5E08),A ;установка типа диска + LD (#5E0A),HL ;установка количества свободных секторов + LD A,1 ;первая свободная дорожка - 1 + LD (#5E07),A + LD A,#10 ;признак принадлежности диска к TR-DOS + LD (#5E0C),A + LD HL,#5E0F ;9 байтов #20 с адреса #5E0F + LD DE,#5E10 + LD BC,8 + LD (HL),#20 + LDIR + LD HL,#5CDD ;установка имени диска + LD DE,#5E1A + LD BC,8 + LDIR + CALL x0B54 ;new выбор верхней стороны диска + LD B,1 ;записать 1 сектор + LD DE,8 ;сектор 8 дорожки 0 + LD HL,#5D25 ;из буфера + CALL x1E62 ;запись сектора + LD A,(#5CD6) ;берем количество дефектных секторов + PUSH AF ;сохраняем его + XOR A ;расширение - CHR$ 0 + LD (#5CE5),A ;установка расширения + LD HL,(#5E0A) ;берем количество свободных секторов + LD (#5CD7),HL ;сохраняем его + LD HL,#5CDD ;печать имени диска + RST #18 + LD A,#D ;перевод строки + RST #10 + LD HL,(#5CD7) ;восстановление количества свободных секторов + POP AF ;восстановление количества дефектных секторов + PUSH HL ;сохранение количества свободных секторов + LD D,0 ;перевод количества дефектных секторов в + LD E,A ;двухбайтную форму + SBC HL,DE ;вычисление количества хороших секторов + LD B,H ;переброска его в BC + LD C,L + CALL x1DA9 ;печать его + LD A,"/" ;печать "/" + RST #10 + POP BC ;восстановление количества свободных секторов + CALL x1DA9 ;печать его + JP x01D3 + +;Адрес #1FB9. Таблица секторов для форматирования обычного диска. Используется также с адреса #1FBA для проверки дорожки. + +x1FB9 DB 1 +x1FBA DB 9,2,#A,3,#B,4,#C,5,#D,6,#E,7,#F,8,#10,1 + +;Адрес #1FCA. Определение количества дорожек дисковода. Вход: установите время перемещения головки дисковода. Выход: в #5CD7 и регистре A будет количество дорожек дисковода. + +x1FCA CALL x3E08 ;берем время перемещения головки + OR #11 ;позиционирование на дорожку #32 + LD B,A + LD A,#32 + CALL x3E44 + LD A,2 ;затем на дорожку 2 + CALL x3E44 + CALL x3DFD ;задержка в 725779 тактов + IN A,(#1F) ;головка в исходном положении? + AND 4 + LD A,#50 ;если нет, то у дисковода 80 дорожек + JR Z,x1FE7 + LD A,#28 ;иначе 40 +x1FE7 LD (#5CD7),A ;установка количества дорожек + RET ;возврат + +;Адрес #1FEB. Выбор верхней стороны диска. Установите #5D16. Используется также с адреса #1FF0 (загрузка системного регистра, код - в аккумуляторе). Вы можете также использовать с адреса: +;#1FF3 для прямого вывода в порт #FF. + +x1FEB LD A,(#5D16) ;берем копию системного регистра + OR #3C ;формат MFM, верхняя сторона, выключение сброса и готовности +x1FF0 LD (#5D16),A ;запоминаем копию системного регистра +x1FF3 OUT (#FF),A ;установка системного регистра + RET ;возврат + +;Адрес #1FF6. Выбор нижней стороны диска. Установите #5D16. + +x1FF6 LD A,(#5D16) ;берем копию системного регистра + AND #6F ;формат MFM, нижняя сторона, выключение сброса и готовности + JR x1FF0 ;установка системного регистра + +;Адрес #1FFD. Форматирование дорожки. В регистр Е поместите ее номер и спозиционируйте головку дисковода. Из переменных установите #5CD8, #5CE6, #5CE8 и обнулите #5CD6. Используется также с адреса #1FC9 (проверка дорожки; установите #5CD8, #5CE8 и обнулите #5CD6 и спозиционируйте головку). + +x1FFD DI ;запрет прерываний + LD A,#F4 ;запись дорожки + OUT (#1F),A + LD HL,#1FB9 ;берем адрес таблицы секторов для форматирования + LD C,#7F ;адрес регистра данных +x2007 LD B,#A ;#A раз #4E (первый пробел) + LD D,#4E + CALL x20B1 ;запись байта заданное число раз + LD B,#C ;синхропромежуток + LD D,0 + CALL x20B1 + LD B,3 ;синхроимпульс + LD D,#F5 + CALL x20B1 + LD D,#FE ;1 раз #FE (адресная метка идентификатора) + CALL x20AF ;запись байта 1 раз + LD D,E ;номер дорожки + CALL x20AF + LD D,0 ;номер стороны (в TR-DOS всегда 0) + CALL x20AF + LD D,(HL) ;номер сектора из таблицы + CALL x20AF + LD D,1 ;длина сектора - #100 байтов + CALL x20AF + LD D,#F7 ;запись контрольной суммы + CALL x20AF + LD B,#16 ;второй пробел + LD D,#4E + CALL x20B1 + LD B,#C ;синхропромежуток + LD D,0 + CALL x20B1 + LD B,3 ;синхроимпульс + LD D,#F5 + CALL x20B1 + LD D,#FB ;адресная метка данных + CALL x20AF + LD B,0 ;данные (#100 нулей) + LD D,0 + CALL x20B1 + LD D,#F7 ;запись контрольной суммы + CALL x20AF + LD B,#32 ;третий пробел + LD D,#4E + CALL x20B1 + LD A,(HL) ;берем адрес номера следующего сектора + INC HL + CP #10 ;конец таблицы? + JR NZ,x2007 ;если нет, то форматирование следующего сектора + LD B,0 ;пробел до конца дорожки + CALL x20B1 + JP M,x2076 + CALL x20B1 +x2076 IN A,(#1F) ;берем состояние контроллера + AND #40 ;запись запрещена? + JP NZ,x3F39 ;если да, то сообщение READ ONLY +x207D LD A,(#5CD8) ;дорожку проверять? + OR A + RET NZ ;если нет, то возврат + +;Внимание!!! Перед возвратом или выходом по ошибке надо разрешать прерывания. + + LD C,#7F ;адрес регистра данных + LD A,E ;установка номера дорожки + OUT (#3F),A + LD HL,#1FBA ;берем адрес таблицы секторов для проверки +x208A LD B,3 ;3 попытки + LD A,(HL) ;берем номер сектора из таблицы + OUT (#5F),A ;установка сектора + PUSH HL ;сохранение адреса таблицы секторов +x2090 DI ;запрет прерываний + LD A,#80 ;чтение сектора + OUT (#1F),A + PUSH BC ;сохранение количества попыток + CALL x3FE5 ;чтение данных по адресу из HL (в пзу, не страшно) + IN A,(#1F) ;все в порядке? + AND #7F + POP BC ;восстановление счетчика попыток + JR Z,x20A6 ;если все в порядке, то следующий сектор + DJNZ x2090 ;следующая попытка + LD HL,#5CD6 ;есть 1 битый сектор + INC (HL) +x20A6 POP HL ;восстановление адреса таблицы секторов + LD A,(HL) ;берем номер текущего сектора + INC HL ;берем адрес номера следующего сектора + CP 1 ;конец таблицы? + JR NZ,x208A ;если нет, то повтор + EI ;разрешение прерываний + RET ;возврат + +;Адрес #20AF. Запись байта 1 pаз. В регистр D поместите байт, в C - #7F и выдайте команду записи на вг-#5D. Используется также с адреса #20B1 (запись байта несколько раз; все для #20AF плюс в B количество выдач). + +x20AF LD B,1 ;запись 1 раз +x20B1 IN A,(#FF) ;ожидание DRQ или INTRQ + AND #C0 + JR Z,x20B1 + RET M ;если поступил INTRQ, то возврат + OUT (C),D ;выдача байта + DJNZ x20B1 ;повтор до конца + RET ;возврат + +;Адрес #20BD. Форматирование диска. Установите #5CDA, #5CD7, #5CE6 и #5CE8. + +x20BD call x0B0B ;берем число форматируемых дорожек + LD B,(HL) + XOR A ;дорожки проверять + INC HL + LD (HL),A + LD E,#FF ;начнем с дорожки 0 +x20C6 PUSH BC ;сохранение количества дорожек + INC E ;следующая дорожка + LD A,E + LD B,#1B ;позиционирование + CALL x3E44 + CALL x1FEB ;выбор верхней стороны диска + CALL x1FFD ;форматирование дорожки и возврат + LD A,(#5CDA) ;берем флаг количества сторон + CP #80 ;форматировать 2 стороны? + JR NZ,x20E1 ;если да, то + CALL x1FF6 ;выбор нижней стороны диска + CALL x1FFD ;форматирование дорожки и возврат +x20E1 POP BC ;восстановление количества дорожек + DJNZ x20C6 ;если еще не все, то повтор + RET ;возврат + +;Адрес #20E5. Удаление буфера с изменением памяти. На входе установите переменные #5CB6, #5CF8, #5D0C и #5D18. Выход: в #5D18 записывается #FF, а если в #5D0C выл 0, то туда также засылается #FF. Используется также с адреса: +;#20F1 (изменение памяти, работает только с #5CB6 и #5D18). + +x20E5 PUSH AF ;сохранение AF + LD A,(#5CF8) ;ничего не делать? + CP #FF + JR Z,x211C ;если да, то возврат + POP AF ;восстановление AF + CALL x2970 ;удаление буфера +x20F1 PUSH AF ;сохранение AF + LD A,(#5CB6) ;изменение разрешено? + CP #F4 + JR Z,x211C ;если нет, то возврат + XOR A + LD HL,#5D18 ;подтверждение есть? + OR (HL) + LD (HL),#FF ;в следующий раз подтверждение будет + JR Z,x211C ;если его не было, то возврат + LD A,(#5D0C) ;буфер есть? + OR A + LD HL,#5CC3 ;начало первого блока + LD DE,#5D33 ;начало второго блока + JR NZ,x2111 ;если есть буфер, то второй блок смещен на #101 + LD DE,#5E34 ;байтов +x2111 LD B,#2D ;длина блоков - #2D байтов +x2113 LD C,(HL) ;меняем блоки местами + LD A,(DE) + LD (HL),A + LD A,C + LD (DE),A + INC HL + INC DE + DJNZ x2113 +x211C POP AF ;восстановление AF + RET ;возврат + +;Адрес #211E. Очистка буфера редактора. + +x211E LD HL,(#5C59) ;берем адрес буфера редактора + LD (HL),#D ;ENTER + LD (#5C5B),HL ;установка курсора + INC HL ;конец области + LD (HL),#80 + RET ;возврат + +;Адрес #212A. Восстановление командной строки. Установите #5D20. + +x212A LD DE,(#5C59) ;символы переносить в буфер редактора + LD HL,#5D20 ;из #5D20 + CALL x02B0 ;перенос символов + RET ;возврат + +;Адрес #2135. Принятие команды. Установите #5D0F и если там не 0, то и #5D20. + +x2135 LD A,(#5D0F) ;ошибка была? + OR A + PUSH AF ;сохранение результата проверки + CALL NZ,x212A ;если да, то восстановление первых трех символов + +;Не надо этого делать!!! COPY портит буфер по адресу #5D20, а буфер редактора всегда остается цел. + + POP AF ;восстановление результата проверки + CALL Z,x211E ;если ошибки не было, то стирание старой строки + LD HL,(#5C59) ;эта команда тоже не нужна + CALL x3D80 ;перевод строки + LD A,(#5D19) ;берем номер дисковода по умолчанию + ADD A,"A" ;печать его имени + RST #10 + LD A,">" ;печать ">" + RST #10 + LD HL,#5C3A ;для нормального выхода из редактора + LD (HL),#FF + JP x1D90 ;ввод команды и возврат + +;Адрес #2158. Прием числа. CH_ADD установите на символ перед числом. Число, увеличенное на 1, будет помещено в #5CD7, а содержимое #5CDB будет скопировано в #5CD9. Число не должно равняться 0. + +x2158 CALL x1E2A ;следующий символ + CALL x1D8C + CP "," ;это запятая? + JP NZ,x1D1A ;если да, то ошибка + LD HL,(#5CDB) ;сохранение #5CDB + LD (#5CD9),HL + CALL x1E0B ;помещение числа на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + LD HL,(#5CDB) ;число pавно 0? + LD A,H + OR A + JP NZ,x1D1A ;если да, то ошибка + INC HL ;еще будет байт ENTER + LD (#5CD7),HL ;установка числа + LD HL,(#5CD9) ;восстановление #5CDB + LD (#5CDB),HL + RET ;возврат + +;Адрес #2182. Выполнение команды OPEN#. Установите #5D11 и #5C3B. + +x2182 LD HL,(#5D11) ;установка CH_ADD + LD (#5C5D),HL + CALL x1E0B ;принятие номера потока + CALL x1DD0 ;принятие имени файла на стек калькулятора +x218E CALL x1D8C ;берем текущий символ + CP "A" ;он меньше "A"? + JR NC,x219A ;если нет, то проверка режима файла + CALL x1E2A ;следующий символ + JR x218E ;повтор +x219A CP #A5 ;это RND? + PUSH AF ;сохранение символа и результата проверки + CALL Z,x2158 ;если это RND, то обработка длины записи + POP AF ;восстановление символа и результата проверки + JR Z,x21AE ;если это RND, то открытие потока + AND #DF ;буква заглавная + CP "R" ;это "R"? + JR Z,x21AE ;если да, то открытие потока + CP "W" ;это "W"? + JP NZ,x1D1A ;если нет, то ошибка +x21AE LD (#5D09),A ;сохранение буквы режима файла + CALL x1D75 ;если идет проверка на синтаксис, то возврат + LD A,"#" ;расширение файла - "#" + LD (#5CE5),A + LD A,0 ;поиск начинать с блока 0 + LD (#5CE6),A + CALL x21DB ;поиск последнего блока файла + PUSH AF ;сохранение флага результата поиска + CALL x220F ;проверка потока + POP AF ;восстановление флага результата поиска + PUSH AF ;сохранение флага результата поиска + CALL NZ,x2288 ;если файл не был найден, то создание блока 0 + POP AF ;восстановление флага результата поиска + CALL x2242 ;открытие потока + LD HL,(#5D11) ;коррекция переменной с адресом командной строки + LD BC,#124 + ADD HL,BC + LD (#5D11),HL + JP x01D3 ;завершение + +;Адрес #21DB. Поиск блока файла данных. Вход: поместите имя файла на стек калькулятора, установите #5CDD и #5D09 и поместите в #5CE6 номер первого блока файла. Выход: если файл найден, то будет считан описатель последнего или первого блока в зависимости от #5D09 и обнулен аккумулятор и установлен флаг Z; иначе флаг Z будет сброшен, а в аккумуляторе будет байт из #5D09. + +x21DB LD A,#A ;поиск файла ведем по #A байтам + LD (#5D06),A + CALL x1CB0 ;установка имени файла и поиск файла + PUSH AF ;сохранение результата поиска + CALL x0405 ;настройка на диск + POP AF ;восстановление результата поиска + JR NZ,x2206 ;если файл не найден, то проверка режима файла + LD A,(#5D09) ;открываем файл для чтения? + CP "R" + JR Z,x2201 ;если да, то выход +x21F1 LD HL,#5CE6 ;следующий блок + INC (HL) + CALL x1CB3 ;поиск блока + JR Z,x21F1 ;если блок найден, то следующий блок + LD HL,#5CE6 + DEC (HL) ;последний существующий блок + CALL x1CB3 ;определение его номера в каталоге +x2201 CALL x165D ;чтение его описателя + XOR A ;обнуление аккумулятора и установка флага Z + RET ;возврат +x2206 LD A,(#5D09) ;открываем файл для чтения? + CP "R" + RET NZ ;если да, то возврат + JP x03D9 ;сообщение NO FILE + +;Адрес #220F. Проверка занятости потока. Вход: установите #5CDB. Выход: в HL будет адрес элемента таблицы STRMS, отвечающего за данный поток. Используется также с адреса #2225 (то же, что и #1C4A). + +x220F LD A,(#5CDB) ;берем номер потока + RST #20 ;берем относительный адрес описателя потока, к + DW #1727 ;которому подключен канал + LD A,B ;поток занят? + OR C + JP NZ,x221B ;если да, то ошибка + RET ;возврат +x221B LD A,#19 ;код ошибки бейсика PARAMETER ERROR + +;Внимание!!! Лучше выдавать сообщение INVALID STREAM. + + LD (#5C3A),A + LD HL,x2804 ;адрес сообщения STREAM OPENED + LD A,#A ;код ошибки TR-DOS - #A +x2225 JP x1C4A ;обработка ошибки + +;Адрес #2228. Обработка ошибки NOT DISC FILE. + +x2228 LD A,#B ;код ошибки - #B + LD HL,x2812 ;адрес сообщения NOT DISC FILE + JR x2225 ;обработка ошибки + +;Адрес #222F. Инициализация признаков файла произвольного доступа. Установите #5CD7 и откройте канал файла данных. Подпрограмма помещает в A #7F. + +x222F PUSH HL ;сохранение HL + LD C,#20 ;берем адрес #20-го байта описателя канала + RST #28 + LD A,(#5CD7) ;установка длины записи + LD (HL),A + INC HL + XOR A + LD (HL),A ;адресация от начала записи - 0 + INC HL + LD (HL),A ;будет приниматься номер записи + INC HL + LD (HL),A ;сектор переписывать + LD A,#7F ;загрузка аккумулятора + POP HL ;восстановление HL + RET ;возврат + +;Адрес #2242. Создание описателя канала для файла данных и подключение к нему потока. Установите #5CDB. + +x2242 PUSH AF ;сохранение результата поиска файла + CALL x220F ;берем адрес элемента таблицы STRMS, отвечающего за поток + EX DE,HL ;сохранение его + LD HL,(#5C53) ;вычисление относительного адреса нового + LD BC,(#5C4F) ;описателя канала + SBC HL,BC + EX DE,HL ;восстановление адреса элемента таблицы STRMS + LD (HL),E ;установка относительного адреса описателя + INC HL ;канала + LD (HL),D + CALL x22B2 ;создание описателя канала + LD A,(#5D09) ;берем способ открытия файла + CP #A5 ;это RND? + CALL Z,x222F ;если да, то инициализация признаков файла произвольного доступа + JR Z,x226B ;и установка признака способа открытия файла + LD A,(#5D09) ;берем способ открытия файла + CP "R" ;это R? + LD A,#FF ;если да, то признак способа открытия файла - + JR NZ,x226B ;#FF + XOR A ;иначе это 0 +x226B LD (HL),A ;установка признака способа открытия файла + POP AF + JP x2270 +x2270 PUSH AF + LD BC,#14 ;берем адрес фрагмента текста в описателе + ADD HL,BC ;канала минус 1 + PUSH HL ;сохраняем его + CALL x2423 ;вычисление адреса текущего сектора файла на диске + POP HL ;восстановление адреса фрагмента текста минус 1 + INC HL + LD B,1 ;загружать 1 сектоp + POP AF ;восстановление результата поиска файла + OR A ;был создан новый файл? + PUSH AF ;сохранение результата проверки + CALL NZ,x1E4D ;если был создан новый файл, то запись сектора + POP AF ;сохранение результата проверки + CALL Z,x1E3D ;если файл существовал, то загрузка файла + RET ;возврат + +;Адрес #2288. Создание нулевого блока файла данных. + +x2288 LD HL,(#5CD7) ;сохранение #5CD7 + PUSH HL + LD HL,#2000 ;блок 0 + LD (#5CD7),HL + CALL x229A ;создание блока + POP HL ;восстановление #5CD7 + LD (#5CD7),HL + RET ;возврат + +;Адрес #229A. Создание блока файла данных. Установите #5CD7 и #5CDB, #5CDD и #5CE5. + +x229A LD HL,#1000 ;длина блока - #1000 байтов + LD (#5CD9),HL + CALL x1AC4 ;проверка наличия свободного места на диске + CALL x1B59 ;запись файла + LD HL,0 ;заполнено 0 байтов + LD (#5CE8),HL + CALL x166B ;замена описателя блока + JP x1E43 ;перезапись сектора с описателем и возврат + +;Внимание!!! После записи сектора надо снова открыть канал файла данных, так как при ошибке открывается поток 0. + +;Адрес #22B2. Создание описателя канала и открытие потока. + +x22B2 LD HL,(#5C53) ;открытие потока + DEC HL + LD (#5C51),HL + PUSH HL ;сохранение адреса описателя канала + LD BC,#124 ;его длина - #124 байта + CALL x1E32 ;создание области для описателя канала + LD A,0 ;заполнять область нулями + LD B,0 ;длина области - #100 байтов +x22C4 LD (DE),A ;очистка байта + DEC DE ;следующий адрес + DJNZ x22C4 ;повтор до конца + POP HL ;восстановление адреса описателя канала + PUSH HL ;и снова сохранение + LD DE,x3D0E ;адрес подпрогpаммы вывода в канал + LD (HL),E + INC HL + LD (HL),D + INC HL + LD DE,x3D06 ;адрес подпрограммы ввода из канала + LD (HL),E + INC HL + LD (HL),D + INC HL + LD (HL),"D" ;имя канала - "D" + INC HL ;пропуск четырех байтов + INC HL + INC HL + INC HL + INC HL + LD (HL),#24 ;байт #24 + INC HL + LD (HL),1 ;байт 1 + INC HL + LD A,(#5CF6) ;номер дисковода + LD (HL),A + INC HL + LD A,(#5D1E) ;номер последнего блока файла + LD (HL),A + INC HL + LD A,(#5D09) ;файл открывается для чтения? + CP "R" + LD (HL),0 ;если да, то пройдено 0 байтов + JR Z,x22FC ;иначе количество пройденных байтов берем из + LD A,(#5CE8) ;поля длины записанной части файла + LD (HL),A +x22FC INC HL + LD (HL),B + JR Z,x2304 + LD A,(#5CE9) + LD (HL),A +x2304 INC HL + EX DE,HL ;сохранение адреса #F-го байта описателя канала + POP HL ;восстановление адреса описателя канала + PUSH DE + LD DE,#10 ;адрес #10-го байта описателя канала + ADD HL,DE + EX DE,HL + LD HL,#5CDD ;установка описателя файла + LD BC,#10 + LDIR + POP HL ;восстановление адреса #F-го байта описателя канала + RET ;возврат + +;Адpес #2317. Вычисление адреса текущего символа файла данных в описателе канала. Откройте поток, связанный с файлом данных. На выходе адрес символа будет в HL. + +x2317 LD C,#D ;адрес #D-го байта описателя канала + RST #28 + LD C,(HL) ;берем номер текущего символа в текущем секторе файла + RST #28 ;вычисление смещения до символа + LD BC,#24 ;текст начинается с #24-го байта описателя канала + ADD HL,BC ;вычисление адреса символа + RET ;возврат + +;Адрес #2321. Вычисление адреса фрагмента текста в описателе канала. Откройте поток, связанный с файлом данных. Используется также с адреса #2323 (вычисление адреса байта в описателе текущего канала; откройте канал и поместите номер байта в C; на выходе в HL будет адрес байта). + +x2321 LD C,#24 ;текст начинается с #24-го байта +x2323 LD B,0 ;перевод номера байта в 2-х байтный формат + LD HL,(#5C51) ;берем адрес описателя текущего канала + ADD HL,BC ;вычисление адреса байта + RET ;возврат + +;Адрес #232A. Проверка достижения конца сектора в описателе канала. Откройте поток, связанный с файлом данных. При достижении конца сектора будет загружен следующий. Если достигнут конец блока, а следующий отсутствует, то он будет создан. + +x232A LD C,#D ;адрес #D-го байта описателя канала + RST #28 + INC (HL) ;следующий байт + RET NZ ;если не конец сектора, то возврат + PUSH HL ;сохранение адреса #D-го байта описателя канала + CALL x2443 ;установка дисковода + CALL x23FC ;запись текущего сектора + POP HL ;восстановление адреса #D-го байта описателя канала + INC HL ;#E-ый байт + INC (HL) ;следующий сектор + PUSH HL ;сохранение адреса #E-го байта описателя канала + CALL x2418 ;загрузка сектора + POP HL ;восстановление адреса #E-го байта описателя канала + LD A,#10 ;в блоке 16 секторов + CP (HL) ;конец блока? + RET NZ ;если нет, то возврат + PUSH HL ;сохранение адреса #E-го байта описателя канала + LD C,#F ;#F-ый байт + RST #28 + LD A,(HL) ;файл прямого доступа? + CP #7F + POP HL ;восстановление адреса #E-го байта описателя канала + JR Z,x2358 ;если файл прямого доступа, то проверка наличия следующего блока + LD HL,(#5C51) ;берем адрес описателя канала + CALL x26E1 ;запись описателя блока + LD C,#E ;#E-ый байт + RST #28 + JP x2379 ;создание следующего блока файла +x2358 CALL x23CF ;поиск следующего блока файла + PUSH AF ;сохранение результата поиска + CALL Z,x2418 ;если блок найден, то загрузка сектора из блока + LD C,#E ;#E-ый байт + RST #28 + POP AF ;восстановление результата поиска блока + CALL NZ,x2370 ;если блок не был найден, то создание его + RET ;возврат + +;Адрес #2367. Помещение в D числа #20, в E - содержимого #19-го байта описателя канала и обнуление байта по адресу, помещенному в HL. Откройте нужный канал. + +x2367 LD (HL),0 ;обнуление байта + LD C,#19 ;берем адрес #19-го байта описателя канала + RST #28 + LD D,#20 ;помещение в регистр D числа #20 + LD E,(HL) ;помещение в E числа из #20-го байта описателя канала + RET ;возврат + +;Адрес #2370. Создание блока файла данных. Откройте поток, связанный с файлом данных. + +x2370 CALL x2367 ;берем номер создаваемого блока + LD (#5CD7),DE ;установка его + JR x2381 ;создание и возврат + +;Адрес #2379. Cоздание блока файла данных. Откройте поток, связанный с файлом данных, используется, также, с адреса #2381 (создание блока файла данных; установите #5CD7 и #5CDB, #5CDD и #5CE5). + +x2379 CALL x2367 ;берем номер текущего блока + INC E ;следующий блок + LD (#5CD7),DE ;установка номера блока +x2381 CALL x229A ;создание блока + CALL x2970 ;удаление буфера + +;Внимание!!! Если выполняется команда CAT# или LIST#, то буфеp удалять нельзя. + + LD C,#10 ;берем адрес #10-го байта описателя канала + RST #28 + EX DE,HL ;перенос его в DE + LD HL,#5CDD ;перенос описателя блока в описатель канала + LD BC,#10 + LDIR + LD C,#C ;#C-ый байт + RST #28 + LD A,(#5D1E) ;установка номера блока в каталоге + LD (HL),A + RET ;возврат + +;Адрес #239B. Проверка достижения конца сектора при чтении файла данных. Откройте поток, связанный с файлом данных. + +x239B LD C,#D ;адрес #10-го байта описателя канала + RST #28 + INC (HL) ;следующий байт сектора + RET NZ ;если не конец сектора, то возврат + INC HL ;#11-ый байт + INC (HL) ;следующий сектор + PUSH HL ;сохранение адреса #11-го байта описателя канала + CALL x2443 ;установка дисковода + LD C,#23 ;#23-ый байт + RST #28 + LD A,(HL) ;это 0? + OR A + JR Z,x23B6 ;если да, то сектор не переписывать + POP HL ;восстановление адреса #11-го байта описателя канала + PUSH HL ;и снова сохранение его + DEC (HL) ;восстановление номера текущего сектора + CALL x23FC ;запись сектора + POP HL ;восстановление адреса #11-го байта описателя канала + PUSH HL ;и снова сохранение его + INC (HL) ;следующий сектор +x23B6 CALL x2418 ;загрузка сектора + POP HL ;восстановление адреса #11-го байта описателя канала + LD A,#10 ;в блоке 16 секторов + CP (HL) ;конец блока? + CALL Z,x23C1 ;если да, то открытие следующего + RET ;возврат + +;Адрес #23C1. Открытие следующего блока файла данных. Откройте поток, связанный с файлом данных, поместите в HL адрес #E-го байта описателя канала и установите #5D06. + +x23C1 CALL x23CF ;поиск следующего блока файла данных + PUSH AF ;сохранение результата поиска + CALL x2970 ;удаление буфера + +;Внимание!!! Hадо проверять #5D16, так как если выполняется команда CAT#, или LIST#, то буфер удалять нельзя. + + POP AF ;восстановление результата поиска блока + JP NZ,x2492 ;если блок не найден, то END OF FILE + JP x2418 ;загрузка сектора из блока + +;Адрес #23CF. Поиск следующего блока файла данных. Откройте поток, связанный с файлом данных, поместите в HL адpес #E-го байта описателя канала и установите #5D06. Если блок найден, то флаг Z будет включен, иначе выключен. + +x23CF LD (HL),0 ;номер текущего сектора - 0 + LD C,#19 ;#19-ый байт описателя потока + RST #28 + INC (HL) ;следующий блок + LD C,#10 ;#10-ый байт + RST #28 + LD DE,#5CDD ;установка описателя блока + LD BC,#10 + LDIR + CALL x1CB3 ;поиск блока + +;Внимание!!! После поиска блока надо снова открывать поток, связанный с файлом данных, так как при дисковых ошибках открывается поток 0. + + RET NZ ;если блок не найден, то возврат + +;Адрес #23E4. Открытие блока. Номер блока в каталоге поместите в A. + +x23E4 CALL x165D ;чтение описателя блока + +;Внимание!!! После чтения описателя надо снова открывать поток, связанный с файлом данных, так как при дисковых ошибках открывается поток 0. + + LD C,#10 ;берем адрес #10-го байта описателя канала + RST #28 + EX DE,HL ;переброска его в DE + LD HL,#5CDD ;перенос описателя блока в описатель канала + LD BC,#10 + LDIR + LD C,#C ;#C-ый байт + RST #28 + LD A,(#5D1E) ;установка номера блока в каталоге + LD (HL),A + XOR A ;обнуление аккумулятора + RET ;возврат + +;Адрес #23FC. Запись текущего сектора файла данных. Откройте поток, связанный с файлом. + +x23FC CALL x2423 ;вычисление адреса текущего сектора файла на диске + CALL x2321 ;вычисление адреса текущего фрагмента текста в описателе канала + LD B,1 ;записывать 1 сектор + CALL x1E4D ;запись сектора + +;Внимание!!! После записи сектора надо снова открывать поток, связанный с файлом данных, так как при дисковой ошибке открывается поток 0. + + LD C,#F ;#F-ый байт описателя канала + RST #28 + LD A,(HL) ;файл прямого доступа? + CP #7F + RET Z ;если да, то возврат + CALL x2321 ;вычисление адреса текущего фрагмента текста в описателе канала + XOR A ;сектор заполнять нулями + LD B,A ;длина его - #100 байтов +x2413 LD (HL),A ;очистка байта + INC HL ;следующий байт + DJNZ x2413 ;повтор до конца + RET ;возврат + +;Адрес #2418. Загрузка текущего сектора в описатель канала. Откройте поток, связанный с файлом данных. + +x2418 CALL x2423 ;вычисление адреса текущего сектора на диске + CALL x2321 ;вычисление адреса сектора в описателе канала + LD B,1 ;загружать 1 сектор + JP x1E3D ;загрузка сектора и возврат + +;Внимание!!! После загрузки сектора надо снова открывать канал, связанный с файлом данных, так как при ошибках открывается поток 0. + +;Адрес #2423. Вычисление адреса текущего сектора файла на диске. Откройте поток, связанный с файлом данных. На выходе в DE будет адрес сектора на диске. + +x2423 LD HL,(#5C51) ;берем адрес #1E-го байта описателя канала + LD BC,#1E + ADD HL,BC + LD E,(HL) ;берем адрес файла на диске + INC HL + LD D,(HL) + LD C,#E ;#E-ый байт + RST #28 + LD B,(HL) ;берем номер текущего сектора файла + DEC B ;он равен 0? + INC B + PUSH AF ;сохранение AF + LD A,#10 ;на дорожке #10 секторов + JR Z,x2441 ;если номер текущего сектора файла pавен 0, то выход +x2438 INC E ;следующий сектор + CP E ;конец дорожки? + JR NZ,x243F ;если да, то + LD E,0 ;сектор 0 + INC D ;и следующая дорожка +x243F DJNZ x2438 ;повтор до конца +x2441 POP AF ;восстановление AF + RET ;возврат + +;Адрес #2443. Установка дисковода для операций с файлом данных. Откройте поток, связанный с файлом. + +x2443 LD C,#B ;берем адрес #B-го байта описателя канала + RST #28 + LD A,(HL) ;берем номер дисковода, на котором находится файл + JP x3DCB ;выбор дисковода + +;Адрес #244A. Вывод символа в файл данных. Символ поместите в аккумулятор и откройте поток, связанный с файлом. + +x244A LD HL,#5CC2 ;адрес переключателя ПЗУ на бейсик + PUSH HL ;помещение его на стек + LD HL,x20F1 ;адрес подпрограммы изменения памяти + PUSH HL ;помещение его на стек + PUSH AF ;сохранение символа + CALL x20F1 ;изменение памяти + LD A,#A ;файл искать по #A байтам описателя + LD (#5D06),A + POP AF ;восстановление символа + CALL x24A2 ;работа с файлом прямого доступа + PUSH AF ;сохранение символа + CALL x2650 ;файл открывался для чтения? + JP Z,x249E ;если да, то ошибка + POP AF ;восстановление символа + CALL x2317 ;вычисление адреса текущего символа в текущем секторе + LD (HL),A ;запись символа + JP x232A ;проверка достижения конца сектора в описателе канала + +;Адрес #246E. Проверка достижения конца блока. Используется также с адресов: +;#2492 - обработка ошибки END OF FILE через ПЗУ бейсика. +;#2494 - обработка ошибок через ПЗУ бейсика. Код ошибки поместите в аккумулятор. + +x246E LD C,#D ;берем адрес #D-го байта описателя канала + RST #28 + LD A,(HL) ;берем младший байт длины пройденной части файла + LD BC,#E ;#1B-й байт + ADD HL,BC + CP (HL) ;сравнение младших байтов длин пройденной и записанной частей блока + RET NZ ;если они не равны, то возврат + LD C,#E ;аналогично со старшими байтами + RST #28 + LD A,(HL) + LD BC,#E + ADD HL,BC + CP (HL) + RET NZ + LD HL,#5CB6 ;адрес переменной разpешения изменения памяти + LD A,(HL) ;берем ее значение + CP #F4 ;интерфейс-1 есть? + JR Z,x2492 ;если нет, то ошибка + BIT 4,(HL) ;выполняется команда LOAD интерфейса-1? + JR Z,x2492 ;если да, то ошибка + OR 1 ;сброс флага C + POP HL ;снятие со стека адреса возврата + RET ;возврат по следующему адресу +x2492 LD A,7 ;код ошибки END OF FILE +x2494 LD (#5C3A),A ;установка кода ошибки + CALL x20E5 ;изменение памяти + RST #20 ;обработка ошибки + DW #0058 + +;Адрес #249D. Команда RET. + +x249D RET + +;Адрес #249E. Обработка ошибки INVALID I/O DEVICE через ПЗУ бейсика. + +x249E LD A,#17 ;код ошибки - #17 + JR x2494 ;обработка ошибки чеpез ПЗУ бейсика + +;Адрес #24A2. Работа с файлом произвольного доступа. Очередной символ поместите в A и откройте поток, связанный с файлом данных. Если окончен прием записи или файл последовательного доступа, то происходит простой возврат, иначе происходит возврат из программы, вызвавшей эту подпрограмму. + +x24A2 LD D,A ;сохранение символа + LD C,#F ;берем адрес #D-го байта описателя канала + RST #28 + LD A,(HL) ;файл произвольного доступа? + CP #7F + LD A,D ;восстановление символа + RET NZ ;если файл произвольного доступа, то возврат + LD BC,#13 ;#22-ый байт + ADD HL,BC + LD A,(HL) ;принимаем номер записи? + OR A + LD A,D ;восстановление символа + JR NZ,x24D5 ;если номер записи принят, то запись символа + DEC HL ;#21-ий байт + LD A,(HL) ;это 0? + OR A + JR NZ,x24C2 ;если нет, то рабочая область уже есть + PUSH BC ;сохранение числа #13, + PUSH HL ;адреса #21-го байта описателя канала и + PUSH DE ;символа + CALL x24F8 ;выделение #10 байтов в рабочей области + POP DE ;восстановление символа, + POP HL ;адреса #21-го байта описателя канала и + POP BC ;числа #13 +x24C2 LD C,(HL) ;берем относительный адрес символа + LD A,D ;восстановление символа + EX DE,HL + LD HL,(#5CCF) ;берем адрес рабочей области + ADD HL,BC ;вычисление адреса для символа + CP 6 ;символ CHR$ 6? + LD (HL),A ;помещение символа в рабочую область + CALL Z,x2504 ;если символ CHR$ 6, то номер записи принят + LD C,#21 ;#21-ий байт + RST #28 + INC (HL) ;записали 1 символ + POP HL ;снятие со стека адреса возврата + RET ;возврат по следующему адресу +x24D5 DEC HL ;#21-ий байт + LD A,(HL) ;берем относительный адрес символа + DEC HL ;#20-й байт + INC A ;место для символа ENTER + CP (HL) ;конец записи? + INC HL ;#21-ий байт + INC (HL) ;записали 1 символ + PUSH HL ;сохранение адреса #21-го байта описателя + PUSH AF ;канала и результата проверки наличия места для символа + LD C,#23 ;#23-ый байт + RST #28 + LD (HL),#FF ;сектор переписывать + POP AF ;восстановление результата проверки наличия места + POP HL ;для символа и адреса #21-го байта описателя канала + JR C,x24EE ;если места для символа нет, то следующая запись + LD A,D ;восстановление символа + CP #D ;это ENTER? + JR Z,x24F2 ;если да, то следующая запись + POP BC ;снятие со стека адреса возврата + RET ;возврат по следующему адресу +x24EE LD A,D ;восстановление символа + CP #D ;это ENTER? + RET NZ ;если нет, то возврат +x24F2 XOR A ;относительный адрес символа - 0 + LD (HL),A + INC HL ;#22-ый байт + LD (HL),A ;будем принимать номер записи + LD A,D ;восстановление символа + RET ;возврат + +;Адрес #24F8. Выделение #10 байтов в рабочей области памяти. Устанавливает #5CCF. + +x24F8 LD HL,(#5C61) ;берем адрес рабочей области памяти + LD (#5CCF),HL ;установка его + LD BC,#10 ;выделять #10 байтов + JP x1E23 ;выделение области и возврат + +;Адpес #2504. Обработка номера записи. Поместите в память номер записи в виде текста и поместите его адрес в #5CCF, а в HL поместите адрес последнего символа номера записи плюс 1. + +x2504 LD (HL),#D ;конец строки + LD HL,(#5C5D) ;сохранение CH_ADD + LD (#5CD7),HL + LD HL,(#5CCF) ;установка CH_ADD на номер записи + LD (#5C5D),HL + LD HL,#5C3B ;проверка на синтаксис + RES 7,(HL) + CALL x1DC1 ;перевод числа в 5-байтную форму + LD HL,#5C3B ;выполнение + SET 7,(HL) + LD HL,(#5CCF) ;установка CH_ADD на номер записи + LD (#5C5D),HL + CALL x1DC1 ;прием числа на стек калькулятора + CALL x1DB9 ;снятие его оттуда + PUSH BC ;перенос его в DE + POP DE + LD C,#20 ;берем адрес #D-го байта описателя канала + RST #28 + LD B,(HL) ;берем длину записи + XOR A + LD HL,0 ;вычисление относительного адреса записи в + LD (#5CDB),HL ;секторе, номера сектора и номера блока +x2538 ADD HL,DE ;извините, не понял, как это pаботает + JR NC,x2544 + PUSH HL + LD HL,(#5CDB) + INC HL + LD (#5CDB),HL + POP HL +x2544 DJNZ x2538 + LD (#5CD9),HL + LD A,(#5CDB) ;в блоке всего 16 секторов + LD HL,#5CDA + RRD + AND #F + LD (#5CDB),A + LD HL,(#5CD7) ;восстановление CH_ADD + LD (#5C5D),HL + CALL x2568 ;открытие записи + LD C,#21 ;#21-ий байт + RST #28 + LD A,#FF ;относительный адрес текущего символа будет 0 + LD (HL),A + INC HL ;#22-ый байт + LD (HL),A ;номер записи принят + RET ;возврат + +;Адрес #2568. Открытие записи. Установите #5CD7, #5CD9 и #5CDB. + +x2568 LD C,#19 ;берем адрес #19-го байта описателя канала + RST #28 + LD A,(#5CDA) ;берем номер открываемого блока + CP (HL) ;блок уже открыт? + JP NZ,x2584 ;если нет, то открытие блока + LD C,#E ;#E-ый байт + RST #28 + LD A,(#5CDB) ;берем номер сектора в открываемом блоке + CP (HL) ;сектор уже считан? + JP NZ,x25A7 ;если нет, то загрузка сектора +x257C LD C,#D ;#D-ый байт + RST #28 + LD A,(#5CD9) ;берем относительный адрес открываемой записи + LD (HL),A ;установка его + RET ;возврат +x2584 CALL x25CA ;проверка и обнуление #23-го байта + CALL NZ,x25C3 ;если надо, то запись сектора + LD A,(#5CDA) ;берем номер открываемого блока + LD C,#19 ;#19-ый байт + RST #28 + LD (HL),A ;установка номера блока + LD C,#10 ;#10-ый байт + RST #28 + LD DE,#5CDD ;установка описателя блока + LD BC,#10 + LDIR + CALL x1CB3 ;поиск блока + +;Ошибка!!! После поиска файла надо снова открывать канал файла данных, так как при ошибке будет открыт поток 0. + + JP NZ,x25D2 ;если блок не найден, то создание блока + CALL x23E4 ;открытие блока + JR x25AD ;загрузка сектора из блока +x25A7 CALL x25CA ;проверка и обнуление #23-го байта + CALL NZ,x25C3 ;если надо, то запись сектора +x25AD LD A,(#5CDB) ;берем номер считываемого сектора + LD C,#E ;#E-ый байт + RST #28 + LD (HL),A ;установка номера сектора + PUSH HL ;сохранение адреса #E-го байта + CALL x2443 ;установка дисковода + CALL x2418 ;загрузка сектора + POP HL ;восстановление адреса #E-го байта + DEC HL ;#D-ый байт + LD A,(#5CD9) ;установка относительного адреса открываемой + LD (HL),A ;записи + JR x257C ;выход + +;Адрес #25C3. Запись текущего сектора. Откройте канал файла данных. + +x25C3 CALL x2443 ;установка дисковода + CALL x23FC ;запись сектора + RET ;возврат + +;Адрес #25CA. Проверка и обнуление #23-го байта описателя канала. Соответственно содержимому будет установлен флаг Z, а само содержимое будет в аккумуляторе. Откройте нужный канал. + +x25CA LD C,#23 ;берем адрес #23-го байта описателя канала + RST #28 + LD A,(HL) ;берем его содержимое + OR A ;проверка его + LD (HL),0 ;обнуление байта + RET ;возврат + +;Адрес #25D2. Создание блока файла данных. Установите #5CD7, #5CD9 и #5CDB. + +x25D2 LD HL,(#5CDA) ;берем номер блока + LD H,#20 + LD (#5CD7),HL ;установка его + LD HL,(#5CD9) ;сохранение относительного адреса открываемой + PUSH HL ;записи + LD HL,(#5CDB) ;и номера сектора + PUSH HL + CALL x2381 ;создание блока + POP HL ;восстановление номера сектора + LD (#5CDB),HL + POP HL ;и относительного адреса открываемой записи + LD (#5CD9),HL + JR x25AD ;загрузка сектора из блока + +;Адрес #25EF. Ввод из файла данных. Откройте поток, связанный с файлом данных. При вызове из редактора вводит всю строку и производит выход из редактора, иначе возвращает символ из файла в A. + +x25EF CALL x20F1 ;изменение памяти + LD HL,#5C3C ;pежим не менялся + RES 3,(HL) + LD HL,(#5C3D) ;берем адрес подпрограммы обработки ошибок + LD E,(HL) + INC HL + LD D,(HL) + OR A ;он pавен #107F? + LD HL,#107F + SBC HL,DE + JR NZ,x2626 ;если нет, то подпрограмма вызвана не из редактора + LD SP,(#5C3D) ;очистка стека редактора + POP DE ;снятие адреса подпрограммы обработки ошибок + POP DE ;восстановление адреса дна стека + LD (#5C3D),DE ;установка его +x260F CALL x262B ;ввод символа из файла + JR C,x261D ;если был введен символ, то посылка его в буфер редактора +x2614 LD HL,#5CC2 ;адрес переключателя ПЗУ на бейсик + PUSH HL ;помещение его на стек + LD HL,x20E5 ;адрес подпрограммы удаления буфера и изменения памяти + PUSH HL ;помещение его на стек + RET ;изменение памяти и возврат +x261D CP #D ;символ ENTER? + JR Z,x2614 ;если да, то выход + RST #20 ;ввод символа в буфер редактора + DW #0F85 + JR x260F ;повтор +x2626 CALL x262B ;ввод символа из файла + JR x2614 ;возврат + +;Адрес #262B. Ввод байта из файла данных. На выходе байт будет в аккумуляторе. Откройте поток, связанный с файлом данных. + +x262B LD A,#A ;файл искать по 10 байтам описателя + LD (#5D06),A + CALL x2650 ;файл открыт для чтения? + JR Z,x2642 ;если да, то + CP #7F ;файл произвольного доступа? + JP NZ,x249E ;если нет, то ошибка + LD BC,#13 ;берем адрес #22-го байта описателя канала + ADD HL,BC + LD (HL),0 ;подпрограмма вывода будет принимать номер записи + JR x2645 +x2642 CALL x246E +x2645 CALL x2317 ;вычисление адреса текущего символа + LD A,(HL) ;берем этот символ + PUSH AF ;сохраняем его + CALL x239B ;проверка достижения конца сектора + POP AF ;восстановление символа + SCF ;был введен символ + RET ;возврат + +;Адрес #2650. Проверка #F-го байта описателя текущего канала. Соответственно его содержимому установится флаг Z, а само содержимое будет в регистре A. + +x2650 LD C,#F ;берем адрес #F-го байта описателя канала + RST #28 + LD A,(HL) ;берем этот байт + OR A ;проверка его на 0 + RET ;возврат + +;Адрес #2656. Выполнение команды CLOSE#. Установите #5D11 и #5C3B. + +x2656 LD HL,(#5D11) ;установка CH_ADD + LD (#5C5D),HL + CALL x1E0B ;прием номера потока + CALL x1D75 ;если идет проверка на синтаксис, то возврат + LD A,(#5CDB) ;берем номер потока + RST #20 ;берем относительный адрес описателя канала + DW #1727 + LD A,B ;поток закрыт? + OR C + JP Z,x01D3 ;если да, то завершение + PUSH HL ;сохранение адреса элемента STRMS + LD HL,(#5C4F) ;берем адрес области описателей каналов + ADD HL,BC ;вычисляем адрес первого байта описателя канала + LD A,(HL) ;берем старший байт адреса подпрограммы вывода + LD HL,x3D0E ;он равен #3D? + CP H + POP HL ;восстановление адреса элемента STRMS + JP NZ,x2228 ;если старший байт адреса подпрограммы вывода не равен #3D, то сообщение NOT DISC FILE Дурацкая проверка!!! Мало ли что может изменить пользователь! + LD (HL),0 ;закрытие потока + INC HL + LD (HL),0 + LD (#5CD9),BC ;сохранение относительного адреса описателя канала + LD HL,(#5C4F) ;вычисление адреса описателя канала + ADD HL,BC + DEC HL + LD (#5CD7),HL ;сохранение его + CALL x26CE ;запись остатка файла, если нужно + LD HL,(#5CD7) ;восстановление адреса описателя канала + LD BC,#124 ;его длина - #124 байта + CALL x1E2E ;уничтожение области описателя канала + LD HL,#5C10 ;берем начало таблицы STRMS + LD B,#10 ;всего 16 потоков +x269D PUSH BC ;сохранение количества потоков + LD BC,(#5CD9) ;берем относительный адрес описателя канала + LD E,(HL) ;берем адрес из таблицы + INC HL + LD D,(HL) + EX DE,HL ;переносим его в HL + SBC HL,BC ;он меньше нашего адреса? + EX DE,HL ;переброска его в DE + JR C,x26BC ;если он меньше нашего адреса, то следующий элемент + LD D,(HL) ;снова берем адрес из таблицы + DEC HL + LD E,(HL) + INC HL + PUSH HL ;сохранение адреса текущего элемента таблицы + EX DE,HL ;переброска адреса из таблицы в HL + LD BC,#124 ;коррекция адреса + SBC HL,BC + EX DE,HL ;перенос его в DE + POP HL ;восстановление адреса текущего элемента таблицы + LD (HL),D ;установка нового адреса + DEC HL + LD (HL),E + INC HL +x26BC INC HL ;следующий элемент + POP BC ;восстановление количества элементов + DJNZ x269D ;повтор до конца + LD HL,(#5D11) ;коррекция адреса командной строки + LD BC,#124 + SBC HL,BC + LD (#5D11),HL + JP x01D3 ;завершение + +;Адрес #26CE. Запись текущего сектора файла данных. При записи открывает поток, связанный с файлом. Поместите в HL и #5CD7 адрес описателя канала. + +x26CE LD BC,#F ;берем адрес #F-го байта описателя канала + ADD HL,BC + LD A,(HL) ;файл открывался для чтения? + OR A + RET Z ;если да, то возврат + LD HL,(#5CD7) ;открытие потока + LD (#5C51),HL + CALL x26E1 ;запись описателя блока + JP x23FC ;запись текущего сектора и возврат + +;Адpес #26E1. Запись описателя текущего блока файла данных. Откройте поток, связанный с файлом данных и поместите в HL адрес описателя канала. + +x26E1 LD BC,#D ;берем адрес #D-го байта описателя канала + ADD HL,BC + LD E,(HL) ;берем длину пройденной части блока + INC HL + LD D,(HL) + LD BC,#D ;берем адрес #1A-го байта описателя канала + ADD HL,BC + LD (HL),E ;установка длины записанной части блока + INC HL + LD (HL),D + LD C,#10 ;#10-ый байт + RST #28 + LD DE,#5CDD ;установка описателя блока + LD BC,#10 + LDIR + CALL x2443 ;установка дисковода + LD C,#C ;#C-ый байт + RST #28 + LD C,(HL) ;берем номер блока в каталоге + CALL x166B ;замена описателя блока + JP x1E43 ;запись сектора с описателем и возврат + +;Внимание!!! После записи сектора надо снова открывать поток, связанный с файлом данных, так как при дисковой ошибке открывается поток 0. + +;Адрес #2707. Печать строки. В HL поместите ее начало. Последний символ должен быть либо CHR$ 0, либо с поднятым седьмым битом. + +x2707 LD A,(HL) ;берем символ из строки + OR A ;это CHR$ 0? + RET Z ;если да, то возврат + AND #7F ;сброс бита 7 + RST #10 ;печать символа + BIT 7,(HL) ;бит 7 установлен? + RET NZ ;если да, то возврат + INC HL ;берем адрес следующего символа + JR x2707 ;повтор + +;Адрес #2713. Сравнение областей памяти. В HL и DE поместите начала сравниваемых областей, а в B - их длину. При несовпадении флаг Z сброшен, иначе включен. + +x2713 LD A,(DE) ;сравнение байтов из областей + CP (HL) + RET NZ ;если они не совпали, то возврат + INC DE ;следующие байты + INC HL + DJNZ x2713 ;повтор до конца + RET ;возврат + +;Адрес #271B. Обработка ошибки NO DISC без установки TAPE LOADING ERROR. + +x271B LD HL,x27FC ;адрес сообщения NO DISC + LD A,6 ;код ошибки - 6 + JP x1C4A ;обработка ошибки + +;Адрес #2723. Обработка ошибки DIRECTORY FULL. + +x2723 LD HL,x27ED ;адрес сообщения DIRECTORY FULL + LD A,4 ;код ошибки - 4 + JP x1C4A ;обработка ошибки + +;Адрес #272B. Установка кода ошибки TAPE LOADING ERROR для ПЗУ бейсика. + +x272B LD A,#1A ;код ошибки TAPE LOADING ERROR + JR x2731 ;установка кода ошибки + +;Адрес #272F. Установка кода ошибки INVALID I/O DEVICE для ПЗУ бейсика. Используется также с адреса: +;#2731 (установка кода ошибки для пзу бейсика; код ошибки поместите в A). + +x272F LD A,#12 ;код ошибки INVALID I/O DEVICE +x2731 LD (#5C3A),A ;установка кода ошибки + RET ;возврат + +;Адрес #2735. Установка кода ошибки OUT OF MEMORY для ПЗУ бейсика. + +x2735 LD A,3 ;код ошибки OUT IF RAM + JR x2731 ;установка кода ошибки + +;Адрес #2739. Проверка дорожки. В регистре D задайте физический номер дорожки. По окончании в #5CD6 получите число битых секторов на дорожке. + +x2739 XOR A ;дорожку проверять + LD (#5CD8),A + LD (#5CD6),A ;дефектных секторов пока не нашли + IN A,(#1F) ;сохраним состояние контроллера дисководов + LD (#5CCD),A + LD E,D ;перегрузка номера дорожки в E + PUSH DE ;сохранение номера дорожки + LD A,E ;помещение номера дорожки в регистр данных + OUT (#7F),A + LD A,#18 ;позиционирование + CALL x3D9A + LD A,(#5CCD) ;берем состояние контроллера до операции + AND #80 ;дисковод был готов? + CALL NZ,x3EA0 ;если нет, то задержка в 3135098 тактов + POP DE ;восстановление номера дорожки + CALL x207D ;проверка дорожки + LD A,(#5CD6) ;битых секторов нет? + OR A + RET Z ;если да, то возврат + LD A,7 ;дисковая ошибка + LD (#5D0F),A + RET ;возврат + +;Адрес #2766. Сообщения TR-DOS. + +x2766 DB "O.K." + DB 0 +x276B DB "Verify Error." + DB #8D +x2779 DB "BACKUP DISK" + DB #8D +x2785 DB "Insert Destination disk" + DB #D + DB "then press Y" + DB 0 +x27AA DB "Insert Source disk then press Y" + DB 0 +x27CA DB "*BREAK*" + DB #8D +x27D2 DB "Out of RAM" + DB #8D +x27DD DB "Array not found" + DB #8D +x27ED DB "Directory full" + DB #8D +x27FC DB "No disk" + DB #8D +x2804 DB "Stream opened" + DB #8D +x2812 DB "Not disk file" + DB #8D +x2820 DB "File exists" + DB #D + DB "Over write?(Y/N" + +x283B XOR C + +;Адрес #283C. Вызов подпрограмм TR-DOS из машинного кода. Вход: в регистре C код команды, остальное согласно описанию. На выходе в регистре BC код ошибки. + +x283C PUSH AF ;сохранение регистров + PUSH BC + LD (#5D04),DE + LD (#5D02),HL + CALL x20F1 ;если нужно, то изменение памяти + LD A,#FF + LD (#5D15),A ;сообщения не печатать + LD (#5D1F),A ;команда поступила из машинного кода + POP BC ;восстановление BC и AF + POP AF + LD HL,#201 ;по возврату пойдем в подпрограмму возврата в + LD (#5D1A),HL ;бейсик + LD HL,0 ;сохранение SP + ADD HL,SP + LD (#5D1C),HL + DEC HL ;резервирование места для адреса возврата по + DEC HL ;ошибке из подпрограмм бейсика + LD SP,HL + PUSH AF ;сохранение AF + CALL x021D ;установка адреса возврата по ошибке из бейсика + LD HL,x288C ;берем адрес начала таблицы команд +x2869 LD A,(HL) ;берем код команды + CP C ;он совпал с требуемым? + JR NZ,x287F ;если нет, то берем код следующей команды + POP AF ;восстановление AF + INC HL ;берем адрес, по которому находится адрес подпрограммы + LD E,(HL) ;берем адрес подпрограммы + INC HL + LD D,(HL) + LD HL,x01D3 ;берем адрес подпрограммы завершения + PUSH HL ;кладем его на стек + PUSH DE ;кладем на стек адрес подпрограммы + LD HL,(#5D02) ;восстановление HL и DE + LD DE,(#5D04) + RET ;переход к подпрограмме +x287F CP #FF ;достигнут конец таблицы? + JR NZ,x2887 ;если нет, то берем адрес номера следующей подпрограммы + POP AF ;снятие AF со стека (этого можно было не делать) + JP x01D3 ;переход на подпрограмму завершения +x2887 INC HL ;пропуск двух байтов адреса подпрограммы + INC HL + INC HL + JR x2869 ;повтор + +x288C DB 0 ;таблица номеров и адресов подпрограмм + DW x08A7 ;new было x3D98 + DB 1 + DW x3DCB + DB 2 + DW x3E63 + DB 3 + DW x3F02 + DB 4 + DW x3F06 + DB 5 + DW x1E3D + DB 6 + DW x1E4D + DB 7 + DW x28D8 + DB 8 + DW x165C + DB 9 + DW x1664 + DB #A + DW x1CF0 + DB #B + DW x28FB + DB #C + DW x28F2 + DB #D + DW x01D3 + DB #E + DW x290F + DB #F + DW x01D3 + DB #10 + DW x01D3 + DB #11 + DW x01D3 + DB #12 + DW x2926 + DB #13 + DW x28E0 + DB #14 + DW x28E3 + DB #15 + DW x2739 + DB #16 + DW x1FEB + DB #17 + DW x1FF6 + DB #18 + DW x0405 + DB #FF ;признак конца таблицы + +;Адрес #28D8. Выдача каталога диска с настройкой. На входе в A задайте номер потока, в который будете выводить каталог. + +x28D8 PUSH AF ;сохранение номера потока + CALL x0405 ;настройка на диск + POP AF ;восстановление номера потока + JP x0479 ;вывод каталога + +;Адрес #28E0. Перемещение описателя файла из памяти в #5CDD. В HL задайте адрес описателя файла в памяти. + +x28E0 XOR A ;перемещаем из (HL) в #5CDD + JR x28E5 ;перемещение описателя + +;Адрес #28E3. Перемещение описателя файла из #5CDD в память по адресу, установленному в HL. Используется также с адреса #28E5 (перемещение описателя файла, в HL - адрес описателя в памяти, в A - направление перемещения: 0 - из памяти, иначе - в память). + +x28E3 LD A,#FF ;перемещаем в память +x28E5 LD DE,#5CDD ;установка второго адреса для LDIR + LD BC,#10 ;установка длины описателя + OR A ;установка направления перемещения + JR Z,x28EF + EX DE,HL +x28EF LDIR ;перемещение описателя файла + RET ;возврат + +;Адрес #28F2. Запись программы на бейсике. Установите #5CD1, #5CDD и #5CE5. + +x28F2 CALL x0405 ;настройка на диск + CALL x1AC4 ;проверка свободного места в каталоге + JP x1B27 ;запись программы + +;Адрес #28FB. Запись файла. Имя с расширением поместите в #5CDD, длину в DE, начало в HL. + +x28FB LD (#5CD7),HL ;установка начала + LD (#5CD9),DE ;установка действительной длины файла + LD (#5CDB),DE ;установка длины файла для каталога + CALL x0405 ;настройка на диск + CALL x1AC4 ;проверка наличия свободного места в каталоге + JP x1B53 ;запись файла + +;Адрес #290F. Загрузка/верификация файла а также чтение/запись сектора файла. Установите #5CDD, #5CE5, #5CD7 (только для чтения/записи сектора) и #5CF9; в A поместите флаг загрузки согласно описанию команды #E в HL и DE - старт и длину (в зависимости от аккумулятора). + +x290F OR A + LD (#5CD6),A ;установка флага загрузки + LD (#5CD9),HL ;установка адреса загрузки + LD (#5CDB),DE ;установка длины загрузки + CALL x1CB3 ;поиск файла + CALL x18A4 ;если файл найден, то чтение его описателя + CALL x18AB ;обработка параметров загрузки + JP x1921 ;загрузка файла + +;Адрес #2926. Стирание файла. Установите #5CDD и #5CE5. На выходе будут установлены #5D07 и #5D08. + +x2926 CALL x0405 ;настройка на диск + CALL x1CB3 ;поиск файла + JP x07A0 ;стирание его + +;Адрес #292F. Проверка наличия файла. Имя поместите на стек калькулятора и установите #5D06. Если файл найден, то в рег. C и в #5D1E и будет включен флаг Z, иначе флаг Z будет сброшен, а в C будет #FF. + +x292F CALL x1C57 ;установка имени файла + CALL x0405 ;настройка на диск + JP x1CB3 ;поиск файла и возврат + +;Адрес #2938. Печать имени файла с расширением. В HL установите адрес имени с расширением. + +x2938 PUSH BC ;сохранение BC + LD B,8 ;в имени файла 8 символов +x293B LD A,(HL) ;берем символ из имени файла + RST #10 ;печать его + INC HL ;адрес следующего символа + DJNZ x293B ;повтор до конца + LD A,"<" ;печать "<" + RST #10 + LD A,(HL) ;печать расширения + RST #10 + LD A,">" ;печать ">" + RST #10 + POP BC ;восстановление BC + RET ;возврат + +;Адрес #294A. Создание буфера, если его нет. Установите #5D0C. + +x294A PUSH HL ;сохранение регистров + PUSH DE + PUSH BC + PUSH AF + LD HL,#5D0C ;буфер есть? + LD A,(HL) + OR A + JR Z,x2992 ;если да, то восстановление регистров и возврат + PUSH HL ;сохранение адреса флага наличия буфера + LD BC,#101 ;длина буфера + PUSH BC ;сохранение ее + CALL x19FD ;проверка возможности выделения буфера + POP BC ;восстановление длины буфера + POP HL ;восстановление адреса его флага + LD (HL),0 ;буфер есть + LD HL,#5D25 ;начало буфера + CALL x1E32 ;выделение буфера + LD HL,(#5D11) ;командная строка переместилась на #101 байтов + LD BC,#101 + ADD HL,BC + JR x298F ;установка нового адреса командной строки и возврат + +;Адрес #2970. Удаление буфера, если он есть. Установите #5D0C. Используется также с адресов #298F и #2992 подпрограммой #294A. + +x2970 PUSH HL ;сохранение регистров + PUSH DE + PUSH BC + PUSH AF + LD HL,#5D0C ;буфера нет? + LD A,(HL) + OR A + JR NZ,x2992 ;если да, то возврат + LD (HL),#FF ;буфера нет + LD HL,#5D25 ;начало буфера + LD BC,#101 ;его длина + CALL x1E2E ;удаление области памяти + OR A ;командная строка переместилась на #101 байтов + LD BC,#101 ;надо поменять ее адрес + LD HL,(#5D11) + SBC HL,BC +x298F LD (#5D11),HL +x2992 POP AF ;восстановление регистров + POP BC + POP DE + POP HL + RET ;возврат + +;Адрес #2997. Выполнение команды "40". Установите #5D11 и #5C3B. Используется также с адреса: +;#2998 (выполнение команды установки типа дисковода; установите все для #2997 плюс в A тип дисковода). + +x2997 XOR A ;дисковод 40-дорожечный односторонний + +;Ошибка!!! Во-первых, почему дисковод односторонний?; во-вторых, надо проверять возможность использования дисковода в требуемом режиме. + +x2998 LD (#5CD7),A ;сохранение типа дисковода + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x042B ;проверка второго символа строки + JP Z,x1D1A ;если это ENTER, то *ERROR* + CALL x3E11 ;берем адрес ячейки с типом дисковода + LD A,(#5CD7) ;установка типа дисковода + LD (HL),A + JP x03E1 ;сообщение O.K. + +;Адрес #29AE. Выполнение команды "80". Установите #5D11 и #5C3B. + +x29AE LD A,#80 ;дисковод 80-дорожечный односторонний + +;Ошибка!!! Во-первых, почему дисковод односторонний?; во-вторых, надо проверять возможность использования дисковода в требуемом режиме. + + JR x2998 ;выполнение команды + +;Адрес #29B2. Тексты сообщений TR-DOS. + +x29B2 DB #D + DB "*ERROR*" + DB #8D +x29BB DB #D + DB "No space" + DB #8D +x29C5 DB #D + DB "File exists" + DB #8D +x29D2 DB " Free" + DB #8D +x29D8 DB #D + DB "Read Onl" + DB #F9 +x29E2 DB #D + DB "Disc Erro" + DB #F2 +x29ED DB #D + DB "Rec. O/" + DB #C6 +x29F7 DB "Title:" + DB #A0 +x29FE DB #D + DB "Retry,Abort,Ignore?" + DB 0 +x2A13 DB #D + DB "Trk" + DB #A0 +x2A18 DB " sec" + DB #A0 +x2A1D DB " Del. File" + DB #8D +x2A28 DB #D + DB "No" +x2A2B DB " File(s)" + DB #8D,#00 + +;Адрес #2A35. Перенос подпрограммы определение текущего ПЗУ по адресу #4080. + +x2A35 LD HL,x2A41 ;адрес подпрограммы определение текущего ПЗУ + LD DE,#4080 ;ее адрес в ОЗУ + LD BC,#20 ;ее длина - #20 байта + LDIR ;перенос подпрограммы + RET ;возврат + +;Адрес #2A41. Подпрограмма определения текущего ПЗУ. Устанавливает #5C01 и подключает ПЗУ 48-го бейсика. Для работы подпрограмма должна быть перемещена в любое место ОЗУ. Можно использовать также с адреса: +;#2A53 для прямого вывода в любой порт. + +x2A41 LD A,(#3B5) ;берем байт из ПЗУ + CP #F3 ;это #F3? + LD A,#10 ;если да, то это ПЗУ 48-го бейсика + JR Z,x2A4B + XOR A ;иначе это ПЗУ 128-го бейсика +x2A4B LD (#5C01),A ;установка номера ПЗУ + LD BC,#7FFD ;адрес порта конфигурации системы + LD A,#10 ;ПЗУ 48-го бейсика +x2A53 OUT (C),A ;установка ПЗУ + RET ;возврат + +;Адрес #2A56. Запись памяти на диск. + +x2A56 jp x0807 ;new +; PUSH AF ;сохранение регистров +; PUSH BC +; PUSH DE +x2A59 PUSH HL + PUSH IX + PUSH IY + EXX + PUSH BC + PUSH DE + PUSH HL + EX AF,AF' + PUSH AF + LD A,I + PUSH AF + LD A,R + PUSH AF + LD HL,0 + ADD HL,SP ;сохранение SP + PUSH HL + LD A,#3C ;выбор дисковода A и верхней стороны диска + OUT (#FF),A + LD A,#3F ;установка регистра I + LD I,A + IN A,(#1F) ;берем состояние контроллера + AND #80 + RRCA + RRCA + RRCA + LD (#5C01),A ;сохранение его + +;Ошибка!!! Нельзя портить память. + + CALL x2F65 ;восстановление + CALL x3EA0 ;задержка в 3135098 тактов + CALL x3EA0 ;еще раз + LD DE,#A ;сектор #A + LD HL,#4000 ;записывать с адреса #4000 + PUSH HL ;сохранение числа #4000 + CALL x2D73 ;запись сектора + LD HL,#4100 ;записывать с адреса #4100 + LD DE,#B ;сектор #B + CALL x2D73 ;запись сектора + POP HL ;восстановление числа #4000 + PUSH HL ;и снова сохранение + LD DE,8 ;сектор 8 + CALL x2F1B ;загрузка сектора + LD HL,#40E3 ;берем тип диска + LD A,(HL) + LD (#5C00),A ;сохраняем его + +;Ошибка!!! Опять порча памяти. + + INC HL ;берем количество файлов на диске + LD A,(HL) + INC (HL) ;записали еще 1 файл + +;Внимание!!! Не проверяется наличие свободного места в каталоге диска. + + INC HL ;берем количество свободного места на диске + LD E,(HL) + INC HL + LD D,(HL) + OR A ;сброс флага C + EX DE,HL + LD DE,#C0 ;уменьшим количество места на диске на #C0 + SBC HL,DE ;сектора + LD (#40E5),HL ;установка нового количества свободного места на диске + LD HL,#4000 ;записывать с адреса #4000 + LD DE,8 ;сектор 8 + CALL x2D73 ;запись сектора + POP HL ;восстановление адреса #4000 + LD DE,(#40E1) ;берем адрес свободного места на диске + PUSH DE ;сохраняем его + LD DE,#A ;сектор #A + CALL x2F1B ;загрузка сектора + POP DE ;восстановление адреса свободного места на диске + CALL x2D4C ;запись секторов + PUSH DE ;сохранение нового адреса свободного места на диске + LD A,#3C ;выбор дисковода A и верхней стороны диска + OUT (#FF),A + CALL x2F65 ;восстановление + LD HL,#4000 ;грузить с адреса #4000 + LD DE,8 ;сектор 8 + LD B,1 + CALL x2F1B ;загрузка сектора + POP DE ;восстановление нового адреса свободного места на диске + LD HL,(#40E1) ;берем старый адрес свободного места на диске + LD (#40E1),DE ;установка нового адреса + PUSH HL ;сохранение старого адреса + LD HL,#4000 ;записывать с адреса #4000 + LD DE,8 ;сектор 8 + LD B,1 + CALL x2D73 ;запись сектора + LD A,(#40E4) ;берем номер записанного файла + DEC A + CALL x2CE5 ;загрузка сектора с его описателем + LD (HL),"@" ;имя файла - "@" + INC HL + LD B,7 ;7 пробелов +x2B09 LD (HL)," " + INC HL + DJNZ x2B09 + LD (HL),"C" ;расширение файла - "C" + POP DE ;восстановление старого адреса свободного места на диске + POP BC ;и значения SP после сохранения регистров + INC HL ;установка значения SP после сохранения + LD (HL),C ;в поле адреса загрузки файла + INC HL + LD (HL),B + INC HL ;поле длины файла пропускаем + INC HL + INC HL + LD (HL),#C0 ;длина файла - #C0 сектора + INC HL + LD (HL),E ;установка адреса файла на диске + INC HL + LD (HL),D + LD HL,#4000 ;записывать с адреса #4000 + LD DE,0 + IN A,(#5F) ;берем номер сектора, в котором находится + DEC A ;описатель файла + LD E,A + LD B,1 + CALL x2D73 ;запись сектора + LD HL,0 ;сохранение SP + ADD HL,SP + LD (#4140),HL + LD SP,#41FF ;перенос стека в экран + CALL x2A35 ;перенос в экран подпрограммы определения текущего ПЗУ + LD HL,#C000 ;адрес страниц ОЗУ + XOR A ;начало вычисления контрольной суммы страницы +x2B3F ADD A,(HL) ;прибавление к сумме очередного байта + INC HL ;адрес следующего байта + LD B,A ;сохранение контрольной суммы + LD A,H ;берем старший байт текущего адреса в странице + OR A ;это 0? + LD A,B ;восстановление контрольной суммы + JR NZ,x2B3F ;если нет, то повтор + LD HL,#4100 ;сохранение контрольной суммы текущей + LD (HL),A ;страницы + PUSH HL ;сохранение ее адреса + LD HL,x2B58 ;адрес возврата - #2B58 + PUSH HL ;помещение его на стек + LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS + PUSH HL ;помещение его на стек + DI ;запрет прерываний + JP #4080 ;определение текущего ПЗУ +x2B58 POP HL ;восстановление адреса контрольной суммы текущей страницы + LD BC,#7FFD ;адрес порта конфигурации системы + LD A,#AA ;контрольный байт + LD (#4130),A ;помещение его в экран + LD D,5 ;банк ОЗУ 5 + LD A,(#5C01) ;выбор ПЗУ + OR D + LD D,A + OUT (C),D ;выбор банка памяти + LD A,(#C130) ;берем адрес контрольного байта + CP #AA ;это #AA? + JP NZ,x2C1B ;если нет, то выход + LD A,D ;ОЗУ 0 + AND #F8 + LD D,A + INC HL ;адрес переменной с кодом текущего банка памяти + LD B,8 ;всего 8 страниц +x2B79 LD (HL),D ;установка банка + OUT (C),D ;выбор банка + XOR A ;начало вычисления контрольной суммы страницы + LD HL,#C000 ;адрес страниц ОЗУ +x2B80 ADD A,(HL) ;прибавление к сумме очередного байта + INC HL ;адрес следующего байта + LD E,A ;сохранение контрольной суммы + LD A,H ;берем старший байт текущего адреса в странице + OR A ;это 0? + LD A,E ;восстановление контрольной суммы + JR NZ,x2B80 ;если нет, то повтор + LD HL,#4100 ;адрес переменной с контрольной суммой текущей страницы + CP (HL) ;суммы совпадают? + INC HL ;адрес переменной с кодом текущего банка памяти + JR Z,x2B93 ;если да, то все + INC D ;следующая страница ОЗУ + DJNZ x2B79 ;повтор до конца + DEC D ;берем код текущего банка памяти +x2B93 LD B,8 ;всего 8 страниц +x2B95 PUSH BC ;сохранение числа страниц + CALL x2C37 ;запись страницы + POP BC ;восстановление числа страниц + DJNZ x2B95 ;повтор до конца + LD C,0 ;дорожка 0 + CALL x2F3A ;позиционирование + CALL x2D2A ;загрузка сектора 8 по адресу #4000 + LD A,(#40E4) ;берем количество файлов на диске + LD (#4102),A ;сохраняем его + INC A ;записали еще 1 файл + LD (#40E4),A ;установка нового количества файлов + LD HL,(#40E5) ;берем количество свободного места на диске + LD DE,1 ;уменьшаем его на 1 сектор + SBC HL,DE + LD (#40E5),HL ;установка нового количества свободного места на диске + RET C ;если места на диске нет, то возврат + +;Внимание!!! Куда возврат? Ведь на вершине стека находится сохраненные регистры R и F. + + LD HL,(#40E1) ;берем адрес свободного места на диске + LD (#411E),HL ;сохраняем его + CALL x2D1E ;установка имени файла + LD A,"8" ;восьмой файл + LD (#4111),A + LD A,1 ;его длина - 1 сектор + LD (#411D),A + LD HL,#4100 ;адрес загрузки - #4100 + LD (#4119),HL + LD HL,#100 ;длина - #100 байтов + LD (#411B),HL + LD DE,(#40E1) ;берем адрес свободного места на диске + CALL x2F65 ;восстановление + LD C,D ;берем номер дорожки + CALL x2F3A ;позиционирование + LD HL,#4100 ;записывать с адреса #4100 + LD B,1 ;1 сектор + CALL x2D58 ;запись сектора + LD (#40E1),DE ;установка нового адреса свободного места на диске + LD C,0 ;дорожка 0 + CALL x2F3A ;позиционирование + CALL x2D34 ;запись сектора 8 с адреса #4000 + LD A,(#4102) ;берем номер записанного файла + CALL x2CE5 ;загрузка сектора с его описателем + LD DE,#4110 ;замена описателя файла + LD BC,#10 + EX DE,HL + LDIR + IN A,(#5F) ;берем номер загруженного сектора + DEC A + LD E,A + LD D,0 + LD HL,#4000 ;записывать с адреса #4000 + CALL x2D73 ;запись сектора + LD BC,#7FFD ;адрес порта конфигурации системы + LD A,(#4101) ;берем код текущего банка памяти + OUT (C),A ;установка его +x2C1B LD HL,(#4140) ;восстановление SP + LD SP,HL + LD HL,#4000 ;загружать с адреса #4000 + LD DE,#A ;сектор #A + CALL x2F1B ;загрузка сектора + LD HL,#4100 ;загружать с адреса #4100 + LD DE,#B ;сектор #B + CALL x2F1B ;загрузка сектора + LD A,#3C ;помещение на стек числа #3C + PUSH AF + JP x2EBC ;восстановление регистров и возврат + +;Адрес #2C37. Запись страницы ОЗУ, если она не пустая. Поместите в B номер страницы плюс 1 и установите #5C00 и #4101. + +x2C37 LD A,B ;берем номер страницы + DEC A + LD (#4103),A ;установка его + LD B,A ;сохранение его + LD A,(#4101) ;берем номер текущей страницы + AND 7 + CP B ;записываем ее? + RET Z ;если да, то возврат + LD A,2 ;записываем страницу 2? + CP B + RET Z ;если да, то возврат + LD A,(#4101) ;берем код текущего банка памяти + AND 8 ;текущий экран 0? + JR Z,x2C55 ;если да, то не записываем страницу 5 + LD A,B ;записываем страницу 7? + CP 7 + RET Z ;если да, то возврат + JR x2C59 ;запись страницы +x2C55 LD A,B ;записываем страницу 5? + CP 5 + RET Z ;если да, то возврат +x2C59 CALL x2C5D ;запись страницы + RET ;возврат + +;Адрес #2C5D. Запись страницы ОЗУ, если она не пустая. Поместите в B номер страницы и установите #5C00 и #4101. + +x2C5D LD HL,#4101 ;берем код текущего банка памяти + LD A,(HL) + AND #F8 ;оставляем экран и ПЗУ + LD C,A + LD A,B ;вычисление байта для порта конфигурации + OR C ;системы + PUSH BC ;сохранение кода текущего банка памяти + LD BC,#7FFD ;адрес порта конфигурации + OUT (C),A ;установка банка памяти + POP BC ;восстановление кода текущего банка + LD HL,#C000 ;адрес страницы +x2C70 LD A,(HL) ;берем байт из страницы + OR A ;это 0? + JR NZ,x2C7A ;если нет, то запись страницы + INC HL ;следующий байт + LD A,H ;конец страницы? + OR A + JR NZ,x2C70 ;если нет, то повтор + RET ;возврат +x2C7A CALL x2C7E ;запись страницы + RET ;возврат + +;Адрес #2C7E. Запись страницы ОЗУ. Установите #4103 и #5C00. + +x2C7E LD C,0 ;дорожка 0 + CALL x2F3A ;позиционирование + CALL x2D2A ;загрузка сектора 8 по адресу #4000 + LD A,(#40E4) ;берем количество файлов на диске + LD (#4102),A ;сохраняем его + INC A ;записали 1 файл + LD (#40E4),A + LD HL,(#40E5) ;берем количество свободного места на диске + LD DE,#40 ;уменьшаем его на #40 секторов + SBC HL,DE + LD (#40E5),HL ;установка нового количества свободного места + RET C ;если места нет, то возврат + LD HL,(#40E1) ;берем адрес свободного места на диске + LD (#411E),HL ;установка адреса файла на диске + CALL x2D1E ;установка имени файла + LD A,#40 ;размер файла - #40 секторов + LD (#411D),A + LD HL,#C000 ;адрес загрузки - #C000 + LD (#4119),HL + LD HL,#4000 ;длина - #4000 байта + LD (#411B),HL + LD DE,(#40E1) ;берем адрес свободного места на диске + CALL x2D3E ;запись файла + LD (#40E1),DE ;установка нового адреса свободного места + LD C,0 ;дорожка 0 + CALL x2F3A ;позиционирование + CALL x2D34 ;запись сектора 8 с адреса #4000 + LD A,(#4102) ;восстановление номера файла + CALL x2CE5 ;загрузка сектора с описателем файла + LD DE,#4110 ;замена описателя файла + LD BC,#10 + EX DE,HL + LDIR + IN A,(#5F) ;берем номер загруженного сектора + DEC A + LD E,A + LD D,0 + LD HL,#4000 ;записывать с адреса #4000 + CALL x2D73 ;запись сектора + RET ;возврат + +;Адрес #2CE5. Загрузка по адресу #4000 Номер файла поместите в A. На выходе в HL будет адрес описателя файла. + +x2CE5 LD C,A ;сохранение номера файла + AND #F0 ;вычисление номера сектора с описателем файла + RRCA + RRCA + RRCA + RRCA + LD B,A + PUSH BC + LD E,B + LD D,0 + LD HL,#4000 ;загружать с адреса #4000 + PUSH DE ;сохранение номера сектора + CALL x2F1B ;загрузка сектора + POP DE ;восстановление номера сектора + POP BC ;и номера файла + LD B,0 + LD A,C ;вычисление относительного адреса описателя + AND #F ;файла в секторе + RLCA + RLCA + RLCA + RLCA + LD HL,#4000 ;вычисление абсолютного адреса + ADD A,L + LD L,A + RET ;возврат + +;Адрес #2D09. Помещение имени и расширения файла "@"CODE по адресу #4110. + +x2D09 LD HL,#4110 ;адрес имени файла + LD B,9 ;длина области - 9 байтов +x2D0E LD (HL)," " ;очистка области + INC HL + DJNZ x2D0E + LD A,"@" ;имя файла - "@" + LD (#4110),A + LD A,"C" ;расширение файла - "C" + LD (#4118),A + RET ;возврат + +;Адрес #2D1E. Установка имени файла страницы. Установите #4103. Имя файла будет находиться по адресу #4110. + +x2D1E CALL x2D09 ;установка имени главного файла + LD A,(#4103) ;берем номер страницы + ADD A,"0" ;преобразование его в символ + LD (#4111),A ;установка номера страницы + RET ;возврат + +;Адрес #2D2A. Загрузка сектора 8 по адресу #4000. Спозиционируйте головку. + +x2D2A LD HL,#4000 ;грузить по адресу #4000 + LD DE,8 ;сектор 8 + CALL x2F1B ;загрузка сектора + RET ;возврат + +;Адрес #2D34. Запись сектора 8 с адреса #4000. Спозиционируйте головку. + +x2D34 LD HL,#4000 ;записывать с адреса #4000 + LD DE,8 ;сектор 8 + CALL x2D73 ;запись сектора + RET ;возврат + +;Адрес #2D3E. Запись #40-х секторов с адреса #C000. Установите все для #2D4C. + +x2D3E CALL x2F65 ;восстановление + LD C,D ;берем номер первой дорожки + CALL x2F3A ;позиционирование + LD HL,#C000 ;записывать с адреса #C000 + LD B,#40 ;#40 секторов + JR x2D58 ;запись секторов и возврат + +;Адрес #2D4C. Запись #C0 секторов с адреса #4000 для подпрограммы MAGIC. В DE поместите адрес на диске и установите #5C00. Используется также с адреса: +;#2D58 (запись секторов; в HL поместите адрес в памяти, в DE - адрес на диске, в B ? количество секторов, установите #5C00 и спозиционируйте головку на первую дорожку). + +x2D4C CALL x2F65 ;восстановление + LD C,D ;берем номер первой дорожки + CALL x2F3A ;позиционирование + LD HL,#4000 ;записывать с адреса #4000 + LD B,#C0 ;#C0 секторов +x2D58 PUSH BC ;сохранение количества секторов + PUSH DE ;и адреса на диске + CALL x2D73 ;запись сектора + LD DE,#100 ;адрес следующего сектора в памяти + ADD HL,DE + POP DE ;восстановление адреса на диске + INC E ;следующий сектор + LD A,E ;конец дорожки? + CP #10 + JR NZ,x2D6F ;если да, то + LD E,0 ;текущий сектор 0, + INC D ;следующая дорожка, + LD C,D + CALL x2F3A ;позиционирование +x2D6F POP BC ;восстановление количества секторов + DJNZ x2D58 ;повтор до конца + RET ;возврат + +;Адрес #2D73. Запись сектора для команды GO TO. В HL поместите адрес записи, в E - номер сектора. + +x2D73 LD A,E ;установка номера сектора + INC A + OUT (#5F),A + PUSH HL ;сохранение адреса записи + LD D,#14 ;20 попыток + PUSH DE ;сохранение числа попыток +x2D7B DI ;запрет прерываний + LD C,#7F ;адрес регистра данных контроллера + LD A,#A0 ;команда записи сектора + OUT (#1F),A + CALL x3FCA ;запись байтов + POP DE ;восстановление количества попыток + POP HL ;и адреса записи сектора + IN A,(#1F) ;берем состояние контроллера + AND #7F ;все в порядке? + RET Z ;если да, то возврат + DEC D ;следующая попытка + PUSH HL ;сохранение адреса записи сектора + PUSH DE ;и количества попыток + JR NZ,x2D7B ;если попытки не кончились, то повтор + +;Внимание!!! Самая большая ошибка!!! Диск с заклеенной прорезью защиты от записи будет, скорее всего, испорчен. Подробное объяснение вы найдете в ZX-PЕВЮ #5F/4 на странице #23. + + HALT ;остановка процессора + +;Адрес #2D92. Загрузка секторов. Установите #5CE6, #5CEB и #5CEA. + +x2D92 LD HL,(#5CE6) ;берем адрес загрузки + LD DE,(#5CEB) ;берем адрес секторов на диске + LD A,(#5CEA) ;берем количество секторов + LD B,A + CALL x1E3D ;загрузка секторов + RET ;возврат + +;Адрес #2DA1. Выполнение команды GO TO. Установите #5D11 и #5C3B. Можно использовать также с адреса #2E27 (GO TO для 48К; параметры, как и для #2DA1). Используется также с адреса #2EBC для возврата из подпрограммы обработки немаскируемого прерывания. + +x2DA1 CALL x1DDF ;прием имени файла на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x102E ;прием расширения файла + +;Зачем это нужно? Ведь MAGIC записывает файлы только с расширением C. + + CALL x1C57 ;установка имени файла + LD (#4020),BC ;сохранение длины имени файла + LD A,C ;она равна 8 символам? + CP 8 + JR NC,x2DD2 ;если да, то работа с 48К + CALL x0405 ;настройка на диск + CALL x1CB3 ;поиск файла + JP NZ,x03D9 ;если не нашли, то NO FILE + LD HL,#5CDD ;берем адрес имени файла + LD BC,(#4020) ;и его длину + +;Зачем портить экран без надобности? Ведь длину имени файла можно сохранять и в другом месте. + + ADD HL,BC ;вычисляем адрес конца имени файла + LD (HL),"8" ;прибавление "8" к имени файла + PUSH HL ;сохранение адреса этого символа + CALL x1CB3 ;поиск файла + POP HL ;восстановление последнего символа имени файла + JR Z,x2DD8 ;если файл нашелся, то загрузка страниц + LD (HL)," " ;восстановление имени главного файла +x2DD2 CALL x1CB3 ;поиск файла + JP x2E33 ;загрузка файла +x2DD8 CALL x165D ;чтение описателя файла + CALL x2D92 ;загрузка файла + LD SP,#40FF ;перенос стека + LD B,8 ;всего 8 страниц +x2DE3 PUSH BC ;сохранение номера файла страницы + LD A,B + LD BC,#7FFD ;адрес порта конфигурации системы + DEC A ;страницы считаем с 0 + PUSH AF ;сохранение номера страницы + OR #10 ;экран 0, ПЗУ 1 + OUT (C),A ;установка страницы + POP AF ;восстановление номера страницы + ADD A,"0" ;вычисление последнего символа имени файла страницы + LD HL,#5CDD ;вычисление адреса для этого символа + LD BC,(#4020) + ADD HL,BC + LD (HL),A ;установка последнего символа имени файла страницы + CALL x1CB3 ;поиск файла + JR NZ,x2E05 ;если не нашли, то загрузка следующей страницы + CALL x165D ;чтение описателя файла + CALL x2D92 ;загрузка файла + +;Внимание!!! При ответе A на вопpос "DISC ERROR. RETRY,ABORT,IGNORE?", может произойти что угодно, если значение ERR_SP больше #C000, так как старый стек будет затираться загружаемым файлом или находиться в другой странице. + +x2E05 POP BC ;восстановление номера файла страницы + DJNZ x2DE3 ;повтор до конца + LD A," " ;восстановление имени главного файла + LD HL,#5CDD + LD BC,(#4020) + ADD HL,BC + LD (HL),A + CALL x1CB3 ;поиск файла + CALL x165D ;чтение описателя файла + PUSH BC ;сохранение номера файла + PUSH AF ;и AF + LD BC,#7FFD ;адрес порта конфигурации + LD A,(#4101) ;берем его значение в момент записи файла (из восьмого файла) + OUT (C),A ;установка рабочего состояния порта + POP AF ;востановление номера файла и AF + POP BC + JR x2E39 ;загрузка главного файла +x2E27 CALL x1DDF ;прием имени файла на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x102E ;прием расширения файла + CALL x292F ;поиск файла +x2E33 JP NZ,x03D9 ;если он не найден, то NO FILE + CALL x165D ;чтение его описателя +x2E39 LD A,(#5CDD) ;берем первый символ имени файла + CP "$" ;это "$"? + DI ;запрет прерываний + JR NZ,x2E43 ;если да, то + IM 2 ;установка второго режима прерываний +x2E43 LD SP,#40F0 ;перенос стека + CALL x3E11 ;берем тип дисковода + LD (#4010),A ;сохраняем его + LD A,(#5D16) ;сохранение копии системного регистра, + LD (#4011),A + LD HL,(#5CE6) ;адреса стека для программы, + PUSH HL + LD DE,(#5CEB) ;и адреса файла на диске + PUSH DE + INC E ;первый сектор файла пока не загружаем + LD A,E + CP #10 + JR NZ,x2E64 + LD E,0 + INC D +x2E64 LD C,D ;берем логический номер дорожки + CALL x2F07 ;выбор верхней стороны диска + LD A,(#4010) ;берем режим дисковода + AND 2 ;дисковод двухсторонний? + CALL NZ,x2F0F ;если да, то выбор стороны диска + LD A,C ;берем физический номер дорожки + CALL x2F50 ;позиционирование + LD HL,#4100 ;загружать с адреса #4100 + LD B,#BF ;#BF секторов +x2E79 PUSH BC ;сохранение количества секторов + PUSH DE ;и адреса текушего сектора на диске + CALL x2F1B ;загрузка сектора + LD DE,#100 ;вычисление адреса загрузки следующего сектора + ADD HL,DE + POP DE ;восстановление адреса текушего сектора на диске + INC E ;следующий сектор + LD A,E ;конец дорожки? + CP #10 + JR NZ,x2E9C ;если нет, то продолжение загрузки + LD E,0 ;сектор 0 + INC D ;следующая дорожка + LD C,D + CALL x2F07 ;позиционирование (смотрите выше) + LD A,(#4010) + AND 2 + CALL NZ,x2F0F + LD A,C + CALL x2F50 +x2E9C POP BC ;восстановление количества секторов + DJNZ x2E79 ;повтор до конца + POP DE ;восстановление адреса файла на диске + POP HL ;и адреса стека + LD SP,HL ;установка стека + LD A,(#4011) ;берем копию системного регистра + PUSH AF ;сохраняем ее + LD C,D ;позиционирование (смотрите выше) + CALL x2F07 + LD A,(#4010) + AND 2 + CALL NZ,x2F0F + LD A,C + CALL x2F50 + LD HL,#4000 ;адрес загрузки первого сектора файла + CALL x2F1B ;загрузка сектора +x2EBC POP AF ;востановление копии системного регистра + EX AF,AF' ;и снова сохранение + POP AF ;восстановление регистров R и I + LD R,A + POP AF + LD I,A + DI ;запрет прерываний + LD A,#FF ;установка флага прерываний + JP PO,x2ECC + LD A,0 +x2ECC LD (#5C00),A + POP AF ;восстановление регистров + POP HL + POP DE + POP BC + EXX + EX AF,AF' + POP IY + POP IX + POP HL + POP DE + POP BC + LD A,(#5C48) ;установка цвета бордюра + AND #38 + RRCA + RRCA + RRCA + nop ;new + nop ;new +; OUT (#FE),A + LD A,(#5B08) ;берем байт из #5B08 + CP #EE ;там #EE? + JR NZ,x2EF7 ;если нет, то системных переменных 128К нет + +;Ошибка!!! Число #EE по адресу #5B08 еще ни о чем не говоpит. + + PUSH BC ;сохранение BC + LD BC,#7FFD ;адрес порта конфигурации + LD A,(#5B5C) ;берем значение переменной BANK_M + OUT (C),A ;установка рабочей страницы + POP BC ;восстановление BC +x2EF7 LD A,(#5C00) ;берем флаг прерываний + OR A ;прерывания разрешать? + LD A,#C9 ;установка переключателя ПЗУ на бейсик + LD (#5C00),A + JR NZ,x2F03 ;если в #5C00 был 0, то + EI ;разрешение прерываний +x2F03 POP AF ;восстановление AF + JP #5C00 ;запуск программы + +;Адрес #2F07. Выбор верхней стороны диска для команды GO TO. Установите #4011. Можно использовать также с адреса: +;#2F0C для прямого вывода в порт #FF. + +x2F07 LD A,(#4011) ;берем копию системного регистра + OR #3C ;сторона - верхняя +x2F0C OUT (#FF),A ;загрузка системного регистра + RET ;возврат + +;Адрес #2F0F. Выбор верхней стороны диска для команды GO TO. Вход: установите #4011, поместите в C логический номер дорожки и выберите верхнюю сторону диска. Выход: в C будет физический номер дорожки и выбрана сторона диска. + +x2F0F LD A,C ;деление номера дорожки на 2 + OR A + RRA + LD C,A + RET NC ;если дорожка четная, то возврат + LD A,(#4011) ;берем копию системного регистра + AND #6F ;сторона - нижняя + JR x2F0C ;загрузка системного регистра и возврат + +;Адpес #2F1B. Чтение сектора для команды GO TO. В HL поместите адрес загрузки, в E - номер сектора. + +x2F1B LD A,E ;установка номера сектора + INC A + OUT (#5F),A + PUSH HL ;сохранение адреса загрузки + LD D,#14 ;20 попыток + PUSH DE ;сохранение числа попыток +x2F23 DI ;запрет прерываний + LD C,#7F ;адрес регистра данных контроллера + LD A,#80 ;команда чтения сектора + OUT (#1F),A + CALL x3FE5 ;чтение байтов + POP DE ;восстановление количества попыток + POP HL ;и адреса загрузки сектора + IN A,(#1F) ;берем состояние контроллера + AND #7F ;все в порядке? + RET Z ;если да, то возврат + DEC D ;следующая попытка + PUSH HL ;сохранение адреса загрузки сектора + PUSH DE ;и количества попыток + JR NZ,x2F23 ;если попытки не кончились, то повтор + HALT ;остановка процессора + +;Адрес #2F3A. Позиционирование для подпрограммы MAGIC. Логический номер дорожки поместите в C и установите #5C00. Используется также с адресов: +;#2F50 - позиционирование для команды GO TO. Поместите в A физический номер дорожки. +;#2F57 - выдача команды и ожидание INTRQ. Команду поместите в A. + +x2F3A LD A,#3C ;выбор верхней стороны диска + OUT (#FF),A + LD A,(#5C00) ;берем тип дисковода + AND 8 ;он двухсторонний? + JR NZ,x2F4F ;если нет, то позиционирование + LD A,C ;деление номера дорожки на 2 + OR A + RRA + LD C,A + JR NC,x2F4F ;если дорожка четная, то позиционирование + LD A,#2C ;выбор нижней стороны диска + OUT (#FF),A +x2F4F LD A,C +x2F50 OUT (#7F),A ;загрузка номера дорожки в регистр данных + CALL x3DFD ;задержка в 725779 тактов + LD A,#18 ;new команда позиционирования +x2F57 OUT (#1F),A +x2F59 IN A,(#FF) ;ожидание сигнала INTRQ + AND #80 + JR Z,x2F59 + PUSH BC ;сохранение BC + CALL x3DFD ;задержка в 725779 тактов + POP BC ;восстановление BC + RET ;возврат + +;Адрес #2F65. Восстановление для подпрограммы MAGIC. + +x2F65 LD A,#08 ;new команда восстановления + JR x2F57 ;выдача команды, ожидание INTRQ и возврат + +;Адрес #2F69. Подпрограмма обработки ошибок, поступающих из ПЗУ бейсика. Установите #5C3A и все для подпрограммы #1D3. + +x2F69 LD HL,(#5D1C) ;очистка стека + DEC HL + DEC HL + LD SP,HL + JP x1D2F ;выдача сообщения и завершение + +;Адрес #2F72. Вызов подпрограмм из ПЗУ бейсика. Адрес задайте в двух байтах после CALL #2F72: +;CALL #2F72 +;DW #0D6B + +x2F72 LD (#5D02),HL ;сохранение HL и DE + LD (#5D04),DE + POP HL ;снятие со стека адреса двух байтов с адресом подпрограммы + LD E,(HL) ;берем адрес подпрограммы + INC HL + LD D,(HL) + INC HL + PUSH HL ;помещение на стек адреса возврата в программу, вызвавшую #2F72 + LD HL,x3D2F ;помещение на стек адреса переключателя ПЗУ на TR-DOS + PUSH HL + PUSH DE ;помещение на стек адреса вызываемой подпрограммы + LD HL,#5CC2 ;помещение на стек адреса команды RET в ОЗУ + PUSH HL + LD HL,(#5D02) ;восстановление HL и DE + LD DE,(#5D04) + RET ;переход к команде RET в ОЗУ + +;Адрес #2F90. Установка начальных значений системных пеpеменных TR-DOS. В переменные помещает: +;в #5CFA - #5CFD, #5CC8 - #5CCB, #5C3A, #5D16, #5D0C - #FF; #5D17 - #5D19, #5D1F - 0; #5CC2 - #C9; в системный регистр помещается #FF и выполняется команда прерывания. Подпрограмма может использоваться также с адреса: +;#2FC3 для прямого вывода в порт #1F. + +x2F90 LD HL,#0000 ;new было #FFFF + LD (#5CFA),HL ;типы дисководов неизвестны + LD (#5CFC),HL + call x08CA ;new + LD (#5CC8),HL ;время перемещения головок дисководов +; LD (#5CCA),HL ;неизвестно + XOR A + LD (#5D17),A ;заставку выводить + LD (#5D19),A ;дисковод по умолчанию - A: + LD (#5D18),A ;память не изменять + LD (#5D0F),A ;pаботает командный процессор TR-DOS + LD (#5D1F),A + LD A,#FF ;загрузка системного регистра + OUT (#FF),A + LD (#5C3A),A ;ошибки нет + LD (#5D16),A ;сохранение значения системного регистра + LD (#5D0C),A ;буфера нет + LD A,#C9 ;помещение в ОЗУ команды RET + LD (#5CC2),A + LD A,#D0 ;команда прерывания +x2FC3 OUT (#1F),A ;выдача команды + RET ;возврат + +;Адрес #2FC6. Проверка достижения конца каталога при его печати. + +x2FC6 CALL x050C ;проверка и обработка достижения конца буфера + LD A,(HL) ;берем первый символ имени файла + OR A ;конец каталога? + JP Z,x03AC ;если да, то окончание выдачи + CP 1 ;файл стерт? + CALL Z,x0507 ;если да, то пропуск его + RET NZ ;иначе возврат + JR x2FC6 ;повтор + +;Адрес #2FD6. Загрузка сектора в буфер. В DE поместите адрес сектора на диске. + +x2FD6 LD B,1 ;загружать 1 сектор + LD HL,#5D25 ;загружать в буфер + JP x1E67 ;загрузка сектора + +;Адрес #2FDE. Загрузка конца файла. В HL - адрес загрузки, в #5CDC - длина, в #5CF4 - откуда грузить. + +x2FDE PUSH HL ;сохранение адреса загрузки + LD DE,(#5CF4) ;берем адрес сектора на диске + CALL x2FD6 ;загрузка его в буфер + LD A,(#5CDB) ;берем количество байтов для загрузки + POP DE ;восстановление адреса загрузки + OR A ;загружаем 0 байтов? + RET Z ;если да, то возврат + LD C,A ;перевод длины загружаемой части в двухбайтную форму + LD HL,#5D25 ;перемещаем байты из буфера + LDIR + RET ;возврат + +;Адрес #2FF3. Таблица команд TR-DOS. + +x2FF3 DB #CF,"*",#D0,#D1,#E6,#D2,#EF,#F8,#FE,#BE,#F4,#D5,#F7 + DB #D3,#D4,#FF,"4",#EC,"8",#F0,#D6 + +;Адрес #3008. Таблица адресов подпрограмм, выполняющих команды TR-DOS. + +x3008 DW x0433,x1018,x1EC2,x16AB,x053A,x0787,x1815,x1AD0,x1CFB,x19A5 + DW x19A9,x19B1,x1D4D,x2182,x2656,x0690,x2997,x2DA1,x29AE,x11CE + DW x1810 + +;Адрес #3032. Сжатие командной строки. Строку поместите в буфер редактора. Помещает в #5CD6 #FF и устанавливает #5D11. + +x3032 LD HL,(#5C59) ;берем адрес буфера редактора + LD (#5D11),HL ;установка адреса командной строки + LD (#5CD9),HL ;установка адреса текущего символа + LD A,#FF ;подана прямая команда + LD (#5CD6),A + LD HL,#5CDB ;любой адрес + LD (#5CD7),HL + JR x3057 ;сжатие строки и возврат + +;Адрес #3048. Сжатие командной строки. В HL поместите адрес строки. Устанавливает #5CD6 и #5D11. Используется также с адреса: +;#3057 (сжатие строки; установите #5CD6, #5CD7 и #5CD9). + +x3048 LD (#5D11),HL ;установка адреса строки + LD (#5CD9),HL ;и адреса текущего ключевого слова + CALL x30E1 ;проверка, где находится строка + RET NZ ;если строка не найдена, то возврат + INC HL ;вычисление адреса поля длины строки + INC HL + LD (#5CD7),HL ;установка адреса поля длины строки +x3057 CALL x30A9 ;определение номера ключевого слова + JR NZ,x3087 ;если это не ключевое слово, то следующий символ + EX DE,HL ;переброска адреса последнего символа ключевого слова в DE + INC DE ;вычисление адреса символа после ключевого слова + LD B,0 ;перевод номера ключевого слова в 2-х байтную форму + LD HL,x31C8 ;адрес таблицы кодов ключевых слов + ADD HL,BC ;вычисление адреса кода ключевого слова + LD A,(HL) ;берем этот код + LD HL,(#5CD9) ;берем адрес ключевого слова + LD (HL),A ;замена его одним символом + INC HL ;вычисление адреса второго символа ключевого слова + EX DE,HL ;переброска его в DE + RST #20 ;вычисление количества стираемых символов + DW #19DD + PUSH BC ;сохранение его + RST #20 ;уничтожение ненужных символов + DW #19E8 + POP BC ;восстановление количества стертых символов + LD A,(#5CD6) ;строка находится в программе на бейсике? + OR A + JR NZ,x3087 ;если нет, то ее длина нигде не обозначена + LD HL,(#5CD7) ;берем адрес поля длины строки + LD E,(HL) ;берем длину строки + INC HL + LD D,(HL) + EX DE,HL ;перебросим ее в HL + OR A + SBC HL,BC ;скорректируем ее + EX DE,HL ;перебросим в DE + LD (HL),D ;и загрузим обратно + DEC HL + LD (HL),E +x3087 LD HL,(#5CD9) ;берем адрес текущего символа + LD A,(HL) ;берем этот символ + CP #D ;это ENTER? + RET Z ;если да, то возврат + INC HL ;следующий символ + LD (#5CD9),HL + LD A,(HL) ;берем его + CP #D ;это ENTER? + RET Z ;если да, то возврат + CP #22 ;это кавычки? + JR NZ,x3057 ;если нет, то повтор +x309A INC HL ;следующий символ + LD A,(HL) ;берем его + CP #D ;это ENTER? + RET Z ;если да, то возврат + CP #22 ;это кавычки? + JR NZ,x309A ;если нет, то следующий символ + INC HL ;следующий символ + LD (#5CD9),HL + JR x3057 ;повтор + +;Адрес #30A9. Определение номера ключевого слова. Установите #5CD9. После возврата если флаг Z установлен, то в C будет номер ключевого слова, а в HL - адрес последнего символа ключевого слова; иначе ключевое слово не было опознано, а в HL будет адрес из #5CD9. + +x30A9 LD HL,(#5CD9) ;берем адрес ключевого слова в строке + LD DE,x30FD ;адрес таблицы ключевых слов + LD C,0 ;начнем со слова 0 +x30B1 LD A,(HL) ;берем символ слова из нашей строки + AND #DF ;буква заглавная + LD B,A ;загрузка символа в B + OR A ;это CHR$ 0? + JR NZ,x30BB ;если да, то + INC HL ;следующий символ + JR x30B1 ;и повтор +x30BB LD A,(DE) ;берем символ из таблицы + AND #80 ;его бит 7 включен? + JR NZ,x30C8 ;если да, то этот символ последний + LD A,(DE) ;снова берем символ из таблицы + CP B ;сравнение символов + JR NZ,x30D9 ;если они не совпадают, то проверка следующего слова + INC HL ;адреса следующих символов + INC DE + JR x30B1 ;повтор +x30C8 LD A,(DE) ;берем символ из таблицы + AND #7F ;сбрасываем бит 7 + CP B ;сравниваем символы + RET Z ;если они совпали, то возврат +x30CD INC C ;номер следующего слова + LD HL,(#5CD9) ;берем адрес ключевого слова в строке + INC DE ;следующий символ из таблицы + LD A,(DE) + CP #FF ;конец таблицы? + JR NZ,x30B1 ;если нет, то повтор + OR A ;сброс флага Z + RET ;возврат +x30D9 INC DE ;следующий символ из таблицы + LD A,(DE) + AND #80 ;его бит 7 включен? + JR Z,x30D9 ;если да, то следующий символ + JR x30CD ;проверка достижения конца таблицы + +;Адрес #30E1. Проверка местонахождения строки. Устанавливает #5CD6, а в HL помещает адрес поля длины строки минус 2. + +x30E1 LD HL,(#5C45) ;берем номер выполняющейся строки + INC HL ;подана прямая команда? + INC HL + LD A,H + OR L + JR Z,x30F4 ;если да, то установка флага + XOR A ;команда находится в строке программы на бейсике + LD (#5CD6),A + DEC HL ;восстановление номера строки + DEC HL + RST #20 ;определение адреса строки + DW #196E + RET ;возврат +x30F4 LD A,#FF ;подана прямая команда + LD (#5CD6),A + LD HL,(#5C59) ;любой адрес + RET ;возврат + +;Адрес #30FD. Таблица ключевых слов TR-DOS. + +x30FD DB "SAVE" + DB #80 + DB "SAV" + DB #C5 + DB "LOAD" + DB #80 + DB "LOA" + DB #C4 + DB "RUN" + DB #80 + DB "RU" + DB #CE + DB "CAT" + DB #80 + DB "CA" + DB #D4 + DB "ERASE" + DB #80 + DB "ERAS" + DB #C5 + DB "NEW" + DB #80 + DB "NE" + DB #D7 + DB "MOVE" + DB #80 + DB "MOV" + DB #C5 + DB "MERGE" + DB #80 + DB "MERG" + DB #C5 + DB "PEEK" + DB #80 + DB "PEE" + DB #CB + DB "POKE" + DB #80 + DB "POK" + DB #C5 + DB "OPEN" + DB #83 + DB "CLOSE" + DB #83 + DB "CODE" + DB #80 + DB "COD" + DB #C5 + DB "RND" + DB #80 + DB "RN" + DB #C4 + DB "DATA" + DB #80 + DB "DAT" + DB #C1 + DB "SCREEN" + DB 4,#84 + DB "SCREEN" + DB #84 + DB "COPY" + DB #80 + DB "COP" + DB #D9 + DB "FORMAT" + DB #80 + DB "FORMA" + DB #D4 + DB "GOTO" + DB #80 + DB "GOT" + DB #CF + DB "LIST" + DB #80 + DB "LIS" + DB #D4 + DB "LINE" + DB #80 + DB "LIN" + DB #C5 + DB "VERIFY" + DB #80 + DB "VERIF" + DB #D9 + DB #FF,#FF + +;Адрес #31C8. Таблица кодов ключевых слов TR-DOS. + +x31C8 DB #F8,#F8,#EF,#EF,#F7,#F7,#CF,#CF,#D2,#D2,#E6,#E6,#D1 + DB #D1,#D5,#D5,#BE,#BE,#F4,#F4,#D3,#D4,#AF,#AF,#A5,#A5 + DB #E4,#E4,#AA,#AA,#FF,#FF,#D0,#D0,#EC,#EC,#F0,#F0,#CA + DB #CA,#D6,#D6,0 + +;Адрес #31F3. Проверка наличия системных переменных TR-DOS. Если они есть, то флаг C будет сброшен, иначе установлен. + +x31F3 LD HL,(#5C4F) ;берем адрес области описателей каналов + OR A ;для правильного вычитания + LD BC,#5D25 ;адрес области описателей каналов при наличии системных переменных TR-DOS. + SBC HL,BC ;установка флага C + RET ;возврат + +x31FD DISPLAY "Free space at ",$,": ",/D,#3201-$," byte(s)" + DS #3201-$,#FF + +x3201 ld hl,x3219 + ld de,#FCA0 + ld bc,#0318 + ld a,#FF + jr x3210 +x320E inc hl + inc hl +x3210 cp l + jr z,x320E + ldi + jp pe,x3210 + ret + +;шрифт +x3219 db #00,#00,#00,#00,#00,#00,#00,#00 + db #00,#20,#20,#20,#20,#20,#00,#20 + db #00,#50,#50,#00,#00,#00,#00,#00 + db #00,#00,#50,#F8,#50,#F8,#50,#00 + db #00,#20,#70,#A0,#70,#28,#70,#20 + db #00,#40,#48,#10,#20,#48,#08,#00 + db #00,#20,#50,#50,#60,#A8,#90,#68 + db #00,#20,#40,#00,#00,#00,#00,#00 + db #00,#08,#10,#10,#10,#10,#10,#08 + db #00,#40,#20,#20,#20,#20,#20,#40 + db #00,#00,#50,#20,#F8,#20,#50,#00 + db #00,#00,#20,#20,#F8,#20,#20,#00 + db #00,#00,#00,#00,#00,#60,#20,#40 + db #00,#00,#00,#00,#F8,#00,#00,#00 + db #00,#00,#00,#00,#00,#00,#60,#60 + db #00,#00,#08,#10,#20,#40,#80,#00 + db #00,#70,#88,#98,#A8,#C8,#88,#70 + db #00,#20,#60,#A0,#20,#20,#20,#F8 + db #00,#70,#88,#08,#30,#40,#80,#F8 + db #00,#70,#88,#08,#30,#08,#88,#70 + db #00,#18,#28,#48,#88,#F8,#08,#08 + db #00,#F8,#80,#F0,#08,#08,#08,#F0 + db #00,#70,#80,#F0,#88,#88,#88,#70 + db #00,#F8,#08,#10,#20,#40,#80,#80 + db #00,#70,#88,#88,#70,#88,#88,#70 + db #00,#70,#88,#88,#88,#78,#08,#70 + db #00,#00,#60,#60,#00,#00,#60,#60 + db #00,#00,#60,#60,#00,#60,#20,#40 +x32F9 db #00,#00,#10,#20,#40,#20 +x32FF dw #FFFF +x3301 db #10,#00 +x3203 db #00,#00,#00,#F8,#00,#F8,#00,#00 + db #00,#00,#40,#20,#10,#20,#40,#00 + db #00,#70,#88,#08,#10,#20,#00,#20 + db #00,#70,#88,#B8,#A8,#B8,#80,#78 + db #00,#70,#88,#88,#88,#F8,#88,#88 + db #00,#F0,#88,#88,#F0,#88,#88,#F0 + db #00,#70,#88,#80,#80,#80,#88,#70 + db #00,#E0,#90,#88,#88,#88,#90,#E0 + db #00,#F8,#80,#80,#F0,#80,#80,#F8 + db #00,#F8,#80,#80,#F0,#80,#80,#80 + db #00,#70,#88,#80,#B8,#88,#88,#70 + db #00,#88,#88,#88,#F8,#88,#88,#88 + db #00,#F8,#20,#20,#20,#20,#20,#F8 + db #00,#38,#10,#10,#10,#90,#90,#60 + db #00,#88,#90,#A0,#C0,#A0,#90,#88 + db #00,#80,#80,#80,#80,#80,#80,#F8 + db #00,#88,#D8,#A8,#88,#88,#88,#88 + db #00,#88,#88,#C8,#A8,#98,#88,#88 + db #00,#70,#88,#88,#88,#88,#88,#70 + db #00,#F0,#88,#88,#88,#F0,#80,#80 + db #00,#70,#88,#88,#88,#A8,#90,#68 + db #00,#F0,#88,#88,#88,#F0,#90,#88 + db #00,#70,#88,#80,#70,#08,#88,#70 + db #00,#F8,#20,#20,#20,#20,#20,#20 + db #00,#88,#88,#88,#88,#88,#88,#70 + db #00,#88,#88,#88,#88,#88,#50,#20 + db #00,#88,#88,#88,#88,#88,#A8,#50 + db #00,#88,#88,#50,#20,#50,#88,#88 + db #00,#88,#88,#50,#20,#20,#20,#20 + db #00,#F8,#08,#10,#20,#40,#80,#F8 + db #00,#38,#20,#20,#20,#20,#20,#38 +x33FB db #00,#00,#80,#40 +x33FF dw #FFFF +x3401 db #20,#10,#08,#00 +x3405 db #00,#E0,#20,#20,#20,#20,#20,#E0 + db #00,#20,#70,#A8,#20,#20,#20,#20 + db #00,#00,#00,#00,#00,#00,#00,#FC + db #00,#40,#20,#00,#00,#00,#00,#00 + db #00,#00,#60,#10,#70,#90,#90,#68 + db #00,#80,#80,#80,#E0,#90,#90,#E0 + db #00,#00,#60,#90,#80,#80,#90,#60 + db #00,#10,#10,#10,#70,#90,#90,#70 + db #00,#00,#60,#90,#90,#E0,#80,#70 + db #00,#18,#20,#20,#70,#20,#20,#20 + db #00,#00,#70,#90,#90,#70,#10,#60 + db #00,#80,#80,#80,#E0,#90,#90,#90 + db #00,#40,#00,#40,#40,#40,#40,#30 + db #00,#20,#00,#20,#20,#20,#20,#C0 + db #00,#80,#90,#A0,#C0,#A0,#90,#88 + db #00,#40,#40,#40,#40,#40,#40,#30 + db #00,#00,#D0,#A8,#A8,#A8,#A8,#A8 + db #00,#00,#E0,#90,#90,#90,#90,#90 + db #00,#00,#60,#90,#90,#90,#90,#60 + db #00,#00,#E0,#90,#90,#E0,#80,#80 + db #00,#00,#70,#90,#90,#70,#18,#10 + db #00,#00,#90,#A8,#C0,#80,#80,#80 + db #00,#00,#60,#80,#60,#10,#10,#E0 + db #00,#40,#40,#E0,#40,#40,#40,#30 + db #00,#00,#90,#90,#90,#90,#90,#60 + db #00,#00,#88,#88,#88,#50,#50,#20 + db #00,#00,#88,#88,#A8,#A8,#A8,#50 + db #00,#00,#00,#88,#50,#20,#50,#88 + db #00,#00,#90,#90,#90,#70,#10,#E0 + db #00,#00,#F0,#10,#20,#40,#80,#F0 + db #00,#20,#40,#40,#80,#40,#40,#20 +x34FD db #00,#20 +x34FF dw #FFFF +x3501 db #20,#20,#20,#20,#20,#20 +x3507 db #00,#20,#10,#10,#08,#10,#10,#20 + db #00,#00,#A8,#50,#00,#00,#00,#00 + db #00,#78,#84,#B4,#A4,#B4,#84,#78 + db #00,#FC,#FC,#FC,#FC,#FC,#FC,#FC + db #00,#00,#00,#00,#FC,#FC,#FC,#FC + db #00,#60,#F0,#78,#3C,#78,#F0,#60 + +x3537 DISPLAY "Free space at ",$,": ",/D,#35FF-$," byte(s)" + ds #35FF-$,#00 + dw #FFFF +x3601 DISPLAY "Free space at ",$,": ",/D,#36FF-$," byte(s)" + ds #36FF-$,#00 + dw #FFFF +x3701 DISPLAY "Free space at ",$,": ",/D,#37FF-$," byte(s)" + ds #37FF-$,#00 + dw #FFFF +x3801 DISPLAY "Free space at ",$,": ",/D,#38FF-$," byte(s)" + ds #38FF-$,#00 + dw #FFFF +x3901 DISPLAY "Free space at ",$,": ",/D,#39FF-$," byte(s)" + ds #39FF-$,#00 + dw #FFFF +x3A01 DISPLAY "Free space at ",$,": ",/D,#3AFF-$," byte(s)" + ds #3AFF-$,#00 + dw #FFFF +x3B01 DISPLAY "Free space at ",$,": ",/D,#3BFF-$," byte(s)" + ds #3BFF-$,#00 + dw #FFFF + +;Адрес #3C01. То же, что и #3D31. + +x3C01 JR x3C06 + +x3C03 DB #FF + +;Адрес #3C04. То же, что и #3D1A + +x3C04 JR x3C09 + +;Адрес #3C06. То же, что и #3D31. + +x3C06 JP x3D00 + +;Адрес #3C09. То же, что и #3D1A. + +x3C09 JP x3D03 + +x3C0C ret + +x3C0D push af + push hl + push de + call x3E08 + ld b,a + pop de + pop hl + pop af + jp x3E44 + +x3C1A DISPLAY "Free space at ",$,": ",/D,#3C30-$," byte(s)" + ds #3C30-$,#00 + +x3C30 in a,(#1F) + ret + +x3C33 DISPLAY "Free space at ",$,": ",/D,#3CFA-$," byte(s)" + ds #3CFA-$,#00 + +;Адрес #3CFA. То же, что и #20F1. + +x3CFA JP x20F1 + +;Адрес #3CFD. То же, что и #3D13, но не переключает ПЗУ. + +x3CFD JP x283C + +;Адрес #3D00. Вход в TR-DOS. Переключает ПЗУ. + +x3D00 NOP + JR x3D31 + +;Адрес #3D03. Выполнение команд TR-DOS из бейсика. Установите CH_ADD на префикс :REM: перед командой. Возвращает в BC код ошибки. Переключает ПЗУ. + +x3D03 NOP + JR x3D1A + +;Адрес #3D06. Подпрограмма ввода из файла данных. Переключает ПЗУ. При вызове из редактора вводит всю строку и производит выход из редактора, иначе возвращает в A символ из файла. + +x3D06 NOP + JP x25EF + +;Адрес #3D0A. То же, что и #3D0D, но не переключает ПЗУ. + +x3D0A JP x244A + +;Адрес #3D0D. Подпрограмма вывода в файл данных. Символ поместите в аккумулятор. Используется также с адреса #3D0E. Обе точки входа переключают ПЗУ. + +x3D0D NOP +x3D0E JR x3D0A + +;Адрес #3D10. То же, что и #20F1. Переключает ПЗУ. + +x3D10 NOP + JR x3CFA + +;Адрес #3D13. Переход на подпрограмму вызова подпрограмм TR-DOS из машинного кода. Адрес является переключателем. + +x3D13 NOP + JR x3CFD + +;Адрес #3D16. Переход на подпрограмму обработки ошибок. Адрес является переключателем. + +x3D16 NOP + JP x2F69 + +;Адрес #3D1A. То же, что и #3D03, но не переключает ПЗУ. + +x3D1A CALL x3D21 ;создание системных переменных TR-DOS + PUSH HL ;помещение на стек адреса переключателя ПЗУ на бейсик + JP x016C ;выполнение команды + +;Адрес #3D21. Создание области системных переменных TR-DOS, если ее нет. В HL помещается #5CC2. + +x3D21 CALL x31F3 ;проверка наличия области системных переменных + NOP + NOP + CALL C,x3D4C ;если ее нет, то создание ее + LD HL,#5CC2 ;загрузка в HL адреса переключателя ПЗУ на бейсик + RET ;возврат + + NOP + NOP + +;Адрес #3D2F. Переключение пзу на TR-DOS и переход на любой адрес. Адрес поместите на стек. + +x3D2F NOP + RET + +;Адрес #3D31. Вход в TR-DOS. + +x3D31 CALL x3D21 ;создание области системных переменных + PUSH HL ;помещение на стек адреса переключателя ПЗУ на бейсик + JP x0239 ;вход в TR-DOS + +;Адрес #3D38. Проверка наличия интерфейса-1. В случае его обнаружения происходит создание его системных переменных и в #5CF1 помещается 1. Для работы подпрограмма должна быть перемещена в любое место ОЗУ. + +x3D38 XOR A ;интерфейс-1 есть? + OUT (#F7),A + IN A,(#F7) + CP #1E + JR Z,x3D44 ;если да, то создание его системных переменных + CP #1F + RET NZ ;если нет, то возврат +x3D44 RST 8 ;создание системных переменных интерфейса-1 + DB #31 + LD A,1 ;по команде SAVE записывать 1 копию + LD (#5CEF),A + RET ;возврат + +;Адрес #3D4C. Создание системных переменных TR-DOS. При наличии интерфейса-1 перед созданием переменных TR-DOS создаются его переменные и в #5CEF помещается 1. В переменные TR-DOS помещаются: в #5CFA - #5CFC, #5CC8 - #5CCA, #5C3A, #5D16 и #5D0C - #FF; в #5D17, #5D19, #5D18, #5D0F и #5D1F - 0; в #5CC2 - #C9. Также в системный регистр помещается #FF, а на ВГ93 выдается команда прерывания. Подпрограмма портит ячейки памяти калькулятора. + +x3D4C XOR A ;выбор дисковода A: и сброс ВГ93 + OUT (#FF),A + IN A,(#F6) ;это ничего не дает + LD HL,x3D38 ;адрес подпрограммы проверки наличия интерфейса-1 + LD DE,#5C92 ;любой свободный адрес, ОЗУ + LD BC,#14 ;длина подпрограммы + LDIR ;перенос подпрограммы в ОЗУ + LD HL,x3D67 ;адрес возврата из подпрограммы + PUSH HL ;помещение его на стек + LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS + PUSH HL ;помещение его на стек + JP #5CA5 ;new запуск подпрограммы (переход на ret) + +;Адрес #3D67. Создание системных переменных TR-DOS. В переменные помещаются: в #5CFA - #5CFD, #5CC8 - #5CCB, #5C3A, #5D16 и #5D0C - #FF; в #5D17, #5D19, #5D18, #5D0F и #5D1F - 0; в #5CC2 - #C9. Также в системный регистр помещается #FF, а на ВГ93 выдается команда прерывания. + +x3D67 LD HL,x2F90 ;адрес возврата из пзу бейсика + PUSH HL ;помещение его на стек + LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS + PUSH HL ;помещение его на стек + LD HL,#1655 ;адрес подпрограммы MAKE_ROOM из ПЗУ бейсика + PUSH HL ;помещение его на стек + LD HL,#5BFF ;адрес переключателя ПЗУ на бейсик + PUSH HL ;помещение его на стек + LD (HL),#C9 ;помещение в озу команды RET + LD HL,#5CB5 ;начальный адрес области системных переменных + LD BC,#70 ;длина ее + RET ;запуск подпрограммы MAKE_ROOM + +;Адрес #3D80. Перевод строки. Используется также с адреса #3D82 (печать символа из аккумулятора). Также эта подпрограмма ошибочно используется с адреса #3D8B подпрограммой #4F6. + +x3D80 LD A,#D ;символ ENTER +x3D82 PUSH HL ;сохранение регистров + PUSH BC + PUSH DE + PUSH AF ;сохранение символа + CALL x20F1 ;изменение памяти + POP AF ;восстановление символа +x3D8A CALL x3D94 ;печать символа + CALL x20F1 ;восстановление памяти + POP DE ;восстановление регистров + POP BC + POP HL + RET ;возврат + +;Адрес #3D94. Печать символа без изменения памяти. Символ поместите в аккумулятор. + +x3D94 RST #20 + DW #0010 + RET + +;Адрес #3D98. Восстановление с ожиданием INTRQ. Используется также с адреса #3D9A (отдача команды из рег.A с ожиданием INTRQ). + +x3D98 LD A,#08 ;new восстановление +x3D9A OUT (#1F),A +x3D9C PUSH HL ;сохранение HL + RST #20 ;проверка нажатия BREAK + DW #1F54 + JR C,x3DA5 ;если нажато, то сообщение *BREAK* + RST #20 + DW #1B7B +x3DA5 POP HL ;восстановление HL + IN A,(#FF) ;INTRQ поступил? + AND #80 + JR Z,x3D9C ;если нет, то повтор + RET ;возврат + +;Адрес #3DAD. Проверка наличия диска в дисководе. Никаких установок не требуется. + +x3DAD LD A,#08 ;new команда восстановления + CALL x3D9A ;выдача команды и ожидание INTRQ + LD DE,0 ;за #10000 проходов индексный сигнал должен измениться + IN A,(#1F) ;берем индексный сигнал для образца + AND 2 + LD B,A ;запоминаем его +x3DBA IN A,(#1F) ;берем его снова + AND 2 + CP B ;он изменился? + RET NZ ;если да, то возврат + INC DE ;следующая попытка + LD A,E ;попытки кончились + OR D + JR NZ,x3DBA ;если нет, то повтор + JP x16F9 ;обработка ошибки NO DISC + +;Адрес #3DC8. Выбор дисковода, определенного по умолчанию. Вход: можно установить время перемещения головки и режим дисковода согласно описанию команды #01. Выход: эти переменные могут быть изменены согласно этому описанию. Используется также с адресов: +;#3DCB - выбор дисковода. Номер задайте в рег.A, остальное как и для предыдущей подпрограммы. +;#3DFD - задержка в 725779 тактов. +;#3DFF - задержка любой нужной длительности. В рег.A установите число, определяющее длительность задержки. + +x3DC8 LD A,(#5D19) ;берем номер дисковода по умолчанию +x3DCB call x0901 +; LD (#5CF6),A ;установка номера выбранного дисковода + LD HL,#5D16 ;выбор дисковода + LD C,A + LD A,#3C + OR C + OUT (#FF),A + LD (HL),A + CALL x3E08 ;берем время перемещения головки дисковода + AND #80 ;бит 7 выключен? + JR Z,x3DFA ;если да, то инициализацию не проводим + CALL x3DAD ;проверка наличия диска в дисководе + CALL x3E16 ;определение времени перемещения головки дисковода + CALL x3E11 ;берем тип дисковода + CP #82 ;new в этой переменной #FF? + JR Z,x3DFA ;new если да, то не определяем его + PUSH HL ;сохраняем адрес переменной с типом дисковода + CALL x1FCA ;определение количества дорожек дисковода + POP HL ;восстановление адреса переменной типа + CP #50 ;установка этой переменной + LD A,0 + JR NZ,x3DF9 + LD A,#80 +x3DF9 LD (HL),A + +;Внимание, ошибка!!! Не проверяется количество сторон дисковода и предполагается, что он односторонний. + +x3DFA CALL x1E36 ;проверка индексной области диска +x3DFD LD A,#50 ;задержка в 327842 тактов +x3DFF LD C,#FF +x3E01 DEC C + JR NZ,x3E01 + DEC A + JR NZ,x3DFF + RET ;возврат + +;Адрес #3E08. Выборка времени перемещения головки текущего дисковода. Установите #5CF6. На выходе в A будет время перемещения головки дисковода, а в HL - адрес, по которому оно находится. Используется также с адреса #3E0B (выборка параметра дисковода; в DE поместите адрес таблицы параметров и установите #5CF6; На выходе в A будет параметр, в HL - адрес его ячейки). + +x3E08 LD DE,#5CFA ;берем адрес таблицы скоростей перемещения головок +x3E0B LD HL,(#5CF6) ;смещение равно номеру дисковода + ADD HL,DE ;вычисление адреса ячейки с параметром + LD A,(HL) ;берем оттуда параметр + RET ;возврат + +;Адрес #3E11. Выборка типа дисковода. Вход: установите #5CF6. Выход: в A тип дисковода, в HL - адрес его ячейки. + +x3E11 LD DE,#5CC8 ;берем адрес таблицы типов дисководов + JR x3E0B ;выборка параметра и возврат + +;Адрес #3E16. Определение времени перемещения головки дисковода. + +x3E16 CALL x3E08 ;берем адрес ячейки со временем перемещения головки + LD B,8 ;начнем с наименьшего + LD C,4 ;4 попытки +x3E1D LD (HL),B ;установка времени перемещения головки + LD A,#08 ;new восстановление + CALL x3D9A + LD A,#20 ;позиционирование на дорожку #20 + LD B,#B + CALL x3E44 + LD B,(HL) ;берем время перемещения головки + LD A,1 ;позиционирование на дорожку 1 с заданным временем + CALL x3E44 + IN A,(#1F) ;головка на дорожке 0? + AND 4 + JR NZ,x3E3F ;если да, то ошибка + XOR A ;позиционирование на дорожку 0 + CALL x3E44 + IN A,(#1F) ;головка на дорожке 0? + AND 4 + RET NZ ;если да, то возврат +x3E3F INC B ;увеличение времени перемещения головки на 1 + DEC C ;следующая попытка + RET Z ;если попытки кончились, то возврат + JR x3E1D ;повтор + +;Адрес #3E44. Позиционирование. В A поместите физический номер дорожки, в B - время перемещения головки и выберите сторону. + +x3E44 OUT (#7F),A ;помещение номера дорожки в регистр данных + LD A,B ;получение команды позиционирования + OR #18 + JP x0800 ;отдача команды из рег.A с ожиданием INTRQ + +;Внимание!!! Здесь нужно JP #3D9A, т.к. #800 гасит биты скорости перемещения головки дисковода, следовательно позиционирование работает только с быстрой скоростью. + +;Адрес #3E4C. Позиционирование. На входе в A должен быть физический номер дорожки, а в B - время перемещения головки дисковода. + +x3E4C OUT (#7F),A ;загрузка номера дорожки в регистр данных + PUSH BC ;сохранение времени перемещения головки дисковода + LD B,A ;головка уже спозиционирована? + IN A,(#3F) + CP B + POP BC ;восстановление времени перемещения головки + PUSH AF ;сохранение результата проверки + LD A,B ;получение команды позиционирования + OR #18 + CALL x0800 ;отдача команды из рег.A с ожиданием INTRQ + +;Внимание!!! Позиционирование осуществляется только с быстрой скоростью перемещения головки, т.к. в #800 используется AND #FC. Для исправления ситуации здесь нужно поставить JP #3D9A. + + POP AF ;восстановление результата проверки положения головки + RET Z ;если головка была спозиционирована, то возврат + PUSH BC ;сохранение времени перемещения головки? + CALL x3DFD ;задержка в 725779 тактов + POP BC ;восстановление времени перемещения головки + RET ;возврат + +;Адрес #3E63. Позиционирование головки дисковода. Вход: в рег.A установите логический номер требуемой дорожки и установите #5CCD. На выходе #5CCD обнуляется. Используется также с адреса: +;#3EA0 (задержка в 3135098 тактов). + +x3E63 LD C,A ;загрузка номера дорожки в регистр C + CALL x0A01 ;выбор верхней стороны диска + CALL x3E11 ;берем тип дисковода + AND 2 ;дисковод двухсторонний? + CALL NZ,x3EAA ;если да, то выбор стороны + PUSH BC ;сохраним номер дорожки + BIT 7,(HL) ;дисковод 40-дорожечный? + JR Z,x3E83 ;если да, то номера дорожек не меняем + BIT 0,(HL) ;используем только 40 дорожек? + JR NZ,x3E83 ;если нет, то номера дорожек не меняем + IN A,(#3F) ;берем номер текущей дорожки + CP C ;головка уже спозиционирована? + JR Z,x3E82 ;если да, то номера дорожек не меняем + RLCA ;делим номер текущей дорожки на 2 + OUT (#3F),A + LD A,C ;делим номер требуемой дорожки на 2 + RLCA +x3E82 LD C,A +x3E83 CALL x3E08 ;берем время перемещения головки дисковода + LD B,A + IN A,(#3F) ;головка уже спозиционирована? + CP C + PUSH BC ;сохраним номер требуемой дорожки + CALL NZ,x3DFD ;если головка не спозиционирована, то задержка в 725779 тактов + POP BC ;восстановление номера требуемой дорожки + LD A,C + CALL x3E4C ;позиционирование + POP BC ;восстановление номера требуемой дорожки + LD A,C ;установка регистра дорожки + OUT (#3F),A + LD A,(#5CCD) ;нужна задержка после операции? + OR A + RET Z ;если нет, то возврат + XOR A ;в следующий раз задержка не понадобится + LD (#5CCD),A +x3EA0 LD B,3 ;задержка в 3135098 тактов +x3EA2 LD A,#FF + CALL x3DFF + DJNZ x3EA2 + RET ;возврат + +;Адрес #3EAA. Выбор стороны при позиционировании. Вход: в C поместите логический номер дорожки и выберите верхнюю сторону диска. Выход: будет выбрана сторона, а в C будет физический номер дорожки. + +x3EAA LD A,C ;деление номера дорожки на 2 + OR A + RRA + LD C,A + RET NC ;если номер дорожки был четный, то возврат + JP x1FF6 ;иначе выбор нижней стороны диска + +;Адрес #3EB2. Проверка индексной области дорожки. Установите #5CD1 и поместите в B время перемещения головки дисковода. Выбирается верхняя сторона и при ошибке в #5D17 помещается #FF. В регистр H помещается номер текущей дорожки. Используется также с адреса: +;#3EE7 (обработка ошибки NO DISC). + +x3EB2 CALL x1FEB ;выбор верхней стороны диска +x3EB5 IN A,(#1F) ;берем состояние контроллера + AND #80 ;сохранение флага готовности + LD (#5CCD),A + IN A,(#3F) ;берем номер текущей дорожки + LD H,A ;на случай возврата + CALL x3C0D ;преобразование и выполнение команды из рег.B + +;Внимание!!! Перед CALL #3E44 в регистр B надо поместить время перемещения головки дисковода, иначе команда, которая выполнится перед проверкой зависит от содержимого регистра B на входе в подпрограмму и последствия могут быть весьма плачевными. + + LD C,#7F ;адрес регистра данных + LD D,1 ;число, определяющее количество попыток + DI ;запрет прерываний + LD A,#C0 ;чтение индексной области + OUT (#1F),A + PUSH BC ;сохранение адреса регистра данных + LD B,3 ;определяем количество попыток +x3ECE IN A,(#FF) ;берем состояние сигналов DRQ и INTRQ + AND #C0 + JR NZ,x3EF2 ;если какой-нибудь сигнал поступил, то начало чтения + INC DE ;следующая попытка + LD A,E + OR D + JR NZ,x3ECE + DJNZ x3ECE ;повтор до конца попыток + POP BC ;восстановление адреса регистра данных + EI ;разрешение прерываний + LD A,#D0 ;остановка контроллера + OUT (#1F),A + LD A,(#5CD1) ;ошибку игнорировать? + +;Ошибка!!! Надо LD A,(#5D17). + + CP #FF + RET Z ;если да, то возврат +x3EE7 CALL x272B ;установка TAPE LOADING ERROR + LD A,#FF ;в следующий раз ошибку игнорировать + LD (#5D17),A + JP x271B ;обработка ошибки NO DISC +x3EF2 POP BC ;восстановление адреса регистра данных + IN H,(C) ;чтение первого байта +x3EF5 IN A,(#FF) ;ожидание какого-нибудь сигнала + AND #C0 + JR Z,x3EF5 + EI ;на случай возврата + +;Ошибка!!! Так можно потерять байт при чтении. + + RET M ;если поступил INTRQ, то возврат + DI ;запрет прерываний + IN A,(#7F) ;чтение байта + JR x3EF5 ;повтор + +;Адрес #3F02. В комментариях не нуждается. + +x3F02 LD (#5CFF),A + RET + +;Адрес #3F06. Похоже на предыдущее. + +x3F06 LD (#5D00),HL + RET + +;Адрес #3F0A. Запись сектора. Спозиционируйте головку и установите #5CFF и #5D00. + +x3F0A LD A,#A0 ;команда записи сектора + JR x3F10 ;переход к подпрограмме чтения / записи сектора + +;Адрес #3F0E. Загрузка сектора. Установите #5CFF и #5D00 и спозиционируйте головку. Используется также с адреса: +;#3F10 (загрузка/запись сектора; установите все для #3F0E плюс в A поместите команду чтения или записи сектора). + +x3F0E LD A,#80 ;команда чтения сектора +x3F10 LD (#5CFE),A ;установка команды +x3F13 LD D,#A ;10 попыток +x3F15 PUSH DE ;сохранение счетчика попыток + DI ;запрет прерываний + LD A,(#5CFF) ;установка сектора + INC A + OUT (#5F),A + call x0853 +; LD HL,(#5D00) ;берем адрес чтения/записи + LD C,#7F ;берем адрес регистра данных + LD A,(#5CFE) ;отдаем команду + OUT (#1F),A + CP #A0 ;была команда записи сектора? + PUSH AF + CALL Z,x3FBA ;если да, то запись данных + POP AF + CALL NZ,x3FD5 ;иначе чтение данных + POP DE ;восстановление счетчика попыток + EI ;разрешение прерываний + IN A,(#1F) ;берем состояние контроллера + LD B,A ;сохраняем его + AND #7F ;все в порядке? + RET Z ;если да, то возврат +x3F39 LD HL,x29D8 ;адрес сообщения READ ONLY + AND #40 ;запрещена запись? + JR NZ,x3F4B ;если да, то переход на обработку ошибки + LD A,B ;восстановление состояния контроллера + AND 4 ;была потеря данных? + JR Z,x3FA0 ;если нет, то обработка дисковых ошибок + DEC D ;следующая попытка + JR NZ,x3F15 ;если попытки не кончились, то повтор +x3F48 LD HL,x29E2 ;адрес сообщения DISC ERROR +x3F4B LD A,#D0 ;команда прерывания + OUT (#1F),A + LD A,B ;восстановление состояния контроллера + AND 1 ;контроллер был занят? + JP NZ,x3EE7 ;если да, то обработка ситуации NO DISC + IN A,(#3F) ;если ошибка произошла в секторе #A дорожки + OR A ;0, то возврат (игнорирование) + JR NZ,x3F5F + IN A,(#5F) + CP #A + RET Z +x3F5F PUSH HL ;сохранение адреса сообщения + CALL x1D97 ;очистка экрана + POP HL ;восстановление адреса сообщения + RST #18 ;печать сообщения + LD HL,x2A13 ;печать TRK: + RST #18 + IN A,(#3F) ;печать номера дорожки + CALL x1DA3 + LD HL,x2A18 ;печать SEC: + RST #18 + IN A,(#5F) ;печать номера сектора + CALL x1DA3 + LD HL,x29FE ;печать RETRY,ABORT,IGNORE? + RST #18 +x3F7B CALL x1052 ;ввод клавиши + CP "I" ;нажато I? + RET Z ;если да, то возврат + CP "R" ;нажато R? + JR Z,x3F94 ;если да, то перепозиционирование и повтор + CP "A" ;нажато A? + JR NZ,x3F7B ;если нет, то повтор ввода клавиши + CALL x272B ;установка TAPE LOADING ERROR + LD A,7 ;дисковая ошибка + LD (#5D0F),A + JP x01D3 ;завершение +x3F94 LD A,(#5CF5) ;перепозиционирование + CALL x3E63 + CALL x3EA0 ;задержка в 3135098 тактов + JP x3F13 ;повтор + +;Ошибка!!! Надо JP #3F13 для того, чтобы обновить число попыток. + +x3FA0 DEC D ;следующая попытка + JP Z,x3F48 ;если попытки кончились, то обработка DISC ERROR + PUSH DE ;сохранение счетчика попыток + CALL x3E08 ;берем время перемещения головки дисковода + AND 2 ;оно равно #A? + JR NZ,x3FAD + INC (HL) ;если нет, то увеличение его на 1 +x3FAD CALL x08A7 ;восстановление + LD A,(#5CF5) ;перепозиционирование + CALL x3E63 + POP DE ;восстановление счетчика попыток + JP x3F15 ;повтор + +;Адрес #3FBA. Запись данных на диск. Установите в HL адрес блока данных, в DE - число, определяющее количество циклов, за которое должна начаться запись, в C - адрес регистра данных контроллера и отдайте команду записи. Используется также с адреса #3FCA (то же, что и #3FBA, но без обработки NO DISC). + +x3FBA LD B,4 ;установка количества попыток +x3FBC IN A,(#FF) ;поступил какой-нибудь сигнал? + AND #C0 + JR NZ,x3FD1 ;если да, то начинаем запись + INC DE ;следующая попытка + LD A,E + OR D + JR NZ,x3FBC + DJNZ x3FBC + RET ;если попытки кончились, то возврат +x3FCA IN A,(#FF) ;поступил какой-нибудь сигнал? + AND #C0 + JR Z,x3FCA ;если нет, то ожидание его + RET M ;если поступил INTRQ, то возврат +x3FD1 OUTI ;вывод байта из вашей области в регистр данных + JR x3FCA ;повтор + +;Адрес #3FD5. Чтение данных с диска. Все установки аналогично подпрограмме #3FBA, но отдать нужно команду чтения. Используется также с адpеса #3FE5 (то же, что и #3FD5, но без обработки NO DISC). + +x3FD5 LD B,4 ;установка количества попыток +x3FD7 IN A,(#FF) ;поступило что-нибудь? + AND #C0 + JR NZ,x3FEC ;если да, то начинаем читать + INC DE ;следующая попытка + LD A,E + OR D + JR NZ,x3FD7 + DJNZ x3FD7 + RET ;если попытки кончились, то возврат +x3FE5 IN A,(#FF) ;поступил какой-нибудь сигнал? + AND #C0 + JR Z,x3FE5 ;если нет, то ждем его + RET M ;если это INTRQ, то возврат +x3FEC INI ;чтение байта + JR x3FE5 ;повтор + +;АДРЕС: #3FF0 вывод в порт +x3FF0 out (c),a + ret + +;АДРЕС: #3FF3 чтение порта +x3FF3 in a,(c) + ret + +x3FF6 DISPLAY "Free space at ",$,": ",/D,#4000-$," byte(s)" + ds #4000-$,#FF + + SAVEBIN "../Build/scorp/NewROM3_Tr-Dos.bin",#0000,#4000 + + + + diff --git a/ProfRom_Disasm/rom4.a80 b/ProfRom_Disasm/rom4.a80 new file mode 100755 index 0000000..87acfab --- /dev/null +++ b/ProfRom_Disasm/rom4.a80 @@ -0,0 +1,1082 @@ + DEVICE ZXSPECTRUM128 + INCLUDE "!AllConst.asm" + INCLUDE "!ram8.asm" + ORG #0000 +ROMdisk equ #0E00 + +;#0000 reset computer +;#0004 *NOT USED* (#04 байта) +;#0008 rst #08 печать сообщения по номеру в BC +;#000D *NOT USED* (#03 байта) +;#0010 rst #10 печать символа из A +;#0015 *NOT USED* (#0B байт) +;#0020 rst #20 печать строки +;#0022 *NOT USED* (#0E байт) +;#0030 rst #30 вызов процедуры из другого rom +;#0033 *NOT USED* (#05 байт) +;#0038 обработчик прерываний im 0/1 +;#003B печать строки (rst #20) +;#004A *NOT USED* (#26 байт) +;#0070 переменные ROM-disk +;#0073 загрузка блока из ROM-Disk +;#00AA *NOT USED* (55 байт) +;#00FF адрес п/п обработки прерываний im 2 +;#0101 номер текущего rom +;#0102 процедура обработки прерываний im 2 +;#0103 reset computer +;#0122 копирование переменных монитора и проверка чтения портов #7FFD/#1FFD +;#0175 переменные монитора +;#02E8 проверка оригинальный/совместимый компьютер +;#02F4 установка переменных из NVRAM +;#0305 установка переменных из NVRAM/CMOS128 +;#0312 установка переменных по данным в CMOS +;#0315 установка переменных по данным в CMOS +;#036C запись переменных в CMOS и в NVRAM +;#0378 запись переменных в NVRAM +;#0398 запись переменных в CMOS +;#046E таблица для записи переменных в CMOS +;#04FF таблица для записи переменных в NVRAM +;#0512 запись на диск сектора с конфигурацией (C. save Set Up to disk) +;#057F распаковка шрифта в rom 8 +;#059F запакованный шрифт +;#0A5A инициализация системы и печать сооветствующих сообщений +;#0CDF копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него +;#0CFA дескрипторы окон +;#0D32 копирайты +;#0E00 ROM-disk +;#4000 + + +;АДРЕС: #0000 reset computer +x0000 di + jp x0103 + +;АДРЕС: #0004 *NOT USED* (#04 байта) +x0004 ds #04 + +;АДРЕС: #0008 rst #08 печать сообщения по номеру в BC +x0008 rst #30 + dw rom5_x11CD ;печать сообщения по номеру в BC + db #05 + ret + +;АДРЕС: #000D *NOT USED* (#03 байта) +x000D ds #03 + +;АДРЕС: #0010 rst #10 печать символа из A +x0010 rst #30 + dw rom2_x2B12 ;печать символа (rst #10) + db #02 + ret + +;АДРЕС: #0015 *NOT USED* (#0B байт) +x0015 ds #0B + +;АДРЕС: #0020 rst #20 печать строки +x0020 jr x003B + +;АДРЕС: #0022 *NOT USED* (#0E байт) +x0022 ds #0E + +;АДРЕС: #0030 rst #30 вызов процедуры из другого rom +x0030 jp xE3D3 + +;АДРЕС: #0033 *NOT USED* (#05 байт) +x0033 ds #05 + +;АДРЕС: #0038 обработчик прерываний im 0/1 +x0038 ei + reti + +;АДРЕС: #003B печать строки (rst #20) +x003B ex (sp),hl + push af +x003D ld a,(hl) + rst #30 + dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) + db #02 + and #80 + inc hl + jr z,x003D + pop af + ex (sp),hl + ret + +;АДРЕС: #004A *NOT USED* (#26 байт) +x004A ds #26 + +;АДРЕС: #0070 переменные ROM-disk +x0070 db ROMdisk/#100 ;смещение начала ром диска (в блоках по 256 байт) + db #40-ROMdisk/#100;количество свободных секторов в странице + db #00 ;смещение до начала каталога + +;АДРЕС: #0073 загрузка блока из ROM-Disk + INCLUDE "!RomDisk.asm" + +;АДРЕС: #00AA *NOT USED* (55 байт) +x00AA ds #55 + +;АДРЕС: #00FF адрес п/п обработки прерываний im 2 +x00FF dw x0102 + +;АДРЕС: #0101 номер текущего rom +x0101 db #04 + +;АДРЕС: #0102 процедура обработки прерываний im 2 +x0102 ret + +;АДРЕС: #0103 reset computer +x0103 ld de,#5BEE + ld hl,x0111 + ld bc,#0011 + ldir + jp #5BEE +x0111 ld bc,#1FFD + ld a,#02 + out (c),a + ld hl,#010C ;включим плоскость 0 + ld l,(hl) + xor a + out (c),a ;rom 0/1 + jp x0000 ;reset + +;АДРЕС: #0122 копирование переменных монитора и проверка чтения портов #7FFD/#1FFD +x0122 ld hl,x0175 ;базовые переменные монитора + ld de,xE033 + ld bc,#0173 + ldir + ld hl,xE9F5 + ld (xE9F3),hl ;адрес блока описателей дисковода + ld hl,xE02C + ld (hl),#01 ;значение interleaving + ld de,#7F1F + ld c,#FD + ld a,#0E + ld b,#FF + out (c),a ;регистр #E AY + nop + in a,(c) ;читаем значение портов #7FFD и #1FFD + and #3F + cp #3F + ret z ;rom 1, ram #F, scr 5 (прочитано #FF ???) + cp #10 + ret nz ;rom 0, ram 8, scr 7 (то, что включено) + ld b,d ;bc=#7FFD + ld a,#0F ;rom 0, ram 7/F, scr 5 + out (c),a + ld b,e ;bc=#1FFD + ld a,#00 + out (c),a ;rom 0, ram 7, scr 5 + ld a,#0E + ld b,#FF + out (c),a ;регистр #E AY + nop + in a,(c) ;читаем значение портов #7FFD и #1FFD + and #3F + cp #0F + ld b,e ;bc=#1FFD + ld a,#10 + out (c),a ;rom 0, ram #F, scr 5 + ld b,d ;bc=#7FFD + ld a,#00 + out (c),a ;rom 0, ram 8, scr 7 + ret nz ; + set 5,(iy+#19) + ret + +;АДРЕС: #0175 переменные монитора +x0175: INCBIN "prof_roms/rom4_vars.bin" + +;АДРЕС: #02E8 проверка оригинальный/совместимый компьютер +;вых: nz - совместимый +; z - оригинал +x02E8 ld a,d + sub #FC + ret nz ;совместимый + ld a,e + sub #9D + ret z ;оригинал + ld a,e + sub #8B + ret ;nz - совместимый + +;АДРЕС: #02F4 установка переменных из NVRAM +x02F4 call x0445 ;чтение #FD байт NVRAM с адреса #0001 в буфер xDB69 + call x0312 ;установка переменных по данным в NVRAM + ld hl,xDB69+#2E ;xDB97 + ld (xDDA7),hl + ld hl,x04FF + jr x0315 + +;АДРЕС: #0305 установка переменных из NVRAM/CMOS128 +x0305 ld hl,xE02E + bit 5,(hl) +x030A jr nz,x02F4 ;NVRAM найден + bit 6,(hl) + ret z ;CMOS отсутствует + call x0430 ;чтение CMOS[#10..#3E] в буфер xDB69 (вых: b=#3F) + +;АДРЕС: #0312 установка переменных по данным в CMOS +;вх: b - номер ячейки CMOS +; 7,c=1 +; 6,c=1 в (hl) слово-адрес +; =0 в (hl) байт-смещение от xE014 +; 2,c=0 +; 1,c=1 запись нескольких битов переменной по маске в (hl) +; 0,c=0 запись переменной в ячейку CMOS, и переход к следующей ячейке +x0312 ld hl,x046E + +;АДРЕС: #0315 установка переменных по данным в CMOS +x0315 inc b ;b=#40 +x0316 ld c,(hl) + inc hl + bit 7,c + jr z,x0347 ;установка значения бита переменной + bit 2,c + jr nz,x0343 ;установка номера ячейки CMOS + bit 1,c + jr nz,x0325 ;установка значения битов переменной + ret + +;установка значения бита переменной +x0325 call x0419 ;определение адреса переменной (de - адрес) + bit 0,c + jr z,x033D ;запись переменной в память + ld c,(hl) + inc hl + ld a,(de) + cpl + or c + cpl ;сброс битов в переменной + ld (de),a + call x0459 ;чтение значения из буфера CMOS по адресу в B + and c ;выделение битов + ld c,a + ld a,(de) + or c + ld (de),a ;установка переменной + jr x0316 + +;запись переменной в ячейку CMOS +x033D call x0459 ;чтение значения из буфера CMOS по адресу в B + ld (de),a + jr x0315 + +;установка номера ячейки CMOS +x0343 ld b,(hl) + inc hl + jr x0316 + +;установка значения бита переменной +x0347 call x0419 ;определение адреса переменной (de - адрес) + push hl + ld a,c + and #07 + call x0410 ;получение маски для переменной (l - маска) + call x0459 ;чтение значения из буфера CMOS по адресу в B + and l + push af + ld a,c + and %00111000 + rrca + rrca + rrca + call x0410 ;получение маски для переменной (l - маска) + pop af + ld a,(de) + jr z,x0366 ;сброс бита в переменной + or l ;установка бита в переменной + jr x0368 +x0366 or l + xor l +x0368 ld (de),a ;запись переменной + pop hl + jr x0316 + +;АДРЕС: #036C запись переменных в CMOS и в NVRAM +x036C bit 6,(iy+#1A) + call nz,x0398 ;запись переменных в CMOS + bit 5,(iy+#1A) + ret z + +;АДРЕС: #0378 запись переменных в NVRAM +x0378 call x0445 ;чтение #FD байт NVRAM с адреса #0001 в буфер xDB69 + call x03B0 ;установка переменных в буфере для записи в NVRAM + ld hl,xDB69+#2E + ld (xDDA7),hl + ld hl,x04FF + call x03B3 ;установка переменных в буфере для записи в NVRAM + ld hl,xDB69 + ld de,#00FD + ld bc,#0001 + rst #30 + dw rom7_x0DD0 ;запись данных в NVRAM + db #07 + ret + +;АДРЕС: #0398 запись переменных в CMOS +x0398 call x0430 ;чтение CMOS[#10..#3E] в буфер xDB69 (вых: b=#3F) + call x03B0 ;установка переменных в буфере для записи в CMOS + ld hl,xDB69 ;запись буфера в CMOS + ld b,#10 +x03A3 ld a,(hl) + inc hl + rst #30 + dw rom7_x2023 ;запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F + db #07 + inc b + ld a,b + cp #3F + jr nz,x03A3 + ret + +;установка переменных в буфере для записи в CMOS +x03B0 ld hl,x046E +x03B3 inc b +x03B4 ld c,(hl) + inc hl + bit 7,c + jr z,x03E7 ;установка значения бита ячейки CMOS + bit 2,c + jr nz,x03E3 ;установка номера ячейки CMOS + bit 1,c + jr nz,x03C3 ;установка значения бита ячейки CMOS в буфере + ret + +;установка значения бита ячейки CMOS в буфере +;вх: b - номер ячейки CMOS +; 7,c=1 +; 6,c=1 в (hl) слово-адрес +; =0 в (hl) байт-смещение от xE014 +; 2,c=0 +; 1,c=1 запись нескольких битов переменной по маске в (hl) +; 0,c=0 запись переменной в ячейку CMOS, и переход к следующей ячейке +x03C3 call x0419 ;определение адреса переменной (de - адрес) + bit 0,c + jr z,x03DD ;запись переменной в ячейку CMOS + ld c,(hl) + inc hl + push hl + call x0459 ;чтение значения из буфера CMOS по адресу в B + cpl + or c + cpl ;сброс битов ячейки + ld l,a + ld a,(de) + and c ;выделение битов переменной + or l + pop hl + call x0456 ;запись значения в буфер CMOS по адресу в B + jr x03B4 +x03DD ld a,(de) + call x0456 ;запись значения в буфер CMOS по адресу в B + jr x03B3 + +;установка номера ячейки CMOS +;вх: 7,c=1 +; 2,c=1 +; b - номер ячейки CMOS +x03E3 ld b,(hl) + inc hl + jr x03B4 + +;установка значения бита ячейки CMOS +;вх: b - номер ячейки CMOS +; 7,c=0 +; 6,c=1 в (hl) слово-адрес +; =0 в (hl) байт-смещение от xE014 +; 5-3, номер бита в переменной +; 2-1, номер бита в ячейке CMOS +; +x03E7 call x0419 ;определение адреса переменной (de - адрес) + push hl + ld a,c + and %00111000 + rrca + rrca + rrca + call x0410 ;получение маски для переменной (l - маска) + ld a,(de) + and l ;выделение бита в переменной + push af + ld a,c + and #07 + call x0410 ;получение маски для переменной (l - маска) + call x0459 ;чтение значения из буфера CMOS по адресу в B + ld h,a ;значение ячейки CMOS + pop af + ld a,h + jr z,x0408 ;сброс бита в CMOS + or l ;установка бита в CMOS + jr x040A +x0408 or l + xor l +x040A call x0456 ;запись значения в буфер CMOS по адресу в B + pop hl + jr x03B4 + +;получение маски для переменной (l - маска) +;вх: a - номер бита +x0410 ld l,#01 + ret z +x0413 sla l + dec a + jr nz,x0413 + ret + +;определение адреса переменной +;вых: de - адрес +x0419 bit 6,c + ld e,(hl) + inc hl + jr z,x0422 + ld d,(hl) + inc hl + ret +; это байт-смещение от xE014 +x0422 bit 7,e + ld d,#00 + jr z,x0429 + dec d +x0429 push iy + ex (sp),hl + add hl,de + ex de,hl + pop hl + ret + +;чтение CMOS[#10..#3E] в буфер xDB69 +;вых: b=#3F +x0430 ld hl,xDB69 + ld (xDDA7),hl + ld b,#10 +x0438 rst #30 + dw rom7_x1F59 ;чтение ячейки CMOS + db #07 + ld (hl),a + inc hl + inc b + ld a,b + cp #3F + jr nz,x0438 + ret + +;чтение #FD байт NVRAM с адреса #0001 в буфер xDB69 +x0445 ld hl,xDB69 + ld (xDDA7),hl + ld de,#00FD + ld bc,#0001 + rst #30 + dw rom7_x0DB6 ;чтение данных из NVRAM + db #07 + ret + +;запись значения в буфер CMOS по адресу в B +x0456 scf + jr x045A +;чтение значения из буфера CMOS по адресу в B +x0459 or a +x045A push hl ;cy=1/0 - запись/чтение + ld hl,(xDDA7) ;адрес буфера CMOS + push bc + ld c,b + ld b,#00 + push af + add hl,bc + pop af + jr nc,x046A + ld (hl),a + jr x046B +x046A ld a,(hl) +x046B pop bc + pop hl + ret + +;АДРЕС: #046E таблица для записи переменных в CMOS и NVRAM +x046E db %10000100 + db #00 ;ячейка: +#00 + db %11000010 + dw xFFCC ;переменная: xFFCC, ячейка: +#01 + db %11000010 + dw xFFCD ;переменная: xFFCD, ячейка: +#02 + db %11000010 + dw xFFCE ;переменная: xFFCE, ячейка: +#03 + db %11000010 + dw xFFCF ;переменная: xFFCF, ячейка: +#04 + db %11000010 + dw xFFD0 ;переменная: xFFD0, ячейка: +#05 + db %11000010 + dw xFFD1 ;переменная: xFFD1, ячейка: +#06 + db %11000011 + dw xFFCB ;переменная: xFFCB + db %00000111 ;маска переменной + db %00000011 + db #39 ;переменная: xE014+#39 + db %00001100 + db #39 ;переменная: xE014+#39 + db %00010101 + db #39 ;переменная: xE014+#39 + db %00000110 + db #1C ;переменная: xE014+#1C + db %00001111 + db #1C ;переменная: xE014+#1C + db %10000100 + db #07 ;ячейка: +#07 + db %10000011 + db #18 ;переменная: xE014+#18 + db %00011111 + db %00010101 + db #1C ;переменная: xE014+#1C + db %00100110 + db #1C ;переменная: xE014+#1C + db %10000100 + db #08 ;ячейка: +#08 + db %10000010 + db #DE ;переменная: xE014-#22, ячейка: +#09 + db %10000010 + db #DF ;переменная: xE014-#21, ячейка: +#0A + db %10000100 + db #0A ;ячейка: +#0A + db %10000011 + db #E0 ;переменная: xE014-#20 + db %00111111 + db %10000100 + db #0B ;ячейка: +#0B + db %10000011 + db #E1 ;переменная: xE014-#1F + db %00111111 + db %10000100 + db #0C ;ячейка: +#0C + db %10000010 + db #05 ;переменная: xE014-#05, ячейка: +#0D + db %10000100 + db #0D ;ячейка: +#0D + db %10000010 + db #0A ;переменная: xE014-#0A, ячейка: +#0E + db %10000010 + db #0C ;переменная: xE014-#0C, ячейка: +#0F + db %10000011 + db #14 ;переменная: xE014+#14 + db %10011111 + db %00100101 + db #00 ;переменная: xE014+#00 + db %00110110 + db #19 ;переменная: xE014+#19 + db %10000100 + db #10 ;ячейка: +#10 + db %10000011 + db #12 ;переменная: xE014+#12 + db %00000111 + db %00101011 + db #13 ;переменная: xE014+#13 + db %10000100 + db #11 ;ячейка: +#11 + db %10000011 + db #15 ;переменная: xE014+#15 + db %10101111 + db %10000100 + db #12 ;ячейка: +#12 + db %10000011 + db #40 ;переменная: xE014+#40 + db %00011111 + db %10000100 + db #13 ;ячейка: +#13 + db %10000011 + db #41 ;переменная: xE014+#41 + db %00011111 + db %10000100 + db #14 ;ячейка: +#14 + db %10000011 + db #42 ;переменная: xE014+#42 + db %00011111 + db %10000100 + db #15 ;ячейка: +#15 + db %10000011 + db #25 ;переменная: xE014+#25 + db %01111111 + db %10000100 + db #16 ;ячейка: +#16 + db %10000011 + db #27 ;переменная: xE014+#27 + db %11101000 + db %10000100 + db #17 ;ячейка: +#17 + db %10000011 + db #2E ;переменная: xE014+#2E + db %00000111 + db %00000011 + db #2F ;переменная: xE014+#2F + db %00001100 + db #2F ;переменная: xE014+#2F + db %00010101 + db #2F ;переменная: xE014+#2F + db %10000100 + db #18 ;ячейка: +#18 + db %11000010 + dw xE11A ;переменная: xE11A, ячейка: +#19 + db %11000010 + dw xE11A+#01 ;переменная: xE11B, ячейка: +#1A + db %10000010 + db #58 ;переменная: xE014-#58, ячейка: +#1B + db %10000011 + db #57 ;переменная: xE014+#57 + db %01111111 + db %10000100 + db #1C ;ячейка: +#1C + db %10000011 + db #DD ;переменная: xE014-#23 + db %00000011 + db %10000100 + db #1D ;ячейка: +#1D + db #80 ;конец + +;АДРЕС: #04FF таблица для записи переменных в NVRAM +x04FF db %10000100 + db #00 ;ячейка: +#00 + db %10000010 + db #2A ;переменная: xE014+#2A, ячейка: +#01 + db %10000010 + db #2B ;переменная: xE014+#2B, ячейка: +#02 + db %10000010 + db #2C ;переменная: xE014+#2C, ячейка: +#03 + db %10000010 + db #2D ;переменная: xE014+#2D, ячейка: +#04 + db %10000010 + db #3A ;переменная: xE014+#3A, ячейка: +#05 + db %10000010 + db #3B ;переменная: xE014+#3B, ячейка: +#06 + db %10000010 + db #3D ;переменная: xE014+#3D, ячейка: +#07 + db %10000010 + db #26 ;переменная: xE014+#26, ячейка: +#08 + db #80 ;конец + +;АДРЕС: #0512 запись на диск сектора с конфигурацией (C. save Set Up to disk) +x0512 ld de,xDB69 + push de +;копируем подпрограмму в буфер + ld hl,x0549 + ld bc,#0100 + ldir +;установка переменных в буфере для записи на диск + ld hl,xDB69+#36 ;xDB9F + ld (xDDA7),hl + call x03B0 ;установка переменных в буфере для записи на диск + ld hl,xDB69+#64 ;xDBCD + ld (xDDA7),hl + ld hl,x04FF + call x03B3 ;установка переменных в буфере для записи на диск +;запись сектора с настройками на дискету + rst #30 + dw rom7_x107B ;инициализация дисковода и настройка на дискету + db #07 + pop hl + jr c,x0545 ;ошибка инициализации диска + ld bc,#0106 + ld de,#000F ;trk 0, sec #0F + rst #30 + dw rom7_x0229 ;R8DOS #06(6) запись группы секторов + db #07 + ret nc ;ошибок не было +x0545 rst #30 ;печать сообщения об ошибке + dw rom6_x06A6 ;печать сообщения об ошибке и продолжение работы монитора + db #06 ;(без возврата) +;процедура установки настроек из сектора диска (сохраняется на диск вместе переменными) +x0549 db "AM" ;сигнатура начала данных + ld a,(#00F1) ;rom 2 + cp #61 + jr z,x0557 ;проверка текущей страницы ПЗУ + ld a,#03 + out (#FE),a + ret +x0557 ld hl,xDB69+#36 ;xDB9F + ld (xDDA7),hl + rst #30 + dw rom4_x0312 ;установка переменных по данным в CMOS + db #04 + ld hl,xDB69+#64 ;xDBCD + ld (xDDA7),hl + ld hl,x04FF + rst #30 + dw rom4_x0315 ;установка переменных по данным в CMOS + db #04 + rst #20 + db #0D + db "AutoConfig Ok" + db #8D + ret + +;АДРЕС: #057F распаковка шрифта в rom 8 +x057F ld hl,xE483 ;адрес ret + rst #30 + dw rom6_x0D60 ;установка п/п jp xE483 по адресу xE338 + db #06 + ld hl,x059F ;адрес сжатого шрифта + ld de,xEBF5 ;буфер + push de + ld bc,#04BB ;размер + ldir ;кипируем в буфер + pop hl + ld de,xEBF5+#04BB ;xF0B0 + exx + ld hl,xF7C0 + rst #30 + dw rom6_x1108 ;распаковка блока + db #06 + ret + +;АДРЕС: #059F запакованный шрифт +x059F INCBIN "prof_roms/rom4_fnt.bin" + +;АДРЕС: #0A5A инициализация системы и печать сооветствующих сообщений +x0A5A bit 6,(iy+#14) + jr nz,x0A67 ;"теплый" сброс + rst #30 + dw rom2_x3005 ;установка текущим окна: main menu + db #02 + ld a,#0C + rst #10 ;очистка окна +x0A67 ld hl,x0D24 + call x0CDF ;копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него + rst #20 + db " ",#7F," " ;знак копирайта + dc "1993-1997 MOA Shadow Service Monitor" + bit 6,(iy+#14) + jr nz,x0B07 ;теплый сброс + ld hl,x0D08 + call x0CDF ;копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него + rst #20 + db #1B,#00,#07 ;координаты печати + dc "* fast test of computer *" + ld hl,x0CFA + call x0CDF ;копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него + rst #20 + db " Computer :",#0D + db " RAM :",#0D + db " ROM :" + db #1B,#00,#8C ;координаты + call x0C8A ;вывод сообщения с названием компьютера + ld (ix+0),#01 ;crdY=1 + ld (ix+1),#0C ;crdX=12 + call x0C74 ;сообщение: 256 K + ld (ix+0),#02 ;crdY=2 + ld (ix+1),#0C ;crdX=12 + call x0C7B ;вывод сообщения с размером ПЗУ + call x0B3B ;инициализация SMUC +;обнуление bit4 спецификации дисководов +x0B07 ld a,(xFFCA) + push af + xor a +x0B0C ld (xFFCA),a + ld c,#11 ;R8DOS #11(17) чтение кода спецификации дисковода + push af + rst #30 + dw rom7_x0229 ;вызов функции R8DOS + db #07 + res 4,(hl) + pop af + inc a + cp #04 + jr c,x0B0C + pop af + ld (xFFCA),a +;установка координаты Y курсора в окне, при необходимости + ld de,xE0C9 + or a + push ix + pop hl + sbc hl,de + ret z + ld a,(ix+2) + add a,(ix+4) + inc a ;координата Y нижней строки окна + rst #30 + dw rom2_x3005 ;установка текущим окна: main menu + db #02 + ld (ix+0),a ;координата Y курсора в окне + ret +;инициализация SMUC +x0B3B ld bc,#FEFE + in a,(c) + rrca + jr c,x0B58 ;cs не нажата + ld b,#EF + in a,(c) + bit 2,a + jr nz,x0B58 ;8 не нажата +; SMUC не проверяем + ld hl,xE02E ;cs+8 нажата + ld a,(hl) + and #07 + ld (hl),a + inc hl + ld a,(hl) + and #37 + ld (hl),a + ret +x0B58 bit 6,(iy+#14) + ret nz ;"теплый" сброс +;определение наличия SMUC, и вывод сообщения с версией + rst #30 + dw rom7_x2422 ;определение наличия SMUC + db #07 + ret c ;SMUC не найден + push de + ld hl,x0D16 + call x0CDF + rst #20 + dc " SMUC : " + pop de + call x0CC2 ;печать версии и ревизии SMUC +;определение наличия CMOS, и вывод сообщения + ld a,(ix+2) + add a,(ix+4) + inc a + rst #30 + dw rom2_x3005 ;установка текущим окна: main menu + db #02 + ld (ix+0),a + rst #30 ;определение наличия CMOS + dw rom7_x2047 ;a=#5A CMOS checksum error + db #07 ;a=#5B CMOS not found + ;a=#5C _число_ bytes CMOS found + call x0C5C ;печать сообщения + db #00 +;определение наличия NVRAM, и вывод сообщения + rst #30 ;определение наличия NVRAM + dw rom7_x0D62 ;a=#26 NVRAM not found + db #07 ;a=#27 NVRAM found + ;a=#33 NVRAM checksum error + call x0C5C ;печать сообщения + db #02 +;определение наличия interrupt controller, и вывод сообщения + call x0305 ;установка переменных из NVRAM/CMOS128 + rst #30 ;определение наличия interrupt controller + dw rom7_x1572 ;a=#24 interrupt controller not found + db #07 ;a=#25 interrupt controller found + call x0C5C ;печать сообщения + db #02 +;определение наличия последовательного порта/модема, и вывод сообщения + rst #30 + dw rom7_x15C7 ;определение наличия последовательного порта/модема + db #07 ;a=#28 modem not found + call x0C5C ;a=#29 modem found + db #02 ;a=#2A serial port not found +;индентификация HDD и печать информиции о винчестере + ld e,#00 + rst #30 + dw rom5_x30B9 ;идентификация жесткого диска + db #05 + jr nc,x0BB9 ;нет ошибок + call x0C5C ;печать сообщения с ошибкой + db #00 + jr x0C27 +x0BB9 ld a,%00101011 ;paper 5, ink 3 + ld (ix+6),a + rst #20 + dc " IDE/AT " +; печать размера винчестера + ld hl,(xE5A5) + ld de,#0000 + exx + ld bc,(xDFF2) + rst #30 + dw rom7_x0FB7 ;умножение dehl=de'hl' * bc + db #07 + rst #30 + dw rom5_x2AA4 ;преобразование количества секторов в мегабайты + db #05 + ld a,#59 + or a + call x0C5C ;печать размера винчестера + db #00 +; печать названия(модели) винчестера + ld a,%00101000 ;paper 5, ink 0 + ld (ix+6),a + ld hl,xE5A9+#036 ;xE5DF + ld b,#14 + call x0C4D +; печать серийного номера винчестера + rst #20 + db #0D + dc "Serial Number: " + ld hl,xE5A9+#014 ;xE5BD + ld b,#0A + call x0C4D +; печать версии прошивки винчестера + rst #20 + db #0D + dc "Firmware rev.: " + ld hl,xE5A9+#02E ;xE5D7 + ld b,#04 + call x0C4D + ld a,%00101001 ;paper 5, ink 1 + ld (ix+6),a + rst #20 + db #8D +;монтирование подключенных образов +x0C27 bit 7,(iy+#1B) + jr z,x0C39 ;HDD не найден + set 5,(iy+#0B) + rst #30 + dw rom5_x2503 ;монтирование всех образов с винчестера + db #05 + res 5,(iy+#0B) +;проверка нажатия клавиши +x0C39 ld hl,xE028 + bit 6,(hl) + ret nz ;"теплый" сброс +x0C3F xor a + in a,(#FE) + and #1F + xor #1F + ret nz + dec hl + ld a,l + or h + ret z + jr x0C3F + +;печать сообщения из (hl), длиной не более b*2 +x0C4D ld e,(hl) + inc hl + ld d,(hl) + inc hl + ld a,d + or a + ret z + rst #10 + ld a,e + or a + ret z + rst #10 + djnz x0C4D + ret + +;печать сообщения +;вх: a - номер сообщения +; db ? номер блока сообщений +x0C5C ld b,a + ex (sp),hl + ld c,(hl) + inc hl + ex (sp),hl + set 0,(iy+#05) ;десятичная система + ld a,%00101001 ;paper 5, ink 1 + jr c,x0C6B + ld a,%00101011 ;paper 5, ink 3 +x0C6B ld (ix+6),a ;атрибуты печати + rst #20 + dc " " + rst #08 + rst #20 + db #8D + ret + +;сообщение: 256 K +x0C74 rst #20 + dc "256 K" + ret + +;вывод сообщения с размером ПЗУ +x0C7B rst #30 ;для провреки размера ПЗУ: при 128k включится rom 2 и a=#00 + dw romA_x001B ;при 256k включится rom #A и a=#02 + db #0A + cp #02 + jr z,x0C74 ;256k ПЗУ + rst #20 + dc "128 K" + ret + +;вывод сообщения с названием компьютера +x0C8A ld de,(xDFFC) + rst #30 ;ЗАЧЕМ!!! можно напрямую + dw rom4_x02E8 ;проверка оригинальный/совместимый компьютер + db #04 + jr nz,x0CA9 + rst #20 + dc "Scorpion ZS 256 (R)" + ret +x0CA9 rst #20 + dc "Scorpion (R) compatible" + ret + +;печать версии и ревизии SMUC +;вх: d - номер версии +; e - номер ревизии +x0CC2 push de + rst #20 + dc "Ver. " + pop de + ld a,d + push de + rst #30 + dw rom2_x16EC ;печать числа a=[#0..#F] + db #02 + rst #20 + dc ", rev. " + pop de + ld a,e + rst #30 + dw rom2_x16EC ;печать числа a=[#0..#F] + db #02 + ret + +;АДРЕС: #0CDF копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него +;вх: hl - дескриптор окна +x0CDF call x0CEA + ld hl,#0000 + rst #30 + dw rom5_x2054 ;печать рамки вокруг окна + db #05 + ret +;копирование дескриптора окна в рабочуюю область +x0CEA ld de,xE102 + push de + ld bc,#000D + ldir + pop ix + ld (xE3B7),ix + ret + +;АДРЕС #0CFA дескрипторы окон: +;окно высотой 3 знакоместа на всю ширину экрана +x0CFA db #00,#00 + db #05,#01 + db #03,#1E + db %00101001 + db #07,#90,%00101000 + db #06,#28,#20,#00 +;окно высотой 1 знакоместо на всю ширину экрана +x0D08 db #00,#00 + db #03,#01 + db #01,#1E + db %00101001 + db #03,#88,%00101000 + db #06,#28,#20,#00 +;окно высотой 9 знакомест на всю ширину экрана +x0D16 db #00,#00 + db #09,#01 + db #01,#1E + db %00101001 + db #03,#88,%00101000 + db #06,#28,#20,#00 +;окно высотой 1 знакоместо на всю ширину экрана +x0D24 db #00,#00 + db #01,#01 + db #01,#1E + db %00101001 + db #03,#80,%00101000 + db #06,#28,#20,#00 + +;АДРЕС #0D32 копирайты +x0D32 db "Copyright(c) 1993, 1997 by Andrew MOA",#00 + db "FidoNet 2:5030/25.1",#00 + db "E-mail: moa@deeds.spb.ru",#00 + db "Compiled: Jul 13 1997 14:24:13 (IBM PC, MA80 crossassembler)",#00 +x0DC2 ds ROMdisk-$,#00 + +;АДРЕС: #0E00 ROM-disk +x0E00 INCBIN "prof_roms/rom4_ROMdisk.bin" + + SAVEBIN "../Build/scorp/NewROM4.bin",#0000,#4000 diff --git a/ProfRom_Disasm/rom4.bat b/ProfRom_Disasm/rom4.bat new file mode 100755 index 0000000..9ba0cb7 --- /dev/null +++ b/ProfRom_Disasm/rom4.bat @@ -0,0 +1,4 @@ +MkDir !bin +MkDir !log +DEL /Q !log\*.* +..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom4.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom5.a80 b/ProfRom_Disasm/rom5.a80 new file mode 100755 index 0000000..864300d --- /dev/null +++ b/ProfRom_Disasm/rom5.a80 @@ -0,0 +1,7671 @@ + DEVICE ZXSPECTRUM128 + INCLUDE "!AllConst.asm" + INCLUDE "!ram8.asm" + ORG #0000 +ROMdisk equ #3300 + +;#0000 *NOT USED* (#08 байт) +;#0008 rst #08 печать сообщения по номеру в BC +;#000B *NOT USED* (#05 байт) +;#0010 rst #10 печать символа из A +;#0015 *NOT USED* (#0B байт) +;#0020 rst #20 печать строки +;#0025 *NOT USED* (#0B байт) +;#0030 rst #30 вызов процедуры из другого rom +;#0033 *NOT USED* (#3D байт) +;#0070 переменные ROM-disk +;#0073 загрузка блока из ROM-Disk +;#00AA *NOT USED* (#55 байт) +;#00FF адрес п/п обработки прерываний im 2 +;#0101 номер текущего rom +;#0102 процедура обработки прерываний im 2 +;#0103 печать строки (rst #20) +;#0110 опрос Break. cy=1 не нажата +;#011C опрос манипуляторов и печать курсора +;#0169 печать курсора мыши +;#0176 восстановление экрана под курсором мыши +;#021B опрос мыши +;#0260 опрос kempston joystick +;#02A1 обработка задержек для графического курсора +;#0344 определение попадания курсора мыши в границы текущего окна +;#0381 ожидание нажатия клавиш и обработка реакции на них +;#0385 обработка реакции на нажатия клавиш +;не используется #03C9 таблица адресов процедур графического курсора +;не используется #03DF загрузка в RAM8 графического изображения курсора №2 из hl +;не используется #03E4 загрузка в RAM8 графического изображения курсора №1 из hl +;не используется #03EF загрузка из RAM8 в память hl графического изображения курсора №2 +;не используется #03F4 загрузка из RAM8 в память hl графического изображения курсора №1 +;не используется #03FF определение попадания курсора мыши в границы текущего окна +;не используется #040D опрос управления с заданными параматрами опроса манипуляторов +;не используется #041D опрос управления без опроса манипуляторов +;не используется #042C чтение координат курсора +;не используется #0431 проверка выхода курсора за нижнюю границу экрана +;#043B ОШИБКА!!!! вызов процедуры по номеру в C +;#044A таблица адресов дескрипторов меню +;#0468 сообщения для печати опций меню +;#0660 дескрипторы меню +;#08DD блок п/п определяющих доступность опций +;#08EF доступность опции K. kempston joystick +;не используется #098A проверка наличия раздела MFS на винчетере +;#09A0 процедуры обработки пунктов меню +;#0B4B ввод и сохранение значений времени/даты +;#0B61 смена параметра опции на противоположное с обновлением меню (ON/OFF, normal/trubo и т.п.) +;#0B9B ввод параметра текущей опции (число 0..255) +;#0BD0 ввод числа. в BC начальное значение +;#0BD9 ввод числа. в BC начальное значение +;#0BF3 ввод строки символов +;#0CAA печать числа bc в буфере ввода строки +;#0CB0 печать числа A в буфере ввода строки +;#0CB9 печать числа bc в буфере ввода строки +;#0CCA очистка буфера для ввода строки +;#0CDA печать числа bc в буфер hl +;#0CF6 установка и инициализация окна для ввода строки внизу экрана +;#0D02 очистка нижней строки окна меню +;#0D1A определение типа нажатой клавиши +;#0D2F определение адреса дескриптора текущего меню +;#0D42 приведение номера горячей клавиши опции к печатному символу +;#0D45 приведение номера горячей клавиши опции к печатному символу +;#0D52 определение адреса дескриптора опции +;#0D60 определение адреса с номером текущей опции текущего меню +;#0D6B печать текущего меню +;#0E6F выделение атрибутами заданной опции меню (по курсору) +;#0E8C снятие выделения атрибутами заданной опции меню (по курсору) +;#0E98 печать атрибутов заданной опции меню (по курсору) +;#0EAE !!!ОШИБКА!!! тут зависание. должен быть холодный сброс???? +;#0EB2 очистка текущего окна +;#0EB5 печать текущего меню монитора +;#0F51 вызов п/п обработки доступности опции +;#0F65 выделение старшего байта смещения +;#0F6D опредение адреса описания опции +;#0F95 перемещение курсора на следующую опцию (вниз) +;#0FA6 перемещение курсора на предыдущую опцию (вверх) +;#0FB6 определение опции под курсором мыши и переход на ее обработку +;#0FE3 получение адреса переменной и адреса маски для заданной опции +;#0FE9 получение адреса переменной и адреса маски для заданной опции +;#102E проверка диапазона числа +;#1033 процедура обработки нажатий клавиш +;#1047 печать количества цилиндров HDD +;#105B печать шапки меню монитора +;#1061 печать закодированного сообщения из hl +;#10C2 установка текущим окна: menu +;#10C7 Копирование каталога ROM-диска в ram 8 +;#10DB обработка пункта меню: R. ROM disk +;#1150 вывод окна выбора дисковода +;не используется #1181 ret +;#11A4 поиск сообщения по номеру в B[#01..#??] +;#11AF установка блока слов/сообщений по номеру в A +;#11CD печать сообщения по номеру в BC +;#122D блок слов 2 (#35 слов) +;#1353 блок слов 1 (#6A слов) +;#1554 блок слов 0 (#5E слов) +;#176D Блок сообщений 2 +;#181A Блок сообщений 1 +;#1906 Блок сообщений 0 +;не используется #1A40 пауза с индикацией на бордюре и печать даты и времени в окне монитора +;#1A4C печать даты и времени в окне монитора +;#1AA6 читаем время в строку в формате ASCII +;#1AAF читаем время в строку в формате ASCII +;#1B05 чтение даты из буфера и расчет номера дня недели +;#1B18 читаем дату в строку в формате ASCII +;#1B21 читаем дату в строку в формате ASCII +;#1B93 таблица для вычисления кода месяца +;#1BAC расчет номера дня недели +;#1C0D работа с микросхемой CMOS (rst 8: db #89) +;#1C73 ввод текстовой строки в нижней строке экрана +;#1C84 инициализация окна ввода +;#1CB3 продолжение ввода строки (вых: hl адрес введенной строки) +;#1CB8 ввод строки (вых: hl адрес введенной строки) +;#1D10 добавление символа в вводимую строку +;#1D40 удаление символа перед курсором (delete) +;#1D5A перемещение курсора в водимой строке влево +;#1D64 перемещение курсора в вводимой строке вправо +;#1D70 позиционирование курсора в конец строки +;#1D98 печать вводимой строки на экране +;#1DB7 получение адреса под курсором в буфере строки +;#1DC2 смена режима вставки/замены при вводе строки +;#1DD6 очистка буфера вводимой строки +;#1DEC удаление кода возврата каретки из строки +;#1E13 помещение символа в строку и приращение адреса в буфере строк +;#1E18 циклическое приращение адреса в буфере введенных строк +;#1E22 получем адрес конца последней введенной строки +;#1E2D сохранение введенной строки в буфере последних введенных строк +;#1E5B копирование в буфер ввода предпоследней введенной строки +;#1E91 копирование строки из буфера введенных строк в буфер ввода строки +;#1EC0 копирование в буфер ввода следующей введенной строки +;#1EE1 проверка списка на наличие введенных строк +;#1EEE звонок с установкой бордюра +;#1EF1 печать каталога и выбор позиции в нем +;#2023 сложение hl=hl+a +;#2028 вызов процедуры по таблице, адрес которой в (xE9E1) +;#202C вызов процедуры по таблице, адрес которой в (xE9E1) +;#203C расчет размеров и печать окна под каталог ROM-disk +;#2054 печать рамки вокруг окна +;#205A установка текущим окна: вывод каталога +;#207A печать рамки вокруг окна +;#2133 коррекция координат и размеров окна +;#213F координаты Y и X полей для окна редактирования дампа +;#2168 таблица со списком процедур для окна редактирования дампа +;#2278 редактирование дампа памяти в окне монитора +;#245E переименование подраздела +;Не используется #247D ret +;#247E печать нового пути после выбора пунктов меню mount/dismount DRIVE +;#249C печать буквы дисковода или пути, если это образ +;#24CE обработка пункта меню: Z. dismount.../Z. mount... +;#24F0 монтирование образа к дисководу +;#2503 монтирование всех образов с винчестера +;#2536 монтирование/отключение подраздела/образа диска +;#25EB формирование в буфере xEBF5 списка образов коллекции +;#261A удаление всех подразделов +;#2620 формирование в буфере xEBF5 списка подразделов MFS +;#2671 сортировка записей в буфере xEBF5 по порядку местоположения +;#2683 проверка разрывов между подразделами/образами и создание пустых записей в буфере +;#26AC проверка разрывов между подразделами/образами и создание пустой записи в буфере +;#2707 загрузка числа в регистры из памяти xE81B+1 +;#270D загрузка числа в регистры из памяти xE81B+8 +;#271A подсчет количества подразделов в MFS +;#2733 удаление всех разделов MBR +;#2739 формирование в буфере xEBF5 списка разделов MBR +;#2895 сортировка двух дескрипторов bc и bc+1 по адресу расположения (для записей MBR) +;#28B9 сортировка двух дескрипторов bc и bc+1 по порядку местоположения +;#28C6 уплотнение каталога MBR (удаление в буфере записей unused) +;не используется #2928 подсчет количества разделов/подразделов в каталоге +;#2936 подсчет пустых записей в каталоге разделов/подразделов +;#2960 сортировка дескрипторов подразделов +;#2990 вставляем новую запись в список записей +;#29C6 расчет адреса в каталоге +;#29D0 печать окна с образами дисков и выбор образа в нем +;#29D5 печать окна local partition information и выбор записи в нем +;#29D7 печать окна с подразделами и выбор подраздела в нем +;#29DC печать окна global partition information и выбор записи в нем +;#29F4 выбран некорректный раздел. продолжаем выбор +;#29FE блок процедур для печати окон со списком разделов/подразделов/образов +;#2AA4 преобразование количества секторов в мегабайты +;#2AC0 преобразование количества секторов в мегабайты +;#2ACC преобразование количества секторов в килобайты +;#2AE7 умножение dehl=de*#800 +;#2AF5 умножение dehl=de*2 +;#2B03 проверка первого байта записи каталога подраздела на #FF +;#2B05 проверка первого байта записи каталога подраздела на #FF +;#2B12 печать сообщения: Unused +;#2B8C поиск и печать сообщения из HL по типу в A +;#2BB8 подготовка к печати окна выбора раздела +;#2BCA создание раздела MFS +;#2C1F удаление раздела MBR +;#2C37 создание подраздела +;#2D2F ввод имени подраздела +;#2D45 удаление подраздела +;#2D5D сравнение (hl) с #FF, cy=1 если равны +;#2D63 формирование коллекции образов в подразделе TR-DOS +;#2DF0 создание первого (служебного) сектора образа и формирование данных в описателе текущего дисковода +;#2E30 расчет количества образов исходя из размеров подраздела +;#2E5D сформируем пустой сектор MBR в буфере xE5A9 +;#2E71 очистка буфера xEBF5 и установка сигнатуры раздела MFS +;#2E85 ввод имени подраздела +;#2EA7 проверка введенного имени +;#2F10 выбор типа подраздела +;#2F5D запрос на сохранение сектора MBR, если были изменения +;#2F66 формирование и запись сектора MBR +;не используется #2F94 чтение сектора в буфер xE5A9 +;#2FA8 запрос на сохранение каталога MFS, если были изменения +;#2FB1 запись каталога MFS/подраздела +;#2FCA сравнение двух чисел в памяти по адресам в de и hl +;#2FCF обнуление переменной xE9EB +;#2FDB инкременит слова (xDD89)=(xDD89)+1 +;#2FE5 декремент слова (xDD89)=(xDD89)-1 +;#2FEF умножение bc=bc*#10 +;#3000 копирование из (hl) в (de) 4х байт +;#3005 загрузка числа в регистры из памяти +6 байт к адресу hl +;#300A загрузка числа в регистры из памяти +12 байт к адресу hl +;#300E загрузка числа в регистры из памяти +;#301C загрузка числа из регистров в память +;#302A декремент (hl)=(hl)-1 +;#3035 вычитание (hl)=(hl)-(de) +;#3047 инкремент числа по адресу hl +;#3052 сложение двух 4х байтных чисел +;#3060 вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши +;#30B9 идентификация жесткого диска +;#30C6 печать окна для тестирования HDD +;#30F3 печать кода ошибки винчестера +;#3135 печать сообщения об ошибке несовпадения данных при чтении/записи на HDD +;#3163 печать текущего номера цилиндра +;#31AA удаление всех разделов MBR +;#31D4 неиспользуемая область +;#3200 каталог ROM-disk +;#3300 ROM-disk + + +;АДРЕС: #0000 *NOT USED* (#08 байт) +x0000 ds #08 + +;АДРЕС: #0008 печать сообщения по номеру в BC +x0008 jp x11CD + +;АДРЕС: #000B *NOT USED* (#05 байт) +x000B ds #05 + +;АДРЕС: #0010 печать символа из A +x0010 rst #30 + dw rom2_x2B12 ;печать символа (rst #10) + db #02 + ret + +;АДРЕС: #0015 *NOT USED* (#0B байт) +x0015 ds #0B + +;АДРЕС: #0020 печать строки +x0020 ex (sp),hl + push af + jp x0103 + +;АДРЕС: #0025 *NOT USED* (#0B байт) +x0025 ds #0B + +;АДРЕС: #0030 rst #30 вызов процедуры из другого rom +x0030 jp xE3D3 + +;АДРЕС: #0033 *NOT USED* (#3D байт) +x0033 ds #3D + +;АДРЕС: #0070 переменные ROM-disk +x0070 db #33 ;смещение начала ром диска (в блоках по 256 байт) +x0071 db #0D ;количество свободных секторов в странице + db #32 ;смещение до начала каталога + +;АДРЕС: #0073 загрузка блока из ROM-Disk + INCLUDE "!RomDisk.asm" + +;АДРЕС: #00AA *NOT USED* (#55 байт) +x00AA ds #55 + +;АДРЕС: #00FF адрес п/п обработки прерываний im 2 +x00FF dw x0102 + +;АДРЕС: #0101 номер текущего rom +x0101 db #05 + +;АДРЕС: #0102 процедура обработки прерываний im 2 +x0102 ret + +;АДРЕС: #0103 печать строки (rst #20) +x0103 ld a,(hl) + rst #30 + dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) + db #02 + and #80 + inc hl + jr z,x0103 + pop af + ex (sp),hl + ret + +;АДРЕС: #0110 опрос Break. cy=1 не нажата +x0110 ld a,#FE + in a,(#FE) + rrca + ret c ;cs не нажата + ld a,#7F + in a,(#FE) + rrca + ret + +;АДРЕС: #011C опрос манипуляторов и печать курсора +;вых: cy=1 нажата fire на джойстике/кнопка мыши +; a=#80 - курсор изменил положение +; a=#81 - курсор в пределах текущего окна +; a=#82 - курсор мыши вне пределов текущего окна +; cy=1 нажата кнопка мыши +; a=#91 - нажата левая кнопка мыши +; a=#92 - нажата правая кнопка мыши +; a=#93 - нажата средняя кнопка мыши +; a>=#94 - курсор вне пределов текущего окна +; cy=0 fire на джойстике/кнопки мыши не нажаты +x011C or a + ld hl,xE03B + bit 7,(hl) + ret z ;мышь и джойстик отключены + ld c,#00 + bit 6,(hl) + call nz,x0260 ;опрос kempston joystick + bit 4,c + jr nz,x0149 ;нажата Fire + bit 5,(hl) + jr z,x0149 ;мышь отключена + call x021B ;опрос мыши + jr z,x015E ;кнопки не нажаты, печать курсора + push hl + call x0344 ;определение попадания курсора мыши в границы текущего окна + ld (xE008),hl ;координаты курсора в окне + pop hl + ld a,c ;состояние кнопок мыши + or %10010000 + scf + bit 2,(hl) + ret z + set 3,a + ret +;нажата Fire kempstone joy/не нажата Fire kempstone joy при отключенной мыши +;hl=xE03B +;c - состояние кнопок джойстика +x0149 push hl + call x02A1 ;обработка задержек дял графического курсора + pop hl + scf + ld a,#80 + bit 0,(hl) + res 0,(hl) + jr nz,x0163 + inc a + bit 1,(hl) + res 1,(hl) + jr nz,x0163 +x015E call x0169 ;печать курсора мыши + or a + ret +x0163 bit 2,(hl) + ret z ;курсор в пределах текущего окна + ld a,#82 + ret + +;АДРЕС: #0169 печать курсора мыши +;вых: a - смещение курсора в знакоместе +; +x0169 set 7,(iy-#0A) ;курсор напечатан + ld ix,(xE12A) ;адрес данных курсора + ld hl,x01C3 ;п/п печати курсора мыши + jr x0186 + +;АДРЕС: #0176 восстановление экрана под курсором мыши +;вых: a - смещение курсора в знакоместе +; +x0176 bit 7,(iy+#27) + ret z ;мышь и джойстик отключены + ld hl,xE00A + bit 7,(hl) + ret z ;курсор не напечатан + res 7,(hl) + ld hl,x0212 ;п/п восстановления 3х байт экрана +x0186 ld (xE51C+1),hl + ld de,xDFD2 ;адрес буфера + ld hl,(xE03C) ;координаты курсора мыши + ld b,h + ld a,#C0 + sub b + ret z ;crd Y за пределами экрана + ret c ;crd Y за пределами экрана + cp #08 + jr c,x019B + ld a,#08 +x019B ld b,a ;высота для сохранения/восстановления экрана +;сохранение/восстановление экрана под курсором мыши +x019C push bc + ld c,l + ld b,h ;координаты + push bc + ld a,b + or a + rra + scf + rra + or 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 ;адрес на экране + ld a,c + and #07 ;смещение в знакоместе + call xE51C ;сохраним/восстановим 3 байта + pop hl + inc h ;crd Y +1 + pop bc + djnz x019C + ret + +;печать одной линии курсора на экране с сохранением экрана в буфере +x01C3 push hl ;сохраним в буфере + ldi + ldi + ldi + pop hl + push de + push hl + ld b,(ix+0) + ld e,(ix+1) + ld h,#00 ;линия данных + ld c,(ix+#10) + ld d,(ix+#11) + ld l,#FF ;линия маски + or a + jr z,x01F0 ;курсор печатаем с начала знакоместа +x01E0 srl b ;ротация данных и маски + rr e + rr h + scf + rr c + rr d + rr l + dec a + jr nz,0x1E0 +x01F0 ex (sp),hl ;hl адрес на экране + ld a,c + and (hl) + or b + ld (hl),a ;1й байт + inc hl + ld a,l + and #1F + jr z,x020B ;край экрана + ld a,d + and (hl) + or e + ld (hl),a ;2й байт + inc hl + ld a,l + and #1F + jr z,x020B ;край экрана + pop de + push de + ld a,e + and (hl) + or d + ld (hl),a ;3й байт +x020B pop de + inc ix + inc ix + pop de + ret + +;восстановление одной линии экрана под курсором +x0212 ex de,hl + ldi + ldi + ldi + ex de,hl + ret + +;АДРЕС: #021B опрос мыши +;вых: c - состояние кнопок мыши +; z - нет нажатых кнопок +; +x021B push hl + ld bc,#FBDF ;по оси X + in a,(c) + ld b,#FF ;крайняя координата X + ld hl,xE12C ;предыдущее состояние портов мыши + ld de,xE03C ;координаты курсора мыши + call x0244 ;коррекция crd X курсора + ld b,#FF + in a,(c) + neg + ld b,#BF ;крайняя координата Y + ex de,hl + inc hl + inc de + call x0244 ;коррекция crd Y курсора + ld b,#FA + in a,(c) + cpl + and #07 + ld c,a ;нажатые кнопки + pop hl + ret +;коррекция crd X/Y курсора +x0244 push bc + ld b,(hl) + ld (hl),a + sub b ;a - +/- дельта crd + ex de,hl + pop bc + ret z ;не было перемещения + jp m,x0256 ;движение влево/вверх + add a,(hl) ;движение вправо/вниз + jr c,x0254 + cp b ;правый/нижний предел экрана + ld (hl),a + ret c +x0254 ld (hl),b ;достигли предела экрана + ret +x0256 neg ;движение влево/вверх + ld b,a ;ABS(delta Crd) + ld a,(hl) + sub b + ld (hl),a + ret nc + ld (hl),#00 ;достигли предела экрана + ret + +;АДРЕС: #0260 опрос kempston joystick +;вых: c - состояние кнопок джойстика +; +x0260 ld bc,#FF1F + in c,(c) + ld d,(iy+#2E) ;шаг перемещения + push hl + ld hl,(xE03C) ;crd Y/X + bit 1,c ;нажатие влево + jr z,x0276 + ld a,l + sub d + jr nc,x0275 + xor a +x0275 ld l,a +x0276 bit 0,c ;нажатие вправо + jr z,x0285 + ld a,l + add a,d + jr c,x0282 + cp #FC + jr c,x0284 +x0282 ld a,#FC ;крайняя координата X +x0284 ld l,a +x0285 bit 3,c ;нажатие вверх + jr z,x028F + ld a,h + sub d + jr nc,x028E + xor a +x028E ld h,a +x028F bit 2,c ;нажатие вниз + jr z,x029C + ld a,h + add a,d + cp #BE + jr c,x029B + ld a,#BE ;крайняя координата Y +x029B ld h,a +x029C ld (xE03C),hl + pop hl + ret + +;АДРЕС: #02A1 обработка задержек дял графического курсора +;вх: c - состояние кнопок джойстика +x02A1 ld hl,xE00A + bit 4,c + jr nz,x02D8 ;нажата fire на джойстике + bit 6,(hl) + jr nz,x02C0 ;установка задержки second wait при необходимости + bit 5,(hl) + jr z,x02B5 ;сброс задержек и установка курсора №1 + ld a,(hl) + and #1F + jr nz,x0322 ;уменьшение счетчика задержки +;сброс задержек и установка курсора №1 +x02B5 ld a,(hl) + and #80 + ld (hl),a +;установка курсора №1 +x02B9 ld hl,xE12E + ld (xE12A),hl + ret +;установка задержки second wait при необходимости +x02C0 bit 5,(hl) + jr nz,x02B5 ;сброс задержек и установка курсора №1 + ld a,(hl) + and #1F + jr z,x02B5 ;сброс задержек и установка курсора №1 + res 6,(hl) + set 5,(hl) + ld a,(iy+#2C) ;значение second wait +;установка величины задержки +x02D0 push af + ld a,#E0 + and (hl) + pop de + or d + ld (hl),a + ret +;если нажата fire на джойстике +x02D8 bit 5,(hl) + jr nz,x0312 ;установка и обработка задержки second debouncing + bit 6,(hl) + jr nz,x02FF + ld a,(hl) + and #1F + jr nz,x02EA + ld a,(iy+#2A) ;значение first debouncing + jr x02D0 ;установка величины задержки +x02EA dec (hl) + ld a,(hl) + and #1F + ret nz + set 6,(hl) + ld a,(iy+#2B) ;значение before repeat + call x02D0 ;установка величины задержки + ld hl,xE14E + ld (xE12A),hl + jr x0307 +x02FF ld a,(hl) + and #1F + jr nz,x0322 ;уменьшение счетчика задержки + call x02B9 ;установка курсора №1 +x0307 call x0344 ;определение попадания курсора мыши в границы текущего окна + ld (xE008),hl ;координаты курсора мыши в текущем окне (в знакоместах) +x030D set 0,(iy+#27) + ret +;установка и обработка задержки second debouncing +x0312 bit 6,(hl) + jr nz,x031D + set 6,(hl) + ld a,(iy+#2D) ;значение second debouncing + jr x02D0 ;установка величины задержки +x031D ld a,(hl) + and #1F + jr z,x0324 +x0322 dec (hl) ;уменьшение счетчика задержки + ret +x0324 push hl + call x02B5 ;сброс задержек и установка курсора №1 + pop hl + ld a,#1F + call x02D0 ;установка величины задержки + call x0344 ;определение попадания курсора в границы текущего окна + or a + ld de,(xE008) ;предыдущие координаты курсора в текущем окне (в знакоместах) + ld (xE008),hl ;новые координаты курсора в текущем окне (в знакоместах) + sbc hl,de + ld a,h + or l + jr nz,x030D ;координаты изменились + set 1,(iy+#27) + ret + +;АДРЕС: #0344 определение попадания курсора мыши в границы текущего окна +;вых: во флагах состояние режима прерываний +; hl - координаты курсора мыши в окне в знакоместах окна +; +x0344 ld a,r + push af ;сохраним режим прерываний + di + res 2,(iy+#27) + ld hl,(xE03C) ;координаты курсора мыши + srl h + srl h + srl h + ld a,h + sub (ix+2) + jr c,x037B ;выше текущего окна + ld h,a ;координата Y в окне + cp (ix+4) + jr nc,x037B ;ниже текущего окна + ld a,(ix+3) + rlca + rlca + rlca + ld b,a + ld a,l + sub b + jr c,x037B ;левее окна + ld b,(ix+#0A) + ld l,#FF +x0371 inc l + sub b + jr nc,x0371 + ld a,l + cp (ix+#0B) + jr c,x037F ;в пределах окна +x037B set 2,(iy+#27) +x037F pop af + ret + +;АДРЕС: #0381 ожидание нажатия клавиш и обработка реакции на них +;вых: cy=0 a=#0D опция выбрана +; cy=1, a=#03 отмена с закрытием окна +; cy=1, a=a неиспользуемые комбинации. нет реакции +x0381 rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + +;АДРЕС: #0385 обработка реакции на нажатия клавиш +;вх: a - код нажатой клавиши +;вых: cy=0 a=#0D опция выбрана +; cy=1, a=#03 отмена с закрытием окна +; cy=1, a=a неиспользуемые комбинации. нет реакции +x0385 cp #82 + jr c,x03B0 ;a=[#00..#81] + jr z,x03AC ;a=#82 KempJoy fire вне окна + cp #91 + ret c ;a=[#83..#90] + cp #A0 + ccf + ret c ;a=[#A0..#FF] ???задел для кириллицы??? + bit 3,a ;a=[#91..#9F] mouse + jr nz,x03AC ;кнопка мыши вне окна + and #03 + jr z,x03A8 ;не нажата ни левая, ни правая кнопка мыши + cp #03 + jr z,x03A8 ;fire+cancel + rrca + jr nc,x03AC ;cancel на окне + call x03BD ;устанавливаем координаты в окне по курсору мыши + ccf + ld a,#0D + ret +x03A8 or #94 + scf + ret +x03AC ld a,#03 + scf + ret +x03B0 cp #80 + ret c ;a=[#00..#7F] + call x03BD ;устанавливаем координаты в окне по курсору KempJoy + cp #81 + ret c ;!!! ОШИБКА fire joy =#80 а не #81 + ld a,#0D + or a + ret +;устанавливаем координаты в окне по курсору мыши +x03BD push af + call x0344 ;определение попадания курсора мыши в границы текущего окна + ld (ix+0),h + ld (ix+1),l + pop af + ret + +;АДРЕС: #03C9 таблица адресов процедур графического курсора +x03C9 dw x041D ;опрос управления без опроса манипуляторов + dw x040D ;опрос управления с заданными параматрами опроса манипуляторов + dw x0385 ;обработка реакции на нажатия клавиш + dw x042C ;чтение координат курсора + dw x0431 ;проверка выхода курсора за нижнюю границу экрана + dw x03FF ;определение попадания курсора мыши в границы текущего окна + dw x03F4 ;загрузка из RAM8 в память hl графического изображения курсора №1 + dw x03E4 ;загрузка в RAM8 графического изображения курсора №1 из hl + dw x03EF ;загрузка из RAM8 в память hl графического изображения курсора №2 + dw x03DF ;загрузка в RAM8 графического изображения курсора №2 из hl + dw x08FB ;проверка наличия мыши + +;АДРЕС: #03DF загрузка в RAM8 графического изображения курсора №2 из hl +;вх: hl - адрес данных курсора +x03DF ld de,xE14E + jr x03E7 + +;АДРЕС: #03E4 загрузка в RAM8 графического изображения курсора №1 из hl +;вх: hl - адрес данных курсора +x03E4 ld de,xE12E +x03E7 ld bc,#0020 + rst #30 + dw rom2_x0753 ;сохранение области памяти в ram 8 + db #02 + ret + +;АДРЕС: #03EF загрузка из RAM8 в память hl графического изображения курсора №2 +;вх: hl - адрес в памяти +x03EF ld hl,xE14E + jr x03F7 + +;АДРЕС: #03F4 загрузка из RAM8 в память hl графического изображения курсора №1 +;вх: hl - адрес в памяти +x03F4 ld hl,xE12E +x03F7 ld bc,#0020 + rst #30 + dw rom2_x0749 ;восстановление области памяти из ram 8 + db #02 + ret + +;АДРЕС: #03FF определение попадания курсора мыши в границы текущего окна +;вых: de - координаты курсора на экране +; cy =0 курсор мыши в пределах текущего окна +; cy =1 курсор мыши вне пределов текущего окна +x03FF call x0344 ;определение попадания курсора мыши в границы текущего окна + call x042C ;de - координаты курсора на экране + or a + bit 2,(iy+#27) + ret z ;курсор мыши в пределах текущего окна + scf + ret + +;АДРЕС: #040D опрос управления с заданными параматрами опроса манипуляторов +;вх: 7-5,b - новые значения установок графических манипуляторов +;вых: de - координаты курсора +x040D ld hl,xE03B + push hl + ld a,b + and #E0 + ld b,a + ld a,(hl) + push af + and #1F + or b + ld (hl),a + jr x0425 + +;АДРЕС: #041D опрос управления без опроса манипуляторов +;вых: de - координаты курсора +x041D ld hl,xE03B + push hl + ld a,(hl) + res 7,(hl) ;оключение манипуляторов + push af +x0425 rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + pop bc + pop hl + ld (hl),b + +;АДРЕС: #042C чтение координат курсора +;вых: de - координаты курсора +x042C ld de,(xE03C) + ret + +;АДРЕС: #0431 проверка выхода курсора за нижнюю границу экрана +;вх: hl - координаты графического курсора +;вых: (xE03C),hl - новые координаты курсора +x0431 ld a,#BF + cp h + jr nc,x0437 + ld h,a +x0437 ld (xE03C),hl + ret + +;АДРЕС: #043B ОШИБКА!!!! вызов процедуры по номеру в C +;вх: c - номер процедуры +x043B push hl + rst #30 + dw rom2_x300F ;чтение содержимого регистра ix основной программы + db #02 + ld hl,x03C9 + ld b,#00 ;ОШИБКА!!!! в B может передаваться параметр + sla c + add hl,bc + ex (sp),hl ;ОШИБКА!!!! + ret + +;АДРЕС: #044A таблица адресов дескрипторов меню +x044A dw x0660 ;окно 0 (main menu) + dw x06B6 + dw x06CD + dw x068B + dw x0882 + dw x06F8 + dw 0 + dw x0737 + dw x0797 + dw x0762 + dw x08B2 + dw x07C2 + dw x07F2 + dw x081D + dw x084D + +;АДРЕС: #0468 сообщения для печати опций меню +;+0 7-6, дополнительное смещение координаты Y +; 5,=1 в байтах +1/2 адрес отдельно п/п печати опции меню +; 4,=1 в байте +3 номер плоскости/страницы, если п/п в другой странице +; 5,=0 в байтах +1/2 номер группы сообщений и номер сообщения в ней +; 4,=1 (+3/4) адрес переменной с номером строки [0..3] +; +5 список строк в формате: +0 длина строки без учета данного байта +; +n строка в формате +0 флаги, +1/2 смещение +; 4,=0 (+3/4) смещение до переменной/блока переменных +; 2,=0 -> смещение в следующей ячейке однобайтное +; 2,=1 -> смещение в следующих ячейках двухбайтное +; 3,=1 -> это блок переменных и в следущих ячейках адрес до ячейки со смещением до нужной переменной +; 1-0,=01 два состояния опции, номера сообщений после маски +; =10 состояние опции это число по адресу переменной опции +; =11 1-4 состояния опции, по номеру в de +;+1 номер блока сообщений +;+2 номер сообщения в этом блоке +; +x0468 db %01000000 ;C. catalogue disk + db #01,#51 +x046B db %01000000 ;format НЕ ИСПОЛЬЗУЕТСЯ!!!! + db #01,#4B +x046E db %01000000 ;D. Disk utility + db #01,#4D +x0471 db %01000000 ;F. format disk + db #01,#45 +x0474 db %01000000 ;Q. quick format + db #01,#68 +x0477 db %01000000 ;T. test disk + db #01,#4E +x047A db %01000110 ;Y. retry constant + db #01,#4C + dw #1FB7 ;#E014+#1FB7=#FFCB + db #01,#08 +x0481 db %00001101 ;I. side + db #01,#3B + dw #1FBC ;=#FFD0 + dw #FFCA + db #80 + db #3C,#3D +x048B db %00001101 ;R. track + db #01,#38 + dw #1FBC ;=#FFD0 + dw #FFCA + db #20 + db #39,#3A +x0495 db %01000010 ;L. interleaving + db #01,#52 + db #18 + db #01,#1B ;минимум и максимум +x049B db %00001101 ;S. side + db #01,#3B + dw #1FB8 ;=#FFCC + dw #FFCA + db #80 + db #3C,#3D +x04A5 db %01001101 ;T. track + db #01,#38 + dw #1FB8 ;=#FFCC + dw #FFCA + db #40 + db #39,#3A +x04AF db %01000111 ;D. disk drive + db #01,#33 + dw #1FB6 ;=#FFCA + db #34,#35,#36,#37 +x04B8 db %00001111 ;E. sector + db #01,#40 + dw #1FBC ;=#FFD0 + dw #FFCA + db #41,#42,#43,#44 +x04C3 db %00001111 ;P. speed + db #01,#1A + dw #1FB8 ;=#FFCC + dw #FFCA + db #47,#48,#49,#4A +x04CE db %01000001 ;S. sound + db #01,#31 + db #14,#01 + db #25,#26 +x04D5 db %00000001 ;A. autoconfig + db #02,#0C + db #14,#02 + db #05,#04 +x04DC db %01000001 ;R. reset RAM + db #01,#30 + db #14,#80 + db #25,#26 +x04E3 db %01000000 ;M. monitor + db #01,#0A +x04E6 db %01000000 ;R. reset + db #01,#29 +x04E9 db %00000010 ;L. string width + db #01,#27 + db #58 + db #00,#EA ;0..233 +x04EF db %00000010 ;W. page length + db #01,#28 + db #57 + db #00,#79 +x04F5 db %00000010 ;F. line feed + db #01,#2A + db #41 + db #00,#21 +x04FB db %01000010 ;C. carriage return + db #01,#2B +x04FE db %01000000 ;no search string НЕ ИСПОЛЬЗУЕТСЯ!!!! + db #00,#21 +x0501 db %00000010 ;V. form feed + db #01,#2E +x0504 db %01000010 ;no search string НЕ ИСПОЛЬЗУЕТСЯ!!!! + db #00,#21 +x0507 db %00000001 ;D. data + db #01,#23 + db #15,#80 + db #0E,#0F +x050E db %01000001 ;S. speed + db #01,#1A + db #15,#02 + db #1B,#1C +x0515 db %00000001 ;A. data bits + db #01,#1D + db #15,#04 + db #1E,#1F +x051C db %00000001 ;P. stop bits + db #01,#20 + db #15,#08 + db #21,#22 +x0523 db %01000001 ;I. interface + db #01,#17 + db #15,#01 + db #18,#19 +x052A db %01000000 ;P. printer + db #01,#0B +x052D db %01000000 ;computer НЕ ИСПОЛЬЗУЕТСЯ!!!! + db #01,#2C +x0530 db %10000000 ;0. previous menu + db #01,#07 +x0533 db %10000000 ;0. Continue program + db #01,#08 +x0536 db %01000000 ;G. magic button + db #01,#09 +x0539 db %01000000 ;B. Save & load + db #01,#2D +x053C db %01000000 ;M. Monitor + db #01,#0A +x053F db %01000001 ;S. print screen + db #01,#03 + db #12,#04 + db #0E,#0F +x0546 db %01000000 ;P. Print Screen + db #01,#03 +x0549 db %01000000 ;P. printer * 2 + db #01,#55 +x054C db %01000000 ;S. printer * 1 + db #01,#54 +x054F db %01000000 ;D. disk ... + db #01,#0C +x0552 db %01000000 ;S. Set Up + db #01,#04 +x0555 db %01000000 ;R. reset monitor + db #01,#53 +x0558 db %01000000 ;S. save ... + db #01,#5A +x055B db %01000000 ;L. load ... + db #01,#5B +x055E db %10000000 ;R. ROM disk + db #00,#5E +x0561 db %01000001 ;A. autostart + db #01,#69 + db #14,#04 + db #25,#26 +x0568 db %00000001 ;Z. compression + db #02,#0D + db #13,#20 + db #04,#05 +x056F db %00000010 ;?. degree + db #02,#0E + db #26,#01 + db #FF +x0575 db %01000001 ;V. Computer Speed + db #01,#58 + db #19,#40 + db #56,#57 +x057C db %01000010 ;N. NMI debouncing + db #01,#5D + db #25 + db #01,#80 ;1..127 +x0582 db %01000000 ;G. graphics manipulators + db #01,#5E +x0585 db %01000001 ;G. manipulators + db #01,#60 + db #27,#80 + db #26,#25 +x058C db %01000001 ;M. mouse + db #01,#61 + db #27,#20 + db #26,#25 +x0593 db %00000001 ;K. kempston joystick + db #01,#62 + db #27,#40 + db #26,#25 +x059A db %01000010 ;1. first debouncing + db #01,#63 + db #2A + db #01,#C8 +x05A0 db %00000010 ;2. before repeat + db #01,#64 + db #2B + db #01,#C8 +x05A6 db %00000010 ;3. second wait + db #01,#65 + db #2C + db #01,#C8 +x05AC db %00000010 ;4. second debouncing + db #01,#66 + db #2D + db #01,#C8 +x05B2 db %00000010 ;S. size of step + db #01,#67 + db #2E + db #01,#08 +x05B8 db %01000000 ;T. time & date + db #02,#01 +x05BB db %01000001 ;I. indicator + db #02,#03 + db #27,#08 + db #04,#05 +x05C2 db %01000010 ;H. hours + db #02,#06 + db #E4 ;=#1C + db #00,#18 +x05C8 db %00000010 ;M. minutes + db #02,#07 + db #E3 ;-#1D + db #00,#3C +x05CE db %00000010 ;S. seconds + db #02,#08 + db #E2 ;-#1E + db #00,#3C +x05D4 db %00000010 ;Y. years + db #02,#09 + db #E7 ;-#19 + db #00,#64 +x05DA db %00000010 ;O. months + db #02,#0A + db #E6 ;-#1A + db #01,#0D +x05E0 db %01000010 ;D. days + db #02,#0B + db #E5 ;-#1B + db #01,#20 +x05E6 db %01000000 ;P. save CMOS + db #01,#6A +x05E9 db %00000000 ;G. load CMOS + db #01,#6B +x05EC db %01000000 ;C. save Set Up to disk + db #01,#6C +x05EF db %01000000 ;H. Hard disk utility + db #02,#0F +x05F2 db %01100000 ;C. cylinders + dw x1047 ;печать количества цилиндров HDD +x05F5 db %00000010 ;H. head + db #02,#11 + db #E0 ;-#20 + db #01,#40 +x05FB db %00000010 ;S. sector + db #01,#40 + db #E1 ;-#1F + db #01,#40 +x0601 db %00000001 ;L. LBA mode + db #02,#35 + db #1C,#04 + db #04,#05 +x0608 db %01000001 ;M. TRDOS mirror + db #02,#36 + db #1C,#10 + db #05,#04 +x060F db %01000000 ;P. partition manager + db #02,#12 +x0612 db %01000000 ;A. delete all part + db #02,#14 +x0615 db %01000000 ;G. global part. table + db #02,#13 +x0618 db %01000000 ;V. partition information + db #02,#16 +x061B db %01000000 ;L. local part. table + db #02,#15 +x061E db %01000000 ;D. delete partition + db #02,#18 +x0621 db %01000000 ;C. create partition + db #02,#19 +x0624 db %00000000 ;N. rename partition + db #02,#32 +x0627 db %00000000 ;W. write to disk + db #02,#1A +x062A db %10000000 ;R. restore from disk + db #02,#1B +x062D db %01000000 ;A. auto detection hdd + db #02,#1C +x0630 db %00100011 ;D. mount on D: + dw x247E ;печать нового пути +x0633 db %00100010 ;C. mount on C: + dw x247E ;печать нового пути +x0636 db %00100001 ;B. mount on B: + dw x247E ;печать нового пути +x0639 db %01100000 ;A. mount on A: + dw x247E ;печать нового пути +x063C db %01000001 ;A. autostart + db #01,#69 + db #1C,#01 + db #26,#25 +x0643 db %00000011 ;V. from drive + db #01,#70 + db #DD ;-#23 + db #34,#35,#36,#37 +x064B db %00100000 ;Z. dismount... + dw x24CE ;печать нового названия пункта + db #0B,#80 +x0650 db %00000001 ;O. on start + db #02,#31 + db #1C,#02 + db #05,#04 +x0657 db %01000000 ;1. test + db #01,#06 +x065A db %00000000 ;2. test + db #01,#06 +x065D db %01000000 ;D. delete all part + db #02,#14 + +;АДРЕС: #0660 дескрипторы меню +;дескриптор опций +;+0,4-0 цифра/буква выбора опции 0-5/A-Z +; ,7-5 номер атрибутов печати из таблицы xEAED +;+1,3-2 старший байт смещения от x08DD до п/п определения доступности опции +; 5-4 старший байт смещения от x0468 параметры опции +; 7-6 старший байт смещения от x08DD до п/п обработки опции +;+2 младший байт смещения от x08DD до п/п определения доступности опции +;+3 младший байт смещения от x0468 параметры опции +;+4 младший байт смещения от x08DD до п/п обработки опции +x0660 db #07 ;количество опций в меню -1 + db #01,#02 ;меню: main menu + db 0*#20+#1A,%01000000,#6A,#CB,#E4 ;0. Continue program x0947/x0533/ x0AC1 + db 1*#20+#01,%01000000,#6A,#D1,#C1 ;B. Save & load x0947/x0539/x0A9E + db 2*#20+#0C,%01000000,#6F,#D4,#B2 ;M. Monitor x094C/x053C/ x0A8F + db 1*#20+#0F,%01000000,#64,#DE,#C3 ;P. Print Screen x0941/x0546/x0AA0 + db 1*#20+#03,%01000000,#6A,#06,#BC ;D. Disk utility x0947/x046E/x0A99 + db 1*#20+#07,%01010000,#5E,#87,#7A ;H. Hard disk utility x093B/x05EF/x0A57 + db 1*#20+#12,%01000000,#6A,#EA,#C2 ;S. Set Up x0947/x0552/x0A9F + db 1*#20+#15,%10010000,#3C,#0D,#9D ;V. Computer Speed x0919/x0575/x0B7A + +x068B db #07 ;количество опций в меню -1 + db #01,#5C ;меню: save & load of program + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#06,%01000000,#2F,#CE,#EC ;G. magic button x090C/x0536/ x0AC9 + db 1*#20+#12,%00000000,#6F,#F0,#D8 ;S. save ... x094C/x0558/x09B5 + db 1*#20+#19,%10010000,#6F,#00,#9D ;Z. compression x094C/x0568/x0B7A + db 1*#20+#16,%10010000,#48,#07,#A4 ;W. degree x0925/x056F/x0B81 + db 1*#20+#0B,%00000000,#6F,#F3,#DE ;L. load ... x094C/x055B/x09BB + db 1*#20+#00,%10000000,#6F,#F9,#9D ;A. autostart x094C/x0561/x0B7A + db 1*#20+#11,%00000000,#7B,#F6,#C3 ;R. ROM disk x0958/x055E/x09A0 + +x06B6 db #03 + db #01,#03 ;меню: print screen + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#12,%01000000,#6A,#E4,#A2 ;S. printer * 1 x0947/x054C/ x0A7F + db 1*#20+#0F,%01000000,#6A,#E1,#A3 ;P. printer * 2 x0947/x0549/ x0A80 + db 1*#20+#03,%00000000,#6A,#E7,#E4 ;D. disk ... x0947/x054F/x09C1 + +x06CD db #07 + db #01,#04 ;меню: Set Up + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#12,%10000000,#64,#D7,#9D ;S. print screen x0941/x053F/x0B7A + db 1*#20+#0F,%01000000,#6A,#C2,#BF ;P. printer x0947/x052A/x0A9C + db 1*#20+#0C,%01000000,#6A,#7B,#BD ;M. monitor x0947/x04E3/x0A9A + db 1*#20+#03,%01000000,#6A,#06,#BB ;D. Disk utility x0947/x046E/x0A98 + db 1*#20+#06,%01010000,#6A,#1A,#C0 ;G. graphics manipulat. x0947/x0582/x0A9D + db 1*#20+#13,%01010000,#57,#50,#BA ;T. time & date x0934/x05B8/x0A97 + db 2*#20+#11,%01000000,#6A,#ED,#73 ;R. reset monitor x0947/x0555/x0A50 + +x06F8 db #0B + db #01,#16 ;меню: Set Up printer + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#08,%10000000,#6A,#BB,#9D ;I. interface x0947/x0523/x0B7A + db 1*#20+#12,%10000000,#75,#A6,#9D ;S. speed x0952/x050E/x0B7A + db 1*#20+#00,%10000000,#75,#AD,#9D ;A. data bits x0952/x0515/x0B7A + db 1*#20+#0F,%10000000,#75,#B4,#9D ;P. stop bits x0952/x051C/x0B7A + db 1*#20+#03,%10000000,#6A,#9F,#9D ;D. data x0947/x0507/x0B7A + db 1*#20+#02,%10000000,#6A,#93,#A4 ;C. carriage return x0947/x04FB/x0B81 + db 1*#20+#05,%10000000,#6A,#8D,#A4 ;F. line feed x0947/x04F5/x0B81 + db 1*#20+#15,%10000000,#6A,#99,#A4 ;V. form feed x0947/x0501/x0B81 + db 1*#20+#0B,%10000000,#6A,#81,#A4 ;L. string width x0947/x04E9/x0B81 + db 1*#20+#16,%10000000,#6A,#87,#A4 ;W. page length x0947/x04EF/x0B81 + db 1*#20+#11,%01000000,#6A,#7E,#9B ;R. reset x0947/x04E6/x0A78 + +x0737 db #07 + db #01,#2F ;меню: Set Up monitor + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#0D,%10010000,#6A,#14,#A4 ;N. NMI debouncing x0947/x057C/x0B81 + db 1*#20+#11,%10000000,#6F,#74,#9D ;R. reset RAM x094C/x04DC/x0B7A + db 1*#20+#12,%10000000,#6A,#66,#98 ;S. sound x0947/x04CE/x0B75 + db 1*#20+#0F,%00010000,#4E,#7E,#C6 ;P. save CMOS x092B/x05E6/x09A3 + db 1*#20+#06,%00010000,#4E,#81,#CC ;G. load CMOS x092B/x05E9/x09A9 + db 1*#20+#02,%00010000,#6B,#84,#D2 ;C. save Set Up to disk x0948/x05EC/x09AF + db 1*#20+#00,%10000000,#6A,#6D,#9D ;A. autoconfig x0947/x04D5/x0B7A + +x0762 db #09 + db #01,#32 ;меню: Set Up disk utility + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#03,%01000000,#6A,#47,#F8 ;D. disk drive x0947/x04AF/x0AD5 + db 1*#20+#13,%10000000,#6A,#3D,#9D ;T. track x0947/x04A5/x0B7A + db 1*#20+#12,%10000000,#6A,#33,#9D ;S. side x0947/x049B/x0B7A + db 1*#20+#0F,%10000000,#6A,#5B,#06 ;P. speed x0947/x04C3/x0AE3 + db 1*#20+#0B,%10000000,#6A,#2D,#A4 ;L. interleaving x0947/x0495/x0B81 + db 1*#20+#11,%10000000,#6A,#23,#9D ;R. track x0947/x048B/x0B7A + db 1*#20+#08,%10000000,#6A,#19,#9D ;I. side x0947/x0481/x0B7A + db 1*#20+#04,%10000000,#6A,#50,#0B ;E. sector x0947/x04B8/x0AE8 + db 1*#20+#18,%10000000,#6A,#12,#A4 ;Y. retry constant x0947/x047A/x0B81 + +x0797 db #07 + db #01,#4D ;меню: disk utility + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#03,%01000000,#6A,#47,#F8 ;D. disk drive x0947/x04AF/x0AD5 + db 1*#20+#02,%10000000,#6A,#00,#48 ;C. catalogue disk x0947/x0468/x0B25 + db 1*#20+#05,%10000000,#6A,#09,#33 ;F. format disk x0947/x0471/x0B10 + db 1*#20+#10,%10000000,#6A,#0C,#26 ;Q. quick format x0947/x0474/x0B03 + db 1*#20+#13,%10000000,#6A,#0F,#3A ;T. test disk x0947/x0477/x0B17 + db 1*#20+#00,%10010000,#6A,#D4,#9D ;A. autostart x0947/x063C/x0B7A + db 1*#20+#15,%01010000,#6A,#DB,#F0 ;V. from drive x0947/x0643/x0ACD + +x07C2 db #08 + db #02,#0F ;меню: hard disk utility + db 0*#20+#1A,%01000000,#AD,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#00,%00010000,#80,#D1,#F5 ;A. mount on A: x095D/x0639/x09D2 + db 1*#20+#01,%00010000,#80,#CE,#F1 ;B. mount on B: x095D/x0636/x09CE + db 1*#20+#02,%00010000,#80,#CB,#ED ;C. mount on C: x095D/x0633/x09CA + db 1*#20+#03,%00010000,#80,#C8,#E9 ;D. mount on D: x095D/x0630/x09C6 + db 1*#20+#19,%10010000,#80,#E3,#9D ;Z. dismount... x095D/x064B/x0B7A + db 1*#20+#0C,%10010000,#80,#A0,#9D ;M. TRDOS mirror x095D/x0608/x0B7A + db 1*#20+#0F,%01010000,#06,#A7,#0B ;P. partition manager x08E3/x060F/x09E8 + db 1*#20+#12,%01000000,#6A,#EA,#B6 ;S. Set Up x0947/x0552/x0A93 + +x07F2 db #07 + db #02,#13 ;меню: global partition table + db 0*#20+#1A,%01000000,#6A,#C8,#DC ;0. previous menu x0947/x0530/x0AB9 + db 1*#20+#0B,%01010000,#80,#B3,#05 ;L. local part. table x095D/x061B/x09E2 + db 1*#20+#15,%01010000,#6A,#B0,#00 ;V. partition info. x0947/x0618/x09DD + db 1*#20+#02,%01010000,#86,#B9,#3F ;C. create partition x0963/x0621/x0A1C + db 2*#20+#03,%01010000,#9A,#B6,#35 ;D. delete partition x0977/x061E/x0A12 + db 2*#20+#00,%01010000,#6A,#AA,#4E ;A. delete all part x0947/x0612/x0A2B + db 1*#20+#11,%01010000,#6A,#C2,#30 ;R. restore from disk x0947/x062A/x0A0D + db 3*#20+#16,%01010000,#A1,#BF,#58 ;W. write to disk x097E/x0627/x0A35 + + +x081D db #08 + db #02,#15 ;меню: local partition table + db 0*#20+#1A,%01000000,#6A,#C8,#D7 ;0. previous menu x0947/x0530/x0AB4 + db 1*#20+#06,%01010000,#A7,#AD,#30 ;G. global part. table x0984/x0615/x0A0D + db 1*#20+#15,%00010000,#6A,#B0,#FB ;V. partition info. x0947/x0618/x09D8 + db 1*#20+#02,%01010000,#90,#B9,#44 ;C. create partition x096D/x0621/x0A21 + db 1*#20+#0D,%01010000,#9A,#BC,#49 ;N. rename partition x0977/x0624/x0A26 + db 2*#20+#03,%01010000,#9A,#B6,#3A ;D. delete partition x0977/x061E/x0A17 + db 2*#20+#00,%01010000,#6A,#AA,#53 ;A. delete all part x0947/x0612/x0A30 + db 1*#20+#11,%01010000,#6A,#C2,#08 ;R. restore from disk x0947/x062A/x09E5 + db 3*#20+#16,%01010000,#A1,#BF,#62 ;W. write to disk x097E/x0627/x0A3F + +x084D db #09 + db #01,#6D ;меню: Set Up hard disk + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#00,%01010000,#6A,#C5,#6C ;A. auto detection hdd x0947/x062D/x0A49 + db 1*#20+#0E,%10010000,#6A,#E8,#9D ;O. on start x0947/x0650/x0B7A + db 1*#20+#02,%10010000,#6A,#8A,#51 ;C. cylinders x0947/x05F2/x0B2E + db 1*#20+#07,%10010000,#6A,#8D,#89 ;H. head x0947/x05F5/x0B66 + db 1*#20+#12,%10010000,#6A,#93,#89 ;S. sector x0947/x05FB/x0B66 + db 1*#20+#0B,%10010000,#6A,#99,#9D ;L. LBA mode x0947/x0601/x0B7A + db 1*#20+#1B,%01010000,#00,#EF,#8F ;1. test x08DD/x0657/x0A6C + db 1*#20+#1C,%01010000,#00,#F2,#93 ;2. test x08DD/x065A/x0A70 + db 2*#20+#03,%01010000,#00,#F5,#97 ;D. delete all part x08DD/x065D/x0A74 + +x0882 db #08 + db #01,#5F ;меню: Set Up graphics manipulators + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#06,%10010000,#6A,#1D,#9D ;G. manipulators x0947/x0585/x0B7A + db 1*#20+#0C,%10010000,#1E,#24,#9D ;M. mouse x08FB/x058C/x0B7A + db 1*#20+#0A,%10010000,#12,#2B,#9D ;K. kempston joystick x08EF/x0593/x0B7A + db 1*#20+#12,%10010000,#0C,#4A,#A4 ;S. size of step x08E9/x05B2/x0B81 + db 1*#20+#1B,%10010000,#0C,#32,#A4 ;1. first debouncing x08E9/x059A/x0B81 + db 1*#20+#1C,%10010000,#0C,#38,#A4 ;2. before repeat x08E9/x05A0/x0B81 + db 1*#20+#1D,%10010000,#0C,#3E,#A4 ;3. second wait x08E9/x05A6/x0B81 + db 1*#20+#1E,%10010000,#0C,#44,#A4 ;4. second debouncing x08E9/x05AC/x0B81 + +x08B2 db #07 + db #02,#02 ;меню: Set Up time & date + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#07,%10010000,#57,#5A,#6E ;H. hours x0934/x05C2/x0B4B + db 1*#20+#0C,%10010000,#57,#60,#6E ;M. minutes x0934/x05C8/x0B4B + db 1*#20+#12,%10010000,#57,#66,#6E ;S. seconds x0934/x05CE/x0B4B + db 1*#20+#03,%10010000,#57,#78,#6E ;D. days x0934/x05E0/x0B4B + db 1*#20+#0E,%10010000,#57,#72,#6E ;O. months x0934/x05DA/x0B4B + db 1*#20+#18,%10010000,#57,#6C,#6E ;Y. years x0934/x05D4/x0B4B + db 1*#20+#08,%10010000,#57,#53,#84 ;I. indicator x0934/x05BB/x0B61 + +;АДРЕС: #08DD блок п/п определяющих доступность опций +;вых: cy =1 опция недоступна +; +;АДРЕС: #08DD блок п/п обработки опций +;вых: +; +x08DD bit 7,(iy+#1A) ;доступность опции 1. test + jr x0938 + +x08E3 bit 7,(iy+#1B) ;доступность опции P. partition manager + jr x0938 + +x08E9 bit 7,(iy+#27) ;доступность опции S. size of step + jr x0938 + +;АДРЕС: #08EF доступность опции K. kempston joystick +x08EF call x08FB ;доступность опции K. kempston joystick + or a + ret + +x08F4 ccf ;НЕ ИСПОЛЬЗУЕТСЯ!!!! + ret nc + res 6,(iy+#27) + ret + +x08FB push bc ;доступность опции M. mouse + ld bc,#FADF + in a,(c) + pop bc + and #38 + cp #38 + ret nc + res 5,(iy+#27) + ret + +x090C scf ;доступность опции G. magic button + bit 4,(iy-#02) + ret z ;48k + ld a,(iy-#01) + and #13 + jr x0945 + +x0919 ld a,(xE02D) ;определение доступности турбо-режима + rlca + ccf + ret + +x091F bit 5,(iy-#02) ;48k? + jr x0945 + +x0925 bit 5,(iy+#13) ;доступность опции W. degree + jr x0938 + +x092B call x091F ;доступность опции P. save CMOS + ret c + bit 5,(iy+#1A) + ret nz + +x0934 bit 6,(iy+#1A) ;доступность опции T. time & date +x0938 ret nz + scf + ret + +x093B bit 5,(iy+#1A) ;доступность опции Hard disk utility + jr x0938 + +x0941 bit 1,(iy+#12) ;доступность опции Print Screen +x0945 ret z + scf +x0947 ret + +x0948 call x091F ;доступность опции C. save Set Up to disk + ret c + +x094C ld a,(xC063) ;доступность опции Monitor + or a + jr x0945 + +x0952 bit 0,(iy+#15) ;доступность опции параметров принтера + jr x0938 + +x0958 call x10C7 ;доступность опции R. ROM disk + jr x0938 + +x095D bit 7,(iy+#1C) ;доступность монтирования образов + jr x0938 + +x0963 call x2936 ;доступность опции C. create partition + ld hl,#0003 + or a + sbc hl,de + ret + +x096D call x2936 ;доступность опции C. create partition + ld hl,#003F + or a + sbc hl,de + ret + +x0977 call x2936 ;доступность опции D. delete partition + ld a,e + or d + jr x0938 + +x097E bit 6,(iy+#1C) ;доступность опции W. write to disk + jr x0938 + +x0984 bit 6,(iy+#1C) ;доступность опции G. global part. table + jr x0945 + +;АДРЕС: #098A проверка наличия раздела MFS на винчетере +;вых: z - нет раздела MFS/либо нет винчестера +; nz - есть раздел MFS +x098A xor a + bit 7,(iy+#1B) + ret z ;проверка геометрии винчестера не пройдена + bit 7,(iy+#1C) + ret nz ;на винчестере есть раздел MFS + res 7,(iy+#0B) ;меню mount + push bc + call x2739 ;формирование в буфере xEBF5 списка разделов MBR + pop bc + xor a + ret + +;пункт меню: R. ROM disk +x09A0 jp x10DB ;обработка пункта меню: R. ROM disk + +;пункт меню: P. save CMOS +x09A3 rst #30 + dw rom4_x036C ;запись переменных в CMOS и в NVRAM + db #04 + jr x09E0 ;печать текущего меню монитора + +;пункт меню: G. load CMOS +x09A9 rst #30 + dw rom4_x0305 ;установка переменных из NVRAM/CMOS128 + db #04 + jr x09E0 ;печать текущего меню монитора + +;пункт меню: C. save Set Up to disk +x09AF rst #30 + dw rom4_x0512 ;запись на диск сектора с конфигурацией (C. save Set Up to disk) + db #04 + jr x09E0 ;печать текущего меню монитора + +;пункт меню: S. save ... +x09B5 rst #30 + dw rom6_x097E ;сохранение zs-snap (S. save ... snap) + db #06 + jr x09E0 ;печать текущего меню монитора + +;пункт меню: L. load ... +x09BB rst #30 + dw rom6_x0976 ;загрузка zs-snap (S. load ... snap) + db #06 + jr x09E0 ;печать текущего меню монитора + +;пункт меню: D. disk ... (сохранение экрана на диск) +x09C1 rst #30 + dw rom6_x067F ;сохранение экрана пользователя на диск + db #06 + ret + +;пункт меню: D. mount on D: +x09C6 ld a,#03 + jr x09D3 +;пункт меню: C. mount on C: +x09CA ld a,#02 + jr x09D3 +;пункт меню: B. mount on B: +x09CE ld a,#01 + jr x09D3 +;пункт меню: A. mount on A: +x09D2 xor a +x09D3 call x24F0 ;монтирование образа к дисководу + jr x09E0 ;печать текущего меню монитора + +;пункт меню: V. local partition infomation +x09D8 call x29D5 + jr x09E0 ;печать текущего меню монитора + +;пункт меню: V. global partition infomation +x09DD call x29DC ;печать окна global partition information и выбор записи в нем +x09E0 jr x0A54 ;печать текущего меню монитора + +;пункт меню: L. local part. table +x09E2 call x2F5D ;запрос на сохранение сектора MBR, если были изменения + +;пункт меню: R. restore from disk чтение каталога подразделов +x09E5 call x0B86 + +;пункт меню: P. partition manager (local) +x09E8 rst #30 + dw rom7_x1768 ;поиск раздела MFS + db #07 + jr nc,x09F6 ;найден + cp #63 + jr z,x0A01 ;нет подраздела MFS + rst #30 + dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора + db #07 +x09F6 res 6,(iy+#1C) ;сброс признака изменения раздела + call x2620 ;формирование в буфере xEBF5 списка подразделов MFS + ld a,#0D + jr x0A0A +x0A01 res 6,(iy+#1C) ;сброс признака изменения раздела + call x2739 ;формирование в буфере xEBF5 списка разделов MBR + ld a,#0C +x0A0A jp x0AA1 + +;пункт меню: G. global partition table/R. restore from disk чтение каталога разделов +x0A0D call x0B86 + jr x0A01 + +;пункт меню: D. delete global partition +x0A12 call x2C1F + jr x0A54 ;печать текущего меню монитора + +;пункт меню: D. delete local partition +x0A17 call x2D45 ;удаление подраздела + jr x0A54 ;печать текущего меню монитора + +;пункт меню: C. create global partition +x0A1C call x2BCA + jr x0A54 ;печать текущего меню монитора + +;пункт меню: C. create local partition +x0A21 call x2C37 ;создание подраздела + jr x0A54 ;печать текущего меню монитора + +;пункт меню: N. rename local partition +x0A26 call x245E ;переименование подраздела + jr x0A54 ;печать текущего меню монитора + +;пункт меню: A. delete all global partition +x0A2B call x2733 + jr x0A54 ;печать текущего меню монитора + +;пункт меню: A. delete all local partition +x0A30 call x261A ;удаление всех подразделов + jr x0A54 ;печать текущего меню монитора + +;пункт меню: W. write to disk (запись MBR на винчестер) +x0A35 call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши + jr nz,x0A54 ;отмена записи + call x2F66 ;формирование и запись сектора MBR + jr x0A0D ;перечитаем его и в меню + +;пункт меню: W. write to disk (запись каталога MFS на винчестер) +x0A3F call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши + jr nz,x0A54 ;оказ от записи. возврат в меню + call x2FB1 ;запись каталога MFS + jr x09E5 ;чтение каталога подразделов + +;пункт меню: A. auto detection hdd (запуск идентификации HDD) +x0A49 ld e,#01 + call x30B9 ;идентификация жесткого диска + jr x0A54 ;печать текущего меню монитора + +;пункт меню: R. reset monitor +x0A50 xor a + ld (xEAF5+#0A),a ;xEAFF испортим память +;печать текущего меню монитора +x0A54 jp x0EB5 + +;пункт меню: H. Hard disk utility +x0A57 xor a + res 7,(iy+#0B) ;меню mount + res 7,(iy+#1C) + bit 7,(iy+#1B) + jr z,x0A96 + call x2739 ;формирование в буфере xEBF5 списка разделов MBR + xor a + jr x0A96 + +;пункт меню: 1. test (тест только на чтение) +x0A6C rst #30 + dw rom7_x2105 ;тестирование HDD (1. test) (тест только на чтение) + db #07 ;возврат в текущее меню монтора + +;пункт меню: 2. test (тест на чтение/запись) +x0A70 rst #30 + dw rom7_x20F1 ;тестирование HDD (2. test) (тест на чтение/запись) + db #07 ;возврат в текущее меню монтора + +;пункт меню: D. delete all part (удаление всех разделов MBR) +x0A74 rst #30 ;!!! можно вызвать нарямую !!! + dw rom5_x31AA ;удаление всех разделов MBR + db #05 + +;пункт меню: R. reset printer +x0A78 ld hl,#0000 + ld (xE067),hl + ret + +;пункт меню: S. printer * 1 +x0A7F scf +;пункт меню: S. printer * 2 +x0A80 ld hl,xE029 + set 5,(hl) + jr nc,x0A89 + res 5,(hl) +x0A89 rst #30 + dw rom2_x08D7 + db #02 + jr x0A54 ;печать текущего меню монитора + + +;пункт меню: M. Monitor +x0A8F rst #30 + dw 0AEBh + db #02 + +x0A93 inc a ;(a=#0E) S. Set Up hard disk +x0A94 inc a +x0A95 inc a +x0A96 inc a ;(a=#0B) H. Hard disk utility +x0A97 inc a ;(a=#09) T. time & date +x0A98 inc a ;(a=#09) D. Disk utility +x0A99 inc a ;(a=#08) D. Disk utility +x0A9A inc a ;(a=#07) M. monitor +x0A9B inc a +x0A9C inc a ;(a=#05) P. printer +x0A9D inc a ;(a=#04) G. graphics manipulator +x0A9E inc a ;(a=#03) B. Save & load +x0A9F inc a ;(a=#02) S. Set Up +x0AA0 inc a ;(a=#01) P. Print Screen +x0AA1 push af + ld hl,(xE033) ;a - номер нового меню + ld a,(xDDFF) ;номер текущего меню + ld (hl),a + inc hl + ld (xE033),hl + pop af + ld (xDDFF),a +x0AB1 jp x0EB5 ;печать текущего меню монитора + +;выход из меню: L. local partition table +x0AB4 call x2FA8 ;запрос на сохранение каталога MFS, если были изменения + jr x0ABC + +;выход из меню: G. global partition table +x0AB9 call x2F5D ;запрос на сохранение сектора MBR, если были изменения + +;вызов предыдущего меню: 0. previous menu +x0ABC call x0B86 + jr x0AB1 ;печать текущего меню монитора + +;выход из монитора: 0. Continue program +x0AC1 rst #30 ;обработка 0. Continue program + dw rom2_x382E ;ожидание отжатия всех клавиш + db #02 + rst #30 + dw rom2_x013A ;выход из монитора + db #02 + +;пункт меню: G. magic button +x0AC9 rst #30 + dw rom2_x36C3 ;запись стандартного Magic-файла + db #02 + +;пункт меню: V. from drive (изменение диска автозапуска) +x0ACD ld hl,xDFF1 ;с какого диска делать автостарт + ld bc,#0004 ;мин/макс + jr x0AF8 ;циклическое изменение многовариантных параметров монитора + +;пункт меню: D. disk drive (смена текущего дисковода) +x0AD5 ld hl,xFFCA + ld bc,#0004 + call x0AF8 ;циклическое изменение многовариантных параметров монитора + rst #30 + dw rom2_x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ + db #02 + ret + +;пункт меню: P. speed (изменение скорости работы текущего дисковода) +x0AE3 ld hl,xFFCC + jr x0AEB + +;пункт меню: E. sector (изменение размера сектора текущего дисковода) +x0AE8 ld hl,xFFD0 +x0AEB ld bc,(xFFCA) + ld b,#00 ;номер текущего дисковода + add hl,bc + ld a,(hl) + and #E0 + ld b,a + ld c,#04 + +;циклическое изменение многовариантных параметров монитора +;вх: hl - адрес пееременной +; c - максимальное значение+1 +; b - минимальное значение +; +x0AF8 ld a,(hl) + and #03 + inc a + cp c + jr c,x0B00 + xor a +x0B00 or b + ld (hl),a + ret + +;пункт меню: Q. quick format (быстрое форматирование текущего диска) +x0B03 set 7,(iy+#13) + call x0CF6 ;установка и инициализация окна для ввода строки внизу экрана + rst #30 + dw rom6_x04E5 ;быстрое форматирование текущей дискеты (очистка каталога) + db #06 + jr x0B2B ;;печать текущего меню монитора + +;пункт меню: F. format disk (форматирование текущего диска) +x0B10 ld hl,xE027 + set 7,(hl) + jr x0B1C + +;пункт меню: T. test disk (проверка текущего диска) +x0B17 ld hl,xE027 + res 7,(hl) +x0B1C call x0CF6 ;установка и инициализация окна для ввода строки внизу экрана + rst #30 + dw rom6_x03A9 ;форматирование/проверка текущей дискеты + db #06 + jr x0B2B ;;печать текущего меню монитора + +;пункт меню: C. catalogue disk (вывод каталога текущего диска) +x0B25 rst #20 + db #8C + rst #30 + dw rom6_x0249 ;вывод каталога текущего дисковода (на экран/принтер) + db #06 +x0B2B jp x0EB5 ;печать текущего меню монитора + +;пункт меню: C. cylinders (установка цилиндров) +x0B2E ld hl,x0EB5 ;печать текущего меню монитора + push hl + ld bc,(xDFF2) ;значение Cylinders HDD (2 байта) + ld a,#07 +x0B38 call x0BD9 ;ввод числа. в BC начальное значение + ret c ;омена ввода + ld a,e + or d + ld a,#0C + jr z,x0B38 ;ввели ноль. повтор ввода + ld (xDFF2),de ;новое значение Cylinders HDD (2 байта) + rst #30 + dw rom7_x1F08 ;проверка геометрии винчестера + db #07 + ret + +;АДРЕС: #0B4B ввод и сохранение значений времени/даты +x0B4B res 3,(iy+#27) ;гасим индикатор времени + call x0B9B ;ввод параметра текущей опции (число 0..255) + set 3,(iy+#27) + jr c,x0B2B ;завершение по break/cancel + ld hl,xDFF6 ;бефер занчений времени/даты + rst #30 + dw rom7_x1FB2 ;запись в CMOS времени и даты + db #07 + jr x0B2B ;завершение ввода + +;АДРЕС: #0B61 смена параметра опции на противоположное с обновлением меню (ON/OFF, normal/trubo и т.п.) +;вх: bc - адрес описания опции (x0468) +; +x0B61 call x0B7A + jr x0B2B ;печать текущего меню монитора + +;пункт меню: H. head; S. sector +x0B66 call x0B9B ;ввод параметра текущей опции (число 0..255) + jr c,x0B2B ;отмена ввода. печать текущего меню монитора + rst #30 + dw rom7_x1F2D ;расчет произведения головок и секторов + db #07 + rst #30 + dw rom7_x1F08 ;проверка геометрии винчестера + db #07 + jr x0B2B ;печать текущего меню монитора + +;пункт меню: S. sound +x0B75 ld a,#FF + ld (xE004),a ;глушим звук + +;АДРЕС: #0B7A смена параметра опции на противоположное (ON/OFF, normal/trubo и т.п.) +;вх: bc - адрес описания опции (xNNNN) +x0B7A call x0FE3 + ld a,(de) + xor (hl) + ld (de),a + ret + +;АДРЕС: #0B81 ввод и сохранение значений опций +;вх: bc - адрес описания опции (xNNNN) +x0B81 call x0B9B ;ввод параметра текущей опции (число 0..255) + jr x0B2B ;печать текущего меню монитора + +;АДРЕС: #0B86 +x0B86 ld de,xDE08 + ld hl,(xE033) + xor a + sbc hl,de + add hl,de + jr z,x0B97 + dec hl + ld (xE033),hl + ld a,(hl) +x0B97 ld (xDDFF),a + ret + +;АДРЕС: #0B9B ввод параметра текущей опции (число 0..255) +;вх: bc - адрес описания опции (x0468) +;вых: cy=1 завершение по break/cancel +; +x0B9B res 5,(iy+#0E) ;ввод строки параметров + call x0FE3 ;получение адреса переменной опции + ld c,(hl) ;минимальное значение + inc hl + ld b,(hl) ;максимальное значение + ld a,(de) ;текущее значение + call x0CB0 ;печать числа A в буфере ввода строки + push de + push bc + ld a,#07 ;сообщение: enter number +x0BAD call x0BF3 ;ввод строки символов + jr c,x0BCD ;завершение ввода по break/cancel + rst #30 + dw rom2_x0DF4 ;преобразование строки в число + db #02 + jr nz,x0BAD ;неудачное преобразование. продолжаем ввод + ld a,d + or a + ld a,#0C ;сообщение: out of range + jr nz,x0BAD ;слишком большое число. продолжаем ввод + pop bc + push bc + ld a,e + call x102E ;проверка диапазона числа + ld a,#0C ;сообщение: out of range + jr c,x0BAD ;слишком большое число. продолжаем ввод + pop bc + ld a,e + pop de + ld (de),a ;меняем переменную + ret +;завершение ввода по break/cancel +x0BCD pop bc + pop de + ret + +;АДРЕС: #0BD0 ввод числа. в BC начальное значение +;вх: bc - начальное число +; hl - параметры окна ввода +;вых: cy=1 отмена ввода +; cy=0 число введено +; de - введенное число +x0BD0 ld (xE9EF),hl ;параметры окна ввода + set 5,(iy+#0E) + jr x0BDD + +;АДРЕС: #0BD9 ввод числа. в BC начальное значение +;вх: bc - начальное число +;вых: cy=1 отмена ввода +; cy=0 число введено +; de - введенное число +x0BD9 res 5,(iy+#0E) +x0BDD push af + call x0CAA ;печать числа bc в буфере ввода строки + pop af + push de + push bc +x0BE4 call x0BF3 ;ввод строки символов + jr c,x0BCD ;отмена ввода + rst #30 + dw rom2_x0DF4 ;преобразование строки в число + db #02 + jr nz,x0BE4 ;неудачное преобразование (не число/слишком большое) + pop bc + pop af + or a + ret + +;АДРЕС: #0BF3 ввод строки символов +;вх: a-номер сообщения в группе 0 (для нижней строки) +;вых: cy=1 завершение ввода по break/cancel +; cy-0 завершение ввода по enter/fire cursor +; hl - адрес первого введенного символа в буфере +; z - этот символ перевод строки +; +x0BF3 call x0C0B ;ввод строки + jr nc,x0C04 ;завершение ввода по enter + call x0D1A + jr nc,x0C04 ;завершение ввода по fire cursor + cp #03 + scf + ret z ;завершение ввода по break/cancel + xor a + jr x0BF3 ;продолжение ввода строки +x0C04 rst #30 + dw rom2_x0EE3 ;поиск в буфере ввода строки первого печатного символа + db #02 + scf + ccf + ret +;ввод строки +;вх: a-номер сообщения в группе 0 (для нижней строки) +;вых: cy=0 завершение ввода по enter +; cy=1 -> a=3 break/cancel +; cy=1 -> a=a нет эффекта от нажатия +x0C0B rst #30 + dw rom2_x2FFB ;установка текущим окна: ввод числа + db #02 + or a + jr z,x0C69 ;продолжим ввод строки + call x0C22 ;установка параметров окна для ввода строки в меню монитора + rst #30 ;!!! ОШИБКА. можно вызвать напрямую + dw rom5_x1CB8 ;ввод строки (вых: hl адрес введенной строки) + db #05 + jr nc,x0C1F ;cy=0 выход по enter + call x0D1A ;определение типа нажатой клавиши + ret c ;отмена/нет эффекта +;завершение ввода по enter/fire cursor +x0C1F or a + ld a,#06 ;сообщение: _Working ... +;установка параметров окна для ввода строки в меню монитора +;вх: a - номер сообщения в группе 0 (для нижней строки) +x0C22 push af + ld b,a ;номер сообщения в группе 0 + call x10C2 ;установка текущим окна: menu + ld a,(ix+6) + push af ;сохраним атрибуты + ld a,(xE115) + ld (ix+6),a ;атрибуты печати сообщения + ld (ix+0),#17 ;координаты печати + ld (ix+1),#00 + rst #20 + dc " " ;пробел + ld c,#00 + rst #08 ;печать сообщения + ld a,#2B + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 + pop af + ld (ix+6),a ;восстановим атрибуты + rst #30 + dw rom2_x2FFB ;установка текущим окна: ввод числа + db #02 + bit 5,(iy+#0E) + jr nz,x0C6E ;ввод имени раздела HDD + ld (ix+3),#16 ;crd X окна + ld (ix+6),#4E ;атрибуты %01001110 + ld l,#08 ;ширина в символах + call x0CA0 ;установка ширины окна в знакоместах и символах + ld a,(iy-#09) ;crd Y опции меню +x0C62 ld (ix+2),a ;crd Y окна + rst #20 + db #8C ;очистка окна + pop af + ret +;продолжение ввода строки +x0C69 rst #30 + dw rom5_x1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) + db #05 + ret +;ввод имени раздела HDD +x0C6E ld (ix+6),#71 ;атрибуты %01110001 + ld hl,(xE9EF) + push hl + call x0C8F ;l=l*6/8 + ld a,(xE0F3+#03) ;xE0F6 координата X окна со списком разделов HDD + add a,l + ld (ix+3),a ;crd X окна + pop hl + ld l,h + call x0CA0 ;установка ширины окна в знакоместах и символах + ld a,(xE0F3) ;координата Y курсора в окне + ld l,a + ld a,(xE0F3+#02) ;xE0F5 координата Y окна + add a,l + jr x0C62 +;вычисление l=l*6/8 +x0C8F push de + ld de,#0006 + ld h,d + rst #30 + dw rom2_x0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) + db #02 + ld b,#03 +x0C9A srl l + djnz x0C9A + pop de + ret +;установка ширины окна в знакоместах и символах +;вх: l - ширина окна в символах +x0CA0 ld (ix+#0B),l + call x0C8F + ld (ix+5),l + ret + +;АДРЕС: #0CAA печать числа bc в буфере ввода строки +;вх: bc - число +x0CAA push bc + call x0CB9 + pop bc + ret + +;АДРЕС: #0CB0 печать числа A в буфере ввода строки +;вх: bc - число +x0CB0 push bc + ld c,a + ld b,#00 + call x0CB9 + pop bc + ret + +;АДРЕС: #0CB9 печать числа bc в буфере ввода строки +;вх: bc - число +x0CB9 push de + push bc + call x0CCA ;очистка буфера для ввода строки + inc hl + ld de,#2E0A + ld a,#03 + pop bc + call x0CDA ;печать числа bc в буйфер hl + pop de + ret + +;АДРЕС: #0CCA очистка буфера для ввода строки +;вых: hl - адрес буфера для ввода строки +x0CCA ld b,#2B + ld hl,xDE17 + push hl + ld (xDE15),hl +x0CD3 ld (hl)," " + inc hl + djnz x0CD3 + pop hl + ret + +;АДРЕС: #0CDA печать числа bc в буйфер hl +;вх: hl - адрес буфера для печати числа +; bc - число +; d - символ перед числом +; e - делитель для выделения разряда числа +; a - кол-во разрядов в числе +x0CDA ld (hl),d + inc hl +x0CDC ld (xE3BC),hl ;адрес в буфере печати + set 6,(iy+#09) ;печать в буфер + ld (iy+#07),a ;минимум разрядов в числе при переводе в ASCII + ld (iy+#08),"0" + ld (iy+#10),e ;делитель для выделения разряда числа + rst #30 + dw rom2_x1673 ;печать числа bc /в буфер + db #02 + res 6,(iy+#09) + ret + +;АДРЕС: #0CF6 установка и инициализация окна для ввода строки внизу экрана +;вых: ix - адрес дескриптора окна монитора: ввод строки внизу экрана +x0CF6 rst #30 + dw rom2_x3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана + db #02 + ld a,#0C + or a + rst #30 + dw rom5_x1C84 ;инициализация окна ввода + db #05 + ret + +;АДРЕС: #0D02 очистка нижней строки окна меню +x0D02 call x10C2 ;установка текущим окна: menu + ld a,(xE110) + ld (ix+6),a ;атрибуты для печати опции меню + ld (ix+0),#17 ;crd Y курсора + ld (ix+1),#00 ;crd X курсора + ld a,#2B + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 + ret + +;АДРЕС: #0D1A определение типа нажатой клавиши +;вх: a - код нажатой клавиши +;вых: cy=0 - это подтверждение ввода (entre/fire cursor) +; =1 -> a=3 break/cancel +; =1 -> a=a нет эффекта от нажатия +x0D1A ld c,a + cp #82 + jr z,x0D29 ;ss+space + cp #80 + ret z ;ss + cp #91 + ret z ;mouse fire + res 3,a ;исключаем прочие комбинации + cp #92 ;mouse cancel +x0D29 ld a,c + scf + ret nz + ld a,#03 + ret + +;АДРЕС: #0D2F определение адреса дескриптора текущего меню +;вых: hl - адрес дескриптора меню +1 +; a = (+0) количество опций в меню -1 (номер последней опции) +x0D2F ld hl,x044A + ld a,(xDDFF) + add a,a + add a,l + ld l,a + jr nc,x0D3B + inc h ;hl адрес в таблице +x0D3B ld a,(hl) + inc hl + ld h,(hl) + ld l,a ;hl адрес описателя окна + ld a,(hl) + inc hl + ret + +;АДРЕС: #0D42 приведение номера горячей клавиши опции к печатному символу +;вх: hl - адрес начала опций в дескрипторе меню +; c - номер опции +;вых: a - печатный символ +; hl - адрес дескриптора заданной опции +2 +; e =(+1) опции +; +x0D42 call x0D52 + +;АДРЕС: #0D45 приведение номера горячей клавиши опции к печатному символу +;вх: a =[#00..#19] -> номер буквы A..Z +; =[#1A..#1F] -> цифра 1..5 +;вых: a - печатный символ +x0D45 and #1F + cp #1A + jr nc,x0D4F + inc a + or #40 + ret +x0D4F add a,#16 + ret + +;АДРЕС: #0D52 определение адреса дескриптора опции +;вх: hl - адрес начала опций в дескрипторе меню +; c - номер опции +;вых: hl - адрес дескриптора заданной опции +2 +; a =(+0) опции +; e =(+1) опции +; +x0D52 ld a,c + add a,a + add a,a + add a,c + add a,l + ld l,a + jr nc,x0D5B + inc h +x0D5B ld a,(hl) + inc hl + ld e,(hl) + inc hl + ret + +;АДРЕС: #0D60 определение адреса с номером текущей опции текущего меню +;вых: hl - адрес ячейки с номером опции +; +x0D60 ld hl,xDE00 + ld a,(xDDFF) + add a,l + ld l,a + ret nc + inc h + ret + +;АДРЕС: #0D6B печать текущего меню +x0D6B call x10C2 ;установка текущим окна: menu +;печать названия меню + ld a,(xE111) ;печать названия окна + ld (ix+6),a ;атрибуты печати + ld (ix+0),#03 ;crd Y =3 + rst #20 ;вывод с выравниванием + db #84 + call x0D2F + ld c,(hl) + inc hl + ld b,(hl) ;bc номер блока сообщений и сообщения в нем + rst #08 ;печать сообщения по номеру в BC (название меню) + rst #20 + db #85 ;выровнять по центру + inc (ix+0) ;crd Y +1 +;печать опций меню + ld c,#00 ;номер опции + ld a,(xE110) ;атрибуты печати опций меню + ld (ix+6),a +x0D8E call x0D2F ;;c=номер текущей опции [0..n] + inc a + cp c + ret z ;все опции напечатаны + inc hl + inc hl ;hl адрес начала опций в дескрипторе меню + call x0D52 ;hl - адрес начала заданной опции +2 + ld b,a +; установка атрибутов печати опции + call x0F51 ;вызов п/п определения доступности опции. cy=1 недоступна + push hl + ld a,(xE112) ;атрибуты неактивной опции + jr c,x0DBB + ld a,b ;выделение Ink печати активной опции + rlca + rlca + rlca + and #07 ;номер Ink в таблице + ld hl,xEAED + add a,l + ld l,a + jr nc,x0DB1 ;ЛИШНЕЕ!!! с учетом текущего размещения таблицы + inc h ;ЛИШНЕЕ!!! с учетом текущего размещения таблицы +x0DB1 ld a,(hl) + and #07 + ld l,a ;Ink печати опции + ld a,(xE110) + and %11111000 + or l +x0DBB ld (ix+6),a ;атрибуты печати опции + pop hl +; установка crdY, выделение опции, печать горячей клавиши вызова + call x0F6D + ld a,(hl) + inc hl + push af + push hl + rlca + rlca + and #03 + add a,(ix+0) + ld (ix+0),a + ld a,b + call x0D45 ;приведение номера горячей клавиши опции к печатному символу + ld b,a ;цифра/буква выбора опции + call x0D60 ;определение адреса с номером текущей опции текущего меню + ld a,(hl) + cp c + call z,x0E6F ;выделение текущей опции меню + pop hl + ld (ix+1),#09 ;печать номера опции + rst #20 + dc " " + ld a,b ;печать цифры/буквы выбора опции + rst #10 + rst #20 + dc ". " + pop af +; печать названия опции + push af + bit 5,a + jr nz,x0E03 ;печать названия отдельной п/п + push bc + ld c,(hl) ;номер блока сообщений + ld (iy-#08),c ;xE00C + inc hl + ld b,(hl) ;номер сообщения в блоке + inc hl + push hl + rst #08 ;печать названия опции + rst #20 + dc " " + ld (ix+1),#1F ;crd X =31 + pop hl + pop bc + jr x0E25 +x0E03 push bc ;печать названия опции отдельной процедурой + ld bc,x0E1F ;сюда вернемся + push bc + ld c,(hl) + inc hl + ld b,(hl) ;bc - адрес п/п печать опции + bit 4,a + jr nz,x0E11 ;она в другой странице + push bc + ret +x0E11 ld (xE3BE+#01),bc ;вызов п/п из другой страницы ROM + inc hl + ld c,a + ld a,(hl) + ld (xE3BE+#03),a + ld a,c + jp xE3BE +x0E1F pop bc + pop af + and #E0 + jr x0E26 ;печать следующей опции +x0E25 pop af +x0E26 and #1F + jr z,x0E68 ;печать следующей опции +; печать текущего параметра опции + push bc + call x0FE9 ;de - адрес переменной/hl - адрес маски для переменной + and #03 + cp #01 + jr nz,x0E45 + ld a,(de) ;два состояния опции, определяем по маске в (hl) + and (hl) + inc hl + ld b,(hl) + inc hl + jr z,x0E3C +x0E3B ld b,(hl) +x0E3C ld c,(iy-#08) ;номер блока сообщений + rst #08 + rst #20 + dc " " + pop bc + jr x0E62 +x0E45 cp #02 + jr nz,x0E57 + ld a,(de) ;это число по адресу переменной + ld c,a + ld b,#00 + ld de,#0A00 + rst #30 + dw rom2_x162C ;печать числа в заданной системе счисления + db #02 + pop bc + jr x0E68 ;печать следующей опции +x0E57 ld a,(de) ;1-4 состояния опции, по номеру в de + and #03 + jr z,x0E3B + ld b,a +x0E5D inc hl + djnz x0E5D + jr x0E3B +x0E62 ld a,#29 ;печать пробелов до правого края экрана + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 +x0E68 inc c ;печать следующей опции + inc (ix+0) + jp x0D8E + +;АДРЕС: #0E6F выделение атрибутами заданной опции меню (по курсору) +x0E6F push hl + push bc + ld a,(xE113) + and %00111000 + ld c,a ;выделяем paper + ld a,(ix+6) + and %11000111 + or c + ld (ix+6),a ;устанавливаем атрибуты + call x0E98 ;выделение атрибутами заданной опции меню (по курсору) + ld a,(ix+0) + ld (iy-#09),a + pop bc + pop hl + ret + +;АДРЕС: #0E8C снятие выделения атрибутами заданной опции меню (по курсору) +x0E8C ld a,(iy-#09) ;координата Y выделенной опции + ld (ix+0),a ;crd Y + ld a,(xE110) + and %00111000 + ld c,a ;атрибуты печати + +;АДРЕС: #0E98 печать атрибутов заданной опции меню (по курсору) +;вх: c - атрибуты, только Paper +; +x0E98 push bc + ld (ix+1),#00 ;crd X =0 + rst #30 + dw rom2_x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей + db #02 + pop bc + inc hl + ld b,#1E +x0EA5 ld a,(hl) + and %11000111 + or c + ld (hl),a + inc hl + djnz x0EA5 + ret + +;АДРЕС: #0EAE !!!ОШИБКА!!! тут зависание. должен быть холодный сброс???? +x0EAE rst #30 + dw #000B + db #02 + +;АДРЕС: #0EB2 очистка текущего окна +x0EB2 rst #20 ;очистка текущего окна + db #8C + ret + +;АДРЕС: #0EB5 печать текущего меню монитора +x0EB5 ld sp,xE336 + rst #30 + dw rom2_x04D5 ;включение Турбо-режима + db #02 ;bc =#7FFD + ld h,#E1 ;проверка в ram 8 признака MOA + ld l,#7B + ld a,"M" + cpi + jr nz,x0EAE ;нет буквы M. портится регистр bc -> зависание + ld a,"O" + cpi + jr nz,x0EAE ;нет буквы O. портится регистр bc -> зависание + call x10C2 ;установка текущим окна: menu + ld a,(xE110) + ld (ix+6),a ;атрибуты окна + call x0EB2 ;очистка окна + ld hl,xE16E + rst #30 + dw rom2_x15DB ;печать сообщения из hl + db #02 + call x105B ;сообщение Profesional Extention + ld a,(xE111) + ld (ix+6),a + ld bc,#0101 ;сообщение Shadow service monitor + rst 8 +;основной цикл меню монитора +x0EEC ld hl,x0EEC ;сюда вернемся после обработки выбранной опции + push hl + call x0D6B ;печать текущего меню + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + push af ;код нажатой клавиши + ld a,(xE110) ;атрибуты печати опции меню + ld (ix+6),a + call x0E8C ;снятие выделения атрибутами заданной опции меню (по курсору) + pop af + call x1033 ;вызов п/п обработки нажатия клавиши + db #86 ;cs+6 вниз + dw x0F95 ;перемещение курсора на следующую опцию (вниз) + db #84 ;cs+7 вверх + dw x0FA6 ;перемещение курсора на предыдущую опцию (вверх) + db #0D ;enter / cs+1+m + dw x0F87 ;выбор выделенной опции + db #11 ;cs+1+q + dw x0F78 ;переход в главное меню + db #04 ;cs+1+d + dw x1150 ;вызов окна выбора диска + db #80 ;kempston joy + dw x0FB6 ;определение опции под курсором мыши и переход на ее обработку + db #91 ;mouse + dw x0FB6 ;определение опции под курсором мыши и переход на ее обработку + db #92 ;mouse + dw x0F78 ;переход в главное меню + db #FF + cp #7B + jr nc,x0F28 ;a=[#7B..#FF] + cp #40 + jr c,x0F28 ;a=[#00..#3F] + and %01011111 ;букву в верхний регистр +x0F28 ld b,a ;код нажатой клавиши + ld c,#FF +x0F2B inc c + call x0D2F ;определение адреса дескриптора текущего меню + inc a + cp c + ret z ;закончились опции в меню. ничего не делаем + inc hl + inc hl + call x0D42 ;приведение номера горячей клавиши опции к печатному символу + cp b + jr nz,x0F2B ;клавиша не соответствует гарячей клавиши опции +;переход на п/п обработки выбранной опции + push hl + push de + call x0D60 + ld (hl),c ;сохраним номер текущей опции в меню + call x0D6B ;печать текущего меню + pop de + pop hl + call x0F51 ;проверка доступности опции + ret c ;опция недоступна + push hl + call x0F6D ;опредение адреса описания опции + ld c,l + ld b,h ;адрес описания опции (xNNNN) + pop hl + inc hl +;bc - адрес описания опции (xNNNN) +;вызов п/п обработки опции + +;АДРЕС: #0F51 вызов п/п обработки доступности опции/обработки опции +;вх: hl - адрес в дескрипторе опции (+2/4 от начала) +; 3-2,e биты старшего байта +;вых: hl - адрес в дескрипторе опции (+3 от начала) +; d - старший байт смещения +; e=e>>2 +; +x0F51 call x0F65 ;выделение старшего байта смещения + push de + ld e,(hl) ;младший байт + inc hl + push hl + ld hl,x08DD + add hl,de + ld de,x0F62 + push de + xor a + jp (hl) +x0F62 pop hl + pop de + ret + +;АДРЕС: #0F65 выделение старшего байта смещения +;вх: 3-2,e биты старшего байта +;вых: d - старший байт смещения +; e=e>>2 +; +x0F65 ld a,e + rrca + rrca + ld e,a + and #03 + ld d,a + ret + +;АДРЕС: #0F6D опредение адреса описания опции +;вх: hl - адрес в дескрипторе опции (+3 от начала) +; 3-2,e биты старшего байта +;вых: hl - адрес описания опции +; d - старший байт смещения +; e=e>>2 +; +x0F6D call x0F65 + push de + ld e,(hl) + ld hl,x0468 + add hl,de + pop de + ret +;переход в главное меню +x0F78 ld hl,x0EB5 + ex (sp),hl + xor a + ld (xDDFF),a + ld hl,xDE08 + ld (xE033),hl + ret +;enter / cs+1+m +x0F87 call x0D60 ;определение адреса с номером текущей опции текущего меню + ld c,(hl) ;номер текущей опции текущего меню + call x0D2F ;определение адреса дескриптора текущего меню + inc hl + inc hl + call x0D42 ;приведение номера горячей клавиши опции к печатному символу +x0F93 jr x0F28 ;a - горячая клавиша выбранной опции + +;АДРЕС: #0F95 перемещение курсора на следующую опцию (вниз) +x0F95 call x0D60 ;определение адреса с номером текущей опции текущего меню + push hl + ld c,(hl) + inc c ;c - номер опции + call x0D2F ;определение адреса дескриптора текущего меню + cp c ;a - номер последней опции + jr nc,x0FA3 + ld c,#00 +x0FA3 pop hl + ld (hl),c + ret + +;АДРЕС: #0FA6 перемещение курсора на предыдущую опцию (вверх) +x0FA6 call x0D60 ;определение адреса с номером текущей опции текущего меню + ld a,(hl) + or a + jr z,x0FAF + dec (hl) + ret +x0FAF push hl + call x0D2F ;определение адреса дескриптора текущего меню + pop hl + ld (hl),a + ret + +;АДРЕС: #0FB6 определение опции под курсором мыши и переход на ее обработку +; +x0FB6 ld c,#FF + ld d,#03 ;начальная crd Y +x0FBA inc d + inc c ;номер опции + call x0D2F ;определение адреса дескриптора текущего меню + inc a ;кол-во опций в меню + cp c + ret z ;опция не найдена + inc hl + inc hl + push de + call x0D52 ;определение адреса дескриптора опции + ld b,a + call x0F65 ;выделение старшего байта смещения + inc hl + call x0F6D ;опредение адреса описания опции + pop de + ld a,(hl) + rlca + rlca + and #03 + add a,d + ld d,a ;координата Y опции + cp (iy-#0B) + jr nz,x0FBA ;курсор не на этой опции + ld a,b + call x0D45 ;приведение номера горячей клавиши опции к печатному символу + jr x0F93 ;a - горячая клавиша выбранной опции + +;АДРЕС: #0FE3 получение адреса переменной и адреса маски для заданной опции +;вх: bc - адрес описания опции (x0468) +;вых: hl - адрес маски для переменной +; de - адрес переменной +; +x0FE3 ld l,c + ld h,b + ld a,(bc) + inc hl + inc hl + inc hl + +;АДРЕС: #0FE9 получение адреса переменной и адреса маски для заданной опции +;вх: a - флаги описания опции +; hl - адрес в описании опции +;вых: hl - адрес маски для переменной +; de - адрес переменной +; +x0FE9 bit 4,a + jr z,x1001 +;получение подстроки с описанием опции + ld e,(hl) + inc hl + ld d,(hl) ;адрес переменной с номером строки + inc hl ;hl=адрес+5 + ld a,(de) + and #03 ;номер строки [0..3] + inc a ;поиск строки +x0FF5 dec a + ld b,(hl) + inc hl + jr z,x0FFF +x0FFA inc hl + djnz x0FFA + jr x0FF5 +x0FFF ld a,(hl) ;a - флаги + inc hl +;получение адреса переменной опции +x1001 ld e,(hl) ;получение смещения от iy(xE014) + inc hl + bit 2,a + jr z,x100B + ld d,(hl) + inc hl + jr x1012 +x100B bit 7,e + ld d,#00 + jr z,x1012 + dec d ;de - смещение от iy(xE014) +x1012 push iy + ex (sp),hl + add hl,de + ex de,hl + pop hl ;de - адрес переменной опции +;если это блок переменных, определяем нужную переменную в блоке + bit 3,a + ret z + push af + ld b,(hl) + inc hl + ld a,(hl) + inc hl ;ab - адрес переменной со смещением в блоке + push hl + ld l,b + ld h,a + ld a,(hl) + and #03 + ld l,a ;hl - смещение в блоке + ld h,#00 + add hl,de + ex de,hl + pop hl + pop af + ret + +;АДРЕС: #102E проверка диапазона числа +;вх: a - число +; c - минимальное значение +; b - максимальное значение+1 +;вых: cy=1 вне пределов заданных значений +; +x102E cp c + ret c + cp b + ccf + ret + +;АДРЕС: #1033 процедура обработки нажатий клавиш +;вх: параметры передаются через db ?:dw ?? +x1033 pop hl + jr x1038 +x1036 inc hl + inc hl +x1038 ld e,(hl) + inc e + jr z,x1045 ;e=#FF -> возврат + cp (hl) + inc hl + jr nz,x1036 + ld e,(hl) + inc hl + ld d,(hl) + dec de + ex de,hl +x1045 inc hl + jp (hl) + +;АДРЕС: #1047 печать количества цилиндров HDD +x1047 ld bc,#1002 ;Cylinders + rst #08 + ld (ix+1),#1F + ld bc,(xDFF2) ;колво цилиндров + ld de,#0A00 ;десятичная система счисления + rst #30 + dw rom2_x162C ;печать числа в заданной системе счисления + db #02 + ret + +;АДРЕС: #105B печать шапки меню монитора +x105B call x10C2 ;установка текущим окна: menu + ld hl,x106B + +;АДРЕС: #1061 печать закодированного сообщения из hl +x1061 ld a,(hl) + xor #6A + cp #FF + ret z + rst #10 ;печать символа из A + inc hl + jr x1061 + +;заксоренное сообщение +x106B db #6B,#40,#BF + db #71,#6A,#63 + db #3A,#18,#05,#0C,#0F,#19,#03,#05 + db #04,#0B,#06,#4A,#4A,#2F,#12,#1E + db #0F,#04,#1E,#03,#05,#04,#4A + db #71,#68,#6A + db #2B,#04,#0B,#06,#13,#19,#0F,#18 + db #68 + db #95 +/*оно же, но раскодированное + db #01,%00101010,%11010101 ;атрибуты + db #1B,#00,#09 ;координаты + db "Profesional Extention " + db #1B,#02,#00 ;координаты + db "Analyser" + db #02 ;восстановим атрибуты + db #FF ;конец +*/ + +;заксоренное сообщение +x1095 db #6B,#1B,#E4 + db #71,#61,#60 + db #39,#0B,#1C,#0F,#0E,#4A,#38,#2B + db #27,#4A,#08,#0B,#04,#01,#4A + db #95 +/*оно же, но раскодированное +x1095 db #01,%01110001,%10001110 ;атрибуты + db #1B,#0B,#0A ;координаты + db "Saved RAM bank " + db #FF ;конец +*/ + +;заксоренное сообщение +x10AB db #6B,#1B,#0E4 + db #71,#61,#60 + db #26,#05,#0B,#0E,#0F,#0E,#4A,#38 + db #2B,#27,#4A,#08,#0B,#04,#01,#4A + db #95 +/*оно же, но раскодированное + db #01,%01110001,%10001110 ;атрибуты + db #1B,#0B,#0A ;координаты + db "Loaded RAM bank " + db #FF ;конец +*/ + +;АДРЕС: #10C2 установка текущим окна: menu +x10C2 rst #30 + dw rom2_x3005 ;установка текущим окна: menu + db %00000010 + ret + +;АДРЕС: #10C7 Копирование каталога ROM-диска в ram 8 +;вых: a =0 нет ROM-диска +x10C7 push bc + ld hl,(x0071) + ld l,#00 + ld bc,#0100 + ld de,xE5A9 + push de + ldir + pop de + ld a,(de) + or a + pop bc + ret + +;АДРЕС: #10DB обработка пункта меню: R. ROM disk +x10DB call x0D02 ;очистка нижней строки окна меню + call x10C7 ;Копирование каталога ROM-диска в ram 8 + ld hl,#1006 ;координаты окна + ld de,#100C ;ширина окна в символах и знакоместах + call x2133 ;коррекция координат и размеров окна + ld hl,x1111 + ld (xE9E1),hl +x10F0 call x1EF1 ;печать каталога и выбор позиции в нем + jr nc,x10FF ;выбор произведен успешно + cp #03 + jr z,x110E ;break/cancel закрываем окно + cp #11 + jr nz,x10F0 ;повторим выбор + jr x110E ;отмена с закрытием окна +;выбор произведен успешно +;hl - номер позиции в каталоге +x10FF call x1130 ;определение начала записи в каталоге ROM-disk по номеру в hl + ld de,#000E + add hl,de + ld a,(hl) ;смещение от начала страницы + inc hl + ld h,(hl) ;номер страницы + ld l,a ;смещение от начала страницым + rst #30 + dw rom6_x0E3B ;загрузка из ROM-disk + db #06 +;break/cancel закрываем окно +x110E jp x0EB5 ;печать текущего меню монитора + +;АДРЕС: #1111 таблица со списком процедур +x1111 dw x1128 ;печать одного имени из каталога ROM-disk + dw x113D ;определение номера последней записи в каталоге ROM-disk + dw x1117 ;звголовок: печать сообщения: _Select a file_ +;печать сообщения: _Select a file_ +x1117 rst #20 + dc " Select a file " + ret +;печать одного имени из каталога ROM-disk +;вх: hl - номер записи в каталоге +x1128 call x1130 + rst #30 + dw rom2_x15DB ;печать сообщения из hl + db #02 + ret +;определение начала записи в каталоге ROM-disk по номеру в hl +x1130 ld de,xE5A9 ;каталог ROM-disk + ld b,#04 +x1135 sla l ;hl=hl*16 + rl h + djnz x1135 + add hl,de + ret +;определение номера последней записи в каталоге ROM-disk +;вых: hl - номер последней записи в каталоге ROM-disk +x113D ld hl,xE5A9 ;каталог ROM-disk + ld de,#0010 + ld c,d +x1144 ld a,(hl) + or a + jr nz,x114C + dec c + ld l,c + ld h,d + ret +x114C add hl,de + inc c + jr x1144 + +;АДРЕС: #1150 вывод окна выбора дисковода +x1150 call x0D02 ;очистка нижней строки окна меню + ld hl,#1006 ;координаты окна + ld de,#140F ;размеры окна + call x2133 ;коррекция координат и размеров окна + ld hl,x1182 ;адрес таблицы со списком процедур для п/п x2028 + ld (xE9E1),hl +x1162 call x1EF1 ;печать каталога и выбор позиции в нем + jr nc,x117A ;что-то выбрали + cp #03 + jr z,x110E ;отмена break/cancel + cp #11 + jr z,x110E ;cs+1+q + and #5F ;проверка букв A..D + cp #45 + jr nc,x1162 ;продолжим + sub #41 + jr c,x1162 ;продолжим + ld l,a ;номер дисковода +x117A ld a,l + ld (xFFCA),a ;выбранный дисковод + jp x0B25 ;вывод каталога текущего диска + +;АДРЕС: #1181 ret +x1181 ret + +;таблица со списком процедур для печати окна выбора дисковода +x1182 dw x119D ;печать одного имени дисковода + dw x1188 ;определение номера последней записи =3 + dw x118C ;заголовок: печать сообщения: _Select a disk_ + +;определение номера последней записи =3 +x1188 ld hl,#0003 + ret + +;заголовок: печать сообщения: _Select a disk_ +x118C rst #20 + dc " Select a Disk " + ret + +;печать буквы дисковода или пути, если это образ +x119D ld a,l + and #03 + call x249C ;печать буквы дисковода или пути, если это образ + ret + +;АДРЕС: #11A4 поиск сообщения по номеру в B[#01..#??] +;вх: hl - адрес блока сообщений +;вых: de - адрес начала сообщения +; +x11A4 ex de,hl +x11A5 dec b + ret z +x11A7 ld a,(de) + inc de + and #80 + jr nz,x11A5 + jr x11A7 + +;АДРЕС: #11AF установка блока слов/сообщений по номеру в A +;вх: a=[#00..#02] - номер блока сообщений/слов +;вых: (xDDDA) - адрес блока слов +; hl - адрес в таблице блоков слов/сообщений +; +x11AF ld hl,x11C1 ;список блоков сообщений + rlca + rlca + add a,l + ld l,a + jr nc,x11B9 + inc h +x11B9 ld e,(hl) + inc hl + ld d,(hl) + ld (xDDDA),de + ret +x11C1 dw x1554,x1906 + dw x1353,x181A + dw x122D,x176D + +;АДРЕС: #11CD печать сообщения по номеру в BC +;вх: c=[0..2] номер блока сообщений +; b - номер сообщения в этом блоке +; +x11CD ld a,c + call x11AF ;установка блока слов/сообщений по номеру в A + inc hl + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + ld (xDDD8),hl ;адрес блока сообщений + ld c,#80 ;первая буква заглавная + call x11A4 ;поиск сообщения по номеру в B[#01..#??] + ex de,hl ;hl - адрес начала сообщения +x11DF ld a,(hl) ;печать сообщения + cp #7F + jr nz,x11ED + inc hl ;смена блока слов + ld a,(hl) + push hl + call x11AF ;установка блока слов/сообщений по номеру в A + pop hl + jr x1216 +x11ED and #7F + jr z,x121C ;печать указателя стэка + ld b,a + push hl + ld hl,(xDDDA) + call x11A4 ;поиск слова по номеру в B[#01..#??] + pop hl +x11FA ld a,(de) ;печать слова + sla c + jr nc,x120C + push af ;первый символ слова заглавный + and #7F + cp #40 + jr c,x120B + pop af + and %11011111 + jr x120C +x120B pop af +x120C rst #30 ;печать символа + dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) + db %00000010 + rla + inc de + jr nc,x11FA + rst #20 ;печать пробела в конце слова + dc " " +x1216 bit 7,(hl) + inc hl + jr z,x11DF ;следующее слово + ret + +;печать числа из (xDDA7) +x121C push hl + sla c + push bc + ld hl,(xDDA7) + rst #30 + dw rom2_x1612 ;печать числа в hl (dec/hex) с префиксом + db %00000010 + rst #20 ;печать пробела + dc " " + pop bc + pop hl + jr x1216 + +;АДРЕС: #122D блок слов 2 (#35 слов) +x122D dc "time" ;#01 + dc "date" + dc "&" + dc "Set Up" + dc "indicator" + dc "ON" + dc "OFF" + dc "hours" + dc "minutes" ;#09 + dc "seconds" + dc "years" + dc "months" + dc "days" + dc "autoconfig" + dc "from" + dc "degree" + dc "compression" ;#11 + dc "Cylinders" + dc "head" + dc "partition" + dc "manager" + dc "global" + dc "-" + dc "delete" + dc "part" ;#19 + dc "all" + dc "local" + dc "table" + dc "information" + dc "select" + dc "..." + dc "create" + dc "write" ;#21 + dc "restore" + dc "auto" + dc "detection" + dc "mount" + dc "dismount" + dc "on" + dc "input" + dc "output" ;#29 + dc "interrupt" + dc "controller" + dc "NVRAM" + dc "modem" + dc "port" + dc "serial" + dc " " + dc "rename" ;#31 + dc "SMUC" + dc "mode" + dc "LBA" + dc "mirror" ;#35 + +;АДРЕС: #1353 блок слов 1 (#6A слов) +x1353 dc "main" ;#01 + dc "menu" + dc "previous" + dc "continue" + dc "magic" + dc "button" + dc "monitor" + dc "print" + dc "screen" ;#09 + dc "test" + dc "printer" + dc "disk" + dc "Set Up" + dc "about" + dc "positive" + dc "negative" + dc "Shadow" ;#11 + dc "service" + db #1B,#01,#88 + db #1B,#03,#8D + dc "keyboard" + dc "constant" + dc "debouncing" + dc "delay" + dc "repeat" ;#19 + dc "before" + dc "interface" + dc "speed" + dc "data" + dc "bits" + dc "stop" + dc "to" + dc "limiter" ;#21 + dc "+LF" + dc "length" + dc "page" + dc "width" + dc "centronics" + dc "RS232" + dc "9600" + dc "1200" ;#29 + dc "8" + dc "7" + dc "1" + dc "2" + dc "OFF" + dc "ON" + dc "reset" + dc "line" ;#31 + dc "feed" + dc "carriage" + dc "return" + dc "computer" + dc "form" + dc "sound" + dc "format" + dc "drive" ;#39 + dc "track" + dc "side" + dc "sector" + dc "A" + dc "B" + dc "C" + dc "D" + dc "40" ;#41 + dc "80" + dc "FM" + dc "MFM" + dc "128" + dc "256" + dc "512" + dc "1024" + dc "one" ;#49 + dc "double" + dc "half" + dc "LOW" + dc "HIGH" + dc "retry" + dc "utility" + dc "analys" + dc "catalogue" ;#51 + dc "interleaving" + dc "*" + dc "normal" + dc "fast" + db #0C,#1B,#00,#87 + db #1B,#0C,#8D + dc "save" + dc "load" ;#59 + dc "..." + dc "&" + dc "NMI" + dc "graphics" + dc "manipulators" + dc "mouse" + dc "kempston" + dc "joystick" ;#61 + dc "wait" + dc "second" + dc "first" + dc "of" + dc "step" + dc "size" + dc "quick" + dc "autostart" ;#69 + dc "I/O" ;#6A + +;АДРЕС: #1554 блок слов 0 (#5E слов) +x1554 dc "at" ;#01 + dc "abandoned" + dc "already" + dc "bad" + dc "big" + dc "blocks" + dc "breakpoint" + dc "by" + dc "command" ;#09 + dc "enter" + dc "empty" + dc "definition" + dc "devision" + dc "failed" + dc "file" + dc "finish" + dc "found" ;#11 + dc "few" + dc "identical" + dc "insufficient" + dc "known" + dc "long" + dc "many" + dc "no" + dc "not" ;#19 + dc "number" + dc "name" + dc "of" + dc "operands" + dc "opcode" + dc "open" + dc "out" + dc "present" ;#21 + dc "program" + dc "range" + dc "redefined" + dc "stack" + dc "space" + dc "syntax" + dc "string" + dc "small" ;#29 + dc "start" + dc "search" + dc "too" + dc "undefined" + dc "workspace" + dc "word" + dc "zero" + dc ">" ;#31 + dc "error" + dc "quit" + dc "operand" + dc ")" + dc "brackets" + dc "invalid" + dc "type" + dc "illegal" ;#39 + dc "value" + dc "bank" + dc "RAM" + dc "ROM" + dc "forbidden" + dc " Working ..." + dc "address" + dc "state" ;#41 + dc "selections:" + dc "init" + dc "count" + dc "***" + dc "curent" + dc "analyser" + dc "definitions:" + dc "left" ;#49 + dc "for" + dc "bytes" + dc "Professional" + dc "TRDOS" + dc "exist" + dc "R/W" + dc "disk" + dc "other" ;#51 + dc "execution" + dc "configuration" + dc "memory" + dc "control" + dc "hard" + dc "checksum" + dc "CMOS" + dc "boot" ;#59 + dc "record" + dc "busy" + dc "ready" + dc "duplicate" + dc "CRC" ;#5E + +;АДРЕС: #176D Блок сообщений 2 +; #00 печать числа из ячейки (xDDA7) +; #7F,[0..2] - смена блока слов +x176D db #01,#03,#82 ;#01 time & date + db #04,#01,#03,#82 ;#02 Set Up time & date + db #85 ;#03 indicator + db #87 ;#04 OFF + db #86 ;#05 ON + db #88 ;#06 hours + db #89 ;#07 minutes + db #8A ;#08 seconds + db #8B ;#09 years + db #8C ;#0A months + db #8D ;#0B days + db #8E ;#0C autoconfig + db #91 ;#0D compression + db #90 ;#0E degree + db #7F,#00,#56 ;#0F hard disk utility + db #7F,#01,#0C,#CF + db #92 ;#10 Cylinders + db #93 ;#11 head + db #14,#95 ;#12 partition manager + db #16,#14,#9C ;#13 global partition table + db #18,#1A,#99 ;#14 delete all part + db #1B,#14,#9C ;#15 local partition table + db #14,#9D ;#16 partition information + db #18,#94 ;#17 delete partition + db #18,#14,#9F ;#18 delete partition ... + db #20,#14,#9F ;#19 create partition ... + db #21,#7F,#01,#20,#8C ;#1A write to disk + db #22,#0F,#7F,#01,#8C ;#1B restore from disk + db #23,#24,#7F,#00,#56 ;#1C auto detection hard disk + db #D0 + db #25,#27,#7F,#01,#39 ;#1D mount on drive C + db #BF + db #1E,#1B,#94 ;#1E select local partition + db #1E,#7F,#01,#8C ;#1F select disk + db #25,#27,#7F,#01,#39 ;#20 mount on drive D + db #C0 + db #25,#27,#7F,#01,#39 ;#21 mount on drive B + db #BE + db #A8 ;#22 input + db #A9 ;#23 output + db #2A,#2B,#7F,#00,#19 ;#24 interrupt controller not found + db #91 + db #2A,#2B,#7F,#00,#91 ;#25 interrupt controller found + db #2C,#7F,#00,#19,#91 ;#26 NVRAM not found + db #2C,#7F,#00,#91 ;#27 NVRAM found + db #2D,#7F,#00,#19,#91 ;#28 modem not found + db #2D,#7F,#00,#91 ;#29 modem found + db #2F,#2E,#7F,#00,#19 ;#2A serial port not found + db #91 + db #25,#A7 ;#2B mount on + db #30,#0F,#7F,#01,#B9 ;#2C __from drive + db #26,#7F,#01,#DA ;#2D dismount ... + db #B0 ;#2E __ + db #A6 ;#2F dismount + db #25,#7F,#01,#5A ;#30 mount ... ___ + db #7F,#02,#B0 + db #30,#27,#7F,#00,#AA ;#31 __ on start + db #31,#14,#9F ;#32 rename partition ... + db #2C,#7F,#00,#57,#B2 ;#33 NVRAM checksum error + db #2B,#32,#7F,#00,#91 ;#34 controller SMUC found + db #34,#B3 ;#35 LBA mode + db #7F,#00,#4D,#7F,#02 ;#36 TRDOS mirror + db #B5 + +;АДРЕС: #181A Блок сообщений 1 +; #00 печать числа из ячейки (xDDA7) +; #7F,[0..2] - смена блока слов +x181A db #13,#11,#12,#87 ;#01 crd Y=1, crd X=8 Shadow service monitor + db #01,#82 ;#02 main menu + db #08,#89 ;#03 print screen + db #8D ;#04 Set Up + db #0D,#95 ;#05 Set Up keyboard + db #8A ;#06 test + db #03,#82 ;#07 previous menu + db #04,#7F,#00,#A2 ;#08 continue program + db #05,#86 ;#09 magic button + db #87 ;#0A monitor + db #8B ;#0B printer + db #0C,#DA ;#0C disk ... + db #0E,#87 ;#0D about monitor + db #8F ;#0E positive + db #90 ;#0F negative + db #89 ;#10 screen + db #7F,#00,#BC ;#11 RAM + db #16,#97 ;#12 constant debouncing + db #18,#99 ;#13 delay repeat + db #95 ;#14 keyboard + db #18,#1A,#99 ;#15 delay before repeat + db #0D,#8B ;#16 Set Up printer + db #9B ;#17 interface + db #A6 ;#18 centronics + db #A7 ;#19 RS232 + db #9C ;#1A speed + db #A8 ;#1B 9600 + db #A9 ;#1C 1200 + db #1D,#9E ;#1D data bits + db #AA ;#1E 8 + db #AB ;#1F 7 + db #1F,#9E ;#20 stop + db #AD ;#21 2 + db #AC ;#22 1 + db #9D ;#23 data + db #7F,#00,#28,#7F,#01 ;#24 string limiter +LF + db #21,#A2 + db #AF ;#25 ON + db #AE ;#26 OFF + db #7F,#00,#28,#7F,#01 ;#27 string width + db #A5 + db #24,#A3 ;#28 page lenth + db #B0 ;#29 reset + db #31,#B2 ;#2A line feed + db #33,#B4 ;#2B carriage return + db #B5 ;#2C computer + db #58,#5B,#D9 ;#2D save & load + db #36,#B2 ;#2E form feed + db #0D,#87 ;#2F Set Up monitor + db #30,#7F,#00,#BC ;#30 reset RAM + db #B7 ;#31 sound + db #0D,#0C,#CF ;#32 Set Up disk utility + db #0C,#B9 ;#33 disk drive + db #BD ;#34 A + db #BE ;#35 B + db #BF ;#36 C + db #C0 ;#37 D + db #BA ;#38 track + db #C1 ;#39 40 + db #C2 ;#3A 80 + db #BB ;#3B side + db #C9 ;#3C one + db #CA ;#3D double + db #C4 ;#3E MFM + db #C3 ;#3F FM + db #BC ;#40 sector + db #C5 ;#41 128 + db #C6 ;#42 256 + db #C7 ;#43 512 + db #C8 ;#44 1024 + db #38,#8C ;#45 format disk + db #1F,#38,#80 ;#47 stop format _число_ + db #CD ;#47 HIGH + db #4B,#CD ;#48 half HIGH + db #4B,#CC ;#49 half LOW + db #CC ;#4A LOW + db #B8 ;#4B format + db #4E,#96 ;#4C retry constant + db #0C,#CF ;#4D disk utility + db #0A,#8C ;#4E test disk + db #50,#8C ;#4F analys disk + db #7F,#00,#04,#7F,#01 ;#50 bad disk _число_ + db #0C,#80 ; + db #51,#8C ;#51 catalogue disk + db #D2 ;#52 interleaving + db #30,#87 ;#53 reset monitor + db #0B,#53,#AC ;#54 printer * 1 + db #0B,#53,#AD ;#55 printer * 2 + db #D4 ;#56 normal + db #D5 ;#57 fast + db #35,#9C ;#58 computer speed + db #56,#53,#55,#0A ;#59 очистить окно, crd Y=0, crd X=7 + db #7F,#00,#1C,#7F,#01 ; * fast test of computer * + db #35,#53,#D7 ; crd Y=12, crd X=13 + db #58,#DA ;#5A save ... + db #59,#DA ;#5B load ... + db #58,#5B,#59,#7F,#00 ;#5C save & load of program + db #1C,#A2 ; + db #5C,#97 ;#5D NMY debouncing + db #5D,#DE ;#5E graphics manipulators + db #0D,#5D,#DE ;#5F Set Up graphics manipulators + db #DE ;#60 manipulators + db #DF ;#61 mouse + db #60,#E1 ;#62 kempston joystick + db #64,#97 ;#63 first debouncing + db #1A,#99 ;#64 before repeat + db #63,#E2 ;#65 second wait + db #63,#97 ;#66 second debouncing + db #67,#65,#E6 ;#67 size of step + db #68,#38,#8C ;#68 quick format disk + db #E9 ;#69 autostart + db #58,#7F,#00,#D8 ;#6A save CMOS + db #59,#7F,#00,#D8 ;#6B load CMOS + db #58,#0D,#20,#8C ;#6C save Set Up to disk + db #0D,#7F,#00,#56,#D0 ;#6D Set Up hard disk + db #7F,#00,#38,#7F,#01 ;#6E type I/O + db #EA ; + db #91 ;#6F Shadow + db #7F,#02,#30,#0F ;#70 __ from drive + db #7F,#01,#B9 + +;АДРЕС: #1906 Блок сообщений 0 +; #00 печать числа из ячейки (xDDA7) +; #7F,[0..2] - смена блока слов + +x1906 db #0A,#89 ;#01 enter command + db #06,#93 ;#02 block identical + db #07,#80 ;#03 breackpoint _число_ + db #11,#01,#80 ;#04 found at _число_ + db #7F,#01,#1F,#7F,#00 ;#05 stop number _число_ + db #1A,#80 + db #BF ;#06 _Working ... + db #0A,#9A ;#07 enter number + db #2F,#A4 ;#08 word redefined + db #0A,#9B ;#09 enter name + db #2C,#12,#9D ;#0A too few operands + db #2C,#17,#9D ;#0B too many operands + db #20,#1C,#A3 ;#0C out of range + db #15,#9A ;#0D known number + db #04,#A8 ;#0E bad string + db #27,#B2 ;#0F syntax error + db #19,#9A ;#10 not number + db #1A,#2C,#85 ;#11 number too big + db #34,#19,#91 ;#12 operand not found + db #33,#34,#19,#91 ;#13 quit operand not found + db #2C,#17,#B5 ;#14 too many > + db #37,#38,#B6 ;#15 invalid type brackets + db #09,#19,#91 ;#16 command not found + db #39,#3A,#B4 ;#17 illegal value operand + db #37,#3B,#BC ;#18 invalid bank RAM + db #37,#3B,#BD ;#19 invalid bank ROM + db #09,#82 ;#1A command abandoned + db #3E,#3B,#BD ;#1B forbidden bank ROM + db #3E,#3B,#BC ;#1C forbidden bank RAM + db #2A,#31,#90 ;#1D start > _число_ + db #7F,#01,#08 ;#1E print abandoned + db #7F,#00,#82 + db #28,#2C,#96 ;#1F string too long + db #28,#19,#91 ;#20 string not found + db #18,#2B,#A8 ;#21 no search string + db #37,#1A,#87 ;#22 invalid number breackpoint + db #37,#41,#87 ;#23 invalid state breackpoint + db #37,#38,#87 ;#24 invalid type breackpoint + db #04,#40,#87 ;#25 bad address breackpoint + db #07,#AD ;#26 breackpoint undefined + db #46,#07,#C2 ;#27 curent breackpoint selections: + db #18,#40,#3B,#38,#41 ;#28 no address bank type state init count word + db #43,#44,#AF + db #45,#AD ;#29 *** undefined + db #04,#9E ;#2A bad opcode + db #10,#A2 ;#2B finish program + db #04,#B4 ;#2C bad operand + db #14,#22,#A6 ;#2D insufficient program space + db #22,#AD ;#2E program undefined + db #39,#2F,#9B ;#2F illegal word name + db #18,#8C ;#30 no definition + db #2F,#19,#95 ;#31 word not known + db #3E,#38,#AF ;#32 forbidden type word + db #47,#C8 ;#33 analyser definitions: + db #26,#49,#4A,#25,#80 ;#34 space left for stack _число_ + db #CB ;#35 bytes + db #25,#19,#8B ;#36 stack not empty + db #41,#1C,#A5 ;#37 state of stack + db #47,#B2 ;#38 analyser error + db #20,#1C,#25,#A6 ;#39 out of stack space + db #25,#8B ;#3A stack empty + db #2E,#94 ;#3B workspace insufficient + db #AE ;#3C workspace + db #4C,#22,#19,#91 ;#3D Professional program not found + db #15,#D0 ;#3E known disk + db #50,#19,#CD ;#3F disk not TRDOS + db #0D,#08,#B0 ;#40 devision by zero + db #0E,#01,#80 ;#41 failed at _число_ + db #2C,#12,#86 ;#42 too few blocks + db #0A,#C0 ;#43 enter address + db #0E,#D0 ;#44 failed disk + db #37,#0F,#9B ;#45 invalid file name + db #04,#44,#1C,#8F ;#46 bad count of file + db #0F,#03,#CE ;#47 file not exist + db #0F,#19,#91 ;#48 file not found + db #50,#18,#A6 ;#49 disk no space + db #39,#0F,#B8 ;#4A illegal file type + db #D0 ;#4B disk + db #C7 ;#4C analyser + db #87 ;#4D breackpoint + db #D2 ;#4E execution + db #D3 ;#4F configuration + db #4F,#32,#80 ;#50 R/W error _число_ + db #54,#D5 ;#51 memory control + db #D0 ;#52 disk + db #D1 ;#53 other + db #2D,#8F ;#54 undefined file + db #39,#7F,#01,#38 ;#55 illegal fromat file + db #7F,#00,#8F + db #56,#50,#19,#91 ;#56 hard disk not found + db #56,#50,#4F,#32,#80 ;#57 hard disk R/W error _число_ + db #56,#50,#AD ;#58 hard disk undefined + db #56,#50,#91 ;#59 hard disk found + db #58,#57,#B2 ;#5A CMOS checksum error + db #58,#19,#91 ;#5B CMOS not found + db #00,#4B,#58,#91 ;#5C _число_ bytes CMOS found + db #59,#DA ;#5D boot record + db #3D,#D0 ;#5E ROM disk + db #C2 ;#5F selections: + db #5B,#19,#91 ;#60 busy not found + db #56,#50,#19,#DC ;#61 hard disk not ready + db #56,#50,#7F,#01,#1D ;#62 hard disk data not ready + db #7F,#00,#19,#DC + db #37,#7F,#02,#14,#95 ;#63 invalid partition manager + db #7F,#02,#9E ;#64 select + db #5D,#9B ;#65 duplicate name + db #7F,#02,#14,#7F,#00 ;#66 partition not found + db #19,#91 + db #7F,#02,#14,#7F,#00 ;#67 partition undefined + db #AD + db #7F,#01,#1D,#7F,#00 ;#68 data CRC error + db #5E,#B2 + db #7F,#02,#2C,#7F,#00 ;#69 NVRAM R/W error + db #4F,#B2 + db #C5 ;#6A *** + +;АДРЕС: #1A40 пауза с индикацией на бордюре и печать даты и времени в окне монитора +x1A40 ld bc,#0000 +x1A43 ld a,c + out (#FE),a + dec bc + ld a,c + or b + jr nz,x1A43 + pop bc + +;АДРЕС: #1A4C печать даты и времени в окне монитора +; +x1A4C bit 3,(iy+#27) + ret z ;индикация времени отлючена + ld hl,(xE3B7) ;адрес дескриптора текущего окна + ld de,xE0C9 + or a + sbc hl,de + ret nz ;отображено окно в котором нельзя выводить время + ld hl,xDB69 ;буфер для чтения даты и времени в формате ASCII + push hl + ld d,%11111010 + call x1AAF ;читаем время в строку в формате ASCII + ld hl,(xE3BC) ;первый свободный адрес в буфере печати + ld (hl)," " + inc hl + ld d,%10100000 + call x1B21 ;читаем дату в строку в формате ASCII + ld hl,(xE3BC) ;первый свободный адрес в буфере печати + pop bc + or a + sbc hl,bc + ld b,l ;длина строки + ld hl,(xE0C9) + push hl ;запомним координаты курсора в окне + ld a,(xE0C9+#06) ;xE0CF + push af ;запомним атрибуты окна + ld hl,#0017 + ld (xE0C9),hl ;координаты печати времени + ld a,(xE111) ;атрибуты печати + dec e ;если воскресенье, выводим красным цветом + inc e + jr nz,x1A8E + ld a,%00101010 +x1A8E ld (xE0C9+#06),a ;атрибуты печати + rst #20 + db #84 ;вывод с выравниванием + ld hl,xDB69 ;адрес строки + rst #30 + dw rom2_x15B3 ;печать сообщения из hl длиной b + db #02 + rst #20 + db " " + db #86 ;выровняем по правому краю + pop af + ld (xE0C9+#06),a ;восстановим атрибуты + pop hl + ld (xE0C9),hl ;восстановим координаты курсора + ret + +;АДРЕС: #1AA6 читаем время в строку в формате ASCII +;вх: 0-4,d байт разделитель +#20 +; 5,d,=1 можно выводить секунды +; 6,d,=1 можно выводить минуты +; 7,d,=1 можно выводить часы +x1AA6 call x1AEC ;установка переменных для печати даты и времени + ret c ;CMOS отсутствует + call x1C67 ;чтение из CMOS времени и даты + jr x1AB2 + +;АДРЕС: #1AAF читаем время в строку в формате ASCII +;вх: 0-4,d байт разделитель +#20 +; 5,d,=1 можно выводить секунды +; 6,d,=1 можно выводить минуты +; 7,d,=1 можно выводить часы +; hl - адрес буфера +; +x1AAF call x1AF5 +x1AB2 ld hl,xDFF6+2 + bit 7,d + jr z,x1ABF ;часы не выводим + call x1ADE ;час в строку + call x1AD7 ;вывод разделителя в строку +x1ABF dec hl + bit 6,d + jr z,x1AC7 ;минуты не выводим + call x1ADE ;минуты в строку +x1AC7 dec hl + bit 5,d + jr z,x1AD2 ;секунды не выводим + call x1AD7 ;вывод разделителя в строку + call x1ADE ;секунды в строку +x1AD2 res 6,(iy+9) + ret +;вывод разделителя в строку +x1AD7 ld a,d + and #1F + or #20 + rst #10 + ret +;преобразование часа/минуты/секунды в строку +x1ADE push de + ld c,(hl) + ld b,#00 ;час + ld (iy+7),#02 + rst #30 + dw rom2_x1673 ;преобразование числа в строку + db %00000010 + pop de + ret +;установка переменных для печати даты и времени +;вых: cy=1 CMOS отсутствует +x1AEC bit 6,(iy+#1A) + scf + ret z ;CMOS отсутствует + ccf + jr x1AFC +x1AF5 ld (xE3BC),hl + set 6,(iy+9) ;печать в буфер +x1AFC ld (iy+#08),#30 ;код ведущего ноля + ld (iy+#10),#0A ;делитель для выделения разрядов числа + ret + +;АДРЕС: #1B05 чтение даты из буфера и расчет номера дня недели +;вых: c день +; b месяц +; a,e год +; l номер дня недели (0 - Вс, 1 - Пн и т.д.) +; +x1B05 ld bc,(xDFF9) + ld a,(xDFFB) + push de + push af + push bc + ld e,a + call x1BAC + pop bc + pop af + pop de + ld e,a + ret + +;АДРЕС: #1B18 читаем дату в строку в формате ASCII +;вх: 0-4,d байт разделитель +#20 +; 5,d,=1 выводить месяц словом и перед годом добавлять "19" +; 6,d,=1 ставить символ 0 перед числом +; 7,d,=1 выводить день недели +x1B18 call x1AEC ;установка переменных для печати даты и времени + ret c ;CMOS отсутствует + call x1C67 ;чтение из CMOS времени и даты + jr x1B24 + +;АДРЕС: #1B21 читаем дату в строку в формате ASCII +;вх: 0-4,d байт разделитель +#20 +; 5,d,=1 выводить месяц словом и перед годом добавлять "19" +; 6,d,=1 ставить символ 0 перед числом +; 7,d,=1 выводить день недели +; hl - адрес буфера +; +x1B21 call x1AF5 +x1B24 call x1B05 ;чтение даты из буфера и расчет номера дня недели + push af + push bc + bit 7,d + jr z,x1B39 ;день недели не выводим + ld a,l ;день недели в строку + ld e,l + ld hl,rom2_x3F0A ;Названия дней недели + rst #30 + dw rom2_x15D0 + db %00000010 + call x1AD7 ;вывод разделителя в строку +x1B39 pop hl + ld c,l ;день + push hl + ld b,#00 + ld a,#01 + bit 6,d + jr z,x1B45 ;ведущий 0 не ставить + inc a +x1B45 ld (iy+7),a ;минимум разрядов в числе + push de + rst #30 + dw rom2_x1673 ;преобразование числа в строку + db %00000010 + pop de + call x1AD7 ;вывод разделителя в строку + pop af ;месяц + bit 5,d + jr z,x1B60 ;выводим цифрой + dec a ;выводим словом + ld hl,rom2_x3EE6 ;названия месяцев + rst #30 + dw rom2_x15D0 + db %00000010 + jr x1B6D +x1B60 ld c,a + ld b,0 + ld (iy+7),#02 + push de + rst #30 + dw rom2_x1673 ;преобразование числа в строку + db %00000010 + pop de +x1B6D call x1AD7 ;вывод разделителя в строку + pop af + ld c,a + bit 5,d + jr z,x1B82 ;год выводим двумя цифрами + cp 80 + jr nc,x1B7F + rst #20 + dc "20" + jr x1B82 +x1B7F rst #20 + dc "19" +x1B82 ld b,#00 + ld (iy+7),#02 + push de + rst #30 + dw rom2_x1673 ;преобразование числа в строку + db %00000010 + pop de + res 6,(iy+9) + ret + +;АДРЕС: #1B93 таблица для вычисления кода месяца +x1B93 db 2 ;март + db 5 ;апрель + db 7 ;май + db 10 ;июнь + db 12 ;июль + db 15 ;август + db 18 ;сентябрь + db 20 ;октябрь + db 23 ;ноябрь + db 25 ;декабрь + db 28 ;январь + db 31 ;февраль +x1B9F db 33 ; +;количество дней в месяцах + db 31 ;январь + db 28 ;февраль + db 31 ;март + db 30 ;апрель + db 31 ;май + db 30 ;июнь + db 31 ;июль + db 31 ;август + db 30 ;сентябрь + db 31 ;октябрь + db 30 ;ноябрь + db 31 ;декабрь + +;АДРЕС: #1BAC расчет номера дня недели +;вх: c день +; b месяц +; e год +;вых: l номер дня недели (0 - Вс, 1 - Пн и т.д.) +; +x1BAC exx + push hl + push de + push bc + exx + ld a,e ;a,de - год + ld d,#00 + ld hl,1900 + add hl,de + cp 80 + jr nc,x1BC0 ;год >=80 + ld de,100 + add hl,de ;hl текущий год в формате yyyy +x1BC0 ld a,b ;определение кода месяца + sub 3 + jr nc,x1BC8 + add a,12 + dec hl +x1BC8 ld de,x1B93 + add a,e + ld e,a + jr nc,x1BD0 + inc d +x1BD0 ld a,(de) ;a код месяца + add a,c ;+день + push hl ;год + add a,l + ld l,a + jr nc,x1BD8 + inc h +x1BD8 ex (sp),hl + push hl + srl h + rr l + srl h + rr l + ex (sp),hl + push hl + ld de,100 + rst #30 + dw rom2_x0E73 ;bc=hl/de + db %00000010 + pop hl ;bc=год/100 + push bc + ld de,400 + rst #30 + dw rom2_x0E73 ;bc=hl/de + db %00000010 + pop de ;bc=год/400 + pop hl + add hl,bc + or a + sbc hl,de ;hl год/4 + год/400 - год/100 + pop bc ;bc день + (31 * месяц)/12 + год + add hl,bc + ld de,#0000 + exx + ld bc,#0007 + rst #30 + dw rom7_x0F5D ;l остаток от деления + db %00000111 + exx + pop bc + pop de + pop hl + exx + ret + +;АДРЕС: #1C0D работа с микросхемой CMOS (rst 8: db #89) +;вх: d - код операции: 7,=1/0 записать/считать +; 6,=1/0 читать в буфер/только в регистры +; 5,=0 =0 читать в строку ASCII +; 0,=1/0 дата/время +; e - при чтении в ASCII формат перевода +; 0-4,e байт разделитель +#20 +; 5,e,=1 выводить месяц словом и перед годом добавлять "19" +; 6,e,=1 ставить символ 0 перед числом +; 7,e,=1 выводить день недели +; 5,e,=1 можно выводить секунды +; 6,e,=1 можно выводить минуты +; 7,e,=1 можно выводить часы +; hl - адрес буфера (если бит 6,d =1) +; c - секунды/число +; b - минуты/месяц +; e - часы/год +;вых: cy=1 - если микросхемы CMOS нет или задан неверный формат запроса +; hl - строка текста ASCIZ (если бит 6,d =1) +; c - секунды/число +; b - минуты/месяц +; e - часы/год +; l - день недели +; +x1C0D bit 6,(iy+#1A) + scf + ret z ;CMOS отсутствует + bit 7,d + jr nz,x1C4A ;запись времени или даты в CMOS + bit 6,d + jr z,x1C34 ;чтение в регистры из CMOS времени/даты + bit 5,d + jr nz,x1C2E ;чтение в буфер времени и даты + bit 0,d ;читаем в формате ASCII + ld d,e + jr nz,x1C29 ;читаем дату в строку в формате ASCII + call x1AAF ;читаем время в строку в формате ASCII + or a + ret +x1C29 call x1B21 + or a + ret +;чтение времени и даты из CMOS в буфер +x1C2E rst #30 + dw rom7_x1F93 + db %00000111 + or a + ret +;чтение из CMOS вренени и даты +x1C34 call x1C67 + bit 0,d + jr z,x1C40 ;время + call x1B05 ;дата + or a + ret +x1C40 ld hl,xDFF6 + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ld e,(hl) + or a + ret +;запись времени или даты в CMOS +x1C4A call x1C67 ;чтение из CMOS вренени и даты + bit 0,d + jr nz,x1C62 ;это дата + ld hl,xDFF6 ;адрес времени +x1C54 ld (hl),c + inc hl + ld (hl),b + inc hl + ld (hl),e + ld hl,xDFF6 ;запись времени и даты в CMOS + rst #30 + dw rom7_x1FB2 + db %00000111 + or a + ret +x1C62 ld hl,xDFF9 ;адрес даты + jr x1C54 +;чтение из CMOS времени и даты +x1C67 ld hl,xDFF6 + push bc + push de + rst #30 + dw rom7_x1F93 + db %00000111 + pop de + pop bc + ret + +;АДРЕС: #1C73 ввод текстовой строки в нижней строке экрана +;вх: 7,a =1/0 атрибуты bright 1, paper 3, ink 4/bright 0, paper 5, ink 2 +; 6-0,a - номер сообщения из блока 0 +; a =#00 продолжение ввода +;вых: hl = xDE17 адрес введенной строки +; a - код нажатой клавиши +; cy=0 выход по enter +; =1 выход по другой комбинации +; +x1C73 rst #30 + dw rom2_x3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана + db #02 + rlc a + jr z,x1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) + call x1C84 ;инициализация окна ввода + call x1CB8 ;ввод строки (вых: hl адрес введенной строки) + ret c ;отмена ввода + ld a,#0C ;сообщение _Working ... + +;АДРЕС: #1C84 инициализация окна ввода +;вх: 0,a =1/0 атрибуты bright 1, paper 3, ink 4/bright 0, paper 5, ink 2 +; 7-1,a - номер сообщения из блока 0 +; cy=1 с очисткой буфера ввода +x1C84 push af + ld hl,xDE17 ;буфер для ввода строки + ld (xDE15),hl + call c,x1DD6 ;очистка буфера вводимой строки + rst #30 + dw rom2_x2A5E ;очистка текущего окна + db #02 + pop af + push af + srl a + ld hl,#5AC0 ;атрибуты информационной строки на экране + ld e,l + ld d,h + ld (hl),#29 ;bright 0, paper 5, ink 1 + cp #0A + jr c,x1CA3 + ld (hl),#2A ;bright 0, paper 5, ink 2 +x1CA3 inc de + ld bc,#001F + ldir + inc (ix+1) + ld b,a + rst #08 + inc (ix+0) + pop af + ret + +;АДРЕС: #1CB3 продолжение ввода строки (вых: hl адрес введенной строки) +;вых: hl = xDE17 адрес введенной строки +; a - код нажатой клавиши +; cy=0 выход по enter +; =1 выход по другой комбинации +; +x1CB3 call x1DEC ;удаление кода возврата каретки из строки + jr x1CC7 + +;АДРЕС: #1CB8 ввод строки (вых: hl адрес введенной строки) +;вых: hl = xDE17 адрес введенной строки +; a - код нажатой клавиши +; cy=0 выход по enter +; =1 выход по другой комбинации +; +x1CB8 call x1DEC ;удаление кода возврата каретки из строки ввода + ld hl,xDE17 + ld (xDE15),hl + call x1D70 ;позиционирование курсора в конец строки +x1CC4 call x1D98 ;печать вводимой строки на экране +x1CC7 ld hl,x1CC4 ;тут зациклим + push hl + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + rst #30 + dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) + db #02 +x1CD3 call x1033 ;вызов п/п обработки нажатия клавиши + db #85 ;cs+5 + dw x1D5A ;перемещение курсора в водимой строке влево + db #83 ;cs+8 + dw x1D64 ;перемещение курсора в водимой строке вправо + db #7F ;cs+0 + dw x1D40 ;удаление символа перед курсором (delete) + db #0D ;enter / cs+1+m + dw x1D0D ; + db #86 ;cs+6 вниз + dw x1E5B ;копирование в буфер ввода предпоследней введенной строки + db #84 ;cs+7 вверх + dw x1EC0 ;копирование в буфер ввода следующей введенной строки + db #1F ;ss+i + dw x1DC2 ;смена режима вставки/замены при вводе строки + db #FF + cp #20 ;a - код нажатой клавиши + jr c,x1CF4 ;a=[#00..#1F] + cp #80 + jr c,x1D10 ;a=[#20..#7F] +x1CF4 scf ;a - непечатный символ +x1CF5 push af ;cy =1/0 отмена/ввод + push de + push af + call nc,x1E2D ;сохранение введенной строки в буфере последних введенных строк + call x1D98 ;печать введенной строки на экране + rst #30 + dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) + db #02 + pop af + call nc,x1D10 ;добавление символа в вводимую строку + pop de + pop af + pop hl + ld hl,xDE17 ;адрес введенной строки + ret +x1D0D or a + jr x1CF5 + +;АДРЕС: #1D10 добавление символа в вводимую строку +;вх: a - код нажатой клавиши +x1D10 ld e,a + call x1DB7 ;получение адреса под курсором в буфере строки + ld d,(ix+#0B) + dec d + ld c,(ix+1) + ld a,d + cp c + jr z,x1D38 ;курсор в последней позиции. предупреждаем звонком + bit 1,(ix+#0D) + jr nz,x1D36 ;режим замены символов +x1D25 sub c ;раздвигаем строку + ld c,a + ld b,#00 + push hl + add hl,bc + ld a,(hl) + push de + ld e,l + ld d,h + dec hl + lddr + pop de + pop hl + jr x1D38 +x1D36 ld a," " +x1D38 ld (hl),e ;ставим символ + cp " " + call nz,x1EEE ;звонок с установкой бордюра + jr x1D64 ;перемещение курсора в введенной строке вправо + +;АДРЕС: #1D40 удаление символа перед курсором (delete) +x1D40 call x1D5A ;перемещение курсора в вводимой строке влево + ret z + call x1DB7 ;получение адреса под курсором в буфере строки + ld a,(ix+#0B) + dec a + sub (ix+1) + ld c,a + ld e,l + ld d,h + inc hl + ld b,#00 + ldir ;удаление символа под курсором + ld a," " ;в конец строки допишем пробел + ld (de),a + ret + +;АДРЕС: #1D5A перемещение курсора в водимой строке влево +;вых: z - курсор в крайнем положении +x1D5A ld a,(ix+1) + or a + ret z + dec (ix+1) + inc a + ret + +;АДРЕС: #1D64 перемещение курсора в вводимой строке вправо +x1D64 ld a,(ix+1) + inc a + cp (ix+#0B) + ret nc + inc (ix+1) + ret + +;АДРЕС: #1D70 позиционирование курсора в конец строки +x1D70 ld hl,(xDE15) ;адрес буфера вводимой строки + ld a,(ix+#0B) ;размер окна в символах + ld c,a + dec a ;крайняя правая координата + add a,l + ld l,a + jr nc,x1D7D + inc h ;hl адрес конца строки +x1D7D ld b,#00 ;bc длина сроки + ld a," " +x1D81 cpd ;ищем символ не пробел + jp po,x1D94 ;bc=0 конец поиска + jr z,x1D81 +x1D88 ld a,(ix+#0B) ;такой символ найден + dec a + cp c + jr z,x1D90 + inc c ;ставим курсор после этого символа +x1D90 ld (ix+1),c + ret +x1D94 jr z,x1D90 ;если все-таки найден пробел + jr x1D88 + +;АДРЕС: #1D98 печать вводимой строки на экране +x1D98 rst #30 + dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) + db #02 + ld a,(ix+1) ;сохраним координату X курсора + push af + ld hl,(xDE15) ;начало вводимой строки + ld b,(ix+#0B) ;длина строки + ld (ix+1),#00 + rst #30 + dw rom2_x15B3 ;печать сообщения из hl длиной b + db #02 + pop af + ld (ix+1),a ;восстановим координату X курсора + rst #30 + dw rom2_x28E8 ;печать курсора в окне + db #02 + ret + +;АДРЕС: #1DB7 получение адреса под курсором в буфере строки +;вых: hl - адрес в буфере +x1DB7 ld a,(ix+1) + ld hl,(xDE15) + add a,l + ld l,a + ret nc + inc h + ret + +;АДРЕС: #1DC2 смена режима вставки/замены при вводе строки +; +x1DC2 ld a,(ix+#0D) + xor %00000010 + ld (ix+#0D),a + bit 1,a + ld a,#DB + jr z,x1DD2 + ld a,#DC +x1DD2 ld (ix+#0C),a + ret + +;АДРЕС: #1DD6 очистка буфера вводимой строки +x1DD6 ld hl,(xDE15) + ld c,(ix+#0B) + ld (hl)," " + dec c + ret z + ld b,#00 + ld e,l + ld d,h + inc de + ldir + ld (ix+1),#00 + ret + +;АДРЕС: #1DEC удаление кода возврата каретки из строки +x1DEC ld a,#0A + ld (xDE14),a + ld a,(ix+1) ;сохраним координату X + push af + call x1D70 ;позиционирование курсора в конец строки + ld a,(ix+1) + inc a + cp (ix+#0B) + jr z,x1E04 ;курсор на последнем символе строки + call x1D5A ;перемещение курсора в водимой строке влево +x1E04 call x1DB7 ;получение адреса под курсором в буфере строки + ld a,(hl) ;enter заменим на пробел + cp #0D + jr nz,x1E0E + ld (hl)," " +x1E0E pop af + ld (ix+1),a ;восстановим координату курсора + ret + +;АДРЕС: #1E13 помещение символа в строку и приращение адреса в буфере строк +;вх: hl - адрес в буфере +; de - адрес конца буфера +;вых: hl - очередной адрес в буфере +x1E13 ld (ix+0),a + inc ix + +;АДРЕС: #1E18 циклическое приращение адреса в буфере введенных строк +;вх: hl - адрес в буфере +; de - адрес конца буфера +;вых: hl - очередной адрес в буфере +x1E18 inc hl + or a + sbc hl,de + add hl,de + ret nz + ld hl,xDE42 + ret + +;АДРЕС: #1E22 получем адрес конца последней введенной строки +;вх: hl - адрес конца последней введенной строки +; de - адрес начала буфера +;вых: hl - адрес последнего символа последней введенной строки +x1E22 or a + sbc hl,de + add hl,de + jr nz,x1E2B + ld hl,xDFD2 +x1E2B dec hl + ret + +;АДРЕС: #1E2D сохранение введенной строки в буфере последних введенных строк +x1E2D call x1D70 ;позиционирование курсора в конец строки + ld b,(ix+1) ;длина введенной строки + ld a,b + or a + ret z ;пустая строка + push ix + ld ix,(xDE15) ;адрес начала введенной строки + ld hl,(xE035) + ld de,xDFD2 ;конец буфера последних введенных строк +x1E42 ld a,(ix+0) ;сохранение строки в буфере последних введенных строк + inc ix + ld (hl),a + call x1E18 ;циклическое приращение адреса в буфере введенных строк + djnz x1E42 + pop ix + ld (hl),#00 ;маркер конца введенной строки + call x1E18 ;циклическое приращение адреса в буфере введенных строк + ld (xE035),hl + ld (xE037),hl + ret + +;АДРЕС: #1E5B копирование в буфер ввода предпоследней введенной строки +;вх: a - код нажатой клавиши #86 +; +x1E5B ld bc,(xDE14) ; + cp c ; + ld b,#02 ; + jr nz,x1E65 ; + dec b ; +x1E65 ld (xDE14),a ; +x1E68 ld hl,(xE037) + ld de,xDE42 + call x1E22 ;получем адрес конца последней введенной строки +x1E71 call x1E22 ;ищем начало строки + ld a,(hl) + or a + jr nz,x1E71 + ld de,xDFD2 + call x1E18 ;циклическое приращение адреса в буфере введенных строк + call x1EE1 ;проверка списка на наличие введенных строк + ld a,(hl) + or a + jp z,x1DD6 ;эта строка пустая + ld (xE037),hl ;начало последней введенной строки + push bc + call x1E91 ;копирование строки из буфера введенных строк в буфер ввода строки + pop bc + djnz x1E68 + ret + +;АДРЕС: #1E91 копирование строки из буфера введенных строк в буфер ввода строки +x1E91 call x1DD6 ;очистка буфера вводимой строки + ld b,(ix+#0B) + ld hl,(xE037) ;начало последней введенной строки + ld de,xDFD2 ;конец буфера + push ix + ld ix,(xDE15) ;адрес буфера для ввода строки +x1EA3 ld a,(hl) ;копирование строки в буфер ввода + or a + jr z,x1EB5 ;конец строки + call x1E13 ;помещение символа в строку и приращение адреса в буфере строк + djnz x1EA3 +x1EAC ld a,(hl) ;если строка была длиннее буфера ввода, ищем ее конец + or a + jr z,x1EB5 + call x1E18 ;циклическое приращение адреса в буфере введенных строк + jr x1EAC +x1EB5 call x1E18 ;hl - адрес следующей строки в буфере введенных строк + pop ix + push hl + call x1D70 ;позиционирование курсора в конец строки + pop hl + ret + +;АДРЕС: #1EC0 копирование в буфер ввода следующей введенной строки +;вх: a - код нажатой клавиши #84 +; +x1EC0 ld hl,(xE037) + ld bc,(xDE14) + cp c + ld b,#02 + jr nz,x1ECD + dec b +x1ECD ld (xDE14),a +x1ED0 call x1EE1 ;проверка списка на наличие введенных строк + ld a,(hl) + or a + ret z ;строка пустая + push bc + call x1E91 ;копирование строки из буфера введенных строк в буфер ввода строки + ld (xE037),hl + pop bc + djnz x1ED0 + ret + +;АДРЕС: #1EE1 проверка списка на наличие введенных строк +;вх: hl - начало последней введенной строки +x1EE1 ld de,(xE035) ;первый свободный адрес в буфере последних введенных строк(команд) + or a + sbc hl,de + add hl,de + ret nz + pop hl ;список пустой + jp x1DD6 ;очистка буфера вводимой строки + +;АДРЕС: #1EEE звонок с установкой бордюра +x1EEE rst #20 + db #87 + ret + +;АДРЕС: #1EF1 печать каталога и выбор позиции в нем +;вых: cy=0 выбор произведен успешно +; hl - номер позиции в каталоге +; cy=1 ошибка выбора +; +x1EF1 call x2028 ;определение номера последней записи в каталоге + db #02 + ld (xDD89),hl ;номер последней записи + call x203C ;расчет размеров и печать окна под каталог + ld hl,#0000 ;номер записи каталога, с которой начинаем печать + ld (xE9E3),hl + call x1F7F ;печать каталога в окне +x1F04 ld hl,x1F04 ;сюда вернемся + push hl + call x1FF4 ;печать выделенной позиции в каталоге + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + push af ;a - код нажатой клавиши + call x1FBA ;снимаем выделение строки каталога + pop af + call x0385 ;обработка реакции на нажатия клавиш + call nc,x1FDC ;покажем выбранную позицию + call x1033 + db #84 ;cs+7 вверх + dw x1F4C ;нажата клавиша вверх, двигаем выделение вверх + db #86 ;cs+6 вниз + dw x1F94 ;нажата клавиша вниз, двигаем выделение вниз + db #0D ;enter + dw x1F44 ;выбор позиции в каталоге + db #80 ;fire KempJoy в окне + dw x1F4B ;!!!ОШИБКА должно быть x1F44 + db #FF + cp #3A + ccf + jr c,x1F45 ;не цифра + cp #30 + jr c,x1F45 ;не цифра + sub #30 + jr nz,x1F39 + ld a,#0A ;"0" =10 +x1F39 dec a + cp (ix+4) + ret nc ;нет позиции с таким номером + ld (ix+0),a + call x1FDC ;покажем выбранную позицию +;выбор позиции в каталоге +x1F44 or a +x1F45 pop hl + push af + call x201D ;(xE9E3) +crd Y курсора + pop af +x1F4B ret +;нажата клавиша вверх, двигаем выделение вверх +x1F4C call x201D ;(xE9E3) +crd Y курсора + ld a,l + or h + jr z,x1F64 ;достигнут предел + call x2012 ;уменьшаем координату Y + ret nz ;умеyьшили успешно + rst #30 + dw rom2_x2A1B ;скроллинг окна ввниз + db #02 + ld hl,(xE9E3) + dec hl + ld (xE9E3),hl + jr x1FBA ;печать одной строки каталога ROM-disk +x1F64 ld hl,(xDD89) ;переход на нижнюю строчку + ld c,(ix+4) + dec c + ld (ix+0),c + xor a + ld b,a + sbc hl,bc + jr nc,x1F7C + ld a,l + add a,c + ld (ix+0),a + ld hl,#0000 +x1F7C ld (xE9E3),hl +;печать каталога ROM-disk в окне +x1F7F ld a,(ix+0) + push af ;сохраним crd Y курсора + xor a + ld (ix+0),a ;crd Y =0 +x1F87 call x1FBA ;;печать одной строки каталога ROM-disk + call x2006 ;приращение координаты Y курсора + jr nz,x1F87 ;печатаем следующую строку + pop af + ld (ix+0),a ;восстановим crd Y курсора + ret +;нажата клавиша вниз, двигаем выделение вниз +x1F94 ld hl,(xDD89) + push hl + call x201D ;(xE9E3) +crd Y курсора + pop de + xor a + sbc hl,de + jr c,x1FAB + ld h,a ;достигнут нижний предел. переходим на верхнюю строку + ld l,a + ld (xE9E3),hl + ld (ix+0),a + jr x1F7F ;печать каталога ROM-disk в окне +x1FAB call x2006 ;приращение координаты Y курсора + ret nz ;успешно + rst #30 + dw rom2_x298E ;скроллинг окна вверх + db #02 + ld hl,(xE9E3) + inc hl + ld (xE9E3),hl +;печать одной строки каталога ROM-disk +x1FBA ld (ix+1),#00 + rst #30 + dw rom2_x2B10 ;печать пробела (rst #10) + db #02 + call x201D ;(xE9E3) +crd Y курсора + ex de,hl + ld hl,(xDD89) + or a + sbc hl,de ;номер последней записи в каталоге ROM-disk + jr c,x1FD3 + ex de,hl + call x2028 ;печать одного имени из каталога ROM-disk + db #00 ;вх: hl - номер записи +x1FD3 rst #30 + dw rom2_x2FED ;печать пробелов до правого края окна + db #02 + rst #30 + dw rom2_x2B10 ;печать пробела (rst #10) + db #02 + ret +;покажем выбранную позицию +x1FDC push af + call x1FF4 ;печать выделенной позиции в каталоге ROM-disk + call x1FE8 ;пауза примерно 646k тактов + call x1FBA ;снимаем выделение позиции + pop af + ret +;пауза примерно 646k тактов +x1FE8 ld a,#C0 +x1FEA push bc +x1FEB ld b,#00 + djnz $ + pop bc + dec a + jr nz,x1FEA + ret +;печать выделенной позиции в каталоге ROM-disk +x1FF4 ld a,(ix+6) + push af ;сохраним атрибуты + ld a,(ix+#0E) + ld (ix+6),a + call x1FBA ;печать одной строки каталога ROM-disk + pop af + ld (ix+6),a + ret +;приращение координаты Y курсора +;вых: z - не было приращения +x2006 ld a,(ix+4) + dec a + cp (ix+0) + ret z + inc (ix+0) + ret +;уменьшаем координату Y +x2012 ld a,(ix+0) + or a + ret z + dec (ix+0) + xor a + inc a + ret +;(xE9E3) +crd Y курсора +x201D ld hl,(xE9E3) + ld a,(ix+0) + +;АДРЕС: #2023 сложение hl=hl+a +x2023 add a,l + ld l,a + ret nc + inc h + ret + +;АДРЕС: #2028 вызов процедуры по таблице, адрес которой в (xE9E1) +;вх: db ? номер процедуры +; =#04 заголовок +x2028 ex (sp),hl + ld a,(hl) + inc hl + ex (sp),hl + +;АДРЕС: #202C вызов процедуры по таблице, адрес которой в (xE9E1) +;вх: a - номер процедуры +; =#04 заголовок +x202C push hl + ld hl,(xE9E1) + call x2023 ;сложение hl=hl+a + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ex (sp),hl + ld a,(xDDA7) + ret + +;АДРЕС: #203C расчет размеров и печать окна под каталог ROM-disk +x203C call x205A ;установка текущим окна: вывод каталога + ld bc,(xDD89) ;номер последней записи каталога ROM-disk + ld hl,#000F ;высота окна не более 16 + or a + sbc hl,bc + jr nc,x204D + ld c,#10 +x204D inc c + ld (ix+4),c ;высота окна + ld hl,#0531 ;атрибуты заголовка и выравнивание + +;АДРЕС: #2054 печать рамки вокруг окна +x2054 call x207A ;печать рамки вокруг окна + rst #20 + db #8C ;очистка окна + ret + +;АДРЕС: #205A установка текущим окна: вывод каталога +x205A ld hl,xE0F3 + rst #30 + dw rom2_x301C ;ix = адрес дескриптора окна монитора из hl + db #02 + ret + +;печатные коды рамок +x2062 db #BB,#CD,#C9,#BA,#BA,#BC,#CD,#C8 + db #B9,#CD,#CC,#BA,#BA,#BC,#CD,#C8 + db #B6,#C4,#C7,#BA,#BA,#BC,#CD,#C8 + +;АДРЕС: #207A печать рамки вокруг окна +;вх: l - атрибуты заголовка +; h - выравнивание загловка (=0 нет выравнивания) +; hl=#0000 нет заголовка +; +x207A bit 7,(ix+8) + ret z ;нет рамки + push hl + ld de,xE338 ;сохраним дескриптор окна + push ix + pop hl + push hl + ld bc,#000E + ldir + pop hl + ld (hl),#00 ;координаты курсора =0 + inc hl + ld (hl),#00 + inc hl + dec (hl) ;увеличим размерыокна на 2 + inc hl + dec (hl) + inc hl + inc (hl) ;высота +2 + inc (hl) + inc hl + inc (hl) ;ширина +2 + inc (hl) + ld (ix+7),#03 ;системные атрибуты окна + ld a,(ix+9) + ld (ix+6),a ;атрибуты рамки + ld a,(ix+8) + and %00111000 + ld l,a + ld h,#00 ;номер рамки *8 + ld de,x2062 + add hl,de ;адрес рамки + ld (ix+#0A),#08 ;размер символов в пикселях + ld a,(ix+#0B) + push af ;сохраним ширину окна + ld (ix+#0B),#20 ;ширина окна 32 + call x2120 ;печать верхней линии рамки + ld b,(ix+4) + dec b + dec b ;высота + jr z,x20E0 ;средних линий нет + ld c,(ix+5) + dec c ;правая координата X + ld e,(hl) + inc hl + ld d,(hl) + inc hl ;de печатные коды рамки +x20D0 inc (ix+0) ;печать средных линий рамки + ld (ix+1),#00 + ld a,e + rst #10 + ld (ix+1),c + ld a,d + rst #10 + djnz x20D0 +x20E0 inc (ix+0) + ld (ix+1),#00 + call x2120 ;печать нижней линии рамки + pop af + inc a + inc a + inc a + ld (ix+#0B),a + ld (ix+#0A),#06 + pop hl + ld a,l + or h + jr z,x2114 ;нет загаловка + ld (ix+0),#00 + ld (ix+1),#01 + ld (ix+6),l + ld a,h + or a + push af + jr z,x210C ;нет выравнивания + rst #20 + db #84 ;вывод с выравниванием +x210C call x2028 + db #04 ;печать заголовка окна + pop af + jr z,x2114 + rst #10 ;выровняли заголовок +x2114 ld hl,xE338 ;восстановим дескриптор окна + push ix + pop de + ld bc,#000E + ldir + ret +;печать линии рамки +x2120 ld e,(hl) + inc hl + ld d,(hl) + inc hl + ld a,(hl) + inc hl + rst #10 + ld b,(ix+5) ;ширина окна + dec b + dec b +x212C ld a,d + rst #10 + djnz x212C + ld a,e + rst #10 + ret + +;АДРЕС: #2133 коррекция координат и размеров окна +;вх: hl - координаты окна +; e - ширина окна в знакоместах +; d - ширина окна в символах +x2133 ld (xE0F3+#02),hl + ld a,e + ld (xE0F3++#05),a + ld a,d + ld (xE0F3++#0B),a + ret + +;АДРЕС: #213F координаты Y и X полей для окна редактирования дампа +x213F db #00,#02,#05 + db #08,#09,#0B,#0C,#0E,#0F,#11,#12 + db #14,#15,#17,#18,#1A,#1B,#1D,#1E + db #21,#28 + db #FC + db #08,#09,#0B,#0C,#0E,#0F,#11,#12 + db #14,#15,#17,#18,#1A,#1B,#1D,#1E + db #21,#28 + db #FF + +;АДРЕС: #2168 таблица со списком процедур для окна редактирования дампа +x2168 dw x2447 ;#00 печать одной строки дампа памяти (8 байт) + dw x2365 ;#02 обновление окна дампа памяти + dw x21A7 ;#04 заглушка ret + dw x2286 ;#06 скроллинг дампа + dw x2286 ;#08 скроллинг дампа + dw x243D ;#0A чтение байта из памяти пользователя + dw x2442 ;#0C запись байта в память пользователя + dw x2409 ;#0E редактирование слово в bc + dw x244C ;#10 обновление окна с дизасмом памяти начиная с текущей ячейки + +;АДРЕС: #217A поиск чего-то (такое впечатление, что тут ошибка, по логике +; должно быть сравнение с координатой X) +;вых: при текущем раскладе на выходе всегда z +; hl=x213F+#15 +x217A ld hl,(xE9DF) +x217D ld a,(hl) + cp #FD + ret nc + cp #FC + ret z + and #7F + cp (ix+#00) + ret z +x218A inc hl + bit 7,(hl) + jr nz,x217D + jr x218A + +;АДРЕС: #2191 проверка попадания курсора по X на редактируемый байт в дампе +;вых: z - crdX на каком-то байте поля дампа +x2191 ld a,(hl) + cp #FD + ret nc +x2195 inc hl + ld a,(hl) + bit 7,a + ret nz + cp (ix+#01) + ret nc + inc hl + ld a,(hl) + cp (ix+#01) + ret z + jr c,x2195 + xor a +x21A7 ret + +;АДРЕС: #21A8 коррекция координаты X, при движении курсора влево +;вых: z - курсор на байте дампа +; nz - невозможно откорректировать координату +x21A8 push hl + call x2191 ;проверка попадания курсора по X на редактируемый байт в дампе + pop hl + ret z ;crdX на каком-то байте поля дампа + call x2253 ;декремент координаты X + jr nz,x21A8 ;координата X уменьшена + jr x2208 ;декремента не было + +;АДРЕС: #21B5 коррекция координаты X, при движении курсора +;вых: z - курсор на байте дампа +; nz - невозможно откорректировать координату +x21B5 ld c,(ix+#01) ;crd X + call x21FD ;коррекция координаты X, при движении курсора вправо + ret z ;курсор на байте дампа + ld (ix+#01),c ;восстановим координату X + call x21A8 ;коррекция координаты X, при движении курсора влево + ret z ;курсор на байте дампа + ld (ix+#01),c ;восстановим координату X + ret + +;АДРЕС: #21C7 инкремент координаты X, и изменение адреса текущей ячейки дампа +;вых: z - курсор на байте дампа +x21C7 call x2247 ;инкремент координаты X в рамках окна + jr z,x21D3 ;инкремента небыло + call x217A + call x21FD ;коррекция координаты X, при движении курсора вправо + ret z ;курсор на байте дампа +; crd X =#00 +x21D3 ld (ix+#01),#00 + +;АДРЕС: #21D7 перемещение курсора на 8 байт вниз (нажатие cs+6/ss+S курсор вниз) +x21D7 ld e,#08 + jr x21DD +;перемещение курсора на один байт вниз +x21DB ld e,#01 +;перемещение курсора на E байт вниз +x21DD call x2006 ;приращение координаты Y курсора + ld a,#08 ;скроллинг дампа + jp z,x202C ;Y не изменилась. вызов процедуры по таблице, адрес которой в (xE9E1) + +;АДРЕС: #21E5 коррекция координаты X, при движении курсора +;вых: z - курсор на байте дампа +; nz - +x21E5 call x21ED + ret z + ld (ix+#00),#00 ;crd Y =0 +x21ED call x217A ;при текущем раскладе на выходе всегда z + jr nz,x21F6 + call x21B5 ;коррекция координаты X, при движении курсора + ret z ;курсор на байте дампа +x21F6 call x2006 ;приращение координаты Y курсора + jr nz,x21ED ;координата Y изменилась + jr x2208 ;установка nz и выход + +;АДРЕС: #21FD коррекция координаты X, при движении курсора вправо +;вых: z - курсор на байте дампа +; nz - невозможно откорректировать координату +x21FD push hl + call x2191 ;проверка попадания курсора по X на редактируемый байт в дампе + pop hl + ret z ;crdX на каком-то байте поля дампа + call x2247 ;инкремент координаты X в рамках окна + jr nz,x21FD ;инкремент был +;установка флага nz +x2208 xor a + inc a + ret + +;АДРЕС: #220B декремент координаты X в рамках текущего поля со скроллингом +x220B call x2253 ;декремент координаты X + jr z,x2217 ;декремента не было + call x217A + call x21A8 ;коррекция координаты X, при движении курсора влево + ret z ;курсор на байте дампа +; ставим курсор на крайнюю правую позицию +x2217 ld a,(ix+#0B) ;размер окна в символах + dec a + ld (ix+#01),a ;новая координата X (крайняя правая позиция) + +;АДРЕС: #221E перемещение курсора на 8 байт вверх (нажатие cs+7/ss+W курсор вверх) +x221E ld e,#F8 + jr x2224 +;скроллинг на строку вверх +x2222 ld e,#FF +x2224 call x2012 ;уменьшаем координату Y + ld a,#06 ;скроллинг дампа + jp z,x202C ;координата Y не была уменьшена (вызов процедуры скроллинга) + call x2237 ;коррекция координаты Y, при движении курсора + ret z ;курсор на байте дампа +; установка координаты Y в нижний край окна + ld a,(ix+#04) + dec a + ld (ix+#01),a + +;АДРЕС: #2237 коррекция координаты Y, при движении курсора +;вых: z - курсор на байте дампа +; nz - невозможно откорректировать координату +x2237 call x217A + jr nz,x2240 ;на выходе всегда z + call x21B5 ;коррекция координаты X, при движении курсора + ret z ;курсор на байте дампа +; невозможно откорректировать координату X +x2240 call x2012 ;уменьшаем координату Y + jr nz,x2237 ;координата уменьшена + jr x2208 ;установка nz + +;АДРЕС: #2247 инкремент координаты X в рамках окна +;вых: z - инкремента не было +x2247 ld a,(ix+#0B) ;ширина окна в символах + dec a + cp (ix+#01) + ret z + inc (ix+#01) + ret + +;АДРЕС: #2253 декремент координаты X в рамках окна +;вых: z - декремента не было +x2253 ld a,(ix+#01) + or a + ret z + dec (ix+#01) + jr x2208 + +;АДРЕС: #225D нажатие cs+5/ss+Q курсор влево +;вх: c - crd X курсора +x225D ld a,c + cp #21 + jr c,x226B +; в поле редактирования символов + jr nz,x220B ;не крайняя левая позиция + ld a,#28 +x2266 ld (ix+#01),a ;крайняя правая позиция + jr x2222 ;скроллинг на строку вверх +; в поле редактирования hex дампа или адреса +x226B cp #02 + ret z ;крайняя позиция в адресе + cp #08 + jr z,x2274 ;крайняя позиция в hex дампе + jr x220B ;декремент координаты X в рамках текущего поля со скроллингом +x2274 ld a,#1E ;новая координата X в hex дампе + jr x2266 + +;АДРЕС: #2278 редактирование дампа памяти в окне монитора +x2278 ld hl,x2168 + ld (xE9E1),hl ;адрес таблицы со списком процедур для п/п x2028 + ld hl,x213F + ld (xE9DF),hl + jr x2298 + +;АДРЕС: #2286 скроллинг дампа +;вх: e - количество строк для скролла дампа (e=#01/#08/#FF/#F8) +x2286 call x23A9 ;расчет приращения для скроллинга дампа + ld hl,(xDD87) ;адрес начала дампа памяти + add hl,bc ;новый адрес + ld (xDD87),hl + ld hl,(xDD69) ;адрес текущей ячейки в дампе памяти + add hl,de + ld (xDD69),hl + pop hl + +;обновление окна дампа +x2298 call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) + db #02 ;обновление окна дампа памяти + call x21E5 ;коррекция координаты X, при движении курсора + +;основной цикл редактирования дампа памяти +x229F ld hl,x229F ;адрес возврата + push hl + call x23C0 ;определение поля в окне редактирования дампа + call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) + db #10 ;обновление окна с дизасмом памяти начиная с текущей ячейки + res 0,(ix+#07) ;выводить символ курсора +;ожидание нажатия клавиши + rst #30 + dw rom2_x28E8 ;печать/удаление курсора в окне + db #02 + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 ;a - код нажатой клавиши + rst #30 + dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) + db #02 +;реакция на нажатую клавишу + set 0,(ix+#07) ;не выводить символ курсора + ld d,a ;d - код нажатой клавиши + call x23C0 ;определение поля в окне редактирования дампа + jr c,x22E9 ;курсор в поле редактирования адреса дампа + jr nz,x230D ;курсор в поле редактирования символов дампа +; изменение hex значения под курсором в дампе + call x2400 ;чтение байта из памяти пользователя в bc + call x2412 ;редактирование байта в bc + jr nz,x2328 ;байт не изменился. проверка нажатия управляющей клавиши + ld (xDDA7),bc ;новое значение байта + call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) + db #0C ;запись байта в память пользователя + call x2393 ;печать одной(текущей) строки дампа +; проверка координаты X +x22D9 ld de,#1E08 ;граничные координаты +x22DC ld a,(ix+#01) ;crd X + cp d + jp c,x21C7 ;инкремент координаты X, и изменение адреса текущей ячейки дампа + ld (ix+#01),e + jp x21DB ;перемещение курсора на один байт вниз +; изменение адреса дампа памяти +x22E9 ld bc,(xDD87) ;адрес начала дампа памяти + ld (xDDA7),a ;номер байта в строке дампа + call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) + db #0E ;редактирование слова в bc + jr nz,x2328 ;слово не изменилось. проверка нажатия управляющей клавиши + ld (xDD69),bc ;новый адрес текущей ячейки в дампе памяти + ld (xDD87),bc ;адрес начала дампа памяти + ld a,(ix+#01) + push af + call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) + db #02 ;обновление окна дампа памяти + pop af + ld (ix+#01),a + jp x21C7 ;инкремент координаты X, и изменение адреса текущей ячейки дампа +; изменение символа в символьном поле дампа +x230D call x2400 ;чтение байта из памяти пользователя в bc + ld a,d + cp #20 + jr c,x2328 ;это не символ, проверка нажатия управляющей клавиши + cp #7F + jr nc,x2328 ;это не символ, проверка нажатия управляющей клавиши + ld (xDDA7),a + call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) + db #0C ;запись байта в память пользователя + call x2393 ;печать одной(текущей) строки дампа +x2323 ld de,#2821 ;граничные координаты поля редактирования сомволов дампа + jr x22DC ;проверка координат +;проверка и обработка нажатия управляющей клавиши +;вх: d - код нажатой клавиши +x2328 ld a,d + ld c,(ix+#01) ;crd X + call x1033 ;вызов п/п обработки нажатой клавиши + db #85 ;cs+5 + dw x225D ;курсор влево + db #1C ;ss+Q + dw x225D ;курсор влево + db #83 ;cs+8 + dw x235D ;курсор вправо + db #1E ;ss+E + dw x235D ;курсор вправо + db #84 ;cs+7 + dw x221E ;курсор вверх + db #1D ;ss+W + dw x221E ;курсор вверх + db #86 ;cs+6 + dw x21D7 ;курсор вниз + db #8B ;ss+S + dw x21D7 ;курсор вниз + db #89 ;cs+9 + dw x237A ;смена поля редактирования hex <-> символы + db #01 ;cs+1+A + dw x2352 ;установка курсора на редактирование адреса дампа + db #03 ;break/cancel + dw x235B ;выход + db #FF + ret + +;АДРЕС: #2352 установка курсора на редактирование адреса дампа +x2352 ld (ix+#00),#00 ;crd Y =#00 + ld (ix+#01),#02 ;crd X =#02 + ret + +;АДРЕС: #235B выход из режима редактирования дампа +x235B pop hl + ret + +;АДРЕС: #235D нажатие cs+8/ss+E курсор вправо +x235D ld a,c ;crd X + cp #20 + jr nc,x2323 ;в поле редактирования символов + jp x22D9 ;поле редактирования адреса или hex дампа + +;АДРЕС: #2365 обновление окна дампа памяти +x2365 rst #30 + dw rom2_x2E3D ;печать дампа памяти в окне + db #02 + rst #30 + dw rom2_x2E76 ;удаление курсора на предыдущей ячейке дампа + db #02 + ld a,(ix+#01) ;координата X курсора в окне + sub #03 + ld (ix+#01),a + bit 7,(iy+#0E) + ret z ;редактируем hex дамп + +;АДРЕС: #237A смена поля редактирования hex <-> символы +x237A call x23C0 ;определение поля в окне редактирования дампа + ret c ;редактируем адрес дампа + ld hl,xE022 + jr nz,x238B +; установка координат для редактирования символьного представления дампа + set 7,(hl) + add a,#21 +x2387 ld (ix+#01),a + ret +; установка координат для редактирования hex дампа +x238B res 7,(hl) + add a,a + add a,c + add a,#08 + jr x2387 + +;АДРЕС: #2393 печать одной(текущей) строки дампа +x2393 ld c,#00 + call x23F3 ;hl - адрес текущей ячейки в дампе памяти + ld a,(ix+#01) ;crd X + push af + ld (ix+#01),#00 ;crd X =#00 + call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) + db #00 ;печать одной строки дампа памяти (8 байт) + pop af + ld (ix+#01),a ;восстановим координату X + ret + +;АДРЕС: #23A9 расчет приращения для скроллинга дампа +;вх: e - количество строк для скролла дампа (e=#01/#08/#FF/#F8) +;вых: bc - приращение для скроллинга дампа +; d =#00/#FF - скроллим вперед/назад +; cy =1 скроллим назад +x23A9 xor a + ld b,(ix+#04) ;высота окна в знакоместах +x23AD add a,#08 + djnz x23AD + ld c,a ;bc - приращение для скроллинга дампа + ld d,#00 + ld a,e + or a + ret p ;e<#80 + dec d ;d=#FF + ld hl,#0000 + sbc hl,bc + ld c,l + ld b,h + ret + +;АДРЕС: #23C0 определение поля в окне редактирования дампа +;вых: cy =1 курсор в поле редактирования адреса дампа +; cy =0, z - курсор в поле редактирования hex дампа +; cy =0, nz - курсор в поле редактирования симвлов дампа +; c,a - номер байта в строке дампа +; hl - адрес текущей ячейки в дампе памяти +x23C0 ld a,(ix+#01) ;crd X + cp #06 + jr nc,x23CB ;это не адресное поле +; это адресное поле + sub #02 + scf + ret +x23CB cp #20 + jr nc,x23E5 +; это hex дамп + sub #08 ;(CrdX-8)/3 + push de + ld c,a + xor a + ld de,#0003 + rst #30 + dw rom2_x16AA ;деление bc=ac/de + db #02 ;l остаток от деления + pop de ;с - номер ячейки в строке дампа памяти + ld a,#01 + sub l ;a - смещение от начала строки до редактируемого разряда + call x23E8 + xor a + ld a,c + ret +;это символьное представление дампа +;вх: a - координата курсора +;вых: nz +x23E5 sub #21 + ld c,a +;установка адреса текущей редактируемой ячейки памяти +;вх: с - номер ячейки в строке дампа памяти +; a - смещение от начала строки до редактируемого разряда +x23E8 ld e,a + call x23F3 + ld (xDD69),hl ;адрес текущей редактируемой ячейки памяти + xor a + inc a + ld a,e + ret + +;АДРЕС: #23F3 расчет адреса текущей редактируемой ячейки памяти +;вх: с - номер ячейки в строке дампа памяти +;вых: hl - адрес текущей ячейки в дампе памяти +x23F3 ld a,(ix+#00) ;координата Y курсора в окне + rlca + rlca + rlca + add a,c + ld hl,(xDD87) ;адрес начала дампа памяти + jp x2023 ;сложение hl=hl+a + +;АДРЕС: #2400 чтение байта из памяти пользователя в bc +;вх: hl - адрес памяти пользователя +;вых: bc,a - прочитанный байт +x2400 ld a,#0A ;номер процедуры *2 (чтение байта из памяти пользователя) + call x202C ;вызов процедуры по таблице, адрес которой в (xE9E1) + ld c,a + ld b,#00 + ret + +;АДРЕС: #2409 редактирование числа в bc +;вх: bc - слово для редактирования +; a - смещение от начала строки до редактируемого разряда +; d - код нажатой клавиши +;вых: bc - отредактированный байт/слово +; nz - число не изменилось +x2409 sub #03 + neg + ld e,a + ld a,#04 ;кол-во разрядов в числе + jr x2414 + +;АДРЕС: #2412 редактирование байта в bc +;вх: bc - байт для редактирования +; e - смещение от конца строки до редактируемого разряда +; d - код нажатой клавиши +;вых: bc - отредактированный байт/слово +; nz - число не изменилось +x2412 ld a,#02 ;кол-во разрядов в числе +x2414 push hl + push de + ld hl,xE1A6 ;буфер для вывода строки + push de + ld de,#2310 ;шестнадцатиразрядное + call x0CDA ;печать числа bc в буфер hl + ld hl,(xE3BC) + ld (hl),#FF + dec hl ;адрес последнего символа + pop de + ld a,d + ld d,#00 + or a + sbc hl,de ;адрес разряда числа + ld (hl),a ;новое значение разряда + ld hl,xE1A6 + rst #30 + dw rom2_x0DF4 ;преобразование строки в число + db #02 + ld c,e ;результат преобразования + ld b,d + jr nz,x243A ;это не число + inc (hl) ;маркер конца строки +x243A pop de + pop hl + ret + +;АДРЕС: #243D чтение байта из памяти пользователя +;вх: hl - адрес в памяти +;вых: a - прочитанный байт +x243D rst #30 + dw rom2_x0028 ;чтение байта из памяти пользователя + db #02 + ret + +;АДРЕС: #2442 запись байта в память пользователя +;вх: hl - адрес в памяти +; a - байт для записи +x2442 rst #30 + dw rom2_x0000 ;запись байта в память пользователя (rst #00) + db #02 + ret + +;АДРЕС: #2447 печать одной строки дампа памяти (8 байт) +;вх: hl - адрес памяти (начало дампа) +;вых: hl - следующий адрес памяти (начало дампа) +x2447 rst #30 + dw rom2_x2EBA ;печать одной строки дампа памяти (8 байт) + db #02 + ret + +;АДРЕС: #244C обновление окна с дизасмом памяти начиная с текущей ячейки +x244C bit 5,(iy+#0A) + ret nz ;не обновлять дизассемблер памяти по содержимому ячейки памяти + ld de,(xDD69) ;адрес текущей ячейки в дампе памяти + rst #30 + dw rom2_x2F74 ;вывод дисасма памяти по адресу в de + db #02 + rst #30 + dw rom2_x3019 ;ix = адрес дескриптора окна монитора: дамп памяти + db #02 + ret + +;АДРЕС: #245E переименование подраздела +x245E ld a,#32 ;сообщение заголовка: rename partition ... + call x29D7 ;печать окна с подразделами и выбор подраздела в нем + ;hl - номер позиции в каталоге +x2463 ret c ;отмена выбора + call x29C6 ;расчет адреса в каталоге + ld a,#FF + cp (hl) + jr nz,x2471 ;подраздел существует +x246C call x29F4 ;выбран некорректный раздел. продолжаем выбор + jr x2463 +x2471 ld a,(hl) + ld (xDFFE),a ;тип подраздела + call x2D2F ;ввод имени подраздела + jr c,x246C ;отмена ввода. продолжим выбор + jp x2D50 ;сортировка каталога и выход в меню + +;Не используется АДРЕС: #247D ret +x247D ret + +;АДРЕС: #247E печать нового пути после выбора пунктов меню mount/dismount DRIVE +;вх: a - номер дисковода +x247E and #03 +;печеть сообщения + push af + bit 7,(iy+#0B) + jr nz,x248D ;меню dismount + ld bc,#2B02 ;сообщение: mount on + rst #08 + jr x2491 +x248D ld bc,#2F02 ;сообщение: dismount + rst #08 +x2491 pop af + call x249C ;печать буквы дисковода или пути, если это образ + ld a,#26 + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 + ret + +;АДРЕС: #249C печать буквы дисковода или пути, если это образ +;вх: a - номер дисковода +x249C push af +;печать буквы дисковода + add a,"A" + rst #10 + pop af + rst #30 + dw rom7_x1B04 ;расчет адреса блока описателя заданного дисковода + db #07 + ld c,a ;код подраздела (для образа =#01) +;печать двоеточия + push af + ld a,":" + rst #10 + pop af + jr z,x24CD ;это реальная дискета +;это образ. печать пути + ld de,#0009 + add hl,de + ld de,xE7C7 ;строка пути к образу диска + push de + call x24DE ;копирование имени из (hl) в (de) + ld a,c + cp #01 + jr nz,x24C4 ;это не образ tr-dos + ld a,#5C ;"\" + ld (de),a + inc de + call x24DE +x24C4 ex de,hl + dec hl + set 7,(hl) + pop hl + rst #30 + dw rom2_x15DB ;печать сообщения из hl + db #02 +x24CD ret + +;АДРЕС: #24CE обработка пункта меню: Z. dismount.../Z. mount... +x24CE bit 7,(iy+#0B) + jr nz,x24D9 ;меню dismount + ld bc,#2D02 ;сообщение: dismount ... + rst #08 + ret +x24D9 ld bc,#3002 ;сообщение: mount ... ___ + rst #08 + ret + +;копирование имени из (hl) в (de) +;вх: b - смещение в имени подраздела +; hl - начало имени подраздела в блоке описателя дисковода +x24DE ld a,l + add a,b + ld l,a + jr nc,x24E4 + inc h +x24E4 ld b,#06 +x24E6 ld a,(hl) + cp #21 + ret c ;непечатный символ. выход + ld (de),a + inc hl + inc de + djnz x24E6 + ret + +;АДРЕС: #24F0 монтирование образа к дисководу +;вх: a - номер дисковода +x24F0 call x2536 ;монтирование/отключение подраздела/образа диска + ret c ;отмена выбора + ld c,#11 ;чтение кода спецификации дисковода + rst #30 + dw rom7_x0229 ;вызов функции R8DOS + db #07 ;hl - адрес кода, определяющего тип текущего дисковода + bit 4,(hl) + jr nz,x2503 + ld hl,xFFDC + res 6,(hl) + +;АДРЕС: #2503 монтирование всех образов с винчестера +x2503 ld a,(xFFCA) + and #03 + ld e,a ;номер текущего дисковода + ld d,#03 +; для всех кроме текущего дисковода +x250B push de + ld a,d + cp e + call nz,x251A + pop de + ld a,d + or a + jr z,x2519 + dec d + jr x250B +x2519 ld a,e +; в конце и для текущего +;монтирование образа с обработкой неудачной попытки +x251A push af + or #80 + rst #30 + dw rom7_x18C0 ;R8DOS #28(40) автоподключение, т. е. подключить то, что задано в секторе автонастроек + db #07 + pop bc + ret nc ;прошло без ошибок +; были ошибки при монтировании образа + push af + ld a,b ;номер дисковода + push bc + or #40 + rst #30 + dw rom7_x18C0 ;R8DOS #28(40) отключить подраздел от драйвера + db #07 + pop bc + pop af + cp #67 + ret z ;нет примонтированнго подраздела/образа + ld a,b + set 7,(iy+#0B) + +;АДРЕС: #2536 монтирование/отключение подраздела/образа диска +;вх: a - номер дисковода +; 7,(iy+#0B) =0/1 mount/dismount +; +x2536 rst #30 + dw rom7_x1AB1 ;определение адреса начала записи для заданного дисковода в буфере xE5A9 + db #07 + push hl ;адрес начала записи для заданного дисковода в буфере xE5A9 + ld b,#00 + bit 7,(iy+#0B) ;=0/1 mount/dismount + call z,x259D ;если да, печать списка разделов и выбор подраздела/образа + pop bc + ret c ;отмена выбора +; подраздел/образ выбран + push hl ;hl - адрес записи в каталоге + push bc + rst #30 + dw rom7_x1E3D ;чтение сектора 3(сектор с настройками) в буфер xE5A9 и проверка контрольной суммы + db #07 + jr nc,x2552 ;успешно + cp #63 ;ошибка контрольной суммы. настройки обнулены + jr nz,x2599 ;ошибки чтения +x2552 pop hl ;hl адрес строки с примонтированным образом в буфере (для заданного дисковода) + bit 7,(iy+#0B) ;=0/1 mount/dismount + res 7,(iy+#0B) + ld (hl),#00 + pop de ;de - адрес записи в каталоге + jr nz,x2592 ;dismount +;формирование записи о примонтированном подразделе/образе + ld a,(de) + push de + ld (hl),a ;+#00 тип раздела/образа + inc hl + ex de,hl + ld bc,#0001 + add hl,bc + ld bc,#0004 + ldir ;+#01 смещение первого сектора от начала винчестера (LBA адрес) + ld (de),a ;+#05 тип раздела/образа + and #DF ;сброс бита защиты от записи + inc de + pop hl ;hl - адрес записи в каталоге + push hl + ld bc,#0006 + add hl,bc + ld bc,#0004 + ldir ;+#06 размер подраздела/образа + cp #01 + jr z,x2588 ;это образ диска + pop hl ;hl - адрес записи в каталоге + push hl + call x25E1 ;+#0A имя подраздела + jr x258E +; это образ диска +x2588 ld hl,xE81B+#0A + call x25E5 ;+#0A имя подраздела, которому принадлежит образ +x258E pop hl ;hl - адрес записи в каталоге + call x25E1 ;+#0A имя подраздела/образа +x2592 rst #30 + dw rom7_x1D2A ;подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер + db #07 + ret nc ;ошибок нет + jr x25D1 ;ошибка записи +;ошибка чтения/записи винчестера +x2599 pop bc + pop hl + jr x25D1 + +;печать списка разделов и выбор подраздела/образа +;вых: cy =1 отмена выбора +; =0 образ/раздел выбран +; hl - адрес записи в каталоге +; (xE81B) заголовок выбранного подраздела/образа +x259D call x2620 ;формирование в буфере xEBF5 списка подразделов MFS + ld bc,(xDD89) ;количество подразделов + ld a,c + or b + jp z,x0EB5 ;подразделов нет. печать текущего меню монитора + ld a,#1E + call x29D7 ;печать окна с подразделами и выбор подраздела в нем +x25AE ret c ;отмена выбора + call x29C6 ;расчет адреса в каталоге + ld a,(hl) + and #DF + cp #01 + jr z,x25C4 ;подраздел TR-DOS + cp #02 + ret z ;MicroDOS + cp #03 + ret z ;IS-DOS + call x29F4 ;выбран некорректный раздел. продолжаем выбор + jr x25AE +;выбран подраздел TR-DOS +x25C4 ld de,xE81B ;копируем запись подраздела + ld bc,#0010 + ldir + call x25EB ;формирование в буфере xEBF5 списка образов коллекции + jr nc,x25D6 ;сформировано без ошибок +; ошибки винчестера +x25D1 rst #30 + dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора + db #07 + ret +x25D6 ld a,#1F ;сообщение: select disk + call x29D0 ;печать окна с образами дисков и выбор образа в нем + ret c ;отмена выбора + call x29C6 ;расчет адреса в каталоге + or a + ret +;копирование 6 байт из (hl+#0A) в (de) +x25E1 ld bc,#000A + add hl,bc +;копирование 6 байт из (hl) в (de) +x25E5 ld bc,#0006 + ldir + ret + +;АДРЕС: #25EB формирование в буфере xEBF5 списка образов коллекции +; (xE81B) заголовок выбранного подраздела +x25EB call x2707 ;dehl - смещение(LBA адрес) первого сектора подраздела + rst #30 + dw rom7_x17BB ;чтение в буфер xEBF5 каталог выбранного подраздела + db #07 + ret c ;ошибка +;проверка наличия сигнатуры + ld hl,(xEBF5+#3FC) ;сигнатура подраздела + ld de,#5254 + sbc hl,de + jr z,x2601 ;сигнатура совпадает + ld a,#63 + scf + ret +x2601 push ix + call x2671 ;сортировка записей в буфере по порядку местоположения + ;ix=xEBF5 + call x2707 ;dehl - смещение первого сектора выбранного подраздела + call x2683 ;проверка разрывов между образами и создание пустых записей в буфере + call x2707 ;dehl - смещение первого сектора выбранного подраздела + ld bc,xE9E7 + call x301C ;загрузка числа из регистров в память + ;de=xE9E7 + ld bc,#0006 + jr x2661 ;формирование последней unused записи в буфере + +;АДРЕС: #261A удаление всех подразделов +x261A set 6,(iy+#1C) ;признак изменения каталога + jr x2647 + +;АДРЕС: #2620 формирование в буфере xEBF5 списка подразделов MFS +x2620 res 6,(iy+#1C) + rst #30 + dw rom7_x1768 ;поиск раздела MFS + db #07 + jr nc,x262F ;раздел найден +x262A rst #30 + dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора + db #07 + ret +x262F push hl ;dehl - смещение первого сектора раздела + push de ;bc - адрес дескриптора раздела MFS в буфере + ld l,c + ld h,b + ld de,xE81B + ld bc,#0010 + ldir + pop de + pop hl + rst #30 + dw rom7_x17BB ;чтение в буфер xEBF5 двух первых секторов раздела MFS + db #07 + jr nc,x264A ;нет ошибок + cp #63 ;раздел не инициализирован + jr nz,x262A ;ошибка чтения +x2647 call x2E71 ;очистка буфера xEBF5 и установка сигнатуры раздела MFS +x264A push ix + call x2671 ;сортировка подразделов в буфере xEBF5 по порядку местоположения + ;ix=xEBF5, bc - количество подразделов в буфере + call x270D ;загрузка числа в dehl из памяти xE81B+8 + call x2683 ;проверка разрывов между подразделами/образами и создание пустых записей в буфере + call x270D ;загрузка числа в dehl из памяти xE81B+8 + ld bc,xE9E7 + call x301C ;загрузка числа из регистров в память + ;de=xE9E7 + ld bc,#000C +; формирование последней unused записи в буфере +x2661 ld hl,xE81B + add hl,bc ;адрес количества секторов раздела MFS + ex de,hl + push hl + call x3052 ;(xE9E7) - адрес первого свободного сектора после раздела MFS + pop hl + call x26AC ;проверка конца раздела MFS на наличие пустого места + pop ix + ret + +;АДРЕС: #2671 сортировка записей в буфере xEBF5 по порядку местоположения +;вых: ix,xEBF5 +; bc - количество записей в буфере +x2671 call x271A ;подсчет количества записей + ld hl,x28B9 ;по порядку местоположения + call x2960 ;сортировка дескрипторов записей + ld ix,xEBF5 + ld bc,(xDD89) ;количество записей в буфере + ret + +;АДРЕС: #2683 проверка разрывов между подразделами/образами и создание пустых записей в буфере +;вх: ix=xEBF5 - адрес буфера с каталогом подразделов/образов +; bc - количество подразделов/образов +; dehl - смещение первого сектора MFS раздела (LBA адрес) +x2683 ld (xE9EB),hl + ld (xE9EB+#02),de + push bc + ld hl,xE9EB + call x3047 ;инкремент числа по адресу hl + call x3047 ;инкремент числа по адресу hl + pop bc +x2695 ld a,c + or b + ret z ;нет записей + dec bc ;номер последней записи + push bc + push ix + pop hl ;адрес смещения первой записи в буфере + ld bc,#0001 + add hl,bc ;адрес с LBA адресом первой записи в буфере + call x26AC ;проверка разрыва между подразделами/образами и создание пустой записи в буфере + ld bc,#0010 + add ix,bc ;адрес следующей записи в буфере + pop bc + jr x2695 ;повторим + +;АДРЕС: #26AC проверка разрыва между подразделами/образами и создание пустой записи в буфере +;вх: ix=xEBF5 - адрес записи в буфере с каталогом подразделов/образов +; hl - адрес с LBA адресом подраздела/образа (LBA адрес) +; (xE9EB) - расчетный адрес начала этого подраздела/образа (LBA адрес) +;вых: (xE9EB) - расчетный адрес начала следующего подраздела/образа (LBA адрес) +; +x26AC push hl + ld de,xE9EB ;смещение первого сектора MFS раздела (LBA адрес) +2 + call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl + pop hl + jr z,x26F8 ;они равны +;есть пустое место. формируем запись unused в буфере + ld de,xE9E7 + call x3000 ;копирование из (hl) в (de) 4х байт + ex de,hl + ld de,xE9EB + push hl + call x3035 ;вычитание (hl)=(hl)-(de) + pop hl ;(xE9E7) размер пустого пространства + ld de,rom7_x0F59 ;=#00000200 + call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl + jp c,x26F8 ;менее 256Kb + call x2990 ;вставляем новую запись в список записей + push ix + pop hl +; устанавливаем смещение первого сектора новой записи + push hl + ld bc,#0001 + add hl,bc ;адрес смещения первого сектора новой записи + ld de,xE9EB + ex de,hl + call x3000 ;копирование из (hl) в (de) 4х байт + pop hl +; устанавливаем размер новой записи + ld bc,#0006 + add hl,bc ;адрес размера новой записи + ld de,xE9E7 + ex de,hl + call x3000 ;копирование из (hl) в (de) 4х байт + ld (ix+0),#FF ;помечаем как unused + call x26F8 ;расчет адреса начала следующего подраздела/образа (LBA адрес) + ld bc,#0010 + add ix,bc ;двигаем указатель на сдвинутую запись +;расчет адреса начала следующего подраздела/образа (LBA адрес) +x26F8 push ix + pop hl + ld bc,#0006 + add hl,bc ;адрес с размером подраздела/образа + ex de,hl + ld hl,xE9EB + call x3052 ;сложение двух 4х байтных чисел + ret + +;АДРЕС: #2707 загрузка числа в регистры из памяти xE81B+1 +x2707 push bc + ld bc,#0001 + jr x2711 + +;АДРЕС: #270D загрузка числа в регистры из памяти xE81B+8 +x270D push bc + ld bc,#0008 +x2711 ld hl,xE81B + add hl,bc + call x300E ;загрузка числа в регистры из памяти + pop bc + ret + +;АДРЕС: #271A подсчет количества подразделов в MFS +;вых: (xDD89),bc - количество подразделов в разделе MFS +x271A ld hl,xEBF5 + ld e,#10 + xor a + ld d,a + ld b,a + ld c,a +x2723 ld a,(hl) + cp b + jr z,x272E + inc c + add hl,de + ld a,c + cp #3F + jr c,x2723 +x272E ld (xDD89),bc + ret + +;АДРЕС: #2733 удаление всех разделов MBR +x2733 set 6,(iy+#1C) + jr x275F + +;АДРЕС: #2739 формирование в буфере xEBF5 списка разделов MBR +x2739 res 6,(iy+#1C) + set 7,(iy+#1C) + rst #30 + dw rom7_x1768 ;поиск раздела MFS + db #07 + jr nc,x2762 ;раздел найден + res 7,(iy+#1C) + cp #63 + jr z,x2754 ;раздел не найден + rst #30 ;ошибка чтения диска + dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора + db #07 + ret +;раздел MFS не найден. проверяем наличие MBR +x2754 ld hl,(xE5A9+#1FE) ;сигнатура сектора MBR + ld de,#AA55 + or a + sbc hl,de + jr z,x2762 ;сигнатура есть +x275F call x2E5D ;сформируем пустой сектор MBR в буфере xE5A9 +;ищем записи в MBR и копируем их в буфер xEBF5 +x2762 ld de,xEBF5 ;сюда сложим существующие записи в MBR + push ix + ld bc,#0400 + ld ix,xE5A9+#1BE ;начало записей в MBR +x276E push bc + xor a + or (ix+4) ;код типа раздела + ld a,c + ld bc,#0010 + jr z,x2781 ;пустая запись + inc a ;+1 найденная запись + push ix + pop hl + push bc + ldir ;копируем в буфер xEBF5 + pop bc +x2781 add ix,bc ;адрес следующей записи в MBR + pop bc + ld c,a ;количество найденных записей + djnz x276E + ld (xDD89),bc ;количество найденных записей + pop ix +;проверка разрывов между разделами и создание пустых записей в буфере +x278D ld hl,x2895 + call x2960 ;сортировка записей MBR по адресу расположения + push ix + ld ix,xEBF5 ;буфер с записями MBR + ld bc,(xDD89) ;количество записей + call x2FCF ;обнуление переменной xE9EB + ld a,(xDFF5) ;значение sector HDD + ld (xE9EB),a ;раздел может начинаться только с начала дорожки + ld a,c + or b + jr z,x27C2 ;нет записей в MBR +x27AA ld a,c + or b + jr z,x27C2 ;больше нет записей MBR для обработки + dec bc + push bc + push ix + pop hl ;адрес начала записи MBR в буфере xEBF5 + ld bc,#0008 + add hl,bc ;адрес смещения первого сектора записи MBR + call x27E1 ;проверка разрывов между разделами и создание + ;пустой записи в буфере + ld bc,#0010 + add ix,bc + pop bc + jr x27AA ;проврека следующей записи MBR +;буфер с записями построен +x27C2 ld hl,(xE5A5) + ld de,#0000 ;head * sector активного HDD + exx + ld bc,(xDFF2) ;значение Cylinders HDD + rst #30 + dw rom7_x0FB7 ;умножение dehl=de'hl' * bc + db #07 + ld bc,xE9E7 + call x301C ;загрузка числа из регистров в память + ex de,hl ;hl=xE9E7 (адрес последнего сектора в CHS) + call x302A ;декремент (hl)=(hl)-1 + call x27E1 + pop ix + ret + +;проверка разрывов между разделами и создание пустой записи в буфере +;вх: ix адрес начала записи MBR в буфере xEBF5 +; hl - адрес смещения первого сектора записи MBR +; (xE9EB) первый свободный сектор +;вых: (xE9EB) новый первый свободный сектор +; ix - адрес следующей записи +x27E1 push hl + ld de,xE9EB + call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl + pop hl + jr z,x282C ;нет пропущенных секторов +; вычисляем количество незанятых секторов + ld de,xE9E7 ;переменная + call x3000 ;копирование из (hl) в (de) 4х байт + ex de,hl + ld de,xE9EB + push hl + call x3035 ;вычитание (hl)=(hl)-(de) + pop hl ;(xE9E7) - количество незанятых секторов + ld de,rom7_x0F55 ;это адрес в rom 7 содержит dd #800 + call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl + jp c,x282C ;меньше мегабайта. неучитываем +; создаем новую запись с количеством незанятых секторов + call x2990 ;вставляем новую запись в список записей + push ix + pop hl + push hl ;адрес новой записи + ld bc,#0008 + add hl,bc ;адрес смещения первого сектора новой записи + ld de,xE9EB + ex de,hl + call x3000 ;копирование из (hl) в (de) 4х байт + pop hl ;адрес новой записи + ld bc,#000C + add hl,bc ;адрес количества секторов раздела + ld de,xE9E7 ;количество незанятых секторов + ex de,hl + call x3000 ;копирование из (hl) в (de) 4х байт + call x283B ;установка остальных параметров в новой записи + call x282C ;(xE9EB) новый первый свободный сектор + ld bc,#0010 + add ix,bc ;следующая запись +;расчет нового первого свободного сектора +x282C push ix + pop hl + ld bc,#000C + add hl,bc ;адрес количества секторов раздела + ex de,hl + ld hl,xE9EB + call x3052 ;сложение двух 4х байтных чисел + ret +;установка остальных параметров в новой записи +;вх: ix - адрес новой записи +x283B ld (ix+#00),#FF ;тип unused + ld (ix+#04),#53 ;код типа раздела (MFS) + push ix + pop hl + ld bc,#0008 + add hl,bc ;адрес смещения первого сектора новой записи + push hl + push ix + pop bc + inc bc ;адрес структуры описания раздела MBR +1 + call x2874 ;расчет и установка в структуре записи MBR параметров CHS + pop hl ;адрес смещения первого сектора новой записи +; расчет количества секторов новой записи + ld de,xE9E7 + call x3000 ;копирование из (hl) в (de) 4х байт + ex de,hl + push hl + inc de + inc de + inc de + inc de ;адрес количества секторов новой записи + call x3052 ;сложение двух 4х байтных чисел + pop hl + push hl + call x302A ;декремент (hl)=(hl)-1 +; установка конца раздела в CHS + push ix + pop hl + ld bc,#0005 + add hl,bc ;конец раздела - головка + ld c,l + ld b,h + pop hl + ld hl,xE9E7 +;расчет и установка в структуре записи MBR параметров CHS +;вх: bc - адрес структуры описания раздела MBR +1 +; hl - адрес смещения первого сектора новой записи +x2874 push bc + call x300E ;загрузка числа в регистры из памяти + ;dehl - смещение первого сектора новой записи + rst #30 + dw rom7_x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + db #07 + pop hl ;начало раздела - головка + ld a,(iy+#35) + and #0F + ld (hl),a ;головка + inc hl + ld a,(iy+#34) + and #03 + rlca + rlca ;цилиндр (биты 6, 7) + or (iy+#32) ;сектор (биты 0-5) + ld (hl),a + inc hl + ld a,(iy+#33) + ld (hl),a ;цилиндр (старшие биты 8, 9 хранятся в байте номера сектора) + ret + +;АДРЕС: #2895 сортировка двух дескрипторов bc и bc+1 по адресу расположения (для записей MBR) +;вх: bc - номер подраздела +x2895 call x2FEF ;умножение bc=bc*#10 + ld hl,xEBF5+#08 ;буфер с секторами раздела +8 + add hl,bc + ex de,hl + ld hl,xEBF5+#18 ;#EC0D + +;сортировка двух дескрипторов по возрастанию заданного поля +;вх: hl - адрес ячейки второго подраздела с полем для сортировки +; bc - смещение до дескриптора подраздела в буфере +; de - адрес ячейки подраздела с полем для сортировки +;вых: cy=0 обмена не было +; cy=1 дескрипторы поменяны местами +x28A0 add hl,bc ;адрес ячейки со смещением до начала последнего подраздела + call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl + ret nc ;расположены по возрастанию + ld hl,xEBF5 ;обмен местами дескриторов + add hl,bc + ex de,hl + ld hl,xEBF5+#10 + add hl,bc + ld b,#10 +x28B0 ld a,(de) + ld c,(hl) + ld (hl),a + ld a,c + ld (de),a + djnz x28B0 + scf + ret + +;АДРЕС: #28B9 сортировка двух дескрипторов bc и bc+1 по порядку местоположения +;вх: bc - номер подраздела +x28B9 call x2FEF ;умножение bc=bc*#10 + ld hl,xEBF5+#01 ;буфер с секторами раздела +1 + add hl,bc ;адрес ячейки со смещением до начала подраздела + ex de,hl ; + ld hl,xEBF5+#11 ;адрес ячейки со смещением до начала второго подраздела + jr x28A0 ;сортировка по возрастанию местоположения двух дескрипторов + +;АДРЕС: #28C6 уплотнение каталога MBR (удаление в буфере записей unused) +;вх: hl=x2D5D п/п сравнения (hl) с #FF, cy=1 если равны +; +x28C6 ld (xE51C+1),hl + ld bc,(xDD89) ;количество записей в буфере каталога + call x2FEF ;умножение bc=bc*#10 + ld hl,xEBF5 ;буфер + push hl + push hl + add hl,bc ;конец каталога + ld (xE9E7),hl ;адрес конца каталога + pop hl + ld bc,#0000 +x28DD ex de,hl + ld hl,(xDD89) ;количество записей в буфере каталога + scf ;тут счетчик записей в каталоге + sbc hl,bc ; + inc bc ; + ex de,hl ;hl адрес обрабатываемой записи в каталоге + jr c,x2914 ;нет больше записей + call xE51C ;сравним с #FF + jr nc,x290E ;не равны, следующая запись + push hl ;адрес текущей записи + ex de,hl + ld hl,(xE9E7) + or a + sbc hl,de ;размер необработанного каталога + jr z,x290D ;просмотрели весь каталог + push bc + push hl + ld bc,#0010 ;убираем из каталога запись unused + or a ;и уплотняем каталог + sbc hl,bc + add hl,de + ld (xE9E7),hl ;новый адрес конца каталога, после уплотнения + ld l,e + ld h,d + add hl,bc ;адрес следующей записи + pop bc + ldir ;уплотняем + pop bc + pop hl + jr x28DD ;следущая запись +;конец каталога +x290D pop hl ;адрес конца каталога +;следущая запись +x290E ld de,#0010 + add hl,de + jr x28DD +;завершили уплотнение +;hl адрес конца каталога +x2914 pop de ;de адрес первой записи в каталоге + xor a + sbc hl,de + push hl + ld b,#04 +x291B srl h + rr l + djnz x291B ;hl=hl/#10 + ld (xDD89),hl ;количество записей + pop hl + add hl,de + ld (hl),a + ret + +;АДРЕС: #2928 подсчет количества разделов/подразделов в каталоге +;вых: de - фактическое количество разделов/подразделов в каталоге +x2928 ld hl,x2D5D ;п/п сравнения (hl) с #FF, cy=1 если равны + call x2939 ;de - количество пустых записей в каталоге разделов/подразделов + ld hl,(xDD89) ;количество разделов/подразделов в каталоге + or a + sbc hl,de + ex de,hl + ret + +;АДРЕС: #2936 подсчет пустых записей в каталоге разделов/подразделов +;вых: de - количество пустых записей в каталоге разделов/подразделов +x2936 ld hl,x2D5D ;п/п сравнения (hl) с #FF, cy=1 если равны +x2939 ld (xE51C+#01),hl + ld hl,xEBF5 ;каталог разделов/подразделов + ld de,(xDD89) ;количество разделов/подразделов + ld a,e + or d + ret z ;a=#00 нет разделов/подразделов + push bc + ld c,e + ld b,d ;bc количество разделов/подразделов в каталоге + ld de,#0000 ;количество пустых записей в каталоге +x294C dec bc + call xE51C + jr c,x2953 ;запись о разделе/подразделе не пустая + inc de +x2953 ld a,c + or b + jr z,x295E + ld a,#10 ;следующая запись + call x2023 ;сложение hl=hl+a + jr x294C +x295E pop bc + ret + +;АДРЕС: #2960 сортировка дескрипторов подразделов +;вх: hl=x28B9 - по порядку местоположения на винчестере +; hl=x2895 - по адресу расположения (для записей MBR) +x2960 ld (xE51C+1),hl + ld bc,(xDD89) ;количество подразделов + ld a,c + or b + ret z ;подразделы отсутствуют + ld hl,#0001 + sbc hl,bc + ret z ;подраздел только 1 +x2970 xor a + ld r,a + ld bc,(xDD89) ;количество подразделов + dec bc +x2978 push bc + dec bc + call xE51C ;п/п сортировки + jr nc,x2983 ;обмена не было + ld a,#FF + ld r,a ;7,r =1 был зотя бы один обмен +x2983 pop bc + dec bc + ld a,c + or b + jr nz,x2978 ;следующая пара дескрипторов + ld a,r + bit 7,a + jr nz,x2970 ;будем повторять, пока сортировка не закончится + ret + +;АДРЕС: #2990 вставляем новую запись в список записей +;вх: ix адрес начала записи в буфере =xEBF5, с которой надо раздвинуть список +; (xDD89) - количестов записей +x2990 ld bc,(xDD89) ;количество записей (оно же номер первой свободной) + call x2FEF ;умножение bc=bc*#10 + call x2FDB ;инкремент слова (xDD89)=(xDD89)+1 + ld hl,xEBF5 ;буфер с записями + add hl,bc ;адрес новой записи в конце списка + push ix + pop de ;адрес текущей записи + or a + sbc hl,de + ret c ;ошибка + push hl ;на сколько байт сдвинуть + push ix + pop hl ;адрес текущей записи + ld bc,#0010 + ld e,l + ld d,h ;адрес текущей записи + add hl,bc ;куда сдвигаем + ex de,hl + pop bc ;на сколько байт сдвинуть + ld a,c + or b + ret z + push hl + sbc hl,de ;направление переноса + pop hl + jr c,x29BD + ldir + ret +x29BD dec bc + add hl,bc + ex de,hl + add hl,bc + ex de,hl + inc bc + lddr + ret + +;АДРЕС: #29C6 расчет адреса в каталоге +;вх: hl - номер записи в каталоге +;вых: hl - адрес записи в каталоге +x29C6 ld c,l + ld b,h + call x2FEF ;умножение bc=bc*#10 + ld hl,xEBF5 + add hl,bc + ret + +;АДРЕС: #29D0 печать окна с образами дисков и выбор образа в нем +;вых: cy=0 выбор произведен успешно +; hl - номер позиции в каталоге +; cy=1 ошибка выбора +x29D0 ld hl,x2A0A + jr x29E1 + +;АДРЕС: #29D5 печать окна local partition information и выбор записи в нем +;вых: cy=0 выбор произведен успешно +; hl - номер позиции в каталоге +; cy=1 ошибка выбора +x29D5 ld a,#16 ;сообщение заголовка: partition information + +;АДРЕС: #29D7 печать окна с подразделами и выбор подраздела в нем +;вых: cy=0 выбор произведен успешно +; hl - номер позиции в каталоге +; cy=1 ошибка выбора +x29D7 ld hl,x2A04 ;таблица со списком процедур для печати окна выбора раздела + jr x29E1 + +;АДРЕС: #29DC печать окна global partition information и выбор записи в нем +;вых: cy=0 выбор произведен успешно +; hl - номер позиции в каталоге +; cy=1 ошибка выбора +x29DC ld a,#16 ;сообщение заголовка: partition information +x29DE ld hl,x29FE ;таблица со списком процедур для печати окна partition information +x29E1 ld (iy-#08),a ;номер сообщения текущей опции + call x2BB8 ;подготовка к печати окна выбора раздела + ld (xE9E1),hl ;адрес списка процедур + call x2FE5 ;декремент слова (xDD89)=(xDD89)-1 + call x1EF1 ;печать каталога и выбор позиции в нем + call x2FDB ;инкремент слова (xDD89)=(xDD89)+1 + ret + +;АДРЕС: #29F4 выбран некорректный раздел. продолжаем выбор +x29F4 call x2FE5 ;декремент слова (xDD89)=(xDD89)-1 + call x1F04 ;продолжаем выбор + call x2FDB ;инкремнт слова (xDD89)=(xDD89)+1 + ret + +;таблица со списком процедур для печати окна global partition information +x29FE dw x2A77 ;печать одного имени из каталога разделов MBR + dw x2A19 ;получение номера последней записи в каталоге подразделов + dw x2A10 ;заголовок: partition information + +;таблица со списком процедур для печати окна выбора раздела +x2A04 dw x2A33 ;печать одного имени из каталога подразделов + dw x2A19 ;получение номера последней записи в каталоге подразделов + dw x2A10 ;заголовок: _select local partition_ + +;#2A0A таблица со списком процедур для печати окна выбора образа диска +x2A0A dw x2A1D ;печать одного имени из каталога образов дисков + dw x2A19 ;получение номера последней записи в каталоге подразделов + dw x2A10 ;заголовок: select disk + +;заголовок: _select local partition _ +x2A10 rst #20 + dc " " + ld b,(iy-#08) ;номер сообщения в блоке + ld c,#02 ;номер блока сообщений + rst #08 ;select local partition + ret +;получение номера последней записи в каталоге разделов/подразделов/образов +x2A19 ld hl,(xDD89) + ret + +;печать одного имени из каталога образов дисков +x2A1D call x2B05 ;проверка первого байта записи каталога на #FF + jr nz,x2A27 ;печать имени + call x2B12 ;печать сообщения: Unused + jr x2A6C ;печать размера +x2A27 rst #20 + dc "Disk Name" + jr x2A59 ;продолжение печати имени диска + +;печать одного имени из каталога подразделов +x2A33 call x2B05 ;проверка первого байта записи каталога подраздела на #FF + jr nz,x2A3D ;<>#FF +x2A38 call x2B12 ;печать сообщения: Unused + jr x2A6C +x2A3D bit 7,(hl) + ld a," " + jr z,x2A45 + ld a,"*" +x2A45 rst #10 ;печать символа из A + + push hl ;печать типа подраздела + ld a,(hl) + and #07 + ld hl,x2B71 ;список сообщений + call x2B8C ;поиск и печать сообщения из HL по типу в A + jr nc,x2A6B ;тип раздела не опознан + ld a,#0A + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 + pop hl +x2A59 ld a,":" ;разделитель + rst #10 + + push hl ;печать имени подраздела + ld bc,#000A + add hl,bc + xor a + cp (hl) + jr z,x2A6B ;нет имени + ld b,#06 + rst #30 ;печать имени подраздела + dw rom2_x15B3 ;печать сообщения из hl длиной b + db #02 +x2A6B pop hl +x2A6C ld a,#13 + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 + call x3005 ;dehl = размер подраздела + jr x2A97 ;печать размера подраздела + +;печать одного имени из каталога разделов MBR +x2A77 call x2B03 ;проверка первого байта записи каталога подраздела на #FF + jr nz,x2A81 ;есть запись + call x2B12 ;печать сообщения: Unused + jr x2A8E ; +; печать типа раздела MBR +x2A81 push hl ;номер записи + ld bc,#0004 + add hl,bc + ld a,(hl) ;код типа раздела + ld hl,x2B1A ;таблица с сообщениями типов разделов + call x2B8C ;поиск и печать сообщения из HL по типу в A + pop hl +; печать размера раздела +x2A8E ld a,#13 + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 + call x300A ;dehl - чоличество секторов раздела MBR + +;печать размера в мегабайтах +;dehl - размер подраздела +x2A97 ld a,e + or d + jr nz,x2AA4 ;мегабайты + ld bc,#0800 + push hl + sbc hl,bc + pop hl + jr c,x2AB2 ;килобайты + +;АДРЕС: #2AA4 преобразование количества секторов в мегабайты +x2AA4 call x2AC0 ;преобразование количества секторов в мегабайты + ld a,#04 + rst #30 + dw rom2_x1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом + db #02 + rst #20 + dc " MB" + ret +x2AB2 call x2ACC ;преобразование количества секторов в килобайты + ld a,#04 + rst #30 + dw rom2_x1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом + db #02 + rst #20 + dc " KB" + ret + +;АДРЕС: #2AC0 преобразование количества секторов в мегабайты +;вх: dehl - размер в секторах +;вых: bc - размер в мегабайтах +x2AC0 exx + ld bc,#800 + rst #30 + dw rom7_x0F5D ;деление de'hl'=de'hl'/bc + db #07 + exx +x2AC9 ld c,l + ld b,h + ret + +;АДРЕС: #2ACC преобразование количества секторов в килобайты +;вх: dehl - размер в секторах +;вых: bc - размер в килобайтах +x2ACC exx + ld bc,#0002 + rst #30 + dw rom7_x0F5D ;деление de'hl'=de'hl'/bc + db #07 + exx + ld a,e + or d + jr nz,x2AE2 ;более 16 bit + push hl + ld bc,#8000 + sbc hl,bc + pop hl + jr c,x2AC9 ;менее #8000 +x2AE2 ld hl,#7FFF ;результат более #7FFF + jr x2AC9 + +;АДРЕС: #2AE7 умножение dehl=de*#800 +;вх: de - число +;вых: dehl - результат +x2AE7 ld l,e + ld h,d + ld de,#0000 + exx + ld bc,#0800 + rst #30 + dw rom7_x0FB7 ;умножение dehl=de'hl' * bc + db #07 + ret + +;АДРЕС: #2AF5 умножение dehl=de*2 +;вх: de - число +;вых: dehl - значение +x2AF5 ld l,e + ld h,d + ld de,#0000 + exx +x2AFB ld bc,#0002 + rst #30 + dw rom7_x0FB7 ;умножение dehl=de'hl' * bc + db #07 + ret + +;АДРЕС: #2B03 проверка первого байта записи каталога подраздела на #FF +;вх: hl - номер записи в каталоге +;вых: z - первый байт =#FF +x2B03 rst #20 + dc " " + +;АДРЕС: #2B05 проверка первого байта записи каталога подраздела на #FF +;вх: hl - номер записи в каталоге +;вых: z - первый байт =#FF +x2B05 push hl + pop bc +x2B07 call x2FEF ;умножение bc=bc*#10 + ld hl,xEBF5 + add hl,bc + ld a,(hl) + cp #FF + ret + +;АДРЕС: #2B12 печать сообщения: Unused +x2B12 rst #20 + dc "Unused" + ret + +;таблица с названиями разделов MBR +x2B1A db #00 + dc "Unknown DOS" + db #01 + dc "MS-DOS 12FAT" + db #04 + dc "MS-DOS 16FAT" + db #05 + dc "MS-DOS Ext" + db #06 + dc "MS-DOS 3.31+" + db #07 + dc "OS/2 HPFS" + db #0A + dc "OS/2 Boot" + dc "SMFS" + db #FF + +;таблица с названиями разделов MFS +x2B71 db #01 + dc "TR-DOS" + db #02 + dc "MicroDOS" + db #03 + dc "IsDOS" + db #04 + dc "BAD" + db #FF + +;АДРЕС: x2B8C поиск и печать сообщения из HL по типу в A +;вх: hl - список сообщений +; a - тип сообщения +;вых: cy=1 напечатано +; cy=0 сообщение не найдено +x2B8C call x2B9A ;поиск и печать сообщения из HL по типу в A + ret c ;напечатано + rst #20 ;печать сообщения "Unknown" + dc "Unknown" + or a + ret +;поиск и печать сообщения из HL по типу в A +;cy=1 напечатано +;cy=0 сообщение не найдено +x2B9A ld c,a +x2B9B ld a,(hl) + cp #FF + ret z ;конец списка + ld a,c + cp (hl) + inc hl + jr z,x2BAC ;сообщние найдено +x2BA4 ld a,(hl) ;ищем конец сообщения + and #80 + inc hl + jr z,x2BA4 + jr x2B9B +;печать сообщения из hl +;cy=1 напечатано +x2BAC ld a,(hl) + rst #30 + dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) + db #02 + and #80 + inc hl + jr z,x2BAC ;еще не конец сообщения + scf + ret + +;АДРЕС: #2BB8 подготовка к печати окна выбора раздела +x2BB8 push hl + call x0E8C ;снятие выделения атрибутами заданной опции меню (по курсору) + ld hl,#0506 ;координаты окна + ld de,#1C15 ;ширина окна в знакоместах и символах + call x2133 ;коррекция координат и размеров окна + call x0D02 ;очистка нижней строки окна меню + pop hl + ret + +;АДРЕС: #2BCA создание раздела MFS +x2BCA ld a,#19 ;заголовок окна: create partition ... + call x29DE ;печать окна global partition information и выбор записи в нем + ;hl - номер записи в каталоге +x2BCF ret c ;отмена выбора + call x29C6 ;расчет адреса в каталоге + ld a,#FF + cp (hl) + jr z,x2BDD ;выбрано незанятое место +x2BD8 call x29F4 ;выбран некорректный раздел. продолжаем выбор + jr x2BCF +;назанятая область выбрана. создаем раздел MFS (все незанятые области в буфере +; уже помечены признаком раздела MFS) +x2BDD ld a,#07 +x2BDF push hl + push af + call x300A ;загрузка числа в регистры из памяти +12 байт к адресу hl + call x2AC0 ;преобразование количества секторов в мегабайты + pop af ;bc - размер в мегабайтах + ld hl,#0813 + call x0BD0 ;ввод числа. в BC начальное значение + call x205A ;установка текущим окна: вывод каталога + pop hl + jr c,x2BD8 ;отмена ввода числа + ld a,e + or d + jr z,x2BD8 ;введен ноль + push hl + call x2AE7 ;умножение dehl=de*#800 + ld bc,xE9E7 ;dehl размер создаваемого раздела в секторах + call x301C ;загрузка числа из регистров в память + pop hl + push hl + ld bc,#000C + add hl,bc ;размер раздела MBR в записи в каталоге + call x2FCA ;сравнение со сободным местом + pop hl + ld a,#0C + jr c,x2BDF ;слишком большой раздел хотим создать + ld (hl),#00 ;признак наличия раздела +0 в записи + ld bc,#000C ;заносим в запись в каталоге размера раздела + add hl,bc + ld de,xE9E7 ;размер создаваемого раздела + ex de,hl + call x3000 ;копирование из (hl) в (de) 4х байт + jr x2C2A ;проверка разрывов между разделами и создание пустых записей в буфере + +;АДРЕС: #2C1F удаление раздела MBR +x2C1F ld a,#18 ;сообщение заголовка: delete partition ... + call x29DE ;печать окна global partition information и выбор записи в нем + ;hl - номер записи в каталоге + ret c ;отмена выбора + call x29C6 ;расчет адреса в каталоге + ;hl - адрес записи в каталоге + ld (hl),#FF ;помечаем как пустую запись +;проверка разрывов между разделами и создание пустых записей в буфере +x2C2A set 6,(iy+#1C) + ld hl,x2D5D ;!!!это лишняя команда + call x28C6 ;уплотнение каталога MBR (удаление в буфере записей unused) + jp x278D ;проверка разрывов между разделами и создание пустых записей в буфере + +;АДРЕС: #2C37 создание подраздела +x2C37 ld a,#19 ;сообщение заголовка: create partition ... + call x29D7 ;печать окна с подразделами и выбор подраздела в нем +x2C3C ret c ;ошибка + call x29C6 ;расчет адреса в каталоге + ld a,#FF + cp (hl) + jr z,x2C4A ;эта запись пустая +x2C45 call x29F4 ;выбран некорректный раздел. продолжаем выбор + jr x2C3C +;создаем подраздел +x2C4A push hl ;адрес начала записи в каталоге + ld hl,#0A01 + ld de,#2B71 + call x2F10 ;выбор типа подраздела + call x205A ;установка текущим окна: вывод каталога + pop hl ;адрес начала записи в каталоге + jr c,x2C45 ;отмена выбора типа подраздела. продолжаем выбор + ld (xDFFE),a ;код типа подраздела + call x2D2F ;ввод имени подраздела + jr c,x2C45 ;отмена ввода + ld a,#07 +x2C64 ld c,a + ld a,(xDFFE) ;код типа подраздела + cp #01 + ld a,c + jr z,x2CEB ;ввод размера подраздела TR-DOS в образах +;ввод числа. размер подраздела в килобайтах + push hl + push af + call x3005 ;dehl - размер подраздела в секторах + call x2ACC ;преобразование количества секторов в килобайты + pop af ;bc - размер в килобайтах + ld hl,#0812 ;параметры окна ввода + call x0BD0 ;ввод числа. в BC начальное значение + call x205A ;установка текущим окна: вывод каталога + pop hl ;адрес начала записи в каталоге + jr c,x2C45 ;отмена ввода числа + ld a,e ;de - введенное число + or d + ld a,#0C + jr z,x2C64 ;ввели ноль. повторим ввод +;проверка числа + push hl + call x2AF5 ;умножение dehl=de*2 +x2C8C push de + ld bc,xE9E7 + call x301C ;загрузка числа из регистров в память + pop bc ;de=xE9E7 + ld a,c + or b + pop hl ;адрес начала записи в каталоге + ld a,#0C + jr nz,x2C64 ;нельзя создать подраздел более 32Mb. повторим ввод +;проверка свободного места под заданный размер + push hl + ld bc,#0006 + add hl,bc ;адрес начала записи в каталоге+6 + call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl + pop hl ;адрес начала записи в каталоге + ld a,#0C + jr c,x2C64 ;нет места под такой раздел. повторим ввод +;проверка минимально допустимого размера подраздела + push hl + ld hl,xE9E7 ;введенное число + ld de,rom7_x0F59 ;=#00000200 + call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl + pop hl ;адрес начала записи в каталоге + ld a,#0C + jr c,x2C64 ;слишком маленький. продолжим ввод + ld a,(xDFFE) ;код типа подраздела + ld (hl),a + push hl + ld bc,#0006 + add hl,bc + ld de,xE9E7 ;введенное число + ex de,hl + call x3000 ;запишем в дескриптор подраздела размер + pop hl ;адрес начала записи в каталоге + ld a,(hl) + cp #01 + jr nz,x2CE8 ;это не TR-DOS подраздел +;создаем коллекцию образов + push hl ;адрес начала записи в каталоге + ld de,xE8A9 + ld bc,#0010 + ldir ;скопируем дескриптор подраздела + call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши + pop hl ;адрес начала записи в каталоге + jp nz,x2CE6 ;отказ от сохранения + call x2FB1 ;запись каталога MFS + call x2D63 ;формирование коллекции образов в подразделе TR-DOS + jp x09E5 ;чтение каталога подразделов + +x2CE6 ld (hl),#FF ;помечаем подраздел как удаленный +x2CE8 jp x2D50 ;сортировка каталога и выход в меню +;ввод размера подраздела TR-DOS в образах +;hl - адрес дескриптора подраздела +x2CEB push hl + push af + call x2E30 ;расчет максимального количества образов исходя из размеров подраздела + ld a,c + or a + jr z,x2D2A ;нет образов. продолжаем выбор + pop af + ld hl,#0812 + call x0BD0 ;ввод числа. в BC начальное значение + call x205A ;установка текущим окна: вывод каталога + pop hl + jp c,x2C45 ;отмена ввода. продолжаем выбор + ld a,e + or d + ld a,#0C + jp z,x2C64 ;ноль образов нель создать. продолжаем ввод +; расчет размера подраздела исходя из кол-ва образов + push hl ;адрес дескриптора подраздела + ld l,e + ld h,d + ld de,#0000 + exx + ld bc,#0501 ;размер образа в секторах + rst #30 + dw rom7_x0FB7 ;умножение dehl=de'hl' * bc + db #07 + ld bc,xE9E7 + call x301C ;загрузка числа из регистров в память (de=xE9E7) + ex de,hl + call x3047 ;инкремент числа по адресу hl + call x3047 ;инкремент числа по адресу hl +2 сектора на каталог + call x300E ;загрузка числа в регистры из памяти + ;dehl - размер подраздела в секторах + jp x2C8C ;формирование подраздела +x2D2A pop af + pop hl + jp x2C45 ;нет образов. продолжаем выбор + +;АДРЕС: #2D2F ввод имени подраздела +;вх: hl - адрес начала записи в каталоге +;вых: cy=1 отмкна ввода +x2D2F ld a,#09 +x2D31 push hl + ld hl,#070B + call x2E85 ;ввод имени подраздела + call x205A ;установка текущим окна: вывод каталога + pop hl + ret c ;отмена ввода + call x2EA7 ;проверка введенного имени + ld a,#65 + jr c,x2D31 ;имя некорректно, повторим ввод + ret + +;АДРЕС: #2D45 удаление подраздела +x2D45 ld a,#18 ;сообщение заголовка:delete partition ... + call x29D7 ;печать окна с подразделами и выбор подраздела в нем + ;hl - номер позиции в каталоге + ret c ;отмена выбора + call x29C6 ;расчет адреса в каталоге + ld (hl),#FF + +x2D50 set 6,(iy+#1C) ;признак изменения каталога подразделов + ld hl,x2D5D + call x28C6 ;уплотнение каталога MBR (удаление в буфере записей unused) + jp x264A ;сортировка каталога и выход в меню + +;АДРЕС: #2D5D сравнение (hl) с #FF, cy=1 если равны +x2D5D ld a,#FF + cp (hl) + ret nz + scf + ret + +;АДРЕС: #2D63 формирование коллекции образов в подразделе TR-DOS +;вх: (xE8A9) - дескриптор подраздела +x2D63 ld hl,xE8A9 ;дескриптор подраздела + call x2E30 ;расчет количества образов исходя из размеров подраздела + ld a,c + or b + ret z ;ни одного образа не поместится + ld b,c + ld c,#01 + push bc + ld de,#0001 + add hl,de + ld de,xE9E7 + call x3000 ;копирование из (hl) в (de) 4х байт + ex de,hl ;hl=xE9E7 + call x3047 ;инкремент числа по адресу hl + call x3047 ;инкремент числа по адресу hl + pop bc ;(xE9E7) LBA адрес начала образа + ld hl,xEBF5 ;начало каталога +;формирование каталога образов и очистка служебного сектора у каждого образа +x2D85 push bc + ld (hl),#01 ;признак образа TR-DOS + inc hl + ld de,xE9E7 + ex de,hl + call x3000 ;копирование из (hl) в (de) 4х байт + ;установка LBA адреса начала образа + ex de,hl ;hl=xE9E7 + call x2DF0 ;создание первого (служебного) сектора образа и формирование данных в описателе текущего дисковода + ld bc,#0004 + add hl,bc ;адрес дескриптора образа +5 + ld (hl),#00 +; размер образа + inc hl ;адрес дескриптора образа +6 + ld de,x2DE8 + ex de,hl + ld bc,#0004 + ldir ;размер образа (всегда #0501) +; имя образа + ld bc,#0004 + ld hl,x2DEC + ldir ;постоянное имя образа + ex de,hl + pop bc + push bc ;c - номер образа + ld b,#00 + ld a,#02 + ld e,#0A + push hl + call x0CDC ;печать числа bc в буфер hl + pop hl +; установка адреса следующего образа + inc hl + inc hl ;адрес следующего дескриптора образа + push hl + ld hl,xE9E7 ;сложение двух 4х байтных чисел + ld de,x2DE8 + call x3052 ;(xE9E7) LBA адрес следующего образа + pop hl ;адрес следующего дескриптора образа + pop bc ;номер следующего образа + inc c + djnz x2D85 +;установка сигнатур каталога + ld (hl),#00 + ld hl,#AA54 ;сигнатура каталога образов + ld (xEBF5+#3FE),hl + ld hl,#5254 ;дополнитьельная сигнатура каталога образов + ld (xEBF5+#3FC),hl + + + ld hl,xE8A9 ;дескриптор подраздела + ld de,#0001 + add hl,de ;дескриптор подраздела+1 + call x300E ;загрузка числа в регистры из памяти + ;dehl - LBA адрес начала подраздела + rst #30 + dw rom7_x17EF ;запись каталога образао из буфера xEBF5 + db #07 + ret + +x2DE8 db #01,#05,#00,#00 ;размер образа в секторах +x2DEC db "Disk" ;постоянная часть имени + +;АДРЕС: #2DF0 создание первого (служебного) сектора образа и формирование данных в описателе текущего дисковода +;вх: hl - адрес дескриптора образа +1 +; de - LBA адрес начала данных образа +x2DF0 push hl + ld hl,xE5A9 ;очистка буфера 512b + ld de,xE5A9+1 + ld (hl),#00 + ld bc,#01FF + ldir + pop hl ;адрес дескриптора образа +1 +;создание первого (служебного) сектора образа + push hl + call x300E ;загрузка числа в регистры из памяти (hl) + ;dehl - LBA адрес начала образа + rst #30 + dw rom7_x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl + db #07 + pop hl +;формирование данных в описателе текущего дисковода (а нахрена???) +; LBA адрес начала образа + push hl ;адрес дескриптора образа +1 + ld de,xE590+1 ;LBA адрес начала образа + call x3000 ;копирование из (hl) в (de) 4х байт +; признак образа + ld a,#01 + ld (xE590),a ;признак образа + ld a,#E0 + ld (xFFCE),a ;для дисковода C + pop hl +; размер образа + push hl ;адрес дескриптора образа +1 + ld de,xE590+5 + call x3000 ;копирование из (hl) в (de) 4х байт + ld hl,x2DE8 ;адрес размера образа + ex de,hl + call x3052 ;сложение двух 4х байтных чисел + ld hl,xE590+5 + call x302A ;декремент (hl)=(hl)-1 + pop hl + ret + +;АДРЕС: #2E30 расчет количества образов исходя из размеров подраздела +;вх: hl - адрес дескриптора подраздела +;вых: bc - количество образов +x2E30 push hl + call x3005 ;загрузка числа в регистры из памяти +6 байт к адресу hl + ld bc,xE9E7 ;dehl - размер подраздела + call x301C ;загрузка числа из регистров в память + ex de,hl ;hl=xE9E7 + call x302A ;декремент (hl)=(hl)-1 + call x302A ;декремент (hl)=(hl)-1 -2 сектора + call x300E ;загрузка числа в регистры из памяти (hl) + exx + ld bc,#0501 ;размер образа в секторах + rst #30 + dw rom7_x0F5D ;деление de'hl'=de'hl'/bc + db #07 + exx + ld bc,#0033 ;определение количества образов в подразделе + ld a,e + or d + or h + jr nz,x2E5B + ld a,l + cp #34 + jr nc,x2E5B + ld c,a +x2E5B pop hl + ret + +;АДРЕС: #2E5D сформируем пустой сектор MBR в буфере xE5A9 +x2E5D ld hl,xE5A9+#1BE ;начало списка разделов + ld bc,#0041 + ld de,xE5A9+#1BF + ld (hl),#00 + ldir + ld hl,#AA55 + ld (xE5A9+#1FE),hl ;запишем сигнатуру + ret + +;АДРЕС: #2E71 очистка буфера xEBF5 и установка сигнатуры раздела MFS +x2E71 ld hl,xEBF5 + ld bc,#03FF + ld de,xEBF5+#01 + ld (hl),#00 + ldir + ld hl,#AA54 + ld (xEBF5+#3FE),hl ;xEFF3 + ret + +;АДРЕС: #2E85 ввод имени подраздела +;вх: hl - настройки окна ввода строки +;вых: cy=1 отмена ввода строки +; de - адрес введенной строки +x2E85 ld (xE9EF),hl + set 5,(iy+#0E) + call x0CCA ;очистка буфера для ввода строки + rst #30 ;можно и напрямую вызвать + dw rom5_x0C22 ;установка параметров окна для ввода строки в меню монитора + db #05 + rst #30 ;можно и напрямую вызвать + dw rom5_x1CB8 ;ввод строки (вых: hl адрес введенной строки) + db #05 +x2E97 ld de,xDE17 ;буфер для ввода строки + ret nc ;строка введена +;отмена ввода + cp #03 + jr nz,x2EA1 + scf ;break/cancel + ret +x2EA1 rst #30 ;можно и напрямую вызвать + dw rom5_x1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) + db #05 + jr x2E97 + +;АДРЕС: #2EA7 проверка введенного имени +;вх: hl - адрес начала записи в каталоге +; de - адрес введенной строки +;вых: cy=1 ошибка при проверке +; cy=0 имя корректно +x2EA7 push hl + ld bc,#000A + add hl,bc ;начало имени подраздела в дескрипторе + ld a,(xDFFE) ;код типа подраздела + ld c,a + ld b,#06 +x2EB2 ld a,(de) + cp #21 + jr nc,x2EC9 ;это допустимый символ + ld a,b + cp #06 + jr z,x2EC1 ;пустое имя + ld a,(de) + cp " " + jr c,x2EC6 ;недопустимый символ. конец имени +x2EC1 ld a,c + cp #04 + jr nz,x2F0D ;пустое имя только для BAD можно +x2EC6 ld a," " + dec de +x2EC9 inc de ;заполняем остаток пробелами + ld (hl),a + inc hl + djnz x2EB2 + pop hl ;адрес начала записи в каталоге + ld a,c + cp #04 + ret z ;если BAD подраздел +;проверка совпадения имени + push hl + ld a,(xDD89) ;количество записей в каталоге + ld b,a + ld hl,xEBF5 ;начало каталога +x2EDB ld a,(hl) + cp #FF + jr z,x2F04 ;пустая запись + pop de + push de + or a + push hl + sbc hl,de + pop hl + jr z,x2F04 ;запись, на месте которй создаем подраздел + push bc + ex de,hl + ld bc,#000A + add hl,bc + ex de,hl + push hl + add hl,bc + ld bc,#0600 ;проверка совпадения имени +x2EF5 ld a,(de) + cp (hl) + jr z,x2EFA + inc c +x2EFA inc hl + inc de + djnz x2EF5 + pop hl + ld a,c + pop bc + or a + jr z,x2F0D ;есть совпадение по имени. нельзя два одинаковых +x2F04 ld de,#0010 + add hl,de + djnz x2EDB + pop hl + or a + ret +;ошибка при проверке имени +x2F0D pop hl + scf + ret + +;АДРЕС: #2F10 выбор типа подраздела +;вх: hl - настройки окна ввода строки +; de - адрес таблицы с названиями разделов MFS +;вых: cy=1 отмена выбора +; cy=0 тип подраздела выбран +; hl - адрес сообщения с типом и названием подраздела +; a - код типа подраздела +x2F10 ld (xE9EF),hl ;настройки окна ввода строки + set 5,(iy+#0E) + push de + ld a,#64 ;сообщение: select + rst #30 ;можно и напрямую вызвать + dw rom5_x0C22 ;установка параметров окна для ввода строки в меню монитора + db #05 + pop hl ;адрес таблицы с названиями разделов MFS +;выбор типа подраздела +x2F1F push hl +x2F20 xor a ;!!!нет нуля в этой таблице + cp (hl) + jr z,x2F49 +;печать типа подраздела (tr-dos/is-dos/microdos/bad) + push hl + inc hl + ld (ix+1),#01 ;координата X + set 0,(ix+7) ; + call x2BAC ;печать сообщения из hl + rst #30 + dw rom2_x2FED ;печать пробелов до правого края окна + db #02 + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + res 0,(ix+7) + pop hl + cp #0D + jr z,x2F58 ;enter + cp #03 + jr nz,x2F49 ;что-то нажато + scf ;отмена создания + pop hl + ret +;обработка нажатия любой клавиши +x2F49 inc hl +x2F4A ld a,(hl) ;ищем конец сообщения + and #80 + inc hl + jr z,x2F4A + ld a,(hl) + cp #FF + jr nz,x2F20 ;если не конец блока + pop hl ;если конец блока, переход на начало блока + jr x2F1F +;выбрали тип подраздела в (hl) - тип +x2F58 ld a,(hl) + ex (sp),hl + pop hl + or a + ret + +;АДРЕС: #2F5D запрос на сохранение сектора MBR, если были изменения +x2F5D bit 6,(iy+#1C) + ret z + call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши + ret nz + +;АДРЕС: #2F66 формирование и запись сектора MBR +x2F66 set 5,(iy+#1C) + ld hl,x2D5D + call x28C6 ;уплотнение каталога MBR (удаление в буфере записей unused) + call x2E5D ;сформируем пустой сектор MBR в буфере xE5A9 + ld de,xE5A9+#1BE ;начала дескрипторов разделов в секторе MBR + ld hl,xEBF5 ;буфер с каталогом + ld a,(xDD89) ;записей в каталоге + cp #04 + jr c,x2F82 ;допустимое значение + ld a,#04 ;можно не больше 4х +x2F82 or a + jr z,x2F8D ;разделов нет + dec a + ld bc,#0010 + ldir ;копируем дескриптор раздела + jr x2F82 ;повторим +x2F8D ld hl,#0000 ;LBA адрес (нулевой сектор) + ld e,l + ld d,h + jr x2F9E ;запись сектора из буфера xE5A9 + +;АДРЕС: #2F94 !!!не используется!!! чтение сектора в буфер xE5A9 +x2F94 rst #30 + dw rom7_x1D73 ;чтение сектора с винчестера в буфер xE5A9 + db #07 + ret nc ;нет ошибок + rst #30 + dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора + db #07 + ret + +;запись сектора из буфера xE5A9 +x2F9E rst #30 + dw rom7_x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl + db #07 + ret nc ;нет ошибок + rst #30 + dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора + db #07 + ret + +;АДРЕС: #2FA8 запрос на сохранение каталога MFS, если были изменения +x2FA8 bit 6,(iy+#1C) + ret z ;список разделов в буфере без изменений + call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши + ret nz ;отказ от сохранения + +;АДРЕС: #2FB1 запись каталога MFS/подраздела +x2FB1 set 5,(iy+#1C) + ld hl,x2D5D + call x28C6 ;уплотнение каталога (удаление в буфере записей unused) + call x270D ;загрузка числа в регистры из памяти xE81B+8 + ;dehl - LBA адрес начала раздела MFS + rst #30 ;запись каталога MFS + dw rom7_x17EF ;запись 2х секторов из буфера xEBF5 + db #07 + jp nc,x2503 ;ошибок не было + rst #30 + dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора + db #07 + ret + +;АДРЕС: #2FCA сравнение двух чисел в памяти по адресам в de и hl +x2FCA rst #30 + dw rom7_x1035 ;сравнение двух чисел в памяти по адресам в de и hl + db #07 + ret + +;АДРЕС: #2FCF обнуление переменной xE9EB +x2FCF push hl + ld hl,#0000 + ld (xE9EB),hl + ld (xE9EB+#02),hl + pop hl + ret + +;АДРЕС: #2FDB инкремнт слова (xDD89)=(xDD89)+1 +x2FDB push hl + ld hl,(xDD89) + inc hl + ld (xDD89),hl + pop hl + ret + +;АДРЕС: #2FE5 декремент слова (xDD89)=(xDD89)-1 +x2FE5 push hl + ld hl,(xDD89) + dec hl + ld (xDD89),hl + pop hl + ret + +;АДРЕС: #2FEF умножение bc=bc*#10 +x2FEF sla c + rl b + sla c + rl b + sla c + rl b + sla c + rl b + ret + +;АДРЕС: #3000 копирование из (hl) в (de) 4х байт +x3000 rst #30 + dw rom7_x1003 ;копирование из (hl) в (de) 4х байт + db #07 + ret + +;АДРЕС: #3005 загрузка числа в регистры из памяти +6 байт к адресу hl +x3005 ld bc,#0006 + jr x300D + +;АДРЕС: #300A загрузка числа в регистры из памяти +12 байт к адресу hl +x300A ld bc,#000C +x300D add hl,bc + +;АДРЕС: #300E загрузка числа в регистры из памяти +;вх: hl - адрес откуда грузим +;вых: dehl - число +x300E push hl + pop bc + ld a,(bc) + ld l,a + inc bc + ld a,(bc) + ld h,a + inc bc + ld a,(bc) + ld e,a + inc bc + ld a,(bc) + ld d,a + ret + +;АДРЕС: #301C загрузка числа из регистров в память +;вх: dehl - число +; bc - адрес куда грузим +;вых: de - адрес куда загрузили +x301C push bc + ld a,l + ld (bc),a + inc bc + ld a,h + ld (bc),a + inc bc + ld a,e + ld (bc),a + inc bc + ld a,d + ld (bc),a + pop de + ret + +;АДРЕС: #302A декремент (hl)=(hl)-1 +x302A push hl + push de +x302C ld de,x3043 + call x3035 + pop de + pop hl + ret + +;АДРЕС: #3035 вычитание (hl)=(hl)-(de) +x3035 ex de,hl + push bc + xor a + ld b,#04 +x303A ld a,(de) + sbc a,(hl) + ld (de),a + inc hl + inc de + djnz x303A + pop bc + ret + +;для инкремента +x3043 db #01,#00,#00,#00 ;dd #01 + +;АДРЕС: #3047 инкремент числа по адресу hl +x3047 push hl + push de + ld de,x3043 + call x3052 ;сложение двух 4х байтных чисел + pop de + pop hl + ret + +;АДРЕС: #3052 сложение двух 4х байтных чисел +;вх: hl - адрес первого числа +; de - адрес второго числа +;вых: hl - сумма чисел +x3052 ex de,hl + push bc + xor a + ld b,#04 +x3057 ld a,(de) + adc a,(hl) + ld (de),a + inc hl + inc de + djnz x3057 + pop bc + ret + +;АДРЕС: #3060 вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши +;вых: z - нажата Y +x3060 ld hl,xE0D7 ;дескриптор окна: запрос на запись MBR + rst #30 + dw rom2_x301C ;ix = адрес дескриптора окна монитора из hl + db #02 +x3067 ld (ix+4),#18 ;высота окна + ld (ix+6),#17 ;атрибуты окна + rst #20 + db #0C ;очистка окна + db #1B,#09,#0F ;координаты печати + db "Warning!" + db #1B,#0B,#08 ;координаты печати + db "Partition will be changed." + db #1B,#0D,#0E ;координаты печати + dc "Write (Y/N)?" + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + ld (ix+6),#31 + ld (ix+4),#16 + and #DF + cp "Y" + ret + +;АДРЕС: #30B9 идентификация жесткого диска +x30B9 push ix + ld ix,xE5A9 + rst #30 + dw rom7_x1E74 ;R8DOS #22(34) идентификация жесткого диска + db #07 + pop ix + ret + +;АДРЕС: #30C6 печать окна для тестирования HDD +x30C6 call x0CF6 ;установка и инициализация окна для ввода строки внизу экрана +x30C9 ld (ix+#01),#00 ;crd X =0 + rst #20 + dc "Press BREAK to exit. ONLY!" + rst #30 + dw rom6_x064D ;установка дескриптора окна: запрос на запись MBR + db #06 + rst #20 + db #8C ;очистка окна + ld (ix+#00),#15 ;crd Y =#15 + ret + +;АДРЕС: #30F3 печать кода ошибки +;вх: a - код ошибки (номер сообщения из блока 0) +x30F3 push af + call x310F ;печать текущих номера головки и сектора + pop bc + ld c,#00 + rst #08 + rst #20 + db #8D ;перевод строки + jr x315E + +;печать текущего номера цилиндра HDD +x30FF ld (ix+#01),#00 ;crd X =0 + rst #20 + dc "C:" + ld bc,(xE047) ;номер цилиндра + rst #30 + dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом + db #02 + ret + +;печать текущих номера головки и сектора +x310F call x30FF ;печать текущего номера цилиндра HDD +x3112 rst #20 + dc " H:" + ld a,(xE049) ;номер головки + and #0F + ld c,a + ld b,#00 + rst #30 + dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом + db #02 + rst #20 + dc " S:" + ld a,(xE046) ;номер сектора + ld c,a + ld b,#00 + rst #30 + dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом + db #02 + rst #30 + dw rom2_x2B10 ;печать пробела (rst #10) + db #02 + ret + +;АДРЕС: #3135 печать сообщения об ошибке несовпадения данных при чтении/записи на HDD +;вх: hl - номер байта в секторе +; c - контрольное значение байта +; b - считанное значение байта +x3135 push bc + push hl + call x310F ;печать текущих номера головки и сектора + rst #20 + dc "data bad " + pop hl + rst #30 + dw rom2_x16DE ;печать числа hl=[#0000..#FFFF] + db #02 + rst #30 + dw rom2_x2B10 ;печать пробела (rst #10) + db #02 + pop bc + push bc + ld a,c + rst #30 + dw rom2_x16E3 ;печать числа a=[#00..#FF] + db #02 + rst #20 + dc ":" + pop bc + ld a,b + rst #30 + dw rom2_x16E3 ;печать числа a=[#00..#FF] + db #02 + rst #20 + db #8D ;перевод строки + +;управление выводимым листингом (опрос клавиш space, s, cs+1) +x315E rst #30 + dw rom2_x37B9 + db #02 + ret + +;АДРЕС: #3163 печать текущего номера цилиндра +x3163 call x30FF ;печать текущего номера цилиндра HDD + call x0110 ;опрос Break. cy=1 не нажата + jr c,x3183 + call x3112 ;нажата Break + rst #20 + dc "Break" +x3174 ld b,#06 ;пауза примерно 245k тактов +x3176 rst #30 + dw rom2_x3807 ;пауза 40416t + db #02 + djnz x3176 + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 +x3180 jp x0EB5 ;печать текущего меню монитора +x3183 rst #20 + dc " of" + ld bc,(xDFF2) ;значение Cylinders HDD + rst #30 + dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом + db #02 + rst #30 + dw rom2_x2B10 ;печать пробела (rst #10) + db #02 + ld a,(iy+#01) + inc (iy+#01) + and #03 + ld hl,x31A6 + add a,l + ld l,a + jr nc,x31A3 + inc hl ;!!!ОШИБКА!!! должно быть inc h +x31A3 ld a,(hl) + rst #10 + ret +x31A6 db #2D,#5C,#7C,#2F ;"-\|/" индикация работы + +;АДРЕС: #31AA удаление всех разделов MBR +x31AA call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши + jr nz,x3180 ;нажата не Y. печать текущего меню монитора + ld hl,xE5A9 ;очитска буфера + ld de,xE5A9+1 + ld (hl),#00 + ld bc,#01FF + ldir + xor a + ld l,a + ld h,a + ld e,a + ld d,a + rst #30 + dw rom7_x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl + db #07 + jr nc,x3180 ;ошибок не было. печать текущего меню монитора + ld (ix+#00),#17 ;crd Y + ld (ix+#01),#00 ;crd X + call x30F3 ;печать кода ошибки + jr x3174 ;ждем нажатие клавиши и печать текущего меню монитора + +;АДРЕС: #31D4 неиспользуемая область +x31D4 ds #2C,#00 + +;АДРЕС: #3200 каталог ROM-disk +x3200 dc "ZxUnZip" : ds 7 :db #0E,#04 + dc "ZxZip" : ds 9 :db #39,#05 + dc "TASM_4.0" : ds 6 :db #2F,#07 + dc "SM_2.01" : ds 7 :db #36,#08 + dc "HD_Copy_1.7" : ds 3 :db #02,#0A + dc "TESTFDD" : ds 7 :db #3D,#0A + DUP 10 + ds #10 + EDUP + +;АДРЕС: #3300 ROM-disk +x3300 INCBIN "prof_roms/rom5_ROMdisk.bin" + + SAVEBIN "../Build/scorp/NewROM5.bin",#0000,#4000 diff --git a/ProfRom_Disasm/rom5.bat b/ProfRom_Disasm/rom5.bat new file mode 100755 index 0000000..897a2b9 --- /dev/null +++ b/ProfRom_Disasm/rom5.bat @@ -0,0 +1,4 @@ +MkDir !bin +MkDir !log +DEL /Q !log\*.* +..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom5.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom6.a80 b/ProfRom_Disasm/rom6.a80 new file mode 100755 index 0000000..d01ca46 --- /dev/null +++ b/ProfRom_Disasm/rom6.a80 @@ -0,0 +1,2902 @@ + DEVICE ZXSPECTRUM128 + INCLUDE "!AllConst.asm" + INCLUDE "!ram8.asm" + ORG #0000 +ROMdisk equ #1200 + +;#0000 *NOT USED* (#08 байт) +;#0008 rst #08 печать сообщения по номеру в BC +;#000D *NOT USED* (#03 байта) +;#0010 rst #10 печать символа из A +;#0015 *NOT USED* (#03 байт) +;#0018 вызов процедуры из rom7 (rst #18: dw addr) +;#001B *NOT USED* (ld a,#01) +;#001E *NOT USED* (#02 байта) +;#0020 rst #20 печать строки +;#0025 *NOT USED* (#0B байт) +;#0030 rst #30 вызов процедуры из другого rom +;#0033 *NOT USED* (#05 байт) +;#0038 обработчик прерываний im 0/1 +;#003B *NOT USED* (#2B байт) +;#0066 обработка NMI (зависание с желто-черным бордюром) +;#006F *NOT USED* (#01 байт) +;#0070 переменные ROM-disk +;#0073 загрузка блока из ROM-Disk +;#00AA *NOT USED* (#55 байт) +;#00FF адрес п/п обработки прерываний im 2 +;#0101 номер текущего rom +;#0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) +;#0110 Таблица переходов ПрофПЗУ +;#0114 обработчик прерываний im 1/2 +;#0149 печать строки (rst #20) +;#0156 печать информации о ловушке +;#01E4 установка новой ловушки в отладчике +;#0249 вывод каталога текущего дисковода (на экран/принтер) +;#03A1 печать числа в десятичной системе счисления +;#03A9 форматирование/проверка текущей дискеты +;#04E5 быстрое форматирование текущей дискеты (очистка каталога) +;#064D установка дескриптора окна: запрос на запись MBR +;#0655 hl=hl+5: hl=de (z равны) +;#0667 вызоф функции R8DOS +;#066C установка код дисковой ошибки в переменной для печати числа +;#0675 зануление #100 байт буфера xE5A9 +;#0678 зануление #100 байт памяти с hl +;#067F сохранение экрана пользователя на диск +;#06A6 печать сообщения об ошибке и продолжение работы монитора +;#06AD ввод текстовой строки внизу экрана +;#06С1 печать текущего меню монитора (без возврата) +;не используется #06C5 вывод в порт #FE содержимое ячейки (#7530) +;#06CB таблица соответствий нажатой клавиши печатному символу +;#06F2 таблица кодов клавиш cs+1+клавиша +;#0719 таблица кодов клавиш ss+клавиша +;#0740 таблица кодов клавиш cs+цифра +;#074A ожидание действий пользователя (опрос управления, вывод часов) +;#0773 проверка наличия нажатых клавиш в буфере клавиатуры +;#0777 проверка наличия нажатых клавиш в буфере клавиатуры +;#0780 проверка переполнения буфера клавиатуры +;#078B сброс буфера клавиатуры +;#0792 опрос клавиатуры и установка кода нажатой клавиши в буфере +;#07B2 опрос клавиатуры и установка кода нажатой клавиши +;#0845 опрос клавиатуры +;#086A определение кода нажатой клавиши/комбинации клавиш +;#093F RST #08:db #8B загрузка zs-snap с диска +;#096D копирование активного экрана пользователя в #4000 +;#0972 печать текущего меню монитора (без возврата) +;#0976 загрузка zs-snap (S. load ... snap) +;#097E сохранение zs-snap (S. save ... snap) +;#0B71 расчет начала битовой карты параграфов заданной страницы +;#0B74 печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) +;#0D59 включение режима 48k only +;#0D60 установка п/п jp #addr по адресу xE338 +;#0D6D установка/восстановление параметров заголовка zs-snap +;#0E3B загрузка из ROM-disk +;#0EE0 загрузка блока из ROM-disk +;#0EE6 загрузка блока из ROM-disk +;#0F08 загрузка страницы из ROM-disk в память #8000 +;не используется #0F4D заполнение области памяти [#4000..#7FFF] пользователя +;#0F60 запаковка блока +;#1103 сложение hl=hl+a +;#1108 распаковка блока +;#11AF NOT USED +;#1200 ROM-disk +;#4000 + + + +;АДРЕС: #0000 *NOT USED* (#08 байт) +x0000 ds #08 + +;АДРЕС: #0008 rst #08 печать сообщения по номеру в BC +x0008 rst #30 + dw rom5_x11CD ;печать сообщения по номеру в BC + db #05 + ret + +;АДРЕС: #000D *NOT USED* (#03 байта) +x000D ds #03 + +;АДРЕС: #0010 rst #10 печать символа из A +x0010 rst #30 + dw rom2_x2B12 ;печать символа (rst #10) + db #02 + ret + +;АДРЕС: #0015 *NOT USED* (#03 байт) +x0015 ds #03 + +;АДРЕС: #0018 вызов процедуры из rom7 (rst #18: dw addr) +x0018 jp xE41B + +;АДРЕС: #001B *NOT USED* (ld a,#01) +x001B ld a,#01 + ret + +;АДРЕС: #001E *NOT USED* (#02 байта) +x001E ds #02 + +;АДРЕС: #0020 rst #20 печать строки +x0020 ex (sp),hl + push af + jp x0149 + +;АДРЕС: #0025 *NOT USED* (#0B байт) +x0025 ds #0B + +;АДРЕС: #0030 rst #30 вызов процедуры из другого rom +x0030 jp xE3D3 + +;АДРЕС: #0033 *NOT USED* (#05 байт) +x0033 ds #05 + +;АДРЕС: #0038 обработчик прерываний im 0/1 +x0038 jp x0114 + +;АДРЕС: #003B *NOT USED* (#2B байт) +x003B ds #2B + +;АДРЕС: #0066 обработка NMI (зависание с желто-черным бордюром) +x0066 ld a,#06 + out (#FE),a + xor a + out (#FE),a + jr x0066 + +;АДРЕС: #006F *NOT USED* (#01 байт) +x006F ds #01 + +;АДРЕС: #0070 переменные ROM-disk +x0070 db ROMdisk/#100 ;смещение начала ром диска (в блоках по 256 байт) + db #40-ROMdisk/#100;количество свободных секторов в странице + db #00 ;смещение до начала каталога + +;АДРЕС: #0073 загрузка блока из ROM-Disk + INCLUDE "!RomDisk.asm" + +;АДРЕС: #00AA *NOT USED* (#55 байт) +x00AA ds #55 + +;АДРЕС: #00FF адрес п/п обработки прерываний im 2 +x00FF dw x0114 + +;АДРЕС: #0101 номер текущего rom +x0101 db #06 + +;АДРЕС: #0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) +x0102 ds #0E + +;АДРЕС: #0110 Таблица переходов ПрофПЗУ +x0110 db #0C,#00,#08,#04 + +;АДРЕС: #0114 обработчик прерываний im 1/2 +x0114 push af + push hl + push de + push bc + ld ix,(xE3B7) ;адрес дескриптора текущего окна + call x0792 ;опрос клавиатуры и установка кода нажатой клавиши в буфере + rst #30 + dw rom5_x0176 ;восстановление экрана под курсором мыши + db #05 + rst #30 + dw rom2_x28F6 ;мигание текстового курсора в строке ввода + db #02 + push ix ;адрес дескриптора текущего окна + rst #30 + dw rom5_x011C ;опрос манипуляторов и печать курсора + db #05 + call c,x07A0 ;помещение кода нажатой кнопки джойстика/мыши в буфер клавиатуры + bit 6,(iy+#1A) ;чтение времени из CMOS, если возможно + jr z,x0140 ;CMOS отсутствует + bit 3,(iy+#27) + jr z,x0140 ;индикация времени выключена + rst #30 + dw rom7_x1F76 ;чтение из CMOS времени и даты, в случае готовности CMOS + db #07 +x0140 pop ix + pop bc + pop de + pop hl + pop af + ei + reti + +;АДРЕС: #0149 печать строки (rst #20) +x0149 ld a,(hl) + rst #30 + dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) + db #02 + and #80 + inc hl + jr z,x0149 + pop af + ex (sp),hl + ret + +;АДРЕС: #0156 печать информации о ловушке +;вх: hl - адрес ловушки +; d - количество ловушек+1 +; e - номер текущей ловушки +;вых: hl - адрес следующей ловушки +x0156 ld c,e + ld b,#00 + push de +;печать номера ловушки + ld (iy+#08)," " + ld (iy+#07),#02 ;минимум разрядов в числе при переводе в ASCII + rst #30 + dw rom2_x166E ;печать десятичного числа bc [0..65535] с ведущими пробелами + db #02 + pop de + rst #20 + dc " " + push hl + bit 6,(hl) + jr nz,x0174 +;ловушка не задана + ld bc,#2900 ;сообщение: *** undefined + rst #08 ;печать сообщения + jr x01D7 ;следующая ловушка +;ловушка задана +x0174 push de + ld b,#02 + rst #30 + dw rom2_x15F3 ;печать нескольких пробелов (в B) + db #02 +; печать адреса ловушки + rst #20 + dc "#" + push hl + inc hl + ld e,(hl) + push de + inc hl + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + rst #30 + dw rom2_x16DE ;печать числа hl=[#0000..#FFFF] + db #02 + pop de + pop hl +; печать номера страницы ловушки + ld b,#04 + rst #30 + dw rom2_x15F3 ;печать нескольких пробелов (в B) + db #02 + ld a,e + rst #30 + dw rom2_x16EC ;печать числа a=[#0..#F] + db #02 +; печать типа ловушки + ld b,#04 + rst #30 + dw rom2_x15F3 ;печать нескольких пробелов (в B) + db #02 + ld a,(hl) + and #03 + rst #30 + dw rom2_x16EC ;печать числа a=[#0..#F] + db #02 +; состояние ловушка (активна/неактивна) + ld b,#03 + rst #30 + dw rom2_x15F3 ;печать нескольких пробелов (в B) + db #02 + bit 7,(hl) + rst #30 + dw rom2_x3201 ;печать ON/OFF от флага nz-ON/z-OFF + db #02 +; начальное значение счетчика проходов по ловушке + ld de,#0005 + add hl,de + ld c,(hl) + inc hl + ld b,(hl) + inc hl + rst #30 + dw rom2_x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами + db #02 +; текущее значение счетчика проходов + ld c,(hl) + inc hl + ld b,(hl) + inc hl + rst #30 + dw rom2_x1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом + db #02 +; наличие (+) или отсутствие (-) программы для анализатора + ld b,#02 + rst #30 + dw rom2_x15F3 ;печать нескольких пробелов (в B) + db #02 + pop de + ld a,e + rst #30 + dw rom2_x3210 ;определение адреса ловушки + db #02 + ld a,"-" + jr z,x01D6 + ld a,"+" +x01D6 rst #10 +;адрес следующей ловушки +x01D7 pop hl + ld de,#000B + add hl,de + or a + ret + +;выход в отладчик +x01DE ld a,#0A ;сообщение: too few operands +x01E0 rst #30 + dw rom2_x0B06 ;ввод и обработка команды отладчика + db #02 ;без возврата + +;АДРЕС: #01E4 установка новой ловушки в отладчике +;вх: ix - адрес ловушки +; hl - тип ловушки +; bc - адрес установки ловушки +; a - количество операндов [0..5] +; z - ловушка не задана +x01E4 push ix + ld de,xE585+#01 + ex de,hl +;проверка валидности типа ловушки + push af + ld a,e + and #FC + or d + ld a,#24 ;сообщение: invalid type breackpoint + jr nz,x01E0 ;возврат в отладчик + pop af +;проверка количества параметров + cp #04 + jr z,x0213 ;в текущую страницу + jr c,x01DE ;мало параметров. выход в отладчик + cp #06 + ld a,#0B ;сообщение: too many operands + jr nc,x01E0 ;много параметров. выход в отладчик +;ставим страницу + push hl + ld hl,(xDD99+#08) ;номер страницы + ld a,l + and #F0 + or h + ld a,#18 ;сообщение: invalid bank RAM + jr nz,x01E0 ;неверный номер страницы. выход в отладчик + ld a,l + pop hl + ld (hl),a + set 5,e + jr x0218 +x0213 rst #30 + dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] + db #02 + ld (hl),a +;установка адреса ловушки +x0218 bit 0,e ;e - тип ловушки ???ВОЗМОЖНО ОШИБКА??? + inc hl + jr nz,x0224 ;активная после выполнения + ld a,b + and #C0 + ld a,#25 ;сообщение: bad address breackpoint + jr z,x01E0 ;в ПЗУ ставить нельзя. выход в отладчик +x0224 ld (hl),c + inc hl + ld (hl),b + inc hl + inc hl +;установка количества проходов + ld bc,(xDD99+#06) ;количество проходов по ловушке до ее активизации + ld (hl),c + inc hl + ld (hl),b + inc hl + ld (hl),c + inc hl + ld (hl),b + inc hl + xor a + ld (hl),a + inc hl + ld (hl),a +;установка типа ловушки + ld hl,xE585 + ld a,e + or #C0 + ld (hl),a +;копирование ловушки из временного буфера и выход в отладчик + pop de + ld bc,#000B + ldir + ld a,#81 ;сообщение: enter command + ret + +;АДРЕС: #0249 вывод каталога текущего дисковода (на экран/принтер) +x0249 rst #30 + dw rom2_x3A95 ;подготовка переменных к выводу на экран/принтер + db #02 + ld (iy+#08),#20 + ld hl,(xFFD0) + push hl + rst #30 + dw rom7_x107B ;инициализация дисковода и настройка на дискету + db #07 + jp c,x0382 ;ошибка чтения/записи + push bc + ld bc,#4B00 ;сообщение: disk + rst #08 + ld a,(xFFCA) + add a,"A" + rst #10 ;печать буквы дисковода + rst #20 + dc ':"' +; печать имени диска + ld hl,xE5A9+#F5 + ld b,#08 + rst #30 + dw rom2_x15B9 ;печать сообщения из hl с заменой непечатных символов на ? + db #02 + rst #20 + dc '", ' +; печать времени и даты + ld d,#DA ;%11011010 + rst #30 + dw rom5_x1AA6 ;читаем время в строку в формате ASCII + db #05 + rst #20 + dc " " + ld d,#20 + rst #30 + dw rom5_x1B18 ;читаем дату в строку в формате ASCII + db #05 + rst #20 + db #8D + pop af ;a - код, определяющий тип дискеты в дисководе + push af +; печать количества дорожек + bit 5,a + ld b,#39 + jr z,x0290 ;40 дорожек на дискете + inc b +x0290 ld c,#01 ;сообщение: 40/80 + rst #08 + ld bc,#3801 ;сообщение: track + rst #08 +; печать количества сторон + pop af + rlca + ld b,#3C + jr nc,x029E + inc b ;сообщение: one/double +x029E ld c,#01 + rst #08 + ld bc,#3B01 ;сообщение: side + rst #08 +; печать идентификационного кода и типа дискеты + rst #20 + dc "(" + ld a,(xE5A9+#E7) ;Идентификационный код TR-DOS (#10) + call x0396 ;печать числа в шестнадцатиричной системе счисления + rst #20 + dc "/" + ld a,(xE5A9+#E3) ;Тип дискеты + call x0396 ;печать числа в шестнадцатиричной системе счисления +; печать кол-ва файлов, свободного места + rst #20 + db ")",#0D + dc "File" + ld a,(xE5A9+#E4) ;Количество файлов на дискете + call x03A1 ;печать числа в десятичной системе счисления + rst #20 + dc "/" + ld a,(xE5A9+#F4) ;Количество удаленных файлов + call x03A1 ;печать числа в десятичной системе счисления + rst #20 + dc ", free" + ld bc,(xE5A9+#E5) ;Количество свободных секторов + rst #30 + dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом + db #02 + rst #20 + dc " (" + ld a,(xE5A9+#E1) ;Номер первого незанятого сектора на дискете + call x0396 ;печать числа в шестнадцатиричной системе счисления + rst #20 + dc "/" + ld a,(xE5A9+#E2) ;Номер дорожки первого незанятого сектора + call x0396 ;печать числа в шестнадцатиричной системе счисления + rst #20 + db ")",#0D,#8D +;печать списка файлов на диске (одна страница не более 16 имён) +x02EE ld b,#10 +x02F0 push bc + rst #30 + dw rom7_x1166 ;загрузка очередного дескриптора файла в буфер + db #07 + pop bc + jp c,x0382 ;ошибка чтения + ld a,(hl) + or a + jp z,x037B ;больше нет файлов + push bc + dec a + jr nz,x0312 ;это не удаленнй файл +; печать первого сивола удаленного файла + inc hl + bit 4,(iy+#09) + ld a,#82 + jr z,x030D ;печать на экран + ld a,"?" +x030D rst #10 + ld b,#07 + jr x0314 +; печать имени файла +x0312 ld b,#08 +x0314 rst #30 + dw rom2_x15B9 ;печать сообщения из hl с заменой непечатных символов на ? + db #02 +; печать типа файла + rst #20 + dc " <" + ld a,(hl) + inc hl + rst #10 + rst #20 + dc ">" +; печать стартового адреса и длины файла + ld b,#02 +x0322 push bc + ld c,(hl) + inc hl + ld b,(hl) + inc hl + push hl + rst #30 + dw rom2_x1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом + db #02 + pop hl + pop bc + djnz x0322 + rst #20 + dc " " +; печать размера в секторах + ld a,(hl) + inc hl + push hl + call x03A1 ;печать числа в десятичной системе счисления + pop hl + ld a,#1E + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 +; печать номера первого сектора и дорожки + ld b,#02 +x0341 push bc + rst #20 + dc " " + ld a,(hl) + inc hl + push hl + call x0396 ;печать числа в шестнадцатиричной системе счисления + pop hl + pop bc + djnz x0341 + rst #20 + db #8D + pop bc + djnz x02F0 + rst #30 + dw rom2_x35D3 ;сравнение ix=xE075 + db #02 +x0357 jr nz,x02EE ;продолжение вывода на принтер +; одидание нажатия клавиши для продолжения печати + rst #20 + dc "More..." + ld b,(ix+#00) + push bc + rst #30 + dw rom5_x0381 ;ожидание нажатия клавиш и обработка реакции на них + db #05 + pop bc + ld (ix+#00),b ;crd Y + ld (ix+#01),#00 ;crd X + cp #03 + jr nz,x0357 ;продолжаем вывод + ld a,#0A ;прерываем. break/cancel + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 +;больше нет файлов +x037B rst #20 + db #0D + dc "END" + jr x0387 +;ошибка чтения/записи +x0382 ld b,a + call x059A ;перевод строки и установка кода дисковой ошибки в переменной для печати числа + rst #08 +x0387 res 4,(iy+#09) + pop hl + ld (xFFD0),hl +x038F rst #30 + dw rom2_x3807 ;пауза 40416t + db #02 + jp x074A ;ожидание действий пользователя (опрос управления, вывод часов) + +;печать числа в шестнадцатиричной системе счисления +;вх: a - число +x0396 ld b,#00 + ld c,a + ld de,#1023 ;de - делитель для выделения разряда числа/код префикса + rst #30 + dw rom2_x162C ;печать числа в заданной системе счисления + db #02 + ret + +;АДРЕС: #03A1 печать числа в десятичной системе счисления +;вх: a - число +x03A1 ld c,a + ld b,#00 + rst #30 + dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом + db #02 + ret + +;АДРЕС: #03A9 форматирование/проверка текущей дискеты +x03A9 call x060E ;предложение начать работу с диском (Insert disk, press Y key) + ld d,#27 ;39 + bit 5,a + jr z,x03B4 ;дискета на 40 дорожек + ld d,#4F ;79 +x03B4 ld bc,#0010 ;чтение спецификации дискеты + call x0667 ;вызов функции R8DOS + ld e,#01 + rlca + jr c,x03C1 ;двусторонняя +x03BF ld e,#00 +x03C1 push de + ld (ix+#01),#00 ;crd X + rst #30 + dw rom2_x2A85 ;очистка знакоместной строки по координатам курсора + db #02 + pop bc + push bc + ld (iy+#07),#01 ;минимум разрядов в числе при переводе в ASCII + ld c,b + ld b,#00 ;номер дорожки + rst #30 + dw rom2_x166E ;печать десятичного числа bc [0..65535] с ведущими пробелами + db #02 + rst #20 + dc "/" + pop bc + push bc + ld b,#00 ;номер стороны + rst #30 + dw rom2_x166E ;печать десятичного числа bc [0..65535] с ведущими пробелами + db #02 + call x05CE ;определение количества секторов на дорожке +;печать графического отображения текущей дорожки + ld b,a ;количество секторов на дорожке + ld (ix+#01),#05 ;crd X + ld (ix+#0A),#08 ;размер символов в пикселях +x03ED push bc + ld a,#10 + rst #30 + dw rom2_x2800 ;печать символа в окне + db #02 + pop bc + djnz x03ED + ld (ix+#0A),#06 ;размер символов в пикселях + rst #20 + db #8D + bit 7,(iy+#13) + jr z,x0411 ;проверка дискеты +;форматирование дискеты + rst #20 + dc "Formating." + call x05A2 ;печать количества отфрматированных/сбойных секторов +x0411 pop de + push de + ld a,e + ld c,#0E ;физическое позиционирование на трек, номер которого задан в регистре D + call x0667 ;вызов функции R8DOS + jr c,x047B ;ошибка чтения/записи + call x05CE ;определение количества секторов на дорожке + pop de +;формирование таблицы секторов с учётом interleaving + ld c,#00 + ld hl,xE5A9 + push hl +x0425 ld (hl),#00 + inc hl + ld (hl),d + inc hl + ld (hl),e + inc hl + inc c + ld (hl),#00 + inc hl + ld (hl),b + inc hl + cp c + jr nz,x0425 + ld (hl),#FE + ex de,hl + push hl + ld c,#01 +x043B ld hl,xE5A9+#03 + ld b,#00 +x0440 ld a,(hl) + or a + jr nz,x0449 + ld (hl),c + inc c + inc b + jr x0450 +x0449 call x0655 ;hl=hl+5: hl=de (z равны) + jr nc,x045D ;hl>=de + jr x0440 +x0450 ld a,(iy+#18) ;значение interleaving 1..26 +x0453 call x0655 ;hl=hl+5: hl=de (z равны) + jr nc,x045D + dec a + jr nz,x0453 + jr x0440 +x045D ld a,b + or a + jr nz,x043B + pop de + pop hl +;форматирование дорожки + push de + push hl + ld bc,#0010 ;чтение спецификации дискеты + call x0667 ;вызов функции R8DOS + pop hl + ld b,a + ld de,#5A85 + push de + ld c,#0B ;форматирование дорожки + or a + bit 7,(iy+#13) + call nz,x0667 ;вызов функции R8DOS +;проверка дорожки +x047B jp c,x058D ;ошибка чтения/записи + ld (ix+#01),#00 ;crd X + rst #20 + dc "Checking. " + call x05A2 ;печать количества проверенных/сбойных секторов + ld de,#0000 + ld hl,xE5A9 + push hl + ld c,#0C ;чтение дорожки + call x0667 ;вызов функции R8DOS + call c,x0587 ;ошибка чтения дорожки + call x05CE ;определение количества секторов на дорожке + pop hl + exx + pop hl + exx + ld de,(xDFFE) + ld bc,(xE000) +x04AE ld a,(hl) + cp #FE + jr z,x04C7 ;конец таблицы секторов + inc de + or a + ld a,#34 ;paper 6, ink 4 + jr z,x04BC ;сектор без ошибок + ld a,#32 ;paper 6, ink 2 + inc bc +x04BC exx + ld (hl),a + inc hl + exx + inc hl + inc hl + inc hl + inc hl + inc hl + jr x04AE +;следующая сторона/дорожка +x04C7 ld (xDFFE),de + ld (xE000),bc + ld (ix+#01),#0A ;crd X + call x05AA ;печать количества отформатированных/сбойных секторов + pop de + ld a,e + or a + jp nz,x03BF ;следующая сторона + dec d + ld a,d + cp #FF + jp nz,x03B4 ;следующая дорожка + jr x051B ;завершение форматирования/проверки дискеты + +;АДРЕС: #04E5 быстрое форматирование текущей дискеты (очистка каталога) +x04E5 call x060E ;предложение начать работу с диском (Insert disk, press Y key) + ld hl,#0A00 + bit 7,a + jr nz,x04F3 ;двухсторонняя дискета + srl h + rr l +x04F3 bit 5,a + jr nz,x04FB ;80 дорожек + srl h + rr l +x04FB ld (xDFFE),hl ;кол-во секторов + ld hl,#0000 + ld (xE000),hl + and #43 + cp #01 + jr nz,x0573 ;диск не tr-dos +; очищаем нулевую дорожку + call x0675 ;зануление #100 байт буфера xE5A9 + ld e,a +x050E push de + call x065F ;запись сектора из буфера xE5A9 + jp c,x058D ;ошибка чтения/записи + pop de + inc e + bit 4,e + jr z,x050E + +;завершение форматирования/проверки дискеты +x051B ld bc,#0010 ;чтение спецификации дискеты + call x0667 ;вызов функции R8DOS + ld e,a + and #43 ;%01000011 + cp #01 + jr nz,x0573 ;формат не tr-dos +; стандартная дискета tr-dos (формирование служебного сектора) + bit 7,(iy+#13) + jr z,x0573 ;провера дискеты + call x0675 ;зануление #100 байт буфера xE5A9 + ld a,#16 + bit 7,e + jr nz,x0539 ;двустронняя дискета + ld a,#18 +x0539 bit 5,e + jr nz,x053F ;80 дорожек на диске + or #01 +x053F ld (xE5A9+#E3),a ;Тип дискеты + ld hl,(xDFFE) + ld de,-#0010 + add hl,de + ld (xE5A9+#DF),hl + ld (xE5A9+#E5),hl ;Количество свободных секторов + ld hl,(xE000) + ld (xE5A9+#DD),hl + ld a,#10 + ld (xE5A9+#E7),a ;Идентификационный код TR-DOS (#10) + ld a,#01 + ld (xE5A9+#E2),a ;Номер дорожки первого незанятого сектора +; ввод имени дискеты + ld hl,xE5A9+#F5 + call x05E8 ;ввод имени диска + ld c,#07 ;идентификация диска + call x0667 ;вызов функции R8DOS + jr c,x058D ;ошибки чтения/записи + ld e,#08 + call x065F ;запись сектора из буфера xE5A9 + jr c,x058D ;ошибки чтения/записи +x0573 call x064D ;установка дескриптора окна + res 4,(iy+#09) ;вывод на экран + rst #20 + db #0D + dc "Complete" + jp x038F ;пауза 40416t и ожидание действий пользователя (опрос управления, вывод часов) + +;ошибка чтения дорожки +x0587 ld a,(xFFDD) ;код ошибки дискового интерпретатора + cp #14 ;были ошибки при чтении/записи дорожки (функции 12, 13) + ret z + +;ошибка чтения/записи +x058D ld b,#46 ;сообщение: stop format _число_ + call x059A ;перевод строки и установка кода дисковой ошибки в переменной для печати числа + rst #08 + call x038F ;пауза 40416t и ожидание действий пользователя (опрос управления, вывод часов) + rst #30 + dw rom5_x0EB5 ;печать текущего меню монитора + db #05 ;без возврата + +;перевод строки и установка кода дисковой ошибки в переменной для печати числа +x059A rst #20 + db #8D + ld c,#01 + call x066C ;установка кода дисковой ошибки в переменной для печати числа + ret + +;печать количества отфрматированных/сбойных секторов +x05A2 ld de,(xDFFE) + ld bc,(xE000) +x05AA push hl + push bc + push de + rst #20 + dc " Total " + pop bc + pop de + push bc + push de + rst #30 + dw rom2_x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами + db #02 + rst #20 + dc "/ Bad " + pop bc + push bc + rst #30 + dw rom2_x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами + db #02 + pop bc + pop de + pop hl + ret + +;определение количества секторов на дорожке +;вых: a - количество секторов на дорожке +; b - код размера сектора +x05CE ld bc,#0010 ;чтение спецификации дискеты + call x0667 ;вызов функции R8DOS + ld b,a + and #03 ;размер сектора в байтах 128/256/512/1024 + push af + bit 6,b + jr nz,x05DE ;метод записи MFM + add a,#04 +x05DE ld d,#00 + ld e,a + pop bc + ld hl,(xFFC8) ;адрес таблицы с количеством секторов на дорожке + add hl,de + ld a,(hl) + ret + +;ввод имени диска +;вых: cy=1 ввод отменен +x05E8 push hl + ld b,#08 +x05EB ld (hl)," " + inc hl + djnz x05EB + ld a,#89 + call x06AD ;ввод текстовой строки внизу экрана + jr c,x060B ;ввод отменен + jr z,x060B ;пустая строка + pop de + push de + ld bc,#0008 +x05FE ld a,(hl) + cp " " + jr c,x0608 + ldi + jp pe,x05FE +x0608 or a + pop hl + ret +x060B scf + pop hl + ret + +;предложение начать работу с диском (Insert disk, press Y key) +x060E call x064D ;установка дескриптора окна + rst #20 + db #8C ;очистка окна + rst #20 + db #1B,#00,#0A ;установка координат + dc "Insert disk, press Y key" + rst #30 + dw rom5_x0381 ;ожидание нажатия клавиш и обработка реакции на них + db #05 + pop hl + jr c,x063A + cp #0D + jr z,x063F ;выбор курсором. начинаем работу +x063A and #5F + cp "Y" + ret nz ;нажата другая клавиша +x063F push hl + rst #30 + dw rom7_x1065 ;инициализация дисковода + db #07 + ld (ix+#00),#15 ;crd Y + ld bc,#0010 ;чтение спецификации дискеты + jr x0667 ;вызов функции R8DOS + +;АДРЕС: #064D установка дескриптора окна: запрос на запись MBR +;вых: ix - адрес дескриптора окна запрос на запись MBR +x064D ld hl,xE0D7 + rst #30 + dw rom2_x301C ;ix = адрес дескриптора окна монитора из hl + db #02 + ret + +;АДРЕС: #0655 hl=hl+5: hl=de (z равны) +x0655 inc hl + inc hl + inc hl + inc hl + inc hl + or a + sbc hl,de + add hl,de + ret + +;запись сектора из буфера xE5A9 +x065F ld hl,xE5A9 + ld d,#00 + ld bc,#0106 + +;АДРЕС: #0667 вызоф функции R8DOS +x0667 rst #30 + dw rom7_x0229 ;вызов функции R8DOS + db #07 + ret + +;АДРЕС: #066C установка кода дисковой ошибки в переменной для печати числа +x066C ld hl,(xFFDD) ;l - код ошибки дискового интерпретатора + ld h,#00 + ld (xDDA7),hl ;установим код ошибки в переменной для печати числа + ret + +;АДРЕС: #0675 зануление #100 байт буфера xE5A9 +x0675 ld hl,xE5A9 + +;АДРЕС: #0678 зануление #100 байт памяти с hl +;вх: hl - адрес начала памяти +x0678 xor a + ld b,a +x067A ld (hl),a + inc hl + djnz x067A + ret + +;АДРЕС: #067F сохранение экрана пользователя на диск +x067F ld a,#89 ;сообщение: enter name + call x06AD ;ввод текстовой строки внизу экрана + jr c,x06C1 ;ввод отменен + jr z,x06C1 ;пустая строка + ld b,#02 ;файл для записи + rst #30 + dw rom7_x11D4 ;открытие файла для внутренних нужд + db #07 + jr c,x06A6 ;ошибка открытия файла + rst #30 + dw rom2_x3A21 ;копирование активного экрана пользователя в #4000 + db #02 + ld hl,#4000 + ld bc,#1B00 + rst #30 + dw rom2_x3107 ;запись области памяти в файл + db #02 + jr c,x06A6 ;ошибки записи + rst #30 + dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 + db #07 + jr nc,x06C1 ;ошибокнет. выход + +;АДРЕС: #06A6 печать сообщения об ошибке и продолжение работы монитора +;вх: a - номер сообщения из блока 0 +x06A6 call x066C ;установка кода дисковой ошибки в переменной для печати числа +x06A9 rst #30 + dw rom2_x3870 ;печать сообщения и продолжение работы текущего меню монитора + db #02 ;(без возврата) + +;АДРЕС: #06AD ввод текстовой строки внизу экрана +;вх: 7,a =1/0 атрибуты bright 1, paper 3, ink 4/bright 0, paper 5, ink 2 +; 6-0,a - номер сообщения из блока 0 +;вых: cy=1 ввод отменен +; cy=0 строка введена +; z - введена пустая строка +x06AD rst #30 + dw rom5_x1C73 ;ввод текстовой строки в нижней строке экрана + db #05 + jr nc,x06BA ;строка введена + cp #03 ;break/cancel ? + scf + ret z ;отмена ввода + xor a + jr x06AD ;продолжение ввода строки +x06BA rst #30 + dw rom2_x0EE3 ;поиск в буфере ввода строки первого печатного символа + db #02 + scf + ccf + ret + +;АДРЕС: #06С1 печать текущего меню монитора (без возврата) +x06C1 rst #30 + dw rom5_x0EB5 ;печать текущего меню монитора + db #05 ;переход без возврата + +;АДРЕС: #06C5 вывод в порт #FE содержимое ячейки (#7530) +x06C5 ld a,(#7530) + out (#FE),a + ret + +;АДРЕС: #06CB таблица соответствий нажатой клавиши печатному символу +x06CB db "ZXCV" + db "ASDFG" + db "QWERT" + db "12345" + db "09876" + db "POIUY" + db #0D,"LKJH" + db " ",#80,"MNB" + +;АДРЕС: #06F2 таблица кодов клавиш cs+1+клавиша +x06F2 db #1A,#18,#03,#16 + db #01,#13,#04,#06,#07 + db #11,#17,#05,#12,#14 + db #FF,#FF,#FF,#FF,#FF + db #FF,#FF,#FF,#FF,#FF + db #10,#0F,#09,#15,#19 + db #FF,#0C,#0B,#0A,#08 + db #00,#FF,#0D,#0E,#02 + +;АДРЕС: #0719 таблица кодов клавиш ss+клавиша (ss+cs =#03) +x0719 db ":`?/" + db #8A,#8B,#8E,#8C,#8D + db #1C,#1D,#1E,"<>" + db "!@#$%" + db "_)('&" + db #22,";",#1F,"][" + db #FF,"=+-^" + db #82," .,*" + +;АДРЕС: #0740 таблица кодов клавиш cs+цифра +x0740 db #FF ;cs+1 + db #81 ;cs+2 + db #87 ;cs+3 + db #88 ;cs+4 + db #85 ;cs+5 + db #7F ;cs+0 + db #89 ;cs+9 + db #83 ;cs+8 + db #84 ;cs+7 + db #86 ;cs+6 + +;АДРЕС: #074A ожидание действий пользователя (опрос управления, вывод часов) +;вых: a - код нажатой клавиши +; +x074A call x078B ;сброс буфера клавиатуры +x074D ld hl,xE02E ;печать времени и даты + bit 0,(hl) + jr z,x075B + di + res 0,(hl) + rst #30 + dw rom5_x1A4C ;печать даты и времени в окне монитора + db #05 +x075B ei + call x0773 ;проверка наличия нажатых клавиш в буфере клавиатуры + jr z,x074D ;буфер пустой + di + ex de,hl + ld a,(de) ;читаем код клавиши из буфера + inc de + call x0780 ;проверка достижения конца буфера клавиатуры + ld (xE118),de + push af ;код клавиши + rst #30 + dw rom5_x0176 ;восстановление экрана под курсором мыши + db #05 + pop af + ret + +;АДРЕС: #0773 проверка наличия нажатых клавиш в буфере клавиатуры +;вых: z - буфер пустой +; de - очередной адрес в буфере +; hl - адрес начала буфера +; +x0773 ld de,(xE116) + +;АДРЕС: #0777 проверка наличия нажатых клавиш в буфере клавиатуры +;вх: de - адрес в буфере клавиатуры +;вых: z - буфер пустой +; hl - адрес начала буфера +; +x0777 ld hl,(xE118) + or a + push hl + sbc hl,de + pop hl + ret + +;АДРЕС: #0780 проверка переполнения буфера клавиатуры +;вх: de - очередной адрес в буфере клавиатуры +;вых: cy =0 адрес в пределах буфера +; =1 буфер переполнен. сброс буфера +; de - адрес начала буфера +; +x0780 ld hl,xE38F+#0A ;xE399 + or a + sbc hl,de + ret nc + ld de,xE38F + ret + +;АДРЕС: #078B сброс буфера клавиатуры +; +x078B ld hl,(xE118) + ld (xE116),hl + ret + +;АДРЕС: #0792 опрос клавиатуры и установка кода нажатой клавиши в буфере +; +x0792 call x07B2 ;опрос клавиатуры и установка кода нажатой клавиши + ld hl,xE005 + bit 2,(hl) + ret z ;ничего не нажато + ld a,(xE006) ;код клавиши + res 2,(hl) +x07A0 ld de,(xE116) ;помещение кода клавиши в буфер клавиатуры + ld (de),a + inc de ;нажатую клавишу в буфер клавиатуры + call x0780 ;проверка переполнения буфера клавиатуры + call x0777 ;проверка не был ли сброшен буфер + ret z ;буфер пустой + ld (xE116),de ;очередной адрес в буфере + ret + +;АДРЕС: #07B2 опрос клавиатуры и установка кода нажатой клавиши +;вых: a - код нажатой клавиши, если нажата +; +x07B2 call x0845 ;опрос клавиатуры + jr z,x07BA ;ничего не нажато + call x086A ;определение кода нажатой клавиши/комбинации клавиш +x07BA ld hl,xE005 + jr nz,x07C4 ;что-то нажато +x07BF res 0,(hl) ;автоповтор не активен +x07C1 res 1,(hl) ; + ret +x07C4 bit 0,(hl) + jr nz,x07D5 ;не первое нажатие, проверим возможность автоповтора + set 0,(hl) ;первое нажатие + ld (xE007),a + ld hl,(xE051) ;период автоповтора + ld h,l + ld (xE051),hl + ret +x07D5 ld e,a ;код клавиши + ld a,(xE007) + cp e + jr nz,x07BF ;другая клавиша, сброс счетчика автоповтора + bit 1,(hl) + jr nz,x0834 ;работает автоповтор + ld de,(xE051) ;счетчик периода автоповтора + dec d + ld (xE051),de + ret nz + set 1,(hl) ;активируем автоповтор + ld e,a ;код клавиши + ld a,(xE04E) ;антидребезговая задержка + ld (xE050),a + ld a,e +;обработка нажатой клавиши +x07F4 cp #80 + jr nz,x0804 + ld a,%01000000 ;cs+ss +x07FA xor (hl) + ld (hl),a + ld a,(xE04E) + ld (xE052),a + jr x07C1 +x0804 cp #81 + jr nz,x080C + ld a,#80 ;cs+2 + jr x07FA +x080C cp #82 + jr nz,x0817 + call x0916 ;ss+space + ld a,#00 + jr x07FA +;установка кода нажатой клавиши в переменную +x0817 bit 2,(hl) + ret nz + bit 5,(hl) + jr z,x082E ;???? возможно для ввода кириллицы + cp #40 + jr c,x082E ;a=[#00..#3F] + cp #80 + jr nc,x082E ;a=[#80..#FF] + cp #60 + jr nc,x082C ;a=[#60..#7F]+#60 + add a,#40 ;a=[#40..#5F]+#40+#60 +x082C add a,#60 +x082E ld (xE006),a ;код клавиши + set 2,(hl) + ret +x0834 ld de,(xE04F) ;счетчик автоповтора + dec d + ld (xE04F),de + ret nz ;до срабатывания автоповтора еще рано + ld d,e + ld (xE04F),de + jr x07F4 + +;АДРЕС: #0845 опрос клавиатуры +;вых: z - нажато много клавиш/не нажато ни одной +; nz - что-то нажато +; hl - адрес в буфере последней нажатой клавиши +; d - кол-во нажатых клавиш: =4 -> 1, =3 -> 2, =2 -> 3, =1 -> 4, +;соответсвие клавиш скан-кодам +;12345 67890 +;QWERT YUIOP +;ASDFG HJKLe +;cZXCV BNMss +; +;0F 10 11 12 13 18 17 16 15 14 +;0A 0B 0C 0D 0E 1D 1C 1B 1A 19 +;05 06 07 08 09 22 21 20 1F 1E +;00 01 02 03 04 27 26 25 24 23 +; +x0845 ld bc,#FEFE + ld hl,xDFEA-1 + ld de,#05FF +x084E in a,(c) + push bc + ld b,#05 +x0853 inc e + rrca + jr c,x085F ;не нажата + dec d + inc sp + inc sp + ret z + dec sp + dec sp + inc hl + ld (hl),e +x085F djnz x0853 + pop bc + sli b + jr c,x084E + ld a,d + sub #05 + ret + +;АДРЕС: #086A определение кода нажатой клавиши/комбинации клавиш +;вх: hl - адрес в буфере последней нажатой клавиши +; d - кол-во нажатых клавиш: =4 -> 1, =3 -> 2, =2 -> 3, =1 -> 4 +;вых: z - клавиша/комбинация клавиш не функциональна +; nz - на клавише/комбинации клавиш есть функция +; a - код нажатой клавиши/комбинации клавиш +; +x086A ld e,(hl) + ld a,d + sub #02 + jr z,x08AE ;нажато 3 клавиши + jr c,x088E ;нажато 4 клавиши + rra + jr c,x08C6 ;нажато 2 клавиши +;нажата 1 клавиша + ld a,e + or a + ret z ;нажата CapsShift + cp #24 + ret z ;нажата SymbolShift + ld d,#00 + ld hl,x06CB-1 ;таблица соответствий нажатой клавиши печатному символу + add hl,de + ld a,(hl) + cp #3A + ret c ;это не буква + ld hl,xE005 + bit 7,(hl) + ret nz + add a,#20 ;переводим в нижний регистр + ret +;нажато 4 клавиши +x088E ld hl,xDFEA + ld a,(hl) + or a + jr nz,x08C4 ;cs не нажата + inc hl + ld d,(hl) + inc hl + ld a,(hl) + cp #0F + jr nz,x08C4 ;cs+1 не нажата + ld a,e + sub #0F + cp d + jr nz,x08C4 +;cs+1+клавиша +x08A3 ld e,a + ld d,#00 + ld hl,x06F2-1 +x08A9 add hl,de + ld a,(hl) +;cs+цифра/ss +x08AB cp #FF ;это cs+1? + ret +;нажато 3 клавиши +x08AE ld hl,xDFEA ;буфер нажатых клавиш + ld a,(hl) + or a + jr nz,x08C4 ;cs не нажата + inc hl + ld a,(hl) + cp #0F + jr nz,x08BF ;1 не нажата + inc hl +x08BC ld a,(hl) + jr x08A3 ;cs+1+клавиша +x08BF ld a,e + cp #0F + jr z,x08BC ;cs+1+клавиша +x08C4 xor a ;неизвестная комбинация + ret +;нажато 2 клавиши +x08C6 dec hl + ld a,(hl) ;код первой клавиши + or a + jr z,x08DC ;это CapsShift + cp #24 + jr z,x08D5 ;это SymbolShift + ld a,e + ld e,(hl) + cp #24 + jr nz,x08C4 ;вторая клавиша не SymbolShift +x08D5 ld d,#00 ;ss+клавиша + ld hl,x0719-1 + jr x08A9 +; комбинация с CapsShift +x08DC ld hl,x06CB-1 + ld a,e + cp #23 + jr z,x090F ;cs+space + cp #0F + jr c,x08F2 ;cs+буква + cp #19 + jr nc,x08F2 ;cs+буква/ss/enter + ld hl,x0740 ;cs+цифра + sub #0F + ld e,a +x08F2 ld d,#00 + add hl,de + ld a,(hl) + cp #3F + ret c ;если cs+enter + cp #7F + jr z,x0909 ;cs+0 + jr nc,x08AB ;cs+цифра/ss + ld hl,xE005 ;cs+буква + bit 7,(hl) + jr z,x0909 + add a,#20 ;CapsLock включен, переводим в нижний регистр + ret +x0909 cp #80 ;cs+ss + ret nz + cp #81 ;cs+2 + ret +;нажата cs+space +x090F call x078B + ld a,#03 + jr x0909 +;нажата ss+space (???режим рисования рамок) +;hl=xE005 +x0916 bit 5,(hl) + ld a,#05 + jr z,x091E + ld a,#07 +x091E ld (xE053),a ;цвет бордюра при подаче звукового сигнала + ret + +;продолжение RST #08:db #8B загрузка zs-snap с диска +x0922 db "bootm",#00 +;вх: a - номер дисковода 0..3 +x0928 ld a,(xDD7F+#01) ;xDD80 регистр A пользователя + add a,"A" + ld (de),a + inc de + ld a,":" + ld (de),a + inc de + push hl + ld hl,x0922 + ld bc,#0006 + ldir + pop hl + jr x095B + +;АДРЕС: #093F RST #08:db #8B загрузка zs-snap с диска +;вх: +1 =#00 используем имя bootm +; a - номер дисковода +;вх: +1 ="filename",#00 - имя файла +x093F ld b,#00 + ld hl,(xDD6B) ;pc программы пользователя + ld de,xEBF5 + rst #30 + dw rom2_x0028 ;чтение байта из памяти пользователя + db #02 + inc hl + or a + jr z,x0928 ;имя файла по умолчанию + +;читаем имя файла из памяти пользователя +x094F ld (de),a + inc de + or a + jr z,x095B + rst #30 + dw rom2_x0028 ;чтение байта из памяти пользователя + db #02 + inc hl + djnz x094F +x095B ld (xDD6B),hl ;новый pc программы пользователя + ld hl,xEBF5 ;адрес строки с именем файла + res 6,(iy+#13) ;чтение + res 5,(iy+#0B) ;функции вызываются из монитора + ld b,#01 + jr x098D ;чтение snap + +;АДРЕС: #096D копирование активного экрана пользователя в #4000 +x096D rst #30 + dw rom2_x3A21 ;копирование активного экрана пользователя в #4000 + db #02 + ret + +;АДРЕС: #0972 печать текущего меню монитора (без возврата) +x0972 rst #30 + dw rom5_x0EB5 ;печать текущего меню монитора + db #05 ;переход без возврата + +;АДРЕС: #0976 загрузка zs-snap (S. load ... snap) +x0976 res 6,(iy+#13) + ld b,#01 + jr x0984 + +;АДРЕС: #097E сохранение zs-snap (S. save ... snap) +x097E set 6,(iy+#13) + ld b,#02 +x0984 push bc + ld a,#89 + call x06AD ;ввод текстовой строки внизу экрана + pop bc + jr c,x0972 ;ввод отменен +x098D rst #18 + dw rom7_x11D4 ;открытие файла для внутренних нужд R8DOS #14 + jr c,x09B4 ;ошибка открытия файла + ld l,(ix+#0E) ;ix - адрес буфера fcb + ld h,(ix+#0F) ;l - номер первого сектора файла + ld (xE7C5),hl ;h - номер первой дорожки файла + bit 6,(iy+#13) + push af + call nz,x096D ;если запись файла, копирование активного экрана пользователя в #4000 + pop af + push af + jr nz,x09AE ;запись файла + +;чтение файла + rst #18 + dw rom7_x1365 ;последовательное чтение очередного сектора из файла R8DOS #1C + jr c,x09B4 ;ошибка открытия файла + jr x09BD + +;запись файла +x09AE ld bc,#0100 ;новый указатель + rst #18 + dw rom7_x1405 ;новое значение указателя в файле R8DOS #20 +x09B4 jp c,x06A6 ;ошибка чтения/записи + ld hl,xE8A9 ;заголовок файла + call x0678 ;занулим это заголовок (#100 байт) +x09BD pop af + ld hl,xE8A9 ;заголовок файла + call x0D6D ;установка/восстановление параметров заголовка zs-snap + rst #30 + dw rom2_x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 + ld a,#02 + bit 6,(iy+#13) + jr z,x09F6 ;чтение файла +;запись файла +; RAM 2 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без +; RAM 5 + ld a,#05 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + rst #30 + dw rom2_x0606 ;копирование страницы 5 в #8000 + db #02 + call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без + rst #30 + dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 +; RAM активная страница при входе в монитор + rst #30 + dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] + db #02 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + rst #30 + dw rom2_x0606 ;копирование страницы пользователя в #8000 + db #02 + call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без + jr x0A2D + +;чтение файла +x09F6 set 3,(iy+#13) + call x0B71 ;расчет начала битовой карты параграфов заданной страницы + call x0D01 ;определение адреса загрузки страницы в памяти + ld a,h + sub #80 + jr z,x0A0F ;пустая страница. не загружаем + inc a + ld b,a + ld c,#00 + rst #30 ;!!! можно через rst #18 вызвать + dw rom7_x1405 ;новое значение указателя в файле R8DOS #22 + db #07 + jr c,x0A86 ;ошибка чтения +; RAM 5 +x0A0F ld a,#05 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0BB6 ;загрузка страницы zs-snap с адреса #8000 + rst #30 + dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя + db #02 + rst #30 + dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 +; RAM активная при входе в монитор + rst #30 + dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] + db #02 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0BB6 ;загрузка страницы zs-snap с адреса #8000 + rst #30 + dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя + db #02 + +;проверка режима памяти 48k/128-256k +x0A2D rst #18 + dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 + jr c,x0A86 ;ошибки чтения/записи + bit 5,(iy-#02) + call nz,x0D59 ;включение режима 48k only + jp nz,x0A9D ;режим 48k only. завершение загрузки/сохранения zs-snap +;загрузка остальных страниц + ld (ix+#07),#2F + xor a + push af + call x0B41 ;откроем следующий файл zs-snap + pop af +x0A46 push af + cp #02 + jr z,x0A8B ;ram 2 уже сохранена + cp #05 + jr z,x0A8B ;ram 5 уже сохранена + cp #08 + jr z,x0A8B ;ram 8 не сохраняем + cp #09 + jr z,x0A8B ;ram 9 не сохраняем + rst #30 + dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 + ld l,a + rst #30 + dw rom2_x3707 ;сравнение страницы пользователя с заданной + db #02 + jr z,x0A8B ;страница пользователя уже загружена/сохранена +; загрузка/сохранение очередной страницы + ld a,l + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + bit 6,(iy+#13) + jr z,x0A75 ;загрузка страницы + rst #30 + dw rom2_x0606 ;копирование страницы пользователя в #8000 + db #02 + call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без + jr x0A7C +x0A75 call x0BB6 ;загрузка страницы zs-snap с адреса #8000 + rst #30 + dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя + db #02 +x0A7C ld a,(xE7A9+#14) ;указатель в файле (старший байт) + cp #BE + jr c,x0A8B + rst #18 + dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 +x0A86 jr c,x0AB0 ;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход + call x0B41 ;откроем следующий файл zs-snap +;следующая страница +x0A8B pop af + inc a + cp #10 + jr c,x0A46 ;еще не все загружено + ld hl,(xE7A9+#13) ;указатель в файле (младший байт) + ld a,h + or e + jr z,x0A9D + rst #18 + dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 + jr c,x0AB0 ;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход + +;завершение загрузки/сохранения zs-snap +x0A9D bit 6,(iy+#13) + jr z,x0AB2 ;чтение файла +; запись заголовка zs-snap + ld hl,xE8A9 ;адрес заголовка + ld de,(xE7C5) ;номер первого сектора/дорожки файла + ld bc,#0106 + rst #18 + dw rom7_x0229 ;вызов функции R8DOS +x0AB0 jr c,x0B2E ;ошибки записи +; чтение файла +x0AB2 call x0AC8 ;загрузка RAM 2 из файла zs-snap + bit 6,(iy+#13) + ret nz ;запись zs-snap +x0ABA bit 2,(iy+#14) + ret nz ; + rst #30 + dw rom2_x013A ;выход из монитора + db #02 ;без возврата + +;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя +x0AC3 rst #30 + dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 + ret + +;загрузка RAM 2 из файла zs-snap +x0AC8 ld hl,(xE7C5) ;номер первого сектора/дорожки файла zs-snap + inc l ;следующий сектор + bit 4,l + res 4,l + jr z,x0AD3 + inc h ;следующая дорожка +x0AD3 ld (xE7C5),hl + ld a,#02 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0D01 ;определение адреса загрузки страницы в память/кол-ва секторов + bit 7,(iy+#13) + jr z,x0B10 ;без компрессии +; с компрессией + ld a,(de) + ld (xE33B),a ;размер в секторах запакованной страницы + ld a,h + sub #80 + jr nz,x0AF2 ;надо что-то загрузить + call x0BC8 ;страница пустая. заполнение памяти [#8000..#BFFF] байтом #00 + jr x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя и выход +; загружаем запакованную страницу +x0AF2 ld hl,x0C50 ;процедура загрузки секторов страницы в буфер xE5A9 + call x0D60 ;установка п/п jp x0C50 по адресу xE338 + ld hl,xE5A9 ;адрес буфера откуда распаковывать + ld de,xE5A9+#200 ;первая свободная ячейка в буфере (de-hl длина запакованного блока) + exx + ld hl,#8000 ;адрес куда распаковывать + call x1108 ;загрузка и распаковка блока длиной #100 + ld hl,#4000 + or a + sbc hl,bc + jr z,x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя и выход + jp x0BEF ;ошибка. размер распакованного блока не равен размеру страницы +; без компрессии +x0B10 push hl + ld a,h + sub #80 + jr z,x0B28 ;пустая страница +; загружаем страницу + push de + ld b,a ;количество секторов + ld hl,#8000 + ld de,(xE7C5) ;номер первого сектора/дорожки странцы zs-snap + ld c,#05 + rst #18 + dw rom7_x0229 ;вызов функции R8DOS. загрузка секторов + jp c,x0B3B ;ошибки чтения + pop de +x0B28 pop hl + call x0C0C ;распределение загруженной страницы по памяти с учетом пустых параграфов + jr x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя и выход + +;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход +x0B2E push af + rst #30 + dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] + db #02 + cp #02 + jr z,x0B3A ;2я страница уже сохранена + call x0AC8 ;загрузка RAM 2 из файла zs-snap +x0B3A pop af +x0B3B call x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + jp x06A6 ;печать сообщения об ошибке и продолжение работы монитора + +;формирование следующего имени файла для zs-snap +x0B41 push de + push hl + ld hl,xE7A9 ;буфер fcb + ld b,#07 +x0B48 ld a,(hl) ;замена пробелов в имени файла подчерками + cp " " + jr nz,x0B4F + ld (hl),"_" +x0B4F inc hl + djnz x0B48 + inc (ix+#07) ;последний символ имени файла +1 + ld hl,#0000 + ld (xE7A9+#13),hl ;стартовый адрес + ld (xE7A9+#0C),hl ;адрес буфера dma + rst #18 + dw rom7_x11DF ;открыть файл для последующих операций с ним + ld hl,xE027 + set 3,(hl) + jr nc,x0B6E ;не было ошибок + bit 6,(hl) + jr nz,x0B2E ;ошибки при записи. восстановление RAM 2, печать сообщения и выход + res 3,(hl) +x0B6E pop hl + pop de + ret + +;АДРЕС: #0B71 расчет начала битовой карты параграфов заданной страницы +;вх: a - номер страницы +;вых: de - адрес начала битовой карты параграфов заданной страницы +x0B71 push hl + jr x0B9F + +;АДРЕС: #0B74 печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) +;вх: a - номер страницы +;вых: de - адрес начала битовой карты параграфов заданной страницы +x0B74 push hl + push ix + ld l,a + ld h,#00 + push af + rst #30 + dw rom2_x3732 ;установка страницы пользователя равной номеру страницы в L + db #02 + rst #30 + dw rom2_x3005 ;установка текущим окна: main menu + db #02 +x0B83 bit 6,(iy+#13) + ld hl,rom5_x1095 ;сообщение: Saved RAM bank_ + jr nz,x0B8F ;запись + ld hl,rom5_x10AB ;сообщение: Loaded RAM bank_ +x0B8F rst #30 + dw rom5_x1061 ;печать закодированного сообщения из hl + db #05 + pop af + push af + rst #30 + dw rom2_x16EC ;печать числа a=[#0..#F] + db #02 + rst #20 + db " " + db #82 ;восстановление атрибутов + pop af + pop ix +;a - номер страницы +x0B9F add a,a + add a,a + add a,a + ld hl,xE8A9+#40 ;xE8E9 + call x1103 ;сложение hl=hl+a + ex de,hl + pop hl + ret + +;ошибка: undefined file +x0BAB call x0AC8 ;загрузка RAM 2 из файла zs-snap + call x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + ld a,#54 ;ошибка undefined file + jp x06A9 ;печать сообщения об ошибке и продолжение работы монитора + +;загрузка страницы zs-snap с адреса #8000 +x0BB6 call x0D01 ;определение адреса загрузки страницы в память + bit 7,(iy+#13) + jr z,x0BF4 ;без компрессии +; с компрессией + ld a,(de) + ld (xE33B),a ;количество секторов для загрузки + ld a,h + sub #80 + jr nz,x0BD5 ;есть что загружать +;заполнение памяти [#8000..#BFFF] байтом в A +;вх: a - байт для заполнения +x0BC8 ld hl,#8000 + ld (hl),a + ld de,#8001 + ld bc,#3FFF + ldir + ret +;загрузка и распаковка страницы с компрессией +x0BD5 ld hl,x0C41 ;процедура загрузки секторов в буфер hl + call x0D60 ;установка п/п jp x0C41 по адресу xE338 + ld hl,xE5A9 + ld de,xE5A9+#200 + exx + ld hl,#8000 + call x1108 ;загрузка и распаковка блока длиной #100 + ld hl,#4000 + or a + sbc hl,bc + ret z ;загружена вся страница +;ошибка чтения/записи +x0BEF ld a,#55 + jp x06A9 ;печать сообщения об ошибке и продолжение работы монитора +;загрузка страницы без компрессии +x0BF4 push hl + ld a,h + sub #80 + jr z,x0C0B ;пустая страница +; загрузка страницы + push de + bit 3,(iy+#13) + jr z,x0BAB ;ошибка: undefined file + call x0CE3 ;установка размера буфера dma + rst #18 + dw rom7_x1360 ;R8DOS #1E(30) последовательное считывание заданного количества секторов +x0C07 jp c,x0B2E ;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход + pop de +x0C0B pop hl + +;распределение загруженной страницы по памяти с учетом пустых параграфов +;вх: hl - адрес загрузки +; de - адрес битовой карты следующей страницы (для незапакованного файла) +x0C0C push hl + ex de,hl + ld c,#01 + exx + pop hl + dec hl + ld de,#BFFF +x0C16 exx + dec c + jr nz,x0C1E + ld c,#08 + dec hl + ld b,(hl) +x0C1E rlc b + exx + jr c,x0C35 ;копируем параграф на свое место +; параграф пустой. зануляем его + push hl + ld h,d + ld l,e + dec de + ld bc,#00FF + ld (hl),#00 + lddr + pop hl + ld a,d + cp #7F + ret z ;конец страницы + jr x0C16 ;следующий параграф +; копируем параграф на свое место +x0C35 xor a + sbc hl,de + add hl,de + ret z ;конец страницы + ld bc,#0100 + lddr + jr x0C16 ;следующий параграф + +;загрузка секторов в буфер hl +;вх: (xE7C5) - дорожка/сектор откуда грузить +; hl - адрес загрузки +; b - размер блока в секторах +;вых: (xE7C5) - следующие дорожка/сектор +x0C41 ld (ix+#15),l + ld (ix+#16),h + call x0C7D ;вычисление размера блока для загрузки + rst #18 + dw rom7_x1360 ;R8DOS #1E(30) последовательное считывание заданного количества секторов + jr c,x0C07 ;ошибка чтения + ret + +;загрузка секторов в буфер hl +;вх: (xE7C5) - дорожка/сектор откуда грузить +; hl - адрес загрузки +; b - размер блока в секторах +;вых: (xE7C5) - следующие дорожка/сектор +x0C50 push hl + call x0C7D ;вычисление размера блока для загрузки + ld de,(xE7C5) ;дорожка/сектор + push de + ld a,b + and #F0 + rrca + rrca + rrca + rrca + add a,d + ld d,a + ld a,b + and #0F + add a,e + bit 4,a + jr z,x0C6B + inc d +x0C6B and #0F + ld e,a + ld (xE7C5),de ;следующие дорожка/сектор + pop de + ld c,#05 + pop hl + rst #18 + dw rom7_x0229 ;вызов функции R8DOS. загрузка блока секторов + jp c,x0B3B ;ошибка загрузки + ret + +;вычисление размера блока для загрузки +;вх: (xE33B) размер блока в секторах +; b - размер блока в секторах +;вых: (xE33B) оставшийся размер блока в секторах +; b - размер блока в секторах для загрузки +x0C7D ld hl,xE33B + ld a,(hl) + or a + jp z,x0BEF ;ошибка. нечего загружать + sub b + jr nc,x0C8A + ld b,(hl) + xor a +x0C8A ld (hl),a + ret + +;запись страницы с адреса #8000 на диск, с компрессией/без +;вх: de - адрес начала битовой карты параграфов +x0C8C bit 5,(iy+#13) + jr z,x0CD5 ;компрессия отключена +;запись с компрессией + inc de + ex de,hl + ld (xE33B),hl + xor a + ld (hl),a + ld hl,#8000 + ld bc,#4000 +x0C9F cpi + jr nz,x0CA7 ;в странице есть ненулевые байты + jp pe,x0C9F ;еще не конец + ret +; в странице есть ненулевые байты +x0CA7 ld hl,x0CED ;адрес процедуры + call x0D60 ;установка п/п jp x0CED по адресу xE338 + ld hl,xE5A9 + ld de,xE5A9+#100 + exx + ld hl,#8000 + ld e,(iy+#26) ;размер окна сжатия для снапа + ld d,l + ld b,#03 +x0CBD sla e + rl d + djnz x0CBD + ld bc,#4000 + call x0F60 ;запаковка блока +;hl - адрес запакованного блока +;bc - размер запакованного блока + ret z ;пустая страница + ld a,c + or a + jr z,x0CCF + inc b +x0CCF call x0CED ;запись запакованой страницы + dec hl + ld (hl),c ;количество байт в последнем секторе =#00 - 256 байт + ret +;компрессия отключена +;вх: de - адрес начала битовой карты параграфов +x0CD5 call x0D20 ;уплотнение памяти, за счет пустых параграфов + ret z ;страница пустая + call x0CE3 + rst #18 + dw rom7_x1390 ;R8DOS #1F(31) последовательная запись заданного количества секторов +x0CDF jp c,x0B2E ;ошибка + ret +;установка размера области +;вх: a - кол-во параграфов с учетом уплотнения +x0CE3 ld b,a + ld (ix+#15),#00 + ld (ix+#16),#80 + ret +;запись запакованой страницы +;вх: ix - адрес буфера fcb +; b - число записываемых секторов +; hl - адрес запакованного блока +x0CED ld (ix+#15),l + ld (ix+#16),h + push bc + rst #18 + dw rom7_x1390 ;R8DOS #1F(31) последовательная запись заданного количества секторов + jr c,x0CDF ;ошибка записи + pop bc + ld hl,(xE33B) ;адрес начала битовой карты параграфов + ld a,b + add a,(hl) + ld (hl),a ;количество секторов в запакованной странице + ret + +;определение адреса загрузки страницы в памяти +;вх: de - адрес битовой карты параграфов для текущей страницы +;вых: h =#80+кол-во секторов страницы (для запакованного файла) +; hl - адрес начала загрузки (для незапакованного файла) +; de - адрес битовой карты следующей страницы (для незапакованного файла) +; de - адрес ячейки с размером страницы в секторах (для запакованного файла) +x0D01 ld bc,#4001 + ld hl,#8000 + bit 7,(iy+#13) + jr z,x0D12 ;без компрессии + inc de + ld a,(de) ;количество секторов + add a,h + ld h,a + ret +x0D12 dec c + jr nz,x0D19 + ld c,#08 + ld a,(de) + inc de +x0D19 rrca + jr nc,x0D1D + inc h +x0D1D djnz x0D12 + ret + +;уплотнение памяти [#8000..#BFFF], за счет пустых параграфов +;построение битовой карты параграфов в области [#8000..#BFFF] +;вх: de - адрес начала битовой карты параграфов +;вых: a - кол-во параграфов с учетом уплотнения +; z - вся область пустая +x0D20 ld c,#08 + ex de,hl + exx + ld hl,#8000 + ld d,h + ld e,l +x0D29 xor a ;проверка параграфа на ноль + ld b,a +x0D2B cp (hl) + jr nz,x0D46 ;не пустой + inc hl + djnz x0D2B +x0D31 exx ;все #100 байт =#00 + rra ;установка бита для карты параграфов + rr b + dec c + jr nz,x0D3C + ld c,#08 ;запись байта карты параграфов + ld (hl),b + inc hl +x0D3C exx + ld a,h + cp #C0 + jr nz,x0D29 + ld a,d + sub #80 + ret +x0D46 xor a ;уплотнение памяти, за счет пустых параграфов + ld l,a + ld c,a + ld b,a + sbc hl,de + add hl,de + jr z,x0D55 + inc b + ldir +x0D52 cpl + jr x0D31 +x0D55 inc h + inc d + jr x0D52 + +;АДРЕС: #0D59 включение режима 48k only +x0D59 push af + rst #30 + dw rom2_x0665 ;включение режима 48k only + db #02 + pop af + ret + +;АДРЕС: #0D60 установка п/п jp #addr по адресу xE338 +;вх: hl - адрес п/п +x0D60 push de + ex de,hl + ld hl,xE338 + ld (hl),#C3 + inc hl + ld (hl),e + inc hl + ld (hl),d + pop de + ret + +;АДРЕС: #0D6D установка/восстановление параметров заголовка zs-snap +;вх: z - чтение файла +; nz - запись файла +; hl,xE8A9 - буфер заголовка файла +x0D6D push af + jr nz,x0D93 ;запись файла +;чтение файла + ex de,hl + ld a,(de) + inc de + ld hl,xE027 + res 7,(hl) + cp #4D + jr z,x0D85 ;без компрессии + set 7,(hl) + cp #41 +x0D80 ld a,#55 + jp nz,x06A9 ;печать сообщения об ошибке и продолжение работы монитора +x0D85 ex de,hl + ld a,(hl) + and #FD + cp #31 + jr nz,x0D80 ;ошибка + ld a,(hl) + ld (iy-#12),a + jr x0DA8 +;запись файла +x0D93 ex de,hl + ld hl,xE027 + ld a,#4D ;=#4D - без компрессии + res 7,(hl) + bit 5,(hl) + jr z,x0DA3 ;compression off + ld a,#41 ;=#41 - с компрессией + set 7,(hl) +x0DA3 ex de,hl + ld (hl),a + inc hl + ld (hl),#33 +x0DA8 inc hl + pop af + ld de,xDD69 + ld bc,#001E + jr z,x0DB3 ;чтение файла + ex de,hl +x0DB3 ldir + jr nz,x0DB8 ;запись файла + ex de,hl +x0DB8 jr nz,x0DD9 ;запись файла + ld a,(de) + inc de + ld hl,xE02D + bit 7,(hl) + jr z,x0DCB ;турбо-режим не доступен + res 6,(hl) ;выключим турбо + bit 6,a + jr z,x0DCB ;в снапе турбо выключено + set 6,(hl) ;включим турбо +x0DCB ld a,(de) + im 1 ;установим режим прерываний + dec a + jr z,x0DD3 + im 2 +x0DD3 inc de + ld a,(de) + out (#FE),a ;установим бордюр + jr x0DF3 +;запись файла +x0DD9 ld a,(xE02D) + ld (de),a + inc de + push de + rst #30 + dw rom2_x3B75 ;определение типа прерываний im 1/2 + db #02 + pop de + ld (de),a + inc de + ld hl,#5800 + rst #30 + dw rom2_x0028 ;чтение байта из памяти пользователя + db #02 + rrca + rrca + rrca + and #07 + ld (de),a +x0DF3 inc de + bit 6,(iy+#13) + ld hl,x0E35 + ld b,#03 +x0DFD push bc + ld c,(hl) + inc hl + ld b,(hl) + inc hl + jr nz,x0E08 ;запись файла + ld a,(de) ;восстановление переменных + ld (bc),a + jr x0E0A +x0E08 ld a,(bc) ;сохранение переменных + ld (de),a +x0E0A inc de + pop bc + djnz x0DFD + bit 1,(iy-#12) + ret z +;чтение/сохранение регистров AY + ld b,#FF + dec de +x0E16 inc de + ld a,b +x0E18 inc a + cp #0E + ret nc + cp #07 + jr z,x0E18 + ld b,a + bit 6,(iy+#13) + jr nz,x0E2E ;запись файла + ld a,(de) + rst #30 + dw rom2_x03A7 ;Запись регистра AY + db #02 + jr x0E16 +x0E2E rst #30 + dw rom2_x03B6 ;чтение регистра AY + db #02 + ld (de),a + jr x0E16 +;адреса переменных +x0E35 dw xE004 ;адрес содержимого регистра 7 AY + dw xE012 ;адрес состояния порта #7FFD + dw xE013 ;адрес состояния порта #1FFD + +;АДРЕС: #0E3B загрузка из ROM-disk +;вх: h - номер страницы с файлом +; l - смещение в параграфах от начала ROM-disk в этой странице +x0E3B res 6,(iy+#13) + ld (xE000),hl ;сохраним координаты файла + ld hl,xE8A9 ;куда грузим (буфер dma в записи fcb) + ld (xE7BE),hl + ld b,#01 ;1 параграф. заголовок файла + push hl + call x0EE6 ;загрузка блока из ROM-disk + ld (xE7C5),hl ;hl - координаты следующего блока файла (RAM 2) + pop hl + bit 6,(iy+#13) + call x0D6D ;восстановление параметров из заголовка zs-snap + ld hl,xE012 + ld a,(hl) + ld (xE00C),a ;копия порта #7FFD + res 5,(hl) ;режим 128k + rst #30 + dw rom2_x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 + ld a,#02 ;номер страницы + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0F08 ;загрузка страницы из ROM-disk в память #8000 + ld a,#05 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0F08 ;загрузка страницы из ROM-disk в память #8000 + rst #30 + dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя + db #02 + rst #30 + dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 + rst #30 + dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] + db #02 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0F08 ;загрузка страницы из ROM-disk в память #8000 + rst #30 + dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя + db #02 + bit 5,(iy-#08) + jp nz,x0EC1 ;режим 48k. конец загрузки + xor a +x0E94 push af + cp #02 + jr z,x0EBB ;RAM 2 пропускаем + cp #05 + jr z,x0EBB ;RAM 5 пропускаем + cp #08 + jr z,x0EBB ;RAM 8 пропускаем + cp #09 + jr z,x0EBB ;RAM 9 пропускаем + rst #30 + dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 + ld l,a + rst #30 + dw rom2_x3707 ;сравнение страницы пользователя с заданной + db #02 + jr z,x0EBB ;RAM пользователя пропускаем + ld a,l + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0F08 ;загрузка страницы из ROM-disk в память #8000 + rst #30 + dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя + db #02 +x0EBB pop af + inc a + cp #10 + jr c,x0E94 +;загрузка страниц законцена. грузим RAM 2 +x0EC1 ld hl,(xE7C5) ;координаты страницы RAM 2 + ld (xE000),hl + ld a,#02 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0F08 ;загрузка страницы из ROM-disk в память #8000 + call x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + ld a,(xE00C) + ld (xE012),a + bit 5,a + call nz,x0D59 ;включение режима 48k only + jp x0ABA ;выход из монитора + +;АДРЕС: #0EE0 загрузка блока из ROM-disk +;вх: hl - адрес загрузки +; b - размер блока в секторах +;вых: hl - координаты следующего блока файла +; b - осталось незагруженных параграфов +x0EE0 ld (xE7A9+#15),hl ;xE7BE куда грузим + call x0C7D ;коррекция размера блока для загрузки + +;АДРЕС: #0EE6 загрузка блока из ROM-disk +;вх: b - кол-во параграфов для загрузки +;вых: hl - координаты следующего блока файла +x0EE6 xor a + ld hl,xDD99 ;формируем процедуру вызова п/п из страницы с ROM-disk + ld (hl),#F7 ;rst #30 + inc hl + ld (hl),#73 ;dw #0073 = romROMx0073 + inc hl + ld (hl),a + inc hl + ld (hl),a ;db #00 + inc hl + ld (hl),#C9 ;ret + ld hl,(xE000) ;координаты файла +x0EF9 ld a,h + ld (xDD9B+#01),a ;xDD9C плоскость и страница в которой выбранная прогармма + call xDD99 ;загрузка блока из ROM-Disk + inc b + dec b + jr nz,x0EF9 ;загрузка из следующей страницы + ld (xE000),hl ;координаты следующего блока файла + ret + +;АДРЕС: #0F08 загрузка страницы из ROM-disk в память #8000 +;вх: de - адрес битовой карты параграфов +x0F08 call x0D01 ;определение адреса загрузки страницы в памяти + bit 7,(iy+#13) + jr z,x0F38 ;без компрессии +; загрузка снапа с компрессией + ld a,(de) + ld (xE33B),a ;размер страницы в секторах + ld a,h + sub #80 + jp z,x0BC8 ;страница пустая. заполнение памяти [#8000..#BFFF] байтом #00 + ld hl,x0EE0 ;процедура для загрузки блока из ROM-disk + call x0D60 ;установка п/п jp x0EE0 по адресу xE338 + ld hl,xE5A9 ;буфер для распаковки + ld de,xE5A9+#200 + exx + ld hl,#8000 + call x1108 ;распаковка блока + ld hl,#4000 + or a + sbc hl,bc + ret z + jp x0BEF ;ошибка чтения/записи +; загрузка снапа без компрессии +x0F38 push hl + ld a,h + sub #80 + jr z,x0F4A ;нечего грузить + push de + ld b,a ;кол-во параграфов для загрузки + ld hl,#8000 + ld (xE7A9+#15),hl ;адрес загрузки + call x0EE6 ;загрузка блока в память + pop de +x0F4A jp x0C0B ;распределение загруженной страницы по памяти с учетом пустых параграфов + +;АДРЕС: #0F4D заполнение области памяти [#4000..#7FFF] пользователя +x0F4D ld hl,#4000 + xor a +x0F51 ld b,#00 +x0F53 rst #30 + dw rom2_x0000 ;запись байта в память пользователя (rst #00) + db #02 + inc hl + djnz x0F53 + inc a + cp #40 + ret z + jr x0F51 + +;АДРЕС: #0F60 запаковка блока +;вх: hl - адрес окуда запаковывать +; de - размер окна сжатия *8 +; bc - размер области запакорвки +; hl',de' - адреса буферов +x0F60 ld (xDD89),hl + exx + ld (xE9DF),hl + ld (xE9E1),de + call x10D0 ;bc'=hl; hl'=hl+1; de'=#0000 + ld a,c + or b + jp z,x1083 ;конец области сохранения + ld a,#01 + call x10B9 + ld a,(hl) + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + ld (iy-#15),#FF + res 0,(iy+#0E) + jr x0F89 +x0F86 pop hl +x0F87 pop bc + pop de +x0F89 inc hl + dec bc + ld (iy-#16),#00 + ld a,b + or a + jr nz,x0F9B ;не последний параграф + ld (iy-#15),c + ld a,c + or a + jp z,x1083 ;данных больше нет +x0F9B push de + push bc + push hl + ld b,d + ld c,e + bit 0,(iy+#0E) + jr nz,x0FB9 + ld de,(xDD89) + sbc hl,de + ld d,h + ld e,l + or a + sbc hl,bc + jr c,x0FB7 + set 0,(iy+#0E) +x0FB7 ld b,d + ld c,e +x0FB9 ld a,b + or c + jr z,x0FF2 + pop hl + ld a,(hl) + push hl + sbc hl,bc + cpir + jr nz,x0FF2 + pop de + push de + inc de + push bc + ld b,(iy-#15) + ld c,b + dec b + jr z,x0FDC +x0FD1 ld a,(de) + cp (hl) + inc hl + inc de + jr nz,x0FDC + djnz x0FD1 + jr x0FDC +x0FDB dec b +x0FDC ld a,c + sub b + cp (iy-#16) + pop bc + jr z,x0FB9 + jr c,x0FB9 + ld (iy-#16),a + ld (xDDA7),bc + cp (iy-#15) + jr nz,x0FB9 +x0FF2 ld bc,(xDDA7) + inc bc + ld a,(iy-#16) + cp #02 + jr c,x1076 + jr z,x1002 + jr x1009 +x1002 ld hl,#00FF + sbc hl,bc + jr c,x1076 +x1009 dec a + ld e,a + pop hl + call x1103 ;сложение hl=hl+a + ex (sp),hl + xor a + ld d,a + sbc hl,de + ex (sp),hl + push hl + xor a + call x10B9 + or a + ld hl,#00FF + sbc hl,bc + ld a,(iy-#16) + ld e,a + jr c,x1042 + cp #06 + jr nc,x1042 + dec e + dec e + xor a + call x10B9 + ld a,e + rrca + call x10B9 + ld a,e + call x10B9 + ld a,c + neg + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + jp x0F86 +x1042 push af + xor a + ld h,a + ld l,a + sbc hl,bc + inc a + call x10B9 + ld a,l + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + ld b,#05 +x1052 sra h + rr l + djnz x1052 + ld a,l + and #F8 + ld l,a + pop af + cp #0A + jr nc,x106A + dec a + dec a + or l + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + jp x0F86 +x106A push af + ld a,l + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + pop af + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + jp x0F86 +x1076 ld a,#01 + call x10B9 + pop hl + ld a,(hl) + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + jp x0F87 +;конец области сохранения +x1083 xor a + push af + call x10B9 + pop af + inc a + push af + call x10B9 + pop af + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + xor a + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + xor a + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + exx + ld a,#08 + sub d + jr z,x10A7 + push bc + ld b,a +x10A2 srl e + djnz x10A2 + pop bc +x10A7 ld a,e + ld (bc),a + ld de,(xE9DF) + or a + sbc hl,de + ex de,hl + ld c,e + ld b,d + ret +;запись байта в буфер ld (hl'),a; inc hl' +x10B4 exx + ld (hl),a + inc hl + exx + ret +x10B9 exx + rra + rr e + inc d + bit 3,d + exx + ret z + exx + ld a,e + ld (bc),a + ld de,(xE9E1) + or a + push hl + sbc hl,de + pop hl + jr nc,x10D8 +;установка регистров +;вх: hl - адрес буфера +;вых: bc'=hl +; hl'=hl+1 +; de'=#0000 +x10D0 ld c,l + ld b,h + inc hl + ld de,#0000 + exx + ret +x10D8 exx + push hl + push de + push bc + exx + ld de,(xE9DF) + push de + push de + sbc hl,de + push hl + ld l,#00 + push hl + ex de,hl + ld c,e + ld b,d + call xE338 + pop de + pop bc + pop hl + add hl,de + pop de + xor a + ld b,a + or c + jr z,x10FB + ldir +x10FB ex de,hl + exx + pop bc + pop de + pop hl + exx + jr x10D0 + +;АДРЕС: #1103 сложение hl=hl+a +x1103 add a,l + ld l,a + ret nc + inc h + ret + +;АДРЕС: #1108 распаковка блока +;вх: hl - адрес куда распаковывать +; hl' - адрес буфера откуда распаковывать +; de' - первая свободная ячейка в буфере (de-hl длина запакованного блока) +;вых: bc - размер распакованного блока +x1108 ld (xDD89),hl ;куда распаковывать + exx + ld (xE9DF),hl ;откуда распаковывать + ex de,hl + or a + sbc hl,de + ld (xE9E1),hl ;размер запакованного блока + call x1194 + exx + call x117A + ex de,hl +x111E call x1174 + jr nc,x112A + call x1185 + ld (de),a + inc de + jr x111E +x112A call x1174 + jr c,x114A + ld c,#00 + call x1174 + rl c + call x1174 + rl c + inc c + inc c + call x1185 + ld l,a + ld h,#FF +x1143 ld b,#00 + add hl,de + ldir + jr x111E +x114A call x1185 + ld l,a + call x1185 + ld c,a + or #07 + rrca + rrca + rrca + ld h,a + ld a,#07 + and c + inc a + inc a + ld c,a + cp #02 + jr nz,x1143 + call x1185 + ld c,a + or a + jr nz,x1143 + + ld hl,(xDD89) + push de + ex de,hl + sbc hl,de + ld c,l + ld b,h + pop de + ret +x1174 exx + srl e + dec d + exx + ret nz +x117A push af + call x1185 + exx + ld e,a + pop af + ld d,#08 + exx + ret +x1185 exx + ld a,b + or c + jr z,x118F +x118A ld a,(hl) + inc hl + dec bc + exx + ret +x118F call x1194 + jr x118A +x1194 exx + push hl + push de + push bc + exx + push de + ld hl,(xE9DF) + push hl + ld bc,(xE9E1) + push bc + call xE338 + pop bc + pop hl + pop de + exx + pop bc + pop de + pop hl + exx + ret + +;неиспользуемая область +x11AF ds #51,0 + +;АДРЕС: #1200 ROM-disk +x1200 INCBIN "prof_roms/rom6_ROMdisk.bin" + + SAVEBIN "../Build/scorp/NewROM6.bin",#0000,#4000 diff --git a/ProfRom_Disasm/rom6.bat b/ProfRom_Disasm/rom6.bat new file mode 100755 index 0000000..3991554 --- /dev/null +++ b/ProfRom_Disasm/rom6.bat @@ -0,0 +1,4 @@ +MkDir !bin +MkDir !log +DEL /Q !log\*.* +..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom6.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom7.a80 b/ProfRom_Disasm/rom7.a80 new file mode 100755 index 0000000..2f4fe78 --- /dev/null +++ b/ProfRom_Disasm/rom7.a80 @@ -0,0 +1,5903 @@ + DEVICE ZXSPECTRUM128 + INCLUDE "!AllConst.asm" + INCLUDE "!ram8.asm" + ORG #0000 +ROMdisk equ #2500 + +;#0000 *NOT USED* (#30 байт) +;#0030 rst #30 вызов процедуры из другого rom +;#0033 *NOT USED* (#05 байт) +;#0038 обработчик прерываний im 0/1 +;#0041 *NOT USED* (#25 байт) +;#0066 обработка NMI (зависание с желто-черным бордюром) +;#006F *NOT USED* (#01 байт) +;#0070 переменные ROM-disk +;#0073 загрузка блока из ROM-Disk +;не используется #00BF вероятно что-то для контроллера прерываний +;#00FF адрес п/п обработки прерываний im 2 +;#0101 номер текущего rom +;#0102 процедура обработки прерываний im 2 +;#010E вызов процедуры из другого rom +;не используется #0127 вызов процедуры из rom 2 call x0127: dw addr +;не используется #0146 работа с контроллером прерываний +;не используется #015F работа с контроллером прерываний +;не используется #0180 работа с контроллером прерываний +;не используется #018B работа с контроллером прерываний +;не используется #0193 работа с контроллером прерываний +;#01AF автостарт с дискеты +;#0229 вызов функции R8DOS +;#029C R8DOS #00(0) сброс контроллера +;#02BE код time-out +;без вызовов пока #02C8 уменьшение time-out на 1 для всех дисководов +;#02CA R8DOS #13(19) установка режима time-out для счетчика включения двигателя дисковода +;#02F6 проверка наличия диска в дисководе +;#0322 опрос Break и прерывание, если нажата +;#032B R8DOS #10(16) чтение/установка спецификации дискеты +;#0335 R8DOS #11(17) чтение кода спецификации дисковода +;#033A в hl адрес кода time-out для текущего дисковода +;#033F в hl адрес кода, определяющего номер дорожки в текущем дисководе +;#0344 в hl адрес кода, определяющего тип дискеты в текущем дисководе +;#0349 в hl адрес кода, определяющего тип текущего дисковода +;#0356 подготовка байта для выбора заданного дисковода +;#0366 проверка наличия образа в текущем дисководе +;#0394 проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу +;#03A2 установка номера дорожки для позиционирования +;#03C5 R8DOS #01(1) выбор текущего дисковода +;#03E4 инициализация текущего дисковода при необходимости +;#042C позиционирование на заданную дорожку +;#0430 поиск дорожки +;#0434 поиск дорожки с проверкой +;#0438 выдача команды в порт #1F ВГ93 +;#0441 ожидание готовности ВГ93 +;#0457 R8DOS #02(2) позиционирование на заданный логический трек +;#04D1 ошибка. прерывание функции +;#0502 R8DOS #0E(14) физическое позиционирование на трек +;#0546 R8DOS #12(18) в hl адрес таблицы с количеством секторов на дорожке +;#054A ошибка. неверный номер сектора +;#054E R8DOS #04(4) повторить в случае ошибки функцию 5 (или 6) +;#0553 R8DOS #05(5) чтение группы секторов +;#0557 R8DOS #06(6) запись группы секторов +;#05D8 R8DOS #03(3) игнорирование ошибки и продолжение выполнения функции 5 (или 6) +;#0610 чтение сектора +;#063B чтение данных с дискеты в память +;#066B чтение сектора образа HDD в память +;#0694 чтение сектора с винчестера в буфер xEFF5 +;#06B4 запись сектора +;#0708 запись сектора на образ HDD +;#074C расчет смещения от начала образа в секторах (512b) +;#0768 чтение заголовка сектора с позиционированием на заданную дорожку +;#076D чтение заголовка сектора +;#077F R8DOS #0A(10) построение таблицы расположения секторов на дорожке, начиная от индексного маркера +;#0824 позиционирование на заданную дорожку c тайим-аутом +;#084F R8DOS #07(7) идентификация диска +;#08D4 R8DOS #08(8) идентификация диска для tr-dos +;#0922 R8DOS #09(9) установка рабочего буфера для функции 8 +;#092F вычисление размера таблицы секторов +;#0948 R8DOS #0B(11) форматирование дорожки +;#0B52 преобразование кода размера сектора в байтах в число +;#0B67 R8DOS #0F(15) замена идентификатора в таблице расположения секторов +;#0B94 R8DOS #0C(12) чтение дорожки +;#0B98 R8DOS #0D(13) запись дорожки +;#0C83 опрос Break. cy=1 не нажата +;#0C98 остановка контроллера ВГ93 +;#0CAD таблица адресоф функций R8DOS +;#0CFF установка переменных дисковой BIOS +;#0D51 определение наличия SMUC +;#0D62 определение наличия NVRAM +;#0DA5 cy=1, a=#01 !!!Not Used!!! +;#0DA9 cy=1, a=#02 !!!Not Used!!! +;#0DAD чтение всей памяти NVRAM в память #7530 +;#0DB6 чтение данных из NVRAM +;#0DC7 запись всей памяти NVRAM из памяти #7530 +;#0DD0 запись данных в NVRAM +;#0E72 что-то пишет в NVRAM +;#0F55 для сравнения чисел +;#0F59 для сравнения чисел +;#0F5D деление hl=dehl'/bc +;#0FB7 умножение dehl=de'hl' * bc +;#0FF3 инкремент dehl +;#1003 копирование из (hl) в (de) 4х байт +;#100F загрузка числа в регистры из памяти +;#101D сложение 4х байтного числа с двухбатным +;#1035 сравнение двух чисел в памяти по адресам в de и hl +;#1065 инициализация дисковода +;#107B инициализация дисковода и настройка на дискету +;#10A4 распознавание имени файла и занесение его в fcb +;#111E R8DOS #19(25) физический поиск файла, указанного в fcb, в каталоге диска +;#1125 R8DOS #1A(26) продолжает поиск файла, указанного в fcb. !!!ОШИБКА!!! маски, после первого поиска больше нету +;#114E загрузка дескриптора файла в буфер +;#1166 загрузка очередного дескриптора файла в буфер +;#11A7 получение адреса байта в буфере dma +;#11B0 R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) +;#11D4 открыть файл(для нужд монитора) для последующих операций с ним +;#11DB R8DOS #14(20) открыть файл для последующих операций с ним +;#11DF открыть файл для последующих операций с ним +;#1240 R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". +;#128C R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" +;#12FF установка в fcb указателя в файле из bc +;#1307 R8DOS #15(21) закрыть файл, открытый функцией 20 +;#1360 R8DOS #1E(30) последовательное считывание заданного количества секторов +;#1365 R8DOS #1C(28) последовательное чтение очередного сектора из файла +;#1390 R8DOS #1F(31) последовательная запись заданного количества секторов +;#1395 R8DOS #1D(29) последовательная запись одного сектора из памяти +;#13D5 создание записи в каталоге диска (на основе fcb) +;#1405 установка нового значения указателя в файле +;#1407 R8DOS #20(32) установка нового значения указателя в файле +;#1472 чтение сектора в буфер dma +;#1484 сохранение буфера dma в файл +;#148D чтение секторов в буфер dma +;#1498 запись секторов из буфера dma +;#14A0 расчет адреса в файле на диске (дорожка и сектор) +;#14A6 расчет нового номера дорожки и сектора +;#14C0 R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl +;#153D копирование дескриптора дисковода в буфер +;#1545 R8DOS #21(33) чтение из fcb в bc указателя файла +;#154C чтение из fcb в hl длины файла +;#1553 чтение из fcb в hl адреса буфера dma +;#155A чтение заголовка первого попавшегося сектора дисковода A +;#1567 чтение одного сектора нулевой дорожки в буфер (e - номер сектора) +;#1572 определение наличия interrupt controller +;#15C7 определение наличия последовательного порта/модема +;#16B9 работа с контроллером прерываний +;не используется #1738 работа с контроллером прерываний +;#1768 поиск раздела MFS +;#17BB чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела +;#17EF запись 2х секторов из буфера xEBF5 +;#1813 чтение сектора с винчестера +;#1829 запись сектора на винчестер +;#1848 расчет номера сектора на винчестере +;#187F R8DOS #23(35) подключение раздела к драйверу HDD +;#188A установка кода, определяющий тип дисковода без образа по номеру в С +;#189A подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) +;#18C0 R8DOS #28(40) подключение раздела к драйверу HDD +;#1A0E расчет адреса кода, определяющие тип дисковода по номеру в С +;#1A19 завершение процедуры x18C0 R8DOS #28(40) +;#1A6A проверка совпадения имени +;#1A82 выделение из строки имени подраздела/образа (6 символов имя) +;#1A9F копирование имени подраздела/образа по адресу в de +;#1AB1 определение адреса начала записи для заданного дисковода в буфере xE5A9 +;#1ACC формирование текстовой строки - пути к примонтированному подразделу/образу +;#1B04 расчет адреса блока описателя заданного дисковода +;#1B18 установка признака подмонтированных дисков A/B в порту #7FBA +;#1B45 определение необходимости копирования памяти пользователя +;#1B54 сохранение описателя текущего дисковода в блоке xE9F5 (функция TR-DOS mirror) +;#1B7E R8DOS #24(36) прямое чтение секторов из подраздела жесткого диска +;#1BC0 R8DOS #25(37) прямая запись секторов в подраздел жесткого диска +;#1BFA ошибка #56. нет раздела MFS +;#1BFE R8DOS #26(38) Вернуть таблицу (каталог) подраздела +;#1C2D R8DOS #27(39) чтение/запись сектора (???ОШИБКА???) +;#1C70 бесконечное чтение порта bc +;#1C74 бесконечная запись в порт bc +;#1C78 загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства +;#1C86 чтение 512b данных в буфер адресуемый hl +;#1C98 запись 512b данных из буфер адресуемого hl +;#1CAC посылаем команду винчестеру +;#1CCA ожидание готовности HDD к передаче данных +;#1CE5 ожидание готовности HDD к принятию команды +;#1D04 ожидание готовности HDD +;#1D1B чтение сектора идентификации в буфер по адресу в ix +;#1D2A подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер +;#1D45 запись сектора из буфера xE5A9 на винчестер по адресу в dehl +;#1D4A запись сектора из буфера ix на винчестер +;#1D4F запись сектора из буфера xE5A9 на винчестер +;#1D73 чтение сектора с винчестера в буфер xE5A9 +;#1D78 чтение сектора с винчестера в буфер ix +;#1D7D чтение сектора с винчестера в буфер xE5A9 +;#1DDF расчет и установка в переменных адреса LBA/CHS в зависимости от настроек +;#1E2A установка в переменных сектора номер 3 для винчестера +;#1E3D чтение сектора 3(сектор настроек) в буфер xE5A9 и проверка контрольной суммы +;#1E74 R8DOS #22(34) идентификация жесткого диска +;#1F08 проверка геометрии винчестера +;#1F2D расчет произведения головок и секторов +;#1F59 чтение ячейки CMOS +;#1F76 чтение из CMOS времени и даты, в случае готовности CMOS +;#1F8B проверка готовности CMOS +;#1F93 чтение из CMOS времени и даты +;#1FB2 запись в CMOS времени и даты +;#1FDD запись данных в ячейку CMOS +;#2010 запись в порт +;#2016 чтение порта +;#201C пауза 293t +;#2023 запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F +;#2030 подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) +;#2047 определение наличия CMOS +;не используется #20EC работа с контроллером прерываний ??? +;#20F1 тестирование HDD (2. test) (тест на чтение/запись) +;#2105 тестирование HDD (1. test) (тест только на чтение) +;#21E5 подсчет контрольной суммы области памяти CRC16 +;#220F суммирование байта с контрольной суммой CMOS CRC8 +;#2222 данные для подсчета контрольной суммы +;#2223 данные для подсчета контрольной суммы +;#2422 определение наличия SMUC +;#2452 *** Not Used *** +;#2500 ROM-disk +;#3D00 +;#4000 + + +;АДРЕС: #0000 *NOT USED* (#30 байт) +x0000 ds #30 + +;АДРЕС: #0030 rst #30 вызов процедуры из другого rom +x0030 jp x010E + +;АДРЕС: #0033 *NOT USED* (#05 байт) +x0033 ds #05 + +;АДРЕС: #0038 обработчик прерываний im 0/1 +x0038 push af + ld a,#06 + ld (#7530),a + pop af + ei + ret + +;АДРЕС: #0041 *NOT USED* (#25 байт) +x0041 ds #25 + +;АДРЕС: #0066 обработка NMI (зависание с желто-черным бордюром) +x0066 ld a,#06 + out (#FE),a + xor a + out (#FE),a + jr x0066 + +;АДРЕС: #006F *NOT USED* (#01 байт) +x006F ds #01 + +;АДРЕС: #0070 переменные ROM-disk +x0070 db #25 ;смещение начала ром диска (в блоках по 256 байт) + db #18 ;количество свободных секторов в странице + db #00 ;=#00 каталог отсутсвует + +;АДРЕС: #0073 загрузка блока из ROM-Disk + INCLUDE "!RomDisk.asm" + +;АДРЕС: #00AA *NOT USED* (#15 байт) +x00AA ds #15 + +;АДРЕС: #00BF вероятно что-то для контроллера прерываний +x00BF db #93,#01 + ds #04 + db #8B,#01,#00,#CA,#00: jp x015F + db #80,#01,#00,#D2,#00: jp x015F + db #FB,#C9,#00,#DA,#00: jp x015F + db #00,#00,#00,#E2,#00: jp x015F + db #00,#00,#00,#EA,#00: jp x015F + db #00,#00,#00,#F2,#00: jp x015F + db #00,#00,#00,#FA,#00: jp x015F + db #00,#00 + +;АДРЕС: #00FF адрес п/п обработки прерываний im 2 +x00FF dw x0102 + +;АДРЕС: #0101 номер текущего rom +x0101 db #07 + +;АДРЕС: #0102 процедура обработки прерываний im 2 +x0102 push hl + ld a,#06 + ld hl,x9C40 + call x175D ;установка бордюра + pop hl + ei + ret + +;АДРЕС: #010E вызов процедуры из другого rom +x010E push hl + ld hl,(x0101) + ex (sp),hl + push hl + ld hl,#0006 + push af + add hl,sp + push de + push bc + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ld a,(hl) + jp xE3E9 + +;АДРЕС: #0127 вызов процедуры из rom 2 call x0127: dw addr +x0127 ld (xDE10),hl + pop hl + push de + ld e,(hl) + inc hl + ld d,(hl) + inc hl + ex (sp),hl + push hl + ld hl,x0143 ;сюда вернемся + ex (sp),hl + push hl + ld hl,xE42C ;п/п включения страницы для возврата + ex (sp),hl + ex de,hl + push hl + ld hl,(xDE10) + jp xE478 ;включаем rom 2 +x0143 inc sp +x0144 inc sp + ret + +;АДРЕС: #0146 работа с контроллером прерываний +x0146 ei + nop + push af + push bc + ld b,#0C + call x1F59 ;чтение ячейки CMOS + ld a,#02 + ld (x7530),a + ld bc,#7EBE + ld a,#20 + out (c),a + pop bc + pop af + ei + ret + +;АДРЕС: #015F работа с контроллером прерываний +x015F push af + push bc + ld b,#0C + call x1F59 ;чтение ячейки CMOS + ld a,#02 + ld (#7530),a + push hl + ld a,#02 + ld hl,#9C40 + call x175D ;вызов процедуры из основной памяти + pop hl + ld bc,#7EBE + ld a,#20 + out (c),a + pop bc + pop af + ei + ret + +;АДРЕС: #0180 работа с контроллером прерываний +x0180 di + halt + push af + ld a,#04 + ld (#7530),a + pop af + ei + ret + +;АДРЕС: #018B работа с контроллером прерываний +x018B push af + ld a,#05 + ld (#7530),a + pop af + ret + +;АДРЕС: #0193 работа с контроллером прерываний +x0193 push af + push bc + ld bc,#7EBE + ld a,#0C + out (c),a + nop + nop + ld bc,#FFBA + ld a,(xDFF0) + and #F7 + out (c),a + ld (xDFF0),a + pop bc + pop af + ei + ret + +;АДРЕС: #01AF автостарт с дискеты +;вх: 2-3,a =#11 -> вых: нажатие Enter и переход на rom 0: #259F +; =#10 -> вых: bc - длина бейсик-строки для автостарта +; =#0? -> вых: копирование строки автостарта по адресу в de и переход на rom 0: #1B11 +x01AF ld a,(xDD7F+#01) ;регистр A пользователя + and #0C + cp #0C + jr z,x01EC + cp #08 + jr z,x01E4 ;длина бейсик строки для дисковода автостарта + ld hl,rom0_x1B11 ;п/п загрузки с диска + ld (xDD6B),hl ;новый pc программы пользователя + ld de,(xDD75) ;регистр de пользователя + call x0207 ;bc - длина бейсик строки для автостарта + ld hl,x0213 + ldir + ret z ;автостарт с дисковода A + push af + call x1B04 ;расчет адреса блока описателя заданного дисковода + pop bc ;b - номер дисковода + jr nz,x01D8 ;в дисководе образ диска + res 1,b ;реальные диски только в дисководах A/B +x01D8 ld a,"A" + add a,b + ld hl,(xDD75) ;регистр de пользователя + ld de,#000F + add hl,de + ld (hl),a ;установим букву дисковода + ret +;длина бейсик строки для дисковода автостарта +x01E4 call x0207 ;bc - длина бейсик строки для автостарта + ld (xDD77),bc ;регистр bc пользователя + ret +;запуск с винчестера +x01EC ld hl,rom0_x259F + ld (xDD6B),hl ;новый pc программы пользователя + bit 7,(iy+#1B) + ret z ;проверка геометрии винчестера не пройдена + bit 0,(iy+#1C) + ret z ;autostart off + ld a,#0D + ld (#5C08),a ;код последней нажатой клавиши: enter + ld hl,#5C3B + set 5,(hl) ;устанавливается при нажатии на любую символьную клавишу + ret +;вых: bc - длина бейсик строки для автостарта +; z - автостарт с дисковода A +x0207 ld a,(iy-#23) ;номер диска автостарта + or a + ld bc,#000E ;для дисковода A + ret z + ld bc,#0016 ;для дисководов B/C/D + ret +x0213 db #F9 ;randomize + db #C0 ;usr + db #B0 ;val + db '"15619"' ;"15619" + db ":",#EA,":",#F7 ;:rem:run + db '"A:boot"' + +;АДРЕС: #0229 вызов функции R8DOS +;вх: c - номер функции +x0229 push ix + ld (xFFEF),a + ld a,r + push af ;сохраним флаг прерываний + di + ld a,c + cp #14 + jr nc,x0293 + ld a,(xFFEF) ;для функций #00..#13 + ld (xFFDE),sp + push hl + ld hl,xFFDC + res 0,(hl) + res 4,(iy+#0B) + inc hl + ld (hl),#FF ;код ошибки #FF + ld hl,x0264 ;сюда вернемся +x024E ex (sp),hl + push hl + push de + ld l,c + ld h,#00 + add hl,hl + ld de,x0CAD ;функции R8DOS + add hl,de + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl ;адрес п/п обработки заданной функции + pop de + ex (sp),hl + ld ix,(xFFF0) ;!!!ОШИБКА, должно быть ld ix,(xDD6F) + ret +;выход из функции по ошибке +;возврат из функций #00..#13 +x0264 ld sp,(xFFDE) ;восстановим стэк + ld (xFFEF),a ;временно сохраним регистр A + push hl + ld hl,xFFDC + res 4,(hl) + inc hl + ld a,(hl) ;код ошибки + cp #FF + pop hl + ex (sp),hl + res 0,l ;сбросим флаг CY + jr z,x027D ;нет ошибки +x027B set 0,l ;установим флаг CY +x027D ex (sp),hl + pop af + ld a,(xFFEF) ;восстановим A + jp po,x0286 ;восстановим режим прерываний ei/di + ei +x0286 pop ix + ret +;возврат из функций #14..#nn +x0289 ld (xFFEF),a + ex (sp),hl + res 0,l ;сбросим флаг CY + jr nc,x027D ;нет ошибки + jr x027B ;была ошибка +x0293 ld a,(xFFEF) ;для функций #14..#nn + push hl + ld hl,x0289 ;сюда вернемся + jr x024E + +;АДРЕС: #029C R8DOS #00(0) сброс контроллера +x029C xor a + call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld (hl),a ;номер дорожки =#00 + call x0394 ;bit 7,(xFFDC) + ret nz ;к текущему дисководу подключен образ + call x0C98 ;остановка контроллера ВГ93 + out (#FF),a ;загрузка головки, сторона верхняя, метод записи + call x0349 ;hl адрес кода, определяющего тип текущего дисковода + ld a,(hl) + and #03 ;скорость перемещения головки + or #0C ;головку опустить, проверить номер дорожки + out (#1F),a ;команда восстановления + call x0441 ;ожидание готовности ВГ93 + call x02F6 ;проверка наличия диска в дисководе + in a,(#1F) ;читаем регистр состояния + set 4,(hl) ;hl=xFFDC + +;АДРЕС: #02BE код time-out +;вых: z код time-out текущего дисковода =#FF/#00 +x02BE call x033A ;hl адрес кода time-out для текущего дисковода + ld a,(hl) + inc a + ret z + dec a + ld (hl),#0A + ret + +;АДРЕС: #02C8 уменьшение time-out на 1 для всех дисководов +;вых: hl - адрес процедуры time-out +x02C8 ld b,#00 + +;АДРЕС: #02CA R8DOS #13(19) установка режима time-out для счетчика включения двигателя дисковода +;вх: b - байт установки time-out +; 3-0,b =0000 уменьшение time-out на 1 для всех дисководов +;вых: hl - адрес процедуры time-out +x02CA ld hl,xFFD8 ;коды time-out для дисководов + ld a,b + and #0F + jr nz,x02E3 + ld b,#04 ;для всех дисководов +x02D4 ld a,(hl) + inc a + jr z,x02DC ;(hl)=#FF + dec a + jr z,x02DC ;(hl)=#00 + dec (hl) ;(hl)=(hl)-1 +x02DC inc hl + djnz x02D4 +x02DF ld hl,x02C8 + ret +x02E3 ld a,b + ld b,#04 +x02E6 rra + jr nc,x02F1 ;следующий дисковод + ld c,#00 + bit 3,a + jr nz,x02F0 + dec c +x02F0 ld (hl),c ;#00/#FF +x02F1 inc hl + djnz x02E6 + jr x02DF + +;АДРЕС: #02F6 проверка наличия диска в дисководе +x02F6 call x0322 ;опрос Break и прерывание, если нажата + ld hl,xFFDC + ld de,#0000 + in a,(#1F) ;берем индексный сигнал для образца + and #02 + ld b,a + call x0316 ;ждем изменения индексного сигнала + ret nz ;индексный сигнал изменился + call x0316 ;повторим еще раз + ret nz ;индексный сигнал изменился +x030C bit 0,(hl) + ret nz + call x0C98 ;остановка контроллера ВГ93 + ld a,#01 + jr x0328 ;ошибка. прерывание функции +;ждем изменения индексного сигнала +x0316 in a,(#1F) + and #02 + cp b + ret nz + inc de + ld a,e + or d + jr nz,x0316 + ret + +;АДРЕС: #0322 опрос Break и прерывание, если нажата +x0322 call x0C83 ;опрос Break. cy=1 не нажата + ret c + ld a,#03 +x0328 jp x04D1 ;ошибка. прерывание функции + +;АДРЕС: #032B R8DOS #10(16) чтение/установка спецификации дискеты +;вх: a - спецификация диска +; b - режим: 0FFh - установка, другое - чтение. +; +x032B call x0344 ;адрес кода, определяющего тип дискеты в текущем дисководе + inc b + jr nz,x0333 ;чтение + ld (hl),a ;запись + ret +x0333 ld a,(hl) + ret + +;АДРЕС: #0335 R8DOS #11(17) чтение кода спецификации дисковода +;вых: a - код спецификации дисковода +x0335 call x0349 ;адрес кода, определяющего тип текущего дисковода + ld a,(hl) + ret + +;АДРЕС: #033A в hl адрес кода time-out для текущего дисковода +x033A ld hl,xFFD8 + jr x034C + +;АДРЕС: #033F в hl адрес кода, определяющего номер дорожки в текущем дисководе +x033F ld hl,xFFD4 + jr x034C + +;АДРЕС: #0344 в hl адрес кода, определяющего тип дискеты в текущем дисководе +x0344 ld hl,xFFD0 ;коды, определяющие тип дискеты в дисководах + jr x034C + +;АДРЕС: #0349 в hl адрес кода, определяющего тип текущего дисковода +x0349 ld hl,xFFCC ;коды, определяющие тип дисковода +;расчет адреса для текущего дисковода +x034C push de + ld de,(xFFCA) ;номер текущего дисковода + ld d,#00 + add hl,de + pop de + ret + +;АДРЕС: #0356 подготовка байта для выбора заданного дисковода +;вых: a - байт +x0356 ld a,(xFFCA) ;номер текущего дисковода + call x0344 ;адрес кода, определяющего тип дискеты в текущем дисководе + and #03 ;номер текущего дисковода + or %00011100 ;загрузка головки, сторона верхняя + ld c,a + ld a,(hl) ;метод записи 0/1=FM/MFM + and %01000000 + or c + ret + +;АДРЕС: #0366 проверка наличия образа в текущем дисководе +;вых: nz - к текущему дисководу образ подключен +; z - к текущему дисководу образ не подключен +x0366 call x0349 ;в hl адрес кода, определяющего тип текущего дисковода + ld a,(hl) + cp #FF + jr z,x038C ;еще не инициалищирован + bit 5,a + jr z,x038C ;образ не подключен +;проверка наличия образа TR-DOS в текущем дисководе +x0372 ld a,(xE590) + and %11011111 + cp #01 + jr nz,x03DF ;нет подключенного образа TR-DOS. ошибка: нет диска в дисководе + ld hl,xFFDC + set 7,(hl) ;признак подключенного образа TR-DOS + xor a ;cy=0 + inc a ;nz + ret +;установка дескриптора образа для текущего дисковода +x0383 ld a,(xFFCA) ;номер текущего дисковода + rst #30 + dw rom2_x2C4D ;копирование дескриптора дисковода в буфер xE590, + db #02 ;если к нему примонтирован образ + jr x0372 ;проверка наличия образа TR-DOS в текущем дисководе +;для дисководов C/D возможна работа только с образами +x038C ld a,(xFFCA) ;номер текущего дисковода + bit 1,a + ret z ;дисковод A/B + jr x03DF ;ошибка: нет диска в дисководе + +;АДРЕС: #0394 проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу +x0394 push hl + ld hl,xFFDC + bit 7,(hl) + pop hl + ret + +;текущий дисковод инициализирован +x039C ld hl,xFFDC + set 6,(hl) + ret + +;АДРЕС: #03A2 установка номера дорожки для позиционирования +x03A2 ld a,(xFFDC) + bit 6,a + ret nz ;дисковод инициализирован + push hl + push de + push bc + call x0366 ;проверка наличия образа в текущем дисководе + jr nz,x03BE ;к текущему дисководу образ подключен + ld b,#10 + call x0356 ;подготовка байта для выбора заданного дисковода + xor b + out (#FF),a + call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld a,(hl) + out (#3F),a ;установим номер дорожки +x03BE call x039C ;текущий дисковод инициализирован + pop bc + pop de + pop hl + ret + +;АДРЕС: #03C5 R8DOS #01(1) выбор текущего дисковода +;вх: a - номер дисковода [0..3] +x03C5 and #03 + ld (xFFCA),a ;номер текущего дисковода + ld hl,xFFDC + res 6,(hl) + res 7,(hl) + call x0349 ;hl адрес кода, определяющего тип текущего дисковода + bit 5,(hl) ;образ на текущем дисководе? + jr nz,x0383 ;к дисководу подключен образ. установка дескриптора образа для текущего дисковода + bit 1,a + ret z ;дисковод A/B + xor a + ld (xE590),a ;текущий дисковод без образа +x03DF ld a,#01 ;дисководы C/D только с образами могуть быть + jp x04D1 ;ошибка #01 нет диска в дисководе. прерывание функции + +;АДРЕС: #03E4 инициализация текущего дисковода при необходимости +x03E4 ld hl,xFFDC + bit 6,(hl) + ret nz ;дисковод уже инициализирован + ld hl,x039C ;адрес возврата + push hl + ld hl,xFFDC ;!!!ЛИШНЕЕ + call x0366 ;проверка наличия образа в текущем дисководе + ret nz ;к текущему дисководу подключен образ + call x0356 ;подготовка байта для выбора заданного дисковода + out (#FF),a ;выбор дисковода + call x0349 ;hl адрес кода, определяющего тип текущего дисковода + ld a,(hl) + inc a + ret nz ;уже инициализирован + push hl + call x0824 ;позиционирование на заданную дорожку c тайим-аутом + ld ix,xFFDC + set 0,(ix+0) + xor a ;дорожка 0 + call x042C ;позиционирование на заданную дорожку + ld a,#32 ;дорожка #32(50) + call x042C ;позиционирование на заданную дорожку + ld a,#02 ;дорожка #02 + call x042C ;позиционирование на заданную дорожку + res 0,(ix+0) + pop hl + bit 2,a ;регистр состояния. потеря данных + res 6,(hl) + jr nz,x0427 ;потеря данных + set 6,(hl) ;80 дорожек на дисководе +x0427 ld a,(hl) + and %11000011 + ld (hl),a + xor a ;уходим на нулевую дорожку + +;АДРЕС: #042C позиционирование на заданную дорожку +;вх: a - номер дорожки +;вых: a - регистр состояния +x042C call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld (hl),a ;номер дорожки + +;АДРЕС: #0430 поиск дорожки +;вх: a - номер дорожки +;вых: a - регистр состояния +x0430 ld b,#18 ;команда поиска + jr x0436 + +;АДРЕС: #0434 поиск дорожки с проверкой +;вх: a - номер дорожки +;вых: a - регистр состояния +x0434 ld b,#1C ;команда поиска +x0436 out (#7F),a ;запись в регистр данных + +;АДРЕС: #0438 выдача команды в порт #1F ВГ93 +;вх: b - команда для ВГ93 +;вых: a - регистр состояния +x0438 call x0349 ;hl адрес кода, определяющего тип текущего дисковода + ld a,(hl) + and #03 ;время перемещения на шаг + or b + out (#1F),a ;выдаем команду в порт + +;АДРЕС: #0441 ожидание готовности ВГ93 +;вых: a - регистр состояния +x0441 ld de,26300 ;количество попыток +x0444 in a,(#FF) ;ожидание сигнала INTRQ + rlca + jr nc,x044C + in a,(#1F) ;чтение регистра состояния + ret +x044C call x0322 ;опрос Break и прерывание, если нажата + dec de + ld a,e + or d + jr nz,x0444 ;повторим + jp x030C ;превышено кол-во попыток + +;АДРЕС: #0457 R8DOS #02(2) позиционирование на заданный логический трек +;вх: d - номер дорожки +x0457 push de + call x03E4 ;инициализация текущего дисковода при необходимости + pop de + call x0394 ;проверка bit 7,(xFFDC) + jr z,x046D ;реальная дискета +;подключен образ диска +x0461 call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld (hl),d + ld a,d + cp #A0 ;не больше 160 + ld a,#05 ;код ошибки: ошибка позицирования (не соответствует номер дорожки) + ret c + jr x04D1 ;ошибка. прерывание функции +;реальная дискета +x046D call x0356 ;подготовка байта для выбора заданного дисковода + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld e,(hl) + call x0349 ;hl адрес кода, определяющего тип текущего дисковода + bit 5,e + jr z,x0483 ;диск 40 дорожек + bit 6,(hl) + jr nz,x0492 ;дисковод на 80 дорожек +x047F ld a,#08 ;код ошибки: ошибка позицирования, не соответствие типов (попытка использовать 80 дорожечный диск на 40 дорожечном дисководе) + jr x04D1 +x0483 bit 6,(hl) + jr z,x0492 ;дисковод на 40 дорожек +;дисковод на 80 дорожек + sla d ;определение стороны диска и номера физической дорожки + bit 7,e + jr z,x0492 ;односторонняя дискета + bit 1,d + jr z,x0492 ;верхняя сторона + dec d +x0492 bit 7,e + jr z,x04A0 ;односторонняя дискета + bit 7,(hl) + jr z,x047F ;ошибка позицирования, не соответствие типов (попытка использовать двустронний диск на одностороннем дисководе) + srl d + jr nc,x04A0 + res 4,a ;нижняя головка +x04A0 out (#FF),a + call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку + ld a,#06 ;код ошибки: ошибка позицирования (не считался адресной маркер дорожки/сектора) + jp c,x04D1 + ld a,(ix+0) ;номер дорожки в заголовке + call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + cp (hl) ;сравнение с заданным + push hl + push de + call nz,x029C ;R8DOS #00(0) сброс контроллера + pop de + pop hl + ld a,(hl) ;номер дорожки + bit 2,e + jr z,x04BF + sla a ;диск 40 работает на дисководе 80 +x04BF cp d + ret z + out (#3F),a ;установим номер дорожки + ld a,d + bit 2,e + jr nz,x04EC ;диск 40 работает на дисководе 80 + ld (hl),a + call x0434 ;поиск дорожки с проверкой + bit 4,a ;ошибка позиционирования? + ret z ;нет ошибки +x04CF ld a,#05 ;код ошибки: ошибка позицирования (не соответствует номер дорожки) + +;АДРЕС: #04D1 ошибка. прерывание функции +;вх: a - код ошибки +x04D1 ld (xFFDD),a ;код ошибки дискового интерпретатора + ld a,#D0 + out (#1F),a ;команда прерывания + call x04DE + jp x0264 +;проверка кода time-out для текущего дисковода +x04DE push hl + push af + call x033A ;в hl адрес кода time-out для текущего дисковода + ld a,(hl) + inc a + jr z,x04E9 + ld (hl),#00 +x04E9 pop af + pop hl + ret +;диск 40 работает на дисководе 80 +x04EC srl d + ld (hl),d + push de + call x0430 ;поиск дорожки + pop de + call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку + ld a,#06 ;код ошибки: ошибка позицирования (не считался адресной маркер дорожки/сектора) + jr c,x04D1 + ld a,(ix+0) ;номер дорожки + cp d + ret z + jr x04CF ;ошибка позицирования (не соответствует номер дорожки) + +;АДРЕС: #0502 R8DOS #0E(14) физическое позиционирование на трек +;вх: d - номер физической дорожки [0...х] +; a - номер стороны: 0/1 - нижняя/верхняя +x0502 and #01 + ld e,a ;номер стороны + push de + call x03A2 ;установка номера дорожки для позиционирования + call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу + jr z,x0517 ;образ не подключен + pop de + ld a,d + sla a + add a,e + ld d,a ;логический номер дорожки + jp x0461 ;проверка номера дорожки образа +x0517 call x0824 ;позиционирование на заданную дорожку c тайим-аутом + call x0356 ;подготовка байта для выбора заданного дисковода + pop de + rrc e + ld hl,xFFDC + set 4,(hl) + jr nc,x052B ;нижняя сторона + res 4,a + res 4,(hl) +x052B out (#FF),a + ld a,d + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + bit 2,(hl) + jp z,x042C ;позиционирование на заданную дорожку +;диск 40 работает на дисководе 80 + call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld a,(hl) + sla a + out (#3F),a + ld (hl),d + ld a,d + sla a + jp x0430 ;поиск дорожки + ret ;!!!ЛИШНЕЕ!!! + +;АДРЕС: #0546 R8DOS #12(18) в hl адрес таблицы с количеством секторов на дорожке +x0546 ld hl,(xFFC8) + ret + +;АДРЕС: #054A ошибка. неверный номер сектора +x054A ld a,#07 + jr x04D1 + +;АДРЕС: #054E R8DOS #04(4) повторить в случае ошибки функцию 5 (или 6) +x054E call x0824 ;позиционирование на заданную дорожку c тайим-аутом + jr x05A8 + +;АДРЕС: #0553 R8DOS #05(5) чтение группы секторов +;вх: hl - адрес буфера +; d[0...x] - номер логического трека (первого обрабатываемого сектора) +; e[0...х] - номер первого обрабатываемого сектора +; b - количество секторов в операции +; +x0553 ld a,#80 ;признак чтения + jr x0559 + +;АДРЕС: #0557 R8DOS #06(6) запись группы секторов +;вх: hl - адрес буфера +; d[0...x] - номер логического трека (первого обрабатываемого сектора) +; e[0...х] - номер первого обрабатываемого сектора +; b - количество секторов в операции +; +x0557 ld a,#A0 ;признак записи +x0559 ld (xFFE1),a + push bc + push de + push hl + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld a,(hl) + and #03 ;код размера сектора в байтах + push af + ld c,a + call x0B52 ;преобразование кода размера сектора в байтах в число + ld (xFFED),bc ;размер сектора в байтах + pop af + bit 6,(hl) + jr nz,x0575 ;метод записи MFM + add a,#04 +x0575 ld b,#00 + ld c,a + ld hl,(xFFC8) ;адрес таблицы количеством секторов на дорожке + add hl,bc + ld a,(hl) + ld (xFFE0),a ;количество секторов на дорожке + dec a + cp e + jr c,x054A ;ошибка. неверный номер сектора + call x03E4 ;инициализация текущего дисковода при необходимости + call x0824 ;позиционирование на заданную дорожку c тайим-аутом + pop hl + pop de + pop bc +x058D ld (xFFE2),hl + ld (xFFE4),de + ld a,b + ld (xFFE6),a + call x0457 ;позиционирование на заданную дорожку + jr x05A8 +x059D ld a,b + ld (xFFE6),a + ld (xFFE2),hl + ld (xFFE4),de +;головка спозицонирована на заданную дорожку +x05A8 ld a,(xFFCB) + ld b,a ;число попыток считывания при ошибке +x05AC ld de,(xFFE4) ;дорожка и сектор + call x0322 ;опрос Break и прерывание, если нажата + ld hl,(xFFE2) ;адрес для чтения + push bc + ld bc,(xFFED) ;размер сектора в байтах + push de + ld a,(xFFE1) ;=#80/#A0 чтение/запись группы секторов + bit 5,a + push af + call nz,x06B4 ;запись сектора + pop af + call z,x0610 ;чтение сектора + pop de + ld c,a + and #1F + ld a,c + pop bc + jr z,x05EB ;прочиталось без ошибки + djnz x05AC ;ошибка. повторим чтение + ld a,#04 ;код ошибки: ошибка при чтении или записи сектора функциями 5 или 6 +x05D5 jp x04D1 ;прервем функцию + +;АДРЕС: #05D8 R8DOS #03(3) игнорирование ошибки и продолжение выполнения функции 5 (или 6) +x05D8 call x0824 ;позиционирование на заданную дорожку c тайим-аутом + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld a,(hl) + and #03 + ld c,a ;код размера сектора + call x0B52 ;преобразование кода размера сектора в байтах в число + ld hl,(xFFE2) + add hl,bc ;пропускаем сектор + jr x05F1 +;проверка защиты от записи +x05EB bit 6,a ;защита записи? + ld a,#02 ;код ошибки: попытка записи на защищенную дискету + jr nz,x05D5 ;ошибка. если была запись. при чтении не устанавливается +;расчет номера следующего сектора +x05F1 ld de,(xFFE4) ;дорожка и сектор для чтения/записи + inc e + ld a,e + push hl ;следующий адрес в памяти + ld hl,(xFFE0) ;количество секторов на дорожке + cp l + pop hl + jr c,x0609 ;дорожка еще не кончилась + ld e,#00 ;нулевой сектор, следующая дорожка + inc d + ld a,(xFFE6) ;количество секторов для чтения/записи + ld b,a + djnz x058D ;следующий сектор + ret ;завершили чтение/запись +;дорожка еще не кончилась +x0609 ld a,(xFFE6) + ld b,a + djnz x059D + ret ;завершили чтение/запись + +;АДРЕС: #0610 чтение сектора +;вх: de - дорожка и сектор +; hl - адрес для чтения +; bc - размер сектора в байтах +; a - команда =#80/#A0 чтение/запись группы секторов +;вых: nz - ошибка чтения +; a - регистр состояния +; hl - следующий адрес в памяти +x0610 ld d,a + bit 5,(iy+#0B) + jr z,x0635 ;вызов функции из монитора + call x1B45 ;определение необходимости копирования памяти пользователя + jr nc,x0635 ;копировать не надо + push hl + ld hl,xEBF5 ;читаем в буфер в ram 8 + push bc + call x0635 ;читаем сектор + ld b,a ;регистр состояния + and #1F + ld a,b + pop bc + pop hl + ret nz ;была ошибка чтения + ld de,xEBF5 ;буфер в память пользователя + ex de,hl + rst #30 + dw rom2_x0749 ;восстановление области памяти из ram 8 + db #02 + xor a + ret +x0635 ld a,(xFFDC) + rlca + jr c,x066B ;это образ на HDD + +;АДРЕС: #063B чтение данных с дискеты в память +;вх: hl - адрес в памяти +; d - команда +; e - номер сектора +;вых: a - регистр состояния +; hl - следующий адрес в памяти +x063B call x0648 ;чтение данных в память + ld a,b + or a + ld a,#01 ;код ошибки: нет диска в дисководе + jp z,x04D1 ;нет готовности + in a,(#1F) + ret +;чтение данных в память +;вх: hl - адрес в памяти +; d - команда +; e - номер сектора +;вых: b=#00 нет готовности +; hl - следующий адрес в памяти +x0648 ld a,e + inc a + out (#5F),a ;регистр сектора + ld a,d + out (#1F),a ;регистр команд + ld bc,#047F +x0652 in a,(#FF) ;чтение системного регистра + and #C0 + jr nz,x0667 ;есть готовность + inc de + ld a,d + or e + jr nz,x0652 ;ожидаем готовность + djnz x0652 + ret +;чтение сектора +x0660 in a,(#FF) + and #C0 + jr z,x0660 ;ждем готовности + ret m ;сигнал окончания выполнения команды +x0667 ini ;читаем байт с дискеты + jr x0660 + +;АДРЕС: #066B чтение сектора образа HDD в память +;вх: hl - адрес в памяти +; d - команда +; e - номер сектора +;вых: hl - следующий адрес в памяти +; bc=#0100 +x066B push hl + call x074C ;расчет смещения от начала образа в секторах (512b) + push bc + inc hl ;+1 сервисный сектор + bit 4,(iy+#0B) + jr z,x0682 ;сектор с HDD еще не прочитан + push hl ;расчет смещения от начала образа в секторах (512b) + ld bc,(xE5A7) ;смещение предыдущего сектора от начала образа в секторах (512b) + or a + sbc hl,bc + pop hl + jr z,x0685 ;сектор уже в памяти, не читаем +x0682 call x0694 ;чтение сектора с винчестера в буфер xEFF5 +x0685 pop bc ;#0000/#0100 смещение в секторе + pop de ;адрес в памяти куда читать + ld hl,xEFF5 + add hl,bc ;какую половину копировать + ld bc,#0100 + ldir ;копируем из буфера в память + ex de,hl + inc b + xor a + ret + +;АДРЕС: #0694 чтение сектора с винчестера в буфер xEFF5 +;вх: hl - смещение от начала образа в секторах (512b) +x0694 ld a,(xE590) + and #DF + cp #01 + ld a,#21 ;код ошибки: + jp nz,x04D1 + ld (xE5A7),hl ;смещение от начала образа в секторах (512b) + ld de,xEFF5 ;адрес буфера для чтения + ex de,hl + call x1813 ;чтение сектора с винчестера + ld a,#04 + jp c,x04D1 ;ошибка. прерываем функцию + set 4,(iy+#0B) ;сектор прочитан + ret + +;АДРЕС: #06B4 запись сектора +;вх: de - дорожка и сектор +; hl - адрес для чтения +; bc - размер сектора в байтах +; a - команда =#80/#A0 чтение/запись группы секторов +;вых: nz - ошибка записи +; a - регистр состояния +; hl - следующий адрес в памяти +x06B4 ld d,a + bit 5,(iy+#0B) + jr z,x06D2 ;вызов функции из монитора + call x1B45 ;определение необходимости копирования памяти пользователя + jr nc,x06D2 ;копировать не надо + push de + ld de,xEBF5 ;буфер в ram 8 + rst #30 + dw rom2_x0753 ;сохранение области памяти в ram 8 + db #02 + pop de + push hl + ld hl,xEBF5 ;буфер с данными пользователя + call x06D2 + pop hl + ret +x06D2 ld a,(xFFDC) + rlca + jr c,x0708 ;это образ на HDD. запись сектора на образ HDD + call x06E5 ;запись сектора + ld a,b + or a + ld a,#01 ;код ошибки: нет диска в дисководе + jp z,x04D1 ;прерывание функции + in a,(#1F) ;регистр состояния + ret +;запись сектора +;вх: hl - адрес для чтения +; e - номер сектора +; d - команда =#80/#A0 чтение/запись группы секторов +;вых: b=#00 нет готовности +x06E5 ld a,e + inc a + out (#5F),a ;регистр сектора + ld a,d + out (#1F),a ;регистр команд (команда запись сектора) + ld bc,#047F +x06EF in a,(#FF) ;чтение системного регистра + and #C0 + jr nz,x0704 ;есть готовность к приему данных + inc de + ld a,d + or e + jr nz,x06EF ;ожидаем готовность + djnz x06EF + ret +;передача данных сектора +x06FD in a,(#FF) + and #C0 + jr z,x06FD ;ждем готовности + ret m ;сигнал окончания выполнения команды +x0704 outi ;запись байта на дискету + jr x06FD + +;АДРЕС: #0708 запись сектора на образ HDD +;вх: hl - адрес в памяти +; e - номер сектора +;вых: hl - следующий адрес в памяти +; bc=#0100 +x0708 ld a,(xE590) + cp #01 + ld a,#21 + jp nz,x04D1 ;образ не подключен/защита от записи + push hl + call x074C ;расчет смещения от начала образа в секторах (512b) + push bc + inc hl ;+1 сервисный сектор + bit 4,(iy+#0B) ;сектор еще не записан + jr z,x0729 ;читаем сектор с HDD. нужно чтобы записать сектор 256b + push hl ;расчет смещения от начала образа в секторах (512b) + ld bc,(xE5A7) ;смещение предыдущего сектора от начала образа в секторах (512b) + or a + sbc hl,bc + pop hl + jr z,x072E ;этот сектор уже прочитан +x0729 push hl ;смещение от начала образа в секторах (512b) + call x0694 ;чтение сектора с винчестера в буфер xEFF5 + pop hl +x072E pop bc ;#0000/#0100 смещение в секторе + ex (sp),hl ;адрес в памяти + ld de,xEFF5 ;буфер куда прочитали сектор + ex de,hl + add hl,bc ;смещение в секторе + ex de,hl + ld bc,#0100 + ldir ;коприруем данные в буфер + pop de ;смещение от начала образа в секторах (512b) + push hl ;следующий адрес в памяти + ld hl,xEFF5 + call x1829 ;запись сектора на винчестер + pop hl + ld a,#00 + ret nc ;нет ошибок + ld a,#04 ;код ошибки: ошибка при чтении или записи сектора функциями 5 или 6 + jp x04D1 + +;АДРЕС: #074C расчет смещения от начала образа в секторах (512b) +;вх: e - номер сектора +;вых: hl - смещение от начала образа в секторах (512b) +; bc - #0000/#0100 смещение в секторе +x074C call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld l,(hl) ;номер дорожки + ld h,#00 + add hl,hl + add hl,hl + add hl,hl + add hl,hl ;номер дорожки *16 + ld a,l + add a,e + ld l,a + jr nc,x075C + inc h +x075C srl h + rr l ;(trk * 16 + sec)/2 + ld bc,#0000 ;первая половина сектора HDD + ret nc + ld bc,#0100 ;вторая половина сектора HDD + ret + +;АДРЕС: #0768 чтение заголовка сектора с позиционированием на заданную дорожку +;вх: e - номер сектора +;вых: cy=1 была ошибка при чтении +; ix - адрес буфера с прочитанныи загловком +x0768 push de + call x0824 ;позиционирование на заданную дорожку c тайим-аутом + pop de + +;АДРЕС: #076D чтение заголовка сектора +;вых: cy=1 была ошибка при чтении +; ix - адрес буфера с прочитанныи загловком +x076D push de + ld hl,xFFE9 ;куда читаем + ld d,#C0 ;чтение адреса + push hl + call x063B ;чтение данных в память + pop ix + pop de + and #1F + ret z ;ошибок нет + scf + ret + +;АДРЕС: #077F R8DOS #0A(10) построение таблицы расположения секторов на дорожке, начиная от индексного маркера +;вх: hl - адрес таблицы +;вых: таблица заголовков секторов, находящихся на дорожке +x077F call x03A2 ;установка номера дорожки для позиционирования + bit 5,(iy+#0B) + jr z,x07AB ;функция вызвана из монитора + ld bc,#012C + call x1B45 ;определение необходимости копирования памяти пользователя + jr nc,x07AB ;копировать не надо + push hl + ld hl,xEBF5 + push hl + call x07AB + inc hl + pop bc + or a + sbc hl,bc + ld a,h + or l + ld c,l + ld b,h ;длина таблицы + pop de + ret z ;таблица пустая + ld hl,xEBF5 + rst #30 + dw rom2_x0749 ;восстановление области памяти из ram 8 + db #02 + ret +;формирование таблицы секторов +x07AB call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу + jr z,x07CF ;реальная дискета +; для образа диска + push hl + call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld e,(hl) + srl e + pop hl + ld a,#01 +x07BA ld (hl),#00 ;информация о секторе достоверна + inc hl + ld (hl),e ;Физический номер дорожки (0..х) + inc hl + ld (hl),#00 ;сторона 0 + inc hl + ld (hl),a ;Номер сектора (1..х) + inc hl + ld (hl),#01 ;Код длины сектора =#01 - 256b + inc hl + inc a + cp #11 + jr c,x07BA + ld (hl),#FE + ret +; для реальной дискеты +x07CF ld (xFFE2),hl + ld (hl),#FE + inc hl + inc hl + inc hl + ld (xFFE4),hl + ld (hl),#00 ;номер сектора 0 + ld a,#3C ;максимальное количество секторов + ld (xFFE6),a + call x0824 ;позиционирование на заданную дорожку c тайм-аутом +x07E4 call x0322 ;опрос Break и прерывание, если нажата + in a,(#1F) + bit 1,a + jr z,x07E4 ;ожидание индексного импульса +x07ED call x076D ;чтение заголовка сектора + ;ix - адрес буфера с прочитанныи загловком + ld hl,(xFFE2) + ld (hl),#00 + jr nc,x07F9 ;ошибок не было + ld (hl),#FF ;сбой чтения +x07F9 inc hl + ld de,(xFFE4) + ld a,(de) + cp (ix+#02) ;номер сектора + jr z,x0820 ;конец дорожки + push ix ;копируем в таблицу + pop de + ex de,hl + ld bc,#0004 + ldir + ex de,hl + ld (hl),#FE + ld (xFFE2),hl + ld a,(xFFE6) + dec a + ret z + ld (xFFE6),a + call x0322 ;опрос Break и прерывание, если нажата + jr x07ED +x0820 dec hl + ld (hl),#FE + ret + +;АДРЕС: #0824 позиционирование на заданную дорожку c тайим-аутом +x0824 push hl + ld hl,xFFDC + bit 4,(hl) + jr nz,x084D ;выход + bit 7,(hl) + jr nz,x084D ;выход + set 4,(hl) + call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld a,(hl) + out (#3F),a ;номер дорожки + nop + out (#7F),a ;номер дорожки + ld b,#18 ;позиционирование на заданную дорожку + call x0438 ;выдача команды в порт #1F ВГ93 + call x02BE ;проверка байта time-out + jr nz,x084D ;задержка не нужна + ld hl,15010 ;задержка 390277t +x0848 dec hl + ld a,h + or l + jr nz,x0848 +x084D pop hl + ret + +;АДРЕС: #084F R8DOS #07(7) идентификация диска +x084F call x03E4 ;инициализация текущего дисковода при необходимости + call x0349 ;hl адрес кода, определяющего тип текущего дисковода + ld a,(hl) + or #C0 + ld (hl),a + call x0394 ;bit 7,(xFFDC) + jr z,x0868 ;образ не подключен + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld (hl),#A1 ;%10100001 + ld d,#02 + jp x0457 ;R8DOS #02(2) позиционирование на заданный логический трек +;реальный дисковод +x0868 call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld (hl),#A0 + push hl + call x029C ;R8DOS #00(0) сброс контроллера + ld a,#02 + call x042C ;позиционирование на заданную дорожку + call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку + ;ix - адрес буфера с прочитанныи загловком + pop hl + jr nc,x088D ;ошибки не было + set 6,(hl) ;метод записи MFM + push hl + call x0356 ;подготовка байта для выбора заданного дисковода + out (#FF),a ;выбор дисковода + call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку + pop hl + ld a,#09 ;код ошибки: неформатированная дискета + jp c,x04D1 ;ошибка. прерывание функции +; установка длины сектора в переменной +x088D ld a,(ix+3) ;код длины сектора + and #03 + ld c,a ;код длины сектора + ld a,(hl) + and #FC + or c + ld (hl),a ;установим код длины сектора в переменной +; коррекция номера дорожки для 40 дорожечного дисковода + ld d,(ix+#00) ;номер дорожки + push hl + call x0349 ;hl адрес кода, определяющего тип текущего дисковода + bit 6,(hl) + ld e,(hl) + jr nz,x08A6 ;80 дорожек в дисководе + srl d +x08A6 pop hl + res 2,(hl) ;hl адрес кода, определяющего тип дискеты в текущем дисководе + srl d + jr nc,x08BB + res 5,(hl) ;40 дорожек на дискете + bit 6,e ;код, определяющий тип текущего дисковода + jr z,x08BB ;дисковод на 40 дорожек + set 2,(hl) ;диск 40 работает на дисководе 80 + push hl + call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + dec (hl) + pop hl + +x08BB call x0356 ;подготовка байта для выбора заданного дисковода + res 4,a ;сторона 0 + out (#FF),a + push hl + call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку + pop hl + jr nc,x08CC ;ошибок не было + res 7,(hl) ;односторонняя дискета + ret +x08CC ld a,(ix+#01) ;номер стороны + or a + ret nz + res 7,(hl) ;односторонняя дискета + ret + +;АДРЕС: #08D4 R8DOS #08(8) идентификация диска для tr-dos, аналогична функции #18 +; интерпретатора системных функций. Перед вызовом необходимо +; установить рабочий буфер, размером не менее 256 байт, используя функцию 9 +x08D4 call x084F ;R8DOS #07(7) идентификация диска + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld a,(hl) + and %01000011 + dec a + ld a,#10 + jp nz,x04D1 ;ошибка #10. дискета не соответствует формату tr-dos + ld de,#0008 + ld b,#01 + ld hl,(xFFE7) ;адрес рабочего буфера для функции + ld a,h + or l + ld a,#12 + jp z,x04D1 ;ошибка #12. не открыт рабочий буфер + call x0553 ;R8DOS #05(5) чтение служебного сектора + ld ix,(xFFE7) ;адрес рабочего буфера для функции + ld de,#00E1 + add ix,de ;начало служебной информации + ld a,#10 + cp (ix+#06) ;идентификационный код TR-DOS (#10) + jp nz,x04D1 ;ошибка #10. дискета не соответствует формату tr-dos + call x0349 ;hl адрес кода, определяющего тип текущего дисковода + ld e,(hl) + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + inc a + res 7,(hl) ;односторонняя дискета + bit 2,(ix+#02) ;тип дискеты + jr z,x0918 ;односторонняя + set 7,(hl) ;двухсторонняя +x0918 res 5,(hl) ;40 дорожек на диске + bit 0,(ix+#02) ;кол-во дорожек + ret nz ;40 дорожек + set 5,(hl) ;80 дорожек + ret + +;АДРЕС: #0922 R8DOS #09(9) установка рабочего буфера для функции 8 +;вх: hl - адрес рабочего буфера +;вых: d - версия компиляции монитора +; c - число компиляций монитора +; b - месяц компиляции монитора +; e - год компиляции монитора +x0922 ld (xFFE7),hl + ld (xFFF0),hl + ld de,#6161 + ld bc,#0705 + ret + +;АДРЕС: #092F вычисление размера таблицы секторов +;вх: hl - адрес таблицы секторов +;вых: bc - размер таблицы сеторов +x092F push hl + push hl +x0931 ld a,(hl) + cp #FE + jr z,x093F ;конец таблицы секторов + ld a,#05 ;следующий сектор + add a,l + ld l,a + jr nc,x0931 + inc hl ;!!!ОШИБКА??? должно быть inc h + jr x0931 +x093F inc hl + pop bc + or a + sbc hl,bc + ld c,l + ld b,h ;размер таблицы секторов + pop hl + ret + +;АДРЕС: #0948 R8DOS #0B(11) форматирование дорожки, на которой находится +; магнитная головка дисковода. Форматирование производится согласно +; таблице секторов. Данные из таблицы напрямую переносятся на +; дискету, никаких проверок на их корректность не производится, +; заканчивает таблицу идентификационный байт, больший 128. Размер +; сектора выбирается согласно байту +4, заполняется сектор +; константой #00/#FF. После записи очередного сектора в байт по +; адресу, содержащемуся в регистре DE, записывается число 2Ch, а +; значение DE увеличивается на единицу. +;вх: b =#00/#40 - режим FM/MFM +; hl - таблица расположения секторов +; de - адрес рабочего буфера (6 - 7 килобайт) +x0948 call x03A2 ;установка номера дорожки для позиционирования + ld (xDDA7),de ;сохраним de + ld e,b + bit 5,(iy+#0B) + jr z,x0969 ;функции вызываются из монитора + call x092F ;вычисление размера таблицы секторов + call x1B45 ;определение необходимости копирования памяти пользователя + jr nc,x0969 ;память копировать не надо + push de + ld de,xEBF5 + push de + rst #30 + dw rom2_x0753 ;сохранение области памяти в ram 8 + db #02 + pop hl + pop de +;форматирование дорожки +x0969 ld b,e + call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу + jr z,x09B2 ;реальная дискета +; образ диска tr-dos + push hl + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld (hl),b + ld hl,xE6A9 ;очистка буфера + ld (hl),#00 + ld de,xE6A9+1 + ld bc,#00FF + ldir + pop hl + ld de,(xDDA7) +x0986 ld a,(hl) + cp #FE + ret z ;конец таблицы секторов + or a + jr nz,x09A1 ;сектор не прочитан + inc hl + inc hl + inc hl + push de + ld e,(hl) + dec e ;логический номер сектора + push hl + ld hl,xE6A9 + call x0708 ;запись сектора на образ HDD + pop hl + pop de + dec hl + dec hl + dec hl + jr nc,x09A5 ;ошибок не было +x09A1 ld a,#2B ;ошибка + jr x09A7 +x09A5 ld a,#2C ;ошибок не было +x09A7 ld (de),a + inc de + ld a,#05 + add a,l + ld l,a + jr nc,x0986 + inc h + jr x0986 +; реальная дискета +x09B2 ld de,(xDDA7) + push de + push hl + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld (hl),b + push bc + call x0824 ;позиционирование на заданную дорожку + call x0322 ;опрос Break и прерывание, если нажата + pop bc + pop hl + exx + ex (sp),hl ;hl' - адрес рабочего буфера + exx + ld c,#7F + ld e,#C0 + ld a,#F0 ;команда: запись дорожки + bit 6,b + jp nz,x0AAC ;режим MFM + +;запись дорожки в режиме FM +;вх: c=#7F +; e=#C0 +; a=#F0 + out (#1F),a ;команда запись дорожки +; индексное поле + ld d,#4E + ld b,#50 + call x0A98 ;запись #50 байт #4E (послеиндексный промежуток) + ld d,#00 + ld b,#0C + call x0A98 ;запись #0C байт #00 (синхропромежуток) + ld d,#F6 + ld b,#03 + call x0A98 ;запись #03 байт #F6 (запись C2 - синхронизирующий AM) + ld d,#FC + call x0AA3 ;запись байта #FC (индексная метка) +; секторы +x09EF ld d,#4E + ld b,#32 + call x0A98 ;запись #32 байт #4E (первый пробел) + ld d,#00 + ld b,#0C + call x0A98 ;запись #0C байт #00 (синхропромежуток) + ld d,#F5 + ld b,#03 + call x0A98 ;запись A1 - синхроимпульс + ld d,#FE + call x0AA3 ;запись байта #FE (адресная метка идентификатора) + inc hl + ld d,(hl) + call x0AA3 ;запись номера дорожки + inc hl + ld d,(hl) + call x0AA3 ;запись номера головки (сторона) + inc hl + ld d,(hl) + call x0AA3 ;запись номера сектора + inc hl + ld d,(hl) + call x0AA3 ;запись кода длины сектора + ld d,#F7 + call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) + ld d,#4E + ld b,#16 + call x0A98 ;запись #16 байт #4E (второй пробел) + ld d,#00 + ld b,#0C + call x0A98 ;запись #0C байт #00 (синхропромежуток) + ld d,#F5 + ld b,#03 + call x0A98 ;запись A1 - синхроимпульс + ld d,#FB + call x0AA3 ;запись байта #FB (адресная метка данных) + ld d,#00 + ld b,c + call x0A98 ;запись #7F байт #00 (данные сектора) + call x0AA3 ;запись байта #00 (данные сектора) + ld a,(hl) + or a + jr z,x0A61 ;длина сектора 128 байт + ld b,c + call x0A98 ;запись #7F байт #00 (данные сектора) + call x0AA3 ;запись байта #00 (данные сектора) + ld a,(hl) + dec a + jr z,x0A61 ;длина сектора 256 байт + call x0A98 ;запись #100 байт #00 (данные сектора) + ld a,(hl) + rrca + jr nc,x0A61 ;длина сектора 512 байт + call x0A98 ;запись #100 байт #00 (данные сектора) + call x0A98 ;запись #100 байт #00 (данные сектора) +x0A61 ld d,#F7 + call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) + ld d,#4E + ld b,#09 + call x0A98 ;запись #09 байт #4E (третий пробел) + inc hl + call x0AA3 ;запись байта #4E + exx + ld (hl),#2C ;признак записи сектора + inc hl + exx + call x0AA3 ;запись байта #4E + ld a,(hl) + rlca + jp nc,x09EF ;повторим, если не конец + call x0A8E ;запись байта #4E до конца дорожки + in a,(#1F) + exx + pop hl + exx + bit 6,a + ret z ;выход без ошибок + ld a,#02 + jp x04D1 ;ошибка: защита от записи + +;запись чисел D в порт C до конца дорожки +;вх: e - маска для регистра состояния +; d - байт для записи +; c - порт +x0A8E in a,(#FF) + and e + jr z,x0A8E + ret m + out (c),d + jr x0A8E + +;запись B чисел D в порт C +;вх: e - маска для регистра состояния +; d - байт для записи +; c - порт +; b - количество байт для записи +x0A98 in a,(#FF) + and e + jr z,x0A98 + ret m + out (c),d + djnz x0A98 + ret + +;запись числа D в порт C +;вх: e - маска для регистра состояния +; d - байт для записи +; c - порт +x0AA3 in a,(#FF) + and e + jr z,x0AA3 + ret m + out (c),d + ret + +;запись дорожки в режиме MFM +;вх: c=#7F +; e=#C0 +; a=#F0 +x0AAC out (#1F),a ;команда запись дорожки +; индексное поле + ld d,#FF + ld b,#28 + call x0A98 ;запись #28 байт #FF + ld d,#00 + ld b,#06 + call x0A98 ;запись #06 байт #00 + ld d,#FC + call x0AA3 ;запись байта #FC +; секторы +x0AC1 ld d,#FF + ld b,#0C + call x0A98 ;запись #0C байт #FF + ld d,#00 + ld b,#06 + call x0A98 ;запись #06 байт #00 (пробел) + ld d,#FE + call x0AA3 ;запись байта #FE (адресная метка индексных данных) + inc hl + ld d,(hl) + call x0AA3 ;запись номера дорожки + inc hl + ld d,(hl) + call x0AA3 ;запись номера головки (сторона) + inc hl + ld d,(hl) + call x0AA3 ;запись номера сектора + inc hl + ld d,(hl) + call x0AA3 ;запись кода длины сектора + ld d,#F7 + call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) + ld d,#FF + ld b,#0B + call x0A98 ;запись #0B байт #FF + ld d,#00 + ld b,#06 + call x0A98 ;запись #06 байт #00 (второй пробел) + ld d,#FB + call x0AA3 ;запись байта #FB (адресная метка данных) + ld d,#FF + ld b,c + call x0A98 ;запись #7F байт #FF (данные сектора) + call x0AA3 ;запись байта #FF (данные сектора) + ld a,(hl) + or a + jr z,x0B25 ;длина сектора 128 байт + ld b,c + call x0A98 ;запись #7F байт #FF (данные сектора) + call x0AA3 ;запись байта #FF (данные сектора) + ld a,(hl) + dec a + jr z,x0B25 ;длина сектора 256 байт + call x0A98 ;запись #100 байт #FF (данные сектора) + ld a,(hl) + rrca + jr nc,x0B25 ;длина сектора 512 байт + call x0A98 ;запись #100 байт #FF (данные сектора) + call x0A98 ;запись #100 байт #FF (данные сектора) +x0B25 ld d,#F7 + call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) + ld d,#FF + ld b,#05 + call x0A98 ;запись #05 байт #FF (третий пробел) + inc hl + call x0AA3 ;запись байта #FF + exx + ld (hl),#2C ;признак записи сектора + inc hl + exx + call x0AA3 ;запись байта #FF + ld a,(hl) + rlca + jp nc,x0AC1 ;повторим, если не конец + call x0A8E ;запись байта #FF до конца дорожки + in a,(#1F) + exx + pop hl + exx + bit 6,a + ret z ;выход без ошибок + ld a,#02 + jp x04D1 ;ошибка: защита от записи + +;АДРЕС: #0B52 преобразование кода размера сектора в байтах в число +;вх: c[0..3] - код размера сектора в байтах +;вых: bc - размер сектора в байтах +x0B52 ld a,c + and #03 + ld b,a + inc b + ld c,#01 +x0B59 sla c + djnz x0B59 + ld b,c + srl b + ld c,#00 + srl b + rr c + ret + +;АДРЕС: #0B67 R8DOS #0F(15) замена идентификатора в таблице расположения секторов +;вх: hl - адрес таблицы секторов +; e - заменяемый идентификатор +; d - устанавливаемый идентификатор +; +x0B67 bit 5,(iy+#0B) + jr z,x0B8F ;замена идентификаторов в таблице секторов + call x092F ;bc - размер таблицы секторов + call x1B45 + jr nc,x0B8F ;вся таблица в пределах [#4000..#BFFF] + push hl ;замена с переносом в буфер + push bc + push de + ld de,xE5A9 ;буфер + push de + rst #30 + dw rom2_x0753 ;сохранение области памяти в ram 8 + db #02 + pop hl + pop de + call x0B8F ;замена идентификаторов в таблице секторов + pop bc + pop de + ld hl,xE5A9 + rst #30 + dw rom2_x0749 ;восстановление области памяти из ram 8 + db #02 + ret +x0B8F push hl + pop ix + jr x0BF5 ;замена идентификаторов в таблице секторов + +;АДРЕС: #0B94 R8DOS #0C(12) чтение дорожки. Порядок считывания определяется +; содержимым таблицы расположения секторов. Считанные сектора +; помещаются в буфер дорожки, никаких разделителей между ними не +; ставится. Сектора со значением идентификационного байта #FF или +; #FC не считываются, но в буфере для них пропускается +; соответствующее длине (байт +4) место. Если сектор не может быть +; считан, то соответствующий идентификатор в таблице заменяется на +; #FD. Идентификатор успешно считанного сектора заменяется на #FC, +; а по окончании операции все идентификаторы #FC автоматически +; переводятся в #00 +;вх: hl - адрес таблицы секторов +; de - адрес буфера дорожки +x0B94 ld a,#80 + jr x0B9A + +;АДРЕС: #0B98 R8DOS #0D(13) последовательная запись. Порядок записи определяется +; содержимым таблицы расположения секторов. Сектора, для которых значение +; идентификационного байта #FF или #FC не записываются, а в буфере +; пропускается соответствующее длине такого сектора (байт + 4) место. +; Если сектор не может быть записан, то соответствующий идентификатор в +; таблице заменяется на #FD. По окончании записи все идентификаторы #FC +; автоматически переводятся в #00. +;вх: hl - адрес таблицы секторов +; de - адрес буфера дорожки +x0B98 ld a,#A0 +x0B9A ld (xFFE1),a + ld (xFFE2),de + ld (xFFE4),de + call x03A2 ;установка номера дорожки для позиционирования + bit 5,(iy+#0B) + jr z,x0C08 ;вызов из монитора + call x092F ;вычисление размера таблицы секторов + call x1B45 ;определение необходимости копирования памяти пользователя + jr nc,x0C08 ;копировать не надо + push hl + ld de,xE5A9 + push bc + push de + rst #30 + dw rom2_x0753 ;сохранение области памяти в ram 8 + db #02 + pop hl + call x0C08 ;чтение/запись дорожки + pop bc + pop de + ld hl,xE5A9 + rst #30 + dw rom2_x0749 ;восстановление области памяти из ram 8 + db #02 + ret + +;завершение. дорожка прочитана +x0BCE pop ix + pop bc + ld hl,xFFDD + ld a,(hl) ;код ошибки + inc a + jr z,x0BEC ;ошибок не было + ld (hl),#FF + ld de,(xFFE4) ;начало буфера дорожки + ld (xFFE2),de + ld a,(xFFDC) + rlca + jr c,x0BEA ;подключен образ, повторять нет смысла + djnz x0C12 ;повторим попытку +x0BEA ld (hl),#14 +x0BEC call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld a,(hl) + out (#3F),a + ld de,#00FC + +;замена идентификаторов в таблице секторов +;вх: ix - адрес таблицы секторов +; e - заменяемый идентификатор +; d - устанавливаемый идентификатор +x0BF5 ld bc,#0005 +x0BF8 ld a,(ix+0) + cp #FE + ret z ;конец таблицы + cp e + jr nz,x0C04 ;слезующий сектор + ld (ix+0),d ;заменяем идентификатор +x0C04 add ix,bc + jr x0BF8 + +;чтение/запись дорожки +;вх: hl - адрес таблицы секторов +; de - адрес буфера дорожки +x0C08 push hl + call x0824 ;позиционирование на заданную дорожку c тайм-аутом + pop ix ;адрес таблицы секторов + ld a,(xFFCB) ;количество попыток считывания при ошибке + ld b,a +x0C12 push bc + push ix +x0C15 ld a,(ix+0) + inc ix + cp #FC + jr z,x0C6F ;сектор не читаем. пропускаем место для него + cp #FF + jr z,x0C6F ;сектор не читаем. пропускаем место для него + cp #FE + jr z,x0BCE ;конец таблицы + call x0322 ;опрос Break и прерывание, если нажата + ld a,(ix+0) + out (#3F),a ;номер дорожки + ld c,(ix+3) ;код длины сектора + ld a,(xFFDC) + rlca + jr nc,x0C3E ;реальная дискета + ld a,c + cp #01 + ld a,#FD + jr nz,x0C67 ;на образе сектор может быть только 256 байт +x0C3E call x0B52 ;преобразование кода размера сектора в байтах в число + ld hl,(xFFE2) ;адрес в буфере дорожки + ld a,(ix+2) ;номер сектора + dec a + ld e,a + push de + ld a,(xFFE1) + bit 5,a + push af + call nz,x06B4 ;запись сектора + pop af + call z,x0610 ;чтение сектора + pop de + bit 6,a ;защита от записи + push af ;!!!ОШИБКА!!! при записи состояние регистра + ld a,#02 ;состояния не сохраняется + jp nz,x04D1 ;ошибка. прерывание функции + pop af + and #1F + ld a,#FC ;признак успешной операции + jr z,x0C6C ;!!!ОШИБКА!!! при операции записи будет всегда z +x0C67 ld (xFFDD),a ;код ошибки + ld a,#FD +x0C6C ld (ix-1),a +x0C6F ld c,(ix+3) ;код размера сектора + call x0B52 ;преобразование кода размера сектора в байтах в число + ld hl,(xFFE2) ;адрес в буфере дорожки + add hl,bc + ld (xFFE2),hl + ld bc,#0004 ;следующая запись в таблице секторов + add ix,bc + jr x0C15 + +;АДРЕС: #0C83 опрос Break. cy=1 не нажата +x0C83 push hl + ld hl,x0C96 ;адрес возврата + push hl + ld hl,rom3_x3D30 ;включение rom 7 + push hl + ld hl,rom5_x0110 ;опрос Break. cy=1 не нажата x0110 + push hl + ld hl,xFFEF + ld (hl),#C9 ;ret + jp (hl) +x0C96 pop hl + ret + +;АДРЕС: #0C98 остановка контроллера ВГ93 +;вых: a - значение выведенное в порт #FF +x0C98 call x0356 ;подготовка байта для выбора заданного дисковода + and %11111011 + out (#FF),a ;сброс ВГ93 + nop + nop + nop + or #04 + out (#FF),a ;загрузка головки, сторона верхняя, метод записи + push af + ld a,#D0 + out (#1F),a ;команда прерывания + pop af + ret + +;АДРЕС: #0CAD таблица адресоф функций R8DOS +x0CAD dw x029C ;#00(0) сброс контроллера + dw x03C5 ;#01(1) выбор текущего дисковода + dw x0457 ;#02(2) позиционирование на заданный логический трек + dw x05D8 ;#03(3) игнорирование ошибки и продолжение выполнения функции 5 (или 6) + dw x054E ;#04(4) повторить в случае ошибки функцию 5 (или 6) + dw x0553 ;#05(5) чтение группы секторов + dw x0557 ;#06(6) запись группы секторов + dw x084F ;#07(7) идентификация диска + dw x08D4 ;#08(8) идентификация диска для tr-dos + dw x0922 ;#09(9) установка рабочего буфера для функции 8 + dw x077F ;#0A(10) построение таблицы расположения секторов на дорожке, начиная от индексного маркера + dw x0948 ;#0B(11) форматирование дорожки + dw x0B94 ;#0C(12) чтение дорожки + dw x0B98 ;#0D(13) запись дорожки + dw x0502 ;#0E(14) физическое позиционирование на трек + dw x0B67 ;#0F(15) замена идентификатора в таблице расположения секторов + dw x032B ;#10(16) чтение/установка спецификации дискеты + dw x0335 ;#11(17) чтение кода спецификации дисковода + dw x0546 ;#12(18) в hl адрес таблицы с количеством секторов на дорожке + dw x02CA ;#13(19) установка режима time-out для счетчика включения двигателя дисковода + dw x11DB ;#14(20) открыть файл для последующих операций с ним + dw x1307 ;#15(21) закрыть файл, открытый функцией 20 + dw x1240 ;#16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". + dw x128C ;#17(23) запись байта в файл. Файл должен быть открыт как "логический" + dw x14C0 ;#18(24) удаление файла, адрес спецификации которого задан в регистрах hl + dw x111E ;#19(25) физический поиск файла, указанного в fcb, в каталоге диска + dw x1125 ;#1A(26) !!!ОШИБКА!!! маски, после первого поиска больше нету + dw x11B0 ;#1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) + dw x1365 ;#1C(28) последовательное чтение очередного сектора из файла + dw x1395 ;#1D(29) последовательная запись одного сектора из памяти + dw x1360 ;#1E(30) последовательное считывание заданного количества секторов + dw x1390 ;#1F(31) последовательная запись заданного количества секторов + dw x1407 ;#20(32) установка нового значения указателя в файле + dw x1545 ;#21(33) чтение из fcb в bc указателя файла + dw x1E74 ;#22(34) идентификация жесткого диска + dw x187F ;#23(35) подключение раздела к драйверу HDD + dw x1B7E ;#24(36) прямое чтение секторов из подраздела жесткого диска + dw x1BC0 ;#25(37) прямая запись секторов в подраздел жесткого диска + dw x1BFE ;#26(38) Вернуть таблицу (каталог) подраздела + dw x1C2D ;#27(39) чтение/запись сектора (???ОШИБКА???) + dw x18C0 ;#28(40) подключение раздела к драйверу HDD + +;АДРЕС: #0CFF установка переменных дисковой BIOS +x0CFF ld bc,#FFBA + ld a,%11110111 ;запрет прерываний от PIC + ld (xDFF0),a + out (c),a ;регистр данных + ld bc,#7FBA ;регистр виртуальных дисководов + ld a,#FF + ld (xDFEE),a + out (c),a + ld hl,x0D1F + ld de,xFFC0 + ld bc,#0032 + ldir + ret +;переменные дисковой BIOS +x0D1F db #1A,#0F,#08,#04 ;MFM максимальное число секторов на дорожке для сектора 128/256/512/1024 + db #16,#10,#09,#05 ;FM максимальное число секторов на дорожке для сектора 128/256/512/1024 + dw #FFC0 ;адрес таблицы с количеством секторов на дорожке + db #00 ;номер текущего дисковода: 0 - дисковода А, 1 - В + db #03 ;число попыток считывания при ошибке, начальное значение 3 + db #C0,#C0,#C0,#C0 ;коды, определяющие тип дисковода (спецификацию) A/B/C/D + db #A1,#A1,#A1,#A1 ;коды, определяющие тип дискеты в дисководе А/B/C/D + db #00,#00,#00,#00 ;текущий номер дорожки для дисковода A/B/C/D + db #FF,#FF,#FF,#FF ;код time-out для дисковода А/B/C/D + db #00 ;флаги R8DOS + db #FF ;код ошибки дискового интерпретатора + ds #11,0 ;прочие переменные + db #C9 ;ret для вызова п/п опроса Break из rom 5 + dw #0000 ;адрес рабочего буфера для функции 8 + +;АДРЕС: #0D51 определение наличия SMUC +;вых: cy=1 SMUC не найден +x0D51 ld bc,#00FE + call x0E01 + jr c,x0DA1 ;SMUC не найден + ld l,a + inc bc + call x0E01 + jr c,x0DA1 + ld h,a + ret + +;АДРЕС: #0D62 определение наличия NVRAM +x0D62 call x0D51 ;определение наличия SMUC + ret c ;если SMUC отсутствует. то и NVRAM тоже + call x0DE8 + jr c,x0DA1 ;NVRAM не найден + sbc hl,de + jr z,x0D8E +x0D6F rst #30 + dw rom4_x0378 ;запись переменных в NVRAM + db #04 + ld bc,#0000 + ld a,#61 + call x0E4B ;запись числа в A в ячейку NVRAM в BC + jr c,x0DA1 + call x0DE8 + jr c,x0DA1 + call x0E72 + jr c,x0DA1 + call x0D9A + ld a,#33 ;сообщение: NVRAM checksum error + scf + ret +x0D8E ld bc,#0000 + call x0E01 + jr c,x0DA1 ;NVRAM не найден + cp #61 + jr nz,x0D6F ;контрольное значение не совпадает. перезаписываем переменные +x0D9A set 5,(iy+#1A) + ld a,#27 ;сообщение: NVRAM found + ret +x0DA1 ld a,#26 ;сообщение: NVRAM not found + scf + ret + +;АДРЕС: #0DA5 cy=1, a=#01 !!!Not Used!!! +x0DA5 ld a,#01 + scf + ret + +;АДРЕС: #0DA9 cy=1, a=#02 !!!Not Used!!! +x0DA9 ld a,#02 + scf + ret + +;АДРЕС: #0DAD чтение всей памяти NVRAM в память #7530 +x0DAD ld hl,#7530 + ld de,#0800 + ld bc,#0000 + +;АДРЕС: #0DB6 чтение данных из NVRAM +;вх: hl - адрес куда читать +; de - сколько читать +; bc - адрес в NVRAM для чтения +x0DB6 call x0E01 + jr c,x0DC4 + ld (hl),a + inc hl + inc bc + dec de + ld a,e + or d + jr nz,x0DB6 + ret +;ошибки чтения NVRAM +x0DC4 ld a,#69 ;сообщение: NVRAM R/W error + ret + +;АДРЕС: #0DC7 запись всей памяти NVRAM из памяти #7530 +x0DC7 ld hl,#7530 + ld de,#0800 + ld bc,#0000 + +;АДРЕС: #0DD0 запись данных в NVRAM +;вх: hl - адрес откуда записывать +; de - сколько читать +; bc - адрес в NVRAM для записи +x0DD0 ld a,(hl) + call x0E4B ;запись одной ячейки NVRAM + jr c,x0DC4 + inc hl + inc bc + dec de + ld a,e + or d + jr nz,x0DD0 + call x0DE8 + jr c,x0DC4 + call x0E72 + jr c,x0DC4 + ret + +x0DE8 ld de,#FFFF + ld bc,#0000 +x0DEE call x0E01 + ret c + call x220F ;суммирование байта с контрольной суммой CRC8 + inc bc + ld a,#FE + cp c + jr nz,x0DEE + ld a,#00 + cp b + jr nz,x0DEE + ret + +x0E01 push bc + exx + ex (sp),hl + exx + push hl + push de + push af + call x0F42 + call x0E91 + jr nz,x0E41 + call x0EB1 + call x0EF7 + call x0EDE + jr nz,x0E41 + call x0F2C + call x0EA5 + set 0,d + call x0EF7 + call x0EDE + jr nz,x0E41 + call x0EB8 + call x0EDE +x0E31 call x0F1C + call x0F3E + pop af + ld a,d + or a +x0E3A pop de + pop hl + exx + ex (sp),hl + exx + pop bc + ret +x0E41 call x0F1C + call x0F3E + pop af + scf + jr x0E3A + +;запись числа в A в ячейку NVRAM в BC +x0E4B push bc + exx + ex (sp),hl ;адрес в NVRAM + exx + push hl + push de + push af + ld e,a + call x0F42 + call x0E91 + jr nz,x0E41 + call x0EB1 + call x0EF7 + call x0EDE + jr nz,x0E41 + ld d,e + call x0EF7 + call x0EDE + jr nz,x0E41 + ld d,e + jr x0E31 + +;АДРЕС: #0E72 что-то пишет в NVRAM +x0E72 ld bc,#00FE + ld a,e + call x0E4B ;запись числа в A в ячейку NVRAM в BC + ret c + inc bc + ld a,d + call x0E4B ;запись числа в A в ячейку NVRAM в BC + ret c + push bc + exx + ex (sp),hl + exx + push hl + push de + push af + call x0F42 + call x0E91 + jr nz,x0E41 + jr x0E31 + +x0E91 ld l,#C8 +x0E93 call x0F2C + call x0EA5 + call x0EF7 + call x0EDE + ret z + dec l + jr nz,x0E93 + scf + ret + +x0EA5 push af + exx + ld a,h + exx + and #07 + rlca + or %10100000 + ld d,a + pop af + ret + +x0EB1 push af + exx + ld a,l + exx + ld d,a + pop af + ret + +x0EB8 push hl + ld l,#08 + and %10111111 + or %00010000 + out (c),a +x0EC1 call x0F52 + or %01000000 + out (c),a + nop + nop + in h,(c) + sla h + sla h + rl d + call x0F52 + and %10111111 + out (c),a + dec l + jr nz,x0EC1 + pop hl + ret + +x0EDE or %00010000 + out (c),a + call x0F52 + or %01000000 + out (c),a + push hl + in l,(c) + call x0F52 + and %10111111 + out (c),a + bit 6,l + pop hl + ret + +x0EF7 push hl + ld l,#08 + and %10111111 + out (c),a +x0EFE push bc + pop bc + and %11101111 + rl d + jr nc,x0F08 + or %00010000 +x0F08 out (c),a + push bc + pop bc + or %01000000 + out (c),a + call x0F52 + and %10111111 + out (c),a + dec l + jr nz,x0EFE + pop hl + ret + +x0F1C and %11101111 + out (c),a + call x0F52 + or %01000000 + out (c),a + call x0F52 + jr x0F4A +x0F2C or %01010000 + out (c),a + call x0F52 + and %11101111 + out (c),a + call x0F52 + and %10111111 + jr x0F4C +x0F3E or %00100000 + jr x0F4A +x0F42 ld bc,#FFBA + ld a,(xDFF0) + and #DF ;%11011111 +x0F4A or #50 ;%01010000 +x0F4C ld (xDFF0),a + out (c),a + ret + +x0F52 push bc + pop bc + ret + +x0F55 db #00,#08,#00,#00 ;для сравнения чисел +x0F59 db #00,#02,#00,#00 ;для сравнения чисел + +;АДРЕС: #0F5D деление de'hl'=de'hl'/bc +;вх: de'hl' - делимое +; bc - делитель +;вых: de'hl' - значение +; hl остаток от деления +; +x0F5D ld hl,#0000 + push hl + ld e,l + ld d,h + exx + ld b,#20 +x0F66 xor a + rl l + rl h + rl e + rl d + exx + rl l + rl h + rl e + rl d + rla + or a + sbc hl,bc + ex (sp),hl + ex de,hl + sbc hl,de + ex de,hl + ex (sp),hl + exx + sbc a,#00 + jr nz,x0FAD +x0F87 inc l + djnz x0F66 + inc sp + inc sp + exx + ret +x0F8E xor a + rl l + rl h + rl e + rl d + exx + rl l + rl h + rl e + rl d + rla + add hl,bc + ex (sp),hl + ex de,hl + adc hl,de + ex de,hl + ex (sp),hl + exx + sbc a,#00 + jr z,x0F87 +x0FAD djnz x0F8E + exx + add hl,bc + jr nc,x0FB4 + inc de +x0FB4 inc sp + inc sp + ret + +;АДРЕС: #0FB7 умножение dehl=de'hl' * bc +;вх: de'hl' - первый множитель +; bc - второй множитель +;вых: dehl - значение +; +x0FB7 ld hl,#0000 + push hl + ld e,l + ld d,h + exx + ld b,#20 +x0FC0 exx + xor a + rl l + rl h + rl e + rl d + exx + rl l + rl h + rl e + rl d + jr nc,x0FED + exx + add hl,bc + ld a,e + adc a,#00 + ld e,a + ld a,d + adc a,#00 + ld d,a + exx + jr nc,x0FED + ld l,a + adc a,#00 + ld l,a + ld h,a + adc a,#00 + ld h,a + jr nc,x0FED + inc de +x0FED djnz x0FC0 + exx + inc sp + inc sp + ret + +;АДРЕС: #0FF3 инкремент dehl +;вх: dehl - число +;вых: dehl=dehl + 1 +; +x0FF3 ld c,#00 + ld a,l + add a,#01 + ld l,a + ld a,h + adc a,c + ld h,a + ld a,e + adc a,c + ld e,a + ld a,d + adc a,c + ld d,a + ret + +;АДРЕС: #1003 копирование из (hl) в (de) 4х байт +x1003 push bc + push hl + push de + ld bc,#0004 + ldir + pop de + pop hl + pop bc + ret + +;АДРЕС: #100F загрузка числа в регистры из памяти +;вх: hl - адрес откуда грузим +;вых: dehl - число +x100F push hl + pop bc + ld a,(bc) + ld l,a + inc bc + ld a,(bc) + ld h,a + inc bc + ld a,(bc) + ld e,a + inc bc + ld a,(bc) + ld d,a + ret + +;АДРЕС: #101D сложение 4х байтного числа с двухбайтным +;вх: de - адрес 2х байтного числа +; hl - адрес 4х байтного числа +;вых: по адресу hl сумма этих чисел +x101D ex de,hl + push bc + xor a + ld b,#02 +x1022 ld a,(de) + adc a,(hl) + ld (de),a + inc hl + inc de + djnz x1022 + ld a,(de) + adc a,#00 + ld (de),a + inc hl + inc de + ld a,(de) + adc a,#00 + ld (de),a + pop bc + ret + +;АДРЕС: #1035 сравнение двух чисел в памяти по адресам в de и hl +;вх: de - адрес 4х байтного числа e9e7 +; hl - адрес 4х байтного числа e9eb +;вых: nz,c,m - (hl)<(de) +; nz,nc,p - (hl)>(de) +; z,nc,p - (hl)=(de) +; +x1035 push bc + ex de,hl + inc hl + inc hl + inc hl + inc de + inc de + inc de + ld a,(de) + or a + jp m,x1048 ;(de) отрицательное + xor (hl) + jp m,x1060 ;(hl) отрицательное + jr x104C +x1048 xor (hl) + jp m,x105B ;(de) отрицательное, (hl) положительное +;сравнение чисел с одинаковым знаком +x104C ld b,#04 +x104E ld a,(de) + cp (hl) + jr c,x105B ;(de)<(hl) + jr nz,x1060 + dec hl + dec de + djnz x104E + xor a + pop bc + ret +;nz,c,m - (de вх)>(hl вх) +x105B xor a + sub #01 + pop bc + ret +;nz,nc,p - (de вх)<(hl вх) +x1060 xor a + add a,#01 + pop bc + ret + +;АДРЕС: #1065 инициализация дисковода +x1065 ld hl,#0000 + ld (xDFFE),hl + ld (xE000),hl + ld a,(xFFCA) ;номер текущего дисковода +x1071 ld c,#01 + call x0229 ;R8DOS #01(1) + xor a + ld c,a + jp x0229 ;R8DOS #00(0) + +;АДРЕС: #107B инициализация дисковода и настройка на дискету +;вых: b - код, определяющий тип дискеты в дисководе +; a - код ошибки +x107B call x1065 ;инициализация дисковода + jr c,x1097 ;ошибка + ld hl,xE5A9 + ld (xFFE7),hl ;;адрес рабочего буфера для функции 8 + ld c,#08 ;идентификация диска + call x0229 ;R8DOS #08(8) + push af + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld b,(hl) + ld hl,#0000 + ld (xFFE7),hl ;адрес рабочего буфера для функции 8 + pop af +x1097 ret nc + ld a,(xFFDD) ;код ошибки дискового интерпретатора + cp #10 + scf + ld a,#3F ;дискета не соответствует формату TR-DOS + ret z + ld a,#50 ;HDD не вышел в готовность + ret + +;АДРЕС: #10A4 распознавание имени файла и занесение его в fcb +;вх: ix - адрес буфера для fcb +; hl - адрес строки, содержащей имя и тип файла в asciz +;вых: nz - успешно +; z - ошибка +; a=#44(68) - несуществующий номер устройства +; a=#45(69) - ошибка в имени файла +; +x10A4 ld a,(xFFCA) + ld (ix+#18),a ;номер текущего дисковода +;выделение дисковода из строки + ld c,(hl) + inc hl + ld a,":" + cp (hl) + jr nz,x10CB ;дисковод не указан + ld a,c + cp "A"-1 + jr c,x10BA ;не буква + and #5F + sub #11 +x10BA sub #30 + jr nc,x10C2 +x10BE ld a,#44 ;несуществующий дисковод + or a + ret +x10C2 cp #04 + jr nc,x10BE ;несуществующий дисковод + ld (ix+#18),a ;номер дисковода + inc hl + inc hl +x10CB ld (ix+#08),"C" ;тип файла по умолчанию + dec hl +;распознаем имя и расширение файла + push ix + pop de + ld bc,#0009 +x10D6 rst #30 + dw rom2_x0D46 ;проверка символа в (hl) #2C/#3B/#00/#0D + db #02 + jr z,x1102 ;символ конца имент + cp #2E ;. + jr nz,x10E7 ;допустимый в имени символ + inc hl + call x110F ;проверка символа расширения файла + jr z,x10F7 ;допустимый символ расширения + dec hl ;иначе распознаем точку как символ имени файла +x10E7 ldi + jp pe,x10D6 +x10EC rst #30 ;имя и расширение заполнено + dw rom2_x0D42 ;проверка символа в (hl) #20/#2C/#3B/#00/#0D + db #02 + scf + ccf + ret z ;конец строки +x10F3 ld a,#45 ;ошибка в имени файла + or a + ret +x10F7 ld (ix+#08),a + call x1102 ;заполнение остатка имени пробелами + jr nz,x10F3 ;пустое имя. ошибка в имени файла + inc hl + jr x10EC ;проверка остатка строки +x1102 ld a,#09 + cp c + jr z,x10F3 ;пустое имя. ошибка в имени файла +x1107 dec c ;заполнение остатки мени пробелами + ret z + ld a," " + ld (de),a + inc de + jr x1107 +;проверка символа расширения файла +x110F ld a,(hl) + cp #23 ;# + ret z + and %11011111 + cp #43 ;C + ret z + cp #42 ;B + ret z + cp #44 ;D + ret + +;АДРЕС: #111E R8DOS #19(25) физический поиск файла, указанного в fcb, в каталоге диска +;вх: ix - адрес буфера fcb (в имени файла допустимы заменители '?') +;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе или флаге Z +; a=#50(80) - ошибка диска +; cy=0, z - файл не найден +; cy=0, nz - файл найден и скопирован в fcb +; +x111E call x153D ;копирование дескриптора дисковода в буфер + call x107B ;инициализация дисковода + ret c ;ошибка + +;АДРЕС: #1125 R8DOS #1A(26) продолжает поиск файла, указанного в fcb !!!ОШИБКА!!! маски, после первого поиска больше нету +;вх: ix - адрес буфера fcb (в имени файла допустимы заменители '?') +;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе или флаге Z +; a=#50(80) - ошибка диска +; cy=0, z - файл не найден +; cy=0, nz - файл найден и скопирован в fcb +; +x1125 push hl +x1126 pop hl + call x1166 ;загрузка очередного дескриптора файла в буфер + ld (ix+#19),c + ret c ;ошибка загрузки: a=#50 + ret z ;конец каталога. файл не найден +;сравнение имени файла с маской поиска + push hl + push ix + pop de + ld b,#09 +x1135 ld a,(de) + cp "?" + jr z,x113D + cp (hl) + jr nz,x1126 ;не совпало, следующее имя файла +x113D inc hl + inc de + djnz x1135 + pop hl +;файл найден. копируем дескриптор в fcb +x1142 push hl + ld bc,#0010 + push ix + pop de + ldir + pop hl + inc b ;флаг nz + ret + +;АДРЕС: #114E загрузка дескриптора файла в буфер +;вх: c - номер файла на диске +;вых: cy=1 -> a=#50 ошибка чтения диска +; hl - адрес дескриптора файла в буфере +; c - номер этого файла на диске [#00..#7F] +x114E ld hl,xDFFE + ld a,c + and %01110000 + rrca + rrca + rrca + rrca + ld (hl),a ;номер сектора + inc hl + inc a + ld (hl),a ;номер следующего сектора + inc hl + ld a,c + and #0F + dec a + ld (hl),a ;номер записи в секторе + dec hl + ld a,(hl) + jr x1177 + +;АДРЕС: #1166 загрузка очередного дескриптора файла в буфер +;вых: cy=1 -> a=#50 ошибка чтения диска +; cy=0, z - конец каталога. файл не найден +; cy=0, nz - дескриптор найден +; hl - адрес дескриптора файла в буфере +; c - номер этого файла на диске [#00..#7F] +x1166 ld hl,xDFFE + ld a,(hl) + inc a + inc hl + cp (hl) + inc hl + jr z,x1182 ;сектор уже загружен + ld (hl),#FF ;сброс номера дескриптора файла + cp #09 + ret nc ;выход. конец каталога + dec hl + ld (hl),a ;номер следующего сектора +x1177 inc hl + push hl + ld e,a + dec e ;e - номер сектора + call x1567 ;чтение одного сектора нулевой дорожки в буфер + pop hl + ld a,#50 + ret c ;ошибка +x1182 ld a,(hl) + inc a + cp #10 + jr c,x118D ;следующий номер дескриптора файла в загруженном секторе + dec hl ;нет больше записей в загруженном секторе + dec hl + inc (hl) + jr x1166 ;грузим следующий сектор +x118D ld (hl),a ;номер дескриптора файла в загруженном секторе [#0..#F] + rlca + rlca + rlca + rlca + ld hl,xE5A9 ;буфер загруженного сектора + call x11AB ;hl=hl+a*#10 (адрес дескриптора файла) + ld a,(xDFFE) ;номер загруженного сектора [#01..#10] + rlca + rlca + rlca + rlca + ld c,a + ld a,(xE000) ;номер дескриптора файла в загруженном секторе [#0..#F] + or c + ld c,a ;номер дескрптора файла на диске [#00..#7F] + inc a ;установка флага nz + ret + +;АДРЕС: #11A7 получение адреса байта в буфере dma +;вх: c - смещенеи в буфере +x11A7 call x1553 ;чтение из fcb в hl адреса буфера dma + ld a,c +x11AB add a,l + ld l,a + ret nc + inc h + ret + +;АДРЕС: #11B0 R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) +;вх: hl - адрес строки имени файла в asciz +; ix - адрес буфера создаваемого fcb +; de - адрес буфера dma +; b - способ открытия +;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе: +; a=#4A(74) - неверный тип файла +; a=#44(68) - несуществующий номер устройства +; a=#45(69) - ошибка в имени файла +; ix - адрес буфера fcb +; +x11B0 push bc ;очищаем блок fcb + push ix + ex (sp),hl + ld b,#1C + xor a +x11B7 ld (hl),a + inc hl + djnz x11B7 + pop hl + pop bc + ld (ix+#15),e ;адрес буфера + ld (ix+#16),d + ld (ix+#17),b ;способ открытия + ld a,#03 ;проверка типа открытия файла + and b + ld a,#4A + ccf + ret z + call x10A4 ;распознавание имени файла и занесение его в fcb + scf + ret nz ;ошибка распознавания + or a + ret + +;АДРЕС: #11D4 открыть файл(для нужд монитора) для последующих операций с ним +x11D4 ld de,xE8A9 ;адрес буфера dma + ld ix,xE7A9 ;адрес буфера для fcb + +;АДРЕС: #11DB R8DOS #14(20) открыть файл для последующих операций с ним +;вх: ix - адрес буфера для fcb +; hl - адрес строки, содержащей имя и тип файла в asciz +; de - адрес буфера dma +; b - способ открытия +; 2,b =1 обмен целыми секторами "физический" файл +; (если сброшен - обмен будет вестись байтами "логический" файл) +; 1,b =1 файл для записи +; 0,b =1 файл для чтения +; 0-1,b=11 файл для модификации +;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе: +; a=#47(71) - нельзя открыть существующий файл только для записи +; a=#48(72) - нельзя создать файл только для чтения +; a=#49(73) - нет места на диске +; a=#4A(74) - неверный тип файла +; a=#44(68) - несуществующий номер устройства +; a=#45(69) - ошибка в имени файла +; cy=0 - успешно +; bc - длина файла в байтах +; +x11DB call x11B0 ;разбор спецификации файла + ret c ;ошибка + +;АДРЕС: #11DF открыть файл для последующих операций с ним +x11DF call x111E ;поиск файла на диске по имени в fcb + ret c ;ошибка чтения диска + jr z,x1200 ;файл не найден + bit 0,(ix+#17) ;файл найден + ld a,#47 + scf + ret z ;нельзя открыть существующий файл только для записи + xor a + bit 2,(ix+#17) + jr nz,x11FB ;обмен секторами + ld c,(ix+#0B) + ld b,(ix+#0C) ;bc - длина файла + ret +x11FB ld c,a + ld b,(ix+#0D) ;bc - длина файла (кратна сектору) + ret +x1200 bit 1,(ix+#17) ;файл не найден + ld a,#48 + scf + ret z ;нельзя создать файл только для чтения + call x107B + ret c ;ошибка чтения/записи + ld a,(xE5A9+#E4) ;xE68D количество файлов на дискете + ld (ix+#19),a ;номер файла на дискете + cp #80 + ld a,#49 + ccf + ret c ;нет места на диске + ld bc,(xE5A9+#E5) ;xE68E кол-во свободных секторов + ld a,c + or b + ld a,#49 + ccf + ret z ;нет места на диске + ld a,b + or a + jr z,x1228 + ld c,#FF +x1228 ld (ix+#1B),c ;максимальный объем файла в секторах + ld hl,(xE5A9+#E1) ;xE68A номер первой свободной дорожки и сектора + ld (ix+#0E),l ;сектор + ld (ix+#0F),h ;дорожка + ld a,b + or a + jr nz,x123C + ld b,c + ld c,#00 ;максимальный размер файла в байтах + ret +x123C ld bc,#FFFF ;!!!ОШИБКА!!! должно быть ld bc,#FF00 + ret + +;АДРЕС: #1240 R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". +;вх: ix - адрес буфера fcb +;вых: cy=1 были ошибки +; a - код ошибки возвращается в аккумуляторе +; a - очередной считанный байт (при cy=0) +x1240 ld c,(ix+#17) + bit 0,c + ld a,#4A + scf + ret z ;ошибка. файл открыт на запись + bit 2,c + call x1545 ;чтение из fcb в bc указателя файла + jr nz,x125E ;файл открыт как физический (чтение целых секторов) + call x154C ;чтение из fcb в hl длины файла + or a + sbc hl,bc + jr z,x125A + jr nc,x125E +x125A scf ;ошибка. конец файла + ld a,#46 + ret +x125E ld a,c + or a + jr nz,x126C ;указатель не в начале сектора + ld a,b + cp (ix+#0D) + jr nc,x125A ;ошибка. конец файла + call x1472 ;чтение сектора в буфер dma + ret c ;ошибка чтения +x126C call x11A7 ;получение адреса байта в буфере dma + ld a,(hl) + ld (ix+#1A),a + ld a,#FF + cp c + jr nz,x1287 ;еще не конец сектора + ld a,(ix+#17) + bit 1,a + jr z,x1287 ;файл открыт для чтения + bit 7,a + jr z,x1287 ;файл не был изменен + call x1484 ;сохранение буфера dma в файл + ret c ;ошибка записи +x1287 ld a,(ix+#1A) + jr x12FE ;установка в fcb нового указателя в файле из bc + +;АДРЕС: #128C R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" +;вх: ix - адрес буфера fcb +; a - байт для записи +;вых: cy=1 были ошибки +; a - код ошибки возвращается в аккумуляторе +x128C ld (ix+#1A),a + call x1545 ;чтение из fcb в bc указателя файла + ld e,(ix+#17) + bit 1,e + ld a,#4A ;!!!ОШИБКА!!! не устанавливается cy + ret z ;ошибка. файл открыт на чтение + bit 0,e + jr z,x12B8 ;файл открыт только на запись + bit 2,e ;обмен целыми секторами "физический" файл + jr nz,x12B8 ;запись байта в файл + call x154C ;чтение из fcb в hl длины файла + or a + sbc hl,bc + jr z,x12AC ;ошибка #46. конец файла + jr nc,x12B8 ;запись байта в файл +x12AC bit 7,e + jr z,x12B4 ;изменение в файле не было + call x1484 ;сохранение буфера dma в файл + ret c ;ошибка записи + +;код ошибки #46. конец файла +x12B4 ld a,#46 + scf + ret + +;запись байта в файл +x12B8 ld a,c + or a + jr nz,x12EA ;указатель не в начале сектора + bit 0,e + jr nz,x12DB ;файл открыт для модификации + ld a,b + cp (ix+#1B) + jr nc,x12D3 ;попытка записи после конца файла + ld a,(ix+#0D) + cp #FF + jr nz,x12E7 ;увеличение размена файла на один сектор + call x1329 ;создание записи в каталоге диска + ret c ;ошибка записи + jr x12B4 ;ошибка #46. конец файла + +;ошибка #49. попытка записи после конца файла +x12D3 call x1329 ;создание записи в каталоге диска + ret c + ld a,#49 ;ошибка #49. попытка записи после конца файла + scf + ret +x12DB ld a,b + cp (ix+#0D) + jr nc,x12B4 ;ошибка #46. конец файла + call x1472 ;чтение сектора в буфер dma + ret c ;ошибка чтения + jr x12EA + +x12E7 inc (ix+#0D) ;увеличим размер файла в секторах +x12EA call x11A7 ;получение адреса байта в буфере dma + ld a,(ix+#1A) + ld (hl),a ;запись файла в буфер + set 7,(ix+#17) ;файл был изменен, но не сохранен + ld a,c + cp #FF + jr nz,x12FE ;установка в fcb нового указателя в файле из bc + call x1484 ;сохранение буфера dma в файл + ret c ;ошибка записи +x12FE inc bc + +;АДРЕС: #12FF установка в fcb указателя в файле из bc +x12FF ld (ix+#13),c + ld (ix+#14),b + or a + ret + +;АДРЕС: #1307 R8DOS #15(21) закрыть файл, открытый функцией 20. При закрытии +; файла происходит дозапись (при необходимости) информации из +; открытых буферов +;вх: ix - адрес буфера fcb +;вых: cy=1 - были ошибки +; a - код ошибки +x1307 call x1545 ;чтение из fcb в bc указателя файла + ld a,c + or b + jr z,x130F ;файл пустой + dec bc +x130F call x12FF ;установка в fcb указателя в файле из bc + ld a,(ix+#17) + bit 1,a + ret z ;файл только для чтения + bit 7,a + jr z,x1320 ;не сохраненных изменений нет + call x1484 ;сохранение буфера dma в файл + ret c ;была ошибка +x1320 bit 0,(ix+#17) + ret nz ;файл для модификации + call x1545 ;чтение из fcb в bc указателя файла + inc bc + +;создание записи в каталоге диска +;вх: bc - длина файла в байтах +x1329 call x1440 ;сохранение из bc в fcb длины файла в байтах и секторах + call x13D5 ;создание записи в каталоге диска (на основе fcb) + ret c + call x107B ;чтение в буфер служебного сектора + ret c + ld a,(xE5A9+#E4) ;xE68D + inc a + ld (xE5A9+#E4),a ;xE68D количество файлов +1 + ld hl,(xE5A9+#E5) ;xE68E + ld c,(ix+#0D) + ld b,#00 + or a + sbc hl,bc + ld (xE5A9+#E5),hl ;xE68E оставшееся свободное место в секторах + ld b,c + call x14A6 ;расчет нового номера дорожки и сектора + ld (xE5A9+#E1),de ;xE68A первая свободная дорожка и сектор + ld de,#0008 ;запишем служебный сектор +;запись буфера на диск (d - дорожка, e - сектор) +x1354 ld hl,xE5A9 +x1357 ld bc,#0106 + call x0229 + ld a,#50 + ret + +;АДРЕС: #1360 R8DOS #1E(30) последовательное считывание заданного количества +; целых секторов. Функция 30 (R_MS) подобна многократному +; выполнению функции #1C(28), с той лишь разницей, что значение, +; указанное в поле dma не изменяется. В случае ошибки полагается, +; что все сектора не считались +;вх: ix - адрес буфера fcb +; b - число считываемых секторов +;вых: cy=1 если были ошибки +; a - код ошибки + +x1360 ld (ix+#1A),b + jr x1369 + +;АДРЕС: #1365 R8DOS #1C(28) последовательное чтение очередного сектора из файла, +; содержимое сектора размещается в памяти с адреса, указанного полем +; dma в блоке управления файлом (fcb). Для обеспечения максимальной +; скорости выполнения операции Файл должен быть открыт как +; "физический". Если файл был в режиме "логический" и если +; предварительно был считан байт (т. е. счетчик указывает не на +; границу целого сектора) подфункцией будет "пересчитан" текущий +; сектор. Максимальный номер сектора - 254. +;вх: ix - адрес буфера fcb +;вых: cy=1 если были ошибки +; a - код ошибки +x1365 ld (ix+#1A),#01 +x1369 bit 0,(ix+#17) + ld a,#4A + scf + ret z ;ошибка. файл открыт на запись + call x1545 ;чтение из fcb в bc указателя файла + ld c,#00 + ld a,b + add a,(ix+#1A) + jp c,x12B4 ;ошибка #46. конец файла + dec a + cp (ix+#0D) + jp nc,x12B4 ;ошибка #46. конец файла + call x148D ;чтение секторов в буфер dma + ret c ;ошибка чтения +x1388 ld a,b + add a,(ix+#1A) + ld b,a + jp x12FF ;установка в fcb нового указателя в файле из bc + +;АДРЕС: #1390 R8DOS #1F(31) последовательная запись заданного количества +; секторов. Подфункция 31 (W_MS) подобна многократному выполнению +; подфункции #1D(29), с той лишь разницей, что значение, указанное +; в поле dma не изменяется. В случае ошибки полагается, что все +; сектора, принимавшие участие в операции получили случайные +; значения. +;вх: ix - адрес буфера fcb +; b - число записываемых секторов +;вых: cy=1 если были ошибки +; a - код ошибки +x1390 ld (ix+#1A),b + jr x1399 + +;АДРЕС: #1395 R8DOS #1D(29) последовательная запись одного сектора из памяти с +; адреса, указанного полем dma в блоке управления файлом (fcb), в +; файл +;вх: ix - адрес буфера fcb +;вых: cy=1 если были ошибки +; a - код ошибки +x1395 ld (ix+#1A),#01 +x1399 ld e,(ix+#17) + bit 1,e + ld a,#4A + ret z ;!!!ОШИБКА!!! cy не установлен + call x1545 ;чтение из fcb в bc указателя файла + ld c,#00 + ld a,b + add a,(ix+#1A) + jp c,x12B4 ;ошибка #46 конец файла + dec a + bit 0,e + jr nz,x13BA ;файл открыт на модификацию + cp (ix+#1B) + jp nc,x12D3 ;ошибка #49. попытка записи после конца файла + jr x13C0 +x13BA cp (ix+#0D) + jp nc,x12B4 ;ошибка #46. конец файла +x13C0 call x1498 ;запись секторов из буфера dma + ret c ;ошибка записи + bit 0,(ix+#17) + jr nz,x1388 ;файл для модификации + ld a,(ix+#0D) + add a,(ix+#1A) + ld (ix+#0D),a ;новый размер файла + jr x1388 + +;АДРЕС: #13D5 создание записи в каталоге диска (на основе fcb) +x13D5 call x153D ;копирование дескриптора дисковода в буфер + ld b,#04 + ld d,#00 + ld e,(ix+#19) ;номер файла на диске +x13DF sla e + rl d + djnz x13DF ;de - адрес дескриптора в каталоге диска + push de + ld e,d + call x1567 ;чтение одного сектора нулевой дорожки в буфер (e - номер сектора) + pop de + ld a,#50 + ret c ;ошибка чтения + push de + ld d,#00 + ld hl,xE5A9 + add hl,de ;адрес дескриптора в буфере + ex de,hl + ld bc,#0010 + push ix + pop hl + ldir ;копируем дескриптор файла из fcb в буфер + pop de + ld e,d + ld d,#00 + jp x1354 ;запись буфера на диск (дорожка 0, e - сектор) + +;АДРЕС: #1405 установка нового значения указателя в файле +;вх: ix - адрес буфера fcb +; bc - новое значение указателя +;вых: cy=1 - если были ошибки +; a - код ошибки +x1405 ld e,c + ld d,b + +;АДРЕС: #1407 R8DOS #20(32) установка нового значения указателя в файле +;вх: ix - адрес буфера fcb +; de - новое значение указателя +;вых: cy=1 - если были ошибки +; a - код ошибки +x1407 call x1545 ;чтение из fcb в bc указателя файла + ld a,(ix+#17) + bit 0,a + jr nz,x1419 ;файл для чтения + ex de,hl + add hl,bc + ex de,hl + jr nc,x1419 ;нет переполнения + ld a,#46 ;ошибка #46 конец файла + ret +x1419 bit 1,a + jr z,x144F ;файл только для чтения + ld a,d + cp b + jr z,x142D ;новый указатель в пределах текущего сектора + bit 7,(ix+#17) + jr z,x142D ;не сохраненных изменений в файле нет + push de + call x1484 ;сохранение буфера dma в файл + pop de + ret c ;ошибка записи +x142D bit 0,(ix+#17) + jr nz,x144F ;файл открыт на модификацию + ld a,d + cp (ix+#1B) ;максимальный объем файла в секторах + jp nc,x12B4 ;ошибка #46 конец файла + ld b,d + ld c,e + call x12FF ;установка в fcb указателя в файле из bc + inc bc + +;сохранение из bc в fcb длины файла в байтах и секторах +x1440 ld (ix+#0B),c + ld (ix+#0C),b ;длина файла в байтах + ld a,c + or a + jr z,x144B + inc b +x144B ld (ix+#0D),b ;длина файла в секторах + ret + +;файл только для чтения +x144F bit 2,(ix+#17) + jr z,x145E ;обмен байтами "логический" файл + ld a,d + cp (ix+#0D) + jp nc,x12B4 ;ошибка #46. конец файла + jr x146A +x145E call x154C ;чтение из fcb в hl длины файла + push de + ex de,hl + or a + sbc hl,de + pop de + jp nc,x12B4 ;ошибка #46. конец файла +x146A ld c,e + ld b,d ;новый указатель + call x12FF ;установка в fcb указателя в файле из bc + ld a,c + or a + ret z + +;АДРЕС: #1472 чтение сектора в буфер dma +x1472 push bc + call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) + ld bc,#0105 + +;запись/чтение сектора +x1479 call x0229 + pop bc + ld a,#50 + res 7,(ix+#17) + ret + +;АДРЕС: #1484 сохранение буфера dma в файл +;вх: bc - указатель из fcb +x1484 push bc + call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) + ld bc,#0106 + jr x1479 ;запись сектора + +;АДРЕС: #148D чтение секторов в буфер dma +;вх: bc - указатель в файле +x148D push bc + call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) + ld c,#05 +x1493 ld b,(ix+#1A) + jr x1479 ;чтение секторов + +;АДРЕС: #1498 запись секторов из буфера dma +x1498 push bc + call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) + ld c,#06 + jr x1493 + +;АДРЕС: #14A0 расчет адреса в файле на диске (дорожка и сектор) +;вх: bc - указатель в файле +;вых: d - дорожка +; e - сектор +x14A0 call x153D ;копирование дескриптора дисковода в буфер + call x1553 ;чтение из fcb в hl адреса буфера dma + +;АДРЕС: #14A6 расчет нового номера дорожки и сектора +;вх: b - кол-во секторов +;вых: d - новый номер дорожки +; e - новый номер сектора +x14A6 ld a,b + and #F0 + rrca + rrca + rrca + rrca + add a,(ix+#0F) ;+номер начальной дорожки файла + ld d,a ;новый номер дорожки + ld a,b + and #0F + add a,(ix+#0E) ;+номер первого сектора файла + bit 4,a + jr z,x14BC + inc d +x14BC and #0F + ld e,a ;новый номер сектора + ret + +;АДРЕС: #14C0 R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl +;вх: ix - адрес буфера для fcb +; hl - имя и тип в asciz +;вых: cy=1 - были ошибки +; a - код ошибки +x14C0 ld b,#01 + call x11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) + ret c ;были ошибки + call x111E ;R8DOS #19(25) физический поиск файла, указанного в fcb, в каталоге диска + ret c ;были ошибки + ld a,#48 ;ошибка #48 файл не найден + scf + ret z + push hl + ld hl,xE6A9 + ld bc,#0105 + ld de,#0008 + call x0229 ;чтение служебного сектора + pop hl + ld a,#50 + ret c ;ошибка #50. диск не вышел в готовность + ld a,(xE6A9+#E4) + dec a + cp (ix+#19) + jr z,x14FD ;этот файл последный на диске + ld hl,xE6A9+#F4 + inc (hl) ;количество удаленных файлов +1 + ld (ix+#00),#01 ;признак удаленного файла + call x13D5 ;создание записи в каталоге диска (на основе fcb) + ret c ;ошибка записи +x14F4 ld hl,xE6A9 + ld de,#0008 + jp x1357 ;запись служебного сектора на диск +;удаляемый файл последний в каталоге +x14FD ld hl,xE6A9+#E4 + dec (hl) ;количество файлов -1 + ld e,(ix+#0D) + ld d,#00 ;объем удаляемого файла в секторах + ld hl,(xE6A9+#E5) ;количество свободных секторов + add hl,de + ld (xE6A9+#E5),hl ;новое количество свободных секторов + ld l,(ix+#0E) + ld h,(ix+#0F) + ld (xE6A9+#E1),hl ;номер первой свободной дорожки и сектора + ld (ix+#00),#00 ;признак удаленного файла + call x13D5 ;создание записи в каталоге диска (на основе fcb) + ret c ;ошибка записи + ld c,(ix+#19) + ld a,c + or a + jr z,x14F4 ;файл первый на диске + dec c + ld (ix+#19),c + call x114E ;загрузка дескриптора файла в буфер + ret c ;ошибка чтения + call x1142 ;копируем дескриптор в fcb + ld a,(ix+#00) + cp #02 + jr nc,x14F4 ;файл существует. запись служебного сектора на диск + ld hl,xE6A9+#F4 ;файл удален + dec (hl) + jr x14FD + +;АДРЕС: #153D копирование дескриптора дисковода в буфер +x153D ld a,(ix+#18) ;номер дисковода + rst #30 + dw rom2_x2C4D ;копирование дескриптора дисковода в буфер xE590, + db #02 ;если к нему примонтирован образ + ret + +;АДРЕС: #1545 R8DOS #21(33) чтение из fcb в bc указателя файла +;вх: ix - адрес буфера fcb +;вых: bc - текущее значение указателя +x1545 ld c,(ix+#13) + ld b,(ix+#14) + ret + +;АДРЕС: #154C чтение из fcb в hl длины файла +x154C ld l,(ix+#0B) + ld h,(ix+#0C) + ret + +;АДРЕС: #1553 чтение из fcb в hl адреса буфера dma +x1553 ld l,(ix+#15) + ld h,(ix+#16) + ret + +;АДРЕС: #155A чтение заголовка первого попавшегося сектора дисковода A +x155A xor a + call x1071 ;инициализация дисковода A + call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу + ret nz ;к дисководу A подключен образ + ld a,#C4 + out (#1F),a ;чтение заголовка сектора + ret + +;АДРЕС: #1567 чтение одного сектора нулевой дорожки в буфер (e - номер сектора) +x1567 ld d,#00 ;дорожка 0 + ld hl,xE5A9 ;буфер + ld bc,#0105 + jp x0229 ;R8DOS #05(5) + +;АДРЕС: #1572 определение наличия interrupt controller +x1572 ld bc,#FFBA + ld a,(xDFF0) ;состояние порта #FFBA + and #F7 + out (c),a + ld (xDFF0),a + ld bc,#7EBE + ld a,#F3 + out (c),a + nop + ld b,#7F + ld a,#C5 + out (c),a + nop + ld a,#01 + out (c),a + nop + nop + in a,(c) + or a + jr z,x15A1 + cp #01 + jr z,x15A5 +x159D ld a,#24 ;сообщение: interrupt controller not found + scf + ret +x15A1 set 4,(iy+#1B) +x15A5 ld b,#7E + ld a,#F2 + out (c),a + nop + ld b,#7F + ld a,#C5 + out (c),a + nop + ld a,#FF + out (c),a + nop + nop + in a,(c) + cp #FF + jr nz,x159D + set 4,(iy+#1A) + xor a + ld a,#25 ;сообщение: interrupt controller found + ret + +;АДРЕС: #15C7 определение наличия последовательного порта/модема +;#28 modem not found +;#29 modem found +;#2A serial port not found +x15C7 ld bc,#FFBA + ld a,(xDFF0) ;состояние порта #FFBA + or %00000110 + and %01111110 + out (c),a + push bc + ld b,#0F + djnz $ + pop bc + or %00000001 + ld (xDFF0),a ;состояние порта #FFBA + out (c),a + ld b,#6B + djnz $ + ld hl,xEA9D + xor a + or (hl) + jr nz,x15F6 + ld de,x169A ;сброс модема + push hl + ex de,hl + ld bc,#0007 + ldir + pop hl +x15F6 call x1601 + ret c + set 5,(iy+#1A) + ld a,#29 ;сообщение: modem found + ret +; передача команды модему +x1601 ld bc,#7AFE ;hl=xEA9D + in a,(c) + cp #FF + jr nz,x160E +x160A ld a,#2A ;сообщение: serial port not found + scf + ret +x160E ld a,(hl) + bit 6,a + jr z,x1647 + and #1F + or #80 + ld b,#7B + out (c),a + nop + in e,(c) + cp e + jr nz,x160A ;нет порта + inc hl + ld a,(hl) + dec hl + and #0F + cp #0C + jr c,x162C + ld a,#05 +x162C add a,a + ld e,a + ld d,#00 + push hl + ld hl,x16A1 + add hl,de + ld b,#78 + ld a,(hl) + out (c),a + inc hl + ld a,(hl) + inc b + out (c),a + pop hl + ld a,(hl) + and #1F + ld b,#7B + out (c),a +x1647 bit 5,(hl) + jr z,x1658 + inc hl + ld a,(hl) + dec hl + and #F0 + rlca + rlca + rlca + rlca + ld b,#79 + out (c),a +x1658 or a + bit 7,(hl) + ret z + inc hl +x165D inc hl + ld a,(hl) + or a + ret z + cp #7C + jr nz,x166D + ld a,#0D + call x1673 ;передача команды модему (в com порт) + ret c + ld a,#0A +x166D call x1673 ;передача команды модему (в com порт) + ret c + jr x165D +; передача команды модему (в com порт) +x1673 push hl + push af + ld hl,#0814 ;счетчик попыток + ld bc,#00FE +x167B push bc + ld b,#05 + in a,(c) + pop bc + bit 5,a + jr nz,x1692 + djnz x167B + dec hl + ld a,h + or l + jr nz,x167B + pop af + pop hl + ld a,#28 ;modem not found + scf + ret +x1692 pop af + ld b,#78 + out (c),a + or a + pop hl + ret +x169A db %11100011,#05,"ATZ",#7C,#00 ;команда сброса модема +x16A1 db #10,#04 ;#00 + db #00,#03 ;#01 + db #80,#01 ;#02 + db #C0,#00 ;#03 + db #60,#00 ;#04 + db #30,#00 ;#05 + db #18,#00 ;#06 + db #0C,#00 ;#07 + db #06,#00 ;#08 + db #03,#00 ;#09 + db #02,#00 ;#0A + db #01,#00 ;#0B + +;АДРЕС: #16B9 работа с контроллером прерываний +x16B9 ld hl,x1764 + ld de,#9C40 + ld bc,#0003 + ldir + di + ld a,#01 + ld hl,#9C40 + call x175D ;вызов процедуры из основной памяти + ld bc,#FFBA + ld a,(xDFF0) + and #F7 + out (c),a + ld (xDFF0),a + ld bc,#7EBE + ld a,#1A + out (c),a + nop + ld b,#7F + ld a,#F8 + out (c),a + nop + ld a,#FE + out (c),a + nop + ld b,#0A + ld a,#26 ;%00100110 + call x1FDD ;запись данных в ячейку CMOS + ld b,#0B + ld a,#D6 ;%11010110 + call x1FDD ;запись данных в ячейку CMOS + ld b,#0B + ld a,#56 ;%01010110 + call x1FDD ;запись данных в ячейку CMOS + xor a + ld i,a + im 2 + xor a + ld (#7530),a + ld bc,#FFBA + ld a,(xDFF0) + or #08 + out (c),a + ld (xDFF0),a + ei +x171A halt + ld a,(#7530) + or a + jr z,x171A + di + ld a,#05 + ld hl,x9C40 + call x175D ;вызов процедуры из основной памяти + ld bc,#FFBA + ld a,(xDFF0) + and #F7 + out (c),a + ld (xDFF0),a + ret + +;АДРЕС: #1738 работа с контроллером прерываний +x1738 di + ld bc,#7FBE + ld a,#00 + out (c),a + ld bc,#FFBA + ld a,(xDFF0) + or #08 + out (c),a + ld (xDFF0),a + xor a + ld i,a + im 2 +x1752 ei + ld a,(xDFF0) + bit 3,a + jr nz,x1752 + ret + jr $ + +;вызов процедуры из основной памяти +;вх: hl - адрес процедуры +x175D push hl + ld hl,rom3_x3D30 + ex (sp),hl + push hl + ret + +;установка бордюра +x1764 out (#FE),a + ret + db #00 + +;АДРЕС: #1768 поиск раздела MFS +;вых: cy=1 раздел не найден +; dehl=#00000000 +; cy=0 раздел найден +; bc - адрес дескриптора раздела MFS в буфере +; dehl - смещение первого сектора раздела +x1768 push ix + call x1791 ;hl=de=#0000 (нулевой сектор) + ld (iy+#31),#01 ;число передаваемых секторов данных при операциях чтения/записи (=#00->=#100) + call x1D73 ;чтение нулевого сектора с винчестера в буфер xE5A9 + jp c,x178E ;ошибка чтения + call x1797 ;поиск раздела MFS в MBR + jr c,x178E ;раздел не найден + ld l,(ix+#08) + ld h,(ix+#09) + ld e,(ix+#0A) + ld d,(ix+#0B) ;dehl - смещение первого сектора радела + push ix + pop bc + pop ix + ret +x178E pop ix + scf +;hl=de=#0000 +x1791 ld hl,#0000 + ld e,l + ld d,l + ret +;поиск раздела MFS в MBR +; cy=1 раздел MFS не найден +x1797 ld hl,(xE5A9+#1FE) ;xE7A7 + ld de,#AA55 ;сигнатура (55h AAh) + or a + sbc hl,de + jr nz,x17B7 ;сигнатура отсутствует: MBR отсутствует +x17A2 ld b,#04 + ld ix,xE5A9+#1BE ;xE767 начало дескрипторов разделов HDD +x17A8 ld a,#53 ;код типа раздела MFS + cp (ix+#04) + jr nz,x17B0 + ret +x17B0 ld de,#0010 + add ix,de ;дескриптор следующего раздела + djnz x17A8 +x17B7 ld a,#63 + scf + ret + +;АДРЕС: #17BB чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела +;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора +;вых: cy=1 была ошибка +x17BB push ix + push de + push hl + call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + ld ix,xEBF5 ;грузим первый сектор раздела MFS + call x1D78 ;чтение сектора с винчестера в буфер ix + pop hl + pop de + jr c,x17EB ;ошибка загрузки + call x0FF3 ;инкремент dehl + call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + ld ix,xEBF5+#200 ;грузим втоорой сектор раздела MFS + call x1D78 ;чтение сектора с винчестера в буфер ix + jr c,x17EB ;ошибка загрузки + ld hl,(xEBF5+#3FE) ;xEFF3 сравнение ситгнатуры + ld de,#AA54 + sbc hl,de + ld a,#63 + jr nz,x17EB ;сигнатуры нет + pop ix + ret +x17EB scf ;ошибка + pop ix + ret + +;АДРЕС: #17EF запись 2х секторов из буфера xEBF5 +;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора +x17EF push ix + push de + push hl + call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + ld ix,xEBF5 ;буфер + call x1D4A ;запись сектора из буфера ix на винчестер + pop hl + pop de + jr c,x17EB ;ошибка + call x0FF3 ;инкремент dehl + call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + ld ix,xEBF5+#200 ;вторй сектор + call x1D4A ;запись сектора из буфера ix на винчестер + jr c,x17EB ;ошибка + pop ix + ret + +;АДРЕС: #1813 чтение сектора с винчестера +;вх: hl - адрес буфера для чтения +; de - смещение от начала образа в секторах (512b) +1 +;вых: hl - адрес буфера для чтения +; cy=1 были ошибки. код ошибки в A +x1813 push hl + call x1848 ;расчет номера сектора на винчестере + ;dehl - смещение в секторах (512b) от начала винчестера до нужного сектора + jr c,x1827 ;ошибка: адрес за пределами образа диска + call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + ex (sp),ix + call x1D78 ;чтение сектора с винчестера в буфер ix + pop ix + ret nc ;ошибок не было + ld a,#04 + ret +x1827 pop hl ;ошибка: адрес за пределами образа диска + ret + +;АДРЕС: #1829 запись сектора на винчестер +;вх: hl - адрес буфера для записи +; de - смещение от начала образа в секторах (512b) +;вых: hl - адрес буфера для записи +; cy=1 были ошибки. код ошибки в A +x1829 ld a,(xE590) + and %00100000 + jr nz,x1844 ;защита от записи + push hl ;адрес буфера для записи + call x1848 ;расчет номера сектора на винчестере + jr c,x1827 ;ошибка: адрес за пределами образа диска + call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + ex (sp),ix ;адрес буфера для записи + call x1D4A ;запись сектора из буфера ix на винчестер + pop ix + ret nc ;нет ошибок записи + ld a,#04 ;код ошибки: ошибка при чтении или записи сектора функциями 5 или 6 + ret +x1844 ld a,#02 ;код ошибки: попытка записи на защищенную дискету + scf + ret + +;АДРЕС: #1848 расчет номера сектора на винчестере +;вх: de - смещение от начала образа до нужного сектора в секторах (512b) +;вых: cy=1 ошибка: адрес за пределами образа диска +; =0 dehl - смещение в секторах (512b) от начала винчестера до нужного сектора +x1848 ld (xE9E7),de ;смещение до нужного сектора + ld de,xE9EB ;адрес числа + push de + ld hl,xE590+#01 ;смещение образа от начала HDD + call x1003 ;копирование из (hl) в (de) 4х байт + pop hl + ld de,xE9E7 + call x101D ;(hl)=(hl)+(de) сложение 4х байтного числа с двухбайтным + ld de,xE9E7 + ld hl,xE590+#05 ;смещение от начала HDD до последнего(служебного) сектора образа + push hl + call x1003 ;копирование из (hl) в (de) 4х байт + pop de + ld hl,xE9EB ;смещение в секторах (512b) от начала винчестера до нужного сектора + call x1035 ;сравнение двух чисел + jr z,x1873 ;(hl)=(de) + jp p,x187B ;(hl)>(de) ошибка +x1873 ld hl,xE9EB ;(hl)<(de) + call x100F ;загрузка числа в регистры из памяти + or a + ret +x187B ld a,#22 ;код ошибки: адрес за пределами образа диска + scf + ret + +;АДРЕС: #187F R8DOS #23(35) подключение раздела к драйверу HDD +;вх: 1-0,a - номер дисковода +; 2,a =0 +; 6,a =1 отключить подраздел от драйвера +; 5,a =1 подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) +; 7,a =1 автоподключение, т. е. подключить то, что задано в секторе автонастроек +; 3,a =1 подключение по имени, адрес имени в памяти в DE +; 4,a =1 вернуть в память (по HL) дескриптор текущего подключенного к драйверу раздела +;вых: cy=1 ошибка +; cy=0 ошибок не было +; 4,(hl) =1 +x187F call x18C0 ;вых: при 4,a=1 -> hl=xE5A5 + ;вых: при 4,a=0 -> hl=как при входе + ret c ;были ошибки + push af + ld c,#11 + set 4,(hl) ;!!!ОШИБКА!!! портится память + pop af + ret + +;АДРЕС: #188A установка кода, определяющий тип дисковода без образа по номеру в С +x188A xor a + ld (xE590),a ;реальный дисковод + ld e,#C0 + bit 1,c + jr z,x1895 ;это дисковод A/B + ld e,a +x1895 call x1A0E ;hl адрес кода, определяющий тип дисковода по номеру в С + ld (hl),e + ret + +;АДРЕС: #189A подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) +;вх: de - адрес дескриптора дисковода +x189A bit 5,(iy+#1C) + jp nz,x1B00 ;ошибка #67. нет винчестера + ld hl,xE590 ;описатель текущего дисковода + push hl + push bc + ex de,hl + ld bc,#0015 + bit 5,(iy+#0B) + jr z,x18B6 ;функция вызывается из монитора +;вызов пользователем + rst #30 + dw rom2_x0753 ;сохранение области памяти в ram 8 + db #02 + jr x18B8 +;функция вызывается из монитора +x18B6 ldir +x18B8 pop bc + pop hl + ld a,(hl) + or a + ret nz ;выход без ошибок + jp x1983 ;ошибка #66. путь не найден + +;АДРЕС: #18C0 R8DOS #28(40) подключение раздела к драйверу HDD +;вх: 1-0,a - номер дисковода +; 2,a =0 +; 6,a =1 отключить подраздел от драйвера +; 5,a =1 подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) +; 7,a =1 автоподключение, т. е. подключить то, что задано в секторе автонастроек +; 3,a =1 подключение по имени, адрес имени в памяти в DE +; 4,a =1 вернуть в память (по HL) дескриптор текущего подключенного к драйверу раздела +;вых: cy=1 ошибка +x18C0 bit 7,(iy+#1B) + jp z,x1BFA ;ошибка #56 нет раздела MFS + push hl + push af + push hl + ld hl,x1A19 + ex (sp),hl ;адрес возврата + ld c,a + bit 6,c + jr nz,x188A ;отключить подраздел от драйвера + bit 5,c + jr nz,x189A ;подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) + bit 7,c + jr nz,x1901 ;автоподключение, т. е. подключить то, что задано в секторе автонастроек + bit 3,c + ret z ;переход на x1A19 + +;подключение по имени, адрес имени в памяти в de + ld a,e + or d + jr z,x18FD ;;ошибка #45. неверный путь + push bc + ex de,hl + ld de,xE7C7 + ld bc,#0014 + bit 5,(iy+#0B) + jr z,x18F6 ;;функция вызывается из монитора + rst #30 + dw rom2_x0753 ;сохранение области памяти в ram 8 + db #02 + jr x18F8 +x18F6 ldir +x18F8 xor a + ld (de),a + pop bc + jr x190E ;анализ имени и подключение +;ошибка #45. неверный путь +x18FD ld a,#45 + scf + ret + +;автоподключение, т е. подключить то, что задано в секторе автонастроек +;вх: 1-0,c - номер дисковода +x1901 push bc + call x1E3D ;чтение сектора 3(сектор настроек) в буфер xE5A9 и проверка контрольной суммы + pop bc + ret c ;ошибка чтения + ld de,xE7C7 + call x1ACC ;формирование текстовой строки - пути к примонтированному подразделу/образу + ret c ;ошибка чтения +x190E ld hl,xE7C7+#01 + ld a,":" + cp (hl) + jr nz,x192C ;это подраздел +; это образ диска + dec hl + ld a,(hl) + and #5F + sub #41 + jr c,x18FD ;не буква диска. ошибка #45. неверный путь + cp #04 + jr nc,x18FD ;не буква диска. ошибка #45. неверный путь + ld b,a + ld a,c + and #F0 + or b + ld c,a ;новый дисковод + inc hl + inc hl + jr x192F ;hl начало имени подраздела +; это подраздел +x192C ld hl,xE7C7 +x192F ld a,(hl) + cp #5C ;"\" + jr nz,x1935 + inc hl +; формирование строки с именами для поиска в каталоге +x1935 ld de,xE7DB ;буфер для имени подраздела и образа + push bc + call x1A82 ;выделение из строки имени подраздела/образа (6 символов имя) + call x1A82 ;выделение из строки имени подраздела/образа (6 символов имя) + pop bc +; поиск имени подраздела в каталоге + ld de,xEBF5 ;буфер с каталогом +x1943 push bc + push de + rst #30 + dw rom5_x2620 ;формирование в буфере xEBF5 списка подразделов MFS/образов + db #05 + pop de + pop bc + ret c ;ошибка чтения + res 7,c ;7,=0 поиск имени +x194E push bc + ld bc,xEBF5 ;определение номера текущей записи + ld l,e + ld h,d + sbc hl,bc + ld b,#04 +x1958 srl h ;hl=hl/#10 + rr l + djnz x1958 ;l - номер записи в каталоге + pop bc + ld a,(xDD89) ;всего записей + cp l + jr z,x1983 ;конец каталога. ошибка #66. путь не найден + jr c,x1983 ;конец каталога. ошибка #66. путь не найден + ld hl,xE7DB ;тут имя подраздела и образа + call x1A6A ;проверка совпадения имени + jr nz,x19C1 ;не совпало +; имя совпало + ld a,(de) + and #DF + cp #01 + jr nz,x19D8 ;это не TR-DOS. формирование описателя текущего дисковода + ld a,(xE7DB+#06) + cp " " + jr nz,x1987 ;есть имя образа + ld a,(de) + or #10 + ld (de),a + jr x19D8 ;формирование описателя текущего дисковода +;ошибка #66. путь не найден +x1983 ld a,#66 + scf + ret +; поиск имени образа в каталоге +x1987 push de + push bc + ld bc,#0010 + ex de,hl + ld de,xE81B + ldir ;сохраним запись подраздела в буфере + rst #30 + dw rom5_x25EB ;формирование в буфере xEBF5 списка образов коллекции + db #05 + pop bc + pop de + ret c ;ошибка чтения + set 7,c ;в буфере каталог коолекции образов + push bc + push de + ld de,xEBF5 ;адрес каталога коллекции + ld c,#01 +x19A2 ld a,(xDD89) ;количество образов в каталоге + cp c + jr c,x19BF ;каталог закончился + ld a,(de) + and #01 + cp #01 + jr nz,x19B7 ;это не образ диска. следующая запись + ld hl,xE7DB+#06 ;имя образа + call x1A6A ;проверка совпадения имени + jr z,x19CF ;есть совпадение +x19B7 inc c + ld hl,#0010 + add hl,de + ex de,hl + jr x19A2 ;продолжим поиск +x19BF pop de ;конец каталога образов + pop bc +x19C1 ld a,e + add a,#10 + ld e,a + jr nc,x19C8 + inc d ;de=de+#10 +x19C8 bit 7,c + jr z,x194E ; + jp x1943 ;7,c =1 в буфере каталог коолекции образов, читать MBR не надо +;имя образа найдено +x19CF pop hl + pop bc + ld a,(de) + and #20 ;сохраним признак защиты от записи + or #01 + jr x19D9 +;формирование описателя текущего дисковода +x19D8 ld a,(de) +x19D9 ld (xE590),a ;код подраздела в описателе текущего дисковода + ex de,hl + ld de,xE590+#01 + inc hl + call x1003 ;копирование из (hl) в (de) 4х байт + ld de,xE590+#05 + call x1003 ;копирование из (hl) в (de) 4х байт + push de + ld de,#0005 + add hl,de + pop de + ex de,hl + push bc + rst #30 + dw rom5_x3052 ;сложение двух 4х байтных чисел + db #05 + ld hl,xE590+#05 + rst #30 + dw rom5_x302A ;декремент (hl)=(hl)-1 + db #05 + pop bc + ld a,(xE590) ;!!!ОШИБКА!!! перед сравнением надо сделать and #DF + cp #01 ;иначе диски с защитой от записи не будут видны + jr z,x1A07 ;это TR-DOS образ, без защиты от записи + or a + ret +x1A07 call x1A0E ;hl адрес кода, определяющий тип дисковода + ld (hl),#E0 ;%11100000 + or a + ret + +;АДРЕС: #1A0E расчет адреса кода, определяющие тип дисковода по номеру в С +x1A0E ld a,c + and #03 + ld c,a + ld b,#00 + ld hl,xFFCC + add hl,bc + ret + +;завершение процедуры x18C0 R8DOS #28(40) +;cy=1 была ошибка +x1A19 push af + jr nc,x1A20 ;нет ошибки + xor a + ld (xE590),a ;была ошибка. образ не подключен +x1A20 ld a,c + and #03 + ld (xFFCA),a ;текущий дисковод + bit 4,(iy+#1C) + call z,x1B54 ;1/0 TRDOS mirror on/off + call x1B04 ;расчет адреса блока описателя заданного дисковода +;сохранение описателя текущего дисковода в блоке xE9F5 + ld de,xE590 ;описатель текущего дисковода + ex de,hl + ld bc,#0009 + ldir + push hl + ld hl,xE7DB ;имена подраздела/образа + push hl + ld bc,#000C + push bc + ldir ;копирование имен подраздела/образа в описатель текущего дисковода + pop bc + pop hl + pop de + ldir ;копирование в блок описаний дисководов + call x1B18 ;установка признака подмонтированных дисков A/B в порту #7FBA + pop af + pop de + pop hl + ret c ;была ошибка +;вернуть в память (по HL) дескриптор текущего подключенного к драйверу раздела + bit 4,d + ret z + ld de,xE590 + ex de,hl + ld bc,#0015 + bit 5,(iy+#0B) + jr z,x1A66 ;функция вызывается из монитора + rst #30 + dw rom2_x0749 ;восстановление области памяти из ram 8 + db #02 + jr x1A68 +x1A66 ldir +x1A68 or a + ret + + +;АДРЕС: #1A6A проверка совпадения имени +;вх: de - адрес в каталоге +; hl - адрес имени для поиска +;вых: z - имя совпало +x1A6A push bc + push de + ld bc,#000A ;приращение в записи до имени + ex de,hl + add hl,bc + ld bc,#0600 +x1A74 ld a,(de) + cp (hl) + jr z,x1A79 + inc c +x1A79 inc hl + inc de + djnz x1A74 + ld a,c ;c=0 сть совпадение + or a + pop de + pop bc + ret + +;АДРЕС: #1A82 выделение из строки имени подраздела/образа (6 символов имя) +;вх: de - буфер приемник +; hl - адрес строки +x1A82 ld b,#06 +x1A84 ld a,(hl) + cp #5C ;"\" + jr z,x1A97 ;конец имени + or a + jr z,x1A98 ;конец строки + ld (de),a + inc hl + inc de + djnz x1A84 + ld a,(hl) + cp #5C ;"\" + ret nz ;не маркер конца имени + inc hl ;следующий символ + ret +x1A97 inc hl +x1A98 ld a," " + ld (de),a + inc de + djnz x1A98 + ret + +;АДРЕС: #1A9F копирование имени подраздела/образа по адресу в de +;вх: de - адрес буфера +; hl - адрес пути примонтированного подраздела/образа +; b - смещение в пути до имени +x1A9F ld a,l + add a,b + ld l,a + jr nc,x1AA5 + inc h +x1AA5 ld b,#06 +x1AA7 ld a,(hl) + cp #21 + ret c + ld (de),a + inc hl + inc de + djnz x1AA7 + ret + +;АДРЕС: #1AB1 определение адреса начала записи для заданного дисковода в буфере xE5A9 +;вх: a - номер дисковода для монтирования образа +;вых: hl - адрес буфера +; a - первый байт буфера со сброшенным битом защиты от записи +x1AB1 push de + and #03 + ld hl,x1AC8 + add a,l + ld l,a + jr nc,x1ABC + inc h +x1ABC ld l,(hl) + ld h,#00 + ld de,xE5A9 + add hl,de + ld a,(hl) + and #DF + pop de + ret +x1AC8 db #00,#16,#2C,#42 + +;АДРЕС: #1ACC формирование текстовой строки - пути к примонтированному +; подразделу/образу. вида X:part\disk,#00 либо part,#00 +;вх: de - адрес буфера для текcтовой строки +; 0-1,c - номер дисковода +x1ACC ld a,c + call x1AB1 ;hl адрес начала пути к примонтированному образу + ld (de),a ;a - первый байт пути со сброшенным битом защиты от записи + and #DF + jp z,x1B00 ;ошибка #67. к дисководу образ не примонтирован + cp #01 + jr z,x1AE1 ;это образ диска +;для подраздела + ld b,#0A + call x1A9F ;копирование имени подраздела по адресу в de + jr x1AFC +;для образа диска +x1AE1 ld a,c + and #03 + add a,#41 + ld (de),a ;буква дисковода + inc de + ld a,":" + ld (de),a + inc de + ld b,#0A + push hl + call x1A9F ;копирование имени подраздела по адресу в de + pop hl + ld a,#5C ;"\" + ld (de),a + inc de + ld b,#10 + call x1A9F ;копирование имени образа по адресу в de +x1AFC ex de,hl + xor a + ld (hl),a + ret +;ошибка #67. к дисководу образ не примонтирован +x1B00 ld a,#67 + scf + ret + +;АДРЕС: #1B04 расчет адреса блока описателя заданного дисковода +;вх: a - номер дисковода +;вых: hl - адрес блока описателя текущего дисковода +; a - первый байт описателя +; nz - это образ диска +x1B04 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,x1B14 + inc h +x1B14 ld a,(hl) ;hl адрес блока описателя заданного дисковода + and #DF + ret + +;АДРЕС: #1B18 установка признака подмонтированных дисков A/B в порту #7FBA +x1B18 ld a,(xFFCA) ;номер текущего дисковода + bit 1,a + ret nz ;это дисковод C/D + ld c,a + ld e,a + call x1A0E ;расчет адреса кода, определяющие тип дисковода по номеру в С + ld bc,#7FBA + bit 0,e + ld d,(iy-#26) + jr z,x1B37 ;дисковод A + set 6,d ;для дисковода B + bit 5,(hl) + jr z,x1B3F ;образ не подключен + res 6,d ;образ подключен + jr x1B3F +x1B37 set 7,d ;для дисковода A + bit 5,(hl) ;образ не подключен + jr z,x1B3F + res 7,d ;образ подключен +x1B3F ld (iy-#26),d + out (c),d + ret + +;АДРЕС: #1B45 определение необходимости копирования памяти пользователя +;вх: hl - адрес начала блока памяти +; bc - размер блока памяти +;вых: cy=1 блок памяти попадает на системные области +; =0 блок памяти в пределах [#4000..#BFFF] +x1B45 ld a,h + cp #40 + ret c + push hl + dec bc + add hl,bc ;адрес конца таблицы + inc bc + ld a,h + pop hl + ret c + cp #C0 + ccf + ret + +;АДРЕС: #1B54 сохранение описателя текущего дисковода в блоке xE9F5 (функция TR-DOS mirror) +x1B54 bit 5,(iy+#0B) + ret z ;функции вызываются из монитора + push af + ld hl,(xE9F3) ;адрес блока описателей дисковода + push hl + ld hl,xE9F5 + ld (xE9F3),hl ;начало блока + call x1B04 ;расчет адреса блока описателя заданного дисковода + ld de,xE590 ;описатель текущего дисковода + ex de,hl + ld bc,#0009 + ldir ;тип и адрес подраздела/образа в секторах + ld hl,xE7DB + ld bc,#000C ;имена подраздела/образа + ldir + pop hl + ld (xE9F3),hl + pop af + ret + +;АДРЕС: #1B7E R8DOS #24(36) прямое чтение секторов из подраздела жесткого диска +;вх: hl - адрес в памяти, куда считывать +; de - начальный номер сектора (считая с 1!) +; b - число секторов (размер сектора 512 байт!) +;вых: cy=1 - ошибки +x1B7E bit 7,(iy+#1B) + jr z,x1BFA ;ошибка. нет раздела MFS + ld a,(xE590) ;код типа примонтированного подраздела/образа + or a + jr z,x1BBC ;ошибка. образ не примонтирован + ld a,b + or a + ret z ;0 секторов. нечего читать +;читаем сектора +x1B8D push hl + push de + push bc + call x1B9D ;чтение одного сектора + pop bc + pop de + pop hl + ret c ;были ошибки + inc h + inc h + inc de + djnz x1B8D + ret +;чтение одного сектора +x1B9D ld bc,#0200 + call x1B45 ;определение необходимости копирования памяти пользователя + jp nc,x1813 ;чтение сектора с винчестера + push hl + ld hl,xEBF5 ;читаем в буфер в ram 8 + call x1813 ;чтение сектора с винчестера + pop hl + ret c ;ошибки + ld de,xEBF5 + ex de,hl + ld bc,#0200 + rst #30 + dw rom2_x0749 ;копируем в память пользователя + db #02 + xor a + ret +;ошибка #67. к дисководу образ не примонтирован +x1BBC scf + ld a,#67 + ret + +;АДРЕС: #1BC0 R8DOS #25(37) прямая запись секторов в подраздел жесткого диска +;вх: hl - адрес в памяти, откуда записывать +; de - начальный номер сектора (считая с 1!) +; b - число секторов (размер сектора 512 байт!) +;вых: cy=1 - ошибки + +x1BC0 bit 7,(iy+#1B) + jr z,x1BFA ;ошибка. нет раздела MFS + ld a,(xE590) ;код типа примонтированного подраздела/образа + or a + jr z,x1BBC ;ошибка. образ не примонтирован + ld a,b + or a + ret z ;0 секторов. нечего записывать +;записываем сектора +x1BCF push hl + push de + push bc + call x1BDF ;запись одного сектора + pop bc + pop de + pop hl + ret c ;были ошибки + inc h + inc h + inc de + djnz x1BCF + ret +;запись одного сектора +x1BDF ld bc,#0200 + call x1B45 ;определение необходимости копирования памяти пользователя + jp nc,x1829 ;запись сектора на винчестер + push de + ld de,xEBF5 ;буфер для записи + ld bc,#0200 + rst #30 + dw rom2_x0753 ;копируем область пользователя в буфер для записи + db #02 + pop de + ld hl,xEBF5 + jp x1829 ;запись сектора на винчестер + +;АДРЕС: #1BFA ошибка #56. нет раздела MFS +x1BFA ld a,#56 + scf + ret + +;АДРЕС: #1BFE R8DOS #26(38) Вернуть таблицу (каталог) подраздела +;вх: hl - адрес буфера для таблицы (1024) +;вых: cy=1 - ошибки +;вых: de - количество подразделов +; +x1BFE bit 7,(iy+#1B) + jr z,x1BFA ;ошибка. нет раздела MFS + push hl + call x1C21 ;чтение в буфер xEBF5 катлога раздела MFS + pop hl + ret c ;ошибка + push hl + ld de,xEBF5 ;буфер с каталогом + ex de,hl + ld bc,#0400 + rst #30 + dw rom2_x0749 ;копируем в память пользователя + db #02 + rst #30 + dw rom5_x271A ;подсчет количества подразделов в MFS + db #05 + ld de,(xDD89) ;количество подразделов + pop hl + xor a + ret +;чтение в буфер xEBF5 катлога раздела MFS +x1C21 res 6,(iy+#1C) + call x1768 ;поиск раздела MFS + ret c ;ошибка + call x17BB ;чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела + ret + +;АДРЕС: #1C2D R8DOS #27(39) чтение/запись сектора (???ОШИБКА???) +;вх: a =#90/#94 запись сектора +; =#50/#54 чтение сектора +; hl - адрес начала данных 512b +;вых: cy=1 - ошибки +; +x1C2D bit 7,(iy+#1B) + jr z,x1BFA ;ошибка. нет раздела MFS + ld c,a + and #FB ;%11111011 + cp #90 + jr z,x1C42 + cp #50 + jr z,x1C56 + ld a,#56 ;ошибка. нет раздела MFS + scf + ret +;запись сектора +x1C42 ld de,xE5A9 + ld bc,#0200 + rst #30 + dw rom2_x0753 ;копируем область пользователя в буфер для записи + db #02 + ld de,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? + ld hl,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? + jp x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl +;чтение сектора +x1C56 push hl + ld de,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? + ld hl,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? + call x1D73 ;чтение сектора с винчестера в буфер xE5A9 + pop hl + ret c ;ошибки + ld de,xE5A9 + ex de,hl + ld bc,#0200 + rst #30 + dw rom2_x0749 ;копируем в память пользователя + db #02 + xor a + ret + +;АДРЕС: #1C70 бесконечное чтение порта bc +x1C70 in a,(c) + jr x1C70 + +;АДРЕС: #1C74 бесконечная запись в порт bc +x1C74 out (c),a + jr x1C74 + +;АДРЕС: #1C78 загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства +;вх: hl - адрес откуда грузим в регистры 6 байт +x1C78 ld bc,#F8BE +x1C7B ld a,(hl) + inc hl + inc b + out (c),a + ld a,b + cp #FE + ret z + jr x1C7B + +;АДРЕС: #1C86 чтение 512b данных в буфер адресуемый hl +;вх: hl - адрес буфера для чтения данных +x1C86 push hl + ld c,#BE + ld de,#D8F8 + xor a +x1C8D ld b,e ;порт #F8BE регистр данных (младшая часть) + ini + ld b,d ;порт #D8BE регистр данных (старшая часть) + ini + dec a + jr nz,x1C8D + pop hl + ret + +;АДРЕС: #1C98 запись 512b данных из буфер адресуемого hl +;вх: hl - адрес буфера для записи данных + +x1C98 push hl + ld c,#BE + ld de,#D9F9 ;команда outd вначале делает dec b + xor a +x1C9F ld b,d ;порт #D8BE регистр данных (старшая часть) + inc hl + outd + ld b,e ;порт #F8BE регистр данных (младшая часть) + outi + inc hl + dec a + jr nz,x1C9F + pop hl + ret + +;АДРЕС: #1CAC посылаем команду винчестеру +;вх: a - команда винчестеру +;вых: cy=1 HDD не вышел в готовность +; =0 команда загружена в регистр +; d - регистр состояния +x1CAC ld e,a + ld c,#BE + call x1D04 ;ожидание готовности HDD + ret c ;ошибка: hdd не вышел в готовность + ld b,#FE + ld a,(xE049) ;тип адресации LBA/CHS и выбор винчестера master/slave + out (c),a + ld hl,xE044 + call x1C78 ;загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства + call x1CE5 ;ожидание готовности HDD к принятию команды + ret c ;ошибка: hdd не вышел в готовность + ld bc,#FFBE + out (c),e + ret + +;АДРЕС: #1CCA ожидание готовности HDD к передаче данных +;вх: c - младший байт порта +;вых: cy=1 HDD не вышел в готовность +; =0 HDD готов к передаче данных +; d - регистр состояния +x1CCA call x1D04 ;ожидание готовности HDD + ret c ;ошибка: hdd не вышел в готовность + bit 3,d + ret nz ;винчестер готов к передаче данных +;ждем готовности к передаче данных + ld hl,#C350 +x1CD4 ld bc,#FFBE + in d,(c) + bit 3,d + ret nz ;винчестер готов к передаче данных + dec hl + ld a,h + or l + jr nz,x1CD4 + ld a,#62 + scf + ret + +;АДРЕС: #1CE5 ожидание готовности HDD к принятию команды +;вх: c - младший байт порта +;вых: cy=1 HDD не вышел в готовность +; =0 HDD готов к принятию команды +; d - регистр состояния +x1CE5 call x1D04 ;ожидание готовности HDD + ret c ;ошибка: hdd не вышел в готовность + bit 6,d + ret nz ;выход. винчестер готов принять команду +;ждем готовности принять команду + ld hl,#14E6 + or a +x1CF0 ld bc,#FFBE + in d,(c) + bit 6,d + ret nz ;выход. винчестер готов принять команду + dec a + jr nz,x1CF0 + dec hl + ld a,h + or l + jr nz,x1CF0 + ld a,#61 + scf + ret + +;АДРЕС: #1D04 ожидание готовности HDD +;вх: c - младший байт порта +;вых: cy=1 HDD не вышел в готовность +; =0 HDD готов +; d - регистр состояния +x1D04 ld hl,#4FD3 ;количество попыток +x1D07 xor a + ld b,#FF +x1D0A in d,(c) ;читаем регистр состояния + bit 7,d + ret z ;HDD готов + dec a ;HDD занят + jr nz,x1D0A ;повторяем попытки + dec hl + ld a,h + or l + jr nz,x1D07 + ld a,#60 ;HDD не вышел в готовность + scf + ret + +;АДРЕС: #1D1B чтение сектора идентификации в буфер по адресу в ix +;вх: ix - адрес буфера для чтения сектора идентификации +x1D1B ld hl,xE04A + ld b,(hl) ;сохраним код команды винчестера: чтение сектора + push bc + ld (hl),#EC ;команда идентификации + push hl + call x1D78 ;чтение сектора идентификации в ix + pop hl + pop bc + ld (hl),b + ret + +;АДРЕС: #1D2A подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер +x1D2A call x1E2A ;установка в переменных - сектора номер 3 для винчестера + ld hl,#4155 ;сигнатура сектора с примонтированными образами + ld (xE5A9+#1FE),hl + ld de,xE5A9 ;адрес начала памяти + ld bc,#01FC ;размер области памяти + call x21E5 ;подсчет контрольной суммы области памяти CRC16 + ld (xE5A9+#1FC),hl ;контрольная сумма + ld (iy+#31),#01 ;количество секторов + jr x1D4F ;запись сектора из буфера xE5A9 на винчестер + +;АДРЕС: #1D45 запись сектора из буфера xE5A9 на винчестер по адресу в dehl +;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора +;вых: cy=1 ошибки +x1D45 call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + jr x1D4F ;запись сектора из буфера xE5A9 на винчестер + +;АДРЕС: #1D4A запись сектора из буфера ix на винчестер +;вх: ix - адрес буфера для записи сектора +x1D4A push ix + pop hl + jr x1D52 + +;АДРЕС: #1D4F запись сектора из буфера xE5A9 на винчестер +x1D4F ld hl,xE5A9 +x1D52 ld b,(iy+#39) ;количество дополнительных попыток записи сектора +x1D55 push bc + ld a,(xE04B) ;код команды винчестера + call x1D60 ;запись сектора на винчестер + pop bc + ret nc ;нет ошибок + djnz x1D55 ;еще раз попытаемся записать +;запись сектора на винчестер +;вх: a - команда винчестеру +; hl - адрес буфера для записи данных +;вых: cy=1 были ошибки +; hl - не изменяется +x1D60 push hl + call x1CAC ;посылаем команду винчестеру + pop hl + jr c,x1DB3 ;ошибка + push hl + call x1CCA ;ожидание готовности HDD к передаче данных + pop hl + jr c,x1DB3 ;ошибка + call x1C98 ;запись 512b данных из буфер адресуемого hl + jr x1D9F ;проверка на ошибки и выход + +;АДРЕС: #1D73 чтение сектора с винчестера в буфер xE5A9 +;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора +x1D73 call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + jr x1D7D + +;АДРЕС: #1D78 чтение сектора с винчестера в буфер ix +;вх: ix - адрес буфера для чтения сектора +x1D78 push ix + pop hl + jr x1D80 + +;АДРЕС: #1D7D чтение сектора с винчестера в буфер xE5A9 +x1D7D ld hl,xE5A9 +x1D80 ld b,(iy+#39) ;количество дополнительных попыток чтения сектора +x1D83 push bc + ld a,(xE04A) ;код команды винчестера + call x1D8E ;чтение сектора с винчестера + pop bc + ret nc + djnz x1D83 +;чтение сектора с винчестера +;вх: a - команда винчестеру +;вх: hl - адрес буфера для чтения данных +;вых: cy=1 были ошибки +; hl - не изменяется +x1D8E push hl + call x1CAC ;посылаем команду винчестеру + pop hl + jr c,x1DB3 ;ошибка + push hl + call x1CCA ;ожидание готовности HDD к передаче данных + pop hl + jr c,x1DB3 ;ошибка + call x1C86 ;чтение 512b данных в буфер адресуемый hl +;проверка на ошибки и выход +x1D9F ld bc,#FFBE + in a,(c) + ld d,a ;регистр состояния + and %01110001 + xor %01010000 + ret z ;выход при готовности винчестера и отсутствии ошибок + ld b,#F9 ;#F9BE + in a,(c) ;читаем код ошибки + ld (xFFDD),a ;сохраняем + ld a,#57 ;код ошибки драйвера +x1DB3 call x1DB8 ;програмный сброс винчестера + scf + ret +;програмный сброс винчестера +x1DB8 push af + push bc + ld bc,#FFBA + ld a,(xDFF0) + push af + or #80 + out (c),a ;активация регистра Device Control + push bc + ld bc,#FEBE + ld a,%00001100 + out (c),a ;програмный сброс винчестера + call x201C ;пауза 293t + xor a + out (c),a ;завершаем програмный сброс винчестера + pop bc + pop af + and #7F + out (c),a ;активация регистра головки + ld (xDFF0),a + pop bc + pop af + ret + +;АДРЕС: #1DDF расчет и установка в переменных адреса LBA/CHS в зависимости от настроек +;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора +;вых: (xE046) параметры LBA/CHS в зависимости от настроек +x1DDF exx + ld hl,xE030 + bit 4,(iy+#35) + jr z,x1DEA ;master HDD + inc hl ;slave HDD +x1DEA bit 2,(hl) + jr nz,x1E10 ;LBA on +;LBA off. преобразование адреса LBA в C/H/S + ld bc,(xE5A5) ;head*sector (секторов на цилиндре) + call x0F5D ;деление de'hl'=de'hl'/bc + exx + ld (xE047),hl ;номер цилиндра + ld c,(iy-#1F) ;значение sector HDD + ld b,#00 + call x0F5D ;деление de'hl'=de'hl'/bc + inc l + ld (iy+#32),l + exx + ld a,(iy+#35) + and #B0 ;%10110000 + or l + ld (iy+#35),a ;головка + ret +;LBA on +x1E10 exx + ld (iy+#32),l + ld (iy+#33),h + ld (iy+#34),e + ld a,d + and #0F + ld d,a ;старший полубайт + ld a,(iy+#35) + and #B0 ;%10110000 + or d + or #40 + ld (iy+#35),a + ret + +;АДРЕС: #1E2A установка в переменных сектора номер 3 для винчестера +x1E2A ld hl,#0000 + ld (xE047),hl + ld (iy+#32),#03 + ld a,(iy+#35) + and #F0 + ld (iy+#35),a + ret + +;АДРЕС: #1E3D чтение сектора 3(сектор настроек) в буфер xE5A9 и проверка контрольной суммы +;вых: cy=1 были ошибки +x1E3D call x1E2A ;установка в переменных сектора номер 3 для инчестера + ld (iy+#31),#01 ;кол-во секторов =1 + call x1D7D ;чтение сектора с винчестера в буфер xE5A9 + ret c ;ошибка + ld hl,(xE5A9+#1FE) + ld de,#4155 ;сигнатура + sbc hl,de + ld a,#63 + scf + ret nz ;сигнатура отсутствует + ld de,xE5A9 ;начало области памяти + push de + ld bc,#01FC ;размер области памяти + call x21E5 ;подсчет контрольной суммы области памяти CRC16 + ld bc,(xE5A9+#1FC) + xor a + sbc hl,bc + pop hl + ret z ;контрольная сумма совпала + ld b,a ;контрольная сумма не совпадает +x1E68 ld (hl),a ;очищаем буфер + inc hl + djnz x1E68 +x1E6C ld (hl),a + inc hl + djnz x1E6C + ld a,#63 + scf + ret + +;АДРЕС: #1E74 R8DOS #22(34) идентификация жесткого диска +;вх: ix - адрес буфера для загрузки сектора идентификации +; 0,e =1 принудительно инициализировать переменные геометрии винчестра +;вых: cy=1 ошибки +x1E74 xor a + ld (xFFDD),a ;код ошибки дискового интерпретатора + ld bc,#FFBA + ld hl,xDFF0 + ld a,(hl) + or #81 + ld (hl),a + out (c),a ;device control/alt status + push bc + ld bc,#FEBE + xor a + out (c),a ;сброс + pop bc + ld a,(hl) + and #7F + or #01 + ld (hl),a + out (c),a ;вернем регистр команд + djnz $ ;задержка + ld bc,#FFBE + in a,(c) ;регистр состояния + xor #FF + jr z,x1ECC ;прочитано #FF. нет винчестера + set 7,(iy+#1A) ;признак наличия HDD + bit 0,e + jr nz,x1EAD + bit 1,(iy+#1C) ;автоопределение HDD при старте включено + jr nz,x1EFA ;читать сектор идентификации не надо +;чтение сектора идентификации и установка переменных геометрии винчестера +x1EAD ld hl,#4FD3 + call x1D07 ;ожидание готовности HDD + ld b,#FC ;bc=#FCBE регистр цилиндра + xor a +x1EB6 out (c),a + nop + in d,(c) + cp d + jr nz,x1ECC ;значения не совпадают. винчестера нет + dec a + jr nz,x1EB6 ;повторим 256 раз + ld hl,xE044 ;адрес переменной откуда грузим + call x1C78 ;загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства + call x1D04 ;ожидание готовности HDD + jr nc,x1ED4 ;в готовность вышел +;винчестер не найден +x1ECC res 7,(iy+#1A) + ld a,#56 + scf + ret +x1ED4 call x1D1B ;чтение сектора идентификации в буфер по адресу в ix + ld a,#57 + ret c ;ошибка #57. не прочитался сектор идентификации + push ix + pop hl + xor a + or (hl) + inc hl + or (hl) + inc hl + jr z,x1F04 ;ошибка в секторе идентификации + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ld (xDFF2),bc ;количество цилиндров + inc hl + inc hl + ld a,(hl) + ld (iy-#20),a ;количество головок + ld de,#0006 + add hl,de + ld a,(hl) + ld (iy-#1F),a ;количество секторов +x1EFA call x1F2D ;расчет произыедения головок и секторов + call x1F08 ;проверка геометрии винчестера + jr z,x1F04 ;проверка геометрии винчестера не пройдена + or a + ret +;ошибка #58. ошибка в секторе идентификации +x1F04 ld a,#58 + scf + ret + +;АДРЕС: #1F08 проверка геометрии винчестера +x1F08 res 7,(iy+#1B) + ld a,(xDFF2) ;ицлиндров (младший байт) + or (iy-#21) + ret z ;ноль цилинлров + xor a + or (iy-#20) + ret z ;ноль головок + xor a + or (iy-#1F) + ret z ;ноль секторов + ld hl,(xE5A5) + ld a,l + or h + ret z ;нулевое произведение головок и секторов + bit 7,(iy+#1A) + ret z ;винчест не найден + set 7,(iy+#1B) + ret + +;АДРЕС: #1F2D расчет произведения головок и секторов +x1F2D xor a + ld c,(iy-#20) ;головок + ld b,a + exx + ld l,(iy-#1F) ;секторов + ld h,a + ld e,a + ld d,a + exx + call x0FB7 ;умножение dehl=de'hl' * bc + ld (xE5A5),hl ;произведение head * sectors + ret + +;АДРЕС: #1F41 ошибка HDD. вывод сообщения об ошибке в нижней строке монитора +;вх: a - код ошибки, если =#00 -> d - параметр ошибки чтения/записи +x1F41 bit 5,(iy+#0B) + jr z,x1F49 ;функции вызываются из монитора + scf + ret +x1F49 push af + ld a,(xFFDD) + ld (xDDA7),a ;сохраним код ошибки дискового интерпретатора + ld a,d + ld (xDDA7+#01),a ; + pop af + rst #30 + dw rom2_x3870 ;печать сообщения и продолжение работы текущего меню монитора + db #02 + +;АДРЕС: #1F59 чтение ячейки CMOS +;вх: b - адрес в CMOS +;вых: a - значение +; +x1F59 push bc + push bc +x1F5B ld bc,#FFBA + ld a,(xDFF0) + and #7F ;7,=0 регистр адреса CMOS + ld (xDFF0),a + call x2010 ;запись в порт + pop af + ld b,#DF + call x2010 ;запись в порт + ld b,#DF + call x2016 ;чтение порта + pop bc + ret + +;АДРЕС: #1F76 чтение из CMOS времени и даты, в случае готовности CMOS +; +x1F76 ld hl,xDFF6 + ld b,#0C + call x1F59 ;читаем регистр C cmos + bit 4,a + ret z ;еще не обновился + call x1F8B ;bit 7 регистра A cmos + ret nz ;cmos обновляется + set 0,(iy+#1A) + jr x1F98 ;;читаем секунды/минуты/часы + + +;АДРЕС: #1F8B проверка готовности CMOS +;вых: nz - cmos обновляется +; +x1F8B ld b,#0A + call x1F59 ;читаем регистр A cmos + bit 7,a + ret + +;АДРЕС: #1F93 чтение из CMOS времени и даты +;вх: hl - адрес куда читать (6 байт) +; +x1F93 call x1F8B ;проверка готовности cmos + jr nz,x1F93 ;cmos обновляется, ждём +;читаем секунды/минуты/часы +x1F98 ld bc,#0003 +x1F9B call x1F59 + ld (hl),a + inc hl + inc b + inc b + dec c + jr nz,x1F9B +;читаем число/месяц/год + inc b + ld c,#03 +x1FA8 call x1F59 + ld (hl),a + inc hl + inc b + dec c + jr nz,x1FA8 + ret + +;АДРЕС: #1FB2 запись в CMOS времени и даты +;вх: hl - адрес откуда писать (6 байт) +; +x1FB2 ld b,#0B ;регистр B + ld a,#9E ;%10011110 + call x1FDD ;запрет обновления cmos + ld bc,#0003 +x1FBC ld a,(hl) ;запись секунд/минут/часов + inc hl + call x1FDD + inc b + call x1FDD + inc b + dec c + jr nz,x1FBC + inc b + ld c,#03 +x1FCC ld a,(hl) ;запись число/месяц/год + inc hl + call x1FDD + inc b + dec c + jr nz,x1FCC + ld a,%00101010 ;регистр A cmos + call x1FDD + inc b + ld a,%01011110 ;разрешенеи обновления cmos + +;АДРЕС: #1FDD запись данных в ячейку CMOS +;вх: b - адрес в CMOS +; a - новое значение ячейки +; +x1FDD push bc + push af + push bc + ld bc,#FFBA + ld a,(xDFF0) + and #7F + call x2010 ;запись в порт + pop af + ld b,#DF + call x2010 ;выбираем адрес + ld b,#FF ;режим записи данных + ld a,(xDFF0) + or #80 + call x2010 ;запись в порт + pop af ;запись данных в ячейку + ld b,#DF + call x2010 ;запись в порт + ld b,#FF + ld a,(xDFF0) + and #7F + ld (xDFF0),a + call x2010 ;режим чтения cmos + pop bc + ret + +;АДРЕС: #2010 запись в порт +;вх: bc - адрес порта +; a - значение +; +x2010 call x201C ;пауза 293t + out (c),a + ret + +;АДРЕС: #2016 чтение порта +;вх: bc - адрес порта +;вых: a - значение +; +x2016 call x201C ;пауза 293t + in a,(c) + ret + +;АДРЕС: #201C пауза 293t +; +x201C push bc + ld b,#14 + djnz $ + pop bc + ret + +;АДРЕС: #2023 запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F +;вх: a - значение ячейки +; b - номер ячейкм +x2023 call x1FDD ;запись данных в ячейку CMOS + push bc + call x2030 ;подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) + ld a,e + call x1FDD ;запись контрольной суммы + pop bc + ret + +;АДРЕС: #2030 подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) +;вых: e - контрольная сумма +; b=#3F +x2030 push de + ld de,#FFFF + ld b,#10 +x2036 call x1F59 ;чтение ячейки CMOS + call x220F ;суммирование байта с контрольной суммой CMOS CRC8 + inc b + ld a,#3F + cp b + jr nz,x2036 + ld a,e + add a,d + pop de + ld e,a + ret + +;АДРЕС: #2047 определение наличия CMOS +;вых: cy=1 были ошибки +; a=#5A - checksum error +; a - номер сообщения для вывода +x2047 ld b,#3F ;номер ячейки + call x1F59 ;чтение ячейки CMOS + ld d,a + ld a,#55 + call x1FDD ;запись данных в ячейку CMOS + call x1F59 ;чтение ячейки CMOS + cp #55 + jr nz,x2065 ;CMOS отсутствует + ld a,#AA + call x1FDD ;запись данных в ячейку CMOS + call x1F59 ;чтение ячейки CMOS + cp #AA + jr z,x2069 ;CMOS найден +x2065 ld a,#5B ;сообщение: CMOS not found + scf + ret +;CMOS найден. определяем размер CMOS +x2069 ld b,#7F + call x1F59 ;чтение ячейки CMOS + ld e,a + ld a,#55 + call x1FDD ;запись данных в ячейку CMOS + ld b,#3F + call x1F59 ;чтение ячейки CMOS + cp #AA + jr nz,x2087 ;64 байт + ld b,#7F + ld a,e + call x1FDD ;запись данных в ячейку CMOS + set 6,(iy+#1B) ;CMOS 128 байт +x2087 ld b,#3F + ld a,d + call x1FDD ;запись данных в ячейку CMOS + set 6,(iy+#1A) ;CMOS обнаружен +;подсчет контрольной суммы CMOS [#10..#3E] (#3F - контрольная сумма) + call x2030 ;подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) + ld a,e + cp d + jr z,x20C2 ;контрольная сумма совпала +; контрольная сумма не совпала. перезапись CMOS +x2098 ld hl,#0705 ;день и месяц: 5 июля + ld (xDFF9),hl + ld (iy-#19),#61 ;год: 1997 + ld (iy-#1C),#0C ;час: 12 + ld hl,xDFF6 + call x1FB2 ;запись в CMOS времени и даты + rst #30 + dw rom4_x0398 ;запись переменных в CMOS + db #04 + ld b,#0E + ld a,#61 ;признак записи в CMOS переменных + call x1FDD ;запись данных в ячейку CMOS + call x2030 ;подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) + ld a,e + call x1FDD ;запись данных в ячейку CMOS + ld a,#5A ;сообщение: CMOS checksum error + scf + ret +; контрольная сумма совпала +x20C2 ld b,#0D ;регистр #D + call x1F59 ;чтение ячейки CMOS + bit 7,a + jr z,x2098 ;пропадало питание. перезапись CMOS + inc b + call x1F59 ;чтение ячейки CMOS + cp #61 + jr nz,x2098 ;переменные не были сохранены. перезапись CMOS + ld hl,xDFF6 + call x1F93 ;чтение из CMOS времени и даты + ld hl,#0040 + bit 6,(iy+#1B) + jr z,x20E5 ;CMOS 64 байта + ld hl,#0080 +x20E5 ld (xDDA7),hl ;для печати размера CMOS + xor a + ld a,#5C ;сообщение: _число_ bytes CMOS found + ret + +;АДРЕС: #20EC работа с контроллером прерываний ???? +x20EC di + ld a,#0F + scf + ret + +;АДРЕС: #20F1 тестирование HDD (2. test) (тест на чтение/запись) +x20F1 ld hl,xEBF5+#200 ;заполним буфер значениями + xor a + ld b,a +x20F6 ld (hl),a + inc a + inc hl + djnz x20F6 +x20FB ld (hl),a + inc a + inc hl + djnz x20FB + ld hl,x217B ;адрес п/п тестирования сектора на чтение/запись + jr x2108 + +;АДРЕС: #2105 тестирование HDD (1. test) (тест только на чтение) +x2105 ld hl,x2172 ;адрес п/п тестирования сектора на чтение +x2108 ld (xE338),hl + ld (iy+#01),#00 + rst #30 + dw rom5_x30C6 ;печать окна для тестирования HDD + db #05 + ld hl,(xDFF2) ;значение Cylinders HDD + ld de,#0000 + exx + ld bc,(xE5A5) ;head * sector активного HDD + call x0FB7 ;умножение dehl=de'hl' * bc (кол-во секторов на HDD) + push de + push hl + xor a + ld l,a + ld h,a + ld e,a + ld d,a + push de + push hl +x212A ld hl,#0000 + add hl,sp + ex de,hl ;de адрес стэка + ld hl,#0004 + add hl,sp + call x1035 ;сравнение двух чисел в памяти по адресам в de и hl + jp p,x214C ;еще не конец винчестера + call x2169 ;печать текущего номера цилиндра + pop hl + pop hl + pop hl + pop hl + rst #30 + dw rom2_x3807 ;пауза 40416t + db #02 + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + rst #30 + dw rom5_x0EB5 ;печать текущего меню монитора (без возврата) + db #05 +x214C pop hl + pop de + push de + push hl + ld bc,x215A ;адрес п/п перехода к следующему сектору + push bc + ld bc,(xE338) ;адрес п/п тестирования сектора + push bc + ret +;переход к следующему сектору +x215A pop hl + pop de + ld a,l + and #3F + call z,x2169 ;печать текущего номера цилиндра + call x0FF3 ;инкремент dehl + push de + push hl + jr x212A +;печать текущего номера цилиндра +x2169 push de + push hl + rst #30 + dw rom5_x3163 ;печать текущего номера цилиндра + db #05 + pop hl + pop de + ret +;тестирование одного сектора на чтение +x2172 call x1D73 ;чтение сектора с винчестера в буфер xE5A9 + ret nc ;нет ошибок +x2176 rst #30 + dw rom5_x30F3 ;печать кода ошибки винчестера + db #05 + ret +;тестирование одного сектора на чтение/запись +x217B call x1D73 ;чтение сектора с винчестера в буфер xE5A9 + jr c,x2176 ;ошибка чтения. печать кода ошибки винчестера + ld hl,xE5A9 ;сохраним прочитанный сектор + ld de,xEBF5 + ld bc,#0200 + ldir + push ix + ld ix,xEBF5+#200 + call x1D4A ;запись сектора из буфера ix на винчестер + jr c,x21C6 ;ошибка записи + ld ix,xE5A9 + call x1D78 ;чтение сектора с винчестера в буфер ix + jr c,x21C6 ;ошибка чтения + call x21BF ;запись изначальных данных сектора + pop ix + jr c,x2176 ;ошибка записи. печать кода ошибки винчестера + ld hl,xE5A9 + ld bc,#0000 +x21AC ld a,c + cp (hl) + call nz,x21CF ; + inc c + inc hl + djnz x21AC +x21B5 ld a,c + cp (hl) + call nz,x21CF ; + inc c + inc hl + djnz x21B5 + ret +;запись сектора из буфера xEBF5 на винчестер +x21BF ld ix,xEBF5 + jp x1D4A ;запись сектора из буфера ix на винчестер +;ошибка чтения/записи +x21C6 push af + call x21BF ;запись сектора из буфера xEBF5 на винчестер + pop af + pop ix + jr x2176 ;печать кода ошибки винчестера + +x21CF pop de + pop ix + push ix + push de + push hl + push bc + ld b,(hl) + ld de,xE5A9 + or a + sbc hl,de + rst #30 + dw rom5_x3135 ;печать сообщения об ошибке несовпадения данных при чтении/записи на HDD + db #05 + pop bc + pop hl + ret + +;АДРЕС: #21E5 подсчет контрольной суммы области памяти CRC16 +;вх: bc - размер области памяти +; de - адрес начала памяти +;вых: hl - контрольная сумма +x21E5 ld hl,#FFFF + ld a,c + or b + ret z + push ix + push de + pop ix + ex de,hl +x21F1 ld hl,x2222 + ld a,(ix+0) + inc ix + xor e + add a,l + ld l,a + jr nc,x21FF + inc h +x21FF ld a,d + xor (hl) + ld e,a + inc hl + xor a + xor (hl) + ld d,a + dec bc + ld a,c + or b + jr nz,x21F1 + pop ix + ex de,hl + ret + +;АДРЕС: #220F суммирование байта с контрольной суммой CMOS CRC8 +;вх: a - значение +; de - контрольная сумма +;вых: de - контрольная сумма (новое значение) +x220F push hl + ld hl,x2222 + xor e + add a,l + ld l,a + jr nc,x2219 + inc h +x2219 ld a,d + xor (hl) + ld e,a + inc hl + xor a + xor (hl) + ld d,a + pop hl + ret + +;АДРЕС: #2222 данные для подсчета контрольной суммы +;АДРЕС: #2223 данные для подсчета контрольной суммы +x2222 INCBIN "prof_roms/rom7_data4CRC.bin" + +;АДРЕС: #2422 определение наличия SMUC +;вых: cy=1 SMUC не найден +; =0 SMUC обнаружен +; d - номер версии +; e - номер ревизии +x2422 ld de,#FFFF + call x0D51 ;определение наличия SMUC + jr c,x2441 ;не найден + ld bc,#5FBA + in a,(c) + inc a + jr z,x2441 ;версии нет. не найден + dec a + call x2443 ;преобразование версии/ревизии в число + ld d,a + ld bc,#5FBE + in a,(c) + call x2443 ;преобразование версии/ревизии в число + ld e,a + ret +x2441 scf + ret +;преобразование версии/ревизии в число +x2443 ld b,a + rrca + rrca + rrca + and #01 + ld c,a + ld a,b + rlca + rlca + rlca + or c + and #07 + ret + +;неиспользуемая область +x2452 ds #AE,0 ;not used + +;АДРЕС: #2500 ROM-disk +x2500 INCBIN "prof_roms/rom7_ROMdisk.bin" + + SAVEBIN "../Build/scorp/NewROM7.bin",#0000,#4000 + diff --git a/ProfRom_Disasm/rom7.bat b/ProfRom_Disasm/rom7.bat new file mode 100755 index 0000000..bb8713f --- /dev/null +++ b/ProfRom_Disasm/rom7.bat @@ -0,0 +1,4 @@ +MkDir !bin +MkDir !log +DEL /Q !log\*.* +..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom7.a80 >> !log\error.txt