From 51a7833253f093e18d90171c2a5d9ea7d3620c90 Mon Sep 17 00:00:00 2001 From: boykovra Date: Thu, 8 Aug 2024 14:52:38 +0300 Subject: [PATCH] Version for DSS 1.70+ --- CLOCK.ASM | 36 - CMDLINE.ASM | 22 - DATA.ASM | 116 - DEMON.ASM | 389 -- DEMON_old.EXE | Bin 13943 -> 0 bytes DISASM.ASM | 786 ---- EQU/DOS_EQU.ASM | 71 - EQU/DSS.INC | 104 - EQU/bios_equ.asm | 8 +- EQU/dss_equ.asm | 194 +- ERROR.ASM | 86 - FILE.ASM | 274 -- KDUMP.ASM | 246 -- KEYB.ASM | 1202 ------- KREG.ASM | 440 --- KSTACK.ASM | 212 -- REZ.ASM | 87 - SAVESCR.ASM | 64 - STEP.ASM | 431 --- VERSION/build.bin | 2 +- VERSION/date.bin | 2 +- VERSION/minor.bin | 2 +- VERSION/time.bin | 2 +- changes.md | 28 + changes.txt | 25 - clock.asm | 35 + cmdline.asm | 23 + d010_136.rar | Bin 139810 -> 0 bytes daemon.lst | 1 - data.asm | 124 + demon.asm | 442 +++ demon.exe | Bin 15202 -> 15567 bytes demon.lst | 7807 ---------------------------------------- DEMON.TXT => demon.txt | 0 demon.utf.txt | 377 ++ disasm.asm | 786 ++++ dss.asm | 398 ++ dss.inc | 44 + error.asm | 86 + file.asm | 378 ++ kdump.asm | 260 ++ keyb.asm | 1297 +++++++ kreg.asm | 477 +++ kstack.asm | 215 ++ loadbin.asm | 369 +- make.sh | 2 + readme.md | 27 + readme.txt | 26 - rez.asm | 87 + savescr.asm | 64 + sim/ports.js | 44 + step.asm | 433 +++ TABL.ASM => tabl.asm | 8 +- UTIL.ASM => util.asm | 432 +-- windows.asm | 655 ++-- 55 files changed, 6482 insertions(+), 13244 deletions(-) delete mode 100644 CLOCK.ASM delete mode 100644 CMDLINE.ASM delete mode 100644 DATA.ASM delete mode 100644 DEMON.ASM delete mode 100644 DEMON_old.EXE delete mode 100644 DISASM.ASM delete mode 100644 EQU/DOS_EQU.ASM delete mode 100644 EQU/DSS.INC delete mode 100644 ERROR.ASM delete mode 100644 FILE.ASM delete mode 100644 KDUMP.ASM delete mode 100644 KEYB.ASM delete mode 100644 KREG.ASM delete mode 100644 KSTACK.ASM delete mode 100644 REZ.ASM delete mode 100644 SAVESCR.ASM delete mode 100644 STEP.ASM create mode 100644 changes.md delete mode 100644 changes.txt create mode 100644 clock.asm create mode 100644 cmdline.asm delete mode 100644 d010_136.rar delete mode 100644 daemon.lst create mode 100644 data.asm create mode 100644 demon.asm delete mode 100644 demon.lst rename DEMON.TXT => demon.txt (100%) create mode 100644 demon.utf.txt create mode 100644 disasm.asm create mode 100644 dss.asm create mode 100644 dss.inc create mode 100644 error.asm create mode 100644 file.asm create mode 100644 kdump.asm create mode 100644 keyb.asm create mode 100644 kreg.asm create mode 100644 kstack.asm create mode 100755 make.sh create mode 100644 readme.md delete mode 100644 readme.txt create mode 100644 rez.asm create mode 100644 savescr.asm create mode 100644 sim/ports.js create mode 100644 step.asm rename TABL.ASM => tabl.asm (97%) rename UTIL.ASM => util.asm (51%) diff --git a/CLOCK.ASM b/CLOCK.ASM deleted file mode 100644 index 1eab560..0000000 --- a/CLOCK.ASM +++ /dev/null @@ -1,36 +0,0 @@ -;[]=========================================================================[] -;[] Вывод часов [] -;[] v0.03 - последние изменения 01.02.2006 [] -;[]=========================================================================[] -Clock: - ld a,(ClockOn) ;флаг вывода часов - inc a - ret nz - ld c,Dss.SysTime - rst DssRst ;прочитать данные о времени - ld de,.String - push de - push bc - push hl - ld l,h ;часы - ld h,0 - call ConvDecStr8_1 - inc de - pop hl ;минуты - ld h,0 - call ConvDecStr8_1 - inc de - pop hl - ld l,h ;секунды - ld h,0 - call ConvDecStr8_1 - ld de,71 - ld c,Bios.Lp_Set_Place ;установка позиции печати - rst BiosRst : di - pop hl - ld bc,8*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки - rst BiosRst : di - ret - -.String db "00:00:00" - diff --git a/CMDLINE.ASM b/CMDLINE.ASM deleted file mode 100644 index f21a2e4..0000000 --- a/CMDLINE.ASM +++ /dev/null @@ -1,22 +0,0 @@ -;[]=========================================================================[] -;[] Обработка командной строки монитора-отладчика DemoN [] -;[] v0.10 - последние изменения 08.06.2006 [] -;[] Вход: на стеке адрес начала командной строки в памяти [] -;[] Выход: CF=1 - нет параметров, CF=0 - есть параметры [] -;[]=========================================================================[] -CmdLine: - pop hl ;начало - ld a,(hl) ;длина командной строки - or a - scf - jr z,.L1 ;нет параметров - - ld de,FDebug ;буфер - inc hl - ld c,Dss.GSwitch ;выделение параметра - rst DssRst - - or a ;CF=0 -.L1 - ;ret - diff --git a/DATA.ASM b/DATA.ASM deleted file mode 100644 index 8b1d920..0000000 --- a/DATA.ASM +++ /dev/null @@ -1,116 +0,0 @@ -;[]=========================================================================[] -;[] Данные монитора-отладчика DemoN [] -;[] v0.01 - последние изменения 10.10.2004 [] -;[] v0.02 - последние изменения 11.03.2005 [] -;[] v0.03 - последние изменения 05.02.2006 [] -;[] v0.10 - последние изменения 10.09.2006 [] -;[]=========================================================================[] -SymbolNoPrint db #b0;"." ;символы < пробела -ClockOn db On ;признак вывода часов -DemonScreen db 0 ;номер экрана отладчика -OSScreen db 0 ;Номер экрана ОСи -OSGrafMode db 0 ;Графический режим оси -BufPage db 255 ;Номер страницы с оконным буфером - -Hello db 13,10 -; db "Версия откомпилирована специально для Василия Иванова!",13,10,10 - db "DemoN v" - incbin "VERSION\major.bin" - db "." - incbin "VERSION\minor.bin" - db " build " - incbin "VERSION\build.bin" - db " (alpha) ",13,10 - db "Last edition " - incbin "VERSION\date.bin" - db " (BLR " - incbin "VERSION\time.bin" - db ")",13,10 - db "FidoNet: Igor Zhadinets 2:454/5.18; " - db "e-mail: igor_ast@tut.by",13,10,10,0 -Str: -.Load db "Load file ...",0x0D,0x0A,0 -.DA db 0x0d,0x0A,0 - -PauseFlash equ 16 ;частота мигания прогр.курсора - -Color: -.Screen db 00000111b ;основной цвет экрана -.Border db 00000011b ;цвет рамки -.TextStrReg db 00000010b ;цвет регистровых пар -.TextStrWin db 00000101b ;цвет номеров окон -._SP db 00000110b ;подсветка вершины стека -._PC db 01110001b ;подсветка выполняемой стр. -.RezArea db 00001110b ;подсветка резидента -.TextStrLogo db 00000100b ;цвет лого программы -.Cursor db 00011101b ;цвет курсора-указателя -.InLine db 00111111b ;цвет строки ввода -.InLineEd db 00110001b ;цвет строки ввода при ред. - -StackDebug ds 2 ;адрес стека отладчика -BankDebug ds 1 ;номер банки отладчика -BankOS ds 1 ;номер банки с OS -RezAdr dw 0x7000 ;адрес посадки резидента -StackDown ds 1 ;глубина стека -StackDump dw 0x800A ;начало дампа стека - -Reg: ;значение регистровых пар -._IX dw 0 -._IY dw 0 -._HL dw 0 -._DE dw 0 -._BC dw 0 -._AF dw 0 -._HL_ dw 0 -._DE_ dw 0 -._BC_ dw 0 -._AF_ dw 0 -._IR dw 0 -._SP dw 0x7FFE -._PC dw 0 - -WinPage: db 0xFF,0xFF,0xFF,0xFF ;адреса подключенных страниц - -Dump1 dw 0x4000 ;адрес начала динамического дампа -Dump: ;адреса начала строк дампа - dw InputLine.Buffer;0x4100 - dw InputLine.Buffer+16;0x8100 - dw PutCode.Buffer;0xC100 - dw 0x5280 - dw 0x9280 - dw 0xD280 - dw 0x6000 - dw 0xA000 - -ListAdr: ds 40 ;буфер хранения адресов листинга -ListFormat: db -1 ;форматный вывод листинга - ;-1 - да; 0 - нет - -DecHex db 0 ;0-HEX FF-DEC система - -;======== Констатнты ====== -On equ 0xFF -Off equ 0 -Ins equ 0 -Ovr equ 0xFF -SysSymb equ 0x1B ;системный знакогенератор - -;печать через п/п биоса - ifdef D_PRINTCH_BIOS -Demon.Bios_Win db 0 ;идентификатор окна биоса -MainWin db 80,32,0,0,00110000b,0,0,0 - ds 26,0 - endif - -;-------------------------------------- -;Диалоговое окно для пп выхода -;-------------------------------------- -ExitDlg db 6,22,13,32,6,#40 - db "Confirmation",0 - db " You really want to quit?" - db 0x16,32,17,"OK Cancel",0 - db 2 - db 29,17,8,2 ;Ok - dw 0,0 - db 39,17,8,2 ;Cancel - dw 0,Keyb.NoExit \ No newline at end of file diff --git a/DEMON.ASM b/DEMON.ASM deleted file mode 100644 index 93c0bb5..0000000 --- a/DEMON.ASM +++ /dev/null @@ -1,389 +0,0 @@ -;[]=========================================================================[] -;[] Монитор-отладчик DemoN [] -;[] v0.01 - последние изменения 10.10.2004 [] -;[] v0.02 - последние изменения 07.02.2005 [] -;[] v0.03 - последние изменения 11.03.2006 [] -;[] v0.10 - последние изменения 27.08.2006 [] -;[]=========================================================================[] - - DEVICE ZXSPECTRUM128 - -; define DEBUG 1 ;открытие дебаггерных заглушек -; define D_PRINTCH_BIOS 1 - - org #8100-512 -STARTPRG - DB "EXE" ;EXE ID - DB #00 ;EXE VERSION - DW #0200 ;CODE OFFSET LOW - DW #0000 ;CODE OFFSET HIGH - DW #0000 ;END-BEG ;PRIMARY LOADER - DW #0000 ; - DW #0000 ;RESERVED - DW #0000 ; - DW OrgAdr ;LOAD ADDRESS - DW OrgAdr ;START ADDRESS - DW #C001 ;STACK ADDRESS - - -OrgAdr equ 0x8100 - org OrgAdr -; stack 0xC001 - - push ix ;адрес командной строки - in a,(EmmWin.P2) ;банка с отладчиком - ld (BankDebug),a - in a,(EmmWin.P0) ;банка с OS - ld (BankOS),a -; ld (WinPage),a - -; ld (Reg._SP),sp ;адрес стека - call SaveAllRegs ;сохранение регистровых пар -; ld a,(BankDebug) - ld a,0xFF ;скрываем банку с отладчиком - ld (WinPage+2),a - include "cmdline.asm" - call nc,LoadFile - jp Start - -HorizLine db 8 ;количество линий - ;1-длина 2-столбец 3-строка 4-символ - db 0x4E,0x01,0x00,0xCD, 0x17,0x01,0x03,0xC4 - db 0x17,0x01,0x09,0xC4, 0x17,0x01,0x0F,0xC4 - db 0x17,0x01,0x11,0xCD, 0x4E,0x01,0x15,0xCD - db 0x4E,0x01,0x1E,0xCD, 0x17,0x01,0x13,0xCD - -VerticalLine db 5 ;количество линий - ;1-высота 2-столбец 3-строка 4-символ - db 0x1D,0x00,0x01,0xBA, 0x10,0x09,0x01,0xB3 - db 0x08,0x0C,0x16,0xBA, 0x14,0x18,0x01,0xBA - db 0x1D,0x4F,0x01,0xBA - -Corner db 41 ;углы рамок - ;1-столбец 2-строка 3-символ - db 0x00,0x00,0xC9, 0x00,0x03,0xC7, 0x00,0x09,0xC7 - db 0x00,0x0F,0xC7, 0x00,0x11,0xCC, 0x00,0x15,0xCC - db 0x00,0x1E,0xC8, 0x06,0x11,0xD1, 0x06,0x13,0xCF - db 0x09,0x00,0xD1, 0x09,0x03,0xC5, 0x09,0x09,0xC5 - db 0x09,0x0F,0xC5, 0x0C,0x11,0xD1, 0x0C,0x15,0xCB - db 0x0C,0x1E,0xCA, 0x12,0x0F,0xC2, 0x12,0x11,0xD8 - db 0x12,0x13,0xCF, 0x18,0x00,0xCB, 0x18,0x03,0xB6 - db 0x18,0x09,0xB6, 0x18,0x0F,0xB6, 0x18,0x15,0xCA - db 0x00,0x13,0xCC, 0x0C,0x13,0xCF, 0x4F,0x00,0xBB - db 0x18,0x13,0xB9, 0x4F,0x15,0xB9, 0x4F,0x1E,0xBC - db 0x18,0x11,0xB9, 0x06,0x12,0xB3, 0x12,0x10,0xB3 - db 0x12,0x12,0xB3, 0x09,0x13,0xD1, 0x09,0x14,0xB3 - db 0x09,0x15,0xCF, 0x0C,0x12,0xB3, 0x0E,0x13,0xCB - db 0x0E,0x14,0xBA, 0x0E,0x15,0xCA - -TextStrReg db 0x16,0x01,0x01,"IX", 0x16,0x01,0x02,"IY" - db 0x16,0x01,0x04,"HL", 0x16,0x01,0x05,"DE" - db 0x16,0x01,0x06,"BC", 0x16,0x01,0x07,"AF" - db 0x16,0x01,0x0A,"HL'", 0x16,0x01,0x0B,"DE'" - db 0x16,0x01,0x0C,"BC'", 0x16,0x01,0x0D,"AF'" - db 0x16,0x01,0x10,"PC", 0x16, 0x0A,0x10,"IR" - db 0x16,0x01,0x14,"SP",0 -TextStrLogo db 0x016,0x01,0x1F,0xC4,0xCD,0xCD - db " DemoN v" - incbin "VERSION\major.bin" - db "." - incbin "VERSION\minor.bin" - db " build " - incbin "VERSION\build.bin" - db " (alpha)-" - incbin "VERSION\date.bin" - db " Igor by AlphA Studio, Hard/WCG" - db 0x20,0xCD,0xCD,0xC4,0x00 -TextStrWin db 0x16,0x02,0x11," 0 ",0x16,0x08,0x11," 1 " - db 0x16,0x0E,0x11," 2 ",0x16,0x14,0x11," 3 ",0 -TextStrRez db 0x16,0x0F,0x14,"REZ",0 - - - ;Процедура прорисовки линий - ;HL - адрес начала таблицы -DrawLine ld c,(hl) ;количество линий - inc hl - ld b,(hl) ;длина линии - inc hl - ld e,(hl) ;столбец - inc hl - ld d,(hl) ;строка - inc hl - ld a,(hl) ;символ - push hl -.L1 push bc - push af - ld bc,Dss.WrChar ;цвет в рег.B - rst DssRst - inc d ;наращивание координаты - pop af - pop bc - djnz .L1 - pop hl - dec c - jr nz,DrawLine+1 - ret - - ;Начало программы -Start: - ld hl,Hello ;сообщение программы - ld c,Dss.PChars ;вывести строку - rst DssRst - ld c,Dss.GetVMod ;Текущий граф режим - rst DssRst - jp c,Exit - ld (OSGrafMode),a - ld a,b - ld (OSScreen),a ;и текущая страница экрана - push bc - ld bc,#0100+Dss.GetMem ;резервируем 1 страницу для оконного буфера - rst DssRst - pop de ;В D - номер страницы экрана - OSScreen - jp c,Exit ;Ошибка выделения блока памяти - ld (BufPage),a ;Сохраним страницу в переменной - ld b,a - ld a,(DemonScreen) - cp d ;если экраны ОС и Демона не совпадают - jr nz,StartNext ;то и не сохраняем экран ОСи - ld de,0 ;Сохраняем экран в доп.странице - ld hl,#2050 - ld ix,#c000 - ld c,Dss.WinCopy - rst DssRst - -StartNext ld a,(DemonScreen) ;экран отладчика - ld b,a - ld a,3 ;установить режим 80х32 - ld c,Dss.SetVMod ;Dss.SelPage -; ld bc,0x0054 - rst DssRst - ifdef D_PRINTCH_BIOS - ld ix,MainWin ;Открытие окна ч/з биос - ld e,00010001b - rst BiosRst - ld (Demon.Bios_Win),a -; jr nc,.lp1 -; ld c,Dss.EchoKey ;дебуггерная заглушка -; rst DssRst - - endif -.lp1 -; ld a,(Color._SP) ;подсветка вершины стека -; ld b,a -; ld de,0x1C01 -; ld hl,0x010B -; ld a," " -; ld c,Dss.Clear -; rst DssRst - call ClearScreen - call DrawDemonScreen - -; ld c,Dss.EchoKey ;дебуггерная заглушка -; rst DssRst - - jp Start1 -;Обновление экрана демона -RefreshScreen call CursorRes - call ClearScreen - call DrawDemonScreen - call Refresh - call Cursor ;вкл курсор - jp CursorSet - -ClearScreen ld a,(Color.Screen) - ld b,a ;очистка экрана - ld de,0 - ld hl,0x2050 - ld c,Bios.Lp_Cls_Win - rst BiosRst - ret -DrawDemonScreen - ld a,(Color.Border) ;установка цвета рамки - ld (DrawLine.L1+4),a - ld (DrawCorner+10),a - ld a,0x14 ;код мнемоники INC D - ld (DrawLine.L1+6),a - - ld hl,VerticalLine ;вертикальные линии - call DrawLine - - ld hl,HorizLine ;горизонтальные линии - ld a,0x1C ;код мнемоники INC E - ld (DrawLine.L1+6),a - call DrawLine - - ld hl,Corner - ld b,(hl) ;количество углов -DrawCorner push bc - inc hl - ld e,(hl) ;столбец - inc hl - ld d,(hl) ;строка - inc hl - ld a,(hl) ;символ - push hl - ld bc,Dss.WrChar ;цвет в рег.B - rst DssRst - pop hl - pop bc - djnz DrawCorner - - ld hl,TextStrReg - ld a,(Color.TextStrReg) ;цвет регистровых пар - ld (PrnStrColor.L1+5),a - call PrnStrColor - ld hl,TextStrWin - ld a,(Color.TextStrWin) ;цвет номеров окон - ld (PrnStrColor.L1+5),a - call PrnStrColor - ld hl,TextStrLogo - ld a,(Color.TextStrLogo) ;цвет лого программы - ld (PrnStrColor.L1+5),a - call PrnStrColor - ld hl,TextStrRez - ld a,(Color.RezArea) ;цвет резидента - ld (PrnStrColor.L1+5),a - call PrnStrColor - ret - ds OrgAdr+0x700-$ -Start1: - call PreparChar ;подготовка программного курсора ввода -; ld hl,(Reg._PC) -; ld hl,0 -; ld (ListAdr),hl - - call Refresh - call Keyb - -Exit: - ld hl,(Rst38.Vect+1) ;восстановление вектора DSS - ld (0039h),hl - - ld a,(OSScreen) ;и текущая страница экрана - ld b,a - push bc - ld a,(OSGrafMode) - ld c,Dss.SetVMod - -; ld bc,0x0100+Dss.SelPage ;восстановление экрана DSS - rst DssRst - pop bc - ld a,(DemonScreen) - cp b - jr nz,ExitNext - ld de,0 ;Восстанавливаем экран из доп.страницы - ld hl,#2050 - ld ix,#c000 - ld c,Dss.WinRest - ld a,(BufPage) - push af - ld b,a - rst DssRst - pop af - ld c,Dss.FreeMem ;Отдаем страницу буфера обратно ОСи - rst DssRst - -ExitNext - ld bc,Dss.Exit ;нормальное завершение - rst DssRst -Return ret - -Refresh: - di - ld de,0x0104 ;вывод значений регистров - ld hl,(Reg._IX) - call PrintStrReg - ld de,0x0204 - ld hl,(Reg._IY) - call PrintStrReg - ld de,0x0404 - ld hl,(Reg._HL) - call PrintStrReg - ld de,0x0504 - ld hl,(Reg._DE) - call PrintStrReg - ld de,0x0604 - ld hl,(Reg._BC) - call PrintStrReg - ld de,0x0A04 - ld hl,(Reg._HL_) - call PrintStrReg - ld de,0x0B04 - ld hl,(Reg._DE_) - call PrintStrReg - ld de,0x0C04 - ld hl,(Reg._BC_) - call PrintStrReg - ld de,0x0704 - ld hl,(Reg._AF) - call PrintStrAF - ld de,0x0D04 - ld hl,(Reg._AF_) - call PrintStrAF - ld de,0x1004 - ld hl,(Reg._PC) - call PrintReg - ld de,0x100D - ld hl,(Reg._IR) - call PrintReg - ld de,0x1404 - ld hl,(Reg._SP) - call PrintReg - call PrintSPDn - ld de,0x1413 - ld hl,(RezAdr) - call PrintReg - - call PrintStrWin ;вывод номеров банок в окнах - - call PrintStrSP ;вывод дампа стека - - call PrintDump - ei - jp DisAsm - -DemonHelp call CursorRes - ld ix,HelpWnd - jp DialogWindow - -; ld hl,HelpWndDlg -; jp WinDialog -HelpWnd db 6,16,11,42,7,#27 - db "DemoN Help Page",0 - db " DemoN v" - incbin "VERSION\major.bin" - db "." - incbin "VERSION\minor.bin" - db " build " - incbin "VERSION\build.bin" - db " (alpha)-" - incbin "VERSION\date.bin" - db 0x0D - db " Igor by AlphA Studio, Hard/WCG",0x0D,0x0D - db " OK",0 -HelpWndDlg db 1 ;Описатель диалогового окна - db 16+19,16,4,2 - dw 0,0 - - include "EQU\dss_equ.asm";"D:\WORKAST\EQU\dss_equ" - include "EQU\bios_equ.asm";"D:\WORKAST\EQU\bios_equ" - include "EQU\port.asm";"D:\WORKAST\EQU\port" - include "disasm.asm";"D:\WORKAST\DEMON\disasm" - include "util.asm";"D:\WORKAST\DEMON\util" - include "file.asm";"D:\WORKAST\DEMON\file" - include "error.asm";"D:\WORKAST\DEMON\error" - include "clock.asm";"D:\WORKAST\DEMON\clock" - include "keyb.asm";"D:\WORKAST\DEMON\keyb" - include "kreg.asm";"D:\WORKAST\DEMON\kreg" - include "kstack.asm";"D:\WORKAST\DEMON\kstack" - include "kdump.asm";"D:\WORKAST\DEMON\kdump" - include "rez.asm";"D:\WORKAST\DEMON\rez" - include "step.asm";"D:\WORKAST\DEMON\step" - include "savescr.asm";"D:\WORKAST\DEMON\savescr" - include "data.asm";"D:\WORKAST\DEMON\data" - include "tabl.asm";"D:\WORKAST\DEMON\tabl" - include "loadbin.asm" - include "windows.asm" - -EndOfDaemon - savebin "demon.exe",STARTPRG,EndOfDaemon-STARTPRG \ No newline at end of file diff --git a/DEMON_old.EXE b/DEMON_old.EXE deleted file mode 100644 index d77f61d82adc637b4a87c7df5ea9421eee1810be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13943 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

S5?-rFtv^lg!qIlD z%gW5oAfC^8HOEkpgH6iIVB7gnBx}wnJ+?O|V_nuLAUZvI8U}(%`Dnw&++0ImepV(L z1xK!2nYCd97?P8nmB|vZtt3*jvR*}5d3lCBC}QIu@t7_}=R&=hmks9U<{9#VhDgEQ z;CMI$SJtzAu__~b?Z&(;BDyd?D<>07V3BG>t9}of!y1y6W7xQQ4O$16gLy@x4dSY3 z#ahG4SAWMjo&G&&`tLzA9`-WV!3w*n_A8^g9-T6q{`u9(?@+bLd?pMvo@_K5QLU*K zX*DQZNzdRQLB#VLvhq;I3h?D<-?*AHT@@Ba&zwmtKeYbPu0!RAY7Vs=`smPShrT&< z|B$eJeEFR6*z!f?+2zIMZft$u7aU%Gc*Egc zhu=P2d-&$zFAl3W*F|)QWCN0dBd|=bg+1ucW&U4z-z(Nb*icA{nSJP=vYMkM8aQtV3Zw&oV#G*T%$N{) zl|h#e94%%JAWv9MpP^3}rH#x%gg}_kP39lq=mLSTd;jyXTf2|g0@(E3lhU^sWB2T% zOnvt=N12B180y@i%6f;q9)FY%qCK8PW;Ip-| zQ~OFH5ML`SuuVDLx$Ov}LvnnwFMmV6)aZaCx2>(hxnz?OAE`gtcEqXMWW-dy$QQRL zf^ma3kp-Q*k1%maXggmEN*MiBbjV!aq1^>%CEd2dwN!bzgnF<~s z+PIa+-@?Nj3YKI0@(PSt0zr(oZ9K-LD|if5go6D2H6YMqye;RL${QnM=iX!@Z{Bdfp$vk*HiN%E z?4tkPZe>a4-dv~;3i1pR5;v4do-FD=+O3Ro?#GPU%4FPRHh+Bk?^bn$F{x21R6lD> zf*F-psqLhFkIP@Fl5eP#ZLDl8pw?5llq72Z_yWp*J>@U{$@bH6bzWurm46%u`c+l3 zbH^NP#DF`A_RUG!eBjMz;M6L5I?71z&dm-GhDA>>1qGAq8gwch;=PAiW7u6v();M5j#M7^r2 z{mR|Sp-X-CPd#utX#dUL2@^NFN^^~=q_eB6>eb-?)m6?VuT(ix7gx0_yo1+P9T83t zwe@PnR#EGbUin%UiwBXycMHDZSv`tBB3!}|Vog^aFi=)Q6IWG1=*X^uqYlV|Ym6hk zb}KPVkhoo&X~BtN=xi}W-x61#`{zk6&`AJ>V;!#qA{`41{`RDE$v;m*wDW{$$J?Tb zkdA>UCx*bq+Zv%+9Y)GoIw7A)MLx1GPZnQP@hR~yCDJdMMMxz33IIwLppkw80|v)5 zPTO;E4+j=-wMT;5n`g(Rja)*nB zl5bA*V@05)7<|PDud<4+V%X*z!e!DYH0b5ghZTSSn>1-0gk>;9gXqz)jOA}T(!UjJpM(VTa-($;64DvQ z>(x*Yz@xa8#s^Heh;(nHb$A{B&%Brw)WR(qwhb=Q*o?DH&eLc&LYQ5QV8UWjaFE9t&2N42)H@vG*jBY2&j=+VHb3sdWp)jz_9fB`z$4f?- zJ*W18TQ}27t6@9PQq67$+N)i&q^0_??Ld1qOcE9r+*S<}sKZCb*Q?S>4Qz>@*1u9qLQaY5$vXN;PUPx80L3TCDigR zsz?n6Z>C${0sk(qVf~v~E;@lb{NaJei_T?B;+m`@F~!{z&s4hY!QnC zS$E+cjqa_XWwq+LMtbsT`hJboi+c{VN)r^K+bhg_Cb_@j2M=*)Cl<{ew07{;Xm=eO8g{KYlZIP3qmG{f1%`O-&H?n zgwY1iMKD_Jl6PxJO|5q8J+PdI4^Mo5YDj~=$CtM|ZE<^?8#G4eW{8Re;oJaE44XCh zn>F}$ZMjiB4@f{eaKd7ZeMCQJ#AYcbu$B27Y=KeeE+K|7$j@JV-#&B+H@OfeMUY4| zwID;db>!go!0MU;_uyS50@i)FV1|;0E&bnbWPiW4{eOUv8gk$!J-&{7mKdNX)Uj9V z9sLf`iv#w)0&3!BIA08rUOu^ShMG(S6vIgWTqdq-6nPD(ME7Jwhh(0YC}3a+u6@qHR)>IrqQzsZEVtemhZQ>K7rSOaaS`|NW%w@z&UEIb9kO?3x+fd<+D65H7OK;)$* zWO;Q1ssMU@ohSecCISXjLN(MtbS|&~rAW(tRsm8|btz#{@rgv(FyZ5+|37|L7omfz zK71MI`nE2^^=+Nj$15RYLq3A5M|{@^7hhq@IbrPgc8aKk6nLgl&rqpnDuaByVzM(0 ziCOt-?i;yM)3$+dmeWr5L zanl)7gQ>-I&h&w))AW(4&-9t;bJJI*Z%sd#?wf{9!g}BO!1{^x@_I#mXgysYQ6F8O zP@httUca<{MSXUCZhc|>w))rW_t#g{SJl_lo9oZkzhB>3Z>{gGPfSWC67(oa7s`W7 z5v2c#~QK*k*73x_gJ(j4)3L}a6DTwdV1T>r`VB_dGrf9ap zBBQY;mML*@DAoi9vP}yLjZ1LDEsINF6~(bUaadqnD5;NRd4R>G3aB_{MG$;gI?9#6 zaIvUis187tWOb_z!}RHKq$^b$y8ko<^@)lMj!_yxRF!n z;s&3A_DBvz>VPS=VR1u7!SUp9Q*Fx2o}i&m1I!c5lsVWOZdRFf<^*$^d67B8yvCesE--I5Bhwq^ zz2?K_@0=tNDVt!+h2JZ{`8>p!px>ugrJM-N< zoeo^dNufL#+j1Asz%U$T%w(f)*DK6l3&+F4?7Ex{8R4Oh_ZV8~q!{ zH$K@owK1eo**K$->kjA@+xw zgoTM|&%f}}%S)GMtXP?uwQBX6>{ni0yDrC&yFPD2{>FkWTT5R1^RCi8dk>W#K3-W> zbNWnugSoZs?1lF)+P`po{qyXm$fgBNDNRe7Ry1WddOIjnhBv$i?5Il1}8=4H*Rn+?qc z&D)w^Z{FX0wE1N7yUph2w&n}Xoz30Nea)XX+nc{?9%}xjnP(Ye39wAGP?lhe(lW;q zWtnez&XR6fYRR&!wd7d}EhUyeS>CYhvmCMbJP zLUxMB7jm(rkP9Y-m?*9=lyq?cn&WcKX%~3{M-CZa6M!6ti69}K=s`jN1%(P-0=SqE z6&lBqMul=LQK2lE&IQ)Fz&Z}BcY*aTu$}|MaAbuZajVI;&rk&P^nLnu(h7Y5;B z0rMOHy_V~i0n07Rpv7)+SiZKv0*qiGMJWl8q0|KUzY$X4mk26& zTg%0kt1X|jeAe>!mM>erZu!3D=N5jePwQtbfvpo-<*h-jbZbOw4AlSLlGK{kx}-I; zHK(E(zmX6j}wykMf*Ou1?+YuBDQwl|e zDqu6g#(db4M6tavy48SXAWG+!7#)jOibNuQAuKQ8vUqmu0zv;#Ry>38>h0R4z(xn= zBCy4?Y@iGnQ#eNbV~pH70gT+#2c7z8H&7LhIU+-WKM_XJqpG4uRB;@z0DvmspgE2d z%n|n(N8CueAf$s-&;fgtloUOtOn8hERvoSx93_~An~}g$#ymzDJR*~e9UwC`8DbTf z{HU#wBl0*Z7;PXg0WU(yxMlI!_3>a6URJOYJqF-;9iM_pa9bcrN`nN5FbonP!!Stx E7Y8cz=Kufz diff --git a/DISASM.ASM b/DISASM.ASM deleted file mode 100644 index 1846c0d..0000000 --- a/DISASM.ASM +++ /dev/null @@ -1,786 +0,0 @@ -;[]=========================================================================[] -;[] Дизассемблер монитора-отладчика DemoN [] -;[] v0.01 - последние изменения 10.10.2004 [] -;[] v0.02 - последние изменения 20.03.2005 [] -;[] v0.03 - последние изменения 16.02.2006 [] -;[] v0.10 - последние изменения 10.09.2006 [] -;[] [] -;[] DisAsm - вывод листинга [] -;[] AttrList - вывод атрибутов строки листинга [] -;[] UpAdres - расчет предыдущего адреса строки листинга [] -;[] List - формирование строки листинга [] -;[]=========================================================================[] - -;[]=========================================================================[] -;[] Вывод листинга [] -;[]=========================================================================[] -DisAsm: - ld hl,(ListAdr) ;адрес первой строки листинга - ld de,0x011A ;координаты печати -.L1 push de - push hl - push de - ld a,d - dec a - add a,a - ld c,a - ld b,0 - ex de,hl - ld hl,ListAdr - add hl,bc - ld (hl),e ;адрес строки листинга - inc hl - ld (hl),d - ex de,hl - pop de - - call AttrList ;окрасить строку - -.L2 call PrintReg - pop hl - call List - pop de - -; push af ;длина кода временно - - ld a,(ListFormat) ;форматный вывод - or a - call nz,LFormat - - push de - push hl - di - ld a,21 - add a,e - ld e,a ;новая координата X - ld c,Bios.Lp_Set_Place ;установка позиции печати - rst BiosRst -; ld c,Dss.Locate -; rst DssRst - ld hl,List.String - ld bc,32*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки - rst BiosRst - ei -; ld c,Dss.PChars -; rst DssRst - pop hl - pop de - - ;печать длины кода в поле метки (временно) -; pop af -; push de -; push hl -; ld e,0x24 -; push de -; ld h,0 -; ld l,a -; ld de,.Buf -; call NumToStr8 -; pop de -; ld c,Dss.Locate -; rst DssRst -; ld hl,.Buf -; ld c,Dss.PChars -; rst DssRst -; pop hl -; pop de -; jr $+5 -;.Buf db "123",0 - ;end (временно) - - inc d ;следующая строка - ld a,(KList.Descript) ;кол-во строк листинга - cp d - jr nc,.L1 - ret - -;[]=========================================================================[] -;[] Вывод атрибутов строки листинга [] -;[] Вход: DE - координаты подсветки [] -;[] HL - текущий адрес листинга [] -;[]=========================================================================[] -AttrList: - di - push hl ;текущий адрес листинга - push de ;текущие координаты - - push hl - ld bc,(Reg._PC) ;адрес программного счетчика - or a ;сброс флага C - sbc hl,bc - pop hl - jr nz,.L2 - ld a,(Color._PC) ;цвет программного курсора - jr .L0 - -.L2 push hl - push de - push hl - ld bc,Rezident.End-Rezident;длина резидента - ld hl,(RezAdr) ;начало резидента - push hl - add hl,bc ;конечный адрес резидента - pop de - dec de - dec de - dec de - dec de - pop bc - - call AdrArea - pop de - pop hl - jr c,.L3 - ld a,(Color.RezArea) ;цвет области размещения резидента - jr .L0 - -.L3 ld a,(Color.Screen) ;основной цвет - -.L0 ld (.L1+1),a - dec e - ld c,Bios.Lp_Set_Place ;установка позиции печати - rst BiosRst -.L1 ld e,0 ;цвет подсветки - ld bc,54*256+Bios.Lp_Print_Atr ;в рег.B длина строки - rst BiosRst - pop de - pop hl - ei - ret - -;[]=========================================================================[] -;[] Расчет предыдущего адреса строки листинга [] -;[] Вход: HL - адрес текущей строки [] -;[] Выход: HL - адрес предыдущей строки [] -;[]=========================================================================[] -UpAdres: - ld de,-4 - add hl,de ;4-х байтная команда? - call Ld_a_hl -; ld a,(hl) - cp 0xDD ;префикс 0xDD - jr z,$+8 - or 00110000b ;маска для префиксов 0xED,0xFD - cp 0xFD - jr nz,.L1 - push hl - call List - pop hl - cp 4 - ret z - -.L1 inc hl - push hl ;3-х байтная команда? - call List - pop hl - cp 3 - ret z - - inc hl - push hl ;2-х байтная команда? - call List - pop hl - cp 2 - ret z - - inc hl - ret ;1-о байтная команда! - -;[]=========================================================================[] -;[] Форматирование строки листинга [] -;[]=========================================================================[] -LFormat: - push hl - ld hl,List.String+11 ;начало строки - ld bc,2 ;макс кол-во вставляемых пробелов -.L2 ld a,(hl) - or a - jr z,.Exit - cp 0x20 ;пробел - jr z,.L1 - inc hl - dec c - jr nz,.L2 - -.Exit pop hl - ret - -.L1 push de - push bc - push hl - ld hl,List.String+30 ;конец строки - ld d,h - ld e,l - or a - sbc hl,bc - pop bc - push bc - push hl - sbc hl,bc ;кол-во байт - ld b,h - ld c,l - pop hl - lddr - pop hl - pop bc ;кол-во пробелов - ld b,c -.L3 inc hl ;адрес вставки - ld a,0x20 - ld (hl),a - djnz .L3 - pop de - pop hl - ret - -;[]=========================================================================[] -;[] Формирование строки листинга [] -;[] Вход: HL - адрес памяти дизассемблирования [] -;[] Выход: HL - следующий за дизассемблированной командой адрес памяти [] -;[] A - длина кода команды [] -;[]=========================================================================[] -List: - xor a ;длина кода команды - ld (.Byte),a - push hl - ld d,h - ld e,l - - ld hl,.String ;очистка буфера строки -; di ;с использованием акселя -; ld d,d ;включить аксель -; ld a,32 ;длина буфера и байт заполнитель -; ld c,c ;команда заполнения -; ld (hl),a ;заполнить -; ld b,b ;выключить аксель -; ei - ld a,32 ;длина буфера и байт заполнитель - ld b,a - ld (hl),a - inc hl - djnz $-2 - - ld ix,.String+2 ;адрес в строке для след.кода - ex de,hl -; ld a,(hl) ;байт из памяти - call Ld_a_hl - - ;=============================== - cp 0xDD ;префикс #DD - jr z,.L43 - cp 0xFD ;префикс #FD - jp nz,.L30 - - ld de,"DF" - ld a,"Y" - jr .L42 - -.L43 ld de,"DD" - ld a,"X" - -.L42 ld (.String),de ;префикс в строку - ld (.IRS1+1),a ;корректировка рег.пары - ld (.L9+1),a - ld (.L13+6),a - ld a,1 - ld (.Byte),a ;длина кода команды - pop hl - inc hl -; ld a,(hl) ;следующий байт команды - call Ld_a_hl - push hl - cp 0xCB - jr z,.L40 ;команды #DD(#FD)#CB - - ld hl,CodeDDFD ;таблица кодов - ld bc,85 ;размер таблицы - cpir ;поиск кода - jr z,.L45 - pop hl - ld bc,ED00 - ld de,.String+9 ;копирование мнемоники NOP * - ld a,(bc) - or a - ret z - ld (de),a - inc de - inc bc - jr $-6 - -.L45 ld hl,84 ;размер таблицы - or a - sbc hl,bc - ld de,TablDDFD - jp .L_12+3 - -.L40 ld ix,.String+4 ;адрес в строке для след.кода - ld de,"BC" ;префикс в строку - ld (.String+2),de - ld a,4 ;длина кода - ld (.Byte),a - pop hl - inc hl - call Ld_a_hl - ld b,a -; ld b,(hl) ;байт-смещение - inc hl - call Ld_a_hl -; ld a,(hl) ;следующий байт команды - inc hl - push hl - ld c,a - ld h,0 - cp 0x40 ;от 0 до 0x3F (сдвиги) - jr c,.L44 - - call .ComCBBit ;мнемоника BIT,SET,RES - ld a,c - cp 0x80 ;команда BIT - jr nc,.L41 - call .NomBit ;номер бита - call .IndexRegSh ;индексная пара со смещением - jr .L46 - -.L41 call .NomBit ;номер бита - jr .L44+3 - -.L44 call .ComCBSh ;мнемоника - call .RegName ;регистр - jr nz,$+6 - ld a,"," ;разделитель - ld (de),a - inc de - call .IndexRegSh ;индексная пара со смещением - -.L46 ld a,c - call ConvHexStr - ld (ix+2),l - ld (ix+3),h - pop hl - ret - - ;=============================== -.L30 cp 0xCB ;префикс #CB - jp nz,.L20 - ld de,"BC" ;префикс в строку - ld (.String),de - pop hl - inc hl - call Ld_a_hl -; ld a,(hl) ;следующий байт команды - inc hl - push hl - ld c,a - ld h,0 - cp 0x40 ;от 0 до 0x3F (сдвиги) - jr nc,.L31 - call .ComCBSh ;мнемоника - jr .L31+6 -.L31 call .ComCBBit ;мнемоника - call .NomBit ;номер бита - call .RegName ;регистр - call nz,.HLReg - ld a,c - call ConvHexStr - ld (ix+0),l - ld (ix+1),h - pop hl - ld a,2 ;длина кода команды - ret - - ;=============================== -.L20 cp 0xED ;префикс #ED - jr nz,.L10 - ld a,1 - ld (.Byte),a ;длина кода - ld de,"DE" ;префикс в строку - ld (.String),de - pop hl - inc hl - push hl - call Ld_a_hl -; ld a,(hl) ;следующий байт команды - cp 0x40 ;от 0 до 0x3F - jr c,.L21 - ld de,TablED-0x40*2 - cp 0x7F ;от 0x40 до 0x7E из таблицы - jr c,.L_12 - cp 0xA0 ;от 0x7F до 0x9F - jr c,.L21 - ld de,TablED-0xA0*2+0x40*2-2 - cp 0xBC ;от 0xBC до 0xFF - jr c,.L_12 -.L21 ld hl,ED00 ;команда "NOP *" - jr .L_2-3 - - ;=============================== -.L10 ld ix,.String - ld de,Tabl00_3F ;таблица смещений - cp 0x40 ;команды 0x00...0x3F - jr c,.L_12 - ld de,TablC0_FF ;таблица смещений - ld c,a - sub 0xC0 ;команды 0xC0...0xFF - jr nc,.L_12 - - ld a,c - cp 0x80 - jr nc,.L8 - ld hl,MHALT - cp 0x76 ;код команды HALT - jr z,.L_2-3 - - ld hl,.String+9 - ld (hl),"L" ;мнемоника LD - inc hl - ld (hl),"D" - inc hl - ld (hl)," " - inc hl - rrca - rrca - rrca - ex de,hl - call .RegName+1 ;печать регистра - call nz,.HLReg - ld a,"," ;разделитель - ld (de),a - inc de - call .RegName ;печать регистра - call nz,.HLReg - xor a - jr .L1 - -.L8 and 00111000b ;ADD,ADC,SUB,SBC,AND,XOR,OR,CP - rrca - rrca - ld l,a - ld h,0 - ld de,TablM - add hl,de ;смещение в таблице - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - ld de,.String+9 ;копирование в строку-буфер - ld a,(hl) - ld (de),a - inc de - inc hl - or a - jr nz,$-5 - dec de - call .RegName ;печать регистра - call nz,.HLReg - xor a - jr .L1 - -.L_12 ld l,a ;расчет адреса в таблице - ld h,0 - add hl,hl ;*2 - add hl,de - ld a,(hl) - inc hl - ld h,(hl) - ld l,a ;адрес строки-мнемоники - - ld de,.String+9 ;копирование в строку-буфер -.L_2 ld a,(hl) - cp 0x20 - jr c,.L1 - cp "x" ;индексный регистр - jr nz,$+4 -.L9 ld a,"X" - ld (de),a - cp ")" - jr nz,$+9 - ld (.TablAdr),hl - ld (.StrAdr),de - inc hl - inc de - jr .L_2 - -.L1 exa - pop hl ;печать байта - call Ld_a_hl -; ld a,(hl) - inc hl - push hl - call ConvHexStr - ld (ix+0),l - ld (ix+1),h - exa - jp z,.LE - - dec a ;2-х байтная команда (1) - jr nz,.L3 - call .TwoByteCom - pop hl - ld a,(.Byte) - inc a - inc a ;длина кода - ret - -.L3 dec a ;3-х байтная команда (2) - jr nz,.L4 - call .ThreeByteCom - pop hl - ld a,(.Byte) - add a,3 ;длина кода - ret - -.L4 dec a ;команды относительного перехода (3) - jr nz,.L7 - pop hl - call Ld_a_hl -; ld a,(hl) ;2-й байт команды - inc hl - push hl - ld c,a - call ConvHexStr - ld (ix+2),l - ld (ix+3),h - ld a,c - ld b,0 - pop hl - push hl ;текущий адрес - bit 7,a ;знак числа - jr z,$+10 - neg - or a ;сброс флага C - ld c,a - sbc hl,bc ;отрицательное смещение - jr $+3 - add hl,bc ;положительное смещение - call NumToStr16 - pop hl - ld a,2 ;длина кода - ret - -.L7 dec a ;команды работы с портами (4) - jr nz,.L5 - inc a - ld (.Byte),a ;длина кода - ld de,(.StrAdr) ;адрес вставки - call .TwoByteCom - jr .L6 - -.L5 dec a ;3-х байтные косвенной адресации (5) - jr nz,.L11 - ld a,(.Byte) - inc a - inc a - ld (.Byte),a ;длина кода - ld de,(.StrAdr) ;адрес вставки - call .ThreeByteCom - jr .L6 - -.L11 dec a ;индексные регистры со смещением (6) - jr nz,.LE - ld a,2 - ld (.Byte),a ;длина кода - ld de,(.StrAdr) ;адрес вставки - pop hl - call Ld_a_hl - ld b,a -; ld b,(hl) - inc hl - push hl - ld ix,.String+4 - call .IndexRegSh -.L6 ld hl,(.TablAdr) ;адрес в таблице мнемоник - ld a,(hl) - cp 0x20 - jr nc,.L13 - ld a,b - cp "," ;мнемоника оканч. на "," - jr nz,.LE - call .TwoByteCom - pop hl - ld a,4 ;длина кода - ret - -.L13 ld b,a - cp "x" ;индексный регистр - jr nz,$+4 - ld a,"X" - ld (de),a - inc hl - inc de - jr .L6+3 - -.LE pop hl - ld a,(.Byte) ;длина кода - inc a - ret - -;======== печать второго кода двухбайтной команды ======== -.TwoByteCom: - pop bc ;адрес возврата - pop hl - call Ld_a_hl -; ld a,(hl) ;2-й байт команды - inc hl - push hl - push bc - ld c,a - call ConvHexStr - ld (ix+2),l - ld (ix+3),h - ld l,c - ld h,0 - jp NumToStr8 - -;======== печать второго и третьего кода трехбайтной команды ======== -.ThreeByteCom: - pop bc ;адрес возврата - pop hl - call Ld_a_hl -; ld a,(hl) ;2-й байт команды - inc hl - exa - call Ld_a_hl -; ld a,(hl) ;3-й байт команды - inc hl - push hl - push bc - ld b,a - call ConvHexStr - ld (ix+4),l - ld (ix+5),h - exa - ld c,a - call ConvHexStr - ld (ix+2),l - ld (ix+3),h - ld h,b ;в HL - число - ld l,c - jp NumToStr16 - -;======== печать мнемоник команд с префиксом 0xCB (сдвиги, битовые) ======== -;A - байт команды -;DE - адрес в строке -.ComCBBit: - and 11000000b - rlca - rlca - rlca - rlca - ld l,a - ld de,CB40-4 - add hl,de - jr .ComCBSh1 -.ComCBSh: - and 00111000b ;смещение в таблице - rrca - rrca - ld l,a - ld de,TablCB - add hl,de - ld a,(hl) - inc hl - ld h,(hl) - ld l,a -.ComCBSh1 ld de,.String+9 ;копирование в строку-буфер - ld a,(hl) - ld (de),a - inc de - inc hl - cp " " ;последний символ мнемоники - jr nz,$-6 - ret - -;======== вычисление номера бита в битовых командах BIT, SET, RES ======== -;C - байт команды -;DE - адрес в строке -.NomBit: - ld a,c - and 00111000b ;номер бита - rrca - rrca - rrca - add a,"0" - ld (de),a - ld a,"," - inc de - ld (de),a - inc de - ret - -;======== печать имени регистра ======== -;C - команда -;DE - адрес в строке -.RegName: - ld a,c - and 00000111b ;регистр - add a,"B" - cp "F" ;B,C,D,E - jr c,.RN1 - inc a - inc a - cp "H" - jr z,.RN1 - add a,3 - cp "L" - jr z,.RN1 - sub 13 - cp "A" - ret nz ;относительная адресация -.RN1 ld (de),a - inc de - xor a - ret - -;======== печать (HL) ======== -;DE - адрес в строке -.HLReg: - ex de,hl - ld (hl),"(" - inc hl - ld (hl),"H" - inc hl - ld (hl),"L" - inc hl - ld (hl),")" - inc hl - ex de,hl - ret - -;======== печать индексной регистровой пары со смещением ======== -;B - смещение -;DE - адрес в строке -.IndexRegSh: - ld a,b - call ConvHexStr - ld (ix+0),l - ld (ix+1),h - ex de,hl - ld (hl),"(" - inc hl - ld (hl),"I" - inc hl -.IRS1 ld (hl),"X" - inc hl - ld a,"+" ;положительное смещение - ld (hl),a - ld a,b ;смещение - bit 7,b - jr z,$+8 - ld a,"-" ;отрицательное смещение - ld (hl),a - ld a,b ;смещение - neg - inc hl - ex de,hl - ld l,a - ld h,0 - call NumToStr8 - ld a,")" - ld (de),a - ret - - -.String db "00112233 01234567890123456789012" -.Byte db 0 -.TablAdr dw 0 -.StrAdr dw 0 - diff --git a/EQU/DOS_EQU.ASM b/EQU/DOS_EQU.ASM deleted file mode 100644 index 01ccdca..0000000 --- a/EQU/DOS_EQU.ASM +++ /dev/null @@ -1,71 +0,0 @@ - -VERSION EQU #00 -CHDISK EQU #01 -CURDISK EQU #02 -DSKINFO EQU #03 -G_ENTRY EQU #04 - -BOOTDSK EQU #09 -CREATE EQU #0A -CREAT_N EQU #0B -ERASE EQU #0D -DELETE EQU #0E -MOVE EQU #0F -RENAME EQU #10 -OPEN EQU #11 -CLOSE EQU #12 -READ EQU #13 -WRITE EQU #14 -MOVE_FP EQU #15 -ATTRIB EQU #16 -GET_D_T EQU #17 -PUT_D_T EQU #18 -F_FIRST EQU #19 -F_NEXT EQU #1A -MKDIR EQU #1B -RMDIR EQU #1C -CHDIR EQU #1D -CURDIR EQU #1E -SYSTIME EQU #21 -SETTIME EQU #22 - -WAITKEY EQU #30 -SCANKEY EQU #31 -ECHOKEY EQU #32 -CTRLKEY EQU #33 -EDIT EQU #34 -K_CLEAR EQU #35 - -SETWIN EQU #38 -SETWIN1 EQU #39 -SETWIN2 EQU #3A -SETWIN3 EQU #3B -FREEMEM EQU #3C -GETMEM EQU #3D -RETMEM EQU #3E -SETMEM EQU #3F - -EXEC EQU #40 -EXIT EQU #41 -WAIT EQU #42 - -GSWITCH EQU #43 -DOSNAME EQU #44 - -SETVMOD EQU #50 -GETVMOD EQU #51 -LOCATE EQU #52 -CURSOR EQU #53 -SELPAGE EQU #54 -SCROLL EQU #55 -CLEAR EQU #56 -RDCHAR EQU #57 -WRCHAR EQU #58 -WINCOPY EQU #59 -WINREST EQU #5A -PUTCHAR EQU #5B -PCHARS EQU #5C -RES_PRN EQU #5D -CTRLPRN EQU #5E -PRINT EQU #5F - diff --git a/EQU/DSS.INC b/EQU/DSS.INC deleted file mode 100644 index a38db37..0000000 --- a/EQU/DSS.INC +++ /dev/null @@ -1,104 +0,0 @@ - -DSS_VERSION EQU #00 -DSS_CHDISK EQU #01 -DSS_CURDISK EQU #02 -DSS_DSKINFO EQU #03 -;DSS_G_ENTRY EQU #04 -; EQU #05 -; EQU #06 -; EQU #07 -; EQU #08 -DSS_BOOTDSK EQU #09 -;File io -DSS_CREATE EQU #0A -DSS_CREAT_N EQU #0B -; EQU #0C -;DSS_ERASE EQU #0D -DSS_DELETE EQU #0E -;DSS_MOVE EQU #0F -DSS_RENAME EQU #10 -DSS_OPEN EQU #11 -DSS_CLOSE EQU #12 -DSS_READ EQU #13 -DSS_WRITE EQU #14 -DSS_MOVE_FP EQU #15 -DSS_ATTRIB EQU #16 -DSS_GET_D_T EQU #17 -DSS_PUT_D_T EQU #18 -DSS_F_FIRST EQU #19 -DSS_F_NEXT EQU #1A -DSS_MKDIR EQU #1B -DSS_RMDIR EQU #1C -DSS_CHDIR EQU #1D -DSS_CURDIR EQU #1E -; EQU #1F -; EQU #20 -DSS_SYSTIME EQU #21 -DSS_SETTIME EQU #22 -; EQU #23 -; EQU #24 -; EQU #25 -; EQU #26 -; EQU #27 -; EQU #28 -; EQU #29 -; EQU #2A -; EQU #2B -; EQU #2C -; EQU #2D -; EQU #2E -; EQU #2F -;Keyboard -DSS_WAITKEY EQU #30 -DSS_SCANKEY EQU #31 -DSS_ECHOKEY EQU #32 -DSS_CTRLKEY EQU #33 -;DSS_EDIT EQU #34 -DSS_K_CLEAR EQU #35 -DSS_K_SETUP EQU #36 -DSS_TESTKEY EQU #37 -;Memory -DSS_SETWIN EQU #38 -DSS_SETWIN1 EQU #39 -DSS_SETWIN2 EQU #3A -DSS_SETWIN3 EQU #3B -DSS_INFOMEM EQU #3C -DSS_GETMEM EQU #3D -DSS_FREEMEM EQU #3E -DSS_SETMEM EQU #3F -;Execution -DSS_EXEC EQU #40 -DSS_EXIT EQU #41 -DSS_WAIT EQU #42 - -DSS_GSWITCH EQU #43 -DSS_DOSNAME EQU #44 -DSS_EX_PATH EQU #45 -DSS_ENVIRON EQU #46 -DSS_APPINFO EQU #47 -; EQU #48 -; EQU #49 -; EQU #4A -; EQU #4B -; EQU #4C -; EQU #4D -; EQU #4E -; EQU #4F - -DSS_SETVMOD EQU #50 -DSS_GETVMOD EQU #51 -DSS_LOCATE EQU #52 -DSS_CURSOR EQU #53 -DSS_SELPAGE EQU #54 -DSS_SCROLL EQU #55 -DSS_CLEAR EQU #56 -DSS_RDCHAR EQU #57 -DSS_WRCHAR EQU #58 -DSS_WINCOPY EQU #59 -DSS_WINREST EQU #5A -DSS_PUTCHAR EQU #5B -DSS_PCHARS EQU #5C -;DSS_RES_PRN EQU #5D -;DSS_CTRLPRN EQU #5E -DSS_PRINT EQU #5F -; diff --git a/EQU/bios_equ.asm b/EQU/bios_equ.asm index 14595ca..c8fbfa6 100644 --- a/EQU/bios_equ.asm +++ b/EQU/bios_equ.asm @@ -1,6 +1,6 @@ BiosRst EQU #08 -;Функции работы с памятью +;╨д╤Г╨╜╨║╤Ж╨╕╨╕ ╤А╨░╨▒╨╛╤В╤Л ╤Б ╨┐╨░╨╝╤П╤В╤М╤О Bios.Emm_Fn0 EQU #C0 Bios.Emm_Fn1 EQU #C1 Bios.Emm_Fn2 EQU #C2 @@ -13,7 +13,7 @@ Bios.Emm_Fn8 EQU #C8 Bios.Emm_Fn9 EQU #C9 -;Функции управления окнами и режимами экрана +;╨д╤Г╨╜╨║╤Ж╨╕╨╕ ╤Г╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╤П ╨╛╨║╨╜╨░╨╝╨╕ ╨╕ ╤А╨╡╨╢╨╕╨╝╨░╨╝╨╕ ╤Н╨║╤А╨░╨╜╨░ Bios.Win_Open EQU #B0 Bios.Win_Close EQU #B1 Bios.Win_Copy_Win EQU #B2 @@ -26,7 +26,7 @@ Bios.Win_Get_ZG EQU #B8 -;Функции вывода текста на экран +;╨д╤Г╨╜╨║╤Ж╨╕╨╕ ╨▓╤Л╨▓╨╛╨┤╨░ ╤В╨╡╨║╤Б╤В╨░ ╨╜╨░ ╤Н╨║╤А╨░╨╜ Bios.Lp_Print_All EQU #81 Bios.Lp_Print_Sym EQU #82 Bios.Lp_Print_Atr EQU #83 @@ -42,7 +42,7 @@ Bios.Lp_Print_Ln6 EQU #8C Bios.Lp_Cls_Win2 EQU #8D Bios.Lp_Get_Place EQU #8E -;Функции работы с жесткими дисками и дисководами +;╨д╤Г╨╜╨║╤Ж╨╕╨╕ ╤А╨░╨▒╨╛╤В╤Л ╤Б ╨╢╨╡╤Б╤В╨║╨╕╨╝╨╕ ╨┤╨╕╤Б╨║╨░╨╝╨╕ ╨╕ ╨┤╨╕╤Б╨║╨╛╨▓╨╛╨┤╨░╨╝╨╕ Bios.Drv_Reset EQU #51 Bios.Drv_Verify EQU #54 Bios.Drv_Read EQU #55 diff --git a/EQU/dss_equ.asm b/EQU/dss_equ.asm index c245856..f7df412 100644 --- a/EQU/dss_equ.asm +++ b/EQU/dss_equ.asm @@ -1,105 +1,105 @@ -DssRst EQU #10 +DssRst EQU 0x10 -Dss.Version EQU #00 -Dss.ChDisk EQU #01 -Dss.CurDisk EQU #02 -Dss.DskInfo EQU #03 -;Dss.G_ENTRY EQU #04 -; EQU #05 -; EQU #06 -; EQU #07 -; EQU #08 -Dss.BOOTDSK EQU #09 +Dss.Version EQU 0x00 +Dss.ChDisk EQU 0x01 +Dss.CurDisk EQU 0x02 +Dss.DskInfo EQU 0x03 +;Dss.G_ENTRY EQU 0x04 +; EQU 0x05 +; EQU 0x06 +; EQU 0x07 +; EQU 0x08 +Dss.BOOTDSK EQU 0x09 ;File io -Dss.Create EQU #0A -Dss.Creat_N EQU #0B -; EQU #0C -;Dss.ERASE EQU #0D -Dss.Delete EQU #0E -;Dss.Move EQU #0F -Dss.Rename EQU #10 -Dss.Open EQU #11 -Dss.Close EQU #12 -Dss.Read EQU #13 -Dss.Write EQU #14 -Dss.Move_FP EQU #15 -Dss.Attrib EQU #16 -Dss.Get_D_T EQU #17 -Dss.Put_D_T EQU #18 -Dss.F_First EQU #19 -Dss.F_Next EQU #1A -Dss.MkDir EQU #1B -Dss.RmDir EQU #1C -Dss.ChDir EQU #1D -Dss.CurDir EQU #1E -; EQU #1F -; EQU #20 -Dss.SysTime EQU #21 -Dss.SetTime EQU #22 -; EQU #23 -; EQU #24 -; EQU #25 -; EQU #26 -; EQU #27 -; EQU #28 -; EQU #29 -; EQU #2A -; EQU #2B -; EQU #2C -; EQU #2D -; EQU #2E -; EQU #2F +Dss.Create EQU 0x0A +Dss.Creat_N EQU 0x0B +; EQU 0x0C +;Dss.ERASE EQU 0x0D +Dss.Delete EQU 0x0E +;Dss.Move EQU 0x0F +Dss.Rename EQU 0x10 +Dss.Open EQU 0x11 +Dss.Close EQU 0x12 +Dss.Read EQU 0x13 +Dss.Write EQU 0x14 +Dss.Move_FP EQU 0x15 +Dss.Attrib EQU 0x16 +Dss.Get_D_T EQU 0x17 +Dss.Put_D_T EQU 0x18 +Dss.F_First EQU 0x19 +Dss.F_Next EQU 0x1A +Dss.MkDir EQU 0x1B +Dss.RmDir EQU 0x1C +Dss.ChDir EQU 0x1D +Dss.CurDir EQU 0x1E +; EQU 0x1F +; EQU 0x20 +Dss.SysTime EQU 0x21 +Dss.SetTime EQU 0x22 +; EQU 0x23 +; EQU 0x24 +; EQU 0x25 +; EQU 0x26 +; EQU 0x27 +; EQU 0x28 +; EQU 0x29 +; EQU 0x2A +; EQU 0x2B +; EQU 0x2C +; EQU 0x2D +; EQU 0x2E +; EQU 0x2F ;Keyboard -Dss.WaitKey EQU #30 -Dss.ScanKey EQU #31 -Dss.EchoKey EQU #32 -Dss.CTRLKey EQU #33 -;Dss.EDIT EQU #34 -Dss.K_CLEAR EQU #35 -Dss.K_SETUP EQU #36 -Dss.TESTKEY EQU #37 +Dss.WaitKey EQU 0x30 +Dss.ScanKey EQU 0x31 +Dss.EchoKey EQU 0x32 +Dss.CTRLKey EQU 0x33 +;Dss.EDIT EQU 0x34 +Dss.K_CLEAR EQU 0x35 +Dss.K_SETUP EQU 0x36 +Dss.TESTKEY EQU 0x37 ;Memory -Dss.SetWin EQU #38 -Dss.SetWin1 EQU #39 -Dss.SetWin2 EQU #3A -Dss.SetWin3 EQU #3B -Dss.INFOMEM EQU #3C -Dss.GetMem EQU #3D -Dss.FreeMem EQU #3E -Dss.SetMem EQU #3F +Dss.SetWin EQU 0x38 +Dss.SetWin1 EQU 0x39 +Dss.SetWin2 EQU 0x3A +Dss.SetWin3 EQU 0x3B +Dss.INFOMEM EQU 0x3C +Dss.GetMem EQU 0x3D +Dss.FreeMem EQU 0x3E +Dss.SetMem EQU 0x3F ;Execution -Dss.Exec EQU #40 -Dss.Exit EQU #41 -Dss.Wait EQU #42 +Dss.Exec EQU 0x40 +Dss.Exit EQU 0x41 +Dss.Wait EQU 0x42 -Dss.GSwitch EQU #43 -Dss.DosName EQU #44 -Dss.EX_Path EQU #45 -Dss.Environ EQU #46 -Dss.AppInfo EQU #47 -; EQU #48 -; EQU #49 -; EQU #4A -; EQU #4B -; EQU #4C -; EQU #4D -; EQU #4E -; EQU #4F +Dss.GSwitch EQU 0x43 +Dss.DosName EQU 0x44 +Dss.EX_Path EQU 0x45 +Dss.Environ EQU 0x46 +Dss.AppInfo EQU 0x47 +; EQU 0x48 +; EQU 0x49 +; EQU 0x4A +; EQU 0x4B +; EQU 0x4C +; EQU 0x4D +; EQU 0x4E +; EQU 0x4F -Dss.SetVMod EQU #50 -Dss.GetVMod EQU #51 -Dss.Locate EQU #52 -Dss.Cursor EQU #53 -Dss.SelPage EQU #54 -Dss.Scroll EQU #55 -Dss.Clear EQU #56 -Dss.RdChar EQU #57 -Dss.WrChar EQU #58 -Dss.WinCopy EQU #59 -Dss.WinRest EQU #5A -Dss.PutChar EQU #5B -Dss.PChars EQU #5C -;Dss.RES_PRN EQU #5D -;Dss.CTRLPRN EQU #5E -Dss.Print EQU #5F +Dss.SetVMod EQU 0x50 +Dss.GetVMod EQU 0x51 +Dss.Locate EQU 0x52 +Dss.Cursor EQU 0x53 +Dss.SelPage EQU 0x54 +Dss.Scroll EQU 0x55 +Dss.Clear EQU 0x56 +Dss.RdChar EQU 0x57 +Dss.WrChar EQU 0x58 +Dss.WinCopy EQU 0x59 +Dss.WinRest EQU 0x5A +Dss.PutChar EQU 0x5B +Dss.PChars EQU 0x5C +;Dss.RES_PRN EQU 0x5D +;Dss.CTRLPRN EQU 0x5E +Dss.Print EQU 0x5F ; diff --git a/ERROR.ASM b/ERROR.ASM deleted file mode 100644 index 3a45e4e..0000000 --- a/ERROR.ASM +++ /dev/null @@ -1,86 +0,0 @@ -;[]=========================================================================[] -;[] Обработка ошибок монитора-отладчика DemoN [] -;[] v0.10 - последние изменения 27.08.2006 [] -;[] [] -;[] ErDss - определение ошибки DSS по ее коду [] -;[]=========================================================================[] - -;[]=========================================================================[] -;[] Ошибки DSS [] -;[] Вход: A - код ошибки [] -;[] Выход: A - код ошибки [] -;[] HL - строка-описание ошибки [] -;[]=========================================================================[] -PrErDss: - call ErDss - ld c,Dss.PChars ;вывести сообщение об ошибке - rst DssRst - ld hl,Str.DA ;перевод строки - ld c,Dss.PChars - rst DssRst - ret - -ErDss: -.MaxError equ 0x26 - cp .MaxError+1 ;максимальный код ошибки + 1 - jr c,$+4 - ld a,.MaxError - - push af - add a,a - ld hl,.Tabl - ld d,0 - ld e,a - add hl,de - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - pop af - ret - -.e01 db "Invalid function",0 -.e02 db "Invalid drive number",0 -.e03 db "File not found",0 -.e04 db "Path not found",0 -.e05 db "Invalid handle",0 -.e06 db "Too many open files",0 -.e07 db "File already exists",0 -.e08 db "File read only",0 -.e09 db "Root overflow",0 -.e0A db "No free space",0 -.e0B db "Directory not empty",0 -.e0C db "Can't delete current directory",0 -.e0D db "Invalid media",0 -.e0E db "Unknown operation",0 ;(невозм. операция) -.e0F db "Directory exist",0 -.e10 db "Invalid filename",0 -.e11 db "Invalid EXE-file",0 -.e12 db "Not supported EXE-file",0 -.e13 db "Access denied",0 -.e14 db "Not ready",0 -.e15 db "Seek error",0 -.e16 db "Sector not found",0 -.e17 db "CRC error",0 -.e18 db "Write protect",0 -.e19 db "Read error",0 -.e1A db "Write error",0 -.e1B db "Drive failure",0 -.e1C db "Extended error: 28",0 -.e1D db "Extended error: 29",0 -.e1E db "Not enough memory",0 -.e1F db "Invalid memory block",0 -.e20 db "Extended error: 32",0 -.e21 db "Extended error: 33",0 -.e22 db "Extended error: 34",0 -.e23 db "Too many files",0 ;(список файлов) -.e24 db "(слишком большая влож. папок или >= 1024 папок)",0 -.e25 db "User abort",0 ;(операция прервана пользователем) -.e26 db "Unknown error: 38..255",0 ;38 - -.Tabl dw .e01,.e02,.e03,.e04,.e05,.e06,.e07,.e08 - dw .e09,.e0A,.e0B,.e0C,.e0D,.e0E,.e0F,.e10 - dw .e11,.e12,.e13,.e14,.e15,.e16,.e17,.e18 - dw .e19,.e1A,.e1B,.e1C,.e1D,.e1E,.e1F,.e20 - dw .e21,.e22,.e23,.e24,.e25,.e26 - diff --git a/FILE.ASM b/FILE.ASM deleted file mode 100644 index eb4df1e..0000000 --- a/FILE.ASM +++ /dev/null @@ -1,274 +0,0 @@ -;[]=========================================================================[] -;[] Файловые процедуры монитора-отладчика DemoN [] -;[] v0.10 - последние изменения 27.08.2006 [] -;[]=========================================================================[] -LoadFile: - xor a ;выкл часов - ld (ClockOn),a - ld bc,0x0100+Dss.SelPage ;системный экран - rst DssRst - - ld hl,Str.Load ;сообщение о загрузке файла - ld c,Dss.PChars - rst DssRst - - call LoadExe - - ld a,(DemonScreen) - ld b,a - ld c,Dss.SelPage - rst DssRst - ld a,On ;вкл часов - ld (ClockOn),a - ret - -LoadExe: - ld hl,FDebug ;имя файла - ld a,1 ;открыть для чтения - ld c,Dss.Open - rst DssRst - jp c,PrErDss ;выход с ошибкой - - ld (FId),a ;запомнить файловый манипулятор - - ld hl,FDebug ;буфер для загрузки заголовка - ld de,0x7F ;кол-во считываемых байт - ld c,Dss.Read ;чтение - rst DssRst - jp c,PrErDss ;выход с ошибкой - - ld hl,(FDebug) ;заголовок EXE-файла - ld de,0x5845 ;'EX' проверка идентификатора - sbc hl,de - jr nz,.L1 - ld hl,FDebug+3 - ld a,(hl) ;версия EXE-файла - or a - jr nz,.L1 - inc hl - ld e,(hl) ;начало исполняемого кода - inc hl - ld d,(hl) - ld bc,11 ;пропускаем флаг загрузчика и зарезервированные байты - add hl,bc - ld a,(hl) ;мл.байт расположения кода в памяти - ld (FRam),a - inc hl - ld a,(hl) ;ст.байт расположения кода в памяти - ld (FRam+1),a - inc hl - ld a,(hl) ;мл.байт адреса запуска - ld (Reg._PC),a - ld (ListAdr),a ;мл.байт адреса листинга - inc hl - ld a,(hl) ;ст.байт адреса запуска - ld (Reg._PC+1),a - ld (ListAdr+1),a ;ст.байт адреса листинга - inc hl - ld a,(hl) ;мл.байт стека программы - ld (Reg._SP),a - inc hl - ld a,(hl) ;ст.байт стека программы - ld (Reg._SP+1),a - ld a,e - ld (.L2+2),a - ld a,d - ld (.L2+3),a - -.L1 ld hl,0 - ld ix,0 ;смещение в файле - ld bc,2*256+Dss.Move_FP ;относительно конца - rst DssRst - jp c,PrErDss ;выход с ошибкой - - push hl - ld de,(FRam) ;адрес расположения кода - set 6,d - res 7,d ;грузим через 1-е окно - ld hl,0x8000 - or a ;сбросить флаг C - sbc hl,de ;кол-во считываемых байт - ld (.L6+1),hl - ex de,hl - ld (.L6+4),hl - pop hl - call NBank ;определить кол-во банок - jp c,PrErDss ;выход с ошибкой - - ld (MemId+1),a ;кол-во выделяемых страниц - ld b,a - ld c,Dss.GetMem ;выделение памяти - rst DssRst - jp c,PrErDss ;выход с ошибкой - ld (MemId),a ;id блока памяти - - ld a,(FId) ;файловый манипулятор - ld hl,0 -.L2 ld ix,0 ;смещение в файле - ld bc,Dss.Move_FP ;относительно начала - rst DssRst - jp c,PrErDss ;выход с ошибкой - - ld a,(MemId) ;id блока памяти - ld bc,Dss.SetWin1 ;вкл 1-ю банку в 1-е окно - rst DssRst - jp c,PrErDss ;выход с ошибкой - -.L6 ld de,0x3FFF ;кол-во считываемых байт - ld hl,0x4000 ;адрес загрузки кода - ld a,1 ;счетчик банок - ld (MemId+2),a -.L5 ld a,(FId) ;файловый манипулятор - ld c,Dss.Read ;чтение - rst DssRst - jp c,PrErDss ;выход с ошибкой - - ld bc,(MemId+1) - ld a,b - cp c ;загрзили весь файл? - jr z,.L4 ;переход, если да - - inc a - ld (MemId+2),a ;увеличить счетчик банок - ld a,(MemId) ;id блока памяти - ld c,Dss.SetWin1 ;вкл банку в 1-е окно - rst DssRst - jp c,PrErDss ;выход с ошибкой - - ld hl,0x4000 ;адрес в памяти для загрузки - ld de,0x3FFF ;кол-во загружаемых байт - jr .L5 - -.L4 ld a,(FId) ;файловый манипулятор - ld c,Dss.Close ;закрыть файл - rst DssRst - jp c,PrErDss ;выход с ошибкой - - ld a,(MemId) ;id блока памяти - ld bc,Bios.Emm_Fn4 ;вычислить физ номер 1-й банки - rst BiosRst - ret c ;выход с ошибкой - ld (BankP),a - ld a,(MemId+1) ;кол-во выделенных страниц - dec a - jr z,.L7 - - ld a,(MemId) ;id блока памяти - ld bc,1*256+Bios.Emm_Fn4 ;вычислить физ номер 2-й банки - rst BiosRst - ret c ;выход с ошибкой - ld (BankP+1),a - ld a,(MemId+1) ;кол-во выделенных страниц - cp 2 - jr z,.L7 - - ld a,(MemId) ;id блока памяти - ld bc,2*256+Bios.Emm_Fn4 ;вычислить физ номер 3-й банки - rst BiosRst - ret c ;выход с ошибкой - ld (BankP+2),a - ld a,(MemId+1) ;кол-во выделенных страниц - cp 3 - jr z,.L7 - - ld a,(MemId) ;id блока памяти - ld bc,3*256+Bios.Emm_Fn4 ;вычислить физ номер 4-й банки - rst BiosRst - ret c ;выход с ошибкой - ld (BankP+3),a - -.L7 ld hl,WinPage - ld de,BankP - ld a,(MemId+1) ;кол-во выделенных страниц - ld b,a - cp 5 - jr c,$+4 - ld b,4 ;подключаем не более 4 банок - ld a,(FRam+1) ;ст.адрес расположения кода - and 0xC0 ;окно с расположением кода - or a ;0-е окно - jr nz,.L8 - ld c,a - ld a,(de) - ld (hl),a ;подключить банку программы - dec b - ret z ;выход, если больше нет банок - - ld a,c - inc de -.L8 inc hl - cp 0x40 ;1-е окно - jr nz,.L9 - ld c,a - ld a,(de) - ld (hl),a ;подключить банку программы - dec b - ret z ;выход, если больше нет банок - - ld a,c - inc de -.L9 inc hl - cp 0x80 ;2-е окно - jr nz,.L10 - ld c,a - ld a,(de) - ld (hl),a ;подключить банку программы - dec b - ret z ;выход, если больше нет банок - - ld a,c - inc de -.L10 inc hl ;иначе 3-е окно - ld a,(de) - ld (hl),a ;подключить банку программы - - ret - -;[]=========================================================================[] -;[] Вычисление необходимого кол-ва банок для загрузки файла в память [] -;[] Вход: HL:IX - длина файла в байтах [] -;[] DE - кол-во байт для загрузки в 1-ю банку [] -;[] Выход: A - кол-во необходимых банок [] -;[] флаг C - ошибка, код ошибки в A [] -;[]=========================================================================[] -NBank: - push ix - ld b,h - ld c,l - pop hl - inc bc - xor a - inc a - sbc hl,de - jr nc,$+4 - jr .L5 - ld de,16384 ;размер банки - push af -.L2 pop af -.L1 inc a - jr z,.L3 - sbc hl,de - jr nc,.L1 -.L5 dec bc - push af - ld a,b - or c - jr nz,.L2 - pop af - or a ;сбросить флаг C - ret - -.L3 ld a,0x1E ;"Недостаточно памяти" -; JP ErrorDSS - ret - -BankP ds 4 ;номера банок загружаемой проги -MemId ds 3 ;id-блока памяти под файл, - ;кол-во выделенных банок, - ;счетчик загруженных банок -FId db 0 ;файловый манипулятор -FDebug ds 128 - db 0 -FStart dw 0x4200 -FRam dw 0 ;адрес расположения кода в памяти - diff --git a/KDUMP.ASM b/KDUMP.ASM deleted file mode 100644 index fa6be95..0000000 --- a/KDUMP.ASM +++ /dev/null @@ -1,246 +0,0 @@ -;[]=========================================================================[] -;[] Обработка клавиатуры в окне дампа [] -;[] v0.10 - последние изменения 31.03.2006 [] -;[]=========================================================================[] -KDump: - ld a,b ;состояние - and 11110000b - jr z,.L100 - - ;Обработка комбинации Ctrl + символ -.L10 cp 00100000b ; - jp nz,.L100 - ld a,d ;позиционный код - - cp 0x80+0x51 ;++ - jr nz,.L101 - ld a,(.Descript+2) ;кол-во колонок - cp e - ld a,e - jr nz,$+3 - xor a - inc a - ld (.Coordinate),a ;текущая колонка - jp Keyb-3 - -.L101 cp 0x54 ; - jr nz,.L102 - ld a,e ;текущая колонка - cp 1 - jr nz,$+6 - ld a,(.Descript+2) ;кол-во колонок - inc a - dec a - ld (.Coordinate),a ;текущая колонка - jp Keyb-3 - -.L102 ld hl,(.Descript) - cp 0x52 ; - jr nz,.L103 - ld a,d ;текущая строка - cp l - jr nz,.L104 - ld hl,(Dump1) - ld bc,16 - add hl,bc - ld (Dump1),hl - jp Keyb-11 -.L104 inc a - ld (.Coordinate+1),a - jp Keyb-3 - -.L103 cp 0x58 ; - jr nz,.L105 - ld a,d ;текущая строка - cp h - jr nz,.L107 - ld hl,(Dump1) - ld bc,16 - or a - sbc hl,bc - ld (Dump1),hl - jp Keyb-11 -.L107 dec a - ld (.Coordinate+1),a - jp Keyb-3 - -.L105 cp 0x53 ; - jr nz,.L108 - ld a,d ;текущая строка - cp l - jr nz,.L106 - ld hl,(Dump1) - ld bc,16*7 - add hl,bc - ld (Dump1),hl - jp Keyb-11 -.L106 ld a,l ;на последнюю строку - ld (.Coordinate+1),a - jp Keyb-3 - -.L108 cp 0x59 ; - jr nz,.L110 - ld a,d ;текущая строка - cp h - jr nz,.L109 - ld hl,(Dump1) - ld bc,16*7 - or a - sbc hl,bc - ld (Dump1),hl - jp Keyb-11 - jr nz,.L109 -.L109 ld a,h ;на первую строку - ld (.Coordinate+1),a - jp Keyb-3 - -.L110 cp 0x57 ; - jr nz,.L111 - ld a,1 - ld (.Coordinate),a ;первая колонка - jp Keyb-3 - -.L111 cp 0x51 ; - jr nz,.L200 - ld a,(.Descript+2) - ld (.Coordinate),a ;первая колонка - jp Keyb-3 - - ;Обработка ASCII кодов -.L200 ld a,0 ;ASCII код - cp 0x0D ; - jp nz,Keyb+6 -.L201 ld b,0 ;длина строки ввода - ld hl,0 ;координаты строки ввода - - ld a,b - dec a - jr z,.L202 - dec a - jr z,.L203 - - call InputLine ;ввод адреса - jp c,Keyb-3 ;завершение ввода по - call PutAdres - jp c,.L201 ;ошибка в веденных данных - ld de,16 ;кол-во байт в строке - ld a,(.Coordinate+1) ;номер строки - sub 0x16 ;координата первой строки - jr z,$+8 - ld b,a - or a - sbc hl,de - djnz $-3 - ld (Dump1),hl - jp Keyb-11 - -.L202 call InputLineEd ;ввод символа - jp c,Keyb-3 ;завершение ввода по - call .L299 - ld a,c - sub 18 ;первая колонка в поле данных - ld c,a - ld a,(InputLine.Buffer) - ld de,256*18+34 ;1-я и последняя+1 колонки - jr .L204 - -.L203 call InputLineEd ;ввод кода символа - jp c,Keyb-3 ;завершение ввода по - call PutCode - jp c,.L201 ;ошибка в веденных данных - call .L299 - ld a,c - sub 2 ;первая колонка в поле данных - ld c,a - ld a,(PutCode.Buffer) ;записываемый байт - ld de,256*2+18 ;1-я и последняя+1 колонки -.L204 add hl,bc - call Ld_hl_a - ld a,(InputLine.EntEnd) ;ввод закончен ENTER - or a - jp nz,Keyb-11 ;да - ld hl,.Coordinate ;текущие координаты курсора - inc (hl) - ld a,e ;первая колонка данных - cp (hl) - jr nz,.L205 - ld a,d - ld (hl),a ;в начало строки кода - inc hl - ld a,0x1D ;последняя строка дампа - cp (hl) - jr nz,.L205-1 - ld hl,(Dump1) ;сдвинуть дамп - ld bc,16 - add hl,bc - ld (Dump1),hl - jr .L205 - inc (hl) -.L205 call CursorRes ;выкл курсор - call Refresh ;обновление экрана - call Cursor ;вкл курсор - call CursorSet - jp .L201 - -.L299 ld de,16 ;кол-во байт в строке - ld hl,(Dump1) ;адрес в первой строке - ld bc,(.Coordinate) - ld a,b - sub 0x16 ;координата первой строки - ld b,a - ret z - add hl,de - djnz $-1 - ret - -.Coordinate dw 0x1601 ;курсор (стр/кол курсора) -.Descript: - dw 0x161D ;первая/последняя строка окна - db 33 ;кол-во колонок - - db 0x0E ;N столбца колонки - db 5 ;ширина колонки - db 0x15,2,0x17,2 - db 0x1A,2,0x1C,2 - db 0x1F,2,0x21,2 - db 0x24,2,0x26,2 - db 0x29,2,0x2B,2 - db 0x2E,2,0x30,2 - db 0x33,2,0x35,2 - db 0x38,2,0x3A,2 - db 0x3E,1,0x3F,1,0x40,1,0x41,1 - db 0x42,1,0x43,1,0x44,1,0x45,1 - db 0x46,1,0x47,1,0x48,1,0x49,1 - db 0x4A,1,0x4B,1,0x4C,1,0x4D,1 - diff --git a/KEYB.ASM b/KEYB.ASM deleted file mode 100644 index 56c2a6d..0000000 --- a/KEYB.ASM +++ /dev/null @@ -1,1202 +0,0 @@ -;[]=========================================================================[] -;[] Обработка клавиатуры [] -;[] v0.01 - последние изменения 10.10.2004 [] -;[] v0.02 - последние изменения 27.03.2005 [] -;[] v0.03 - последние изменения 11.03.2006 [] -;[] v0.10 - последние изменения 14.05.2006 [] -;[]=========================================================================[] - call CursorRes ;выкл курсор - call Refresh ;обновление экрана - jr Keyb - call CursorRes ;выкл курсор -Keyb: - call Cursor ;вкл курсор - call CursorSet - ld c,Dss.ScanKey ;состояние клавиатуры - rst DssRst - jr z,Keyb+6 - ld a,b ;состояние - and 11110000b - jr z,.L100 - - ;Обработка комбинации Shift + символ - and 11000000b ; - or a - jr z,.L1 - ld a,d - cp 0x80+0x0F ;Shift+Tab - jr nz,Keyb+6 - ld hl,Keyb.WinScreen - ld a,(hl) - dec a - jr nz,$+4 - ld a,4 - ld (hl),a ;номер окна дампа - jr Keyb-3 - - ;Обработка комбинации Alt + символ -.L1 ld a,b - and 11110000b - cp 00010000b ; - jr nz,.L10 - ld a,d ;позиционный код - cp 0x80+0x2B ;+ - jr nz,.L10 - ret z ;выход - - ;Обработка комбинации Ctrl + символ -.L10 cp 00100000b ; - jp nz,.L0 - ld a,d ;позиционный код - - cp 0x80+0x12 ;+ (dEc/hEx) - jr nz,.L11 - ld a,(DecHex) - cpl - ld (DecHex),a - jr Keyb-11 - -.L11 cp 0x80+0x13 ;+ резидент - jr nz,.L12 - call CursorRes - ld b,5 ;длина строки ввода - ld hl,0x1413 - push hl - push bc - call CursorSet - pop bc - pop hl - call InputLine - jp c,Keyb-3 - call PutAdres - jp c,Keyb-3 - call KReg.Rez ;новый адрес резидента - jr Keyb-11 - -.L12 cp 0x80+0x2A ;+ - jp z,.L202-2 ;выполнение команды - - cp 0x80+0x2C ;+ - jp z,.L200+5 ;выполнение команды - - cp 0x80+0x2D ;+ - jp z,.L203+4 ;пропуск команды - -; cp 0x80+0x48 ; -; call z,ScreenS ;сохранение экрана в файл - -.L13 ;... - jp .L0 - - ;Обработка ASCII кодов -.L100 ld a,e - cp 0x1B ; - вкл.системного экрана - jr nz,.L200 - xor a ;выкл часов - ld (ClockOn),a - ld a,(OSScreen) - ld b,a - push bc - ld a,(OSGrafMode) - ld c,Dss.SetVMod ;системный экран - rst DssRst - pop bc - ld a,(DemonScreen) - cp b - jr nz,.NoRest - ld de,0 ;Если экраны ОС и Демона совпадают - - ld hl,#2050 ;восстанавливаем скрин - ld a,(BufPage) - ld b,a - ld c,Dss.WinRest - ld ix,#c000 - rst DssRst -.NoRest ld c,Dss.WaitKey - rst DssRst ;ждем Any Key - ld a,(DemonScreen) - ld b,a - ld a,3 - ld c,Dss.SetVMod - push bc - rst DssRst - pop bc - ld a,(OSScreen) - cp b - call z,RefreshScreen ;Если экраны совпадают - перерисовываем - ld a,On ;вкл часов - ld (ClockOn),a - jp Keyb+6 - - ;Обработка позиционного кода -.L200 ld a,d - cp 0x3b ; - jr nz,.L208 - call DemonHelp -; ld c,Dss.WaitKey -; rst DssRst ;ждем Any Key - -.NoExit call RefreshScreen - jp Keyb+6 -.L208 cp 0x3d - jr nz,.L207 - call LoadBinDialog - jr .NoExit -.L207 - cp 0x42 ; - jr nz,.L201 - ld a,Off ;флаг пропуска подпрограмм - jr .L202 - -.L201 cp 0x41 ; - jr nz,.L203 - ld a,On ;флаг трассировки подпрограмм -.L202 ld (Step.Flag),a - ld hl,PrintStrSP.StrSp - ld a,(hl) ;строка вершины стека - inc a - jr nz,$+5 - ld a,6 ;вернуть вершину стека - ld (hl),a - call Step - jp Keyb-11 - -.L203 cp 0x43 ; - jr nz,.L204 - ld hl,(Reg._PC) - call List ;следующая команда - ld (Reg._PC),hl ;новый PC - push hl - ld a,(KList.Descript) ;количество строк листинга - call AdrListTabl ;нижний адрес листинга - ld de,(ListAdr) ;верхний адрес листинга - pop bc ;новый PC - call AdrArea - jp nc,Keyb-11 - ld (ListAdr),bc ;новая страница листинга - jp Keyb-11 - -.L204 cp 0x0F ; - jr nz,.L205 - ld hl,Keyb.WinScreen - ld a,(hl) - inc a - cp 5 - jr nz,$+4 - ld a,1 - ld (hl),a ;номер окна дампа - jp Keyb-3 - -.L205 cp 0x48 ; - jr nz,.L206 - call SaveScr ;сохранение экрана в файл - jp Keyb+6 - -.L206 cp 0x44 ; - jr nz,.L0 - ;выход - ld ix,ExitDlg - call DialogWindow - ret - call ClearScreen -.L0 ld a,(.WinScreen) ;активное окно - dec a - jp z,KList - dec a - jp z,KDump - dec a - jp z,KReg - jp KStack - -.WinScreen db 1 ;номер активного окна - ;1 - окно листинга - ;2 - окно дампа - ;3 - окно регистров - ;4 - окно стека - - ;Прорисовка курсора -Cursor: - ld a,(Keyb.WinScreen) ;активное окно - dec a - jr z,.L1 - dec a - jr z,.L2 - dec a - jr z,.L3 - ;Окно дампа стека - ld de,(KStack.Coordinate) ;расчет курсора - ld hl,KStack.Descript+2 - ld b,e - inc hl - inc hl - djnz $-2 - ld a,(hl) ;длина курсора - ld (KStack.L201+1),a - ld b,a - dec hl - ld e,(hl) ;X-координата курсора - ex de,hl - ld (KStack.L201+3),hl - ret - ;Окно листинга -.L1 ld de,(KList.Coordinate) ;расчет курсора - ld hl,KList.Descript+2 - ld b,e - inc hl - inc hl - djnz $-2 - ld a,(hl) ;длина курсора - ld (KList.L201+1),a - ld b,a - dec hl - ld e,(hl) ;X-координата курсора - ex de,hl - ld (KList.L201+3),hl - ret - ;Окно дампа -.L2 ld de,(KDump.Coordinate) ;расчет курсора - ld hl,KDump.Descript+2 - ld b,e - inc hl - inc hl - djnz $-2 - ld a,(hl) ;длина курсора - ld (KDump.L201+1),a - ld b,a - dec hl - ld e,(hl) ;X-координата курсора - ex de,hl - ld (KDump.L201+3),hl - ret - ;Окно регистров -.L3 call KReg.DescCalc - ld d,b - ld b,e ;колонока в строке - inc hl - inc hl - djnz $-2 - ld a,(hl) ;длина курсора - ld (KReg.L201+1),a - ld b,a - dec hl - ld e,(hl) ;X-координата курсора - ex de,hl - ld (KReg.L201+3),hl - ret - - ;Обработка клавиш в окне листинга -KList: - ld a,b ;состояние - and 11110000b - jr z,.L100 - - ;Обработка комбинации Alt + символ - cp 00010000b ; - jr nz,.L10 - jp Keyb+6 - - ;Обработка комбинации Ctrl + символ -.L10 cp 00100000b ; - jp nz,Keyb+6 - - ld a,d ;позиционный код - cp 0x80+0x2B ;+ - jp nz,.L20 - - call AdrListTabl-3 ;выборка адреса листинга по N строки - ld (Reg._PC),hl - jp .NewLA1+3 - -.L20 ld a,b - cp 00100010b ;правый - jr nz,.L21 - ld bc,.CtrlTabl - call AdrCtrlTabl ;выборка строки в таблице - jp nc,Keyb+6 ;не цифровые клавиши - - ld a,(.Coordinate+1) - ld (bc),a ;номер строки листинга - inc bc - call AdrListTabl ;выборка адреса листинга по N строки - ld a,l - ld (bc),a - inc bc - ld a,h - ld (bc),a - jp Keyb+6 - -.L21 cp 00101000b ;левый - jp nz,Keyb+6 - - ld a,d ;позиционный код - cp 0x80+0x00 ;Ctrl+"`" - jp nz,.L22 - - ld a,(.CtrlWin) - ld h,a - ld l,0 - add a,0x40 ;следующее окно - ld (.CtrlWin),a - ld a,(.Descript+1) - ld (.Coordinate+1),a - jp .NewLA1 - -.L22 ld bc,.CtrlTabl - call AdrCtrlTabl ;выборка строки в таблице - jp nc,Keyb+6 - - ld a,(bc) ;номер строки листинга - or a - jp z,Keyb+6 ;нет данных - - inc bc - ld a,(bc) - ld l,a - inc bc - ld a,(bc) - ld h,a ;адрес из буфера - jp .NewLA - - ;Обработка позиционного кода -.L100 ld a,e ;ASCII код - ld (.L200+1),a - ld a,d ;позиционный код - - ld de,(.Coordinate) ;текущие координаты курсора - cp 0x56 ; - jr nz,.L101 - ld a,(.Descript+2) ;кол-во колонок - cp e - ld a,e - jr nz,$+3 - xor a - inc a - ld (.Coordinate),a ;текущая колонка - jp Keyb-3 - -.L101 cp 0x54 ; - jr nz,.L102 - ld a,e ;текущая колонка - cp 1 - jr nz,$+6 - ld a,(.Descript+2) ;кол-во колонок - inc a - dec a - ld (.Coordinate),a ;текущая колонка - jp Keyb-3 - -.L102 ld hl,(.Descript) - cp 0x52 ; - jr nz,.L103 - ld a,d ;текущая строка - cp l - jr nz,.L104 - ld hl,(ListAdr+2) ;адрес следующей строки - jp .NewLA1 -.L104 inc a - ld (.Coordinate+1),a - jp Keyb-3 - -.L103 cp 0x58 ; - jr nz,.L105 - ld a,d ;текущая строка - cp h - jr nz,.L107 - ld hl,(ListAdr) ;адрес верхней строки листинга - call UpAdres ;предыдущий адрес - jp .NewLA1 -.L107 dec a - ld (.Coordinate+1),a - jp Keyb-3 - -.L105 cp 0x53 ; - jr nz,.L108 - ld a,d ;текущая строка - cp l - jr nz,.L106 - call AdrListTabl - jp .NewLA1 -.L106 ld a,l ;на последнюю строку - ld (.Coordinate+1),a - jp Keyb-3 - -.L108 cp 0x59 ; - jr nz,.L110 - ld a,d ;текущая строка - cp h - jr nz,.L109 - dec l ;кол-во строк - 1 - ld b,l - ld hl,(ListAdr) ;адрес первой строки - push bc - call UpAdres ;предыдущий адрес - pop bc - djnz $-5 - jp .NewLA1 -.L109 ld a,h ;на первую строку - ld (.Coordinate+1),a - jp Keyb-3 - -.L110 cp 0x57 ; - jr nz,.L111 - ld a,1 - ld (.Coordinate),a ;первая колонка - jp Keyb-3 - -.L111 cp 0x51 ; - jr nz,.L200 - ld a,(.Descript+2) ;последняя колонка - ld (.Coordinate),a ;первая колонка - jp Keyb-3 - - ;Обработка ASCII кодов -.L200 ld a,0 - cp 0x0D ; - jp nz,.NewPCAdr ;Keyb+6 -.L201 ld b,0 ;длина строки ввода - ld hl,0 ;координаты строки ввода - ld a,(.Coordinate) - dec a ;колонка адреса - jr z,.InAdres - dec a ;колонка метки - jr z,$+5 - dec a ;колонка кода команды - jr z,.InCode - call InputLine - jp Keyb-3 -.NewPCAdr cp "z" ; - jp nz,Keyb+6 - call AdrListTabl-3 ;Установить новый PC - ld (Reg._PC),HL - jp Keyb-11 -.InCode call InputLine ;ввод кода в 3 колонке - jp c,Keyb-3 ;завершение ввода по - call PutCode - jr c,.L201 ;ошибка в веденных данных - call AdrListTabl-3 ;адрес текущей строки - ld de,PutCode.Buffer - ld a,(de) ;запись кода в память - call Ld_hl_a - inc de - inc hl - djnz $-6 - jr .NewLA1+3 - -.InAdres call InputLine ;ввод адреса в 1 колонке - jp c,Keyb-3 ;завершение ввода по - call PutAdres - jr c,.L201 ;ошибка в веденных данных - -.NewLA ld a,(.Coordinate+1) - dec a - jr z,.NewLA1 - ld b,a - push bc - call UpAdres ;предыдущий адрес - pop bc - djnz $-5 -.NewLA1 ld (ListAdr),hl - jp Keyb-11 - -.CtrlWin db 0 ;окно для Ctrl+"`" -.CtrlTabl ds 30 ;буффер для адр быстр перехода -.Coordinate dw 0x0201 ;курсор (стр/кол курсора) -.Descript: - dw 0x0114 ;первая/последняя строка окна - db 4 ;кол-во колонок - - db 0x1A ;N столбца колонки - db 5 ;ширина колонки - db 0x20 - db 14 - db 0x2F - db 8 - db 0x38 - db 22 - -;[]=========================================================================[] -;[] Выборка адреса листинга из таблицы [] -;[] Выход: HL - адрес листинга в текущей строке [] -;[]=========================================================================[] - ld a,(KList.Coordinate+1) ;номер текущей строки листинга -AdrListTabl: - dec a - add a,a ;*2 - ld e,a - ld d,0 - ld hl,ListAdr ;таблица адресов листинга - add hl,de ;строка в таблице - ld a,(hl) - inc hl - ld h,(hl) - ld l,a ;адрес строки листинга - ret - -;[]=========================================================================[] -;[] Выборка адреса цифровых клавиш из таблицы [] -;[] Вход: D - позиционный код цифровой клавиши [] -;[] BC - адрес начала таблицы [] -;[] Выход: BC - адрес в таблице [] -;[] Флаг NC - нажата не цифровая клавиша [] -;[]=========================================================================[] -AdrCtrlTabl: - ld a,d - and 01111111b ;сброс старшего бита - dec a - dec a - cp 0x0A ;проверка цифровых клавиш верхнего ряда - ret nc - or a - scf - ret z ;выход, если "0" - inc bc - inc bc - inc bc - dec a - jr nz,$-4 - ret - -;[]=========================================================================[] -;[] Получение кода из строки ввода [] -;[] Вход: C - длина строки ввода [] -;[] Выход: .Buffer - захваченные байты [] -;[] B - количество захваченных байт [] -;[] флаг C - ошибка [] -;[]=========================================================================[] -PutCode: - ld de,InputLine.Buffer - ld hl,.Buffer - ld a,c - dec a - ret c ;нулевая строка - inc a - srl a - ld b,a - jr z,.L3 ;обработка одного символа - ld c,a - ld a,0xC9 ;RET - jr nc,$+3 - xor a ;NOP - ld (.L3-1),a - -.L2 push hl - ld hl,0 - ld a,2 - call PutHex - ld a,l - pop hl - ret c ;выход с ошибкой - ld (hl),a - inc hl - dec c - jr nz,.L2 - or a - ret - -.L3 inc b - push hl - ld hl,0 - ld a,1 - call PutHex - ld a,l - pop hl - ret c ;выход с ошибкой - ld (hl),a - or a - ret - -.Buffer ds 4 - -;[]=========================================================================[] -;[] Получение адреса из строки ввода [] -;[] Вход: C - длина строки ввода [] -;[] Выход: HL - число [] -;[] флаг C - ошибка [] -;[]=========================================================================[] -PutAdres: - ld a,c - dec a - ret c ;нулевая строка - ld de,InputLine.Buffer - ld hl,0 - ld a,(de) - call CapsLetter - cp "X" ;hex-число - jr z,$+4 - cp "#" ;hex-число - ld a,c - jr nz,PutDec - inc de - inc de - dec a - dec a - ret c - inc a - -PutHex exa - ld a,(de) - call Numeric ;цифра? - jr c,.L1 - call CapsLetter ;лат.буквы в верхний регистр - cp "F"+1 - ccf - ret c ;выход с ошибкой - cp "A" - ret c ;выход с ошибкой - sub 0x07 -.L1 sub 0x30 - add hl,hl ;*16 - add hl,hl - add hl,hl - add hl,hl - or l - ld l,a - inc de - inc de - exa - dec a - jr nz,PutHex - or a ;сброс флага C - ret - -PutDec exa - ld a,(de) - call Numeric ;цифра? - ccf - ret c ;выход если нет - ld c,l - ld b,h - add hl,hl ;*10 - add hl,hl - add hl,bc - add hl,hl - ld b,0 - sub 0x30 - ld c,a - add hl,bc - inc de - inc de - exa - dec a - jr nz,PutDec - or a ;сброс флага C - ret - -;[]=========================================================================[] -;[] Проверка кода символа на принадлежность к цифрам (коды 0x30...0x39) [] -;[] Вход: A - код символа [] -;[] Выход: флаг C - цифра; Флаг NC - не цифра [] -;[]=========================================================================[] -Numeric cp "0" - ccf - ret nc - cp 3Ah - ret - -;[]=========================================================================[] -;[] Перевод символов латинского алфавита a...z в верхний регистр [] -;[] Вход: A - код символа [] -;[] Выход: A - код символа в верхнем регистре [] -;[]=========================================================================[] -CapsLetter cp "a" ;<"a" - ret c - cp "z"+1 ;>"z" - ret nc - and 11011111b ;преобразование символа - ret - -InputLine1 push hl - push bc - call CursorSet - pop bc - pop hl - jr InputLine - -;[]=========================================================================[] -;[] Ввод строки символов с клавиатуры [] -;[] Вход: B - длина строки ввода [] -;[] HL - координаты курсора [] -;[] Выход: флаг C - флаг NC - [] -;[] C - длина введенной строки, если [] -;[]=========================================================================[] -InputLineEd: - ld a,(Color.InLineEd) ;цвет строки ввода - ld c,a - xor a - jr InputLine+6 -InputLine: - ld a,(Color.InLine) ;цвет строки ввода - ld c,a - ld a,On - ld (.EntEnd),a - ld a,0xC3 ;код JP - ld (.L15),a - ld (CursPos),hl - ld (.Coordinate),hl - ld hl,.Pos - xor a ;текущая позиция - ld (hl),a - inc hl - ld (hl),c ;цвет - inc hl - ld (hl),b ;длина строки редактирования - inc hl ;начало буфера редактирования - ld de,CursorSet.Buffer ;буфер строки под курсором - ;ld c,a ;окраска строки редактирования -.L1 ld a,(de) - ld (hl),a - inc hl - inc de - ld (hl),c - inc hl - inc de - djnz .L1 - - call .PrintInLine ;напечатать строку - ld a,(.EntEnd) - or a - call nz,.EndString ;курсор в конец строки - -.L100 ld a,On ;включить програм курсор - ld (CursOnOff),a - ld hl,.L100 - push hl ;адрес возврата - ld c,Dss.ScanKey ;состояние клавиатуры - rst DssRst - jr z,$-3 - - cp 0x20 ;есть ASCII-код - jr c,.L3 - - push af - ld a,(.Pos) - exa - ld hl,.Color ;текущий цвет строки ввода - ld a,(Color.InLine) - cp (hl) - call z,.ClearInLine - call z,.HomeString - call .NextPos ;на выходе в HL адрес .Pos - jr z,.L12 - ld a,(CursInsOvr) ;режим Ins/Ovr - or a - jr nz,.L12 ;переход если Ovr - ld a,(.Len) - ld e,a - dec a ;длина строки - 1 - add a,a - ld b,0 - ld c,a - ld d,(hl) ;позиция печати символа - ld hl,.Buffer - add hl,bc ;конец буфера - inc hl - ld a,e - sub d ;кол-во сдвигаемых символов - add a,a - ld c,a - ld d,h - ld e,l - dec hl - dec hl - lddr ;раздвижка строки -.L12 exa - add a,a - ld b,0 - ld c,a - ld hl,.Buffer - add hl,bc ;адрес в буфере - pop af - ld (hl),a ;символ в буфер - call ResCurs -.L15 jp .PrintInLine - jr .L14 - -.L3 cp 0x1B ; - jr nz,.L13 - call ResCurs - pop hl ;востановить стек - scf - ret - -.L13 cp 0x0D ; - jr nz,.L2 - ld a,On - ld (.EntEnd),a - call ResCurs -.L14 pop hl ;востановить стек - call .EndPos ;длина введенной строки - ret - -.L2 ld a,d - cp 0x4F ; - jr nz,.L9 - call ResCurs - ld hl,.Color ;текущий цвет строки ввода - ld a,(Color.InLine) - cp (hl) - call z,.ClearInLine -.L11 ld hl,.Pos - ld a,(hl) ;позиция курсора - add a,a - ld e,a - inc hl - inc hl - ld a,(hl) ;длина строки - dec a - add a,a - sub e ;проверка конца строки - ld c,a - ld b,0 - ld d,b - inc hl ;начало буфера - add hl,de ;адрес курсора - push hl - pop de - inc hl - inc hl - jr z,$+4 ;если в конце строки - ldir - ld a," " - ld (de),a ;последний символ - jp .PrintInLine - -.L9 cp 0x0E ; - jr nz,.L10 - call ResCurs - call .ColorInLine ;сменить цвет строки - ld hl,.Pos - ld a,(hl) ;позиция курсора - or a - jp z,.PrintInLine ;если в начале строки - dec (hl) ;уменьшить позицию - ld hl,CursPos - dec (hl) ;курсор влево - jr .L11 - -.L10 cp 0x50 ; - jr nz,.L5 - ld a,(CursInsOvr) - cpl - ld (CursInsOvr),a - ret - -.L5 cp 0x56 ; - jr nz,.L6 - call ResCurs - call .ColorInLine ;сменить цвет строки - call z,.PrintInLine - call .EndPos - ret z - ld a,(.Pos) - cp c - ret nc - jp .NextPos - -.L6 cp 0x54 ; - jr nz,.L7 - call ResCurs - call .ColorInLine ;сменить цвет строки - call z,.PrintInLine - ld hl,.Pos ;позиция курсора - ld a,(hl) - or a - ret z - dec (hl) - ld hl,CursPos ;координаты програм курсора - dec (hl) - ret - -.L7 cp 0x57 ; - jr nz,.L8 - call ResCurs - call .ColorInLine ;сменить цвет строки - call z,.PrintInLine -.HomeString ld hl,.Pos ;позиция курсора - ld a,(hl) - or a - ret z - ld a,(.Coordinate) ;координаты начала строки - ld (CursPos),a - xor a - ld (hl),a ;обнулить позицию печати - ret - -.L8 cp 0x51 ; - ret nz - call ResCurs - call .ColorInLine ;сменить цвет строки - call z,.PrintInLine -.EndString call .EndPos - ret z - ld a,(.Len) -; dec a ;длина строки ввода - 1 - sub c ;заполнена полностью? - jr nz,$+3 - dec c - ld hl,.Pos - ld (hl),c ;позиция в конце строки - ld a,(.Coordinate) - add a,c - ld (CursPos),a ;новая позиция програм курсора - ret - -.PrintInLine ld ix,.Buffer ;буфер строки - ld a,(.Len) - ld l,a - ld h,1 ;размеры буфера - ld de,(.Coordinate) ;координаты в экране - ifdef D_PRINTCH_BIOS - xor a - ld c,Bios.Win_Restore_Win ;вывод буфера на экран - di - rst BiosRst - ei - else - ld a,(BankDebug) - ld b,a - ld c,Dss.WinRest - rst DssRst - endif - ret - -.ClearInLine ld hl,.Len ;очистка строки ввода - ld b,(hl) ;длина строки ввода - ld a," " ;пробел - inc hl ;начало буфера строки - ld (hl),a - inc hl - djnz $-3 - xor a ;позиция печати - ld (.Pos),a - exa - ld a,(.Coordinate) - ld (CursPos),a - jr $+10 - -.ColorInLine ld hl,.Color ;окраска в основной цвет - ld a,(Color.InLine) - cp (hl) - ret nz - ld a,(Color.InLineEd) ;цвет строки ввода - ld (.Color),a - ld hl,.Len ;длина строки ввода - ld b,(hl) - inc hl - inc hl - ld (hl),a - inc hl - djnz $-3 - ret - -.EndPos ld hl,.Buffer ;поиск позиции послед. символа - ld a,(.Len) - ld c,a - dec a - add a,a - ld e,a - ld d,0 - add hl,de - ld a,(hl) - dec hl - dec hl - cp " " ;ищем конец строки - ret nz - dec c - jr nz,$-7 - ret - -.NextPos ld hl,.Pos ;расчет следующей позиции - ld a,(.Len) - dec a - cp (hl) - jr nz,.L16 - ld a,(.EntEnd) ;заканчивать по ENTER - inc a - ret z ;последняя позиция в строке - ld a,0xCD ;код CALL - ld (.L15),a - ret -.L16 inc (hl) ;увеличение позиции - ld a,(CursPos) ;координаты програм курсора - inc a - ld (CursPos),a - ret -;[]=========================================================================[] -;[] Копирование из буфера строки ввода [] -;[]=========================================================================[] -;Вход: -;DE - адрес назначения -;C - длина строки - -.FromBuffer ld hl,.Buffer - ld b,0 -.FB1 ld a,(hl) - ld (de),a - inc hl - inc hl - inc de - dec c - jr nz,.FB1 - ret -;[]=========================================================================[] -;[] Копирование в буфер строки ввода [] -;[]=========================================================================[] -;Вход: -;HL - адрес строки -;C - длина строки - -.ToBuffer ld de,.Buffer -.TB1 ld a,(hl) - ld (de),a - inc de - inc de - inc hl - dec c - jr nz,.TB1 - ret -.EntEnd db On ;флаг окончания строки ENTER -.Coordinate dw 0 ;начало строки в экране -;последовательность переменных не изменять! -.Pos db 0 ;позиция курсора в строке -.Color db 0 ;цвет строки ввода -.Len db 0 ;длина строки ввода -.Buffer ds 22*2 ;буфер строки ввода - -;[]=========================================================================[] -;[] Программное создние мигающего курсора [] -;[]=========================================================================[] - -;======== Подготовка дополнительного знакогенератора ======== -PreparChar: - ld de,OrgAdr-0x100 ;буфер для 2kB знакогенератора - ld c,Bios.Win_Get_ZG ;получить сист. знакогенератор - rst BiosRst - ld hl,OrgAdr-0x100+7*256 - ld bc,0x00FF - ld (hl),c - inc hl - djnz $-2 - - ld de,OrgAdr-0x100 ;уст.знакогенератор 0x5B - ld c,Bios.Win_Set_ZG - ld a,0x5B - rst BiosRst - - ld hl,(0039h) ;установка вектора (для мигания курсора) - ld (Rst38.Vect+1),hl - ld hl,Rst38 - ld (0039h),hl - ret - -Rst38 di ;вектор курсора - push iy - push ix - push hl - push de - push bc - push af - exx - exa - push hl - push de - push bc - push af - call Clock - ld a,(CursOnOff) - or a - call nz,CuttingCurs - pop af - pop bc - pop de - pop hl - exx - exa - pop af - pop bc - pop de - pop hl - pop ix - pop iy -.Vect jp 0x0000 ;адрес сист. вектора RST 38 - -;======== Обработка программного курсора ======== -CuttingCurs ld a,(TimerFlash) ;пауза мигания - dec a - call z,.L1 - ld (TimerFlash),a - ret - -.L1 ld a,(CursPutRes) - cpl - ld (CursPutRes),a - - ld de,(CursPos) - ld (ResCurs.L1+1),de - or a ;флаг Put / Res - jr z,.L3 ;установка курсора - ;иначе сброс курсора - ld hl,(CursSymb) ;символ и его цвет - sub a ;сброс id окна - ld b,SysSymb ;системный знакогенератор - ld c,Bios.Win_Put_Sym ;положить символ - rst BiosRst - ld a,PauseFlash ;пауза мигания - ret - -.L3 ld c,Bios.Win_Get_Sym ;получить символ - sub a ;сброс id окна - rst BiosRst - ld (CursSymb),hl ;символ и его цвет - - ld de,(CursPos) ;позиция печати - ld a,(CursInsOvr) ;флаг режима Ins / Ovr - or a - jr z,.L4 ;режим вставки - ;иначе режим замены - ld a,h - rlca - rlca - rlca - rlca - ld h,a - sub a ;сброс id окна - ld b,SysSymb ;системный знакогенератор -; ld l,0xDC ;курсор режима замены - ld c,Bios.Win_Put_Sym ;символ на экран - rst BiosRst - ld a,PauseFlash ;пауза мигания - ret - -.L4 sub a ;сброс id окна - ld b,0x5B ;модиф. знакогенератор - ld c,Bios.Win_Put_Sym ;символ на экран - rst BiosRst - ld a,PauseFlash ;пауза мигания - ret - -;======== Принудительный сброс курсора ======== -ResCurs ld a,(CursOnOff) - or a - ret z ;курсор не установлен - push hl - ld a,On - ld (CursPutRes),a - inc a - ld (CursOnOff),a - ld a,1 ;пауза мигания - ld (TimerFlash),a -.L1 ld de,0 ;последние координаты курсора - ld hl,(CursSymb) - ld bc,0x1B00+Bios.Win_Put_Sym - sub a ;сбросить id окна - rst BiosRst - pop hl - ret - -CursOnOff db Off ;флаг курсора 00-выкл/FF-вкл -CursPutRes db On ;флаг 00-Res/FF-Put -CursInsOvr db Ins ;флаг 00-Ins/FF-Ovr -TimerFlash db 1 ;таймер -CursPos dw 0 ;позиция курсора -CursSymb dw 0 ;символ под курсором - diff --git a/KREG.ASM b/KREG.ASM deleted file mode 100644 index ad58556..0000000 --- a/KREG.ASM +++ /dev/null @@ -1,440 +0,0 @@ -;[]=========================================================================[] -;[] Обработка клавиатуры в окне регистров [] -;[] v0.03 - последние изменения 11.03.2006 [] -;[] v0.10 - последние изменения 14.05.2006 [] -;[]=========================================================================[] -KReg: -; ld a,b ;состояние -; and 0b11110000 -; jr z,.L100 - - ;Обработка комбинации Shift + символ -; and 0b11000000 ; -; or a -; jp z,Keyb+6 -; ld a,d -; cp 0x80+0x0F ;Shift+Tab -; jp nz,Keyb+6 -; ld a,2 ;номер окна дампа -; ld (Keyb.WinScreen),a -; jp Keyb-3 - - ;Обработка позиционного кода -.L100 ld a,e ;ASCII код - ld (.L200+1),a - ld a,d ;позиционный код - - cp 0x56 ; - jr nz,.L101 - call .DescCalc - ld a,(hl) ;кол-во колонок - cp e - ld a,e - jr nz,$+3 - xor a - inc a - ld (.Coordinate),a ;текущая колонка - jp Keyb-3 - -.L101 cp 0x54 ; - jr nz,.L102 - call .DescCalc - ld a,e ;текущая колонка - cp 1 - jr nz,$+4 - ld a,(hl) ;кол-во колонок - inc a - dec a - ld (.Coordinate),a ;текущая колонка - jp Keyb-3 - -.L102 ld hl,(.Descript) - ld de,(.Coordinate) - cp 0x52 ; - jr nz,.L103 - ld a,d ;текущая строка - cp l - jr nz,.L104 - ld a,h ;1-я строка - dec a -.L104 inc a - jr .L107+1 - -.L103 cp 0x58 ; - jr nz,.L105 - ld a,d ;текущая строка - cp h - jr nz,.L107 - ld a,l ;адрес последней строки - inc a -.L107 dec a - ld h,a - ld l,1 - ld (.Coordinate),hl - jp Keyb-3 - -.L105 ld b,3 - cp 0x53 ; - jr nz,.L108 - ld hl,.PgDown - ld a,d ;текущая строка - cp (hl) - jr c,$+5 - inc hl - djnz $-4 - ld a,(hl) - jr .L107+1 - -.L108 cp 0x59 ; - jr nz,.L110 - ld hl,.PgUp - ld a,d ;текущая строка - cp (hl) - jr nc,$+5 - inc hl - djnz $-4 - ld a,(hl) - dec a - jr .L107+1 - -.L110 cp 0x57 ; - jr nz,.L111 - ld a,1 - ld (.Coordinate),a ;первая колонка - jp Keyb-3 - -.L111 cp 0x51 ; - jr nz,.L200 - call .DescCalc - ld a,(hl) ;последняя колонка - ld (.Coordinate),a ;первая колонка - jp Keyb-3 - -;.L112 cp 0x0F ; -; jr nz,.L200 -; ld a,4 ;номер окна листинга -; ld (Keyb.WinScreen),a -; jp Keyb-3 - - ;Обработка ASCII кодов -.L200 ld a,0 ;ASCII код - cp 0x0D ; - jp nz,Keyb+6 -.L201 ld b,0 ;длина строки ввода - ld hl,0 ;координаты строки ввода - - ld a,b - dec a - jp nz,.L205 - ld de,(.Coordinate) - ld a,d ;номер строки - ld c,e ;номер колонки - ex de,hl ;координаты - ld hl,Reg._AF+1 ;рег A - cp 6 ;строка с парой AF? - jr z,.L207 - ld hl,Reg._AF_+1 ;рег A' - cp 11 ;строка с парой AF'? - jr z,.L207 - ld hl,Reg._AF ;рег F - cp 7 ;строка с парой AF? - jr z,$+9 - ld hl,Reg._AF_ ;рег F' - cp 12 ;строка с парой AF'? - jr nz,.L206 - ld a,c ;коррекция номеров бит - cp 4 ;колонка 4..6? - jr c,$+5 - inc c - jr .L207-4 - cp 3 ;колонка 3? - jr z,.L207-4 - dec c - ld a,7 - jr .L208 -.L207 ld a,10 ;колонки с битами - cp c - jr z,.L206 - dec a -.L208 sub c ;номер бита - rlca - rlca - rlca ;заготовка для битовых операций - ld b,a - or 01000110b ;для BIT - ld ($+16),a - ld a,b - or 11000110b ;для SET - ld ($+14),a - ld a,b - or 10000110b ;для RES - ld ($+13),a - bit 0,(hl) ;состояние бита - jr nz,$+7 - set 0,(hl) ;установка бита - jp Keyb-11 - res 0,(hl) ;сброс бита - jp Keyb-11 - -.L206 ex de,hl ;координаты - call InputLine ;ввод символа - jp c,Keyb-3 ;завершение ввода по - ld de,.L204-5 - push de - ld de,(.Coordinate) - ld hl,Reg._AF+1 - ld a,d - ld de,0 - cp 6 ;строка с парой AF - ret z - ld hl,Reg._AF_+1 - cp 11 ;строка с парой AF'? - ret z - ld de,(.Coordinate) - ld a,e - sub 6 - ld e,a - jr .L209 - -.L205 dec a ;байты в минидампе - jr nz,.L202 - call InputLine ;ввод числа - jp c,Keyb-3 ;завершение ввода по - call PutCode - jp c,.L201 ;ошибка в веденных данных - ld de,.L204 - push de - ld de,(.Coordinate) -.L209 dec d - jr nz,$+6 - ld hl,(Reg._IX) - ret - dec d - jr nz,$+6 - ld hl,(Reg._IY) - ret - dec d - jr nz,$+6 - ld hl,(Reg._HL) - ret - dec d - jr nz,$+6 - ld hl,(Reg._DE) - ret - dec d - jr nz,$+6 - ld hl,(Reg._BC) - ret - dec d - dec d - dec d - jr nz,$+6 - ld hl,(Reg._HL_) - ret - dec d - jr nz,$+6 - ld hl,(Reg._DE_) - ret - dec d - ld hl,(Reg._BC_) - ret - - ld a,(InputLine.Buffer) - jr $+7 -.L204 ld a,(PutCode.Buffer) ;записываемый байт - dec e - dec e ;смещение в минидампе - add hl,de ;адрес в памяти - call Ld_hl_a ;записали - jp Keyb-11 - -.L202 dec a ;однобайтное число (номер банки) - jr nz,.L203 - call InputLine ;ввод числа - jp c,Keyb-3 ;завершение ввода по - call PutAdres - jp c,.L201 ;ошибка в веденных данных - ld de,Keyb-11 - push de - ld a,l - ld de,(.Coordinate) - dec e ;колонка в строке - jr nz,$+6 - ld (WinPage),a ;0-е окно - ret - dec e - jr nz,$+8 - ld (WinPage+1),a ;1-е окно - out (EmmWin.P1),a - ret - dec e - jr nz,$+6 - ld (WinPage+2),a ;2-е окно - ret - ld (WinPage+3),a ;3-е окно - out (EmmWin.P3),a - ret - -.L203 dec a ;глубина стека - jr nz,.L210 - xor a ;обнулить - ld (StackDown),a - jp Keyb-11 - -.L210 ;dec a ;двухбайтное число - ;jp nz,Keyb+6 - call InputLine ;ввод числа в рег пары - jp c,Keyb-3 ;завершение ввода по - call PutAdres - jp c,.L201 ;ошибка в веденных данных - ld de,Keyb-11 - push de - ld de,(.Coordinate) - dec d - jr nz,$+6 - ld (Reg._IX),hl - ret - dec d - jr nz,$+6 - ld (Reg._IY),hl - ret - dec d - jr nz,$+6 - ld (Reg._HL),hl - ret - dec d - jr nz,$+6 - ld (Reg._DE),hl - ret - dec d - jr nz,$+6 - ld (Reg._BC),hl - ret - dec d - jr nz,$+6 - ld (Reg._AF),hl - ret - dec d - dec d - jr nz,$+6 - ld (Reg._HL_),hl - ret - dec d - jr nz,$+6 - ld (Reg._DE_),hl - ret - dec d - jr nz,$+6 - ld (Reg._BC_),hl - ret - dec d - jr nz,$+6 - ld (Reg._AF_),hl - ret - dec d - dec d - jr nz,$+13 - dec e - jr z,$+6 - ld (Reg._IR),hl - ret - ld (Reg._PC),hl - ret - dec e - jr z,.L211 -.Rez ld bc,Rezident.End-Rezident;длина резидента - push hl ;новое начало резидента - add hl,bc ;новый конечный адрес резидента - ld a,h - and 11000000b - ld d,a - pop hl - ld a,h - and 11000000b - cp d ;резидент пересекает окно? - jr z,.L212 - ld h,d - ld l,0 - dec hl ;последний адрес окна с резидентом - or a - sbc hl,bc -.L212 ld (RezAdr),hl - ret -.L211 ld (Reg._SP),hl - ret - - ;Расчет дескриптора строки в окне регистров -.DescCalc ld de,(.Coordinate) ;текущие координаты - ld hl,.Descript+1 - ld b,d ;номер строки - inc hl ;дескриптор строки - inc hl - djnz $-2 - ld a,(hl) ;номер дескриптора строки - add a,a - ld c,a - dec hl - ld b,(hl) - push bc - ld b,0 - ld hl,.DTabl - add hl,bc - ld a,(hl) ;начало дескриптора - inc hl - ld h,(hl) - ld l,a - pop bc - ret - -.PgDown db 2,7,12,15 -.PgUp db 14,9,4,2 - -.Coordinate dw 0x0101 ;курсор (стр/кол курсора) - -.Descript: - dw 0x010F ;первая/кол-во строк окна - - db 0x01,0 ;номер строки, номер дескриптора - db 0x02,0,0x04,0 - db 0x05,0,0x06,0,0x07,1 - db 0x08,2,0x0A,0,0x0B,0 - db 0x0C,0,0x0D,1,0x0E,2 - db 0x10,3,0x12,4,0x14,5 - -.DTabl dw .D1,.D2,.D3,.D4,.D5,.D6 - -.D1 db 9 ;кол-во колонок для пар - db 0x04 ;N столбца колонки - db 5 ;ширина колонки - db 0x0A,2,0x0C,2,0x0F,2,0x11,2 - db 0x14,1,0x15,1,0x16,1,0x17,1 - -.D2 db 10 ;кол-во колонок для пары AF - db 0x04 ;N столбца колонки - db 5 ;ширина колонки - db 0x0B,1,0x0C,1,0x0D,1,0x0E,1 - db 0x0F,1,0x10,1,0x11,1,0x12,1 - db 0x15,1 - -.D3 db 6 ;кол-во колонок для флагов - db 0x01 ;N столбца колонки - db 1 ;ширина колонки - db 0x02,1,0x04,1 - db 0x06,1,0x07,1,0x08,1 - -.D4 db 2 ;кол-во колонок для PC IR - db 0x04 ;N столбца колонки - db 5 ;ширина колонки - db 0x0D,5 - -.D5 db 4 ;кол-во колонок для банок - db 0x02 ;N столбца колонки - db 3 ;ширина колонки - db 0x08,3,0x0E,3,0x14,3 - -.D6 db 3 ;кол-во колонок - db 0x04 ;N столбца колонки - db 5 ;ширина колонки - db 0x0A,4 - db 0x13,5 - diff --git a/KSTACK.ASM b/KSTACK.ASM deleted file mode 100644 index 6dc77fe..0000000 --- a/KSTACK.ASM +++ /dev/null @@ -1,212 +0,0 @@ -;[]=========================================================================[] -;[] Обработка клавиатуры в окне дампа стека [] -;[] v0.10 - последние изменения 18.03.2006 [] -;[]=========================================================================[] -KStack: - ld a,b ;состояние - and 11110000b -; ld b,a - jr z,.L100 - - ;Обработка комбинации Shift + символ -; and 11000000b ; -; or a -; jr z,.L10 -; ld a,d -;; cp 0x80+0x0F ;Shift+Tab -;; jp nz,Keyb+6 -;; ld a,3 ;номер окна дампа -;; ld (Keyb.WinScreen),a -; jp Keyb-3 - - ;Обработка комбинации Ctrl + символ -; ld a,b - cp 00100000b ; - jp nz,Keyb+6 - ld a,d ;позиционный код - cp 0x80+0x2B ;+ - jp nz,Keyb+6 - ld hl,(StackDump) - ld bc,(.Coordinate) - ld a,b - ld b,0x16 ;x-кордината 1 строки - sub b - rlca ;*2 - ld b,0 - ld c,a - or a - sbc hl,bc - ld (Reg._SP),hl - ld a,-1 - ld (PrintStrSP.StrSp),a - jp Keyb-11 - - ;Обработка позиционного кода -.L100 ld a,e ;ASCII код - ld (.L200+1),a - ld a,d ;позиционный код - - ld de,(.Coordinate) ;текущие координаты курсора - cp 0x56 ; - jr nz,.L101 - ld a,(.Descript+2) ;кол-во колонок - cp e - ld a,e - jr nz,$+3 - xor a - inc a - ld (.Coordinate),a ;текущая колонка - jp Keyb-3 - -.L101 cp 0x54 ; - jr nz,.L102 - ld a,e ;текущая колонка - cp 1 - jr nz,$+6 - ld a,(.Descript+2) ;кол-во колонок - inc a - dec a - ld (.Coordinate),a ;текущая колонка - jp Keyb-3 - -.L102 ld hl,(.Descript) - cp 0x52 ; - jr nz,.L103 - ld a,d ;текущая строка - cp l - jr nz,.L104 - ld hl,(StackDump) ;адрес 1-ой строки - dec hl - dec hl - ld (StackDump),hl - ld hl,PrintStrSP.StrSp ;строка верш.стека - ld a,-1 - cp (hl) ;в дампе? - jr z,$+3 - dec (hl) - jp Keyb-11 -.L104 inc a - ld (.Coordinate+1),a - jp Keyb-3 - -.L103 cp 0x58 ; - jr nz,.L105 - ld a,d ;текущая строка - cp h - jr nz,.L107 - ld hl,(StackDump) ;адрес 1-ой строки - inc hl - inc hl - ld (StackDump),hl - ld hl,PrintStrSP.StrSp ;строка верш.стека - ld a,(hl) - cp 7 ;на последней строке? - jr c,$+5 - ld a,-2 - ld (hl),a ;верш.стека не попадает в дамп - inc (hl) - jp Keyb-11 -.L107 dec a - ld (.Coordinate+1),a - jp Keyb-3 - -.L105 cp 0x53 ; - jr nz,.L108 - ld a,d ;текущая строка - cp l - jr nz,.L106 - ld hl,(StackDump) - ld bc,2*7 - or a - sbc hl,bc - ld (StackDump),hl - ld a,-1 - ld (PrintStrSP.StrSp),a ;строка верш.стека - jp Keyb-11 -.L106 ld a,l ;на последнюю строку - ld (.Coordinate+1),a - jp Keyb-3 - -.L108 cp 0x59 ; - jr nz,.L110 - ld a,d ;текущая строка - cp h - jr nz,.L109 - ld hl,(StackDump) - ld bc,2*7 - add hl,bc - ld (StackDump),hl - ld a,-1 - ld (PrintStrSP.StrSp),a ;строка верш.стека - jp Keyb-11 -.L109 ld a,h ;на первую строку - ld (.Coordinate+1),a - jp Keyb-3 - -.L110 cp 0x57 ; - jr nz,.L200 - ld a,6 - ld (PrintStrSP.StrSp),a ;строка верш.стека - jp Keyb-11 - -;.L111 cp 0x0F ; -; jr nz,.L200 -; ld a,1 ;номер окна листинга -; ld (Keyb.WinScreen),a -; jp Keyb-3 - - ;Обработка ASCII кодов -.L200 ld a,0 ;ASCII код - cp 0x0D ; - jp nz,Keyb+6 -.L201 ld b,0 ;длина строки ввода - ld hl,0 ;координаты строки ввода - call InputLine ;ввод числа - jp c,Keyb-3 ;завершение ввода по - call PutAdres - jp c,.L201 ;ошибка в веденных данных - ld bc,(.Coordinate) - ld a,b - ld b,0x16 ;x-кордината 1 строки - sub b - ex de,hl - ld hl,(StackDump) - ld b,a ;номер строки 0..7 - rlca ;*2 - dec c - ld c,a - jr nz,.L202 ;переход - если данные, иначе алрес - - ld a,(PrintStrSP.StrSp) ;строка верш.стека - cp b - jr z,.L203 - ld b,0 ;не на вершине стека - ex de,hl ;HL - введенный адрес - add hl,bc - ld (StackDump),hl - ld a,-1 - ld (PrintStrSP.StrSp),a - jr .L203+4 -.L203 ld (Reg._SP),de ;адрес введен на вершине стека - jp Keyb-11 - -.L202 ld b,0 ;ввод данных - or a - sbc hl,bc - ld a,d ;запись данных в память - call Ld_hl_a - inc hl - ld a,e - call Ld_hl_a - jp Keyb-11 - - -.Coordinate dw 0x1601 ;курсор (стр/кол курсора) -.Descript: - dw 0x161D ;первая/последняя строка окна - db 2 ;кол-во колонок - - db 0x01 ;N столбца колонки - db 5 ;ширина колонки - db 0x07,5 - diff --git a/REZ.ASM b/REZ.ASM deleted file mode 100644 index d93e26e..0000000 --- a/REZ.ASM +++ /dev/null @@ -1,87 +0,0 @@ -;[]=========================================================================[] -;[] Резидент отладчика [] -;[] v0.03 - последние изменения 24.02.2006 [] -;[] Принцип работы (два варианта): [] -;[] 1. Резидент расположен не во втором окне памяти (0x8000...0xBFFF) [] -;[] Из отладчика готовится резидент (настраиваются все адреса) и копируется [] -;[] по адресу расположения, управление из отладчика передается на метку [] -;[] Rezident.Start1, после чего происходит востановление банки памяти, рас- [] -;[] положенной под отладчиком и выполнение отлаживаемой команды. Возврат [] -;[] в резидент осуществляется на метку Rezident.RetIn1 и далее после вос- [] -;[] тановления банки с отладчиком возврат в отладчик. [] -;[] 2. Резидент расположен во втором окне памяти (0x8000...0xBFFF) [] -;[] Поскольку в этом окне работает сам отладчик, то переход в резидент и [] -;[] возврат в отладчик после трассировки команды выполняется при помощи [] -;[] вспомогательной процедуры длиной 7 байт расположеной по адресу [] -;[] AdrTmpBuf. После коррекции всех адресов в отладчике и сохранении акку- [] -;[] мулятора отлаживаемой программы по адресу Rezident+1 и пары HL по адре- [] -;[] ce Rezident+2 управление передается по адресу AdrTmpBuf, где расположен [] -;[] следующий код отключающий банку с отладчиком: [] -;[] ld a,НомерБанкиПодОтладчиком [] -;[] out (НомерПорта2Окна),a [] -;[] jp Rezident.Start [] -;[] Далее резидент востанавливает 7 байт запорченых вышепреведенной проце- [] -;[] дурой, а также пару HL и аккумулятор и переходит к трассировке. Возврат [] -;[] происходит на метку Rezident.RetIn, где после сохранения аккумулятора и [] -;[] пары HL сохраняется 7 байт памяти из адреса AdrTmpBuf и туда прописыва- [] -;[] ется код востановления банки с отладчиком: [] -;[] ld a,НомерБанкиСОтладчиком [] -;[] out (НомерПорта2Окна),a [] -;[] jp ВОтладчик [] -;[] После возврата в отладчик востанавливается память запорченая резидентом [] -;[] и временной процедурой [] -;[]=========================================================================[] -AdrTmpBuf equ 0xFF00 -Rezident: - ds 11 - -.Start ld hl,0 ;вост. памяти запорченной при - ld (AdrTmpBuf),hl ;размещении резидента - ld hl,0 ;во 2-м окне - ld (AdrTmpBuf+2),hl - ld hl,0 - ld (AdrTmpBuf+4),hl - ld a,0 - ld (AdrTmpBuf+6),a -.K2 ld hl,(Rezident+2) ;востановили HL - jr .K3 - ;...востановить банку во 2-м окне -.Start1 ld a,0xFF ;банка под demon'ом - out (EmmWin.P2),a -.K3 ld a,(Rezident+1) ;востановим аккумулятор - -.Step jp 0 ;переход на выполнение - -.RetIn ld (Rezident+1),a ;сохраним аккумулятор -.K4 ld (Rezident+2),hl ;сохраним HL - ld hl,(AdrTmpBuf) ;сохранение памяти -.K5 ld (Rezident+4),hl - ld hl,(AdrTmpBuf+2) - ld (Rezident+6),hl - ld hl,(AdrTmpBuf+4) - ld (Rezident+8),hl - ld a,(AdrTmpBuf+6) - ld (Rezident+10),a -.BankD1 ld hl,0xFF3E ;ld a,0xFF - N банки с отладч - ld (AdrTmpBuf),hl - ld hl,EmmWin.P2*256+0xD3 ;out (EmmWin.P2),a - ld (AdrTmpBuf+2),hl -.Return1 ld hl,0xC3 ;jp в отладчик - ld (AdrTmpBuf+4),hl - ld a,0 - ld (AdrTmpBuf+6),a - in a,(EmmWin.P2) ;номер банки под demon'ом -.K6 ld (Rezident),a ;сохранили - jp AdrTmpBuf - -.RetIn1 ld (Rezident+1),a ;сохраним аккумулятор - ;...сохранить банку из 2-го окна - in a,(EmmWin.P2) ;номер банки под demon'ом -.K1 ld (Rezident),a ;сохранили -.BankD ld a,0xFF ;банка с demon'ом - out (EmmWin.P2),a - -.Return jp 0 - -.End - diff --git a/SAVESCR.ASM b/SAVESCR.ASM deleted file mode 100644 index 7364d8b..0000000 --- a/SAVESCR.ASM +++ /dev/null @@ -1,64 +0,0 @@ -;[]=========================================================================[] -;[] Сохранение экрана в файл [] -;[] v0.03 - последние изменения 11.03.2006 [] -;[]=========================================================================[] -SaveScr: - ld bc,1*256+Dss.GetMem - rst DssRst ;выделение банки памяти - ret c ;выход с ошибкой - ld (.Id),a - ld bc,Dss.SetWin3 - rst DssRst ;включение банки в 3-е окно - ld (.Id+1),a ;замещаемая страница - ld de,0 ;позиция на экране - ld hl,0xC000 -.L1 push de - push hl - ld c,Dss.RdChar - rst DssRst ;считать символ с экрана - pop hl - pop de - ld (hl),a - inc hl - inc e - ld a,e - cp 0x50 ;закончилась строка? - jr nz,.L1 - ld bc,0x0D0A ;конец строки - ld (hl),b - inc hl - ld (hl),c - inc hl - ld e,0 ;начало строки - inc d - ld a,d - cp 0x20 ;конец экрана? - jr nz,.L1 - - ld hl,.NameF ;имя файла - xor a ;атрибут - ld c,Dss.Create - rst DssRst - jr c,.L2 ;ошибка - push af - ld hl,0xC000 ;начало записываемой памяти - ld de,82*32 ;размер записываемой инфы - ld c,Dss.Write - rst DssRst ;записать - pop af - ld c,Dss.Close - rst DssRst ;закрыть файл - -.L2 ld a,(.Id) ;id памяти - ld c,Dss.FreeMem - rst DssRst ;освободить память - ld a,(.Id+1) - out (EmmWin.P3),a ;востановили банку - ret - -.NameF db "demon.$$$",0 -.Id ds 2 ;id выделенного блока - -;11:11 18.02.2011 Заглушка Не было исходника :( -; include "d:\workast\demon\screen\scrdemon" - diff --git a/STEP.ASM b/STEP.ASM deleted file mode 100644 index 1882928..0000000 --- a/STEP.ASM +++ /dev/null @@ -1,431 +0,0 @@ -;[]=========================================================================[] -;[] Отладка команд программы [] -;[] v0.03 - последние изменения 10.03.2006 [] -;[] v0.10 - последние изменения 18.03.2006 [] -;[]=========================================================================[] -Step: - di - ld a,(WinPage+2) ;банка под demon'ом - ld (Rezident.Start1+1),a ;в резидент ее - ld (.BankP+1),a - ld a,(BankDebug) ;банка с demon'ом - ld (Rezident.BankD+1),a ;в резидент ее - ld (Rezident.BankD1+2),a - ld hl,Step.Run+3 ;точка возврата в отладчик - ld (Rezident.Return+1),hl ;прописываем в резиденте - ld a,l - ld (Rezident.Return1+2),a - ld a,h - ld (Rezident.Return1+7),a - ld hl,(Reg._PC) - ld (Rezident.Step+1),hl ;адрес отлаживаемой команды - - ld a,(Reg._AF) ;флаг - ld b,a - call Ld_a_hl -; ld a,(hl) ;код команды - - ld c,a - and 11001111b - cp 11000101b ;PUSH - call z,.SpdInc - cp 11000001b ;POP - call z,.SpdDec - - ld a,c - cp 0xCD ;CALL - jr nz,.L7 - ld a,(.Flag) - inc a - jp nz,.L2 ;без захода в подпрограмму - jp .L8 -.L7 cp 0xC9 ;RET - jp z,.L9 - cp 0xC3 ;JP - jp z,.L8+3 - cp 0x18 ;JR - jp z,.L6 - cp 0x10 ;DJNZ - jr nz,.L18 - ld a,(.Flag) - inc a - jp nz,.L2 ;без отладки цикла - ld a,(Reg._BC+1) - dec a - jr nz,.L6 - jp .L2 -.L18 inc hl ;следующий байт соманды - exa - call Ld_a_hl - ld c,a - exa -; ld c,(hl) - dec hl - cp 0xED ;префикс для RETI, RETN - jr nz,.L10 - ld a,c - cp 0x4D ;RETI - jp z,.L9 - cp 0x45 ;RETN - jp z,.L9 -.L10 cp 0xDD ;префикс для IX - jr nz,.L25 - ld a,c - cp 0xE5 ;PUSH IX - call z,.SpdInc - cp 0xE1 ;POP IX - call z,.SpdDec - ld de,(Reg._IX) - jr .L24 -.L25 cp 0xFD ;префикс для IY - jr nz,.L24-4 - ld a,c - cp 0xE5 ;PUSH IY - call z,.SpdInc - cp 0xE1 ;POP IY - call z,.SpdDec - ld de,(Reg._IY) - jr .L24 - ld de,(Reg._HL) -.L24 cp 0xE9 ;JP (HL/IX/IY) - jr nz,.L23 - ex de,hl - jp .L2+3 -.L23 cp 0x38 ;JR C, - jr nz,.L19 - bit 0,b ;флаг C - jp z,.L2 ;нет перехода - jr .L6 ;переход -.L19 cp 0x30 ;JR NC, - jr nz,.L20 - bit 0,b ;флаг C - jp nz,.L2 ;нет перехода - jr .L6 ;переход -.L20 cp 0x28 ;JR Z, - jr nz,.L21 - bit 6,b ;флаг Z - jp z,.L2 ;нет перехода - jr .L6 ;переход -.L21 cp 0x20 ;JR NZ, - jr nz,.L22 - bit 6,b ;флаг Z - jp nz,.L2 ;нет перехода - -.L6 inc hl - call Ld_a_hl -; ld a,(hl) ;смещение - inc hl - ld b,0 - ld c,a - bit 7,a ;знак числа - jr z,$+11 - neg - or a ;сброс флага C - ld c,a - sbc hl,bc ;отрицательное смещение - jp .L2+3 - add hl,bc ;положительное смещение - jp .L2+3 - -.L22 and 11000111b - cp 11000111b ;RST x - jr nz,.L27 - ld a,(.Flag) - inc a - jp nz,.L2 ;без захода в подпрограмму - call .SpdInc - call Ld_a_hl -; ld a,(hl) ;байт комнды - and 00111000b ;адрес перехода - ld h,0 - ld l,a - jp .L2+3 -.L27 cp 11000010b ;JP flag - jr z,.L26 - cp 11000000b ;RET flag - jr z,.L26 - cp 11000100b ;CALL flag - jr nz,.L2 - ld a,(.Flag) - inc a - jr nz,.L2 ;без захода в подпрограмму -.L26 call Ld_a_hl -; ld a,(hl) ;код команды - and 00111000b ;флаги - jr z,.L11 ;JP/CALL/RET NZ, - cp 00001000b - jr z,.L12 ;JP/CALL/RET Z, - cp 00010000b - jr z,.L13 ;JP/CALL/RET NC, - cp 00011000b - jr z,.L14 ;JP/CALL/RET C, - cp 00100000b - jr z,.L15 ;JP/CALL/RET PO, - cp 00101000b - jr z,.L16 ;JP/CALL/RET PE, - cp 00110000b - jr z,.L17 ;JP/CALL/RET P, - bit 7,b ;JP/CALL/RET M, флаг S - jr z,.L2 ;нет перехода - jr .L5 ;переход -.L11 bit 6,b ;флаг Z - jr nz,.L2 ;нет перехода - jr .L5 ;переход -.L12 bit 6,b ;флаг Z - jr z,.L2 ;нет перехода - jr .L5 ;переход -.L13 bit 0,b ;флаг C - jr nz,.L2 ;нет перехода - jr .L5 ;переход -.L14 bit 0,b ;флаг C - jr z,.L2 ;нет перехода - jr .L5 ;переход -.L15 bit 2,b ;флаг P/V - jr nz,.L2 ;нет перехода - jr .L5 ;переход -.L16 bit 2,b ;флаг P/V - jr z,.L2 ;нет перехода - jr .L5 ;переход -.L17 bit 7,b ;флаг S - jr nz,.L2 ;нет перехода - -.L5 call Ld_a_hl -; ld a,(hl) ;код команды - and 00000111b ;отследить RET'ы - jr nz,.L8-4 -.L9 call .SpdDec - ld hl,(Reg._SP) ;стек - dec hl - jr .L8+3 - cp 00000010b ;отследить JP - jr z,.L8+3 -.L8 call .SpdInc - inc hl - call Ld_a_hl - ld b,a -; ld a,(hl) - inc hl - call Ld_a_hl -; ld h,(hl) - ld h,a - ld l,b - jr .L2+3 -.L2 call List ;следующая команда - ld (Reg._PC),hl ;новый PC - push hl - push hl - ld a,(KList.Descript) ;количество строк листинга - call AdrListTabl ;нижний адрес листинга - ld de,(ListAdr) ;верхний адрес листинга - pop bc ;новый PC - call AdrArea - jr nc,.L1+4 - -.L1 ld (ListAdr),bc ;новая страница листинга - pop hl - - call Ld_a_hl ;следующие за командой байты - ld c,a - inc hl - call Ld_a_hl - ld b,a - inc hl - call Ld_a_hl - push bc - push af - push hl - - push hl - ld hl,(RezAdr) ;адрес посадки резидента - ld a,h - and 11000000b - cp 10000000b ;окно посадки резидента - ld a,0xFF ;FF - резидент во 2-м окне - jr nz,.L30 - ld de,Rezident.RetIn-Rezident - jr .L30+4 -.L30 ld de,Rezident.RetIn1-Rezident - inc a ;0 - резидент не во 2-м окне - ld (.WRez),a - add hl,de ;адрес возврата в резидент - ex de,hl - pop hl - ld a,d ;прописываем после - call Ld_hl_a ;отлаживаемой команды - dec hl - ld a,e - call Ld_hl_a - dec hl - ld a,0xC3 ;JP - call Ld_hl_a - - ld hl,(RezAdr) ;адрес посадки - push hl ;коррекция адресов кода резидента - ld (Rezident.K1+1),hl ;номер банки под отладчиком - ld (Rezident.K6+1),hl - inc hl - ld (Rezident.K3+1),hl ;аккумулятор прграммы - ld (Rezident.RetIn+1),hl - ld (Rezident.RetIn1+1),hl - inc hl - ld (Rezident.K2+1),hl ;пара HL программы - ld (Rezident.K4+1),hl - inc hl - inc hl - ld (Rezident.K5+1),hl ;1 и 2 байты буфера - inc hl - inc hl - ld (Rezident.K5+7),hl ;3 и 4 байты буфера - inc hl - inc hl - ld (Rezident.K5+13),hl ;5 и 6 байты буфера - inc hl - inc hl - ld (Rezident.K5+19),hl ;7 байт буфера - - ld a,(.WRez) ;флаг посадки резидента - or a - jr nz,.L31 - ld de,Rezident.Start1-Rezident - ld hl,(RezAdr) ;адрес посадки - add hl,de ;старт резидента не во 2-м окне - jr .L32 - -.L31 inc hl ;старт резидента во 2-м окне - ld (.Run1+1),hl - - ld hl,AdrTmpBuf - ld de,Rezident.Start+1 ;сохранение 7 байт в резиденте - ld b,3 -.L33 ld a,(hl) - ld (de),a - inc hl - inc de - ld a,(hl) - ld (de),a - inc hl - inc de - inc de - inc de - inc de - inc de - djnz .L33 - ld a,(hl) - ld (de),a - - ld de,.Run1+2 ;вспомогательная процедура - ld b,7 ;длина -.L34 ld a,(de) - ld (hl),a - dec hl - dec de - djnz .L34 - inc hl - -.L32 ld (.Run+1),hl - - ld a,(Reg._AF+1) ;аккумулятор программы - ld (Rezident+1),a ;в резидент - ld hl,(Reg._HL) ;пара HL - ld (Rezident+2),hl ;в резидент - - pop hl ;адрес посадки резидента - ld de,Rezident ;начало резидента - ld bc,.Buffer - ld a,Rezident.End-Rezident ;длина резидента -.L3 push af - call Ld_a_hl - ld (bc),a ;сохранение памяти под резидентом - ld a,(de) ;копирование резидента - call Ld_hl_a - inc bc - inc de - inc hl - pop af - dec a - jr nz,.L3 - - ld a,(WinPage) ;банка в 0-ом окне - out (EmmWin.P0),a - - call RestAllRegs - ld (StackDebug),sp ;стек отладчика - ld sp,(Reg._SP) ;стек программы -.Run jp 0 ;пуск резидента - - ld (Reg._SP),sp ;стек программы - ld sp,(StackDebug) ;стек отладчика - call SaveAllRegs - in a,(EmmWin.P0) - ld (WinPage),a ;банка в 0-ом окне - ld a,(BankOS) ;банка с OS - out (EmmWin.P0),a - - ld hl,(RezAdr) - call Ld_a_hl - ld (WinPage+2),a ;номер банки во 2-ом окне - inc hl ;аккумулятор программа - call Ld_a_hl - ld (Reg._AF+1),a - ld a,(.WRez) ;флаг резидента - or a - jr z,.L35 ;не во 2-м окне - inc hl ;регистр L программы - call Ld_a_hl - ld (Reg._HL),a - inc hl ;регистр H программы - call Ld_a_hl - ld (Reg._HL+1),a - ld b,7 - ld de,AdrTmpBuf -.L36 inc hl ;буфер 7-ми байт - call Ld_a_hl - ld (de),a ;востановили - inc de - djnz .L36 - -.L35 pop hl - pop af ;востановили код команды - pop bc - call Ld_hl_a - dec hl - ld a,b - call Ld_hl_a - dec hl - ld a,c - call Ld_hl_a - - ld de,.Buffer ;восстановление памяти под резидентом - ld hl,(RezAdr) ;адрес посадки - ld b,Rezident.End-Rezident ;длина резидента -.L4 ld a,(de) - call Ld_hl_a - inc de - inc hl - djnz .L4 - ei - ret - -.BankP ld a,0xFF ;(2) банка под отладчиком - out (EmmWin.P2),a ;(2) -.Run1 jp 0 ;(3) переход в резидент - -.SpdInc push af ;увеличение глубины стека - ld a,(StackDown) - inc a - ld (StackDown),a - pop af - ret - -.SpdDec push af ;уменьшение глубины стека - ld a,(StackDown) - dec a - ld (StackDown),a - pop af - ret - -.Flag db On ;флаг захода в подпрограммы -.WRez db 0 ;флаг окна посадки резидента - -.Buffer ds Rezident.End-Rezident ;длина резидента - diff --git a/VERSION/build.bin b/VERSION/build.bin index 2f01c85..9df46a8 100644 --- a/VERSION/build.bin +++ b/VERSION/build.bin @@ -1 +1 @@ -0003 \ No newline at end of file +0004 \ No newline at end of file diff --git a/VERSION/date.bin b/VERSION/date.bin index 87ee74b..7e25c9c 100644 --- a/VERSION/date.bin +++ b/VERSION/date.bin @@ -1 +1 @@ -210211 \ No newline at end of file +240724 \ No newline at end of file diff --git a/VERSION/minor.bin b/VERSION/minor.bin index 9d60796..3cacc0b 100644 --- a/VERSION/minor.bin +++ b/VERSION/minor.bin @@ -1 +1 @@ -11 \ No newline at end of file +12 \ No newline at end of file diff --git a/VERSION/time.bin b/VERSION/time.bin index f677d90..af7d18f 100644 --- a/VERSION/time.bin +++ b/VERSION/time.bin @@ -1 +1 @@ -00:00 \ No newline at end of file +15:00 \ No newline at end of file diff --git a/changes.md b/changes.md new file mode 100644 index 0000000..fffec95 --- /dev/null +++ b/changes.md @@ -0,0 +1,28 @@ +DemoN v.0.11 +============ +Hard/WCG + +b0003 20.02.2011 + ++ ╨Я╨╛ ╨║╨╜╨╛╨┐╨║╨╡ PC ╨┐╤А╨╕╤Б╨▓╨░╨╕╨▓╨░╨╡╤В╤Б╤П ╨░╨┤╤А╨╡╤Б, ╨╜╨░ ╨║╨╛╤В╨╛╤А╨╛╨╝ ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜ ╨║╤Г╤А╤Б╨╛╤А. + ++ ╨Ф╨╛╨▒╨░╨▓╨╕╨╗ ╨┤╨╕╨░╨╗╨╛╨│ Load BIN-file, ╨╜╨╛ ╨╡╤Й╨╡ ╨╜╨╡ ╨┤╨╛╨▓╨╡╨╗ ╨╡╨│╨╛ ╨┤╨╛ ╤Г╨╝╨░. + +b0002 19.02.2011 + +* ╨Ш╨╖╨╝╨╡╨╜╨╕╨╗ ╨┐╤А╨╛╤Ж╨╡╨┤╤Г╤А╤Л ╨┐╨╡╤З╨░╤В╨╕ ╨╕ ╨┐╤А╨╛╤А╨╕╤Б╨╛╨▓╨║╨╕ ╨║╤Г╤А╤Б╨╛╤А╨░ ╨┤╨╗╤П ╤А╨░╨▒╨╛╤В╤Л ╤З╨╡╤А╨╡╨╖ DSS, ╤В.╨║. ╨╜╨░ ╤Н╨╝╤Г╨╗╤П╤В╨╛╤А╨╡ Demon ╨╜╨╡ +╨┐╨╛╨╗╨╜╨╛╤Ж╨╡╨╜╨╜╨╛ ╤А╨░╨▒╨╛╤В╨░╨╡╤В. + ++ ╨┐╤А╨╕ ╤Б╤В╨░╤А╤В╨╡ ╨╖╨░╨┐╨╛╨╝╨╕╨╜╨░╨╡╨╝ ╤В╨╡╨║╤Г╤Й╨╕╨╣ ╤А╨╡╨╢╨╕╨╝ ╤Н╨║╤А╨░╨╜╨░ ╨╕ ╨┐╤А╨╕ ╨▓╤Л╤Е╨╛╨┤╨╡ - ╨▓╨╛╤Б╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝. + ++ ╤Б╨╛╤Е╤А╨░╨╜╤П╨╡╨╝ ╨▓ ╨▒╤Г╤Д╨╡╤А ╨╕╨╜╤Д╤Г ╤Н╨║╤А╨░╨╜╨░ ╨Ю╨б╨╕, ╨╡╤Б╨╗╨╕ ╤Н╨║╤А╨░╨╜ ╨┤╨╡╨╝╨╛╨╜╨░ ╨╜╨░╤Е╨╛╨┤╨╕╤В╤Б╤П ╨╜╨░ ╤В╨╛╨╣ ╨╢╨╡ ╤Б╤В╤А╨░╨╜╨╕╤Ж╨╡, +╨┐╤А╨╕ ╨▓╤Л╤Е╨╛╨┤╨╡ - ╨▓╨╛╤Б╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ + +* ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨░ ╨Я/╨Я ╨┐╤А╨╛╤Б╨╝╨╛╤В╤А╨░ ╨┤╤А╤Г╨│╨╛╨│╨╛ ╤Н╨║╤А╨░╨╜╨░, ╤В╨╡╨┐╨╡╤А╤М ╨╛╨╜╨░ ╤Б ╤Г╤З╨╡╤В╨╛╨╝ ╤В╨╛╨│╨╛, ╤З╤В╨╛ ╨┤╨╡╨╝╨╛╨╜ ╨╕ ╨Ю╨б ╨╝╨╛╨│╤Г╤В ╨▒╤Л╤В╤М ╨╜╨░ ╨╛╨┤╨╜╨╛╨╝ ╤Н╨║╤А╨░╨╜╨╡ + +* ╨╕╨╖╨╝╨╡╨╜╨╡╨╜ ╨╛╨▒╤А╨░╨╖ "╨╜╨╡╨┐╨╡╤З╨░╤В╨░╨╡╨╝╨╛╨│╨╛" ╤Б╨╕╨╝╨▓╨╛╨╗╨░ + ++ ╨┤╨╛╨▒╨░╨▓╨╕╨╗ ╨Я╨Я ╨┐╤А╨╛╤А╨╕╤Б╨╛╨▓╨║╨╕ ╨╛╨║╨╛╨╜ ╨╕ ╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨╕ ╨┤╨╕╨░╨╗╨╛╨│╨╛╨▓ - ╨╜╨░ ╨▒╤Г╨┤╤Г╤Й╨╡╨╡ + +b0001 18.02.2011 +* ╨Я╨╡╤А╨╡╨┤╨╡╨╗╨░╨╗ ╨╕╤Б╤Е╨╛╨┤╨╜╨╕╨║ ╨┐╨╛╨┤ ╨║╤А╨╛╤Б╤Б╨░╤Б╤Б╨╡╨╝╨▒╨╗╨╡╤А sjasmplus. \ No newline at end of file diff --git a/changes.txt b/changes.txt deleted file mode 100644 index 05f8c49..0000000 --- a/changes.txt +++ /dev/null @@ -1,25 +0,0 @@ -DemoN v.0.11 -Hard/WCG - -b0003 20.02.2011 -+ ╧ю ъэюяъх PC яЁшётрштрхЄё  рфЁхё, эр ъюЄюЁюь єёЄрэютыхэ ъєЁёюЁ. - -+ ─юсртшы фшрыюу Load BIN-file, эю х∙х эх фютхы хую фю єьр. - -b0002 19.02.2011 -* ╚чьхэшы яЁюЎхфєЁ√ яхўрЄш ш яЁюЁшёютъш ъєЁёюЁр фы  ЁрсюЄ√ ўхЁхч DSS, Є.ъ. эр ¤ьєы ЄюЁх Demon эх -яюыэюЎхээю ЁрсюЄрхЄ. - -+ яЁш ёЄрЁЄх чряюьшэрхь Єхъє∙шщ Ёхцшь ¤ъЁрэр ш яЁш т√їюфх - тюёёЄрэртыштрхь. - -+ ёюїЁрэ хь т сєЇхЁ шэЇє ¤ъЁрэр ╬╤ш, хёыш ¤ъЁрэ фхьюэр эрїюфшЄё  эр Єющ цх ёЄЁрэшЎх, -яЁш т√їюфх - тюёёЄрэртыштрхь - -* шчьхэхэр ╧/╧ яЁюёьюЄЁр фЁєуюую ¤ъЁрэр, ЄхяхЁ№ юэр ё єўхЄюь Єюую, ўЄю фхьюэ ш ╬╤ ьюуєЄ с√Є№ эр юфэюь ¤ъЁрэх - -* шчьхэхэ юсЁрч "эхяхўрЄрхьюую" ёшьтюыр - -+ фюсртшы ╧╧ яЁюЁшёютъш юъюэ ш юсЁрсюЄъш фшрыюуют - эр сєфє∙хх - -b0001 18.02.2011 -* ╧хЁхфхыры шёїюфэшъ яюф ъЁюёёрёёхьсыхЁ sjasmplus. \ No newline at end of file diff --git a/clock.asm b/clock.asm new file mode 100644 index 0000000..0a7d102 --- /dev/null +++ b/clock.asm @@ -0,0 +1,35 @@ +;[]=========================================================================[] +;[] ╨Т╤Л╨▓╨╛╨┤ ╤З╨░╤Б╨╛╨▓ [] +;[] v0.03 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 01.02.2006 [] +;[]=========================================================================[] +Clock + ld a,(ClockOn) ; ╤Д╨╗╨░╨│ ╨▓╤Л╨▓╨╛╨┤╨░ ╤З╨░╤Б╨╛╨▓ + inc a + ret nz + ld c,Dss.SysTime + rst DssRst ; ╨┐╤А╨╛╤З╨╕╤В╨░╤В╤М ╨┤╨░╨╜╨╜╤Л╨╡ ╨╛ ╨▓╤А╨╡╨╝╨╡╨╜╨╕ + ld de,.String + push de + push bc + push hl + ld l,h ; ╤З╨░╤Б╤Л + ld h,0 + call ConvDecStr8_1 + inc de + pop hl ; ╨╝╨╕╨╜╤Г╤В╤Л + ld h,0 + call ConvDecStr8_1 + inc de + pop hl + ld l,h ; ╤Б╨╡╨║╤Г╨╜╨┤╤Л + ld h,0 + call ConvDecStr8_1 + ld de,71 + ld c,Bios.Lp_Set_Place ; ╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╕ ╨┐╨╡╤З╨░╤В╨╕ + rst BiosRst : di + pop hl + ld bc,8*256+Bios.Lp_Print_Ln2 ; ╨▓ ╤А╨╡╨│.B ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ + rst BiosRst : di + ret + +.String DB "00:00:00" diff --git a/cmdline.asm b/cmdline.asm new file mode 100644 index 0000000..49a7f00 --- /dev/null +++ b/cmdline.asm @@ -0,0 +1,23 @@ +;[]=========================================================================[] +;[] ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╛╨╝╨░╨╜╨┤╨╜╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕ ╨╝╨╛╨╜╨╕╤В╨╛╤А╨░-╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ DemoN [] +;[] v0.10 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 08.06.2006 [] +;[] ╨Т╤Е╨╛╨┤: ╨╜╨░ ╤Б╤В╨╡╨║╨╡ ╨░╨┤╤А╨╡╤Б ╨╜╨░╤З╨░╨╗╨░ ╨║╨╛╨╝╨░╨╜╨┤╨╜╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕ ╨▓ ╨┐╨░╨╝╤П╤В╨╕ [] +;[] ╨Т╤Л╤Е╨╛╨┤: CF=1 - ╨╜╨╡╤В ╨┐╨░╤А╨░╨╝╨╡╤В╤А╨╛╨▓, CF=0 - ╨╡╤Б╤В╤М ╨┐╨░╤А╨░╨╝╨╡╤В╤А╤Л [] +;[]=========================================================================[] + +CmdLine + pop hl ; ╨╜╨░╤З╨░╨╗╨╛ + ld a,(hl) ; ╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨╝╨░╨╜╨┤╨╜╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕ + or a + scf + jr z,.L1 ; ╨╜╨╡╤В ╨┐╨░╤А╨░╨╝╨╡╤В╤А╨╛╨▓ + + ld de,FDebug ; ╨▒╤Г╤Д╨╡╤А + inc hl + ld c,Dss.GSwitch ; ╨▓╤Л╨┤╨╡╨╗╨╡╨╜╨╕╨╡ ╨┐╨░╤А╨░╨╝╨╡╤В╤А╨░ + rst DssRst + + or a ; CF=0 +.L1 + ;ret + diff --git a/d010_136.rar b/d010_136.rar deleted file mode 100644 index eb1e91f7eca3b6c4eccb4fcfa38a2fb338762d32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139810 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 =U-gpyF9?CWB5HtBkG zsj+<1nqHlfV#1g7St8fYiAVs|=^zvw`RxQq2*h88WdrKRcgCZiBki3g__VJp*y&xukxm!}k;5yic4(EwMyJ>KM&t~*$Q zUYv$@?dkY@&YQ2MdU4tDs6`%}dU)V(b9!+-FAvvBhkW8diRq&ByH5ppt;oil4V{Ao z$6|k2^S^Gkc+9Ni^G473Pb)qnzny=)#W_$`91>XX|E;3e5^XYPQuTR+I<>MeiJ(RT zT-N+W`Pd4&{?P1jCl7|_@?ubq4If0T*UY`#(#q}N8ZxE_lq8<-u8ZR-2>_p=)gIA|*|fz!zrR@0$l@PW5$nR=_n zcFyPa&!%d9Z=`s~e*?F@QCIxx?EK~PFtL1_&DPd%GX}uv-$3=+bxQspHXmM|9VR|^ zYu2@IcJ$zKhbPG;_|u_}6R_|78=e0reZ3Z;vy%86!OQXV`oZ4irjv^bZSSlPv8V}( zEa)HP?|mN~o(H)WO2Y~4k^J9+E4jCXf-@K*8mD7TxfX#p*3+fK{ZptpJ_^yP{4^Z5 z)L0+zbveHmSKRBi5MBOW26sFh4R|*)H-pLa<*i+a5U=2JUsxY*TH-A>74Ocxj~|+D z{ay?z);x zYnB}-Ht!@9{6yJyF`iEBeA9-&Y4u@A&YecAo>}oA2cO)jd(>9ZSlJ z))RKOvplh50kJ``x1)0nj^!=0h>zm}rPOyq+Z%GaffY^-Kw!;F^1gD+7IO`u8qF^t zF)*xgo_5J&;f?*j$QJ4LtzkUZY9gh?WH44hUt&!|O(v)b)i!gz16n!OA5Lu2!BdHKJZ))Ufw1eA8LoK?7xm`%sct;e(I z^yYAKA6Hrm6qkOERuk2Bk@a?<;YoLOUCxD+Vhe=na2+c|?x)6a2gJf{(K2T&(mJ0C zTxA-dP6spz4Il#N%tfpsHEt{>N-*1tcX`4*SH5zgW*vrQQ9R%F+QK<-NUu`!uTgS0 zE5uE`YY8*JmN7t>kaq*a@av*N90xOQH^fKbhjE8wfj}(sY^7;9m`pEH^U(5Dszl+D z7OFzHtn-xHM?tb3V}O&@`VTeE} zauPMt3Jx+7TQhu&5McRw_{dU%nNCI0~?@&}6d@7H#y z6?4?;3ADQ3Ceeu0RP3lE^S}zXZJB4kNjIFJdN{lD76qc z{boSpBJ;vLfif%J{wOz8p+xl`5uq8JCC{_hG5Fr%QZv~0#OfXfG&ml-^KkIFV}XXp z_w!xQ>oJ9uOQ3r9Pn;aEHND`3YH&P0qOfC)z;f{~jQ5aE7|gUtI*Hf$h(`=4#KcFG z9XUTS98uAVDN}vJUuO3vA|1d(g6jv-UHz`i1?(nG&lh`kEdJlP<`jN-UG>F!Z_Kdl zJsA|R)#bMDXc2n$u3nn%$Qjzgp70`we7g|JCjut##L-qiM6G?h7%_xp-Tj-r-$DD{ z7OyI`g?!+0z4Gas%Pr1e$1un)Z^hXAF0Ve;2}>(o{c8&|z=kE4r;AJLSX&MPu?#&K zURD^78{I3)#{b9&Gb+=wYYOMTDsdH@dV~oD1GpAv_`BoOAIM9#70X4(i|;ouuON7? zKK*bdUV2F1#&Ou<#(ctnp+3(;+S%=Kw6AIO)w$n` z#O;Br>$Qdf;A$JM0u1jaIiWkwvm#ZjEadWO;oLdwaT^sJ7Xa+rb~Ec(QYq!HY;&4y zJsPWWMwYOrd;2sOR|IKqTEd=h-$#{d8`O?U-0_Wt?OedsFWn3c>PF>NXXjx|1-&Qb z-b<+9$zl7n7~Z8CS)xv&=xnj0rE3ULzf69U1aDFQGgUgyXh}s{$1Khp6^B`E_L=Bl8=C$aH{^WCdb}&wstQ+z#roJ&-1QolIx*tNH*SDcHa^(HgvE+ZS%iO#!~`UuPY z2q)bOZ-ZLa5vP9|cF(03E<9g*s#AFb#hv%-;aRv0rXr4$g z-o6IKhF&WJq&nI=&3D)CcK4Z@o!qp7?O|mnpjeD-uTw!qdwTgt5k-R6E0kJ3pn0#Y zz)rQSEcXG;Yc{YoU3~sJtzlaC=)fI94rgu%!+M#D8pSSn+9jpP1 zOYL^-{KI;jS|o?#9ftKev`y+wXvVXrsp@#>#4z^HQ?SoPj}sWpx}?wZn%Ak>q*#Oj z3w<_lsp@Sh96~l6c74v8a|tis9jqol0kHg!Ngk%+lH*uRP5HFa1Q0mqXUc71Gy;w>T|oX- zh|f&;iwOuPk-aR|hsSzqquXJ!@%A+whPQ)rcjfKwc&pG^y8mlfR2msv>7|NH7zpj| zR6`qq3!!D<0wN5Kewl1wqKjBjz561#vwP_@{f(Z=-n$O(CFkzk@LIy0a3ZGJfq}v$ zedl()i&#_r{K(m*pgG<|zoN{QeXJ_)0+V7ZCs9K>KXv;MOP0*STEeey(ws$GswmIk zbgf}Xs2(Es5)f_!9w)~d^j-Dz^vafZTGA2F5uxp|AqwC#;$%^lH;24N6_Dt)g;w99 zq1yBE5ep+-YgkhnttSmeA8QIdz$DNfP_XhS#xpl0D4Y>PP8EzR+QN-dRo{y;aN;uK zF=mjYbOdM#gDG75I@dFT5r`{7oxo{=YDFz!Ot<8yR&$_*O31+#0U#q768ec&m`)N- zx+ZxXP_>Nm4yPY~(VRo2C52d^;;d;^n9hJsx+XiHXj;ZYf)j`26-G`%1B{Gw2(dREu z9n(*U{MYJqUEY|olv8y`zDrm^UI{Dq&G{#WMRxB%-69O&^yAb8kq2;Gi^PS5hTrCN zs6&HihVM&mVF&0v97#G>u!S@rZJZi0sQ+BT3DAR8=}4Rwm9gPrvROE38p#%lNZ>hF z`chCR2Ba&H9WE$TjeezxGTB)x9ep8UR+EYyDqreYnOBKK70MY{niuI(#SLvGRg%1_ zqd@F?SVXGaNIW|y^HYH4$L)LViSpJF(yJw?n6OVw=kd*J2;09%_+maq9l`nPF)d*Y zSmL$!=RPAGf|Rn4wa_i8#HkqZ7-^#xLk}hJNXF;caVQkyBY_UIqbkHLD9o`xYUJ3- z8QlR!wMiNr5hH4{P_L8X>3NYOONVRed)INB8;0gL736})OL*K70KCki6Q66OQ4P<< z`6!8U;<@Yf8kTMZ(Mc@R>t~2;UgkkRZ~|woOEcGso8Kgbk*Lq@FxIet8ZJCse6d7( z$Q~=dzg{9b)1A;^X9iA8{3$kIE z`hvYiM9fSmD(eEdbC-*kBh90!<15rwyDfGsN_^tIMWZt}Wr;N28-@L!29A22tVy%f zS5Ks>tfY?R#`fzh-(WfZBQn0a+2UILfRK&L8Ct>}`R4T7E3x{6q61|TuIdLRtRph* zHaplJ7R3W6OT7T)wSk&Ag5A&wgezD{Up?t1-YHFTqt=o=D~ip@E0q;=V(o8|))F6n`|+0Qzd721Hrw@szQzAVtR+_h;)d^-L$!p+-@6Ynmi{T& zzr8$urT#_XjMZ;{cfs^{tzk1b7&I>tROn;lW+GoX%gJ62xi~! z-DU>QqrJKFTEbNDM3|+I4z)cCSV}5I3#*v>-pZ|EC@B<}rk0J&B_$%86|<8S0&qM& zVQtJNO(I=Sy~tIpC8Z-53$|qiaC9$MrL}~a-=X3r9##&&dV!4aTEJDo*GHP%}h;BL&g~kOiu>=^ir*t@b9&N8opD>}hn%Rb zVH0U9ZPk!?6+qZ;R5RxM8akQg)YdN(y@z{w^A~Ff_rVEa&O1_^1jSDHeEz+Cj2eK-4r(8Lw*g$SyS`v_crVGvL_OOzi7o&uFJMm)^gJZ-R(;LgWOh_B*5s5}^ z8_QB`i9Dz$g6!Y6u!|J9&l+Wb=O{~S2y023saU}D(`T5Y@b!KNth#duZ%MS%`o^mq zNhVRwi4dFQ)Y!U0y}2cP$f=j`tiXR>h|!V}VQXeMhYY%q@CG5VK> zmgS#|SU{cyF)T20Tn1h$>^5c+oHsNl8h>jC|Gz`OZ5Na&vdfE(n>(NE^ClRaJ&qf( z2-?B-@7b19z;${G?Y_#v_ix^KewS=vmB5YbZ`fT_y;iVz)Sy?G;i@b_H_x?$-=zb_ zRhlb~eG1RP%JtMsa^~|>4Gx3xe!%~sOG`BAVJ;pf4VIfHvRha{E&FG9Uj_Si{ROrN z7;(67GVqgOPTwz0rx0sfb-Uu*?{3;RAb_XsY#feZ2X7O;x7T5Lte2=KY1rf~-zu3ol56=?s zDBxSjqaEZyP8u(xJwJScT@yV&B$_#1a~?Y!b8J)O+s9$Wn!0JWDm^|9mfd1!r>9^3 zGt=!ZreD8YHy%j%9KN)X=3G{B{G6z*V7cphSC1-ypv;0esMX?8dV#qc*;`;ecpkW+ zUi~s;JfKzT*xcXl3N1Do)(pRasWBJcA?1@SH(7ZyURhX^MiTPmTTVznSp0XaM49Ri zWyG2M^#+o;4h~*r7WnUETET{I*w~*jV>8q8N_<6~uTR-3F&4xG zpjuTx`+X1II|jQRmx=!#};@u#viazyOUhc`!m+ZEnvYZmWW>{ zrGc;Vi(uD_tAzCi(+Oz3KorATFHj*dA~XW{+uy*E*_&}5W(wD+44Alv5$#R`HX_AG zr_q@3{Z$4nFSB<09LWmw{xf1a;E|r6%4G1XIo_Z0X%>p!Y)SsBd9fzV#st&iEUk^? z%|ic#Zzeimb3`><_ONF3&Nb3{fNd``JUi3kPxj%QM|yv0@g~`RyiYLL_#A;Z6zfNh z^$r*EKTGgR8{|GR2RE%KeCvxgy1b~ZVE`$_d8=aHm87@HZ5=-$#T||?+Sb#J<;{rj z!?TU$X4Pkeyw8%{?&U`t${sg&6cgO({MQieVEXs{JRjn)dsskPbepF`jP^LgsB}Bi z=+HO@8-eNQXeSeDsLu5F)E>EmN^rVdJC+ii>F21gzhvKBlV!C|o42QWqD+5(IeK+E zFB{L!)p~OJWLh~MnV0E$aXM*QjZQ7WIE7NBGlB6W5>vPgnH4HB1;oK=$QTk(2gXhm zU?UJ!CKWY01X0+)%C&=R?@RaIk!w zOok{Jd7v|#&V9zy9q_rb^w_~tFcMrst23PoCR!&tR!{b__Vb-ifT_kVPC4UfK?M;Y z4tuvaQDX&Oz_PnI5Loax=rrQI2W%2Ux4o7BFh@i3HP~Wn8%Nekqhkc>~3#_xrd{ zNH(ZQf@h#Pmfsb)#$(FK@GzSv>`6UmL+LG1XWvZZ2Wd5rmN$&Jd15vQIsJa4#C&TQ zJ0=K^h+>LThXQA5Y%emA_V@nuyuQ-{*6xgnv4fXjBzU$iAuld!`%KL^Fk_mQ1E@{~ zpA)2TI)>nCVLMPYj2gcE65Tsi2K_PCX7s{a7&W#7mldaHI*hXtev*#hGsElKPNX;y zFgG))E`Ddy&5RkQlaCkG!BO5o@o9bi`aLsyJEhXEapM+Avr?rx%7=KZ9y8~_#nHhf6^5p}ileA_ShY! zk?J*A;#>Yxze9_pJaM!cL&h*e;&47Cf$JN9%ZN-iff2xlgyEJfVDKuwJ(Hh6jNr9m zkX9f^a5R3U!VG4tSh0h@VA~Pg9>kXc%Zo%DfhoZAVqmwC{P?-88_4?*%19t%a3wq< zm0F;gc8r+F&Q}8#ud_9GrHmg#2FA#U&fqhxQK7)-#KCSP7}JcJ)d2#-*^W0q7Xbxw zpo6@D{NDop6>=c2-isrUCgQ92&_duy_5MT<-n60fOUlYQ0Cai%P~3m4Nu0;@+d`MXXnlLehGVxfZFOL{vcAYG;tXk7emzS zN+=%iu=P4pjt%-i2o(weLZN^(R3iKW&g#3`ukZ=V9;SL&PVsracBa}x)X=rRuPm5I zx9j((Bt13C5<{A7VJlb(f0{;pif9#&oI?cM`go=rrDCD# zOJ)`-h@Pb0Vl7vxLYT`<>MZ6$)Ov_%l(e3rHg7{{!`8WUpFaw4B(OImJwt5TJ24^> zE0-Lf!6UqZ*Wdm8E3d#ry%I{M%-%$5{0S}ukDiSc9rnkVe?%ujP3uY@I7O862V9Vp zSoLCZmU5f;98_;0Z(-pQ^5n#RP$98|DBrx}hGh0$q0(|nF@jDFq9--cJ;(PgW9--QJ)}j{k$%tU$j^I5Unlc`tZh33b-QLY^i38Zd?^Sv+ zgbei%)Cp)kLX87jk5EBD7NgVm&}FFf_tYV3Jv?m~#ui2C=jd8bPVq*4=UJH2^00Uf zdoYCK!1RP=y^I*U0w=~0lwkCN4^II|mYQCj{*kRTy*w2qT4@m+40WcLr-r2~Q8^x! zEd+?}1C4WYoA`r4FHWOOZMeY@L@8qi48VD@WG0uVRi+uF8%U~pK}RQ4VPRCGldB9w zT8>Vmq4;%9#tgl#IHE0baY2a-RmsK%B&`~Oi%D|gMw=XA(PAaZz6L1qlEyG41xWg6 znP`#p%K+JSB#))F`AHW4ZSn}IA+I2Kum1gbp4Ep_oF>xBMnDZJ*o+Au?PSJXDRw#x z$m#W^52zxuwktZ;qDN!Ugs&b9W7QV@ov^XJB!b2ZXMV#TErHh>#zMGzX`fQ_y*aze zm%e@IpZLc&cE$`jgVNW&ERPEq;OgaX;}@;l7&S%@&s^IifPsUf0H^|=Hx0g ze*v$pv)K=qvK~n=+&#nQ;!zvP(N4IYKClOD$(QD=EQK1-i!6^tBX z2Wp1U2PDaG9C(6fGsw>nrqw1}%j#S6&3kIbT?pb%@>p)&p)@sia{A9IPVzp*^|#jw z_|`Ce8~~R)vm3Gl)%X09mB9HcMO2;I@*v+se;f{=V;0SWx~R}O3S zb~{>jcp=1IjWg8|9m|UUf<<`)#JGREgm+q+oPM;C~kQd^(`#WXN zN?cP+?4Ga#Mcr~Z;42tFRtyahwHIu!Jp0Zbg{0|Y2tdJk@do0hE(1c*N|q-4=4|=#ePmu;wy8?c{MesWcaWb(}8uCP;z?OHiN z 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

!QD{&Iz6yUtDu=wTI)#1x23ro4n-$ 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 diff --git a/daemon.lst b/daemon.lst deleted file mode 100644 index d2a5a9d..0000000 --- a/daemon.lst +++ /dev/null @@ -1 +0,0 @@ -(0): error: Error opening file: daemon.asm diff --git a/data.asm b/data.asm new file mode 100644 index 0000000..6187425 --- /dev/null +++ b/data.asm @@ -0,0 +1,124 @@ +;[]=========================================================================[] +;[] ╨Ф╨░╨╜╨╜╤Л╨╡ ╨╝╨╛╨╜╨╕╤В╨╛╤А╨░-╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ DemoN [] +;[] v0.01 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 10.10.2004 [] +;[] v0.02 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 11.03.2005 [] +;[] v0.03 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 05.02.2006 [] +;[] v0.10 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 10.09.2006 [] +;[]=========================================================================[] + +SymbolNoPrint + DB 0xB0;"." ; ╤Б╨╕╨╝╨▓╨╛╨╗╤Л < ╨┐╤А╨╛╨▒╨╡╨╗╨░ +ClockOn DB On ; ╨┐╤А╨╕╨╖╨╜╨░╨║ ╨▓╤Л╨▓╨╛╨┤╨░ ╤З╨░╤Б╨╛╨▓ +DemonScreen DB 0 ; ╨╜╨╛╨╝╨╡╤А ╤Н╨║╤А╨░╨╜╨░ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ +OSScreen DB 0 ; ╨Э╨╛╨╝╨╡╤А ╤Н╨║╤А╨░╨╜╨░ ╨Ю╨б╨╕ +OSGrafMode DB 0 ; ╨У╤А╨░╤Д╨╕╤З╨╡╤Б╨║╨╕╨╣ ╤А╨╡╨╢╨╕╨╝ ╨╛╤Б╨╕ +BufPage DB 255 ; ╨Э╨╛╨╝╨╡╤А ╤Б╤В╤А╨░╨╜╨╕╤Ж╤Л ╤Б ╨╛╨║╨╛╨╜╨╜╤Л╨╝ ╨▒╤Г╤Д╨╡╤А╨╛╨╝ + +Hello DB "\r\n" +; DB "╨Т╨╡╤А╤Б╨╕╤П ╨╛╤В╨║╨╛╨╝╨┐╨╕╨╗╨╕╤А╨╛╨▓╨░╨╜╨░ ╤Б╨┐╨╡╤Ж╨╕╨░╨╗╤М╨╜╨╛ ╨┤╨╗╤П ╨Т╨░╤Б╨╕╨╗╨╕╤П ╨Ш╨▓╨░╨╜╨╛╨▓╨░!",13,10,10 + IFDEF DSS_1_70 + DB "Demon for DSS 1.70+ v" + ELSE + DB "DemoN v" + ENDIF + INCBIN "VERSION/major.bin" + DB "." + INCBIN "VERSION/minor.bin" + DB " build " + INCBIN "VERSION/build.bin" + DB " (alpha) \r\n" + DB "Last edition " + INCBIN "VERSION/date.bin" + DB " (BLR " + INCBIN "VERSION/time.bin" + DB ")\r\n" + DB "FidoNet: Igor Zhadinets 2:454/5.18; " + DB "e-mail: igor_ast@tut.by",13,10,10,0 +Str: +.Load DB "Load file ...\r\n",0 +.DA DB "\r\n",0 + +PauseFlash EQU 16 ; ╤З╨░╤Б╤В╨╛╤В╨░ ╨╝╨╕╨│╨░╨╜╨╕╤П ╨┐╤А╨╛╨│╤А.╨║╤Г╤А╤Б╨╛╤А╨░ + +Color: +.Screen DB 00000111b ; ╨╛╤Б╨╜╨╛╨▓╨╜╨╛╨╣ ╤Ж╨▓╨╡╤В ╤Н╨║╤А╨░╨╜╨░ +.Border DB 00000011b ; ╤Ж╨▓╨╡╤В ╤А╨░╨╝╨║╨╕ +.TextStrReg DB 00000010b ; ╤Ж╨▓╨╡╤В ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╤Е ╨┐╨░╤А +.TextStrWin DB 00000101b ; ╤Ж╨▓╨╡╤В ╨╜╨╛╨╝╨╡╤А╨╛╨▓ ╨╛╨║╨╛╨╜ +._SP DB 00000110b ; ╨┐╨╛╨┤╤Б╨▓╨╡╤В╨║╨░ ╨▓╨╡╤А╤И╨╕╨╜╤Л ╤Б╤В╨╡╨║╨░ +._PC DB 01110001b ; ╨┐╨╛╨┤╤Б╨▓╨╡╤В╨║╨░ ╨▓╤Л╨┐╨╛╨╗╨╜╤П╨╡╨╝╨╛╨╣ ╤Б╤В╤А. +.RezArea DB 00001110b ; ╨┐╨╛╨┤╤Б╨▓╨╡╤В╨║╨░ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ +.TextStrLogo + DB 00000100b ; ╤Ж╨▓╨╡╤В ╨╗╨╛╨│╨╛ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л +.Cursor DB 00011101b ; ╤Ж╨▓╨╡╤В ╨║╤Г╤А╤Б╨╛╤А╨░-╤Г╨║╨░╨╖╨░╤В╨╡╨╗╤П +.InLine DB 00111111b ; ╤Ж╨▓╨╡╤В ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ +.InLineEd DB 00110001b ; ╤Ж╨▓╨╡╤В ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ ╨┐╤А╨╕ ╤А╨╡╨┤. + +StackDebug DS 2 ; ╨░╨┤╤А╨╡╤Б ╤Б╤В╨╡╨║╨░ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ +BankDebug DS 1 ; ╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ +BankOS DS 1 ; ╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╤Б OS +RezAdr DW 0x7000 ; ╨░╨┤╤А╨╡╤Б ╨┐╨╛╤Б╨░╨┤╨║╨╕ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ +StackDown DS 1 ; ╨│╨╗╤Г╨▒╨╕╨╜╨░ ╤Б╤В╨╡╨║╨░ +StackDump DW 0x800A ; ╨╜╨░╤З╨░╨╗╨╛ ╨┤╨░╨╝╨┐╨░ ╤Б╤В╨╡╨║╨░ + +Reg: ; ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╤Е ╨┐╨░╤А +._IX DW 0 +._IY DW 0 +._HL DW 0 +._DE DW 0 +._BC DW 0 +._AF DW 0 +._HL_ DW 0 +._DE_ DW 0 +._BC_ DW 0 +._AF_ DW 0 +._IR DW 0 +._SP DW 0x7FFE +._PC DW 0 + +WinPage: DB 0xFF,0xFF,0xFF,0xFF ; ╨░╨┤╤А╨╡╤Б╨░ ╨┐╨╛╨┤╨║╨╗╤О╤З╨╡╨╜╨╜╤Л╤Е ╤Б╤В╤А╨░╨╜╨╕╤Ж + +Dump1 DW 0x4000 ; ╨░╨┤╤А╨╡╤Б ╨╜╨░╤З╨░╨╗╨░ ╨┤╨╕╨╜╨░╨╝╨╕╤З╨╡╤Б╨║╨╛╨│╨╛ ╨┤╨░╨╝╨┐╨░ +Dump: ; ╨░╨┤╤А╨╡╤Б╨░ ╨╜╨░╤З╨░╨╗╨░ ╤Б╤В╤А╨╛╨║ ╨┤╨░╨╝╨┐╨░ + DW KEYB.InputLine.Buffer;0x4100 + DW KEYB.InputLine.Buffer+16;0x8100 + DW KEYB.PutCode.Buffer;0xC100 + DW 0x5280 + DW 0x9280 + DW 0xD280 + DW 0x6000 + DW 0xA000 + +ListAddr DS 40 ; ╨▒╤Г╤Д╨╡╤А ╤Е╤А╨░╨╜╨╡╨╜╨╕╤П ╨░╨┤╤А╨╡╤Б╨╛╨▓ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ +ListFormat DB -1 ; ╤Д╨╛╤А╨╝╨░╤В╨╜╤Л╨╣ ╨▓╤Л╨▓╨╛╨┤ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + ; -1 - ╨┤╨░; 0 - ╨╜╨╡╤В + +DecHex DB 0 ; 0-HEX FF-DEC ╤Б╨╕╤Б╤В╨╡╨╝╨░ + +;======== ╨Ъ╨╛╨╜╤Б╤В╨░╤В╨╜╤В╤Л ====== +On EQU 0xFF +Off EQU 0 +Ins EQU 0 +Ovr EQU 0xFF +SysSymb EQU 0x1B ; ╤Б╨╕╤Б╤В╨╡╨╝╨╜╤Л╨╣ ╨╖╨╜╨░╨║╨╛╨│╨╡╨╜╨╡╤А╨░╤В╨╛╤А + +;╨┐╨╡╤З╨░╤В╤М ╤З╨╡╤А╨╡╨╖ ╨┐/╨┐ ╨▒╨╕╨╛╤Б╨░ + IFDEF D_PRINTCH_BIOS +Demon.Bios_Win + DB 0 ; ╨╕╨┤╨╡╨╜╤В╨╕╤Д╨╕╨║╨░╤В╨╛╤А ╨╛╨║╨╜╨░ ╨▒╨╕╨╛╤Б╨░ +MainWin DB 80,32,0,0,00110000b,0,0,0 + DS 26,0 + ENDIF + +;-------------------------------------- +;╨Ф╨╕╨░╨╗╨╛╨│╨╛╨▓╨╛╨╡ ╨╛╨║╨╜╨╛ ╨┤╨╗╤П ╨┐╨┐ ╨▓╤Л╤Е╨╛╨┤╨░ +;-------------------------------------- +ExitDlg DB 6,22,13,32,6,#40 + DB "Confirmation",0 + DB " You really want to quit?" + DB 0x16,32,17,"OK Cancel",0 + DB 2 + DB 29,17,8,2 ;Ok + DW 0,0 + DB 39,17,8,2 ;Cancel + DW 0,KEYB.Keyb.NoExit \ No newline at end of file diff --git a/demon.asm b/demon.asm new file mode 100644 index 0000000..73bbd3b --- /dev/null +++ b/demon.asm @@ -0,0 +1,442 @@ +;[]=========================================================================[] +;[] ╨Ь╨╛╨╜╨╕╤В╨╛╤А-╨╛╤В╨╗╨░╨┤╤З╨╕╨║ DemoN [] +;[] v0.01 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 10.10.2004 [] +;[] v0.02 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 07.02.2005 [] +;[] v0.03 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 11.03.2006 [] +;[] v0.10 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 27.08.2006 [] +;[]=========================================================================[] + + ;DEVICE ZXSPECTRUM128 + + DEVICE NOSLOT64K + + SLDOPT COMMENT WPMEM, LOGPOINT, ASSERTION + +; define DEBUG 1 ;╨╛╤В╨║╤А╤Л╤В╨╕╨╡ ╨┤╨╡╨▒╨░╨│╨│╨╡╤А╨╜╤Л╤Е ╨╖╨░╨│╨╗╤Г╤И╨╡╨║ +; define D_PRINTCH_BIOS 1 + + DEFINE DSS_1_70 + ;DEFINE DBG ; For debug with DeZog + + ; TODO: Set cur_dir for loaded exe + + IFDEF DBG + INCLUDE "dss.asm" + DB 0 + ALIGN 16384, 0 + DS 0x80, 0 + ENDIF + + + + ORG 0x7F00 ; 0x8100-512 + +; ------------------------------------------------------ + +STARTPRG + DB "EXE" ; EXE ID + IFDEF DSS_1_70 + DB 0x01 ; EXE VERSION + ELSE + DB 0x00 + ENDIF + DW 0x0200 ; CODE OFFSET LOW + DW 0x0000 ; CODE OFFSET HIGH + DW 0x0000 ; END-BEG ;PRIMARY LOADER + DW 0x0000 ; + DW 0x0000 ; RESERVED + DW 0x0000 ; + DW OrgAdr ; LOAD ADDRESS + DW OrgAdr ; START ADDRESS + DW 0xC001 ; STACK ADDRESS +ExeFiller + IFDEF DBG + DS 106,0 + ELSE + DS OrgAdr-ExeFiller,0 + ENDIF + + ORG 0x8100 +@STACK_TOP ; for DeZog internal sim + +OrgAdr +; stack 0xC001 + IFDEF DBG + LD SP, STACK_TOP + LD IX,CMD_LINE1 + ENDIF + + push ix ; ╨░╨┤╤А╨╡╤Б ╨║╨╛╨╝╨░╨╜╨┤╨╜╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕ + in a,(EmmWin.P2) ; ╨▒╨░╨╜╨║╨░ ╤Б ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨╛╨╝ + ld (BankDebug),a + in a,(EmmWin.P0) ; ╨▒╨░╨╜╨║╨░ ╤Б OS + ld (BankOS),a +; ld (WinPage),a + +; ld (Reg._SP),sp ; ╨░╨┤╤А╨╡╤Б ╤Б╤В╨╡╨║╨░ + call SaveAllRegs ; ╤Б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╤Е ╨┐╨░╤А +; ld a,(BankDebug) + ld a,0xFF ; ╤Б╨║╤А╤Л╨▓╨░╨╡╨╝ ╨▒╨░╨╜╨║╤Г ╤Б ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨╛╨╝ + ld (WinPage+2),a + INCLUDE "cmdline.asm" + call nc,LoadFile + jp Start + +HorizLine DB 8 ; ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╨╗╨╕╨╜╨╕╨╣ + ;1-╨┤╨╗╨╕╨╜╨░ 2-╤Б╤В╨╛╨╗╨▒╨╡╤Ж 3-╤Б╤В╤А╨╛╨║╨░ 4-╤Б╨╕╨╝╨▓╨╛╨╗ + DB 0x4E,0x01,0x00,0xCD, 0x17,0x01,0x03,0xC4 + DB 0x17,0x01,0x09,0xC4, 0x17,0x01,0x0F,0xC4 + DB 0x17,0x01,0x11,0xCD, 0x4E,0x01,0x15,0xCD + DB 0x4E,0x01,0x1E,0xCD, 0x17,0x01,0x13,0xCD + +VerticalLine + DB 5 ; ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╨╗╨╕╨╜╨╕╨╣ + ;1-╨▓╤Л╤Б╨╛╤В╨░ 2-╤Б╤В╨╛╨╗╨▒╨╡╤Ж 3-╤Б╤В╤А╨╛╨║╨░ 4-╤Б╨╕╨╝╨▓╨╛╨╗ + DB 0x1D,0x00,0x01,0xBA, 0x10,0x09,0x01,0xB3 + DB 0x08,0x0C,0x16,0xBA, 0x14,0x18,0x01,0xBA + DB 0x1D,0x4F,0x01,0xBA + +Corner DB 41 ; ╤Г╨│╨╗╤Л ╤А╨░╨╝╨╛╨║ + ;1-╤Б╤В╨╛╨╗╨▒╨╡╤Ж 2-╤Б╤В╤А╨╛╨║╨░ 3-╤Б╨╕╨╝╨▓╨╛╨╗ + DB 0x00,0x00,0xC9, 0x00,0x03,0xC7, 0x00,0x09,0xC7 + DB 0x00,0x0F,0xC7, 0x00,0x11,0xCC, 0x00,0x15,0xCC + DB 0x00,0x1E,0xC8, 0x06,0x11,0xD1, 0x06,0x13,0xCF + DB 0x09,0x00,0xD1, 0x09,0x03,0xC5, 0x09,0x09,0xC5 + DB 0x09,0x0F,0xC5, 0x0C,0x11,0xD1, 0x0C,0x15,0xCB + DB 0x0C,0x1E,0xCA, 0x12,0x0F,0xC2, 0x12,0x11,0xD8 + DB 0x12,0x13,0xCF, 0x18,0x00,0xCB, 0x18,0x03,0xB6 + DB 0x18,0x09,0xB6, 0x18,0x0F,0xB6, 0x18,0x15,0xCA + DB 0x00,0x13,0xCC, 0x0C,0x13,0xCF, 0x4F,0x00,0xBB + DB 0x18,0x13,0xB9, 0x4F,0x15,0xB9, 0x4F,0x1E,0xBC + DB 0x18,0x11,0xB9, 0x06,0x12,0xB3, 0x12,0x10,0xB3 + DB 0x12,0x12,0xB3, 0x09,0x13,0xD1, 0x09,0x14,0xB3 + DB 0x09,0x15,0xCF, 0x0C,0x12,0xB3, 0x0E,0x13,0xCB + DB 0x0E,0x14,0xBA, 0x0E,0x15,0xCA + +TextStrReg DB 0x16,0x01,0x01,"IX", 0x16,0x01,0x02,"IY" + DB 0x16,0x01,0x04,"HL", 0x16,0x01,0x05,"DE" + DB 0x16,0x01,0x06,"BC", 0x16,0x01,0x07,"AF" + DB 0x16,0x01,0x0A,"HL'", 0x16,0x01,0x0B,"DE'" + DB 0x16,0x01,0x0C,"BC'", 0x16,0x01,0x0D,"AF'" + DB 0x16,0x01,0x10,"PC", 0x16, 0x0A,0x10,"IR" + DB 0x16,0x01,0x14,"SP",0 +TextStrLogo DB 0x016,0x01,0x1F,0xC4,0xCD,0xCD + DB " DemoN v" + INCBIN "VERSION/major.bin" + DB "." + INCBIN "VERSION/minor.bin" + DB " build " + INCBIN "VERSION/build.bin" + DB " (alpha)-" + INCBIN "VERSION/date.bin" + DB " Igor by AlphA Studio, Hard/WCG" + DB 0x20,0xCD,0xCD,0xC4,0x00 +TextStrWin DB 0x16,0x02,0x11," 0 ",0x16,0x08,0x11," 1 " + DB 0x16,0x0E,0x11," 2 ",0x16,0x14,0x11," 3 ",0 +TextStrRez DB 0x16,0x0F,0x14,"REZ",0 + +; ------------------------------------------------------ +; ╨Я╤А╨╛╤Ж╨╡╨┤╤Г╤А╨░ ╨┐╤А╨╛╤А╨╕╤Б╨╛╨▓╨║╨╕ ╨╗╨╕╨╜╨╕╨╣ +; HL - ╨░╨┤╤А╨╡╤Б ╨╜╨░╤З╨░╨╗╨░ ╤В╨░╨▒╨╗╨╕╤Ж╤Л +; ------------------------------------------------------ +DrawLine ld c,(hl) ; ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╨╗╨╕╨╜╨╕╨╣ + inc hl + ld b,(hl) ; ╨┤╨╗╨╕╨╜╨░ ╨╗╨╕╨╜╨╕╨╕ + inc hl + ld e,(hl) ; ╤Б╤В╨╛╨╗╨▒╨╡╤Ж + inc hl + ld d,(hl) ; ╤Б╤В╤А╨╛╨║╨░ + inc hl + ld a,(hl) ; ╤Б╨╕╨╝╨▓╨╛╨╗ + push hl +.L1 push bc + push af + ld bc,Dss.WrChar ; ╤Ж╨▓╨╡╤В ╨▓ ╤А╨╡╨│.B + rst DssRst + inc d ; ╨╜╨░╤А╨░╤Й╨╕╨▓╨░╨╜╨╕╨╡ ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л + pop af + pop bc + djnz .L1 + pop hl + dec c + jr nz,DrawLine+1 + ret +; ------------------------------------------------------ +; ╨Э╨░╤З╨░╨╗╨╛ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л +; ------------------------------------------------------ +Start: + ld hl,Hello ; ╤Б╨╛╨╛╨▒╤Й╨╡╨╜╨╕╨╡ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л + ld c,Dss.PChars ; ╨▓╤Л╨▓╨╡╤Б╤В╨╕ ╤Б╤В╤А╨╛╨║╤Г + rst DssRst + ld c,Dss.GetVMod ; ╨в╨╡╨║╤Г╤Й╨╕╨╣ ╨│╤А╨░╤Д ╤А╨╡╨╢╨╕╨╝ + rst DssRst + jp c,Exit + ld (OSGrafMode),a + ld a,b + ld (OSScreen),a ; ╨╕ ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ ╤Н╨║╤А╨░╨╜╨░ + push bc + ld bc,#0100+Dss.GetMem ; ╤А╨╡╨╖╨╡╤А╨▓╨╕╤А╤Г╨╡╨╝ 1 ╤Б╤В╤А╨░╨╜╨╕╤Ж╤Г ╨┤╨╗╤П ╨╛╨║╨╛╨╜╨╜╨╛╨│╨╛ ╨▒╤Г╤Д╨╡╤А╨░ + rst DssRst + pop de ; ╨Т D - ╨╜╨╛╨╝╨╡╤А ╤Б╤В╤А╨░╨╜╨╕╤Ж╤Л ╤Н╨║╤А╨░╨╜╨░ - OSScreen + jp c,Exit ; ╨Ю╤И╨╕╨▒╨║╨░ ╨▓╤Л╨┤╨╡╨╗╨╡╨╜╨╕╤П ╨▒╨╗╨╛╨║╨░ ╨┐╨░╨╝╤П╤В╨╕ + ld (BufPage),a ; ╨б╨╛╤Е╤А╨░╨╜╨╕╨╝ ╤Б╤В╤А╨░╨╜╨╕╤Ж╤Г ╨▓ ╨┐╨╡╤А╨╡╨╝╨╡╨╜╨╜╨╛╨╣ + ld b,a + ld a,(DemonScreen) + cp d ; ╨╡╤Б╨╗╨╕ ╤Н╨║╤А╨░╨╜╤Л ╨Ю╨б ╨╕ ╨Ф╨╡╨╝╨╛╨╜╨░ ╨╜╨╡ ╤Б╨╛╨▓╨┐╨░╨┤╨░╤О╤В + jr nz,StartNext ; ╤В╨╛ ╨╕ ╨╜╨╡ ╤Б╨╛╤Е╤А╨░╨╜╤П╨╡╨╝ ╤Н╨║╤А╨░╨╜ ╨Ю╨б╨╕ + ld de,0 ; ╨б╨╛╤Е╤А╨░╨╜╤П╨╡╨╝ ╤Н╨║╤А╨░╨╜ ╨▓ ╨┤╨╛╨┐.╤Б╤В╤А╨░╨╜╨╕╤Ж╨╡ + ld hl,#2050 + ld ix,#c000 + ld c,Dss.WinCopy + rst DssRst + +StartNext ld a,(DemonScreen) ; ╤Н╨║╤А╨░╨╜ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ + ld b,a + ld a,3 ; ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М ╤А╨╡╨╢╨╕╨╝ 80╤Е32 + ld c,Dss.SetVMod ; Dss.SelPage +; ld bc,0x0054 + rst DssRst + ifdef D_PRINTCH_BIOS + ld ix,MainWin ; ╨Ю╤В╨║╤А╤Л╤В╨╕╨╡ ╨╛╨║╨╜╨░ ╤З/╨╖ ╨▒╨╕╨╛╤Б + ld e,00010001b + rst BiosRst + ld (Demon.Bios_Win),a +; jr nc,.lp1 +; ld c,Dss.EchoKey ; ╨┤╨╡╨▒╤Г╨│╨│╨╡╤А╨╜╨░╤П ╨╖╨░╨│╨╗╤Г╤И╨║╨░ +; rst DssRst + + endif + +.lp1 +; ld a,(Color._SP) ; ╨┐╨╛╨┤╤Б╨▓╨╡╤В╨║╨░ ╨▓╨╡╤А╤И╨╕╨╜╤Л ╤Б╤В╨╡╨║╨░ +; ld b,a +; ld de,0x1C01 +; ld hl,0x010B +; ld a," " +; ld c,Dss.Clear +; rst DssRst + call ClearScreen + call DrawDemonScreen + +; ld c,Dss.EchoKey ; ╨┤╨╡╨▒╤Г╨│╨│╨╡╤А╨╜╨░╤П ╨╖╨░╨│╨╗╤Г╤И╨║╨░ +; rst DssRst + + jp Start1 + +; ------------------------------------------------------ +; ╨Ю╨▒╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╡ ╤Н╨║╤А╨░╨╜╨░ ╨┤╨╡╨╝╨╛╨╜╨░ +; ------------------------------------------------------ +RefreshScreen + call CursorRes + call ClearScreen + call DrawDemonScreen + call Refresh + call KEYB.Cursor ; ╨▓╨║╨╗ ╨║╤Г╤А╤Б╨╛╤А + jp CursorSet + +; ------------------------------------------------------ +ClearScreen ld a,(Color.Screen) + ld b,a ; ╨╛╤З╨╕╤Б╤В╨║╨░ ╤Н╨║╤А╨░╨╜╨░ + ld de,0 + ld hl,0x2050 + ld c,Bios.Lp_Cls_Win + rst BiosRst + ret + +; ------------------------------------------------------ +DrawDemonScreen + ld a,(Color.Border) ; ╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ ╤Ж╨▓╨╡╤В╨░ ╤А╨░╨╝╨║╨╕ + ld (DrawLine.L1+4),a + ld (DrawCorner+10),a + ld a,0x14 ; ╨║╨╛╨┤ ╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║╨╕ INC D + ld (DrawLine.L1+6),a + + ld hl,VerticalLine ; ╨▓╨╡╤А╤В╨╕╨║╨░╨╗╤М╨╜╤Л╨╡ ╨╗╨╕╨╜╨╕╨╕ + call DrawLine + + ld hl,HorizLine ; ╨│╨╛╤А╨╕╨╖╨╛╨╜╤В╨░╨╗╤М╨╜╤Л╨╡ ╨╗╨╕╨╜╨╕╨╕ + ld a,0x1C ; ╨║╨╛╨┤ ╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║╨╕ INC E + ld (DrawLine.L1+6),a + call DrawLine + + ld hl,Corner + ld b,(hl) ; ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╤Г╨│╨╗╨╛╨▓ +DrawCorner push bc + inc hl + ld e,(hl) ; ╤Б╤В╨╛╨╗╨▒╨╡╤Ж + inc hl + ld d,(hl) ; ╤Б╤В╤А╨╛╨║╨░ + inc hl + ld a,(hl) ; ╤Б╨╕╨╝╨▓╨╛╨╗ + push hl + ld bc,Dss.WrChar ; ╤Ж╨▓╨╡╤В ╨▓ ╤А╨╡╨│.B + rst DssRst + pop hl + pop bc + djnz DrawCorner + + ld hl,TextStrReg + ld a,(Color.TextStrReg) ; ╤Ж╨▓╨╡╤В ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╤Е ╨┐╨░╤А + ld (PrnStrColor.L1+5),a + call PrnStrColor + ld hl,TextStrWin + ld a,(Color.TextStrWin) ; ╤Ж╨▓╨╡╤В ╨╜╨╛╨╝╨╡╤А╨╛╨▓ ╨╛╨║╨╛╨╜ + ld (PrnStrColor.L1+5),a + call PrnStrColor + ld hl,TextStrLogo + ld a,(Color.TextStrLogo) ; ╤Ж╨▓╨╡╤В ╨╗╨╛╨│╨╛ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л + ld (PrnStrColor.L1+5),a + call PrnStrColor + ld hl,TextStrRez + ld a,(Color.RezArea) ; ╤Ж╨▓╨╡╤В ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + ld (PrnStrColor.L1+5),a + call PrnStrColor + ret + ds OrgAdr+0x700-$ + +; ------------------------------------------------------ +Start1: + call KEYB.PreparChar ; ╨┐╨╛╨┤╨│╨╛╤В╨╛╨▓╨║╨░ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╨╜╨╛╨│╨╛ ╨║╤Г╤А╤Б╨╛╤А╨░ ╨▓╨▓╨╛╨┤╨░ +; ld hl,(Reg._PC) +; ld hl,0 +; ld (ListAddr),hl + + call Refresh + call KEYB.Keyb + +; ------------------------------------------------------ +Exit: + ld hl,(KEYB.Rst38.Vect+1) ; ╨▓╨╛╤Б╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╡ ╨▓╨╡╨║╤В╨╛╤А╨░ DSS + ld (0039h),hl + + ld a,(OSScreen) ; ╨╕ ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ ╤Н╨║╤А╨░╨╜╨░ + ld b,a + push bc + ld a,(OSGrafMode) + ld c,Dss.SetVMod + +; ld bc,0x0100+Dss.SelPage ;╨▓╨╛╤Б╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╡ ╤Н╨║╤А╨░╨╜╨░ DSS + rst DssRst + pop bc + ld a,(DemonScreen) + cp b + jr nz,ExitNext + ld de,0 ; ╨Т╨╛╤Б╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ ╤Н╨║╤А╨░╨╜ ╨╕╨╖ ╨┤╨╛╨┐.╤Б╤В╤А╨░╨╜╨╕╤Ж╤Л + ld hl,#2050 + ld ix,#c000 + ld c,Dss.WinRest + ld a,(BufPage) + push af + ld b,a + rst DssRst + pop af + ld c,Dss.FreeMem ; ╨Ю╤В╨┤╨░╨╡╨╝ ╤Б╤В╤А╨░╨╜╨╕╤Ж╤Г ╨▒╤Г╤Д╨╡╤А╨░ ╨╛╨▒╤А╨░╤В╨╜╨╛ ╨Ю╨б╨╕ + rst DssRst + +ExitNext + ld bc,Dss.Exit ; ╨╜╨╛╤А╨╝╨░╨╗╤М╨╜╨╛╨╡ ╨╖╨░╨▓╨╡╤А╤И╨╡╨╜╨╕╨╡ + rst DssRst +Return ret + +; ------------------------------------------------------ +Refresh + di + ld de,0x0104 ; ╨▓╤Л╨▓╨╛╨┤ ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╣ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓ + ld hl,(Reg._IX) + call PrintStrReg + ld de,0x0204 + ld hl,(Reg._IY) + call PrintStrReg + ld de,0x0404 + ld hl,(Reg._HL) + call PrintStrReg + ld de,0x0504 + ld hl,(Reg._DE) + call PrintStrReg + ld de,0x0604 + ld hl,(Reg._BC) + call PrintStrReg + ld de,0x0A04 + ld hl,(Reg._HL_) + call PrintStrReg + ld de,0x0B04 + ld hl,(Reg._DE_) + call PrintStrReg + ld de,0x0C04 + ld hl,(Reg._BC_) + call PrintStrReg + ld de,0x0704 + ld hl,(Reg._AF) + call PrintStrAF + ld de,0x0D04 + ld hl,(Reg._AF_) + call PrintStrAF + ld de,0x1004 + ld hl,(Reg._PC) + call PrintReg + ld de,0x100D + ld hl,(Reg._IR) + call PrintReg + ld de,0x1404 + ld hl,(Reg._SP) + call PrintReg + call PrintSPDn + ld de,0x1413 + ld hl,(RezAdr) + call PrintReg + + call PrintStrWin ; ╨▓╤Л╨▓╨╛╨┤ ╨╜╨╛╨╝╨╡╤А╨╛╨▓ ╨▒╨░╨╜╨╛╨║ ╨▓ ╨╛╨║╨╜╨░╤Е + + call PrintStrSP ; ╨▓╤Л╨▓╨╛╨┤ ╨┤╨░╨╝╨┐╨░ ╤Б╤В╨╡╨║╨░ + + call PrintDump + ei + jp DisAsm + +DemonHelp call CursorRes + ld ix,HelpWnd + jp DialogWindow + +; ld hl,HelpWndDlg +; jp WinDialog +HelpWnd DB 6,16,11,42,7,#27 + DB "DemoN Help Page",0 + DB " DemoN v" + INCBIN "VERSION/major.bin" + DB "." + INCBIN "VERSION/minor.bin" + DB " build " + INCBIN "VERSION/build.bin" + DB " (alpha)-" + INCBIN "VERSION/date.bin" + DB 0x0D + DB " Igor by AlphA Studio, Hard/WCG",0x0D,0x0D + DB " OK",0 +HelpWndDlg DB 1 ; ╨Ю╨┐╨╕╤Б╨░╤В╨╡╨╗╤М ╨┤╨╕╨░╨╗╨╛╨│╨╛╨▓╨╛╨│╨╛ ╨╛╨║╨╜╨░ + DB 16+19,16,4,2 + DW 0,0 + + INCLUDE "EQU/dss_equ.asm" + INCLUDE "EQU/bios_equ.asm" + INCLUDE "EQU/port.asm" + INCLUDE "disasm.asm" + INCLUDE "util.asm" + INCLUDE "file.asm" + INCLUDE "error.asm" + INCLUDE "clock.asm" + + INCLUDE "keyb.asm" + INCLUDE "kreg.asm" + + INCLUDE "kstack.asm" + INCLUDE "kdump.asm" + INCLUDE "rez.asm" + INCLUDE "step.asm" + INCLUDE "savescr.asm" + INCLUDE "data.asm" + INCLUDE "tabl.asm" + INCLUDE "loadbin.asm" + INCLUDE "windows.asm" + +EndOfDaemon + ;savebin "demon.exe",STARTPRG,EndOfDaemon-STARTPRG \ No newline at end of file diff --git a/demon.exe b/demon.exe index e83d1d541cd48f5d20b056842fe17933f3201f7e..1c8ac1fc7fc9a7906caf7680f7211bf3d4895749 100644 GIT binary patch delta 7032 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 H3P=7I^2m1gM*GwRH=$d*|9 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 diff --git a/demon.lst b/demon.lst deleted file mode 100644 index 161b2cf..0000000 --- a/demon.lst +++ /dev/null @@ -1,7807 +0,0 @@ -0001 0000 ;[]=========================================================================[] -0002 0000 ;[] Монитор-отладчик DemoN [] -0003 0000 ;[] v0.01 - последние изменения 10.10.2004 [] -0004 0000 ;[] v0.02 - последние изменения 07.02.2005 [] -0005 0000 ;[] v0.03 - последние изменения 11.03.2006 [] -0006 0000 ;[] v0.10 - последние изменения 27.08.2006 [] -0007 0000 ;[]=========================================================================[] -0008 0000 -0009 0000 DEVICE ZXSPECTRUM128 -0010 0000 -0011 0000 ; define DEBUG 1 ;открытие дебаггерных заглушек -0012 0000 ; define D_PRINTCH_BIOS 1 -0013 0000 -0014 0000 org #8100-512 -0015 7F00 STARTPRG -0016 7F00 45 58 45 DB "EXE" ;EXE ID -0017 7F03 00 DB #00 ;EXE VERSION -0018 7F04 00 02 DW #0200 ;CODE OFFSET LOW -0019 7F06 00 00 DW #0000 ;CODE OFFSET HIGH -0020 7F08 00 00 DW #0000 ;END-BEG ;PRIMARY LOADER -0021 7F0A 00 00 DW #0000 ; -0022 7F0C 00 00 DW #0000 ;RESERVED -0023 7F0E 00 00 DW #0000 ; -0024 7F10 00 81 DW OrgAdr ;LOAD ADDRESS -0025 7F12 00 81 DW OrgAdr ;START ADDRESS -0026 7F14 01 C0 DW #C001 ;STACK ADDRESS -0027 7F16 -0028 7F16 -0029 7F16 OrgAdr equ 0x8100 -0030 7F16 org OrgAdr -0031 8100 ; stack 0xC001 -0032 8100 -0033 8100 DD E5 push ix ;адрес командной строки -0034 8102 DB C2 in a,(EmmWin.P2) ;банка с отладчиком -0035 8104 32 1E AB ld (BankDebug),a -0036 8107 DB 82 in a,(EmmWin.P0) ;банка с OS -0037 8109 32 1F AB ld (BankOS),a -0038 810C ; ld (WinPage),a -0039 810C -0040 810C ; ld (Reg._SP),sp ;адрес стека -0041 810C CD AC 8D call SaveAllRegs ;сохранение регистровых пар -0042 810F ; ld a,(BankDebug) -0043 810F 3E FF ld a,0xFF ;скрываем банку с отладчиком -0044 8111 32 41 AB ld (WinPage+2),a -0045 8114 include "cmdline.asm" -0001+ 8114 ;[]=========================================================================[] -0002+ 8114 ;[] Обработка командной строки монитора-отладчика DemoN [] -0003+ 8114 ;[] v0.10 - последние изменения 08.06.2006 [] -0004+ 8114 ;[] Вход: на стеке адрес начала командной строки в памяти [] -0005+ 8114 ;[] Выход: CF=1 - нет параметров, CF=0 - есть параметры [] -0006+ 8114 ;[]=========================================================================[] -0007+ 8114 CmdLine: -0008+ 8114 E1 pop hl ;начало -0009+ 8115 7E ld a,(hl) ;длина командной строки -0010+ 8116 B7 or a -0011+ 8117 37 scf -0012+ 8118 28 08 jr z,.L1 ;нет параметров -0013+ 811A -0014+ 811A 11 80 94 ld de,FDebug ;буфер -0015+ 811D 23 inc hl -0016+ 811E 0E 43 ld c,Dss.GSwitch ;выделение параметра -0017+ 8120 D7 rst DssRst -0018+ 8121 -0019+ 8121 B7 or a ;CF=0 -0020+ 8122 .L1 -0021+ 8122 ;ret -0022+ 8122 -0023+ 8122 -0046 8122 D4 CE 92 call nc,LoadFile -0047 8125 C3 AA 82 jp Start -0048 8128 -0049 8128 08 HorizLine db 8 ;количество линий -0050 8129 ;1-длина 2-столбец 3-строка 4-символ -0051 8129 db 0x4E,0x01,0x00,0xCD, 0x17,0x01,0x03,0xC4 -0051 8129 4E0100CD170103C4 -0052 8131 db 0x17,0x01,0x09,0xC4, 0x17,0x01,0x0F,0xC4 -0052 8131 170109C417010FC4 -0053 8139 db 0x17,0x01,0x11,0xCD, 0x4E,0x01,0x15,0xCD -0053 8139 170111CD4E0115CD -0054 8141 db 0x4E,0x01,0x1E,0xCD, 0x17,0x01,0x13,0xCD -0054 8141 4E011ECD170113CD -0055 8149 -0056 8149 05 VerticalLine db 5 ;количество линий -0057 814A ;1-высота 2-столбец 3-строка 4-символ -0058 814A db 0x1D,0x00,0x01,0xBA, 0x10,0x09,0x01,0xB3 -0058 814A 1D0001BA100901B3 -0059 8152 db 0x08,0x0C,0x16,0xBA, 0x14,0x18,0x01,0xBA -0059 8152 080C16BA141801BA -0060 815A 1D 4F 01 BA db 0x1D,0x4F,0x01,0xBA -0061 815E -0062 815E 29 Corner db 41 ;углы рамок -0063 815F ;1-столбец 2-строка 3-символ -0064 815F db 0x00,0x00,0xC9, 0x00,0x03,0xC7, 0x00,0x09,0xC7 -0064 815F 0000C90003C70009C7 -0065 8168 db 0x00,0x0F,0xC7, 0x00,0x11,0xCC, 0x00,0x15,0xCC -0065 8168 000FC70011CC0015CC -0066 8171 db 0x00,0x1E,0xC8, 0x06,0x11,0xD1, 0x06,0x13,0xCF -0066 8171 001EC80611D10613CF -0067 817A db 0x09,0x00,0xD1, 0x09,0x03,0xC5, 0x09,0x09,0xC5 -0067 817A 0900D10903C50909C5 -0068 8183 db 0x09,0x0F,0xC5, 0x0C,0x11,0xD1, 0x0C,0x15,0xCB -0068 8183 090FC50C11D10C15CB -0069 818C db 0x0C,0x1E,0xCA, 0x12,0x0F,0xC2, 0x12,0x11,0xD8 -0069 818C 0C1ECA120FC21211D8 -0070 8195 db 0x12,0x13,0xCF, 0x18,0x00,0xCB, 0x18,0x03,0xB6 -0070 8195 1213CF1800CB1803B6 -0071 819E db 0x18,0x09,0xB6, 0x18,0x0F,0xB6, 0x18,0x15,0xCA -0071 819E 1809B6180FB61815CA -0072 81A7 db 0x00,0x13,0xCC, 0x0C,0x13,0xCF, 0x4F,0x00,0xBB -0072 81A7 0013CC0C13CF4F00BB -0073 81B0 db 0x18,0x13,0xB9, 0x4F,0x15,0xB9, 0x4F,0x1E,0xBC -0073 81B0 1813B94F15B94F1EBC -0074 81B9 db 0x18,0x11,0xB9, 0x06,0x12,0xB3, 0x12,0x10,0xB3 -0074 81B9 1811B90612B31210B3 -0075 81C2 db 0x12,0x12,0xB3, 0x09,0x13,0xD1, 0x09,0x14,0xB3 -0075 81C2 1212B30913D10914B3 -0076 81CB db 0x09,0x15,0xCF, 0x0C,0x12,0xB3, 0x0E,0x13,0xCB -0076 81CB 0915CF0C12B30E13CB -0077 81D4 db 0x0E,0x14,0xBA, 0x0E,0x15,0xCA -0077 81D4 0E14BA0E15CA -0078 81DA -0079 81DA TextStrReg db 0x16,0x01,0x01,"IX", 0x16,0x01,0x02,"IY" -0079 81DA 16010149581601024959 -0080 81E4 db 0x16,0x01,0x04,"HL", 0x16,0x01,0x05,"DE" -0080 81E4 160104484C1601054445 -0081 81EE db 0x16,0x01,0x06,"BC", 0x16,0x01,0x07,"AF" -0081 81EE 16010642431601074146 -0082 81F8 db 0x16,0x01,0x0A,"HL'", 0x16,0x01,0x0B,"DE'" -0082 81F8 16010A484C2716010B444527 -0083 8204 db 0x16,0x01,0x0C,"BC'", 0x16,0x01,0x0D,"AF'" -0083 8204 16010C42432716010D414627 -0084 8210 db 0x16,0x01,0x10,"PC", 0x16, 0x0A,0x10,"IR" -0084 8210 1601105043160A104952 -0085 821A db 0x16,0x01,0x14,"SP",0 -0085 821A 160114535000 -0086 8220 TextStrLogo db 0x016,0x01,0x1F,0xC4,0xCD,0xCD -0086 8220 16011FC4CDCD -0087 8226 db " DemoN v" -0087 8226 2044656D6F4E2076 -0088 822E incbin "VERSION\major.bin" -0089 822F 2E db "." -0090 8230 incbin "VERSION\minor.bin" -0091 8232 db " build " -0091 8232 206275696C6420 -0092 8239 incbin "VERSION\build.bin" -0093 823D db " (alpha)-" -0093 823D 2028616C706861292D -0094 8246 incbin "VERSION\date.bin" -0095 824C db " Igor by AlphA Studio, Hard/WCG" -0095 824C 2049676F7220627920416C7068412053747564696F2C20486172642F574347 -0096 826B 20CDCDC400 db 0x20,0xCD,0xCD,0xC4,0x00 -0097 8270 TextStrWin db 0x16,0x02,0x11," 0 ",0x16,0x08,0x11," 1 " -0097 8270 160211203020160811203120 -0098 827C db 0x16,0x0E,0x11," 2 ",0x16,0x14,0x11," 3 ",0 -0098 827C 160E1120322016141120332000 -0099 8289 TextStrRez db 0x16,0x0F,0x14,"REZ",0 -0099 8289 160F1452455A00 -0100 8290 -0101 8290 -0102 8290 ;Процедура прорисовки линий -0103 8290 ;HL - адрес начала таблицы -0104 8290 4E DrawLine ld c,(hl) ;количество линий -0105 8291 23 inc hl -0106 8292 46 ld b,(hl) ;длина линии -0107 8293 23 inc hl -0108 8294 5E ld e,(hl) ;столбец -0109 8295 23 inc hl -0110 8296 56 ld d,(hl) ;строка -0111 8297 23 inc hl -0112 8298 7E ld a,(hl) ;символ -0113 8299 E5 push hl -0114 829A C5 .L1 push bc -0115 829B F5 push af -0116 829C 01 58 00 ld bc,Dss.WrChar ;цвет в рег.B -0117 829F D7 rst DssRst -0118 82A0 14 inc d ;наращивание координаты -0119 82A1 F1 pop af -0120 82A2 C1 pop bc -0121 82A3 10 F5 djnz .L1 -0122 82A5 E1 pop hl -0123 82A6 0D dec c -0124 82A7 20 E8 jr nz,DrawLine+1 -0125 82A9 C9 ret -0126 82AA -0127 82AA ;Начало программы -0128 82AA Start: -0129 82AA 21 62 AA ld hl,Hello ;сообщение программы -0130 82AD 0E 5C ld c,Dss.PChars ;вывести строку -0131 82AF D7 rst DssRst -0132 82B0 0E 51 ld c,Dss.GetVMod ;Текущий граф режим -0133 82B2 D7 rst DssRst -0134 82B3 DA 09 88 jp c,Exit -0135 82B6 32 60 AA ld (OSGrafMode),a -0136 82B9 78 ld a,b -0137 82BA 32 5F AA ld (OSScreen),a ;и текущая страница экрана -0138 82BD C5 push bc -0139 82BE 01 3D 01 ld bc,#0100+Dss.GetMem ;резервируем 1 страницу для оконного буфера -0140 82C1 D7 rst DssRst -0141 82C2 D1 pop de ;В D - номер страницы экрана - OSScreen -0142 82C3 DA 09 88 jp c,Exit ;Ошибка выделения блока памяти -0143 82C6 32 61 AA ld (BufPage),a ;Сохраним страницу в переменной -0144 82C9 47 ld b,a -0145 82CA 3A 5E AA ld a,(DemonScreen) -0146 82CD BA cp d ;если экраны ОС и Демона не совпадают -0147 82CE 20 0D jr nz,StartNext ;то и не сохраняем экран ОСи -0148 82D0 11 00 00 ld de,0 ;Сохраняем экран в доп.странице -0149 82D3 21 50 20 ld hl,#2050 -0150 82D6 DD 21 00 C0 ld ix,#c000 -0151 82DA 0E 59 ld c,Dss.WinCopy -0152 82DC D7 rst DssRst -0153 82DD -0154 82DD 3A 5E AA StartNext ld a,(DemonScreen) ;экран отладчика -0155 82E0 47 ld b,a -0156 82E1 3E 03 ld a,3 ;установить режим 80х32 -0157 82E3 0E 50 ld c,Dss.SetVMod ;Dss.SelPage -0158 82E5 ; ld bc,0x0054 -0159 82E5 D7 rst DssRst -0160 82E6 ifdef D_PRINTCH_BIOS -0161 82E6~ ld ix,MainWin ;Открытие окна ч/з биос -0162 82E6~ ld e,00010001b -0163 82E6~ rst BiosRst -0164 82E6~ ld (Demon.Bios_Win),a -0165 82E6~ ; jr nc,.lp1 -0166 82E6~ ; ld c,Dss.EchoKey ;дебуггерная заглушка -0167 82E6~ ; rst DssRst -0168 82E6~ 0169 82E6 endif -0170 82E6 .lp1 -0171 82E6 ; ld a,(Color._SP) ;подсветка вершины стека -0172 82E6 ; ld b,a -0173 82E6 ; ld de,0x1C01 -0174 82E6 ; ld hl,0x010B -0175 82E6 ; ld a," " -0176 82E6 ; ld c,Dss.Clear -0177 82E6 ; rst DssRst -0178 82E6 CD 01 83 call ClearScreen -0179 82E9 CD 0F 83 call DrawDemonScreen -0180 82EC -0181 82EC ; ld c,Dss.EchoKey ;дебуггерная заглушка -0182 82EC ; rst DssRst -0183 82EC -0184 82EC C3 00 88 jp Start1 -0185 82EF ;Обновление экрана демона -0186 82EF CD 35 92 RefreshScreen call CursorRes -0187 82F2 CD 01 83 call ClearScreen -0188 82F5 CD 0F 83 call DrawDemonScreen -0189 82F8 CD 3C 88 call Refresh -0190 82FB CD B3 99 call Cursor ;вкл курсор -0191 82FE C3 D3 91 jp CursorSet -0192 8301 -0193 8301 3A 11 AB ClearScreen ld a,(Color.Screen) -0194 8304 47 ld b,a ;очистка экрана -0195 8305 11 00 00 ld de,0 -0196 8308 21 50 20 ld hl,0x2050 -0197 830B 0E 89 ld c,Bios.Lp_Cls_Win -0198 830D CF rst BiosRst -0199 830E C9 ret -0200 830F DrawDemonScreen -0201 830F 3A 12 AB ld a,(Color.Border) ;установка цвета рамки -0202 8312 32 9E 82 ld (DrawLine.L1+4),a -0203 8315 32 3C 83 ld (DrawCorner+10),a -0204 8318 3E 14 ld a,0x14 ;код мнемоники INC D -0205 831A 32 A0 82 ld (DrawLine.L1+6),a -0206 831D -0207 831D 21 49 81 ld hl,VerticalLine ;вертикальные линии -0208 8320 CD 90 82 call DrawLine -0209 8323 -0210 8323 21 28 81 ld hl,HorizLine ;горизонтальные линии -0211 8326 3E 1C ld a,0x1C ;код мнемоники INC E -0212 8328 32 A0 82 ld (DrawLine.L1+6),a -0213 832B CD 90 82 call DrawLine -0214 832E -0215 832E 21 5E 81 ld hl,Corner -0216 8331 46 ld b,(hl) ;количество углов -0217 8332 C5 DrawCorner push bc -0218 8333 23 inc hl -0219 8334 5E ld e,(hl) ;столбец -0220 8335 23 inc hl -0221 8336 56 ld d,(hl) ;строка -0222 8337 23 inc hl -0223 8338 7E ld a,(hl) ;символ -0224 8339 E5 push hl -0225 833A 01 58 00 ld bc,Dss.WrChar ;цвет в рег.B -0226 833D D7 rst DssRst -0227 833E E1 pop hl -0228 833F C1 pop bc -0229 8340 10 F0 djnz DrawCorner -0230 8342 -0231 8342 21 DA 81 ld hl,TextStrReg -0232 8345 3A 13 AB ld a,(Color.TextStrReg) ;цвет регистровых пар -0233 8348 32 5C 8E ld (PrnStrColor.L1+5),a -0234 834B CD 32 8E call PrnStrColor -0235 834E 21 70 82 ld hl,TextStrWin -0236 8351 3A 14 AB ld a,(Color.TextStrWin) ;цвет номеров окон -0237 8354 32 5C 8E ld (PrnStrColor.L1+5),a -0238 8357 CD 32 8E call PrnStrColor -0239 835A 21 20 82 ld hl,TextStrLogo -0240 835D 3A 18 AB ld a,(Color.TextStrLogo) ;цвет лого программы -0241 8360 32 5C 8E ld (PrnStrColor.L1+5),a -0242 8363 CD 32 8E call PrnStrColor -0243 8366 21 89 82 ld hl,TextStrRez -0244 8369 3A 17 AB ld a,(Color.RezArea) ;цвет резидента -0245 836C 32 5C 8E ld (PrnStrColor.L1+5),a -0246 836F CD 32 8E call PrnStrColor -0247 8372 C9 ret -0248 8373 00 ds OrgAdr+0x700-$ -0249 8800 Start1: -0250 8800 CD E4 9E call PreparChar ;подготовка программного курсора ввода -0251 8803 ; ld hl,(Reg._PC) -0252 8803 ; ld hl,0 -0253 8803 ; ld (ListAdr),hl -0254 8803 -0255 8803 CD 3C 88 call Refresh -0256 8806 CD 51 98 call Keyb -0257 8809 -0258 8809 Exit: -0259 8809 2A 31 9F ld hl,(Rst38.Vect+1) ;восстановление вектора DSS -0260 880C 22 39 00 ld (0039h),hl -0261 880F -0262 880F 3A 5F AA ld a,(OSScreen) ;и текущая страница экрана -0263 8812 47 ld b,a -0264 8813 C5 push bc -0265 8814 3A 60 AA ld a,(OSGrafMode) -0266 8817 0E 50 ld c,Dss.SetVMod -0267 8819 -0268 8819 ; ld bc,0x0100+Dss.SelPage ;восстановление экрана DSS -0269 8819 D7 rst DssRst -0270 881A C1 pop bc -0271 881B 3A 5E AA ld a,(DemonScreen) -0272 881E B8 cp b -0273 881F 20 16 jr nz,ExitNext -0274 8821 11 00 00 ld de,0 ;Восстанавливаем экран из доп.страницы -0275 8824 21 50 20 ld hl,#2050 -0276 8827 DD 21 00 C0 ld ix,#c000 -0277 882B 0E 5A ld c,Dss.WinRest -0278 882D 3A 61 AA ld a,(BufPage) -0279 8830 F5 push af -0280 8831 47 ld b,a -0281 8832 D7 rst DssRst -0282 8833 F1 pop af -0283 8834 0E 3E ld c,Dss.FreeMem ;Отдаем страницу буфера обратно ОСи -0284 8836 D7 rst DssRst -0285 8837 -0286 8837 ExitNext -0287 8837 01 41 00 ld bc,Dss.Exit ;нормальное завершение -0288 883A D7 rst DssRst -0289 883B C9 Return ret -0290 883C -0291 883C Refresh: -0292 883C F3 di -0293 883D 11 04 01 ld de,0x0104 ;вывод значений регистров -0294 8840 2A 25 AB ld hl,(Reg._IX) -0295 8843 CD 13 8F call PrintStrReg -0296 8846 11 04 02 ld de,0x0204 -0297 8849 2A 27 AB ld hl,(Reg._IY) -0298 884C CD 13 8F call PrintStrReg -0299 884F 11 04 04 ld de,0x0404 -0300 8852 2A 29 AB ld hl,(Reg._HL) -0301 8855 CD 13 8F call PrintStrReg -0302 8858 11 04 05 ld de,0x0504 -0303 885B 2A 2B AB ld hl,(Reg._DE) -0304 885E CD 13 8F call PrintStrReg -0305 8861 11 04 06 ld de,0x0604 -0306 8864 2A 2D AB ld hl,(Reg._BC) -0307 8867 CD 13 8F call PrintStrReg -0308 886A 11 04 0A ld de,0x0A04 -0309 886D 2A 31 AB ld hl,(Reg._HL_) -0310 8870 CD 13 8F call PrintStrReg -0311 8873 11 04 0B ld de,0x0B04 -0312 8876 2A 33 AB ld hl,(Reg._DE_) -0313 8879 CD 13 8F call PrintStrReg -0314 887C 11 04 0C ld de,0x0C04 -0315 887F 2A 35 AB ld hl,(Reg._BC_) -0316 8882 CD 13 8F call PrintStrReg -0317 8885 11 04 07 ld de,0x0704 -0318 8888 2A 2F AB ld hl,(Reg._AF) -0319 888B CD 9D 8E call PrintStrAF -0320 888E 11 04 0D ld de,0x0D04 -0321 8891 2A 37 AB ld hl,(Reg._AF_) -0322 8894 CD 9D 8E call PrintStrAF -0323 8897 11 04 10 ld de,0x1004 -0324 889A 2A 3D AB ld hl,(Reg._PC) -0325 889D CD 67 8E call PrintReg -0326 88A0 11 0D 10 ld de,0x100D -0327 88A3 2A 39 AB ld hl,(Reg._IR) -0328 88A6 CD 67 8E call PrintReg -0329 88A9 11 04 14 ld de,0x1404 -0330 88AC 2A 3B AB ld hl,(Reg._SP) -0331 88AF CD 67 8E call PrintReg -0332 88B2 CD AE 8F call PrintSPDn -0333 88B5 11 13 14 ld de,0x1413 -0334 88B8 2A 20 AB ld hl,(RezAdr) -0335 88BB CD 67 8E call PrintReg -0336 88BE -0337 88BE CD 76 8F call PrintStrWin ;вывод номеров банок в окнах -0338 88C1 -0339 88C1 CD F5 8F call PrintStrSP ;вывод дампа стека -0340 88C4 -0341 88C4 CD 67 90 call PrintDump -0342 88C7 FB ei -0343 88C8 C3 54 89 jp DisAsm -0344 88CB -0345 88CB CD 35 92 DemonHelp call CursorRes -0346 88CE DD 21 D5 88 ld ix,HelpWnd -0347 88D2 C3 D5 B9 jp DialogWindow -0348 88D5 -0349 88D5 ; ld hl,HelpWndDlg -0350 88D5 ; jp WinDialog -0351 88D5 HelpWnd db 6,16,11,42,7,#27 -0351 88D5 06100B2A0727 -0352 88DB db "DemoN Help Page",0 -0352 88DB 44656D6F4E2048656C70205061676500 -0353 88EB db " DemoN v" -0353 88EB 2044656D6F4E2076 -0354 88F3 incbin "VERSION\major.bin" -0355 88F4 2E db "." -0356 88F5 incbin "VERSION\minor.bin" -0357 88F7 db " build " -0357 88F7 206275696C6420 -0358 88FE incbin "VERSION\build.bin" -0359 8902 db " (alpha)-" -0359 8902 2028616C706861292D -0360 890B incbin "VERSION\date.bin" -0361 8911 0D db 0x0D -0362 8912 db " Igor by AlphA Studio, Hard/WCG",0x0D,0x0D -0362 8912 2020202049676F7220627920416C7068412053747564696F2C20486172642F57 -0362 8932 43470D0D -0363 8936 db " OK",0 -0363 8936 2020202020202020202020202020202020204F4B00 -0364 894B 01 HelpWndDlg db 1 ;Описатель диалогового окна -0365 894C 23 10 04 02 db 16+19,16,4,2 -0366 8950 00 00 00 00 dw 0,0 -0367 8954 -0368 8954 include "EQU\dss_equ.asm";"D:\WORKAST\EQU\dss_equ" -0001+ 8954 DssRst EQU #10 -0002+ 8954 -0003+ 8954 Dss.Version EQU #00 -0004+ 8954 Dss.ChDisk EQU #01 -0005+ 8954 Dss.CurDisk EQU #02 -0006+ 8954 Dss.DskInfo EQU #03 -0007+ 8954 ;Dss.G_ENTRY EQU #04 -0008+ 8954 ; EQU #05 -0009+ 8954 ; EQU #06 -0010+ 8954 ; EQU #07 -0011+ 8954 ; EQU #08 -0012+ 8954 Dss.BOOTDSK EQU #09 -0013+ 8954 ;File io -0014+ 8954 Dss.Create EQU #0A -0015+ 8954 Dss.Creat_N EQU #0B -0016+ 8954 ; EQU #0C -0017+ 8954 ;Dss.ERASE EQU #0D -0018+ 8954 Dss.Delete EQU #0E -0019+ 8954 ;Dss.Move EQU #0F -0020+ 8954 Dss.Rename EQU #10 -0021+ 8954 Dss.Open EQU #11 -0022+ 8954 Dss.Close EQU #12 -0023+ 8954 Dss.Read EQU #13 -0024+ 8954 Dss.Write EQU #14 -0025+ 8954 Dss.Move_FP EQU #15 -0026+ 8954 Dss.Attrib EQU #16 -0027+ 8954 Dss.Get_D_T EQU #17 -0028+ 8954 Dss.Put_D_T EQU #18 -0029+ 8954 Dss.F_First EQU #19 -0030+ 8954 Dss.F_Next EQU #1A -0031+ 8954 Dss.MkDir EQU #1B -0032+ 8954 Dss.RmDir EQU #1C -0033+ 8954 Dss.ChDir EQU #1D -0034+ 8954 Dss.CurDir EQU #1E -0035+ 8954 ; EQU #1F -0036+ 8954 ; EQU #20 -0037+ 8954 Dss.SysTime EQU #21 -0038+ 8954 Dss.SetTime EQU #22 -0039+ 8954 ; EQU #23 -0040+ 8954 ; EQU #24 -0041+ 8954 ; EQU #25 -0042+ 8954 ; EQU #26 -0043+ 8954 ; EQU #27 -0044+ 8954 ; EQU #28 -0045+ 8954 ; EQU #29 -0046+ 8954 ; EQU #2A -0047+ 8954 ; EQU #2B -0048+ 8954 ; EQU #2C -0049+ 8954 ; EQU #2D -0050+ 8954 ; EQU #2E -0051+ 8954 ; EQU #2F -0052+ 8954 ;Keyboard -0053+ 8954 Dss.WaitKey EQU #30 -0054+ 8954 Dss.ScanKey EQU #31 -0055+ 8954 Dss.EchoKey EQU #32 -0056+ 8954 Dss.CTRLKey EQU #33 -0057+ 8954 ;Dss.EDIT EQU #34 -0058+ 8954 Dss.K_CLEAR EQU #35 -0059+ 8954 Dss.K_SETUP EQU #36 -0060+ 8954 Dss.TESTKEY EQU #37 -0061+ 8954 ;Memory -0062+ 8954 Dss.SetWin EQU #38 -0063+ 8954 Dss.SetWin1 EQU #39 -0064+ 8954 Dss.SetWin2 EQU #3A -0065+ 8954 Dss.SetWin3 EQU #3B -0066+ 8954 Dss.INFOMEM EQU #3C -0067+ 8954 Dss.GetMem EQU #3D -0068+ 8954 Dss.FreeMem EQU #3E -0069+ 8954 Dss.SetMem EQU #3F -0070+ 8954 ;Execution -0071+ 8954 Dss.Exec EQU #40 -0072+ 8954 Dss.Exit EQU #41 -0073+ 8954 Dss.Wait EQU #42 -0074+ 8954 -0075+ 8954 Dss.GSwitch EQU #43 -0076+ 8954 Dss.DosName EQU #44 -0077+ 8954 Dss.EX_Path EQU #45 -0078+ 8954 Dss.Environ EQU #46 -0079+ 8954 Dss.AppInfo EQU #47 -0080+ 8954 ; EQU #48 -0081+ 8954 ; EQU #49 -0082+ 8954 ; EQU #4A -0083+ 8954 ; EQU #4B -0084+ 8954 ; EQU #4C -0085+ 8954 ; EQU #4D -0086+ 8954 ; EQU #4E -0087+ 8954 ; EQU #4F -0088+ 8954 -0089+ 8954 Dss.SetVMod EQU #50 -0090+ 8954 Dss.GetVMod EQU #51 -0091+ 8954 Dss.Locate EQU #52 -0092+ 8954 Dss.Cursor EQU #53 -0093+ 8954 Dss.SelPage EQU #54 -0094+ 8954 Dss.Scroll EQU #55 -0095+ 8954 Dss.Clear EQU #56 -0096+ 8954 Dss.RdChar EQU #57 -0097+ 8954 Dss.WrChar EQU #58 -0098+ 8954 Dss.WinCopy EQU #59 -0099+ 8954 Dss.WinRest EQU #5A -0100+ 8954 Dss.PutChar EQU #5B -0101+ 8954 Dss.PChars EQU #5C -0102+ 8954 ;Dss.RES_PRN EQU #5D -0103+ 8954 ;Dss.CTRLPRN EQU #5E -0104+ 8954 Dss.Print EQU #5F -0105+ 8954 ; -0106+ 8954 -0369 8954 include "EQU\bios_equ.asm";"D:\WORKAST\EQU\bios_equ" -0001+ 8954 BiosRst EQU #08 -0002+ 8954 -0003+ 8954 ;Функции работы с памятью -0004+ 8954 Bios.Emm_Fn0 EQU #C0 -0005+ 8954 Bios.Emm_Fn1 EQU #C1 -0006+ 8954 Bios.Emm_Fn2 EQU #C2 -0007+ 8954 Bios.Emm_Fn3 EQU #C3 -0008+ 8954 Bios.Emm_Fn4 EQU #C4 -0009+ 8954 Bios.Emm_Fn5 EQU #C5 -0010+ 8954 Bios.Emm_Fn6 EQU #C6 -0011+ 8954 Bios.Emm_Fn7 EQU #C7 -0012+ 8954 Bios.Emm_Fn8 EQU #C8 -0013+ 8954 Bios.Emm_Fn9 EQU #C9 -0014+ 8954 -0015+ 8954 -0016+ 8954 ;Функции управления окнами и режимами экрана -0017+ 8954 Bios.Win_Open EQU #B0 -0018+ 8954 Bios.Win_Close EQU #B1 -0019+ 8954 Bios.Win_Copy_Win EQU #B2 -0020+ 8954 Bios.Win_Restore_Win EQU #B3 -0021+ 8954 Bios.Win_Get_Sym EQU #B4 -0022+ 8954 Bios.Win_Put_Sym EQU #B5 -0023+ 8954 Bios.Win_Set_ZG EQU #B6 -0024+ 8954 Bios.Win_Move_Win EQU #B7 -0025+ 8954 Bios.Win_Get_ZG EQU #B8 -0026+ 8954 -0027+ 8954 -0028+ 8954 -0029+ 8954 ;Функции вывода текста на экран -0030+ 8954 Bios.Lp_Print_All EQU #81 -0031+ 8954 Bios.Lp_Print_Sym EQU #82 -0032+ 8954 Bios.Lp_Print_Atr EQU #83 -0033+ 8954 Bios.Lp_Set_Place EQU #84 -0034+ 8954 Bios.Lp_Print_Ln EQU #85 -0035+ 8954 Bios.Lp_Print_Ln2 EQU #86 -0036+ 8954 Bios.Lp_Print_Ln3 EQU #87 -0037+ 8954 Bios.Lp_Print_Ln4 EQU #88 -0038+ 8954 Bios.Lp_Cls_Win EQU #89 -0039+ 8954 Bios.Lp_Scroll_Up EQU #8A -0040+ 8954 Bios.Lp_Print_Ln5 EQU #8B -0041+ 8954 Bios.Lp_Print_Ln6 EQU #8C -0042+ 8954 Bios.Lp_Cls_Win2 EQU #8D -0043+ 8954 Bios.Lp_Get_Place EQU #8E -0044+ 8954 -0045+ 8954 ;Функции работы с жесткими дисками и дисководами -0046+ 8954 Bios.Drv_Reset EQU #51 -0047+ 8954 Bios.Drv_Verify EQU #54 -0048+ 8954 Bios.Drv_Read EQU #55 -0049+ 8954 Bios.Drv_Write EQU #56 -0050+ 8954 Bios.Drv_Detect EQU #57 -0051+ 8954 Bios.Drv_Get_Par EQU #58 -0052+ 8954 Bios.Drv_Set_Par EQU #59 -0053+ 8954 Bios.Ext_Version EQU #5A -0054+ 8954 Bios.Drv_List EQU #5F -0055+ 8954 -0056+ 8954 -0057+ 8954 -0058+ 8954 -0059+ 8954 -0060+ 8954 -0370 8954 include "EQU\port.asm";"D:\WORKAST\EQU\port" -0001+ 8954 EmmWin.P0 EQU #82 -0002+ 8954 EmmWin.P1 EQU #A2 -0003+ 8954 EmmWin.P2 EQU #C2 -0004+ 8954 EmmWin.P3 EQU #E2 -0005+ 8954 -0371 8954 include "disasm.asm";"D:\WORKAST\DEMON\disasm" -0001+ 8954 ;[]=========================================================================[] -0002+ 8954 ;[] Дизассемблер монитора-отладчика DemoN [] -0003+ 8954 ;[] v0.01 - последние изменения 10.10.2004 [] -0004+ 8954 ;[] v0.02 - последние изменения 20.03.2005 [] -0005+ 8954 ;[] v0.03 - последние изменения 16.02.2006 [] -0006+ 8954 ;[] v0.10 - последние изменения 10.09.2006 [] -0007+ 8954 ;[] [] -0008+ 8954 ;[] DisAsm - вывод листинга [] -0009+ 8954 ;[] AttrList - вывод атрибутов строки листинга [] -0010+ 8954 ;[] UpAdres - расчет предыдущего адреса строки листинга [] -0011+ 8954 ;[] List - формирование строки листинга [] -0012+ 8954 ;[]=========================================================================[] -0013+ 8954 -0014+ 8954 ;[]=========================================================================[] -0015+ 8954 ;[] Вывод листинга [] -0016+ 8954 ;[]=========================================================================[] -0017+ 8954 DisAsm: -0018+ 8954 2A 55 AB ld hl,(ListAdr) ;адрес первой строки листинга -0019+ 8957 11 1A 01 ld de,0x011A ;координаты печати -0020+ 895A D5 .L1 push de -0021+ 895B E5 push hl -0022+ 895C D5 push de -0023+ 895D 7A ld a,d -0024+ 895E 3D dec a -0025+ 895F 87 add a,a -0026+ 8960 4F ld c,a -0027+ 8961 06 00 ld b,0 -0028+ 8963 EB ex de,hl -0029+ 8964 21 55 AB ld hl,ListAdr -0030+ 8967 09 add hl,bc -0031+ 8968 73 ld (hl),e ;адрес строки листинга -0032+ 8969 23 inc hl -0033+ 896A 72 ld (hl),d -0034+ 896B EB ex de,hl -0035+ 896C D1 pop de -0036+ 896D -0037+ 896D CD 9B 89 call AttrList ;окрасить строку -0038+ 8970 -0039+ 8970 CD 67 8E .L2 call PrintReg -0040+ 8973 E1 pop hl -0041+ 8974 CD 42 8A call List -0042+ 8977 D1 pop de -0043+ 8978 -0044+ 8978 ; push af ;длина кода временно -0045+ 8978 -0046+ 8978 3A 7D AB ld a,(ListFormat) ;форматный вывод -0047+ 897B B7 or a -0048+ 897C C4 0C 8A call nz,LFormat -0049+ 897F -0050+ 897F D5 push de -0051+ 8980 E5 push hl -0052+ 8981 F3 di -0053+ 8982 3E 15 ld a,21 -0054+ 8984 83 add a,e -0055+ 8985 5F ld e,a ;новая координата X -0056+ 8986 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати -0057+ 8988 CF rst BiosRst -0058+ 8989 ; ld c,Dss.Locate -0059+ 8989 ; rst DssRst -0060+ 8989 21 87 8D ld hl,List.String -0061+ 898C 01 86 20 ld bc,32*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки -0062+ 898F CF rst BiosRst -0063+ 8990 FB ei -0064+ 8991 ; ld c,Dss.PChars -0065+ 8991 ; rst DssRst -0066+ 8991 E1 pop hl -0067+ 8992 D1 pop de -0068+ 8993 -0069+ 8993 ;печать длины кода в поле метки (временно) -0070+ 8993 ; pop af -0071+ 8993 ; push de -0072+ 8993 ; push hl -0073+ 8993 ; ld e,0x24 -0074+ 8993 ; push de -0075+ 8993 ; ld h,0 -0076+ 8993 ; ld l,a -0077+ 8993 ; ld de,.Buf -0078+ 8993 ; call NumToStr8 -0079+ 8993 ; pop de -0080+ 8993 ; ld c,Dss.Locate -0081+ 8993 ; rst DssRst -0082+ 8993 ; ld hl,.Buf -0083+ 8993 ; ld c,Dss.PChars -0084+ 8993 ; rst DssRst -0085+ 8993 ; pop hl -0086+ 8993 ; pop de -0087+ 8993 ; jr $+5 -0088+ 8993 ;.Buf db "123",0 -0089+ 8993 ;end (временно) -0090+ 8993 -0091+ 8993 14 inc d ;следующая строка -0092+ 8994 3A C3 9B ld a,(KList.Descript) ;кол-во строк листинга -0093+ 8997 BA cp d -0094+ 8998 30 C0 jr nc,.L1 -0095+ 899A C9 ret -0096+ 899B -0097+ 899B ;[]=========================================================================[] -0098+ 899B ;[] Вывод атрибутов строки листинга [] -0099+ 899B ;[] Вход: DE - координаты подсветки [] -0100+ 899B ;[] HL - текущий адрес листинга [] -0101+ 899B ;[]=========================================================================[] -0102+ 899B AttrList: -0103+ 899B F3 di -0104+ 899C E5 push hl ;текущий адрес листинга -0105+ 899D D5 push de ;текущие координаты -0106+ 899E -0107+ 899E E5 push hl -0108+ 899F ED 4B 3D AB ld bc,(Reg._PC) ;адрес программного счетчика -0109+ 89A3 B7 or a ;сброс флага C -0110+ 89A4 ED 42 sbc hl,bc -0111+ 89A6 E1 pop hl -0112+ 89A7 20 05 jr nz,.L2 -0113+ 89A9 3A 16 AB ld a,(Color._PC) ;цвет программного курсора -0114+ 89AC 18 20 jr .L0 -0115+ 89AE -0116+ 89AE E5 .L2 push hl -0117+ 89AF D5 push de -0118+ 89B0 E5 push hl -0119+ 89B1 01 7D 00 ld bc,Rezident.End-Rezident;длина резидента -0120+ 89B4 2A 20 AB ld hl,(RezAdr) ;начало резидента -0121+ 89B7 E5 push hl -0122+ 89B8 09 add hl,bc ;конечный адрес резидента -0123+ 89B9 D1 pop de -0124+ 89BA 1B dec de -0125+ 89BB 1B dec de -0126+ 89BC 1B dec de -0127+ 89BD 1B dec de -0128+ 89BE C1 pop bc -0129+ 89BF -0130+ 89BF CD C4 92 call AdrArea -0131+ 89C2 D1 pop de -0132+ 89C3 E1 pop hl -0133+ 89C4 38 05 jr c,.L3 -0134+ 89C6 3A 17 AB ld a,(Color.RezArea) ;цвет области размещения резидента -0135+ 89C9 18 03 jr .L0 -0136+ 89CB -0137+ 89CB 3A 11 AB .L3 ld a,(Color.Screen) ;основной цвет -0138+ 89CE -0139+ 89CE 32 D6 89 .L0 ld (.L1+1),a -0140+ 89D1 1D dec e -0141+ 89D2 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати -0142+ 89D4 CF rst BiosRst -0143+ 89D5 1E 00 .L1 ld e,0 ;цвет подсветки -0144+ 89D7 01 83 36 ld bc,54*256+Bios.Lp_Print_Atr ;в рег.B длина строки -0145+ 89DA CF rst BiosRst -0146+ 89DB D1 pop de -0147+ 89DC E1 pop hl -0148+ 89DD FB ei -0149+ 89DE C9 ret -0150+ 89DF -0151+ 89DF ;[]=========================================================================[] -0152+ 89DF ;[] Расчет предыдущего адреса строки листинга [] -0153+ 89DF ;[] Вход: HL - адрес текущей строки [] -0154+ 89DF ;[] Выход: HL - адрес предыдущей строки [] -0155+ 89DF ;[]=========================================================================[] -0156+ 89DF UpAdres: -0157+ 89DF 11 FC FF ld de,-4 -0158+ 89E2 19 add hl,de ;4-х байтная команда? -0159+ 89E3 CD 6C 92 call Ld_a_hl -0160+ 89E6 ; ld a,(hl) -0161+ 89E6 FE DD cp 0xDD ;префикс 0xDD -0162+ 89E8 28 06 jr z,$+8 -0163+ 89EA F6 30 or 00110000b ;маска для префиксов 0xED,0xFD -0164+ 89EC FE FD cp 0xFD -0165+ 89EE 20 08 jr nz,.L1 -0166+ 89F0 E5 push hl -0167+ 89F1 CD 42 8A call List -0168+ 89F4 E1 pop hl -0169+ 89F5 FE 04 cp 4 -0170+ 89F7 C8 ret z -0171+ 89F8 -0172+ 89F8 23 .L1 inc hl -0173+ 89F9 E5 push hl ;3-х байтная команда? -0174+ 89FA CD 42 8A call List -0175+ 89FD E1 pop hl -0176+ 89FE FE 03 cp 3 -0177+ 8A00 C8 ret z -0178+ 8A01 -0179+ 8A01 23 inc hl -0180+ 8A02 E5 push hl ;2-х байтная команда? -0181+ 8A03 CD 42 8A call List -0182+ 8A06 E1 pop hl -0183+ 8A07 FE 02 cp 2 -0184+ 8A09 C8 ret z -0185+ 8A0A -0186+ 8A0A 23 inc hl -0187+ 8A0B C9 ret ;1-о байтная команда! -0188+ 8A0C -0189+ 8A0C ;[]=========================================================================[] -0190+ 8A0C ;[] Форматирование строки листинга [] -0191+ 8A0C ;[]=========================================================================[] -0192+ 8A0C LFormat: -0193+ 8A0C E5 push hl -0194+ 8A0D 21 92 8D ld hl,List.String+11 ;начало строки -0195+ 8A10 01 02 00 ld bc,2 ;макс кол-во вставляемых пробелов -0196+ 8A13 7E .L2 ld a,(hl) -0197+ 8A14 B7 or a -0198+ 8A15 28 08 jr z,.Exit -0199+ 8A17 FE 20 cp 0x20 ;пробел -0200+ 8A19 28 06 jr z,.L1 -0201+ 8A1B 23 inc hl -0202+ 8A1C 0D dec c -0203+ 8A1D 20 F4 jr nz,.L2 -0204+ 8A1F -0205+ 8A1F E1 .Exit pop hl -0206+ 8A20 C9 ret -0207+ 8A21 -0208+ 8A21 D5 .L1 push de -0209+ 8A22 C5 push bc -0210+ 8A23 E5 push hl -0211+ 8A24 21 A5 8D ld hl,List.String+30 ;конец строки -0212+ 8A27 54 ld d,h -0213+ 8A28 5D ld e,l -0214+ 8A29 B7 or a -0215+ 8A2A ED 42 sbc hl,bc -0216+ 8A2C C1 pop bc -0217+ 8A2D C5 push bc -0218+ 8A2E E5 push hl -0219+ 8A2F ED 42 sbc hl,bc ;кол-во байт -0220+ 8A31 44 ld b,h -0221+ 8A32 4D ld c,l -0222+ 8A33 E1 pop hl -0223+ 8A34 ED B8 lddr -0224+ 8A36 E1 pop hl -0225+ 8A37 C1 pop bc ;кол-во пробелов -0226+ 8A38 41 ld b,c -0227+ 8A39 23 .L3 inc hl ;адрес вставки -0228+ 8A3A 3E 20 ld a,0x20 -0229+ 8A3C 77 ld (hl),a -0230+ 8A3D 10 FA djnz .L3 -0231+ 8A3F D1 pop de -0232+ 8A40 E1 pop hl -0233+ 8A41 C9 ret -0234+ 8A42 -0235+ 8A42 ;[]=========================================================================[] -0236+ 8A42 ;[] Формирование строки листинга [] -0237+ 8A42 ;[] Вход: HL - адрес памяти дизассемблирования [] -0238+ 8A42 ;[] Выход: HL - следующий за дизассемблированной командой адрес памяти [] -0239+ 8A42 ;[] A - длина кода команды [] -0240+ 8A42 ;[]=========================================================================[] -0241+ 8A42 List: -0242+ 8A42 AF xor a ;длина кода команды -0243+ 8A43 32 A7 8D ld (.Byte),a -0244+ 8A46 E5 push hl -0245+ 8A47 54 ld d,h -0246+ 8A48 5D ld e,l -0247+ 8A49 -0248+ 8A49 21 87 8D ld hl,.String ;очистка буфера строки -0249+ 8A4C ; di ;с использованием акселя -0250+ 8A4C ; ld d,d ;включить аксель -0251+ 8A4C ; ld a,32 ;длина буфера и байт заполнитель -0252+ 8A4C ; ld c,c ;команда заполнения -0253+ 8A4C ; ld (hl),a ;заполнить -0254+ 8A4C ; ld b,b ;выключить аксель -0255+ 8A4C ; ei -0256+ 8A4C 3E 20 ld a,32 ;длина буфера и байт заполнитель -0257+ 8A4E 47 ld b,a -0258+ 8A4F 77 ld (hl),a -0259+ 8A50 23 inc hl -0260+ 8A51 10 FC djnz $-2 -0261+ 8A53 -0262+ 8A53 DD 21 89 8D ld ix,.String+2 ;адрес в строке для след.кода -0263+ 8A57 EB ex de,hl -0264+ 8A58 ; ld a,(hl) ;байт из памяти -0265+ 8A58 CD 6C 92 call Ld_a_hl -0266+ 8A5B -0267+ 8A5B ;=============================== -0268+ 8A5B FE DD cp 0xDD ;префикс #DD -0269+ 8A5D 28 0C jr z,.L43 -0270+ 8A5F FE FD cp 0xFD ;префикс #FD -0271+ 8A61 C2 04 8B jp nz,.L30 -0272+ 8A64 -0273+ 8A64 11 46 44 ld de,"DF" -0274+ 8A67 3E 59 ld a,"Y" -0275+ 8A69 18 05 jr .L42 -0276+ 8A6B -0277+ 8A6B 11 44 44 .L43 ld de,"DD" -0278+ 8A6E 3E 58 ld a,"X" -0279+ 8A70 -0280+ 8A70 ED 53 87 8D .L42 ld (.String),de ;префикс в строку -0281+ 8A74 32 6B 8D ld (.IRS1+1),a ;корректировка рег.пары -0282+ 8A77 32 E9 8B ld (.L9+1),a -0283+ 8A7A 32 AC 8C ld (.L13+6),a -0284+ 8A7D 3E 01 ld a,1 -0285+ 8A7F 32 A7 8D ld (.Byte),a ;длина кода команды -0286+ 8A82 E1 pop hl -0287+ 8A83 23 inc hl -0288+ 8A84 ; ld a,(hl) ;следующий байт команды -0289+ 8A84 CD 6C 92 call Ld_a_hl -0290+ 8A87 E5 push hl -0291+ 8A88 FE CB cp 0xCB -0292+ 8A8A 28 25 jr z,.L40 ;команды #DD(#FD)#CB -0293+ 8A8C -0294+ 8A8C 21 67 B0 ld hl,CodeDDFD ;таблица кодов -0295+ 8A8F 01 55 00 ld bc,85 ;размер таблицы -0296+ 8A92 ED B1 cpir ;поиск кода -0297+ 8A94 28 0F jr z,.L45 -0298+ 8A96 E1 pop hl -0299+ 8A97 01 DE B4 ld bc,ED00 -0300+ 8A9A 11 90 8D ld de,.String+9 ;копирование мнемоники NOP * -0301+ 8A9D 0A ld a,(bc) -0302+ 8A9E B7 or a -0303+ 8A9F C8 ret z -0304+ 8AA0 12 ld (de),a -0305+ 8AA1 13 inc de -0306+ 8AA2 03 inc bc -0307+ 8AA3 18 F8 jr $-6 -0308+ 8AA5 -0309+ 8AA5 21 54 00 .L45 ld hl,84 ;размер таблицы -0310+ 8AA8 B7 or a -0311+ 8AA9 ED 42 sbc hl,bc -0312+ 8AAB 11 BC B0 ld de,TablDDFD -0313+ 8AAE C3 D6 8B jp .L_12+3 -0314+ 8AB1 -0315+ 8AB1 DD 21 8B 8D .L40 ld ix,.String+4 ;адрес в строке для след.кода -0316+ 8AB5 11 43 42 ld de,"BC" ;префикс в строку -0317+ 8AB8 ED 53 89 8D ld (.String+2),de -0318+ 8ABC 3E 04 ld a,4 ;длина кода -0319+ 8ABE 32 A7 8D ld (.Byte),a -0320+ 8AC1 E1 pop hl -0321+ 8AC2 23 inc hl -0322+ 8AC3 CD 6C 92 call Ld_a_hl -0323+ 8AC6 47 ld b,a -0324+ 8AC7 ; ld b,(hl) ;байт-смещение -0325+ 8AC7 23 inc hl -0326+ 8AC8 CD 6C 92 call Ld_a_hl -0327+ 8ACB ; ld a,(hl) ;следующий байт команды -0328+ 8ACB 23 inc hl -0329+ 8ACC E5 push hl -0330+ 8ACD 4F ld c,a -0331+ 8ACE 26 00 ld h,0 -0332+ 8AD0 FE 40 cp 0x40 ;от 0 до 0x3F (сдвиги) -0333+ 8AD2 38 15 jr c,.L44 -0334+ 8AD4 -0335+ 8AD4 CD F7 8C call .ComCBBit ;мнемоника BIT,SET,RES -0336+ 8AD7 79 ld a,c -0337+ 8AD8 FE 80 cp 0x80 ;команда BIT -0338+ 8ADA 30 08 jr nc,.L41 -0339+ 8ADC CD 1D 8D call .NomBit ;номер бита -0340+ 8ADF CD 59 8D call .IndexRegSh ;индексная пара со смещением -0341+ 8AE2 18 14 jr .L46 -0342+ 8AE4 -0343+ 8AE4 CD 1D 8D .L41 call .NomBit ;номер бита -0344+ 8AE7 18 03 jr .L44+3 -0345+ 8AE9 -0346+ 8AE9 CD 04 8D .L44 call .ComCBSh ;мнемоника -0347+ 8AEC CD 2C 8D call .RegName ;регистр -0348+ 8AEF 20 04 jr nz,$+6 -0349+ 8AF1 3E 2C ld a,"," ;разделитель -0350+ 8AF3 12 ld (de),a -0351+ 8AF4 13 inc de -0352+ 8AF5 CD 59 8D call .IndexRegSh ;индексная пара со смещением -0353+ 8AF8 -0354+ 8AF8 79 .L46 ld a,c -0355+ 8AF9 CD 74 91 call ConvHexStr -0356+ 8AFC DD 75 02 ld (ix+2),l -0357+ 8AFF DD 74 03 ld (ix+3),h -0358+ 8B02 E1 pop hl -0359+ 8B03 C9 ret -0360+ 8B04 -0361+ 8B04 ;=============================== -0362+ 8B04 FE CB .L30 cp 0xCB ;префикс #CB -0363+ 8B06 C2 3D 8B jp nz,.L20 -0364+ 8B09 11 43 42 ld de,"BC" ;префикс в строку -0365+ 8B0C ED 53 87 8D ld (.String),de -0366+ 8B10 E1 pop hl -0367+ 8B11 23 inc hl -0368+ 8B12 CD 6C 92 call Ld_a_hl -0369+ 8B15 ; ld a,(hl) ;следующий байт команды -0370+ 8B15 23 inc hl -0371+ 8B16 E5 push hl -0372+ 8B17 4F ld c,a -0373+ 8B18 26 00 ld h,0 -0374+ 8B1A FE 40 cp 0x40 ;от 0 до 0x3F (сдвиги) -0375+ 8B1C 30 05 jr nc,.L31 -0376+ 8B1E CD 04 8D call .ComCBSh ;мнемоника -0377+ 8B21 18 06 jr .L31+6 -0378+ 8B23 CD F7 8C .L31 call .ComCBBit ;мнемоника -0379+ 8B26 CD 1D 8D call .NomBit ;номер бита -0380+ 8B29 CD 2C 8D call .RegName ;регистр -0381+ 8B2C C4 4A 8D call nz,.HLReg -0382+ 8B2F 79 ld a,c -0383+ 8B30 CD 74 91 call ConvHexStr -0384+ 8B33 DD 75 00 ld (ix+0),l -0385+ 8B36 DD 74 01 ld (ix+1),h -0386+ 8B39 E1 pop hl -0387+ 8B3A 3E 02 ld a,2 ;длина кода команды -0388+ 8B3C C9 ret -0389+ 8B3D -0390+ 8B3D ;=============================== -0391+ 8B3D FE ED .L20 cp 0xED ;префикс #ED -0392+ 8B3F 20 2D jr nz,.L10 -0393+ 8B41 3E 01 ld a,1 -0394+ 8B43 32 A7 8D ld (.Byte),a ;длина кода -0395+ 8B46 11 45 44 ld de,"DE" ;префикс в строку -0396+ 8B49 ED 53 87 8D ld (.String),de -0397+ 8B4D E1 pop hl -0398+ 8B4E 23 inc hl -0399+ 8B4F E5 push hl -0400+ 8B50 CD 6C 92 call Ld_a_hl -0401+ 8B53 ; ld a,(hl) ;следующий байт команды -0402+ 8B53 FE 40 cp 0x40 ;от 0 до 0x3F -0403+ 8B55 38 12 jr c,.L21 -0404+ 8B57 11 A8 B3 ld de,TablED-0x40*2 -0405+ 8B5A FE 7F cp 0x7F ;от 0x40 до 0x7E из таблицы -0406+ 8B5C 38 75 jr c,.L_12 -0407+ 8B5E FE A0 cp 0xA0 ;от 0x7F до 0x9F -0408+ 8B60 38 07 jr c,.L21 -0409+ 8B62 11 66 B3 ld de,TablED-0xA0*2+0x40*2-2 -0410+ 8B65 FE BC cp 0xBC ;от 0xBC до 0xFF -0411+ 8B67 38 6A jr c,.L_12 -0412+ 8B69 21 DE B4 .L21 ld hl,ED00 ;команда "NOP *" -0413+ 8B6C 18 6E jr .L_2-3 -0414+ 8B6E -0415+ 8B6E ;=============================== -0416+ 8B6E DD 21 87 8D .L10 ld ix,.String -0417+ 8B72 11 CF AB ld de,Tabl00_3F ;таблица смещений -0418+ 8B75 FE 40 cp 0x40 ;команды 0x00...0x3F -0419+ 8B77 38 5A jr c,.L_12 -0420+ 8B79 11 02 AE ld de,TablC0_FF ;таблица смещений -0421+ 8B7C 4F ld c,a -0422+ 8B7D D6 C0 sub 0xC0 ;команды 0xC0...0xFF -0423+ 8B7F 30 52 jr nc,.L_12 -0424+ 8B81 -0425+ 8B81 79 ld a,c -0426+ 8B82 FE 80 cp 0x80 -0427+ 8B84 30 2A jr nc,.L8 -0428+ 8B86 21 26 B0 ld hl,MHALT -0429+ 8B89 FE 76 cp 0x76 ;код команды HALT -0430+ 8B8B 28 4F jr z,.L_2-3 -0431+ 8B8D -0432+ 8B8D 21 90 8D ld hl,.String+9 -0433+ 8B90 36 4C ld (hl),"L" ;мнемоника LD -0434+ 8B92 23 inc hl -0435+ 8B93 36 44 ld (hl),"D" -0436+ 8B95 23 inc hl -0437+ 8B96 36 20 ld (hl)," " -0438+ 8B98 23 inc hl -0439+ 8B99 0F rrca -0440+ 8B9A 0F rrca -0441+ 8B9B 0F rrca -0442+ 8B9C EB ex de,hl -0443+ 8B9D CD 2D 8D call .RegName+1 ;печать регистра -0444+ 8BA0 C4 4A 8D call nz,.HLReg -0445+ 8BA3 3E 2C ld a,"," ;разделитель -0446+ 8BA5 12 ld (de),a -0447+ 8BA6 13 inc de -0448+ 8BA7 CD 2C 8D call .RegName ;печать регистра -0449+ 8BAA C4 4A 8D call nz,.HLReg -0450+ 8BAD AF xor a -0451+ 8BAE 18 4A jr .L1 -0452+ 8BB0 -0453+ 8BB0 E6 38 .L8 and 00111000b ;ADD,ADC,SUB,SBC,AND,XOR,OR,CP -0454+ 8BB2 0F rrca -0455+ 8BB3 0F rrca -0456+ 8BB4 6F ld l,a -0457+ 8BB5 26 00 ld h,0 -0458+ 8BB7 11 2B B0 ld de,TablM -0459+ 8BBA 19 add hl,de ;смещение в таблице -0460+ 8BBB 7E ld a,(hl) -0461+ 8BBC 23 inc hl -0462+ 8BBD 66 ld h,(hl) -0463+ 8BBE 6F ld l,a -0464+ 8BBF 11 90 8D ld de,.String+9 ;копирование в строку-буфер -0465+ 8BC2 7E ld a,(hl) -0466+ 8BC3 12 ld (de),a -0467+ 8BC4 13 inc de -0468+ 8BC5 23 inc hl -0469+ 8BC6 B7 or a -0470+ 8BC7 20 F9 jr nz,$-5 -0471+ 8BC9 1B dec de -0472+ 8BCA CD 2C 8D call .RegName ;печать регистра -0473+ 8BCD C4 4A 8D call nz,.HLReg -0474+ 8BD0 AF xor a -0475+ 8BD1 18 27 jr .L1 -0476+ 8BD3 -0477+ 8BD3 6F .L_12 ld l,a ;расчет адреса в таблице -0478+ 8BD4 26 00 ld h,0 -0479+ 8BD6 29 add hl,hl ;*2 -0480+ 8BD7 19 add hl,de -0481+ 8BD8 7E ld a,(hl) -0482+ 8BD9 23 inc hl -0483+ 8BDA 66 ld h,(hl) -0484+ 8BDB 6F ld l,a ;адрес строки-мнемоники -0485+ 8BDC -0486+ 8BDC 11 90 8D ld de,.String+9 ;копирование в строку-буфер -0487+ 8BDF 7E .L_2 ld a,(hl) -0488+ 8BE0 FE 20 cp 0x20 -0489+ 8BE2 38 16 jr c,.L1 -0490+ 8BE4 FE 78 cp "x" ;индексный регистр -0491+ 8BE6 20 02 jr nz,$+4 -0492+ 8BE8 3E 58 .L9 ld a,"X" -0493+ 8BEA 12 ld (de),a -0494+ 8BEB FE 29 cp ")" -0495+ 8BED 20 07 jr nz,$+9 -0496+ 8BEF 22 A8 8D ld (.TablAdr),hl -0497+ 8BF2 ED 53 AA 8D ld (.StrAdr),de -0498+ 8BF6 23 inc hl -0499+ 8BF7 13 inc de -0500+ 8BF8 18 E5 jr .L_2 -0501+ 8BFA -0502+ 8BFA 08 .L1 exa -0503+ 8BFB E1 pop hl ;печать байта -0504+ 8BFC CD 6C 92 call Ld_a_hl -0505+ 8BFF ; ld a,(hl) -0506+ 8BFF 23 inc hl -0507+ 8C00 E5 push hl -0508+ 8C01 CD 74 91 call ConvHexStr -0509+ 8C04 DD 75 00 ld (ix+0),l -0510+ 8C07 DD 74 01 ld (ix+1),h -0511+ 8C0A 08 exa -0512+ 8C0B CA B2 8C jp z,.LE -0513+ 8C0E -0514+ 8C0E 3D dec a ;2-х байтная команда (1) -0515+ 8C0F 20 0A jr nz,.L3 -0516+ 8C11 CD B8 8C call .TwoByteCom -0517+ 8C14 E1 pop hl -0518+ 8C15 3A A7 8D ld a,(.Byte) -0519+ 8C18 3C inc a -0520+ 8C19 3C inc a ;длина кода -0521+ 8C1A C9 ret -0522+ 8C1B -0523+ 8C1B 3D .L3 dec a ;3-х байтная команда (2) -0524+ 8C1C 20 0A jr nz,.L4 -0525+ 8C1E CD D0 8C call .ThreeByteCom -0526+ 8C21 E1 pop hl -0527+ 8C22 3A A7 8D ld a,(.Byte) -0528+ 8C25 C6 03 add a,3 ;длина кода -0529+ 8C27 C9 ret -0530+ 8C28 -0531+ 8C28 3D .L4 dec a ;команды относительного перехода (3) -0532+ 8C29 20 29 jr nz,.L7 -0533+ 8C2B E1 pop hl -0534+ 8C2C CD 6C 92 call Ld_a_hl -0535+ 8C2F ; ld a,(hl) ;2-й байт команды -0536+ 8C2F 23 inc hl -0537+ 8C30 E5 push hl -0538+ 8C31 4F ld c,a -0539+ 8C32 CD 74 91 call ConvHexStr -0540+ 8C35 DD 75 02 ld (ix+2),l -0541+ 8C38 DD 74 03 ld (ix+3),h -0542+ 8C3B 79 ld a,c -0543+ 8C3C 06 00 ld b,0 -0544+ 8C3E E1 pop hl -0545+ 8C3F E5 push hl ;текущий адрес -0546+ 8C40 CB 7F bit 7,a ;знак числа -0547+ 8C42 28 08 jr z,$+10 -0548+ 8C44 ED 44 neg -0549+ 8C46 B7 or a ;сброс флага C -0550+ 8C47 4F ld c,a -0551+ 8C48 ED 42 sbc hl,bc ;отрицательное смещение -0552+ 8C4A 18 01 jr $+3 -0553+ 8C4C 09 add hl,bc ;положительное смещение -0554+ 8C4D CD 3D 91 call NumToStr16 -0555+ 8C50 E1 pop hl -0556+ 8C51 3E 02 ld a,2 ;длина кода -0557+ 8C53 C9 ret -0558+ 8C54 -0559+ 8C54 3D .L7 dec a ;команды работы с портами (4) -0560+ 8C55 20 0D jr nz,.L5 -0561+ 8C57 3C inc a -0562+ 8C58 32 A7 8D ld (.Byte),a ;длина кода -0563+ 8C5B ED 5B AA 8D ld de,(.StrAdr) ;адрес вставки -0564+ 8C5F CD B8 8C call .TwoByteCom -0565+ 8C62 18 2E jr .L6 -0566+ 8C64 -0567+ 8C64 3D .L5 dec a ;3-х байтные косвенной адресации (5) -0568+ 8C65 20 11 jr nz,.L11 -0569+ 8C67 3A A7 8D ld a,(.Byte) -0570+ 8C6A 3C inc a -0571+ 8C6B 3C inc a -0572+ 8C6C 32 A7 8D ld (.Byte),a ;длина кода -0573+ 8C6F ED 5B AA 8D ld de,(.StrAdr) ;адрес вставки -0574+ 8C73 CD D0 8C call .ThreeByteCom -0575+ 8C76 18 1A jr .L6 -0576+ 8C78 -0577+ 8C78 3D .L11 dec a ;индексные регистры со смещением (6) -0578+ 8C79 20 37 jr nz,.LE -0579+ 8C7B 3E 02 ld a,2 -0580+ 8C7D 32 A7 8D ld (.Byte),a ;длина кода -0581+ 8C80 ED 5B AA 8D ld de,(.StrAdr) ;адрес вставки -0582+ 8C84 E1 pop hl -0583+ 8C85 CD 6C 92 call Ld_a_hl -0584+ 8C88 47 ld b,a -0585+ 8C89 ; ld b,(hl) -0586+ 8C89 23 inc hl -0587+ 8C8A E5 push hl -0588+ 8C8B DD 21 8B 8D ld ix,.String+4 -0589+ 8C8F CD 59 8D call .IndexRegSh -0590+ 8C92 2A A8 8D .L6 ld hl,(.TablAdr) ;адрес в таблице мнемоник -0591+ 8C95 7E ld a,(hl) -0592+ 8C96 FE 20 cp 0x20 -0593+ 8C98 30 0C jr nc,.L13 -0594+ 8C9A 78 ld a,b -0595+ 8C9B FE 2C cp "," ;мнемоника оканч. на "," -0596+ 8C9D 20 13 jr nz,.LE -0597+ 8C9F CD B8 8C call .TwoByteCom -0598+ 8CA2 E1 pop hl -0599+ 8CA3 3E 04 ld a,4 ;длина кода -0600+ 8CA5 C9 ret -0601+ 8CA6 -0602+ 8CA6 47 .L13 ld b,a -0603+ 8CA7 FE 78 cp "x" ;индексный регистр -0604+ 8CA9 20 02 jr nz,$+4 -0605+ 8CAB 3E 58 ld a,"X" -0606+ 8CAD 12 ld (de),a -0607+ 8CAE 23 inc hl -0608+ 8CAF 13 inc de -0609+ 8CB0 18 E3 jr .L6+3 -0610+ 8CB2 -0611+ 8CB2 E1 .LE pop hl -0612+ 8CB3 3A A7 8D ld a,(.Byte) ;длина кода -0613+ 8CB6 3C inc a -0614+ 8CB7 C9 ret -0615+ 8CB8 -0616+ 8CB8 ;======== печать второго кода двухбайтной команды ======== -0617+ 8CB8 .TwoByteCom: -0618+ 8CB8 C1 pop bc ;адрес возврата -0619+ 8CB9 E1 pop hl -0620+ 8CBA CD 6C 92 call Ld_a_hl -0621+ 8CBD ; ld a,(hl) ;2-й байт команды -0622+ 8CBD 23 inc hl -0623+ 8CBE E5 push hl -0624+ 8CBF C5 push bc -0625+ 8CC0 4F ld c,a -0626+ 8CC1 CD 74 91 call ConvHexStr -0627+ 8CC4 DD 75 02 ld (ix+2),l -0628+ 8CC7 DD 74 03 ld (ix+3),h -0629+ 8CCA 69 ld l,c -0630+ 8CCB 26 00 ld h,0 -0631+ 8CCD C3 5E 91 jp NumToStr8 -0632+ 8CD0 -0633+ 8CD0 ;======== печать второго и третьего кода трехбайтной команды ======== -0634+ 8CD0 .ThreeByteCom: -0635+ 8CD0 C1 pop bc ;адрес возврата -0636+ 8CD1 E1 pop hl -0637+ 8CD2 CD 6C 92 call Ld_a_hl -0638+ 8CD5 ; ld a,(hl) ;2-й байт команды -0639+ 8CD5 23 inc hl -0640+ 8CD6 08 exa -0641+ 8CD7 CD 6C 92 call Ld_a_hl -0642+ 8CDA ; ld a,(hl) ;3-й байт команды -0643+ 8CDA 23 inc hl -0644+ 8CDB E5 push hl -0645+ 8CDC C5 push bc -0646+ 8CDD 47 ld b,a -0647+ 8CDE CD 74 91 call ConvHexStr -0648+ 8CE1 DD 75 04 ld (ix+4),l -0649+ 8CE4 DD 74 05 ld (ix+5),h -0650+ 8CE7 08 exa -0651+ 8CE8 4F ld c,a -0652+ 8CE9 CD 74 91 call ConvHexStr -0653+ 8CEC DD 75 02 ld (ix+2),l -0654+ 8CEF DD 74 03 ld (ix+3),h -0655+ 8CF2 60 ld h,b ;в HL - число -0656+ 8CF3 69 ld l,c -0657+ 8CF4 C3 3D 91 jp NumToStr16 -0658+ 8CF7 -0659+ 8CF7 ;======== печать мнемоник команд с префиксом 0xCB (сдвиги, битовые) ======== -0660+ 8CF7 ;A - байт команды -0661+ 8CF7 ;DE - адрес в строке -0662+ 8CF7 .ComCBBit: -0663+ 8CF7 E6 C0 and 11000000b -0664+ 8CF9 07 rlca -0665+ 8CFA 07 rlca -0666+ 8CFB 07 rlca -0667+ 8CFC 07 rlca -0668+ 8CFD 6F ld l,a -0669+ 8CFE 11 18 B4 ld de,CB40-4 -0670+ 8D01 19 add hl,de -0671+ 8D02 18 0D jr .ComCBSh1 -0672+ 8D04 .ComCBSh: -0673+ 8D04 E6 38 and 00111000b ;смещение в таблице -0674+ 8D06 0F rrca -0675+ 8D07 0F rrca -0676+ 8D08 6F ld l,a -0677+ 8D09 11 EE B3 ld de,TablCB -0678+ 8D0C 19 add hl,de -0679+ 8D0D 7E ld a,(hl) -0680+ 8D0E 23 inc hl -0681+ 8D0F 66 ld h,(hl) -0682+ 8D10 6F ld l,a -0683+ 8D11 11 90 8D .ComCBSh1 ld de,.String+9 ;копирование в строку-буфер -0684+ 8D14 7E ld a,(hl) -0685+ 8D15 12 ld (de),a -0686+ 8D16 13 inc de -0687+ 8D17 23 inc hl -0688+ 8D18 FE 20 cp " " ;последний символ мнемоники -0689+ 8D1A 20 F8 jr nz,$-6 -0690+ 8D1C C9 ret -0691+ 8D1D -0692+ 8D1D ;======== вычисление номера бита в битовых командах BIT, SET, RES ======== -0693+ 8D1D ;C - байт команды -0694+ 8D1D ;DE - адрес в строке -0695+ 8D1D .NomBit: -0696+ 8D1D 79 ld a,c -0697+ 8D1E E6 38 and 00111000b ;номер бита -0698+ 8D20 0F rrca -0699+ 8D21 0F rrca -0700+ 8D22 0F rrca -0701+ 8D23 C6 30 add a,"0" -0702+ 8D25 12 ld (de),a -0703+ 8D26 3E 2C ld a,"," -0704+ 8D28 13 inc de -0705+ 8D29 12 ld (de),a -0706+ 8D2A 13 inc de -0707+ 8D2B C9 ret -0708+ 8D2C -0709+ 8D2C ;======== печать имени регистра ======== -0710+ 8D2C ;C - команда -0711+ 8D2C ;DE - адрес в строке -0712+ 8D2C .RegName: -0713+ 8D2C 79 ld a,c -0714+ 8D2D E6 07 and 00000111b ;регистр -0715+ 8D2F C6 42 add a,"B" -0716+ 8D31 FE 46 cp "F" ;B,C,D,E -0717+ 8D33 38 11 jr c,.RN1 -0718+ 8D35 3C inc a -0719+ 8D36 3C inc a -0720+ 8D37 FE 48 cp "H" -0721+ 8D39 28 0B jr z,.RN1 -0722+ 8D3B C6 03 add a,3 -0723+ 8D3D FE 4C cp "L" -0724+ 8D3F 28 05 jr z,.RN1 -0725+ 8D41 D6 0D sub 13 -0726+ 8D43 FE 41 cp "A" -0727+ 8D45 C0 ret nz ;относительная адресация -0728+ 8D46 12 .RN1 ld (de),a -0729+ 8D47 13 inc de -0730+ 8D48 AF xor a -0731+ 8D49 C9 ret -0732+ 8D4A -0733+ 8D4A ;======== печать (HL) ======== -0734+ 8D4A ;DE - адрес в строке -0735+ 8D4A .HLReg: -0736+ 8D4A EB ex de,hl -0737+ 8D4B 36 28 ld (hl),"(" -0738+ 8D4D 23 inc hl -0739+ 8D4E 36 48 ld (hl),"H" -0740+ 8D50 23 inc hl -0741+ 8D51 36 4C ld (hl),"L" -0742+ 8D53 23 inc hl -0743+ 8D54 36 29 ld (hl),")" -0744+ 8D56 23 inc hl -0745+ 8D57 EB ex de,hl -0746+ 8D58 C9 ret -0747+ 8D59 -0748+ 8D59 ;======== печать индексной регистровой пары со смещением ======== -0749+ 8D59 ;B - смещение -0750+ 8D59 ;DE - адрес в строке -0751+ 8D59 .IndexRegSh: -0752+ 8D59 78 ld a,b -0753+ 8D5A CD 74 91 call ConvHexStr -0754+ 8D5D DD 75 00 ld (ix+0),l -0755+ 8D60 DD 74 01 ld (ix+1),h -0756+ 8D63 EB ex de,hl -0757+ 8D64 36 28 ld (hl),"(" -0758+ 8D66 23 inc hl -0759+ 8D67 36 49 ld (hl),"I" -0760+ 8D69 23 inc hl -0761+ 8D6A 36 58 .IRS1 ld (hl),"X" -0762+ 8D6C 23 inc hl -0763+ 8D6D 3E 2B ld a,"+" ;положительное смещение -0764+ 8D6F 77 ld (hl),a -0765+ 8D70 78 ld a,b ;смещение -0766+ 8D71 CB 78 bit 7,b -0767+ 8D73 28 06 jr z,$+8 -0768+ 8D75 3E 2D ld a,"-" ;отрицательное смещение -0769+ 8D77 77 ld (hl),a -0770+ 8D78 78 ld a,b ;смещение -0771+ 8D79 ED 44 neg -0772+ 8D7B 23 inc hl -0773+ 8D7C EB ex de,hl -0774+ 8D7D 6F ld l,a -0775+ 8D7E 26 00 ld h,0 -0776+ 8D80 CD 5E 91 call NumToStr8 -0777+ 8D83 3E 29 ld a,")" -0778+ 8D85 12 ld (de),a -0779+ 8D86 C9 ret -0780+ 8D87 -0781+ 8D87 -0782+ 8D87 .String db "00112233 01234567890123456789012" -0782+ 8D87 3030313132323333203031323334353637383930313233343536373839303132 -0783+ 8DA7 00 .Byte db 0 -0784+ 8DA8 00 00 .TablAdr dw 0 -0785+ 8DAA 00 00 .StrAdr dw 0 -0786+ 8DAC -0787+ 8DAC -0372 8DAC include "util.asm";"D:\WORKAST\DEMON\util" -0001+ 8DAC ;[]=========================================================================[] -0002+ 8DAC ;[] Подпрограммы-утилиты монитора-отладчика DemoN [] -0003+ 8DAC ;[] v0.01 - последние изменения 29.08.2004 [] -0004+ 8DAC ;[] v0.02 - последние изменения 20.03.2005 [] -0005+ 8DAC ;[] v0.03 - последние изменения 25.02.2006 [] -0006+ 8DAC ;[] v0.10 - последние изменения 17.05.2006 [] -0007+ 8DAC ;[] [] -0008+ 8DAC ;[] SaveAllRegs - сохранение значений регистровых пар [] -0009+ 8DAC ;[] RestAllRegs - востановление значений регистровых пар [] -0010+ 8DAC ;[] PrnStrColor - печать строки символов с атрибутами [] -0011+ 8DAC ;[] PrintReg - печать двухбайтового числа [] -0012+ 8DAC ;[] PrintStrAF - печать значения регистровой пары AF и флагов [] -0013+ 8DAC ;[] PrintStrReg - печать значений регистровых пар с адресуемыми байтами [] -0014+ 8DAC ;[] PrintStrWin - печать номеров банок в окнах [] -0015+ 8DAC ;[] PrintSPDn - печать глубины стека [] -0016+ 8DAC ;[] PrintStrSp - печать значений стека [] -0017+ 8DAC ;[] PrintDump - печать дампа [] -0018+ 8DAC ;[] PrintStrDump - печать строки дампа [] -0019+ 8DAC ;[] ReplSymNoPrint - замена непечатных символов в строке [] -0020+ 8DAC ;[] NumToStr16 - формирование 16-тиричного числа [] -0021+ 8DAC ;[] NumToStr8 - формирование 8-ричного числа [] -0022+ 8DAC ;[] ConvHexStr - конвертирование числа в HEX-строку [] -0023+ 8DAC ;[] ConvDecStr - конвертирование 16-битного числа в DEC-строку [] -0024+ 8DAC ;[] CursorSet - прорисовка курсора [] -0025+ 8DAC ;[] CursorRes - востановление экрана под курсором [] -0026+ 8DAC ;[] Ld_a_bc - чтение байта из памяти с проверкой адреса, адрес в BC [] -0027+ 8DAC ;[] Ld_a_hl - чтение байта из памяти с проверкой адреса, адрес в HL [] -0028+ 8DAC ;[] Ld_hl_a - запись байта в память с проверкой адреса, адрес в HL [] -0029+ 8DAC ;[] AdrArea - определение принадлежности адреса области памяти [] -0030+ 8DAC ;[]=========================================================================[] -0031+ 8DAC -0032+ 8DAC ;[]=========================================================================[] -0033+ 8DAC ;[] Сохранение значений регистровых пар [] -0034+ 8DAC ;[]=========================================================================[] -0035+ 8DAC SaveAllRegs: -0036+ 8DAC 22 29 AB ld (Reg._HL),hl -0037+ 8DAF ED 53 2B AB ld (Reg._DE),de -0038+ 8DB3 ED 43 2D AB ld (Reg._BC),bc -0039+ 8DB7 -0040+ 8DB7 DD 22 25 AB ld (Reg._IX),ix -0041+ 8DBB FD 22 27 AB ld (Reg._IY),iy -0042+ 8DBF F5 push af -0043+ 8DC0 E1 pop hl -0044+ 8DC1 22 2F AB ld (Reg._AF),hl -0045+ 8DC4 ED 5F ld a,r -0046+ 8DC6 32 39 AB ld (Reg._IR),a -0047+ 8DC9 ED 57 ld a,i -0048+ 8DCB 32 3A AB ld (Reg._IR+1),a -0049+ 8DCE -0050+ 8DCE D9 exx -0051+ 8DCF 08 ex af,af' -0052+ 8DD0 -0053+ 8DD0 22 31 AB ld (Reg._HL_),hl -0054+ 8DD3 ED 53 33 AB ld (Reg._DE_),de -0055+ 8DD7 ED 43 35 AB ld (Reg._BC_),bc -0056+ 8DDB F5 push af -0057+ 8DDC E1 pop hl -0058+ 8DDD 22 37 AB ld (Reg._AF_),hl -0059+ 8DE0 08 ex af,af' -0060+ 8DE1 D9 exx -0061+ 8DE2 -0062+ 8DE2 21 3F AB ld hl,WinPage ;сохранение номеров страниц -0063+ 8DE5 DB 82 in a,(EmmWin.P0) ;0-е окно -0064+ 8DE7 77 ld (hl),a -0065+ 8DE8 23 inc hl -0066+ 8DE9 DB A2 in a,(EmmWin.P1) ;1-е окно -0067+ 8DEB 77 ld (hl),a -0068+ 8DEC 23 inc hl -0069+ 8DED DB C2 in a,(EmmWin.P2) ;2-е окно -0070+ 8DEF 77 ld (hl),a -0071+ 8DF0 23 inc hl -0072+ 8DF1 DB E2 in a,(EmmWin.P3) ;3-е окно -0073+ 8DF3 77 ld (hl),a -0074+ 8DF4 C9 ret -0075+ 8DF5 -0076+ 8DF5 ;[]=========================================================================[] -0077+ 8DF5 ;[] Востановление значений регистровых пар [] -0078+ 8DF5 ;[]=========================================================================[] -0079+ 8DF5 RestAllRegs: -0080+ 8DF5 3A 39 AB ld a,(Reg._IR) -0081+ 8DF8 ED 4F ld r,a -0082+ 8DFA 3A 3A AB ld a,(Reg._IR+1) -0083+ 8DFD ED 47 ld i,a -0084+ 8DFF 2A 2F AB ld hl,(Reg._AF) -0085+ 8E02 E5 push hl -0086+ 8E03 F1 pop af -0087+ 8E04 2A 29 AB ld hl,(Reg._HL) -0088+ 8E07 ED 5B 2B AB ld de,(Reg._DE) -0089+ 8E0B ED 4B 2D AB ld bc,(Reg._BC) -0090+ 8E0F DD 2A 25 AB ld ix,(Reg._IX) -0091+ 8E13 FD 2A 27 AB ld iy,(Reg._IY) -0092+ 8E17 -0093+ 8E17 D9 exx -0094+ 8E18 08 ex af,af' -0095+ 8E19 2A 37 AB ld hl,(Reg._AF_) -0096+ 8E1C E5 push hl -0097+ 8E1D F1 pop af -0098+ 8E1E 2A 31 AB ld hl,(Reg._HL_) -0099+ 8E21 ED 5B 33 AB ld de,(Reg._DE_) -0100+ 8E25 ED 4B 35 AB ld bc,(Reg._BC_) -0101+ 8E29 08 ex af,af' -0102+ 8E2A D9 exx -0103+ 8E2B -0104+ 8E2B C9 ret -0105+ 8E2C -0106+ 8E2C ;[]=========================================================================[] -0107+ 8E2C ;[] Печать строки символов [] -0108+ 8E2C ;[] Вход: HL - адрес строки символов [] -0109+ 8E2C ;[] [] -0110+ 8E2C ;[] Формат строки: 0x16, Столбец, Строка, Символы, 0x00 [] -0111+ 8E2C ;[]=========================================================================[] -0112+ 8E2C 3A 11 AB ld a,(Color.Screen) ;основной цвет -0113+ 8E2F 32 5C 8E ld (PrnStrColor.L1+5),a -0114+ 8E32 PrnStrColor: -0115+ 8E32 7E ld a,(hl) -0116+ 8E33 FE 16 cp 0x16 ;код установки позиции курсора -0117+ 8E35 20 0A jr nz,.L2 -0118+ 8E37 23 inc hl -0119+ 8E38 5E ld e,(hl) ;столбец -0120+ 8E39 7B ld a,e -0121+ 8E3A 32 66 8E ld (PrtXCoord),a -0122+ 8E3D 23 inc hl -0123+ 8E3E 56 ld d,(hl) ;строка -0124+ 8E3F 23 inc hl -0125+ 8E40 7E ld a,(hl) ;символ -0126+ 8E41 FE 0D .L2 cp 0x0D -0127+ 8E43 20 07 jr nz,.L3 -0128+ 8E45 14 inc d -0129+ 8E46 3A 66 8E ld a,(PrtXCoord) -0130+ 8E49 5F ld e,a -0131+ 8E4A 18 17 jr .L4 -0132+ 8E4C FE 17 .L3 cp 0x17 -0133+ 8E4E 20 07 jr nz,.L1 -0134+ 8E50 23 inc hl -0135+ 8E51 7E ld a,(hl) -0136+ 8E52 32 5C 8E ld (PrnStrColor.L1+5),a -0137+ 8E55 23 inc hl -0138+ 8E56 7E ld a,(hl) -0139+ 8E57 B7 .L1 or a -0140+ 8E58 C8 ret z ;выход если конец строки -0141+ 8E59 E5 push hl -0142+ 8E5A D5 push de -0143+ 8E5B ;печать ч/з биос или дсс? -0144+ 8E5B ifdef D_PRINTCH_BIOS -0145+ 8E5B~ ld h,0x03 ;атрибут -0146+ 8E5B~ ld l,a -0147+ 8E5B~ sub a ;идентификатор окна -0148+ 8E5B~ ; ld a,(Demon.Bios_Win) -0149+ 8E5B~ ld bc,SysSymb*256+Bios.Win_Put_Sym -0150+ 8E5B~ rst BiosRst -0151+ 8E5B else -0152+ 8E5B 06 03 ld b,0x03 -0153+ 8E5D 0E 58 ld c,Dss.WrChar -0154+ 8E5F D7 rst DssRst -0155+ 8E60 endif -0156+ 8E60 D1 pop de -0157+ 8E61 E1 pop hl -0158+ 8E62 1C inc e -0159+ 8E63 23 .L4 inc hl -0160+ 8E64 18 CC jr PrnStrColor -0161+ 8E66 00 PrtXCoord db 0 -0162+ 8E67 ;[]=========================================================================[] -0163+ 8E67 ;[] Печать двухбайтового числа [] -0164+ 8E67 ;[] Вход: DE - координаты печати [] -0165+ 8E67 ;[] HL - значение регистровой пары [] -0166+ 8E67 ;[]=========================================================================[] -0167+ 8E67 PrintReg: -0168+ 8E67 F3 di -0169+ 8E68 E5 push hl -0170+ 8E69 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати -0171+ 8E6B CF rst BiosRst -0172+ 8E6C E1 pop hl -0173+ 8E6D -0174+ 8E6D 3A 7E AB ld a,(DecHex) ;систем счисления -0175+ 8E70 B7 or a -0176+ 8E71 28 08 jr z,.Hex -0177+ 8E73 -0178+ 8E73 11 98 8E ld de,.String -0179+ 8E76 CD 91 91 call ConvDecStr -0180+ 8E79 18 14 jr .Print -0181+ 8E7B -0182+ 8E7B 3E 23 .Hex ld a,"#" -0183+ 8E7D 32 98 8E ld (.String),a -0184+ 8E80 4D ld c,l -0185+ 8E81 7C ld a,h -0186+ 8E82 CD 74 91 call ConvHexStr -0187+ 8E85 22 99 8E ld (.String+1),hl ;старший байт -0188+ 8E88 79 ld a,c -0189+ 8E89 CD 74 91 call ConvHexStr -0190+ 8E8C 22 9B 8E ld (.String+3),hl ;младший байт -0191+ 8E8F 21 98 8E .Print ld hl,.String ;печатаемая строка -0192+ 8E92 01 86 05 ld bc,5*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки -0193+ 8E95 CF rst BiosRst -0194+ 8E96 FB ei -0195+ 8E97 C9 ret -0196+ 8E98 -0197+ 8E98 2330313233 .String db "#0123" -0198+ 8E9D -0199+ 8E9D ;[]=========================================================================[] -0200+ 8E9D ;[] Печать значения регистровой пары AF и флагов [] -0201+ 8E9D ;[] Вход: DE - координаты печати [] -0202+ 8E9D ;[] HL - значение регистровой пары [] -0203+ 8E9D ;[]=========================================================================[] -0204+ 8E9D PrintStrAF: -0205+ 8E9D 7C ld a,h ;значение регистра A -0206+ 8E9E E5 push hl -0207+ 8E9F 32 09 8F ld (.String+11),a -0208+ 8EA2 -0209+ 8EA2 21 FF 8E ld hl,.String+1 ;двоичное значение -0210+ 8EA5 D5 push de -0211+ 8EA6 11 31 30 ld de,0x3031 ;"01" -0212+ 8EA9 06 08 ld b,8 -0213+ 8EAB 07 .L1 rlca -0214+ 8EAC 38 03 jr c,$+5 -0215+ 8EAE 72 ld (hl),d ;"0" -0216+ 8EAF 18 01 jr $+3 -0217+ 8EB1 73 ld (hl),e ;"1" -0218+ 8EB2 23 inc hl -0219+ 8EB3 10 F6 djnz .L1 -0220+ 8EB5 D1 pop de -0221+ 8EB6 -0222+ 8EB6 04 inc b ;B=1 -0223+ 8EB7 23 inc hl -0224+ 8EB8 23 inc hl -0225+ 8EB9 CD 27 91 call ReplSymNoPrint -0226+ 8EBC -0227+ 8EBC E1 pop hl -0228+ 8EBD 7D ld a,l ;флаги -0229+ 8EBE E5 push hl -0230+ 8EBF 21 0B 8F ld hl,.Flags -0231+ 8EC2 06 08 ld b,8 -0232+ 8EC4 CB 9F res 3,a ;сброс неизвестных флагов -0233+ 8EC6 CB AF res 5,a -0234+ 8EC8 07 .L2 rlca -0235+ 8EC9 38 04 jr c,$+6 -0236+ 8ECB CB EE set 5,(hl) ;сброшен -0237+ 8ECD 18 02 jr $+4 -0238+ 8ECF CB AE res 5,(hl) ;установлен -0239+ 8ED1 23 inc hl -0240+ 8ED2 10 F4 djnz .L2 -0241+ 8ED4 E1 pop hl -0242+ 8ED5 -0243+ 8ED5 D5 push de -0244+ 8ED6 CD 67 8E call PrintReg ;печать значения рег.пары -0245+ 8ED9 D1 pop de -0246+ 8EDA D5 push de -0247+ 8EDB 3E 06 ld a,6 -0248+ 8EDD 83 add a,e -0249+ 8EDE 5F ld e,a -0250+ 8EDF 0E 84 ld c,Bios.Lp_Set_Place -0251+ 8EE1 F3 di -0252+ 8EE2 CF rst BiosRst -0253+ 8EE3 21 FE 8E ld hl,.String -0254+ 8EE6 01 86 0D ld bc,13*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки -0255+ 8EE9 F3 di -0256+ 8EEA CF rst BiosRst -0257+ 8EEB D1 pop de -0258+ 8EEC 14 inc d -0259+ 8EED 1D dec e -0260+ 8EEE 1D dec e -0261+ 8EEF 1D dec e -0262+ 8EF0 0E 84 ld c,Bios.Lp_Set_Place -0263+ 8EF2 F3 di -0264+ 8EF3 CF rst BiosRst -0265+ 8EF4 21 0B 8F ld hl,.Flags -0266+ 8EF7 01 86 08 ld bc,8*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки -0267+ 8EFA F3 di -0268+ 8EFB CF rst BiosRst -0269+ 8EFC FB ei -0270+ 8EFD C9 ret -0271+ 8EFE -0272+ 8EFE .String db '%01010101 " "' -0272+ 8EFE 25303130313031303120222022 -0273+ 8F0B .Flags db "SZ.H.PNC" -0273+ 8F0B 535A2E482E504E43 -0274+ 8F13 -0275+ 8F13 ;[]=========================================================================[] -0276+ 8F13 ;[] Печать значений регистровых пар с адресуемыми байтами [] -0277+ 8F13 ;[] Вход: DE - координаты печати [] -0278+ 8F13 ;[] HL - значение регистровой пары [] -0279+ 8F13 ;[]=========================================================================[] -0280+ 8F13 PrintStrReg: -0281+ 8F13 E5 push hl -0282+ 8F14 44 ld b,h -0283+ 8F15 4D ld c,l -0284+ 8F16 -0285+ 8F16 CD 47 92 call Ld_a_bc ;ld a,(bc) адресуемые байты -0286+ 8F19 32 72 8F ld (.String+10),a -0287+ 8F1C CD 74 91 call ConvHexStr -0288+ 8F1F 22 68 8F ld (.String),hl -0289+ 8F22 03 inc bc -0290+ 8F23 CD 47 92 call Ld_a_bc ;ld a,(bc) -0291+ 8F26 32 73 8F ld (.String+11),a -0292+ 8F29 CD 74 91 call ConvHexStr -0293+ 8F2C 22 6A 8F ld (.String+2),hl -0294+ 8F2F 03 inc bc -0295+ 8F30 CD 47 92 call Ld_a_bc ;ld a,(bc) -0296+ 8F33 32 74 8F ld (.String+12),a -0297+ 8F36 CD 74 91 call ConvHexStr -0298+ 8F39 22 6D 8F ld (.String+5),hl -0299+ 8F3C 03 inc bc -0300+ 8F3D CD 47 92 call Ld_a_bc ;ld a,(bc) -0301+ 8F40 32 75 8F ld (.String+13),a -0302+ 8F43 CD 74 91 call ConvHexStr -0303+ 8F46 22 6F 8F ld (.String+7),hl -0304+ 8F49 -0305+ 8F49 21 72 8F ld hl,.String+10 ;замена непечатных символов -0306+ 8F4C 06 04 ld b,4 -0307+ 8F4E CD 27 91 call ReplSymNoPrint -0308+ 8F51 -0309+ 8F51 E1 pop hl -0310+ 8F52 D5 push de -0311+ 8F53 CD 67 8E call PrintReg ;печать значения рег.пары -0312+ 8F56 D1 pop de -0313+ 8F57 F3 di -0314+ 8F58 3E 06 ld a,6 -0315+ 8F5A 83 add a,e -0316+ 8F5B 5F ld e,a -0317+ 8F5C 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати -0318+ 8F5E CF rst BiosRst -0319+ 8F5F 21 68 8F ld hl,.String ;печатаемая строка -0320+ 8F62 01 86 0E ld bc,14*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки -0321+ 8F65 CF rst BiosRst -0322+ 8F66 FB ei -0323+ 8F67 C9 ret -0324+ 8F68 -0325+ 8F68 .String db "0123 4567 ABCD" -0325+ 8F68 3031323320343536372041424344 -0326+ 8F76 -0327+ 8F76 ;[]=========================================================================[] -0328+ 8F76 ;[] Печать номеров банок в окнах [] -0329+ 8F76 ;[] Вход: HL - адрес сохраненных номеров [] -0330+ 8F76 ;[]=========================================================================[] -0331+ 8F76 PrintStrWin: -0332+ 8F76 21 3F AB ld hl,WinPage ;вывод номеров банок в окнах -0333+ 8F79 11 98 8F ld de,.String+3 -0334+ 8F7C 06 04 ld b,4 -0335+ 8F7E C5 .L1 push bc -0336+ 8F7F 7E ld a,(hl) -0337+ 8F80 23 inc hl -0338+ 8F81 E5 push hl -0339+ 8F82 6F ld l,a -0340+ 8F83 26 00 ld h,0 -0341+ 8F85 CD 5E 91 call NumToStr8 ;конвертирование в HEX-строку -0342+ 8F88 13 inc de -0343+ 8F89 13 inc de -0344+ 8F8A 13 inc de -0345+ 8F8B E1 pop hl -0346+ 8F8C C1 pop bc -0347+ 8F8D 10 EF djnz .L1 -0348+ 8F8F -0349+ 8F8F 21 95 8F ld hl,.String -0350+ 8F92 C3 2C 8E jp PrnStrColor-6 -0351+ 8F95 -0352+ 8F95 .String db 0x16,0x02,0x12,"#01" -0352+ 8F95 160212233031 -0353+ 8F9B db 0x16,0x08,0x12,"#02" -0353+ 8F9B 160812233032 -0354+ 8FA1 db 0x16,0x0E,0x12,"#03" -0354+ 8FA1 160E12233033 -0355+ 8FA7 db 0x16,0x14,0x12,"#04",0 -0355+ 8FA7 16141223303400 -0356+ 8FAE -0357+ 8FAE ;[]=========================================================================[] -0358+ 8FAE ;[] Печать глубины стека [] -0359+ 8FAE ;[]=========================================================================[] -0360+ 8FAE PrintSPDn: -0361+ 8FAE 3A 22 AB ld a,(StackDown) -0362+ 8FB1 6F ld l,a -0363+ 8FB2 3E 7F ld a,0x7F -0364+ 8FB4 BD cp l ;отрицательное? -0365+ 8FB5 30 05 jr nc,.L1 -0366+ 8FB7 CB BD res 7,l ;сбросить минус -0367+ 8FB9 3C inc a -0368+ 8FBA 95 sub l -0369+ 8FBB 6F ld l,a -0370+ 8FBC 26 00 .L1 ld h,0 -0371+ 8FBE 11 F2 8F ld de,.String+1 -0372+ 8FC1 D5 push de -0373+ 8FC2 CD AF 91 call ConvDecStr8 -0374+ 8FC5 E1 pop hl -0375+ 8FC6 2B dec hl -0376+ 8FC7 01 30 03 ld bc,3*256+"0" -0377+ 8FCA 71 ld (hl),c -0378+ 8FCB 7E ld a,(hl) ;гашение незначащих нулей -0379+ 8FCC B9 cp c -0380+ 8FCD 20 06 jr nz,$+8 -0381+ 8FCF 3E 20 ld a,0x20 -0382+ 8FD1 77 ld (hl),a -0383+ 8FD2 23 inc hl -0384+ 8FD3 10 F6 djnz $-8 -0385+ 8FD5 3A 22 AB ld a,(StackDown) -0386+ 8FD8 CB 7F bit 7,a -0387+ 8FDA 28 04 jr z,$+6 -0388+ 8FDC 2B dec hl ;отрицательное число -0389+ 8FDD 3E 2D ld a,"-" -0390+ 8FDF 77 ld (hl),a -0391+ 8FE0 -0392+ 8FE0 11 0A 14 ld de,0x140A -0393+ 8FE3 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати -0394+ 8FE5 F3 di -0395+ 8FE6 CF rst BiosRst -0396+ 8FE7 21 F1 8F ld hl,.String ;печатаемая строка -0397+ 8FEA 01 86 04 ld bc,4*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки -0398+ 8FED F3 di -0399+ 8FEE CF rst BiosRst -0400+ 8FEF FB ei -0401+ 8FF0 C9 ret -0402+ 8FF1 -0403+ 8FF1 00 .String ds 4 -0404+ 8FF5 -0405+ 8FF5 ;[]=========================================================================[] -0406+ 8FF5 ;[] Печать значений стека [] -0407+ 8FF5 ;[]=========================================================================[] -0408+ 8FF5 PrintStrSP: -0409+ 8FF5 3A 66 90 ld a,(.StrSp) ;строка с вершиной стека -0410+ 8FF8 3C inc a -0411+ 8FF9 28 0D jr z,.L4 ;если вершина стека не попадает в дамп -0412+ 8FFB 2A 3B AB ld hl,(Reg._SP) -0413+ 8FFE 2B dec hl -0414+ 8FFF 2B dec hl -0415+ 9000 23 inc hl -0416+ 9001 23 inc hl -0417+ 9002 3D dec a -0418+ 9003 20 FB jr nz,$-3 -0419+ 9005 22 23 AB ld (StackDump),hl -0420+ 9008 -0421+ 9008 2A 23 AB .L4 ld hl,(StackDump) ;начало дампа -0422+ 900B 11 01 16 ld de,#1601 ;координаты печати -0423+ 900E 3E FF ld a,-1 -0424+ 9010 32 66 90 ld (.StrSp),a -0425+ 9013 -0426+ 9013 06 08 ld b,8 ;кол-во строк дампа -0427+ 9015 C5 .L3 push bc -0428+ 9016 D5 push de ;координаты -0429+ 9017 E5 push hl -0430+ 9018 B7 or a ;сброс флага C -0431+ 9019 78 ld a,b -0432+ 901A ED 4B 3B AB ld bc,(Reg._SP) ;адрес вершины стека -0433+ 901E ED 42 sbc hl,bc -0434+ 9020 20 0C jr nz,.L2 -0435+ 9022 47 ld b,a -0436+ 9023 3E 08 ld a,8 -0437+ 9025 90 sub b -0438+ 9026 32 66 90 ld (.StrSp),a ;номер строки в дампе с вершиной стека -0439+ 9029 3A 15 AB ld a,(Color._SP) ;цвет вершины стека -0440+ 902C 18 03 jr .L2+3 -0441+ 902E 3A 11 AB .L2 ld a,(Color.Screen) ;основной цвет -0442+ 9031 32 39 90 ld (.L1+1),a ;записали цвет -0443+ 9034 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати -0444+ 9036 F3 di -0445+ 9037 CF rst BiosRst -0446+ 9038 1E 00 .L1 ld e,0 ;цвет подсветки -0447+ 903A 01 83 0B ld bc,11*256+Bios.Lp_Print_Atr ;в рег.B длина строки -0448+ 903D CF rst BiosRst -0449+ 903E E1 pop hl -0450+ 903F D1 pop de -0451+ 9040 D5 push de -0452+ 9041 E5 push hl -0453+ 9042 CD 67 8E call PrintReg ;печать адреса -0454+ 9045 E1 pop hl -0455+ 9046 D1 pop de -0456+ 9047 D5 push de -0457+ 9048 2B dec hl -0458+ 9049 2B dec hl -0459+ 904A E5 push hl -0460+ 904B 3E 06 ld a,6 -0461+ 904D 83 add a,e -0462+ 904E 5F ld e,a -0463+ 904F -0464+ 904F 23 inc hl -0465+ 9050 23 inc hl -0466+ 9051 CD 6C 92 call Ld_a_hl -0467+ 9054 4F ld c,a -0468+ 9055 23 inc hl -0469+ 9056 CD 6C 92 call Ld_a_hl -0470+ 9059 6F ld l,a -0471+ 905A 61 ld h,c -0472+ 905B -0473+ 905B CD 67 8E call PrintReg ;печать значения стека -0474+ 905E E1 pop hl -0475+ 905F D1 pop de -0476+ 9060 14 inc d -0477+ 9061 C1 pop bc -0478+ 9062 10 B1 djnz .L3 -0479+ 9064 FB ei -0480+ 9065 C9 ret -0481+ 9066 -0482+ 9066 06 .StrSp db 6 -0483+ 9067 -0484+ 9067 ;[]=========================================================================[] -0485+ 9067 ;[] Печать дампа [] -0486+ 9067 ;[]=========================================================================[] -0487+ 9067 PrintDump: -0488+ 9067 11 0E 16 ld de,0x160E ;координаты -0489+ 906A 2A 43 AB ld hl,(Dump1) -0490+ 906D 06 08 ld b,8 ;количество строк -0491+ 906F D5 push de -0492+ 9070 C5 push bc -0493+ 9071 E5 push hl -0494+ 9072 CD 97 90 call PrintStrDump -0495+ 9075 E1 pop hl -0496+ 9076 01 10 00 ld bc,16 -0497+ 9079 09 add hl,bc -0498+ 907A C1 pop bc -0499+ 907B D1 pop de -0500+ 907C 14 inc d ;следующая строка -0501+ 907D 10 F0 djnz $-14 -0502+ 907F C9 ret -0503+ 9080 -0504+ 9080 21 45 AB ld hl,Dump ;вывод дампа -0505+ 9083 ; ld de,0x160E ;координаты -0506+ 9083 06 08 ld b,8 ;количество строк -0507+ 9085 D5 push de -0508+ 9086 C5 push bc -0509+ 9087 4E ld c,(hl) ;младший байт адреса -0510+ 9088 23 inc hl -0511+ 9089 E5 push hl -0512+ 908A 66 ld h,(hl) ;старший байт адреса -0513+ 908B 69 ld l,c -0514+ 908C CD 97 90 call PrintStrDump -0515+ 908F E1 pop hl -0516+ 9090 23 inc hl -0517+ 9091 C1 pop bc -0518+ 9092 D1 pop de -0519+ 9093 14 inc d ;следующая строка -0520+ 9094 10 EF djnz $-15 -0521+ 9096 C9 ret -0522+ 9097 -0523+ 9097 ;[]=========================================================================[] -0524+ 9097 ;[] Печать строки дампа [] -0525+ 9097 ;[] Вход: DE - координаты печати [] -0526+ 9097 ;[] HL - адрес начала строки [] -0527+ 9097 ;[]=========================================================================[] -0528+ 9097 PrintStrDump: -0529+ 9097 D5 push de -0530+ 9098 E5 push hl -0531+ 9099 -0532+ 9099 44 ld b,h -0533+ 909A 4D ld c,l -0534+ 909B 11 EE 90 ld de,.String -0535+ 909E DD 21 17 91 ld ix,.String+41 -0536+ 90A2 DD E5 push ix -0537+ 90A4 -0538+ 90A4 3E 08 ld a,8 -0539+ 90A6 08 .L1 exa -0540+ 90A7 CD 47 92 call Ld_a_bc ;ld a,(bc) -0541+ 90AA DD 77 00 ld (ix),a -0542+ 90AD DD 23 inc ix -0543+ 90AF CD 74 91 call ConvHexStr -0544+ 90B2 EB ex de,hl -0545+ 90B3 73 ld (hl),e -0546+ 90B4 23 inc hl -0547+ 90B5 72 ld (hl),d -0548+ 90B6 23 inc hl -0549+ 90B7 EB ex de,hl -0550+ 90B8 03 inc bc -0551+ 90B9 CD 47 92 call Ld_a_bc ;ld a,(bc) -0552+ 90BC DD 77 00 ld (ix),a -0553+ 90BF DD 23 inc ix -0554+ 90C1 CD 74 91 call ConvHexStr -0555+ 90C4 EB ex de,hl -0556+ 90C5 73 ld (hl),e -0557+ 90C6 23 inc hl -0558+ 90C7 72 ld (hl),d -0559+ 90C8 23 inc hl -0560+ 90C9 23 inc hl -0561+ 90CA EB ex de,hl -0562+ 90CB 03 inc bc -0563+ 90CC 08 exa -0564+ 90CD 3D dec a -0565+ 90CE 20 D6 jr nz,.L1 -0566+ 90D0 -0567+ 90D0 06 10 ld b,16 -0568+ 90D2 E1 pop hl -0569+ 90D3 CD 27 91 call ReplSymNoPrint ;замена непечатных символов -0570+ 90D6 -0571+ 90D6 E1 pop hl -0572+ 90D7 D1 pop de -0573+ 90D8 D5 push de -0574+ 90D9 CD 67 8E call PrintReg ;печать адреса строки -0575+ 90DC D1 pop de -0576+ 90DD F3 di -0577+ 90DE 3E 07 ld a,7 -0578+ 90E0 83 add a,e -0579+ 90E1 5F ld e,a -0580+ 90E2 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати -0581+ 90E4 CF rst BiosRst -0582+ 90E5 21 EE 90 ld hl,.String -0583+ 90E8 01 86 39 ld bc,57*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки -0584+ 90EB CF rst BiosRst -0585+ 90EC FB ei -0586+ 90ED C9 ret -0587+ 90EE -0588+ 90EE .String db "1000 2000 3000 4000 5000 6000 7000 8000 " -0588+ 90EE 3130303020323030302033303030203430303020353030302036303030203730 -0588+ 910E 303020383030302020 -0589+ 9117 db "0123456789ABCDEF" -0589+ 9117 30313233343536373839414243444546 -0590+ 9127 -0591+ 9127 ;[]=========================================================================[] -0592+ 9127 ;[] Замена непечатных символов в строке [] -0593+ 9127 ;[] Вход: B - длина строки [] -0594+ 9127 ;[] HL - адрес начала строки [] -0595+ 9127 ;[]=========================================================================[] -0596+ 9127 ReplSymNoPrint: -0597+ 9127 3A 5C AA ld a,(SymbolNoPrint) -0598+ 912A 4F ld c,a -0599+ 912B 7E .L1 ld a,(hl) -0600+ 912C FE 7F cp 127 -0601+ 912E 28 08 jr z,$+10 -0602+ 9130 FE FF cp 0xFF -0603+ 9132 28 04 jr z,$+6 -0604+ 9134 FE 20 cp " " -0605+ 9136 30 01 jr nc,$+3 -0606+ 9138 71 ld (hl),c -0607+ 9139 23 inc hl -0608+ 913A 10 EF djnz .L1 -0609+ 913C C9 ret -0610+ 913D -0611+ 913D ;[]=========================================================================[] -0612+ 913D ;[] Формирование 16-тибитного числа [] -0613+ 913D ;[] Вход: DE - адрес буфера [] -0614+ 913D ;[] HL - число [] -0615+ 913D ;[]=========================================================================[] -0616+ 913D NumToStr16: -0617+ 913D 3A 7E AB ld a,(DecHex) ;систем счисления -0618+ 9140 B7 or a -0619+ 9141 C2 91 91 jp nz,ConvDecStr -0620+ 9144 -0621+ 9144 3E 23 ld a,"#" -0622+ 9146 12 ld (de),a -0623+ 9147 13 inc de -0624+ 9148 4D ld c,l -0625+ 9149 7C ld a,h -0626+ 914A CD 74 91 call ConvHexStr -0627+ 914D EB ex de,hl -0628+ 914E 73 ld (hl),e ;старший байт -0629+ 914F 23 inc hl -0630+ 9150 72 ld (hl),d -0631+ 9151 23 inc hl -0632+ 9152 EB ex de,hl -0633+ 9153 79 ld a,c -0634+ 9154 CD 74 91 call ConvHexStr -0635+ 9157 EB ex de,hl -0636+ 9158 73 ld (hl),e ;младший байт -0637+ 9159 23 inc hl -0638+ 915A 72 ld (hl),d -0639+ 915B 23 inc hl -0640+ 915C EB ex de,hl -0641+ 915D C9 ret -0642+ 915E -0643+ 915E ;[]=========================================================================[] -0644+ 915E ;[] Формирование 8-битного числа [] -0645+ 915E ;[] Вход: DE - адрес буфера [] -0646+ 915E ;[] HL - число [] -0647+ 915E ;[]=========================================================================[] -0648+ 915E NumToStr8: -0649+ 915E 3A 7E AB ld a,(DecHex) ;систем счисления -0650+ 9161 B7 or a -0651+ 9162 C2 AF 91 jp nz,ConvDecStr8 -0652+ 9165 -0653+ 9165 3E 23 .Hex ld a,"#" -0654+ 9167 12 ld (de),a -0655+ 9168 13 inc de -0656+ 9169 7D ld a,l -0657+ 916A CD 74 91 call ConvHexStr -0658+ 916D EB ex de,hl -0659+ 916E 73 ld (hl),e -0660+ 916F 23 inc hl -0661+ 9170 72 ld (hl),d -0662+ 9171 23 inc hl -0663+ 9172 EB ex de,hl -0664+ 9173 C9 ret -0665+ 9174 -0666+ 9174 ;[]=========================================================================[] -0667+ 9174 ;[] Конвертирование числа в HEX-строку [] -0668+ 9174 ;[] Вход: A - число [] -0669+ 9174 ;[] Выход: HL - HEX-строка [] -0670+ 9174 ;[]=========================================================================[] -0671+ 9174 ConvHexStr: -0672+ 9174 F5 push af -0673+ 9175 0F rrca -0674+ 9176 0F rrca -0675+ 9177 0F rrca -0676+ 9178 0F rrca -0677+ 9179 E6 0F and 0x0F -0678+ 917B C6 30 add a,0x30 -0679+ 917D FE 3A cp 0x3A -0680+ 917F 38 02 jr c,$+4 -0681+ 9181 C6 07 add a,7 -0682+ 9183 -0683+ 9183 6F ld l,a -0684+ 9184 F1 pop af -0685+ 9185 E6 0F and 0x0F -0686+ 9187 C6 30 add a,0x30 -0687+ 9189 FE 3A cp 0x3A -0688+ 918B 38 02 jr c,$+4 -0689+ 918D C6 07 add a,7 -0690+ 918F 67 ld h,a -0691+ 9190 C9 ret -0692+ 9191 -0693+ 9191 ;[]=========================================================================[] -0694+ 9191 ;[] Конвертирование 16-битного числа в DEC-строку [] -0695+ 9191 ;[] Вход: HL - число [] -0696+ 9191 ;[] DE - адрес начала DEC-строки [] -0697+ 9191 ;[]=========================================================================[] -0698+ 9191 ConvDecStr: -0699+ 9191 01 F0 D8 ld bc,-10000 -0700+ 9194 3E FF ld a,0xFF -0701+ 9196 3C inc a -0702+ 9197 09 add hl,bc -0703+ 9198 38 FC jr c,$-2 -0704+ 919A ED 42 sbc hl,bc -0705+ 919C C6 30 add a,"0" -0706+ 919E 12 ld (de),a -0707+ 919F 13 inc de -0708+ 91A0 -0709+ 91A0 01 18 FC ld bc,-1000 -0710+ 91A3 3E FF ld a,0xFF -0711+ 91A5 3C inc a -0712+ 91A6 09 add hl,bc -0713+ 91A7 38 FC jr c,$-2 -0714+ 91A9 ED 42 sbc hl,bc -0715+ 91AB C6 30 add a,"0" -0716+ 91AD 12 ld (de),a -0717+ 91AE 13 inc de -0718+ 91AF ConvDecStr8: -0719+ 91AF 01 9C FF ld bc,-100 -0720+ 91B2 3E FF ld a,0xFF -0721+ 91B4 3C inc a -0722+ 91B5 09 add hl,bc -0723+ 91B6 38 FC jr c,$-2 -0724+ 91B8 ED 42 sbc hl,bc -0725+ 91BA C6 30 add a,"0" -0726+ 91BC 12 ld (de),a -0727+ 91BD 13 inc de -0728+ 91BE ConvDecStr8_1: -0729+ 91BE 01 F6 FF ld bc,-10 -0730+ 91C1 3E FF ld a,0xFF -0731+ 91C3 3C inc a -0732+ 91C4 09 add hl,bc -0733+ 91C5 38 FC jr c,$-2 -0734+ 91C7 ED 42 sbc hl,bc -0735+ 91C9 -0736+ 91C9 C6 30 add a,"0" -0737+ 91CB 12 ld (de),a -0738+ 91CC 13 inc de -0739+ 91CD -0740+ 91CD 7D ld a,l -0741+ 91CE C6 30 add a,"0" -0742+ 91D0 12 ld (de),a -0743+ 91D1 13 inc de -0744+ 91D2 C9 ret -0745+ 91D3 -0746+ 91D3 ;[]=========================================================================[] -0747+ 91D3 ;[] Прорисовка курсора [] -0748+ 91D3 ;[] Вход: B - длина курсора [] -0749+ 91D3 ;[] HL - координаты курсора [] -0750+ 91D3 ;[]=========================================================================[] -0751+ 91D3 CursorSet: -0752+ 91D3 22 36 92 ld (CursorRes+1),hl -0753+ 91D6 EB ex de,hl -0754+ 91D7 68 ld l,b ;размер по вертикали -0755+ 91D8 26 01 ld h,1 ;размер по горизонтали -0756+ 91DA 22 39 92 ld (CursorRes+4),hl -0757+ 91DD DD 21 09 92 ld ix,.Buffer -0758+ 91E1 D5 push de -0759+ 91E2 E5 push hl -0760+ 91E3 DD E5 push ix -0761+ 91E5 C5 push bc -0762+ 91E6 ifdef D_PRINTCH_BIOS -0763+ 91E6~ xor a -0764+ 91E6~ ld c,Bios.Win_Copy_Win ;копирование в буфер -0765+ 91E6~ di -0766+ 91E6~ rst BiosRst -0767+ 91E6~ ei -0768+ 91E6 else -0769+ 91E6 3A 1E AB ld a,(BankDebug) -0770+ 91E9 47 ld b,a -0771+ 91EA 0E 59 ld c,Dss.WinCopy -0772+ 91EC D7 rst DssRst -0773+ 91ED endif -0774+ 91ED -0775+ 91ED C1 pop bc ;в B длина курсора -0776+ 91EE E1 pop hl -0777+ 91EF E5 push hl -0778+ 91F0 23 inc hl -0779+ 91F1 7E ld a,(hl) ;цвет символов -0780+ 91F2 32 43 92 ld (CursorRes.L1+1),a -0781+ 91F5 3A 19 AB ld a,(Color.Cursor) -0782+ 91F8 77 .L1 ld (hl),a -0783+ 91F9 23 inc hl ;к байту цвета -0784+ 91FA 23 inc hl -0785+ 91FB 10 FB djnz .L1 -0786+ 91FD -0787+ 91FD DD E1 pop ix -0788+ 91FF E1 pop hl -0789+ 9200 D1 pop de -0790+ 9201 ifdef D_PRINTCH_BIOS -0791+ 9201~ xor a -0792+ 9201~ ld c,Bios.Win_Restore_Win ;вывод курсора на экран -0793+ 9201~ di -0794+ 9201~ rst BiosRst -0795+ 9201~ ei -0796+ 9201 else -0797+ 9201 3A 1E AB ld a,(BankDebug) -0798+ 9204 47 ld b,a -0799+ 9205 0E 5A ld c,Dss.WinRest -0800+ 9207 D7 rst DssRst -0801+ 9208 endif -0802+ 9208 C9 ret -0803+ 9209 -0804+ 9209 00 .Buffer ds 22*2 ;max длина курсора -0805+ 9235 -0806+ 9235 ;[]=========================================================================[] -0807+ 9235 ;[] Востановление экрана под курсором [] -0808+ 9235 ;[]=========================================================================[] -0809+ 9235 CursorRes: -0810+ 9235 11 00 00 ld de,0 ;координаты -0811+ 9238 21 00 00 ld hl,0 ;размер -0812+ 923B 45 ld b,l ;длина -0813+ 923C D5 push de -0814+ 923D E5 push hl -0815+ 923E 21 09 92 ld hl,CursorSet.Buffer -0816+ 9241 E5 push hl -0817+ 9242 3E 00 .L1 ld a,0 ;цвет -0818+ 9244 23 inc hl ;к байту цвета -0819+ 9245 18 B1 jr CursorSet.L1 -0820+ 9247 -0821+ 9247 ;[]=========================================================================[] -0822+ 9247 ;[] Чтение байта из памяти с проверкой адреса [] -0823+ 9247 ;[] Вход: BC или HL - адрес в памяти [] -0824+ 9247 ;[] Выход: A - считанный байт [] -0825+ 9247 ;[]=========================================================================[] -0826+ 9247 Ld_a_bc: -0827+ 9247 3E C0 ld a,11000000b ;проверка диапазона -0828+ 9249 A0 and b -0829+ 924A 28 10 jr z,.L1 ;в 0-м окне -0830+ 924C FE 80 cp 10000000b ;во 2-ом окне -0831+ 924E 0A ld a,(bc) -0832+ 924F C0 ret nz ;возвращаем байт, если нет -0833+ 9250 3A 41 AB ld a,(WinPage+2) ;номер банки под отладчиком -0834+ 9253 D3 E2 out (EmmWin.P3),a ;в третье окно ее -0835+ 9255 CB F0 set 6,b ;корректируем адрес -0836+ 9257 0A ld a,(bc) ;читаем байт -0837+ 9258 CB B0 res 6,b ;востанавливаем адрес -0838+ 925A 18 33 jr Ld_a_hl.L1 -0839+ 925C 3A 3F AB .L1 ld a,(WinPage) ;номер банки в 0-м -0840+ 925F D3 E2 out (EmmWin.P3),a ;в третье окно ее -0841+ 9261 CB F0 set 6,b ;корректируем адрес -0842+ 9263 CB F8 set 7,b -0843+ 9265 0A ld a,(bc) ;читаем байт -0844+ 9266 CB B0 res 6,b ;востанавливаем адрес -0845+ 9268 CB B8 res 7,b -0846+ 926A 18 23 jr Ld_a_hl.L1 -0847+ 926C Ld_a_hl: -0848+ 926C 3E C0 ld a,11000000b ;проверка диапазона -0849+ 926E A4 and h -0850+ 926F 28 10 jr z,.L2 ;в 0-м окне -0851+ 9271 FE 80 cp 10000000b ;во 2-ом окне -0852+ 9273 7E ld a,(hl) -0853+ 9274 C0 ret nz ;возвращаем байт, если нет -0854+ 9275 3A 41 AB ld a,(WinPage+2) ;номер банки под отладчиком -0855+ 9278 D3 E2 out (EmmWin.P3),a ;в третье окно ее -0856+ 927A CB F4 set 6,h ;корректируем адрес -0857+ 927C 7E ld a,(hl) ;читаем байт -0858+ 927D CB B4 res 6,h ;востанавливаем адрес -0859+ 927F 18 0E jr .L1 -0860+ 9281 3A 3F AB .L2 ld a,(WinPage) ;номер банки в 0-м окне -0861+ 9284 D3 E2 out (EmmWin.P3),a ;в третье окно ее -0862+ 9286 CB F4 set 6,h ;корректируем адрес -0863+ 9288 CB FC set 7,h -0864+ 928A 7E ld a,(hl) ;читаем байт -0865+ 928B CB B4 res 6,h ;востанавливаем адрес -0866+ 928D CB BC res 7,h -0867+ 928F F5 .L1 push af -0868+ 9290 3A 42 AB ld a,(WinPage+3) ;номер банки из 3-го окна -0869+ 9293 D3 E2 out (EmmWin.P3),a ;востанавливаем -0870+ 9295 F1 pop af -0871+ 9296 C9 ret -0872+ 9297 -0873+ 9297 ;[]=========================================================================[] -0874+ 9297 ;[] Запись байта в память с проверкой адреса [] -0875+ 9297 ;[] Вход: HL - адрес в памяти [] -0876+ 9297 ;[] A - записываемый байт [] -0877+ 9297 ;[]=========================================================================[] -0878+ 9297 Ld_hl_a: -0879+ 9297 F5 push af -0880+ 9298 3E C0 ld a,11000000b ;проверка диапазона -0881+ 929A A4 and h -0882+ 929B 28 12 jr z,.L2 ;в 0-ом окне -0883+ 929D FE 80 cp 10000000b ;во 2-ом окне? -0884+ 929F 28 03 jr z,.L1 -0885+ 92A1 F1 pop af -0886+ 92A2 77 ld (hl),a ;записали байт, если нет -0887+ 92A3 C9 ret -0888+ 92A4 3A 41 AB .L1 ld a,(WinPage+2) ;номер банки под отладчиком -0889+ 92A7 D3 E2 out (EmmWin.P3),a ;в третье окно ее -0890+ 92A9 CB F4 set 6,h ;корректируем адрес -0891+ 92AB F1 pop af -0892+ 92AC 77 ld (hl),a ;пишем байт -0893+ 92AD 18 0D jr .L3 -0894+ 92AF 3A 3F AB .L2 ld a,(WinPage) ;номер банки в 0-ом -0895+ 92B2 D3 E2 out (EmmWin.P3),a ;в третье окно ее -0896+ 92B4 CB F4 set 6,h ;корректируем адрес -0897+ 92B6 CB FC set 7,h -0898+ 92B8 F1 pop af -0899+ 92B9 77 ld (hl),a ;пишем байт -0900+ 92BA CB BC res 7,h ;востанавливаем адрес -0901+ 92BC CB B4 .L3 res 6,h -0902+ 92BE 3A 42 AB ld a,(WinPage+3) ;номер банки из 3-го окна -0903+ 92C1 D3 E2 out (EmmWin.P3),a ;востанавливаем -0904+ 92C3 C9 ret -0905+ 92C4 -0906+ 92C4 ;[]=========================================================================[] -0907+ 92C4 ;[] Определение принадлежности адреса области памяти [] -0908+ 92C4 ;[] Вход: HL - нижний адрес области памяти [] -0909+ 92C4 ;[] DE - верхний адрес области памяти [] -0910+ 92C4 ;[] BC - адрес [] -0911+ 92C4 ;[] Выход: флаг C - адрес не принадлежит области памяти [] -0912+ 92C4 ;[] флаг NC - адрес принадлежит области памяти [] -0913+ 92C4 ;[]=========================================================================[] -0914+ 92C4 AdrArea: -0915+ 92C4 B7 or a -0916+ 92C5 ED 42 sbc hl,bc -0917+ 92C7 D8 ret c -0918+ 92C8 EB ex de,hl -0919+ 92C9 B7 or a -0920+ 92CA ED 42 sbc hl,bc -0921+ 92CC 3F ccf -0922+ 92CD C9 ret -0923+ 92CE -0924+ 92CE -0373 92CE include "file.asm";"D:\WORKAST\DEMON\file" -0001+ 92CE ;[]=========================================================================[] -0002+ 92CE ;[] Файловые процедуры монитора-отладчика DemoN [] -0003+ 92CE ;[] v0.10 - последние изменения 27.08.2006 [] -0004+ 92CE ;[]=========================================================================[] -0005+ 92CE LoadFile: -0006+ 92CE AF xor a ;выкл часов -0007+ 92CF 32 5D AA ld (ClockOn),a -0008+ 92D2 01 54 01 ld bc,0x0100+Dss.SelPage ;системный экран -0009+ 92D5 D7 rst DssRst -0010+ 92D6 -0011+ 92D6 21 FE AA ld hl,Str.Load ;сообщение о загрузке файла -0012+ 92D9 0E 5C ld c,Dss.PChars -0013+ 92DB D7 rst DssRst -0014+ 92DC -0015+ 92DC CD EC 92 call LoadExe -0016+ 92DF -0017+ 92DF 3A 5E AA ld a,(DemonScreen) -0018+ 92E2 47 ld b,a -0019+ 92E3 0E 54 ld c,Dss.SelPage -0020+ 92E5 D7 rst DssRst -0021+ 92E6 3E FF ld a,On ;вкл часов -0022+ 92E8 32 5D AA ld (ClockOn),a -0023+ 92EB C9 ret -0024+ 92EC -0025+ 92EC LoadExe: -0026+ 92EC 21 80 94 ld hl,FDebug ;имя файла -0027+ 92EF 3E 01 ld a,1 ;открыть для чтения -0028+ 92F1 0E 11 ld c,Dss.Open -0029+ 92F3 D7 rst DssRst -0030+ 92F4 DA 05 95 jp c,PrErDss ;выход с ошибкой -0031+ 92F7 -0032+ 92F7 32 7F 94 ld (FId),a ;запомнить файловый манипулятор -0033+ 92FA -0034+ 92FA 21 80 94 ld hl,FDebug ;буфер для загрузки заголовка -0035+ 92FD 11 7F 00 ld de,0x7F ;кол-во считываемых байт -0036+ 9300 0E 13 ld c,Dss.Read ;чтение -0037+ 9302 D7 rst DssRst -0038+ 9303 DA 05 95 jp c,PrErDss ;выход с ошибкой -0039+ 9306 -0040+ 9306 2A 80 94 ld hl,(FDebug) ;заголовок EXE-файла -0041+ 9309 11 45 58 ld de,0x5845 ;'EX' проверка идентификатора -0042+ 930C ED 52 sbc hl,de -0043+ 930E 20 3A jr nz,.L1 -0044+ 9310 21 83 94 ld hl,FDebug+3 -0045+ 9313 7E ld a,(hl) ;версия EXE-файла -0046+ 9314 B7 or a -0047+ 9315 20 33 jr nz,.L1 -0048+ 9317 23 inc hl -0049+ 9318 5E ld e,(hl) ;начало исполняемого кода -0050+ 9319 23 inc hl -0051+ 931A 56 ld d,(hl) -0052+ 931B 01 0B 00 ld bc,11 ;пропускаем флаг загрузчика и зарезервированные байты -0053+ 931E 09 add hl,bc -0054+ 931F 7E ld a,(hl) ;мл.байт расположения кода в памяти -0055+ 9320 32 03 95 ld (FRam),a -0056+ 9323 23 inc hl -0057+ 9324 7E ld a,(hl) ;ст.байт расположения кода в памяти -0058+ 9325 32 04 95 ld (FRam+1),a -0059+ 9328 23 inc hl -0060+ 9329 7E ld a,(hl) ;мл.байт адреса запуска -0061+ 932A 32 3D AB ld (Reg._PC),a -0062+ 932D 32 55 AB ld (ListAdr),a ;мл.байт адреса листинга -0063+ 9330 23 inc hl -0064+ 9331 7E ld a,(hl) ;ст.байт адреса запуска -0065+ 9332 32 3E AB ld (Reg._PC+1),a -0066+ 9335 32 56 AB ld (ListAdr+1),a ;ст.байт адреса листинга -0067+ 9338 23 inc hl -0068+ 9339 7E ld a,(hl) ;мл.байт стека программы -0069+ 933A 32 3B AB ld (Reg._SP),a -0070+ 933D 23 inc hl -0071+ 933E 7E ld a,(hl) ;ст.байт стека программы -0072+ 933F 32 3C AB ld (Reg._SP+1),a -0073+ 9342 7B ld a,e -0074+ 9343 32 8A 93 ld (.L2+2),a -0075+ 9346 7A ld a,d -0076+ 9347 32 8B 93 ld (.L2+3),a -0077+ 934A -0078+ 934A 21 00 00 .L1 ld hl,0 -0079+ 934D DD 21 00 00 ld ix,0 ;смещение в файле -0080+ 9351 01 15 02 ld bc,2*256+Dss.Move_FP ;относительно конца -0081+ 9354 D7 rst DssRst -0082+ 9355 DA 05 95 jp c,PrErDss ;выход с ошибкой -0083+ 9358 -0084+ 9358 E5 push hl -0085+ 9359 ED 5B 03 95 ld de,(FRam) ;адрес расположения кода -0086+ 935D CB F2 set 6,d -0087+ 935F CB BA res 7,d ;грузим через 1-е окно -0088+ 9361 21 00 80 ld hl,0x8000 -0089+ 9364 B7 or a ;сбросить флаг C -0090+ 9365 ED 52 sbc hl,de ;кол-во считываемых байт -0091+ 9367 22 9E 93 ld (.L6+1),hl -0092+ 936A EB ex de,hl -0093+ 936B 22 A1 93 ld (.L6+4),hl -0094+ 936E E1 pop hl -0095+ 936F CD 52 94 call NBank ;определить кол-во банок -0096+ 9372 DA 05 95 jp c,PrErDss ;выход с ошибкой -0097+ 9375 -0098+ 9375 32 7D 94 ld (MemId+1),a ;кол-во выделяемых страниц -0099+ 9378 47 ld b,a -0100+ 9379 0E 3D ld c,Dss.GetMem ;выделение памяти -0101+ 937B D7 rst DssRst -0102+ 937C DA 05 95 jp c,PrErDss ;выход с ошибкой -0103+ 937F 32 7C 94 ld (MemId),a ;id блока памяти -0104+ 9382 -0105+ 9382 3A 7F 94 ld a,(FId) ;файловый манипулятор -0106+ 9385 21 00 00 ld hl,0 -0107+ 9388 DD 21 00 00 .L2 ld ix,0 ;смещение в файле -0108+ 938C 01 15 00 ld bc,Dss.Move_FP ;относительно начала -0109+ 938F D7 rst DssRst -0110+ 9390 DA 05 95 jp c,PrErDss ;выход с ошибкой -0111+ 9393 -0112+ 9393 3A 7C 94 ld a,(MemId) ;id блока памяти -0113+ 9396 01 39 00 ld bc,Dss.SetWin1 ;вкл 1-ю банку в 1-е окно -0114+ 9399 D7 rst DssRst -0115+ 939A DA 05 95 jp c,PrErDss ;выход с ошибкой -0116+ 939D -0117+ 939D 11 FF 3F .L6 ld de,0x3FFF ;кол-во считываемых байт -0118+ 93A0 21 00 40 ld hl,0x4000 ;адрес загрузки кода -0119+ 93A3 3E 01 ld a,1 ;счетчик банок -0120+ 93A5 32 7E 94 ld (MemId+2),a -0121+ 93A8 3A 7F 94 .L5 ld a,(FId) ;файловый манипулятор -0122+ 93AB 0E 13 ld c,Dss.Read ;чтение -0123+ 93AD D7 rst DssRst -0124+ 93AE DA 05 95 jp c,PrErDss ;выход с ошибкой -0125+ 93B1 -0126+ 93B1 ED 4B 7D 94 ld bc,(MemId+1) -0127+ 93B5 78 ld a,b -0128+ 93B6 B9 cp c ;загрзили весь файл? -0129+ 93B7 28 15 jr z,.L4 ;переход, если да -0130+ 93B9 -0131+ 93B9 3C inc a -0132+ 93BA 32 7E 94 ld (MemId+2),a ;увеличить счетчик банок -0133+ 93BD 3A 7C 94 ld a,(MemId) ;id блока памяти -0134+ 93C0 0E 39 ld c,Dss.SetWin1 ;вкл банку в 1-е окно -0135+ 93C2 D7 rst DssRst -0136+ 93C3 DA 05 95 jp c,PrErDss ;выход с ошибкой -0137+ 93C6 -0138+ 93C6 21 00 40 ld hl,0x4000 ;адрес в памяти для загрузки -0139+ 93C9 11 FF 3F ld de,0x3FFF ;кол-во загружаемых байт -0140+ 93CC 18 DA jr .L5 -0141+ 93CE -0142+ 93CE 3A 7F 94 .L4 ld a,(FId) ;файловый манипулятор -0143+ 93D1 0E 12 ld c,Dss.Close ;закрыть файл -0144+ 93D3 D7 rst DssRst -0145+ 93D4 DA 05 95 jp c,PrErDss ;выход с ошибкой -0146+ 93D7 -0147+ 93D7 3A 7C 94 ld a,(MemId) ;id блока памяти -0148+ 93DA 01 C4 00 ld bc,Bios.Emm_Fn4 ;вычислить физ номер 1-й банки -0149+ 93DD CF rst BiosRst -0150+ 93DE D8 ret c ;выход с ошибкой -0151+ 93DF 32 78 94 ld (BankP),a -0152+ 93E2 3A 7D 94 ld a,(MemId+1) ;кол-во выделенных страниц -0153+ 93E5 3D dec a -0154+ 93E6 28 2F jr z,.L7 -0155+ 93E8 -0156+ 93E8 3A 7C 94 ld a,(MemId) ;id блока памяти -0157+ 93EB 01 C4 01 ld bc,1*256+Bios.Emm_Fn4 ;вычислить физ номер 2-й банки -0158+ 93EE CF rst BiosRst -0159+ 93EF D8 ret c ;выход с ошибкой -0160+ 93F0 32 79 94 ld (BankP+1),a -0161+ 93F3 3A 7D 94 ld a,(MemId+1) ;кол-во выделенных страниц -0162+ 93F6 FE 02 cp 2 -0163+ 93F8 28 1D jr z,.L7 -0164+ 93FA -0165+ 93FA 3A 7C 94 ld a,(MemId) ;id блока памяти -0166+ 93FD 01 C4 02 ld bc,2*256+Bios.Emm_Fn4 ;вычислить физ номер 3-й банки -0167+ 9400 CF rst BiosRst -0168+ 9401 D8 ret c ;выход с ошибкой -0169+ 9402 32 7A 94 ld (BankP+2),a -0170+ 9405 3A 7D 94 ld a,(MemId+1) ;кол-во выделенных страниц -0171+ 9408 FE 03 cp 3 -0172+ 940A 28 0B jr z,.L7 -0173+ 940C -0174+ 940C 3A 7C 94 ld a,(MemId) ;id блока памяти -0175+ 940F 01 C4 03 ld bc,3*256+Bios.Emm_Fn4 ;вычислить физ номер 4-й банки -0176+ 9412 CF rst BiosRst -0177+ 9413 D8 ret c ;выход с ошибкой -0178+ 9414 32 7B 94 ld (BankP+3),a -0179+ 9417 -0180+ 9417 21 3F AB .L7 ld hl,WinPage -0181+ 941A 11 78 94 ld de,BankP -0182+ 941D 3A 7D 94 ld a,(MemId+1) ;кол-во выделенных страниц -0183+ 9420 47 ld b,a -0184+ 9421 FE 05 cp 5 -0185+ 9423 38 02 jr c,$+4 -0186+ 9425 06 04 ld b,4 ;подключаем не более 4 банок -0187+ 9427 3A 04 95 ld a,(FRam+1) ;ст.адрес расположения кода -0188+ 942A E6 C0 and 0xC0 ;окно с расположением кода -0189+ 942C B7 or a ;0-е окно -0190+ 942D 20 07 jr nz,.L8 -0191+ 942F 4F ld c,a -0192+ 9430 1A ld a,(de) -0193+ 9431 77 ld (hl),a ;подключить банку программы -0194+ 9432 05 dec b -0195+ 9433 C8 ret z ;выход, если больше нет банок -0196+ 9434 -0197+ 9434 79 ld a,c -0198+ 9435 13 inc de -0199+ 9436 23 .L8 inc hl -0200+ 9437 FE 40 cp 0x40 ;1-е окно -0201+ 9439 20 07 jr nz,.L9 -0202+ 943B 4F ld c,a -0203+ 943C 1A ld a,(de) -0204+ 943D 77 ld (hl),a ;подключить банку программы -0205+ 943E 05 dec b -0206+ 943F C8 ret z ;выход, если больше нет банок -0207+ 9440 -0208+ 9440 79 ld a,c -0209+ 9441 13 inc de -0210+ 9442 23 .L9 inc hl -0211+ 9443 FE 80 cp 0x80 ;2-е окно -0212+ 9445 20 07 jr nz,.L10 -0213+ 9447 4F ld c,a -0214+ 9448 1A ld a,(de) -0215+ 9449 77 ld (hl),a ;подключить банку программы -0216+ 944A 05 dec b -0217+ 944B C8 ret z ;выход, если больше нет банок -0218+ 944C -0219+ 944C 79 ld a,c -0220+ 944D 13 inc de -0221+ 944E 23 .L10 inc hl ;иначе 3-е окно -0222+ 944F 1A ld a,(de) -0223+ 9450 77 ld (hl),a ;подключить банку программы -0224+ 9451 -0225+ 9451 C9 ret -0226+ 9452 -0227+ 9452 ;[]=========================================================================[] -0228+ 9452 ;[] Вычисление необходимого кол-ва банок для загрузки файла в память [] -0229+ 9452 ;[] Вход: HL:IX - длина файла в байтах [] -0230+ 9452 ;[] DE - кол-во байт для загрузки в 1-ю банку [] -0231+ 9452 ;[] Выход: A - кол-во необходимых банок [] -0232+ 9452 ;[] флаг C - ошибка, код ошибки в A [] -0233+ 9452 ;[]=========================================================================[] -0234+ 9452 NBank: -0235+ 9452 DD E5 push ix -0236+ 9454 44 ld b,h -0237+ 9455 4D ld c,l -0238+ 9456 E1 pop hl -0239+ 9457 03 inc bc -0240+ 9458 AF xor a -0241+ 9459 3C inc a -0242+ 945A ED 52 sbc hl,de -0243+ 945C 30 02 jr nc,$+4 -0244+ 945E 18 0C jr .L5 -0245+ 9460 11 00 40 ld de,16384 ;размер банки -0246+ 9463 F5 push af -0247+ 9464 F1 .L2 pop af -0248+ 9465 3C .L1 inc a -0249+ 9466 28 0D jr z,.L3 -0250+ 9468 ED 52 sbc hl,de -0251+ 946A 30 F9 jr nc,.L1 -0252+ 946C 0B .L5 dec bc -0253+ 946D F5 push af -0254+ 946E 78 ld a,b -0255+ 946F B1 or c -0256+ 9470 20 F2 jr nz,.L2 -0257+ 9472 F1 pop af -0258+ 9473 B7 or a ;сбросить флаг C -0259+ 9474 C9 ret -0260+ 9475 -0261+ 9475 3E 1E .L3 ld a,0x1E ;"Недостаточно памяти" -0262+ 9477 ; JP ErrorDSS -0263+ 9477 C9 ret -0264+ 9478 -0265+ 9478 00 BankP ds 4 ;номера банок загружаемой проги -0266+ 947C 00 MemId ds 3 ;id-блока памяти под файл, -0267+ 947F ;кол-во выделенных банок, -0268+ 947F ;счетчик загруженных банок -0269+ 947F 00 FId db 0 ;файловый манипулятор -0270+ 9480 00 FDebug ds 128 -0271+ 9500 00 db 0 -0272+ 9501 00 42 FStart dw 0x4200 -0273+ 9503 00 00 FRam dw 0 ;адрес расположения кода в памяти -0274+ 9505 -0275+ 9505 -0374 9505 include "error.asm";"D:\WORKAST\DEMON\error" -0001+ 9505 ;[]=========================================================================[] -0002+ 9505 ;[] Обработка ошибок монитора-отладчика DemoN [] -0003+ 9505 ;[] v0.10 - последние изменения 27.08.2006 [] -0004+ 9505 ;[] [] -0005+ 9505 ;[] ErDss - определение ошибки DSS по ее коду [] -0006+ 9505 ;[]=========================================================================[] -0007+ 9505 -0008+ 9505 ;[]=========================================================================[] -0009+ 9505 ;[] Ошибки DSS [] -0010+ 9505 ;[] Вход: A - код ошибки [] -0011+ 9505 ;[] Выход: A - код ошибки [] -0012+ 9505 ;[] HL - строка-описание ошибки [] -0013+ 9505 ;[]=========================================================================[] -0014+ 9505 PrErDss: -0015+ 9505 CD 12 95 call ErDss -0016+ 9508 0E 5C ld c,Dss.PChars ;вывести сообщение об ошибке -0017+ 950A D7 rst DssRst -0018+ 950B 21 0E AB ld hl,Str.DA ;перевод строки -0019+ 950E 0E 5C ld c,Dss.PChars -0020+ 9510 D7 rst DssRst -0021+ 9511 C9 ret -0022+ 9512 -0023+ 9512 ErDss: -0024+ 9512 .MaxError equ 0x26 -0025+ 9512 FE 27 cp .MaxError+1 ;максимальный код ошибки + 1 -0026+ 9514 38 02 jr c,$+4 -0027+ 9516 3E 26 ld a,.MaxError -0028+ 9518 -0029+ 9518 F5 push af -0030+ 9519 87 add a,a -0031+ 951A 21 C1 97 ld hl,.Tabl -0032+ 951D 16 00 ld d,0 -0033+ 951F 5F ld e,a -0034+ 9520 19 add hl,de -0035+ 9521 7E ld a,(hl) -0036+ 9522 23 inc hl -0037+ 9523 66 ld h,(hl) -0038+ 9524 6F ld l,a -0039+ 9525 F1 pop af -0040+ 9526 C9 ret -0041+ 9527 -0042+ 9527 .e01 db "Invalid function",0 -0042+ 9527 496E76616C69642066756E6374696F6E00 -0043+ 9538 .e02 db "Invalid drive number",0 -0043+ 9538 496E76616C6964206472697665206E756D62657200 -0044+ 954D .e03 db "File not found",0 -0044+ 954D 46696C65206E6F7420666F756E6400 -0045+ 955C .e04 db "Path not found",0 -0045+ 955C 50617468206E6F7420666F756E6400 -0046+ 956B .e05 db "Invalid handle",0 -0046+ 956B 496E76616C69642068616E646C6500 -0047+ 957A .e06 db "Too many open files",0 -0047+ 957A 546F6F206D616E79206F70656E2066696C657300 -0048+ 958E .e07 db "File already exists",0 -0048+ 958E 46696C6520616C72656164792065786973747300 -0049+ 95A2 .e08 db "File read only",0 -0049+ 95A2 46696C652072656164206F6E6C7900 -0050+ 95B1 .e09 db "Root overflow",0 -0050+ 95B1 526F6F74206F766572666C6F7700 -0051+ 95BF .e0A db "No free space",0 -0051+ 95BF 4E6F206672656520737061636500 -0052+ 95CD .e0B db "Directory not empty",0 -0052+ 95CD 4469726563746F7279206E6F7420656D70747900 -0053+ 95E1 .e0C db "Can't delete current directory",0 -0053+ 95E1 43616E27742064656C6574652063757272656E74206469726563746F727900 -0054+ 9600 .e0D db "Invalid media",0 -0054+ 9600 496E76616C6964206D6564696100 -0055+ 960E .e0E db "Unknown operation",0 ;(невозм. операция) -0055+ 960E 556E6B6E6F776E206F7065726174696F6E00 -0056+ 9620 .e0F db "Directory exist",0 -0056+ 9620 4469726563746F727920657869737400 -0057+ 9630 .e10 db "Invalid filename",0 -0057+ 9630 496E76616C69642066696C656E616D6500 -0058+ 9641 .e11 db "Invalid EXE-file",0 -0058+ 9641 496E76616C6964204558452D66696C6500 -0059+ 9652 .e12 db "Not supported EXE-file",0 -0059+ 9652 4E6F7420737570706F72746564204558452D66696C6500 -0060+ 9669 .e13 db "Access denied",0 -0060+ 9669 4163636573732064656E69656400 -0061+ 9677 .e14 db "Not ready",0 -0061+ 9677 4E6F7420726561647900 -0062+ 9681 .e15 db "Seek error",0 -0062+ 9681 5365656B206572726F7200 -0063+ 968C .e16 db "Sector not found",0 -0063+ 968C 536563746F72206E6F7420666F756E6400 -0064+ 969D .e17 db "CRC error",0 -0064+ 969D 435243206572726F7200 -0065+ 96A7 .e18 db "Write protect",0 -0065+ 96A7 57726974652070726F7465637400 -0066+ 96B5 .e19 db "Read error",0 -0066+ 96B5 52656164206572726F7200 -0067+ 96C0 .e1A db "Write error",0 -0067+ 96C0 5772697465206572726F7200 -0068+ 96CC .e1B db "Drive failure",0 -0068+ 96CC 4472697665206661696C75726500 -0069+ 96DA .e1C db "Extended error: 28",0 -0069+ 96DA 457874656E646564206572726F723A20323800 -0070+ 96ED .e1D db "Extended error: 29",0 -0070+ 96ED 457874656E646564206572726F723A20323900 -0071+ 9700 .e1E db "Not enough memory",0 -0071+ 9700 4E6F7420656E6F756768206D656D6F727900 -0072+ 9712 .e1F db "Invalid memory block",0 -0072+ 9712 496E76616C6964206D656D6F727920626C6F636B00 -0073+ 9727 .e20 db "Extended error: 32",0 -0073+ 9727 457874656E646564206572726F723A20333200 -0074+ 973A .e21 db "Extended error: 33",0 -0074+ 973A 457874656E646564206572726F723A20333300 -0075+ 974D .e22 db "Extended error: 34",0 -0075+ 974D 457874656E646564206572726F723A20333400 -0076+ 9760 .e23 db "Too many files",0 ;(список файлов) -0076+ 9760 546F6F206D616E792066696C657300 -0077+ 976F .e24 db "(слишком большая влож. папок или >= 1024 папок)",0 -0077+ 976F 28E1ABA8E8AAAEAC20A1AEABECE8A0EF20A2ABAEA62E20AFA0AFAEAA20A8ABA8 -0077+ 978F 203E3D203130323420AFA0AFAEAA2900 -0078+ 979F .e25 db "User abort",0 ;(операция прервана пользователем) -0078+ 979F 557365722061626F727400 -0079+ 97AA .e26 db "Unknown error: 38..255",0 ;38 -0079+ 97AA 556E6B6E6F776E206572726F723A2033382E2E32353500 -0080+ 97C1 -0081+ 97C1 .Tabl dw .e01,.e02,.e03,.e04,.e05,.e06,.e07,.e08 -0081+ 97C1 279538954D955C956B957A958E95A295 -0082+ 97D1 dw .e09,.e0A,.e0B,.e0C,.e0D,.e0E,.e0F,.e10 -0082+ 97D1 B195BF95CD95E19500960E9620963096 -0083+ 97E1 dw .e11,.e12,.e13,.e14,.e15,.e16,.e17,.e18 -0083+ 97E1 419652966996779681968C969D96A796 -0084+ 97F1 dw .e19,.e1A,.e1B,.e1C,.e1D,.e1E,.e1F,.e20 -0084+ 97F1 B596C096CC96DA96ED96009712972797 -0085+ 9801 dw .e21,.e22,.e23,.e24,.e25,.e26 -0085+ 9801 3A974D9760976F979F97AA97 -0086+ 980D -0087+ 980D -0375 980D include "clock.asm";"D:\WORKAST\DEMON\clock" -0001+ 980D ;[]=========================================================================[] -0002+ 980D ;[] Вывод часов [] -0003+ 980D ;[] v0.03 - последние изменения 01.02.2006 [] -0004+ 980D ;[]=========================================================================[] -0005+ 980D Clock: -0006+ 980D 3A 5D AA ld a,(ClockOn) ;флаг вывода часов -0007+ 9810 3C inc a -0008+ 9811 C0 ret nz -0009+ 9812 0E 21 ld c,Dss.SysTime -0010+ 9814 D7 rst DssRst ;прочитать данные о времени -0011+ 9815 11 3E 98 ld de,.String -0012+ 9818 D5 push de -0013+ 9819 C5 push bc -0014+ 981A E5 push hl -0015+ 981B 6C ld l,h ;часы -0016+ 981C 26 00 ld h,0 -0017+ 981E CD BE 91 call ConvDecStr8_1 -0018+ 9821 13 inc de -0019+ 9822 E1 pop hl ;минуты -0020+ 9823 26 00 ld h,0 -0021+ 9825 CD BE 91 call ConvDecStr8_1 -0022+ 9828 13 inc de -0023+ 9829 E1 pop hl -0024+ 982A 6C ld l,h ;секунды -0025+ 982B 26 00 ld h,0 -0026+ 982D CD BE 91 call ConvDecStr8_1 -0027+ 9830 11 47 00 ld de,71 -0028+ 9833 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати -0028+ 9835 CF rst BiosRst -0029+ 9836 F3 di -0030+ 9837 E1 pop hl -0031+ 9838 01 86 08 ld bc,8*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки -0031+ 983B CF rst BiosRst -0032+ 983C F3 di -0033+ 983D C9 ret -0034+ 983E -0035+ 983E .String db "00:00:00" -0035+ 983E 30303A30303A3030 -0036+ 9846 -0037+ 9846 -0376 9846 include "keyb.asm";"D:\WORKAST\DEMON\keyb" -0001+ 9846 ;[]=========================================================================[] -0002+ 9846 ;[] Обработка клавиатуры [] -0003+ 9846 ;[] v0.01 - последние изменения 10.10.2004 [] -0004+ 9846 ;[] v0.02 - последние изменения 27.03.2005 [] -0005+ 9846 ;[] v0.03 - последние изменения 11.03.2006 [] -0006+ 9846 ;[] v0.10 - последние изменения 14.05.2006 [] -0007+ 9846 ;[]=========================================================================[] -0008+ 9846 CD 35 92 call CursorRes ;выкл курсор -0009+ 9849 CD 3C 88 call Refresh ;обновление экрана -0010+ 984C 18 03 jr Keyb -0011+ 984E CD 35 92 call CursorRes ;выкл курсор -0012+ 9851 Keyb: -0013+ 9851 CD B3 99 call Cursor ;вкл курсор -0014+ 9854 CD D3 91 call CursorSet -0015+ 9857 0E 31 ld c,Dss.ScanKey ;состояние клавиатуры -0016+ 9859 D7 rst DssRst -0017+ 985A 28 FB jr z,Keyb+6 -0018+ 985C 78 ld a,b ;состояние -0019+ 985D E6 F0 and 11110000b -0020+ 985F 28 6C jr z,.L100 -0021+ 9861 -0022+ 9861 ;Обработка комбинации Shift + символ -0023+ 9861 E6 C0 and 11000000b ; -0024+ 9863 B7 or a -0025+ 9864 28 11 jr z,.L1 -0026+ 9866 7A ld a,d -0027+ 9867 FE 8F cp 0x80+0x0F ;Shift+Tab -0028+ 9869 20 EC jr nz,Keyb+6 -0029+ 986B 21 B2 99 ld hl,Keyb.WinScreen -0030+ 986E 7E ld a,(hl) -0031+ 986F 3D dec a -0032+ 9870 20 02 jr nz,$+4 -0033+ 9872 3E 04 ld a,4 -0034+ 9874 77 ld (hl),a ;номер окна дампа -0035+ 9875 18 D7 jr Keyb-3 -0036+ 9877 -0037+ 9877 ;Обработка комбинации Alt + символ -0038+ 9877 78 .L1 ld a,b -0039+ 9878 E6 F0 and 11110000b -0040+ 987A FE 10 cp 00010000b ; -0041+ 987C 20 06 jr nz,.L10 -0042+ 987E 7A ld a,d ;позиционный код -0043+ 987F FE AB cp 0x80+0x2B ;+ -0044+ 9881 20 01 jr nz,.L10 -0045+ 9883 C8 ret z ;выход -0046+ 9884 -0047+ 9884 ;Обработка комбинации Ctrl + символ -0048+ 9884 FE 20 .L10 cp 00100000b ; -0049+ 9886 C2 A0 99 jp nz,.L0 -0050+ 9889 7A ld a,d ;позиционный код -0051+ 988A -0052+ 988A FE 92 cp 0x80+0x12 ;+ (dEc/hEx) -0053+ 988C 20 09 jr nz,.L11 -0054+ 988E 3A 7E AB ld a,(DecHex) -0055+ 9891 2F cpl -0056+ 9892 32 7E AB ld (DecHex),a -0057+ 9895 18 AF jr Keyb-11 -0058+ 9897 -0059+ 9897 FE 93 .L11 cp 0x80+0x13 ;+ резидент -0060+ 9899 20 20 jr nz,.L12 -0061+ 989B CD 35 92 call CursorRes -0062+ 989E 06 05 ld b,5 ;длина строки ввода -0063+ 98A0 21 13 14 ld hl,0x1413 -0064+ 98A3 E5 push hl -0065+ 98A4 C5 push bc -0066+ 98A5 CD D3 91 call CursorSet -0067+ 98A8 C1 pop bc -0068+ 98A9 E1 pop hl -0069+ 98AA CD AA 9C call InputLine -0070+ 98AD DA 4E 98 jp c,Keyb-3 -0071+ 98B0 CD 30 9C call PutAdres -0072+ 98B3 DA 4E 98 jp c,Keyb-3 -0073+ 98B6 CD E7 A1 call KReg.Rez ;новый адрес резидента -0074+ 98B9 18 8B jr Keyb-11 -0075+ 98BB -0076+ 98BB FE AA .L12 cp 0x80+0x2A ;+ -0077+ 98BD CA 39 99 jp z,.L202-2 ;выполнение команды -0078+ 98C0 -0079+ 98C0 FE AC cp 0x80+0x2C ;+ -0080+ 98C2 CA 1B 99 jp z,.L200+5 ;выполнение команды -0081+ 98C5 -0082+ 98C5 FE AD cp 0x80+0x2D ;+ -0083+ 98C7 CA 52 99 jp z,.L203+4 ;пропуск команды -0084+ 98CA -0085+ 98CA ; cp 0x80+0x48 ; -0086+ 98CA ; call z,ScreenS ;сохранение экрана в файл -0087+ 98CA -0088+ 98CA .L13 ;... -0089+ 98CA C3 A0 99 jp .L0 -0090+ 98CD -0091+ 98CD ;Обработка ASCII кодов -0092+ 98CD 7B .L100 ld a,e -0093+ 98CE FE 1B cp 0x1B ; - вкл.системного экрана -0094+ 98D0 20 44 jr nz,.L200 -0095+ 98D2 AF xor a ;выкл часов -0096+ 98D3 32 5D AA ld (ClockOn),a -0097+ 98D6 3A 5F AA ld a,(OSScreen) -0098+ 98D9 47 ld b,a -0099+ 98DA C5 push bc -0100+ 98DB 3A 60 AA ld a,(OSGrafMode) -0101+ 98DE 0E 50 ld c,Dss.SetVMod ;системный экран -0102+ 98E0 D7 rst DssRst -0103+ 98E1 C1 pop bc -0104+ 98E2 3A 5E AA ld a,(DemonScreen) -0105+ 98E5 B8 cp b -0106+ 98E6 20 11 jr nz,.NoRest -0107+ 98E8 11 00 00 ld de,0 ;Если экраны ОС и Демона совпадают - -0108+ 98EB 21 50 20 ld hl,#2050 ;восстанавливаем скрин -0109+ 98EE 3A 61 AA ld a,(BufPage) -0110+ 98F1 47 ld b,a -0111+ 98F2 0E 5A ld c,Dss.WinRest -0112+ 98F4 DD 21 00 C0 ld ix,#c000 -0113+ 98F8 D7 rst DssRst -0114+ 98F9 0E 30 .NoRest ld c,Dss.WaitKey -0115+ 98FB D7 rst DssRst ;ждем Any Key -0116+ 98FC 3A 5E AA ld a,(DemonScreen) -0117+ 98FF 47 ld b,a -0118+ 9900 3E 03 ld a,3 -0119+ 9902 0E 50 ld c,Dss.SetVMod -0120+ 9904 C5 push bc -0121+ 9905 D7 rst DssRst -0122+ 9906 C1 pop bc -0123+ 9907 3A 5F AA ld a,(OSScreen) -0124+ 990A B8 cp b -0125+ 990B CC EF 82 call z,RefreshScreen ;Если экраны совпадают - перерисовываем -0126+ 990E 3E FF ld a,On ;вкл часов -0127+ 9910 32 5D AA ld (ClockOn),a -0128+ 9913 C3 57 98 jp Keyb+6 -0129+ 9916 -0130+ 9916 ;Обработка позиционного кода -0131+ 9916 7A .L200 ld a,d -0132+ 9917 FE 3B cp 0x3b ; -0133+ 9919 20 09 jr nz,.L208 -0134+ 991B CD CB 88 call DemonHelp -0135+ 991E ; ld c,Dss.WaitKey -0136+ 991E ; rst DssRst ;ждем Any Key -0137+ 991E -0138+ 991E CD EF 82 .NoExit call RefreshScreen -0139+ 9921 C3 57 98 jp Keyb+6 -0140+ 9924 FE 3D .L208 cp 0x3d -0141+ 9926 20 05 jr nz,.L207 -0142+ 9928 CD A6 B6 call LoadBinDialog -0143+ 992B 18 F1 jr .NoExit -0144+ 992D .L207 -0145+ 992D FE 42 cp 0x42 ; -0146+ 992F 20 04 jr nz,.L201 -0147+ 9931 3E 00 ld a,Off ;флаг пропуска подпрограмм -0148+ 9933 18 06 jr .L202 -0149+ 9935 -0150+ 9935 FE 41 .L201 cp 0x41 ; -0151+ 9937 20 15 jr nz,.L203 -0152+ 9939 3E FF ld a,On ;флаг трассировки подпрограмм -0153+ 993B 32 7B A9 .L202 ld (Step.Flag),a -0154+ 993E 21 66 90 ld hl,PrintStrSP.StrSp -0155+ 9941 7E ld a,(hl) ;строка вершины стека -0156+ 9942 3C inc a -0157+ 9943 20 03 jr nz,$+5 -0158+ 9945 3E 06 ld a,6 ;вернуть вершину стека -0159+ 9947 77 ld (hl),a -0160+ 9948 CD 64 A6 call Step -0161+ 994B C3 46 98 jp Keyb-11 -0162+ 994E -0163+ 994E FE 43 .L203 cp 0x43 ; -0164+ 9950 20 22 jr nz,.L204 -0165+ 9952 2A 3D AB ld hl,(Reg._PC) -0166+ 9955 CD 42 8A call List ;следующая команда -0167+ 9958 22 3D AB ld (Reg._PC),hl ;новый PC -0168+ 995B E5 push hl -0169+ 995C 3A C3 9B ld a,(KList.Descript) ;количество строк листинга -0170+ 995F CD D1 9B call AdrListTabl ;нижний адрес листинга -0171+ 9962 ED 5B 55 AB ld de,(ListAdr) ;верхний адрес листинга -0172+ 9966 C1 pop bc ;новый PC -0173+ 9967 CD C4 92 call AdrArea -0174+ 996A D2 46 98 jp nc,Keyb-11 -0175+ 996D ED 43 55 AB ld (ListAdr),bc ;новая страница листинга -0176+ 9971 C3 46 98 jp Keyb-11 -0177+ 9974 -0178+ 9974 FE 0F .L204 cp 0x0F ; -0179+ 9976 20 0F jr nz,.L205 -0180+ 9978 21 B2 99 ld hl,Keyb.WinScreen -0181+ 997B 7E ld a,(hl) -0182+ 997C 3C inc a -0183+ 997D FE 05 cp 5 -0184+ 997F 20 02 jr nz,$+4 -0185+ 9981 3E 01 ld a,1 -0186+ 9983 77 ld (hl),a ;номер окна дампа -0187+ 9984 C3 4E 98 jp Keyb-3 -0188+ 9987 -0189+ 9987 FE 48 .L205 cp 0x48 ; -0190+ 9989 20 06 jr nz,.L206 -0191+ 998B CD FA A9 call SaveScr ;сохранение экрана в файл -0192+ 998E C3 57 98 jp Keyb+6 -0193+ 9991 -0194+ 9991 FE 44 .L206 cp 0x44 ; -0195+ 9993 20 0B jr nz,.L0 -0196+ 9995 ;выход -0197+ 9995 DD 21 7F AB ld ix,ExitDlg -0198+ 9999 CD D5 B9 call DialogWindow -0199+ 999C C9 ret -0200+ 999D CD 01 83 call ClearScreen -0201+ 99A0 3A B2 99 .L0 ld a,(.WinScreen) ;активное окно -0202+ 99A3 3D dec a -0203+ 99A4 CA 1C 9A jp z,KList -0204+ 99A7 3D dec a -0205+ 99A8 CA FC A3 jp z,KDump -0206+ 99AB 3D dec a -0207+ 99AC CA AE 9F jp z,KReg -0208+ 99AF C3 A4 A2 jp KStack -0209+ 99B2 -0210+ 99B2 01 .WinScreen db 1 ;номер активного окна -0211+ 99B3 ;1 - окно листинга -0212+ 99B3 ;2 - окно дампа -0213+ 99B3 ;3 - окно регистров -0214+ 99B3 ;4 - окно стека -0215+ 99B3 -0216+ 99B3 ;Прорисовка курсора -0217+ 99B3 Cursor: -0218+ 99B3 3A B2 99 ld a,(Keyb.WinScreen) ;активное окно -0219+ 99B6 3D dec a -0220+ 99B7 28 1E jr z,.L1 -0221+ 99B9 3D dec a -0222+ 99BA 28 33 jr z,.L2 -0223+ 99BC 3D dec a -0224+ 99BD 28 48 jr z,.L3 -0225+ 99BF ;Окно дампа стека -0226+ 99BF ED 5B F3 A3 ld de,(KStack.Coordinate) ;расчет курсора -0227+ 99C3 21 F7 A3 ld hl,KStack.Descript+2 -0228+ 99C6 43 ld b,e -0229+ 99C7 23 inc hl -0230+ 99C8 23 inc hl -0231+ 99C9 10 FC djnz $-2 -0232+ 99CB 7E ld a,(hl) ;длина курсора -0233+ 99CC 32 A5 A3 ld (KStack.L201+1),a -0234+ 99CF 47 ld b,a -0235+ 99D0 2B dec hl -0236+ 99D1 5E ld e,(hl) ;X-координата курсора -0237+ 99D2 EB ex de,hl -0238+ 99D3 22 A7 A3 ld (KStack.L201+3),hl -0239+ 99D6 C9 ret -0240+ 99D7 ;Окно листинга -0241+ 99D7 ED 5B C1 9B .L1 ld de,(KList.Coordinate) ;расчет курсора -0242+ 99DB 21 C5 9B ld hl,KList.Descript+2 -0243+ 99DE 43 ld b,e -0244+ 99DF 23 inc hl -0245+ 99E0 23 inc hl -0246+ 99E1 10 FC djnz $-2 -0247+ 99E3 7E ld a,(hl) ;длина курсора -0248+ 99E4 32 44 9B ld (KList.L201+1),a -0249+ 99E7 47 ld b,a -0250+ 99E8 2B dec hl -0251+ 99E9 5E ld e,(hl) ;X-координата курсора -0252+ 99EA EB ex de,hl -0253+ 99EB 22 46 9B ld (KList.L201+3),hl -0254+ 99EE C9 ret -0255+ 99EF ;Окно дампа -0256+ 99EF ED 5B A0 A5 .L2 ld de,(KDump.Coordinate) ;расчет курсора -0257+ 99F3 21 A4 A5 ld hl,KDump.Descript+2 -0258+ 99F6 43 ld b,e -0259+ 99F7 23 inc hl -0260+ 99F8 23 inc hl -0261+ 99F9 10 FC djnz $-2 -0262+ 99FB 7E ld a,(hl) ;длина курсора -0263+ 99FC 32 FB A4 ld (KDump.L201+1),a -0264+ 99FF 47 ld b,a -0265+ 9A00 2B dec hl -0266+ 9A01 5E ld e,(hl) ;X-координата курсора -0267+ 9A02 EB ex de,hl -0268+ 9A03 22 FD A4 ld (KDump.L201+3),hl -0269+ 9A06 C9 ret -0270+ 9A07 ;Окно регистров -0271+ 9A07 CD 06 A2 .L3 call KReg.DescCalc -0272+ 9A0A 50 ld d,b -0273+ 9A0B 43 ld b,e ;колонока в строке -0274+ 9A0C 23 inc hl -0275+ 9A0D 23 inc hl -0276+ 9A0E 10 FC djnz $-2 -0277+ 9A10 7E ld a,(hl) ;длина курсора -0278+ 9A11 32 4B A0 ld (KReg.L201+1),a -0279+ 9A14 47 ld b,a -0280+ 9A15 2B dec hl -0281+ 9A16 5E ld e,(hl) ;X-координата курсора -0282+ 9A17 EB ex de,hl -0283+ 9A18 22 4D A0 ld (KReg.L201+3),hl -0284+ 9A1B C9 ret -0285+ 9A1C -0286+ 9A1C ;Обработка клавиш в окне листинга -0287+ 9A1C KList: -0288+ 9A1C 78 ld a,b ;состояние -0289+ 9A1D E6 F0 and 11110000b -0290+ 9A1F 28 6F jr z,.L100 -0291+ 9A21 -0292+ 9A21 ;Обработка комбинации Alt + символ -0293+ 9A21 FE 10 cp 00010000b ; -0294+ 9A23 20 03 jr nz,.L10 -0295+ 9A25 C3 57 98 jp Keyb+6 -0296+ 9A28 -0297+ 9A28 ;Обработка комбинации Ctrl + символ -0298+ 9A28 FE 20 .L10 cp 00100000b ; -0299+ 9A2A C2 57 98 jp nz,Keyb+6 -0300+ 9A2D -0301+ 9A2D 7A ld a,d ;позиционный код -0302+ 9A2E FE AB cp 0x80+0x2B ;+ -0303+ 9A30 C2 3C 9A jp nz,.L20 -0304+ 9A33 -0305+ 9A33 CD CE 9B call AdrListTabl-3 ;выборка адреса листинга по N строки -0306+ 9A36 22 3D AB ld (Reg._PC),hl -0307+ 9A39 C3 9F 9B jp .NewLA1+3 -0308+ 9A3C -0309+ 9A3C 78 .L20 ld a,b -0310+ 9A3D FE 22 cp 00100010b ;правый -0311+ 9A3F 20 19 jr nz,.L21 -0312+ 9A41 01 A3 9B ld bc,.CtrlTabl -0313+ 9A44 CD DF 9B call AdrCtrlTabl ;выборка строки в таблице -0314+ 9A47 D2 57 98 jp nc,Keyb+6 ;не цифровые клавиши -0315+ 9A4A -0316+ 9A4A 3A C2 9B ld a,(.Coordinate+1) -0317+ 9A4D 02 ld (bc),a ;номер строки листинга -0318+ 9A4E 03 inc bc -0319+ 9A4F CD D1 9B call AdrListTabl ;выборка адреса листинга по N строки -0320+ 9A52 7D ld a,l -0321+ 9A53 02 ld (bc),a -0322+ 9A54 03 inc bc -0323+ 9A55 7C ld a,h -0324+ 9A56 02 ld (bc),a -0325+ 9A57 C3 57 98 jp Keyb+6 -0326+ 9A5A -0327+ 9A5A FE 28 .L21 cp 00101000b ;левый -0328+ 9A5C C2 57 98 jp nz,Keyb+6 -0329+ 9A5F -0330+ 9A5F 7A ld a,d ;позиционный код -0331+ 9A60 FE 80 cp 0x80+0x00 ;Ctrl+"`" -0332+ 9A62 C2 79 9A jp nz,.L22 -0333+ 9A65 -0334+ 9A65 3A A2 9B ld a,(.CtrlWin) -0335+ 9A68 67 ld h,a -0336+ 9A69 2E 00 ld l,0 -0337+ 9A6B C6 40 add a,0x40 ;следующее окно -0338+ 9A6D 32 A2 9B ld (.CtrlWin),a -0339+ 9A70 3A C4 9B ld a,(.Descript+1) -0340+ 9A73 32 C2 9B ld (.Coordinate+1),a -0341+ 9A76 C3 9C 9B jp .NewLA1 -0342+ 9A79 -0343+ 9A79 01 A3 9B .L22 ld bc,.CtrlTabl -0344+ 9A7C CD DF 9B call AdrCtrlTabl ;выборка строки в таблице -0345+ 9A7F D2 57 98 jp nc,Keyb+6 -0346+ 9A82 -0347+ 9A82 0A ld a,(bc) ;номер строки листинга -0348+ 9A83 B7 or a -0349+ 9A84 CA 57 98 jp z,Keyb+6 ;нет данных -0350+ 9A87 -0351+ 9A87 03 inc bc -0352+ 9A88 0A ld a,(bc) -0353+ 9A89 6F ld l,a -0354+ 9A8A 03 inc bc -0355+ 9A8B 0A ld a,(bc) -0356+ 9A8C 67 ld h,a ;адрес из буфера -0357+ 9A8D C3 8E 9B jp .NewLA -0358+ 9A90 -0359+ 9A90 ;Обработка позиционного кода -0360+ 9A90 7B .L100 ld a,e ;ASCII код -0361+ 9A91 32 3D 9B ld (.L200+1),a -0362+ 9A94 7A ld a,d ;позиционный код -0363+ 9A95 -0364+ 9A95 ED 5B C1 9B ld de,(.Coordinate) ;текущие координаты курсора -0365+ 9A99 FE 56 cp 0x56 ; -0366+ 9A9B 20 0F jr nz,.L101 -0367+ 9A9D 3A C5 9B ld a,(.Descript+2) ;кол-во колонок -0368+ 9AA0 BB cp e -0369+ 9AA1 7B ld a,e -0370+ 9AA2 20 01 jr nz,$+3 -0371+ 9AA4 AF xor a -0372+ 9AA5 3C inc a -0373+ 9AA6 32 C1 9B ld (.Coordinate),a ;текущая колонка -0374+ 9AA9 C3 4E 98 jp Keyb-3 -0375+ 9AAC -0376+ 9AAC FE 54 .L101 cp 0x54 ; -0377+ 9AAE 20 10 jr nz,.L102 -0378+ 9AB0 7B ld a,e ;текущая колонка -0379+ 9AB1 FE 01 cp 1 -0380+ 9AB3 20 04 jr nz,$+6 -0381+ 9AB5 3A C5 9B ld a,(.Descript+2) ;кол-во колонок -0382+ 9AB8 3C inc a -0383+ 9AB9 3D dec a -0384+ 9ABA 32 C1 9B ld (.Coordinate),a ;текущая колонка -0385+ 9ABD C3 4E 98 jp Keyb-3 -0386+ 9AC0 -0387+ 9AC0 2A C3 9B .L102 ld hl,(.Descript) -0388+ 9AC3 FE 52 cp 0x52 ; -0389+ 9AC5 20 11 jr nz,.L103 -0390+ 9AC7 7A ld a,d ;текущая строка -0391+ 9AC8 BD cp l -0392+ 9AC9 20 06 jr nz,.L104 -0393+ 9ACB 2A 57 AB ld hl,(ListAdr+2) ;адрес следующей строки -0394+ 9ACE C3 9C 9B jp .NewLA1 -0395+ 9AD1 3C .L104 inc a -0396+ 9AD2 32 C2 9B ld (.Coordinate+1),a -0397+ 9AD5 C3 4E 98 jp Keyb-3 -0398+ 9AD8 -0399+ 9AD8 FE 58 .L103 cp 0x58 ; -0400+ 9ADA 20 14 jr nz,.L105 -0401+ 9ADC 7A ld a,d ;текущая строка -0402+ 9ADD BC cp h -0403+ 9ADE 20 09 jr nz,.L107 -0404+ 9AE0 2A 55 AB ld hl,(ListAdr) ;адрес верхней строки листинга -0405+ 9AE3 CD DF 89 call UpAdres ;предыдущий адрес -0406+ 9AE6 C3 9C 9B jp .NewLA1 -0407+ 9AE9 3D .L107 dec a -0408+ 9AEA 32 C2 9B ld (.Coordinate+1),a -0409+ 9AED C3 4E 98 jp Keyb-3 -0410+ 9AF0 -0411+ 9AF0 FE 53 .L105 cp 0x53 ; -0412+ 9AF2 20 11 jr nz,.L108 -0413+ 9AF4 7A ld a,d ;текущая строка -0414+ 9AF5 BD cp l -0415+ 9AF6 20 06 jr nz,.L106 -0416+ 9AF8 CD D1 9B call AdrListTabl -0417+ 9AFB C3 9C 9B jp .NewLA1 -0418+ 9AFE 7D .L106 ld a,l ;на последнюю строку -0419+ 9AFF 32 C2 9B ld (.Coordinate+1),a -0420+ 9B02 C3 4E 98 jp Keyb-3 -0421+ 9B05 -0422+ 9B05 FE 59 .L108 cp 0x59 ; -0423+ 9B07 20 1A jr nz,.L110 -0424+ 9B09 7A ld a,d ;текущая строка -0425+ 9B0A BC cp h -0426+ 9B0B 20 0F jr nz,.L109 -0427+ 9B0D 2D dec l ;кол-во строк - 1 -0428+ 9B0E 45 ld b,l -0429+ 9B0F 2A 55 AB ld hl,(ListAdr) ;адрес первой строки -0430+ 9B12 C5 push bc -0431+ 9B13 CD DF 89 call UpAdres ;предыдущий адрес -0432+ 9B16 C1 pop bc -0433+ 9B17 10 F9 djnz $-5 -0434+ 9B19 C3 9C 9B jp .NewLA1 -0435+ 9B1C 7C .L109 ld a,h ;на первую строку -0436+ 9B1D 32 C2 9B ld (.Coordinate+1),a -0437+ 9B20 C3 4E 98 jp Keyb-3 -0438+ 9B23 -0439+ 9B23 FE 57 .L110 cp 0x57 ; -0440+ 9B25 20 08 jr nz,.L111 -0441+ 9B27 3E 01 ld a,1 -0442+ 9B29 32 C1 9B ld (.Coordinate),a ;первая колонка -0443+ 9B2C C3 4E 98 jp Keyb-3 -0444+ 9B2F -0445+ 9B2F FE 51 .L111 cp 0x51 ; -0446+ 9B31 20 09 jr nz,.L200 -0447+ 9B33 3A C5 9B ld a,(.Descript+2) ;последняя колонка -0448+ 9B36 32 C1 9B ld (.Coordinate),a ;первая колонка -0449+ 9B39 C3 4E 98 jp Keyb-3 -0450+ 9B3C -0451+ 9B3C ;Обработка ASCII кодов -0452+ 9B3C 3E 00 .L200 ld a,0 -0453+ 9B3E FE 0D cp 0x0D ; -0454+ 9B40 C2 5A 9B jp nz,.NewPCAdr ;Keyb+6 -0455+ 9B43 06 00 .L201 ld b,0 ;длина строки ввода -0456+ 9B45 21 00 00 ld hl,0 ;координаты строки ввода -0457+ 9B48 3A C1 9B ld a,(.Coordinate) -0458+ 9B4B 3D dec a ;колонка адреса -0459+ 9B4C 28 35 jr z,.InAdres -0460+ 9B4E 3D dec a ;колонка метки -0461+ 9B4F 28 03 jr z,$+5 -0462+ 9B51 3D dec a ;колонка кода команды -0463+ 9B52 28 14 jr z,.InCode -0464+ 9B54 CD AA 9C call InputLine -0465+ 9B57 C3 4E 98 jp Keyb-3 -0466+ 9B5A FE 7A .NewPCAdr cp "z" ; -0467+ 9B5C C2 57 98 jp nz,Keyb+6 -0468+ 9B5F CD CE 9B call AdrListTabl-3 ;Установить новый PC -0469+ 9B62 22 3D AB ld (Reg._PC),HL -0470+ 9B65 C3 46 98 jp Keyb-11 -0471+ 9B68 CD AA 9C .InCode call InputLine ;ввод кода в 3 колонке -0472+ 9B6B DA 4E 98 jp c,Keyb-3 ;завершение ввода по -0473+ 9B6E CD F1 9B call PutCode -0474+ 9B71 38 D0 jr c,.L201 ;ошибка в веденных данных -0475+ 9B73 CD CE 9B call AdrListTabl-3 ;адрес текущей строки -0476+ 9B76 11 2C 9C ld de,PutCode.Buffer -0477+ 9B79 1A ld a,(de) ;запись кода в память -0478+ 9B7A CD 97 92 call Ld_hl_a -0479+ 9B7D 13 inc de -0480+ 9B7E 23 inc hl -0481+ 9B7F 10 F8 djnz $-6 -0482+ 9B81 18 1C jr .NewLA1+3 -0483+ 9B83 -0484+ 9B83 CD AA 9C .InAdres call InputLine ;ввод адреса в 1 колонке -0485+ 9B86 DA 4E 98 jp c,Keyb-3 ;завершение ввода по -0486+ 9B89 CD 30 9C call PutAdres -0487+ 9B8C 38 B5 jr c,.L201 ;ошибка в веденных данных -0488+ 9B8E -0489+ 9B8E 3A C2 9B .NewLA ld a,(.Coordinate+1) -0490+ 9B91 3D dec a -0491+ 9B92 28 08 jr z,.NewLA1 -0492+ 9B94 47 ld b,a -0493+ 9B95 C5 push bc -0494+ 9B96 CD DF 89 call UpAdres ;предыдущий адрес -0495+ 9B99 C1 pop bc -0496+ 9B9A 10 F9 djnz $-5 -0497+ 9B9C 22 55 AB .NewLA1 ld (ListAdr),hl -0498+ 9B9F C3 46 98 jp Keyb-11 -0499+ 9BA2 -0500+ 9BA2 00 .CtrlWin db 0 ;окно для Ctrl+"`" -0501+ 9BA3 00 .CtrlTabl ds 30 ;буффер для адр быстр перехода -0502+ 9BC1 01 02 .Coordinate dw 0x0201 ;курсор (стр/кол курсора) -0503+ 9BC3 .Descript: -0504+ 9BC3 14 01 dw 0x0114 ;первая/последняя строка окна -0505+ 9BC5 04 db 4 ;кол-во колонок -0506+ 9BC6 -0507+ 9BC6 1A db 0x1A ;N столбца колонки -0508+ 9BC7 05 db 5 ;ширина колонки -0509+ 9BC8 20 db 0x20 -0510+ 9BC9 0E db 14 -0511+ 9BCA 2F db 0x2F -0512+ 9BCB 08 db 8 -0513+ 9BCC 38 db 0x38 -0514+ 9BCD 16 db 22 -0515+ 9BCE -0516+ 9BCE ;[]=========================================================================[] -0517+ 9BCE ;[] Выборка адреса листинга из таблицы [] -0518+ 9BCE ;[] Выход: HL - адрес листинга в текущей строке [] -0519+ 9BCE ;[]=========================================================================[] -0520+ 9BCE 3A C2 9B ld a,(KList.Coordinate+1) ;номер текущей строки листинга -0521+ 9BD1 AdrListTabl: -0522+ 9BD1 3D dec a -0523+ 9BD2 87 add a,a ;*2 -0524+ 9BD3 5F ld e,a -0525+ 9BD4 16 00 ld d,0 -0526+ 9BD6 21 55 AB ld hl,ListAdr ;таблица адресов листинга -0527+ 9BD9 19 add hl,de ;строка в таблице -0528+ 9BDA 7E ld a,(hl) -0529+ 9BDB 23 inc hl -0530+ 9BDC 66 ld h,(hl) -0531+ 9BDD 6F ld l,a ;адрес строки листинга -0532+ 9BDE C9 ret -0533+ 9BDF -0534+ 9BDF ;[]=========================================================================[] -0535+ 9BDF ;[] Выборка адреса цифровых клавиш из таблицы [] -0536+ 9BDF ;[] Вход: D - позиционный код цифровой клавиши [] -0537+ 9BDF ;[] BC - адрес начала таблицы [] -0538+ 9BDF ;[] Выход: BC - адрес в таблице [] -0539+ 9BDF ;[] Флаг NC - нажата не цифровая клавиша [] -0540+ 9BDF ;[]=========================================================================[] -0541+ 9BDF AdrCtrlTabl: -0542+ 9BDF 7A ld a,d -0543+ 9BE0 E6 7F and 01111111b ;сброс старшего бита -0544+ 9BE2 3D dec a -0545+ 9BE3 3D dec a -0546+ 9BE4 FE 0A cp 0x0A ;проверка цифровых клавиш верхнего ряда -0547+ 9BE6 D0 ret nc -0548+ 9BE7 B7 or a -0549+ 9BE8 37 scf -0550+ 9BE9 C8 ret z ;выход, если "0" -0551+ 9BEA 03 inc bc -0552+ 9BEB 03 inc bc -0553+ 9BEC 03 inc bc -0554+ 9BED 3D dec a -0555+ 9BEE 20 FA jr nz,$-4 -0556+ 9BF0 C9 ret -0557+ 9BF1 -0558+ 9BF1 ;[]=========================================================================[] -0559+ 9BF1 ;[] Получение кода из строки ввода [] -0560+ 9BF1 ;[] Вход: C - длина строки ввода [] -0561+ 9BF1 ;[] Выход: .Buffer - захваченные байты [] -0562+ 9BF1 ;[] B - количество захваченных байт [] -0563+ 9BF1 ;[] флаг C - ошибка [] -0564+ 9BF1 ;[]=========================================================================[] -0565+ 9BF1 PutCode: -0566+ 9BF1 11 B8 9E ld de,InputLine.Buffer -0567+ 9BF4 21 2C 9C ld hl,.Buffer -0568+ 9BF7 79 ld a,c -0569+ 9BF8 3D dec a -0570+ 9BF9 D8 ret c ;нулевая строка -0571+ 9BFA 3C inc a -0572+ 9BFB CB 3F srl a -0573+ 9BFD 47 ld b,a -0574+ 9BFE 28 1C jr z,.L3 ;обработка одного символа -0575+ 9C00 4F ld c,a -0576+ 9C01 3E C9 ld a,0xC9 ;RET -0577+ 9C03 30 01 jr nc,$+3 -0578+ 9C05 AF xor a ;NOP -0579+ 9C06 32 1B 9C ld (.L3-1),a -0580+ 9C09 -0581+ 9C09 E5 .L2 push hl -0582+ 9C0A 21 00 00 ld hl,0 -0583+ 9C0D 3E 02 ld a,2 -0584+ 9C0F CD 4C 9C call PutHex -0585+ 9C12 7D ld a,l -0586+ 9C13 E1 pop hl -0587+ 9C14 D8 ret c ;выход с ошибкой -0588+ 9C15 77 ld (hl),a -0589+ 9C16 23 inc hl -0590+ 9C17 0D dec c -0591+ 9C18 20 EF jr nz,.L2 -0592+ 9C1A B7 or a -0593+ 9C1B C9 ret -0594+ 9C1C -0595+ 9C1C 04 .L3 inc b -0596+ 9C1D E5 push hl -0597+ 9C1E 21 00 00 ld hl,0 -0598+ 9C21 3E 01 ld a,1 -0599+ 9C23 CD 4C 9C call PutHex -0600+ 9C26 7D ld a,l -0601+ 9C27 E1 pop hl -0602+ 9C28 D8 ret c ;выход с ошибкой -0603+ 9C29 77 ld (hl),a -0604+ 9C2A B7 or a -0605+ 9C2B C9 ret -0606+ 9C2C -0607+ 9C2C 00 .Buffer ds 4 -0608+ 9C30 -0609+ 9C30 ;[]=========================================================================[] -0610+ 9C30 ;[] Получение адреса из строки ввода [] -0611+ 9C30 ;[] Вход: C - длина строки ввода [] -0612+ 9C30 ;[] Выход: HL - число [] -0613+ 9C30 ;[] флаг C - ошибка [] -0614+ 9C30 ;[]=========================================================================[] -0615+ 9C30 PutAdres: -0616+ 9C30 79 ld a,c -0617+ 9C31 3D dec a -0618+ 9C32 D8 ret c ;нулевая строка -0619+ 9C33 11 B8 9E ld de,InputLine.Buffer -0620+ 9C36 21 00 00 ld hl,0 -0621+ 9C39 1A ld a,(de) -0622+ 9C3A CD 91 9C call CapsLetter -0623+ 9C3D FE 58 cp "X" ;hex-число -0624+ 9C3F 28 02 jr z,$+4 -0625+ 9C41 FE 23 cp "#" ;hex-число -0626+ 9C43 79 ld a,c -0627+ 9C44 20 29 jr nz,PutDec -0628+ 9C46 13 inc de -0629+ 9C47 13 inc de -0630+ 9C48 3D dec a -0631+ 9C49 3D dec a -0632+ 9C4A D8 ret c -0633+ 9C4B 3C inc a -0634+ 9C4C -0635+ 9C4C 08 PutHex exa -0636+ 9C4D 1A ld a,(de) -0637+ 9C4E CD 8A 9C call Numeric ;цифра? -0638+ 9C51 38 0C jr c,.L1 -0639+ 9C53 CD 91 9C call CapsLetter ;лат.буквы в верхний регистр -0640+ 9C56 FE 47 cp "F"+1 -0641+ 9C58 3F ccf -0642+ 9C59 D8 ret c ;выход с ошибкой -0643+ 9C5A FE 41 cp "A" -0644+ 9C5C D8 ret c ;выход с ошибкой -0645+ 9C5D D6 07 sub 0x07 -0646+ 9C5F D6 30 .L1 sub 0x30 -0647+ 9C61 29 add hl,hl ;*16 -0648+ 9C62 29 add hl,hl -0649+ 9C63 29 add hl,hl -0650+ 9C64 29 add hl,hl -0651+ 9C65 B5 or l -0652+ 9C66 6F ld l,a -0653+ 9C67 13 inc de -0654+ 9C68 13 inc de -0655+ 9C69 08 exa -0656+ 9C6A 3D dec a -0657+ 9C6B 20 DF jr nz,PutHex -0658+ 9C6D B7 or a ;сброс флага C -0659+ 9C6E C9 ret -0660+ 9C6F -0661+ 9C6F 08 PutDec exa -0662+ 9C70 1A ld a,(de) -0663+ 9C71 CD 8A 9C call Numeric ;цифра? -0664+ 9C74 3F ccf -0665+ 9C75 D8 ret c ;выход если нет -0666+ 9C76 4D ld c,l -0667+ 9C77 44 ld b,h -0668+ 9C78 29 add hl,hl ;*10 -0669+ 9C79 29 add hl,hl -0670+ 9C7A 09 add hl,bc -0671+ 9C7B 29 add hl,hl -0672+ 9C7C 06 00 ld b,0 -0673+ 9C7E D6 30 sub 0x30 -0674+ 9C80 4F ld c,a -0675+ 9C81 09 add hl,bc -0676+ 9C82 13 inc de -0677+ 9C83 13 inc de -0678+ 9C84 08 exa -0679+ 9C85 3D dec a -0680+ 9C86 20 E7 jr nz,PutDec -0681+ 9C88 B7 or a ;сброс флага C -0682+ 9C89 C9 ret -0683+ 9C8A -0684+ 9C8A ;[]=========================================================================[] -0685+ 9C8A ;[] Проверка кода символа на принадлежность к цифрам (коды 0x30...0x39) [] -0686+ 9C8A ;[] Вход: A - код символа [] -0687+ 9C8A ;[] Выход: флаг C - цифра; Флаг NC - не цифра [] -0688+ 9C8A ;[]=========================================================================[] -0689+ 9C8A FE 30 Numeric cp "0" -0690+ 9C8C 3F ccf -0691+ 9C8D D0 ret nc -0692+ 9C8E FE 3A cp 3Ah -0693+ 9C90 C9 ret -0694+ 9C91 -0695+ 9C91 ;[]=========================================================================[] -0696+ 9C91 ;[] Перевод символов латинского алфавита a...z в верхний регистр [] -0697+ 9C91 ;[] Вход: A - код символа [] -0698+ 9C91 ;[] Выход: A - код символа в верхнем регистре [] -0699+ 9C91 ;[]=========================================================================[] -0700+ 9C91 FE 61 CapsLetter cp "a" ;<"a" -0701+ 9C93 D8 ret c -0702+ 9C94 FE 7B cp "z"+1 ;>"z" -0703+ 9C96 D0 ret nc -0704+ 9C97 E6 DF and 11011111b ;преобразование символа -0705+ 9C99 C9 ret -0706+ 9C9A -0707+ 9C9A E5 InputLine1 push hl -0708+ 9C9B C5 push bc -0709+ 9C9C CD D3 91 call CursorSet -0710+ 9C9F C1 pop bc -0711+ 9CA0 E1 pop hl -0712+ 9CA1 18 07 jr InputLine -0713+ 9CA3 -0714+ 9CA3 ;[]=========================================================================[] -0715+ 9CA3 ;[] Ввод строки символов с клавиатуры [] -0716+ 9CA3 ;[] Вход: B - длина строки ввода [] -0717+ 9CA3 ;[] HL - координаты курсора [] -0718+ 9CA3 ;[] Выход: флаг C - флаг NC - [] -0719+ 9CA3 ;[] C - длина введенной строки, если [] -0720+ 9CA3 ;[]=========================================================================[] -0721+ 9CA3 InputLineEd: -0722+ 9CA3 3A 1B AB ld a,(Color.InLineEd) ;цвет строки ввода -0723+ 9CA6 4F ld c,a -0724+ 9CA7 AF xor a -0725+ 9CA8 18 06 jr InputLine+6 -0726+ 9CAA InputLine: -0727+ 9CAA 3A 1A AB ld a,(Color.InLine) ;цвет строки ввода -0728+ 9CAD 4F ld c,a -0729+ 9CAE 3E FF ld a,On -0730+ 9CB0 32 B2 9E ld (.EntEnd),a -0731+ 9CB3 3E C3 ld a,0xC3 ;код JP -0732+ 9CB5 32 34 9D ld (.L15),a -0733+ 9CB8 22 AA 9F ld (CursPos),hl -0734+ 9CBB 22 B3 9E ld (.Coordinate),hl -0735+ 9CBE 21 B5 9E ld hl,.Pos -0736+ 9CC1 AF xor a ;текущая позиция -0737+ 9CC2 77 ld (hl),a -0738+ 9CC3 23 inc hl -0739+ 9CC4 71 ld (hl),c ;цвет -0740+ 9CC5 23 inc hl -0741+ 9CC6 70 ld (hl),b ;длина строки редактирования -0742+ 9CC7 23 inc hl ;начало буфера редактирования -0743+ 9CC8 11 09 92 ld de,CursorSet.Buffer ;буфер строки под курсором -0744+ 9CCB ;ld c,a ;окраска строки редактирования -0745+ 9CCB 1A .L1 ld a,(de) -0746+ 9CCC 77 ld (hl),a -0747+ 9CCD 23 inc hl -0748+ 9CCE 13 inc de -0749+ 9CCF 71 ld (hl),c -0750+ 9CD0 23 inc hl -0751+ 9CD1 13 inc de -0752+ 9CD2 10 F7 djnz .L1 -0753+ 9CD4 -0754+ 9CD4 CD 1C 9E call .PrintInLine ;напечатать строку -0755+ 9CD7 3A B2 9E ld a,(.EntEnd) -0756+ 9CDA B7 or a -0757+ 9CDB C4 05 9E call nz,.EndString ;курсор в конец строки -0758+ 9CDE -0759+ 9CDE 3E FF .L100 ld a,On ;включить програм курсор -0760+ 9CE0 32 A6 9F ld (CursOnOff),a -0761+ 9CE3 21 DE 9C ld hl,.L100 -0762+ 9CE6 E5 push hl ;адрес возврата -0763+ 9CE7 0E 31 ld c,Dss.ScanKey ;состояние клавиатуры -0764+ 9CE9 D7 rst DssRst -0765+ 9CEA 28 FB jr z,$-3 -0766+ 9CEC -0767+ 9CEC FE 20 cp 0x20 ;есть ASCII-код -0768+ 9CEE 38 49 jr c,.L3 -0769+ 9CF0 -0770+ 9CF0 F5 push af -0771+ 9CF1 3A B5 9E ld a,(.Pos) -0772+ 9CF4 08 exa -0773+ 9CF5 21 B6 9E ld hl,.Color ;текущий цвет строки ввода -0774+ 9CF8 3A 1A AB ld a,(Color.InLine) -0775+ 9CFB BE cp (hl) -0776+ 9CFC CC 32 9E call z,.ClearInLine -0777+ 9CFF CC EA 9D call z,.HomeString -0778+ 9D02 CD 7A 9E call .NextPos ;на выходе в HL адрес .Pos -0779+ 9D05 28 1F jr z,.L12 -0780+ 9D07 3A A8 9F ld a,(CursInsOvr) ;режим Ins/Ovr -0781+ 9D0A B7 or a -0782+ 9D0B 20 19 jr nz,.L12 ;переход если Ovr -0783+ 9D0D 3A B7 9E ld a,(.Len) -0784+ 9D10 5F ld e,a -0785+ 9D11 3D dec a ;длина строки - 1 -0786+ 9D12 87 add a,a -0787+ 9D13 06 00 ld b,0 -0788+ 9D15 4F ld c,a -0789+ 9D16 56 ld d,(hl) ;позиция печати символа -0790+ 9D17 21 B8 9E ld hl,.Buffer -0791+ 9D1A 09 add hl,bc ;конец буфера -0792+ 9D1B 23 inc hl -0793+ 9D1C 7B ld a,e -0794+ 9D1D 92 sub d ;кол-во сдвигаемых символов -0795+ 9D1E 87 add a,a -0796+ 9D1F 4F ld c,a -0797+ 9D20 54 ld d,h -0798+ 9D21 5D ld e,l -0799+ 9D22 2B dec hl -0800+ 9D23 2B dec hl -0801+ 9D24 ED B8 lddr ;раздвижка строки -0802+ 9D26 08 .L12 exa -0803+ 9D27 87 add a,a -0804+ 9D28 06 00 ld b,0 -0805+ 9D2A 4F ld c,a -0806+ 9D2B 21 B8 9E ld hl,.Buffer -0807+ 9D2E 09 add hl,bc ;адрес в буфере -0808+ 9D2F F1 pop af -0809+ 9D30 77 ld (hl),a ;символ в буфер -0810+ 9D31 CD 85 9F call ResCurs -0811+ 9D34 C3 1C 9E .L15 jp .PrintInLine -0812+ 9D37 18 16 jr .L14 -0813+ 9D39 -0814+ 9D39 FE 1B .L3 cp 0x1B ; -0815+ 9D3B 20 06 jr nz,.L13 -0816+ 9D3D CD 85 9F call ResCurs -0817+ 9D40 E1 pop hl ;востановить стек -0818+ 9D41 37 scf -0819+ 9D42 C9 ret -0820+ 9D43 -0821+ 9D43 FE 0D .L13 cp 0x0D ; -0822+ 9D45 20 0D jr nz,.L2 -0823+ 9D47 3E FF ld a,On -0824+ 9D49 32 B2 9E ld (.EntEnd),a -0825+ 9D4C CD 85 9F call ResCurs -0826+ 9D4F E1 .L14 pop hl ;востановить стек -0827+ 9D50 CD 63 9E call .EndPos ;длина введенной строки -0828+ 9D53 C9 ret -0829+ 9D54 -0830+ 9D54 7A .L2 ld a,d -0831+ 9D55 FE 4F cp 0x4F ; -0832+ 9D57 20 2D jr nz,.L9 -0833+ 9D59 CD 85 9F call ResCurs -0834+ 9D5C 21 B6 9E ld hl,.Color ;текущий цвет строки ввода -0835+ 9D5F 3A 1A AB ld a,(Color.InLine) -0836+ 9D62 BE cp (hl) -0837+ 9D63 CC 32 9E call z,.ClearInLine -0838+ 9D66 21 B5 9E .L11 ld hl,.Pos -0839+ 9D69 7E ld a,(hl) ;позиция курсора -0840+ 9D6A 87 add a,a -0841+ 9D6B 5F ld e,a -0842+ 9D6C 23 inc hl -0843+ 9D6D 23 inc hl -0844+ 9D6E 7E ld a,(hl) ;длина строки -0845+ 9D6F 3D dec a -0846+ 9D70 87 add a,a -0847+ 9D71 93 sub e ;проверка конца строки -0848+ 9D72 4F ld c,a -0849+ 9D73 06 00 ld b,0 -0850+ 9D75 50 ld d,b -0851+ 9D76 23 inc hl ;начало буфера -0852+ 9D77 19 add hl,de ;адрес курсора -0853+ 9D78 E5 push hl -0854+ 9D79 D1 pop de -0855+ 9D7A 23 inc hl -0856+ 9D7B 23 inc hl -0857+ 9D7C 28 02 jr z,$+4 ;если в конце строки -0858+ 9D7E ED B0 ldir -0859+ 9D80 3E 20 ld a," " -0860+ 9D82 12 ld (de),a ;последний символ -0861+ 9D83 C3 1C 9E jp .PrintInLine -0862+ 9D86 -0863+ 9D86 FE 0E .L9 cp 0x0E ; -0864+ 9D88 20 15 jr nz,.L10 -0865+ 9D8A CD 85 9F call ResCurs -0866+ 9D8D CD 4A 9E call .ColorInLine ;сменить цвет строки -0867+ 9D90 21 B5 9E ld hl,.Pos -0868+ 9D93 7E ld a,(hl) ;позиция курсора -0869+ 9D94 B7 or a -0870+ 9D95 CA 1C 9E jp z,.PrintInLine ;если в начале строки -0871+ 9D98 35 dec (hl) ;уменьшить позицию -0872+ 9D99 21 AA 9F ld hl,CursPos -0873+ 9D9C 35 dec (hl) ;курсор влево -0874+ 9D9D 18 C7 jr .L11 -0875+ 9D9F -0876+ 9D9F FE 50 .L10 cp 0x50 ; -0877+ 9DA1 20 08 jr nz,.L5 -0878+ 9DA3 3A A8 9F ld a,(CursInsOvr) -0879+ 9DA6 2F cpl -0880+ 9DA7 32 A8 9F ld (CursInsOvr),a -0881+ 9DAA C9 ret -0882+ 9DAB -0883+ 9DAB FE 56 .L5 cp 0x56 ; -0884+ 9DAD 20 15 jr nz,.L6 -0885+ 9DAF CD 85 9F call ResCurs -0886+ 9DB2 CD 4A 9E call .ColorInLine ;сменить цвет строки -0887+ 9DB5 CC 1C 9E call z,.PrintInLine -0888+ 9DB8 CD 63 9E call .EndPos -0889+ 9DBB C8 ret z -0890+ 9DBC 3A B5 9E ld a,(.Pos) -0891+ 9DBF B9 cp c -0892+ 9DC0 D0 ret nc -0893+ 9DC1 C3 7A 9E jp .NextPos -0894+ 9DC4 -0895+ 9DC4 FE 54 .L6 cp 0x54 ; -0896+ 9DC6 20 15 jr nz,.L7 -0897+ 9DC8 CD 85 9F call ResCurs -0898+ 9DCB CD 4A 9E call .ColorInLine ;сменить цвет строки -0899+ 9DCE CC 1C 9E call z,.PrintInLine -0900+ 9DD1 21 B5 9E ld hl,.Pos ;позиция курсора -0901+ 9DD4 7E ld a,(hl) -0902+ 9DD5 B7 or a -0903+ 9DD6 C8 ret z -0904+ 9DD7 35 dec (hl) -0905+ 9DD8 21 AA 9F ld hl,CursPos ;координаты програм курсора -0906+ 9DDB 35 dec (hl) -0907+ 9DDC C9 ret -0908+ 9DDD -0909+ 9DDD FE 57 .L7 cp 0x57 ; -0910+ 9DDF 20 18 jr nz,.L8 -0911+ 9DE1 CD 85 9F call ResCurs -0912+ 9DE4 CD 4A 9E call .ColorInLine ;сменить цвет строки -0913+ 9DE7 CC 1C 9E call z,.PrintInLine -0914+ 9DEA 21 B5 9E .HomeString ld hl,.Pos ;позиция курсора -0915+ 9DED 7E ld a,(hl) -0916+ 9DEE B7 or a -0917+ 9DEF C8 ret z -0918+ 9DF0 3A B3 9E ld a,(.Coordinate) ;координаты начала строки -0919+ 9DF3 32 AA 9F ld (CursPos),a -0920+ 9DF6 AF xor a -0921+ 9DF7 77 ld (hl),a ;обнулить позицию печати -0922+ 9DF8 C9 ret -0923+ 9DF9 -0924+ 9DF9 FE 51 .L8 cp 0x51 ; -0925+ 9DFB C0 ret nz -0926+ 9DFC CD 85 9F call ResCurs -0927+ 9DFF CD 4A 9E call .ColorInLine ;сменить цвет строки -0928+ 9E02 CC 1C 9E call z,.PrintInLine -0929+ 9E05 CD 63 9E .EndString call .EndPos -0930+ 9E08 C8 ret z -0931+ 9E09 3A B7 9E ld a,(.Len) -0932+ 9E0C ; dec a ;длина строки ввода - 1 -0933+ 9E0C 91 sub c ;заполнена полностью? -0934+ 9E0D 20 01 jr nz,$+3 -0935+ 9E0F 0D dec c -0936+ 9E10 21 B5 9E ld hl,.Pos -0937+ 9E13 71 ld (hl),c ;позиция в конце строки -0938+ 9E14 3A B3 9E ld a,(.Coordinate) -0939+ 9E17 81 add a,c -0940+ 9E18 32 AA 9F ld (CursPos),a ;новая позиция програм курсора -0941+ 9E1B C9 ret -0942+ 9E1C -0943+ 9E1C DD 21 B8 9E .PrintInLine ld ix,.Buffer ;буфер строки -0944+ 9E20 3A B7 9E ld a,(.Len) -0945+ 9E23 6F ld l,a -0946+ 9E24 26 01 ld h,1 ;размеры буфера -0947+ 9E26 ED 5B B3 9E ld de,(.Coordinate) ;координаты в экране -0948+ 9E2A ifdef D_PRINTCH_BIOS -0949+ 9E2A~ xor a -0950+ 9E2A~ ld c,Bios.Win_Restore_Win ;вывод буфера на экран -0951+ 9E2A~ di -0952+ 9E2A~ rst BiosRst -0953+ 9E2A~ ei -0954+ 9E2A else -0955+ 9E2A 3A 1E AB ld a,(BankDebug) -0956+ 9E2D 47 ld b,a -0957+ 9E2E 0E 5A ld c,Dss.WinRest -0958+ 9E30 D7 rst DssRst -0959+ 9E31 endif -0960+ 9E31 C9 ret -0961+ 9E32 -0962+ 9E32 21 B7 9E .ClearInLine ld hl,.Len ;очистка строки ввода -0963+ 9E35 46 ld b,(hl) ;длина строки ввода -0964+ 9E36 3E 20 ld a," " ;пробел -0965+ 9E38 23 inc hl ;начало буфера строки -0966+ 9E39 77 ld (hl),a -0967+ 9E3A 23 inc hl -0968+ 9E3B 10 FB djnz $-3 -0969+ 9E3D AF xor a ;позиция печати -0970+ 9E3E 32 B5 9E ld (.Pos),a -0971+ 9E41 08 exa -0972+ 9E42 3A B3 9E ld a,(.Coordinate) -0973+ 9E45 32 AA 9F ld (CursPos),a -0974+ 9E48 18 08 jr $+10 -0975+ 9E4A -0976+ 9E4A 21 B6 9E .ColorInLine ld hl,.Color ;окраска в основной цвет -0977+ 9E4D 3A 1A AB ld a,(Color.InLine) -0978+ 9E50 BE cp (hl) -0979+ 9E51 C0 ret nz -0980+ 9E52 3A 1B AB ld a,(Color.InLineEd) ;цвет строки ввода -0981+ 9E55 32 B6 9E ld (.Color),a -0982+ 9E58 21 B7 9E ld hl,.Len ;длина строки ввода -0983+ 9E5B 46 ld b,(hl) -0984+ 9E5C 23 inc hl -0985+ 9E5D 23 inc hl -0986+ 9E5E 77 ld (hl),a -0987+ 9E5F 23 inc hl -0988+ 9E60 10 FB djnz $-3 -0989+ 9E62 C9 ret -0990+ 9E63 -0991+ 9E63 21 B8 9E .EndPos ld hl,.Buffer ;поиск позиции послед. символа -0992+ 9E66 3A B7 9E ld a,(.Len) -0993+ 9E69 4F ld c,a -0994+ 9E6A 3D dec a -0995+ 9E6B 87 add a,a -0996+ 9E6C 5F ld e,a -0997+ 9E6D 16 00 ld d,0 -0998+ 9E6F 19 add hl,de -0999+ 9E70 7E ld a,(hl) -1000+ 9E71 2B dec hl -1001+ 9E72 2B dec hl -1002+ 9E73 FE 20 cp " " ;ищем конец строки -1003+ 9E75 C0 ret nz -1004+ 9E76 0D dec c -1005+ 9E77 20 F7 jr nz,$-7 -1006+ 9E79 C9 ret -1007+ 9E7A -1008+ 9E7A 21 B5 9E .NextPos ld hl,.Pos ;расчет следующей позиции -1009+ 9E7D 3A B7 9E ld a,(.Len) -1010+ 9E80 3D dec a -1011+ 9E81 BE cp (hl) -1012+ 9E82 20 0B jr nz,.L16 -1013+ 9E84 3A B2 9E ld a,(.EntEnd) ;заканчивать по ENTER -1014+ 9E87 3C inc a -1015+ 9E88 C8 ret z ;последняя позиция в строке -1016+ 9E89 3E CD ld a,0xCD ;код CALL -1017+ 9E8B 32 34 9D ld (.L15),a -1018+ 9E8E C9 ret -1019+ 9E8F 34 .L16 inc (hl) ;увеличение позиции -1020+ 9E90 3A AA 9F ld a,(CursPos) ;координаты програм курсора -1021+ 9E93 3C inc a -1022+ 9E94 32 AA 9F ld (CursPos),a -1023+ 9E97 C9 ret -1024+ 9E98 ;[]=========================================================================[] -1025+ 9E98 ;[] Копирование из буфера строки ввода [] -1026+ 9E98 ;[]=========================================================================[] -1027+ 9E98 ;Вход: -1028+ 9E98 ;DE - адрес назначения -1029+ 9E98 ;C - длина строки -1030+ 9E98 -1031+ 9E98 21 B8 9E .FromBuffer ld hl,.Buffer -1032+ 9E9B 06 00 ld b,0 -1033+ 9E9D 7E .FB1 ld a,(hl) -1034+ 9E9E 12 ld (de),a -1035+ 9E9F 23 inc hl -1036+ 9EA0 23 inc hl -1037+ 9EA1 13 inc de -1038+ 9EA2 0D dec c -1039+ 9EA3 20 F8 jr nz,.FB1 -1040+ 9EA5 C9 ret -1041+ 9EA6 ;[]=========================================================================[] -1042+ 9EA6 ;[] Копирование в буфер строки ввода [] -1043+ 9EA6 ;[]=========================================================================[] -1044+ 9EA6 ;Вход: -1045+ 9EA6 ;HL - адрес строки -1046+ 9EA6 ;C - длина строки -1047+ 9EA6 -1048+ 9EA6 11 B8 9E .ToBuffer ld de,.Buffer -1049+ 9EA9 7E .TB1 ld a,(hl) -1050+ 9EAA 12 ld (de),a -1051+ 9EAB 13 inc de -1052+ 9EAC 13 inc de -1053+ 9EAD 23 inc hl -1054+ 9EAE 0D dec c -1055+ 9EAF 20 F8 jr nz,.TB1 -1056+ 9EB1 C9 ret -1057+ 9EB2 FF .EntEnd db On ;флаг окончания строки ENTER -1058+ 9EB3 00 00 .Coordinate dw 0 ;начало строки в экране -1059+ 9EB5 ;последовательность переменных не изменять! -1060+ 9EB5 00 .Pos db 0 ;позиция курсора в строке -1061+ 9EB6 00 .Color db 0 ;цвет строки ввода -1062+ 9EB7 00 .Len db 0 ;длина строки ввода -1063+ 9EB8 00 .Buffer ds 22*2 ;буфер строки ввода -1064+ 9EE4 -1065+ 9EE4 ;[]=========================================================================[] -1066+ 9EE4 ;[] Программное создние мигающего курсора [] -1067+ 9EE4 ;[]=========================================================================[] -1068+ 9EE4 -1069+ 9EE4 ;======== Подготовка дополнительного знакогенератора ======== -1070+ 9EE4 PreparChar: -1071+ 9EE4 11 00 80 ld de,OrgAdr-0x100 ;буфер для 2kB знакогенератора -1072+ 9EE7 0E B8 ld c,Bios.Win_Get_ZG ;получить сист. знакогенератор -1073+ 9EE9 CF rst BiosRst -1074+ 9EEA 21 00 87 ld hl,OrgAdr-0x100+7*256 -1075+ 9EED 01 FF 00 ld bc,0x00FF -1076+ 9EF0 71 ld (hl),c -1077+ 9EF1 23 inc hl -1078+ 9EF2 10 FC djnz $-2 -1079+ 9EF4 -1080+ 9EF4 11 00 80 ld de,OrgAdr-0x100 ;уст.знакогенератор 0x5B -1081+ 9EF7 0E B6 ld c,Bios.Win_Set_ZG -1082+ 9EF9 3E 5B ld a,0x5B -1083+ 9EFB CF rst BiosRst -1084+ 9EFC -1085+ 9EFC 2A 39 00 ld hl,(0039h) ;установка вектора (для мигания курсора) -1086+ 9EFF 22 31 9F ld (Rst38.Vect+1),hl -1087+ 9F02 21 09 9F ld hl,Rst38 -1088+ 9F05 22 39 00 ld (0039h),hl -1089+ 9F08 C9 ret -1090+ 9F09 -1091+ 9F09 F3 Rst38 di ;вектор курсора -1092+ 9F0A FD E5 push iy -1093+ 9F0C DD E5 push ix -1094+ 9F0E E5 push hl -1095+ 9F0F D5 push de -1096+ 9F10 C5 push bc -1097+ 9F11 F5 push af -1098+ 9F12 D9 exx -1099+ 9F13 08 exa -1100+ 9F14 E5 push hl -1101+ 9F15 D5 push de -1102+ 9F16 C5 push bc -1103+ 9F17 F5 push af -1104+ 9F18 CD 0D 98 call Clock -1105+ 9F1B 3A A6 9F ld a,(CursOnOff) -1106+ 9F1E B7 or a -1107+ 9F1F C4 33 9F call nz,CuttingCurs -1108+ 9F22 F1 pop af -1109+ 9F23 C1 pop bc -1110+ 9F24 D1 pop de -1111+ 9F25 E1 pop hl -1112+ 9F26 D9 exx -1113+ 9F27 08 exa -1114+ 9F28 F1 pop af -1115+ 9F29 C1 pop bc -1116+ 9F2A D1 pop de -1117+ 9F2B E1 pop hl -1118+ 9F2C DD E1 pop ix -1119+ 9F2E FD E1 pop iy -1120+ 9F30 C3 00 00 .Vect jp 0x0000 ;адрес сист. вектора RST 38 -1121+ 9F33 -1122+ 9F33 ;======== Обработка программного курсора ======== -1123+ 9F33 3A A9 9F CuttingCurs ld a,(TimerFlash) ;пауза мигания -1124+ 9F36 3D dec a -1125+ 9F37 CC 3E 9F call z,.L1 -1126+ 9F3A 32 A9 9F ld (TimerFlash),a -1127+ 9F3D C9 ret -1128+ 9F3E -1129+ 9F3E 3A A7 9F .L1 ld a,(CursPutRes) -1130+ 9F41 2F cpl -1131+ 9F42 32 A7 9F ld (CursPutRes),a -1132+ 9F45 -1133+ 9F45 ED 5B AA 9F ld de,(CursPos) -1134+ 9F49 ED 53 9A 9F ld (ResCurs.L1+1),de -1135+ 9F4D B7 or a ;флаг Put / Res -1136+ 9F4E 28 0C jr z,.L3 ;установка курсора -1137+ 9F50 ;иначе сброс курсора -1138+ 9F50 2A AC 9F ld hl,(CursSymb) ;символ и его цвет -1139+ 9F53 97 sub a ;сброс id окна -1140+ 9F54 06 1B ld b,SysSymb ;системный знакогенератор -1141+ 9F56 0E B5 ld c,Bios.Win_Put_Sym ;положить символ -1142+ 9F58 CF rst BiosRst -1143+ 9F59 3E 10 ld a,PauseFlash ;пауза мигания -1144+ 9F5B C9 ret -1145+ 9F5C -1146+ 9F5C 0E B4 .L3 ld c,Bios.Win_Get_Sym ;получить символ -1147+ 9F5E 97 sub a ;сброс id окна -1148+ 9F5F CF rst BiosRst -1149+ 9F60 22 AC 9F ld (CursSymb),hl ;символ и его цвет -1150+ 9F63 -1151+ 9F63 ED 5B AA 9F ld de,(CursPos) ;позиция печати -1152+ 9F67 3A A8 9F ld a,(CursInsOvr) ;флаг режима Ins / Ovr -1153+ 9F6A B7 or a -1154+ 9F6B 28 0F jr z,.L4 ;режим вставки -1155+ 9F6D ;иначе режим замены -1156+ 9F6D 7C ld a,h -1157+ 9F6E 07 rlca -1158+ 9F6F 07 rlca -1159+ 9F70 07 rlca -1160+ 9F71 07 rlca -1161+ 9F72 67 ld h,a -1162+ 9F73 97 sub a ;сброс id окна -1163+ 9F74 06 1B ld b,SysSymb ;системный знакогенератор -1164+ 9F76 ; ld l,0xDC ;курсор режима замены -1165+ 9F76 0E B5 ld c,Bios.Win_Put_Sym ;символ на экран -1166+ 9F78 CF rst BiosRst -1167+ 9F79 3E 10 ld a,PauseFlash ;пауза мигания -1168+ 9F7B C9 ret -1169+ 9F7C -1170+ 9F7C 97 .L4 sub a ;сброс id окна -1171+ 9F7D 06 5B ld b,0x5B ;модиф. знакогенератор -1172+ 9F7F 0E B5 ld c,Bios.Win_Put_Sym ;символ на экран -1173+ 9F81 CF rst BiosRst -1174+ 9F82 3E 10 ld a,PauseFlash ;пауза мигания -1175+ 9F84 C9 ret -1176+ 9F85 -1177+ 9F85 ;======== Принудительный сброс курсора ======== -1178+ 9F85 3A A6 9F ResCurs ld a,(CursOnOff) -1179+ 9F88 B7 or a -1180+ 9F89 C8 ret z ;курсор не установлен -1181+ 9F8A E5 push hl -1182+ 9F8B 3E FF ld a,On -1183+ 9F8D 32 A7 9F ld (CursPutRes),a -1184+ 9F90 3C inc a -1185+ 9F91 32 A6 9F ld (CursOnOff),a -1186+ 9F94 3E 01 ld a,1 ;пауза мигания -1187+ 9F96 32 A9 9F ld (TimerFlash),a -1188+ 9F99 11 00 00 .L1 ld de,0 ;последние координаты курсора -1189+ 9F9C 2A AC 9F ld hl,(CursSymb) -1190+ 9F9F 01 B5 1B ld bc,0x1B00+Bios.Win_Put_Sym -1191+ 9FA2 97 sub a ;сбросить id окна -1192+ 9FA3 CF rst BiosRst -1193+ 9FA4 E1 pop hl -1194+ 9FA5 C9 ret -1195+ 9FA6 -1196+ 9FA6 00 CursOnOff db Off ;флаг курсора 00-выкл/FF-вкл -1197+ 9FA7 FF CursPutRes db On ;флаг 00-Res/FF-Put -1198+ 9FA8 00 CursInsOvr db Ins ;флаг 00-Ins/FF-Ovr -1199+ 9FA9 01 TimerFlash db 1 ;таймер -1200+ 9FAA 00 00 CursPos dw 0 ;позиция курсора -1201+ 9FAC 00 00 CursSymb dw 0 ;символ под курсором -1202+ 9FAE -1203+ 9FAE -0377 9FAE include "kreg.asm";"D:\WORKAST\DEMON\kreg" -0001+ 9FAE ;[]=========================================================================[] -0002+ 9FAE ;[] Обработка клавиатуры в окне регистров [] -0003+ 9FAE ;[] v0.03 - последние изменения 11.03.2006 [] -0004+ 9FAE ;[] v0.10 - последние изменения 14.05.2006 [] -0005+ 9FAE ;[]=========================================================================[] -0006+ 9FAE KReg: -0007+ 9FAE ; ld a,b ;состояние -0008+ 9FAE ; and 0b11110000 -0009+ 9FAE ; jr z,.L100 -0010+ 9FAE -0011+ 9FAE ;Обработка комбинации Shift + символ -0012+ 9FAE ; and 0b11000000 ; -0013+ 9FAE ; or a -0014+ 9FAE ; jp z,Keyb+6 -0015+ 9FAE ; ld a,d -0016+ 9FAE ; cp 0x80+0x0F ;Shift+Tab -0017+ 9FAE ; jp nz,Keyb+6 -0018+ 9FAE ; ld a,2 ;номер окна дампа -0019+ 9FAE ; ld (Keyb.WinScreen),a -0020+ 9FAE ; jp Keyb-3 -0021+ 9FAE -0022+ 9FAE ;Обработка позиционного кода -0023+ 9FAE 7B .L100 ld a,e ;ASCII код -0024+ 9FAF 32 44 A0 ld (.L200+1),a -0025+ 9FB2 7A ld a,d ;позиционный код -0026+ 9FB3 -0027+ 9FB3 FE 56 cp 0x56 ; -0028+ 9FB5 20 10 jr nz,.L101 -0029+ 9FB7 CD 06 A2 call .DescCalc -0030+ 9FBA 7E ld a,(hl) ;кол-во колонок -0031+ 9FBB BB cp e -0032+ 9FBC 7B ld a,e -0033+ 9FBD 20 01 jr nz,$+3 -0034+ 9FBF AF xor a -0035+ 9FC0 3C inc a -0036+ 9FC1 32 2C A2 ld (.Coordinate),a ;текущая колонка -0037+ 9FC4 C3 4E 98 jp Keyb-3 -0038+ 9FC7 -0039+ 9FC7 FE 54 .L101 cp 0x54 ; -0040+ 9FC9 20 11 jr nz,.L102 -0041+ 9FCB CD 06 A2 call .DescCalc -0042+ 9FCE 7B ld a,e ;текущая колонка -0043+ 9FCF FE 01 cp 1 -0044+ 9FD1 20 02 jr nz,$+4 -0045+ 9FD3 7E ld a,(hl) ;кол-во колонок -0046+ 9FD4 3C inc a -0047+ 9FD5 3D dec a -0048+ 9FD6 32 2C A2 ld (.Coordinate),a ;текущая колонка -0049+ 9FD9 C3 4E 98 jp Keyb-3 -0050+ 9FDC -0051+ 9FDC 2A 2E A2 .L102 ld hl,(.Descript) -0052+ 9FDF ED 5B 2C A2 ld de,(.Coordinate) -0053+ 9FE3 FE 52 cp 0x52 ; -0054+ 9FE5 20 09 jr nz,.L103 -0055+ 9FE7 7A ld a,d ;текущая строка -0056+ 9FE8 BD cp l -0057+ 9FE9 20 02 jr nz,.L104 -0058+ 9FEB 7C ld a,h ;1-я строка -0059+ 9FEC 3D dec a -0060+ 9FED 3C .L104 inc a -0061+ 9FEE 18 0B jr .L107+1 -0062+ 9FF0 -0063+ 9FF0 FE 58 .L103 cp 0x58 ; -0064+ 9FF2 20 10 jr nz,.L105 -0065+ 9FF4 7A ld a,d ;текущая строка -0066+ 9FF5 BC cp h -0067+ 9FF6 20 02 jr nz,.L107 -0068+ 9FF8 7D ld a,l ;адрес последней строки -0069+ 9FF9 3C inc a -0070+ 9FFA 3D .L107 dec a -0071+ 9FFB 67 ld h,a -0072+ 9FFC 2E 01 ld l,1 -0073+ 9FFE 22 2C A2 ld (.Coordinate),hl -0074+ A001 C3 4E 98 jp Keyb-3 -0075+ A004 -0076+ A004 06 03 .L105 ld b,3 -0077+ A006 FE 53 cp 0x53 ; -0078+ A008 20 0D jr nz,.L108 -0079+ A00A 21 24 A2 ld hl,.PgDown -0080+ A00D 7A ld a,d ;текущая строка -0081+ A00E BE cp (hl) -0082+ A00F 38 03 jr c,$+5 -0083+ A011 23 inc hl -0084+ A012 10 FA djnz $-4 -0085+ A014 7E ld a,(hl) -0086+ A015 18 E4 jr .L107+1 -0087+ A017 -0088+ A017 FE 59 .L108 cp 0x59 ; -0089+ A019 20 0E jr nz,.L110 -0090+ A01B 21 28 A2 ld hl,.PgUp -0091+ A01E 7A ld a,d ;текущая строка -0092+ A01F BE cp (hl) -0093+ A020 30 03 jr nc,$+5 -0094+ A022 23 inc hl -0095+ A023 10 FA djnz $-4 -0096+ A025 7E ld a,(hl) -0097+ A026 3D dec a -0098+ A027 18 D2 jr .L107+1 -0099+ A029 -0100+ A029 FE 57 .L110 cp 0x57 ; -0101+ A02B 20 08 jr nz,.L111 -0102+ A02D 3E 01 ld a,1 -0103+ A02F 32 2C A2 ld (.Coordinate),a ;первая колонка -0104+ A032 C3 4E 98 jp Keyb-3 -0105+ A035 -0106+ A035 FE 51 .L111 cp 0x51 ; -0107+ A037 20 0A jr nz,.L200 -0108+ A039 CD 06 A2 call .DescCalc -0109+ A03C 7E ld a,(hl) ;последняя колонка -0110+ A03D 32 2C A2 ld (.Coordinate),a ;первая колонка -0111+ A040 C3 4E 98 jp Keyb-3 -0112+ A043 -0113+ A043 ;.L112 cp 0x0F ; -0114+ A043 ; jr nz,.L200 -0115+ A043 ; ld a,4 ;номер окна листинга -0116+ A043 ; ld (Keyb.WinScreen),a -0117+ A043 ; jp Keyb-3 -0118+ A043 -0119+ A043 ;Обработка ASCII кодов -0120+ A043 3E 00 .L200 ld a,0 ;ASCII код -0121+ A045 FE 0D cp 0x0D ; -0122+ A047 C2 57 98 jp nz,Keyb+6 -0123+ A04A 06 00 .L201 ld b,0 ;длина строки ввода -0124+ A04C 21 00 00 ld hl,0 ;координаты строки ввода -0125+ A04F -0126+ A04F 78 ld a,b -0127+ A050 3D dec a -0128+ A051 C2 DB A0 jp nz,.L205 -0129+ A054 ED 5B 2C A2 ld de,(.Coordinate) -0130+ A058 7A ld a,d ;номер строки -0131+ A059 4B ld c,e ;номер колонки -0132+ A05A EB ex de,hl ;координаты -0133+ A05B 21 30 AB ld hl,Reg._AF+1 ;рег A -0134+ A05E FE 06 cp 6 ;строка с парой AF? -0135+ A060 28 26 jr z,.L207 -0136+ A062 21 38 AB ld hl,Reg._AF_+1 ;рег A' -0137+ A065 FE 0B cp 11 ;строка с парой AF'? -0138+ A067 28 1F jr z,.L207 -0139+ A069 21 2F AB ld hl,Reg._AF ;рег F -0140+ A06C FE 07 cp 7 ;строка с парой AF? -0141+ A06E 28 07 jr z,$+9 -0142+ A070 21 37 AB ld hl,Reg._AF_ ;рег F' -0143+ A073 FE 0C cp 12 ;строка с парой AF'? -0144+ A075 20 3B jr nz,.L206 -0145+ A077 79 ld a,c ;коррекция номеров бит -0146+ A078 FE 04 cp 4 ;колонка 4..6? -0147+ A07A 38 03 jr c,$+5 -0148+ A07C 0C inc c -0149+ A07D 18 05 jr .L207-4 -0150+ A07F FE 03 cp 3 ;колонка 3? -0151+ A081 28 01 jr z,.L207-4 -0152+ A083 0D dec c -0153+ A084 3E 07 ld a,7 -0154+ A086 18 06 jr .L208 -0155+ A088 3E 0A .L207 ld a,10 ;колонки с битами -0156+ A08A B9 cp c -0157+ A08B 28 25 jr z,.L206 -0158+ A08D 3D dec a -0159+ A08E 91 .L208 sub c ;номер бита -0160+ A08F 07 rlca -0161+ A090 07 rlca -0162+ A091 07 rlca ;заготовка для битовых операций -0163+ A092 47 ld b,a -0164+ A093 F6 46 or 01000110b ;для BIT -0165+ A095 32 A5 A0 ld ($+16),a -0166+ A098 78 ld a,b -0167+ A099 F6 C6 or 11000110b ;для SET -0168+ A09B 32 A9 A0 ld ($+14),a -0169+ A09E 78 ld a,b -0170+ A09F F6 86 or 10000110b ;для RES -0171+ A0A1 32 AE A0 ld ($+13),a -0172+ A0A4 CB 46 bit 0,(hl) ;состояние бита -0173+ A0A6 20 05 jr nz,$+7 -0174+ A0A8 CB C6 set 0,(hl) ;установка бита -0175+ A0AA C3 46 98 jp Keyb-11 -0176+ A0AD CB 86 res 0,(hl) ;сброс бита -0177+ A0AF C3 46 98 jp Keyb-11 -0178+ A0B2 -0179+ A0B2 EB .L206 ex de,hl ;координаты -0180+ A0B3 CD AA 9C call InputLine ;ввод символа -0181+ A0B6 DA 4E 98 jp c,Keyb-3 ;завершение ввода по -0182+ A0B9 11 2A A1 ld de,.L204-5 -0183+ A0BC D5 push de -0184+ A0BD ED 5B 2C A2 ld de,(.Coordinate) -0185+ A0C1 21 30 AB ld hl,Reg._AF+1 -0186+ A0C4 7A ld a,d -0187+ A0C5 11 00 00 ld de,0 -0188+ A0C8 FE 06 cp 6 ;строка с парой AF -0189+ A0CA C8 ret z -0190+ A0CB 21 38 AB ld hl,Reg._AF_+1 -0191+ A0CE FE 0B cp 11 ;строка с парой AF'? -0192+ A0D0 C8 ret z -0193+ A0D1 ED 5B 2C A2 ld de,(.Coordinate) -0194+ A0D5 7B ld a,e -0195+ A0D6 D6 06 sub 6 -0196+ A0D8 5F ld e,a -0197+ A0D9 18 17 jr .L209 -0198+ A0DB -0199+ A0DB 3D .L205 dec a ;байты в минидампе -0200+ A0DC 20 5D jr nz,.L202 -0201+ A0DE CD AA 9C call InputLine ;ввод числа -0202+ A0E1 DA 4E 98 jp c,Keyb-3 ;завершение ввода по -0203+ A0E4 CD F1 9B call PutCode -0204+ A0E7 DA 4A A0 jp c,.L201 ;ошибка в веденных данных -0205+ A0EA 11 2F A1 ld de,.L204 -0206+ A0ED D5 push de -0207+ A0EE ED 5B 2C A2 ld de,(.Coordinate) -0208+ A0F2 15 .L209 dec d -0209+ A0F3 20 04 jr nz,$+6 -0210+ A0F5 2A 25 AB ld hl,(Reg._IX) -0211+ A0F8 C9 ret -0212+ A0F9 15 dec d -0213+ A0FA 20 04 jr nz,$+6 -0214+ A0FC 2A 27 AB ld hl,(Reg._IY) -0215+ A0FF C9 ret -0216+ A100 15 dec d -0217+ A101 20 04 jr nz,$+6 -0218+ A103 2A 29 AB ld hl,(Reg._HL) -0219+ A106 C9 ret -0220+ A107 15 dec d -0221+ A108 20 04 jr nz,$+6 -0222+ A10A 2A 2B AB ld hl,(Reg._DE) -0223+ A10D C9 ret -0224+ A10E 15 dec d -0225+ A10F 20 04 jr nz,$+6 -0226+ A111 2A 2D AB ld hl,(Reg._BC) -0227+ A114 C9 ret -0228+ A115 15 dec d -0229+ A116 15 dec d -0230+ A117 15 dec d -0231+ A118 20 04 jr nz,$+6 -0232+ A11A 2A 31 AB ld hl,(Reg._HL_) -0233+ A11D C9 ret -0234+ A11E 15 dec d -0235+ A11F 20 04 jr nz,$+6 -0236+ A121 2A 33 AB ld hl,(Reg._DE_) -0237+ A124 C9 ret -0238+ A125 15 dec d -0239+ A126 2A 35 AB ld hl,(Reg._BC_) -0240+ A129 C9 ret -0241+ A12A -0242+ A12A 3A B8 9E ld a,(InputLine.Buffer) -0243+ A12D 18 05 jr $+7 -0244+ A12F 3A 2C 9C .L204 ld a,(PutCode.Buffer) ;записываемый байт -0245+ A132 1D dec e -0246+ A133 1D dec e ;смещение в минидампе -0247+ A134 19 add hl,de ;адрес в памяти -0248+ A135 CD 97 92 call Ld_hl_a ;записали -0249+ A138 C3 46 98 jp Keyb-11 -0250+ A13B -0251+ A13B 3D .L202 dec a ;однобайтное число (номер банки) -0252+ A13C 20 32 jr nz,.L203 -0253+ A13E CD AA 9C call InputLine ;ввод числа -0254+ A141 DA 4E 98 jp c,Keyb-3 ;завершение ввода по -0255+ A144 CD 30 9C call PutAdres -0256+ A147 DA 4A A0 jp c,.L201 ;ошибка в веденных данных -0257+ A14A 11 46 98 ld de,Keyb-11 -0258+ A14D D5 push de -0259+ A14E 7D ld a,l -0260+ A14F ED 5B 2C A2 ld de,(.Coordinate) -0261+ A153 1D dec e ;колонка в строке -0262+ A154 20 04 jr nz,$+6 -0263+ A156 32 3F AB ld (WinPage),a ;0-е окно -0264+ A159 C9 ret -0265+ A15A 1D dec e -0266+ A15B 20 06 jr nz,$+8 -0267+ A15D 32 40 AB ld (WinPage+1),a ;1-е окно -0268+ A160 D3 A2 out (EmmWin.P1),a -0269+ A162 C9 ret -0270+ A163 1D dec e -0271+ A164 20 04 jr nz,$+6 -0272+ A166 32 41 AB ld (WinPage+2),a ;2-е окно -0273+ A169 C9 ret -0274+ A16A 32 42 AB ld (WinPage+3),a ;3-е окно -0275+ A16D D3 E2 out (EmmWin.P3),a -0276+ A16F C9 ret -0277+ A170 -0278+ A170 3D .L203 dec a ;глубина стека -0279+ A171 20 07 jr nz,.L210 -0280+ A173 AF xor a ;обнулить -0281+ A174 32 22 AB ld (StackDown),a -0282+ A177 C3 46 98 jp Keyb-11 -0283+ A17A -0284+ A17A .L210 ;dec a ;двухбайтное число -0285+ A17A ;jp nz,Keyb+6 -0286+ A17A CD AA 9C call InputLine ;ввод числа в рег пары -0287+ A17D DA 4E 98 jp c,Keyb-3 ;завершение ввода по -0288+ A180 CD 30 9C call PutAdres -0289+ A183 DA 4A A0 jp c,.L201 ;ошибка в веденных данных -0290+ A186 11 46 98 ld de,Keyb-11 -0291+ A189 D5 push de -0292+ A18A ED 5B 2C A2 ld de,(.Coordinate) -0293+ A18E 15 dec d -0294+ A18F 20 04 jr nz,$+6 -0295+ A191 22 25 AB ld (Reg._IX),hl -0296+ A194 C9 ret -0297+ A195 15 dec d -0298+ A196 20 04 jr nz,$+6 -0299+ A198 22 27 AB ld (Reg._IY),hl -0300+ A19B C9 ret -0301+ A19C 15 dec d -0302+ A19D 20 04 jr nz,$+6 -0303+ A19F 22 29 AB ld (Reg._HL),hl -0304+ A1A2 C9 ret -0305+ A1A3 15 dec d -0306+ A1A4 20 04 jr nz,$+6 -0307+ A1A6 22 2B AB ld (Reg._DE),hl -0308+ A1A9 C9 ret -0309+ A1AA 15 dec d -0310+ A1AB 20 04 jr nz,$+6 -0311+ A1AD 22 2D AB ld (Reg._BC),hl -0312+ A1B0 C9 ret -0313+ A1B1 15 dec d -0314+ A1B2 20 04 jr nz,$+6 -0315+ A1B4 22 2F AB ld (Reg._AF),hl -0316+ A1B7 C9 ret -0317+ A1B8 15 dec d -0318+ A1B9 15 dec d -0319+ A1BA 20 04 jr nz,$+6 -0320+ A1BC 22 31 AB ld (Reg._HL_),hl -0321+ A1BF C9 ret -0322+ A1C0 15 dec d -0323+ A1C1 20 04 jr nz,$+6 -0324+ A1C3 22 33 AB ld (Reg._DE_),hl -0325+ A1C6 C9 ret -0326+ A1C7 15 dec d -0327+ A1C8 20 04 jr nz,$+6 -0328+ A1CA 22 35 AB ld (Reg._BC_),hl -0329+ A1CD C9 ret -0330+ A1CE 15 dec d -0331+ A1CF 20 04 jr nz,$+6 -0332+ A1D1 22 37 AB ld (Reg._AF_),hl -0333+ A1D4 C9 ret -0334+ A1D5 15 dec d -0335+ A1D6 15 dec d -0336+ A1D7 20 0B jr nz,$+13 -0337+ A1D9 1D dec e -0338+ A1DA 28 04 jr z,$+6 -0339+ A1DC 22 39 AB ld (Reg._IR),hl -0340+ A1DF C9 ret -0341+ A1E0 22 3D AB ld (Reg._PC),hl -0342+ A1E3 C9 ret -0343+ A1E4 1D dec e -0344+ A1E5 28 1B jr z,.L211 -0345+ A1E7 01 7D 00 .Rez ld bc,Rezident.End-Rezident;длина резидента -0346+ A1EA E5 push hl ;новое начало резидента -0347+ A1EB 09 add hl,bc ;новый конечный адрес резидента -0348+ A1EC 7C ld a,h -0349+ A1ED E6 C0 and 11000000b -0350+ A1EF 57 ld d,a -0351+ A1F0 E1 pop hl -0352+ A1F1 7C ld a,h -0353+ A1F2 E6 C0 and 11000000b -0354+ A1F4 BA cp d ;резидент пересекает окно? -0355+ A1F5 28 07 jr z,.L212 -0356+ A1F7 62 ld h,d -0357+ A1F8 2E 00 ld l,0 -0358+ A1FA 2B dec hl ;последний адрес окна с резидентом -0359+ A1FB B7 or a -0360+ A1FC ED 42 sbc hl,bc -0361+ A1FE 22 20 AB .L212 ld (RezAdr),hl -0362+ A201 C9 ret -0363+ A202 22 3B AB .L211 ld (Reg._SP),hl -0364+ A205 C9 ret -0365+ A206 -0366+ A206 ;Расчет дескриптора строки в окне регистров -0367+ A206 ED 5B 2C A2 .DescCalc ld de,(.Coordinate) ;текущие координаты -0368+ A20A 21 2F A2 ld hl,.Descript+1 -0369+ A20D 42 ld b,d ;номер строки -0370+ A20E 23 inc hl ;дескриптор строки -0371+ A20F 23 inc hl -0372+ A210 10 FC djnz $-2 -0373+ A212 7E ld a,(hl) ;номер дескриптора строки -0374+ A213 87 add a,a -0375+ A214 4F ld c,a -0376+ A215 2B dec hl -0377+ A216 46 ld b,(hl) -0378+ A217 C5 push bc -0379+ A218 06 00 ld b,0 -0380+ A21A 21 4E A2 ld hl,.DTabl -0381+ A21D 09 add hl,bc -0382+ A21E 7E ld a,(hl) ;начало дескриптора -0383+ A21F 23 inc hl -0384+ A220 66 ld h,(hl) -0385+ A221 6F ld l,a -0386+ A222 C1 pop bc -0387+ A223 C9 ret -0388+ A224 -0389+ A224 02 07 0C 0F .PgDown db 2,7,12,15 -0390+ A228 0E 09 04 02 .PgUp db 14,9,4,2 -0391+ A22C -0392+ A22C 01 01 .Coordinate dw 0x0101 ;курсор (стр/кол курсора) -0393+ A22E -0394+ A22E .Descript: -0395+ A22E 0F 01 dw 0x010F ;первая/кол-во строк окна -0396+ A230 -0397+ A230 01 00 db 0x01,0 ;номер строки, номер дескриптора -0398+ A232 02 00 04 00 db 0x02,0,0x04,0 -0399+ A236 db 0x05,0,0x06,0,0x07,1 -0399+ A236 050006000701 -0400+ A23C db 0x08,2,0x0A,0,0x0B,0 -0400+ A23C 08020A000B00 -0401+ A242 db 0x0C,0,0x0D,1,0x0E,2 -0401+ A242 0C000D010E02 -0402+ A248 db 0x10,3,0x12,4,0x14,5 -0402+ A248 100312041405 -0403+ A24E -0404+ A24E .DTabl dw .D1,.D2,.D3,.D4,.D5,.D6 -0404+ A24E 5AA26DA282A28FA294A29DA2 -0405+ A25A -0406+ A25A 09 .D1 db 9 ;кол-во колонок для пар -0407+ A25B 04 db 0x04 ;N столбца колонки -0408+ A25C 05 db 5 ;ширина колонки -0409+ A25D db 0x0A,2,0x0C,2,0x0F,2,0x11,2 -0409+ A25D 0A020C020F021102 -0410+ A265 db 0x14,1,0x15,1,0x16,1,0x17,1 -0410+ A265 1401150116011701 -0411+ A26D -0412+ A26D 0A .D2 db 10 ;кол-во колонок для пары AF -0413+ A26E 04 db 0x04 ;N столбца колонки -0414+ A26F 05 db 5 ;ширина колонки -0415+ A270 db 0x0B,1,0x0C,1,0x0D,1,0x0E,1 -0415+ A270 0B010C010D010E01 -0416+ A278 db 0x0F,1,0x10,1,0x11,1,0x12,1 -0416+ A278 0F01100111011201 -0417+ A280 15 01 db 0x15,1 -0418+ A282 -0419+ A282 06 .D3 db 6 ;кол-во колонок для флагов -0420+ A283 01 db 0x01 ;N столбца колонки -0421+ A284 01 db 1 ;ширина колонки -0422+ A285 02 01 04 01 db 0x02,1,0x04,1 -0423+ A289 db 0x06,1,0x07,1,0x08,1 -0423+ A289 060107010801 -0424+ A28F -0425+ A28F 02 .D4 db 2 ;кол-во колонок для PC IR -0426+ A290 04 db 0x04 ;N столбца колонки -0427+ A291 05 db 5 ;ширина колонки -0428+ A292 0D 05 db 0x0D,5 -0429+ A294 -0430+ A294 04 .D5 db 4 ;кол-во колонок для банок -0431+ A295 02 db 0x02 ;N столбца колонки -0432+ A296 03 db 3 ;ширина колонки -0433+ A297 db 0x08,3,0x0E,3,0x14,3 -0433+ A297 08030E031403 -0434+ A29D -0435+ A29D 03 .D6 db 3 ;кол-во колонок -0436+ A29E 04 db 0x04 ;N столбца колонки -0437+ A29F 05 db 5 ;ширина колонки -0438+ A2A0 0A 04 db 0x0A,4 -0439+ A2A2 13 05 db 0x13,5 -0440+ A2A4 -0441+ A2A4 -0378 A2A4 include "kstack.asm";"D:\WORKAST\DEMON\kstack" -0001+ A2A4 ;[]=========================================================================[] -0002+ A2A4 ;[] Обработка клавиатуры в окне дампа стека [] -0003+ A2A4 ;[] v0.10 - последние изменения 18.03.2006 [] -0004+ A2A4 ;[]=========================================================================[] -0005+ A2A4 KStack: -0006+ A2A4 78 ld a,b ;состояние -0007+ A2A5 E6 F0 and 11110000b -0008+ A2A7 ; ld b,a -0009+ A2A7 28 28 jr z,.L100 -0010+ A2A9 -0011+ A2A9 ;Обработка комбинации Shift + символ -0012+ A2A9 ; and 11000000b ; -0013+ A2A9 ; or a -0014+ A2A9 ; jr z,.L10 -0015+ A2A9 ; ld a,d -0016+ A2A9 ;; cp 0x80+0x0F ;Shift+Tab -0017+ A2A9 ;; jp nz,Keyb+6 -0018+ A2A9 ;; ld a,3 ;номер окна дампа -0019+ A2A9 ;; ld (Keyb.WinScreen),a -0020+ A2A9 ; jp Keyb-3 -0021+ A2A9 -0022+ A2A9 ;Обработка комбинации Ctrl + символ -0023+ A2A9 ; ld a,b -0024+ A2A9 FE 20 cp 00100000b ; -0025+ A2AB C2 57 98 jp nz,Keyb+6 -0026+ A2AE 7A ld a,d ;позиционный код -0027+ A2AF FE AB cp 0x80+0x2B ;+ -0028+ A2B1 C2 57 98 jp nz,Keyb+6 -0029+ A2B4 2A 23 AB ld hl,(StackDump) -0030+ A2B7 ED 4B F3 A3 ld bc,(.Coordinate) -0031+ A2BB 78 ld a,b -0032+ A2BC 06 16 ld b,0x16 ;x-кордината 1 строки -0033+ A2BE 90 sub b -0034+ A2BF 07 rlca ;*2 -0035+ A2C0 06 00 ld b,0 -0036+ A2C2 4F ld c,a -0037+ A2C3 B7 or a -0038+ A2C4 ED 42 sbc hl,bc -0039+ A2C6 22 3B AB ld (Reg._SP),hl -0040+ A2C9 3E FF ld a,-1 -0041+ A2CB 32 66 90 ld (PrintStrSP.StrSp),a -0042+ A2CE C3 46 98 jp Keyb-11 -0043+ A2D1 -0044+ A2D1 ;Обработка позиционного кода -0045+ A2D1 7B .L100 ld a,e ;ASCII код -0046+ A2D2 32 9E A3 ld (.L200+1),a -0047+ A2D5 7A ld a,d ;позиционный код -0048+ A2D6 -0049+ A2D6 ED 5B F3 A3 ld de,(.Coordinate) ;текущие координаты курсора -0050+ A2DA FE 56 cp 0x56 ; -0051+ A2DC 20 0F jr nz,.L101 -0052+ A2DE 3A F7 A3 ld a,(.Descript+2) ;кол-во колонок -0053+ A2E1 BB cp e -0054+ A2E2 7B ld a,e -0055+ A2E3 20 01 jr nz,$+3 -0056+ A2E5 AF xor a -0057+ A2E6 3C inc a -0058+ A2E7 32 F3 A3 ld (.Coordinate),a ;текущая колонка -0059+ A2EA C3 4E 98 jp Keyb-3 -0060+ A2ED -0061+ A2ED FE 54 .L101 cp 0x54 ; -0062+ A2EF 20 10 jr nz,.L102 -0063+ A2F1 7B ld a,e ;текущая колонка -0064+ A2F2 FE 01 cp 1 -0065+ A2F4 20 04 jr nz,$+6 -0066+ A2F6 3A F7 A3 ld a,(.Descript+2) ;кол-во колонок -0067+ A2F9 3C inc a -0068+ A2FA 3D dec a -0069+ A2FB 32 F3 A3 ld (.Coordinate),a ;текущая колонка -0070+ A2FE C3 4E 98 jp Keyb-3 -0071+ A301 -0072+ A301 2A F5 A3 .L102 ld hl,(.Descript) -0073+ A304 FE 52 cp 0x52 ; -0074+ A306 20 1F jr nz,.L103 -0075+ A308 7A ld a,d ;текущая строка -0076+ A309 BD cp l -0077+ A30A 20 14 jr nz,.L104 -0078+ A30C 2A 23 AB ld hl,(StackDump) ;адрес 1-ой строки -0079+ A30F 2B dec hl -0080+ A310 2B dec hl -0081+ A311 22 23 AB ld (StackDump),hl -0082+ A314 21 66 90 ld hl,PrintStrSP.StrSp ;строка верш.стека -0083+ A317 3E FF ld a,-1 -0084+ A319 BE cp (hl) ;в дампе? -0085+ A31A 28 01 jr z,$+3 -0086+ A31C 35 dec (hl) -0087+ A31D C3 46 98 jp Keyb-11 -0088+ A320 3C .L104 inc a -0089+ A321 32 F4 A3 ld (.Coordinate+1),a -0090+ A324 C3 4E 98 jp Keyb-3 -0091+ A327 -0092+ A327 FE 58 .L103 cp 0x58 ; -0093+ A329 20 22 jr nz,.L105 -0094+ A32B 7A ld a,d ;текущая строка -0095+ A32C BC cp h -0096+ A32D 20 17 jr nz,.L107 -0097+ A32F 2A 23 AB ld hl,(StackDump) ;адрес 1-ой строки -0098+ A332 23 inc hl -0099+ A333 23 inc hl -0100+ A334 22 23 AB ld (StackDump),hl -0101+ A337 21 66 90 ld hl,PrintStrSP.StrSp ;строка верш.стека -0102+ A33A 7E ld a,(hl) -0103+ A33B FE 07 cp 7 ;на последней строке? -0104+ A33D 38 03 jr c,$+5 -0105+ A33F 3E FE ld a,-2 -0106+ A341 77 ld (hl),a ;верш.стека не попадает в дамп -0107+ A342 34 inc (hl) -0108+ A343 C3 46 98 jp Keyb-11 -0109+ A346 3D .L107 dec a -0110+ A347 32 F4 A3 ld (.Coordinate+1),a -0111+ A34A C3 4E 98 jp Keyb-3 -0112+ A34D -0113+ A34D FE 53 .L105 cp 0x53 ; -0114+ A34F 20 1F jr nz,.L108 -0115+ A351 7A ld a,d ;текущая строка -0116+ A352 BD cp l -0117+ A353 20 14 jr nz,.L106 -0118+ A355 2A 23 AB ld hl,(StackDump) -0119+ A358 01 0E 00 ld bc,2*7 -0120+ A35B B7 or a -0121+ A35C ED 42 sbc hl,bc -0122+ A35E 22 23 AB ld (StackDump),hl -0123+ A361 3E FF ld a,-1 -0124+ A363 32 66 90 ld (PrintStrSP.StrSp),a ;строка верш.стека -0125+ A366 C3 46 98 jp Keyb-11 -0126+ A369 7D .L106 ld a,l ;на последнюю строку -0127+ A36A 32 F4 A3 ld (.Coordinate+1),a -0128+ A36D C3 4E 98 jp Keyb-3 -0129+ A370 -0130+ A370 FE 59 .L108 cp 0x59 ; -0131+ A372 20 1D jr nz,.L110 -0132+ A374 7A ld a,d ;текущая строка -0133+ A375 BC cp h -0134+ A376 20 12 jr nz,.L109 -0135+ A378 2A 23 AB ld hl,(StackDump) -0136+ A37B 01 0E 00 ld bc,2*7 -0137+ A37E 09 add hl,bc -0138+ A37F 22 23 AB ld (StackDump),hl -0139+ A382 3E FF ld a,-1 -0140+ A384 32 66 90 ld (PrintStrSP.StrSp),a ;строка верш.стека -0141+ A387 C3 46 98 jp Keyb-11 -0142+ A38A 7C .L109 ld a,h ;на первую строку -0143+ A38B 32 F4 A3 ld (.Coordinate+1),a -0144+ A38E C3 4E 98 jp Keyb-3 -0145+ A391 -0146+ A391 FE 57 .L110 cp 0x57 ; -0147+ A393 20 08 jr nz,.L200 -0148+ A395 3E 06 ld a,6 -0149+ A397 32 66 90 ld (PrintStrSP.StrSp),a ;строка верш.стека -0150+ A39A C3 46 98 jp Keyb-11 -0151+ A39D -0152+ A39D ;.L111 cp 0x0F ; -0153+ A39D ; jr nz,.L200 -0154+ A39D ; ld a,1 ;номер окна листинга -0155+ A39D ; ld (Keyb.WinScreen),a -0156+ A39D ; jp Keyb-3 -0157+ A39D -0158+ A39D ;Обработка ASCII кодов -0159+ A39D 3E 00 .L200 ld a,0 ;ASCII код -0160+ A39F FE 0D cp 0x0D ; -0161+ A3A1 C2 57 98 jp nz,Keyb+6 -0162+ A3A4 06 00 .L201 ld b,0 ;длина строки ввода -0163+ A3A6 21 00 00 ld hl,0 ;координаты строки ввода -0164+ A3A9 CD AA 9C call InputLine ;ввод числа -0165+ A3AC DA 4E 98 jp c,Keyb-3 ;завершение ввода по -0166+ A3AF CD 30 9C call PutAdres -0167+ A3B2 DA A4 A3 jp c,.L201 ;ошибка в веденных данных -0168+ A3B5 ED 4B F3 A3 ld bc,(.Coordinate) -0169+ A3B9 78 ld a,b -0170+ A3BA 06 16 ld b,0x16 ;x-кордината 1 строки -0171+ A3BC 90 sub b -0172+ A3BD EB ex de,hl -0173+ A3BE 2A 23 AB ld hl,(StackDump) -0174+ A3C1 47 ld b,a ;номер строки 0..7 -0175+ A3C2 07 rlca ;*2 -0176+ A3C3 0D dec c -0177+ A3C4 4F ld c,a -0178+ A3C5 20 1B jr nz,.L202 ;переход - если данные, иначе алрес -0179+ A3C7 -0180+ A3C7 3A 66 90 ld a,(PrintStrSP.StrSp) ;строка верш.стека -0181+ A3CA B8 cp b -0182+ A3CB 28 0E jr z,.L203 -0183+ A3CD 06 00 ld b,0 ;не на вершине стека -0184+ A3CF EB ex de,hl ;HL - введенный адрес -0185+ A3D0 09 add hl,bc -0186+ A3D1 22 23 AB ld (StackDump),hl -0187+ A3D4 3E FF ld a,-1 -0188+ A3D6 32 66 90 ld (PrintStrSP.StrSp),a -0189+ A3D9 18 04 jr .L203+4 -0190+ A3DB ED 53 3B AB .L203 ld (Reg._SP),de ;адрес введен на вершине стека -0191+ A3DF C3 46 98 jp Keyb-11 -0192+ A3E2 -0193+ A3E2 06 00 .L202 ld b,0 ;ввод данных -0194+ A3E4 B7 or a -0195+ A3E5 ED 42 sbc hl,bc -0196+ A3E7 7A ld a,d ;запись данных в память -0197+ A3E8 CD 97 92 call Ld_hl_a -0198+ A3EB 23 inc hl -0199+ A3EC 7B ld a,e -0200+ A3ED CD 97 92 call Ld_hl_a -0201+ A3F0 C3 46 98 jp Keyb-11 -0202+ A3F3 -0203+ A3F3 -0204+ A3F3 01 16 .Coordinate dw 0x1601 ;курсор (стр/кол курсора) -0205+ A3F5 .Descript: -0206+ A3F5 1D 16 dw 0x161D ;первая/последняя строка окна -0207+ A3F7 02 db 2 ;кол-во колонок -0208+ A3F8 -0209+ A3F8 01 db 0x01 ;N столбца колонки -0210+ A3F9 05 db 5 ;ширина колонки -0211+ A3FA 07 05 db 0x07,5 -0212+ A3FC -0213+ A3FC -0379 A3FC include "kdump.asm";"D:\WORKAST\DEMON\kdump" -0001+ A3FC ;[]=========================================================================[] -0002+ A3FC ;[] Обработка клавиатуры в окне дампа [] -0003+ A3FC ;[] v0.10 - последние изменения 31.03.2006 [] -0004+ A3FC ;[]=========================================================================[] -0005+ A3FC KDump: -0006+ A3FC 78 ld a,b ;состояние -0007+ A3FD E6 F0 and 11110000b -0008+ A3FF 28 30 jr z,.L100 -0009+ A401 -0010+ A401 ;Обработка комбинации Ctrl + символ -0011+ A401 FE 20 .L10 cp 00100000b ; -0012+ A403 C2 31 A4 jp nz,.L100 -0013+ A406 7A ld a,d ;позиционный код -0014+ A407 -0015+ A407 FE D1 cp 0x80+0x51 ;++ -0047+ A43C 20 0F jr nz,.L101 -0048+ A43E 3A A4 A5 ld a,(.Descript+2) ;кол-во колонок -0049+ A441 BB cp e -0050+ A442 7B ld a,e -0051+ A443 20 01 jr nz,$+3 -0052+ A445 AF xor a -0053+ A446 3C inc a -0054+ A447 32 A0 A5 ld (.Coordinate),a ;текущая колонка -0055+ A44A C3 4E 98 jp Keyb-3 -0056+ A44D -0057+ A44D FE 54 .L101 cp 0x54 ; -0058+ A44F 20 10 jr nz,.L102 -0059+ A451 7B ld a,e ;текущая колонка -0060+ A452 FE 01 cp 1 -0061+ A454 20 04 jr nz,$+6 -0062+ A456 3A A4 A5 ld a,(.Descript+2) ;кол-во колонок -0063+ A459 3C inc a -0064+ A45A 3D dec a -0065+ A45B 32 A0 A5 ld (.Coordinate),a ;текущая колонка -0066+ A45E C3 4E 98 jp Keyb-3 -0067+ A461 -0068+ A461 2A A2 A5 .L102 ld hl,(.Descript) -0069+ A464 FE 52 cp 0x52 ; -0070+ A466 20 18 jr nz,.L103 -0071+ A468 7A ld a,d ;текущая строка -0072+ A469 BD cp l -0073+ A46A 20 0D jr nz,.L104 -0074+ A46C 2A 43 AB ld hl,(Dump1) -0075+ A46F 01 10 00 ld bc,16 -0076+ A472 09 add hl,bc -0077+ A473 22 43 AB ld (Dump1),hl -0078+ A476 C3 46 98 jp Keyb-11 -0079+ A479 3C .L104 inc a -0080+ A47A 32 A1 A5 ld (.Coordinate+1),a -0081+ A47D C3 4E 98 jp Keyb-3 -0082+ A480 -0083+ A480 FE 58 .L103 cp 0x58 ; -0084+ A482 20 1A jr nz,.L105 -0085+ A484 7A ld a,d ;текущая строка -0086+ A485 BC cp h -0087+ A486 20 0F jr nz,.L107 -0088+ A488 2A 43 AB ld hl,(Dump1) -0089+ A48B 01 10 00 ld bc,16 -0090+ A48E B7 or a -0091+ A48F ED 42 sbc hl,bc -0092+ A491 22 43 AB ld (Dump1),hl -0093+ A494 C3 46 98 jp Keyb-11 -0094+ A497 3D .L107 dec a -0095+ A498 32 A1 A5 ld (.Coordinate+1),a -0096+ A49B C3 4E 98 jp Keyb-3 -0097+ A49E -0098+ A49E FE 53 .L105 cp 0x53 ; -0099+ A4A0 20 18 jr nz,.L108 -0100+ A4A2 7A ld a,d ;текущая строка -0101+ A4A3 BD cp l -0102+ A4A4 20 0D jr nz,.L106 -0103+ A4A6 2A 43 AB ld hl,(Dump1) -0104+ A4A9 01 70 00 ld bc,16*7 -0105+ A4AC 09 add hl,bc -0106+ A4AD 22 43 AB ld (Dump1),hl -0107+ A4B0 C3 46 98 jp Keyb-11 -0108+ A4B3 7D .L106 ld a,l ;на последнюю строку -0109+ A4B4 32 A1 A5 ld (.Coordinate+1),a -0110+ A4B7 C3 4E 98 jp Keyb-3 -0111+ A4BA -0112+ A4BA FE 59 .L108 cp 0x59 ; -0113+ A4BC 20 1C jr nz,.L110 -0114+ A4BE 7A ld a,d ;текущая строка -0115+ A4BF BC cp h -0116+ A4C0 20 11 jr nz,.L109 -0117+ A4C2 2A 43 AB ld hl,(Dump1) -0118+ A4C5 01 70 00 ld bc,16*7 -0119+ A4C8 B7 or a -0120+ A4C9 ED 42 sbc hl,bc -0121+ A4CB 22 43 AB ld (Dump1),hl -0122+ A4CE C3 46 98 jp Keyb-11 -0123+ A4D1 20 00 jr nz,.L109 -0124+ A4D3 7C .L109 ld a,h ;на первую строку -0125+ A4D4 32 A1 A5 ld (.Coordinate+1),a -0126+ A4D7 C3 4E 98 jp Keyb-3 -0127+ A4DA -0128+ A4DA FE 57 .L110 cp 0x57 ; -0129+ A4DC 20 08 jr nz,.L111 -0130+ A4DE 3E 01 ld a,1 -0131+ A4E0 32 A0 A5 ld (.Coordinate),a ;первая колонка -0132+ A4E3 C3 4E 98 jp Keyb-3 -0133+ A4E6 -0134+ A4E6 FE 51 .L111 cp 0x51 ; -0135+ A4E8 20 09 jr nz,.L200 -0136+ A4EA 3A A4 A5 ld a,(.Descript+2) -0137+ A4ED 32 A0 A5 ld (.Coordinate),a ;первая колонка -0138+ A4F0 C3 4E 98 jp Keyb-3 -0139+ A4F3 -0140+ A4F3 ;Обработка ASCII кодов -0141+ A4F3 3E 00 .L200 ld a,0 ;ASCII код -0142+ A4F5 FE 0D cp 0x0D ; -0143+ A4F7 C2 57 98 jp nz,Keyb+6 -0144+ A4FA 06 00 .L201 ld b,0 ;длина строки ввода -0145+ A4FC 21 00 00 ld hl,0 ;координаты строки ввода -0146+ A4FF -0147+ A4FF 78 ld a,b -0148+ A500 3D dec a -0149+ A501 28 25 jr z,.L202 -0150+ A503 3D dec a -0151+ A504 28 37 jr z,.L203 -0152+ A506 -0153+ A506 CD AA 9C call InputLine ;ввод адреса -0154+ A509 DA 4E 98 jp c,Keyb-3 ;завершение ввода по -0155+ A50C CD 30 9C call PutAdres -0156+ A50F DA FA A4 jp c,.L201 ;ошибка в веденных данных -0157+ A512 11 10 00 ld de,16 ;кол-во байт в строке -0158+ A515 3A A1 A5 ld a,(.Coordinate+1) ;номер строки -0159+ A518 D6 16 sub 0x16 ;координата первой строки -0160+ A51A 28 06 jr z,$+8 -0161+ A51C 47 ld b,a -0162+ A51D B7 or a -0163+ A51E ED 52 sbc hl,de -0164+ A520 10 FB djnz $-3 -0165+ A522 22 43 AB ld (Dump1),hl -0166+ A525 C3 46 98 jp Keyb-11 -0167+ A528 -0168+ A528 CD A3 9C .L202 call InputLineEd ;ввод символа -0169+ A52B DA 4E 98 jp c,Keyb-3 ;завершение ввода по -0170+ A52E CD 8D A5 call .L299 -0171+ A531 79 ld a,c -0172+ A532 D6 12 sub 18 ;первая колонка в поле данных -0173+ A534 4F ld c,a -0174+ A535 3A B8 9E ld a,(InputLine.Buffer) -0175+ A538 11 22 12 ld de,256*18+34 ;1-я и последняя+1 колонки -0176+ A53B 18 19 jr .L204 -0177+ A53D -0178+ A53D CD A3 9C .L203 call InputLineEd ;ввод кода символа -0179+ A540 DA 4E 98 jp c,Keyb-3 ;завершение ввода по -0180+ A543 CD F1 9B call PutCode -0181+ A546 DA FA A4 jp c,.L201 ;ошибка в веденных данных -0182+ A549 CD 8D A5 call .L299 -0183+ A54C 79 ld a,c -0184+ A54D D6 02 sub 2 ;первая колонка в поле данных -0185+ A54F 4F ld c,a -0186+ A550 3A 2C 9C ld a,(PutCode.Buffer) ;записываемый байт -0187+ A553 11 12 02 ld de,256*2+18 ;1-я и последняя+1 колонки -0188+ A556 09 .L204 add hl,bc -0189+ A557 CD 97 92 call Ld_hl_a -0190+ A55A 3A B2 9E ld a,(InputLine.EntEnd) ;ввод закончен ENTER -0191+ A55D B7 or a -0192+ A55E C2 46 98 jp nz,Keyb-11 ;да -0193+ A561 21 A0 A5 ld hl,.Coordinate ;текущие координаты курсора -0194+ A564 34 inc (hl) -0195+ A565 7B ld a,e ;первая колонка данных -0196+ A566 BE cp (hl) -0197+ A567 20 15 jr nz,.L205 -0198+ A569 7A ld a,d -0199+ A56A 77 ld (hl),a ;в начало строки кода -0200+ A56B 23 inc hl -0201+ A56C 3E 1D ld a,0x1D ;последняя строка дампа -0202+ A56E BE cp (hl) -0203+ A56F 20 0C jr nz,.L205-1 -0204+ A571 2A 43 AB ld hl,(Dump1) ;сдвинуть дамп -0205+ A574 01 10 00 ld bc,16 -0206+ A577 09 add hl,bc -0207+ A578 22 43 AB ld (Dump1),hl -0208+ A57B 18 01 jr .L205 -0209+ A57D 34 inc (hl) -0210+ A57E CD 35 92 .L205 call CursorRes ;выкл курсор -0211+ A581 CD 3C 88 call Refresh ;обновление экрана -0212+ A584 CD B3 99 call Cursor ;вкл курсор -0213+ A587 CD D3 91 call CursorSet -0214+ A58A C3 FA A4 jp .L201 -0215+ A58D -0216+ A58D 11 10 00 .L299 ld de,16 ;кол-во байт в строке -0217+ A590 2A 43 AB ld hl,(Dump1) ;адрес в первой строке -0218+ A593 ED 4B A0 A5 ld bc,(.Coordinate) -0219+ A597 78 ld a,b -0220+ A598 D6 16 sub 0x16 ;координата первой строки -0221+ A59A 47 ld b,a -0222+ A59B C8 ret z -0223+ A59C 19 add hl,de -0224+ A59D 10 FD djnz $-1 -0225+ A59F C9 ret -0226+ A5A0 -0227+ A5A0 01 16 .Coordinate dw 0x1601 ;курсор (стр/кол курсора) -0228+ A5A2 .Descript: -0229+ A5A2 1D 16 dw 0x161D ;первая/последняя строка окна -0230+ A5A4 21 db 33 ;кол-во колонок -0231+ A5A5 -0232+ A5A5 0E db 0x0E ;N столбца колонки -0233+ A5A6 05 db 5 ;ширина колонки -0234+ A5A7 15 02 17 02 db 0x15,2,0x17,2 -0235+ A5AB 1A 02 1C 02 db 0x1A,2,0x1C,2 -0236+ A5AF 1F 02 21 02 db 0x1F,2,0x21,2 -0237+ A5B3 24 02 26 02 db 0x24,2,0x26,2 -0238+ A5B7 29 02 2B 02 db 0x29,2,0x2B,2 -0239+ A5BB 2E 02 30 02 db 0x2E,2,0x30,2 -0240+ A5BF 33 02 35 02 db 0x33,2,0x35,2 -0241+ A5C3 38 02 3A 02 db 0x38,2,0x3A,2 -0242+ A5C7 db 0x3E,1,0x3F,1,0x40,1,0x41,1 -0242+ A5C7 3E013F0140014101 -0243+ A5CF db 0x42,1,0x43,1,0x44,1,0x45,1 -0243+ A5CF 4201430144014501 -0244+ A5D7 db 0x46,1,0x47,1,0x48,1,0x49,1 -0244+ A5D7 4601470148014901 -0245+ A5DF db 0x4A,1,0x4B,1,0x4C,1,0x4D,1 -0245+ A5DF 4A014B014C014D01 -0246+ A5E7 -0247+ A5E7 -0380 A5E7 include "rez.asm";"D:\WORKAST\DEMON\rez" -0001+ A5E7 ;[]=========================================================================[] -0002+ A5E7 ;[] Резидент отладчика [] -0003+ A5E7 ;[] v0.03 - последние изменения 24.02.2006 [] -0004+ A5E7 ;[] Принцип работы (два варианта): [] -0005+ A5E7 ;[] 1. Резидент расположен не во втором окне памяти (0x8000...0xBFFF) [] -0006+ A5E7 ;[] Из отладчика готовится резидент (настраиваются все адреса) и копируется [] -0007+ A5E7 ;[] по адресу расположения, управление из отладчика передается на метку [] -0008+ A5E7 ;[] Rezident.Start1, после чего происходит востановление банки памяти, рас- [] -0009+ A5E7 ;[] положенной под отладчиком и выполнение отлаживаемой команды. Возврат [] -0010+ A5E7 ;[] в резидент осуществляется на метку Rezident.RetIn1 и далее после вос- [] -0011+ A5E7 ;[] тановления банки с отладчиком возврат в отладчик. [] -0012+ A5E7 ;[] 2. Резидент расположен во втором окне памяти (0x8000...0xBFFF) [] -0013+ A5E7 ;[] Поскольку в этом окне работает сам отладчик, то переход в резидент и [] -0014+ A5E7 ;[] возврат в отладчик после трассировки команды выполняется при помощи [] -0015+ A5E7 ;[] вспомогательной процедуры длиной 7 байт расположеной по адресу [] -0016+ A5E7 ;[] AdrTmpBuf. После коррекции всех адресов в отладчике и сохранении акку- [] -0017+ A5E7 ;[] мулятора отлаживаемой программы по адресу Rezident+1 и пары HL по адре- [] -0018+ A5E7 ;[] ce Rezident+2 управление передается по адресу AdrTmpBuf, где расположен [] -0019+ A5E7 ;[] следующий код отключающий банку с отладчиком: [] -0020+ A5E7 ;[] ld a,НомерБанкиПодОтладчиком [] -0021+ A5E7 ;[] out (НомерПорта2Окна),a [] -0022+ A5E7 ;[] jp Rezident.Start [] -0023+ A5E7 ;[] Далее резидент востанавливает 7 байт запорченых вышепреведенной проце- [] -0024+ A5E7 ;[] дурой, а также пару HL и аккумулятор и переходит к трассировке. Возврат [] -0025+ A5E7 ;[] происходит на метку Rezident.RetIn, где после сохранения аккумулятора и [] -0026+ A5E7 ;[] пары HL сохраняется 7 байт памяти из адреса AdrTmpBuf и туда прописыва- [] -0027+ A5E7 ;[] ется код востановления банки с отладчиком: [] -0028+ A5E7 ;[] ld a,НомерБанкиСОтладчиком [] -0029+ A5E7 ;[] out (НомерПорта2Окна),a [] -0030+ A5E7 ;[] jp ВОтладчик [] -0031+ A5E7 ;[] После возврата в отладчик востанавливается память запорченая резидентом [] -0032+ A5E7 ;[] и временной процедурой [] -0033+ A5E7 ;[]=========================================================================[] -0034+ A5E7 AdrTmpBuf equ 0xFF00 -0035+ A5E7 Rezident: -0036+ A5E7 00 ds 11 -0037+ A5F2 -0038+ A5F2 21 00 00 .Start ld hl,0 ;вост. памяти запорченной при -0039+ A5F5 22 00 FF ld (AdrTmpBuf),hl ;размещении резидента -0040+ A5F8 21 00 00 ld hl,0 ;во 2-м окне -0041+ A5FB 22 02 FF ld (AdrTmpBuf+2),hl -0042+ A5FE 21 00 00 ld hl,0 -0043+ A601 22 04 FF ld (AdrTmpBuf+4),hl -0044+ A604 3E 00 ld a,0 -0045+ A606 32 06 FF ld (AdrTmpBuf+6),a -0046+ A609 2A E9 A5 .K2 ld hl,(Rezident+2) ;востановили HL -0047+ A60C 18 04 jr .K3 -0048+ A60E ;...востановить банку во 2-м окне -0049+ A60E 3E FF .Start1 ld a,0xFF ;банка под demon'ом -0050+ A610 D3 C2 out (EmmWin.P2),a -0051+ A612 3A E8 A5 .K3 ld a,(Rezident+1) ;востановим аккумулятор -0052+ A615 -0053+ A615 C3 00 00 .Step jp 0 ;переход на выполнение -0054+ A618 -0055+ A618 32 E8 A5 .RetIn ld (Rezident+1),a ;сохраним аккумулятор -0056+ A61B 22 E9 A5 .K4 ld (Rezident+2),hl ;сохраним HL -0057+ A61E 2A 00 FF ld hl,(AdrTmpBuf) ;сохранение памяти -0058+ A621 22 EB A5 .K5 ld (Rezident+4),hl -0059+ A624 2A 02 FF ld hl,(AdrTmpBuf+2) -0060+ A627 22 ED A5 ld (Rezident+6),hl -0061+ A62A 2A 04 FF ld hl,(AdrTmpBuf+4) -0062+ A62D 22 EF A5 ld (Rezident+8),hl -0063+ A630 3A 06 FF ld a,(AdrTmpBuf+6) -0064+ A633 32 F1 A5 ld (Rezident+10),a -0065+ A636 21 3E FF .BankD1 ld hl,0xFF3E ;ld a,0xFF - N банки с отладч -0066+ A639 22 00 FF ld (AdrTmpBuf),hl -0067+ A63C 21 D3 C2 ld hl,EmmWin.P2*256+0xD3 ;out (EmmWin.P2),a -0068+ A63F 22 02 FF ld (AdrTmpBuf+2),hl -0069+ A642 21 C3 00 .Return1 ld hl,0xC3 ;jp в отладчик -0070+ A645 22 04 FF ld (AdrTmpBuf+4),hl -0071+ A648 3E 00 ld a,0 -0072+ A64A 32 06 FF ld (AdrTmpBuf+6),a -0073+ A64D DB C2 in a,(EmmWin.P2) ;номер банки под demon'ом -0074+ A64F 32 E7 A5 .K6 ld (Rezident),a ;сохранили -0075+ A652 C3 00 FF jp AdrTmpBuf -0076+ A655 -0077+ A655 32 E8 A5 .RetIn1 ld (Rezident+1),a ;сохраним аккумулятор -0078+ A658 ;...сохранить банку из 2-го окна -0079+ A658 DB C2 in a,(EmmWin.P2) ;номер банки под demon'ом -0080+ A65A 32 E7 A5 .K1 ld (Rezident),a ;сохранили -0081+ A65D 3E FF .BankD ld a,0xFF ;банка с demon'ом -0082+ A65F D3 C2 out (EmmWin.P2),a -0083+ A661 -0084+ A661 C3 00 00 .Return jp 0 -0085+ A664 -0086+ A664 .End -0087+ A664 -0088+ A664 -0381 A664 include "step.asm";"D:\WORKAST\DEMON\step" -0001+ A664 ;[]=========================================================================[] -0002+ A664 ;[] Отладка команд программы [] -0003+ A664 ;[] v0.03 - последние изменения 10.03.2006 [] -0004+ A664 ;[] v0.10 - последние изменения 18.03.2006 [] -0005+ A664 ;[]=========================================================================[] -0006+ A664 Step: -0007+ A664 F3 di -0008+ A665 3A 41 AB ld a,(WinPage+2) ;банка под demon'ом -0009+ A668 32 0F A6 ld (Rezident.Start1+1),a ;в резидент ее -0010+ A66B 32 61 A9 ld (.BankP+1),a -0011+ A66E 3A 1E AB ld a,(BankDebug) ;банка с demon'ом -0012+ A671 32 5E A6 ld (Rezident.BankD+1),a ;в резидент ее -0013+ A674 32 38 A6 ld (Rezident.BankD1+2),a -0014+ A677 21 F8 A8 ld hl,Step.Run+3 ;точка возврата в отладчик -0015+ A67A 22 62 A6 ld (Rezident.Return+1),hl ;прописываем в резиденте -0016+ A67D 7D ld a,l -0017+ A67E 32 44 A6 ld (Rezident.Return1+2),a -0018+ A681 7C ld a,h -0019+ A682 32 49 A6 ld (Rezident.Return1+7),a -0020+ A685 2A 3D AB ld hl,(Reg._PC) -0021+ A688 22 16 A6 ld (Rezident.Step+1),hl ;адрес отлаживаемой команды -0022+ A68B -0023+ A68B 3A 2F AB ld a,(Reg._AF) ;флаг -0024+ A68E 47 ld b,a -0025+ A68F CD 6C 92 call Ld_a_hl -0026+ A692 ; ld a,(hl) ;код команды -0027+ A692 -0028+ A692 4F ld c,a -0029+ A693 E6 CF and 11001111b -0030+ A695 FE C5 cp 11000101b ;PUSH -0031+ A697 CC 67 A9 call z,.SpdInc -0032+ A69A FE C1 cp 11000001b ;POP -0033+ A69C CC 71 A9 call z,.SpdDec -0034+ A69F -0035+ A69F 79 ld a,c -0036+ A6A0 FE CD cp 0xCD ;CALL -0037+ A6A2 20 0A jr nz,.L7 -0038+ A6A4 3A 7B A9 ld a,(.Flag) -0039+ A6A7 3C inc a -0040+ A6A8 C2 FF A7 jp nz,.L2 ;без захода в подпрограмму -0041+ A6AB C3 EF A7 jp .L8 -0042+ A6AE FE C9 .L7 cp 0xC9 ;RET -0043+ A6B0 CA E2 A7 jp z,.L9 -0044+ A6B3 FE C3 cp 0xC3 ;JP -0045+ A6B5 CA F2 A7 jp z,.L8+3 -0046+ A6B8 FE 18 cp 0x18 ;JR -0047+ A6BA CA 48 A7 jp z,.L6 -0048+ A6BD FE 10 cp 0x10 ;DJNZ -0049+ A6BF 20 10 jr nz,.L18 -0050+ A6C1 3A 7B A9 ld a,(.Flag) -0051+ A6C4 3C inc a -0052+ A6C5 C2 FF A7 jp nz,.L2 ;без отладки цикла -0053+ A6C8 3A 2E AB ld a,(Reg._BC+1) -0054+ A6CB 3D dec a -0055+ A6CC 20 7A jr nz,.L6 -0056+ A6CE C3 FF A7 jp .L2 -0057+ A6D1 23 .L18 inc hl ;следующий байт соманды -0058+ A6D2 08 exa -0059+ A6D3 CD 6C 92 call Ld_a_hl -0060+ A6D6 4F ld c,a -0061+ A6D7 08 exa -0062+ A6D8 ; ld c,(hl) -0063+ A6D8 2B dec hl -0064+ A6D9 FE ED cp 0xED ;префикс для RETI, RETN -0065+ A6DB 20 0B jr nz,.L10 -0066+ A6DD 79 ld a,c -0067+ A6DE FE 4D cp 0x4D ;RETI -0068+ A6E0 CA E2 A7 jp z,.L9 -0069+ A6E3 FE 45 cp 0x45 ;RETN -0070+ A6E5 CA E2 A7 jp z,.L9 -0071+ A6E8 FE DD .L10 cp 0xDD ;префикс для IX -0072+ A6EA 20 11 jr nz,.L25 -0073+ A6EC 79 ld a,c -0074+ A6ED FE E5 cp 0xE5 ;PUSH IX -0075+ A6EF CC 67 A9 call z,.SpdInc -0076+ A6F2 FE E1 cp 0xE1 ;POP IX -0077+ A6F4 CC 71 A9 call z,.SpdDec -0078+ A6F7 ED 5B 25 AB ld de,(Reg._IX) -0079+ A6FB 18 19 jr .L24 -0080+ A6FD FE FD .L25 cp 0xFD ;префикс для IY -0081+ A6FF 20 11 jr nz,.L24-4 -0082+ A701 79 ld a,c -0083+ A702 FE E5 cp 0xE5 ;PUSH IY -0084+ A704 CC 67 A9 call z,.SpdInc -0085+ A707 FE E1 cp 0xE1 ;POP IY -0086+ A709 CC 71 A9 call z,.SpdDec -0087+ A70C ED 5B 27 AB ld de,(Reg._IY) -0088+ A710 18 04 jr .L24 -0089+ A712 ED 5B 29 AB ld de,(Reg._HL) -0090+ A716 FE E9 .L24 cp 0xE9 ;JP (HL/IX/IY) -0091+ A718 20 04 jr nz,.L23 -0092+ A71A EB ex de,hl -0093+ A71B C3 02 A8 jp .L2+3 -0094+ A71E FE 38 .L23 cp 0x38 ;JR C, -0095+ A720 20 07 jr nz,.L19 -0096+ A722 CB 40 bit 0,b ;флаг C -0097+ A724 CA FF A7 jp z,.L2 ;нет перехода -0098+ A727 18 1F jr .L6 ;переход -0099+ A729 FE 30 .L19 cp 0x30 ;JR NC, -0100+ A72B 20 07 jr nz,.L20 -0101+ A72D CB 40 bit 0,b ;флаг C -0102+ A72F C2 FF A7 jp nz,.L2 ;нет перехода -0103+ A732 18 14 jr .L6 ;переход -0104+ A734 FE 28 .L20 cp 0x28 ;JR Z, -0105+ A736 20 07 jr nz,.L21 -0106+ A738 CB 70 bit 6,b ;флаг Z -0107+ A73A CA FF A7 jp z,.L2 ;нет перехода -0108+ A73D 18 09 jr .L6 ;переход -0109+ A73F FE 20 .L21 cp 0x20 ;JR NZ, -0110+ A741 20 1E jr nz,.L22 -0111+ A743 CB 70 bit 6,b ;флаг Z -0112+ A745 C2 FF A7 jp nz,.L2 ;нет перехода -0113+ A748 -0114+ A748 23 .L6 inc hl -0115+ A749 CD 6C 92 call Ld_a_hl -0116+ A74C ; ld a,(hl) ;смещение -0117+ A74C 23 inc hl -0118+ A74D 06 00 ld b,0 -0119+ A74F 4F ld c,a -0120+ A750 CB 7F bit 7,a ;знак числа -0121+ A752 28 09 jr z,$+11 -0122+ A754 ED 44 neg -0123+ A756 B7 or a ;сброс флага C -0124+ A757 4F ld c,a -0125+ A758 ED 42 sbc hl,bc ;отрицательное смещение -0126+ A75A C3 02 A8 jp .L2+3 -0127+ A75D 09 add hl,bc ;положительное смещение -0128+ A75E C3 02 A8 jp .L2+3 -0129+ A761 -0130+ A761 E6 C7 .L22 and 11000111b -0131+ A763 FE C7 cp 11000111b ;RST x -0132+ A765 20 15 jr nz,.L27 -0133+ A767 3A 7B A9 ld a,(.Flag) -0134+ A76A 3C inc a -0135+ A76B C2 FF A7 jp nz,.L2 ;без захода в подпрограмму -0136+ A76E CD 67 A9 call .SpdInc -0137+ A771 CD 6C 92 call Ld_a_hl -0138+ A774 ; ld a,(hl) ;байт комнды -0139+ A774 E6 38 and 00111000b ;адрес перехода -0140+ A776 26 00 ld h,0 -0141+ A778 6F ld l,a -0142+ A779 C3 02 A8 jp .L2+3 -0143+ A77C FE C2 .L27 cp 11000010b ;JP flag -0144+ A77E 28 0E jr z,.L26 -0145+ A780 FE C0 cp 11000000b ;RET flag -0146+ A782 28 0A jr z,.L26 -0147+ A784 FE C4 cp 11000100b ;CALL flag -0148+ A786 20 77 jr nz,.L2 -0149+ A788 3A 7B A9 ld a,(.Flag) -0150+ A78B 3C inc a -0151+ A78C 20 71 jr nz,.L2 ;без захода в подпрограмму -0152+ A78E CD 6C 92 .L26 call Ld_a_hl -0153+ A791 ; ld a,(hl) ;код команды -0154+ A791 E6 38 and 00111000b ;флаги -0155+ A793 28 1E jr z,.L11 ;JP/CALL/RET NZ, -0156+ A795 FE 08 cp 00001000b -0157+ A797 28 20 jr z,.L12 ;JP/CALL/RET Z, -0158+ A799 FE 10 cp 00010000b -0159+ A79B 28 22 jr z,.L13 ;JP/CALL/RET NC, -0160+ A79D FE 18 cp 00011000b -0161+ A79F 28 24 jr z,.L14 ;JP/CALL/RET C, -0162+ A7A1 FE 20 cp 00100000b -0163+ A7A3 28 26 jr z,.L15 ;JP/CALL/RET PO, -0164+ A7A5 FE 28 cp 00101000b -0165+ A7A7 28 28 jr z,.L16 ;JP/CALL/RET PE, -0166+ A7A9 FE 30 cp 00110000b -0167+ A7AB 28 2A jr z,.L17 ;JP/CALL/RET P, -0168+ A7AD CB 78 bit 7,b ;JP/CALL/RET M, флаг S -0169+ A7AF 28 4E jr z,.L2 ;нет перехода -0170+ A7B1 18 28 jr .L5 ;переход -0171+ A7B3 CB 70 .L11 bit 6,b ;флаг Z -0172+ A7B5 20 48 jr nz,.L2 ;нет перехода -0173+ A7B7 18 22 jr .L5 ;переход -0174+ A7B9 CB 70 .L12 bit 6,b ;флаг Z -0175+ A7BB 28 42 jr z,.L2 ;нет перехода -0176+ A7BD 18 1C jr .L5 ;переход -0177+ A7BF CB 40 .L13 bit 0,b ;флаг C -0178+ A7C1 20 3C jr nz,.L2 ;нет перехода -0179+ A7C3 18 16 jr .L5 ;переход -0180+ A7C5 CB 40 .L14 bit 0,b ;флаг C -0181+ A7C7 28 36 jr z,.L2 ;нет перехода -0182+ A7C9 18 10 jr .L5 ;переход -0183+ A7CB CB 50 .L15 bit 2,b ;флаг P/V -0184+ A7CD 20 30 jr nz,.L2 ;нет перехода -0185+ A7CF 18 0A jr .L5 ;переход -0186+ A7D1 CB 50 .L16 bit 2,b ;флаг P/V -0187+ A7D3 28 2A jr z,.L2 ;нет перехода -0188+ A7D5 18 04 jr .L5 ;переход -0189+ A7D7 CB 78 .L17 bit 7,b ;флаг S -0190+ A7D9 20 24 jr nz,.L2 ;нет перехода -0191+ A7DB -0192+ A7DB CD 6C 92 .L5 call Ld_a_hl -0193+ A7DE ; ld a,(hl) ;код команды -0194+ A7DE E6 07 and 00000111b ;отследить RET'ы -0195+ A7E0 20 09 jr nz,.L8-4 -0196+ A7E2 CD 71 A9 .L9 call .SpdDec -0197+ A7E5 2A 3B AB ld hl,(Reg._SP) ;стек -0198+ A7E8 2B dec hl -0199+ A7E9 18 07 jr .L8+3 -0200+ A7EB FE 02 cp 00000010b ;отследить JP -0201+ A7ED 28 03 jr z,.L8+3 -0202+ A7EF CD 67 A9 .L8 call .SpdInc -0203+ A7F2 23 inc hl -0204+ A7F3 CD 6C 92 call Ld_a_hl -0205+ A7F6 47 ld b,a -0206+ A7F7 ; ld a,(hl) -0207+ A7F7 23 inc hl -0208+ A7F8 CD 6C 92 call Ld_a_hl -0209+ A7FB ; ld h,(hl) -0210+ A7FB 67 ld h,a -0211+ A7FC 68 ld l,b -0212+ A7FD 18 03 jr .L2+3 -0213+ A7FF CD 42 8A .L2 call List ;следующая команда -0214+ A802 22 3D AB ld (Reg._PC),hl ;новый PC -0215+ A805 E5 push hl -0216+ A806 E5 push hl -0217+ A807 3A C3 9B ld a,(KList.Descript) ;количество строк листинга -0218+ A80A CD D1 9B call AdrListTabl ;нижний адрес листинга -0219+ A80D ED 5B 55 AB ld de,(ListAdr) ;верхний адрес листинга -0220+ A811 C1 pop bc ;новый PC -0221+ A812 CD C4 92 call AdrArea -0222+ A815 30 04 jr nc,.L1+4 -0223+ A817 -0224+ A817 ED 43 55 AB .L1 ld (ListAdr),bc ;новая страница листинга -0225+ A81B E1 pop hl -0226+ A81C -0227+ A81C CD 6C 92 call Ld_a_hl ;следующие за командой байты -0228+ A81F 4F ld c,a -0229+ A820 23 inc hl -0230+ A821 CD 6C 92 call Ld_a_hl -0231+ A824 47 ld b,a -0232+ A825 23 inc hl -0233+ A826 CD 6C 92 call Ld_a_hl -0234+ A829 C5 push bc -0235+ A82A F5 push af -0236+ A82B E5 push hl -0237+ A82C -0238+ A82C E5 push hl -0239+ A82D 2A 20 AB ld hl,(RezAdr) ;адрес посадки резидента -0240+ A830 7C ld a,h -0241+ A831 E6 C0 and 11000000b -0242+ A833 FE 80 cp 10000000b ;окно посадки резидента -0243+ A835 3E FF ld a,0xFF ;FF - резидент во 2-м окне -0244+ A837 20 05 jr nz,.L30 -0245+ A839 11 31 00 ld de,Rezident.RetIn-Rezident -0246+ A83C 18 04 jr .L30+4 -0247+ A83E 11 6E 00 .L30 ld de,Rezident.RetIn1-Rezident -0248+ A841 3C inc a ;0 - резидент не во 2-м окне -0249+ A842 32 7C A9 ld (.WRez),a -0250+ A845 19 add hl,de ;адрес возврата в резидент -0251+ A846 EB ex de,hl -0252+ A847 E1 pop hl -0253+ A848 7A ld a,d ;прописываем после -0254+ A849 CD 97 92 call Ld_hl_a ;отлаживаемой команды -0255+ A84C 2B dec hl -0256+ A84D 7B ld a,e -0257+ A84E CD 97 92 call Ld_hl_a -0258+ A851 2B dec hl -0259+ A852 3E C3 ld a,0xC3 ;JP -0260+ A854 CD 97 92 call Ld_hl_a -0261+ A857 -0262+ A857 2A 20 AB ld hl,(RezAdr) ;адрес посадки -0263+ A85A E5 push hl ;коррекция адресов кода резидента -0264+ A85B 22 5B A6 ld (Rezident.K1+1),hl ;номер банки под отладчиком -0265+ A85E 22 50 A6 ld (Rezident.K6+1),hl -0266+ A861 23 inc hl -0267+ A862 22 13 A6 ld (Rezident.K3+1),hl ;аккумулятор прграммы -0268+ A865 22 19 A6 ld (Rezident.RetIn+1),hl -0269+ A868 22 56 A6 ld (Rezident.RetIn1+1),hl -0270+ A86B 23 inc hl -0271+ A86C 22 0A A6 ld (Rezident.K2+1),hl ;пара HL программы -0272+ A86F 22 1C A6 ld (Rezident.K4+1),hl -0273+ A872 23 inc hl -0274+ A873 23 inc hl -0275+ A874 22 22 A6 ld (Rezident.K5+1),hl ;1 и 2 байты буфера -0276+ A877 23 inc hl -0277+ A878 23 inc hl -0278+ A879 22 28 A6 ld (Rezident.K5+7),hl ;3 и 4 байты буфера -0279+ A87C 23 inc hl -0280+ A87D 23 inc hl -0281+ A87E 22 2E A6 ld (Rezident.K5+13),hl ;5 и 6 байты буфера -0282+ A881 23 inc hl -0283+ A882 23 inc hl -0284+ A883 22 34 A6 ld (Rezident.K5+19),hl ;7 байт буфера -0285+ A886 -0286+ A886 3A 7C A9 ld a,(.WRez) ;флаг посадки резидента -0287+ A889 B7 or a -0288+ A88A 20 09 jr nz,.L31 -0289+ A88C 11 27 00 ld de,Rezident.Start1-Rezident -0290+ A88F 2A 20 AB ld hl,(RezAdr) ;адрес посадки -0291+ A892 19 add hl,de ;старт резидента не во 2-м окне -0292+ A893 18 28 jr .L32 -0293+ A895 -0294+ A895 23 .L31 inc hl ;старт резидента во 2-м окне -0295+ A896 22 65 A9 ld (.Run1+1),hl -0296+ A899 -0297+ A899 21 00 FF ld hl,AdrTmpBuf -0298+ A89C 11 F3 A5 ld de,Rezident.Start+1 ;сохранение 7 байт в резиденте -0299+ A89F 06 03 ld b,3 -0300+ A8A1 7E .L33 ld a,(hl) -0301+ A8A2 12 ld (de),a -0302+ A8A3 23 inc hl -0303+ A8A4 13 inc de -0304+ A8A5 7E ld a,(hl) -0305+ A8A6 12 ld (de),a -0306+ A8A7 23 inc hl -0307+ A8A8 13 inc de -0308+ A8A9 13 inc de -0309+ A8AA 13 inc de -0310+ A8AB 13 inc de -0311+ A8AC 13 inc de -0312+ A8AD 10 F2 djnz .L33 -0313+ A8AF 7E ld a,(hl) -0314+ A8B0 12 ld (de),a -0315+ A8B1 -0316+ A8B1 11 66 A9 ld de,.Run1+2 ;вспомогательная процедура -0317+ A8B4 06 07 ld b,7 ;длина -0318+ A8B6 1A .L34 ld a,(de) -0319+ A8B7 77 ld (hl),a -0320+ A8B8 2B dec hl -0321+ A8B9 1B dec de -0322+ A8BA 10 FA djnz .L34 -0323+ A8BC 23 inc hl -0324+ A8BD -0325+ A8BD 22 F6 A8 .L32 ld (.Run+1),hl -0326+ A8C0 -0327+ A8C0 3A 30 AB ld a,(Reg._AF+1) ;аккумулятор программы -0328+ A8C3 32 E8 A5 ld (Rezident+1),a ;в резидент -0329+ A8C6 2A 29 AB ld hl,(Reg._HL) ;пара HL -0330+ A8C9 22 E9 A5 ld (Rezident+2),hl ;в резидент -0331+ A8CC -0332+ A8CC E1 pop hl ;адрес посадки резидента -0333+ A8CD 11 E7 A5 ld de,Rezident ;начало резидента -0334+ A8D0 01 7D A9 ld bc,.Buffer -0335+ A8D3 3E 7D ld a,Rezident.End-Rezident ;длина резидента -0336+ A8D5 F5 .L3 push af -0337+ A8D6 CD 6C 92 call Ld_a_hl -0338+ A8D9 02 ld (bc),a ;сохранение памяти под резидентом -0339+ A8DA 1A ld a,(de) ;копирование резидента -0340+ A8DB CD 97 92 call Ld_hl_a -0341+ A8DE 03 inc bc -0342+ A8DF 13 inc de -0343+ A8E0 23 inc hl -0344+ A8E1 F1 pop af -0345+ A8E2 3D dec a -0346+ A8E3 20 F0 jr nz,.L3 -0347+ A8E5 -0348+ A8E5 3A 3F AB ld a,(WinPage) ;банка в 0-ом окне -0349+ A8E8 D3 82 out (EmmWin.P0),a -0350+ A8EA -0351+ A8EA CD F5 8D call RestAllRegs -0352+ A8ED ED 73 1C AB ld (StackDebug),sp ;стек отладчика -0353+ A8F1 ED 7B 3B AB ld sp,(Reg._SP) ;стек программы -0354+ A8F5 C3 00 00 .Run jp 0 ;пуск резидента -0355+ A8F8 -0356+ A8F8 ED 73 3B AB ld (Reg._SP),sp ;стек программы -0357+ A8FC ED 7B 1C AB ld sp,(StackDebug) ;стек отладчика -0358+ A900 CD AC 8D call SaveAllRegs -0359+ A903 DB 82 in a,(EmmWin.P0) -0360+ A905 32 3F AB ld (WinPage),a ;банка в 0-ом окне -0361+ A908 3A 1F AB ld a,(BankOS) ;банка с OS -0362+ A90B D3 82 out (EmmWin.P0),a -0363+ A90D -0364+ A90D 2A 20 AB ld hl,(RezAdr) -0365+ A910 CD 6C 92 call Ld_a_hl -0366+ A913 32 41 AB ld (WinPage+2),a ;номер банки во 2-ом окне -0367+ A916 23 inc hl ;аккумулятор программа -0368+ A917 CD 6C 92 call Ld_a_hl -0369+ A91A 32 30 AB ld (Reg._AF+1),a -0370+ A91D 3A 7C A9 ld a,(.WRez) ;флаг резидента -0371+ A920 B7 or a -0372+ A921 28 1B jr z,.L35 ;не во 2-м окне -0373+ A923 23 inc hl ;регистр L программы -0374+ A924 CD 6C 92 call Ld_a_hl -0375+ A927 32 29 AB ld (Reg._HL),a -0376+ A92A 23 inc hl ;регистр H программы -0377+ A92B CD 6C 92 call Ld_a_hl -0378+ A92E 32 2A AB ld (Reg._HL+1),a -0379+ A931 06 07 ld b,7 -0380+ A933 11 00 FF ld de,AdrTmpBuf -0381+ A936 23 .L36 inc hl ;буфер 7-ми байт -0382+ A937 CD 6C 92 call Ld_a_hl -0383+ A93A 12 ld (de),a ;востановили -0384+ A93B 13 inc de -0385+ A93C 10 F8 djnz .L36 -0386+ A93E -0387+ A93E E1 .L35 pop hl -0388+ A93F F1 pop af ;востановили код команды -0389+ A940 C1 pop bc -0390+ A941 CD 97 92 call Ld_hl_a -0391+ A944 2B dec hl -0392+ A945 78 ld a,b -0393+ A946 CD 97 92 call Ld_hl_a -0394+ A949 2B dec hl -0395+ A94A 79 ld a,c -0396+ A94B CD 97 92 call Ld_hl_a -0397+ A94E -0398+ A94E 11 7D A9 ld de,.Buffer ;восстановление памяти под резидентом -0399+ A951 2A 20 AB ld hl,(RezAdr) ;адрес посадки -0400+ A954 06 7D ld b,Rezident.End-Rezident ;длина резидента -0401+ A956 1A .L4 ld a,(de) -0402+ A957 CD 97 92 call Ld_hl_a -0403+ A95A 13 inc de -0404+ A95B 23 inc hl -0405+ A95C 10 F8 djnz .L4 -0406+ A95E FB ei -0407+ A95F C9 ret -0408+ A960 -0409+ A960 3E FF .BankP ld a,0xFF ;(2) банка под отладчиком -0410+ A962 D3 C2 out (EmmWin.P2),a ;(2) -0411+ A964 C3 00 00 .Run1 jp 0 ;(3) переход в резидент -0412+ A967 -0413+ A967 F5 .SpdInc push af ;увеличение глубины стека -0414+ A968 3A 22 AB ld a,(StackDown) -0415+ A96B 3C inc a -0416+ A96C 32 22 AB ld (StackDown),a -0417+ A96F F1 pop af -0418+ A970 C9 ret -0419+ A971 -0420+ A971 F5 .SpdDec push af ;уменьшение глубины стека -0421+ A972 3A 22 AB ld a,(StackDown) -0422+ A975 3D dec a -0423+ A976 32 22 AB ld (StackDown),a -0424+ A979 F1 pop af -0425+ A97A C9 ret -0426+ A97B -0427+ A97B FF .Flag db On ;флаг захода в подпрограммы -0428+ A97C 00 .WRez db 0 ;флаг окна посадки резидента -0429+ A97D -0430+ A97D 00 .Buffer ds Rezident.End-Rezident ;длина резидента -0431+ A9FA -0432+ A9FA -0382 A9FA include "savescr.asm";"D:\WORKAST\DEMON\savescr" -0001+ A9FA ;[]=========================================================================[] -0002+ A9FA ;[] Сохранение экрана в файл [] -0003+ A9FA ;[] v0.03 - последние изменения 11.03.2006 [] -0004+ A9FA ;[]=========================================================================[] -0005+ A9FA SaveScr: -0006+ A9FA 01 3D 01 ld bc,1*256+Dss.GetMem -0007+ A9FD D7 rst DssRst ;выделение банки памяти -0008+ A9FE D8 ret c ;выход с ошибкой -0009+ A9FF 32 5A AA ld (.Id),a -0010+ AA02 01 3B 00 ld bc,Dss.SetWin3 -0011+ AA05 D7 rst DssRst ;включение банки в 3-е окно -0012+ AA06 32 5B AA ld (.Id+1),a ;замещаемая страница -0013+ AA09 11 00 00 ld de,0 ;позиция на экране -0014+ AA0C 21 00 C0 ld hl,0xC000 -0015+ AA0F D5 .L1 push de -0016+ AA10 E5 push hl -0017+ AA11 0E 57 ld c,Dss.RdChar -0018+ AA13 D7 rst DssRst ;считать символ с экрана -0019+ AA14 E1 pop hl -0020+ AA15 D1 pop de -0021+ AA16 77 ld (hl),a -0022+ AA17 23 inc hl -0023+ AA18 1C inc e -0024+ AA19 7B ld a,e -0025+ AA1A FE 50 cp 0x50 ;закончилась строка? -0026+ AA1C 20 F1 jr nz,.L1 -0027+ AA1E 01 0A 0D ld bc,0x0D0A ;конец строки -0028+ AA21 70 ld (hl),b -0029+ AA22 23 inc hl -0030+ AA23 71 ld (hl),c -0031+ AA24 23 inc hl -0032+ AA25 1E 00 ld e,0 ;начало строки -0033+ AA27 14 inc d -0034+ AA28 7A ld a,d -0035+ AA29 FE 20 cp 0x20 ;конец экрана? -0036+ AA2B 20 E2 jr nz,.L1 -0037+ AA2D -0038+ AA2D 21 50 AA ld hl,.NameF ;имя файла -0039+ AA30 AF xor a ;атрибут -0040+ AA31 0E 0A ld c,Dss.Create -0041+ AA33 D7 rst DssRst -0042+ AA34 38 0E jr c,.L2 ;ошибка -0043+ AA36 F5 push af -0044+ AA37 21 00 C0 ld hl,0xC000 ;начало записываемой памяти -0045+ AA3A 11 40 0A ld de,82*32 ;размер записываемой инфы -0046+ AA3D 0E 14 ld c,Dss.Write -0047+ AA3F D7 rst DssRst ;записать -0048+ AA40 F1 pop af -0049+ AA41 0E 12 ld c,Dss.Close -0050+ AA43 D7 rst DssRst ;закрыть файл -0051+ AA44 -0052+ AA44 3A 5A AA .L2 ld a,(.Id) ;id памяти -0053+ AA47 0E 3E ld c,Dss.FreeMem -0054+ AA49 D7 rst DssRst ;освободить память -0055+ AA4A 3A 5B AA ld a,(.Id+1) -0056+ AA4D D3 E2 out (EmmWin.P3),a ;востановили банку -0057+ AA4F C9 ret -0058+ AA50 -0059+ AA50 .NameF db "demon.$$$",0 -0059+ AA50 64656D6F6E2E24242400 -0060+ AA5A 00 .Id ds 2 ;id выделенного блока -0061+ AA5C -0062+ AA5C ;11:11 18.02.2011 Заглушка Не было исходника :( -0063+ AA5C ; include "d:\workast\demon\screen\scrdemon" -0064+ AA5C -0065+ AA5C -0383 AA5C include "data.asm";"D:\WORKAST\DEMON\data" -0001+ AA5C ;[]=========================================================================[] -0002+ AA5C ;[] Данные монитора-отладчика DemoN [] -0003+ AA5C ;[] v0.01 - последние изменения 10.10.2004 [] -0004+ AA5C ;[] v0.02 - последние изменения 11.03.2005 [] -0005+ AA5C ;[] v0.03 - последние изменения 05.02.2006 [] -0006+ AA5C ;[] v0.10 - последние изменения 10.09.2006 [] -0007+ AA5C ;[]=========================================================================[] -0008+ AA5C B0 SymbolNoPrint db #b0;"." ;символы < пробела -0009+ AA5D FF ClockOn db On ;признак вывода часов -0010+ AA5E 00 DemonScreen db 0 ;номер экрана отладчика -0011+ AA5F 00 OSScreen db 0 ;Номер экрана ОСи -0012+ AA60 00 OSGrafMode db 0 ;Графический режим оси -0013+ AA61 FF BufPage db 255 ;Номер страницы с оконным буфером -0014+ AA62 -0015+ AA62 0D 0A Hello db 13,10 -0016+ AA64 ; db "Версия откомпилирована специально для Василия Иванова!",13,10,10 -0017+ AA64 db "DemoN v" -0017+ AA64 44656D6F4E2076 -0018+ AA6B incbin "VERSION\major.bin" -0019+ AA6C 2E db "." -0020+ AA6D incbin "VERSION\minor.bin" -0021+ AA6F db " build " -0021+ AA6F 206275696C6420 -0022+ AA76 incbin "VERSION\build.bin" -0023+ AA7A db " (alpha) ",13,10 -0023+ AA7A 2028616C70686129203C4372656174656420627920416C706861205374756469 -0023+ AA9A 6F3E0D0A -0024+ AA9E db "Last edition " -0024+ AA9E 4C6173742065646974696F6E20 -0025+ AAAB incbin "VERSION\date.bin" -0026+ AAB1 db " (BLR " -0026+ AAB1 2028424C5220 -0027+ AAB7 incbin "VERSION\time.bin" -0028+ AABC 29 0D 0A db ")",13,10 -0029+ AABF db "FidoNet: Igor Zhadinets 2:454/5.18; " -0029+ AABF 4669646F4E65743A2049676F72205A686164696E65747320323A3435342F352E -0029+ AADF 31383B20 -0030+ AAE3 db "e-mail: igor_ast@tut.by",13,10,10,0 -0030+ AAE3 652D6D61696C3A2069676F725F617374407475742E62790D0A0A00 -0031+ AAFE Str: -0032+ AAFE .Load db "Load file ...",0x0D,0x0A,0 -0032+ AAFE 4C6F61642066696C65202E2E2E0D0A00 -0033+ AB0E 0D 0A 00 .DA db 0x0d,0x0A,0 -0034+ AB11 -0035+ AB11 PauseFlash equ 16 ;частота мигания прогр.курсора -0036+ AB11 -0037+ AB11 Color: -0038+ AB11 07 .Screen db 00000111b ;основной цвет экрана -0039+ AB12 03 .Border db 00000011b ;цвет рамки -0040+ AB13 02 .TextStrReg db 00000010b ;цвет регистровых пар -0041+ AB14 05 .TextStrWin db 00000101b ;цвет номеров окон -0042+ AB15 06 ._SP db 00000110b ;подсветка вершины стека -0043+ AB16 71 ._PC db 01110001b ;подсветка выполняемой стр. -0044+ AB17 0E .RezArea db 00001110b ;подсветка резидента -0045+ AB18 04 .TextStrLogo db 00000100b ;цвет лого программы -0046+ AB19 1D .Cursor db 00011101b ;цвет курсора-указателя -0047+ AB1A 3F .InLine db 00111111b ;цвет строки ввода -0048+ AB1B 31 .InLineEd db 00110001b ;цвет строки ввода при ред. -0049+ AB1C -0050+ AB1C 00 StackDebug ds 2 ;адрес стека отладчика -0051+ AB1E 00 BankDebug ds 1 ;номер банки отладчика -0052+ AB1F 00 BankOS ds 1 ;номер банки с OS -0053+ AB20 00 70 RezAdr dw 0x7000 ;адрес посадки резидента -0054+ AB22 00 StackDown ds 1 ;глубина стека -0055+ AB23 0A 80 StackDump dw 0x800A ;начало дампа стека -0056+ AB25 -0057+ AB25 Reg: ;значение регистровых пар -0058+ AB25 00 00 ._IX dw 0 -0059+ AB27 00 00 ._IY dw 0 -0060+ AB29 00 00 ._HL dw 0 -0061+ AB2B 00 00 ._DE dw 0 -0062+ AB2D 00 00 ._BC dw 0 -0063+ AB2F 00 00 ._AF dw 0 -0064+ AB31 00 00 ._HL_ dw 0 -0065+ AB33 00 00 ._DE_ dw 0 -0066+ AB35 00 00 ._BC_ dw 0 -0067+ AB37 00 00 ._AF_ dw 0 -0068+ AB39 00 00 ._IR dw 0 -0069+ AB3B FE 7F ._SP dw 0x7FFE -0070+ AB3D 00 00 ._PC dw 0 -0071+ AB3F -0072+ AB3F FF FF FF FF WinPage: db 0xFF,0xFF,0xFF,0xFF ;адреса подключенных страниц -0073+ AB43 -0074+ AB43 00 40 Dump1 dw 0x4000 ;адрес начала динамического дампа -0075+ AB45 Dump: ;адреса начала строк дампа -0076+ AB45 B8 9E dw InputLine.Buffer;0x4100 -0077+ AB47 C8 9E dw InputLine.Buffer+16;0x8100 -0078+ AB49 2C 9C dw PutCode.Buffer;0xC100 -0079+ AB4B 80 52 dw 0x5280 -0080+ AB4D 80 92 dw 0x9280 -0081+ AB4F 80 D2 dw 0xD280 -0082+ AB51 00 60 dw 0x6000 -0083+ AB53 00 A0 dw 0xA000 -0084+ AB55 -0085+ AB55 00 ListAdr: ds 40 ;буфер хранения адресов листинга -0086+ AB7D FF ListFormat: db -1 ;форматный вывод листинга -0087+ AB7E ;-1 - да; 0 - нет -0088+ AB7E -0089+ AB7E 00 DecHex db 0 ;0-HEX FF-DEC система -0090+ AB7F -0091+ AB7F ;======== Констатнты ====== -0092+ AB7F On equ 0xFF -0093+ AB7F Off equ 0 -0094+ AB7F Ins equ 0 -0095+ AB7F Ovr equ 0xFF -0096+ AB7F SysSymb equ 0x1B ;системный знакогенератор -0097+ AB7F -0098+ AB7F ;печать через п/п биоса -0099+ AB7F ifdef D_PRINTCH_BIOS -0100+ AB7F~ Demon.Bios_Win db 0 ;идентификатор окна биоса -0101+ AB7F~ MainWin db 80,32,0,0,00110000b,0,0,0 -0102+ AB7F~ ds 26,0 -0103+ AB7F endif -0104+ AB7F -0105+ AB7F ;-------------------------------------- -0106+ AB7F ;Диалоговое окно для пп выхода -0107+ AB7F ;-------------------------------------- -0108+ AB7F ExitDlg db 6,22,13,32,6,#40 -0108+ AB7F 06160D200640 -0109+ AB85 db "Confirmation",0 -0109+ AB85 436F6E6669726D6174696F6E00 -0110+ AB92 db " You really want to quit?" -0110+ AB92 2020596F75207265616C6C792077616E7420746F20717569743F -0111+ ABAC db 0x16,32,17,"OK Cancel",0 -0111+ ABAC 1620114F4B20202020202043616E63656C00 -0112+ ABBE 02 db 2 -0113+ ABBF 1D 11 08 02 db 29,17,8,2 ;Ok -0114+ ABC3 00 00 00 00 dw 0,0 -0115+ ABC7 27 11 08 02 db 39,17,8,2 ;Cancel -0116+ ABCB 00 00 1E 99 dw 0,Keyb.NoExit -0384 ABCF include "tabl.asm";"D:\WORKAST\DEMON\tabl" -0001+ ABCF ;[]=========================================================================[] -0002+ ABCF ;[] Таблицы дизассемблера монитора-отладчика DemoN [] -0003+ ABCF ;[] v0.01 - последние изменения 10.10.2004 [] -0004+ ABCF ;[] v0.02 - последние изменения 29.11.2004 [] -0005+ ABCF ;[] v0.03 - последние изменения 29.01.2006 [] -0006+ ABCF ;[]=========================================================================[] -0007+ ABCF Tabl00_3F: -0008+ ABCF dw M00,M01,M02,M03,M04,M05,M06,M07,M08,M09,M0A,M0B,M0C,M0D,M0E,M0F -0008+ ABCF 4FAC53AC5AAC64AC6BAC71AC77AC7DAC82AC8CAC96ACA0ACA7ACADACB3ACB9AC -0009+ ABEF dw M10,M11,M12,M13,M14,M15,M16,M17,M18,M19,M1A,M1B,M1C,M1D,M1E,M1F -0009+ ABEF BEACC4ACCBACD5ACDCACE2ACE8ACEEACF2ACF6AC00AD0AAD11AD17AD1DAD23AD -0010+ AC0F dw M20,M21,M22,M23,M24,M25,M26,M27,M28,M29,M2A,M2B,M2C,M2D,M2E,M2F -0010+ AC0F 27AD2EAD35AD3EAD45AD4BAD51AD57AD5BAD61AD6BAD74AD7BAD81AD87AD8DAD -0011+ AC2F dw M30,M31,M32,M33,M34,M35,M36,M37,M38,M39,M3A,M3B,M3C,M3D,M3E,M3F -0011+ AC2F 91AD98AD9FADA7ADAEADB7ADC0ADC9ADCDADD3ADDDADE5ADECADF2ADF8ADFEAD -0012+ AC4F -0013+ AC4F 4E 4F 50 00 M00 db "NOP",0 -0014+ AC53 M01 db "LD BC,",2 -0014+ AC53 4C442042432C02 -0015+ AC5A M02 db "LD (BC),A",0 -0015+ AC5A 4C4420284243292C4100 -0016+ AC64 M03 db "INC BC",0 -0016+ AC64 494E4320424300 -0017+ AC6B M04 db "INC B",0 -0017+ AC6B 494E43204200 -0018+ AC71 M05 db "DEC B",0 -0018+ AC71 444543204200 -0019+ AC77 M06 db "LD B,",1 -0019+ AC77 4C4420422C01 -0020+ AC7D 524C434100 M07 db "RLCA",0 -0021+ AC82 M08 db "EX AF,AF'",0 -0021+ AC82 45582041462C41462700 -0022+ AC8C M09 db "ADD HL,BC",0 -0022+ AC8C 41444420484C2C424300 -0023+ AC96 M0A db "LD A,(BC)",0 -0023+ AC96 4C4420412C2842432900 -0024+ ACA0 M0B db "DEC BC",0 -0024+ ACA0 44454320424300 -0025+ ACA7 M0C db "INC C",0 -0025+ ACA7 494E43204300 -0026+ ACAD M0D db "DEC C",0 -0026+ ACAD 444543204300 -0027+ ACB3 M0E db "LD C,",1 -0027+ ACB3 4C4420432C01 -0028+ ACB9 5252434100 M0F db "RRCA",0 -0029+ ACBE M10 db "DJNZ ",3 -0029+ ACBE 444A4E5A2003 -0030+ ACC4 M11 db "LD DE,",2 -0030+ ACC4 4C442044452C02 -0031+ ACCB M12 db "LD (DE),A",0 -0031+ ACCB 4C4420284445292C4100 -0032+ ACD5 M13 db "INC DE",0 -0032+ ACD5 494E4320444500 -0033+ ACDC M14 db "INC D",0 -0033+ ACDC 494E43204400 -0034+ ACE2 M15 db "DEC D",0 -0034+ ACE2 444543204400 -0035+ ACE8 M16 db "LD D,",1 -0035+ ACE8 4C4420442C01 -0036+ ACEE 52 4C 41 00 M17 db "RLA",0 -0037+ ACF2 4A 52 20 03 M18 db "JR ",3 -0038+ ACF6 M19 db "ADD HL,DE",0 -0038+ ACF6 41444420484C2C444500 -0039+ AD00 M1A db "LD A,(DE)",0 -0039+ AD00 4C4420412C2844452900 -0040+ AD0A M1B db "DEC DE",0 -0040+ AD0A 44454320444500 -0041+ AD11 M1C db "INC E",0 -0041+ AD11 494E43204500 -0042+ AD17 M1D db "DEC E",0 -0042+ AD17 444543204500 -0043+ AD1D M1E db "LD E,",1 -0043+ AD1D 4C4420452C01 -0044+ AD23 52 52 41 00 M1F db "RRA",0 -0045+ AD27 M20 db "JR NZ,",3 -0045+ AD27 4A52204E5A2C03 -0046+ AD2E M21 db "LD HL,",2 -0046+ AD2E 4C4420484C2C02 -0047+ AD35 M22 db "LD (),HL",5 -0047+ AD35 4C442028292C484C05 -0048+ AD3E M23 db "INC HL",0 -0048+ AD3E 494E4320484C00 -0049+ AD45 M24 db "INC H",0 -0049+ AD45 494E43204800 -0050+ AD4B M25 db "DEC H",0 -0050+ AD4B 444543204800 -0051+ AD51 M26 db "LD H,",1 -0051+ AD51 4C4420482C01 -0052+ AD57 44 41 41 00 M27 db "DAA",0 -0053+ AD5B M28 db "JR Z,",3 -0053+ AD5B 4A52205A2C03 -0054+ AD61 M29 db "ADD HL,HL",0 -0054+ AD61 41444420484C2C484C00 -0055+ AD6B M2A db "LD HL,()",5 -0055+ AD6B 4C4420484C2C282905 -0056+ AD74 M2B db "DEC HL",0 -0056+ AD74 44454320484C00 -0057+ AD7B M2C db "INC L",0 -0057+ AD7B 494E43204C00 -0058+ AD81 M2D db "DEC L",0 -0058+ AD81 444543204C00 -0059+ AD87 M2E db "LD L,",1 -0059+ AD87 4C44204C2C01 -0060+ AD8D 43 50 4C 00 M2F db "CPL",0 -0061+ AD91 M30 db "JR NC,",3 -0061+ AD91 4A52204E432C03 -0062+ AD98 M31 db "LD SP,",2 -0062+ AD98 4C442053502C02 -0063+ AD9F M32 db "LD (),A",5 -0063+ AD9F 4C442028292C4105 -0064+ ADA7 M33 db "INC SP",0 -0064+ ADA7 494E4320535000 -0065+ ADAE M34 db "INC (HL)",0 -0065+ ADAE 494E432028484C2900 -0066+ ADB7 M35 db "DEC (HL)",0 -0066+ ADB7 4445432028484C2900 -0067+ ADC0 M36 db "LD (HL),",1 -0067+ ADC0 4C442028484C292C01 -0068+ ADC9 53 43 46 00 M37 db "SCF",0 -0069+ ADCD M38 db "JR C,",3 -0069+ ADCD 4A5220432C03 -0070+ ADD3 M39 db "ADD HL,SP",0 -0070+ ADD3 41444420484C2C535000 -0071+ ADDD M3A db "LD A,()",5 -0071+ ADDD 4C4420412C282905 -0072+ ADE5 M3B db "DEC SP",0 -0072+ ADE5 44454320535000 -0073+ ADEC M3C db "INC A",0 -0073+ ADEC 494E43204100 -0074+ ADF2 M3D db "DEC A",0 -0074+ ADF2 444543204100 -0075+ ADF8 M3E db "LD A,",1 -0075+ ADF8 4C4420412C01 -0076+ ADFE 43 43 46 00 M3F db "CCF",0 -0077+ AE02 -0078+ AE02 TablC0_FF: -0079+ AE02 dw MC0,MC1,MC2,MC3,MC4,MC5,MC6,MC7,MC8,MC9,MCA,M00,MCC,MCD,MCE,MCF -0079+ AE02 82AE89AE90AE97AE9BAEA4AEACAEB3AEB9AEBFAEC3AE4FACC9AED1AED7AEDEAE -0080+ AE22 dw MD0,MD1,MD2,MD3,MD4,MD5,MD6,MD7,MD8,MD9,MDA,MDB,MDC,MDD,MDE,MDF -0080+ AE22 E4AEEBAEF2AEF9AE02AF0BAF13AF18AF20AF26AF2AAF30AF38AF40AF43AF4AAF -0081+ AE42 dw ME0,ME1,ME2,ME3,ME4,ME5,ME6,ME7,ME8,ME9,MEA,MEB,MEC,M00,MEE,MEF -0081+ AE42 52AF59AF60AF67AF72AF7BAF83AF88AF90AF97AF9FAFA6AFAFAF4FACB8AFBDAF -0082+ AE62 dw MF0,MF1,MF2,MF3,MF4,MF5,MF6,MF7,MF8,MF9,MFA,MFB,MFC,MFD,MFE,MFF -0082+ AE62 C5AFCBAFD2AFD8AFDBAFE3AFEBAFEFAFF7AFFDAF06B00CB00FB017B01AB01EB0 -0083+ AE82 -0084+ AE82 MC0 db "RET NZ",0 -0084+ AE82 524554204E5A00 -0085+ AE89 MC1 db "POP BC",0 -0085+ AE89 504F5020424300 -0086+ AE90 MC2 db "JP NZ,",2 -0086+ AE90 4A50204E5A2C02 -0087+ AE97 4A 50 20 02 MC3 db "JP ",2 -0088+ AE9B MC4 db "CALL NZ,",2 -0088+ AE9B 43414C4C204E5A2C02 -0089+ AEA4 MC5 db "PUSH BC",0 -0089+ AEA4 5055534820424300 -0090+ AEAC MC6 db "ADD A,",1 -0090+ AEAC 41444420412C01 -0091+ AEB3 MC7 db "RST 0",0 -0091+ AEB3 525354203000 -0092+ AEB9 MC8 db "RET Z",0 -0092+ AEB9 524554205A00 -0093+ AEBF 52 45 54 00 MC9 db "RET",0 -0094+ AEC3 MCA db "JP Z,",2 -0094+ AEC3 4A50205A2C02 -0095+ AEC9 MCC db "CALL Z,",2 -0095+ AEC9 43414C4C205A2C02 -0096+ AED1 MCD db "CALL ",2 -0096+ AED1 43414C4C2002 -0097+ AED7 MCE db "ADC A,",1 -0097+ AED7 41444320412C01 -0098+ AEDE MCF db "RST 8",0 -0098+ AEDE 525354203800 -0099+ AEE4 MD0 db "RET NC",0 -0099+ AEE4 524554204E4300 -0100+ AEEB MD1 db "POP DE",0 -0100+ AEEB 504F5020444500 -0101+ AEF2 MD2 db "JP NC,",2 -0101+ AEF2 4A50204E432C02 -0102+ AEF9 MD3 db "OUT (),A",4 -0102+ AEF9 4F55542028292C4104 -0103+ AF02 MD4 db "CALL NC,",2 -0103+ AF02 43414C4C204E432C02 -0104+ AF0B MD5 db "PUSH DE",0 -0104+ AF0B 5055534820444500 -0105+ AF13 5355422001 MD6 db "SUB ",1 -0106+ AF18 MD7 db "RST #10",0 -0106+ AF18 5253542023313000 -0107+ AF20 MD8 db "RET C",0 -0107+ AF20 524554204300 -0108+ AF26 45 58 58 00 MD9 db "EXX",0 -0109+ AF2A MDA db "JP C,",2 -0109+ AF2A 4A5020432C02 -0110+ AF30 MDB db "IN A,()",4 -0110+ AF30 494E20412C282904 -0111+ AF38 MDC db "CALL C,",2 -0111+ AF38 43414C4C20432C02 -0112+ AF40 44 44 00 MDD db "DD",0 -0113+ AF43 MDE db "SBC A,",1 -0113+ AF43 53424320412C01 -0114+ AF4A MDF db "RST #18",0 -0114+ AF4A 5253542023313800 -0115+ AF52 ME0 db "RET PO",0 -0115+ AF52 52455420504F00 -0116+ AF59 ME1 db "POP HL",0 -0116+ AF59 504F5020484C00 -0117+ AF60 ME2 db "JP PO,",2 -0117+ AF60 4A5020504F2C02 -0118+ AF67 ME3 db "EX (SP),HL",0 -0118+ AF67 455820285350292C484C00 -0119+ AF72 ME4 db "CALL PO,",2 -0119+ AF72 43414C4C20504F2C02 -0120+ AF7B ME5 db "PUSH HL",0 -0120+ AF7B 5055534820484C00 -0121+ AF83 414E442001 ME6 db "AND ",1 -0122+ AF88 ME7 db "RST #20",0 -0122+ AF88 5253542023323000 -0123+ AF90 ME8 db "RET PE",0 -0123+ AF90 52455420504500 -0124+ AF97 ME9 db "JP (HL)",0 -0124+ AF97 4A502028484C2900 -0125+ AF9F MEA db "JP PE,",2 -0125+ AF9F 4A502050452C02 -0126+ AFA6 MEB db "EX DE,HL",0 -0126+ AFA6 45582044452C484C00 -0127+ AFAF MEC db "CALL PE,",2 -0127+ AFAF 43414C4C2050452C02 -0128+ AFB8 584F522001 MEE db "XOR ",1 -0129+ AFBD MEF db "RST #28",0 -0129+ AFBD 5253542023323800 -0130+ AFC5 MF0 db "RET P",0 -0130+ AFC5 524554205000 -0131+ AFCB MF1 db "POP AF",0 -0131+ AFCB 504F5020414600 -0132+ AFD2 MF2 db "JP P,",2 -0132+ AFD2 4A5020502C02 -0133+ AFD8 44 49 00 MF3 db "DI",0 -0134+ AFDB MF4 db "CALL P,",2 -0134+ AFDB 43414C4C20502C02 -0135+ AFE3 MF5 db "PUSH AF",0 -0135+ AFE3 5055534820414600 -0136+ AFEB 4F 52 20 01 MF6 db "OR ",1 -0137+ AFEF MF7 db "RST #30",0 -0137+ AFEF 5253542023333000 -0138+ AFF7 MF8 db "RET M",0 -0138+ AFF7 524554204D00 -0139+ AFFD MF9 db "LD SP,HL",0 -0139+ AFFD 4C442053502C484C00 -0140+ B006 MFA db "JP M,",2 -0140+ B006 4A50204D2C02 -0141+ B00C 45 49 00 MFB db "EI",0 -0142+ B00F MFC db "CALL M,",2 -0142+ B00F 43414C4C204D2C02 -0143+ B017 46 44 00 MFD db "FD",0 -0144+ B01A 43 50 20 01 MFE db "CP ",1 -0145+ B01E MFF db "RST #38",0 -0145+ B01E 5253542023333800 -0146+ B026 -0147+ B026 48414C5400 MHALT db "HALT",0 -0148+ B02B -0149+ B02B TablM: -0150+ B02B dw M80,M88,M90,M98,MA0,MA8,MB0,MB8 -0150+ B02B 3BB042B049B04EB055B05AB05FB063B0 -0151+ B03B -0152+ B03B M80 db "ADD A,",0 -0152+ B03B 41444420412C00 -0153+ B042 M88 db "ADC A,",0 -0153+ B042 41444320412C00 -0154+ B049 5355422000 M90 db "SUB ",0 -0155+ B04E M98 db "SBC A,",0 -0155+ B04E 53424320412C00 -0156+ B055 414E442000 MA0 db "AND ",0 -0157+ B05A 584F522000 MA8 db "XOR ",0 -0158+ B05F 4F 52 20 00 MB0 db "OR ",0 -0159+ B063 43 50 20 00 MB8 db "CP ",0 -0160+ B067 -0161+ B067 CodeDDFD: -0162+ B067 db 0x09,0x19,0x21,0x22,0x23,0x24,0x25,0x26,0x29 -0162+ B067 091921222324252629 -0163+ B070 db 0x2A,0x2B,0x2C,0x2D,0x2E,0x34,0x35,0x36,0x39 -0163+ B070 2A2B2C2D2E34353639 -0164+ B079 db 0x44,0x45,0x46,0x4C,0x4D,0x4E,0x54,0x55,0x56 -0164+ B079 4445464C4D4E545556 -0165+ B082 db 0x5C,0x5D,0x5E,0x60,0x61,0x62,0x63,0x64,0x65 -0165+ B082 5C5D5E606162636465 -0166+ B08B db 0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E -0166+ B08B 666768696A6B6C6D6E -0167+ B094 db 0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x77,0x7C -0167+ B094 6F707172737475777C -0168+ B09D db 0x7D,0x7E,0x84,0x85,0x86,0x8C,0x8D,0x8E,0x94 -0168+ B09D 7D7E8485868C8D8E94 -0169+ B0A6 db 0x95,0x96,0x9C,0x9D,0x9E,0xA4,0xA5,0xA6,0xAC -0169+ B0A6 95969C9D9EA4A5A6AC -0170+ B0AF db 0xAD,0xAE,0xB4,0xB5,0xB6,0xBC,0xBD,0xBE,0xE1 -0170+ B0AF ADAEB4B5B6BCBDBEE1 -0171+ B0B8 E3 E5 E9 F9 db 0xE3,0xE5,0xE9,0xF9 -0172+ B0BC -0173+ B0BC TablDDFD: -0174+ B0BC dw DD09,DD19,DD21,DD22,DD23,DD24,DD25,DD26,DD29 -0174+ B0BC 66B170B17AB181B18AB191B198B19FB1A6B1 -0175+ B0CE dw DD2A,DD2B,DD2C,DD2D,DD2E,DD34,DD35,DD36,DD39 -0175+ B0CE B0B1B9B1C0B1C7B1CEB1D5B1DBB1E1B1E7B1 -0176+ B0E0 dw DD44,DD45,DD46,DD4C,DD4D,DD4E,DD54,DD55,DD56 -0176+ B0E0 F1B1F9B101B208B210B218B21FB227B22FB2 -0177+ B0F2 dw DD5C,DD5D,DD5E,DD60,DD61,DD62,DD63,DD64,DD65 -0177+ B0F2 36B23EB246B24DB255B25DB265B26DB276B2 -0178+ B104 dw DD66,DD67,DD68,DD69,DD6A,DD6B,DD6C,DD6D,DD6E -0178+ B104 7FB286B28EB296B29EB2A6B2AEB2B7B2C0B2 -0179+ B116 dw DD6F,DD70,DD71,DD72,DD73,DD74,DD75,DD77,DD7C -0179+ B116 C7B2CFB2D6B2DDB2E4B2EBB2F2B2F9B200B3 -0180+ B128 dw DD7D,DD7E,DD84,DD85,DD86,DD8C,DD8D,DD8E,DD94 -0180+ B128 08B310B317B320B329B331B33AB343B34BB3 -0181+ B13A dw DD95,DD96,DD9C,DD9D,DD9E,DDA4,DDA5,DDA6,DDAC -0181+ B13A 52B359B35FB368B371B379B380B387B38DB3 -0182+ B14C dw DDAD,DDAE,DDB4,DDB5,DDB6,DDBC,DDBD,DDBE,DDE1 -0182+ B14C 94B39BB3A1B3A7B3ADB3B2B3B8B3BEB3C3B3 -0183+ B15E dw DDE3,DDE5,DDE9,DDF9 -0183+ B15E CAB3D5B3DDB3E5B3 -0184+ B166 -0185+ B166 DD09 db "ADD Ix,BC",0 -0185+ B166 4144442049782C424300 -0186+ B170 DD19 db "ADD Ix,DE",0 -0186+ B170 4144442049782C444500 -0187+ B17A DD21 db "LD Ix,",2 -0187+ B17A 4C442049782C02 -0188+ B181 DD22 db "LD (),Ix",5 -0188+ B181 4C442028292C497805 -0189+ B18A DD23 db "INC Ix",0 -0189+ B18A 494E4320497800 -0190+ B191 DD24 db "INC Hx",0 -0190+ B191 494E4320487800 -0191+ B198 DD25 db "DEC Hx",0 -0191+ B198 44454320487800 -0192+ B19F DD26 db "LD Hx,",1 -0192+ B19F 4C442048782C01 -0193+ B1A6 DD29 db "ADD Ix,Ix",0 -0193+ B1A6 4144442049782C497800 -0194+ B1B0 DD2A db "LD Ix,()",5 -0194+ B1B0 4C442049782C282905 -0195+ B1B9 DD2B db "DEC Ix",0 -0195+ B1B9 44454320497800 -0196+ B1C0 DD2C db "INC Lx",0 -0196+ B1C0 494E43204C7800 -0197+ B1C7 DD2D db "DEC Lx",0 -0197+ B1C7 444543204C7800 -0198+ B1CE DD2E db "LD Lx,",1 -0198+ B1CE 4C44204C782C01 -0199+ B1D5 DD34 db "INC )",6 -0199+ B1D5 494E43202906 -0200+ B1DB DD35 db "DEC )",6 -0200+ B1DB 444543202906 -0201+ B1E1 DD36 db "LD ),",6 -0201+ B1E1 4C4420292C06 -0202+ B1E7 DD39 db "ADD Ix,SP",0 -0202+ B1E7 4144442049782C535000 -0203+ B1F1 DD44 db "LD B,Hx",0 -0203+ B1F1 4C4420422C487800 -0204+ B1F9 DD45 db "LD B,Lx",0 -0204+ B1F9 4C4420422C4C7800 -0205+ B201 DD46 db "LD B,)",6 -0205+ B201 4C4420422C2906 -0206+ B208 DD4C db "LD C,Hx",0 -0206+ B208 4C4420432C487800 -0207+ B210 DD4D db "LD C,Lx",0 -0207+ B210 4C4420432C4C7800 -0208+ B218 DD4E db "LD C,)",6 -0208+ B218 4C4420432C2906 -0209+ B21F DD54 db "LD D,Hx",0 -0209+ B21F 4C4420442C487800 -0210+ B227 DD55 db "LD D,Lx",0 -0210+ B227 4C4420442C4C7800 -0211+ B22F DD56 db "LD D,)",6 -0211+ B22F 4C4420442C2906 -0212+ B236 DD5C db "LD E,Hx",0 -0212+ B236 4C4420452C487800 -0213+ B23E DD5D db "LD E,Lx",0 -0213+ B23E 4C4420452C4C7800 -0214+ B246 DD5E db "LD E,)",6 -0214+ B246 4C4420452C2906 -0215+ B24D DD60 db "LD Hx,B",0 -0215+ B24D 4C442048782C4200 -0216+ B255 DD61 db "LD Hx,C",0 -0216+ B255 4C442048782C4300 -0217+ B25D DD62 db "LD Hx,D",0 -0217+ B25D 4C442048782C4400 -0218+ B265 DD63 db "LD Hx,E",0 -0218+ B265 4C442048782C4500 -0219+ B26D DD64 db "LD Hx,Hx",0 -0219+ B26D 4C442048782C487800 -0220+ B276 DD65 db "LD Hx,Lx",0 -0220+ B276 4C442048782C4C7800 -0221+ B27F DD66 db "LD H,)",6 -0221+ B27F 4C4420482C2906 -0222+ B286 DD67 db "LD Lx,A",0 -0222+ B286 4C44204C782C4100 -0223+ B28E DD68 db "LD Lx,B",0 -0223+ B28E 4C44204C782C4200 -0224+ B296 DD69 db "LD Lx,C",0 -0224+ B296 4C44204C782C4300 -0225+ B29E DD6A db "LD Lx,D",0 -0225+ B29E 4C44204C782C4400 -0226+ B2A6 DD6B db "LD Lx,E",0 -0226+ B2A6 4C44204C782C4500 -0227+ B2AE DD6C db "LD Lx,Hx",0 -0227+ B2AE 4C44204C782C487800 -0228+ B2B7 DD6D db "LD Lx,Lx",0 -0228+ B2B7 4C44204C782C4C7800 -0229+ B2C0 DD6E db "LD L,)",6 -0229+ B2C0 4C44204C2C2906 -0230+ B2C7 DD6F db "LD Lx,A",0 -0230+ B2C7 4C44204C782C4100 -0231+ B2CF DD70 db "LD ),B",6 -0231+ B2CF 4C4420292C4206 -0232+ B2D6 DD71 db "LD ),C",6 -0232+ B2D6 4C4420292C4306 -0233+ B2DD DD72 db "LD ),D",6 -0233+ B2DD 4C4420292C4406 -0234+ B2E4 DD73 db "LD ),E",6 -0234+ B2E4 4C4420292C4506 -0235+ B2EB DD74 db "LD ),H",6 -0235+ B2EB 4C4420292C4806 -0236+ B2F2 DD75 db "LD ),L",6 -0236+ B2F2 4C4420292C4C06 -0237+ B2F9 DD77 db "LD ),A",6 -0237+ B2F9 4C4420292C4106 -0238+ B300 DD7C db "LD A,Hx",0 -0238+ B300 4C4420412C487800 -0239+ B308 DD7D db "LD A,Lx",0 -0239+ B308 4C4420412C4C7800 -0240+ B310 DD7E db "LD A,)",6 -0240+ B310 4C4420412C2906 -0241+ B317 DD84 db "ADD A,Hx",0 -0241+ B317 41444420412C487800 -0242+ B320 DD85 db "ADD A,Lx",0 -0242+ B320 41444420412C4C7800 -0243+ B329 DD86 db "ADD A,)",6 -0243+ B329 41444420412C2906 -0244+ B331 DD8C db "ADC E,Hx",0 -0244+ B331 41444320452C487800 -0245+ B33A DD8D db "ADC E,Lx",0 -0245+ B33A 41444320452C4C7800 -0246+ B343 DD8E db "ADC E,)",6 -0246+ B343 41444320452C2906 -0247+ B34B DD94 db "SUB Hx",0 -0247+ B34B 53554220487800 -0248+ B352 DD95 db "SUB Lx",0 -0248+ B352 535542204C7800 -0249+ B359 DD96 db "SUB )",6 -0249+ B359 535542202906 -0250+ B35F DD9C db "SBC A,Hx",0 -0250+ B35F 53424320412C487800 -0251+ B368 DD9D db "SBC A,Lx",0 -0251+ B368 53424320412C4C7800 -0252+ B371 DD9E db "SBC A,)",6 -0252+ B371 53424320412C2906 -0253+ B379 DDA4 db "AND Hx",0 -0253+ B379 414E4420487800 -0254+ B380 DDA5 db "AND Lx",0 -0254+ B380 414E44204C7800 -0255+ B387 DDA6 db "AND )",6 -0255+ B387 414E44202906 -0256+ B38D DDAC db "XOR Hx",0 -0256+ B38D 584F5220487800 -0257+ B394 DDAD db "XOR Lx",0 -0257+ B394 584F52204C7800 -0258+ B39B DDAE db "XOR )",6 -0258+ B39B 584F52202906 -0259+ B3A1 DDB4 db "OR Hx",0 -0259+ B3A1 4F5220487800 -0260+ B3A7 DDB5 db "OR Lx",0 -0260+ B3A7 4F52204C7800 -0261+ B3AD 4F52202906 DDB6 db "OR )",6 -0262+ B3B2 DDBC db "CP Hx",0 -0262+ B3B2 435020487800 -0263+ B3B8 DDBD db "CP Lx",0 -0263+ B3B8 4350204C7800 -0264+ B3BE 4350202906 DDBE db "CP )",6 -0265+ B3C3 DDE1 db "POP Ix",0 -0265+ B3C3 504F5020497800 -0266+ B3CA DDE3 db "EX (SP),Ix",0 -0266+ B3CA 455820285350292C497800 -0267+ B3D5 DDE5 db "PUSH Ix",0 -0267+ B3D5 5055534820497800 -0268+ B3DD DDE9 db "JP (Ix)",0 -0268+ B3DD 4A50202849782900 -0269+ B3E5 DDF9 db "LD SP,Ix",0 -0269+ B3E5 4C442053502C497800 -0270+ B3EE -0271+ B3EE TablCB: -0272+ B3EE dw CB00,CB08,CB10,CB18,CB20,CB28,CB30,CB38 -0272+ B3EE FEB302B406B409B40CB410B414B418B4 -0273+ B3FE -0274+ B3FE 52 4C 43 20 CB00 db "RLC " -0275+ B402 52 52 43 20 CB08 db "RRC " -0276+ B406 52 4C 20 CB10 db "RL " -0277+ B409 52 52 20 CB18 db "RR " -0278+ B40C 53 4C 41 20 CB20 db "SLA " -0279+ B410 53 52 41 20 CB28 db "SRA " -0280+ B414 53 4C 49 20 CB30 db "SLI " -0281+ B418 53 52 4C 20 CB38 db "SRL " -0282+ B41C 42 49 54 20 CB40 db "BIT " -0283+ B420 52 45 53 20 CB80 db "RES " -0284+ B424 53 45 54 20 CBC0 db "SET " -0285+ B428 -0286+ B428 TablED: -0287+ B428 dw ED40,ED41,ED42,ED43,ED44,ED45,ED46,ED47 -0287+ B428 E4B4EDB4F7B401B50AB50EB513B518B5 -0288+ B438 dw ED48,ED49,ED4A,ED4B,ED44,ED4D,ED4E,ED4F -0288+ B438 1FB528B532B53CB50AB545B54AB551B5 -0289+ B448 dw ED50,ED51,ED52,ED53,ED44,ED45,ED56,ED57 -0289+ B448 58B561B56BB575B50AB50EB57EB583B5 -0290+ B458 dw ED58,ED59,ED5A,ED5B,ED44,ED4D,ED5E,ED5F -0290+ B458 8AB593B59DB5A7B50AB545B5B0B5B5B5 -0291+ B468 dw ED60,ED61,ED62,ED63,ED44,ED45,ED46,ED67 -0291+ B468 BCB5C5B5CFB5D9B50AB50EB513B5E2B5 -0292+ B478 dw ED68,ED69,ED6A,ED6B,ED44,ED4D,ED4E,ED6F -0292+ B478 E6B5EFB5F9B503B60AB545B54AB50CB6 -0293+ B488 dw ED70,ED71,ED72,ED73,ED44,ED45,ED56,ED00 -0293+ B488 10B619B623B62DB60AB50EB57EB5DEB4 -0294+ B498 dw ED78,ED79,ED7A,ED7B,ED44,ED4D,ED5E -0294+ B498 36B63FB649B653B60AB545B5B0B5 -0295+ B4A6 dw EDA0,EDA1,EDA2,EDA3,ED00,ED00,ED00,ED00 -0295+ B4A6 5CB660B664B668B6DEB4DEB4DEB4DEB4 -0296+ B4B6 dw EDA8,EDA9,EDAA,EDAB,ED00,ED00,ED00,ED00 -0296+ B4B6 6DB671B675B679B6DEB4DEB4DEB4DEB4 -0297+ B4C6 dw EDB0,EDB1,EDB2,EDB3,ED00,ED00,ED00,ED00 -0297+ B4C6 7EB683B688B68DB6DEB4DEB4DEB4DEB4 -0298+ B4D6 dw EDB8,EDB9,EDBA,EDBB -0298+ B4D6 92B697B69CB6A1B6 -0299+ B4DE -0300+ B4DE ED00 db "NOP *",0 -0300+ B4DE 4E4F50202A00 -0301+ B4E4 ED40 db "IN B,(C)",0 -0301+ B4E4 494E20422C28432900 -0302+ B4ED ED41 db "OUT (C),B",0 -0302+ B4ED 4F5554202843292C4200 -0303+ B4F7 ED42 db "SBC HL,BC",0 -0303+ B4F7 53424320484C2C424300 -0304+ B501 ED43 db "LD (),BC",5 -0304+ B501 4C442028292C424305 -0305+ B50A 4E 45 47 00 ED44 db "NEG",0 -0306+ B50E 5245544E00 ED45 db "RETN",0 -0307+ B513 494D203000 ED46 db "IM 0",0 -0308+ B518 ED47 db "LD I,A",0 -0308+ B518 4C4420492C4100 -0309+ B51F ED48 db "IN C,(C)",0 -0309+ B51F 494E20432C28432900 -0310+ B528 ED49 db "OUT (C),C",0 -0310+ B528 4F5554202843292C4300 -0311+ B532 ED4A db "ADC HL,BC",0 -0311+ B532 41444320484C2C424300 -0312+ B53C ED4B db "LD BC,()",5 -0312+ B53C 4C442042432C282905 -0313+ B545 5245544900 ED4D db "RETI",0 -0314+ B54A ED4E db "IM 0 *",0 -0314+ B54A 494D2030202A00 -0315+ B551 ED4F db "LD R,A",0 -0315+ B551 4C4420522C4100 -0316+ B558 ED50 db "IN D,(C)",0 -0316+ B558 494E20442C28432900 -0317+ B561 ED51 db "OUT (C),D",0 -0317+ B561 4F5554202843292C4400 -0318+ B56B ED52 db "SBC HL,DE",0 -0318+ B56B 53424320484C2C444500 -0319+ B575 ED53 db "LD (),DE",5 -0319+ B575 4C442028292C444505 -0320+ B57E 494D203100 ED56 db "IM 1",0 -0321+ B583 ED57 db "LD A,I",0 -0321+ B583 4C4420412C4900 -0322+ B58A ED58 db "IN E,(C)",0 -0322+ B58A 494E20452C28432900 -0323+ B593 ED59 db "OUT (C),E",0 -0323+ B593 4F5554202843292C4500 -0324+ B59D ED5A db "ADC HL,DE",0 -0324+ B59D 41444320484C2C444500 -0325+ B5A7 ED5B db "LD DE,()",5 -0325+ B5A7 4C442044452C282905 -0326+ B5B0 494D203200 ED5E db "IM 2",0 -0327+ B5B5 ED5F db "LD A,R",0 -0327+ B5B5 4C4420412C5200 -0328+ B5BC ED60 db "IN H,(C)",0 -0328+ B5BC 494E20482C28432900 -0329+ B5C5 ED61 db "OUT (C),H",0 -0329+ B5C5 4F5554202843292C4800 -0330+ B5CF ED62 db "SBC HL,HL",0 -0330+ B5CF 53424320484C2C484C00 -0331+ B5D9 ED63 db "LD (),HL",5 -0331+ B5D9 4C442028292C484C05 -0332+ B5E2 52 52 44 00 ED67 db "RRD",0 -0333+ B5E6 ED68 db "IN L,(C)",0 -0333+ B5E6 494E204C2C28432900 -0334+ B5EF ED69 db "OUT (C),L",0 -0334+ B5EF 4F5554202843292C4C00 -0335+ B5F9 ED6A db "ADC HL,HL",0 -0335+ B5F9 41444320484C2C484C00 -0336+ B603 ED6B db "LD HL,()",5 -0336+ B603 4C4420484C2C282905 -0337+ B60C 52 4C 44 00 ED6F db "RLD",0 -0338+ B610 ED70 db "IN F,(C)",0 -0338+ B610 494E20462C28432900 -0339+ B619 ED71 db "OUT (C),*",0 -0339+ B619 4F5554202843292C2A00 -0340+ B623 ED72 db "SBC HL,SP",0 -0340+ B623 53424320484C2C535000 -0341+ B62D ED73 db "LD (),SP",5 -0341+ B62D 4C442028292C535005 -0342+ B636 ED78 db "IN A,(C)",0 -0342+ B636 494E20412C28432900 -0343+ B63F ED79 db "OUT (C),A",0 -0343+ B63F 4F5554202843292C4100 -0344+ B649 ED7A db "ADC HL,SP",0 -0344+ B649 41444320484C2C535000 -0345+ B653 ED7B db "LD SP,()",5 -0345+ B653 4C442053502C282905 -0346+ B65C 4C 44 49 00 EDA0 db "LDI",0 -0347+ B660 43 50 49 00 EDA1 db "CPI",0 -0348+ B664 49 4E 49 00 EDA2 db "INI",0 -0349+ B668 4F55544900 EDA3 db "OUTI",0 -0350+ B66D 4C 44 44 00 EDA8 db "LDD",0 -0351+ B671 43 50 44 00 EDA9 db "CPD",0 -0352+ B675 49 4E 44 00 EDAA db "IND",0 -0353+ B679 4F55544400 EDAB db "OUTD",0 -0354+ B67E 4C44495200 EDB0 db "LDIR",0 -0355+ B683 4350495200 EDB1 db "CPIR",0 -0356+ B688 494E495200 EDB2 db "INIR",0 -0357+ B68D 4F54495200 EDB3 db "OTIR",0 -0358+ B692 4C44445200 EDB8 db "LDDR",0 -0359+ B697 4350445200 EDB9 db "CPDR",0 -0360+ B69C 494E445200 EDBA db "INDR",0 -0361+ B6A1 4F54445200 EDBB db "OTDR",0 -0362+ B6A6 -0363+ B6A6 -0385 B6A6 include "loadbin.asm" -0001+ B6A6 DD 21 F3 B7 LoadBinDialog ld ix,.LoadBinWnd -0002+ B6AA CD D5 B9 call DialogWindow -0003+ B6AD C9 ret -0004+ B6AE .LoadBinEditFN ;ld hl,.LoadBinFileName -0005+ B6AE ;ld c,20 -0006+ B6AE ;call InputLine.ToBuffer -0007+ B6AE 21 24 0F .L003 ld hl,#0f24 -0008+ B6B1 06 14 ld b,20 -0009+ B6B3 CD 9A 9C call InputLine1 -0010+ B6B6 38 EE jr c,LoadBinDialog -0011+ B6B8 79 ld a,c -0012+ B6B9 A7 and a -0013+ B6BA 28 F2 jr z,.L003 -0014+ B6BC 32 EE B7 ld (.filenamelen),a -0015+ B6BF C5 push bc -0016+ B6C0 11 12 B8 ld de,.LoadBinFileName -0017+ B6C3 CD 98 9E call InputLine.FromBuffer -0018+ B6C6 C1 pop bc -0019+ B6C7 3E 14 ld a,20 -0020+ B6C9 91 sub c -0021+ B6CA 28 07 jr z,.L001 -0022+ B6CC 47 ld b,a -0023+ B6CD 3E 20 ld a,32 -0024+ B6CF 12 .L002 ld (de),a -0025+ B6D0 13 inc de -0026+ B6D1 10 FC djnz .L002 -0027+ B6D3 18 D1 .L001 jr LoadBinDialog -0028+ B6D5 -0029+ B6D5 21 21 10 .EditAddres ld hl,#1021 -0030+ B6D8 06 05 ld b,5 -0031+ B6DA CD 9A 9C call InputLine1 -0032+ B6DD 38 C7 jr c,LoadBinDialog -0033+ B6DF C5 push bc -0034+ B6E0 CD 30 9C call PutAdres -0035+ B6E3 C1 pop bc -0036+ B6E4 38 EF jr c,.EditAddres -0037+ B6E6 22 EF B7 ld (.LoadToAdr),hl -0038+ B6E9 11 2F B8 ld de,.AdresTxt -0039+ B6EC CD 98 9E call InputLine.FromBuffer -0040+ B6EF 18 B5 jr LoadBinDialog -0041+ B6F1 21 31 10 .EditLenght ld hl,#1031 -0042+ B6F4 06 05 ld b,5 -0043+ B6F6 CD 9A 9C call InputLine1 -0044+ B6F9 38 AB jr c,LoadBinDialog -0045+ B6FB C5 push bc -0046+ B6FC CD 30 9C call PutAdres -0047+ B6FF C1 pop bc -0048+ B700 38 EF jr c,.EditLenght -0049+ B702 22 F1 B7 ld (.LoadLen),hl -0050+ B705 11 3F B8 ld de,.LenTxt -0051+ B708 CD 98 9E call InputLine.FromBuffer -0052+ B70B 18 99 jr LoadBinDialog -0053+ B70D .LoadBIN -0054+ B70D AF xor a -0055+ B70E 32 5D AA ld (ClockOn),a -0056+ B711 0E 11 ld c,Dss.Open -0057+ B713 21 12 B8 ld hl,.LoadBinFileName -0058+ B716 E5 push hl -0059+ B717 3A EE B7 ld a,(.filenamelen) -0060+ B71A 16 00 ld d,0 -0061+ B71C 5F ld e,a -0062+ B71D 19 add hl,de -0063+ B71E 22 2B B7 ld (.restadr+1),hl -0064+ B721 36 00 ld (hl),0 -0065+ B723 E1 pop hl -0066+ B724 3E 01 ld a,1 -0067+ B726 D7 rst DssRst -0068+ B727 DA CF B7 jp c,.Err1 -0069+ B72A 21 00 00 .restadr ld hl,0 -0070+ B72D 36 20 ld (hl),32 -0071+ B72F 32 ED B7 ld (.FMid),a -0072+ B732 2A EF B7 ld hl,(.LoadToAdr) -0073+ B735 3E 01 ld a,1 ;рфЁхё т юсырёЄш #0000-7fff? -0074+ B737 CB 7C bit 7,h -0075+ B739 28 08 jr z,.adr0000 -0076+ B73B 3C inc a ;#8000-#bfff? -0077+ B73C CB 74 bit 6,h -0078+ B73E 28 08 jr z,.adr -0079+ B740 3C inc a ;#c000-ffff !!! -0080+ B741 18 05 jr .adr -0081+ B743 CB 74 .adr0000 bit 6,h -0082+ B745 20 01 jr nz,.adr -0083+ B747 97 sub a -0084+ B748 32 EC B7 .adr ld (.bank),a -0085+ B74B CB F4 set 6,h ;рфЁхё чруЁєчъш =>#4XXX -0086+ B74D CB BC res 7,h -0087+ B74F 22 7D B7 ld (.LoadFirst+4),hl -0088+ B752 E5 push hl -0089+ B753 21 00 00 ld hl,0 ;╙чэрхь фышэє Їрщыр -0090+ B756 DD 21 00 00 ld ix,0 -0091+ B75A 06 02 ld b,2 -0092+ B75C 0E 15 ld c,Dss.Move_FP -0093+ B75E D7 rst DssRst -0094+ B75F 22 F1 B7 ld (.LoadLen),HL -0095+ B762 22 A5 B7 ld (.LoadEnd+1),hl -0096+ B765 E1 pop hl -0097+ B766 A7 .Load00 and a -0098+ B767 EB ex hl,de -0099+ B768 11 00 80 ld de,#8000 -0100+ B76B ED 52 sbc hl,de -0101+ B76D 22 7A B7 ld (.LoadFirst+1),hl -0102+ B770 ED 5B A5 B7 ld de,(.LoadEnd+1) -0103+ B774 A7 and a -0104+ B775 ED 52 sbc hl,de -0105+ B777 38 2B jr c,.LoadEnd -0106+ B779 11 00 00 .LoadFirst ld de,0 ;ъюышўхёЄтю срщЄ, ъюЄюЁ√х эрфю ёўшЄрЄ№ т яхЁтє■ срэъє -0107+ B77C 21 00 00 ld hl,0 ;рфЁхё, ъєфр ёърўрЄ№ -0108+ B77F CD DA B7 .LoadNext call .Bank1 -0109+ B782 0E 13 ld c,Dss.Read -0110+ B784 3A ED B7 ld a,(.FMid) -0111+ B787 D7 rst DssRst -0112+ B788 38 3D jr c,.Err -0113+ B78A 21 EC B7 ld hl,.bank -0114+ B78D 34 inc (hl) -0115+ B78E 2A A5 B7 ld hl,(.LoadEnd+1) -0116+ B791 11 00 40 ld de,#4000 -0117+ B794 A7 and a -0118+ B795 ED 52 sbc hl,de -0119+ B797 38 0B jr c,.LoadEnd ;╬ёЄрыюё№ ьхэ№°х 16╩с -0120+ B799 22 A5 B7 ld (.LoadEnd+1),hl -0121+ B79C 21 00 40 ld hl,#4000 -0122+ B79F 11 00 40 ld de,#4000 -0123+ B7A2 18 DB jr .LoadNext -0124+ B7A4 11 00 00 .LoadEnd ld de,0 ;ъюышўхёЄтю срщЄ, ъюЄюЁ√х эхюсїюфшью фюўшЄрЄ№ -0125+ B7A7 CD DA B7 call .Bank1 -0126+ B7AA 21 00 40 ld hl,#4000 -0127+ B7AD 3A ED B7 ld a,(.FMid) -0128+ B7B0 0E 13 ld c,Dss.Read -0129+ B7B2 D7 rst DssRst -0130+ B7B3 38 12 jr c,.Err -0131+ B7B5 3A ED B7 ld a,(.FMid) -0132+ B7B8 0E 12 ld c,Dss.Close -0133+ B7BA D7 rst DssRst -0134+ B7BB -0135+ B7BB 2A EF B7 ld hl,(.LoadToAdr) -0136+ B7BE 22 55 AB ld (ListAdr),hl -0137+ B7C1 3A 40 AB ld a,(WinPage+1) -0138+ B7C4 D3 A2 out (EmmWin.P1),a -0139+ B7C6 C9 ret -0140+ B7C7 F5 .Err push af -0141+ B7C8 3A ED B7 ld a,(.FMid) -0142+ B7CB 0E 12 ld c,Dss.Close -0143+ B7CD D7 rst DssRst -0144+ B7CE F1 pop af -0145+ B7CF FB .Err1 ei -0146+ B7D0 CD 12 95 call ErDss -0147+ B7D3 0E 5C ld c,Dss.PChars ;т√тюф ЄхъёЄр ю°шсъш ш юцшфрэш  any key -0148+ B7D5 D7 rst DssRst -0149+ B7D6 0E 30 ld c,Dss.WaitKey -0150+ B7D8 D7 rst DssRst -0151+ B7D9 C9 ret -0152+ B7DA -0153+ B7DA E5 .Bank1 push hl -0154+ B7DB D5 push de -0155+ B7DC 3A EC B7 ld a,(.bank) -0156+ B7DF 6F ld l,a -0157+ B7E0 26 00 ld h,0 -0158+ B7E2 11 3F AB ld de,WinPage -0159+ B7E5 19 add hl,de -0160+ B7E6 7E ld a,(hl) -0161+ B7E7 D3 A2 out (EmmWin.P1),a -0162+ B7E9 D1 pop de -0163+ B7EA E1 pop hl -0164+ B7EB C9 ret -0165+ B7EC -0166+ B7EC -0167+ B7EC -0168+ B7EC 00 .bank db 0 -0169+ B7ED 00 .FMid db 0 -0170+ B7EE 00 .filenamelen db 0 -0171+ B7EF 00 40 .LoadToAdr dw #4000 -0172+ B7F1 00 10 .LoadLen dw #1000 -0173+ B7F3 .LoadBinWnd db 2,23,13,36,6,7 -0173+ B7F3 02170D240607 -0174+ B7F9 db "Load BIN-file",0 -0174+ B7F9 4C6F61642042494E2D66696C6500 -0175+ B807 db "Filename: " -0175+ B807 46696C656E616D653A2020 -0176+ B812 20 .LoadBinFileName ds 20,32 -0177+ B826 0D db 0X0D -0178+ B827 db "Addres: " -0178+ B827 4164647265733A20 -0179+ B82F .AdresTxt db "#4000 Lenght: " -0179+ B82F 23343030302020204C656E6768743A20 -0180+ B83F 2331303030 .LenTxt db "#1000" -0181+ B844 db 0x16,10+23,4+13,"OK Cancel",0 -0181+ B844 1621114F4B2020202020202043616E63656C00 -0182+ B857 05 db 5 -0183+ B858 23 0F 16 02 db 35,15,22,2 ;Filename -0184+ B85C 00 00 AE B6 dw 0,.LoadBinEditFN -0185+ B860 20 10 07 02 db 32,16,7,2 ;Addres -0186+ B864 00 00 D5 B6 dw 0,.EditAddres -0187+ B868 30 10 07 02 db 48,16,7,2 ;Lenght -0188+ B86C 00 00 F1 B6 dw 0,.EditLenght -0189+ B870 1E 11 08 02 db 30,17,8,2 ;OK -0190+ B874 00 00 0D B7 dw 0,.LoadBIN -0191+ B878 29 11 08 02 db 41,17,8,2 ;Cancel -0192+ B87C 00 00 00 00 dw 0,0 -0386 B880 include "windows.asm" -0001+ B880 -0002+ B880 ;IX - WINDOW DESCRIPTOR -0003+ B880 ;+0 - FLAG: -0004+ B880 ; BITS: 0 - STANDART WINDOW -0005+ B880 ; 1 - 0 - WITHOUT HEADER / 1 - WITH HEADER -0006+ B880 ; 2 - 0 - ORDINARY FRAME / 1 - DOUBLE FRAME -0007+ B880 ;+1 - X COORD -0008+ B880 ;+2 - Y COORD -0009+ B880 ;+3 - LENGHT -0010+ B880 ;+4 - HEIGHT -0011+ B880 ;+5 - ATTR -0012+ B880 -0013+ B880 -0014+ B880 DD CB 00 46 Windows BIT 0,(IX+0) -0015+ B884 28 13 JR Z,NO_STAND_WIN -0016+ B886 DD 7E 01 LD A,(IX+1) -0017+ B889 11 FC FF LD DE,-4 -0018+ B88C DD 19 ADD IX,DE -0019+ B88E DD E5 PUSH IX -0020+ B890 DD 21 50 BA LD IX,STANDART -0021+ B894 DD 77 05 LD (IX+5),A -0022+ B897 18 02 JR STAND_WIN -0023+ B899 NO_STAND_WIN -0024+ B899 DD E5 PUSH IX -0025+ B89B STAND_WIN -0026+ B89B CD 09 B9 CALL Rectang -0027+ B89E CD 2E B9 CALL Frame -0028+ B8A1 DD CB 00 4E BIT 1,(IX+0) -0029+ B8A5 C4 EE B8 CALL NZ,WinHeader -0030+ B8A8 E1 POP HL -0031+ B8A9 ; PUSH HL -0032+ B8A9 11 06 00 LD DE,6 -0033+ B8AC 19 ADD HL,DE -0034+ B8AD DD CB 00 4E bit 1,(ix+0) -0035+ B8B1 DD 7E 05 ld a,(IX+5) -0036+ B8B4 28 23 jr z,WinNoHeader -0037+ B8B6 0F RRCA -0038+ B8B7 0F RRCA -0039+ B8B8 0F RRCA -0040+ B8B9 0F RRCA -0041+ B8BA E6 7F AND #7F -0042+ B8BC 32 5C 8E ld (PrnStrColor.L1+5),a -0043+ B8BF E5 push hl -0044+ B8C0 CD CC B9 call MenuItemLen -0045+ B8C3 DD 7E 03 ld a,(ix+3) -0046+ B8C6 98 sbc a,b -0047+ B8C7 DD 5E 01 ld e,(ix+1) -0048+ B8CA A7 and a -0049+ B8CB 1F rra -0050+ B8CC 83 add a,e -0051+ B8CD 5F ld e,a -0052+ B8CE DD 56 02 ld d,(ix+2) -0053+ B8D1 E1 pop hl -0054+ B8D2 CD 32 8E CALL PrnStrColor -0055+ B8D5 23 inc hl -0056+ B8D6 DD 7E 05 ld a,(IX+5) -0057+ B8D9 WinNoHeader -0058+ B8D9 32 5C 8E ld (PrnStrColor.L1+5),a -0059+ B8DC DD 56 02 ld d,(ix+2) ;╩ююЁфшэрЄ√ т юъэх -0060+ B8DF DD 5E 01 ld e,(ix+1) -0061+ B8E2 14 inc d -0062+ B8E3 14 inc d -0063+ B8E4 1C inc e -0064+ B8E5 1C inc e -0065+ B8E6 7B ld a,e -0066+ B8E7 32 66 8E ld (PrtXCoord),a -0067+ B8EA ; LD (WINDOW_TXT),HL -0068+ B8EA CD 32 8E CALL PrnStrColor -0069+ B8ED ; EX (DE),HL -0070+ B8ED C9 RET -0071+ B8EE -0072+ B8EE ;╨шёютрэшх чруюыютър юъэр -0073+ B8EE WinHeader -0074+ B8EE DD 5E 01 LD E,(IX+1) -0075+ B8F1 DD 56 02 LD D,(IX+2) -0076+ B8F4 DD 6E 03 LD L,(IX+3) -0077+ B8F7 26 01 LD H,1 -0078+ B8F9 DD 7E 05 LD A,(IX+5) -0079+ B8FC 0F RRCA -0080+ B8FD 0F RRCA -0081+ B8FE 0F RRCA -0082+ B8FF 0F RRCA -0083+ B900 E6 7F AND #7F -0084+ B902 47 LD B,A -0085+ B903 3E 20 LD A,#20 -0086+ B905 CD 1E B9 CALL FillBox -0087+ B908 C9 RET -0088+ B909 -0089+ B909 ;╧ЁюЎхфєЁр юётюсюцфхэш  яЁ ьюєуюы№эющ яыю∙рфш юъэр -0090+ B909 ;═р тїюф: IX - рфЁхё юяшёрЄхы  -0091+ B909 DD 5E 01 Rectang LD E,(IX+1) -0092+ B90C DD 56 02 LD D,(IX+2) -0093+ B90F DD 66 04 LD H,(IX+4) -0094+ B912 DD 6E 03 LD L,(IX+3) -0095+ B915 DD 46 05 LD B,(IX+5) -0096+ B918 3E 20 LD A,#20 -0097+ B91A CD 1E B9 CALL FillBox -0098+ B91D C9 RET -0099+ B91E -0100+ B91E E5 FillBox PUSH HL -0101+ B91F D5 PUSH DE -0102+ B920 0E 58 FillB1 LD C,Dss.WrChar -0103+ B922 D7 RST DssRst -0104+ B923 1C INC E -0105+ B924 2D DEC L -0106+ B925 20 F9 JR NZ,FillB1 -0107+ B927 D1 POP DE -0108+ B928 E1 POP HL -0109+ B929 14 INC D -0110+ B92A 25 DEC H -0111+ B92B 20 F1 JR NZ,FillBox -0112+ B92D C9 RET -0113+ B92E -0114+ B92E -0115+ B92E 21 56 BA Frame LD HL,FrameType1 -0116+ B931 DD CB 00 56 BIT 2,(IX+0) ;windows type flag -0117+ B935 28 03 JR Z,Frame1 -0118+ B937 21 5C BA LD HL,FrameType2 -0119+ B93A DD 56 02 Frame1 LD D,(IX+2) -0120+ B93D DD 5E 01 LD E,(IX+1) -0121+ B940 DD 46 05 LD B,(IX+5) -0122+ B943 D5 PUSH DE -0123+ B944 E5 PUSH HL -0124+ B945 ; PUSH BC -0125+ B945 7E LD A,(HL) -0126+ B946 0E 58 LD C,Dss.WrChar -0127+ B948 D7 RST DssRst -0128+ B949 ; POP BC -0129+ B949 E1 POP HL -0130+ B94A D1 POP DE -0131+ B94B DD 7E 03 LD A,(IX+3) -0132+ B94E 3D DEC A -0133+ B94F 83 ADD A,E -0134+ B950 5F LD E,A -0135+ B951 23 INC HL -0136+ B952 7E LD A,(HL) -0137+ B953 0E 58 LD C,Dss.WrChar -0138+ B955 D5 PUSH DE -0139+ B956 E5 PUSH HL -0140+ B957 D7 RST DssRst -0141+ B958 E1 POP HL -0142+ B959 D1 POP DE -0143+ B95A DD 7E 04 LD A,(IX+4) -0144+ B95D 3D DEC A -0145+ B95E 82 ADD A,D -0146+ B95F 57 LD D,A -0147+ B960 23 INC HL -0148+ B961 7E LD A,(HL) -0149+ B962 D5 PUSH DE -0150+ B963 E5 PUSH HL -0151+ B964 0E 58 LD C,Dss.WrChar -0152+ B966 D7 RST DssRst -0153+ B967 E1 POP HL -0154+ B968 D1 POP DE -0155+ B969 DD 5E 01 LD E,(IX+1) -0156+ B96C 23 INC HL -0157+ B96D 7E LD A,(HL) -0158+ B96E 0E 58 LD C,Dss.WrChar -0159+ B970 D7 RST DssRst -0160+ B971 ;HORIZONTAL LINES -0161+ B971 23 INC HL -0162+ B972 7E LD A,(HL) -0163+ B973 32 93 B9 LD (FramHor),A -0164+ B976 23 INC HL -0165+ B977 E5 PUSH HL -0166+ B978 DD 66 02 LD H,(IX+2) -0167+ B97B DD 7E 04 LD A,(IX+4) -0168+ B97E 3D DEC A -0169+ B97F 84 ADD A,H -0170+ B980 6F LD L,A -0171+ B981 DD 7E 03 LD A,(IX+3) -0172+ B984 D6 02 SUB 2 -0173+ B986 0E 58 LD C,Dss.WrChar -0174+ B988 DD 5E 01 LD E,(IX+1) -0175+ B98B 1C INC E -0176+ B98C DD 46 05 LD B,(IX+5) -0177+ B98F F5 FramHl1 PUSH AF -0178+ B990 E5 PUSH HL -0179+ B991 54 LD D,H -0180+ B992 3E 00 LD A,0 -0181+ B994 FramHor EQU $-1 -0182+ B994 F5 PUSH AF -0183+ B995 D7 RST DssRst -0184+ B996 F1 POP AF -0185+ B997 55 LD D,L -0186+ B998 D7 RST DssRst -0187+ B999 E1 POP HL -0188+ B99A F1 POP AF -0189+ B99B 1C INC E -0190+ B99C 3D DEC A -0191+ B99D 20 F0 JR NZ,FramHl1 -0192+ B99F E1 POP HL -0193+ B9A0 ;VERTICAL LINES -0194+ B9A0 7E LD A,(HL) -0195+ B9A1 32 BF B9 LD (FramVer),A -0196+ B9A4 DD 66 01 LD H,(IX+1) -0197+ B9A7 DD 7E 03 LD A,(IX+3) -0198+ B9AA 3D DEC A -0199+ B9AB 84 ADD A,H -0200+ B9AC 6F LD L,A -0201+ B9AD DD 7E 04 LD A,(IX+4) -0202+ B9B0 D6 02 SUB 2 -0203+ B9B2 0E 58 LD C,Dss.WrChar -0204+ B9B4 DD 56 02 LD D,(IX+2) -0205+ B9B7 14 INC D -0206+ B9B8 DD 46 05 LD B,(IX+5) -0207+ B9BB F5 FramVl1 PUSH AF -0208+ B9BC E5 PUSH HL -0209+ B9BD 5C LD E,H -0210+ B9BE 3E 00 LD A,0 -0211+ B9C0 FramVer EQU $-1 -0212+ B9C0 F5 PUSH AF -0213+ B9C1 D7 RST DssRst -0214+ B9C2 F1 POP AF -0215+ B9C3 5D LD E,L -0216+ B9C4 D7 RST DssRst -0217+ B9C5 E1 POP HL -0218+ B9C6 F1 POP AF -0219+ B9C7 14 INC D -0220+ B9C8 3D DEC A -0221+ B9C9 20 F0 JR NZ,FramVl1 -0222+ B9CB C9 RET -0223+ B9CC -0224+ B9CC ;╦╚╤╥└┼╥ ─╬ ╤╦┼─╙▐┘┼├╬ ╧╙═╩╥└ ╠┼═▐ -0225+ B9CC MenuItemLen -0226+ B9CC 06 00 LD B,0 -0227+ B9CE NextMnuItem -0228+ B9CE 7E LD A,(HL) -0229+ B9CF 23 INC HL -0230+ B9D0 A7 AND A -0231+ B9D1 C8 RET Z -0232+ B9D2 04 INC B -0233+ B9D3 18 F9 JR NextMnuItem -0234+ B9D5 -0235+ B9D5 -0236+ B9D5 ;╧ЁюЁшёютър юъэр ш юсЁрсюЄър фшрыюур -0237+ B9D5 DialogWindow -0238+ B9D5 CD 80 B8 call Windows -0239+ B9D8 23 inc hl -0240+ B9D9 ; jp WinDialog -0241+ B9D9 -0242+ B9D9 ;╧╧ юсЁрсюЄъш фшрыюуютюую юъэр -0243+ B9D9 ;Dialogs -0244+ B9D9 ;+0 (1) - Count of Items -0245+ B9D9 ;+1 (N) - Item Descriptor -0246+ B9D9 ;Descriptor -0247+ B9D9 ; +0 - X -0248+ B9D9 ; +1 - Y -0249+ B9D9 ; +2 - Len -0250+ B9D9 ; +3 - Attrib -0251+ B9D9 ; +4 (2) - Hot Key -0252+ B9D9 ; +6 (2) - Routine -0253+ B9D9 -0254+ B9D9 WinDialog: -0255+ B9D9 7E ld a,(hl) -0256+ B9DA 32 4E BA ld (DlgItemsCnt),a -0257+ B9DD 23 inc hl -0258+ B9DE 22 EF B9 ld (.DialogAdr),hl -0259+ B9E1 AF xor a -0260+ B9E2 32 4F BA ld (SelectedItem),a -0261+ B9E5 3A 4F BA .Lp1 ld a,(SelectedItem) -0262+ B9E8 6F ld l,a -0263+ B9E9 26 00 ld h,0 -0264+ B9EB 29 add hl,hl -0265+ B9EC 29 add hl,hl -0266+ B9ED 29 add hl,hl -0267+ B9EE 11 00 00 ld de,0 -0268+ B9F1 .DialogAdr equ $-2 -0269+ B9F1 19 add hl,de -0270+ B9F2 5E ld e,(hl) -0271+ B9F3 23 inc hl -0272+ B9F4 56 ld d,(hl) -0273+ B9F5 23 inc hl -0274+ B9F6 46 ld b,(hl) -0275+ B9F7 EB ex hl,de -0276+ B9F8 CD D3 91 call CursorSet -0277+ B9FB 0E 31 .Lp2 ld c,Dss.ScanKey -0278+ B9FD D7 rst DssRst -0279+ B9FE 28 FB jr z,.Lp2 -0280+ BA00 7A ld a,d -0281+ BA01 FE 52 cp #52 ; -0282+ BA03 20 13 jr nz,.Lp3 -0283+ BA05 3A 4E BA .LpDn ld a,(DlgItemsCnt) -0284+ BA08 47 ld b,a -0285+ BA09 3A 4F BA ld a,(SelectedItem) -0286+ BA0C 3C inc a -0287+ BA0D B8 cp b ;─юёЄшуыш ьръёшьры№эюую яєэъЄр -0288+ BA0E 28 EB jr z,.Lp2 -0289+ BA10 32 4F BA .Lp4 ld (SelectedItem),a -0290+ BA13 CD 35 92 call CursorRes -0291+ BA16 18 CD jr .Lp1 -0292+ BA18 FE 58 .Lp3 cp #58 ; -0293+ BA1A 20 09 jr nz,.Lp5 -0294+ BA1C 3A 4F BA .LpUp ld a,(SelectedItem) -0295+ BA1F A7 and a -0296+ BA20 28 D9 jr z,.Lp2 -0297+ BA22 3D dec a -0298+ BA23 18 EB jr .Lp4 -0299+ BA25 FE 54 .Lp5 cp #54 ; -0300+ BA27 28 F3 jr z,.LpUp -0301+ BA29 FE 56 cp #56 ; -0302+ BA2B 28 D8 jr z,.LpDn -0303+ BA2D .LpAscii -0304+ BA2D 7B ld a,e ;ASCII - ъюф -0305+ BA2E FE 0D cp #0D ; -0306+ BA30 20 C9 jr nz,.Lp2 -0307+ BA32 CD 35 92 call CursorRes -0308+ BA35 3A 4F BA ld a,(SelectedItem) -0309+ BA38 6F ld l,a -0310+ BA39 26 00 ld h,0 -0311+ BA3B 29 add hl,hl -0312+ BA3C 29 add hl,hl -0313+ BA3D 29 add hl,hl -0314+ BA3E ED 5B EF B9 ld de,(.DialogAdr) -0315+ BA42 19 add hl,de -0316+ BA43 11 06 00 ld de,6 -0317+ BA46 19 add hl,de -0318+ BA47 ifdef DEBUG -0319+ BA47~ push hl -0320+ BA47~ ld de,0 -0321+ BA47~ call PrintReg -0322+ BA47~ pop hl -0323+ BA47 endif -0324+ BA47 7E ld a,(hl) -0325+ BA48 23 inc hl -0326+ BA49 66 ld h,(hl) -0327+ BA4A 6F ld l,a -0328+ BA4B B4 or h -0329+ BA4C C8 ret z ;┼ёыш рфЁхё =0, Єю RET -0330+ BA4D ifdef DEBUG -0331+ BA4D~ push hl -0332+ BA4D~ ld de,8 -0333+ BA4D~ call PrintReg -0334+ BA4D~ pop hl -0335+ BA4D endif -0336+ BA4D E9 jp (hl) -0337+ BA4E DlgItemsCnt -0338+ BA4E 00 DB 0 -0339+ BA4F SelectedItem -0340+ BA4F 00 DB 0 -0341+ BA50 STANDART; TYPE, X, Y, L,H,COLOR -0342+ BA50 DEFB 5,10,13,#20,6,7 -0342+ BA50 050A0D200607 -0343+ BA56 -0344+ BA56 ;Ordinary frame -0345+ BA56 FrameType1 -0346+ BA56 DB #DA,#BF,#D9,#C0,#C4,#B3 -0346+ BA56 DABFD9C0C4B3 -0347+ BA5C ;Double frame -0348+ BA5C FrameType2 -0349+ BA5C DB #C9,#BB,#BC,#C8,#CD,#BA -0349+ BA5C C9BBBCC8CDBA -0387 BA62 -0388 BA62 EndOfDaemon -0389 BA62 savebin "demon.exe",STARTPRG,EndOfDaemon-STARTPRG - -Value Label ------- - ----------------------------------------------------------- -0x7F00 STARTPRG -0x8100 OrgAdr -0x00C2 EmmWin.P2 -0xAB1E BankDebug -0x0082 EmmWin.P0 -0xAB1F BankOS -0x8DAC SaveAllRegs -0xAB3F WinPage -0x8114 X CmdLine -0x8122 CmdLine.L1 -0x9480 FDebug -0x0043 Dss.GSwitch -0x0010 DssRst -0x92CE LoadFile -0x82AA Start -0x8128 HorizLine -0x8149 VerticalLine -0x815E Corner -0x81DA TextStrReg -0x8220 TextStrLogo -0x8270 TextStrWin -0x8289 TextStrRez -0x8290 DrawLine -0x829A DrawLine.L1 -0x0058 Dss.WrChar -0xAA62 Hello -0x005C Dss.PChars -0x0051 Dss.GetVMod -0x8809 Exit -0xAA60 OSGrafMode -0xAA5F OSScreen -0x003D Dss.GetMem -0xAA61 BufPage -0xAA5E DemonScreen -0x82DD StartNext -0x0059 Dss.WinCopy -0x0050 Dss.SetVMod -0x82E6 X StartNext.lp1 -0x8301 ClearScreen -0x830F DrawDemonScreen -0x8800 Start1 -0x82EF RefreshScreen -0x9235 CursorRes -0x883C Refresh -0x99B3 Cursor -0x91D3 CursorSet -0xAB11 Color.Screen -0x0089 Bios.Lp_Cls_Win -0x0008 BiosRst -0xAB12 Color.Border -0x8332 DrawCorner -0xAB13 Color.TextStrReg -0x8E57 PrnStrColor.L1 -0x8E32 PrnStrColor -0xAB14 Color.TextStrWin -0xAB18 Color.TextStrLogo -0xAB17 Color.RezArea -0x9EE4 PreparChar -0x9851 Keyb -0x9F30 Rst38.Vect -0x8837 ExitNext -0x005A Dss.WinRest -0x003E Dss.FreeMem -0x0041 Dss.Exit -0x883B X Return -0xAB25 Reg._IX -0x8F13 PrintStrReg -0xAB27 Reg._IY -0xAB29 Reg._HL -0xAB2B Reg._DE -0xAB2D Reg._BC -0xAB31 Reg._HL_ -0xAB33 Reg._DE_ -0xAB35 Reg._BC_ -0xAB2F Reg._AF -0x8E9D PrintStrAF -0xAB37 Reg._AF_ -0xAB3D Reg._PC -0x8E67 PrintReg -0xAB39 Reg._IR -0xAB3B Reg._SP -0x8FAE PrintSPDn -0xAB20 RezAdr -0x8F76 PrintStrWin -0x8FF5 PrintStrSP -0x9067 PrintDump -0x8954 DisAsm -0x88CB DemonHelp -0x88D5 HelpWnd -0xB9D5 DialogWindow -0x894B X HelpWndDlg -0x0000 X Dss.Version -0x0001 X Dss.ChDisk -0x0002 X Dss.CurDisk -0x0003 X Dss.DskInfo -0x0009 X Dss.BOOTDSK -0x000A Dss.Create -0x000B X Dss.Creat_N -0x000E X Dss.Delete -0x0010 X Dss.Rename -0x0011 Dss.Open -0x0012 Dss.Close -0x0013 Dss.Read -0x0014 Dss.Write -0x0015 Dss.Move_FP -0x0016 X Dss.Attrib -0x0017 X Dss.Get_D_T -0x0018 X Dss.Put_D_T -0x0019 X Dss.F_First -0x001A X Dss.F_Next -0x001B X Dss.MkDir -0x001C X Dss.RmDir -0x001D X Dss.ChDir -0x001E X Dss.CurDir -0x0021 Dss.SysTime -0x0022 X Dss.SetTime -0x0030 Dss.WaitKey -0x0031 Dss.ScanKey -0x0032 X Dss.EchoKey -0x0033 X Dss.CTRLKey -0x0035 X Dss.K_CLEAR -0x0036 X Dss.K_SETUP -0x0037 X Dss.TESTKEY -0x0038 X Dss.SetWin -0x0039 Dss.SetWin1 -0x003A X Dss.SetWin2 -0x003B Dss.SetWin3 -0x003C X Dss.INFOMEM -0x003F X Dss.SetMem -0x0040 X Dss.Exec -0x0042 X Dss.Wait -0x0044 X Dss.DosName -0x0045 X Dss.EX_Path -0x0046 X Dss.Environ -0x0047 X Dss.AppInfo -0x0052 X Dss.Locate -0x0053 X Dss.Cursor -0x0054 Dss.SelPage -0x0055 X Dss.Scroll -0x0056 X Dss.Clear -0x0057 Dss.RdChar -0x005B X Dss.PutChar -0x005F X Dss.Print -0x00C0 X Bios.Emm_Fn0 -0x00C1 X Bios.Emm_Fn1 -0x00C2 X Bios.Emm_Fn2 -0x00C3 X Bios.Emm_Fn3 -0x00C4 Bios.Emm_Fn4 -0x00C5 X Bios.Emm_Fn5 -0x00C6 X Bios.Emm_Fn6 -0x00C7 X Bios.Emm_Fn7 -0x00C8 X Bios.Emm_Fn8 -0x00C9 X Bios.Emm_Fn9 -0x00B0 X Bios.Win_Open -0x00B1 X Bios.Win_Close -0x00B2 X Bios.Win_Copy_Win -0x00B3 X Bios.Win_Restore_Win -0x00B4 Bios.Win_Get_Sym -0x00B5 Bios.Win_Put_Sym -0x00B6 Bios.Win_Set_ZG -0x00B7 X Bios.Win_Move_Win -0x00B8 Bios.Win_Get_ZG -0x0081 X Bios.Lp_Print_All -0x0082 X Bios.Lp_Print_Sym -0x0083 Bios.Lp_Print_Atr -0x0084 Bios.Lp_Set_Place -0x0085 X Bios.Lp_Print_Ln -0x0086 Bios.Lp_Print_Ln2 -0x0087 X Bios.Lp_Print_Ln3 -0x0088 X Bios.Lp_Print_Ln4 -0x008A X Bios.Lp_Scroll_Up -0x008B X Bios.Lp_Print_Ln5 -0x008C X Bios.Lp_Print_Ln6 -0x008D X Bios.Lp_Cls_Win2 -0x008E X Bios.Lp_Get_Place -0x0051 X Bios.Drv_Reset -0x0054 X Bios.Drv_Verify -0x0055 X Bios.Drv_Read -0x0056 X Bios.Drv_Write -0x0057 X Bios.Drv_Detect -0x0058 X Bios.Drv_Get_Par -0x0059 X Bios.Drv_Set_Par -0x005A X Bios.Ext_Version -0x005F X Bios.Drv_List -0x00A2 EmmWin.P1 -0x00E2 EmmWin.P3 -0xAB55 ListAdr -0x895A DisAsm.L1 -0x899B AttrList -0x8970 X DisAsm.L2 -0x8A42 List -0xAB7D ListFormat -0x8A0C LFormat -0x8D87 List.String -0x9BC3 KList.Descript -0x89AE AttrList.L2 -0xAB16 Color._PC -0x89CE AttrList.L0 -0xA664 Rezident.End -0xA5E7 Rezident -0x92C4 AdrArea -0x89CB AttrList.L3 -0x89D5 AttrList.L1 -0x89DF UpAdres -0x926C Ld_a_hl -0x89F8 UpAdres.L1 -0x8A13 LFormat.L2 -0x8A1F LFormat.Exit -0x8A21 LFormat.L1 -0x8A39 LFormat.L3 -0x8DA7 List.Byte -0x8A6B List.L43 -0x8B04 List.L30 -0x8A70 List.L42 -0x8D6A List.IRS1 -0x8BE8 List.L9 -0x8CA6 List.L13 -0x8AB1 List.L40 -0xB067 CodeDDFD -0x8AA5 List.L45 -0xB4DE ED00 -0xB0BC TablDDFD -0x8BD3 List.L_12 -0x8AE9 List.L44 -0x8CF7 List.ComCBBit -0x8AE4 List.L41 -0x8D1D List.NomBit -0x8D59 List.IndexRegSh -0x8AF8 List.L46 -0x8D04 List.ComCBSh -0x8D2C List.RegName -0x9174 ConvHexStr -0x8B3D List.L20 -0x8B23 List.L31 -0x8D4A List.HLReg -0x8B6E List.L10 -0x8B69 List.L21 -0xB428 TablED -0x8BDF List.L_2 -0xABCF Tabl00_3F -0xAE02 TablC0_FF -0x8BB0 List.L8 -0xB026 MHALT -0x8BFA List.L1 -0xB02B TablM -0x8DA8 List.TablAdr -0x8DAA List.StrAdr -0x8CB2 List.LE -0x8C1B List.L3 -0x8CB8 List.TwoByteCom -0x8C28 List.L4 -0x8CD0 List.ThreeByteCom -0x8C54 List.L7 -0x913D NumToStr16 -0x8C64 List.L5 -0x8C92 List.L6 -0x8C78 List.L11 -0x915E NumToStr8 -0xB41C CB40 -0x8D11 List.ComCBSh1 -0xB3EE TablCB -0x8D46 List.RN1 -0x8DF5 RestAllRegs -0x8E41 PrnStrColor.L2 -0x8E66 PrtXCoord -0x8E4C PrnStrColor.L3 -0x8E63 PrnStrColor.L4 -0xAB7E DecHex -0x8E7B PrintReg.Hex -0x8E98 PrintReg.String -0x9191 ConvDecStr -0x8E8F PrintReg.Print -0x8EFE PrintStrAF.String -0x8EAB PrintStrAF.L1 -0x9127 ReplSymNoPrint -0x8F0B PrintStrAF.Flags -0x8EC8 PrintStrAF.L2 -0x9247 Ld_a_bc -0x8F68 PrintStrReg.String -0x8F95 PrintStrWin.String -0x8F7E PrintStrWin.L1 -0xAB22 StackDown -0x8FBC PrintSPDn.L1 -0x8FF1 PrintSPDn.String -0x91AF ConvDecStr8 -0x9066 PrintStrSP.StrSp -0x9008 PrintStrSP.L4 -0xAB23 StackDump -0x9015 PrintStrSP.L3 -0x902E PrintStrSP.L2 -0xAB15 Color._SP -0x9038 PrintStrSP.L1 -0xAB43 Dump1 -0x9097 PrintStrDump -0xAB45 Dump -0x90EE PrintStrDump.String -0x90A6 PrintStrDump.L1 -0xAA5C SymbolNoPrint -0x912B ReplSymNoPrint.L1 -0x9165 X NumToStr8.Hex -0x91BE ConvDecStr8_1 -0x9209 CursorSet.Buffer -0x9242 CursorRes.L1 -0xAB19 Color.Cursor -0x91F8 CursorSet.L1 -0x925C Ld_a_bc.L1 -0x928F Ld_a_hl.L1 -0x9281 Ld_a_hl.L2 -0x9297 Ld_hl_a -0x92AF Ld_hl_a.L2 -0x92A4 Ld_hl_a.L1 -0x92BC Ld_hl_a.L3 -0xAA5D ClockOn -0xAAFE Str.Load -0x92EC LoadExe -0x00FF On -0x9505 PrErDss -0x947F FId -0x934A LoadExe.L1 -0x9503 FRam -0x9388 LoadExe.L2 -0x939D LoadExe.L6 -0x9452 NBank -0x947C MemId -0x93A8 LoadExe.L5 -0x93CE LoadExe.L4 -0x9478 BankP -0x9417 LoadExe.L7 -0x9436 LoadExe.L8 -0x9442 LoadExe.L9 -0x944E LoadExe.L10 -0x946C NBank.L5 -0x9464 NBank.L2 -0x9465 NBank.L1 -0x9475 NBank.L3 -0x9501 X FStart -0x9512 ErDss -0xAB0E Str.DA -0x0026 ErDss.MaxError -0x97C1 ErDss.Tabl -0x9527 ErDss.e01 -0x9538 ErDss.e02 -0x954D ErDss.e03 -0x955C ErDss.e04 -0x956B ErDss.e05 -0x957A ErDss.e06 -0x958E ErDss.e07 -0x95A2 ErDss.e08 -0x95B1 ErDss.e09 -0x95BF ErDss.e0A -0x95CD ErDss.e0B -0x95E1 ErDss.e0C -0x9600 ErDss.e0D -0x960E ErDss.e0E -0x9620 ErDss.e0F -0x9630 ErDss.e10 -0x9641 ErDss.e11 -0x9652 ErDss.e12 -0x9669 ErDss.e13 -0x9677 ErDss.e14 -0x9681 ErDss.e15 -0x968C ErDss.e16 -0x969D ErDss.e17 -0x96A7 ErDss.e18 -0x96B5 ErDss.e19 -0x96C0 ErDss.e1A -0x96CC ErDss.e1B -0x96DA ErDss.e1C -0x96ED ErDss.e1D -0x9700 ErDss.e1E -0x9712 ErDss.e1F -0x9727 ErDss.e20 -0x973A ErDss.e21 -0x974D ErDss.e22 -0x9760 ErDss.e23 -0x976F ErDss.e24 -0x979F ErDss.e25 -0x97AA ErDss.e26 -0x980D Clock -0x983E Clock.String -0x98CD Keyb.L100 -0x9877 Keyb.L1 -0x99B2 Keyb.WinScreen -0x9884 Keyb.L10 -0x99A0 Keyb.L0 -0x9897 Keyb.L11 -0x98BB Keyb.L12 -0x9CAA InputLine -0x9C30 PutAdres -0xA1E7 KReg.Rez -0x993B Keyb.L202 -0x9916 Keyb.L200 -0x994E Keyb.L203 -0x98CA X Keyb.L13 -0x98F9 Keyb.NoRest -0x9924 Keyb.L208 -0x991E Keyb.NoExit -0x992D Keyb.L207 -0xB6A6 LoadBinDialog -0x9935 Keyb.L201 -0x0000 Off -0xA97B Step.Flag -0xA664 Step -0x9974 Keyb.L204 -0x9BD1 AdrListTabl -0x9987 Keyb.L205 -0x9991 Keyb.L206 -0xA9FA SaveScr -0xAB7F ExitDlg -0x9A1C KList -0xA3FC KDump -0x9FAE KReg -0xA2A4 KStack -0x99D7 Cursor.L1 -0x99EF Cursor.L2 -0x9A07 Cursor.L3 -0xA3F3 KStack.Coordinate -0xA3F5 KStack.Descript -0xA3A4 KStack.L201 -0x9BC1 KList.Coordinate -0x9B43 KList.L201 -0xA5A0 KDump.Coordinate -0xA5A2 KDump.Descript -0xA4FA KDump.L201 -0xA206 KReg.DescCalc -0xA04A KReg.L201 -0x9A90 KList.L100 -0x9A28 KList.L10 -0x9A3C KList.L20 -0x9B9C KList.NewLA1 -0x9A5A KList.L21 -0x9BA3 KList.CtrlTabl -0x9BDF AdrCtrlTabl -0x9A79 KList.L22 -0x9BA2 KList.CtrlWin -0x9B8E KList.NewLA -0x9B3C KList.L200 -0x9AAC KList.L101 -0x9AC0 KList.L102 -0x9AD8 KList.L103 -0x9AD1 KList.L104 -0x9AF0 KList.L105 -0x9AE9 KList.L107 -0x9B05 KList.L108 -0x9AFE KList.L106 -0x9B23 KList.L110 -0x9B1C KList.L109 -0x9B2F KList.L111 -0x9B5A KList.NewPCAdr -0x9B83 KList.InAdres -0x9B68 KList.InCode -0x9BF1 PutCode -0x9C2C PutCode.Buffer -0x9EB8 InputLine.Buffer -0x9C1C PutCode.L3 -0x9C09 PutCode.L2 -0x9C4C PutHex -0x9C91 CapsLetter -0x9C6F PutDec -0x9C8A Numeric -0x9C5F PutHex.L1 -0x9C9A InputLine1 -0x9CA3 InputLineEd -0xAB1B Color.InLineEd -0xAB1A Color.InLine -0x9EB2 InputLine.EntEnd -0x9D34 InputLine.L15 -0x9FAA CursPos -0x9EB3 InputLine.Coordinate -0x9EB5 InputLine.Pos -0x9CCB InputLine.L1 -0x9E1C InputLine.PrintInLine -0x9E05 InputLine.EndString -0x9CDE InputLine.L100 -0x9FA6 CursOnOff -0x9D39 InputLine.L3 -0x9EB6 InputLine.Color -0x9E32 InputLine.ClearInLine -0x9DEA InputLine.HomeString -0x9E7A InputLine.NextPos -0x9D26 InputLine.L12 -0x9FA8 CursInsOvr -0x9EB7 InputLine.Len -0x9F85 ResCurs -0x9D4F InputLine.L14 -0x9D43 InputLine.L13 -0x9D54 InputLine.L2 -0x9E63 InputLine.EndPos -0x9D86 InputLine.L9 -0x9D66 InputLine.L11 -0x9D9F InputLine.L10 -0x9E4A InputLine.ColorInLine -0x9DAB InputLine.L5 -0x9DC4 InputLine.L6 -0x9DDD InputLine.L7 -0x9DF9 InputLine.L8 -0x9E8F InputLine.L16 -0x9E98 InputLine.FromBuffer -0x9E9D InputLine.FB1 -0x9EA6 X InputLine.ToBuffer -0x9EA9 InputLine.TB1 -0x9F09 Rst38 -0x9F33 CuttingCurs -0x9FA9 TimerFlash -0x9F3E CuttingCurs.L1 -0x9FA7 CursPutRes -0x9F99 ResCurs.L1 -0x9F5C CuttingCurs.L3 -0x9FAC CursSymb -0x001B SysSymb -0x0010 PauseFlash -0x9F7C CuttingCurs.L4 -0x0000 Ins -0x9FAE X KReg.L100 -0xA043 KReg.L200 -0x9FC7 KReg.L101 -0xA22C KReg.Coordinate -0x9FDC KReg.L102 -0xA22E KReg.Descript -0x9FF0 KReg.L103 -0x9FED KReg.L104 -0x9FFA KReg.L107 -0xA004 KReg.L105 -0xA017 KReg.L108 -0xA224 KReg.PgDown -0xA029 KReg.L110 -0xA228 KReg.PgUp -0xA035 KReg.L111 -0xA0DB KReg.L205 -0xA088 KReg.L207 -0xA0B2 KReg.L206 -0xA08E KReg.L208 -0xA12F KReg.L204 -0xA0F2 KReg.L209 -0xA13B KReg.L202 -0xA170 KReg.L203 -0xA17A KReg.L210 -0xA202 KReg.L211 -0xA1FE KReg.L212 -0xA24E KReg.DTabl -0xA25A KReg.D1 -0xA26D KReg.D2 -0xA282 KReg.D3 -0xA28F KReg.D4 -0xA294 KReg.D5 -0xA29D KReg.D6 -0xA2D1 KStack.L100 -0xA39D KStack.L200 -0xA2ED KStack.L101 -0xA301 KStack.L102 -0xA327 KStack.L103 -0xA320 KStack.L104 -0xA34D KStack.L105 -0xA346 KStack.L107 -0xA370 KStack.L108 -0xA369 KStack.L106 -0xA391 KStack.L110 -0xA38A KStack.L109 -0xA3E2 KStack.L202 -0xA3DB KStack.L203 -0xA431 KDump.L100 -0xA401 X KDump.L10 -0xA41A KDump.L11 -0xA4F3 KDump.L200 -0xA44D KDump.L101 -0xA461 KDump.L102 -0xA480 KDump.L103 -0xA479 KDump.L104 -0xA49E KDump.L105 -0xA497 KDump.L107 -0xA4BA KDump.L108 -0xA4B3 KDump.L106 -0xA4DA KDump.L110 -0xA4D3 KDump.L109 -0xA4E6 KDump.L111 -0xA528 KDump.L202 -0xA53D KDump.L203 -0xA58D KDump.L299 -0xA556 KDump.L204 -0xA57E KDump.L205 -0xFF00 AdrTmpBuf -0xA5F2 Rezident.Start -0xA609 Rezident.K2 -0xA612 Rezident.K3 -0xA60E Rezident.Start1 -0xA615 Rezident.Step -0xA618 Rezident.RetIn -0xA61B Rezident.K4 -0xA621 Rezident.K5 -0xA636 Rezident.BankD1 -0xA642 Rezident.Return1 -0xA64F Rezident.K6 -0xA655 Rezident.RetIn1 -0xA65A Rezident.K1 -0xA65D Rezident.BankD -0xA661 Rezident.Return -0xA960 Step.BankP -0xA8F5 Step.Run -0xA967 Step.SpdInc -0xA971 Step.SpdDec -0xA6AE Step.L7 -0xA7FF Step.L2 -0xA7EF Step.L8 -0xA7E2 Step.L9 -0xA748 Step.L6 -0xA6D1 Step.L18 -0xA6E8 Step.L10 -0xA6FD Step.L25 -0xA716 Step.L24 -0xA71E Step.L23 -0xA729 Step.L19 -0xA734 Step.L20 -0xA73F Step.L21 -0xA761 Step.L22 -0xA77C Step.L27 -0xA78E Step.L26 -0xA7B3 Step.L11 -0xA7B9 Step.L12 -0xA7BF Step.L13 -0xA7C5 Step.L14 -0xA7CB Step.L15 -0xA7D1 Step.L16 -0xA7D7 Step.L17 -0xA7DB Step.L5 -0xA817 Step.L1 -0xA83E Step.L30 -0xA97C Step.WRez -0xA895 Step.L31 -0xA8BD Step.L32 -0xA964 Step.Run1 -0xA8A1 Step.L33 -0xA8B6 Step.L34 -0xA97D Step.Buffer -0xA8D5 Step.L3 -0xAB1C StackDebug -0xA93E Step.L35 -0xA936 Step.L36 -0xA956 Step.L4 -0xAA5A SaveScr.Id -0xAA0F SaveScr.L1 -0xAA50 SaveScr.NameF -0xAA44 SaveScr.L2 -0xAAFE X Str -0xAB11 X Color -0xAB25 X Reg -0x00FF X Ovr -0xAC4F M00 -0xAC53 M01 -0xAC5A M02 -0xAC64 M03 -0xAC6B M04 -0xAC71 M05 -0xAC77 M06 -0xAC7D M07 -0xAC82 M08 -0xAC8C M09 -0xAC96 M0A -0xACA0 M0B -0xACA7 M0C -0xACAD M0D -0xACB3 M0E -0xACB9 M0F -0xACBE M10 -0xACC4 M11 -0xACCB M12 -0xACD5 M13 -0xACDC M14 -0xACE2 M15 -0xACE8 M16 -0xACEE M17 -0xACF2 M18 -0xACF6 M19 -0xAD00 M1A -0xAD0A M1B -0xAD11 M1C -0xAD17 M1D -0xAD1D M1E -0xAD23 M1F -0xAD27 M20 -0xAD2E M21 -0xAD35 M22 -0xAD3E M23 -0xAD45 M24 -0xAD4B M25 -0xAD51 M26 -0xAD57 M27 -0xAD5B M28 -0xAD61 M29 -0xAD6B M2A -0xAD74 M2B -0xAD7B M2C -0xAD81 M2D -0xAD87 M2E -0xAD8D M2F -0xAD91 M30 -0xAD98 M31 -0xAD9F M32 -0xADA7 M33 -0xADAE M34 -0xADB7 M35 -0xADC0 M36 -0xADC9 M37 -0xADCD M38 -0xADD3 M39 -0xADDD M3A -0xADE5 M3B -0xADEC M3C -0xADF2 M3D -0xADF8 M3E -0xADFE M3F -0xAE82 MC0 -0xAE89 MC1 -0xAE90 MC2 -0xAE97 MC3 -0xAE9B MC4 -0xAEA4 MC5 -0xAEAC MC6 -0xAEB3 MC7 -0xAEB9 MC8 -0xAEBF MC9 -0xAEC3 MCA -0xAEC9 MCC -0xAED1 MCD -0xAED7 MCE -0xAEDE MCF -0xAEE4 MD0 -0xAEEB MD1 -0xAEF2 MD2 -0xAEF9 MD3 -0xAF02 MD4 -0xAF0B MD5 -0xAF13 MD6 -0xAF18 MD7 -0xAF20 MD8 -0xAF26 MD9 -0xAF2A MDA -0xAF30 MDB -0xAF38 MDC -0xAF40 MDD -0xAF43 MDE -0xAF4A MDF -0xAF52 ME0 -0xAF59 ME1 -0xAF60 ME2 -0xAF67 ME3 -0xAF72 ME4 -0xAF7B ME5 -0xAF83 ME6 -0xAF88 ME7 -0xAF90 ME8 -0xAF97 ME9 -0xAF9F MEA -0xAFA6 MEB -0xAFAF MEC -0xAFB8 MEE -0xAFBD MEF -0xAFC5 MF0 -0xAFCB MF1 -0xAFD2 MF2 -0xAFD8 MF3 -0xAFDB MF4 -0xAFE3 MF5 -0xAFEB MF6 -0xAFEF MF7 -0xAFF7 MF8 -0xAFFD MF9 -0xB006 MFA -0xB00C MFB -0xB00F MFC -0xB017 MFD -0xB01A MFE -0xB01E MFF -0xB03B M80 -0xB042 M88 -0xB049 M90 -0xB04E M98 -0xB055 MA0 -0xB05A MA8 -0xB05F MB0 -0xB063 MB8 -0xB166 DD09 -0xB170 DD19 -0xB17A DD21 -0xB181 DD22 -0xB18A DD23 -0xB191 DD24 -0xB198 DD25 -0xB19F DD26 -0xB1A6 DD29 -0xB1B0 DD2A -0xB1B9 DD2B -0xB1C0 DD2C -0xB1C7 DD2D -0xB1CE DD2E -0xB1D5 DD34 -0xB1DB DD35 -0xB1E1 DD36 -0xB1E7 DD39 -0xB1F1 DD44 -0xB1F9 DD45 -0xB201 DD46 -0xB208 DD4C -0xB210 DD4D -0xB218 DD4E -0xB21F DD54 -0xB227 DD55 -0xB22F DD56 -0xB236 DD5C -0xB23E DD5D -0xB246 DD5E -0xB24D DD60 -0xB255 DD61 -0xB25D DD62 -0xB265 DD63 -0xB26D DD64 -0xB276 DD65 -0xB27F DD66 -0xB286 DD67 -0xB28E DD68 -0xB296 DD69 -0xB29E DD6A -0xB2A6 DD6B -0xB2AE DD6C -0xB2B7 DD6D -0xB2C0 DD6E -0xB2C7 DD6F -0xB2CF DD70 -0xB2D6 DD71 -0xB2DD DD72 -0xB2E4 DD73 -0xB2EB DD74 -0xB2F2 DD75 -0xB2F9 DD77 -0xB300 DD7C -0xB308 DD7D -0xB310 DD7E -0xB317 DD84 -0xB320 DD85 -0xB329 DD86 -0xB331 DD8C -0xB33A DD8D -0xB343 DD8E -0xB34B DD94 -0xB352 DD95 -0xB359 DD96 -0xB35F DD9C -0xB368 DD9D -0xB371 DD9E -0xB379 DDA4 -0xB380 DDA5 -0xB387 DDA6 -0xB38D DDAC -0xB394 DDAD -0xB39B DDAE -0xB3A1 DDB4 -0xB3A7 DDB5 -0xB3AD DDB6 -0xB3B2 DDBC -0xB3B8 DDBD -0xB3BE DDBE -0xB3C3 DDE1 -0xB3CA DDE3 -0xB3D5 DDE5 -0xB3DD DDE9 -0xB3E5 DDF9 -0xB3FE CB00 -0xB402 CB08 -0xB406 CB10 -0xB409 CB18 -0xB40C CB20 -0xB410 CB28 -0xB414 CB30 -0xB418 CB38 -0xB420 X CB80 -0xB424 X CBC0 -0xB4E4 ED40 -0xB4ED ED41 -0xB4F7 ED42 -0xB501 ED43 -0xB50A ED44 -0xB50E ED45 -0xB513 ED46 -0xB518 ED47 -0xB51F ED48 -0xB528 ED49 -0xB532 ED4A -0xB53C ED4B -0xB545 ED4D -0xB54A ED4E -0xB551 ED4F -0xB558 ED50 -0xB561 ED51 -0xB56B ED52 -0xB575 ED53 -0xB57E ED56 -0xB583 ED57 -0xB58A ED58 -0xB593 ED59 -0xB59D ED5A -0xB5A7 ED5B -0xB5B0 ED5E -0xB5B5 ED5F -0xB5BC ED60 -0xB5C5 ED61 -0xB5CF ED62 -0xB5D9 ED63 -0xB5E2 ED67 -0xB5E6 ED68 -0xB5EF ED69 -0xB5F9 ED6A -0xB603 ED6B -0xB60C ED6F -0xB610 ED70 -0xB619 ED71 -0xB623 ED72 -0xB62D ED73 -0xB636 ED78 -0xB63F ED79 -0xB649 ED7A -0xB653 ED7B -0xB65C EDA0 -0xB660 EDA1 -0xB664 EDA2 -0xB668 EDA3 -0xB66D EDA8 -0xB671 EDA9 -0xB675 EDAA -0xB679 EDAB -0xB67E EDB0 -0xB683 EDB1 -0xB688 EDB2 -0xB68D EDB3 -0xB692 EDB8 -0xB697 EDB9 -0xB69C EDBA -0xB6A1 EDBB -0xB7F3 LoadBinDialog.LoadBinWnd -0xB6AE LoadBinDialog.LoadBinEditFN -0xB6AE LoadBinDialog.L003 -0xB7EE LoadBinDialog.filenamelen -0xB812 LoadBinDialog.LoadBinFileName -0xB6D3 LoadBinDialog.L001 -0xB6CF LoadBinDialog.L002 -0xB6D5 LoadBinDialog.EditAddres -0xB7EF LoadBinDialog.LoadToAdr -0xB82F LoadBinDialog.AdresTxt -0xB6F1 LoadBinDialog.EditLenght -0xB7F1 LoadBinDialog.LoadLen -0xB83F LoadBinDialog.LenTxt -0xB70D LoadBinDialog.LoadBIN -0xB72A LoadBinDialog.restadr -0xB7CF LoadBinDialog.Err1 -0xB7ED LoadBinDialog.FMid -0xB743 LoadBinDialog.adr0000 -0xB748 LoadBinDialog.adr -0xB7EC LoadBinDialog.bank -0xB779 LoadBinDialog.LoadFirst -0xB7A4 LoadBinDialog.LoadEnd -0xB766 X LoadBinDialog.Load00 -0xB77F LoadBinDialog.LoadNext -0xB7DA LoadBinDialog.Bank1 -0xB7C7 LoadBinDialog.Err -0xB880 Windows -0xB899 NO_STAND_WIN -0xBA50 STANDART -0xB89B STAND_WIN -0xB909 Rectang -0xB92E Frame -0xB8EE WinHeader -0xB8D9 WinNoHeader -0xB9CC MenuItemLen -0xB91E FillBox -0xB920 FillB1 -0xBA56 FrameType1 -0xB93A Frame1 -0xBA5C FrameType2 -0xB993 FramHor -0xB98F FramHl1 -0xB9BF FramVer -0xB9BB FramVl1 -0xB9CE NextMnuItem -0xB9D9 X WinDialog -0xBA4E DlgItemsCnt -0xB9EF WinDialog.DialogAdr -0xBA4F SelectedItem -0xB9E5 WinDialog.Lp1 -0xB9FB WinDialog.Lp2 -0xBA18 WinDialog.Lp3 -0xBA05 WinDialog.LpDn -0xBA10 WinDialog.Lp4 -0xBA25 WinDialog.Lp5 -0xBA1C WinDialog.LpUp -0xBA2D X WinDialog.LpAscii -0xBA62 EndOfDaemon diff --git a/DEMON.TXT b/demon.txt similarity index 100% rename from DEMON.TXT rename to demon.txt diff --git a/demon.utf.txt b/demon.utf.txt new file mode 100644 index 0000000..541cf41 --- /dev/null +++ b/demon.utf.txt @@ -0,0 +1,377 @@ +╨Я╨╛╤Д╨╕╨║╤Б╨╡╨╜╨╜╨░╤П (╨╜╨░ ╨╛╤И╨╕╨▒╨║╨╕) ╨┤╨╛╨║╨░. +╨Э╨╡╨╝╨╜╨╛╨│╨╛ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╛ ╨╛╨┐╨╕╤Б╨░╨╜╨╕╨╡ ╨▓ "2.4. ╨Ф╨░╨╝╨┐ ╨┐╨░╨╝╤П╤В╨╕". + +╨У╨╗╤О╨║╨╕. +1. ╨Э╨╡ ╤А╨░╨▒╨╛╤В╨░╨╡╤В Ctrl+S. + +2. ╨Я╨╡╤А╨╡╨╣╨┤╨╕ ╨▓ ╨┐╨╛╨╗╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨░ "PC" ╨╕ ╨▓╨▓╨╡╨┤╨╕ ╨░╨┤╤А╨╡╤Б #C000. ╨Я╨╛╤Б╨╗╨╡ ╨┐╨╡╤А╨╡╨╣╨┤╨╕ ╨▓ ╨░╤Б╨╝- +╨╗╨╕╤Б╤В╨╕╨╜╨│ (╨╜╨░ ╤Н╤В╨╛╤В ╨░╨┤╤А╨╡╤Б, ╤П ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨╕╨╗ ╨┐╨╛ Ctrl+~) ╨╕ ╨╕╨┤╨╕ ╨┐╨╛-╤Б╤В╤А╨╛╤З╨╜╨╛ ╨▓╨▓╨╡╤А╤Е +(╤В.╨╡. ╨║ ╨╝╨╗╨░╨┤╤И╨╕╨╝ ╨░╨┤╤А╨╡╤Б╨░╨╝). ╨г╨▓╨╕╨┤╨╕╤И╤М ╨│╨╗╤О╨║╨╕ ╤Б ╨▓╤Л╨▓╨╛╨┤╨╛╨╝ ╨▓ ╨░╤Б╨╝-╨╗╨╕╤Б╤В╨╕╨╜╨│╨╡. ╨Я╨╡╤А╨╡╨╣╤В╨╕ +╨╝╨╛╨╢╨╡╤И╤М ╨╜╨░ ╨┤╤А╤Г╨│╨╛╨╣ ╨░╨┤╤А╨╡╤Б, ╨│╨╗╤О╨║ ╨╜╨╡ ╨┐╤А╨╛╨┐╨░╨┤╨░╨╡╤В. ╨Я╤А╨╕ ╤Б╤В╤А╨░╨╜╨╕╤З╨╜╨╛╨╝ ╨╗╨╕╤Б╤В╨░╨╜╨╕╨╕ ╨▓╨▓╨╡╤А╤Е, +╤Н╤В╨╛╤В ╨│╨╗╤О╨║ ╨▓╤А╨╛╨┤╨╡ ╨║╨░╨║ ╨╜╨╡ ╨╖╨░╨╝╨╡╤В╨╡╨╜. +╨Ъ╤Б╤В╨░, ╤В╨╛╨╗╤М╨║╨╛ ╤Й╨░╤Б ╨┐╤А╨╛╨▓╨╡╤А╨╕╨╗ ╨╜╨░ ╤Н╤В╨╛╤В ╨╢╨╡ ╨│╨╗╤О╨║. ╨Ч╨░╨┐╤Г╤Б╨║╨░╤О ╨Ф╨╡╨╝╨╛╨╜╨░, ╨┐╨╡╤А╨╡╤Е╨╛╨╢╤Г ╨┐╨╛ +Ctrl+~ ╨╜╨░ #C000 ╨╕ ╨╕╨┤╤Г ╨┐╨╛-╤Б╤В╤А╨╛╤З╨╜╨╛ ╨▓╨▓╨╡╤А╤Е - ╨│╨╗╤О╨║. ╨в╨╛ ╨╢╨╡ ╤Б╨░╨╝╨╛╨╡ ╤Б ╨░╨┤╤А╨╡╤Б╨░ #4000. +╨в.╨╡. ╤П ╤Е╨╛╤З╤Г ╤Б╨║╨░╨╖╨░╤В╤М, ╤З╤В╨╛ ╨┐╤А╨░╨▓╨║╨░ ╤А╨╡╨│╨╕╤Б╤В╤А╨░ PC ╤В╤Г╤В ╨╜╨╕ ╨┐╤А╨╕ ╤З╨╡╨╝. + +╨Я╨╛╨╢╨╡╨╗╨░╨╜╨╕╨╡. ╨Ъ╨░╨║ ╨▒╤Л ╨▒╤Л╤Б╤В╤А╨╛ ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨╕╤В╤М ╨▓ ╨╗╤О╨▒╨╛╨╡ ╨╛╨║╨╜╨╛ ╨Ф╨╕╨╝╤Л ?. ╨Р ╤В╨╛ ╨║╤А╤Г╨│╨╛╨▓╨╛╨╡ ╨┐╨╛ +╨в╨░╨▒╤Г ╤Г╤В╨╛╨╝╨╗╤П╨╡╤В - ╨┐╨╛╨║╨░ ╨┤╨╛╨╣╨┤╨╡╤И╤М ╨┤╨╛ ╨╜╤Г╨╢╨╜╨╛╨│╨╛ ╨╛╨║╨╜╨░... ╨Ь╨╛╨╢╨╡╤В ╨║╨░╨╢╨┤╨╛╨╝╤Г ╨╛╨║╨╜╤Г ╨┐╤А╨╕╤Б╨▓╨╛╨╕╤В╤М +╤Б╨▓╨╛╤О ╨╜╨╛╤В-╨║╨╗╨░╨▓╨╕╤И╤Г, ╤В╨╕╨┐╨░ Alt+1,2,... ╨ж╨╕╤Д╤А╤Г ╨║╨░╨╢╨┤╨╛╨╝╤Г ╨╛╨║╨╜╤Г ╨╝╨╛╨╢╨╜╨╛ ╨┐╨╛╤Б╤В╨░╨▓╨╕╤В╤М ╨╜╨░ ╨╡╨│╨╛ +╨│╤А╨░╨╜╨╕╤Ж╤Г, ╨╜╨╛ ╤В╨╛╨╗╤М╨║╨╛ ╨┤╤А╤Г╨│╨╕╨╝ ╤Ж╨▓╨╡╤В╨╛╨╝, ╨╜╨░╨┐╤А╨╕╨╝╨╡╤А ╤Б╨╕╨╜╨╕╨╝, ╤З╤В╨╛╨▒╤Л ╨▓ ╨│╨╗╨░╨╖╨░╤Е ╨╜╨╡ ╤В╨░╨║ +╨╝╨░╤П╤З╨╕╨╗╨╛. ╨в╨╕╨┐╨░ (╨┐╨╛╤А╤П╨┤╨║╨╛╨▓╤Л╨╡ ╨╜╨╛╨╝╨╡╤А╨░ ╤В╨╛╨╗╤М╨║╨╛ ╨┤╨╗╤П ╤Н╤В╨╛╨│╨╛ ╨┐╤А╨╕╨╝╨╡╤А╨░) + +1тХРтХРтХРтХРтХРтХРтХРтХРтХдтХР +тХСIX #8080тФВ0 +тХСIY #1637тФВ0 +2тФАтФАтФАтФАтФАтФАтФАтФАтФ╝тФА +тХСHL #8100тФВ0 +тХСDE #2C40тФВC +тХСBC #C089тФВD +тХСAF #FB82тФВ% +тХСSz.h.pNcтФВ +3тФАтФАтФАтФАтФАтФАтФАтФАтФ╝тФА +тХСHL'#0000тФВC +тХСDE'#2E07тФВ3 +тХСBC'#0200тФВD +тХСAF'#FB44тФВ% +тХСsZ.h.PncтФВ +4тФАтФАтФАтФАтФАтФАтФАтФАтФ╝тФА +тХСPC #0000тФВI +тХатХР 0 тХРтХдтХР 1 +тХС #FB тФВ #FF +5тХРтХРтХРтХРтХРтХзтХРтХРтХдтХР +тХСSP #7FFEтФВ +6тХРтХРтХРтХРтХРтХРтХРтХРтХзтХР +тХС#800A #FF0 +тХС#8008 #FF0 +тХС#8006 #100 +тХС#8004 #103 +тХС#8002 #7E6 +тХС#8000 #007 +тХС#7FFE #2CE +тХС#7FFC #434 +тХЪтХРтХРтХРтХРтХРтХРтХРтХРтХРтХР + +╨Ы╨╛╨╢╨║╨░ ╨┤╨╡╨│╤В╤П ;). ╨г ╤В╨╡╨▒╤П ╨╜╨╡╨╝╨╜╨╛╨│╨╛ ╨║╤А╨╕╨▓╨╛╨▓╨░╤В╨░╤П ╨╜╨░╨▓╨╕╨│╨░╤Ж╨╕╤П ╨▓ hex-╨╛╨║╨╜╨╡ ╨╝╨╡╨╢╨┤╤Г hex/ascii +╨┤╨░╨╝╨┐╨░╨╝╨╕. ╨Х╤Б╨╗╨╕ ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨╕╤И╤М ╨╕╨╖ ╨╛╨┤╨╜╨╛╨│╨╛ ╨┤╨░╨╝╨┐╨░ ╨╜╨░ ╨┤╤А╤Г╨│╨╛╨╣, ╤В╨╛ ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨╕ ╨╜╨░ ╤В╨╛╤В ╨╢╨╡ +╤Б╨░╨╝╤Л╨╣ ╨░╨┤╤А╨╡╤Б - ╤Н╤В╨╛ ╨╗╨╛╨│╨╕╤З╨╡╤Б╨║╨╕ ╨┐╤А╨░╨▓╨╕╨╗╤М╨╜╨╛. ╨Ъ╨╕╨┤╨░╤О ╤В╨╡╨▒╨╡ hex-╤А╨╡╨┤╨░╨║╤В╨╛╤А QVIEW, ╤П ╨╕╨╝ +╨╜╨░ PC-╤Е╨╡ ╤В╨╛╨╗╤М╨║╨╛ ╨╕ ╨┐╨╛╨╗╤М╨╖╤Г╤О╤Б╤М. +╨Я╨╡╤А╨╡╨┤╨╡╨╗╤Л╨▓╨░╤В╤М ╨╝╨╜╨╛╨│╨╛ ╨┐╨╛╤В╤А╨╡╨▒╤Г╨╡╤В╤Б╤П, ╨╡╤Б╨╗╨╕ ╨▓ hex-╨╛╨║╨╜╨╡ ╤Б╤А╨░╨╖╤Г ╨┐╤А╨╕╨║╤А╤Г╤В╨╕╤В╤М ╤А╨╡╨╢╨╕╨╝ ╤А╨╡╨┤╨░╨║- +╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╤П ?. + +╨Э╨╛ ╤Н╤В╨╛ ╤В╨░╨║, ╨╝╨╡╤З╤В╤Л ╨╜╨░ ╨▒╤Г╨┤╤Г╤Й╨╡╨╡. +----------------------------------------------------------------------------- + + + + DemoN - ╨╝╨╛╨╜╨╕╤В╨╛╤А-╨╛╤В╨╗╨░╨┤╤З╨╕╨║ ╨┤╨╗╤П DSS Estex + +1. ╨Э╨░╨╖╨╜╨░╤З╨╡╨╜╨╕╨╡ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л. + +Demon ╨┐╤А╨╡╨┤╨╜╨░╨╖╨╜╨░╤З╨╡╨╜ ╨┤╨╗╤П ╨╛╤В╨╗╨░╨┤╨║╨╕ ╨┐╤А╨╛╨│╤А╨░╨╝, ╨╜╨░╨┐╨╕╤Б╨░╨╜╨╜╤Л╤Е ╨╜╨░ ╨░╤Б╤Б╨╡╨╝╨▒╨╗╨╡╤А╨╡ Z80. ╨Ю╨╜ +╨┐╨╛╨╖╨▓╨╛╨╗╤П╨╡╤В ╤В╤А╨░╤Б╤Б╨╕╤А╨╛╨▓╨░╤В╤М ╨║╨╛╨┤ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л ╤Б ╨╛╤В╤Б╨╗╨╡╨╢╨╕╨▓╨░╨╜╨╕╨╡╨╝ ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╤П ╨▓╤Б╨╡╤Е ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓ +╨┐╤А╨╛╤Ж╨╡╤Б╤Б╨╛╤А╨░ ╨╕ ╤П╤З╨╡╨╡╨║ ╨┐╨░╨╝╤П╤В╨╕ ╨╛╤В╨╗╨░╨╢╨╕╨▓╨░╨╡╨╝╨╛╨╣ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л. + +2. ╨Т╨╜╨╡╤И╨╜╨╕╨╣ ╨▓╨╕╨┤ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л. + +Demon ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╨╡╤В ╤В╨╡╨║╤Б╤В╨╛╨▓╤Л╨╣ ╤А╨╡╨╢╨╕╨╝ ╤Н╨║╤А╨░╨╜╨░. + + ╨в╨╡╨║╤Г╤Й╨╡╨╡ ╨▓╤А╨╡╨╝╤П тФАтФАтФАтФАтФАтФАтФАтФР + тФМтФАтФАтФАтФ┤тФАтФАтФР +тХФтХРтХРтХРтХРтХРтХРтХРтХРтХдтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХжтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХР18:41:03тХЧ +тХСIX #8080тФВ0EFC F8FC .тДЦ┬░тДЦтХС #06CC 34 INC (HL) тХС +тХСIY #1637тФВ0045 4D4F .EMOтХС #06CD CBB6 RES 6,(HL) тХС +тХЯтФАтФАтФАтФАтФАтФАтФАтФАтФ╝тФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтХв #06CF 6F LD L,A тХС +тХСHL #8100тФВ0081 FFFE .╨С.тЦатХС #06D0 2606 LD H,#06 тХС +тХСDE #2C40тФВC34A 2D21 тФЬJ-!тХС #06D2 73 LD (HL),E тХС +тХСBC #C089тФВD6C6 06C6 тХУтХЮ.тХЮтХС #06D3 2C INC L тХС +тХСAF #FB82тФВ%11111011 "тИЪ" тХС #06D4 72 LD (HL),D тХС +тХСSz.h.pNcтФВ тХС #06D5 2C INC L тХС +тХЯтФАтФАтФАтФАтФАтФАтФАтФАтФ╝тФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтХв #06D6 70 LD (HL),B тХС +тХСHL'#0000тФВC34A 2DFF тФЬJ-.тХС #06D7 2C INC L тХС +тХСDE'#2E07тФВ3045 5845 0EXEтХС #06D8 71 LD (HL),C тХС +тХСBC'#0200тФВDCE6 0106 тЦД╤Ж..тХС #06D9 C9 RET тХС +тХСAF'#FB44тФВ%11111011 "тИЪ" тХС #06DA 214106 LD HL,#0641 тХС +тХСsZ.h.PncтФВ тХС #06DD 3A4006 LD A,(#0640) тХС +тХЯтФАтФАтФАтФАтФАтФАтФАтФАтФ╝тФАтФАтФАтФАтФАтФАтФАтФАтФмтФАтФАтФАтФАтФАтХв #06E0 BE CP (HL) тХС +тХСPC #0000тФВIR #8059тФВ тХС #06E1 C8 RET Z тХС +тХатХР 0 тХРтХдтХР 1 тХРтХдтХР 2 тХРтХктХР 3 тХРтХг #06E2 7E LD A,(HL) тХС +тХС #FB тФВ #FF тФВ #E8 тФВ #FF тХС #06E3 34 INC (HL) тХС +тХатХРтХРтХРтХРтХРтХзтХРтХРтХдтХРтХРтХзтХРтХжтХРтХРтХРтХзтХРтХРтХРтХРтХРтХг #06E4 34 INC (HL) тХС +тХСSP #7FFEтФВ 0тХСREZ #7000тХС #06E5 34 INC (HL) тХС +тХатХРтХРтХРтХРтХРтХРтХРтХРтХзтХРтХРтХжтХРтХйтХРтХРтХРтХРтХРтХРтХРтХРтХРтХйтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХг +тХС#800A #FF0FтХС #4000 007E 7E6C 1038 1000 FF00 FF0F 3C3F 7F18 .~~l.8................ тХС +тХС#8006 #1000тХС #4020 0030 6C6C 3000 3860 1860 0000 0000 0006 .0ll0.8`.`...... тХС +тХС#8004 #1038тХС #4030 7C30 7878 1CFC 38FC 7878 0000 1800 6078 |0xx.тДЦ8тДЦxx....`x тХС +тХС#8002 #7E6CтХС #4040 7C30 FC3C F8FE FE3C CC78 1EE6 F0C6 C638 |0тДЦ<┬░тЦатЦа<тХаx.╤Ж╨БтХЮтХЮ8 тХС +тХС#8000 #007EтХС #4050 FC78 FC78 FCCC CCC6 C6CC FE78 C078 1000 тДЦxтДЦxтДЦтХатХатХЮтХЮтХатЦаxтФФx.. тХС +тХС#7FFE #2CE4тХС #4060 3000 E000 1C00 3800 E030 0CE0 7000 0000 0.╤А...8.╤А0.╤Аp... тХС +тХС#7FFC #4340тХС #4070 0000 0000 1000 0000 0000 001C 18E0 7600 .............╤Аv. тХС +тХЪтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХйтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХЭ + тФАтХРтХР DemoN v0.10 build 65 (alpha) Igor by AlphA Studio, 2006 тХРтХРтФА + +╨Т╨╡╤Б╤М ╤Н╨║╤А╨░╨╜ ╤А╨░╨╖╨▒╨╕╤В ╨╜╨░ ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╕╨╡ ╨╛╨▒╨╗╨░╤Б╤В╨╕: + - ╨╛╨║╨╜╨╛ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓; + - ╨┤╨░╨╝╨┐ ╤Б╤В╨╡╨║╨░; + - ╨╛╨║╨╜╨╛ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░; + - ╨┤╨░╨╝╨┐ ╨┐╨░╨╝╤П╤В╨╕. + +2.1. ╨Ю╨║╨╜╨╛ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓. + +╨Ю╨║╨╜╨╛ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓ ╤А╨░╨╖╨▒╨╕╤В╨╛ ╨╜╨░ ╨▒╨╛╨╗╨╡╨╡ ╨╝╨╡╨╗╨║╨╕╨╡ ╨╛╨║╨╜╨░ (╤Г╤Б╨╗╨╛╨▓╨╜╤Л╨╡ ╨╛╨▒╨╗╨░╤Б╤В╨╕): +- ╨╛╨▒╨╗╨░╤Б╤В╤М ╨╕╨╜╨┤╨╡╨║╤Б╨╜╤Л╤Е ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╤Е ╨┐╨░╤А; +- ╨╛╨▒╨╗╨░╤Б╤В╤М ╨╛╤Б╨╜╨╛╨▓╨╜╨╛╨│╨╛ ╨╜╨░╨▒╨╛╤А╨░ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓; +- ╨╛╨▒╨╗╨░╤Б╤В╤М ╨░╨╗╤М╤В╨╡╤А╨╜╨░╤В╨╕╨▓╨╜╨╛╨│╨╛ ╨╜╨░╨▒╨╛╤А╨░ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓; +- ╨╜╨╕╨╢╨╜╤П╤П ╨╛╨▒╨╗╨░╤Б╤В╤М (╨╛╤Б╤В╨░╨▓╤И╨╕╨╡╤Б╤П ╤В╤А╨╕ ╤Б╤В╤А╨╛╨║╨╕); + +2.1.1. ╨б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ ╨╕╨╜╨┤╨╡╨║╤Б╨╜╤Л╤Е ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╤Е ╨┐╨░╤А. + + тФМтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨╛╨╣ ╨┐╨░╤А╤Л + тФВ тФМтФАтФАтФАтФАтФАтФА ╨Ь╨╕╨╜╨╕-╨┤╨░╨╝╨┐ + тФМтФАтФАтФАтФ┤тФАтФАтФР тФМтФАтФАтФАтФАтФАтФ┤тФАтФАтФАтФАтФАтФАтФР +тХФтХРтХРтХРтХРтХРтХРтХРтХРтХдтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХжтХР +тХСIX #8080тФВ0EFC F8FC .тДЦ┬░тДЦтХС +тХСIY #1637тФВ0045 4D4F .EMOтХС +тХЯтФАтФАтФАтФАтФАтФАтФАтФАтФ╝тФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтХв + тФФтФд тФФтФАтФмтФАтФШ тФФтФмтФАтФШ тФФтФмтФАтФШ тФФтФмтФАтФШ + тФВ тФВ тФФтФАтФАтФмтФАтФШ тФФтФА ASCII ╨┐╤А╨╡╨┤╤Б╤В╨░╨▓╨╗╨╡╨╜╨╕╨╡ ╨┐╨░╨╝╤П╤В╨╕ + тФВ тФВ тФФтФАтФАтФАтФАтФАтФАтФАтФА ╨С╨░╨╣╤В╤Л ╨╕╨╖ ╨┐╨░╨╝╤П╤В╨╕, ╨╜╨░ ╨║╨╛╤В╨╛╤А╤Г╤О ╤Б╤Б╤Л╨╗╨░╨╡╤В╤Б╤П ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨░╤П ╨┐╨░╤А╨░ + тФВ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨Ч╨╜╨░╤З╨╡╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨╛╨╣ ╨┐╨░╤А╤Л + тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨а╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨░╤П ╨┐╨░╤А╨░ + + +2.1.2. ╨б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ ╨╛╤Б╨╜╨╛╨▓╨╜╨╛╨│╨╛ ╨╕ a╨╗╤М╤В╨╡╤А╨╜╨░╤В╨╕╨▓╨╜╨╛╨│╨╛ ╨╜╨░╨▒╨╛╤А╨╛╨▓ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓ ╨┐╤А╨╛╤Ж╨╡╤Б╤Б╨╛╤А╨░. + +тХЯтФАтФАтФАтФАтФАтФАтФАтФАтФ╝тФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтХв +тХСHL #8100тФВ0081 FFFE .╨С.тЦатХС +тХСDE #2C40тФВC34A 2D21 тФЬJ-!тХС +тХСBC #C089тФВD6C6 06C6 тХУтХЮ.тХЮтХС +тХСAF #FB82тФВ%11111011 "тИЪ" тХС +тХСSz.h.pNcтФВ тХС +тХЯтФАтФАтФАтФАтФАтФАтФАтФАтФ╝тФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтХв +тХСHL'#0000тФВC34A 2DFF тФЬJ-.тХС +тХСDE'#2B18тФВDD21 082E тЦМ!..тХС +тХСBC'#0200тФВDCE6 0106 тЦД╤Ж..тХС +тХСAF'#FB44тФВ%11111011 "тИЪ" тХС +тХСsZ.h.PncтФВ тХС +тХЯтФАтФАтФАтФАтФАтФАтФАтФАтФ╝тФАтФАтФАтФАтФАтФАтФАтФАтФмтФАтФАтФАтФАтФАтХв + +╨б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ ╤Б╤В╤А╨╛╨║ ╤Б ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╨╝╨╕ ╨┐╨░╤А╨░╨╝╨╕ HL, DE, BC ╨╕ HL', DE', BC' ╨┐╨╛╨╗╨╜╨╛╤Б╤В╤М╤О +╨░╨╜╨░╨╗╨╛╨│╨╕╤З╨╜╨╛ ╤Б╤В╤А╨╛╨║╨░╨╝ ╤Б ╨╕╨╜╨┤╨╡╨║╤Б╨╜╤Л╨╝╨╕ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╨╝╨╕ ╨┐╨░╤А╨░╨╝╨╕. ╨Ф╨░╨╗╨╡╨╡ ╨▓ ╨┤╨▓╤Г╤Е ╤Б╤В╤А╨╛╨║╨░╤Е +╨╛╤В╨╛╨▒╤А╨░╨╢╨░╨╡╤В╤Б╤П ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ ╨░╨║╨║╤Г╨╝╤Г╨╗╤П╤В╨╛╤А╨░ ╨╕ ╤Д╨╗╨░╨│╨╛╨▓ ╨┐╤А╨╛╤Ж╨╡╤Б╤Б╨╛╤А╨░: + + тФМтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨а╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨░╤П ╨┐╨░╤А╨░ + тФВ тФМтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨Ч╨╜╨░╤З╨╡╨╜╨╕╨╡ ╨░╨║╨║╤Г╨╝╤Г╨╗╤П╤В╨╛╤А╨░ + тФВ тФВ тФМтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨Ч╨╜╨░╤З╨╡╨╜╨╕╨╡ ╤Д╨╗╨░╨│╨╛╨▓╨╛╨│╨╛ ╤А╨╡╨│╨╕╤Б╤В╤А╨░ + тФВ тФВ тФВ тФМтФАтФАтФАтФАтФАтФАтФАтФА ╨Ф╨▓╨╛╨╕╤З╨╜╨╛╨╡ ╨┐╤А╨╡╨┤╤Б╤В╨░╨▓╨╗╨╡╨╜╨╕╨╡ ╨░╨║╨║╤Г╨╝╤Г╨╗╤П╤В╨╛╤А╨░ + тФВ тФВ тФВ тФВ тФМтФА ASCII ╨┐╤А╨╡╨┤╤Б╤В╨░╨▓╨╗╨╡╨╜╨╕╨╡ ╨░╨║╨║╤Г╨╝╤Г╨╗╤П╤В╨╛╤А╨░ + тФМтФд тФМтФдтФМтФд тФМтФАтФАтФАтФ┤тФАтФАтФАтФР тФВ + +тХСAF #FB82тФВ%11111011 "тИЪ" тХС +тХСSz.h.pNcтФВ тХС +тХЯтФАтФАтФАтФАтФАтФАтФАтФАтФ╝тФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтХв + тФВтФВ тФВ тФВтФВтФВ + тФВтФВ тФВ тФВтФВтФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨б - ╤Д╨╗╨░╨│ ╨┐╨╡╤А╨╡╨╜╨╛╤Б╨░ + тФВтФВ тФВ тФВтФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА N - ╤Д╨╗╨░╨│ ╨╛╨┐╨╡╤А╨░╤Ж╨╕╨╕ ╨▓╤Л╤З╨╕╤В╨░╨╜╨╕╤П + тФВтФВ тФВ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА P/V - ╤Д╨╗╨░╨│ ╤З╨╡╤В╨╜╨╛╨│╨╛ ╤А╨╡╨╖╤Г╨╗╤М╤В╨░╤В╨░ / ╨┐╨╡╤А╨╡╨┐╨╛╨╗╨╜╨╡╨╜╨╕╤П + тФВтФВ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА H - ╤Д╨╗╨░╨│ ╨▓╤Б╨┐╨╛╨╝╨╛╨│╨░╤В╨╡╨╗╤М╨╜╨╛╨│╨╛ ╨┐╨╡╤А╨╡╨╜╨╛╤Б╨░ + тФВтФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА Z - ╤Д╨╗╨░╨│ ╨╜╤Г╨╗╤П + тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА S - ╤Д╨╗╨░╨│ ╨╖╨╜╨░╨║╨░ +╨Ч╨░╨│╨╗╨░╨▓╨╜╨░╤П ╨▒╤Г╨║╨▓╨░ ╤Б╨╛╨╛╤В╨▓╨╡╤В╤Б╤В╨▓╤Г╨╡╤В ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╜╨╛╨╝╤Г ╤Д╨╗╨░╨│╤Г, ╨┐╤А╨╛╨┐╨╕╤Б╨╜╨░╤П - ╤Б╨▒╤А╨╛╤И╨╡╨╜╨╜╨╛╨╝╤Г. + +2.1.3. ╨б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ ╤Б╤З╨╡╤В╤З╨╕╨║╨░ ╨║╨╛╨╝╨░╨╜╨┤ ╨╕ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓ ╨░╨┤╤А╨╡╤Б╨░ ╤А╨╡╨│╨╡╨╜╨╡╤А╨░╤Ж╨╕╨╕ ╨╕ ╤В╨░╨▒╨╗╨╕╤Ж╤Л + ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╨╣. + +тХЯтФАтФАтФАтФАтФАтФАтФАтФАтФ╝тФАтФАтФАтФАтФАтФАтФАтФАтФмтФАтФАтФАтФАтФАтХв +тХСPC #00CFтФВIR #8045тФВ тХС + + тФФтФд тФФтФАтФмтФАтФШ тФФтФд тФФтФдтФФтФд + тФВ тФВ тФВ тФВ тФФтФАтФАтФАтФАтФА ╨Ч╨╜╨░╤З╨╡╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨░ ╨░╨┤╤А╨╡╤Б╨░ ╤А╨╡╨│╨╡╨╜╨╡╤А╨░╤Ж╨╕╨╕ + тФВ тФВ тФВ тФФтФАтФАтФАтФАтФАтФАтФА ╨Ч╨╜╨░╤З╨╡╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨░ ╨░╨┤╤А╨╡╤Б╨░ ╤В╨░╨▒╨╗╨╕╤Ж╤Л ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╨╣ + тФВ тФВ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨а╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨░╤П ╨┐╨░╤А╨░ + тФВ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨Ч╨╜╨░╤З╨╡╨╜╨╕╨╡ ╤Б╤З╨╡╤В╤З╨╕╨║╨░ ╨║╨╛╨╝╨░╨╜╨┤ + тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨а╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨░╤П ╨┐╨░╤А╨░ + +2.1.4. ╨Э╨╛╨╝╨╡╤А╨░ ╨▒╨░╨╜╨╛╨║ ╨┐╨░╨╝╤П╤В╨╕, ╨▓╨║╨╗╤О╤З╨╡╨╜╨╜╤Л╤Е ╨▓ ╨╛╨║╨╜╨░ ╨┐╤А╨╛╤Ж╨╡╤Б╤Б╨╛╤А╨░. + + тФМтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА 0-╨╡ ╨╛╨║╨╜╨╛ ╨░╨┤╤А╨╡╤Б╨╜╨╛╨│╨╛ ╨┐╤А╨╛╤Б╤В╤А╨░╨╜╤Б╤В╨▓╨░ (#0000...#3FFF) + тФВ тФМтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА 1-╨╡ ╨╛╨║╨╜╨╛ ╨░╨┤╤А╨╡╤Б╨╜╨╛╨│╨╛ ╨┐╤А╨╛╤Б╤В╤А╨░╨╜╤Б╤В╨▓╨░ (#4000...#7FFF) + тФВ тФВ тФМтФАтФАтФАтФАтФАтФАтФА 2-╨╡ ╨╛╨║╨╜╨╛ ╨░╨┤╤А╨╡╤Б╨╜╨╛╨│╨╛ ╨┐╤А╨╛╤Б╤В╤А╨░╨╜╤Б╤В╨▓╨░ (#8000...#BFFF) + тФВ тФВ тФВ тФМтФА 3-╨╡ ╨╛╨║╨╜╨╛ ╨░╨┤╤А╨╡╤Б╨╜╨╛╨│╨╛ ╨┐╤А╨╛╤Б╤В╤А╨░╨╜╤Б╤В╨▓╨░ (#C000...#FFFF) + +тХатХР 0 тХРтХдтХР 1 тХРтХдтХР 2 тХРтХктХР 3 тХРтХг +тХС #FB тФВ #FF тФВ #E8 тФВ #FF тХС +тХатХРтХРтХРтХРтХРтХзтХРтХРтХдтХРтХРтХзтХРтХжтХРтХРтХРтХзтХРтХРтХРтХРтХРтХг + + тФФтФмтФШ тФФтФмтФШ тФФтФмтФШ тФФтФмтФШ + тФВ тФВ тФВ тФФтФА ╨д╨╕╨╖╨╕╤З╨╡╤Б╨║╨╕╨╣ ╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨┐╨░╨╝╤П╤В╨╕ ╨▓╨║╨╗╤О╤З╨╡╨╜╨╜╨╛╨╣ ╨▓ 0-╨╡ ╨╛╨║╨╜╨╛ + тФВ тФВ тФФтФАтФАтФАтФАтФАтФАтФА ╨д╨╕╨╖╨╕╤З╨╡╤Б╨║╨╕╨╣ ╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨┐╨░╨╝╤П╤В╨╕ ╨▓╨║╨╗╤О╤З╨╡╨╜╨╜╨╛╨╣ ╨▓ 1-╨╡ ╨╛╨║╨╜╨╛ + тФВ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨д╨╕╨╖╨╕╤З╨╡╤Б╨║╨╕╨╣ ╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨┐╨░╨╝╤П╤В╨╕ ╨▓╨║╨╗╤О╤З╨╡╨╜╨╜╨╛╨╣ ╨▓╨╛ 2-╨╡ ╨╛╨║╨╜╨╛ + тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨д╨╕╨╖╨╕╤З╨╡╤Б╨║╨╕╨╣ ╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨┐╨░╨╝╤П╤В╨╕ ╨▓╨║╨╗╤О╤З╨╡╨╜╨╜╨╛╨╣ ╨▓ 3-╨╡ ╨╛╨║╨╜╨╛ + +2.1.5. ╨б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ ╤Г╨║╨░╨╖╨░╤В╨╡╨╗╤П ╤Б╤В╨╡╨║╨░ ╨╕ ╨░╨┤╤А╨╡╤Б ╤А╨░╤Б╨┐╨╛╨╗╨╛╨╢╨╡╨╜╨╕╤П ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░. + +тХатХРтХРтХРтХРтХРтХзтХРтХРтХдтХРтХРтХзтХРтХжтХРтХРтХРтХзтХРтХРтХРтХРтХРтХг +тХСSP #7FF6тФВ 4тХСREZ #7000тХС +тХатХРтХРтХРтХРтХРтХРтХРтХРтХзтХРтХРтХжтХРтХйтХРтХРтХРтХРтХРтХРтХРтХРтХРтХйтХР + + тФФтФд тФФтФАтФмтФАтФШ тФФтФАтФмтФШ тФФтФмтФШ тФФтФАтФмтФАтФШ + тФВ тФВ тФВ тФВ тФФтФА ╨Р╨┤╤А╨╡╤Б ╤А╨░╨╖╨╝╨╡╤Й╨╡╨╜╨╕╤П ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + тФВ тФВ тФВ тФФтФАтФАтФАтФАтФАтФА ╨а╨╡╨╖╨╕╨┤╨╡╨╜╤В + тФВ тФВ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨Ш╤Б╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╨╜╨╜╨░╤П ╨│╨╗╤Г╨▒╨╕╨╜╨░ ╤Б╤В╨╡╨║╨░ + тФВ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨Ч╨╜╨░╤З╨╡╨╜╨╕╨╡ ╤Г╨║╨░╨╖╨░╤В╨╡╨╗╤П ╤Б╤В╨╡╨║╨░ + тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨а╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨░╤П ╨┐╨░╤А╨░ + +╨б╨┐╤А╨░╨▓╨░ ╨╛╤В ╨┐╨░╤А╤Л SP ╨▓╤Л╨▓╨╛╨┤╨╕╤В╤Б╤П ╨│╨╗╤Г╨▒╨╕╨╜╨░ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╨╜╨╜╨╛╨│╨╛ ╤Б╤В╨╡╨║╨░. ╨в╨░╨║ ╨║╨╛╨╝╨░╨╜╨┤╤Л PUSH, +CALL ╨╕ RST ╨┐╤А╨╕╨▓╨╛╨┤╤П╤В ╨║ ╤Г╨▓╨╡╨╗╨╕╤З╨╡╨╜╨╕╤О ╤Н╤В╨╛╨│╨╛ ╤З╨╕╤Б╨╗╨░, ╨░ ╨║╨╛╨╝╨░╨╜╨┤╤Л POP ╨╕ RET - +╤Б╨╛╨╛╤В╨▓╨╡╤В╤Б╤В╨▓╨╡╨╜╨╜╨╛ ╨║ ╤Г╨╝╨╡╨╜╤М╤И╨╡╨╜╨╕╤О. ╨з╨╕╤Б╨╗╨╛ ╨▓╤Б╨╡╨│╨┤╨░ ╨╛╤В╨╛╨▒╤А╨░╨╢╨╡╨╜╨╛ ╨▓ ╨┤╨╡╤Б╤П╤В╨╕╤З╨╜╨╛╨╝ ╤Д╨╛╤А╨╝╨░╤В╨╡ ╨╕ +╨╝╨╛╨╢╨╡╤В ╨▒╤Л╤В╤М ╨╛╤В╤А╨╕╤Ж╨░╤В╨╡╨╗╤М╨╜╤Л╨╝. + +2.2. ╨Ф╨░╨╝╨┐ ╤Б╤В╨╡╨║╨░. + +тХатХРтХРтХРтХРтХРтХРтХРтХРтХзтХРтХРтХж ╨Т╨╡╤А╤И╨╕╨╜╨░ ╤Б╤В╨╡╨║╨░ ╨┐╨╛╨┤╤Б╨▓╨╡╤З╨╡╨╜╨░. ╨Э╨╕╨╢╨╡ ╨┐╨╛╨┤╤Б╨▓╨╡╤З╨╡╨╜╨╜╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕ ╨╜╨░╤Е╨╛╨┤╤П╤В╤Б╤П +тХС#8002 #6C7EтХС ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П ╤Б╨╜╤П╤В╤Л╨╡ ╤Б╨╛ ╤Б╤В╨╡╨║╨░, ╨▓╤Л╤И╨╡ - ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П ╨▓ ╤Б╤В╨╡╨║╨╡. +тХС#8000 #7E00тХС +тХС#7FFE #302CтХС +тХС#7FFC #FB82тХС +тХС#7FFA #FB82тХС +тХС#7FF8 #FB82тХС +тХС#7FF6 #2C40тХС +тХС#7FF4 #1637тХС +тХЪтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХй + тФФтФАтФмтФАтФШ тФФтФАтФмтФАтФШ + тФВ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨Ч╨╜╨░╤З╨╡╨╜╨╕╨╡ ╨┐╨░╨╝╤П╤В╨╕ + тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨Р╨┤╤А╨╡╤Б ╨┐╨░╨╝╤П╤В╨╕ + +2.3. ╨Ю╨║╨╜╨╛ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░. + + ╨в╨╡╨║╤Г╤Й╨╡╨╡ ╨▓╤А╨╡╨╝╤П тФАтФАтФАтФАтФАтФАтФАтФР + тФМтФАтФАтФАтФ┤тФАтФАтФР + +тХжтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХР01:58:36тХЧ +тХС #A000 7A LD A,D тХС +тХС #A001 FE20 CP #20 тХС +тХв #A003 20E2 JR NZ,#9FE7 тХС +тХС #A005 2128A0 LD HL,#A028 тХС +тХС #A008 AF XOR A тХС +тХС #A009 0E0A LD C,#0A тХС +тХС #A00B D7 RST #10 тХС +тХС #A00C 380E JR C,#A01C тХС +тХв #A00E F5 PUSH AF тХС +тХС #A00F 2100C0 LD HL,#C000 тХС +тХС #A012 11400A LD DE,#0A40 тХС +тХС #A015 0E14 LD C,#14 тХС +тХС #A017 D7 RST #10 тХС +тХС #A018 F1 POP AF тХС +тХв #A019 0E12 LD C,#12 тХС +тХС #A01B D7 RST #10 тХС +тХг #A01C 3A32A0 LD A,(#A032) тХС +тХС #A01F 0E3C LD C,#3C тХС +тХг #A021 D7 RST #10 тХС +тХС #A022 3A33A0 LD A,(#A033) тХС +тХйтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХг + тФФтФАтФмтФАтФШ тФФтФАтФАтФАтФАтФАтФАтФмтФАтФАтФАтФАтФАтФШ тФФтФАтФАтФАтФмтФАтФАтФШ тФФтФАтФАтФАтФАтФАтФмтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФШ + тФВ тФВ тФВ тФФтФАтФА ╨Ь╨╜╨╡╨╝╨╛╨╜╨╕╨║╨░ ╨║╨╛╨╝╨░╨╜╨┤╤Л + тФВ тФВ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨Я╨╛╨╗╨╡ ╨║╨╛╨┤╨░ ╨║╨╛╨╝╨░╨╜╨┤╤Л + тФВ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨Я╨╛╨╗╨╡ ╨╝╨╡╤В╨║╨╕ + тФВ (╨▓ ╤В╨╡╨║╤Г╤Й╨╡╨╣ ╨▓╨╡╤А╤Б╨╕╨╕ ╨╜╨╡ ╤А╨╡╨░╨╗╨╕╨╖╨╛╨▓╨░╨╜╨╛) + тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨Р╨┤╤А╨╡╤Б ╨║╨╛╨╝╨░╨╜╨┤╤Л + +╨в╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╝╨░╨╜╨┤╨░ ╨┐╤А╨╛╤Ж╨╡╤Б╤Б╨╛╤А╨░ (╨╜╨░ ╨║╨╛╤В╨╛╤А╤Г╤О ╤Г╨║╨░╨╖╤Л╨▓╨░╨╡╤В PC) ╨▓╤Л╨┤╨╡╨╗╨╡╨╜╨░ ╨┐╨╛╨╗╨╛╤Б╨╛╨╣. + +2.4. ╨Ф╨░╨╝╨┐ ╨┐╨░╨╝╤П╤В╨╕. + + ASCII ╨┐╤А╨╡╨┤╤Б╤В╨░╨▓╨╗╨╡╨╜╨╕╨╡ ╨┐╨░╨╝╤П╤В╨╕ тФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФР + тФМтФАтФАтФАтФАтФАтФАтФАтФ┤тФАтФАтФАтФАтФАтФАтФР +тХжтХРтХйтХРтХРтХРтХРтХРтХРтХРтХРтХРтХйтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХг +тХС #4000 007E 7E6C 1038 1000 FF00 FF0F 3C3F 7F18 .~~l.8................ тХС +тХС #4020 0030 6C6C 3000 3860 1860 0000 0000 0006 .0ll0.8`.`...... тХС +тХС #4030 7C30 7878 1CFC 38FC 7878 0000 1800 6078 |0xx.тДЦ8тДЦxx....`x тХС +тХС #4040 7C30 FC3C F8FE FE3C CC78 1EE6 F0C6 C638 |0тДЦ<┬░тЦатЦа<тХаx.╤Ж╨БтХЮтХЮ8 тХС +тХС #4050 FC78 FC78 FCCC CCC6 C6CC FE78 C078 1000 тДЦxтДЦxтДЦтХатХатХЮтХЮтХатЦаxтФФx.. тХС +тХС #4060 3000 E000 1C00 3800 E030 0CE0 7000 0000 0.╤А...8.╤А0.╤Аp... тХС +тХС #4070 0000 0000 1000 0000 0000 001C 18E0 7600 .............╤Аv. тХС +тХйтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХРтХЭ + тФФтФАтФмтФАтФШ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФмтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФШ + тФВ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА HEX ╨┐╤А╨╡╨┤╤Б╤В╨░╨▓╨╗╨╡╨╜╨╕╨╡ ╨┐╨░╨╝╤П╤В╨╕ + тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФА ╨Р╨┤╤А╨╡╤Б╨░ ╨┐╨░╨╝╤П╤В╨╕ ╨┤╨░╨╝╨┐╨░ + +3. ╨г╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╨╡. + +╨г╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╨╡ ╨▓ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╨╡ ╨╛╤Б╤Г╤Й╨╡╤Б╤В╨▓╨╗╤П╨╡╤В╤Б╤П ╨┐╤А╨╕ ╨┐╨╛╨╝╨╛╤Й╨╕ ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л. + +3.1. ╨Ю╨▒╤Й╨╡╨╡ ╤Г╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╨╡. + +╨н╤В╨╕ ╨┐╨╛╤Б╨╗╨╡╨┤╨╛╨▓╨░╤В╨╡╨╗╤М╨╜╨╛╤Б╤В╨╕ ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╨╜╤Л╤Е ╨║╨╛╨╝╨░╨╜╨┤ ╨╛╨▒╤А╨░╨▒╨░╤В╤Л╨▓╨░╤О╤В╤Б╤П ╨▓ ╨╜╨╡╨╖╨░╨▓╨╕╤Б╨╕╨╝╨╛╤Б╤В╨╕ ╨╛╤В +╤В╨╛╨│╨╛, ╨▓ ╨║╨░╨║╨╛╨╝ ╨╛╨║╨╜╨╡ ╨╜╨░╤Е╨╛╨┤╨╕╤В╤Б╤П ╨║╤Г╤А╤Б╨╛╤А ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л: + +TAB - ╨┐╨╡╤А╨╡╤Е╨╛╨┤ ╨▓ ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╡╨╡ ╨╛╨║╨╜╨╛ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л; +SHIFT+TAB - ╨┐╨╡╤А╨╡╤Е╨╛╨┤ ╨▓ ╨┐╤А╨╡╨┤╤Л╨┤╤Г╤Й╨╡╨╡ ╨╛╨║╨╜╨╛ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л; +CTRL+E - ╨┐╨╡╤А╨╡╨║╨╗╤О╤З╨╡╨╜╨╕╨╡ dEc/hEc ╤Б╨╕╤Б╤В╨╡╨╝╤Л ╨▓╤Л╨▓╨╛╨┤╨░ ╤З╨╕╤Б╨╡╨╗ ╨╜╨░ ╤Н╨║╤А╨░╨╜╨╡; +CTRL+R - ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╨╡ ╨░╨┤╤А╨╡╤Б╨░ ╤А╨░╨╖╨╝╨╡╤Й╨╡╨╜╨╕╤П ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░; +F7 ╨╕╨╗╨╕ CTRL+Z - ╨▓╤Л╨┐╨╛╨╗╨╜╨╡╨╜╨╕╨╡ ╤В╨╡╨║╤Г╤Й╨╡╨╣ ╨║╨╛╨╝╨░╨╜╨┤╤Л ╨┐╤А╨╛╤Ж╨╡╤Бc╨╛╤А╨░; +F8 ╨╕╨╗╨╕ CTRL+C - ╨▓╤Л╨┐╨╛╨╗╨╜╨╡╨╜╨╕╨╡ ╤В╨╡╨║╤Г╤Й╨╡╨╣ ╨║╨╛╨╝╨░╨╜╨┤╤Л ╨┐╤А╨╛╤Ж╨╡╤Бc╨╛╤А╨░ ╤Б ╨░╨▓╤В╨╛╨╝╨░╤В╨╕╤З╨╡╤Б╨║╨╕╨╝ + ╨▓╤Л╨┐╨╛╨╗╨╜╨╡╨╜╨╕╨╡╨╝ ╨┐╨╛╨┤╨┐╤А╨╛╨│╤А╨░╨╝╨╝ ╨╕ ╤Ж╨╕╨║╨╗╨░ DJNZ; +F9 ╨╕╨╗╨╕ CTRL+V - ╨┐╤А╨╛╨┐╤Г╤Б╨║ ╤В╨╡╨║╤Г╤Й╨╡╨╣ ╨║╨╛╨╝╨░╨╜╨┤╤Л ╨┐╤А╨╛╤Ж╨╡╤Бc╨╛╤А╨░, ╨░╨┤╤А╨╡╤Б ╨▓ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨╛╨╣ ╨┐╨░╤А╨╡ + PC ╤Г╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╤В╤Б╤П ╨╜╨░ ╤Б╨╗╨╡╨┤╤Г╤О╤Й╤Г╤О ╨║╨╛╨╝╨░╨╜╨┤╤Г ╨▒╨╡╨╖ ╨╕╤Б╨┐╨╛╨╗╨╜╨╡╨╜╨╕╤П + ╨┐╤А╨╡╨┤╤Л╨┤╤Г╤Й╨╡╨╣; +ESC - ╨┐╤А╨╛╤Б╨╝╨╛╤В╤А ╤Б╨╕╤Б╤В╨╡╨╝╨╜╨╛╨│╨╛ ╤Н╨║╤А╨░╨╜╨░; +F10 ╨╕╨╗╨╕ ALT+X - ╨▓╤Л╤Е╨╛╨┤ ╨╕╨╖ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л. + +╨Т ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╨╡ ╤А╨╡╨░╨╗╨╕╨╖╨╛╨▓╨░╨╜╨░ ╨┐╨╛╨╗╨╜╨╛╤Ж╨╡╨╜╨╜╨░╤П ╤Б╤В╤А╨╛╨║╨░ ╨▓╨▓╨╛╨┤╨░. ╨Ф╨░╨╜╨╜╤Л╨╡ ╨╝╨╛╨╢╨╜╨╛ ╨▓╨▓╨╛╨┤╨╕╤В╤М ╨║╨░╨║ ╨▓ +HEX, ╤В╨░╨║ ╨╕ ╨▓ DEC ╤Б╨╕╤Б╤В╨╡╨╝╨░╤Е ╨╕╤Б╤З╨╕╤Б╨╗╨╡╨╜╨╕╤П, ╨┐╤А╨╕╤З╨╡╨╝ HEX-╤З╨╕╤Б╨╗╨╛ ╨┤╨╛╨╗╨╢╨╜╨╛ ╨╜╨░╤З╨╕╨╜╨░╤В╤М╤Б╤П ╤Б +╨┐╤А╨╡╤Д╨╕╨║╤Б╨░ #, ╨╗╨░╤В╨╕╨╜╤Б╨║╨╛╨╣ ╨╗╨╕╤В╨╡╤А╤Л x ╨╕╨╗╨╕ X. + +3.2. ╨Ю╨║╨╜╨╛ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓. + +HOME - ╨▓ ╨╜╨░╤З╨░╨╗╨╛ ╤В╨╡╨║╤Г╤Й╨╡╨╣ ╤Б╤В╤А╨╛╨║╨╕; +END - ╨▓ ╨║╨╛╨╜╨╡╤Ж ╤В╨╡╨║╤Г╤Й╨╡╨╣ ╤Б╤В╤А╨╛╨║╨╕; +PAGE UP - ╨╜╨░ ╨┐╨╡╤А╨▓╤Г╤О ╤Б╤В╤А╨╛╨║╤Г ╤Г╤Б╨╗╨╛╨▓╨╜╨╛╨╣ ╨╛╨▒╨╗╨░╤Б╤В╨╕; +PAGE DOWN - ╨╜╨░ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╤О╤О ╤Б╤В╤А╨╛╨║╤Г ╤Г╤Б╨╗╨╛╨▓╨╜╨╛╨╣ ╨╛╨▒╨╗╨░╤Б╤В╨╕; +ENTER - ╨╜╨░╤З╨░╨╗╨╛ ╤А╨╡╨┤╨░╨║╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╤П ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╤Е ╨┐╨░╤А, ╨▒╨░╨╣╤В ╨┐╨░╨╝╤П╤В╨╕ + ╨╕ ASCII ╨┐╤А╨╡╨┤╤Б╤В╨░╨▓╨╗╨╡╨╜╨╕╤П ╨┐╨░╨╝╤П╤В╨╕ ╨╕ ╨░╨║╨║╤Г╨╝╤Г╨╗╤П╤В╨╛╤А╨░, ╨░ ╤В╨░╨║╨╢╨╡ ╨╜╨╛╨╝╨╡╤А╨╛╨▓ + ╨▒╨░╨╜╨╛╨║, ╨▓╨║╨╗╤О╤З╨╡╨╜╨╜╤Л╤Е ╨▓ ╨╛╨║╨╜╨░ ╨┐╤А╨╛╤Ж╨╡╤Б╤Б╨╛╤А╨░; + - ╨╕╨╜╨▓╨╡╤А╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨▒╨╕╤В╨╛╨▓ ╨┤╨▓╨╛╨╕╤З╨╜╨╛╨│╨╛ ╨┐╤А╨╡╨┤╤Б╤В╨░╨▓╨╗╨╡╨╜╨╕╤П ╨░╨║╨║╤Г╨╝╤Г╨╗╤П╤В╨╛╤А╨░ ╨╕ + ╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ / ╤Б╨▒╤А╨╛╤Б ╤Д╨╗╨░╨│╨╛╨▓, ╨░ ╤В╨░╨║╨╢╨╡ ╨╛╨▒╨╜╤Г╨╗╨╡╨╜╨╕╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П ╨│╨╗╤Г╨▒╨╕╨╜╤Л + ╤Б╤В╨╡╨║╨░. + +3.3. ╨Ф╨░╨╝╨┐ ╤Б╤В╨╡╨║╨░. + +PAGE UP - ╨┐╨╛-╤Б╤В╤А╨░╨╜╨╕╤З╨╜╤Л╨╣ ╨┐╤А╨╛╤Б╨╝╨╛╤В╤А ╤Б╤В╨╡╨║╨░; +PAGE DOWN - ╨┐╨╛-╤Б╤В╤А╨░╨╜╨╕╤З╨╜╤Л╨╣ ╨┐╤А╨╛╤Б╨╝╨╛╤В╤А ╤Б╤В╨╡╨║╨░; +HOME - ╨▓╨╡╤А╨╜╤Г╤В╤М ╨▓╨╡╤А╤И╨╕╨╜╤Г ╤Б╤В╨╡╨║╨░ ╨▓ ╤Д╨╛╨║╤Г╤Б; +CTRL+X - ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М ╤Б╤В╨╡╨║ ╨╜╨░ ╤В╨╡╨║╤Г╤Й╤Г╤О ╤Б╤В╤А╨╛╨║╤Г; +ENTER - ╨▓╨▓╨╛╨┤ ╨╜╨╛╨▓╨╛╨│╨╛ ╨░╨┤╤А╨╡╤Б╨░ ╨╕╨╗╨╕ ╨┤╨░╨╜╨╜╤Л╤Е; + - ╨▓╨▓╨╛╨┤ ╨░╨┤╤А╨╡╤Б╨░ ╨▓ ╨┐╨╛╨┤╤Б╨▓╨╡╤З╨╡╨╜╨╜╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╡ (╨╜╨░ ╨▓╨╡╤А╤И╨╕╨╜╨╡ ╤Б╤В╨╡╨║╨░) ╨┐╤А╨╕╨▓╨╛╨┤╨╕╤В + ╨║ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤О ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨╛╨╣ ╨┐╨░╤А╤Л SP. + +3.4. ╨Ю╨║╨╜╨╛ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░. + +PAGE UP - ╨╜╨░ ╤Б╤В╤А╨░╨╜╨╕╤Ж╤Г ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ ╨▓╨▓╨╡╤А╤Е; +PAGE DOWN - ╨╜╨░ ╤Б╤В╤А╨░╨╜╨╕╤Ж╤Г ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ ╨▓╨╜╨╕╨╖; +HOME - ╨┐╨╡╤А╨╡╤Е╨╛╨┤ ╨▓ ╨║╨╛╨╗╨╛╨╜╨║╤Г ╨░╨┤╤А╨╡╤Б╨░; +END - ╨┐╨╡╤А╨╡╤Е╨╛╨┤ ╨▓ ╨║╨╛╨╗╨╛╨╜╨║╤Г ╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║╨╕; +CTRL+X - ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╡ ╤Б╤З╨╡╤В╤З╨╕╨║╨░ ╨║╨╛╨╝╨░╨╜╨┤ ╨╜╨░ ╤В╨╡╨║╤Г╤Й╤Г╤О ╤Б╤В╤А╨╛╨║╤Г; +RCTRL+╤Ж╨╕╤Д╤А╨░ - ╨╖╨░╨┐╨╛╨╝╨╕╨╜╨░╨╜╨╕╨╡ ╤В╨╡╨║╤Г╤Й╨╡╨│╨╛ ╨░╨┤╤А╨╡╤Б╨░ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ (╨╖╨░╨┐╨╛╨╝╨╜╨╕╤В╤М ╨╖╨░╨║╨╗╨░╨┤╨║╤Г); +LCTRL+╤Ж╨╕╤Д╤А╨░ - ╨▒╤Л╤Б╤В╤А╤Л╨╣ ╨┐╨╡╤А╨╡╤Е╨╛╨┤ ╨╜╨░ ╨░╨┤╤А╨╡╤Б ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ (╨╜╨░ ╤Б╨╛╤Е╤А. ╤А╨░╨╜╨╡╨╡ ╨╖╨░╨║╨╗╨░╨┤╨║╤Г); +LCTRL+~ - ╨▒╤Л╤Б╤В╤А╤Л╨╣ ╤Ж╨╕╨║╨╗╨╕╤З╨╡╤Б╨║╨╕╨╣ ╨┐╨╡╤А╨╡╤Е╨╛╨┤ (╨╛╤В╨╛╨▒╤А╨░╨╢╨╡╨╜╨╕╨╡ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░) + ╨▓ ╨╜╨░╤З╨░╨╗╨╛ 0..3 ╨╛╨║╨╛╨╜ ╨┐╨░╨╝╤П╤В╨╕ ╨┐╤А╨╛╤Ж╨╡╤Б╤Б╨╛╤А╨░; +ENTER - ╤А╨╡╨┤╨░╨║╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨░╨┤╤А╨╡╤Б╨░ ╨╕╨╗╨╕ ╨║╨╛╨┤╨░ ╨║╨╛╨╝╨░╨╜╨┤╤Л, ╨┐╤А╨╕╤З╨╡╨╝ ╨║╨╛╨┤ ╨║╨╛╨╝╨░╨╜╨┤╤Л + ╨▓╨▓╨╛╨┤╨╕╤В╤Б╤П ╤В╨╛╨╗╤М╨║╨╛ ╨▓ HEX ╤Б╨╕╤Б╤В╨╡╨╝╨╡ ╨╕╤Б╤З╨╕╤Б╨╗╨╡╨╜╨╕╤П. + +3.5. ╨Ф╨░╨╝╨┐ ╨┐╨░╨╝╤П╤В╨╕. + +PAGE UP - ╨╜╨░ ╤Б╤В╤А╨░╨╜╨╕╤Ж╤Г ╨┤╨░╨╝╨┐╨░ ╨▓╨▓╨╡╤А╤Е; +PAGE DOWN - ╨╜╨░ ╤Б╤В╤А╨░╨╜╨╕╤Ж╤Г ╨┤╨░╨╝╨┐╨░ ╨▓╨╜╨╕╨╖; +HOME - ╨┐╨╡╤А╨╡╤Е╨╛╨┤ ╨║ ╨║╨╛╨╗╨╛╨╜╨║╨╡ ╨░╨┤╤А╨╡╤Б╨░; +END - ╨┐╨╡╤А╨╡╤Е╨╛╨┤ ╨║ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╡╨╣ ╨║╨╛╨╗╨╛╨╜╨║╨╡ ╨╛╨║╨╜╨░; +CTRL+HOME - ╨┐╨╡╤А╨╡╤Е╨╛╨┤ ╨┐╨╛╤Б╨╗╨╡╨┤╨╛╨▓╨░╤В╨╡╨╗╤М╨╜╨╛ (╨╡╤Б╨╗╨╕ ╨║╤Г╤А╤Б╨╛╤А ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜ ╨▓ ╨║╨╛╨╜╤Ж╨╡ + ╤Б╤В╤А╨╛╨║╨╕ ╨┤╨░╨╝╨┐╨░) ╨║ ╨┐╨╡╤А╨▓╨╛╨╣ ╨║╨╛╨╗╨╛╨╜╨║╨╡ ASCII ╨┐╤А╨╡╨┤╤Б╤В╨░╨▓╨╗╨╡╨╜╨╕╤П ╨┐╨░╨╝╤П╤В╨╕, + ╨┤╨░╨╗╨╡╨╡ ╨║ ╨┐╨╡╤А╨▓╨╛╨╣ ╨║╨╛╨╗╨╛╨╜╨║╨╡ ╨▒╨░╨╣╤В ╨┐╨░╨╝╤П╤В╨╕ ╨╕ ╨╜╨░╨║╨╛╨╜╨╡╤Ж ╨║ ╨░╨┤╤А╨╡╤Б╤Г; +CTRL+END - ╨┐╨╡╤А╨╡╤Е╨╛╨┤ ╨║ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╡╨╣ ╨║╨╛╨╗╨╛╨╜╨║╨╡ ╨▒╨░╨╣╤В ╨┐╨░╨╝╤П╤В╨╕ ╨╕ ╨┤╨░╨╗╨╡╨╡ ╨║ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╡╨╣ + ╨║╨╛╨╗╨╛╨╜╨║╨╡ ASCII ╨┐╤А╨╡╨┤╤Б╤В╨░╨▓╨╗╨╡╨╜╨╕╤П ╨┐╨░╨╝╤П╤В╨╕; +ENTER - ╤А╨╡╨┤╨░╨║╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨░╨┤╤А╨╡╤Б╨░ ╨╕╨╗╨╕ ╤В╨╡╨║╤Г╤Й╨╕╤Е ╨┤╨░╨╜╨╜╤Л╤Е, ╨┐╤А╨╕╤З╨╡╨╝ + ╤А╨╡╨┤╨░╨║╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨▓ ╨┐╨╛╨╗╨╡ ╨┤╨░╨╜╨╜╤Л╤Е ╨╕ ╨▓ ╨┐╨╛╨╗╨╡ ASCII ╨┐╤А╨╡╨┤╤Б╤В╨░╨▓╨╗╨╡╨╜╨╕╤П + ╨┐╨░╨╝╤П╤В╨╕ ╨╜╨╡╤Б╨║╨╛╨╗╤М╨║╨╛ ╨╛╤В╨╗╨╕╤З╨░╨╡╤В╤Б╤П - ╨║╤Г╤А╤Б╨╛╤А ╨┐╨╛╤Б╨╗╨╡ ╨▓╨▓╨╛╨┤╨░ ╨╛╤З╨╡╤А╨╡╨┤╨╜╨╛╨│╨╛ + ╨▒╨░╨╣╤В╨░ ╨░╨▓╤В╨╛╨╝╨░╤В╨╕╤З╨╡╤Б╨╕ ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨╕╤В ╨║ ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╡╨╝╤Г. diff --git a/disasm.asm b/disasm.asm new file mode 100644 index 0000000..6768ef2 --- /dev/null +++ b/disasm.asm @@ -0,0 +1,786 @@ +;[]=========================================================================[] +;[] ╨Ф╨╕╨╖╨░╤Б╤Б╨╡╨╝╨▒╨╗╨╡╤А ╨╝╨╛╨╜╨╕╤В╨╛╤А╨░-╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ DemoN [] +;[] v0.01 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 10.10.2004 [] +;[] v0.02 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 20.03.2005 [] +;[] v0.03 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 16.02.2006 [] +;[] v0.10 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 10.09.2006 [] +;[] [] +;[] DisAsm - ╨▓╤Л╨▓╨╛╨┤ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ [] +;[] AttrList - ╨▓╤Л╨▓╨╛╨┤ ╨░╤В╤А╨╕╨▒╤Г╤В╨╛╨▓ ╤Б╤В╤А╨╛╨║╨╕ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ [] +;[] UpAddress - ╤А╨░╤Б╤З╨╡╤В ╨┐╤А╨╡╨┤╤Л╨┤╤Г╤Й╨╡╨│╨╛ ╨░╨┤╤А╨╡╤Б╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ [] +;[] List - ╤Д╨╛╤А╨╝╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╤Б╤В╤А╨╛╨║╨╕ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ [] +;[]=========================================================================[] + +;[]=========================================================================[] +;[] ╨Т╤Л╨▓╨╛╨┤ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ [] +;[]=========================================================================[] +DisAsm: + ld hl,(ListAddr) ; ╨░╨┤╤А╨╡╤Б ╨┐╨╡╤А╨▓╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + ld de,0x011A ; ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨┐╨╡╤З╨░╤В╨╕ +.L1 push de + push hl + push de + ld a,d + dec a + add a,a + ld c,a + ld b,0 + ex de,hl + ld hl,ListAddr + add hl,bc + ld (hl),e ; ╨░╨┤╤А╨╡╤Б ╤Б╤В╤А╨╛╨║╨╕ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + inc hl + ld (hl),d + ex de,hl + pop de + + call AttrList ; ╨╛╨║╤А╨░╤Б╨╕╤В╤М ╤Б╤В╤А╨╛╨║╤Г + +.L2 call PrintReg + pop hl + call List + pop de + +; push af ; ╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ ╨▓╤А╨╡╨╝╨╡╨╜╨╜╨╛ + + ld a,(ListFormat) ; ╤Д╨╛╤А╨╝╨░╤В╨╜╤Л╨╣ ╨▓╤Л╨▓╨╛╨┤ + or a + call nz,LFormat + + push de + push hl + di + ld a,21 + add a,e + ld e,a ; ╨╜╨╛╨▓╨░╤П ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╨░ X + ld c,Bios.Lp_Set_Place ; ╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╕ ╨┐╨╡╤З╨░╤В╨╕ + rst BiosRst +; ld c,Dss.Locate +; rst DssRst + ld hl,List.String + ld bc,32*256+Bios.Lp_Print_Ln2 ; ╨▓ ╤А╨╡╨│.B ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ + rst BiosRst + ei +; ld c,Dss.PChars +; rst DssRst + pop hl + pop de + + ;╨┐╨╡╤З╨░╤В╤М ╨┤╨╗╨╕╨╜╤Л ╨║╨╛╨┤╨░ ╨▓ ╨┐╨╛╨╗╨╡ ╨╝╨╡╤В╨║╨╕ (╨▓╤А╨╡╨╝╨╡╨╜╨╜╨╛) +; pop af +; push de +; push hl +; ld e,0x24 +; push de +; ld h,0 +; ld l,a +; ld de,.Buf +; call NumToStr8 +; pop de +; ld c,Dss.Locate +; rst DssRst +; ld hl,.Buf +; ld c,Dss.PChars +; rst DssRst +; pop hl +; pop de +; jr $+5 +;.Buf db "123",0 + ;end (╨▓╤А╨╡╨╝╨╡╨╜╨╜╨╛) + + inc d ; ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + ld a,(KEYB.KList.Descript) ; ╨║╨╛╨╗-╨▓╨╛ ╤Б╤В╤А╨╛╨║ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + cp d + jr nc,.L1 + ret + +;[]=========================================================================[] +;[] ╨Т╤Л╨▓╨╛╨┤ ╨░╤В╤А╨╕╨▒╤Г╤В╨╛╨▓ ╤Б╤В╤А╨╛╨║╨╕ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ [] +;[] ╨Т╤Е╨╛╨┤: DE - ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨┐╨╛╨┤╤Б╨▓╨╡╤В╨║╨╕ [] +;[] HL - ╤В╨╡╨║╤Г╤Й╨╕╨╣ ╨░╨┤╤А╨╡╤Б ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ [] +;[]=========================================================================[] +AttrList: + di + push hl ; ╤В╨╡╨║╤Г╤Й╨╕╨╣ ╨░╨┤╤А╨╡╤Б ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + push de ; ╤В╨╡╨║╤Г╤Й╨╕╨╡ ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л + + push hl + ld bc,(Reg._PC) ; ╨░╨┤╤А╨╡╤Б ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╨╜╨╛╨│╨╛ ╤Б╤З╨╡╤В╤З╨╕╨║╨░ + or a ; ╤Б╨▒╤А╨╛╤Б ╤Д╨╗╨░╨│╨░ C + sbc hl,bc + pop hl + jr nz,.L2 + ld a,(Color._PC) ; ╤Ж╨▓╨╡╤В ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╨╜╨╛╨│╨╛ ╨║╤Г╤А╤Б╨╛╤А╨░ + jr .L0 + +.L2 push hl + push de + push hl + ld bc,Rezident.End-Rezident ; ╨┤╨╗╨╕╨╜╨░ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + ld hl,(RezAdr) ; ╨╜╨░╤З╨░╨╗╨╛ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + push hl + add hl,bc ; ╨║╨╛╨╜╨╡╤З╨╜╤Л╨╣ ╨░╨┤╤А╨╡╤Б ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + pop de + dec de + dec de + dec de + dec de + pop bc + + call AdrArea + pop de + pop hl + jr c,.L3 + ld a,(Color.RezArea) ; ╤Ж╨▓╨╡╤В ╨╛╨▒╨╗╨░╤Б╤В╨╕ ╤А╨░╨╖╨╝╨╡╤Й╨╡╨╜╨╕╤П ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + jr .L0 + +.L3 ld a,(Color.Screen) ; ╨╛╤Б╨╜╨╛╨▓╨╜╨╛╨╣ ╤Ж╨▓╨╡╤В + +.L0 ld (.L1+1),a + dec e + ld c,Bios.Lp_Set_Place ; ╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╕ ╨┐╨╡╤З╨░╤В╨╕ + rst BiosRst +.L1 ld e,0 ; ╤Ж╨▓╨╡╤В ╨┐╨╛╨┤╤Б╨▓╨╡╤В╨║╨╕ + ld bc,54*256+Bios.Lp_Print_Atr ; ╨▓ ╤А╨╡╨│.B ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ + rst BiosRst + pop de + pop hl + ei + ret + +;[]=========================================================================[] +;[] ╨а╨░╤Б╤З╨╡╤В ╨┐╤А╨╡╨┤╤Л╨┤╤Г╤Й╨╡╨│╨╛ ╨░╨┤╤А╨╡╤Б╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ [] +;[] ╨Т╤Е╨╛╨┤: HL - ╨░╨┤╤А╨╡╤Б ╤В╨╡╨║╤Г╤Й╨╡╨╣ ╤Б╤В╤А╨╛╨║╨╕ [] +;[] ╨Т╤Л╤Е╨╛╨┤: HL - ╨░╨┤╤А╨╡╤Б ╨┐╤А╨╡╨┤╤Л╨┤╤Г╤Й╨╡╨╣ ╤Б╤В╤А╨╛╨║╨╕ [] +;[]=========================================================================[] +UpAddress: + ld de,-4 + add hl,de ; 4-╤Е ╨▒╨░╨╣╤В╨╜╨░╤П ╨║╨╛╨╝╨░╨╜╨┤╨░? + call Ld_a_hl +; ld a,(hl) + cp 0xDD ; ╨┐╤А╨╡╤Д╨╕╨║╤Б 0xDD + jr z,$+8 + or 00110000b ; ╨╝╨░╤Б╨║╨░ ╨┤╨╗╤П ╨┐╤А╨╡╤Д╨╕╨║╤Б╨╛╨▓ 0xED,0xFD + cp 0xFD + jr nz,.L1 + push hl + call List + pop hl + cp 4 + ret z + +.L1 inc hl + push hl ; 3-╤Е ╨▒╨░╨╣╤В╨╜╨░╤П ╨║╨╛╨╝╨░╨╜╨┤╨░? + call List + pop hl + cp 3 + ret z + + inc hl + push hl ; 2-╤Е ╨▒╨░╨╣╤В╨╜╨░╤П ╨║╨╛╨╝╨░╨╜╨┤╨░? + call List + pop hl + cp 2 + ret z + + inc hl + ret ; 1-╨╛ ╨▒╨░╨╣╤В╨╜╨░╤П ╨║╨╛╨╝╨░╨╜╨┤╨░! + +;[]=========================================================================[] +;[] ╨д╨╛╤А╨╝╨░╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╤Б╤В╤А╨╛╨║╨╕ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ [] +;[]=========================================================================[] +LFormat: + push hl + ld hl,List.String+11 ; ╨╜╨░╤З╨░╨╗╨╛ ╤Б╤В╤А╨╛╨║╨╕ + ld bc,2 ; ╨╝╨░╨║╤Б ╨║╨╛╨╗-╨▓╨╛ ╨▓╤Б╤В╨░╨▓╨╗╤П╨╡╨╝╤Л╤Е ╨┐╤А╨╛╨▒╨╡╨╗╨╛╨▓ +.L2 ld a,(hl) + or a + jr z,.Exit + cp 0x20 ; ╨┐╤А╨╛╨▒╨╡╨╗ + jr z,.L1 + inc hl + dec c + jr nz,.L2 + +.Exit pop hl + ret + +.L1 push de + push bc + push hl + ld hl,List.String+30 ; ╨║╨╛╨╜╨╡╤Ж ╤Б╤В╤А╨╛╨║╨╕ + ld d,h + ld e,l + or a + sbc hl,bc + pop bc + push bc + push hl + sbc hl,bc ; ╨║╨╛╨╗-╨▓╨╛ ╨▒╨░╨╣╤В + ld b,h + ld c,l + pop hl + lddr + pop hl + pop bc ; ╨║╨╛╨╗-╨▓╨╛ ╨┐╤А╨╛╨▒╨╡╨╗╨╛╨▓ + ld b,c +.L3 inc hl ; ╨░╨┤╤А╨╡╤Б ╨▓╤Б╤В╨░╨▓╨║╨╕ + ld a,0x20 + ld (hl),a + djnz .L3 + pop de + pop hl + ret + +;[]=========================================================================[] +;[] ╨д╨╛╤А╨╝╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╤Б╤В╤А╨╛╨║╨╕ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ [] +;[] ╨Т╤Е╨╛╨┤: HL - ╨░╨┤╤А╨╡╤Б ╨┐╨░╨╝╤П╤В╨╕ ╨┤╨╕╨╖╨░╤Б╤Б╨╡╨╝╨▒╨╗╨╕╤А╨╛╨▓╨░╨╜╨╕╤П [] +;[] ╨Т╤Л╤Е╨╛╨┤: HL - ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╕╨╣ ╨╖╨░ ╨┤╨╕╨╖╨░╤Б╤Б╨╡╨╝╨▒╨╗╨╕╤А╨╛╨▓╨░╨╜╨╜╨╛╨╣ ╨║╨╛╨╝╨░╨╜╨┤╨╛╨╣ ╨░╨┤╤А╨╡╤Б ╨┐╨░╨╝╤П╤В╨╕ [] +;[] A - ╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ ╨║╨╛╨╝╨░╨╜╨┤╤Л [] +;[]=========================================================================[] +List: + xor a ; ╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ ╨║╨╛╨╝╨░╨╜╨┤╤Л + ld (.Byte),a + push hl + ld d,h + ld e,l + + ld hl,.String ; ╨╛╤З╨╕╤Б╤В╨║╨░ ╨▒╤Г╤Д╨╡╤А╨░ ╤Б╤В╤А╨╛╨║╨╕ +; di ; ╤Б ╨╕╤Б╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╨╜╨╕╨╡╨╝ ╨░╨║╤Б╨╡╨╗╤П +; ld d,d ; ╨▓╨║╨╗╤О╤З╨╕╤В╤М ╨░╨║╤Б╨╡╨╗╤М +; ld a,32 ; ╨┤╨╗╨╕╨╜╨░ ╨▒╤Г╤Д╨╡╤А╨░ ╨╕ ╨▒╨░╨╣╤В ╨╖╨░╨┐╨╛╨╗╨╜╨╕╤В╨╡╨╗╤М +; ld c,c ; ╨║╨╛╨╝╨░╨╜╨┤╨░ ╨╖╨░╨┐╨╛╨╗╨╜╨╡╨╜╨╕╤П +; ld (hl),a ; ╨╖╨░╨┐╨╛╨╗╨╜╨╕╤В╤М +; ld b,b ; ╨▓╤Л╨║╨╗╤О╤З╨╕╤В╤М ╨░╨║╤Б╨╡╨╗╤М +; ei + ld a,32 ; ╨┤╨╗╨╕╨╜╨░ ╨▒╤Г╤Д╨╡╤А╨░ ╨╕ ╨▒╨░╨╣╤В ╨╖╨░╨┐╨╛╨╗╨╜╨╕╤В╨╡╨╗╤М + ld b,a + ld (hl),a + inc hl + djnz $-2 + + ld ix,.String+2 ; ╨░╨┤╤А╨╡╤Б ╨▓ ╤Б╤В╤А╨╛╨║╨╡ ╨┤╨╗╤П ╤Б╨╗╨╡╨┤.╨║╨╛╨┤╨░ + ex de,hl +; ld a,(hl) ; ╨▒╨░╨╣╤В ╨╕╨╖ ╨┐╨░╨╝╤П╤В╨╕ + call Ld_a_hl + + ;=============================== + cp 0xDD ; ╨┐╤А╨╡╤Д╨╕╨║╤Б #DD + jr z,.L43 + cp 0xFD ; ╨┐╤А╨╡╤Д╨╕╨║╤Б #FD + jp nz,.L30 + + ld de,"DF" + ld a,"Y" + jr .L42 + +.L43 ld de,"DD" + ld a,"X" + +.L42 ld (.String),de ; ╨┐╤А╨╡╤Д╨╕╨║╤Б ╨▓ ╤Б╤В╤А╨╛╨║╤Г + ld (.IRS1+1),a ; ╨║╨╛╤А╤А╨╡╨║╤В╨╕╤А╨╛╨▓╨║╨░ ╤А╨╡╨│.╨┐╨░╤А╤Л + ld (.L9+1),a + ld (.L13+6),a + ld a,1 + ld (.Byte),a ; ╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ ╨║╨╛╨╝╨░╨╜╨┤╤Л + pop hl + inc hl +; ld a,(hl) ; ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╕╨╣ ╨▒╨░╨╣╤В ╨║╨╛╨╝╨░╨╜╨┤╤Л + call Ld_a_hl + push hl + cp 0xCB + jr z,.L40 ; ╨║╨╛╨╝╨░╨╜╨┤╤Л #DD(#FD)#CB + + ld hl,CodeDDFD ; ╤В╨░╨▒╨╗╨╕╤Ж╨░ ╨║╨╛╨┤╨╛╨▓ + ld bc,85 ; ╤А╨░╨╖╨╝╨╡╤А ╤В╨░╨▒╨╗╨╕╤Ж╤Л + cpir ; ╨┐╨╛╨╕╤Б╨║ ╨║╨╛╨┤╨░ + jr z,.L45 + pop hl + ld bc,ED00 + ld de,.String+9 ; ╨║╨╛╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║╨╕ NOP * + ld a,(bc) + or a + ret z + ld (de),a + inc de + inc bc + jr $-6 + +.L45 ld hl,84 ; ╤А╨░╨╖╨╝╨╡╤А ╤В╨░╨▒╨╗╨╕╤Ж╤Л + or a + sbc hl,bc + ld de,TablDDFD + jp .L_12+3 + +.L40 ld ix,.String+4 ;╨░╨┤╤А╨╡╤Б ╨▓ ╤Б╤В╤А╨╛╨║╨╡ ╨┤╨╗╤П ╤Б╨╗╨╡╨┤.╨║╨╛╨┤╨░ + ld de,"BC" ;╨┐╤А╨╡╤Д╨╕╨║╤Б ╨▓ ╤Б╤В╤А╨╛╨║╤Г + ld (.String+2),de + ld a,4 ;╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ + ld (.Byte),a + pop hl + inc hl + call Ld_a_hl + ld b,a +; ld b,(hl) ;╨▒╨░╨╣╤В-╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ + inc hl + call Ld_a_hl +; ld a,(hl) ;╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╕╨╣ ╨▒╨░╨╣╤В ╨║╨╛╨╝╨░╨╜╨┤╤Л + inc hl + push hl + ld c,a + ld h,0 + cp 0x40 ;╨╛╤В 0 ╨┤╨╛ 0x3F (╤Б╨┤╨▓╨╕╨│╨╕) + jr c,.L44 + + call .ComCBBit ;╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║╨░ BIT,SET,RES + ld a,c + cp 0x80 ;╨║╨╛╨╝╨░╨╜╨┤╨░ BIT + jr nc,.L41 + call .NomBit ;╨╜╨╛╨╝╨╡╤А ╨▒╨╕╤В╨░ + call .IndexRegSh ;╨╕╨╜╨┤╨╡╨║╤Б╨╜╨░╤П ╨┐╨░╤А╨░ ╤Б╨╛ ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡╨╝ + jr .L46 + +.L41 call .NomBit ;╨╜╨╛╨╝╨╡╤А ╨▒╨╕╤В╨░ + jr .L44+3 + +.L44 call .ComCBSh ;╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║╨░ + call .RegName ;╤А╨╡╨│╨╕╤Б╤В╤А + jr nz,$+6 + ld a,"," ;╤А╨░╨╖╨┤╨╡╨╗╨╕╤В╨╡╨╗╤М + ld (de),a + inc de + call .IndexRegSh ;╨╕╨╜╨┤╨╡╨║╤Б╨╜╨░╤П ╨┐╨░╤А╨░ ╤Б╨╛ ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡╨╝ + +.L46 ld a,c + call ConvHexStr + ld (ix+2),l + ld (ix+3),h + pop hl + ret + + ;=============================== +.L30 cp 0xCB ;╨┐╤А╨╡╤Д╨╕╨║╤Б #CB + jp nz,.L20 + ld de,"BC" ;╨┐╤А╨╡╤Д╨╕╨║╤Б ╨▓ ╤Б╤В╤А╨╛╨║╤Г + ld (.String),de + pop hl + inc hl + call Ld_a_hl +; ld a,(hl) ;╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╕╨╣ ╨▒╨░╨╣╤В ╨║╨╛╨╝╨░╨╜╨┤╤Л + inc hl + push hl + ld c,a + ld h,0 + cp 0x40 ;╨╛╤В 0 ╨┤╨╛ 0x3F (╤Б╨┤╨▓╨╕╨│╨╕) + jr nc,.L31 + call .ComCBSh ;╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║╨░ + jr .L31+6 +.L31 call .ComCBBit ;╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║╨░ + call .NomBit ;╨╜╨╛╨╝╨╡╤А ╨▒╨╕╤В╨░ + call .RegName ;╤А╨╡╨│╨╕╤Б╤В╤А + call nz,.HLReg + ld a,c + call ConvHexStr + ld (ix+0),l + ld (ix+1),h + pop hl + ld a,2 ;╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ ╨║╨╛╨╝╨░╨╜╨┤╤Л + ret + + ;=============================== +.L20 cp 0xED ;╨┐╤А╨╡╤Д╨╕╨║╤Б #ED + jr nz,.L10 + ld a,1 + ld (.Byte),a ;╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ + ld de,"DE" ;╨┐╤А╨╡╤Д╨╕╨║╤Б ╨▓ ╤Б╤В╤А╨╛╨║╤Г + ld (.String),de + pop hl + inc hl + push hl + call Ld_a_hl +; ld a,(hl) ;╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╕╨╣ ╨▒╨░╨╣╤В ╨║╨╛╨╝╨░╨╜╨┤╤Л + cp 0x40 ;╨╛╤В 0 ╨┤╨╛ 0x3F + jr c,.L21 + ld de,TablED-0x40*2 + cp 0x7F ;╨╛╤В 0x40 ╨┤╨╛ 0x7E ╨╕╨╖ ╤В╨░╨▒╨╗╨╕╤Ж╤Л + jr c,.L_12 + cp 0xA0 ;╨╛╤В 0x7F ╨┤╨╛ 0x9F + jr c,.L21 + ld de,TablED-0xA0*2+0x40*2-2 + cp 0xBC ;╨╛╤В 0xBC ╨┤╨╛ 0xFF + jr c,.L_12 +.L21 ld hl,ED00 ;╨║╨╛╨╝╨░╨╜╨┤╨░ "NOP *" + jr .L_2-3 + + ;=============================== +.L10 ld ix,.String + ld de,Tabl00_3F ;╤В╨░╨▒╨╗╨╕╤Ж╨░ ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╣ + cp 0x40 ;╨║╨╛╨╝╨░╨╜╨┤╤Л 0x00...0x3F + jr c,.L_12 + ld de,TablC0_FF ;╤В╨░╨▒╨╗╨╕╤Ж╨░ ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╣ + ld c,a + sub 0xC0 ;╨║╨╛╨╝╨░╨╜╨┤╤Л 0xC0...0xFF + jr nc,.L_12 + + ld a,c + cp 0x80 + jr nc,.L8 + ld hl,MHALT + cp 0x76 ;╨║╨╛╨┤ ╨║╨╛╨╝╨░╨╜╨┤╤Л HALT + jr z,.L_2-3 + + ld hl,.String+9 + ld (hl),"L" ;╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║╨░ LD + inc hl + ld (hl),"D" + inc hl + ld (hl)," " + inc hl + rrca + rrca + rrca + ex de,hl + call .RegName+1 ;╨┐╨╡╤З╨░╤В╤М ╤А╨╡╨│╨╕╤Б╤В╤А╨░ + call nz,.HLReg + ld a,"," ;╤А╨░╨╖╨┤╨╡╨╗╨╕╤В╨╡╨╗╤М + ld (de),a + inc de + call .RegName ;╨┐╨╡╤З╨░╤В╤М ╤А╨╡╨│╨╕╤Б╤В╤А╨░ + call nz,.HLReg + xor a + jr .L1 + +.L8 and 00111000b ;ADD,ADC,SUB,SBC,AND,XOR,OR,CP + rrca + rrca + ld l,a + ld h,0 + ld de,TablM + add hl,de ;╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ ╨▓ ╤В╨░╨▒╨╗╨╕╤Ж╨╡ + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ld de,.String+9 ;╨║╨╛╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨▓ ╤Б╤В╤А╨╛╨║╤Г-╨▒╤Г╤Д╨╡╤А + ld a,(hl) + ld (de),a + inc de + inc hl + or a + jr nz,$-5 + dec de + call .RegName ;╨┐╨╡╤З╨░╤В╤М ╤А╨╡╨│╨╕╤Б╤В╤А╨░ + call nz,.HLReg + xor a + jr .L1 + +.L_12 ld l,a ;╤А╨░╤Б╤З╨╡╤В ╨░╨┤╤А╨╡╤Б╨░ ╨▓ ╤В╨░╨▒╨╗╨╕╤Ж╨╡ + ld h,0 + add hl,hl ;*2 + add hl,de + ld a,(hl) + inc hl + ld h,(hl) + ld l,a ;╨░╨┤╤А╨╡╤Б ╤Б╤В╤А╨╛╨║╨╕-╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║╨╕ + + ld de,.String+9 ;╨║╨╛╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨▓ ╤Б╤В╤А╨╛╨║╤Г-╨▒╤Г╤Д╨╡╤А +.L_2 ld a,(hl) + cp 0x20 + jr c,.L1 + cp "x" ;╨╕╨╜╨┤╨╡╨║╤Б╨╜╤Л╨╣ ╤А╨╡╨│╨╕╤Б╤В╤А + jr nz,$+4 +.L9 ld a,"X" + ld (de),a + cp ")" + jr nz,$+9 + ld (.TablAdr),hl + ld (.StrAdr),de + inc hl + inc de + jr .L_2 + +.L1 exa + pop hl ;╨┐╨╡╤З╨░╤В╤М ╨▒╨░╨╣╤В╨░ + call Ld_a_hl +; ld a,(hl) + inc hl + push hl + call ConvHexStr + ld (ix+0),l + ld (ix+1),h + exa + jp z,.LE + + dec a ;2-╤Е ╨▒╨░╨╣╤В╨╜╨░╤П ╨║╨╛╨╝╨░╨╜╨┤╨░ (1) + jr nz,.L3 + call .TwoByteCom + pop hl + ld a,(.Byte) + inc a + inc a ;╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ + ret + +.L3 dec a ;3-╤Е ╨▒╨░╨╣╤В╨╜╨░╤П ╨║╨╛╨╝╨░╨╜╨┤╨░ (2) + jr nz,.L4 + call .ThreeByteCom + pop hl + ld a,(.Byte) + add a,3 ;╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ + ret + +.L4 dec a ;╨║╨╛╨╝╨░╨╜╨┤╤Л ╨╛╤В╨╜╨╛╤Б╨╕╤В╨╡╨╗╤М╨╜╨╛╨│╨╛ ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ (3) + jr nz,.L7 + pop hl + call Ld_a_hl +; ld a,(hl) ;2-╨╣ ╨▒╨░╨╣╤В ╨║╨╛╨╝╨░╨╜╨┤╤Л + inc hl + push hl + ld c,a + call ConvHexStr + ld (ix+2),l + ld (ix+3),h + ld a,c + ld b,0 + pop hl + push hl ;╤В╨╡╨║╤Г╤Й╨╕╨╣ ╨░╨┤╤А╨╡╤Б + bit 7,a ;╨╖╨╜╨░╨║ ╤З╨╕╤Б╨╗╨░ + jr z,$+10 + neg + or a ;╤Б╨▒╤А╨╛╤Б ╤Д╨╗╨░╨│╨░ C + ld c,a + sbc hl,bc ;╨╛╤В╤А╨╕╤Ж╨░╤В╨╡╨╗╤М╨╜╨╛╨╡ ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ + jr $+3 + add hl,bc ;╨┐╨╛╨╗╨╛╨╢╨╕╤В╨╡╨╗╤М╨╜╨╛╨╡ ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ + call NumToStr16 + pop hl + ld a,2 ;╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ + ret + +.L7 dec a ;╨║╨╛╨╝╨░╨╜╨┤╤Л ╤А╨░╨▒╨╛╤В╤Л ╤Б ╨┐╨╛╤А╤В╨░╨╝╨╕ (4) + jr nz,.L5 + inc a + ld (.Byte),a ;╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ + ld de,(.StrAdr) ;╨░╨┤╤А╨╡╤Б ╨▓╤Б╤В╨░╨▓╨║╨╕ + call .TwoByteCom + jr .L6 + +.L5 dec a ;3-╤Е ╨▒╨░╨╣╤В╨╜╤Л╨╡ ╨║╨╛╤Б╨▓╨╡╨╜╨╜╨╛╨╣ ╨░╨┤╤А╨╡╤Б╨░╤Ж╨╕╨╕ (5) + jr nz,.L11 + ld a,(.Byte) + inc a + inc a + ld (.Byte),a ;╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ + ld de,(.StrAdr) ;╨░╨┤╤А╨╡╤Б ╨▓╤Б╤В╨░╨▓╨║╨╕ + call .ThreeByteCom + jr .L6 + +.L11 dec a ;╨╕╨╜╨┤╨╡╨║╤Б╨╜╤Л╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╤Л ╤Б╨╛ ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡╨╝ (6) + jr nz,.LE + ld a,2 + ld (.Byte),a ;╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ + ld de,(.StrAdr) ;╨░╨┤╤А╨╡╤Б ╨▓╤Б╤В╨░╨▓╨║╨╕ + pop hl + call Ld_a_hl + ld b,a +; ld b,(hl) + inc hl + push hl + ld ix,.String+4 + call .IndexRegSh +.L6 ld hl,(.TablAdr) ;╨░╨┤╤А╨╡╤Б ╨▓ ╤В╨░╨▒╨╗╨╕╤Ж╨╡ ╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║ + ld a,(hl) + cp 0x20 + jr nc,.L13 + ld a,b + cp "," ;╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║╨░ ╨╛╨║╨░╨╜╤З. ╨╜╨░ "," + jr nz,.LE + call .TwoByteCom + pop hl + ld a,4 ;╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ + ret + +.L13 ld b,a + cp "x" ;╨╕╨╜╨┤╨╡╨║╤Б╨╜╤Л╨╣ ╤А╨╡╨│╨╕╤Б╤В╤А + jr nz,$+4 + ld a,"X" + ld (de),a + inc hl + inc de + jr .L6+3 + +.LE pop hl + ld a,(.Byte) ;╨┤╨╗╨╕╨╜╨░ ╨║╨╛╨┤╨░ + inc a + ret + +;======== ╨┐╨╡╤З╨░╤В╤М ╨▓╤В╨╛╤А╨╛╨│╨╛ ╨║╨╛╨┤╨░ ╨┤╨▓╤Г╤Е╨▒╨░╨╣╤В╨╜╨╛╨╣ ╨║╨╛╨╝╨░╨╜╨┤╤Л ======== +.TwoByteCom: + pop bc ;╨░╨┤╤А╨╡╤Б ╨▓╨╛╨╖╨▓╤А╨░╤В╨░ + pop hl + call Ld_a_hl +; ld a,(hl) ;2-╨╣ ╨▒╨░╨╣╤В ╨║╨╛╨╝╨░╨╜╨┤╤Л + inc hl + push hl + push bc + ld c,a + call ConvHexStr + ld (ix+2),l + ld (ix+3),h + ld l,c + ld h,0 + jp NumToStr8 + +;======== ╨┐╨╡╤З╨░╤В╤М ╨▓╤В╨╛╤А╨╛╨│╨╛ ╨╕ ╤В╤А╨╡╤В╤М╨╡╨│╨╛ ╨║╨╛╨┤╨░ ╤В╤А╨╡╤Е╨▒╨░╨╣╤В╨╜╨╛╨╣ ╨║╨╛╨╝╨░╨╜╨┤╤Л ======== +.ThreeByteCom: + pop bc ;╨░╨┤╤А╨╡╤Б ╨▓╨╛╨╖╨▓╤А╨░╤В╨░ + pop hl + call Ld_a_hl +; ld a,(hl) ;2-╨╣ ╨▒╨░╨╣╤В ╨║╨╛╨╝╨░╨╜╨┤╤Л + inc hl + exa + call Ld_a_hl +; ld a,(hl) ;3-╨╣ ╨▒╨░╨╣╤В ╨║╨╛╨╝╨░╨╜╨┤╤Л + inc hl + push hl + push bc + ld b,a + call ConvHexStr + ld (ix+4),l + ld (ix+5),h + exa + ld c,a + call ConvHexStr + ld (ix+2),l + ld (ix+3),h + ld h,b ;╨▓ HL - ╤З╨╕╤Б╨╗╨╛ + ld l,c + jp NumToStr16 + +;======== ╨┐╨╡╤З╨░╤В╤М ╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║ ╨║╨╛╨╝╨░╨╜╨┤ ╤Б ╨┐╤А╨╡╤Д╨╕╨║╤Б╨╛╨╝ 0xCB (╤Б╨┤╨▓╨╕╨│╨╕, ╨▒╨╕╤В╨╛╨▓╤Л╨╡) ======== +;A - ╨▒╨░╨╣╤В ╨║╨╛╨╝╨░╨╜╨┤╤Л +;DE - ╨░╨┤╤А╨╡╤Б ╨▓ ╤Б╤В╤А╨╛╨║╨╡ +.ComCBBit: + and 11000000b + rlca + rlca + rlca + rlca + ld l,a + ld de,CB40-4 + add hl,de + jr .ComCBSh1 +.ComCBSh: + and 00111000b ;╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ ╨▓ ╤В╨░╨▒╨╗╨╕╤Ж╨╡ + rrca + rrca + ld l,a + ld de,TablCB + add hl,de + ld a,(hl) + inc hl + ld h,(hl) + ld l,a +.ComCBSh1 ld de,.String+9 ;╨║╨╛╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨▓ ╤Б╤В╤А╨╛╨║╤Г-╨▒╤Г╤Д╨╡╤А + ld a,(hl) + ld (de),a + inc de + inc hl + cp " " ;╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╣ ╤Б╨╕╨╝╨▓╨╛╨╗ ╨╝╨╜╨╡╨╝╨╛╨╜╨╕╨║╨╕ + jr nz,$-6 + ret + +;======== ╨▓╤Л╤З╨╕╤Б╨╗╨╡╨╜╨╕╨╡ ╨╜╨╛╨╝╨╡╤А╨░ ╨▒╨╕╤В╨░ ╨▓ ╨▒╨╕╤В╨╛╨▓╤Л╤Е ╨║╨╛╨╝╨░╨╜╨┤╨░╤Е BIT, SET, RES ======== +;C - ╨▒╨░╨╣╤В ╨║╨╛╨╝╨░╨╜╨┤╤Л +;DE - ╨░╨┤╤А╨╡╤Б ╨▓ ╤Б╤В╤А╨╛╨║╨╡ +.NomBit: + ld a,c + and 00111000b ;╨╜╨╛╨╝╨╡╤А ╨▒╨╕╤В╨░ + rrca + rrca + rrca + add a,"0" + ld (de),a + ld a,"," + inc de + ld (de),a + inc de + ret + +;======== ╨┐╨╡╤З╨░╤В╤М ╨╕╨╝╨╡╨╜╨╕ ╤А╨╡╨│╨╕╤Б╤В╤А╨░ ======== +;C - ╨║╨╛╨╝╨░╨╜╨┤╨░ +;DE - ╨░╨┤╤А╨╡╤Б ╨▓ ╤Б╤В╤А╨╛╨║╨╡ +.RegName: + ld a,c + and 00000111b ;╤А╨╡╨│╨╕╤Б╤В╤А + add a,"B" + cp "F" ;B,C,D,E + jr c,.RN1 + inc a + inc a + cp "H" + jr z,.RN1 + add a,3 + cp "L" + jr z,.RN1 + sub 13 + cp "A" + ret nz ;╨╛╤В╨╜╨╛╤Б╨╕╤В╨╡╨╗╤М╨╜╨░╤П ╨░╨┤╤А╨╡╤Б╨░╤Ж╨╕╤П +.RN1 ld (de),a + inc de + xor a + ret + +;======== ╨┐╨╡╤З╨░╤В╤М (HL) ======== +;DE - ╨░╨┤╤А╨╡╤Б ╨▓ ╤Б╤В╤А╨╛╨║╨╡ +.HLReg: + ex de,hl + ld (hl),"(" + inc hl + ld (hl),"H" + inc hl + ld (hl),"L" + inc hl + ld (hl),")" + inc hl + ex de,hl + ret + +;======== ╨┐╨╡╤З╨░╤В╤М ╨╕╨╜╨┤╨╡╨║╤Б╨╜╨╛╨╣ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨╛╨╣ ╨┐╨░╤А╤Л ╤Б╨╛ ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡╨╝ ======== +;B - ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ +;DE - ╨░╨┤╤А╨╡╤Б ╨▓ ╤Б╤В╤А╨╛╨║╨╡ +.IndexRegSh: + ld a,b + call ConvHexStr + ld (ix+0),l + ld (ix+1),h + ex de,hl + ld (hl),"(" + inc hl + ld (hl),"I" + inc hl +.IRS1 ld (hl),"X" + inc hl + ld a,"+" ;╨┐╨╛╨╗╨╛╨╢╨╕╤В╨╡╨╗╤М╨╜╨╛╨╡ ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ + ld (hl),a + ld a,b ;╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ + bit 7,b + jr z,$+8 + ld a,"-" ;╨╛╤В╤А╨╕╤Ж╨░╤В╨╡╨╗╤М╨╜╨╛╨╡ ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ + ld (hl),a + ld a,b ;╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ + neg + inc hl + ex de,hl + ld l,a + ld h,0 + call NumToStr8 + ld a,")" + ld (de),a + ret + + +.String db "00112233 01234567890123456789012" +.Byte db 0 +.TablAdr dw 0 +.StrAdr dw 0 + diff --git a/dss.asm b/dss.asm new file mode 100644 index 0000000..84f67df --- /dev/null +++ b/dss.asm @@ -0,0 +1,398 @@ +; ====================================================== +; DSS Estex dumb for debug code in VSC with DEZOG plugin +; By Roman Boykov. Copyright (c) 2024 +; https://github.com/romychs +; ====================================================== + INCLUDE "dss.inc" + + ORG 0x0000 + +RESET: + JP NOT_IMPL + DS 5, 0xFF + +RST08: + JP NOT_IMPL + DS 5, 0xFF + + ORG 0x0010 +RST10: + JP DSS_HANDLER + DS 5, 0xFF + +RST18: + JP NOT_IMPL + DS 5, 0xFF + +RST20: + JP NOT_IMPL + DS 5, 0xFF + +RST28: + JP NOT_IMPL + DS 5, 0xFF + +RST30: + JP NOT_IMPL + DS 5, 0xFF + +RST38: + JP NOT_IMPL + DS 5, 0xFF + +DSS_HANDLER + + PUSH HL + PUSH BC + LD A, C + CP DSS_CURDISK + JP Z, _CURDISK + CP 0x0B + JP Z, _CREATE_FILE + CP 0x11 + JP Z, _OPEN_FILE + CP 0x12 + JP Z, _CLOSE_FILE + CP 0x13 + JP Z, _READ_FILE + CP 0x14 + JP Z, _WRITE_FILE + CP 0x19 + JP Z, _FIND_FIRST + CP 0x1D + JP Z, _CH_DIR + CP 0x1E + JP Z, _CURDIR + + CP DSS_WAITKEY + JP Z, _WAITKEY + + CP DSS_SCANKEY + JP Z, _SCANKEY + + CP DSS_ECHOKEY + JP Z, _ECHOKEY + + CP DSS_SETVMOD + JP Z, _SETVMOD + + CP DSS_GSWITCH + JP Z, _GSWITCH + + CP DSS_GETVMOD + JP Z, _GETVMOD + + CP low DSS_CLEAR + JP Z, _CLEAR + + CP DSS_PUTCHAR + JP Z, _PUTCHAR + + CP DSS_PCHARS + JP Z, _PCHARS + + CP 0x41 + JP Z, _EXIT + + POP BC + POP HL + + +NOT_IMPL + LD A,0x01 + SCF + RET + +_PUTCHAR + LD BC, 0x9000 + OUT (C),A + JR NORM_EXIT + + +_PCHARS + LD BC, 0x9000 + +NXT_PCHAR + LD A, (HL) + OUT (C),A + INC HL + OR A + JR NZ, NXT_PCHAR + +NORM_EXIT + AND A ; CF=0 + POP BC + POP HL + RET + +BAD_EXIT + SCF + POP BC + POP HL + RET + + +_CURDISK + LD A, 3 + JP NORM_EXIT + +; ╨Т╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; HL - ╤Г╨║╨░╨╖╨░╤В╨╡╨╗╤М ╨╜╨░ ╤Д╨░╨╣╨╗╨╛╨▓╤Г╤О ╤Б╨┐╨╡╤Ж╨╕╤Д╨╕╨║╨░╤Ж╨╕╤О +; A - ╨░╤В╤А╨╕╨▒╤Г╤В ╤Д╨░╨╣╨╗╨░ +; ╨Т╤Л╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; A тАФ ╨║╨╛╨┤ ╨╛╤И╨╕╨▒╨║╨╕, ╨╡╤Б╨╗╨╕ CF=1 +; A - ╤Д╨░╨╣╨╗╨╛╨▓╤Л╨╣ ╨╝╨░╨╜╨╕╨┐╤Г╨╗╤П╤В╨╛╤А, ╨╡╤Б╨╗╨╕ CF=0 +_CREATE_FILE + JP _OPEN_FILE + +; ╨Т╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; HL - ╤Г╨║╨░╨╖╨░╤В╨╡╨╗╤М ╨╜╨░ ╤Д╨░╨╣╨╗╨╛╨▓╤Г╤О ╤Б╨┐╨╡╤Ж╨╕╤Д╨╕╨║╨░╤Ж╨╕╤О +; A - ╤А╨╡╨╢╨╕╨╝ ╨┤╨╛╤Б╤В╤Г╨┐╨░ +; A=0 ╤З╤В╨╡╨╜╨╕╨╡/╨╖╨░╨┐╨╕╤Б╤М +; A=1 ╤З╤В╨╡╨╜╨╕╨╡ +; A=2 ╨╖╨░╨┐╨╕╤Б╤М +; ╨Т╤Л╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; A - ╨║╨╛╨┤ ╨╛╤И╨╕╨▒╨║╨╕, ╨╡╤Б╨╗╨╕ CF=1 +; A - ╤Д╨░╨╣╨╗╨╛╨▓╤Л╨╣ ╨╝╨░╨╜╨╕╨┐╤Г╨╗╤П╤В╨╛╤А, ╨╡╤Б╨╗╨╕ CF=0 +CUR_FILE_MAN + DB 0x4F + +CUR_DIR + DB "\\FOLDER",0 +CUR_DIR_END +CUR_DIR_SIZE EQU CUR_DIR_END-CUR_DIR + +_OPEN_FILE + LD HL, CUR_FILE_MAN + INC (HL) + LD A, (HL) + JP NORM_EXIT + +_CLOSE_FILE + JP NORM_EXIT + +CUR_F_PTR + DW ZIP_FILE + +REMAINS_IN_ZIP + DW 0 + +; ╨Т╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; A - ╤Д╨░╨╣╨╗╨╛╨▓╤Л╨╣ ╨╝╨░╨╜╨╕╨┐╤Г╨╗╤П╤В╨╛╤А +; HL - ╨░╨┤╤А╨╡╤Б ╨▓ ╨┐╨░╨╝╤П╤В╨╕ +; DE - ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╤З╨╕╤В╨░╨╡╨╝╤Л╤Е ╨▒╨░╨╣╤В +; ╨Т╤Л╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; A - ╨║╨╛╨┤ ╨╛╤И╨╕╨▒╨║╨╕, ╨╡╤Б╨╗╨╕ CF=1 +; DE - ╤А╨╡╨░╨╗╤М╨╜╨╛╨╡ ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╨┐╤А╨╛╤З╨╕╤В╨░╨╜╨╜╤Л╤Е ╨▒╨░╨╣╤В +; ╨╡╤Б╨╗╨╕ CF=0: +; A = 0 ╨┐╤А╨╛╤З╨╕╤В╨░╨╜╤Л ╨▓╤Б╨╡ ╨▒╨░╨╣╤В╤Л +; A = 0FFh ╨┐╤А╨╛╤З╨╕╤В╨░╨╜╨╛ ╨╝╨╡╨╜╤М╤И╨╡╨╡ ╤З╨╕╤Б╨╗╨╛ ╨▒╨░╨╣╤В +_READ_FILE + OR A + JP Z, BAD_EXIT + PUSH DE + POP BC ; BC - bytes to read + PUSH HL + + LD HL, (CUR_F_PTR) ; HL -> IN ZIP_FILE + LD DE, ZIP_FILE_END + EX HL, DE + SUB HL, DE ; HL = remain bytes + LD (REMAINS_IN_ZIP), HL + SBC HL, BC + LD A, 0 + JR NC, NO_OUT_OF_ZIP + DEC A + LD HL,(REMAINS_IN_ZIP) + LD BC, HL + +NO_OUT_OF_ZIP + LD HL, (CUR_F_PTR) + POP DE ; DE - Buffer to write + PUSH BC + LDIR + POP DE ; DE = bytes read, A = 0 or 0xFF + LD (CUR_F_PTR), HL + + JP NORM_EXIT + + +; ╨Т╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; A - ╤Д╨░╨╣╨╗╨╛╨▓╤Л╨╣ ╨╝╨░╨╜╨╕╨┐╤Г╨╗╤П╤В╨╛╤А +; HL - ╨░╨┤╤А╨╡╤Б ╨▓ ╨┐╨░╨╝╤П╤В╨╕ +; DE - ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╨╖╨░╨┐╨╕╤Б╤Л╨▓╨░╨╡╨╝╤Л╤Е ╨▒╨░╨╣╤В +; ╨Т╤Л╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; A - ╨║╨╛╨┤ ╨╛╤И╨╕╨▒╨║╨╕, ╨╡╤Б╨╗╨╕ CF=1 +; DE - ╤А╨╡╨░╨╗╤М╨╜╨╛╨╡ ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╨╖╨░╨┐╨╕╤Б╨░╨╜╨╜╤Л╤Е ╨▒╨░╨╣╤В +_WRITE_FILE + + PUSH DE + POP BC + LD DE,UNZIP_FILE + + PUSH BC + LDIR + POP DE + JP NORM_EXIT + +; ╨Т╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; HL - ╤Г╨║╨░╨╖╨░╤В╨╡╨╗╤М ╨╜╨░ ╤Д╨░╨╣╨╗╨╛╨▓╤Г╤О ╤Б╨┐╨╡╤Ж╨╕╤Д╨╕╨║╨░╤Ж╨╕╤О +; ╨Т╤Л╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; A - ╨║╨╛╨┤ ╨╛╤И╨╕╨▒╨║╨╕, ╨╡╤Б╨╗╨╕ CF=1 +_CH_DIR + JP NORM_EXIT + + +; 1Eh (30) CURDIR (╨Ш╨╜╤Д╨╛╤А╨╝╨░╤Ж╨╕╤П ╨╛ ╤В╨╡╨║╤Г╤Й╨╡╨╝ ╨║╨░╤В╨░╨╗╨╛╨│╨╡) +; ╨Т╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; HL - ╨▒╤Г╤Д╨╡╤А ╨▓ ╨┐╨░╨╝╤П╤В╨╕ 256 ╨▒╨░╨╣╤В +; ╨Т╤Л╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; A - ╨║╨╛╨┤ ╨╛╤И╨╕╨▒╨║╨╕, ╨╡╤Б╨╗╨╕ CF=1 +_CURDIR + PUSH DE + LD DE, CUR_DIR + EX HL,DE + LD BC, CUR_DIR_SIZE + LDIR + POP DE + JP NORM_EXIT + +_ECHOKEY + PUSH HL + LD HL,EC + LD C,DSS_PCHARS + RST DSS + POP HL + LD A,(EC) + JP NORM_EXIT + +EC DB "3",0 + +; ╨Т╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; HL - ╤Г╨║╨░╨╖╨░╤В╨╡╨╗╤М ╨╜╨░ ╤Д╨░╨╣╨╗╨╛╨▓╤Г╤О ╤Б╨┐╨╡╤Ж╨╕╤Д╨╕╨║╨░╤Ж╨╕╤О +; DE - ╤А╨░╨▒╨╛╤З╨╕╨╣ ╨▒╤Г╤Д╨╡╤А 44 ╨▒╨░╨╣╤В╨░, ╨╡╤Б╨╗╨╕ B=0, ╨╕╨╜╨░╤З╨╡ 256 ╨▒╨░╨╣╤В +; A - ╨░╤В╤А╨╕╨▒╤Г╤В╤Л, ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╨╡╨╝╤Л╨╡ ╨┐╤А╨╕ ╨┐╨╛╨╕╤Б╨║╨╡ +; B = 0 - ╨╕╨╝╤П ╨╜╨░╨╣╨┤╨╡╨╜╨╜╨╛╨│╨╛ ╤Д╨░╨╣╨╗╨░ ╨▓ ╤Д╨╛╤А╨╝╨░╤В╨╡ 11 ╨▒╨░╨╣╤В "FilenameExt" +; B = 1 - ╨╕╨╝╤П ╨╜╨░╨╣╨┤╨╡╨╜╨╜╨╛╨│╨╛ ╤Д╨░╨╣╨╗╨░ ╨▓ ╤Д╨╛╤А╨╝╨░╤В╨╡ DOS "filename.ext",0 +; C - 19h +; ╨Т╤Л╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; A - ╨║╨╛╨┤ ╨╛╤И╨╕╨▒╨║╨╕, ╨╡╤Б╨╗╨╕ CF=1 +_FIND_FIRST + PUSH DE + LD HL, 33 ; offset of file name + ADD HL, DE + EX HL, DE + LD HL, ZIP_FILE_NAME + LD BC,9 + LDIR + POP DE + JP NORM_EXIT + + +_SCANKEY + XOR A + JP NORM_EXIT + + +; ╨Т╤Л╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; A - ╨║╨╛╨┤ ╤Б╨╕╨╝╨▓╨╛╨╗╨░ +; D - ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╤Л╨╣ ╨║╨╛╨┤ +; ╨Х - ASCII ╨║╨╛╨┤ +; C - ╤А╨╡╨╢╨╕╨╝ ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л: +_WAITKEY + XOR A + LD D, A + LD C, A + LD E,65 + LD A,65 + JP NORM_EXIT + + +CUR_VMOD + DB 1 + +; 50h (80) SETVMOD (╨Т╤Л╨▒╨╛╤А ╤А╨╡╨╢╨╕╨╝╨░ ╤Н╨║╤А╨░╨╜╨░) +; ╨Т╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; A - ╤А╨╡╨╢╨╕╨╝ ╤Н╨║╤А╨░╨╜╨░: +; 02h - ╤В╨╡╨║╤Б╤В╨╛╨▓╤Л╨╣ 40x32x16 ╤Ж╨▓╨╡╤В╨╛╨▓; +; 03h - ╤В╨╡╨║╤Б╤В╨╛╨▓╤Л╨╣ 80x32x16 ╤Ж╨▓╨╡╤В╨╛╨▓; +; 81h - ╨│╤А╨░╤Д╨╕╤З╨╡╤Б╨║╨╕╨╣ 320x256x256 ╤Ж╨▓╨╡╤В╨╛╨▓; +; 82h - ╨│╤А╨░╤Д╨╕╤З╨╡╤Б╨║╨╕╨╣ 640x256x16 ╤Ж╨▓╨╡╤В╨╛╨▓; +; B - ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ ╤Н╨║╤А╨░╨╜╨░ 0/1 +; C - 50h +; ╨Т╤Л╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; A - ╨║╨╛╨┤ ╨╛╤И╨╕╨▒╨║╨╕, ╨╡╤Б╨╗╨╕ CF=1 +_SETVMOD + LD (CUR_VMOD),A + JP NORM_EXIT + +; 51h (81) GETVMOD (╨Я╨╛╨╗╤Г╤З╨╕╤В╤М ╤В╨╡╨║╤Г╤Й╨╕╨╣ ╤А╨╡╨╢╨╕╨╝ ╤Н╨║╤А╨░╨╜╨░) +; ╨Т╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; C - 51h +; ╨Т╤Л╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; A - ╨║╨╛╨┤ ╨╛╤И╨╕╨▒╨║╨╕, ╨╡╤Б╨╗╨╕ CF=1 +; A - ╤В╨╡╨║╤Г╤Й╨╕╨╣ ╤А╨╡╨╢╨╕╨╝ ╤Н╨║╤А╨░╨╜╨░, ╨╡╤Б╨╗╨╕ CF=0 +; B - ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ ╤Н╨║╤А╨░╨╜╨░ 0/1 +_GETVMOD + LD A,(CUR_VMOD) + JP NORM_EXIT + +; 56h (86) CLEAR (╨Ю╤З╨╕╤Б╤В╨║╨░ ╨╛╨║╨╜╨░) +; ╨Т╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; D - ╤Б╤В╤А╨╛╨║╨░ ╨╗╨╡╨▓╨╛╨│╨╛ ╨▓╨╡╤А╤Е╨╜╨╡╨│╨╛ ╤Г╨│╨╗╨░ ╨╛╨║╨╜╨░ +; E - ╤Б╤В╨╛╨╗╨▒╨╡╤Ж ╨╗╨╡╨▓╨╛╨│╨╛ ╨▓╨╡╤А╤Е╨╜╨╡╨│╨╛ ╤Г╨│╨╗╨░ ╨╛╨║╨╜╨░ +; H - ╨▓╤Л╤Б╨╛╤В╨░ ╨╛╨║╨╜╨░ +; L - ╤И╨╕╤А╨╕╨╜╨░ ╨╛╨║╨╜╨░ +; B - ╨░╤В╤А╨╕╨▒╤Г╤В ╨╖╨░╨┐╨╛╨╗╨╜╨╕╤В╨╡╨╗╤М +; A - ╤Б╨╕╨╝╨▓╨╛╨╗ ╨╖╨░╨┐╨╛╨╗╨╜╨╕╤В╨╡╨╗╤М +; C - 56h +; ╨Т╤Л╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; ╨╜╨╡╤В +_CLEAR + JP NORM_EXIT + + +_EXIT +; LOGPOINT STOPPED! + + HALT + JP _EXIT + +; GSWITCH (╨Т╤Л╨┤╨╡╨╗╨╕╤В╤М ╨┐╨░╤А╨░╨╝╨╡╤В╤А ╨║╨╛╨╝╨░╨╜╨┤╨╜╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕) +; ╨Т╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; HL - ╤Г╨║╨░╨╖╨░╤В╨╡╨╗╤М ╨║╨╛╨╝╨░╨╜╨┤╨╜╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕ +; DE - ╨▒╤Г╤Д╨╡╤А ╨┤╨╗╤П ╨▓╤Л╨┤╨╡╨╗╤П╨╡╨╝╨╛╨│╨╛ ╨┐╨░╤А╨░╨╝╨╡╤В╤А╨░ +; C - 43h +; ╨Т╤Л╤Е╨╛╨┤╨╜╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П: +; HL - ╤Г╨║╨░╨╖╨░╤В╨╡╨╗╤М ╨╜╨░ ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╕╨╣ ╨┐╨░╤А╨░╨╝╨╡╤В╤А ╨║╨╛╨╝╨░╨╜╨┤╨╜╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕ +; CF = 0 - ╨║╨╛╨╜╨╡╤Ж ╤Б╤В╤А╨╛╨║╨╕ ╨╜╨╡ ╨┤╨╛╤Б╤В╨╕╨│╨╜╤Г╤В (╨╡╤Б╤В╤М ╨┤╤А╤Г╨│╨╕╨╡ ╨┐╨░╤А╨░╨╝╨╡╤В╤А╤Л) +; CF = 1 - ╨║╨╛╨╜╨╡╤Ж ╤Б╤В╤А╨╛╨║╨╕ (╨▓ ╨▒╤Г╤Д╨╡╤А ╨┐╨╡╤А╨╡╨╜╨╡╤Б╤С╨╜ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╣ ╨┐╨░╤А╨░╨╝╨╡╤В╤А ╨╕╨╗╨╕ ╨╜╨╛╨╗╤М) + +_GSWITCH + LD HL,CMD_LINE1+1 + PUSH DE +.next + LD A, (HL) + LD (DE), A + OR A + JR Z,.enough + INC HL + INC DE + JR .next +.enough + POP DE + JP BAD_EXIT + + + +CMD_LINE1 + DB " myfile.exe",0 +ZIP_FILE_NAME + DB "file.zip",0 +ZIP_FILE + DS 1024,0 +ZIP_FILE_END +UNZIP_FILE + DS 1024,0 + + ALIGN 16384, 0 \ No newline at end of file diff --git a/dss.inc b/dss.inc new file mode 100644 index 0000000..7435240 --- /dev/null +++ b/dss.inc @@ -0,0 +1,44 @@ +; ====================================================== +; Defines for DSS Estex for Sprinter computer +; By Roman Boykov. Copyright (c) 2024 +; https://github.com/romychs +; ====================================================== + +; DSS RST Entry +DSS EQU 0x10 + +; DSS Functions +DSS_CURDISK EQU 0x02 +DSS_CREATE_FILE EQU 0x0B +DSS_OPEN_FILE EQU 0x11 +DSS_CLOSE_FILE EQU 0x12 +DSS_READ_FILE EQU 0x13 +DSS_WRITE EQU 0x14 +DSS_MOVE_FP_CP EQU 0x0115 +DSS_FIND_FIRST EQU 0x0119 +DSS_FIND_NEXT EQU 0x011A +DSS_MKDIR EQU 0x1B +DSS_CHDIR EQU 0x1D +DSS_CURDIR EQU 0x1E +DSS_SCANKEY EQU 0x31 +DSS_ECHOKEY EQU 0x32 +DSS_EXIT EQU 0x41 +DSS_GSWITCH EQU 0x43 +DSS_WAITKEY EQU 0x48 +DSS_SETVMOD EQU 0x50 +DSS_GETVMOD EQU 0x51 +DSS_CLEAR EQU 0x56 +DSS_PUTCHAR EQU 0x5B +DSS_PCHARS EQU 0x5C + + +DSS_VMOD_T40 EQU 0x02 ; text 40x32, 16 colors +DSS_VMOD_T80 EQU 0x03 ; text 80x32, 16 colors +DSS_VMOD_G320 EQU 0x81 ; graphics 320x256, 256 colors +DSS_VMOD_G640 EQU 0x82 ; graphics 640x256, 16 colors + + +; DSS Error codes +E_FILE_EXISTS EQU 7 +E_FILE_NOT_FOUND EQU 3 + diff --git a/error.asm b/error.asm new file mode 100644 index 0000000..6755bd8 --- /dev/null +++ b/error.asm @@ -0,0 +1,86 @@ +;[]=========================================================================[] +;[] ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨╛╤И╨╕╨▒╨╛╨║ ╨╝╨╛╨╜╨╕╤В╨╛╤А╨░-╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ DemoN [] +;[] v0.10 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 27.08.2006 [] +;[] [] +;[] ErDss - ╨╛╨┐╤А╨╡╨┤╨╡╨╗╨╡╨╜╨╕╨╡ ╨╛╤И╨╕╨▒╨║╨╕ DSS ╨┐╨╛ ╨╡╨╡ ╨║╨╛╨┤╤Г [] +;[]=========================================================================[] + +;[]=========================================================================[] +;[] ╨Ю╤И╨╕╨▒╨║╨╕ DSS [] +;[] ╨Т╤Е╨╛╨┤: A - ╨║╨╛╨┤ ╨╛╤И╨╕╨▒╨║╨╕ [] +;[] ╨Т╤Л╤Е╨╛╨┤: A - ╨║╨╛╨┤ ╨╛╤И╨╕╨▒╨║╨╕ [] +;[] HL - ╤Б╤В╤А╨╛╨║╨░-╨╛╨┐╨╕╤Б╨░╨╜╨╕╨╡ ╨╛╤И╨╕╨▒╨║╨╕ [] +;[]=========================================================================[] +PrErDss: + call ErDss + ld c,Dss.PChars ;╨▓╤Л╨▓╨╡╤Б╤В╨╕ ╤Б╨╛╨╛╨▒╤Й╨╡╨╜╨╕╨╡ ╨╛╨▒ ╨╛╤И╨╕╨▒╨║╨╡ + rst DssRst + ld hl,Str.DA ;╨┐╨╡╤А╨╡╨▓╨╛╨┤ ╤Б╤В╤А╨╛╨║╨╕ + ld c,Dss.PChars + rst DssRst + ret + +ErDss: +.MaxError equ 0x26 + cp .MaxError+1 ;╨╝╨░╨║╤Б╨╕╨╝╨░╨╗╤М╨╜╤Л╨╣ ╨║╨╛╨┤ ╨╛╤И╨╕╨▒╨║╨╕ + 1 + jr c,$+4 + ld a,.MaxError + + push af + add a,a + ld hl,.Tabl + ld d,0 + ld e,a + add hl,de + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + pop af + ret + +.e01 DB "Invalid function",0 +.e02 DB "Invalid drive number",0 +.e03 DB "File not found",0 +.e04 DB "Path not found",0 +.e05 DB "Invalid handle",0 +.e06 DB "Too many open files",0 +.e07 DB "File already exists",0 +.e08 DB "File read only",0 +.e09 DB "Root overflow",0 +.e0A DB "No free space",0 +.e0B DB "Directory not empty",0 +.e0C DB "Can't delete current directory",0 +.e0D DB "Invalid media",0 +.e0E DB "Unknown operation",0 ; (╨╜╨╡╨▓╨╛╨╖╨╝. ╨╛╨┐╨╡╤А╨░╤Ж╨╕╤П) +.e0F DB "Directory exist",0 +.e10 DB "Invalid filename",0 +.e11 DB "Invalid EXE-file",0 +.e12 DB "Not supported EXE-file",0 +.e13 DB "Access denied",0 +.e14 DB "Not ready",0 +.e15 DB "Seek error",0 +.e16 DB "Sector not found",0 +.e17 DB "CRC error",0 +.e18 DB "Write protect",0 +.e19 DB "Read error",0 +.e1A DB "Write error",0 +.e1B DB "Drive failure",0 +.e1C DB "Extended error: 28",0 +.e1D DB "Extended error: 29",0 +.e1E DB "Not enough memory",0 +.e1F DB "Invalid memory block",0 +.e20 DB "Extended error: 32",0 +.e21 DB "Extended error: 33",0 +.e22 DB "Extended error: 34",0 +.e23 DB "Too many files",0 ; (╤Б╨┐╨╕╤Б╨╛╨║ ╤Д╨░╨╣╨╗╨╛╨▓) +.e24 DB "Too many folders nested or many folders (>1024)",0 +.e25 DB "User abort",0 ; (╨╛╨┐╨╡╤А╨░╤Ж╨╕╤П ╨┐╤А╨╡╤А╨▓╨░╨╜╨░ ╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╤В╨╡╨╗╨╡╨╝) +.e26 DB "Unknown error: 38..255",0 ; 38 + +.Tabl dw .e01,.e02,.e03,.e04,.e05,.e06,.e07,.e08 + dw .e09,.e0A,.e0B,.e0C,.e0D,.e0E,.e0F,.e10 + dw .e11,.e12,.e13,.e14,.e15,.e16,.e17,.e18 + dw .e19,.e1A,.e1B,.e1C,.e1D,.e1E,.e1F,.e20 + dw .e21,.e22,.e23,.e24,.e25,.e26 + diff --git a/file.asm b/file.asm new file mode 100644 index 0000000..257abb0 --- /dev/null +++ b/file.asm @@ -0,0 +1,378 @@ +;[]=========================================================================[] +;[] ╨д╨░╨╣╨╗╨╛╨▓╤Л╨╡ ╨┐╤А╨╛╤Ж╨╡╨┤╤Г╤А╤Л ╨╝╨╛╨╜╨╕╤В╨╛╤А╨░-╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ DemoN [] +;[] v0.10 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 27.08.2006 [] +;[]=========================================================================[] +LoadFile + xor a ; ╨▓╤Л╨║╨╗ ╤З╨░╤Б╨╛╨▓ + ld (ClockOn),a + ld bc,0x0100+Dss.SelPage ; ╤Б╨╕╤Б╤В╨╡╨╝╨╜╤Л╨╣ ╤Н╨║╤А╨░╨╜ + rst DssRst + + ld hl,Str.Load ; ╤Б╨╛╨╛╨▒╤Й╨╡╨╜╨╕╨╡ ╨╛ ╨╖╨░╨│╤А╤Г╨╖╨║╨╡ ╤Д╨░╨╣╨╗╨░ + ld c,Dss.PChars + rst DssRst + + call LoadExe + + ld a,(DemonScreen) + ld b,a + ld c,Dss.SelPage + rst DssRst + ld a,On ; ╨▓╨║╨╗ ╤З╨░╤Б╨╛╨▓ + ld (ClockOn),a + ret + +LoadExe + ld hl,FDebug ; ╨╕╨╝╤П ╤Д╨░╨╣╨╗╨░ + IFDEF DSS_1_70 + call build_filename + ENDIF + ld a,1 ; ╨╛╤В╨║╤А╤Л╤В╤М ╨┤╨╗╤П ╤З╤В╨╡╨╜╨╕╤П + ld c,Dss.Open + rst DssRst + jp c,PrErDss ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + + ld (FId),a ; ╨╖╨░╨┐╨╛╨╝╨╜╨╕╤В╤М ╤Д╨░╨╣╨╗╨╛╨▓╤Л╨╣ ╨╝╨░╨╜╨╕╨┐╤Г╨╗╤П╤В╨╛╤А + + ld hl,FDebug ; ╨▒╤Г╤Д╨╡╤А ╨┤╨╗╤П ╨╖╨░╨│╤А╤Г╨╖╨║╨╕ ╨╖╨░╨│╨╛╨╗╨╛╨▓╨║╨░ + ld de,0x7F ; ╨║╨╛╨╗-╨▓╨╛ ╤Б╤З╨╕╤В╤Л╨▓╨░╨╡╨╝╤Л╤Е ╨▒╨░╨╣╤В + ld c,Dss.Read ; ╤З╤В╨╡╨╜╨╕╨╡ + rst DssRst + jp c,PrErDss ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + + ld hl,(FDebug) ; ╨╖╨░╨│╨╛╨╗╨╛╨▓╨╛╨║ EXE-╤Д╨░╨╣╨╗╨░ + ld de,0x5845 ; 'EX' ╨┐╤А╨╛╨▓╨╡╤А╨║╨░ ╨╕╨┤╨╡╨╜╤В╨╕╤Д╨╕╨║╨░╤В╨╛╤А╨░ + sbc hl,de + jr nz,.AS_BUN + ld hl,FDebug+3 + ld a,(hl) ; ╨▓╨╡╤А╤Б╨╕╤П EXE-╤Д╨░╨╣╨╗╨░ + ; exe v0 & v1 + IFDEF DSS_1_70 + cp 2 ; ╨╡╤Б╨╗╨╕ ╨▓╨╡╤А╤Б╨╕╤П EXE >1 ╤В╨╛ ╨│╤А╤Г╨╖╨╕╨╝ ╨║╨░╨║ ╨▒╨╕╨╜╨░╤А╨╜╨╕╨║ ╤Б ORG 0x0000 + jp p,.AS_BUN + ELSE + or a + jr nz,.AS_BUN + ENDIF + inc hl + ld e,(hl) ; DE -> ╨╜╨░╤З╨░╨╗╨╛ ╨╕╤Б╨┐╨╛╨╗╨╜╤П╨╡╨╝╨╛╨│╨╛ ╨║╨╛╨┤╨░ + inc hl + ld d,(hl) + ld bc,11 ; ╨┐╤А╨╛╨┐╤Г╤Б╨║╨░╨╡╨╝ ╤Д╨╗╨░╨│ ╨╖╨░╨│╤А╤Г╨╖╤З╨╕╨║╨░ ╨╕ ╨╖╨░╤А╨╡╨╖╨╡╤А╨▓╨╕╤А╨╛╨▓╨░╨╜╨╜╤Л╨╡ ╨▒╨░╨╣╤В╤Л + add hl,bc + ld a,(hl) ; ╨╝╨╗.╨▒╨░╨╣╤В ╤А╨░╤Б╨┐╨╛╨╗╨╛╨╢╨╡╨╜╨╕╤П ╨║╨╛╨┤╨░ ╨▓ ╨┐╨░╨╝╤П╤В╨╕ + ld (FRam),a + inc hl + ld a,(hl) ; ╤Б╤В.╨▒╨░╨╣╤В ╤А╨░╤Б╨┐╨╛╨╗╨╛╨╢╨╡╨╜╨╕╤П ╨║╨╛╨┤╨░ ╨▓ ╨┐╨░╨╝╤П╤В╨╕ + ld (FRam+1),a + inc hl + ld a,(hl) ; ╨╝╨╗.╨▒╨░╨╣╤В ╨░╨┤╤А╨╡╤Б╨░ ╨╖╨░╨┐╤Г╤Б╨║╨░ + ld (Reg._PC),a + ld (ListAddr),a ; ╨╝╨╗.╨▒╨░╨╣╤В ╨░╨┤╤А╨╡╤Б╨░ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + inc hl + ld a,(hl) ; ╤Б╤В.╨▒╨░╨╣╤В ╨░╨┤╤А╨╡╤Б╨░ ╨╖╨░╨┐╤Г╤Б╨║╨░ + ld (Reg._PC+1),a + ld (ListAddr+1),a ; ╤Б╤В.╨▒╨░╨╣╤В ╨░╨┤╤А╨╡╤Б╨░ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + inc hl + ld a,(hl) ; ╨╝╨╗.╨▒╨░╨╣╤В ╤Б╤В╨╡╨║╨░ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л + ld (Reg._SP),a + inc hl + ld a,(hl) ; ╤Б╤В.╨▒╨░╨╣╤В ╤Б╤В╨╡╨║╨░ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л + ld (Reg._SP+1),a + ld a,e + ld (.F_OFFS),a + ld a,d + ld (.F_OFFS+1),a + +.AS_BUN + ld hl,0 + ld ix,0 ; ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ ╨▓ ╤Д╨░╨╣╨╗╨╡ + ld bc,2*256+Dss.Move_FP ; ╨╛╤В╨╜╨╛╤Б╨╕╤В╨╡╨╗╤М╨╜╨╛ ╨║╨╛╨╜╤Ж╨░ + rst DssRst + jp c,PrErDss ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + + push hl + ld de,(FRam) ; ╨░╨┤╤А╨╡╤Б ╤А╨░╤Б╨┐╨╛╨╗╨╛╨╢╨╡╨╜╨╕╤П ╨║╨╛╨┤╨░ + set 6,d + res 7,d ; ╨│╤А╤Г╨╖╨╕╨╝ ╤З╨╡╤А╨╡╨╖ 1-╨╡ ╨╛╨║╨╜╨╛ + ld hl,0x8000 + or a ; ╤Б╨▒╤А╨╛╤Б╨╕╤В╤М ╤Д╨╗╨░╨│ C + sbc hl,de ; ╨║╨╛╨╗-╨▓╨╛ ╤Б╤З╨╕╤В╤Л╨▓╨░╨╡╨╝╤Л╤Е ╨▒╨░╨╣╤В + ld (.L6+1),hl + ex de,hl + ld (.L6+4),hl + pop hl + call NBank ; ╨╛╨┐╤А╨╡╨┤╨╡╨╗╨╕╤В╤М ╨║╨╛╨╗-╨▓╨╛ ╨▒╨░╨╜╨╛╨║ + jp c,PrErDss ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + + ld (MemId+1),a ; ╨║╨╛╨╗-╨▓╨╛ ╨▓╤Л╨┤╨╡╨╗╤П╨╡╨╝╤Л╤Е ╤Б╤В╤А╨░╨╜╨╕╤Ж + ld b,a + ld c,Dss.GetMem ; ╨▓╤Л╨┤╨╡╨╗╨╡╨╜╨╕╨╡ ╨┐╨░╨╝╤П╤В╨╕ + rst DssRst + jp c,PrErDss ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + ld (MemId),a ; id ╨▒╨╗╨╛╨║╨░ ╨┐╨░╨╝╤П╤В╨╕ + + ld a,(FId) ; ╤Д╨░╨╣╨╗╨╛╨▓╤Л╨╣ ╨╝╨░╨╜╨╕╨┐╤Г╨╗╤П╤В╨╛╤А + ld hl,0 +.F_OFFS+2 ld ix,0 ; ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ ╨▓ ╤Д╨░╨╣╨╗╨╡ + ld bc,Dss.Move_FP ; ╨╛╤В╨╜╨╛╤Б╨╕╤В╨╡╨╗╤М╨╜╨╛ ╨╜╨░╤З╨░╨╗╨░ + rst DssRst + jp c,PrErDss ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + + ld a,(MemId) ; id ╨▒╨╗╨╛╨║╨░ ╨┐╨░╨╝╤П╤В╨╕ + ld bc,Dss.SetWin1 ; ╨▓╨║╨╗ 1-╤О ╨▒╨░╨╜╨║╤Г ╨▓ 1-╨╡ ╨╛╨║╨╜╨╛ + rst DssRst + jp c,PrErDss ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + +.L6 ld de,0x3FFF ; ╨║╨╛╨╗-╨▓╨╛ ╤Б╤З╨╕╤В╤Л╨▓╨░╨╡╨╝╤Л╤Е ╨▒╨░╨╣╤В + ld hl,0x4000 ; ╨░╨┤╤А╨╡╤Б ╨╖╨░╨│╤А╤Г╨╖╨║╨╕ ╨║╨╛╨┤╨░ + ld a,1 ; ╤Б╤З╨╡╤В╤З╨╕╨║ ╨▒╨░╨╜╨╛╨║ + ld (MemId+2),a +.L5 ld a,(FId) ; ╤Д╨░╨╣╨╗╨╛╨▓╤Л╨╣ ╨╝╨░╨╜╨╕╨┐╤Г╨╗╤П╤В╨╛╤А + ld c,Dss.Read ; ╤З╤В╨╡╨╜╨╕╨╡ + rst DssRst + jp c,PrErDss ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + + ld bc,(MemId+1) + ld a,b + cp c ; ╨╖╨░╨│╤А╨╖╨╕╨╗╨╕ ╨▓╨╡╤Б╤М ╤Д╨░╨╣╨╗? + jr z,.L4 ; ╨┐╨╡╤А╨╡╤Е╨╛╨┤, ╨╡╤Б╨╗╨╕ ╨┤╨░ + + inc a + ld (MemId+2),a ; ╤Г╨▓╨╡╨╗╨╕╤З╨╕╤В╤М ╤Б╤З╨╡╤В╤З╨╕╨║ ╨▒╨░╨╜╨╛╨║ + ld a,(MemId) ; id ╨▒╨╗╨╛╨║╨░ ╨┐╨░╨╝╤П╤В╨╕ + ld c,Dss.SetWin1 ; ╨▓╨║╨╗ ╨▒╨░╨╜╨║╤Г ╨▓ 1-╨╡ ╨╛╨║╨╜╨╛ + rst DssRst + jp c,PrErDss ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + + ld hl,0x4000 ; ╨░╨┤╤А╨╡╤Б ╨▓ ╨┐╨░╨╝╤П╤В╨╕ ╨┤╨╗╤П ╨╖╨░╨│╤А╤Г╨╖╨║╨╕ + ld de,0x3FFF ; ╨║╨╛╨╗-╨▓╨╛ ╨╖╨░╨│╤А╤Г╨╢╨░╨╡╨╝╤Л╤Е ╨▒╨░╨╣╤В + jr .L5 + +.L4 ld a,(FId) ; ╤Д╨░╨╣╨╗╨╛╨▓╤Л╨╣ ╨╝╨░╨╜╨╕╨┐╤Г╨╗╤П╤В╨╛╤А + ld c,Dss.Close ; ╨╖╨░╨║╤А╤Л╤В╤М ╤Д╨░╨╣╨╗ + rst DssRst + jp c,PrErDss ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + + ld a,(MemId) ; id ╨▒╨╗╨╛╨║╨░ ╨┐╨░╨╝╤П╤В╨╕ + ld bc,Bios.Emm_Fn4 ; ╨▓╤Л╤З╨╕╤Б╨╗╨╕╤В╤М ╤Д╨╕╨╖ ╨╜╨╛╨╝╨╡╤А 1-╨╣ ╨▒╨░╨╜╨║╨╕ + rst BiosRst + ret c ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + ld (BankP),a + ld a,(MemId+1) ; ╨║╨╛╨╗-╨▓╨╛ ╨▓╤Л╨┤╨╡╨╗╨╡╨╜╨╜╤Л╤Е ╤Б╤В╤А╨░╨╜╨╕╤Ж + dec a + jr z,.L7 + + ld a,(MemId) ; id ╨▒╨╗╨╛╨║╨░ ╨┐╨░╨╝╤П╤В╨╕ + ld bc,1*256+Bios.Emm_Fn4 ; ╨▓╤Л╤З╨╕╤Б╨╗╨╕╤В╤М ╤Д╨╕╨╖ ╨╜╨╛╨╝╨╡╤А 2-╨╣ ╨▒╨░╨╜╨║╨╕ + rst BiosRst + ret c ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + ld (BankP+1),a + ld a,(MemId+1) ; ╨║╨╛╨╗-╨▓╨╛ ╨▓╤Л╨┤╨╡╨╗╨╡╨╜╨╜╤Л╤Е ╤Б╤В╤А╨░╨╜╨╕╤Ж + cp 2 + jr z,.L7 + + ld a,(MemId) ; id ╨▒╨╗╨╛╨║╨░ ╨┐╨░╨╝╤П╤В╨╕ + ld bc,2*256+Bios.Emm_Fn4 ; ╨▓╤Л╤З╨╕╤Б╨╗╨╕╤В╤М ╤Д╨╕╨╖ ╨╜╨╛╨╝╨╡╤А 3-╨╣ ╨▒╨░╨╜╨║╨╕ + rst BiosRst + ret c ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + ld (BankP+2),a + ld a,(MemId+1) ; ╨║╨╛╨╗-╨▓╨╛ ╨▓╤Л╨┤╨╡╨╗╨╡╨╜╨╜╤Л╤Е ╤Б╤В╤А╨░╨╜╨╕╤Ж + cp 3 + jr z,.L7 + + ld a,(MemId) ; id ╨▒╨╗╨╛╨║╨░ ╨┐╨░╨╝╤П╤В╨╕ + ld bc,3*256+Bios.Emm_Fn4 ; ╨▓╤Л╤З╨╕╤Б╨╗╨╕╤В╤М ╤Д╨╕╨╖ ╨╜╨╛╨╝╨╡╤А 4-╨╣ ╨▒╨░╨╜╨║╨╕ + rst BiosRst + ret c ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + ld (BankP+3),a + +.L7 ld hl,WinPage + ld de,BankP + ld a,(MemId+1) ; ╨║╨╛╨╗-╨▓╨╛ ╨▓╤Л╨┤╨╡╨╗╨╡╨╜╨╜╤Л╤Е ╤Б╤В╤А╨░╨╜╨╕╤Ж + ld b,a + cp 5 + jr c,$+4 + ld b,4 ; ╨┐╨╛╨┤╨║╨╗╤О╤З╨░╨╡╨╝ ╨╜╨╡ ╨▒╨╛╨╗╨╡╨╡ 4 ╨▒╨░╨╜╨╛╨║ + ld a,(FRam+1) ; ╤Б╤В.╨░╨┤╤А╨╡╤Б ╤А╨░╤Б╨┐╨╛╨╗╨╛╨╢╨╡╨╜╨╕╤П ╨║╨╛╨┤╨░ + and 0xC0 ; ╨╛╨║╨╜╨╛ ╤Б ╤А╨░╤Б╨┐╨╛╨╗╨╛╨╢╨╡╨╜╨╕╨╡╨╝ ╨║╨╛╨┤╨░ + or a ; 0-╨╡ ╨╛╨║╨╜╨╛ + jr nz,.L8 + ld c,a + ld a,(de) + ld (hl),a ; ╨┐╨╛╨┤╨║╨╗╤О╤З╨╕╤В╤М ╨▒╨░╨╜╨║╤Г ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л + dec b + ret z ; ╨▓╤Л╤Е╨╛╨┤, ╨╡╤Б╨╗╨╕ ╨▒╨╛╨╗╤М╤И╨╡ ╨╜╨╡╤В ╨▒╨░╨╜╨╛╨║ + + ld a,c + inc de +.L8 inc hl + cp 0x40 ; 1-╨╡ ╨╛╨║╨╜╨╛ + jr nz,.L9 + ld c,a + ld a,(de) + ld (hl),a ; ╨┐╨╛╨┤╨║╨╗╤О╤З╨╕╤В╤М ╨▒╨░╨╜╨║╤Г ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л + dec b + ret z ; ╨▓╤Л╤Е╨╛╨┤, ╨╡╤Б╨╗╨╕ ╨▒╨╛╨╗╤М╤И╨╡ ╨╜╨╡╤В ╨▒╨░╨╜╨╛╨║ + + ld a,c + inc de +.L9 inc hl + cp 0x80 ; 2-╨╡ ╨╛╨║╨╜╨╛ + jr nz,.L10 + ld c,a + ld a,(de) + ld (hl),a ; ╨┐╨╛╨┤╨║╨╗╤О╤З╨╕╤В╤М ╨▒╨░╨╜╨║╤Г ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л + dec b + ret z ; ╨▓╤Л╤Е╨╛╨┤, ╨╡╤Б╨╗╨╕ ╨▒╨╛╨╗╤М╤И╨╡ ╨╜╨╡╤В ╨▒╨░╨╜╨╛╨║ + + ld a,c + inc de +.L10 inc hl ; ╨╕╨╜╨░╤З╨╡ 3-╨╡ ╨╛╨║╨╜╨╛ + ld a,(de) + ld (hl),a ; ╨┐╨╛╨┤╨║╨╗╤О╤З╨╕╤В╤М ╨▒╨░╨╜╨║╤Г ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л + + ret + +;[]=========================================================================[] +;[] ╨Т╤Л╤З╨╕╤Б╨╗╨╡╨╜╨╕╨╡ ╨╜╨╡╨╛╨▒╤Е╨╛╨┤╨╕╨╝╨╛╨│╨╛ ╨║╨╛╨╗-╨▓╨░ ╨▒╨░╨╜╨╛╨║ ╨┤╨╗╤П ╨╖╨░╨│╤А╤Г╨╖╨║╨╕ ╤Д╨░╨╣╨╗╨░ ╨▓ ╨┐╨░╨╝╤П╤В╤М [] +;[] ╨Т╤Е╨╛╨┤: HL:IX - ╨┤╨╗╨╕╨╜╨░ ╤Д╨░╨╣╨╗╨░ ╨▓ ╨▒╨░╨╣╤В╨░╤Е [] +;[] DE - ╨║╨╛╨╗-╨▓╨╛ ╨▒╨░╨╣╤В ╨┤╨╗╤П ╨╖╨░╨│╤А╤Г╨╖╨║╨╕ ╨▓ 1-╤О ╨▒╨░╨╜╨║╤Г [] +;[] ╨Т╤Л╤Е╨╛╨┤: A - ╨║╨╛╨╗-╨▓╨╛ ╨╜╨╡╨╛╨▒╤Е╨╛╨┤╨╕╨╝╤Л╤Е ╨▒╨░╨╜╨╛╨║ [] +;[] ╤Д╨╗╨░╨│ C - ╨╛╤И╨╕╨▒╨║╨░, ╨║╨╛╨┤ ╨╛╤И╨╕╨▒╨║╨╕ ╨▓ A [] +;[]=========================================================================[] +NBank: + push ix + ld b,h + ld c,l + pop hl + inc bc + xor a + inc a + sbc hl,de + jr nc,$+4 + jr .L5 + ld de,16384 ; ╤А╨░╨╖╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ + push af +.L2 pop af +.L1 inc a + jr z,.L3 + sbc hl,de + jr nc,.L1 +.L5 dec bc + push af + ld a,b + or c + jr nz,.L2 + pop af + or a ; ╤Б╨▒╤А╨╛╤Б╨╕╤В╤М ╤Д╨╗╨░╨│ C + ret + +.L3 ld a,0x1E ; "╨Э╨╡╨┤╨╛╤Б╤В╨░╤В╨╛╤З╨╜╨╛ ╨┐╨░╨╝╤П╤В╨╕" +; JP ErrorDSS + ret + + IFDEF DSS_1_70 + +; ------------------------------------------------------ +; Check '\' in file path +; Inp: HL->filespec +; Out: CF=0 - slash exists, CF=1 - no slash +; ------------------------------------------------------ +check_bkslash + PUSH BC,HL + LD B,128 +.next + LD A, (HL) + OR A + JR Z,.not_exists + CP "\\" + JR Z,.exists + INC HL + DJNZ .next +.not_exists + SCF + JR .exit +.exists + OR A ; CF=0 +.exit POP HL,BC + RET + +; ---------------------------------------------------- +; Get full current path +; Inp: HP - pointer to buffer for path +; ---------------------------------------------------- +get_cur_dur + PUSH HL + LD C, Dss.CurDisk + RST DssRst + JP C,PrErDss + ADD A, 65 + LD (HL),A + INC HL + LD (HL),':' + INC HL + LD C, Dss.CurDir + RST DssRst + JP C,PrErDss + POP HL + CALL add_back_slash + RET + +; ---------------------------------------------------- +; Add back slash to path string +; Inp: HL - pointer to zero ended string with path +; Out: HL - point to end +; ---------------------------------------------------- +add_back_slash + XOR A + ; find end of path +.find_eos + CP (HL) + JR Z,.is_eos + INC HL + JR .find_eos + ; check last symbol is '\'' and add if not +.is_eos + DEC HL + LD A,(HL) + CP "\\" + JR Z,.is_sep + INC HL + LD (HL),"\\" +.is_sep + ; mark new end of string + INC HL + LD (HL),0x0 + RET + +; ------------------------------------------------------ +; In only filename specified, build full path to file +; Inp: HL -> to filename +; Out: HL -> full path name +; ------------------------------------------------------ +build_filename + CALL check_bkslash + RET NC + LD HL, FullPath + call get_cur_dur + LD DE, FDebug + EX DE,HL + LD BC,128 + LDIR + LD HL, FullPath + RET + ENDIF + +BankP DS 4 ; ╨╜╨╛╨╝╨╡╤А╨░ ╨▒╨░╨╜╨╛╨║ ╨╖╨░╨│╤А╤Г╨╢╨░╨╡╨╝╨╛╨╣ ╨┐╤А╨╛╨│╨╕ +MemId DS 3 ; id-╨▒╨╗╨╛╨║╨░ ╨┐╨░╨╝╤П╤В╨╕ ╨┐╨╛╨┤ ╤Д╨░╨╣╨╗, + ; ╨║╨╛╨╗-╨▓╨╛ ╨▓╤Л╨┤╨╡╨╗╨╡╨╜╨╜╤Л╤Е ╨▒╨░╨╜╨╛╨║, + ; ╤Б╤З╨╡╤В╤З╨╕╨║ ╨╖╨░╨│╤А╤Г╨╢╨╡╨╜╨╜╤Л╤Е ╨▒╨░╨╜╨╛╨║ +FId DB 0 ; ╤Д╨░╨╣╨╗╨╛╨▓╤Л╨╣ ╨╝╨░╨╜╨╕╨┐╤Г╨╗╤П╤В╨╛╤А +FDebug DS 128 ; ╨╕╨╝╤П ╨╛╤В╨╗╨░╨╢╨╕╨▓╨░╨╡╨╝╨╛╨│╨╛ ╤Д╨░╨╣╨╗╨░ ╨╕ ╨▒╤Г╤Д╨╡╤А ╨┤╨╗╤П ╨╡╨│╨╛ ╤З╤В╨╡╨╜╨╕╤П + DB 0 + IFDEF DSS_1_70 +FullPath DS 256,0 + ENDIF +FStart DW 0x4200 +FRam DW 0 ; ╨░╨┤╤А╨╡╤Б ╤А╨░╤Б╨┐╨╛╨╗╨╛╨╢╨╡╨╜╨╕╤П ╨║╨╛╨┤╨░ ╨▓ ╨┐╨░╨╝╤П╤В╨╕ diff --git a/kdump.asm b/kdump.asm new file mode 100644 index 0000000..2f69d6d --- /dev/null +++ b/kdump.asm @@ -0,0 +1,260 @@ +;[]=========================================================================[] +;[] ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л ╨▓ ╨╛╨║╨╜╨╡ ╨┤╨░╨╝╨┐╨░ [] +;[] v0.10 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 31.03.2006 [] +;[]=========================================================================[] + + + MODULE KDUMP + +KDump: + ld a,b ; ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ + and 11110000b + jr z,.L100 + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╛╨╝╨▒╨╕╨╜╨░╤Ж╨╕╨╕ Ctrl + ╤Б╨╕╨╝╨▓╨╛╨╗ +.L10 cp 00100000b ; + jp nz,.L100 + ld a,d ; ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╤Л╨╣ ╨║╨╛╨┤ + + cp SHIFTED_KEY+END_KEY ; + + jr nz,.L11 + ld hl,.Coordinate ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + ld a,16 + cp (hl) + jr nc,.L415 + ld a,32 +.L415 + inc a + ld (hl),a + jp KEYB.Keyb_NC + +.L11 cp SHIFTED_KEY+HOME_KEY ; + + jp nz,KEYB.Keyb_NC +; jr nz,.L11 + ld hl,.Coordinate ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + ld a,18 + cp (hl) + jr c,.L11P8 + ld a,2 + cp (hl) + jr c,.L11P8 + dec a +.L11P8 + ld (hl),a + jp KEYB.Keyb_NC + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╨╛╨│╨╛ ╨║╨╛╨┤╨░ +.L100 ld a,e ; ASCII ╨║╨╛╨┤ + ld (.L200+1),a + ld a,d ; ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╤Л╨╣ ╨║╨╛╨┤ + + ld de,(.Coordinate) ; ╤В╨╡╨║╤Г╤Й╨╕╨╡ ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨║╤Г╤А╤Б╨╛╤А╨░ + cp 0x56 ; + jr nz,.L101 + ld a,(.Descript+2) ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ + cp e + ld a,e + jr nz,.LA446 + xor a +.LA446 + inc a + ld (.Coordinate),a ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + jp KEYB.Keyb_NC + +.L101 cp 0x54 ; + jr nz,.L102 + ld a,e ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + cp 1 + jr nz,.L101P6 + ld a,(.Descript+2) ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ + inc a +.L101P6 + dec a + ld (.Coordinate),a ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + jp KEYB.Keyb_NC + +.L102 ld hl,(.Descript) + cp DN_KEY ; + jr nz,.L103 + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + cp l + jr nz,.L104 + ld hl,(Dump1) + ld bc,16 + add hl,bc + ld (Dump1),hl + jp KEYB.Keyb_RF +.L104 inc a + ld (.Coordinate+1),a + jp KEYB.Keyb_NC + +.L103 cp UP_KEY ; + jr nz,.L105 + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + cp h + jr nz,.L107 + ld hl,(Dump1) + ld bc,16 + or a + sbc hl,bc + ld (Dump1),hl + jp KEYB.Keyb_RF +.L107 dec a + ld (.Coordinate+1),a + jp KEYB.Keyb_NC + +.L105 cp PGDN_KEY ; + jr nz,.L108 + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + cp l + jr nz,.L106 + ld hl,(Dump1) + ld bc,16*7 + add hl,bc + ld (Dump1),hl + jp KEYB.Keyb_RF +.L106 ld a,l ; ╨╜╨░ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╤О╤О ╤Б╤В╤А╨╛╨║╤Г + ld (.Coordinate+1),a + jp KEYB.Keyb_NC + +.L108 cp PGUP_KEY ; + jr nz,.L110 + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + cp h + jr nz,.L109 + ld hl,(Dump1) + ld bc,16*7 + or a + sbc hl,bc + ld (Dump1),hl + jp KEYB.Keyb_RF + jr nz,.L109 +.L109 ld a,h ; ╨╜╨░ ╨┐╨╡╤А╨▓╤Г╤О ╤Б╤В╤А╨╛╨║╤Г + ld (.Coordinate+1),a + jp KEYB.Keyb_NC + +.L110 cp HOME_KEY ; + jr nz,.L111 + ld a,1 + ld (.Coordinate),a ; ╨┐╨╡╤А╨▓╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + jp KEYB.Keyb_NC + +.L111 cp END_KEY ; + jr nz,.L200 + ld a,(.Descript+2) + ld (.Coordinate),a ; ╨┐╨╡╤А╨▓╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + jp KEYB.Keyb_NC + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ASCII ╨║╨╛╨┤╨╛╨▓ +.L200 ld a,0 ; ASCII ╨║╨╛╨┤ + cp ENTER_KEY ; + jp nz,KEYB.Keyb_L1 +.L201 +.ESTR_LEN+* ld b,0 ; ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ +.ESTR_POS+* ld hl,0 ; ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + + ld a,b + dec a + jr z,.L202 + dec a + jr z,.L203 + + call KEYB.InputLine ; ╨▓╨▓╨╛╨┤ ╨░╨┤╤А╨╡╤Б╨░ + jp c,KEYB.Keyb_NC ; ╨╖╨░╨▓╨╡╤А╤И╨╡╨╜╨╕╨╡ ╨▓╨▓╨╛╨┤╨░ ╨┐╨╛ + call KEYB.PutAddress + jp c,.L201 ; ╨╛╤И╨╕╨▒╨║╨░ ╨▓ ╨▓╨╡╨┤╨╡╨╜╨╜╤Л╤Е ╨┤╨░╨╜╨╜╤Л╤Е + ld de,16 ; ╨║╨╛╨╗-╨▓╨╛ ╨▒╨░╨╣╤В ╨▓ ╤Б╤В╤А╨╛╨║╨╡ + ld a,(.Coordinate+1) ; ╨╜╨╛╨╝╨╡╤А ╤Б╤В╤А╨╛╨║╨╕ + sub 0x16 ; ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╨░ ╨┐╨╡╤А╨▓╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕ + jr z,.L522 + ld b,a +.L51D + or a + sbc hl,de + djnz .L51D +.L522 + ld (Dump1),hl + jp KEYB.Keyb_RF + +.L202 call KEYB.InputLineEd ; ╨▓╨▓╨╛╨┤ ╤Б╨╕╨╝╨▓╨╛╨╗╨░ + jp c,KEYB.Keyb_NC ; ╨╖╨░╨▓╨╡╤А╤И╨╡╨╜╨╕╨╡ ╨▓╨▓╨╛╨┤╨░ ╨┐╨╛ + call .L299 + ld a,c + sub 18 ; ╨┐╨╡╤А╨▓╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ ╨▓ ╨┐╨╛╨╗╨╡ ╨┤╨░╨╜╨╜╤Л╤Е + ld c,a + ld a,(KEYB.InputLine.Buffer) + ld de,256*18+34 ; 1-╤П ╨╕ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╤П╤П+1 ╨║╨╛╨╗╨╛╨╜╨║╨╕ + jr .L204 + +.L203 call KEYB.InputLineEd ; ╨▓╨▓╨╛╨┤ ╨║╨╛╨┤╨░ ╤Б╨╕╨╝╨▓╨╛╨╗╨░ + jp c,KEYB.Keyb_NC ; ╨╖╨░╨▓╨╡╤А╤И╨╡╨╜╨╕╨╡ ╨▓╨▓╨╛╨┤╨░ ╨┐╨╛ + call KEYB.PutCode + jp c,.L201 ; ╨╛╤И╨╕╨▒╨║╨░ ╨▓ ╨▓╨╡╨┤╨╡╨╜╨╜╤Л╤Е ╨┤╨░╨╜╨╜╤Л╤Е + call .L299 + ld a,c + sub 2 ; ╨┐╨╡╤А╨▓╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ ╨▓ ╨┐╨╛╨╗╨╡ ╨┤╨░╨╜╨╜╤Л╤Е + ld c,a + ld a,(KEYB.PutCode.Buffer) ; ╨╖╨░╨┐╨╕╤Б╤Л╨▓╨░╨╡╨╝╤Л╨╣ ╨▒╨░╨╣╤В + ld de,256*2+18 ; 1-╤П ╨╕ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╤П╤П+1 ╨║╨╛╨╗╨╛╨╜╨║╨╕ +.L204 add hl,bc + call Ld_hl_a + ld a,(KEYB.InputLine.EntEnd) ; ╨▓╨▓╨╛╨┤ ╨╖╨░╨║╨╛╨╜╤З╨╡╨╜ ENTER + or a + jp nz,KEYB.Keyb_RF ; ╨┤╨░ + ld hl,.Coordinate ; ╤В╨╡╨║╤Г╤Й╨╕╨╡ ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨║╤Г╤А╤Б╨╛╤А╨░ + inc (hl) + ld a,e ; ╨┐╨╡╤А╨▓╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ ╨┤╨░╨╜╨╜╤Л╤Е + cp (hl) + jr nz,.L205 + ld a,d + ld (hl),a ; ╨▓ ╨╜╨░╤З╨░╨╗╨╛ ╤Б╤В╤А╨╛╨║╨╕ ╨║╨╛╨┤╨░ + inc hl + ld a,0x1D ; ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╤П╤П ╤Б╤В╤А╨╛╨║╨░ ╨┤╨░╨╝╨┐╨░ + cp (hl) + jr nz,.L205M1 + ld hl,(Dump1) ; ╤Б╨┤╨▓╨╕╨╜╤Г╤В╤М ╨┤╨░╨╝╨┐ + ld bc,16 + add hl,bc + ld (Dump1),hl + jr .L205 +.L205M1 + inc (hl) +.L205 call CursorRes ; ╨▓╤Л╨║╨╗ ╨║╤Г╤А╤Б╨╛╤А + call Refresh ; ╨╛╨▒╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╡ ╤Н╨║╤А╨░╨╜╨░ + call KEYB.Cursor ; ╨▓╨║╨╗ ╨║╤Г╤А╤Б╨╛╤А + call CursorSet + jp .L201 + +.L299 ld de,16 ; ╨║╨╛╨╗-╨▓╨╛ ╨▒╨░╨╣╤В ╨▓ ╤Б╤В╤А╨╛╨║╨╡ + ld hl,(Dump1) ; ╨░╨┤╤А╨╡╤Б ╨▓ ╨┐╨╡╤А╨▓╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╡ + ld bc,(.Coordinate) + ld a,b + sub 0x16 ; ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╨░ ╨┐╨╡╤А╨▓╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕ + ld b,a + ret z +.LA59C + add hl,de + djnz .LA59C + ret + +.Coordinate DW 0x1601 ; ╨║╤Г╤А╤Б╨╛╤А (╤Б╤В╤А/╨║╨╛╨╗ ╨║╤Г╤А╤Б╨╛╤А╨░) +.Descript: + DW 0x161D ; ╨┐╨╡╤А╨▓╨░╤П/╨┐╨╛╤Б╨╗╨╡╨┤╨╜╤П╤П ╤Б╤В╤А╨╛╨║╨░ ╨╛╨║╨╜╨░ + DB 33 ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ + + DB 0x0E ; N ╤Б╤В╨╛╨╗╨▒╤Ж╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 5 ; ╤И╨╕╤А╨╕╨╜╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 0x15,2,0x17,2 + DB 0x1A,2,0x1C,2 + DB 0x1F,2,0x21,2 + DB 0x24,2,0x26,2 + DB 0x29,2,0x2B,2 + DB 0x2E,2,0x30,2 + DB 0x33,2,0x35,2 + DB 0x38,2,0x3A,2 + DB 0x3E,1,0x3F,1,0x40,1,0x41,1 + DB 0x42,1,0x43,1,0x44,1,0x45,1 + DB 0x46,1,0x47,1,0x48,1,0x49,1 + DB 0x4A,1,0x4B,1,0x4C,1,0x4D,1 + + ENDMODULE \ No newline at end of file diff --git a/keyb.asm b/keyb.asm new file mode 100644 index 0000000..04e831f --- /dev/null +++ b/keyb.asm @@ -0,0 +1,1297 @@ +;[]=========================================================================[] +;[] ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л [] +;[] v0.01 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 10.10.2004 [] +;[] v0.02 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 27.03.2005 [] +;[] v0.03 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 11.03.2006 [] +;[] v0.10 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 14.05.2006 [] +;[]=========================================================================[] + +; -- Key masks and flags +SHIFTS_MASK EQU 11110000b +LSHIFT_FLAG EQU 10000000b +RSHIFT_FLAG EQU 01000000b +SHIFT_FLAG EQU LSHIFT_FLAG + RSHIFT_FLAG +CTRL_FLAG EQU 00100000b +ALT_FLAG EQU 00010000b + +LCTRL_FLAG EQU 00001000b +LALT_FLAG EQU 00000100b +RCTRL_FLAG EQU 00000010b +RALT_FLAG EQU 00000001b + +SHIFTED_KEY EQU 0x80 + +; -- Key codes (Scancodes) +AST_KEY EQU 0x00 +ENTER_KEY EQU 0x0D +BKSP_KEY EQU 0x0E +TAB_KEY EQU 0x0F +E_KEY EQU 0x12 +R_KEY EQU 0x13 +ESC_KEY EQU 0x1B +Z_KEY EQU 0x2A +X_KEY EQU 0x2B +C_KEY EQU 0x2C +V_KEY EQU 0x2D +F1_KEY EQU 0x3B +F2_KEY EQU 0x3C +F3_KEY EQU 0x3D +F4_KEY EQU 0x3E +F5_KEY EQU 0x3F +F6_KEY EQU 0x40 +F7_KEY EQU 0x41 +F8_KEY EQU 0x42 +F9_KEY EQU 0x43 +F10_KEY EQU 0x44 +SLCK_KEY EQU 0x48 +DEL_KEY EQU 0x4F +INS_KEY EQU 0x50 +END_KEY EQU 0x51 +DN_KEY EQU 0x52 +PGDN_KEY EQU 0x53 +LEFT_KEY EQU 0x54 +RIGHT_KEY EQU 0x56 +HOME_KEY EQU 0x57 +UP_KEY EQU 0x58 +PGUP_KEY EQU 0x59 + + + MODULE KEYB + +Keyb_RF + call CursorRes ; ╨▓╤Л╨║╨╗ ╨║╤Г╤А╤Б╨╛╤А + call Refresh ; ╨╛╨▒╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╡ ╤Н╨║╤А╨░╨╜╨░ + jr Keyb +Keyb_NC + call CursorRes ; ╨▓╤Л╨║╨╗ ╨║╤Г╤А╤Б╨╛╤А +Keyb + call Cursor ; ╨▓╨║╨╗ ╨║╤Г╤А╤Б╨╛╤А + call CursorSet +!Keyb_L1 + ld c,Dss.ScanKey ; ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л + rst DssRst + jr z,Keyb_L1 + ld a,b ; ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ + and SHIFTS_MASK + jr z,.L100 + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╛╨╝╨▒╨╕╨╜╨░╤Ж╨╕╨╕ Shift + ╤Б╨╕╨╝╨▓╨╛╨╗ + and SHIFT_FLAG ; + or a + jr z,.L1 + ld a,d + cp SHIFTED_KEY+TAB_KEY ; Shift+Tab + jr nz,Keyb_L1 + ld hl,Keyb.WinScreen + ld a,(hl) + dec a + jr nz,.Keyb_L4 + ld a,4 +.Keyb_L4 + ld (hl),a ; ╨╜╨╛╨╝╨╡╤А ╨╛╨║╨╜╨░ ╨┤╨░╨╝╨┐╨░ + jr Keyb_NC + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╛╨╝╨▒╨╕╨╜╨░╤Ж╨╕╨╕ Alt + ╤Б╨╕╨╝╨▓╨╛╨╗ +.L1 ld a,b + and SHIFTS_MASK + cp ALT_FLAG ; + jr nz,.L10 + ld a,d ; ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╤Л╨╣ ╨║╨╛╨┤ + cp SHIFTED_KEY+X_KEY ; + + jr nz,.L10 + ret z ; ╨▓╤Л╤Е╨╛╨┤ + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╛╨╝╨▒╨╕╨╜╨░╤Ж╨╕╨╕ Ctrl + ╤Б╨╕╨╝╨▓╨╛╨╗ +.L10 cp CTRL_FLAG ; + jp nz,.L0 + ld a,d ; ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╤Л╨╣ ╨║╨╛╨┤ + cp SHIFTED_KEY+E_KEY ; + (dEc/hEx) + jr nz,.L11 + ld a,(DecHex) + cpl + ld (DecHex),a + jr Keyb_RF + +.L11 cp SHIFTED_KEY+R_KEY ; + ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В + jr nz,.L12 + call CursorRes + ld b,5 ; ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + ld hl,0x1413 + push hl + push bc + call CursorSet + pop bc + pop hl + call InputLine + jp c,Keyb_NC + call PutAddress + jp c,Keyb_NC + call KREG.KReg.Rez ; ╨╜╨╛╨▓╤Л╨╣ ╨░╨┤╤А╨╡╤Б ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + jr Keyb_RF + + +.L12 cp SHIFTED_KEY+Z_KEY ; + + jp z,.L202M2 ; ╨▓╤Л╨┐╨╛╨╗╨╜╨╡╨╜╨╕╨╡ ╨║╨╛╨╝╨░╨╜╨┤╤Л + cp SHIFTED_KEY+C_KEY ; + + jp z,.L200P5 ; ╨▓╤Л╨┐╨╛╨╗╨╜╨╡╨╜╨╕╨╡ ╨║╨╛╨╝╨░╨╜╨┤╤Л + cp SHIFTED_KEY+V_KEY ; + + jp z,.L9952 ; ╨┐╤А╨╛╨┐╤Г╤Б╨║ ╨║╨╛╨╝╨░╨╜╨┤╤Л + +; cp 0x80+0x48 ; +; call z,ScreenS ;╤Б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╕╨╡ ╤Н╨║╤А╨░╨╜╨░ ╨▓ ╤Д╨░╨╣╨╗ + +.L13 ;... + jp .L0 + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ASCII ╨║╨╛╨┤╨╛╨▓ +.L100 ld a,e + cp ESC_KEY ; - ╨▓╨║╨╗.╤Б╨╕╤Б╤В╨╡╨╝╨╜╨╛╨│╨╛ ╤Н╨║╤А╨░╨╜╨░ + jr nz,.L200 + xor a ; ╨▓╤Л╨║╨╗ ╤З╨░╤Б╨╛╨▓ + ld (ClockOn),a + ld a,(OSScreen) + ld b,a + push bc + ld a,(OSGrafMode) + ld c,Dss.SetVMod ; ╤Б╨╕╤Б╤В╨╡╨╝╨╜╤Л╨╣ ╤Н╨║╤А╨░╨╜ + rst DssRst + pop bc + ld a,(DemonScreen) + cp b + jr nz,.NoRest + ld de,0 ; ╨Х╤Б╨╗╨╕ ╤Н╨║╤А╨░╨╜╤Л ╨Ю╨б ╨╕ ╨Ф╨╡╨╝╨╛╨╜╨░ ╤Б╨╛╨▓╨┐╨░╨┤╨░╤О╤В - + ld hl,#2050 ; ╨▓╨╛╤Б╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ ╤Б╨║╤А╨╕╨╜ + ld a,(BufPage) + ld b,a + ld c,Dss.WinRest + ld ix,#c000 + rst DssRst +.NoRest ld c,Dss.WaitKey + rst DssRst ; ╨╢╨┤╨╡╨╝ Any Key + ld a,(DemonScreen) + ld b,a + ld a,3 + ld c,Dss.SetVMod + push bc + rst DssRst + pop bc + ld a,(OSScreen) + cp b + call z,RefreshScreen ; ╨Х╤Б╨╗╨╕ ╤Н╨║╤А╨░╨╜╤Л ╤Б╨╛╨▓╨┐╨░╨┤╨░╤О╤В - ╨┐╨╡╤А╨╡╤А╨╕╤Б╨╛╨▓╤Л╨▓╨░╨╡╨╝ + ld a,On ; ╨▓╨║╨╗ ╤З╨░╤Б╨╛╨▓ + ld (ClockOn),a + jp Keyb_L1 + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╨╛╨│╨╛ ╨║╨╛╨┤╨░ +.L200 ld a,d + cp F1_KEY ; + jr nz,.L208 +.L200P5 + call DemonHelp +; ld c,Dss.WaitKey +; rst DssRst ; ╨╢╨┤╨╡╨╝ Any Key + +.NoExit call RefreshScreen + jp Keyb_L1 +.L208 cp F3_KEY + jr nz,.L207 + call LOADBIN.LoadBinDialog + jr .NoExit +.L207 + cp F8_KEY ; + jr nz,.L201 + ld a,Off ; ╤Д╨╗╨░╨│ ╨┐╤А╨╛╨┐╤Г╤Б╨║╨░ ╨┐╨╛╨┤╨┐╤А╨╛╨│╤А╨░╨╝╨╝ + jr .L202 + +.L201 cp F7_KEY ; + jr nz,.L203 +.L202M2 + ld a,On ; ╤Д╨╗╨░╨│ ╤В╤А╨░╤Б╤Б╨╕╤А╨╛╨▓╨║╨╕ ╨┐╨╛╨┤╨┐╤А╨╛╨│╤А╨░╨╝╨╝ +.L202 ld (STEP.Step.Flag),a + ld hl,PrintStrSP.StrSp + ld a,(hl) ; ╤Б╤В╤А╨╛╨║╨░ ╨▓╨╡╤А╤И╨╕╨╜╤Л ╤Б╤В╨╡╨║╨░ + inc a + jr nz,.L9948 + ld a,6 ; ╨▓╨╡╤А╨╜╤Г╤В╤М ╨▓╨╡╤А╤И╨╕╨╜╤Г ╤Б╤В╨╡╨║╨░ + ld (hl),a +.L9948 + call STEP.Step + jp Keyb_RF + +.L203 cp F9_KEY ; + jr nz,.L204 +.L9952 + ld hl,(Reg._PC) + call List ; ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨░╤П ╨║╨╛╨╝╨░╨╜╨┤╨░ + ld (Reg._PC),hl ; ╨╜╨╛╨▓╤Л╨╣ PC + push hl + ld a,(KList.Descript) ; ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╤Б╤В╤А╨╛╨║ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + call AdrListTabl ; ╨╜╨╕╨╢╨╜╨╕╨╣ ╨░╨┤╤А╨╡╤Б ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + ld de,(ListAddr) ; ╨▓╨╡╤А╤Е╨╜╨╕╨╣ ╨░╨┤╤А╨╡╤Б ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + pop bc ; ╨╜╨╛╨▓╤Л╨╣ PC + call AdrArea + jp nc,Keyb_RF + ld (ListAddr),bc ; ╨╜╨╛╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + jp Keyb_RF + +.L204 cp TAB_KEY ; + jr nz,.L205 + ld hl,Keyb.WinScreen + ld a,(hl) + inc a + cp 5 + jr nz,.L9983 + ld a,1 +.L9983 + ld (hl),a ; ╨╜╨╛╨╝╨╡╤А ╨╛╨║╨╜╨░ ╨┤╨░╨╝╨┐╨░ + jp Keyb_NC + +.L205 cp SLCK_KEY ; + jr nz,.L206 + call SaveScr ; ╤Б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╕╨╡ ╤Н╨║╤А╨░╨╜╨░ ╨▓ ╤Д╨░╨╣╨╗ + jp Keyb_L1 + +.L206 cp F10_KEY ; + jr nz,.L0 + ;╨▓╤Л╤Е╨╛╨┤ + ld ix,ExitDlg + call DialogWindow + ret + call ClearScreen +.L0 ld a,(.WinScreen) ; ╨░╨║╤В╨╕╨▓╨╜╨╛╨╡ ╨╛╨║╨╜╨╛ + dec a + jp z,KList + dec a + jp z,KDUMP.KDump + dec a + jp z,KREG.KReg + jp KStack + +.WinScreen db 1 ; ╨╜╨╛╨╝╨╡╤А ╨░╨║╤В╨╕╨▓╨╜╨╛╨│╨╛ ╨╛╨║╨╜╨░ + ; 1 - ╨╛╨║╨╜╨╛ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + ; 2 - ╨╛╨║╨╜╨╛ ╨┤╨░╨╝╨┐╨░ + ; 3 - ╨╛╨║╨╜╨╛ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓ + ; 4 - ╨╛╨║╨╜╨╛ ╤Б╤В╨╡╨║╨░ + + ; ╨Я╤А╨╛╤А╨╕╤Б╨╛╨▓╨║╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ +Cursor: + ld a,(Keyb.WinScreen) ; ╨░╨║╤В╨╕╨▓╨╜╨╛╨╡ ╨╛╨║╨╜╨╛ + dec a + jr z,.L1 + dec a + jr z,.L2 + dec a + jr z,.L3 + + ; ╨Ю╨║╨╜╨╛ ╨┤╨░╨╝╨┐╨░ ╤Б╤В╨╡╨║╨░ + ld de,(KStack.Coordinate) ; ╤А╨░╤Б╤З╨╡╤В ╨║╤Г╤А╤Б╨╛╤А╨░ + ld hl,KStack.Descript+2 + ld b,e +.L99C7 + inc hl + inc hl + djnz .L99C7 + ld a,(hl) ; ╨┤╨╗╨╕╨╜╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ + ld (@KStack.ESTR_LEN),a + ld b,a + dec hl + ld e,(hl) ; X-╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ + ex de,hl + ld (@KStack.ESTR_POS),hl + ret + + ; ╨Ю╨║╨╜╨╛ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ +.L1 ld de,(KList.Coordinate) ; ╤А╨░╤Б╤З╨╡╤В ╨║╤Г╤А╤Б╨╛╤А╨░ + ld hl,KList.Descript+2 + ld b,e +.L99DF + inc hl + inc hl + djnz .L99DF + ld a,(hl) ; ╨┤╨╗╨╕╨╜╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ + ld (KList.L201+1),a + ld b,a + dec hl + ld e,(hl) ; X-╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ + ex de,hl + ld (KList.L201+3),hl + ret + + ; ╨Ю╨║╨╜╨╛ ╨┤╨░╨╝╨┐╨░ +.L2 ld de,(KDUMP.KDump.Coordinate) ; ╤А╨░╤Б╤З╨╡╤В ╨║╤Г╤А╤Б╨╛╤А╨░ + ld hl,KDUMP.KDump.Descript+2 + ld b,e +.L99F7 + inc hl + inc hl + djnz .L99F7 + ld a,(hl) ; ╨┤╨╗╨╕╨╜╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ + ld (KDUMP.KDump.ESTR_LEN),a + ld b,a + dec hl + ld e,(hl) ; X-╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ + ex de,hl + ld (KDUMP.KDump.ESTR_POS),hl + ret + + ; ╨Ю╨║╨╜╨╛ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓ +.L3 call KREG.KReg.DescCalc + ld d,b + ld b,e ; ╨║╨╛╨╗╨╛╨╜╨╛╨║╨░ ╨▓ ╤Б╤В╤А╨╛╨║╨╡ +.L9A0C + inc hl + inc hl + djnz .L9A0C + ld a,(hl) ; ╨┤╨╗╨╕╨╜╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ + ld (KREG.KReg.ESTR_LEN),a + ld b,a + dec hl + ld e,(hl) ; X-╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ + ex de,hl + ld (KREG.KReg.ESTR_POS),hl + ret + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╗╨░╨▓╨╕╤И ╨▓ ╨╛╨║╨╜╨╡ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ +KList: + ld a,b ; ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ + and SHIFTS_MASK + jr z,.L100 + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╛╨╝╨▒╨╕╨╜╨░╤Ж╨╕╨╕ Alt + ╤Б╨╕╨╝╨▓╨╛╨╗ + cp ALT_FLAG ; + jr nz,.L10 + jp Keyb_L1 + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╛╨╝╨▒╨╕╨╜╨░╤Ж╨╕╨╕ Ctrl + ╤Б╨╕╨╝╨▓╨╛╨╗ +.L10 cp CTRL_FLAG ; + jp nz,Keyb_L1 + + ld a,d ; ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╤Л╨╣ ╨║╨╛╨┤ + cp SHIFTED_KEY+X_KEY ; + + jp nz,.L20 + + call AdrListTabl-3 ; ╨▓╤Л╨▒╨╛╤А╨║╨░ ╨░╨┤╤А╨╡╤Б╨░ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ ╨┐╨╛ N ╤Б╤В╤А╨╛╨║╨╕ + ld (Reg._PC),hl + jp .NewLA1+3 + +.L20 ld a,b + cp CTRL_FLAG+RCTRL_FLAG ; ╨┐╤А╨░╨▓╤Л╨╣ + jr nz,.L21 + ld bc,.CtrlTabl + call AdrCtrlTabl ; ╨▓╤Л╨▒╨╛╤А╨║╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓ ╤В╨░╨▒╨╗╨╕╤Ж╨╡ + jp nc,Keyb_L1 ; ╨╜╨╡ ╤Ж╨╕╤Д╤А╨╛╨▓╤Л╨╡ ╨║╨╗╨░╨▓╨╕╤И╨╕ + + ld a,(.Coordinate+1) + ld (bc),a ; ╨╜╨╛╨╝╨╡╤А ╤Б╤В╤А╨╛╨║╨╕ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + inc bc + call AdrListTabl ; ╨▓╤Л╨▒╨╛╤А╨║╨░ ╨░╨┤╤А╨╡╤Б╨░ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ ╨┐╨╛ N ╤Б╤В╤А╨╛╨║╨╕ + ld a,l + ld (bc),a + inc bc + ld a,h + ld (bc),a + jp Keyb_L1 + +.L21 cp CTRL_FLAG+LCTRL_FLAG ; ╨╗╨╡╨▓╤Л╨╣ + jp nz,Keyb_L1 + + ld a,d ; ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╤Л╨╣ ╨║╨╛╨┤ + cp SHIFTED_KEY+AST_KEY ; Ctrl+"`" + jp nz,.L22 + + ld a,(.CtrlWin) + ld h,a + ld l,0 + add a,0x40 ; ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╡╨╡ ╨╛╨║╨╜╨╛ + ld (.CtrlWin),a + ld a,(.Descript+1) + ld (.Coordinate+1),a + jp .NewLA1 + +.L22 ld bc,.CtrlTabl + call AdrCtrlTabl ; ╨▓╤Л╨▒╨╛╤А╨║╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓ ╤В╨░╨▒╨╗╨╕╤Ж╨╡ + jp nc,Keyb_L1 + + ld a,(bc) ; ╨╜╨╛╨╝╨╡╤А ╤Б╤В╤А╨╛╨║╨╕ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + or a + jp z,Keyb_L1 ; ╨╜╨╡╤В ╨┤╨░╨╜╨╜╤Л╤Е + + inc bc + ld a,(bc) + ld l,a + inc bc + ld a,(bc) + ld h,a ; ╨░╨┤╤А╨╡╤Б ╨╕╨╖ ╨▒╤Г╤Д╨╡╤А╨░ + jp .NewLA + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╨╛╨│╨╛ ╨║╨╛╨┤╨░ +.L100 ld a,e ; ASCII ╨║╨╛╨┤ + ld (.L200+1),a + ld a,d ; ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╤Л╨╣ ╨║╨╛╨┤ + + ld de,(.Coordinate) ; ╤В╨╡╨║╤Г╤Й╨╕╨╡ ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨║╤Г╤А╤Б╨╛╤А╨░ + cp RIGHT_KEY ; + jr nz,.L101 + ld a,(.Descript+2) ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ + cp e + ld a,e + jr nz,.L9AA5 + xor a +.L9AA5 + inc a + ld (.Coordinate),a ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + jp Keyb_NC + +.L101 cp LEFT_KEY ; + jr nz,.L102 + ld a,e ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + cp 1 + jr nz,.L9AB9 + ld a,(.Descript+2) ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ + inc a +.L9AB9 + dec a + ld (.Coordinate),a ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + jp Keyb_NC + +.L102 ld hl,(.Descript) + cp DN_KEY ; + jr nz,.L103 + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + cp l + jr nz,.L104 + ld hl,(ListAddr+2) ; ╨░╨┤╤А╨╡╤Б ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╡╨╣ ╤Б╤В╤А╨╛╨║╨╕ + jp .NewLA1 +.L104 inc a + ld (.Coordinate+1),a + jp Keyb_NC + +.L103 cp UP_KEY ; + jr nz,.L105 + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + cp h + jr nz,.L107 + ld hl,(ListAddr) ; ╨░╨┤╤А╨╡╤Б ╨▓╨╡╤А╤Е╨╜╨╡╨╣ ╤Б╤В╤А╨╛╨║╨╕ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + call UpAddress ; ╨┐╤А╨╡╨┤╤Л╨┤╤Г╤Й╨╕╨╣ ╨░╨┤╤А╨╡╤Б + jp .NewLA1 +.L107 dec a + ld (.Coordinate+1),a + jp Keyb_NC + +.L105 cp PGDN_KEY ; + jr nz,.L108 + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + cp l + jr nz,.L106 + call AdrListTabl + jp .NewLA1 +.L106 ld a,l ; ╨╜╨░ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╤О╤О ╤Б╤В╤А╨╛╨║╤Г + ld (.Coordinate+1),a + jp Keyb_NC + +.L108 cp PGUP_KEY ; + jr nz,.L110 + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + cp h + jr nz,.L109 + dec l ; ╨║╨╛╨╗-╨▓╨╛ ╤Б╤В╤А╨╛╨║ - 1 + ld b,l + ld hl,(ListAddr) ; ╨░╨┤╤А╨╡╤Б ╨┐╨╡╤А╨▓╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕ +.L9B12 + push bc + call UpAddress ; ╨┐╤А╨╡╨┤╤Л╨┤╤Г╤Й╨╕╨╣ ╨░╨┤╤А╨╡╤Б + pop bc + djnz .L9B12 + jp .NewLA1 +.L109 ld a,h ; ╨╜╨░ ╨┐╨╡╤А╨▓╤Г╤О ╤Б╤В╤А╨╛╨║╤Г + ld (.Coordinate+1),a + jp Keyb_NC + +.L110 cp HOME_KEY ; + jr nz,.L111 + ld a,1 + ld (.Coordinate),a ; ╨┐╨╡╤А╨▓╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + jp Keyb_NC + +.L111 cp END_KEY ; + jr nz,.L200 + ld a,(.Descript+2) ; ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╤П╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + ld (.Coordinate),a ; ╨┐╨╡╤А╨▓╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + jp Keyb_NC + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ASCII ╨║╨╛╨┤╨╛╨▓ +.L200 ld a,0 + cp ENTER_KEY ; + jp nz,.NewPCAdr ; Keyb+6 +.L201 ld b,0 ; ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + ld hl,0 ; ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + ld a,(.Coordinate) + dec a ; ╨║╨╛╨╗╨╛╨╜╨║╨░ ╨░╨┤╤А╨╡╤Б╨░ + jr z,.InAdres + dec a ; ╨║╨╛╨╗╨╛╨╜╨║╨░ ╨╝╨╡╤В╨║╨╕ + jr z,.L2P5 + dec a ; ╨║╨╛╨╗╨╛╨╜╨║╨░ ╨║╨╛╨┤╨░ ╨║╨╛╨╝╨░╨╜╨┤╤Л + jr z,.InCode +.L2P5 + call InputLine + jp Keyb_NC +.NewPCAdr cp "z" ; + jp nz,Keyb_L1 + call AdrListTabl-3 ; ╨г╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М ╨╜╨╛╨▓╤Л╨╣ PC + ld (Reg._PC),HL + jp Keyb_RF +.InCode call InputLine ; ╨▓╨▓╨╛╨┤ ╨║╨╛╨┤╨░ ╨▓ 3 ╨║╨╛╨╗╨╛╨╜╨║╨╡ + jp c,Keyb_NC ; ╨╖╨░╨▓╨╡╤А╤И╨╡╨╜╨╕╨╡ ╨▓╨▓╨╛╨┤╨░ ╨┐╨╛ + call PutCode + jr c,.L201 ; ╨╛╤И╨╕╨▒╨║╨░ ╨▓ ╨▓╨╡╨┤╨╡╨╜╨╜╤Л╤Е ╨┤╨░╨╜╨╜╤Л╤Е + call AdrListTabl-3 ; ╨░╨┤╤А╨╡╤Б ╤В╨╡╨║╤Г╤Й╨╡╨╣ ╤Б╤В╤А╨╛╨║╨╕ + ld de,PutCode.Buffer +.L2M6 + ld a,(de) ; ╨╖╨░╨┐╨╕╤Б╤М ╨║╨╛╨┤╨░ ╨▓ ╨┐╨░╨╝╤П╤В╤М + call Ld_hl_a + inc de + inc hl + djnz .L2M6 + jr .NewLA2 + +.InAdres call InputLine ; ╨▓╨▓╨╛╨┤ ╨░╨┤╤А╨╡╤Б╨░ ╨▓ 1 ╨║╨╛╨╗╨╛╨╜╨║╨╡ + jp c,Keyb_NC ; ╨╖╨░╨▓╨╡╤А╤И╨╡╨╜╨╕╨╡ ╨▓╨▓╨╛╨┤╨░ ╨┐╨╛ + call PutAddress + jr c,.L201 ; ╨╛╤И╨╕╨▒╨║╨░ ╨▓ ╨▓╨╡╨┤╨╡╨╜╨╜╤Л╤Е ╨┤╨░╨╜╨╜╤Л╤Е + +.NewLA ld a,(.Coordinate+1) + dec a + jr z,.NewLA1 + ld b,a +.L9B95 + push bc + call UpAddress ; ╨┐╤А╨╡╨┤╤Л╨┤╤Г╤Й╨╕╨╣ ╨░╨┤╤А╨╡╤Б + pop bc + djnz .L9B95 +.NewLA1 ld (ListAddr),hl +.NewLA2 + jp Keyb_RF + +.CtrlWin db 0 ; ╨╛╨║╨╜╨╛ ╨┤╨╗╤П Ctrl+"`" +.CtrlTabl ds 30 ; ╨▒╤Г╤Д╤Д╨╡╤А ╨┤╨╗╤П ╨░╨┤╤А ╨▒╤Л╤Б╤В╤А ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ +.Coordinate dw 0x0201 ; ╨║╤Г╤А╤Б╨╛╤А (╤Б╤В╤А/╨║╨╛╨╗ ╨║╤Г╤А╤Б╨╛╤А╨░) +.Descript: + dw 0x0114 ; ╨┐╨╡╤А╨▓╨░╤П/╨┐╨╛╤Б╨╗╨╡╨┤╨╜╤П╤П ╤Б╤В╤А╨╛╨║╨░ ╨╛╨║╨╜╨░ + db 4 ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ + + db 0x1A ; N ╤Б╤В╨╛╨╗╨▒╤Ж╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + db 5 ; ╤И╨╕╤А╨╕╨╜╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + db 0x20 + db 14 + db 0x2F + db 8 + db 0x38 + db 22 + +;[]=========================================================================[] +;[] ╨Т╤Л╨▒╨╛╤А╨║╨░ ╨░╨┤╤А╨╡╤Б╨░ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ ╨╕╨╖ ╤В╨░╨▒╨╗╨╕╤Ж╤Л [] +;[] ╨Т╤Л╤Е╨╛╨┤: HL - ╨░╨┤╤А╨╡╤Б ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ ╨▓ ╤В╨╡╨║╤Г╤Й╨╡╨╣ ╤Б╤В╤А╨╛╨║╨╡ [] +;[]=========================================================================[] + ld a,(KList.Coordinate+1) ; ╨╜╨╛╨╝╨╡╤А ╤В╨╡╨║╤Г╤Й╨╡╨╣ ╤Б╤В╤А╨╛╨║╨╕ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ +AdrListTabl: + dec a + add a,a ; *2 + ld e,a + ld d,0 + ld hl,ListAddr ; ╤В╨░╨▒╨╗╨╕╤Ж╨░ ╨░╨┤╤А╨╡╤Б╨╛╨▓ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + add hl,de ; ╤Б╤В╤А╨╛╨║╨░ ╨▓ ╤В╨░╨▒╨╗╨╕╤Ж╨╡ + ld a,(hl) + inc hl + ld h,(hl) + ld l,a ; ╨░╨┤╤А╨╡╤Б ╤Б╤В╤А╨╛╨║╨╕ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + ret + +;[]=========================================================================[] +;[] ╨Т╤Л╨▒╨╛╤А╨║╨░ ╨░╨┤╤А╨╡╤Б╨░ ╤Ж╨╕╤Д╤А╨╛╨▓╤Л╤Е ╨║╨╗╨░╨▓╨╕╤И ╨╕╨╖ ╤В╨░╨▒╨╗╨╕╤Ж╤Л [] +;[] ╨Т╤Е╨╛╨┤: D - ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╤Л╨╣ ╨║╨╛╨┤ ╤Ж╨╕╤Д╤А╨╛╨▓╨╛╨╣ ╨║╨╗╨░╨▓╨╕╤И╨╕ [] +;[] BC - ╨░╨┤╤А╨╡╤Б ╨╜╨░╤З╨░╨╗╨░ ╤В╨░╨▒╨╗╨╕╤Ж╤Л [] +;[] ╨Т╤Л╤Е╨╛╨┤: BC - ╨░╨┤╤А╨╡╤Б ╨▓ ╤В╨░╨▒╨╗╨╕╤Ж╨╡ [] +;[] ╨д╨╗╨░╨│ NC - ╨╜╨░╨╢╨░╤В╨░ ╨╜╨╡ ╤Ж╨╕╤Д╤А╨╛╨▓╨░╤П ╨║╨╗╨░╨▓╨╕╤И╨░ [] +;[]=========================================================================[] +AdrCtrlTabl: + ld a,d + and 01111111b ; ╤Б╨▒╤А╨╛╤Б ╤Б╤В╨░╤А╤И╨╡╨│╨╛ ╨▒╨╕╤В╨░ + dec a + dec a + cp 0x0A ; ╨┐╤А╨╛╨▓╨╡╤А╨║╨░ ╤Ж╨╕╤Д╤А╨╛╨▓╤Л╤Е ╨║╨╗╨░╨▓╨╕╤И ╨▓╨╡╤А╤Е╨╜╨╡╨│╨╛ ╤А╤П╨┤╨░ + ret nc + or a + scf + ret z ; ╨▓╤Л╤Е╨╛╨┤, ╨╡╤Б╨╗╨╕ "0" +.L9BEA + inc bc + inc bc + inc bc + dec a + jr nz,.L9BEA + ret + +;[]=========================================================================[] +;[] ╨Я╨╛╨╗╤Г╤З╨╡╨╜╨╕╨╡ ╨║╨╛╨┤╨░ ╨╕╨╖ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ [] +;[] ╨Т╤Е╨╛╨┤: C - ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ [] +;[] ╨Т╤Л╤Е╨╛╨┤: .Buffer - ╨╖╨░╤Е╨▓╨░╤З╨╡╨╜╨╜╤Л╨╡ ╨▒╨░╨╣╤В╤Л [] +;[] B - ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╨╖╨░╤Е╨▓╨░╤З╨╡╨╜╨╜╤Л╤Е ╨▒╨░╨╣╤В [] +;[] ╤Д╨╗╨░╨│ C - ╨╛╤И╨╕╨▒╨║╨░ [] +;[]=========================================================================[] +PutCode + ld de,InputLine.Buffer + ld hl,.Buffer + ld a,c + dec a + ret c ; ╨╜╤Г╨╗╨╡╨▓╨░╤П ╤Б╤В╤А╨╛╨║╨░ + inc a + srl a + ld b,a + jr z,.L3 ; ╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨╛╨┤╨╜╨╛╨│╨╛ ╤Б╨╕╨╝╨▓╨╛╨╗╨░ + ld c,a + ld a,0xC9 ; RET + jr nc,.L9C06 + xor a ; NOP +.L9C06 + ld (.L3_RET),a + +.L2 push hl + ld hl,0 + ld a,2 + call PutHex + ld a,l + pop hl + ret c ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + ld (hl),a + inc hl + dec c + jr nz,.L2 + or a +.L3_RET ret + +.L3 inc b + push hl + ld hl,0 + ld a,1 + call PutHex + ld a,l + pop hl + ret c ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + ld (hl),a + or a + ret + +.Buffer ds 4 + +;[]=========================================================================[] +;[] ╨Я╨╛╨╗╤Г╤З╨╡╨╜╨╕╨╡ ╨░╨┤╤А╨╡╤Б╨░ ╨╕╨╖ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ [] +;[] ╨Т╤Е╨╛╨┤: C - ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ [] +;[] ╨Т╤Л╤Е╨╛╨┤: HL - ╤З╨╕╤Б╨╗╨╛ [] +;[] ╤Д╨╗╨░╨│ C - ╨╛╤И╨╕╨▒╨║╨░ [] +;[]=========================================================================[] +PutAddress + ld a,c + dec a + ret c ; ╨╜╤Г╨╗╨╡╨▓╨░╤П ╤Б╤В╤А╨╛╨║╨░ + ld de,InputLine.Buffer + ld hl,0 + ld a,(de) + call CapsLetter + cp "X" ; hex-╤З╨╕╤Б╨╗╨╛ + jr z,.L9C43 + cp "#" ; hex-╤З╨╕╤Б╨╗╨╛ +.L9C43 + ld a,c + jr nz,PutDec + inc de + inc de + dec a + dec a + ret c + inc a + +PutHex exa + ld a,(de) + call Numeric ; ╤Ж╨╕╤Д╤А╨░? + jr c,.L1 + call CapsLetter ; ╨╗╨░╤В.╨▒╤Г╨║╨▓╤Л ╨▓ ╨▓╨╡╤А╤Е╨╜╨╕╨╣ ╤А╨╡╨│╨╕╤Б╤В╤А + cp "F"+1 + ccf + ret c ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + cp "A" + ret c ; ╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + sub 0x07 +.L1 sub 0x30 + add hl,hl ; *16 + add hl,hl + add hl,hl + add hl,hl + or l + ld l,a + inc de + inc de + exa + dec a + jr nz,PutHex + or a ; ╤Б╨▒╤А╨╛╤Б ╤Д╨╗╨░╨│╨░ C + ret + +PutDec exa + ld a,(de) + call Numeric ; ╤Ж╨╕╤Д╤А╨░? + ccf + ret c ; ╨▓╤Л╤Е╨╛╨┤ ╨╡╤Б╨╗╨╕ ╨╜╨╡╤В + ld c,l + ld b,h + add hl,hl ; *10 + add hl,hl + add hl,bc + add hl,hl + ld b,0 + sub 0x30 + ld c,a + add hl,bc + inc de + inc de + exa + dec a + jr nz,PutDec + or a ; ╤Б╨▒╤А╨╛╤Б ╤Д╨╗╨░╨│╨░ C + ret + +;[]=========================================================================[] +;[] ╨Я╤А╨╛╨▓╨╡╤А╨║╨░ ╨║╨╛╨┤╨░ ╤Б╨╕╨╝╨▓╨╛╨╗╨░ ╨╜╨░ ╨┐╤А╨╕╨╜╨░╨┤╨╗╨╡╨╢╨╜╨╛╤Б╤В╤М ╨║ ╤Ж╨╕╤Д╤А╨░╨╝ (╨║╨╛╨┤╤Л 0x30...0x39) [] +;[] ╨Т╤Е╨╛╨┤: A - ╨║╨╛╨┤ ╤Б╨╕╨╝╨▓╨╛╨╗╨░ [] +;[] ╨Т╤Л╤Е╨╛╨┤: ╤Д╨╗╨░╨│ C - ╤Ж╨╕╤Д╤А╨░; ╨д╨╗╨░╨│ NC - ╨╜╨╡ ╤Ж╨╕╤Д╤А╨░ [] +;[]=========================================================================[] +Numeric cp "0" + ccf + ret nc + cp 3Ah + ret + +;[]=========================================================================[] +;[] ╨Я╨╡╤А╨╡╨▓╨╛╨┤ ╤Б╨╕╨╝╨▓╨╛╨╗╨╛╨▓ ╨╗╨░╤В╨╕╨╜╤Б╨║╨╛╨│╨╛ ╨░╨╗╤Д╨░╨▓╨╕╤В╨░ a...z ╨▓ ╨▓╨╡╤А╤Е╨╜╨╕╨╣ ╤А╨╡╨│╨╕╤Б╤В╤А [] +;[] ╨Т╤Е╨╛╨┤: A - ╨║╨╛╨┤ ╤Б╨╕╨╝╨▓╨╛╨╗╨░ [] +;[] ╨Т╤Л╤Е╨╛╨┤: A - ╨║╨╛╨┤ ╤Б╨╕╨╝╨▓╨╛╨╗╨░ ╨▓ ╨▓╨╡╤А╤Е╨╜╨╡╨╝ ╤А╨╡╨│╨╕╤Б╤В╤А╨╡ [] +;[]=========================================================================[] +CapsLetter cp "a" ; <"a" + ret c + cp "z"+1 ; >"z" + ret nc + and 11011111b ; ╨┐╤А╨╡╨╛╨▒╤А╨░╨╖╨╛╨▓╨░╨╜╨╕╨╡ ╤Б╨╕╨╝╨▓╨╛╨╗╨░ + ret + +InputLine1 push hl + push bc + call CursorSet + pop bc + pop hl + jr InputLine + +;[]=========================================================================[] +;[] ╨Т╨▓╨╛╨┤ ╤Б╤В╤А╨╛╨║╨╕ ╤Б╨╕╨╝╨▓╨╛╨╗╨╛╨▓ ╤Б ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л [] +;[] ╨Т╤Е╨╛╨┤: B - ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ [] +;[] HL - ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨║╤Г╤А╤Б╨╛╤А╨░ [] +;[] ╨Т╤Л╤Е╨╛╨┤: ╤Д╨╗╨░╨│ C - ╤Д╨╗╨░╨│ NC - [] +;[] C - ╨┤╨╗╨╕╨╜╨░ ╨▓╨▓╨╡╨┤╨╡╨╜╨╜╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕, ╨╡╤Б╨╗╨╕ [] +;[]=========================================================================[] +InputLineEd + ld a,(Color.InLineEd) ; ╤Ж╨▓╨╡╤В ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + ld c,a + xor a + jr InputLine+6 +InputLine + ld a,(Color.InLine) ; ╤Ж╨▓╨╡╤В ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + ld c,a + ld a,On +.L0 + ld (.EntEnd),a + ld a,0xC3 ; ╨║╨╛╨┤ JP + ld (.L15),a + ld (CursPos),hl + ld (.Coordinate),hl + ld hl,.Pos + xor a ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨┐╨╛╨╖╨╕╤Ж╨╕╤П + ld (hl),a + inc hl + ld (hl),c ; ╤Ж╨▓╨╡╤В + inc hl + ld (hl),b ; ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ ╤А╨╡╨┤╨░╨║╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╤П + inc hl ; ╨╜╨░╤З╨░╨╗╨╛ ╨▒╤Г╤Д╨╡╤А╨░ ╤А╨╡╨┤╨░╨║╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╤П + ld de,CursorSet.Buffer ; ╨▒╤Г╤Д╨╡╤А ╤Б╤В╤А╨╛╨║╨╕ ╨┐╨╛╨┤ ╨║╤Г╤А╤Б╨╛╤А╨╛╨╝ + ;ld c,a ; ╨╛╨║╤А╨░╤Б╨║╨░ ╤Б╤В╤А╨╛╨║╨╕ ╤А╨╡╨┤╨░╨║╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╤П +.L1 ld a,(de) + ld (hl),a + inc hl + inc de + ld (hl),c + inc hl + inc de + djnz .L1 + + call .PrintInLine ; ╨╜╨░╨┐╨╡╤З╨░╤В╨░╤В╤М ╤Б╤В╤А╨╛╨║╤Г + ld a,(.EntEnd) + or a + call nz,.EndString ; ╨║╤Г╤А╤Б╨╛╤А ╨▓ ╨║╨╛╨╜╨╡╤Ж ╤Б╤В╤А╨╛╨║╨╕ + +.L100 ld a,On ; ╨▓╨║╨╗╤О╤З╨╕╤В╤М ╨┐╤А╨╛╨│╤А╨░╨╝ ╨║╤Г╤А╤Б╨╛╤А + ld (CursOnOff),a + ld hl,.L100 + push hl ; ╨░╨┤╤А╨╡╤Б ╨▓╨╛╨╖╨▓╤А╨░╤В╨░ +.L9CE7 + ld c,Dss.ScanKey ; ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л + rst DssRst + jr z,.L9CE7 + + cp 0x20 ; ╨╡╤Б╤В╤М ASCII-╨║╨╛╨┤ + jr c,.L3 + + push af + ld a,(.Pos) + exa + ld hl,.Color ; ╤В╨╡╨║╤Г╤Й╨╕╨╣ ╤Ж╨▓╨╡╤В ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + ld a,(Color.InLine) + cp (hl) + call z,.ClearInLine + call z,.HomeString + call .NextPos ; ╨╜╨░ ╨▓╤Л╤Е╨╛╨┤╨╡ ╨▓ HL ╨░╨┤╤А╨╡╤Б .Pos + jr z,.L12 + ld a,(CursInsOvr) ; ╤А╨╡╨╢╨╕╨╝ Ins/Ovr + or a + jr nz,.L12 ; ╨┐╨╡╤А╨╡╤Е╨╛╨┤ ╨╡╤Б╨╗╨╕ Ovr + ld a,(.Len) + ld e,a + dec a ; ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ - 1 + add a,a + ld b,0 + ld c,a + ld d,(hl) ; ╨┐╨╛╨╖╨╕╤Ж╨╕╤П ╨┐╨╡╤З╨░╤В╨╕ ╤Б╨╕╨╝╨▓╨╛╨╗╨░ + ld hl,.Buffer + add hl,bc ; ╨║╨╛╨╜╨╡╤Ж ╨▒╤Г╤Д╨╡╤А╨░ + inc hl + ld a,e + sub d ; ╨║╨╛╨╗-╨▓╨╛ ╤Б╨┤╨▓╨╕╨│╨░╨╡╨╝╤Л╤Е ╤Б╨╕╨╝╨▓╨╛╨╗╨╛╨▓ + add a,a + ld c,a + ld d,h + ld e,l + dec hl + dec hl + lddr ; ╤А╨░╨╖╨┤╨▓╨╕╨╢╨║╨░ ╤Б╤В╤А╨╛╨║╨╕ +.L12 exa + add a,a + ld b,0 + ld c,a + ld hl,.Buffer + add hl,bc ; ╨░╨┤╤А╨╡╤Б ╨▓ ╨▒╤Г╤Д╨╡╤А╨╡ + pop af + ld (hl),a ; ╤Б╨╕╨╝╨▓╨╛╨╗ ╨▓ ╨▒╤Г╤Д╨╡╤А + call ResCurs +.L15 jp .PrintInLine + jr .L14 + +.L3 cp ESC_KEY ; + jr nz,.L13 + call ResCurs + pop hl ; ╨▓╨╛╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М ╤Б╤В╨╡╨║ + scf + ret + +.L13 cp ENTER_KEY ; + jr nz,.L2 + ld a,On + ld (.EntEnd),a + call ResCurs +.L14 pop hl ; ╨▓╨╛╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М ╤Б╤В╨╡╨║ + call .EndPos ; ╨┤╨╗╨╕╨╜╨░ ╨▓╨▓╨╡╨┤╨╡╨╜╨╜╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕ + ret + +.L2 ld a,d + cp DEL_KEY ; + jr nz,.L9 + call ResCurs + ld hl,.Color ; ╤В╨╡╨║╤Г╤Й╨╕╨╣ ╤Ж╨▓╨╡╤В ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + ld a,(Color.InLine) + cp (hl) + call z,.ClearInLine +.L11 ld hl,.Pos + ld a,(hl) ; ╨┐╨╛╨╖╨╕╤Ж╨╕╤П ╨║╤Г╤А╤Б╨╛╤А╨░ + add a,a + ld e,a + inc hl + inc hl + ld a,(hl) ; ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ + dec a + add a,a + sub e ; ╨┐╤А╨╛╨▓╨╡╤А╨║╨░ ╨║╨╛╨╜╤Ж╨░ ╤Б╤В╤А╨╛╨║╨╕ + ld c,a + ld b,0 + ld d,b + inc hl ; ╨╜╨░╤З╨░╨╗╨╛ ╨▒╤Г╤Д╨╡╤А╨░ + add hl,de ; ╨░╨┤╤А╨╡╤Б ╨║╤Г╤А╤Б╨╛╤А╨░ + push hl + pop de + inc hl + inc hl + jr z,.L9D80 ; ╨╡╤Б╨╗╨╕ ╨▓ ╨║╨╛╨╜╤Ж╨╡ ╤Б╤В╤А╨╛╨║╨╕ + ldir +.L9D80 + ld a," " + ld (de),a ; ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╣ ╤Б╨╕╨╝╨▓╨╛╨╗ + jp .PrintInLine + +.L9 cp BKSP_KEY ; + jr nz,.L10 + call ResCurs + call .ColorInLine ; ╤Б╨╝╨╡╨╜╨╕╤В╤М ╤Ж╨▓╨╡╤В ╤Б╤В╤А╨╛╨║╨╕ + ld hl,.Pos + ld a,(hl) ; ╨┐╨╛╨╖╨╕╤Ж╨╕╤П ╨║╤Г╤А╤Б╨╛╤А╨░ + or a + jp z,.PrintInLine ; ╨╡╤Б╨╗╨╕ ╨▓ ╨╜╨░╤З╨░╨╗╨╡ ╤Б╤В╤А╨╛╨║╨╕ + dec (hl) ; ╤Г╨╝╨╡╨╜╤М╤И╨╕╤В╤М ╨┐╨╛╨╖╨╕╤Ж╨╕╤О + ld hl,CursPos + dec (hl) ; ╨║╤Г╤А╤Б╨╛╤А ╨▓╨╗╨╡╨▓╨╛ + jr .L11 + +.L10 cp INS_KEY ; + jr nz,.L5 + ld a,(CursInsOvr) + cpl + ld (CursInsOvr),a + ret + +.L5 cp RIGHT_KEY ; + jr nz,.L6 + call ResCurs + call .ColorInLine ; ╤Б╨╝╨╡╨╜╨╕╤В╤М ╤Ж╨▓╨╡╤В ╤Б╤В╤А╨╛╨║╨╕ + call z,.PrintInLine + call .EndPos + ret z + ld a,(.Pos) + cp c + ret nc + jp .NextPos + +.L6 cp LEFT_KEY ; + jr nz,.L7 + call ResCurs + call .ColorInLine ; ╤Б╨╝╨╡╨╜╨╕╤В╤М ╤Ж╨▓╨╡╤В ╤Б╤В╤А╨╛╨║╨╕ + call z,.PrintInLine + ld hl,.Pos ; ╨┐╨╛╨╖╨╕╤Ж╨╕╤П ╨║╤Г╤А╤Б╨╛╤А╨░ + ld a,(hl) + or a + ret z + dec (hl) + ld hl,CursPos ; ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨┐╤А╨╛╨│╤А╨░╨╝ ╨║╤Г╤А╤Б╨╛╤А╨░ + dec (hl) + ret + +.L7 cp HOME_KEY ; + jr nz,.L8 + call ResCurs + call .ColorInLine ; ╤Б╨╝╨╡╨╜╨╕╤В╤М ╤Ж╨▓╨╡╤В ╤Б╤В╤А╨╛╨║╨╕ + call z,.PrintInLine +.HomeString ld hl,.Pos ; ╨┐╨╛╨╖╨╕╤Ж╨╕╤П ╨║╤Г╤А╤Б╨╛╤А╨░ + ld a,(hl) + or a + ret z + ld a,(.Coordinate) ; ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨╜╨░╤З╨░╨╗╨░ ╤Б╤В╤А╨╛╨║╨╕ + ld (CursPos),a + xor a + ld (hl),a ; ╨╛╨▒╨╜╤Г╨╗╨╕╤В╤М ╨┐╨╛╨╖╨╕╤Ж╨╕╤О ╨┐╨╡╤З╨░╤В╨╕ + ret + +.L8 cp END_KEY ; + ret nz + call ResCurs + call .ColorInLine ; ╤Б╨╝╨╡╨╜╨╕╤В╤М ╤Ж╨▓╨╡╤В ╤Б╤В╤А╨╛╨║╨╕ + call z,.PrintInLine +.EndString call .EndPos + ret z + ld a,(.Len) +; dec a ; ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ - 1 + sub c ; ╨╖╨░╨┐╨╛╨╗╨╜╨╡╨╜╨░ ╨┐╨╛╨╗╨╜╨╛╤Б╤В╤М╤О? + jr nz,.L9E10 + dec c +.L9E10 + ld hl,.Pos + ld (hl),c ; ╨┐╨╛╨╖╨╕╤Ж╨╕╤П ╨▓ ╨║╨╛╨╜╤Ж╨╡ ╤Б╤В╤А╨╛╨║╨╕ + ld a,(.Coordinate) + add a,c + ld (CursPos),a ; ╨╜╨╛╨▓╨░╤П ╨┐╨╛╨╖╨╕╤Ж╨╕╤П ╨┐╤А╨╛╨│╤А╨░╨╝ ╨║╤Г╤А╤Б╨╛╤А╨░ + ret + +.PrintInLine + ld ix,.Buffer ; ╨▒╤Г╤Д╨╡╤А ╤Б╤В╤А╨╛╨║╨╕ + ld a,(.Len) + ld l,a + ld h,1 ; ╤А╨░╨╖╨╝╨╡╤А╤Л ╨▒╤Г╤Д╨╡╤А╨░ + ld de,(.Coordinate) ; ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨▓ ╤Н╨║╤А╨░╨╜╨╡ + IFDEF D_PRINTCH_BIOS + xor a + ld c,Bios.Win_Restore_Win ;╨▓╤Л╨▓╨╛╨┤ ╨▒╤Г╤Д╨╡╤А╨░ ╨╜╨░ ╤Н╨║╤А╨░╨╜ + di + rst BiosRst + ei + ELSE + ld a,(BankDebug) + ld b,a + ld c,Dss.WinRest + rst DssRst + ENDIF + ret + +.ClearInLine + ld hl,.Len ; ╨╛╤З╨╕╤Б╤В╨║╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + ld b,(hl) ; ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + ld a," " ; ╨┐╤А╨╛╨▒╨╡╨╗ +.L9E38 + inc hl ; ╨╜╨░╤З╨░╨╗╨╛ ╨▒╤Г╤Д╨╡╤А╨░ ╤Б╤В╤А╨╛╨║╨╕ + ld (hl),a + inc hl + djnz .L9E38 + xor a ; ╨┐╨╛╨╖╨╕╤Ж╨╕╤П ╨┐╨╡╤З╨░╤В╨╕ + ld (.Pos),a + exa + ld a,(.Coordinate) + ld (CursPos),a + jr .L9E52 + +.ColorInLine + ld hl,.Color ; ╨╛╨║╤А╨░╤Б╨║╨░ ╨▓ ╨╛╤Б╨╜╨╛╨▓╨╜╨╛╨╣ ╤Ж╨▓╨╡╤В + ld a,(Color.InLine) + cp (hl) + ret nz +.L9E52 + ld a,(Color.InLineEd) ; ╤Ж╨▓╨╡╤В ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + ld (.Color),a + ld hl,.Len ; ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + ld b,(hl) + inc hl +.L9E5D + inc hl + ld (hl),a + inc hl + djnz .L9E5D + ret + +.EndPos ld hl,.Buffer ; ╨┐╨╛╨╕╤Б╨║ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╕ ╨┐╨╛╤Б╨╗╨╡╨┤. ╤Б╨╕╨╝╨▓╨╛╨╗╨░ + ld a,(.Len) + ld c,a + dec a + add a,a + ld e,a + ld d,0 + add hl,de +.L9E70 + ld a,(hl) + dec hl + dec hl + cp " " ; ╨╕╤Й╨╡╨╝ ╨║╨╛╨╜╨╡╤Ж ╤Б╤В╤А╨╛╨║╨╕ + ret nz + dec c + jr nz,.L9E70 + ret + +.NextPos ld hl,.Pos ; ╤А╨░╤Б╤З╨╡╤В ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╡╨╣ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╕ + ld a,(.Len) + dec a + cp (hl) + jr nz,.L16 + ld a,(.EntEnd) ; ╨╖╨░╨║╨░╨╜╤З╨╕╨▓╨░╤В╤М ╨┐╨╛ ENTER + inc a + ret z ; ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╤П╤П ╨┐╨╛╨╖╨╕╤Ж╨╕╤П ╨▓ ╤Б╤В╤А╨╛╨║╨╡ + ld a,0xCD ; ╨║╨╛╨┤ CALL + ld (.L15),a + ret +.L16 inc (hl) ; ╤Г╨▓╨╡╨╗╨╕╤З╨╡╨╜╨╕╨╡ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╕ + ld a,(CursPos) ; ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨┐╤А╨╛╨│╤А╨░╨╝ ╨║╤Г╤А╤Б╨╛╤А╨░ + inc a + ld (CursPos),a + ret + +;[]=========================================================================[] +;[] ╨Ъ╨╛╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨╕╨╖ ╨▒╤Г╤Д╨╡╤А╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ [] +;[]=========================================================================[] +;╨Т╤Е╨╛╨┤: +;DE - ╨░╨┤╤А╨╡╤Б ╨╜╨░╨╖╨╜╨░╤З╨╡╨╜╨╕╤П +;C - ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ + +.FromBuffer ld hl,.Buffer + ld b,0 +.FB1 ld a,(hl) + ld (de),a + inc hl + inc hl + inc de + dec c + jr nz,.FB1 + ret + +;[]=========================================================================[] +;[] ╨Ъ╨╛╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨▓ ╨▒╤Г╤Д╨╡╤А ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ [] +;[]=========================================================================[] +;╨Т╤Е╨╛╨┤: +;HL - ╨░╨┤╤А╨╡╤Б ╤Б╤В╤А╨╛╨║╨╕ +;C - ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ + +.ToBuffer + ld de,.Buffer +.TB1 ld a,(hl) + ld (de),a + inc de + inc de + inc hl + dec c + jr nz,.TB1 + ret + +.EntEnd DB On ; ╤Д╨╗╨░╨│ ╨╛╨║╨╛╨╜╤З╨░╨╜╨╕╤П ╤Б╤В╤А╨╛╨║╨╕ ENTER +.Coordinate DW 0 ; ╨╜╨░╤З╨░╨╗╨╛ ╤Б╤В╤А╨╛╨║╨╕ ╨▓ ╤Н╨║╤А╨░╨╜╨╡ +; ╨Я╨╛╤Б╨╗╨╡╨┤╨╛╨▓╨░╤В╨╡╨╗╤М╨╜╨╛╤Б╤В╤М ╨┐╨╡╤А╨╡╨╝╨╡╨╜╨╜╤Л╤Е ╨╜╨╡ ╨╕╨╖╨╝╨╡╨╜╤П╤В╤М! +.Pos DB 0 ; ╨┐╨╛╨╖╨╕╤Ж╨╕╤П ╨║╤Г╤А╤Б╨╛╤А╨░ ╨▓ ╤Б╤В╤А╨╛╨║╨╡ +.Color DB 0 ; ╤Ж╨▓╨╡╤В ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ +.Len DB 0 ; ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ +.Buffer DS 22*2 ; ╨▒╤Г╤Д╨╡╤А ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + +;[]=========================================================================[] +;[] ╨Я╤А╨╛╨│╤А╨░╨╝╨╝╨╜╨╛╨╡ ╤Б╨╛╨╖╨┤╨╜╨╕╨╡ ╨╝╨╕╨│╨░╤О╤Й╨╡╨│╨╛ ╨║╤Г╤А╤Б╨╛╤А╨░ [] +;[]=========================================================================[] + +;======== ╨Я╨╛╨┤╨│╨╛╤В╨╛╨▓╨║╨░ ╨┤╨╛╨┐╨╛╨╗╨╜╨╕╤В╨╡╨╗╤М╨╜╨╛╨│╨╛ ╨╖╨╜╨░╨║╨╛╨│╨╡╨╜╨╡╤А╨░╤В╨╛╤А╨░ ======== +PreparChar + ld de,OrgAdr-0x100 ; ╨▒╤Г╤Д╨╡╤А ╨┤╨╗╤П 2kB ╨╖╨╜╨░╨║╨╛╨│╨╡╨╜╨╡╤А╨░╤В╨╛╤А╨░ + ld c,Bios.Win_Get_ZG ; ╨┐╨╛╨╗╤Г╤З╨╕╤В╤М ╤Б╨╕╤Б╤В. ╨╖╨╜╨░╨║╨╛╨│╨╡╨╜╨╡╤А╨░╤В╨╛╤А + rst BiosRst + ld hl,OrgAdr-0x100+7*256 + ld bc,0x00FF +.L9EF0 + ld (hl),c + inc hl + djnz .L9EF0 + + ld de,OrgAdr-0x100 ; ╤Г╤Б╤В.╨╖╨╜╨░╨║╨╛╨│╨╡╨╜╨╡╤А╨░╤В╨╛╤А 0x5B + ld c,Bios.Win_Set_ZG + ld a,0x5B + rst BiosRst + + ld hl,(0039h) ; ╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ ╨▓╨╡╨║╤В╨╛╤А╨░ (╨┤╨╗╤П ╨╝╨╕╨│╨░╨╜╨╕╤П ╨║╤Г╤А╤Б╨╛╤А╨░) + ld (Rst38.Vect+1),hl + ld hl,Rst38 + ld (0039h),hl + ret + +Rst38 di ; ╨▓╨╡╨║╤В╨╛╤А ╨║╤Г╤А╤Б╨╛╤А╨░ + push iy + push ix + push hl + push de + push bc + push af + exx + exa + push hl + push de + push bc + push af + call Clock + ld a,(CursOnOff) + or a + call nz,CuttingCurs + pop af + pop bc + pop de + pop hl + exx + exa + pop af + pop bc + pop de + pop hl + pop ix + pop iy +.Vect jp 0x0000 ; ╨░╨┤╤А╨╡╤Б ╤Б╨╕╤Б╤В. ╨▓╨╡╨║╤В╨╛╤А╨░ RST 38 + +;======== ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╨╜╨╛╨│╨╛ ╨║╤Г╤А╤Б╨╛╤А╨░ ======== +CuttingCurs + ld a,(TimerFlash) ; ╨┐╨░╤Г╨╖╨░ ╨╝╨╕╨│╨░╨╜╨╕╤П + dec a + call z,.L1 + ld (TimerFlash),a + ret + +.L1 ld a,(CursPutRes) + cpl + ld (CursPutRes),a + + ld de,(CursPos) + ld (ResCurs.L1+1),de + or a ; ╤Д╨╗╨░╨│ Put / Res + jr z,.L3 ; ╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ + ; ╨╕╨╜╨░╤З╨╡ ╤Б╨▒╤А╨╛╤Б ╨║╤Г╤А╤Б╨╛╤А╨░ + ld hl,(CursSymb) ; ╤Б╨╕╨╝╨▓╨╛╨╗ ╨╕ ╨╡╨│╨╛ ╤Ж╨▓╨╡╤В + sub a ; ╤Б╨▒╤А╨╛╤Б id ╨╛╨║╨╜╨░ + ld b,SysSymb ; ╤Б╨╕╤Б╤В╨╡╨╝╨╜╤Л╨╣ ╨╖╨╜╨░╨║╨╛╨│╨╡╨╜╨╡╤А╨░╤В╨╛╤А + ld c,Bios.Win_Put_Sym ; ╨┐╨╛╨╗╨╛╨╢╨╕╤В╤М ╤Б╨╕╨╝╨▓╨╛╨╗ + rst BiosRst + ld a,PauseFlash ; ╨┐╨░╤Г╨╖╨░ ╨╝╨╕╨│╨░╨╜╨╕╤П + ret + +.L3 ld c,Bios.Win_Get_Sym ; ╨┐╨╛╨╗╤Г╤З╨╕╤В╤М ╤Б╨╕╨╝╨▓╨╛╨╗ + sub a ; ╤Б╨▒╤А╨╛╤Б id ╨╛╨║╨╜╨░ + rst BiosRst + ld (CursSymb),hl ; ╤Б╨╕╨╝╨▓╨╛╨╗ ╨╕ ╨╡╨│╨╛ ╤Ж╨▓╨╡╤В + + ld de,(CursPos) ; ╨┐╨╛╨╖╨╕╤Ж╨╕╤П ╨┐╨╡╤З╨░╤В╨╕ + ld a,(CursInsOvr) ; ╤Д╨╗╨░╨│ ╤А╨╡╨╢╨╕╨╝╨░ Ins / Ovr + or a + jr z,.L4 ; ╤А╨╡╨╢╨╕╨╝ ╨▓╤Б╤В╨░╨▓╨║╨╕ + ; ╨╕╨╜╨░╤З╨╡ ╤А╨╡╨╢╨╕╨╝ ╨╖╨░╨╝╨╡╨╜╤Л + ld a,h + rlca + rlca + rlca + rlca + ld h,a + sub a ; ╤Б╨▒╤А╨╛╤Б id ╨╛╨║╨╜╨░ + ld b,SysSymb ; ╤Б╨╕╤Б╤В╨╡╨╝╨╜╤Л╨╣ ╨╖╨╜╨░╨║╨╛╨│╨╡╨╜╨╡╤А╨░╤В╨╛╤А +; ld l,0xDC ; ╨║╤Г╤А╤Б╨╛╤А ╤А╨╡╨╢╨╕╨╝╨░ ╨╖╨░╨╝╨╡╨╜╤Л + ld c,Bios.Win_Put_Sym ; ╤Б╨╕╨╝╨▓╨╛╨╗ ╨╜╨░ ╤Н╨║╤А╨░╨╜ + rst BiosRst + ld a,PauseFlash ; ╨┐╨░╤Г╨╖╨░ ╨╝╨╕╨│╨░╨╜╨╕╤П + ret + +.L4 sub a ; ╤Б╨▒╤А╨╛╤Б id ╨╛╨║╨╜╨░ + ld b,0x5B ; ╨╝╨╛╨┤╨╕╤Д. ╨╖╨╜╨░╨║╨╛╨│╨╡╨╜╨╡╤А╨░╤В╨╛╤А + ld c,Bios.Win_Put_Sym ; ╤Б╨╕╨╝╨▓╨╛╨╗ ╨╜╨░ ╤Н╨║╤А╨░╨╜ + rst BiosRst + ld a,PauseFlash ; ╨┐╨░╤Г╨╖╨░ ╨╝╨╕╨│╨░╨╜╨╕╤П + ret + +;======== ╨Я╤А╨╕╨╜╤Г╨┤╨╕╤В╨╡╨╗╤М╨╜╤Л╨╣ ╤Б╨▒╤А╨╛╤Б ╨║╤Г╤А╤Б╨╛╤А╨░ ======== +ResCurs ld a,(CursOnOff) + or a + ret z ; ╨║╤Г╤А╤Б╨╛╤А ╨╜╨╡ ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜ + push hl + ld a,On + ld (CursPutRes),a + inc a + ld (CursOnOff),a + ld a,1 ; ╨┐╨░╤Г╨╖╨░ ╨╝╨╕╨│╨░╨╜╨╕╤П + ld (TimerFlash),a +.L1 ld de,0 ; ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨║╤Г╤А╤Б╨╛╤А╨░ + ld hl,(CursSymb) + ld bc,0x1B00+Bios.Win_Put_Sym + sub a ; ╤Б╨▒╤А╨╛╤Б╨╕╤В╤М id ╨╛╨║╨╜╨░ + rst BiosRst + pop hl + ret + +CursOnOff db Off ; ╤Д╨╗╨░╨│ ╨║╤Г╤А╤Б╨╛╤А╨░ 00-╨▓╤Л╨║╨╗/FF-╨▓╨║╨╗ +CursPutRes db On ; ╤Д╨╗╨░╨│ 00-Res/FF-Put +CursInsOvr db Ins ; ╤Д╨╗╨░╨│ 00-Ins/FF-Ovr +TimerFlash db 1 ; ╤В╨░╨╣╨╝╨╡╤А +CursPos dw 0 ; ╨┐╨╛╨╖╨╕╤Ж╨╕╤П ╨║╤Г╤А╤Б╨╛╤А╨░ +CursSymb dw 0 ; ╤Б╨╕╨╝╨▓╨╛╨╗ ╨┐╨╛╨┤ ╨║╤Г╤А╤Б╨╛╤А╨╛╨╝ + + ENDMODULE \ No newline at end of file diff --git a/kreg.asm b/kreg.asm new file mode 100644 index 0000000..17c86d5 --- /dev/null +++ b/kreg.asm @@ -0,0 +1,477 @@ +;[]=========================================================================[] +;[] ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л ╨▓ ╨╛╨║╨╜╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓ [] +;[] v0.03 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 11.03.2006 [] +;[] v0.10 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 14.05.2006 [] +;[]=========================================================================[] + MODULE KREG +KReg +; ld a,b ;╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ +; and 0b11110000 +; jr z,.L100 + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╛╨╝╨▒╨╕╨╜╨░╤Ж╨╕╨╕ Shift + ╤Б╨╕╨╝╨▓╨╛╨╗ +; and 0b11000000 ; +; or a +; jp z,KEYB.Keyb.Keyb_L1 +; ld a,d +; cp 0x80+0x0F ;Shift+Tab +; jp nz,KEYB.Keyb.Keyb_L1 +; ld a,2 ;╨╜╨╛╨╝╨╡╤А ╨╛╨║╨╜╨░ ╨┤╨░╨╝╨┐╨░ +; ld (Keyb.WinScreen),a +; jp Keyb_NC + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╨╛╨│╨╛ ╨║╨╛╨┤╨░ +.L100 ld a,e ; ASCII ╨║╨╛╨┤ + ld (.ASC_COD),a + ld a,d ; ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╤Л╨╣ ╨║╨╛╨┤ + + cp RIGHT_KEY ; + jr nz,.L101 + call .DescCalc + ld a,(hl) ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ + cp e + ld a,e + jr nz,.L9FC0 + xor a +.L9FC0 + inc a + ld (.Coordinate),a ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + jp KEYB.Keyb_NC + +.L101 cp LEFT_KEY ; + jr nz,.L102 + call .DescCalc + ld a,e ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + cp 1 + jr nz,.L9FD5 + ld a,(hl) ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ + inc a +.L9FD5 + dec a + ld (.Coordinate),a ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + jp KEYB.Keyb_NC + +.L102 ld hl,(.Descript) + ld de,(.Coordinate) + cp DN_KEY ; + jr nz,.L103 + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + cp l + jr nz,.L104 + ld a,h ; 1-╤П ╤Б╤В╤А╨╛╨║╨░ + dec a +.L104 inc a + jr .L107P1 + +.L103 cp UP_KEY ; + jr nz,.L105 + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + cp h + jr nz,.L107 + ld a,l ; ╨░╨┤╤А╨╡╤Б ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╡╨╣ ╤Б╤В╤А╨╛╨║╨╕ + inc a +.L107 dec a +.L107P1 ld h,a + ld l,1 + ld (.Coordinate),hl + jp KEYB.Keyb_NC + +.L105 ld b,3 + cp PGDN_KEY ; + jr nz,.L108 + ld hl,.PgDown + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ +.LA00E + cp (hl) + jr c,.LA014 + inc hl + djnz .LA00E +.LA014 + ld a,(hl) + jr .L107+1 + +.L108 cp PGUP_KEY ; + jr nz,.L110 + ld hl,.PgUp + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ +.LA01F + cp (hl) + jr nc,.LA025 + inc hl + djnz .LA01F +.LA025 + ld a,(hl) + dec a + jr .L107P1 + +.L110 cp HOME_KEY ; + jr nz,.L111 + ld a,1 + ld (.Coordinate),a ; ╨┐╨╡╤А╨▓╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + jp KEYB.Keyb_NC + +.L111 cp END_KEY ; + jr nz,.L200 + call .DescCalc + ld a,(hl) ; ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╤П╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + ld (.Coordinate),a ; ╨┐╨╡╤А╨▓╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + jp KEYB.Keyb_NC + +;.L112 cp 0x0F ; +; jr nz,.L200 +; ld a,4 ; ╨╜╨╛╨╝╨╡╤А ╨╛╨║╨╜╨░ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ +; ld (Keyb.WinScreen),a +; jp Keyb_NC + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ASCII ╨║╨╛╨┤╨╛╨▓ +.L200 +.ASC_COD+* ld a,0 ; ASCII ╨║╨╛╨┤ + cp ENTER_KEY ; + jp nz,KEYB.Keyb_L1 +.L201 +.ESTR_LEN+* ld b,0 ; ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ +.ESTR_POS+* ld hl,0 ; ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + + ld a,b + dec a + jp nz,.L205 + ld de,(.Coordinate) + ld a,d ; ╨╜╨╛╨╝╨╡╤А ╤Б╤В╤А╨╛╨║╨╕ + ld c,e ; ╨╜╨╛╨╝╨╡╤А ╨║╨╛╨╗╨╛╨╜╨║╨╕ + ex de,hl ; ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л + ld hl,Reg._AF+1 ; ╤А╨╡╨│ A + cp 6 ; ╤Б╤В╤А╨╛╨║╨░ ╤Б ╨┐╨░╤А╨╛╨╣ AF? + jr z,.L207 + ld hl,Reg._AF_+1 ; ╤А╨╡╨│ A' + cp 11 ; ╤Б╤В╤А╨╛╨║╨░ ╤Б ╨┐╨░╤А╨╛╨╣ AF'? + jr z,.L207 + ld hl,Reg._AF ; ╤А╨╡╨│ F + cp 7 ; ╤Б╤В╤А╨╛╨║╨░ ╤Б ╨┐╨░╤А╨╛╨╣ AF? + jr z,.LA077 + ld hl,Reg._AF_ ; ╤А╨╡╨│ F' + cp 12 ; ╤Б╤В╤А╨╛╨║╨░ ╤Б ╨┐╨░╤А╨╛╨╣ AF'? + jr nz,.L206 +.LA077 + ld a,c ; ╨║╨╛╤А╤А╨╡╨║╤Ж╨╕╤П ╨╜╨╛╨╝╨╡╤А╨╛╨▓ ╨▒╨╕╤В + cp 4 ; ╨║╨╛╨╗╨╛╨╜╨║╨░ 4..6? + jr c,.LA07F + inc c + jr .L207-4 +.LA07F + cp 3 ; ╨║╨╛╨╗╨╛╨╜╨║╨░ 3? + jr z,.L207-4 + dec c + ld a,7 + jr .L208 +.L207 ld a,10 ; ╨║╨╛╨╗╨╛╨╜╨║╨╕ ╤Б ╨▒╨╕╤В╨░╨╝╨╕ + cp c + jr z,.L206 + dec a +.L208 sub c ; ╨╜╨╛╨╝╨╡╤А ╨▒╨╕╤В╨░ + rlca + rlca + rlca ; ╨╖╨░╨│╨╛╤В╨╛╨▓╨║╨░ ╨┤╨╗╤П ╨▒╨╕╤В╨╛╨▓╤Л╤Е ╨╛╨┐╨╡╤А╨░╤Ж╨╕╨╣ + ld b,a + or 01000110b ; ╨┤╨╗╤П BIT + ld (.BIT_TST),a + ld a,b + or 11000110b ; ╨┤╨╗╤П SET + ld (.BIT_SET),a + ld a,b + or 10000110b ; ╨┤╨╗╤П RES + ld (.BIT_RST),a +.BIT_TST+1 bit 0,(hl) ; ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ ╨▒╨╕╤В╨░ + jr nz,.LA0AD +.BIT_SET+1 set 0,(hl) ; ╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ ╨▒╨╕╤В╨░ + jp KEYB.Keyb_RF +.LA0AD +.BIT_RST+1 res 0,(hl) ; ╤Б╨▒╤А╨╛╤Б ╨▒╨╕╤В╨░ + jp KEYB.Keyb_RF + +.L206 ex de,hl ; ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л + call KEYB.InputLine ; ╨▓╨▓╨╛╨┤ ╤Б╨╕╨╝╨▓╨╛╨╗╨░ + jp c,KEYB.Keyb_NC ; ╨╖╨░╨▓╨╡╤А╤И╨╡╨╜╨╕╨╡ ╨▓╨▓╨╛╨┤╨░ ╨┐╨╛ + ld de,.L204-5 + push de + ld de,(.Coordinate) + ld hl,Reg._AF+1 + ld a,d + ld de,0 + cp 6 ; ╤Б╤В╤А╨╛╨║╨░ ╤Б ╨┐╨░╤А╨╛╨╣ AF + ret z + ld hl,Reg._AF_+1 + cp 11 ; ╤Б╤В╤А╨╛╨║╨░ ╤Б ╨┐╨░╤А╨╛╨╣ AF'? + ret z + ld de,(.Coordinate) + ld a,e + sub 6 + ld e,a + jr .L209 + +.L205 dec a ; ╨▒╨░╨╣╤В╤Л ╨▓ ╨╝╨╕╨╜╨╕╨┤╨░╨╝╨┐╨╡ + jr nz,.L202 + call KEYB.InputLine ; ╨▓╨▓╨╛╨┤ ╤З╨╕╤Б╨╗╨░ + jp c,KEYB.Keyb_NC ; ╨╖╨░╨▓╨╡╤А╤И╨╡╨╜╨╕╨╡ ╨▓╨▓╨╛╨┤╨░ ╨┐╨╛ + call KEYB.PutCode + jp c,.L201 ; ╨╛╤И╨╕╨▒╨║╨░ ╨▓ ╨▓╨╡╨┤╨╡╨╜╨╜╤Л╤Е ╨┤╨░╨╜╨╜╤Л╤Е + ld de,.L204 + push de + ld de,(.Coordinate) +.L209 dec d + jr nz,.LA0F9 + ld hl,(Reg._IX) + ret +.LA0F9 + dec d + jr nz,.LA100 + ld hl,(Reg._IY) + ret +.LA100 + dec d + jr nz,.LA107 + ld hl,(Reg._HL) + ret +.LA107 + dec d + jr nz,.LA10E + ld hl,(Reg._DE) + ret +.LA10E + dec d + jr nz,.LA115 + ld hl,(Reg._BC) + ret +.LA115 + dec d + dec d + dec d + jr nz,.LA11E + ld hl,(Reg._HL_) + ret +.LA11E + dec d + jr nz,.LA125 + ld hl,(Reg._DE_) + ret +.LA125 + dec d + ld hl,(Reg._BC_) + ret + + ld a,(KEYB.InputLine.Buffer) + jr .LA134 +.L204 ld a,(KEYB.PutCode.Buffer) ; ╨╖╨░╨┐╨╕╤Б╤Л╨▓╨░╨╡╨╝╤Л╨╣ ╨▒╨░╨╣╤В + dec e + dec e ; ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ ╨▓ ╨╝╨╕╨╜╨╕╨┤╨░╨╝╨┐╨╡ +.LA134 + add hl,de ; ╨░╨┤╤А╨╡╤Б ╨▓ ╨┐╨░╨╝╤П╤В╨╕ + call Ld_hl_a ; ╨╖╨░╨┐╨╕╤Б╨░╨╗╨╕ + jp KEYB.Keyb_RF + +.L202 dec a ; ╨╛╨┤╨╜╨╛╨▒╨░╨╣╤В╨╜╨╛╨╡ ╤З╨╕╤Б╨╗╨╛ (╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕) + jr nz,.L203 + call KEYB.InputLine ; ╨▓╨▓╨╛╨┤ ╤З╨╕╤Б╨╗╨░ + jp c,KEYB.Keyb_NC ; ╨╖╨░╨▓╨╡╤А╤И╨╡╨╜╨╕╨╡ ╨▓╨▓╨╛╨┤╨░ ╨┐╨╛ + call KEYB.PutAddress + jp c,.L201 ; ╨╛╤И╨╕╨▒╨║╨░ ╨▓ ╨▓╨╡╨┤╨╡╨╜╨╜╤Л╤Е ╨┤╨░╨╜╨╜╤Л╤Е + ld de,KEYB.Keyb_RF + push de + ld a,l + ld de,(.Coordinate) + dec e ; ╨║╨╛╨╗╨╛╨╜╨║╨░ ╨▓ ╤Б╤В╤А╨╛╨║╨╡ + jr nz,.LA15A + ld (WinPage),a ; 0-╨╡ ╨╛╨║╨╜╨╛ + ret +.LA15A + dec e + jr nz,.LA163 + ld (WinPage+1),a ; 1-╨╡ ╨╛╨║╨╜╨╛ + out (EmmWin.P1),a + ret +.LA163 + dec e + jr nz,.LA16A + ld (WinPage+2),a ; 2-╨╡ ╨╛╨║╨╜╨╛ + ret +.LA16A + ld (WinPage+3),a ; 3-╨╡ ╨╛╨║╨╜╨╛ + out (EmmWin.P3),a + ret + +.L203 dec a ; ╨│╨╗╤Г╨▒╨╕╨╜╨░ ╤Б╤В╨╡╨║╨░ + jr nz,.L210 + xor a ; ╨╛╨▒╨╜╤Г╨╗╨╕╤В╤М + ld (StackDown),a + jp KEYB.Keyb_RF + +.L210 ;dec a ; ╨┤╨▓╤Г╤Е╨▒╨░╨╣╤В╨╜╨╛╨╡ ╤З╨╕╤Б╨╗╨╛ + ;jp nz,KEYB.Keyb.Keyb_L1 + call KEYB.InputLine ; ╨▓╨▓╨╛╨┤ ╤З╨╕╤Б╨╗╨░ ╨▓ ╤А╨╡╨│ ╨┐╨░╤А╤Л + jp c,KEYB.Keyb_NC ; ╨╖╨░╨▓╨╡╤А╤И╨╡╨╜╨╕╨╡ ╨▓╨▓╨╛╨┤╨░ ╨┐╨╛ + call KEYB.PutAddress + jp c,.L201 ; ╨╛╤И╨╕╨▒╨║╨░ ╨▓ ╨▓╨╡╨┤╨╡╨╜╨╜╤Л╤Е ╨┤╨░╨╜╨╜╤Л╤Е + ld de,KEYB.Keyb_RF + push de + ld de,(.Coordinate) + dec d + jr nz,.LA195 + ld (Reg._IX),hl + ret +.LA195 + dec d + jr nz,.LA19C + ld (Reg._IY),hl + ret +.LA19C + dec d + jr nz,.LA1A3 + ld (Reg._HL),hl + ret +.LA1A3 + dec d + jr nz,.LA1AA + ld (Reg._DE),hl + ret +.LA1AA + dec d + jr nz,.LA1B1 + ld (Reg._BC),hl + ret +.LA1B1 + dec d + jr nz,.LA1B8 + ld (Reg._AF),hl + ret +.LA1B8 + dec d + dec d + jr nz,.LA1C0 + ld (Reg._HL_),hl + ret +.LA1C0 + dec d + jr nz,.LA1C7 + ld (Reg._DE_),hl + ret +.LA1C7 + dec d + jr nz,.LA1CE + ld (Reg._BC_),hl + ret +.LA1CE + dec d + jr nz,.LA1D5 + ld (Reg._AF_),hl + ret +.LA1D5 + dec d + dec d + jr nz,.LA1E4 + dec e + jr z,.LA1E0 + ld (Reg._IR),hl + ret +.LA1E0 + ld (Reg._PC),hl + ret +.LA1E4 + dec e + jr z,.L211 +.Rez ld bc,Rezident.End-Rezident ; ╨┤╨╗╨╕╨╜╨░ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + push hl ; ╨╜╨╛╨▓╨╛╨╡ ╨╜╨░╤З╨░╨╗╨╛ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + add hl,bc ; ╨╜╨╛╨▓╤Л╨╣ ╨║╨╛╨╜╨╡╤З╨╜╤Л╨╣ ╨░╨┤╤А╨╡╤Б ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + ld a,h + and 11000000b + ld d,a + pop hl + ld a,h + and 11000000b + cp d ; ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В ╨┐╨╡╤А╨╡╤Б╨╡╨║╨░╨╡╤В ╨╛╨║╨╜╨╛? + jr z,.L212 + ld h,d + ld l,0 + dec hl ; ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╣ ╨░╨┤╤А╨╡╤Б ╨╛╨║╨╜╨░ ╤Б ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨╛╨╝ + or a + sbc hl,bc +.L212 ld (RezAdr),hl + ret +.L211 ld (Reg._SP),hl + ret + + ; ╨а╨░╤Б╤З╨╡╤В ╨┤╨╡╤Б╨║╤А╨╕╨┐╤В╨╛╤А╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓ ╨╛╨║╨╜╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓ +.DescCalc ld de,(.Coordinate) ; ╤В╨╡╨║╤Г╤Й╨╕╨╡ ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л + ld hl,.Descript+1 + ld b,d ; ╨╜╨╛╨╝╨╡╤А ╤Б╤В╤А╨╛╨║╨╕ +.LA20E + inc hl ; ╨┤╨╡╤Б╨║╤А╨╕╨┐╤В╨╛╤А ╤Б╤В╤А╨╛╨║╨╕ + inc hl + djnz .LA20E + ld a,(hl) ; ╨╜╨╛╨╝╨╡╤А ╨┤╨╡╤Б╨║╤А╨╕╨┐╤В╨╛╤А╨░ ╤Б╤В╤А╨╛╨║╨╕ + add a,a + ld c,a + dec hl + ld b,(hl) + push bc + ld b,0 + ld hl,.DTabl + add hl,bc + ld a,(hl) ; ╨╜╨░╤З╨░╨╗╨╛ ╨┤╨╡╤Б╨║╤А╨╕╨┐╤В╨╛╤А╨░ + inc hl + ld h,(hl) + ld l,a + pop bc + ret + +.PgDown DB 2,7,12,15 +.PgUp DB 14,9,4,2 + +.Coordinate DW 0x0101 ; ╨║╤Г╤А╤Б╨╛╤А (╤Б╤В╤А/╨║╨╛╨╗ ╨║╤Г╤А╤Б╨╛╤А╨░) + +.Descript: + DW 0x010F ; ╨┐╨╡╤А╨▓╨░╤П/╨║╨╛╨╗-╨▓╨╛ ╤Б╤В╤А╨╛╨║ ╨╛╨║╨╜╨░ + + DB 0x01,0 ; ╨╜╨╛╨╝╨╡╤А ╤Б╤В╤А╨╛╨║╨╕, ╨╜╨╛╨╝╨╡╤А ╨┤╨╡╤Б╨║╤А╨╕╨┐╤В╨╛╤А╨░ + DB 0x02,0,0x04,0 + DB 0x05,0,0x06,0,0x07,1 + DB 0x08,2,0x0A,0,0x0B,0 + DB 0x0C,0,0x0D,1,0x0E,2 + DB 0x10,3,0x12,4,0x14,5 + +.DTabl DW .D1,.D2,.D3,.D4,.D5,.D6 + +.D1 DB 9 ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ ╨┤╨╗╤П ╨┐╨░╤А + DB 0x04 ; N ╤Б╤В╨╛╨╗╨▒╤Ж╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 5 ; ╤И╨╕╤А╨╕╨╜╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 0x0A,2,0x0C,2,0x0F,2,0x11,2 + DB 0x14,1,0x15,1,0x16,1,0x17,1 + +.D2 DB 10 ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ ╨┤╨╗╤П ╨┐╨░╤А╤Л AF + DB 0x04 ; N ╤Б╤В╨╛╨╗╨▒╤Ж╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 5 ; ╤И╨╕╤А╨╕╨╜╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 0x0B,1,0x0C,1,0x0D,1,0x0E,1 + DB 0x0F,1,0x10,1,0x11,1,0x12,1 + DB 0x15,1 + +.D3 DB 6 ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ ╨┤╨╗╤П ╤Д╨╗╨░╨│╨╛╨▓ + DB 0x01 ; N ╤Б╤В╨╛╨╗╨▒╤Ж╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 1 ; ╤И╨╕╤А╨╕╨╜╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 0x02,1,0x04,1 + DB 0x06,1,0x07,1,0x08,1 + +.D4 DB 2 ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ ╨┤╨╗╤П PC IR + DB 0x04 ; N ╤Б╤В╨╛╨╗╨▒╤Ж╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 5 ; ╤И╨╕╤А╨╕╨╜╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 0x0D,5 + +.D5 DB 4 ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ ╨┤╨╗╤П ╨▒╨░╨╜╨╛╨║ + DB 0x02 ; N ╤Б╤В╨╛╨╗╨▒╤Ж╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 3 ; ╤И╨╕╤А╨╕╨╜╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 0x08,3,0x0E,3,0x14,3 + +.D6 DB 3 ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ + DB 0x04 ; N ╤Б╤В╨╛╨╗╨▒╤Ж╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 5 ; ╤И╨╕╤А╨╕╨╜╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 0x0A,4 + DB 0x13,5 + + ENDMODULE \ No newline at end of file diff --git a/kstack.asm b/kstack.asm new file mode 100644 index 0000000..2483ac7 --- /dev/null +++ b/kstack.asm @@ -0,0 +1,215 @@ +;[]=========================================================================[] +;[] ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л ╨▓ ╨╛╨║╨╜╨╡ ╨┤╨░╨╝╨┐╨░ ╤Б╤В╨╡╨║╨░ [] +;[] v0.10 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 18.03.2006 [] +;[]=========================================================================[] +KStack: + ld a,b ;╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╨╡ + and SHIFTS_MASK +; ld b,a + jr z,.L100 + + ;╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╛╨╝╨▒╨╕╨╜╨░╤Ж╨╕╨╕ Shift + ╤Б╨╕╨╝╨▓╨╛╨╗ +; and 11000000b ; +; or a +; jr z,.L10 +; ld a,d +;; cp 0x80+0x0F ;Shift+Tab +;; jp nz,KEYB.Keyb.Keyb_L1 +;; ld a,3 ;╨╜╨╛╨╝╨╡╤А ╨╛╨║╨╜╨░ ╨┤╨░╨╝╨┐╨░ +;; ld (Keyb.WinScreen),a +; jp Keyb_NC + + ;╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨║╨╛╨╝╨▒╨╕╨╜╨░╤Ж╨╕╨╕ Ctrl + ╤Б╨╕╨╝╨▓╨╛╨╗ +; ld a,b + cp CTRL_FLAG ; + jp nz,KEYB.Keyb_L1 + ld a,d ; ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╤Л╨╣ ╨║╨╛╨┤ + cp SHIFTED_KEY+X_KEY ; + + jp nz,KEYB.Keyb_L1 + ld hl,(StackDump) + ld bc,(.Coordinate) + ld a,b + ld b,0x16 ; x-╨║╨╛╤А╨┤╨╕╨╜╨░╤В╨░ 1 ╤Б╤В╤А╨╛╨║╨╕ + sub b + rlca ; *2 + ld b,0 + ld c,a + or a + sbc hl,bc + ld (Reg._SP),hl + ld a,-1 + ld (PrintStrSP.StrSp),a + jp KEYB.Keyb_RF + + ; ╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╨╛╨│╨╛ ╨║╨╛╨┤╨░ +.L100 ld a,e ; ASCII ╨║╨╛╨┤ + ld (.L200+1),a + ld a,d ; ╨┐╨╛╨╖╨╕╤Ж╨╕╨╛╨╜╨╜╤Л╨╣ ╨║╨╛╨┤ + ld de,(.Coordinate) ; ╤В╨╡╨║╤Г╤Й╨╕╨╡ ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨║╤Г╤А╤Б╨╛╤А╨░ + cp RIGHT_KEY ; + jr nz,.L101 + ld a,(.Descript+2) ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ + cp e + ld a,e + jr nz,.LA2E6 + xor a +.LA2E6 + inc a + ld (.Coordinate),a ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + jp KEYB.Keyb_NC + +.L101 cp LEFT_KEY ; + jr nz,.L102 + ld a,e ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + cp 1 + jr nz,.LA2FA + ld a,(.Descript+2) ; ╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ + inc a +.LA2FA + dec a + ld (.Coordinate),a ; ╤В╨╡╨║╤Г╤Й╨░╤П ╨║╨╛╨╗╨╛╨╜╨║╨░ + jp KEYB.Keyb_NC + +.L102 ld hl,(.Descript) + cp DN_KEY ; + jr nz,.L103 + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + cp l + jr nz,.L104 + ld hl,(StackDump) ; ╨░╨┤╤А╨╡╤Б 1-╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕ + dec hl + dec hl + ld (StackDump),hl + ld hl,PrintStrSP.StrSp ; ╤Б╤В╤А╨╛╨║╨░ ╨▓╨╡╤А╤И.╤Б╤В╨╡╨║╨░ + ld a,-1 + cp (hl) ; ╨▓ ╨┤╨░╨╝╨┐╨╡? + jr z,.LA31D + dec (hl) +.LA31D + jp KEYB.Keyb_RF +.L104 inc a + ld (.Coordinate+1),a + jp KEYB.Keyb_NC + +.L103 cp UP_KEY ; + jr nz,.L105 + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + cp h + jr nz,.L107 + ld hl,(StackDump) ; ╨░╨┤╤А╨╡╤Б 1-╨╛╨╣ ╤Б╤В╤А╨╛╨║╨╕ + inc hl + inc hl + ld (StackDump),hl + ld hl,PrintStrSP.StrSp ; ╤Б╤В╤А╨╛╨║╨░ ╨▓╨╡╤А╤И.╤Б╤В╨╡╨║╨░ + ld a,(hl) + cp 7 ; ╨╜╨░ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╡╨╣ ╤Б╤В╤А╨╛╨║╨╡? + jr c,.LA342 + ld a,-2 + ld (hl),a ; ╨▓╨╡╤А╤И.╤Б╤В╨╡╨║╨░ ╨╜╨╡ ╨┐╨╛╨┐╨░╨┤╨░╨╡╤В ╨▓ ╨┤╨░╨╝╨┐ +.LA342 + inc (hl) + jp KEYB.Keyb_RF +.L107 dec a + ld (.Coordinate+1),a + jp KEYB.Keyb_NC + +.L105 cp PGDN_KEY ; + jr nz,.L108 + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + cp l + jr nz,.L106 + ld hl,(StackDump) + ld bc,2*7 + or a + sbc hl,bc + ld (StackDump),hl + ld a,-1 + ld (PrintStrSP.StrSp),a ; ╤Б╤В╤А╨╛╨║╨░ ╨▓╨╡╤А╤И.╤Б╤В╨╡╨║╨░ + jp KEYB.Keyb_RF +.L106 ld a,l ; ╨╜╨░ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╤О╤О ╤Б╤В╤А╨╛╨║╤Г + ld (.Coordinate+1),a + jp KEYB.Keyb_NC + +.L108 cp PGUP_KEY ; + jr nz,.L110 + ld a,d ; ╤В╨╡╨║╤Г╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ + cp h + jr nz,.L109 + ld hl,(StackDump) + ld bc,2*7 + add hl,bc + ld (StackDump),hl + ld a,-1 + ld (PrintStrSP.StrSp),a ; ╤Б╤В╤А╨╛╨║╨░ ╨▓╨╡╤А╤И.╤Б╤В╨╡╨║╨░ + jp KEYB.Keyb_RF +.L109 ld a,h ; ╨╜╨░ ╨┐╨╡╤А╨▓╤Г╤О ╤Б╤В╤А╨╛╨║╤Г + ld (.Coordinate+1),a + jp KEYB.Keyb_NC + +.L110 cp HOME_KEY ; + jr nz,.L200 + ld a,6 + ld (PrintStrSP.StrSp),a ; ╤Б╤В╤А╨╛╨║╨░ ╨▓╨╡╤А╤И.╤Б╤В╨╡╨║╨░ + jp KEYB.Keyb_RF + +;.L111 cp 0x0F ; +; jr nz,.L200 +; ld a,1 ; ╨╜╨╛╨╝╨╡╤А ╨╛╨║╨╜╨░ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ +; ld (Keyb.WinScreen),a +; jp KEYB.Keyb_NC + + ;╨Ю╨▒╤А╨░╨▒╨╛╤В╨║╨░ ASCII ╨║╨╛╨┤╨╛╨▓ +.L200 ld a,0 ; ASCII ╨║╨╛╨┤ + cp 0x0D ; + jp nz,KEYB.Keyb_L1 +.L201 +.ESTR_LEN+* ld b,0 ; ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ +.ESTR_POS+* ld hl,0 ; ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╤Б╤В╤А╨╛╨║╨╕ ╨▓╨▓╨╛╨┤╨░ + call KEYB.InputLine ; ╨▓╨▓╨╛╨┤ ╤З╨╕╤Б╨╗╨░ + jp c,KEYB.Keyb_NC ; ╨╖╨░╨▓╨╡╤А╤И╨╡╨╜╨╕╨╡ ╨▓╨▓╨╛╨┤╨░ ╨┐╨╛ + call KEYB.PutAddress + jp c,.L201 ; ╨╛╤И╨╕╨▒╨║╨░ ╨▓ ╨▓╨╡╨┤╨╡╨╜╨╜╤Л╤Е ╨┤╨░╨╜╨╜╤Л╤Е + ld bc,(.Coordinate) + ld a,b + ld b,0x16 ; x-╨║╨╛╤А╨┤╨╕╨╜╨░╤В╨░ 1 ╤Б╤В╤А╨╛╨║╨╕ + sub b + ex de,hl + ld hl,(StackDump) + ld b,a ; ╨╜╨╛╨╝╨╡╤А ╤Б╤В╤А╨╛╨║╨╕ 0..7 + rlca ; *2 + dec c + ld c,a + jr nz,.L202 ; ╨┐╨╡╤А╨╡╤Е╨╛╨┤ - ╨╡╤Б╨╗╨╕ ╨┤╨░╨╜╨╜╤Л╨╡, ╨╕╨╜╨░╤З╨╡ ╨░╨╗╤А╨╡╤Б + + ld a,(PrintStrSP.StrSp) ; ╤Б╤В╤А╨╛╨║╨░ ╨▓╨╡╤А╤И.╤Б╤В╨╡╨║╨░ + cp b + jr z,.L203 + ld b,0 ; ╨╜╨╡ ╨╜╨░ ╨▓╨╡╤А╤И╨╕╨╜╨╡ ╤Б╤В╨╡╨║╨░ + ex de,hl ; HL - ╨▓╨▓╨╡╨┤╨╡╨╜╨╜╤Л╨╣ ╨░╨┤╤А╨╡╤Б + add hl,bc + ld (StackDump),hl + ld a,-1 + ld (PrintStrSP.StrSp),a + jr .L203+4 +.L203 ld (Reg._SP),de ; ╨░╨┤╤А╨╡╤Б ╨▓╨▓╨╡╨┤╨╡╨╜ ╨╜╨░ ╨▓╨╡╤А╤И╨╕╨╜╨╡ ╤Б╤В╨╡╨║╨░ + jp KEYB.Keyb_RF + +.L202 ld b,0 ; ╨▓╨▓╨╛╨┤ ╨┤╨░╨╜╨╜╤Л╤Е + or a + sbc hl,bc + ld a,d ; ╨╖╨░╨┐╨╕╤Б╤М ╨┤╨░╨╜╨╜╤Л╤Е ╨▓ ╨┐╨░╨╝╤П╤В╤М + call Ld_hl_a + inc hl + ld a,e + call Ld_hl_a + jp KEYB.Keyb_RF + + +.Coordinate DW 0x1601 ;╨║╤Г╤А╤Б╨╛╤А (╤Б╤В╤А/╨║╨╛╨╗ ╨║╤Г╤А╤Б╨╛╤А╨░) +.Descript + DW 0x161D ;╨┐╨╡╤А╨▓╨░╤П/╨┐╨╛╤Б╨╗╨╡╨┤╨╜╤П╤П ╤Б╤В╤А╨╛╨║╨░ ╨╛╨║╨╜╨░ + DB 2 ;╨║╨╛╨╗-╨▓╨╛ ╨║╨╛╨╗╨╛╨╜╨╛╨║ + DB 0x01 ;N ╤Б╤В╨╛╨╗╨▒╤Ж╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 5 ;╤И╨╕╤А╨╕╨╜╨░ ╨║╨╛╨╗╨╛╨╜╨║╨╕ + DB 0x07,5 + diff --git a/loadbin.asm b/loadbin.asm index 7d2ea23..a8f7cfe 100644 --- a/loadbin.asm +++ b/loadbin.asm @@ -1,191 +1,206 @@ -LoadBinDialog ld ix,.LoadBinWnd - call DialogWindow - ret -.LoadBinEditFN ;ld hl,.LoadBinFileName - ;ld c,20 - ;call InputLine.ToBuffer -.L003 ld hl,#0f24 - ld b,20 - call InputLine1 - jr c,LoadBinDialog - ld a,c - and a - jr z,.L003 - ld (.filenamelen),a - push bc - ld de,.LoadBinFileName - call InputLine.FromBuffer - pop bc - ld a,20 - sub c - jr z,.L001 - ld b,a - ld a,32 -.L002 ld (de),a - inc de - djnz .L002 -.L001 jr LoadBinDialog + MODULE LOADBIN -.EditAddres ld hl,#1021 - ld b,5 - call InputLine1 - jr c,LoadBinDialog - push bc - call PutAdres - pop bc - jr c,.EditAddres - ld (.LoadToAdr),hl - ld de,.AdresTxt - call InputLine.FromBuffer - jr LoadBinDialog -.EditLenght ld hl,#1031 - ld b,5 - call InputLine1 - jr c,LoadBinDialog - push bc - call PutAdres - pop bc - jr c,.EditLenght - ld (.LoadLen),hl - ld de,.LenTxt - call InputLine.FromBuffer - jr LoadBinDialog +LoadBinDialog + ld ix,.LoadBinWnd + call DialogWindow + ret + +.LoadBinEditFN + ;ld hl,.LoadBinFileName + ;ld c,20 + ;call InputLine.ToBuffer +.L003 ld hl,#0f24 + ld b,20 + call KEYB.InputLine1 + jr c,LoadBinDialog + ld a,c + and a + jr z,.L003 + ld (.filenamelen),a + push bc + ld de,.LoadBinFileName + call KEYB.InputLine.FromBuffer + pop bc + ld a,20 + sub c + jr z,.L001 + ld b,a + ld a,32 +.L002 ld (de),a + inc de + djnz .L002 +.L001 jr LoadBinDialog + +.EditAddres + ld hl,0x1021 + ld b,5 + call KEYB.InputLine1 + jr c,LoadBinDialog + push bc + call KEYB.PutAddress + pop bc + jr c,.EditAddres + ld (.LoadToAdr),hl + ld de,.AdresTxt + call KEYB.InputLine.FromBuffer + jr LoadBinDialog + +.EditLenght + ld hl,0x1031 + ld b,5 + call KEYB.InputLine1 + jr c,LoadBinDialog + push bc + call KEYB.PutAddress + pop bc + jr c,.EditLenght + ld (.LoadLen),hl + ld de,.LenTxt + call KEYB.InputLine.FromBuffer + jr LoadBinDialog .LoadBIN - xor a - ld (ClockOn),a - ld c,Dss.Open - ld hl,.LoadBinFileName - push hl - ld a,(.filenamelen) - ld d,0 - ld e,a - add hl,de - ld (.restadr+1),hl - ld (hl),0 - pop hl - ld a,1 - rst DssRst - jp c,.Err1 -.restadr ld hl,0 - ld (hl),32 - ld (.FMid),a - ld hl,(.LoadToAdr) - ld a,1 ;рфЁхё т юсырёЄш #0000-7fff? - bit 7,h - jr z,.adr0000 - inc a ;#8000-#bfff? - bit 6,h - jr z,.adr - inc a ;#c000-ffff !!! - jr .adr -.adr0000 bit 6,h - jr nz,.adr - sub a -.adr ld (.bank),a - set 6,h ;рфЁхё чруЁєчъш =>#4XXX - res 7,h - ld (.LoadFirst+4),hl - push hl - ld hl,0 ;╙чэрхь фышэє Їрщыр - ld ix,0 - ld b,2 - ld c,Dss.Move_FP - rst DssRst - ld (.LoadLen),HL - ld (.LoadEnd+1),hl - pop hl -.Load00 and a - ex hl,de - ld de,#8000 - sbc hl,de - ld (.LoadFirst+1),hl - ld de,(.LoadEnd+1) - and a - sbc hl,de - jr c,.LoadEnd -.LoadFirst ld de,0 ;ъюышўхёЄтю срщЄ, ъюЄюЁ√х эрфю ёўшЄрЄ№ т яхЁтє■ срэъє - ld hl,0 ;рфЁхё, ъєфр ёърўрЄ№ -.LoadNext call .Bank1 - ld c,Dss.Read - ld a,(.FMid) - rst DssRst - jr c,.Err - ld hl,.bank - inc (hl) - ld hl,(.LoadEnd+1) - ld de,#4000 - and a - sbc hl,de - jr c,.LoadEnd ;╬ёЄрыюё№ ьхэ№°х 16╩с - ld (.LoadEnd+1),hl - ld hl,#4000 - ld de,#4000 - jr .LoadNext -.LoadEnd ld de,0 ;ъюышўхёЄтю срщЄ, ъюЄюЁ√х эхюсїюфшью фюўшЄрЄ№ - call .Bank1 - ld hl,#4000 - ld a,(.FMid) - ld c,Dss.Read - rst DssRst - jr c,.Err - ld a,(.FMid) - ld c,Dss.Close - rst DssRst + xor a + ld (ClockOn),a + ld c,Dss.Open + ld hl,.LoadBinFileName + push hl + ld a,(.filenamelen) + ld d,0 + ld e,a + add hl,de + ld (.restadr+1),hl + ld (hl),0 + pop hl + ld a,1 + rst DssRst + jp c,.Err1 - ld hl,(.LoadToAdr) - ld (ListAdr),hl - ld a,(WinPage+1) - out (EmmWin.P1),a - ret +.restadr ld hl,0 + ld (hl),32 + ld (.FMid),a + ld hl,(.LoadToAdr) + ld a,1 ; ╨░╨┤╤А╨╡╤Б ╨▓ ╨╛╨▒╨╗╨░╤Б╤В╨╕ #0000-7fff? + bit 7,h + jr z,.adr0000 + inc a ; #8000-#bfff? + bit 6,h + jr z,.adr + inc a ; #c000-ffff !!! + jr .adr +.adr0000 bit 6,h + jr nz,.adr + sub a +.adr ld (.bank),a + set 6,h ; ╨░╨┤╤А╨╡╤Б ╨╖╨░╨│╤А╤Г╨╖╨║╨╕ =>#4XXX + res 7,h + ld (.LoadFirst+4),hl + push hl + ld hl,0 ; ╨г╨╖╨╜╨░╨╡╨╝ ╨┤╨╗╨╕╨╜╤Г ╤Д╨░╨╣╨╗╨░ + ld ix,0 + ld b,2 + ld c,Dss.Move_FP + rst DssRst + ld (.LoadLen),hl + ld (.LoadEnd+1),hl + pop hl +.Load00 and a + ex hl,de + ld de,#8000 + sbc hl,de + ld (.LoadFirst+1),hl + ld de,(.LoadEnd+1) + and a + sbc hl,de + jr c,.LoadEnd +.LoadFirst ld de,0 ; ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╨▒╨░╨╣╤В, ╨║╨╛╤В╨╛╤А╤Л╨╡ ╨╜╨░╨┤╨╛ ╤Б╤З╨╕╤В╨░╤В╤М ╨▓ ╨┐╨╡╤А╨▓╤Г╤О ╨▒╨░╨╜╨║╤Г + ld hl,0 ; ╨░╨┤╤А╨╡╤Б, ╨║╤Г╨┤╨░ ╤Б╨║╨░╤З╨░╤В╤М +.LoadNext call .Bank1 + ld c,Dss.Read + ld a,(.FMid) + rst DssRst + jr c,.Err + ld hl,.bank + inc (hl) + ld hl,(.LoadEnd+1) + ld de,#4000 + and a + sbc hl,de + jr c,.LoadEnd ; ╨Ю╤Б╤В╨░╨╗╨╛╤Б╤М ╨╝╨╡╨╜╤М╤И╨╡ 16╨Ъ╨▒ + ld (.LoadEnd+1),hl + ld hl,#4000 + ld de,#4000 + jr .LoadNext +.LoadEnd ld de,0 ; ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╨▒╨░╨╣╤В, ╨║╨╛╤В╨╛╤А╤Л╨╡ ╨╜╨╡╨╛╨▒╤Е╨╛╨┤╨╕╨╝╨╛ ╨┤╨╛╤З╨╕╤В╨░╤В╤М + call .Bank1 + ld hl,#4000 + ld a,(.FMid) + ld c,Dss.Read + rst DssRst + jr c,.Err + ld a,(.FMid) + ld c,Dss.Close + rst DssRst + + ld hl,(.LoadToAdr) + ld (ListAddr),hl + ld a,(WinPage+1) + out (EmmWin.P1),a + ret .Err push af - ld a,(.FMid) - ld c,Dss.Close - rst DssRst - pop af -.Err1 call ErDss - ld c,Dss.PChars ;т√тюф ЄхъёЄр ю°шсъш ш юцшфрэш  any key - rst DssRst - ld c,Dss.WaitKey - rst DssRst - ret + ld a,(.FMid) + ld c,Dss.Close + rst DssRst + pop af +.Err1 + ei + call ErDss + ld c,Dss.PChars ; ╨▓╤Л╨▓╨╛╨┤ ╤В╨╡╨║╤Б╤В╨░ ╨╛╤И╨╕╨▒╨║╨╕ ╨╕ ╨╛╨╢╨╕╨┤╨░╨╜╨╕╤П any key + rst DssRst + ld c,Dss.WaitKey + rst DssRst + ret .Bank1 push hl - push de - ld a,(.bank) - ld l,a - ld h,0 - ld de,WinPage - add hl,de - ld a,(hl) - out (EmmWin.P1),a - pop de - pop hl - ret + push de + ld a,(.bank) + ld l,a + ld h,0 + ld de,WinPage + add hl,de + ld a,(hl) + out (EmmWin.P1),a + pop de + pop hl + ret .bank db 0 .FMid db 0 -.filenamelen db 0 -.LoadToAdr dw #4000 -.LoadLen dw #1000 +.filenamelen + db 0 +.LoadToAdr dw 0x4000 +.LoadLen dw 0x1000 .LoadBinWnd db 2,23,13,36,6,7 - db "Load BIN-file",0 - db "Filename: " -.LoadBinFileName ds 20,32 - db 0X0D - db "Addres: " + db "Load BIN-file",0 + db "Filename: " +.LoadBinFileName + ds 20,32 + db 0x0D + db "Addres: " .AdresTxt db "#4000 Lenght: " .LenTxt db "#1000" - db 0x16,10+23,4+13,"OK Cancel",0 - db 5 - db 35,15,22,2 ;Filename - dw 0,.LoadBinEditFN - db 32,16,7,2 ;Addres - dw 0,.EditAddres - db 48,16,7,2 ;Lenght - dw 0,.EditLenght - db 30,17,8,2 ;OK - dw 0,.LoadBIN - db 41,17,8,2 ;Cancel - dw 0,0 \ No newline at end of file + db 0x16,10+23,4+13,"OK Cancel",0 + db 5 + db 35,15,22,2 ; Filename + dw 0,.LoadBinEditFN + db 32,16,7,2 ; Address + dw 0,.EditAddres + db 48,16,7,2 ; Lenght + dw 0,.EditLenght + db 30,17,8,2 ; OK + dw 0,.LoadBIN + db 41,17,8,2 ; Cancel + dw 0,0 + + ENDMODULE \ No newline at end of file diff --git a/make.sh b/make.sh new file mode 100755 index 0000000..01bf169 --- /dev/null +++ b/make.sh @@ -0,0 +1,2 @@ +#! /bin/bash +sjasmplus --sld=demon.sld --sym=demon.labels --raw=demon.exe --fullpath demon.asm diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..2ad9530 --- /dev/null +++ b/readme.md @@ -0,0 +1,27 @@ +# ╨Ь╨╛╨╜╨╕╤В╨╛╤А-╨╛╤В╨╗╨░╨┤╤З╨╕╨║ DemoN by Alpha Studio ╤Б ╨╜╨╡╨▒╨╛╨╗╤М╤И╨╕╨╝╨╕ ╨┤╨╛╤А╨░╨▒╨╛╤В╨║╨░╨╝╨╕ Hard/WCG + +## DemoN v.0.12 + +### b0004 24.07.2024 (Romych) + ++ (DSS 1.70+) ╨Ф╨╛╨▒╨░╨▓╨╗╨╡╨╜╨░ ╨┐╨╛╨┤╨┤╨╡╤А╨╢╨║╨░ ╨╖╨░╨│╤А╤Г╨╖╨║╨╕ EXE-╤Д╨░╨╣╨╗╨╛╨▓ ╨▓╨╡╤А╤Б╨╕╨╕ 1 ++ (DSS 1.70+) ╨Ф╨╛╨▒╨░╨▓╨╗╨╡╨╜╨░ ╨┐╨╛╨┤╨┤╨╡╤А╨╢╨║╨░ ╤Д╤Г╨╜╨║╤Ж╨╕╨╕ DSS CurDir, ╤В╨╡╨┐╨╡╤А╤М demon.exe ╨╝╨╛╨╢╨╜╨╛ ╨┤╨╡╤А╨╢╨░╤В╤М ╨│╨┤╨╡-╤В╨╛ ╨▓ ╨║╨░╤В╨░╨╗╨╛╨│╨╡, ╨┐╤А╨╛╨┐╨╕╤Б╨░╨╜╨╜╤Л╤Е ╨▓ PATH ╨╕ ╨╖╨░╨┐╤Г╤Б╨║╨░╤В╤М ╨╛╤В╨╗╨░╨┤╨║╤Г exe ╨╕╨╖ ╤В╨╡╨║╤Г╤Й╨╡╨│╨╛ ╨║╨░╤В╨░╨╗╨╛╨│╨░. + +### b0003 20.02.2011 + ++ ╨Я╨╛ ╨║╨╜╨╛╨┐╨║╨╡ "Z" PC ╨┐╤А╨╕╤Б╨▓╨░╨╕╨▓╨░╨╡╤В╤Б╤П ╨░╨┤╤А╨╡╤Б, ╨╜╨░ ╨║╨╛╤В╨╛╤А╨╛╨╝ ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜ ╨║╤Г╤А╤Б╨╛╤А. ++ ╨Ф╨╛╨▒╨░╨▓╨╕╨╗ ╨┤╨╕╨░╨╗╨╛╨│ Load BIN-file, ╨╜╨╛ ╨╡╤Й╨╡ ╨╜╨╡ ╨┤╨╛╨▓╨╡╨╗ ╨╡╨│╨╛ ╨┤╨╛ ╤Г╨╝╨░. + +### b0002 19.02.2011 + ++ ╨Ш╨╖╨╝╨╡╨╜╨╕╨╗ ╨┐╤А╨╛╤Ж╨╡╨┤╤Г╤А╤Л ╨┐╨╡╤З╨░╤В╨╕ ╨╕ ╨┐╤А╨╛╤А╨╕╤Б╨╛╨▓╨║╨╕ ╨║╤Г╤А╤Б╨╛╤А╨░ ╨┤╨╗╤П ╤А╨░╨▒╨╛╤В╤Л ╤З╨╡╤А╨╡╨╖ DSS, ╤В.╨║. ╨╜╨░ ╤Н╨╝╤Г╨╗╤П╤В╨╛╤А╨╡ Demon ╨╜╨╡ +╨┐╨╛╨╗╨╜╨╛╤Ж╨╡╨╜╨╜╨╛ ╤А╨░╨▒╨╛╤В╨░╨╡╤В. ++ ╨┐╤А╨╕ ╤Б╤В╨░╤А╤В╨╡ ╨╖╨░╨┐╨╛╨╝╨╕╨╜╨░╨╡╨╝ ╤В╨╡╨║╤Г╤Й╨╕╨╣ ╤А╨╡╨╢╨╕╨╝ ╤Н╨║╤А╨░╨╜╨░ ╨╕ ╨┐╤А╨╕ ╨▓╤Л╤Е╨╛╨┤╨╡ - ╨▓╨╛╤Б╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝. ++ ╤Б╨╛╤Е╤А╨░╨╜╤П╨╡╨╝ ╨▓ ╨▒╤Г╤Д╨╡╤А ╨╕╨╜╤Д╤Г ╤Н╨║╤А╨░╨╜╨░ ╨Ю╨б╨╕, ╨╡╤Б╨╗╨╕ ╤Н╨║╤А╨░╨╜ ╨┤╨╡╨╝╨╛╨╜╨░ ╨╜╨░╤Е╨╛╨┤╨╕╤В╤Б╤П ╨╜╨░ ╤В╨╛╨╣ ╨╢╨╡ ╤Б╤В╤А╨░╨╜╨╕╤Ж╨╡, ╨┐╤А╨╕ ╨▓╤Л╤Е╨╛╨┤╨╡ - ╨▓╨╛╤Б╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ ++ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨░ ╨Я/╨Я ╨┐╤А╨╛╤Б╨╝╨╛╤В╤А╨░ ╨┤╤А╤Г╨│╨╛╨│╨╛ ╤Н╨║╤А╨░╨╜╨░, ╤В╨╡╨┐╨╡╤А╤М ╨╛╨╜╨░ ╤Б ╤Г╤З╨╡╤В╨╛╨╝ ╤В╨╛╨│╨╛, ╤З╤В╨╛ ╨┤╨╡╨╝╨╛╨╜ ╨╕ ╨Ю╨б ╨╝╨╛╨│╤Г╤В ╨▒╤Л╤В╤М ╨╜╨░ ╨╛╨┤╨╜╨╛╨╝ ╤Н╨║╤А╨░╨╜╨╡ ++ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜ ╨╛╨▒╤А╨░╨╖ "╨╜╨╡╨┐╨╡╤З╨░╤В╨░╨╡╨╝╨╛╨│╨╛" ╤Б╨╕╨╝╨▓╨╛╨╗╨░ ++ ╨┤╨╛╨▒╨░╨▓╨╕╨╗ ╨Я╨Я ╨┐╤А╨╛╤А╨╕╤Б╨╛╨▓╨║╨╕ ╨╛╨║╨╛╨╜ ╨╕ ╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨╕ ╨┤╨╕╨░╨╗╨╛╨│╨╛╨▓ - ╨╜╨░ ╨▒╤Г╨┤╤Г╤Й╨╡╨╡ + +### b0001 18.02.2011 + ++ ╨Я╨╡╤А╨╡╨┤╨╡╨╗╨░╨╗ ╨╕╤Б╤Е╨╛╨┤╨╜╨╕╨║ ╨┐╨╛╨┤ ╨║╤А╨╛╤Б╤Б╨░╤Б╤Б╨╡╨╝╨▒╨╗╨╡╤А sjasmplus. diff --git a/readme.txt b/readme.txt deleted file mode 100644 index 77b80f1..0000000 --- a/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -╠юэшЄюЁ-юЄырфўшъ DemoN by Alpha Studio ё эхсюы№°шьш фюЁрсюЄърьш Hard/WCG - -DemoN v.0.11 - -b0003 20.02.2011 -+ ╧ю ъэюяъх PC яЁшётрштрхЄё  рфЁхё, эр ъюЄюЁюь єёЄрэютыхэ ъєЁёюЁ. - -+ ─юсртшы фшрыюу Load BIN-file, эю х∙х эх фютхы хую фю єьр. - -b0002 19.02.2011 -* ╚чьхэшы яЁюЎхфєЁ√ яхўрЄш ш яЁюЁшёютъш ъєЁёюЁр фы  ЁрсюЄ√ ўхЁхч DSS, Є.ъ. эр ¤ьєы ЄюЁх Demon эх -яюыэюЎхээю ЁрсюЄрхЄ. - -+ яЁш ёЄрЁЄх чряюьшэрхь Єхъє∙шщ Ёхцшь ¤ъЁрэр ш яЁш т√їюфх - тюёёЄрэртыштрхь. - -+ ёюїЁрэ хь т сєЇхЁ шэЇє ¤ъЁрэр ╬╤ш, хёыш ¤ъЁрэ фхьюэр эрїюфшЄё  эр Єющ цх ёЄЁрэшЎх, -яЁш т√їюфх - тюёёЄрэртыштрхь - -* шчьхэхэр ╧/╧ яЁюёьюЄЁр фЁєуюую ¤ъЁрэр, ЄхяхЁ№ юэр ё єўхЄюь Єюую, ўЄю фхьюэ ш ╬╤ ьюуєЄ с√Є№ эр юфэюь ¤ъЁрэх - -* шчьхэхэ юсЁрч "эхяхўрЄрхьюую" ёшьтюыр - -+ фюсртшы ╧╧ яЁюЁшёютъш юъюэ ш юсЁрсюЄъш фшрыюуют - эр сєфє∙хх - -b0001 18.02.2011 -* ╧хЁхфхыры шёїюфэшъ яюф ъЁюёёрёёхьсыхЁ sjasmplus. \ No newline at end of file diff --git a/rez.asm b/rez.asm new file mode 100644 index 0000000..2d85dd6 --- /dev/null +++ b/rez.asm @@ -0,0 +1,87 @@ +;[]=========================================================================[] +;[] ╨а╨╡╨╖╨╕╨┤╨╡╨╜╤В ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ [] +;[] v0.03 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 24.02.2006 [] +;[] ╨Я╤А╨╕╨╜╤Ж╨╕╨┐ ╤А╨░╨▒╨╛╤В╤Л (╨┤╨▓╨░ ╨▓╨░╤А╨╕╨░╨╜╤В╨░): [] +;[] 1. ╨а╨╡╨╖╨╕╨┤╨╡╨╜╤В ╤А╨░╤Б╨┐╨╛╨╗╨╛╨╢╨╡╨╜ ╨╜╨╡ ╨▓╨╛ ╨▓╤В╨╛╤А╨╛╨╝ ╨╛╨║╨╜╨╡ ╨┐╨░╨╝╤П╤В╨╕ (0x8000...0xBFFF) [] +;[] ╨Ш╨╖ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ ╨│╨╛╤В╨╛╨▓╨╕╤В╤Б╤П ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В (╨╜╨░╤Б╤В╤А╨░╨╕╨▓╨░╤О╤В╤Б╤П ╨▓╤Б╨╡ ╨░╨┤╤А╨╡╤Б╨░) ╨╕ ╨║╨╛╨┐╨╕╤А╤Г╨╡╤В╤Б╤П [] +;[] ╨┐╨╛ ╨░╨┤╤А╨╡╤Б╤Г ╤А╨░╤Б╨┐╨╛╨╗╨╛╨╢╨╡╨╜╨╕╤П, ╤Г╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╨╡ ╨╕╨╖ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ ╨┐╨╡╤А╨╡╨┤╨░╨╡╤В╤Б╤П ╨╜╨░ ╨╝╨╡╤В╨║╤Г [] +;[] Rezident.Start1, ╨┐╨╛╤Б╨╗╨╡ ╤З╨╡╨│╨╛ ╨┐╤А╨╛╨╕╤Б╤Е╨╛╨┤╨╕╤В ╨▓╨╛╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╡ ╨▒╨░╨╜╨║╨╕ ╨┐╨░╨╝╤П╤В╨╕, ╤А╨░╤Б- [] +;[] ╨┐╨╛╨╗╨╛╨╢╨╡╨╜╨╜╨╛╨╣ ╨┐╨╛╨┤ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨╛╨╝ ╨╕ ╨▓╤Л╨┐╨╛╨╗╨╜╨╡╨╜╨╕╨╡ ╨╛╤В╨╗╨░╨╢╨╕╨▓╨░╨╡╨╝╨╛╨╣ ╨║╨╛╨╝╨░╨╜╨┤╤Л. ╨Т╨╛╨╖╨▓╤А╨░╤В [] +;[] ╨▓ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В ╨╛╤Б╤Г╤Й╨╡╤Б╤В╨▓╨╗╤П╨╡╤В╤Б╤П ╨╜╨░ ╨╝╨╡╤В╨║╤Г Rezident.RetIn1 ╨╕ ╨┤╨░╨╗╨╡╨╡ ╨┐╨╛╤Б╨╗╨╡ ╨▓╨╛╤Б- [] +;[] ╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╕╤П ╨▒╨░╨╜╨║╨╕ ╤Б ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨╛╨╝ ╨▓╨╛╨╖╨▓╤А╨░╤В ╨▓ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║. [] +;[] 2. ╨а╨╡╨╖╨╕╨┤╨╡╨╜╤В ╤А╨░╤Б╨┐╨╛╨╗╨╛╨╢╨╡╨╜ ╨▓╨╛ ╨▓╤В╨╛╤А╨╛╨╝ ╨╛╨║╨╜╨╡ ╨┐╨░╨╝╤П╤В╨╕ (0x8000...0xBFFF) [] +;[] ╨Я╨╛╤Б╨║╨╛╨╗╤М╨║╤Г ╨▓ ╤Н╤В╨╛╨╝ ╨╛╨║╨╜╨╡ ╤А╨░╨▒╨╛╤В╨░╨╡╤В ╤Б╨░╨╝ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║, ╤В╨╛ ╨┐╨╡╤А╨╡╤Е╨╛╨┤ ╨▓ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В ╨╕ [] +;[] ╨▓╨╛╨╖╨▓╤А╨░╤В ╨▓ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║ ╨┐╨╛╤Б╨╗╨╡ ╤В╤А╨░╤Б╤Б╨╕╤А╨╛╨▓╨║╨╕ ╨║╨╛╨╝╨░╨╜╨┤╤Л ╨▓╤Л╨┐╨╛╨╗╨╜╤П╨╡╤В╤Б╤П ╨┐╤А╨╕ ╨┐╨╛╨╝╨╛╤Й╨╕ [] +;[] ╨▓╤Б╨┐╨╛╨╝╨╛╨│╨░╤В╨╡╨╗╤М╨╜╨╛╨╣ ╨┐╤А╨╛╤Ж╨╡╨┤╤Г╤А╤Л ╨┤╨╗╨╕╨╜╨╛╨╣ 7 ╨▒╨░╨╣╤В ╤А╨░╤Б╨┐╨╛╨╗╨╛╨╢╨╡╨╜╨╛╨╣ ╨┐╨╛ ╨░╨┤╤А╨╡╤Б╤Г [] +;[] AdrTmpBuf. ╨Я╨╛╤Б╨╗╨╡ ╨║╨╛╤А╤А╨╡╨║╤Ж╨╕╨╕ ╨▓╤Б╨╡╤Е ╨░╨┤╤А╨╡╤Б╨╛╨▓ ╨▓ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨╡ ╨╕ ╤Б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╕╨╕ ╨░╨║╨║╤Г- [] +;[] ╨╝╤Г╨╗╤П╤В╨╛╤А╨░ ╨╛╤В╨╗╨░╨╢╨╕╨▓╨░╨╡╨╝╨╛╨╣ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л ╨┐╨╛ ╨░╨┤╤А╨╡╤Б╤Г Rezident+1 ╨╕ ╨┐╨░╤А╤Л HL ╨┐╨╛ ╨░╨┤╤А╨╡- [] +;[] ce Rezident+2 ╤Г╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╨╡ ╨┐╨╡╤А╨╡╨┤╨░╨╡╤В╤Б╤П ╨┐╨╛ ╨░╨┤╤А╨╡╤Б╤Г AdrTmpBuf, ╨│╨┤╨╡ ╤А╨░╤Б╨┐╨╛╨╗╨╛╨╢╨╡╨╜ [] +;[] ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╕╨╣ ╨║╨╛╨┤ ╨╛╤В╨║╨╗╤О╤З╨░╤О╤Й╨╕╨╣ ╨▒╨░╨╜╨║╤Г ╤Б ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨╛╨╝: [] +;[] ld a,╨Э╨╛╨╝╨╡╤А╨С╨░╨╜╨║╨╕╨Я╨╛╨┤╨Ю╤В╨╗╨░╨┤╤З╨╕╨║╨╛╨╝ [] +;[] out (╨Э╨╛╨╝╨╡╤А╨Я╨╛╤А╤В╨░2╨Ю╨║╨╜╨░),a [] +;[] jp Rezident.Start [] +;[] ╨Ф╨░╨╗╨╡╨╡ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В ╨▓╨╛╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╤В 7 ╨▒╨░╨╣╤В ╨╖╨░╨┐╨╛╤А╤З╨╡╨╜╤Л╤Е ╨▓╤Л╤И╨╡╨┐╤А╨╡╨▓╨╡╨┤╨╡╨╜╨╜╨╛╨╣ ╨┐╤А╨╛╤Ж╨╡- [] +;[] ╨┤╤Г╤А╨╛╨╣, ╨░ ╤В╨░╨║╨╢╨╡ ╨┐╨░╤А╤Г HL ╨╕ ╨░╨║╨║╤Г╨╝╤Г╨╗╤П╤В╨╛╤А ╨╕ ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨╕╤В ╨║ ╤В╤А╨░╤Б╤Б╨╕╤А╨╛╨▓╨║╨╡. ╨Т╨╛╨╖╨▓╤А╨░╤В [] +;[] ╨┐╤А╨╛╨╕╤Б╤Е╨╛╨┤╨╕╤В ╨╜╨░ ╨╝╨╡╤В╨║╤Г Rezident.RetIn, ╨│╨┤╨╡ ╨┐╨╛╤Б╨╗╨╡ ╤Б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╕╤П ╨░╨║╨║╤Г╨╝╤Г╨╗╤П╤В╨╛╤А╨░ ╨╕ [] +;[] ╨┐╨░╤А╤Л HL ╤Б╨╛╤Е╤А╨░╨╜╤П╨╡╤В╤Б╤П 7 ╨▒╨░╨╣╤В ╨┐╨░╨╝╤П╤В╨╕ ╨╕╨╖ ╨░╨┤╤А╨╡╤Б╨░ AdrTmpBuf ╨╕ ╤В╤Г╨┤╨░ ╨┐╤А╨╛╨┐╨╕╤Б╤Л╨▓╨░- [] +;[] ╨╡╤В╤Б╤П ╨║╨╛╨┤ ╨▓╨╛╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╕╤П ╨▒╨░╨╜╨║╨╕ ╤Б ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨╛╨╝: [] +;[] ld a,╨Э╨╛╨╝╨╡╤А╨С╨░╨╜╨║╨╕╨б╨Ю╤В╨╗╨░╨┤╤З╨╕╨║╨╛╨╝ [] +;[] out (╨Э╨╛╨╝╨╡╤А╨Я╨╛╤А╤В╨░2╨Ю╨║╨╜╨░),a [] +;[] jp ╨Т╨Ю╤В╨╗╨░╨┤╤З╨╕╨║ [] +;[] ╨Я╨╛╤Б╨╗╨╡ ╨▓╨╛╨╖╨▓╤А╨░╤В╨░ ╨▓ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║ ╨▓╨╛╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╤В╤Б╤П ╨┐╨░╨╝╤П╤В╤М ╨╖╨░╨┐╨╛╤А╤З╨╡╨╜╨░╤П ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨╛╨╝ [] +;[] ╨╕ ╨▓╤А╨╡╨╝╨╡╨╜╨╜╨╛╨╣ ╨┐╤А╨╛╤Ж╨╡╨┤╤Г╤А╨╛╨╣ [] +;[]=========================================================================[] +AdrTmpBuf equ 0xFF00 +Rezident: + ds 11 + +.Start ld hl,0 ;╨▓╨╛╤Б╤В. ╨┐╨░╨╝╤П╤В╨╕ ╨╖╨░╨┐╨╛╤А╤З╨╡╨╜╨╜╨╛╨╣ ╨┐╤А╨╕ + ld (AdrTmpBuf),hl ;╤А╨░╨╖╨╝╨╡╤Й╨╡╨╜╨╕╨╕ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + ld hl,0 ;╨▓╨╛ 2-╨╝ ╨╛╨║╨╜╨╡ + ld (AdrTmpBuf+2),hl + ld hl,0 + ld (AdrTmpBuf+4),hl + ld a,0 + ld (AdrTmpBuf+6),a +.K2 ld hl,(Rezident+2) ;╨▓╨╛╤Б╤В╨░╨╜╨╛╨▓╨╕╨╗╨╕ HL + jr .K3 + ;...╨▓╨╛╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М ╨▒╨░╨╜╨║╤Г ╨▓╨╛ 2-╨╝ ╨╛╨║╨╜╨╡ +.Start1 ld a,0xFF ;╨▒╨░╨╜╨║╨░ ╨┐╨╛╨┤ demon'╨╛╨╝ + out (EmmWin.P2),a +.K3 ld a,(Rezident+1) ;╨▓╨╛╤Б╤В╨░╨╜╨╛╨▓╨╕╨╝ ╨░╨║╨║╤Г╨╝╤Г╨╗╤П╤В╨╛╤А + +.Step jp 0 ;╨┐╨╡╤А╨╡╤Е╨╛╨┤ ╨╜╨░ ╨▓╤Л╨┐╨╛╨╗╨╜╨╡╨╜╨╕╨╡ + +.RetIn ld (Rezident+1),a ;╤Б╨╛╤Е╤А╨░╨╜╨╕╨╝ ╨░╨║╨║╤Г╨╝╤Г╨╗╤П╤В╨╛╤А +.K4 ld (Rezident+2),hl ;╤Б╨╛╤Е╤А╨░╨╜╨╕╨╝ HL + ld hl,(AdrTmpBuf) ;╤Б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╕╨╡ ╨┐╨░╨╝╤П╤В╨╕ +.K5 ld (Rezident+4),hl + ld hl,(AdrTmpBuf+2) + ld (Rezident+6),hl + ld hl,(AdrTmpBuf+4) + ld (Rezident+8),hl + ld a,(AdrTmpBuf+6) + ld (Rezident+10),a +.BankD1 ld hl,0xFF3E ;ld a,0xFF - N ╨▒╨░╨╜╨║╨╕ ╤Б ╨╛╤В╨╗╨░╨┤╤З + ld (AdrTmpBuf),hl + ld hl,EmmWin.P2*256+0xD3 ;out (EmmWin.P2),a + ld (AdrTmpBuf+2),hl +.Return1 ld hl,0xC3 ;jp ╨▓ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║ + ld (AdrTmpBuf+4),hl + ld a,0 + ld (AdrTmpBuf+6),a + in a,(EmmWin.P2) ;╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨┐╨╛╨┤ demon'╨╛╨╝ +.K6 ld (Rezident),a ;╤Б╨╛╤Е╤А╨░╨╜╨╕╨╗╨╕ + jp AdrTmpBuf + +.RetIn1 ld (Rezident+1),a ;╤Б╨╛╤Е╤А╨░╨╜╨╕╨╝ ╨░╨║╨║╤Г╨╝╤Г╨╗╤П╤В╨╛╤А + ;...╤Б╨╛╤Е╤А╨░╨╜╨╕╤В╤М ╨▒╨░╨╜╨║╤Г ╨╕╨╖ 2-╨│╨╛ ╨╛╨║╨╜╨░ + in a,(EmmWin.P2) ;╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨┐╨╛╨┤ demon'╨╛╨╝ +.K1 ld (Rezident),a ;╤Б╨╛╤Е╤А╨░╨╜╨╕╨╗╨╕ +.BankD ld a,0xFF ;╨▒╨░╨╜╨║╨░ ╤Б demon'╨╛╨╝ + out (EmmWin.P2),a + +.Return jp 0 + +.End + diff --git a/savescr.asm b/savescr.asm new file mode 100644 index 0000000..4f3b573 --- /dev/null +++ b/savescr.asm @@ -0,0 +1,64 @@ +;[]=========================================================================[] +;[] ╨б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╕╨╡ ╤Н╨║╤А╨░╨╜╨░ ╨▓ ╤Д╨░╨╣╨╗ [] +;[] v0.03 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 11.03.2006 [] +;[]=========================================================================[] +SaveScr: + ld bc,1*256+Dss.GetMem + rst DssRst ;╨▓╤Л╨┤╨╡╨╗╨╡╨╜╨╕╨╡ ╨▒╨░╨╜╨║╨╕ ╨┐╨░╨╝╤П╤В╨╕ + ret c ;╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ + ld (.Id),a + ld bc,Dss.SetWin3 + rst DssRst ;╨▓╨║╨╗╤О╤З╨╡╨╜╨╕╨╡ ╨▒╨░╨╜╨║╨╕ ╨▓ 3-╨╡ ╨╛╨║╨╜╨╛ + ld (.Id+1),a ;╨╖╨░╨╝╨╡╤Й╨░╨╡╨╝╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ + ld de,0 ;╨┐╨╛╨╖╨╕╤Ж╨╕╤П ╨╜╨░ ╤Н╨║╤А╨░╨╜╨╡ + ld hl,0xC000 +.L1 push de + push hl + ld c,Dss.RdChar + rst DssRst ;╤Б╤З╨╕╤В╨░╤В╤М ╤Б╨╕╨╝╨▓╨╛╨╗ ╤Б ╤Н╨║╤А╨░╨╜╨░ + pop hl + pop de + ld (hl),a + inc hl + inc e + ld a,e + cp 0x50 ;╨╖╨░╨║╨╛╨╜╤З╨╕╨╗╨░╤Б╤М ╤Б╤В╤А╨╛╨║╨░? + jr nz,.L1 + ld bc,0x0D0A ;╨║╨╛╨╜╨╡╤Ж ╤Б╤В╤А╨╛╨║╨╕ + ld (hl),b + inc hl + ld (hl),c + inc hl + ld e,0 ;╨╜╨░╤З╨░╨╗╨╛ ╤Б╤В╤А╨╛╨║╨╕ + inc d + ld a,d + cp 0x20 ;╨║╨╛╨╜╨╡╤Ж ╤Н╨║╤А╨░╨╜╨░? + jr nz,.L1 + + ld hl,.NameF ;╨╕╨╝╤П ╤Д╨░╨╣╨╗╨░ + xor a ;╨░╤В╤А╨╕╨▒╤Г╤В + ld c,Dss.Create + rst DssRst + jr c,.L2 ;╨╛╤И╨╕╨▒╨║╨░ + push af + ld hl,0xC000 ;╨╜╨░╤З╨░╨╗╨╛ ╨╖╨░╨┐╨╕╤Б╤Л╨▓╨░╨╡╨╝╨╛╨╣ ╨┐╨░╨╝╤П╤В╨╕ + ld de,82*32 ;╤А╨░╨╖╨╝╨╡╤А ╨╖╨░╨┐╨╕╤Б╤Л╨▓╨░╨╡╨╝╨╛╨╣ ╨╕╨╜╤Д╤Л + ld c,Dss.Write + rst DssRst ;╨╖╨░╨┐╨╕╤Б╨░╤В╤М + pop af + ld c,Dss.Close + rst DssRst ;╨╖╨░╨║╤А╤Л╤В╤М ╤Д╨░╨╣╨╗ + +.L2 ld a,(.Id) ;id ╨┐╨░╨╝╤П╤В╨╕ + ld c,Dss.FreeMem + rst DssRst ;╨╛╤Б╨▓╨╛╨▒╨╛╨┤╨╕╤В╤М ╨┐╨░╨╝╤П╤В╤М + ld a,(.Id+1) + out (EmmWin.P3),a ;╨▓╨╛╤Б╤В╨░╨╜╨╛╨▓╨╕╨╗╨╕ ╨▒╨░╨╜╨║╤Г + ret + +.NameF db "demon.$$$",0 +.Id ds 2 ;id ╨▓╤Л╨┤╨╡╨╗╨╡╨╜╨╜╨╛╨│╨╛ ╨▒╨╗╨╛╨║╨░ + +;11:11 18.02.2011 ╨Ч╨░╨│╨╗╤Г╤И╨║╨░ ╨Э╨╡ ╨▒╤Л╨╗╨╛ ╨╕╤Б╤Е╨╛╨┤╨╜╨╕╨║╨░ :( +; include "d:\workast\demon\screen\scrdemon" + diff --git a/sim/ports.js b/sim/ports.js new file mode 100644 index 0000000..9287bb0 --- /dev/null +++ b/sim/ports.js @@ -0,0 +1,44 @@ +port_p0 = 0; +port_p1 = 1; +port_p2 = 2; +port_p3 = 3; +message = ""; + +// This function is called when time (t-states) advances. +API.tick = () => { +} + +// This function is called when an 'out' is executed in Z80. +API.writePort = (port, value) => { + // Go through all ports + if (port == 0x9000) { + if (value != 0) { + message += String.fromCharCode(value); + } else { + API.log("> " + message); + message = ""; + } + } else if (port == 0x82) { + port_p0 = value; + } else if (port == 0xA2) { + port_p1 = value; + } else if (port == 0xC2) { + port_p2 = value; + } else if (port == 0xE2) { + port_p3 = value; + } +} + + +API.readPort = (port) => { + if (port == 0x82) { + return port_p0; + } else if (port == 0xA2) { + return port_p1; + } else if (port == 0xC2) { + return port_p2; + } else if (port == 0xE2) { + return port_p3; + } +} + diff --git a/step.asm b/step.asm new file mode 100644 index 0000000..7638786 --- /dev/null +++ b/step.asm @@ -0,0 +1,433 @@ +;[]=========================================================================[] +;[] ╨Ю╤В╨╗╨░╨┤╨║╨░ ╨║╨╛╨╝╨░╨╜╨┤ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л [] +;[] v0.03 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 10.03.2006 [] +;[] v0.10 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 18.03.2006 [] +;[]=========================================================================[] + MODULE STEP +Step + di + ld a,(WinPage+2) ; ╨▒╨░╨╜╨║╨░ ╨┐╨╛╨┤ demon'╨╛╨╝ + ld (Rezident.Start1+1),a ; ╨▓ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В ╨╡╨╡ + ld (.BankP+1),a + ld a,(BankDebug) ; ╨▒╨░╨╜╨║╨░ ╤Б demon'╨╛╨╝ + ld (Rezident.BankD+1),a ; ╨▓ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В ╨╡╨╡ + ld (Rezident.BankD1+2),a + ld hl,Step.Run+3 ; ╤В╨╛╤З╨║╨░ ╨▓╨╛╨╖╨▓╤А╨░╤В╨░ ╨▓ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║ + ld (Rezident.Return+1),hl ; ╨┐╤А╨╛╨┐╨╕╤Б╤Л╨▓╨░╨╡╨╝ ╨▓ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨╡ + ld a,l + ld (Rezident.Return1+2),a + ld a,h + ld (Rezident.Return1+7),a + ld hl,(Reg._PC) + ld (Rezident.Step+1),hl ; ╨░╨┤╤А╨╡╤Б ╨╛╤В╨╗╨░╨╢╨╕╨▓╨░╨╡╨╝╨╛╨╣ ╨║╨╛╨╝╨░╨╜╨┤╤Л + + ld a,(Reg._AF) ; ╤Д╨╗╨░╨│ + ld b,a + call Ld_a_hl +; ld a,(hl) ; ╨║╨╛╨┤ ╨║╨╛╨╝╨░╨╜╨┤╤Л + + ld c,a + and 11001111b + cp 11000101b ; PUSH + call z,.SpdInc + cp 11000001b ; POP + call z,.SpdDec + + ld a,c + cp 0xCD ; CALL + jr nz,.L7 + ld a,(.Flag) + inc a + jp nz,.L2 ; ╨▒╨╡╨╖ ╨╖╨░╤Е╨╛╨┤╨░ ╨▓ ╨┐╨╛╨┤╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Г + jp .L8 +.L7 cp 0xC9 ; RET + jp z,.L9 + cp 0xC3 ; JP + jp z,.L8+3 + cp 0x18 ; JR + jp z,.L6 + cp 0x10 ; DJNZ + jr nz,.L18 + ld a,(.Flag) + inc a + jp nz,.L2 ; ╨▒╨╡╨╖ ╨╛╤В╨╗╨░╨┤╨║╨╕ ╤Ж╨╕╨║╨╗╨░ + ld a,(Reg._BC+1) + dec a + jr nz,.L6 + jp .L2 +.L18 inc hl ; ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╕╨╣ ╨▒╨░╨╣╤В ╤Б╨╛╨╝╨░╨╜╨┤╤Л + exa + call Ld_a_hl + ld c,a + exa +; ld c,(hl) + dec hl + cp 0xED ; ╨┐╤А╨╡╤Д╨╕╨║╤Б ╨┤╨╗╤П RETI, RETN + jr nz,.L10 + ld a,c + cp 0x4D ; RETI + jp z,.L9 + cp 0x45 ; RETN + jp z,.L9 +.L10 cp 0xDD ; ╨┐╤А╨╡╤Д╨╕╨║╤Б ╨┤╨╗╤П IX + jr nz,.L25 + ld a,c + cp 0xE5 ; PUSH IX + call z,.SpdInc + cp 0xE1 ; POP IX + call z,.SpdDec + ld de,(Reg._IX) + jr .L24 +.L25 cp 0xFD ; ╨┐╤А╨╡╤Д╨╕╨║╤Б ╨┤╨╗╤П IY + jr nz,.L24-4 + ld a,c + cp 0xE5 ; PUSH IY + call z,.SpdInc + cp 0xE1 ; POP IY + call z,.SpdDec + ld de,(Reg._IY) + jr .L24 + ld de,(Reg._HL) +.L24 cp 0xE9 ; JP (HL/IX/IY) + jr nz,.L23 + ex de,hl + jp .NPC +.L23 cp 0x38 ; JR C, + jr nz,.L19 + bit 0,b ; ╤Д╨╗╨░╨│ C + jp z,.L2 ; ╨╜╨╡╤В ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ + jr .L6 ; ╨┐╨╡╤А╨╡╤Е╨╛╨┤ +.L19 cp 0x30 ; JR NC, + jr nz,.L20 + bit 0,b ; ╤Д╨╗╨░╨│ C + jp nz,.L2 ; ╨╜╨╡╤В ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ + jr .L6 ; ╨┐╨╡╤А╨╡╤Е╨╛╨┤ +.L20 cp 0x28 ; JR Z, + jr nz,.L21 + bit 6,b ; ╤Д╨╗╨░╨│ Z + jp z,.L2 ; ╨╜╨╡╤В ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ + jr .L6 ; ╨┐╨╡╤А╨╡╤Е╨╛╨┤ +.L21 cp 0x20 ; JR NZ, + jr nz,.L22 + bit 6,b ; ╤Д╨╗╨░╨│ Z + jp nz,.L2 ; ╨╜╨╡╤В ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ +.L6 inc hl + call Ld_a_hl +; ld a,(hl) ; ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ + inc hl + ld b,0 + ld c,a + bit 7,a ; ╨╖╨╜╨░╨║ ╤З╨╕╤Б╨╗╨░ + jr z,$+11 + neg + or a ; ╤Б╨▒╤А╨╛╤Б ╤Д╨╗╨░╨│╨░ C + ld c,a + sbc hl,bc ; ╨╛╤В╤А╨╕╤Ж╨░╤В╨╡╨╗╤М╨╜╨╛╨╡ ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ + jp .NPC + add hl,bc ; ╨┐╨╛╨╗╨╛╨╢╨╕╤В╨╡╨╗╤М╨╜╨╛╨╡ ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ + jp .NPC + +.L22 and 11000111b + cp 11000111b ; RST x + jr nz,.L27 + ld a,(.Flag) + inc a + jp nz,.L2 ; ╨▒╨╡╨╖ ╨╖╨░╤Е╨╛╨┤╨░ ╨▓ ╨┐╨╛╨┤╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Г + call .SpdInc + call Ld_a_hl +; ld a,(hl) ; ╨▒╨░╨╣╤В ╨║╨╛╨╝╨╜╨┤╤Л + and 00111000b ; ╨░╨┤╤А╨╡╤Б ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ + ld h,0 + ld l,a + jp .NPC +.L27 cp 11000010b ; JP flag + jr z,.L26 + cp 11000000b ; RET flag + jr z,.L26 + cp 11000100b ; CALL flag + jr nz,.L2 + ld a,(.Flag) + inc a + jr nz,.L2 ; ╨▒╨╡╨╖ ╨╖╨░╤Е╨╛╨┤╨░ ╨▓ ╨┐╨╛╨┤╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Г +.L26 call Ld_a_hl +; ld a,(hl) ; ╨║╨╛╨┤ ╨║╨╛╨╝╨░╨╜╨┤╤Л + and 00111000b ; ╤Д╨╗╨░╨│╨╕ + jr z,.L11 ; JP/CALL/RET NZ, + cp 00001000b + jr z,.L12 ; JP/CALL/RET Z, + cp 00010000b + jr z,.L13 ; JP/CALL/RET NC, + cp 00011000b + jr z,.L14 ; JP/CALL/RET C, + cp 00100000b + jr z,.L15 ; JP/CALL/RET PO, + cp 00101000b + jr z,.L16 ; JP/CALL/RET PE, + cp 00110000b + jr z,.L17 ; JP/CALL/RET P, + bit 7,b ; JP/CALL/RET M, ╤Д╨╗╨░╨│ S + jr z,.L2 ; ╨╜╨╡╤В ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ + jr .L5 ; ╨┐╨╡╤А╨╡╤Е╨╛╨┤ +.L11 bit 6,b ; ╤Д╨╗╨░╨│ Z + jr nz,.L2 ; ╨╜╨╡╤В ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ + jr .L5 ; ╨┐╨╡╤А╨╡╤Е╨╛╨┤ +.L12 bit 6,b ; ╤Д╨╗╨░╨│ Z + jr z,.L2 ; ╨╜╨╡╤В ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ + jr .L5 ; ╨┐╨╡╤А╨╡╤Е╨╛╨┤ +.L13 bit 0,b ; ╤Д╨╗╨░╨│ C + jr nz,.L2 ; ╨╜╨╡╤В ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ + jr .L5 ; ╨┐╨╡╤А╨╡╤Е╨╛╨┤ +.L14 bit 0,b ; ╤Д╨╗╨░╨│ C + jr z,.L2 ; ╨╜╨╡╤В ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ + jr .L5 ; ╨┐╨╡╤А╨╡╤Е╨╛╨┤ +.L15 bit 2,b ; ╤Д╨╗╨░╨│ P/V + jr nz,.L2 ; ╨╜╨╡╤В ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ + jr .L5 ; ╨┐╨╡╤А╨╡╤Е╨╛╨┤ +.L16 bit 2,b ; ╤Д╨╗╨░╨│ P/V + jr z,.L2 ; ╨╜╨╡╤В ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ + jr .L5 ; ╨┐╨╡╤А╨╡╤Е╨╛╨┤ +.L17 bit 7,b ; ╤Д╨╗╨░╨│ S + jr nz,.L2 ; ╨╜╨╡╤В ╨┐╨╡╤А╨╡╤Е╨╛╨┤╨░ + +.L5 call Ld_a_hl +; ld a,(hl) ; ╨║╨╛╨┤ ╨║╨╛╨╝╨░╨╜╨┤╤Л + and 00000111b ; ╨╛╤В╤Б╨╗╨╡╨┤╨╕╤В╤М RET'╤Л + jr nz,.L8-4 +.L9 call .SpdDec + ld hl,(Reg._SP) ; ╤Б╤В╨╡╨║ + dec hl + jr .L8+3 + cp 00000010b ; ╨╛╤В╤Б╨╗╨╡╨┤╨╕╤В╤М JP + jr z,.L8+3 +.L8 call .SpdInc + inc hl + call Ld_a_hl + ld b,a +; ld a,(hl) + inc hl + call Ld_a_hl +; ld h,(hl) + ld h,a + ld l,b + jr .NPC +.L2 call List ; ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨░╤П ╨║╨╛╨╝╨░╨╜╨┤╨░ +.NPC + ld (Reg._PC),hl ; ╨╜╨╛╨▓╤Л╨╣ PC + push hl + push hl + ld a,(KEYB.KList.Descript) ; ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╤Б╤В╤А╨╛╨║ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + call KEYB.AdrListTabl ; ╨╜╨╕╨╢╨╜╨╕╨╣ ╨░╨┤╤А╨╡╤Б ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + ld de,(ListAddr) ; ╨▓╨╡╤А╤Е╨╜╨╕╨╣ ╨░╨┤╤А╨╡╤Б ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + pop bc ; ╨╜╨╛╨▓╤Л╨╣ PC + call AdrArea + jr nc,.L1+4 + +.L1 ld (ListAddr),bc ; ╨╜╨╛╨▓╨░╤П ╤Б╤В╤А╨░╨╜╨╕╤Ж╨░ ╨╗╨╕╤Б╤В╨╕╨╜╨│╨░ + pop hl + + call Ld_a_hl ; ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╕╨╡ ╨╖╨░ ╨║╨╛╨╝╨░╨╜╨┤╨╛╨╣ ╨▒╨░╨╣╤В╤Л + ld c,a + inc hl + call Ld_a_hl + ld b,a + inc hl + call Ld_a_hl + push bc + push af + push hl + + push hl + ld hl,(RezAdr) ; ╨░╨┤╤А╨╡╤Б ╨┐╨╛╤Б╨░╨┤╨║╨╕ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + ld a,h + and 11000000b + cp 10000000b ; ╨╛╨║╨╜╨╛ ╨┐╨╛╤Б╨░╨┤╨║╨╕ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + ld a,0xFF ; FF - ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В ╨▓╨╛ 2-╨╝ ╨╛╨║╨╜╨╡ + jr nz,.L30 + ld de,Rezident.RetIn-Rezident + jr .L30+4 +.L30 ld de,Rezident.RetIn1-Rezident + inc a ; 0 - ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В ╨╜╨╡ ╨▓╨╛ 2-╨╝ ╨╛╨║╨╜╨╡ + ld (.WRez),a + add hl,de ; ╨░╨┤╤А╨╡╤Б ╨▓╨╛╨╖╨▓╤А╨░╤В╨░ ╨▓ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В + ex de,hl + pop hl + ld a,d ; ╨┐╤А╨╛╨┐╨╕╤Б╤Л╨▓╨░╨╡╨╝ ╨┐╨╛╤Б╨╗╨╡ + call Ld_hl_a ; ╨╛╤В╨╗╨░╨╢╨╕╨▓╨░╨╡╨╝╨╛╨╣ ╨║╨╛╨╝╨░╨╜╨┤╤Л + dec hl + ld a,e + call Ld_hl_a + dec hl + ld a,0xC3 ; JP + call Ld_hl_a + + ld hl,(RezAdr) ; ╨░╨┤╤А╨╡╤Б ╨┐╨╛╤Б╨░╨┤╨║╨╕ + push hl ; ╨║╨╛╤А╤А╨╡╨║╤Ж╨╕╤П ╨░╨┤╤А╨╡╤Б╨╛╨▓ ╨║╨╛╨┤╨░ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + ld (Rezident.K1+1),hl ; ╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨┐╨╛╨┤ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨╛╨╝ + ld (Rezident.K6+1),hl + inc hl + ld (Rezident.K3+1),hl ; ╨░╨║╨║╤Г╨╝╤Г╨╗╤П╤В╨╛╤А ╨┐╤А╨│╤А╨░╨╝╨╝╤Л + ld (Rezident.RetIn+1),hl + ld (Rezident.RetIn1+1),hl + inc hl + ld (Rezident.K2+1),hl ; ╨┐╨░╤А╨░ HL ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л + ld (Rezident.K4+1),hl + inc hl + inc hl + ld (Rezident.K5+1),hl ; 1 ╨╕ 2 ╨▒╨░╨╣╤В╤Л ╨▒╤Г╤Д╨╡╤А╨░ + inc hl + inc hl + ld (Rezident.K5+7),hl ; 3 ╨╕ 4 ╨▒╨░╨╣╤В╤Л ╨▒╤Г╤Д╨╡╤А╨░ + inc hl + inc hl + ld (Rezident.K5+13),hl ; 5 ╨╕ 6 ╨▒╨░╨╣╤В╤Л ╨▒╤Г╤Д╨╡╤А╨░ + inc hl + inc hl + ld (Rezident.K5+19),hl ; 7 ╨▒╨░╨╣╤В ╨▒╤Г╤Д╨╡╤А╨░ + + ld a,(.WRez) ; ╤Д╨╗╨░╨│ ╨┐╨╛╤Б╨░╨┤╨║╨╕ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + or a + jr nz,.L31 + ld de,Rezident.Start1-Rezident + ld hl,(RezAdr) ; ╨░╨┤╤А╨╡╤Б ╨┐╨╛╤Б╨░╨┤╨║╨╕ + add hl,de ; ╤Б╤В╨░╤А╤В ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ ╨╜╨╡ ╨▓╨╛ 2-╨╝ ╨╛╨║╨╜╨╡ + jr .L32 + +.L31 inc hl ; ╤Б╤В╨░╤А╤В ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ ╨▓╨╛ 2-╨╝ ╨╛╨║╨╜╨╡ + ld (.Run1+1),hl + + ld hl,AdrTmpBuf + ld de,Rezident.Start+1 ; ╤Б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╕╨╡ 7 ╨▒╨░╨╣╤В ╨▓ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨╡ + ld b,3 +.L33 ld a,(hl) + ld (de),a + inc hl + inc de + ld a,(hl) + ld (de),a + inc hl + inc de + inc de + inc de + inc de + inc de + djnz .L33 + ld a,(hl) + ld (de),a + + ld de,.Run1+2 ; ╨▓╤Б╨┐╨╛╨╝╨╛╨│╨░╤В╨╡╨╗╤М╨╜╨░╤П ╨┐╤А╨╛╤Ж╨╡╨┤╤Г╤А╨░ + ld b,7 ; ╨┤╨╗╨╕╨╜╨░ +.L34 ld a,(de) + ld (hl),a + dec hl + dec de + djnz .L34 + inc hl + +.L32 ld (.Run+1),hl + + ld a,(Reg._AF+1) ; ╨░╨║╨║╤Г╨╝╤Г╨╗╤П╤В╨╛╤А ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л + ld (Rezident+1),a ; ╨▓ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В + ld hl,(Reg._HL) ; ╨┐╨░╤А╨░ HL + ld (Rezident+2),hl ; ╨▓ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В + + pop hl ; ╨░╨┤╤А╨╡╤Б ╨┐╨╛╤Б╨░╨┤╨║╨╕ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + ld de,Rezident ; ╨╜╨░╤З╨░╨╗╨╛ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + ld bc,.Buffer + ld a,Rezident.End-Rezident ; ╨┤╨╗╨╕╨╜╨░ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ +.L3 push af + call Ld_a_hl + ld (bc),a ; ╤Б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╕╨╡ ╨┐╨░╨╝╤П╤В╨╕ ╨┐╨╛╨┤ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨╛╨╝ + ld a,(de) ; ╨║╨╛╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + call Ld_hl_a + inc bc + inc de + inc hl + pop af + dec a + jr nz,.L3 + + ld a,(WinPage) ; ╨▒╨░╨╜╨║╨░ ╨▓ 0-╨╛╨╝ ╨╛╨║╨╜╨╡ + out (EmmWin.P0),a + + call RestAllRegs + ld (StackDebug),sp ; ╤Б╤В╨╡╨║ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ + ld sp,(Reg._SP) ; ╤Б╤В╨╡╨║ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л +.Run jp 0 ; ╨┐╤Г╤Б╨║ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + + ld (Reg._SP),sp ; ╤Б╤В╨╡╨║ ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л + ld sp,(StackDebug) ; ╤Б╤В╨╡╨║ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ + call SaveAllRegs + in a,(EmmWin.P0) + ld (WinPage),a ; ╨▒╨░╨╜╨║╨░ ╨▓ 0-╨╛╨╝ ╨╛╨║╨╜╨╡ + ld a,(BankOS) ; ╨▒╨░╨╜╨║╨░ ╤Б OS + out (EmmWin.P0),a + + ld hl,(RezAdr) + call Ld_a_hl + ld (WinPage+2),a ; ╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨▓╨╛ 2-╨╛╨╝ ╨╛╨║╨╜╨╡ + inc hl ; ╨░╨║╨║╤Г╨╝╤Г╨╗╤П╤В╨╛╤А ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╨░ + call Ld_a_hl + ld (Reg._AF+1),a + ld a,(.WRez) ; ╤Д╨╗╨░╨│ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + or a + jr z,.L35 ; ╨╜╨╡ ╨▓╨╛ 2-╨╝ ╨╛╨║╨╜╨╡ + inc hl ; ╤А╨╡╨│╨╕╤Б╤В╤А L ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л + call Ld_a_hl + ld (Reg._HL),a + inc hl ; ╤А╨╡╨│╨╕╤Б╤В╤А H ╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л + call Ld_a_hl + ld (Reg._HL+1),a + ld b,7 + ld de,AdrTmpBuf +.L36 inc hl ; ╨▒╤Г╤Д╨╡╤А 7-╨╝╨╕ ╨▒╨░╨╣╤В + call Ld_a_hl + ld (de),a ; ╨▓╨╛╤Б╤В╨░╨╜╨╛╨▓╨╕╨╗╨╕ + inc de + djnz .L36 + +.L35 pop hl + pop af ; ╨▓╨╛╤Б╤В╨░╨╜╨╛╨▓╨╕╨╗╨╕ ╨║╨╛╨┤ ╨║╨╛╨╝╨░╨╜╨┤╤Л + pop bc + call Ld_hl_a + dec hl + ld a,b + call Ld_hl_a + dec hl + ld a,c + call Ld_hl_a + + ld de,.Buffer ; ╨▓╨╛╤Б╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╡ ╨┐╨░╨╝╤П╤В╨╕ ╨┐╨╛╨┤ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨╛╨╝ + ld hl,(RezAdr) ; ╨░╨┤╤А╨╡╤Б ╨┐╨╛╤Б╨░╨┤╨║╨╕ + ld b,Rezident.End-Rezident ; ╨┤╨╗╨╕╨╜╨░ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ +.L4 ld a,(de) + call Ld_hl_a + inc de + inc hl + djnz .L4 + ei + ret + +.BankP ld a,0xFF ; (2) ╨▒╨░╨╜╨║╨░ ╨┐╨╛╨┤ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨╛╨╝ + out (EmmWin.P2),a ; (2) +.Run1 jp 0 ; (3) ╨┐╨╡╤А╨╡╤Е╨╛╨┤ ╨▓ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В + +.SpdInc push af ; ╤Г╨▓╨╡╨╗╨╕╤З╨╡╨╜╨╕╨╡ ╨│╨╗╤Г╨▒╨╕╨╜╤Л ╤Б╤В╨╡╨║╨░ + ld a,(StackDown) + inc a + ld (StackDown),a + pop af + ret + +.SpdDec push af ; ╤Г╨╝╨╡╨╜╤М╤И╨╡╨╜╨╕╨╡ ╨│╨╗╤Г╨▒╨╕╨╜╤Л ╤Б╤В╨╡╨║╨░ + ld a,(StackDown) + dec a + ld (StackDown),a + pop af + ret + +.Flag DB On ; ╤Д╨╗╨░╨│ ╨╖╨░╤Е╨╛╨┤╨░ ╨▓ ╨┐╨╛╨┤╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л +.WRez DB 0 ; ╤Д╨╗╨░╨│ ╨╛╨║╨╜╨░ ╨┐╨╛╤Б╨░╨┤╨║╨╕ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + +.Buffer DS Rezident.End-Rezident ; ╨┤╨╗╨╕╨╜╨░ ╤А╨╡╨╖╨╕╨┤╨╡╨╜╤В╨░ + + ENDMODULE \ No newline at end of file diff --git a/TABL.ASM b/tabl.asm similarity index 97% rename from TABL.ASM rename to tabl.asm index c12230f..18835bb 100644 --- a/TABL.ASM +++ b/tabl.asm @@ -1,8 +1,8 @@ ;[]=========================================================================[] -;[] Таблицы дизассемблера монитора-отладчика DemoN [] -;[] v0.01 - последние изменения 10.10.2004 [] -;[] v0.02 - последние изменения 29.11.2004 [] -;[] v0.03 - последние изменения 29.01.2006 [] +;[] ╨в╨░╨▒╨╗╨╕╤Ж╤Л ╨┤╨╕╨╖╨░╤Б╤Б╨╡╨╝╨▒╨╗╨╡╤А╨░ ╨╝╨╛╨╜╨╕╤В╨╛╤А╨░-╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ DemoN [] +;[] v0.01 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 10.10.2004 [] +;[] v0.02 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 29.11.2004 [] +;[] v0.03 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 29.01.2006 [] ;[]=========================================================================[] Tabl00_3F: dw M00,M01,M02,M03,M04,M05,M06,M07,M08,M09,M0A,M0B,M0C,M0D,M0E,M0F diff --git a/UTIL.ASM b/util.asm similarity index 51% rename from UTIL.ASM rename to util.asm index ea75027..342e192 100644 --- a/UTIL.ASM +++ b/util.asm @@ -1,36 +1,36 @@ ;[]=========================================================================[] -;[] Подпрограммы-утилиты монитора-отладчика DemoN [] -;[] v0.01 - последние изменения 29.08.2004 [] -;[] v0.02 - последние изменения 20.03.2005 [] -;[] v0.03 - последние изменения 25.02.2006 [] -;[] v0.10 - последние изменения 17.05.2006 [] +;[] ╨Я╨╛╨┤╨┐╤А╨╛╨│╤А╨░╨╝╨╝╤Л-╤Г╤В╨╕╨╗╨╕╤В╤Л ╨╝╨╛╨╜╨╕╤В╨╛╤А╨░-╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨░ DemoN [] +;[] v0.01 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 29.08.2004 [] +;[] v0.02 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 20.03.2005 [] +;[] v0.03 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 25.02.2006 [] +;[] v0.10 - ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╡ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П 17.05.2006 [] ;[] [] -;[] SaveAllRegs - сохранение значений регистровых пар [] -;[] RestAllRegs - востановление значений регистровых пар [] -;[] PrnStrColor - печать строки символов с атрибутами [] -;[] PrintReg - печать двухбайтового числа [] -;[] PrintStrAF - печать значения регистровой пары AF и флагов [] -;[] PrintStrReg - печать значений регистровых пар с адресуемыми байтами [] -;[] PrintStrWin - печать номеров банок в окнах [] -;[] PrintSPDn - печать глубины стека [] -;[] PrintStrSp - печать значений стека [] -;[] PrintDump - печать дампа [] -;[] PrintStrDump - печать строки дампа [] -;[] ReplSymNoPrint - замена непечатных символов в строке [] -;[] NumToStr16 - формирование 16-тиричного числа [] -;[] NumToStr8 - формирование 8-ричного числа [] -;[] ConvHexStr - конвертирование числа в HEX-строку [] -;[] ConvDecStr - конвертирование 16-битного числа в DEC-строку [] -;[] CursorSet - прорисовка курсора [] -;[] CursorRes - востановление экрана под курсором [] -;[] Ld_a_bc - чтение байта из памяти с проверкой адреса, адрес в BC [] -;[] Ld_a_hl - чтение байта из памяти с проверкой адреса, адрес в HL [] -;[] Ld_hl_a - запись байта в память с проверкой адреса, адрес в HL [] -;[] AdrArea - определение принадлежности адреса области памяти [] +;[] SaveAllRegs - ╤Б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╕╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╣ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╤Е ╨┐╨░╤А [] +;[] RestAllRegs - ╨▓╨╛╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╣ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╤Е ╨┐╨░╤А [] +;[] PrnStrColor - ╨┐╨╡╤З╨░╤В╤М ╤Б╤В╤А╨╛╨║╨╕ ╤Б╨╕╨╝╨▓╨╛╨╗╨╛╨▓ ╤Б ╨░╤В╤А╨╕╨▒╤Г╤В╨░╨╝╨╕ [] +;[] PrintReg - ╨┐╨╡╤З╨░╤В╤М ╨┤╨▓╤Г╤Е╨▒╨░╨╣╤В╨╛╨▓╨╛╨│╨╛ ╤З╨╕╤Б╨╗╨░ [] +;[] PrintStrAF - ╨┐╨╡╤З╨░╤В╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨╛╨╣ ╨┐╨░╤А╤Л AF ╨╕ ╤Д╨╗╨░╨│╨╛╨▓ [] +;[] PrintStrReg - ╨┐╨╡╤З╨░╤В╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╣ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╤Е ╨┐╨░╤А ╤Б ╨░╨┤╤А╨╡╤Б╤Г╨╡╨╝╤Л╨╝╨╕ ╨▒╨░╨╣╤В╨░╨╝╨╕ [] +;[] PrintStrWin - ╨┐╨╡╤З╨░╤В╤М ╨╜╨╛╨╝╨╡╤А╨╛╨▓ ╨▒╨░╨╜╨╛╨║ ╨▓ ╨╛╨║╨╜╨░╤Е [] +;[] PrintSPDn - ╨┐╨╡╤З╨░╤В╤М ╨│╨╗╤Г╨▒╨╕╨╜╤Л ╤Б╤В╨╡╨║╨░ [] +;[] PrintStrSp - ╨┐╨╡╤З╨░╤В╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╣ ╤Б╤В╨╡╨║╨░ [] +;[] PrintDump - ╨┐╨╡╤З╨░╤В╤М ╨┤╨░╨╝╨┐╨░ [] +;[] PrintStrDump - ╨┐╨╡╤З╨░╤В╤М ╤Б╤В╤А╨╛╨║╨╕ ╨┤╨░╨╝╨┐╨░ [] +;[] ReplSymNoPrint - ╨╖╨░╨╝╨╡╨╜╨░ ╨╜╨╡╨┐╨╡╤З╨░╤В╨╜╤Л╤Е ╤Б╨╕╨╝╨▓╨╛╨╗╨╛╨▓ ╨▓ ╤Б╤В╤А╨╛╨║╨╡ [] +;[] NumToStr16 - ╤Д╨╛╤А╨╝╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ 16-╤В╨╕╤А╨╕╤З╨╜╨╛╨│╨╛ ╤З╨╕╤Б╨╗╨░ [] +;[] NumToStr8 - ╤Д╨╛╤А╨╝╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ 8-╤А╨╕╤З╨╜╨╛╨│╨╛ ╤З╨╕╤Б╨╗╨░ [] +;[] ConvHexStr - ╨║╨╛╨╜╨▓╨╡╤А╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╤З╨╕╤Б╨╗╨░ ╨▓ HEX-╤Б╤В╤А╨╛╨║╤Г [] +;[] ConvDecStr - ╨║╨╛╨╜╨▓╨╡╤А╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ 16-╨▒╨╕╤В╨╜╨╛╨│╨╛ ╤З╨╕╤Б╨╗╨░ ╨▓ DEC-╤Б╤В╤А╨╛╨║╤Г [] +;[] CursorSet - ╨┐╤А╨╛╤А╨╕╤Б╨╛╨▓╨║╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ [] +;[] CursorRes - ╨▓╨╛╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╡ ╤Н╨║╤А╨░╨╜╨░ ╨┐╨╛╨┤ ╨║╤Г╤А╤Б╨╛╤А╨╛╨╝ [] +;[] Ld_a_bc - ╤З╤В╨╡╨╜╨╕╨╡ ╨▒╨░╨╣╤В╨░ ╨╕╨╖ ╨┐╨░╨╝╤П╤В╨╕ ╤Б ╨┐╤А╨╛╨▓╨╡╤А╨║╨╛╨╣ ╨░╨┤╤А╨╡╤Б╨░, ╨░╨┤╤А╨╡╤Б ╨▓ BC [] +;[] Ld_a_hl - ╤З╤В╨╡╨╜╨╕╨╡ ╨▒╨░╨╣╤В╨░ ╨╕╨╖ ╨┐╨░╨╝╤П╤В╨╕ ╤Б ╨┐╤А╨╛╨▓╨╡╤А╨║╨╛╨╣ ╨░╨┤╤А╨╡╤Б╨░, ╨░╨┤╤А╨╡╤Б ╨▓ HL [] +;[] Ld_hl_a - ╨╖╨░╨┐╨╕╤Б╤М ╨▒╨░╨╣╤В╨░ ╨▓ ╨┐╨░╨╝╤П╤В╤М ╤Б ╨┐╤А╨╛╨▓╨╡╤А╨║╨╛╨╣ ╨░╨┤╤А╨╡╤Б╨░, ╨░╨┤╤А╨╡╤Б ╨▓ HL [] +;[] AdrArea - ╨╛╨┐╤А╨╡╨┤╨╡╨╗╨╡╨╜╨╕╨╡ ╨┐╤А╨╕╨╜╨░╨┤╨╗╨╡╨╢╨╜╨╛╤Б╤В╨╕ ╨░╨┤╤А╨╡╤Б╨░ ╨╛╨▒╨╗╨░╤Б╤В╨╕ ╨┐╨░╨╝╤П╤В╨╕ [] ;[]=========================================================================[] ;[]=========================================================================[] -;[] Сохранение значений регистровых пар [] +;[] ╨б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╕╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╣ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╤Е ╨┐╨░╤А [] ;[]=========================================================================[] SaveAllRegs: ld (Reg._HL),hl @@ -59,22 +59,22 @@ SaveAllRegs: ex af,af' exx - ld hl,WinPage ;сохранение номеров страниц - in a,(EmmWin.P0) ;0-е окно + ld hl,WinPage ;╤Б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╕╨╡ ╨╜╨╛╨╝╨╡╤А╨╛╨▓ ╤Б╤В╤А╨░╨╜╨╕╤Ж + in a,(EmmWin.P0) ;0-╨╡ ╨╛╨║╨╜╨╛ ld (hl),a inc hl - in a,(EmmWin.P1) ;1-е окно + in a,(EmmWin.P1) ;1-╨╡ ╨╛╨║╨╜╨╛ ld (hl),a inc hl - in a,(EmmWin.P2) ;2-е окно + in a,(EmmWin.P2) ;2-╨╡ ╨╛╨║╨╜╨╛ ld (hl),a inc hl - in a,(EmmWin.P3) ;3-е окно + in a,(EmmWin.P3) ;3-╨╡ ╨╛╨║╨╜╨╛ ld (hl),a ret ;[]=========================================================================[] -;[] Востановление значений регистровых пар [] +;[] ╨Т╨╛╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╣ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╤Е ╨┐╨░╤А [] ;[]=========================================================================[] RestAllRegs: ld a,(Reg._IR) @@ -104,25 +104,25 @@ RestAllRegs: ret ;[]=========================================================================[] -;[] Печать строки символов [] -;[] Вход: HL - адрес строки символов [] +;[] ╨Я╨╡╤З╨░╤В╤М ╤Б╤В╤А╨╛╨║╨╕ ╤Б╨╕╨╝╨▓╨╛╨╗╨╛╨▓ [] +;[] ╨Т╤Е╨╛╨┤: HL - ╨░╨┤╤А╨╡╤Б ╤Б╤В╤А╨╛╨║╨╕ ╤Б╨╕╨╝╨▓╨╛╨╗╨╛╨▓ [] ;[] [] -;[] Формат строки: 0x16, Столбец, Строка, Символы, 0x00 [] +;[] ╨д╨╛╤А╨╝╨░╤В ╤Б╤В╤А╨╛╨║╨╕: 0x16, ╨б╤В╨╛╨╗╨▒╨╡╤Ж, ╨б╤В╤А╨╛╨║╨░, ╨б╨╕╨╝╨▓╨╛╨╗╤Л, 0x00 [] ;[]=========================================================================[] - ld a,(Color.Screen) ;основной цвет + ld a,(Color.Screen) ;╨╛╤Б╨╜╨╛╨▓╨╜╨╛╨╣ ╤Ж╨▓╨╡╤В ld (PrnStrColor.L1+5),a PrnStrColor: ld a,(hl) - cp 0x16 ;код установки позиции курсора + cp 0x16 ;╨║╨╛╨┤ ╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨╕ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╕ ╨║╤Г╤А╤Б╨╛╤А╨░ jr nz,.L2 inc hl - ld e,(hl) ;столбец + ld e,(hl) ;╤Б╤В╨╛╨╗╨▒╨╡╤Ж ld a,e ld (PrtXCoord),a inc hl - ld d,(hl) ;строка + ld d,(hl) ;╤Б╤В╤А╨╛╨║╨░ inc hl - ld a,(hl) ;символ + ld a,(hl) ;╤Б╨╕╨╝╨▓╨╛╨╗ .L2 cp 0x0D jr nz,.L3 inc d @@ -137,14 +137,14 @@ PrnStrColor: inc hl ld a,(hl) .L1 or a - ret z ;выход если конец строки + ret z ;╨▓╤Л╤Е╨╛╨┤ ╨╡╤Б╨╗╨╕ ╨║╨╛╨╜╨╡╤Ж ╤Б╤В╤А╨╛╨║╨╕ push hl push de -;печать ч/з биос или дсс? +;╨┐╨╡╤З╨░╤В╤М ╤З/╨╖ ╨▒╨╕╨╛╤Б ╨╕╨╗╨╕ ╨┤╤Б╤Б? ifdef D_PRINTCH_BIOS - ld h,0x03 ;атрибут + ld h,0x03 ;╨░╤В╤А╨╕╨▒╤Г╤В ld l,a - sub a ;идентификатор окна + sub a ;╨╕╨┤╨╡╨╜╤В╨╕╤Д╨╕╨║╨░╤В╨╛╤А ╨╛╨║╨╜╨░ ; ld a,(Demon.Bios_Win) ld bc,SysSymb*256+Bios.Win_Put_Sym rst BiosRst @@ -160,18 +160,18 @@ PrnStrColor: jr PrnStrColor PrtXCoord db 0 ;[]=========================================================================[] -;[] Печать двухбайтового числа [] -;[] Вход: DE - координаты печати [] -;[] HL - значение регистровой пары [] +;[] ╨Я╨╡╤З╨░╤В╤М ╨┤╨▓╤Г╤Е╨▒╨░╨╣╤В╨╛╨▓╨╛╨│╨╛ ╤З╨╕╤Б╨╗╨░ [] +;[] ╨Т╤Е╨╛╨┤: DE - ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨┐╨╡╤З╨░╤В╨╕ [] +;[] HL - ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨╛╨╣ ╨┐╨░╤А╤Л [] ;[]=========================================================================[] PrintReg: di push hl - ld c,Bios.Lp_Set_Place ;установка позиции печати + ld c,Bios.Lp_Set_Place ;╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╕ ╨┐╨╡╤З╨░╤В╨╕ rst BiosRst pop hl - ld a,(DecHex) ;систем счисления + ld a,(DecHex) ;╤Б╨╕╤Б╤В╨╡╨╝ ╤Б╤З╨╕╤Б╨╗╨╡╨╜╨╕╤П or a jr z,.Hex @@ -184,12 +184,12 @@ PrintReg: ld c,l ld a,h call ConvHexStr - ld (.String+1),hl ;старший байт + ld (.String+1),hl ;╤Б╤В╨░╤А╤И╨╕╨╣ ╨▒╨░╨╣╤В ld a,c call ConvHexStr - ld (.String+3),hl ;младший байт -.Print ld hl,.String ;печатаемая строка - ld bc,5*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки + ld (.String+3),hl ;╨╝╨╗╨░╨┤╤И╨╕╨╣ ╨▒╨░╨╣╤В +.Print ld hl,.String ;╨┐╨╡╤З╨░╤В╨░╨╡╨╝╨░╤П ╤Б╤В╤А╨╛╨║╨░ + ld bc,5*256+Bios.Lp_Print_Ln2 ;╨▓ ╤А╨╡╨│.B ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ rst BiosRst ei ret @@ -197,16 +197,16 @@ PrintReg: .String db "#0123" ;[]=========================================================================[] -;[] Печать значения регистровой пары AF и флагов [] -;[] Вход: DE - координаты печати [] -;[] HL - значение регистровой пары [] +;[] ╨Я╨╡╤З╨░╤В╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨╛╨╣ ╨┐╨░╤А╤Л AF ╨╕ ╤Д╨╗╨░╨│╨╛╨▓ [] +;[] ╨Т╤Е╨╛╨┤: DE - ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨┐╨╡╤З╨░╤В╨╕ [] +;[] HL - ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨╛╨╣ ╨┐╨░╤А╤Л [] ;[]=========================================================================[] PrintStrAF: - ld a,h ;значение регистра A + ld a,h ;╨╖╨╜╨░╤З╨╡╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨░ A push hl ld (.String+11),a - ld hl,.String+1 ;двоичное значение + ld hl,.String+1 ;╨┤╨▓╨╛╨╕╤З╨╜╨╛╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╡ push de ld de,0x3031 ;"01" ld b,8 @@ -225,23 +225,23 @@ PrintStrAF: call ReplSymNoPrint pop hl - ld a,l ;флаги + ld a,l ;╤Д╨╗╨░╨│╨╕ push hl ld hl,.Flags ld b,8 - res 3,a ;сброс неизвестных флагов + res 3,a ;╤Б╨▒╤А╨╛╤Б ╨╜╨╡╨╕╨╖╨▓╨╡╤Б╤В╨╜╤Л╤Е ╤Д╨╗╨░╨│╨╛╨▓ res 5,a .L2 rlca jr c,$+6 - set 5,(hl) ;сброшен + set 5,(hl) ;╤Б╨▒╤А╨╛╤И╨╡╨╜ jr $+4 - res 5,(hl) ;установлен + res 5,(hl) ;╤Г╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜ inc hl djnz .L2 pop hl push de - call PrintReg ;печать значения рег.пары + call PrintReg ;╨┐╨╡╤З╨░╤В╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П ╤А╨╡╨│.╨┐╨░╤А╤Л pop de push de ld a,6 @@ -251,7 +251,7 @@ PrintStrAF: di rst BiosRst ld hl,.String - ld bc,13*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки + ld bc,13*256+Bios.Lp_Print_Ln2 ;╨▓ ╤А╨╡╨│.B ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ di rst BiosRst pop de @@ -263,7 +263,7 @@ PrintStrAF: di rst BiosRst ld hl,.Flags - ld bc,8*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки + ld bc,8*256+Bios.Lp_Print_Ln2 ;╨▓ ╤А╨╡╨│.B ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ di rst BiosRst ei @@ -273,16 +273,16 @@ PrintStrAF: .Flags db "SZ.H.PNC" ;[]=========================================================================[] -;[] Печать значений регистровых пар с адресуемыми байтами [] -;[] Вход: DE - координаты печати [] -;[] HL - значение регистровой пары [] +;[] ╨Я╨╡╤З╨░╤В╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╣ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╤Л╤Е ╨┐╨░╤А ╤Б ╨░╨┤╤А╨╡╤Б╤Г╨╡╨╝╤Л╨╝╨╕ ╨▒╨░╨╣╤В╨░╨╝╨╕ [] +;[] ╨Т╤Е╨╛╨┤: DE - ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨┐╨╡╤З╨░╤В╨╕ [] +;[] HL - ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨╛╨▓╨╛╨╣ ╨┐╨░╤А╤Л [] ;[]=========================================================================[] PrintStrReg: push hl ld b,h ld c,l - call Ld_a_bc ;ld a,(bc) адресуемые байты + call Ld_a_bc ;ld a,(bc) ╨░╨┤╤А╨╡╤Б╤Г╨╡╨╝╤Л╨╡ ╨▒╨░╨╣╤В╤Л ld (.String+10),a call ConvHexStr ld (.String),hl @@ -302,22 +302,22 @@ PrintStrReg: call ConvHexStr ld (.String+7),hl - ld hl,.String+10 ;замена непечатных символов + ld hl,.String+10 ;╨╖╨░╨╝╨╡╨╜╨░ ╨╜╨╡╨┐╨╡╤З╨░╤В╨╜╤Л╤Е ╤Б╨╕╨╝╨▓╨╛╨╗╨╛╨▓ ld b,4 call ReplSymNoPrint pop hl push de - call PrintReg ;печать значения рег.пары + call PrintReg ;╨┐╨╡╤З╨░╤В╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П ╤А╨╡╨│.╨┐╨░╤А╤Л pop de di ld a,6 add a,e ld e,a - ld c,Bios.Lp_Set_Place ;установка позиции печати + ld c,Bios.Lp_Set_Place ;╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╕ ╨┐╨╡╤З╨░╤В╨╕ rst BiosRst - ld hl,.String ;печатаемая строка - ld bc,14*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки + ld hl,.String ;╨┐╨╡╤З╨░╤В╨░╨╡╨╝╨░╤П ╤Б╤В╤А╨╛╨║╨░ + ld bc,14*256+Bios.Lp_Print_Ln2 ;╨▓ ╤А╨╡╨│.B ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ rst BiosRst ei ret @@ -325,11 +325,11 @@ PrintStrReg: .String db "0123 4567 ABCD" ;[]=========================================================================[] -;[] Печать номеров банок в окнах [] -;[] Вход: HL - адрес сохраненных номеров [] +;[] ╨Я╨╡╤З╨░╤В╤М ╨╜╨╛╨╝╨╡╤А╨╛╨▓ ╨▒╨░╨╜╨╛╨║ ╨▓ ╨╛╨║╨╜╨░╤Е [] +;[] ╨Т╤Е╨╛╨┤: HL - ╨░╨┤╤А╨╡╤Б ╤Б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╜╤Л╤Е ╨╜╨╛╨╝╨╡╤А╨╛╨▓ [] ;[]=========================================================================[] PrintStrWin: - ld hl,WinPage ;вывод номеров банок в окнах + ld hl,WinPage ;╨▓╤Л╨▓╨╛╨┤ ╨╜╨╛╨╝╨╡╤А╨╛╨▓ ╨▒╨░╨╜╨╛╨║ ╨▓ ╨╛╨║╨╜╨░╤Е ld de,.String+3 ld b,4 .L1 push bc @@ -338,7 +338,7 @@ PrintStrWin: push hl ld l,a ld h,0 - call NumToStr8 ;конвертирование в HEX-строку + call NumToStr8 ;╨║╨╛╨╜╨▓╨╡╤А╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨▓ HEX-╤Б╤В╤А╨╛╨║╤Г inc de inc de inc de @@ -355,15 +355,15 @@ PrintStrWin: db 0x16,0x14,0x12,"#04",0 ;[]=========================================================================[] -;[] Печать глубины стека [] +;[] ╨Я╨╡╤З╨░╤В╤М ╨│╨╗╤Г╨▒╨╕╨╜╤Л ╤Б╤В╨╡╨║╨░ [] ;[]=========================================================================[] PrintSPDn: ld a,(StackDown) ld l,a ld a,0x7F - cp l ;отрицательное? + cp l ;╨╛╤В╤А╨╕╤Ж╨░╤В╨╡╨╗╤М╨╜╨╛╨╡? jr nc,.L1 - res 7,l ;сбросить минус + res 7,l ;╤Б╨▒╤А╨╛╤Б╨╕╤В╤М ╨╝╨╕╨╜╤Г╤Б inc a sub l ld l,a @@ -375,7 +375,7 @@ PrintSPDn: dec hl ld bc,3*256+"0" ld (hl),c - ld a,(hl) ;гашение незначащих нулей + ld a,(hl) ;╨│╨░╤И╨╡╨╜╨╕╨╡ ╨╜╨╡╨╖╨╜╨░╤З╨░╤Й╨╕╤Е ╨╜╤Г╨╗╨╡╨╣ cp c jr nz,$+8 ld a,0x20 @@ -385,16 +385,16 @@ PrintSPDn: ld a,(StackDown) bit 7,a jr z,$+6 - dec hl ;отрицательное число + dec hl ;╨╛╤В╤А╨╕╤Ж╨░╤В╨╡╨╗╤М╨╜╨╛╨╡ ╤З╨╕╤Б╨╗╨╛ ld a,"-" ld (hl),a ld de,0x140A - ld c,Bios.Lp_Set_Place ;установка позиции печати + ld c,Bios.Lp_Set_Place ;╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╕ ╨┐╨╡╤З╨░╤В╨╕ di rst BiosRst - ld hl,.String ;печатаемая строка - ld bc,4*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки + ld hl,.String ;╨┐╨╡╤З╨░╤В╨░╨╡╨╝╨░╤П ╤Б╤В╤А╨╛╨║╨░ + ld bc,4*256+Bios.Lp_Print_Ln2 ;╨▓ ╤А╨╡╨│.B ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ di rst BiosRst ei @@ -403,12 +403,12 @@ PrintSPDn: .String ds 4 ;[]=========================================================================[] -;[] Печать значений стека [] +;[] ╨Я╨╡╤З╨░╤В╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╣ ╤Б╤В╨╡╨║╨░ [] ;[]=========================================================================[] PrintStrSP: - ld a,(.StrSp) ;строка с вершиной стека + ld a,(.StrSp) ;╤Б╤В╤А╨╛╨║╨░ ╤Б ╨▓╨╡╤А╤И╨╕╨╜╨╛╨╣ ╤Б╤В╨╡╨║╨░ inc a - jr z,.L4 ;если вершина стека не попадает в дамп + jr z,.L4 ;╨╡╤Б╨╗╨╕ ╨▓╨╡╤А╤И╨╕╨╜╨░ ╤Б╤В╨╡╨║╨░ ╨╜╨╡ ╨┐╨╛╨┐╨░╨┤╨░╨╡╤В ╨▓ ╨┤╨░╨╝╨┐ ld hl,(Reg._SP) dec hl dec hl @@ -418,39 +418,39 @@ PrintStrSP: jr nz,$-3 ld (StackDump),hl -.L4 ld hl,(StackDump) ;начало дампа - ld de,#1601 ;координаты печати +.L4 ld hl,(StackDump) ;╨╜╨░╤З╨░╨╗╨╛ ╨┤╨░╨╝╨┐╨░ + ld de,#1601 ;╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨┐╨╡╤З╨░╤В╨╕ ld a,-1 ld (.StrSp),a - ld b,8 ;кол-во строк дампа + ld b,8 ;╨║╨╛╨╗-╨▓╨╛ ╤Б╤В╤А╨╛╨║ ╨┤╨░╨╝╨┐╨░ .L3 push bc - push de ;координаты + push de ;╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л push hl - or a ;сброс флага C + or a ;╤Б╨▒╤А╨╛╤Б ╤Д╨╗╨░╨│╨░ C ld a,b - ld bc,(Reg._SP) ;адрес вершины стека + ld bc,(Reg._SP) ;╨░╨┤╤А╨╡╤Б ╨▓╨╡╤А╤И╨╕╨╜╤Л ╤Б╤В╨╡╨║╨░ sbc hl,bc jr nz,.L2 ld b,a ld a,8 sub b - ld (.StrSp),a ;номер строки в дампе с вершиной стека - ld a,(Color._SP) ;цвет вершины стека + ld (.StrSp),a ;╨╜╨╛╨╝╨╡╤А ╤Б╤В╤А╨╛╨║╨╕ ╨▓ ╨┤╨░╨╝╨┐╨╡ ╤Б ╨▓╨╡╤А╤И╨╕╨╜╨╛╨╣ ╤Б╤В╨╡╨║╨░ + ld a,(Color._SP) ;╤Ж╨▓╨╡╤В ╨▓╨╡╤А╤И╨╕╨╜╤Л ╤Б╤В╨╡╨║╨░ jr .L2+3 -.L2 ld a,(Color.Screen) ;основной цвет - ld (.L1+1),a ;записали цвет - ld c,Bios.Lp_Set_Place ;установка позиции печати +.L2 ld a,(Color.Screen) ;╨╛╤Б╨╜╨╛╨▓╨╜╨╛╨╣ ╤Ж╨▓╨╡╤В + ld (.L1+1),a ;╨╖╨░╨┐╨╕╤Б╨░╨╗╨╕ ╤Ж╨▓╨╡╤В + ld c,Bios.Lp_Set_Place ;╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╕ ╨┐╨╡╤З╨░╤В╨╕ di rst BiosRst -.L1 ld e,0 ;цвет подсветки - ld bc,11*256+Bios.Lp_Print_Atr ;в рег.B длина строки +.L1 ld e,0 ;╤Ж╨▓╨╡╤В ╨┐╨╛╨┤╤Б╨▓╨╡╤В╨║╨╕ + ld bc,11*256+Bios.Lp_Print_Atr ;╨▓ ╤А╨╡╨│.B ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ rst BiosRst pop hl pop de push de push hl - call PrintReg ;печать адреса + call PrintReg ;╨┐╨╡╤З╨░╤В╤М ╨░╨┤╤А╨╡╤Б╨░ pop hl pop de push de @@ -470,7 +470,7 @@ PrintStrSP: ld l,a ld h,c - call PrintReg ;печать значения стека + call PrintReg ;╨┐╨╡╤З╨░╤В╤М ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П ╤Б╤В╨╡╨║╨░ pop hl pop de inc d @@ -482,12 +482,12 @@ PrintStrSP: .StrSp db 6 ;[]=========================================================================[] -;[] Печать дампа [] +;[] ╨Я╨╡╤З╨░╤В╤М ╨┤╨░╨╝╨┐╨░ [] ;[]=========================================================================[] PrintDump: - ld de,0x160E ;координаты + ld de,0x160E ;╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ld hl,(Dump1) - ld b,8 ;количество строк + ld b,8 ;╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╤Б╤В╤А╨╛╨║ push de push bc push hl @@ -497,33 +497,33 @@ PrintDump: add hl,bc pop bc pop de - inc d ;следующая строка + inc d ;╤Б╨╗╨╡╨┤╤Г╤О╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ djnz $-14 ret - ld hl,Dump ;вывод дампа -; ld de,0x160E ;координаты - ld b,8 ;количество строк + ld hl,Dump ;╨▓╤Л╨▓╨╛╨┤ ╨┤╨░╨╝╨┐╨░ +; ld de,0x160E ;╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л + ld b,8 ;╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╤Б╤В╤А╨╛╨║ push de push bc - ld c,(hl) ;младший байт адреса + ld c,(hl) ;╨╝╨╗╨░╨┤╤И╨╕╨╣ ╨▒╨░╨╣╤В ╨░╨┤╤А╨╡╤Б╨░ inc hl push hl - ld h,(hl) ;старший байт адреса + ld h,(hl) ;╤Б╤В╨░╤А╤И╨╕╨╣ ╨▒╨░╨╣╤В ╨░╨┤╤А╨╡╤Б╨░ ld l,c call PrintStrDump pop hl inc hl pop bc pop de - inc d ;следующая строка + inc d ;╤Б╨╗╨╡╨┤╤Г╤О╤Й╨░╤П ╤Б╤В╤А╨╛╨║╨░ djnz $-15 ret ;[]=========================================================================[] -;[] Печать строки дампа [] -;[] Вход: DE - координаты печати [] -;[] HL - адрес начала строки [] +;[] ╨Я╨╡╤З╨░╤В╤М ╤Б╤В╤А╨╛╨║╨╕ ╨┤╨░╨╝╨┐╨░ [] +;[] ╨Т╤Е╨╛╨┤: DE - ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨┐╨╡╤З╨░╤В╨╕ [] +;[] HL - ╨░╨┤╤А╨╡╤Б ╨╜╨░╤З╨░╨╗╨░ ╤Б╤В╤А╨╛╨║╨╕ [] ;[]=========================================================================[] PrintStrDump: push de @@ -566,21 +566,21 @@ PrintStrDump: ld b,16 pop hl - call ReplSymNoPrint ;замена непечатных символов + call ReplSymNoPrint ;╨╖╨░╨╝╨╡╨╜╨░ ╨╜╨╡╨┐╨╡╤З╨░╤В╨╜╤Л╤Е ╤Б╨╕╨╝╨▓╨╛╨╗╨╛╨▓ pop hl pop de push de - call PrintReg ;печать адреса строки + call PrintReg ;╨┐╨╡╤З╨░╤В╤М ╨░╨┤╤А╨╡╤Б╨░ ╤Б╤В╤А╨╛╨║╨╕ pop de di ld a,7 add a,e ld e,a - ld c,Bios.Lp_Set_Place ;установка позиции печати + ld c,Bios.Lp_Set_Place ;╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╕ ╨┐╨╡╤З╨░╤В╨╕ rst BiosRst ld hl,.String - ld bc,57*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки + ld bc,57*256+Bios.Lp_Print_Ln2 ;╨▓ ╤А╨╡╨│.B ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ rst BiosRst ei ret @@ -589,9 +589,9 @@ PrintStrDump: db "0123456789ABCDEF" ;[]=========================================================================[] -;[] Замена непечатных символов в строке [] -;[] Вход: B - длина строки [] -;[] HL - адрес начала строки [] +;[] ╨Ч╨░╨╝╨╡╨╜╨░ ╨╜╨╡╨┐╨╡╤З╨░╤В╨╜╤Л╤Е ╤Б╨╕╨╝╨▓╨╛╨╗╨╛╨▓ ╨▓ ╤Б╤В╤А╨╛╨║╨╡ [] +;[] ╨Т╤Е╨╛╨┤: B - ╨┤╨╗╨╕╨╜╨░ ╤Б╤В╤А╨╛╨║╨╕ [] +;[] HL - ╨░╨┤╤А╨╡╤Б ╨╜╨░╤З╨░╨╗╨░ ╤Б╤В╤А╨╛╨║╨╕ [] ;[]=========================================================================[] ReplSymNoPrint: ld a,(SymbolNoPrint) @@ -609,12 +609,12 @@ ReplSymNoPrint: ret ;[]=========================================================================[] -;[] Формирование 16-тибитного числа [] -;[] Вход: DE - адрес буфера [] -;[] HL - число [] +;[] ╨д╨╛╤А╨╝╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ 16-╤В╨╕╨▒╨╕╤В╨╜╨╛╨│╨╛ ╤З╨╕╤Б╨╗╨░ [] +;[] ╨Т╤Е╨╛╨┤: DE - ╨░╨┤╤А╨╡╤Б ╨▒╤Г╤Д╨╡╤А╨░ [] +;[] HL - ╤З╨╕╤Б╨╗╨╛ [] ;[]=========================================================================[] NumToStr16: - ld a,(DecHex) ;систем счисления + ld a,(DecHex) ;╤Б╨╕╤Б╤В╨╡╨╝ ╤Б╤З╨╕╤Б╨╗╨╡╨╜╨╕╤П or a jp nz,ConvDecStr @@ -625,7 +625,7 @@ NumToStr16: ld a,h call ConvHexStr ex de,hl - ld (hl),e ;старший байт + ld (hl),e ;╤Б╤В╨░╤А╤И╨╕╨╣ ╨▒╨░╨╣╤В inc hl ld (hl),d inc hl @@ -633,7 +633,7 @@ NumToStr16: ld a,c call ConvHexStr ex de,hl - ld (hl),e ;младший байт + ld (hl),e ;╨╝╨╗╨░╨┤╤И╨╕╨╣ ╨▒╨░╨╣╤В inc hl ld (hl),d inc hl @@ -641,12 +641,12 @@ NumToStr16: ret ;[]=========================================================================[] -;[] Формирование 8-битного числа [] -;[] Вход: DE - адрес буфера [] -;[] HL - число [] +;[] ╨д╨╛╤А╨╝╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ 8-╨▒╨╕╤В╨╜╨╛╨│╨╛ ╤З╨╕╤Б╨╗╨░ [] +;[] ╨Т╤Е╨╛╨┤: DE - ╨░╨┤╤А╨╡╤Б ╨▒╤Г╤Д╨╡╤А╨░ [] +;[] HL - ╤З╨╕╤Б╨╗╨╛ [] ;[]=========================================================================[] NumToStr8: - ld a,(DecHex) ;систем счисления + ld a,(DecHex) ;╤Б╨╕╤Б╤В╨╡╨╝ ╤Б╤З╨╕╤Б╨╗╨╡╨╜╨╕╤П or a jp nz,ConvDecStr8 @@ -664,9 +664,9 @@ NumToStr8: ret ;[]=========================================================================[] -;[] Конвертирование числа в HEX-строку [] -;[] Вход: A - число [] -;[] Выход: HL - HEX-строка [] +;[] ╨Ъ╨╛╨╜╨▓╨╡╤А╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╤З╨╕╤Б╨╗╨░ ╨▓ HEX-╤Б╤В╤А╨╛╨║╤Г [] +;[] ╨Т╤Е╨╛╨┤: A - ╤З╨╕╤Б╨╗╨╛ [] +;[] ╨Т╤Л╤Е╨╛╨┤: HL - HEX-╤Б╤В╤А╨╛╨║╨░ [] ;[]=========================================================================[] ConvHexStr: push af @@ -691,9 +691,9 @@ ConvHexStr: ret ;[]=========================================================================[] -;[] Конвертирование 16-битного числа в DEC-строку [] -;[] Вход: HL - число [] -;[] DE - адрес начала DEC-строки [] +;[] ╨Ъ╨╛╨╜╨▓╨╡╤А╤В╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ 16-╨▒╨╕╤В╨╜╨╛╨│╨╛ ╤З╨╕╤Б╨╗╨░ ╨▓ DEC-╤Б╤В╤А╨╛╨║╤Г [] +;[] ╨Т╤Е╨╛╨┤: HL - ╤З╨╕╤Б╨╗╨╛ [] +;[] DE - ╨░╨┤╤А╨╡╤Б ╨╜╨░╤З╨░╨╗╨░ DEC-╤Б╤В╤А╨╛╨║╨╕ [] ;[]=========================================================================[] ConvDecStr: ld bc,-10000 @@ -744,15 +744,15 @@ ConvDecStr8_1: ret ;[]=========================================================================[] -;[] Прорисовка курсора [] -;[] Вход: B - длина курсора [] -;[] HL - координаты курсора [] +;[] ╨Я╤А╨╛╤А╨╕╤Б╨╛╨▓╨║╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ [] +;[] ╨Т╤Е╨╛╨┤: B - ╨┤╨╗╨╕╨╜╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ [] +;[] HL - ╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨║╤Г╤А╤Б╨╛╤А╨░ [] ;[]=========================================================================[] CursorSet: ld (CursorRes+1),hl ex de,hl - ld l,b ;размер по вертикали - ld h,1 ;размер по горизонтали + ld l,b ;╤А╨░╨╖╨╝╨╡╤А ╨┐╨╛ ╨▓╨╡╤А╤В╨╕╨║╨░╨╗╨╕ + ld h,1 ;╤А╨░╨╖╨╝╨╡╤А ╨┐╨╛ ╨│╨╛╤А╨╕╨╖╨╛╨╜╤В╨░╨╗╨╕ ld (CursorRes+4),hl ld ix,.Buffer push de @@ -761,7 +761,7 @@ CursorSet: push bc ifdef D_PRINTCH_BIOS xor a - ld c,Bios.Win_Copy_Win ;копирование в буфер + ld c,Bios.Win_Copy_Win ;╨║╨╛╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨▓ ╨▒╤Г╤Д╨╡╤А di rst BiosRst ei @@ -772,15 +772,15 @@ CursorSet: rst DssRst endif - pop bc ;в B длина курсора + pop bc ;╨▓ B ╨┤╨╗╨╕╨╜╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ pop hl push hl inc hl - ld a,(hl) ;цвет символов + ld a,(hl) ;╤Ж╨▓╨╡╤В ╤Б╨╕╨╝╨▓╨╛╨╗╨╛╨▓ ld (CursorRes.L1+1),a ld a,(Color.Cursor) .L1 ld (hl),a - inc hl ;к байту цвета + inc hl ;╨║ ╨▒╨░╨╣╤В╤Г ╤Ж╨▓╨╡╤В╨░ inc hl djnz .L1 @@ -789,7 +789,7 @@ CursorSet: pop de ifdef D_PRINTCH_BIOS xor a - ld c,Bios.Win_Restore_Win ;вывод курсора на экран + ld c,Bios.Win_Restore_Win ;╨▓╤Л╨▓╨╛╨┤ ╨║╤Г╤А╤Б╨╛╤А╨░ ╨╜╨░ ╤Н╨║╤А╨░╨╜ di rst BiosRst ei @@ -801,115 +801,115 @@ CursorSet: endif ret -.Buffer ds 22*2 ;max длина курсора +.Buffer ds 22*2 ;max ╨┤╨╗╨╕╨╜╨░ ╨║╤Г╤А╤Б╨╛╤А╨░ ;[]=========================================================================[] -;[] Востановление экрана под курсором [] +;[] ╨Т╨╛╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╡ ╤Н╨║╤А╨░╨╜╨░ ╨┐╨╛╨┤ ╨║╤Г╤А╤Б╨╛╤А╨╛╨╝ [] ;[]=========================================================================[] CursorRes: - ld de,0 ;координаты - ld hl,0 ;размер - ld b,l ;длина + ld de,0 ;╨║╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л + ld hl,0 ;╤А╨░╨╖╨╝╨╡╤А + ld b,l ;╨┤╨╗╨╕╨╜╨░ push de push hl ld hl,CursorSet.Buffer push hl -.L1 ld a,0 ;цвет - inc hl ;к байту цвета +.L1 ld a,0 ;╤Ж╨▓╨╡╤В + inc hl ;╨║ ╨▒╨░╨╣╤В╤Г ╤Ж╨▓╨╡╤В╨░ jr CursorSet.L1 ;[]=========================================================================[] -;[] Чтение байта из памяти с проверкой адреса [] -;[] Вход: BC или HL - адрес в памяти [] -;[] Выход: A - считанный байт [] +;[] ╨з╤В╨╡╨╜╨╕╨╡ ╨▒╨░╨╣╤В╨░ ╨╕╨╖ ╨┐╨░╨╝╤П╤В╨╕ ╤Б ╨┐╤А╨╛╨▓╨╡╤А╨║╨╛╨╣ ╨░╨┤╤А╨╡╤Б╨░ [] +;[] ╨Т╤Е╨╛╨┤: BC ╨╕╨╗╨╕ HL - ╨░╨┤╤А╨╡╤Б ╨▓ ╨┐╨░╨╝╤П╤В╨╕ [] +;[] ╨Т╤Л╤Е╨╛╨┤: A - ╤Б╤З╨╕╤В╨░╨╜╨╜╤Л╨╣ ╨▒╨░╨╣╤В [] ;[]=========================================================================[] Ld_a_bc: - ld a,11000000b ;проверка диапазона + ld a,11000000b ;╨┐╤А╨╛╨▓╨╡╤А╨║╨░ ╨┤╨╕╨░╨┐╨░╨╖╨╛╨╜╨░ and b - jr z,.L1 ;в 0-м окне - cp 10000000b ;во 2-ом окне + jr z,.L1 ;╨▓ 0-╨╝ ╨╛╨║╨╜╨╡ + cp 10000000b ;╨▓╨╛ 2-╨╛╨╝ ╨╛╨║╨╜╨╡ ld a,(bc) - ret nz ;возвращаем байт, если нет - ld a,(WinPage+2) ;номер банки под отладчиком - out (EmmWin.P3),a ;в третье окно ее - set 6,b ;корректируем адрес - ld a,(bc) ;читаем байт - res 6,b ;востанавливаем адрес + ret nz ;╨▓╨╛╨╖╨▓╤А╨░╤Й╨░╨╡╨╝ ╨▒╨░╨╣╤В, ╨╡╤Б╨╗╨╕ ╨╜╨╡╤В + ld a,(WinPage+2) ;╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨┐╨╛╨┤ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨╛╨╝ + out (EmmWin.P3),a ;╨▓ ╤В╤А╨╡╤В╤М╨╡ ╨╛╨║╨╜╨╛ ╨╡╨╡ + set 6,b ;╨║╨╛╤А╤А╨╡╨║╤В╨╕╤А╤Г╨╡╨╝ ╨░╨┤╤А╨╡╤Б + ld a,(bc) ;╤З╨╕╤В╨░╨╡╨╝ ╨▒╨░╨╣╤В + res 6,b ;╨▓╨╛╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ ╨░╨┤╤А╨╡╤Б jr Ld_a_hl.L1 -.L1 ld a,(WinPage) ;номер банки в 0-м - out (EmmWin.P3),a ;в третье окно ее - set 6,b ;корректируем адрес +.L1 ld a,(WinPage) ;╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨▓ 0-╨╝ + out (EmmWin.P3),a ;╨▓ ╤В╤А╨╡╤В╤М╨╡ ╨╛╨║╨╜╨╛ ╨╡╨╡ + set 6,b ;╨║╨╛╤А╤А╨╡╨║╤В╨╕╤А╤Г╨╡╨╝ ╨░╨┤╤А╨╡╤Б set 7,b - ld a,(bc) ;читаем байт - res 6,b ;востанавливаем адрес + ld a,(bc) ;╤З╨╕╤В╨░╨╡╨╝ ╨▒╨░╨╣╤В + res 6,b ;╨▓╨╛╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ ╨░╨┤╤А╨╡╤Б res 7,b jr Ld_a_hl.L1 Ld_a_hl: - ld a,11000000b ;проверка диапазона + ld a,11000000b ;╨┐╤А╨╛╨▓╨╡╤А╨║╨░ ╨┤╨╕╨░╨┐╨░╨╖╨╛╨╜╨░ and h - jr z,.L2 ;в 0-м окне - cp 10000000b ;во 2-ом окне + jr z,.L2 ;╨▓ 0-╨╝ ╨╛╨║╨╜╨╡ + cp 10000000b ;╨▓╨╛ 2-╨╛╨╝ ╨╛╨║╨╜╨╡ ld a,(hl) - ret nz ;возвращаем байт, если нет - ld a,(WinPage+2) ;номер банки под отладчиком - out (EmmWin.P3),a ;в третье окно ее - set 6,h ;корректируем адрес - ld a,(hl) ;читаем байт - res 6,h ;востанавливаем адрес + ret nz ;╨▓╨╛╨╖╨▓╤А╨░╤Й╨░╨╡╨╝ ╨▒╨░╨╣╤В, ╨╡╤Б╨╗╨╕ ╨╜╨╡╤В + ld a,(WinPage+2) ;╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨┐╨╛╨┤ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨╛╨╝ + out (EmmWin.P3),a ;╨▓ ╤В╤А╨╡╤В╤М╨╡ ╨╛╨║╨╜╨╛ ╨╡╨╡ + set 6,h ;╨║╨╛╤А╤А╨╡╨║╤В╨╕╤А╤Г╨╡╨╝ ╨░╨┤╤А╨╡╤Б + ld a,(hl) ;╤З╨╕╤В╨░╨╡╨╝ ╨▒╨░╨╣╤В + res 6,h ;╨▓╨╛╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ ╨░╨┤╤А╨╡╤Б jr .L1 -.L2 ld a,(WinPage) ;номер банки в 0-м окне - out (EmmWin.P3),a ;в третье окно ее - set 6,h ;корректируем адрес +.L2 ld a,(WinPage) ;╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨▓ 0-╨╝ ╨╛╨║╨╜╨╡ + out (EmmWin.P3),a ;╨▓ ╤В╤А╨╡╤В╤М╨╡ ╨╛╨║╨╜╨╛ ╨╡╨╡ + set 6,h ;╨║╨╛╤А╤А╨╡╨║╤В╨╕╤А╤Г╨╡╨╝ ╨░╨┤╤А╨╡╤Б set 7,h - ld a,(hl) ;читаем байт - res 6,h ;востанавливаем адрес + ld a,(hl) ;╤З╨╕╤В╨░╨╡╨╝ ╨▒╨░╨╣╤В + res 6,h ;╨▓╨╛╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ ╨░╨┤╤А╨╡╤Б res 7,h .L1 push af - ld a,(WinPage+3) ;номер банки из 3-го окна - out (EmmWin.P3),a ;востанавливаем + ld a,(WinPage+3) ;╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨╕╨╖ 3-╨│╨╛ ╨╛╨║╨╜╨░ + out (EmmWin.P3),a ;╨▓╨╛╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ pop af ret ;[]=========================================================================[] -;[] Запись байта в память с проверкой адреса [] -;[] Вход: HL - адрес в памяти [] -;[] A - записываемый байт [] +;[] ╨Ч╨░╨┐╨╕╤Б╤М ╨▒╨░╨╣╤В╨░ ╨▓ ╨┐╨░╨╝╤П╤В╤М ╤Б ╨┐╤А╨╛╨▓╨╡╤А╨║╨╛╨╣ ╨░╨┤╤А╨╡╤Б╨░ [] +;[] ╨Т╤Е╨╛╨┤: HL - ╨░╨┤╤А╨╡╤Б ╨▓ ╨┐╨░╨╝╤П╤В╨╕ [] +;[] A - ╨╖╨░╨┐╨╕╤Б╤Л╨▓╨░╨╡╨╝╤Л╨╣ ╨▒╨░╨╣╤В [] ;[]=========================================================================[] Ld_hl_a: push af - ld a,11000000b ;проверка диапазона + ld a,11000000b ;╨┐╤А╨╛╨▓╨╡╤А╨║╨░ ╨┤╨╕╨░╨┐╨░╨╖╨╛╨╜╨░ and h - jr z,.L2 ;в 0-ом окне - cp 10000000b ;во 2-ом окне? + jr z,.L2 ;╨▓ 0-╨╛╨╝ ╨╛╨║╨╜╨╡ + cp 10000000b ;╨▓╨╛ 2-╨╛╨╝ ╨╛╨║╨╜╨╡? jr z,.L1 pop af - ld (hl),a ;записали байт, если нет + ld (hl),a ;╨╖╨░╨┐╨╕╤Б╨░╨╗╨╕ ╨▒╨░╨╣╤В, ╨╡╤Б╨╗╨╕ ╨╜╨╡╤В ret -.L1 ld a,(WinPage+2) ;номер банки под отладчиком - out (EmmWin.P3),a ;в третье окно ее - set 6,h ;корректируем адрес +.L1 ld a,(WinPage+2) ;╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨┐╨╛╨┤ ╨╛╤В╨╗╨░╨┤╤З╨╕╨║╨╛╨╝ + out (EmmWin.P3),a ;╨▓ ╤В╤А╨╡╤В╤М╨╡ ╨╛╨║╨╜╨╛ ╨╡╨╡ + set 6,h ;╨║╨╛╤А╤А╨╡╨║╤В╨╕╤А╤Г╨╡╨╝ ╨░╨┤╤А╨╡╤Б pop af - ld (hl),a ;пишем байт + ld (hl),a ;╨┐╨╕╤И╨╡╨╝ ╨▒╨░╨╣╤В jr .L3 -.L2 ld a,(WinPage) ;номер банки в 0-ом - out (EmmWin.P3),a ;в третье окно ее - set 6,h ;корректируем адрес +.L2 ld a,(WinPage) ;╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨▓ 0-╨╛╨╝ + out (EmmWin.P3),a ;╨▓ ╤В╤А╨╡╤В╤М╨╡ ╨╛╨║╨╜╨╛ ╨╡╨╡ + set 6,h ;╨║╨╛╤А╤А╨╡╨║╤В╨╕╤А╤Г╨╡╨╝ ╨░╨┤╤А╨╡╤Б set 7,h pop af - ld (hl),a ;пишем байт - res 7,h ;востанавливаем адрес + ld (hl),a ;╨┐╨╕╤И╨╡╨╝ ╨▒╨░╨╣╤В + res 7,h ;╨▓╨╛╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ ╨░╨┤╤А╨╡╤Б .L3 res 6,h - ld a,(WinPage+3) ;номер банки из 3-го окна - out (EmmWin.P3),a ;востанавливаем + ld a,(WinPage+3) ;╨╜╨╛╨╝╨╡╤А ╨▒╨░╨╜╨║╨╕ ╨╕╨╖ 3-╨│╨╛ ╨╛╨║╨╜╨░ + out (EmmWin.P3),a ;╨▓╨╛╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ ret ;[]=========================================================================[] -;[] Определение принадлежности адреса области памяти [] -;[] Вход: HL - нижний адрес области памяти [] -;[] DE - верхний адрес области памяти [] -;[] BC - адрес [] -;[] Выход: флаг C - адрес не принадлежит области памяти [] -;[] флаг NC - адрес принадлежит области памяти [] +;[] ╨Ю╨┐╤А╨╡╨┤╨╡╨╗╨╡╨╜╨╕╨╡ ╨┐╤А╨╕╨╜╨░╨┤╨╗╨╡╨╢╨╜╨╛╤Б╤В╨╕ ╨░╨┤╤А╨╡╤Б╨░ ╨╛╨▒╨╗╨░╤Б╤В╨╕ ╨┐╨░╨╝╤П╤В╨╕ [] +;[] ╨Т╤Е╨╛╨┤: HL - ╨╜╨╕╨╢╨╜╨╕╨╣ ╨░╨┤╤А╨╡╤Б ╨╛╨▒╨╗╨░╤Б╤В╨╕ ╨┐╨░╨╝╤П╤В╨╕ [] +;[] DE - ╨▓╨╡╤А╤Е╨╜╨╕╨╣ ╨░╨┤╤А╨╡╤Б ╨╛╨▒╨╗╨░╤Б╤В╨╕ ╨┐╨░╨╝╤П╤В╨╕ [] +;[] BC - ╨░╨┤╤А╨╡╤Б [] +;[] ╨Т╤Л╤Е╨╛╨┤: ╤Д╨╗╨░╨│ C - ╨░╨┤╤А╨╡╤Б ╨╜╨╡ ╨┐╤А╨╕╨╜╨░╨┤╨╗╨╡╨╢╨╕╤В ╨╛╨▒╨╗╨░╤Б╤В╨╕ ╨┐╨░╨╝╤П╤В╨╕ [] +;[] ╤Д╨╗╨░╨│ NC - ╨░╨┤╤А╨╡╤Б ╨┐╤А╨╕╨╜╨░╨┤╨╗╨╡╨╢╨╕╤В ╨╛╨▒╨╗╨░╤Б╤В╨╕ ╨┐╨░╨╝╤П╤В╨╕ [] ;[]=========================================================================[] AdrArea: or a diff --git a/windows.asm b/windows.asm index 2f40c3c..94fe957 100644 --- a/windows.asm +++ b/windows.asm @@ -1,349 +1,370 @@ - -;IX - WINDOW DESCRIPTOR -;+0 - FLAG: +; ------------------------------------------------------ +; IX - WINDOW DESCRIPTOR +; +0 - FLAG: ; BITS: 0 - STANDART WINDOW ; 1 - 0 - WITHOUT HEADER / 1 - WITH HEADER ; 2 - 0 - ORDINARY FRAME / 1 - DOUBLE FRAME -;+1 - X COORD -;+2 - Y COORD -;+3 - LENGHT -;+4 - HEIGHT -;+5 - ATTR +; +1 - X COORD +; +2 - Y COORD +; +3 - LENGHT +; +4 - HEIGHT +; +5 - ATTR +; ------------------------------------------------------ +Windows + BIT 0,(IX+0) + JR Z,NO_STAND_WIN + LD A,(IX+1) + LD DE,-4 + ADD IX,DE + PUSH IX + LD IX,STANDART + LD (IX+5),A + JR STAND_WIN -Windows BIT 0,(IX+0) - JR Z,NO_STAND_WIN - LD A,(IX+1) - LD DE,-4 - ADD IX,DE - PUSH IX - LD IX,STANDART - LD (IX+5),A - JR STAND_WIN NO_STAND_WIN - PUSH IX + PUSH IX + STAND_WIN - CALL Rectang - CALL Frame - BIT 1,(IX+0) - CALL NZ,WinHeader - POP HL -; PUSH HL - LD DE,6 - ADD HL,DE - bit 1,(ix+0) - ld a,(IX+5) - jr z,WinNoHeader - RRCA - RRCA - RRCA - RRCA - AND #7F - ld (PrnStrColor.L1+5),a - push hl - call MenuItemLen - ld a,(ix+3) - sbc a,b - ld e,(ix+1) - and a - rra - add a,e - ld e,a - ld d,(ix+2) - pop hl - CALL PrnStrColor - inc hl - ld a,(IX+5) + CALL Rectang + CALL Frame + BIT 1,(IX+0) + CALL NZ,WinHeader + POP HL +; PUSH HL + LD DE,6 + ADD HL,DE + bit 1,(ix+0) + ld a,(IX+5) + jr z,WinNoHeader + RRCA + RRCA + RRCA + RRCA + AND 0x7F + ld (PrnStrColor.L1+5),a + push hl + call MenuItemLen + ld a,(ix+3) + sbc a,b + ld e,(ix+1) + and a + rra + add a,e + ld e,a + ld d,(ix+2) + pop hl + CALL PrnStrColor + inc hl + ld a,(IX+5) WinNoHeader - ld (PrnStrColor.L1+5),a - ld d,(ix+2) ;╩ююЁфшэрЄ√ т юъэх - ld e,(ix+1) - inc d - inc d - inc e - inc e - ld a,e - ld (PrtXCoord),a -; LD (WINDOW_TXT),HL - CALL PrnStrColor -; EX (DE),HL - RET + ld (PrnStrColor.L1+5),a + ld d,(ix+2) ; ╨Ъ╨╛╨╛╤А╨┤╨╕╨╜╨░╤В╤Л ╨▓ ╨╛╨║╨╜╨╡ + ld e,(ix+1) + inc d + inc d + inc e + inc e + ld a,e + ld (PrtXCoord),a +; LD (WINDOW_TXT),HL + CALL PrnStrColor +; EX (DE),HL + RET -;╨шёютрэшх чруюыютър юъэр +; ------------------------------------------------------ +; ╨а╨╕╤Б╨╛╨▓╨░╨╜╨╕╨╡ ╨╖╨░╨│╨╛╨╗╨╛╨▓╨║╨░ ╨╛╨║╨╜╨░ +; ------------------------------------------------------ WinHeader - LD E,(IX+1) - LD D,(IX+2) - LD L,(IX+3) - LD H,1 - LD A,(IX+5) - RRCA - RRCA - RRCA - RRCA - AND #7F - LD B,A - LD A,#20 - CALL FillBox - RET + LD E,(IX+1) + LD D,(IX+2) + LD L,(IX+3) + LD H,1 + LD A,(IX+5) + RRCA + RRCA + RRCA + RRCA + AND 0x7F + LD B,A + LD A,0x20 + CALL FillBox + RET -;╧ЁюЎхфєЁр юётюсюцфхэш  яЁ ьюєуюы№эющ яыю∙рфш юъэр -;═р тїюф: IX - рфЁхё юяшёрЄхы  -Rectang LD E,(IX+1) - LD D,(IX+2) - LD H,(IX+4) - LD L,(IX+3) - LD B,(IX+5) - LD A,#20 - CALL FillBox - RET +; ------------------------------------------------------ +; ╨Я╤А╨╛╤Ж╨╡╨┤╤Г╤А╨░ ╨╛╤Б╨▓╨╛╨▒╨╛╨╢╨┤╨╡╨╜╨╕╤П ╨┐╤А╤П╨╝╨╛╤Г╨│╨╛╨╗╤М╨╜╨╛╨╣ ╨┐╨╗╨╛╤Й╨░╨┤╨╕ ╨╛╨║╨╜╨░ +; ╨Э╨░ ╨▓╤Е╨╛╨┤: IX - ╨░╨┤╤А╨╡╤Б ╨╛╨┐╨╕╤Б╨░╤В╨╡╨╗╤П +; ------------------------------------------------------ +Rectang + LD E,(IX+1) + LD D,(IX+2) + LD H,(IX+4) + LD L,(IX+3) + LD B,(IX+5) + LD A,0x20 + CALL FillBox + RET -FillBox PUSH HL - PUSH DE -FillB1 LD C,Dss.WrChar - RST DssRst - INC E - DEC L - JR NZ,FillB1 - POP DE - POP HL - INC D - DEC H - JR NZ,FillBox - RET +FillBox PUSH HL + PUSH DE +FillB1 LD C,Dss.WrChar + RST DssRst + INC E + DEC L + JR NZ,FillB1 + POP DE + POP HL + INC D + DEC H + JR NZ,FillBox + RET -Frame LD HL,FrameType1 - BIT 2,(IX+0) ;windows type flag - JR Z,Frame1 - LD HL,FrameType2 -Frame1 LD D,(IX+2) - LD E,(IX+1) - LD B,(IX+5) - PUSH DE - PUSH HL -; PUSH BC - LD A,(HL) - LD C,Dss.WrChar - RST DssRst -; POP BC - POP HL - POP DE - LD A,(IX+3) - DEC A - ADD A,E - LD E,A - INC HL - LD A,(HL) - LD C,Dss.WrChar - PUSH DE - PUSH HL - RST DssRst - POP HL - POP DE - LD A,(IX+4) - DEC A - ADD A,D - LD D,A - INC HL - LD A,(HL) - PUSH DE - PUSH HL - LD C,Dss.WrChar - RST DssRst - POP HL - POP DE - LD E,(IX+1) - INC HL - LD A,(HL) - LD C,Dss.WrChar - RST DssRst -;HORIZONTAL LINES - INC HL - LD A,(HL) - LD (FramHor),A - INC HL - PUSH HL - LD H,(IX+2) - LD A,(IX+4) - DEC A - ADD A,H - LD L,A - LD A,(IX+3) - SUB 2 - LD C,Dss.WrChar - LD E,(IX+1) - INC E - LD B,(IX+5) -FramHl1 PUSH AF - PUSH HL - LD D,H - LD A,0 -FramHor EQU $-1 - PUSH AF - RST DssRst - POP AF - LD D,L - RST DssRst - POP HL - POP AF - INC E - DEC A - JR NZ,FramHl1 - POP HL -;VERTICAL LINES - LD A,(HL) - LD (FramVer),A - LD H,(IX+1) - LD A,(IX+3) - DEC A - ADD A,H - LD L,A - LD A,(IX+4) - SUB 2 - LD C,Dss.WrChar - LD D,(IX+2) - INC D - LD B,(IX+5) -FramVl1 PUSH AF - PUSH HL - LD E,H - LD A,0 -FramVer EQU $-1 - PUSH AF - RST DssRst - POP AF - LD E,L - RST DssRst - POP HL - POP AF - INC D - DEC A - JR NZ,FramVl1 - RET +Frame + LD HL,FrameType1 + BIT 2,(IX+0) ; windows type flag + JR Z,Frame1 + LD HL,FrameType2 +Frame1 LD D,(IX+2) + LD E,(IX+1) + LD B,(IX+5) + PUSH DE + PUSH HL +; PUSH BC + LD A,(HL) + LD C,Dss.WrChar + RST DssRst +; POP BC + POP HL + POP DE + LD A,(IX+3) + DEC A + ADD A,E + LD E,A + INC HL + LD A,(HL) + LD C,Dss.WrChar + PUSH DE + PUSH HL + RST DssRst + POP HL + POP DE + LD A,(IX+4) + DEC A + ADD A,D + LD D,A + INC HL + LD A,(HL) + PUSH DE + PUSH HL + LD C,Dss.WrChar + RST DssRst + POP HL + POP DE + LD E,(IX+1) + INC HL + LD A,(HL) + LD C,Dss.WrChar + RST DssRst + ; HORIZONTAL LINES + INC HL + LD A,(HL) + LD (FramHor),A + INC HL + PUSH HL + LD H,(IX+2) + LD A,(IX+4) + DEC A + ADD A,H + LD L,A + LD A,(IX+3) + SUB 2 + LD C,Dss.WrChar + LD E,(IX+1) + INC E + LD B,(IX+5) +FramHl1 PUSH AF + PUSH HL + LD D,H +FramHor+* LD A,0 +;FramHor EQU $-1 + PUSH AF + RST DssRst + POP AF + LD D,L + RST DssRst + POP HL + POP AF + INC E + DEC A + JR NZ,FramHl1 + POP HL + ; VERTICAL LINES + LD A,(HL) + LD (FramVer),A + LD H,(IX+1) + LD A,(IX+3) + DEC A + ADD A,H + LD L,A + LD A,(IX+4) + SUB 2 + LD C,Dss.WrChar + LD D,(IX+2) + INC D + LD B,(IX+5) +FramVl1 PUSH AF + PUSH HL + LD E,H +FramVer+* LD A,0 +;FramVer EQU $-1 + PUSH AF + RST DssRst + POP AF + LD E,L + RST DssRst + POP HL + POP AF + INC D + DEC A + JR NZ,FramVl1 + RET -;╦╚╤╥└┼╥ ─╬ ╤╦┼─╙▐┘┼├╬ ╧╙═╩╥└ ╠┼═▐ +; ------------------------------------------------------ +; ╨Ы╨Ш╨б╨в╨Р╨Х╨в ╨Ф╨Ю ╨б╨Ы╨Х╨Ф╨г╨о╨й╨Х╨У╨Ю ╨Я╨г╨Э╨Ъ╨в╨Р ╨Ь╨Х╨Э╨о +; ------------------------------------------------------ MenuItemLen - LD B,0 + LD B,0 NextMnuItem - LD A,(HL) - INC HL - AND A - RET Z - INC B - JR NextMnuItem + LD A,(HL) + INC HL + AND A + RET Z + INC B + JR NextMnuItem -;╧ЁюЁшёютър юъэр ш юсЁрсюЄър фшрыюур +; ------------------------------------------------------ +; ╨Я╤А╨╛╤А╨╕╤Б╨╛╨▓╨║╨░ ╨╛╨║╨╜╨░ ╨╕ ╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨┤╨╕╨░╨╗╨╛╨│╨░ +; ------------------------------------------------------ DialogWindow - call Windows - inc hl -; jp WinDialog + call Windows + inc hl +; jp WinDialog -;╧╧ юсЁрсюЄъш фшрыюуютюую юъэр -;Dialogs -;+0 (1) - Count of Items -;+1 (N) - Item Descriptor -;Descriptor +; ------------------------------------------------------ +; ╨Я╨Я ╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨╕ ╨┤╨╕╨░╨╗╨╛╨│╨╛╨▓╨╛╨│╨╛ ╨╛╨║╨╜╨░ +; Dialogs +; +0 (1) - Count of Items +; +1 (N) - Item Descriptor +; Descriptor ; +0 - X ; +1 - Y ; +2 - Len ; +3 - Attrib ; +4 (2) - Hot Key ; +6 (2) - Routine +; ------------------------------------------------------ -WinDialog: - ld a,(hl) - ld (DlgItemsCnt),a - inc hl - ld (.DialogAdr),hl - xor a - ld (SelectedItem),a -.Lp1 ld a,(SelectedItem) - ld l,a - ld h,0 - add hl,hl - add hl,hl - add hl,hl - ld de,0 -.DialogAdr equ $-2 - add hl,de - ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld b,(hl) - ex hl,de - call CursorSet -.Lp2 ld c,Dss.ScanKey - rst DssRst - jr z,.Lp2 - ld a,d - cp #52 ; - jr nz,.Lp3 -.LpDn ld a,(DlgItemsCnt) - ld b,a - ld a,(SelectedItem) - inc a - cp b ;─юёЄшуыш ьръёшьры№эюую яєэъЄр - jr z,.Lp2 -.Lp4 ld (SelectedItem),a - call CursorRes - jr .Lp1 -.Lp3 cp #58 ; - jr nz,.Lp5 -.LpUp ld a,(SelectedItem) - and a - jr z,.Lp2 - dec a - jr .Lp4 -.Lp5 cp #54 ; - jr z,.LpUp - cp #56 ; - jr z,.LpDn +WinDialog + ld a,(hl) + ld (DlgItemsCnt),a + inc hl + ld (.DialogAdr),hl + xor a + ld (SelectedItem),a +.Lp1 ld a,(SelectedItem) + ld l,a + ld h,0 + add hl,hl + add hl,hl + add hl,hl +.DialogAdr+* ld de,0 +;.DialogAdr equ $-2 + add hl,de + ld e,(hl) + inc hl + ld d,(hl) + inc hl + ld b,(hl) + ex hl,de + call CursorSet +.Lp2 ld c,Dss.ScanKey + rst DssRst + jr z,.Lp2 + ld a,d + cp DN_KEY ; + jr nz,.Lp3 +.LpDn ld a,(DlgItemsCnt) + ld b,a + ld a,(SelectedItem) + inc a + cp b ; ╨Ф╨╛╤Б╤В╨╕╨│╨╗╨╕ ╨╝╨░╨║╤Б╨╕╨╝╨░╨╗╤М╨╜╨╛╨│╨╛ ╨┐╤Г╨╜╨║╤В╨░ + jr z,.Lp2 +.Lp4 ld (SelectedItem),a + call CursorRes + jr .Lp1 +.Lp3 cp UP_KEY ; + jr nz,.Lp5 +.LpUp ld a,(SelectedItem) + and a + jr z,.Lp2 + dec a + jr .Lp4 +.Lp5 cp LEFT_KEY ; + jr z,.LpUp + cp RIGHT_KEY ; + jr z,.LpDn .LpAscii - ld a,e ;ASCII - ъюф - cp #0D ; - jr nz,.Lp2 - call CursorRes - ld a,(SelectedItem) - ld l,a - ld h,0 - add hl,hl - add hl,hl - add hl,hl - ld de,(.DialogAdr) - add hl,de - ld de,6 - add hl,de - ifdef DEBUG - push hl - ld de,0 - call PrintReg - pop hl - endif - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - or h - ret z ;┼ёыш рфЁхё =0, Єю RET - ifdef DEBUG - push hl - ld de,8 - call PrintReg - pop hl - endif - jp (hl) -DlgItemsCnt - DB 0 -SelectedItem - DB 0 -STANDART; TYPE, X, Y, L,H,COLOR - DEFB 5,10,13,#20,6,7 + ld a,e ; ASCII - ╨║╨╛╨┤ + cp ENTER_KEY ; + jr nz,.Lp2 + call CursorRes + ld a,(SelectedItem) + ld l,a + ld h,0 + add hl,hl + add hl,hl + add hl,hl + ld de,(.DialogAdr) + add hl,de + ld de,6 + add hl,de + + IFDEF DEBUG + push hl + ld de,0 + call PrintReg + pop hl + ENDIF + + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + or h + ret z ; ╨Х╤Б╨╗╨╕ ╨░╨┤╤А╨╡╤Б =0, ╤В╨╛ RET + + IFDEF DEBUG + push hl + ld de,8 + call PrintReg + pop hl + ENDIF -;Ordinary frame + jp (hl) +DlgItemsCnt + DB 0 +SelectedItem + DB 0 + +; TYPE, X, Y, L,H,COLOR +STANDART + DEFB 5,10,13,0x20,6,7 + +; Ordinary frame FrameType1 - DB #DA,#BF,#D9,#C0,#C4,#B3 -;Double frame + DB 0xDA,0xBF,0xD9,0xC0,0xC4,0xB3 +; Double frame FrameType2 - DB #C9,#BB,#BC,#C8,#CD,#BA \ No newline at end of file + DB 0xC9,0xBB,0xBC,0xC8,0xCD,0xBA