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