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