From 4c6b0a25fb48b2506968d4e7ead578da3be31ca6 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sat, 26 Dec 2020 23:59:23 +0300 Subject: [PATCH] initial commit --- CLOCK.ASM | 36 + CMDLINE.ASM | 22 + DATA.ASM | 116 + DEMON.ASM | 389 +++ DEMON.TXT | 377 +++ DEMON_old.EXE | Bin 0 -> 13943 bytes DISASM.ASM | 786 +++++ EQU/DOS_EQU.ASM | 71 + EQU/DSS.INC | 104 + EQU/bios_equ.asm | 59 + EQU/dss_equ.asm | 105 + EQU/port.asm | 4 + 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 +++ TABL.ASM | 362 +++ UTIL.ASM | 923 ++++++ VERSION/build.bin | 1 + VERSION/date.bin | 1 + VERSION/major.bin | 1 + VERSION/minor.bin | 1 + VERSION/time.bin | 1 + changes.txt | 25 + d010_136.rar | Bin 0 -> 139810 bytes daemon.lst | 1 + demon.exe | Bin 0 -> 15202 bytes demon.lst | 7807 +++++++++++++++++++++++++++++++++++++++++++++ dm.gif | Bin 0 -> 15523 bytes loadbin.asm | 191 ++ make.bat | 3 + readme.txt | 26 + windows.asm | 349 ++ 38 files changed, 14803 insertions(+) create mode 100644 CLOCK.ASM create mode 100644 CMDLINE.ASM create mode 100644 DATA.ASM create mode 100644 DEMON.ASM create mode 100644 DEMON.TXT create mode 100644 DEMON_old.EXE create mode 100644 DISASM.ASM create mode 100644 EQU/DOS_EQU.ASM create mode 100644 EQU/DSS.INC create mode 100644 EQU/bios_equ.asm create mode 100644 EQU/dss_equ.asm create mode 100644 EQU/port.asm 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 100644 REZ.ASM create mode 100644 SAVESCR.ASM create mode 100644 STEP.ASM create mode 100644 TABL.ASM create mode 100644 UTIL.ASM create mode 100644 VERSION/build.bin create mode 100644 VERSION/date.bin create mode 100644 VERSION/major.bin create mode 100644 VERSION/minor.bin create mode 100644 VERSION/time.bin create mode 100644 changes.txt create mode 100644 d010_136.rar create mode 100644 daemon.lst create mode 100644 demon.exe create mode 100644 demon.lst create mode 100644 dm.gif create mode 100644 loadbin.asm create mode 100644 make.bat create mode 100644 readme.txt create mode 100644 windows.asm diff --git a/CLOCK.ASM b/CLOCK.ASM new file mode 100644 index 0000000..1eab560 --- /dev/null +++ b/CLOCK.ASM @@ -0,0 +1,36 @@ +;[]=========================================================================[] +;[] Вывод часов [] +;[] 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..f21a2e4 --- /dev/null +++ b/CMDLINE.ASM @@ -0,0 +1,22 @@ +;[]=========================================================================[] +;[] Обработка командной строки монитора-отладчика 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 new file mode 100644 index 0000000..8b1d920 --- /dev/null +++ b/DATA.ASM @@ -0,0 +1,116 @@ +;[]=========================================================================[] +;[] Данные монитора-отладчика 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 new file mode 100644 index 0000000..93c0bb5 --- /dev/null +++ b/DEMON.ASM @@ -0,0 +1,389 @@ +;[]=========================================================================[] +;[] Монитор-отладчик 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.TXT b/DEMON.TXT new file mode 100644 index 0000000..b6473be --- /dev/null +++ b/DEMON.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/DEMON_old.EXE b/DEMON_old.EXE new file mode 100644 index 0000000000000000000000000000000000000000..d77f61d82adc637b4a87c7df5ea9421eee1810be GIT binary patch literal 13943 zcmeHud0bQ1y6E0X2!jw3KpMxcWLp~sY1mFNB~eJ26oCS5QCk%Sl~xHN%An$Kdb9&7 z4yZ*zrD!3600E?WtVNO5fVq@<5Ni+joV1O%ttV|c*4EZ`^S-rrK)wCFcklbX-}~qO zip?6nd3|fGZ%w<=>CptiBOd??vXKpq*q+R(}Cm|eKe%rQ94L{B4Z#GC+h;e#PKPCWI$>%5h#4}ip_@fS?dgm zXp=H5T!~g}%wC&`!l%zdij1|nYchgR{AxoUT2X`|p&E%&^EYN@8$uDSRL(*++Z7^^ zCqYUS=pjMjC{QFpGztumpy`MR^bJUfUQ8rXG1OA(1**i+b&pIZ1_FjIiSOBc&{tO3 z);iHk1L`exv7)pAHEoQQ5QHoliQec{PdCyBcGCaYDU07>du^vou|qqNKC}}Tm+pw^ za>>Ke?3cvf%WmyZ&oI*Edu)H+Bg@>Wo;gxRJJoYW%3F7;RjzU;@%sPlVgE<#{_wyb z9{9rpgsrC1CVk!Z=8@o`O8FduOd|)#NMgWxS0W&TV~n=My%GU0IF2g_g6DGux8MY> zAPi3A3SPk}TwzRb8dvZRet|2v2PYeCH}^;cKEdf+K^(l)Xsg~M@ev0vW($IV;Foa0 z_Vr$ge?V{~TW;QKQ|_}>?|abs?(4yujFRzWzoWlcvpY#h+>vcEdTyZd?)2HdeI5Ah zw(>Xn)K$jzE6d*Kcih#E{nIkhYrV2trQ|Nu`@r58pnkXFyt2c3*U|5AE?8=8cShNf zn|iiUiU2}xB|xRavu^_YU9$bQzt666gS9})hb4y&dSepEnoN*?n$_E9e_)mTIy}yH zdOtI$5dNrSenTD(P;O@gS1GQ*A1UyzQdWn|QA+ZNl6Hj$gA_u_2mN5T_IEjC_e;}W z1}iRgIh;}Yg?8tA_DhkJ78Qtp>9boK>0e46X)lBQS`=GAiGLlG{jKy4r_`JI?edFn zN@DcdMN&73Uaw7errs*0FP72~Z_&eVX-VLhQ3$K4blW8|2aLR;oc>wlSr4^)ICn5msEG*vf}|s04BJNu!P{5)yVt z&o+gJQ{SHCjFOU`w!$*(77g-=fSz$K`K=VBNy9Wq!b%*0QKi!H8Z=wWa{;j6SjvHW z7J4T5L1_ttl-`9*DDubFXa&|-R};YQFIelWmpE&>9-5OqmFRrCjDvfyP3wwfZ50gW zyLmjMTb|unSa!R^9sUfGuPx)GKCDkAA6Q161|DS)x^FGQ7~c<-e%erfKYysYe;CEY zs3Z{)Oq^oOhkPbM;daA^iR|$6Z?xW-rJ!cTQMdzxs5{oeQOB}~cxqNUr41=4>?u?T zwbKd;oqFmH^px%GGHsBbRjCXQr|Id_kusc~K4a#r*{V5@mDu1fpKo-gCK#Q%MB|`5 z#`v2&&Unu*Pc}N2(Tk1F7wIL&Pd(%*K$8YEFJN4{(c@FuayT#)P@h%9?=t*8FR-eC zJW0L8=!}JE=NN)O>0APG7l2#{qrX7}{nP`(A7DV*5|Fmw1rTJ#0j7LU2@{Bf+?KWd zs-u4@-*AL%n*h;fA|?Iet^>l4U46m`F+_5GkL_BSG(bzy*Y_;k0{)Qybq}6*@*8_( z*Y}XS+DBFrM`&Nf6X0Onr=R{AV zyGqdWt(4bero=zk`yrb4^=pMVfZpwu&Dl%t^10jF7cglOL_q+=0KnreXn9H*&izAj zBu`x&78jPBsB`ES+P3ef8}?$8-r38?6*F5o%~cxNN-bAuVk^eIvWC4v0XB+NewS0; zD|-i2i9i!>4#FLXBBOMA@V(?Z(07$k4z9EP{rzE&|DEjPy`9_k1oHf#{ed2k(t#pK zrw0Z=I)hN_j0Wwt_myrv??;s5={{{=zwMhcdkCrIuP-@=gb;keKR^caPY?p*N#Yg2 zHaT=3xl4eXj7N<6)V>IX53E)pArz%S59E4du-+&k1L5R&YM;=ftKZRH=v?rU(HVuj zW3?V-09DU&EhYK;ut2<&jOn%a^*iv&)z=>q;=oOYemT8A2`7dO77=hs-2A{Ql!yX@ zGmSzIST$^)?6Z?%!t+vJfcSf>Y!wSlq#UcVF^0n6@2vgM36h|)L0L-KphN570evu7 zKnzmQC3j%Sr0(Eec?<#|4-L8@6x(qp^tpP$om)eL%E(=Fpz+~Kr4k?MlxR9mX5eHd zPG;d`HcnJHd1Sib?uw347uO|~Fc8z2VTAyq5V@WLEAe=~e637N`T4Wsm@^FzWv;{# ze8UoKeF(h=!Nd19#1BTT;(h3D79Vf&k-BN`HNW`0A zw_*;f+_3-7nyI8bZ~veyYJb0D(9zW>vOwQovOA~}ddq&b+E_qQ;s=9vdtaldWn@(R zcQ=yw_(~Ab{SJ`s&=Qo?qU|`T5Hs7oI@BwS*FW$1-m9lcI$gb-E%)4qTF-k@O50I` ziAr2VKa}*eN<|#e4?Vv^t>?l$^-ACwvfjhAe#~|Se+YsSEAxk;0;$g^^-w|2g`QTH z+6p^>n|C0Y3p%q&Q#}uvj+>$DaJ-%VB0~_9Lxe#Kr6k4sr*J{Tp@aI z(#;3eXAf!=&tRcfNB~$cfZ-`7u@D|WT385QF@}Zk0n&O9hbNXbmT^<@gaWnZ(Cv

S5?-rFtv^lg!qIlD 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 E7Y8cz=Kufz literal 0 HcmV?d00001 diff --git a/DISASM.ASM b/DISASM.ASM new file mode 100644 index 0000000..1846c0d --- /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 - вывод атрибутов строки листинга [] +;[] 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 new file mode 100644 index 0000000..01ccdca --- /dev/null +++ b/EQU/DOS_EQU.ASM @@ -0,0 +1,71 @@ + +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 new file mode 100644 index 0000000..a38db37 --- /dev/null +++ b/EQU/DSS.INC @@ -0,0 +1,104 @@ + +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 new file mode 100644 index 0000000..14595ca --- /dev/null +++ b/EQU/bios_equ.asm @@ -0,0 +1,59 @@ +BiosRst EQU #08 + +;Функции работы с памятью +Bios.Emm_Fn0 EQU #C0 +Bios.Emm_Fn1 EQU #C1 +Bios.Emm_Fn2 EQU #C2 +Bios.Emm_Fn3 EQU #C3 +Bios.Emm_Fn4 EQU #C4 +Bios.Emm_Fn5 EQU #C5 +Bios.Emm_Fn6 EQU #C6 +Bios.Emm_Fn7 EQU #C7 +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 +Bios.Win_Restore_Win EQU #B3 +Bios.Win_Get_Sym EQU #B4 +Bios.Win_Put_Sym EQU #B5 +Bios.Win_Set_ZG EQU #B6 +Bios.Win_Move_Win EQU #B7 +Bios.Win_Get_ZG EQU #B8 + + + +;Функции вывода текста на экран +Bios.Lp_Print_All EQU #81 +Bios.Lp_Print_Sym EQU #82 +Bios.Lp_Print_Atr EQU #83 +Bios.Lp_Set_Place EQU #84 +Bios.Lp_Print_Ln EQU #85 +Bios.Lp_Print_Ln2 EQU #86 +Bios.Lp_Print_Ln3 EQU #87 +Bios.Lp_Print_Ln4 EQU #88 +Bios.Lp_Cls_Win EQU #89 +Bios.Lp_Scroll_Up EQU #8A +Bios.Lp_Print_Ln5 EQU #8B +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 +Bios.Drv_Write EQU #56 +Bios.Drv_Detect EQU #57 +Bios.Drv_Get_Par EQU #58 +Bios.Drv_Set_Par EQU #59 +Bios.Ext_Version EQU #5A +Bios.Drv_List EQU #5F + + + + + diff --git a/EQU/dss_equ.asm b/EQU/dss_equ.asm new file mode 100644 index 0000000..c245856 --- /dev/null +++ b/EQU/dss_equ.asm @@ -0,0 +1,105 @@ +DssRst EQU #10 + +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/port.asm b/EQU/port.asm new file mode 100644 index 0000000..ed0fdc5 --- /dev/null +++ b/EQU/port.asm @@ -0,0 +1,4 @@ +EmmWin.P0 EQU #82 +EmmWin.P1 EQU #A2 +EmmWin.P2 EQU #C2 +EmmWin.P3 EQU #E2 diff --git a/ERROR.ASM b/ERROR.ASM new file mode 100644 index 0000000..3a45e4e --- /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 "(слишком большая влож. папок или >= 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..eb4df1e --- /dev/null +++ b/FILE.ASM @@ -0,0 +1,274 @@ +;[]=========================================================================[] +;[] Файловые процедуры монитора-отладчика 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 new file mode 100644 index 0000000..fa6be95 --- /dev/null +++ b/KDUMP.ASM @@ -0,0 +1,246 @@ +;[]=========================================================================[] +;[] Обработка клавиатуры в окне дампа [] +;[] 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 new file mode 100644 index 0000000..56c2a6d --- /dev/null +++ b/KEYB.ASM @@ -0,0 +1,1202 @@ +;[]=========================================================================[] +;[] Обработка клавиатуры [] +;[] 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 new file mode 100644 index 0000000..ad58556 --- /dev/null +++ b/KREG.ASM @@ -0,0 +1,440 @@ +;[]=========================================================================[] +;[] Обработка клавиатуры в окне регистров [] +;[] 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 new file mode 100644 index 0000000..6dc77fe --- /dev/null +++ b/KSTACK.ASM @@ -0,0 +1,212 @@ +;[]=========================================================================[] +;[] Обработка клавиатуры в окне дампа стека [] +;[] 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 new file mode 100644 index 0000000..d93e26e --- /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..7364d8b --- /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/STEP.ASM b/STEP.ASM new file mode 100644 index 0000000..1882928 --- /dev/null +++ b/STEP.ASM @@ -0,0 +1,431 @@ +;[]=========================================================================[] +;[] Отладка команд программы [] +;[] 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/TABL.ASM b/TABL.ASM new file mode 100644 index 0000000..c12230f --- /dev/null +++ b/TABL.ASM @@ -0,0 +1,362 @@ +;[]=========================================================================[] +;[] Таблицы дизассемблера монитора-отладчика 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 + dw M10,M11,M12,M13,M14,M15,M16,M17,M18,M19,M1A,M1B,M1C,M1D,M1E,M1F + dw M20,M21,M22,M23,M24,M25,M26,M27,M28,M29,M2A,M2B,M2C,M2D,M2E,M2F + dw M30,M31,M32,M33,M34,M35,M36,M37,M38,M39,M3A,M3B,M3C,M3D,M3E,M3F + +M00 db "NOP",0 +M01 db "LD BC,",2 +M02 db "LD (BC),A",0 +M03 db "INC BC",0 +M04 db "INC B",0 +M05 db "DEC B",0 +M06 db "LD B,",1 +M07 db "RLCA",0 +M08 db "EX AF,AF'",0 +M09 db "ADD HL,BC",0 +M0A db "LD A,(BC)",0 +M0B db "DEC BC",0 +M0C db "INC C",0 +M0D db "DEC C",0 +M0E db "LD C,",1 +M0F db "RRCA",0 +M10 db "DJNZ ",3 +M11 db "LD DE,",2 +M12 db "LD (DE),A",0 +M13 db "INC DE",0 +M14 db "INC D",0 +M15 db "DEC D",0 +M16 db "LD D,",1 +M17 db "RLA",0 +M18 db "JR ",3 +M19 db "ADD HL,DE",0 +M1A db "LD A,(DE)",0 +M1B db "DEC DE",0 +M1C db "INC E",0 +M1D db "DEC E",0 +M1E db "LD E,",1 +M1F db "RRA",0 +M20 db "JR NZ,",3 +M21 db "LD HL,",2 +M22 db "LD (),HL",5 +M23 db "INC HL",0 +M24 db "INC H",0 +M25 db "DEC H",0 +M26 db "LD H,",1 +M27 db "DAA",0 +M28 db "JR Z,",3 +M29 db "ADD HL,HL",0 +M2A db "LD HL,()",5 +M2B db "DEC HL",0 +M2C db "INC L",0 +M2D db "DEC L",0 +M2E db "LD L,",1 +M2F db "CPL",0 +M30 db "JR NC,",3 +M31 db "LD SP,",2 +M32 db "LD (),A",5 +M33 db "INC SP",0 +M34 db "INC (HL)",0 +M35 db "DEC (HL)",0 +M36 db "LD (HL),",1 +M37 db "SCF",0 +M38 db "JR C,",3 +M39 db "ADD HL,SP",0 +M3A db "LD A,()",5 +M3B db "DEC SP",0 +M3C db "INC A",0 +M3D db "DEC A",0 +M3E db "LD A,",1 +M3F db "CCF",0 + +TablC0_FF: + dw MC0,MC1,MC2,MC3,MC4,MC5,MC6,MC7,MC8,MC9,MCA,M00,MCC,MCD,MCE,MCF + dw MD0,MD1,MD2,MD3,MD4,MD5,MD6,MD7,MD8,MD9,MDA,MDB,MDC,MDD,MDE,MDF + dw ME0,ME1,ME2,ME3,ME4,ME5,ME6,ME7,ME8,ME9,MEA,MEB,MEC,M00,MEE,MEF + dw MF0,MF1,MF2,MF3,MF4,MF5,MF6,MF7,MF8,MF9,MFA,MFB,MFC,MFD,MFE,MFF + +MC0 db "RET NZ",0 +MC1 db "POP BC",0 +MC2 db "JP NZ,",2 +MC3 db "JP ",2 +MC4 db "CALL NZ,",2 +MC5 db "PUSH BC",0 +MC6 db "ADD A,",1 +MC7 db "RST 0",0 +MC8 db "RET Z",0 +MC9 db "RET",0 +MCA db "JP Z,",2 +MCC db "CALL Z,",2 +MCD db "CALL ",2 +MCE db "ADC A,",1 +MCF db "RST 8",0 +MD0 db "RET NC",0 +MD1 db "POP DE",0 +MD2 db "JP NC,",2 +MD3 db "OUT (),A",4 +MD4 db "CALL NC,",2 +MD5 db "PUSH DE",0 +MD6 db "SUB ",1 +MD7 db "RST #10",0 +MD8 db "RET C",0 +MD9 db "EXX",0 +MDA db "JP C,",2 +MDB db "IN A,()",4 +MDC db "CALL C,",2 +MDD db "DD",0 +MDE db "SBC A,",1 +MDF db "RST #18",0 +ME0 db "RET PO",0 +ME1 db "POP HL",0 +ME2 db "JP PO,",2 +ME3 db "EX (SP),HL",0 +ME4 db "CALL PO,",2 +ME5 db "PUSH HL",0 +ME6 db "AND ",1 +ME7 db "RST #20",0 +ME8 db "RET PE",0 +ME9 db "JP (HL)",0 +MEA db "JP PE,",2 +MEB db "EX DE,HL",0 +MEC db "CALL PE,",2 +MEE db "XOR ",1 +MEF db "RST #28",0 +MF0 db "RET P",0 +MF1 db "POP AF",0 +MF2 db "JP P,",2 +MF3 db "DI",0 +MF4 db "CALL P,",2 +MF5 db "PUSH AF",0 +MF6 db "OR ",1 +MF7 db "RST #30",0 +MF8 db "RET M",0 +MF9 db "LD SP,HL",0 +MFA db "JP M,",2 +MFB db "EI",0 +MFC db "CALL M,",2 +MFD db "FD",0 +MFE db "CP ",1 +MFF db "RST #38",0 + +MHALT db "HALT",0 + +TablM: + dw M80,M88,M90,M98,MA0,MA8,MB0,MB8 + +M80 db "ADD A,",0 +M88 db "ADC A,",0 +M90 db "SUB ",0 +M98 db "SBC A,",0 +MA0 db "AND ",0 +MA8 db "XOR ",0 +MB0 db "OR ",0 +MB8 db "CP ",0 + +CodeDDFD: + db 0x09,0x19,0x21,0x22,0x23,0x24,0x25,0x26,0x29 + db 0x2A,0x2B,0x2C,0x2D,0x2E,0x34,0x35,0x36,0x39 + db 0x44,0x45,0x46,0x4C,0x4D,0x4E,0x54,0x55,0x56 + db 0x5C,0x5D,0x5E,0x60,0x61,0x62,0x63,0x64,0x65 + db 0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E + db 0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x77,0x7C + db 0x7D,0x7E,0x84,0x85,0x86,0x8C,0x8D,0x8E,0x94 + db 0x95,0x96,0x9C,0x9D,0x9E,0xA4,0xA5,0xA6,0xAC + db 0xAD,0xAE,0xB4,0xB5,0xB6,0xBC,0xBD,0xBE,0xE1 + db 0xE3,0xE5,0xE9,0xF9 + +TablDDFD: + dw DD09,DD19,DD21,DD22,DD23,DD24,DD25,DD26,DD29 + dw DD2A,DD2B,DD2C,DD2D,DD2E,DD34,DD35,DD36,DD39 + dw DD44,DD45,DD46,DD4C,DD4D,DD4E,DD54,DD55,DD56 + dw DD5C,DD5D,DD5E,DD60,DD61,DD62,DD63,DD64,DD65 + dw DD66,DD67,DD68,DD69,DD6A,DD6B,DD6C,DD6D,DD6E + dw DD6F,DD70,DD71,DD72,DD73,DD74,DD75,DD77,DD7C + dw DD7D,DD7E,DD84,DD85,DD86,DD8C,DD8D,DD8E,DD94 + dw DD95,DD96,DD9C,DD9D,DD9E,DDA4,DDA5,DDA6,DDAC + dw DDAD,DDAE,DDB4,DDB5,DDB6,DDBC,DDBD,DDBE,DDE1 + dw DDE3,DDE5,DDE9,DDF9 + +DD09 db "ADD Ix,BC",0 +DD19 db "ADD Ix,DE",0 +DD21 db "LD Ix,",2 +DD22 db "LD (),Ix",5 +DD23 db "INC Ix",0 +DD24 db "INC Hx",0 +DD25 db "DEC Hx",0 +DD26 db "LD Hx,",1 +DD29 db "ADD Ix,Ix",0 +DD2A db "LD Ix,()",5 +DD2B db "DEC Ix",0 +DD2C db "INC Lx",0 +DD2D db "DEC Lx",0 +DD2E db "LD Lx,",1 +DD34 db "INC )",6 +DD35 db "DEC )",6 +DD36 db "LD ),",6 +DD39 db "ADD Ix,SP",0 +DD44 db "LD B,Hx",0 +DD45 db "LD B,Lx",0 +DD46 db "LD B,)",6 +DD4C db "LD C,Hx",0 +DD4D db "LD C,Lx",0 +DD4E db "LD C,)",6 +DD54 db "LD D,Hx",0 +DD55 db "LD D,Lx",0 +DD56 db "LD D,)",6 +DD5C db "LD E,Hx",0 +DD5D db "LD E,Lx",0 +DD5E db "LD E,)",6 +DD60 db "LD Hx,B",0 +DD61 db "LD Hx,C",0 +DD62 db "LD Hx,D",0 +DD63 db "LD Hx,E",0 +DD64 db "LD Hx,Hx",0 +DD65 db "LD Hx,Lx",0 +DD66 db "LD H,)",6 +DD67 db "LD Lx,A",0 +DD68 db "LD Lx,B",0 +DD69 db "LD Lx,C",0 +DD6A db "LD Lx,D",0 +DD6B db "LD Lx,E",0 +DD6C db "LD Lx,Hx",0 +DD6D db "LD Lx,Lx",0 +DD6E db "LD L,)",6 +DD6F db "LD Lx,A",0 +DD70 db "LD ),B",6 +DD71 db "LD ),C",6 +DD72 db "LD ),D",6 +DD73 db "LD ),E",6 +DD74 db "LD ),H",6 +DD75 db "LD ),L",6 +DD77 db "LD ),A",6 +DD7C db "LD A,Hx",0 +DD7D db "LD A,Lx",0 +DD7E db "LD A,)",6 +DD84 db "ADD A,Hx",0 +DD85 db "ADD A,Lx",0 +DD86 db "ADD A,)",6 +DD8C db "ADC E,Hx",0 +DD8D db "ADC E,Lx",0 +DD8E db "ADC E,)",6 +DD94 db "SUB Hx",0 +DD95 db "SUB Lx",0 +DD96 db "SUB )",6 +DD9C db "SBC A,Hx",0 +DD9D db "SBC A,Lx",0 +DD9E db "SBC A,)",6 +DDA4 db "AND Hx",0 +DDA5 db "AND Lx",0 +DDA6 db "AND )",6 +DDAC db "XOR Hx",0 +DDAD db "XOR Lx",0 +DDAE db "XOR )",6 +DDB4 db "OR Hx",0 +DDB5 db "OR Lx",0 +DDB6 db "OR )",6 +DDBC db "CP Hx",0 +DDBD db "CP Lx",0 +DDBE db "CP )",6 +DDE1 db "POP Ix",0 +DDE3 db "EX (SP),Ix",0 +DDE5 db "PUSH Ix",0 +DDE9 db "JP (Ix)",0 +DDF9 db "LD SP,Ix",0 + +TablCB: + dw CB00,CB08,CB10,CB18,CB20,CB28,CB30,CB38 + +CB00 db "RLC " +CB08 db "RRC " +CB10 db "RL " +CB18 db "RR " +CB20 db "SLA " +CB28 db "SRA " +CB30 db "SLI " +CB38 db "SRL " +CB40 db "BIT " +CB80 db "RES " +CBC0 db "SET " + +TablED: + dw ED40,ED41,ED42,ED43,ED44,ED45,ED46,ED47 + dw ED48,ED49,ED4A,ED4B,ED44,ED4D,ED4E,ED4F + dw ED50,ED51,ED52,ED53,ED44,ED45,ED56,ED57 + dw ED58,ED59,ED5A,ED5B,ED44,ED4D,ED5E,ED5F + dw ED60,ED61,ED62,ED63,ED44,ED45,ED46,ED67 + dw ED68,ED69,ED6A,ED6B,ED44,ED4D,ED4E,ED6F + dw ED70,ED71,ED72,ED73,ED44,ED45,ED56,ED00 + dw ED78,ED79,ED7A,ED7B,ED44,ED4D,ED5E + dw EDA0,EDA1,EDA2,EDA3,ED00,ED00,ED00,ED00 + dw EDA8,EDA9,EDAA,EDAB,ED00,ED00,ED00,ED00 + dw EDB0,EDB1,EDB2,EDB3,ED00,ED00,ED00,ED00 + dw EDB8,EDB9,EDBA,EDBB + +ED00 db "NOP *",0 +ED40 db "IN B,(C)",0 +ED41 db "OUT (C),B",0 +ED42 db "SBC HL,BC",0 +ED43 db "LD (),BC",5 +ED44 db "NEG",0 +ED45 db "RETN",0 +ED46 db "IM 0",0 +ED47 db "LD I,A",0 +ED48 db "IN C,(C)",0 +ED49 db "OUT (C),C",0 +ED4A db "ADC HL,BC",0 +ED4B db "LD BC,()",5 +ED4D db "RETI",0 +ED4E db "IM 0 *",0 +ED4F db "LD R,A",0 +ED50 db "IN D,(C)",0 +ED51 db "OUT (C),D",0 +ED52 db "SBC HL,DE",0 +ED53 db "LD (),DE",5 +ED56 db "IM 1",0 +ED57 db "LD A,I",0 +ED58 db "IN E,(C)",0 +ED59 db "OUT (C),E",0 +ED5A db "ADC HL,DE",0 +ED5B db "LD DE,()",5 +ED5E db "IM 2",0 +ED5F db "LD A,R",0 +ED60 db "IN H,(C)",0 +ED61 db "OUT (C),H",0 +ED62 db "SBC HL,HL",0 +ED63 db "LD (),HL",5 +ED67 db "RRD",0 +ED68 db "IN L,(C)",0 +ED69 db "OUT (C),L",0 +ED6A db "ADC HL,HL",0 +ED6B db "LD HL,()",5 +ED6F db "RLD",0 +ED70 db "IN F,(C)",0 +ED71 db "OUT (C),*",0 +ED72 db "SBC HL,SP",0 +ED73 db "LD (),SP",5 +ED78 db "IN A,(C)",0 +ED79 db "OUT (C),A",0 +ED7A db "ADC HL,SP",0 +ED7B db "LD SP,()",5 +EDA0 db "LDI",0 +EDA1 db "CPI",0 +EDA2 db "INI",0 +EDA3 db "OUTI",0 +EDA8 db "LDD",0 +EDA9 db "CPD",0 +EDAA db "IND",0 +EDAB db "OUTD",0 +EDB0 db "LDIR",0 +EDB1 db "CPIR",0 +EDB2 db "INIR",0 +EDB3 db "OTIR",0 +EDB8 db "LDDR",0 +EDB9 db "CPDR",0 +EDBA db "INDR",0 +EDBB db "OTDR",0 + diff --git a/UTIL.ASM b/UTIL.ASM new file mode 100644 index 0000000..ea75027 --- /dev/null +++ b/UTIL.ASM @@ -0,0 +1,923 @@ +;[]=========================================================================[] +;[] Подпрограммы-утилиты монитора-отладчика 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: + ld (Reg._HL),hl + ld (Reg._DE),de + ld (Reg._BC),bc + + ld (Reg._IX),ix + ld (Reg._IY),iy + push af + pop hl + ld (Reg._AF),hl + ld a,r + ld (Reg._IR),a + ld a,i + ld (Reg._IR+1),a + + exx + ex af,af' + + ld (Reg._HL_),hl + ld (Reg._DE_),de + ld (Reg._BC_),bc + push af + pop hl + ld (Reg._AF_),hl + ex af,af' + exx + + ld hl,WinPage ;сохранение номеров страниц + in a,(EmmWin.P0) ;0-е окно + ld (hl),a + inc hl + in a,(EmmWin.P1) ;1-е окно + ld (hl),a + inc hl + in a,(EmmWin.P2) ;2-е окно + ld (hl),a + inc hl + in a,(EmmWin.P3) ;3-е окно + ld (hl),a + ret + +;[]=========================================================================[] +;[] Востановление значений регистровых пар [] +;[]=========================================================================[] +RestAllRegs: + ld a,(Reg._IR) + ld r,a + ld a,(Reg._IR+1) + ld i,a + ld hl,(Reg._AF) + push hl + pop af + ld hl,(Reg._HL) + ld de,(Reg._DE) + ld bc,(Reg._BC) + ld ix,(Reg._IX) + ld iy,(Reg._IY) + + exx + ex af,af' + ld hl,(Reg._AF_) + push hl + pop af + ld hl,(Reg._HL_) + ld de,(Reg._DE_) + ld bc,(Reg._BC_) + ex af,af' + exx + + ret + +;[]=========================================================================[] +;[] Печать строки символов [] +;[] Вход: HL - адрес строки символов [] +;[] [] +;[] Формат строки: 0x16, Столбец, Строка, Символы, 0x00 [] +;[]=========================================================================[] + ld a,(Color.Screen) ;основной цвет + ld (PrnStrColor.L1+5),a +PrnStrColor: + ld a,(hl) + cp 0x16 ;код установки позиции курсора + jr nz,.L2 + inc hl + ld e,(hl) ;столбец + ld a,e + ld (PrtXCoord),a + inc hl + ld d,(hl) ;строка + inc hl + ld a,(hl) ;символ +.L2 cp 0x0D + jr nz,.L3 + inc d + ld a,(PrtXCoord) + ld e,a + jr .L4 +.L3 cp 0x17 + jr nz,.L1 + inc hl + ld a,(hl) + ld (PrnStrColor.L1+5),a + inc hl + ld a,(hl) +.L1 or a + ret z ;выход если конец строки + push hl + push de +;печать ч/з биос или дсс? + ifdef D_PRINTCH_BIOS + ld h,0x03 ;атрибут + ld l,a + sub a ;идентификатор окна +; ld a,(Demon.Bios_Win) + ld bc,SysSymb*256+Bios.Win_Put_Sym + rst BiosRst + else + ld b,0x03 + ld c,Dss.WrChar + rst DssRst + endif + pop de + pop hl + inc e +.L4 inc hl + jr PrnStrColor +PrtXCoord db 0 +;[]=========================================================================[] +;[] Печать двухбайтового числа [] +;[] Вход: DE - координаты печати [] +;[] HL - значение регистровой пары [] +;[]=========================================================================[] +PrintReg: + di + push hl + ld c,Bios.Lp_Set_Place ;установка позиции печати + rst BiosRst + pop hl + + ld a,(DecHex) ;систем счисления + or a + jr z,.Hex + + ld de,.String + call ConvDecStr + jr .Print + +.Hex ld a,"#" + ld (.String),a + ld c,l + ld a,h + call ConvHexStr + 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 длина строки + rst BiosRst + ei + ret + +.String db "#0123" + +;[]=========================================================================[] +;[] Печать значения регистровой пары AF и флагов [] +;[] Вход: DE - координаты печати [] +;[] HL - значение регистровой пары [] +;[]=========================================================================[] +PrintStrAF: + ld a,h ;значение регистра A + push hl + ld (.String+11),a + + ld hl,.String+1 ;двоичное значение + push de + ld de,0x3031 ;"01" + ld b,8 +.L1 rlca + jr c,$+5 + ld (hl),d ;"0" + jr $+3 + ld (hl),e ;"1" + inc hl + djnz .L1 + pop de + + inc b ;B=1 + inc hl + inc hl + call ReplSymNoPrint + + pop hl + ld a,l ;флаги + push hl + ld hl,.Flags + ld b,8 + res 3,a ;сброс неизвестных флагов + res 5,a +.L2 rlca + jr c,$+6 + set 5,(hl) ;сброшен + jr $+4 + res 5,(hl) ;установлен + inc hl + djnz .L2 + pop hl + + push de + call PrintReg ;печать значения рег.пары + pop de + push de + ld a,6 + add a,e + ld e,a + ld c,Bios.Lp_Set_Place + di + rst BiosRst + ld hl,.String + ld bc,13*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки + di + rst BiosRst + pop de + inc d + dec e + dec e + dec e + ld c,Bios.Lp_Set_Place + di + rst BiosRst + ld hl,.Flags + ld bc,8*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки + di + rst BiosRst + ei + ret + +.String db '%01010101 " "' +.Flags db "SZ.H.PNC" + +;[]=========================================================================[] +;[] Печать значений регистровых пар с адресуемыми байтами [] +;[] Вход: DE - координаты печати [] +;[] HL - значение регистровой пары [] +;[]=========================================================================[] +PrintStrReg: + push hl + ld b,h + ld c,l + + call Ld_a_bc ;ld a,(bc) адресуемые байты + ld (.String+10),a + call ConvHexStr + ld (.String),hl + inc bc + call Ld_a_bc ;ld a,(bc) + ld (.String+11),a + call ConvHexStr + ld (.String+2),hl + inc bc + call Ld_a_bc ;ld a,(bc) + ld (.String+12),a + call ConvHexStr + ld (.String+5),hl + inc bc + call Ld_a_bc ;ld a,(bc) + ld (.String+13),a + call ConvHexStr + ld (.String+7),hl + + ld hl,.String+10 ;замена непечатных символов + ld b,4 + call ReplSymNoPrint + + pop hl + push de + call PrintReg ;печать значения рег.пары + pop de + di + ld a,6 + add a,e + ld e,a + ld c,Bios.Lp_Set_Place ;установка позиции печати + rst BiosRst + ld hl,.String ;печатаемая строка + ld bc,14*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки + rst BiosRst + ei + ret + +.String db "0123 4567 ABCD" + +;[]=========================================================================[] +;[] Печать номеров банок в окнах [] +;[] Вход: HL - адрес сохраненных номеров [] +;[]=========================================================================[] +PrintStrWin: + ld hl,WinPage ;вывод номеров банок в окнах + ld de,.String+3 + ld b,4 +.L1 push bc + ld a,(hl) + inc hl + push hl + ld l,a + ld h,0 + call NumToStr8 ;конвертирование в HEX-строку + inc de + inc de + inc de + pop hl + pop bc + djnz .L1 + + ld hl,.String + jp PrnStrColor-6 + +.String db 0x16,0x02,0x12,"#01" + db 0x16,0x08,0x12,"#02" + db 0x16,0x0E,0x12,"#03" + db 0x16,0x14,0x12,"#04",0 + +;[]=========================================================================[] +;[] Печать глубины стека [] +;[]=========================================================================[] +PrintSPDn: + ld a,(StackDown) + ld l,a + ld a,0x7F + cp l ;отрицательное? + jr nc,.L1 + res 7,l ;сбросить минус + inc a + sub l + ld l,a +.L1 ld h,0 + ld de,.String+1 + push de + call ConvDecStr8 + pop hl + dec hl + ld bc,3*256+"0" + ld (hl),c + ld a,(hl) ;гашение незначащих нулей + cp c + jr nz,$+8 + ld a,0x20 + ld (hl),a + inc hl + djnz $-8 + ld a,(StackDown) + bit 7,a + jr z,$+6 + dec hl ;отрицательное число + ld a,"-" + ld (hl),a + + ld de,0x140A + ld c,Bios.Lp_Set_Place ;установка позиции печати + di + rst BiosRst + ld hl,.String ;печатаемая строка + ld bc,4*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки + di + rst BiosRst + ei + ret + +.String ds 4 + +;[]=========================================================================[] +;[] Печать значений стека [] +;[]=========================================================================[] +PrintStrSP: + ld a,(.StrSp) ;строка с вершиной стека + inc a + jr z,.L4 ;если вершина стека не попадает в дамп + ld hl,(Reg._SP) + dec hl + dec hl + inc hl + inc hl + dec a + jr nz,$-3 + ld (StackDump),hl + +.L4 ld hl,(StackDump) ;начало дампа + ld de,#1601 ;координаты печати + ld a,-1 + ld (.StrSp),a + + ld b,8 ;кол-во строк дампа +.L3 push bc + push de ;координаты + push hl + or a ;сброс флага C + ld a,b + 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) ;цвет вершины стека + jr .L2+3 +.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 длина строки + rst BiosRst + pop hl + pop de + push de + push hl + call PrintReg ;печать адреса + pop hl + pop de + push de + dec hl + dec hl + push hl + ld a,6 + add a,e + ld e,a + + inc hl + inc hl + call Ld_a_hl + ld c,a + inc hl + call Ld_a_hl + ld l,a + ld h,c + + call PrintReg ;печать значения стека + pop hl + pop de + inc d + pop bc + djnz .L3 + ei + ret + +.StrSp db 6 + +;[]=========================================================================[] +;[] Печать дампа [] +;[]=========================================================================[] +PrintDump: + ld de,0x160E ;координаты + ld hl,(Dump1) + ld b,8 ;количество строк + push de + push bc + push hl + call PrintStrDump + pop hl + ld bc,16 + add hl,bc + pop bc + pop de + inc d ;следующая строка + djnz $-14 + ret + + ld hl,Dump ;вывод дампа +; ld de,0x160E ;координаты + ld b,8 ;количество строк + push de + push bc + ld c,(hl) ;младший байт адреса + inc hl + push hl + ld h,(hl) ;старший байт адреса + ld l,c + call PrintStrDump + pop hl + inc hl + pop bc + pop de + inc d ;следующая строка + djnz $-15 + ret + +;[]=========================================================================[] +;[] Печать строки дампа [] +;[] Вход: DE - координаты печати [] +;[] HL - адрес начала строки [] +;[]=========================================================================[] +PrintStrDump: + push de + push hl + + ld b,h + ld c,l + ld de,.String + ld ix,.String+41 + push ix + + ld a,8 +.L1 exa + call Ld_a_bc ;ld a,(bc) + ld (ix),a + inc ix + call ConvHexStr + ex de,hl + ld (hl),e + inc hl + ld (hl),d + inc hl + ex de,hl + inc bc + call Ld_a_bc ;ld a,(bc) + ld (ix),a + inc ix + call ConvHexStr + ex de,hl + ld (hl),e + inc hl + ld (hl),d + inc hl + inc hl + ex de,hl + inc bc + exa + dec a + jr nz,.L1 + + ld b,16 + pop hl + call ReplSymNoPrint ;замена непечатных символов + + pop hl + pop de + push de + call PrintReg ;печать адреса строки + pop de + di + ld a,7 + add a,e + ld e,a + ld c,Bios.Lp_Set_Place ;установка позиции печати + rst BiosRst + ld hl,.String + ld bc,57*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки + rst BiosRst + ei + ret + +.String db "1000 2000 3000 4000 5000 6000 7000 8000 " + db "0123456789ABCDEF" + +;[]=========================================================================[] +;[] Замена непечатных символов в строке [] +;[] Вход: B - длина строки [] +;[] HL - адрес начала строки [] +;[]=========================================================================[] +ReplSymNoPrint: + ld a,(SymbolNoPrint) + ld c,a +.L1 ld a,(hl) + cp 127 + jr z,$+10 + cp 0xFF + jr z,$+6 + cp " " + jr nc,$+3 + ld (hl),c + inc hl + djnz .L1 + ret + +;[]=========================================================================[] +;[] Формирование 16-тибитного числа [] +;[] Вход: DE - адрес буфера [] +;[] HL - число [] +;[]=========================================================================[] +NumToStr16: + ld a,(DecHex) ;систем счисления + or a + jp nz,ConvDecStr + + ld a,"#" + ld (de),a + inc de + ld c,l + ld a,h + call ConvHexStr + ex de,hl + ld (hl),e ;старший байт + inc hl + ld (hl),d + inc hl + ex de,hl + ld a,c + call ConvHexStr + ex de,hl + ld (hl),e ;младший байт + inc hl + ld (hl),d + inc hl + ex de,hl + ret + +;[]=========================================================================[] +;[] Формирование 8-битного числа [] +;[] Вход: DE - адрес буфера [] +;[] HL - число [] +;[]=========================================================================[] +NumToStr8: + ld a,(DecHex) ;систем счисления + or a + jp nz,ConvDecStr8 + +.Hex ld a,"#" + ld (de),a + inc de + ld a,l + call ConvHexStr + ex de,hl + ld (hl),e + inc hl + ld (hl),d + inc hl + ex de,hl + ret + +;[]=========================================================================[] +;[] Конвертирование числа в HEX-строку [] +;[] Вход: A - число [] +;[] Выход: HL - HEX-строка [] +;[]=========================================================================[] +ConvHexStr: + push af + rrca + rrca + rrca + rrca + and 0x0F + add a,0x30 + cp 0x3A + jr c,$+4 + add a,7 + + ld l,a + pop af + and 0x0F + add a,0x30 + cp 0x3A + jr c,$+4 + add a,7 + ld h,a + ret + +;[]=========================================================================[] +;[] Конвертирование 16-битного числа в DEC-строку [] +;[] Вход: HL - число [] +;[] DE - адрес начала DEC-строки [] +;[]=========================================================================[] +ConvDecStr: + ld bc,-10000 + ld a,0xFF + inc a + add hl,bc + jr c,$-2 + sbc hl,bc + add a,"0" + ld (de),a + inc de + + ld bc,-1000 + ld a,0xFF + inc a + add hl,bc + jr c,$-2 + sbc hl,bc + add a,"0" + ld (de),a + inc de +ConvDecStr8: + ld bc,-100 + ld a,0xFF + inc a + add hl,bc + jr c,$-2 + sbc hl,bc + add a,"0" + ld (de),a + inc de +ConvDecStr8_1: + ld bc,-10 + ld a,0xFF + inc a + add hl,bc + jr c,$-2 + sbc hl,bc + + add a,"0" + ld (de),a + inc de + + ld a,l + add a,"0" + ld (de),a + inc de + ret + +;[]=========================================================================[] +;[] Прорисовка курсора [] +;[] Вход: B - длина курсора [] +;[] HL - координаты курсора [] +;[]=========================================================================[] +CursorSet: + ld (CursorRes+1),hl + ex de,hl + ld l,b ;размер по вертикали + ld h,1 ;размер по горизонтали + ld (CursorRes+4),hl + ld ix,.Buffer + push de + push hl + push ix + push bc + ifdef D_PRINTCH_BIOS + xor a + ld c,Bios.Win_Copy_Win ;копирование в буфер + di + rst BiosRst + ei + else + ld a,(BankDebug) + ld b,a + ld c,Dss.WinCopy + rst DssRst + endif + + pop bc ;в B длина курсора + pop hl + push hl + inc hl + ld a,(hl) ;цвет символов + ld (CursorRes.L1+1),a + ld a,(Color.Cursor) +.L1 ld (hl),a + inc hl ;к байту цвета + inc hl + djnz .L1 + + pop ix + pop hl + pop de + 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 + +.Buffer ds 22*2 ;max длина курсора + +;[]=========================================================================[] +;[] Востановление экрана под курсором [] +;[]=========================================================================[] +CursorRes: + 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 ;к байту цвета + jr CursorSet.L1 + +;[]=========================================================================[] +;[] Чтение байта из памяти с проверкой адреса [] +;[] Вход: BC или HL - адрес в памяти [] +;[] Выход: A - считанный байт [] +;[]=========================================================================[] +Ld_a_bc: + ld a,11000000b ;проверка диапазона + and b + 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 ;востанавливаем адрес + jr Ld_a_hl.L1 +.L1 ld a,(WinPage) ;номер банки в 0-м + out (EmmWin.P3),a ;в третье окно ее + set 6,b ;корректируем адрес + set 7,b + ld a,(bc) ;читаем байт + res 6,b ;востанавливаем адрес + res 7,b + jr Ld_a_hl.L1 +Ld_a_hl: + ld a,11000000b ;проверка диапазона + and h + 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 ;востанавливаем адрес + jr .L1 +.L2 ld a,(WinPage) ;номер банки в 0-м окне + out (EmmWin.P3),a ;в третье окно ее + set 6,h ;корректируем адрес + set 7,h + ld a,(hl) ;читаем байт + res 6,h ;востанавливаем адрес + res 7,h +.L1 push af + ld a,(WinPage+3) ;номер банки из 3-го окна + out (EmmWin.P3),a ;востанавливаем + pop af + ret + +;[]=========================================================================[] +;[] Запись байта в память с проверкой адреса [] +;[] Вход: HL - адрес в памяти [] +;[] A - записываемый байт [] +;[]=========================================================================[] +Ld_hl_a: + push af + ld a,11000000b ;проверка диапазона + and h + jr z,.L2 ;в 0-ом окне + cp 10000000b ;во 2-ом окне? + jr z,.L1 + pop af + ld (hl),a ;записали байт, если нет + ret +.L1 ld a,(WinPage+2) ;номер банки под отладчиком + out (EmmWin.P3),a ;в третье окно ее + set 6,h ;корректируем адрес + pop af + ld (hl),a ;пишем байт + jr .L3 +.L2 ld a,(WinPage) ;номер банки в 0-ом + out (EmmWin.P3),a ;в третье окно ее + set 6,h ;корректируем адрес + set 7,h + pop af + ld (hl),a ;пишем байт + res 7,h ;востанавливаем адрес +.L3 res 6,h + ld a,(WinPage+3) ;номер банки из 3-го окна + out (EmmWin.P3),a ;востанавливаем + ret + +;[]=========================================================================[] +;[] Определение принадлежности адреса области памяти [] +;[] Вход: HL - нижний адрес области памяти [] +;[] DE - верхний адрес области памяти [] +;[] BC - адрес [] +;[] Выход: флаг C - адрес не принадлежит области памяти [] +;[] флаг NC - адрес принадлежит области памяти [] +;[]=========================================================================[] +AdrArea: + or a + sbc hl,bc + ret c + ex de,hl + or a + sbc hl,bc + ccf + ret + diff --git a/VERSION/build.bin b/VERSION/build.bin new file mode 100644 index 0000000..2f01c85 --- /dev/null +++ b/VERSION/build.bin @@ -0,0 +1 @@ +0003 \ No newline at end of file diff --git a/VERSION/date.bin b/VERSION/date.bin new file mode 100644 index 0000000..87ee74b --- /dev/null +++ b/VERSION/date.bin @@ -0,0 +1 @@ +210211 \ No newline at end of file diff --git a/VERSION/major.bin b/VERSION/major.bin new file mode 100644 index 0000000..c227083 --- /dev/null +++ b/VERSION/major.bin @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/VERSION/minor.bin b/VERSION/minor.bin new file mode 100644 index 0000000..9d60796 --- /dev/null +++ b/VERSION/minor.bin @@ -0,0 +1 @@ +11 \ No newline at end of file diff --git a/VERSION/time.bin b/VERSION/time.bin new file mode 100644 index 0000000..f677d90 --- /dev/null +++ b/VERSION/time.bin @@ -0,0 +1 @@ +00:00 \ No newline at end of file diff --git a/changes.txt b/changes.txt new file mode 100644 index 0000000..05f8c49 --- /dev/null +++ b/changes.txt @@ -0,0 +1,25 @@ +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/d010_136.rar b/d010_136.rar new file mode 100644 index 0000000000000000000000000000000000000000..eb1e91f7eca3b6c4eccb4fcfa38a2fb338762d32 GIT binary patch literal 139810 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 =U-gpyF9?CWB5HtBkG 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 z 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

!QD{&Iz6yUtDu=wTI)#1x23ro4n-$ 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 literal 0 HcmV?d00001 diff --git a/daemon.lst b/daemon.lst new file mode 100644 index 0000000..d2a5a9d --- /dev/null +++ b/daemon.lst @@ -0,0 +1 @@ +(0): error: Error opening file: daemon.asm diff --git a/demon.exe b/demon.exe new file mode 100644 index 0000000000000000000000000000000000000000..e83d1d541cd48f5d20b056842fe17933f3201f7e GIT binary patch literal 15202 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 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/dm.gif b/dm.gif new file mode 100644 index 0000000000000000000000000000000000000000..c50ddd068f77545469f474c5b20e07e2048c20f0 GIT binary patch literal 15523 zcmV;UJY2&^Nk%w1VSfUH0kZ%A0001h0001h0Dyo1004l10Du61fPjF2z`(%&00030 z0RR60009600RI60|NsC0A^8LV00000EC2ui0Dl650Rsg85XecZy*TU5yZ>M)j$~<` zXsWJk>%MR-&vb3yc&_h!@BcuUVQ8=vIm9DHsYx!0!Kidfty-_x>~1LGPQ1+{7%;|o z&tj%_&2GEj@VMNV?m{bfe7Z~qqv>Huf`f#GhKGoWii?bmj*pO$l9QB`mY0~Bnwy-R zo`+ANdTMr}Po#Z-eS)cTuCK7Mva_#cd}g+&xTCwbw7&Ig>h19H@-6S+%1ZU+_;sy*b@gx9%^Lx5 zpuvL(#oZaS!HKmz7Z^Si#id{yfeAZU%*e5$#~^?IHmRz0W`L?xE7z<^ zbBHWTG%QxKXTL%Xd$WYswOG!gWqU%d(5P*V{W}>HXiorrF&Irsn5o&ah7&6_Rru=S z!(VVCjIHcAa%awtA?GDQ*K_G9r9r1SeZlVN3@uCfr4Tf*g|(MWmyO(* zw`bY9L-XFvId^N~my;v+&6=gl3b=!RPCi`nYY?Z+W=XAhHQue=ufyI8+&0g@cXj6; zJbe9fskap?FIwGreEP-f>u(-ovwP!>vB#bNc-VdSnHB^7R+oXtbw(ggsk~zwVCbcH z7-autW*;9I?nhm70)8kWa}3Vl-*0lM^`3PPa_|*cB}$PXe+72XTZ`dD$XA6FPIzB{ z0oE5JTV=2nB8f;&hTn)s9x2vy(7A_}Wce8xBaTrzNEm{YO{ao(levatY~Tb|8;?

?tN`!%oR+wYJUy(@JAi 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 literal 0 HcmV?d00001 diff --git a/loadbin.asm b/loadbin.asm new file mode 100644 index 0000000..7d2ea23 --- /dev/null +++ b/loadbin.asm @@ -0,0 +1,191 @@ +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 + +.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 +.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 + + ld hl,(.LoadToAdr) + ld (ListAdr),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 + +.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 + + + +.bank db 0 +.FMid db 0 +.filenamelen db 0 +.LoadToAdr dw #4000 +.LoadLen dw #1000 +.LoadBinWnd db 2,23,13,36,6,7 + 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 diff --git a/make.bat b/make.bat new file mode 100644 index 0000000..c7ab951 --- /dev/null +++ b/make.bat @@ -0,0 +1,3 @@ +C:\asm\sjasm\sjasmplus.exe --lst=demon.lst --lstlab demon.asm +copy /B /Y demon.exe M:\Install\zx\sprinter\soft\emulator\exe\disk\ +pause 0 \ No newline at end of file diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..77b80f1 --- /dev/null +++ b/readme.txt @@ -0,0 +1,26 @@ +╠юэшЄюЁ-юЄырфўшъ 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/windows.asm b/windows.asm new file mode 100644 index 0000000..2f40c3c --- /dev/null +++ b/windows.asm @@ -0,0 +1,349 @@ + +;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 + + +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 +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) +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 + +;╨шёютрэшх чруюыютър юъэр +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 + +;╧ЁюЎхфєЁр юётюсюцфхэш  яЁ ьюєуюы№эющ яыю∙рфш юъэр +;═р тїюф: 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 + +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 + +;╦╚╤╥└┼╥ ─╬ ╤╦┼─╙▐┘┼├╬ ╧╙═╩╥└ ╠┼═▐ +MenuItemLen + LD B,0 +NextMnuItem + LD A,(HL) + INC HL + AND A + RET Z + INC B + JR NextMnuItem + + +;╧ЁюЁшёютър юъэр ш юсЁрсюЄър фшрыюур +DialogWindow + call Windows + inc hl +; jp WinDialog + +;╧╧ юсЁрсюЄъш фшрыюуютюую юъэр +;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 +.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 + +;Ordinary frame +FrameType1 + DB #DA,#BF,#D9,#C0,#C4,#B3 +;Double frame +FrameType2 + DB #C9,#BB,#BC,#C8,#CD,#BA \ No newline at end of file