commit 4c6b0a25fb48b2506968d4e7ead578da3be31ca6 Author: Dmitry Date: Sat Dec 26 23:59:23 2020 +0300 initial commit 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 0000000..d77f61d Binary files /dev/null and b/DEMON_old.EXE differ 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 0000000..eb1e91f Binary files /dev/null and b/d010_136.rar differ 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 0000000..e83d1d5 Binary files /dev/null and b/demon.exe differ diff --git a/demon.lst b/demon.lst new file mode 100644 index 0000000..161b2cf --- /dev/null +++ b/demon.lst @@ -0,0 +1,7807 @@ +0001 0000 ;[]=========================================================================[] +0002 0000 ;[] Монитор-отладчик DemoN [] +0003 0000 ;[] v0.01 - последние изменения 10.10.2004 [] +0004 0000 ;[] v0.02 - последние изменения 07.02.2005 [] +0005 0000 ;[] v0.03 - последние изменения 11.03.2006 [] +0006 0000 ;[] v0.10 - последние изменения 27.08.2006 [] +0007 0000 ;[]=========================================================================[] +0008 0000 +0009 0000 DEVICE ZXSPECTRUM128 +0010 0000 +0011 0000 ; define DEBUG 1 ;открытие дебаггерных заглушек +0012 0000 ; define D_PRINTCH_BIOS 1 +0013 0000 +0014 0000 org #8100-512 +0015 7F00 STARTPRG +0016 7F00 45 58 45 DB "EXE" ;EXE ID +0017 7F03 00 DB #00 ;EXE VERSION +0018 7F04 00 02 DW #0200 ;CODE OFFSET LOW +0019 7F06 00 00 DW #0000 ;CODE OFFSET HIGH +0020 7F08 00 00 DW #0000 ;END-BEG ;PRIMARY LOADER +0021 7F0A 00 00 DW #0000 ; +0022 7F0C 00 00 DW #0000 ;RESERVED +0023 7F0E 00 00 DW #0000 ; +0024 7F10 00 81 DW OrgAdr ;LOAD ADDRESS +0025 7F12 00 81 DW OrgAdr ;START ADDRESS +0026 7F14 01 C0 DW #C001 ;STACK ADDRESS +0027 7F16 +0028 7F16 +0029 7F16 OrgAdr equ 0x8100 +0030 7F16 org OrgAdr +0031 8100 ; stack 0xC001 +0032 8100 +0033 8100 DD E5 push ix ;адрес командной строки +0034 8102 DB C2 in a,(EmmWin.P2) ;банка с отладчиком +0035 8104 32 1E AB ld (BankDebug),a +0036 8107 DB 82 in a,(EmmWin.P0) ;банка с OS +0037 8109 32 1F AB ld (BankOS),a +0038 810C ; ld (WinPage),a +0039 810C +0040 810C ; ld (Reg._SP),sp ;адрес стека +0041 810C CD AC 8D call SaveAllRegs ;сохранение регистровых пар +0042 810F ; ld a,(BankDebug) +0043 810F 3E FF ld a,0xFF ;скрываем банку с отладчиком +0044 8111 32 41 AB ld (WinPage+2),a +0045 8114 include "cmdline.asm" +0001+ 8114 ;[]=========================================================================[] +0002+ 8114 ;[] Обработка командной строки монитора-отладчика DemoN [] +0003+ 8114 ;[] v0.10 - последние изменения 08.06.2006 [] +0004+ 8114 ;[] Вход: на стеке адрес начала командной строки в памяти [] +0005+ 8114 ;[] Выход: CF=1 - нет параметров, CF=0 - есть параметры [] +0006+ 8114 ;[]=========================================================================[] +0007+ 8114 CmdLine: +0008+ 8114 E1 pop hl ;начало +0009+ 8115 7E ld a,(hl) ;длина командной строки +0010+ 8116 B7 or a +0011+ 8117 37 scf +0012+ 8118 28 08 jr z,.L1 ;нет параметров +0013+ 811A +0014+ 811A 11 80 94 ld de,FDebug ;буфер +0015+ 811D 23 inc hl +0016+ 811E 0E 43 ld c,Dss.GSwitch ;выделение параметра +0017+ 8120 D7 rst DssRst +0018+ 8121 +0019+ 8121 B7 or a ;CF=0 +0020+ 8122 .L1 +0021+ 8122 ;ret +0022+ 8122 +0023+ 8122 +0046 8122 D4 CE 92 call nc,LoadFile +0047 8125 C3 AA 82 jp Start +0048 8128 +0049 8128 08 HorizLine db 8 ;количество линий +0050 8129 ;1-длина 2-столбец 3-строка 4-символ +0051 8129 db 0x4E,0x01,0x00,0xCD, 0x17,0x01,0x03,0xC4 +0051 8129 4E0100CD170103C4 +0052 8131 db 0x17,0x01,0x09,0xC4, 0x17,0x01,0x0F,0xC4 +0052 8131 170109C417010FC4 +0053 8139 db 0x17,0x01,0x11,0xCD, 0x4E,0x01,0x15,0xCD +0053 8139 170111CD4E0115CD +0054 8141 db 0x4E,0x01,0x1E,0xCD, 0x17,0x01,0x13,0xCD +0054 8141 4E011ECD170113CD +0055 8149 +0056 8149 05 VerticalLine db 5 ;количество линий +0057 814A ;1-высота 2-столбец 3-строка 4-символ +0058 814A db 0x1D,0x00,0x01,0xBA, 0x10,0x09,0x01,0xB3 +0058 814A 1D0001BA100901B3 +0059 8152 db 0x08,0x0C,0x16,0xBA, 0x14,0x18,0x01,0xBA +0059 8152 080C16BA141801BA +0060 815A 1D 4F 01 BA db 0x1D,0x4F,0x01,0xBA +0061 815E +0062 815E 29 Corner db 41 ;углы рамок +0063 815F ;1-столбец 2-строка 3-символ +0064 815F db 0x00,0x00,0xC9, 0x00,0x03,0xC7, 0x00,0x09,0xC7 +0064 815F 0000C90003C70009C7 +0065 8168 db 0x00,0x0F,0xC7, 0x00,0x11,0xCC, 0x00,0x15,0xCC +0065 8168 000FC70011CC0015CC +0066 8171 db 0x00,0x1E,0xC8, 0x06,0x11,0xD1, 0x06,0x13,0xCF +0066 8171 001EC80611D10613CF +0067 817A db 0x09,0x00,0xD1, 0x09,0x03,0xC5, 0x09,0x09,0xC5 +0067 817A 0900D10903C50909C5 +0068 8183 db 0x09,0x0F,0xC5, 0x0C,0x11,0xD1, 0x0C,0x15,0xCB +0068 8183 090FC50C11D10C15CB +0069 818C db 0x0C,0x1E,0xCA, 0x12,0x0F,0xC2, 0x12,0x11,0xD8 +0069 818C 0C1ECA120FC21211D8 +0070 8195 db 0x12,0x13,0xCF, 0x18,0x00,0xCB, 0x18,0x03,0xB6 +0070 8195 1213CF1800CB1803B6 +0071 819E db 0x18,0x09,0xB6, 0x18,0x0F,0xB6, 0x18,0x15,0xCA +0071 819E 1809B6180FB61815CA +0072 81A7 db 0x00,0x13,0xCC, 0x0C,0x13,0xCF, 0x4F,0x00,0xBB +0072 81A7 0013CC0C13CF4F00BB +0073 81B0 db 0x18,0x13,0xB9, 0x4F,0x15,0xB9, 0x4F,0x1E,0xBC +0073 81B0 1813B94F15B94F1EBC +0074 81B9 db 0x18,0x11,0xB9, 0x06,0x12,0xB3, 0x12,0x10,0xB3 +0074 81B9 1811B90612B31210B3 +0075 81C2 db 0x12,0x12,0xB3, 0x09,0x13,0xD1, 0x09,0x14,0xB3 +0075 81C2 1212B30913D10914B3 +0076 81CB db 0x09,0x15,0xCF, 0x0C,0x12,0xB3, 0x0E,0x13,0xCB +0076 81CB 0915CF0C12B30E13CB +0077 81D4 db 0x0E,0x14,0xBA, 0x0E,0x15,0xCA +0077 81D4 0E14BA0E15CA +0078 81DA +0079 81DA TextStrReg db 0x16,0x01,0x01,"IX", 0x16,0x01,0x02,"IY" +0079 81DA 16010149581601024959 +0080 81E4 db 0x16,0x01,0x04,"HL", 0x16,0x01,0x05,"DE" +0080 81E4 160104484C1601054445 +0081 81EE db 0x16,0x01,0x06,"BC", 0x16,0x01,0x07,"AF" +0081 81EE 16010642431601074146 +0082 81F8 db 0x16,0x01,0x0A,"HL'", 0x16,0x01,0x0B,"DE'" +0082 81F8 16010A484C2716010B444527 +0083 8204 db 0x16,0x01,0x0C,"BC'", 0x16,0x01,0x0D,"AF'" +0083 8204 16010C42432716010D414627 +0084 8210 db 0x16,0x01,0x10,"PC", 0x16, 0x0A,0x10,"IR" +0084 8210 1601105043160A104952 +0085 821A db 0x16,0x01,0x14,"SP",0 +0085 821A 160114535000 +0086 8220 TextStrLogo db 0x016,0x01,0x1F,0xC4,0xCD,0xCD +0086 8220 16011FC4CDCD +0087 8226 db " DemoN v" +0087 8226 2044656D6F4E2076 +0088 822E incbin "VERSION\major.bin" +0089 822F 2E db "." +0090 8230 incbin "VERSION\minor.bin" +0091 8232 db " build " +0091 8232 206275696C6420 +0092 8239 incbin "VERSION\build.bin" +0093 823D db " (alpha)-" +0093 823D 2028616C706861292D +0094 8246 incbin "VERSION\date.bin" +0095 824C db " Igor by AlphA Studio, Hard/WCG" +0095 824C 2049676F7220627920416C7068412053747564696F2C20486172642F574347 +0096 826B 20CDCDC400 db 0x20,0xCD,0xCD,0xC4,0x00 +0097 8270 TextStrWin db 0x16,0x02,0x11," 0 ",0x16,0x08,0x11," 1 " +0097 8270 160211203020160811203120 +0098 827C db 0x16,0x0E,0x11," 2 ",0x16,0x14,0x11," 3 ",0 +0098 827C 160E1120322016141120332000 +0099 8289 TextStrRez db 0x16,0x0F,0x14,"REZ",0 +0099 8289 160F1452455A00 +0100 8290 +0101 8290 +0102 8290 ;Процедура прорисовки линий +0103 8290 ;HL - адрес начала таблицы +0104 8290 4E DrawLine ld c,(hl) ;количество линий +0105 8291 23 inc hl +0106 8292 46 ld b,(hl) ;длина линии +0107 8293 23 inc hl +0108 8294 5E ld e,(hl) ;столбец +0109 8295 23 inc hl +0110 8296 56 ld d,(hl) ;строка +0111 8297 23 inc hl +0112 8298 7E ld a,(hl) ;символ +0113 8299 E5 push hl +0114 829A C5 .L1 push bc +0115 829B F5 push af +0116 829C 01 58 00 ld bc,Dss.WrChar ;цвет в рег.B +0117 829F D7 rst DssRst +0118 82A0 14 inc d ;наращивание координаты +0119 82A1 F1 pop af +0120 82A2 C1 pop bc +0121 82A3 10 F5 djnz .L1 +0122 82A5 E1 pop hl +0123 82A6 0D dec c +0124 82A7 20 E8 jr nz,DrawLine+1 +0125 82A9 C9 ret +0126 82AA +0127 82AA ;Начало программы +0128 82AA Start: +0129 82AA 21 62 AA ld hl,Hello ;сообщение программы +0130 82AD 0E 5C ld c,Dss.PChars ;вывести строку +0131 82AF D7 rst DssRst +0132 82B0 0E 51 ld c,Dss.GetVMod ;Текущий граф режим +0133 82B2 D7 rst DssRst +0134 82B3 DA 09 88 jp c,Exit +0135 82B6 32 60 AA ld (OSGrafMode),a +0136 82B9 78 ld a,b +0137 82BA 32 5F AA ld (OSScreen),a ;и текущая страница экрана +0138 82BD C5 push bc +0139 82BE 01 3D 01 ld bc,#0100+Dss.GetMem ;резервируем 1 страницу для оконного буфера +0140 82C1 D7 rst DssRst +0141 82C2 D1 pop de ;В D - номер страницы экрана - OSScreen +0142 82C3 DA 09 88 jp c,Exit ;Ошибка выделения блока памяти +0143 82C6 32 61 AA ld (BufPage),a ;Сохраним страницу в переменной +0144 82C9 47 ld b,a +0145 82CA 3A 5E AA ld a,(DemonScreen) +0146 82CD BA cp d ;если экраны ОС и Демона не совпадают +0147 82CE 20 0D jr nz,StartNext ;то и не сохраняем экран ОСи +0148 82D0 11 00 00 ld de,0 ;Сохраняем экран в доп.странице +0149 82D3 21 50 20 ld hl,#2050 +0150 82D6 DD 21 00 C0 ld ix,#c000 +0151 82DA 0E 59 ld c,Dss.WinCopy +0152 82DC D7 rst DssRst +0153 82DD +0154 82DD 3A 5E AA StartNext ld a,(DemonScreen) ;экран отладчика +0155 82E0 47 ld b,a +0156 82E1 3E 03 ld a,3 ;установить режим 80х32 +0157 82E3 0E 50 ld c,Dss.SetVMod ;Dss.SelPage +0158 82E5 ; ld bc,0x0054 +0159 82E5 D7 rst DssRst +0160 82E6 ifdef D_PRINTCH_BIOS +0161 82E6~ ld ix,MainWin ;Открытие окна ч/з биос +0162 82E6~ ld e,00010001b +0163 82E6~ rst BiosRst +0164 82E6~ ld (Demon.Bios_Win),a +0165 82E6~ ; jr nc,.lp1 +0166 82E6~ ; ld c,Dss.EchoKey ;дебуггерная заглушка +0167 82E6~ ; rst DssRst +0168 82E6~ 0169 82E6 endif +0170 82E6 .lp1 +0171 82E6 ; ld a,(Color._SP) ;подсветка вершины стека +0172 82E6 ; ld b,a +0173 82E6 ; ld de,0x1C01 +0174 82E6 ; ld hl,0x010B +0175 82E6 ; ld a," " +0176 82E6 ; ld c,Dss.Clear +0177 82E6 ; rst DssRst +0178 82E6 CD 01 83 call ClearScreen +0179 82E9 CD 0F 83 call DrawDemonScreen +0180 82EC +0181 82EC ; ld c,Dss.EchoKey ;дебуггерная заглушка +0182 82EC ; rst DssRst +0183 82EC +0184 82EC C3 00 88 jp Start1 +0185 82EF ;Обновление экрана демона +0186 82EF CD 35 92 RefreshScreen call CursorRes +0187 82F2 CD 01 83 call ClearScreen +0188 82F5 CD 0F 83 call DrawDemonScreen +0189 82F8 CD 3C 88 call Refresh +0190 82FB CD B3 99 call Cursor ;вкл курсор +0191 82FE C3 D3 91 jp CursorSet +0192 8301 +0193 8301 3A 11 AB ClearScreen ld a,(Color.Screen) +0194 8304 47 ld b,a ;очистка экрана +0195 8305 11 00 00 ld de,0 +0196 8308 21 50 20 ld hl,0x2050 +0197 830B 0E 89 ld c,Bios.Lp_Cls_Win +0198 830D CF rst BiosRst +0199 830E C9 ret +0200 830F DrawDemonScreen +0201 830F 3A 12 AB ld a,(Color.Border) ;установка цвета рамки +0202 8312 32 9E 82 ld (DrawLine.L1+4),a +0203 8315 32 3C 83 ld (DrawCorner+10),a +0204 8318 3E 14 ld a,0x14 ;код мнемоники INC D +0205 831A 32 A0 82 ld (DrawLine.L1+6),a +0206 831D +0207 831D 21 49 81 ld hl,VerticalLine ;вертикальные линии +0208 8320 CD 90 82 call DrawLine +0209 8323 +0210 8323 21 28 81 ld hl,HorizLine ;горизонтальные линии +0211 8326 3E 1C ld a,0x1C ;код мнемоники INC E +0212 8328 32 A0 82 ld (DrawLine.L1+6),a +0213 832B CD 90 82 call DrawLine +0214 832E +0215 832E 21 5E 81 ld hl,Corner +0216 8331 46 ld b,(hl) ;количество углов +0217 8332 C5 DrawCorner push bc +0218 8333 23 inc hl +0219 8334 5E ld e,(hl) ;столбец +0220 8335 23 inc hl +0221 8336 56 ld d,(hl) ;строка +0222 8337 23 inc hl +0223 8338 7E ld a,(hl) ;символ +0224 8339 E5 push hl +0225 833A 01 58 00 ld bc,Dss.WrChar ;цвет в рег.B +0226 833D D7 rst DssRst +0227 833E E1 pop hl +0228 833F C1 pop bc +0229 8340 10 F0 djnz DrawCorner +0230 8342 +0231 8342 21 DA 81 ld hl,TextStrReg +0232 8345 3A 13 AB ld a,(Color.TextStrReg) ;цвет регистровых пар +0233 8348 32 5C 8E ld (PrnStrColor.L1+5),a +0234 834B CD 32 8E call PrnStrColor +0235 834E 21 70 82 ld hl,TextStrWin +0236 8351 3A 14 AB ld a,(Color.TextStrWin) ;цвет номеров окон +0237 8354 32 5C 8E ld (PrnStrColor.L1+5),a +0238 8357 CD 32 8E call PrnStrColor +0239 835A 21 20 82 ld hl,TextStrLogo +0240 835D 3A 18 AB ld a,(Color.TextStrLogo) ;цвет лого программы +0241 8360 32 5C 8E ld (PrnStrColor.L1+5),a +0242 8363 CD 32 8E call PrnStrColor +0243 8366 21 89 82 ld hl,TextStrRez +0244 8369 3A 17 AB ld a,(Color.RezArea) ;цвет резидента +0245 836C 32 5C 8E ld (PrnStrColor.L1+5),a +0246 836F CD 32 8E call PrnStrColor +0247 8372 C9 ret +0248 8373 00 ds OrgAdr+0x700-$ +0249 8800 Start1: +0250 8800 CD E4 9E call PreparChar ;подготовка программного курсора ввода +0251 8803 ; ld hl,(Reg._PC) +0252 8803 ; ld hl,0 +0253 8803 ; ld (ListAdr),hl +0254 8803 +0255 8803 CD 3C 88 call Refresh +0256 8806 CD 51 98 call Keyb +0257 8809 +0258 8809 Exit: +0259 8809 2A 31 9F ld hl,(Rst38.Vect+1) ;восстановление вектора DSS +0260 880C 22 39 00 ld (0039h),hl +0261 880F +0262 880F 3A 5F AA ld a,(OSScreen) ;и текущая страница экрана +0263 8812 47 ld b,a +0264 8813 C5 push bc +0265 8814 3A 60 AA ld a,(OSGrafMode) +0266 8817 0E 50 ld c,Dss.SetVMod +0267 8819 +0268 8819 ; ld bc,0x0100+Dss.SelPage ;восстановление экрана DSS +0269 8819 D7 rst DssRst +0270 881A C1 pop bc +0271 881B 3A 5E AA ld a,(DemonScreen) +0272 881E B8 cp b +0273 881F 20 16 jr nz,ExitNext +0274 8821 11 00 00 ld de,0 ;Восстанавливаем экран из доп.страницы +0275 8824 21 50 20 ld hl,#2050 +0276 8827 DD 21 00 C0 ld ix,#c000 +0277 882B 0E 5A ld c,Dss.WinRest +0278 882D 3A 61 AA ld a,(BufPage) +0279 8830 F5 push af +0280 8831 47 ld b,a +0281 8832 D7 rst DssRst +0282 8833 F1 pop af +0283 8834 0E 3E ld c,Dss.FreeMem ;Отдаем страницу буфера обратно ОСи +0284 8836 D7 rst DssRst +0285 8837 +0286 8837 ExitNext +0287 8837 01 41 00 ld bc,Dss.Exit ;нормальное завершение +0288 883A D7 rst DssRst +0289 883B C9 Return ret +0290 883C +0291 883C Refresh: +0292 883C F3 di +0293 883D 11 04 01 ld de,0x0104 ;вывод значений регистров +0294 8840 2A 25 AB ld hl,(Reg._IX) +0295 8843 CD 13 8F call PrintStrReg +0296 8846 11 04 02 ld de,0x0204 +0297 8849 2A 27 AB ld hl,(Reg._IY) +0298 884C CD 13 8F call PrintStrReg +0299 884F 11 04 04 ld de,0x0404 +0300 8852 2A 29 AB ld hl,(Reg._HL) +0301 8855 CD 13 8F call PrintStrReg +0302 8858 11 04 05 ld de,0x0504 +0303 885B 2A 2B AB ld hl,(Reg._DE) +0304 885E CD 13 8F call PrintStrReg +0305 8861 11 04 06 ld de,0x0604 +0306 8864 2A 2D AB ld hl,(Reg._BC) +0307 8867 CD 13 8F call PrintStrReg +0308 886A 11 04 0A ld de,0x0A04 +0309 886D 2A 31 AB ld hl,(Reg._HL_) +0310 8870 CD 13 8F call PrintStrReg +0311 8873 11 04 0B ld de,0x0B04 +0312 8876 2A 33 AB ld hl,(Reg._DE_) +0313 8879 CD 13 8F call PrintStrReg +0314 887C 11 04 0C ld de,0x0C04 +0315 887F 2A 35 AB ld hl,(Reg._BC_) +0316 8882 CD 13 8F call PrintStrReg +0317 8885 11 04 07 ld de,0x0704 +0318 8888 2A 2F AB ld hl,(Reg._AF) +0319 888B CD 9D 8E call PrintStrAF +0320 888E 11 04 0D ld de,0x0D04 +0321 8891 2A 37 AB ld hl,(Reg._AF_) +0322 8894 CD 9D 8E call PrintStrAF +0323 8897 11 04 10 ld de,0x1004 +0324 889A 2A 3D AB ld hl,(Reg._PC) +0325 889D CD 67 8E call PrintReg +0326 88A0 11 0D 10 ld de,0x100D +0327 88A3 2A 39 AB ld hl,(Reg._IR) +0328 88A6 CD 67 8E call PrintReg +0329 88A9 11 04 14 ld de,0x1404 +0330 88AC 2A 3B AB ld hl,(Reg._SP) +0331 88AF CD 67 8E call PrintReg +0332 88B2 CD AE 8F call PrintSPDn +0333 88B5 11 13 14 ld de,0x1413 +0334 88B8 2A 20 AB ld hl,(RezAdr) +0335 88BB CD 67 8E call PrintReg +0336 88BE +0337 88BE CD 76 8F call PrintStrWin ;вывод номеров банок в окнах +0338 88C1 +0339 88C1 CD F5 8F call PrintStrSP ;вывод дампа стека +0340 88C4 +0341 88C4 CD 67 90 call PrintDump +0342 88C7 FB ei +0343 88C8 C3 54 89 jp DisAsm +0344 88CB +0345 88CB CD 35 92 DemonHelp call CursorRes +0346 88CE DD 21 D5 88 ld ix,HelpWnd +0347 88D2 C3 D5 B9 jp DialogWindow +0348 88D5 +0349 88D5 ; ld hl,HelpWndDlg +0350 88D5 ; jp WinDialog +0351 88D5 HelpWnd db 6,16,11,42,7,#27 +0351 88D5 06100B2A0727 +0352 88DB db "DemoN Help Page",0 +0352 88DB 44656D6F4E2048656C70205061676500 +0353 88EB db " DemoN v" +0353 88EB 2044656D6F4E2076 +0354 88F3 incbin "VERSION\major.bin" +0355 88F4 2E db "." +0356 88F5 incbin "VERSION\minor.bin" +0357 88F7 db " build " +0357 88F7 206275696C6420 +0358 88FE incbin "VERSION\build.bin" +0359 8902 db " (alpha)-" +0359 8902 2028616C706861292D +0360 890B incbin "VERSION\date.bin" +0361 8911 0D db 0x0D +0362 8912 db " Igor by AlphA Studio, Hard/WCG",0x0D,0x0D +0362 8912 2020202049676F7220627920416C7068412053747564696F2C20486172642F57 +0362 8932 43470D0D +0363 8936 db " OK",0 +0363 8936 2020202020202020202020202020202020204F4B00 +0364 894B 01 HelpWndDlg db 1 ;Описатель диалогового окна +0365 894C 23 10 04 02 db 16+19,16,4,2 +0366 8950 00 00 00 00 dw 0,0 +0367 8954 +0368 8954 include "EQU\dss_equ.asm";"D:\WORKAST\EQU\dss_equ" +0001+ 8954 DssRst EQU #10 +0002+ 8954 +0003+ 8954 Dss.Version EQU #00 +0004+ 8954 Dss.ChDisk EQU #01 +0005+ 8954 Dss.CurDisk EQU #02 +0006+ 8954 Dss.DskInfo EQU #03 +0007+ 8954 ;Dss.G_ENTRY EQU #04 +0008+ 8954 ; EQU #05 +0009+ 8954 ; EQU #06 +0010+ 8954 ; EQU #07 +0011+ 8954 ; EQU #08 +0012+ 8954 Dss.BOOTDSK EQU #09 +0013+ 8954 ;File io +0014+ 8954 Dss.Create EQU #0A +0015+ 8954 Dss.Creat_N EQU #0B +0016+ 8954 ; EQU #0C +0017+ 8954 ;Dss.ERASE EQU #0D +0018+ 8954 Dss.Delete EQU #0E +0019+ 8954 ;Dss.Move EQU #0F +0020+ 8954 Dss.Rename EQU #10 +0021+ 8954 Dss.Open EQU #11 +0022+ 8954 Dss.Close EQU #12 +0023+ 8954 Dss.Read EQU #13 +0024+ 8954 Dss.Write EQU #14 +0025+ 8954 Dss.Move_FP EQU #15 +0026+ 8954 Dss.Attrib EQU #16 +0027+ 8954 Dss.Get_D_T EQU #17 +0028+ 8954 Dss.Put_D_T EQU #18 +0029+ 8954 Dss.F_First EQU #19 +0030+ 8954 Dss.F_Next EQU #1A +0031+ 8954 Dss.MkDir EQU #1B +0032+ 8954 Dss.RmDir EQU #1C +0033+ 8954 Dss.ChDir EQU #1D +0034+ 8954 Dss.CurDir EQU #1E +0035+ 8954 ; EQU #1F +0036+ 8954 ; EQU #20 +0037+ 8954 Dss.SysTime EQU #21 +0038+ 8954 Dss.SetTime EQU #22 +0039+ 8954 ; EQU #23 +0040+ 8954 ; EQU #24 +0041+ 8954 ; EQU #25 +0042+ 8954 ; EQU #26 +0043+ 8954 ; EQU #27 +0044+ 8954 ; EQU #28 +0045+ 8954 ; EQU #29 +0046+ 8954 ; EQU #2A +0047+ 8954 ; EQU #2B +0048+ 8954 ; EQU #2C +0049+ 8954 ; EQU #2D +0050+ 8954 ; EQU #2E +0051+ 8954 ; EQU #2F +0052+ 8954 ;Keyboard +0053+ 8954 Dss.WaitKey EQU #30 +0054+ 8954 Dss.ScanKey EQU #31 +0055+ 8954 Dss.EchoKey EQU #32 +0056+ 8954 Dss.CTRLKey EQU #33 +0057+ 8954 ;Dss.EDIT EQU #34 +0058+ 8954 Dss.K_CLEAR EQU #35 +0059+ 8954 Dss.K_SETUP EQU #36 +0060+ 8954 Dss.TESTKEY EQU #37 +0061+ 8954 ;Memory +0062+ 8954 Dss.SetWin EQU #38 +0063+ 8954 Dss.SetWin1 EQU #39 +0064+ 8954 Dss.SetWin2 EQU #3A +0065+ 8954 Dss.SetWin3 EQU #3B +0066+ 8954 Dss.INFOMEM EQU #3C +0067+ 8954 Dss.GetMem EQU #3D +0068+ 8954 Dss.FreeMem EQU #3E +0069+ 8954 Dss.SetMem EQU #3F +0070+ 8954 ;Execution +0071+ 8954 Dss.Exec EQU #40 +0072+ 8954 Dss.Exit EQU #41 +0073+ 8954 Dss.Wait EQU #42 +0074+ 8954 +0075+ 8954 Dss.GSwitch EQU #43 +0076+ 8954 Dss.DosName EQU #44 +0077+ 8954 Dss.EX_Path EQU #45 +0078+ 8954 Dss.Environ EQU #46 +0079+ 8954 Dss.AppInfo EQU #47 +0080+ 8954 ; EQU #48 +0081+ 8954 ; EQU #49 +0082+ 8954 ; EQU #4A +0083+ 8954 ; EQU #4B +0084+ 8954 ; EQU #4C +0085+ 8954 ; EQU #4D +0086+ 8954 ; EQU #4E +0087+ 8954 ; EQU #4F +0088+ 8954 +0089+ 8954 Dss.SetVMod EQU #50 +0090+ 8954 Dss.GetVMod EQU #51 +0091+ 8954 Dss.Locate EQU #52 +0092+ 8954 Dss.Cursor EQU #53 +0093+ 8954 Dss.SelPage EQU #54 +0094+ 8954 Dss.Scroll EQU #55 +0095+ 8954 Dss.Clear EQU #56 +0096+ 8954 Dss.RdChar EQU #57 +0097+ 8954 Dss.WrChar EQU #58 +0098+ 8954 Dss.WinCopy EQU #59 +0099+ 8954 Dss.WinRest EQU #5A +0100+ 8954 Dss.PutChar EQU #5B +0101+ 8954 Dss.PChars EQU #5C +0102+ 8954 ;Dss.RES_PRN EQU #5D +0103+ 8954 ;Dss.CTRLPRN EQU #5E +0104+ 8954 Dss.Print EQU #5F +0105+ 8954 ; +0106+ 8954 +0369 8954 include "EQU\bios_equ.asm";"D:\WORKAST\EQU\bios_equ" +0001+ 8954 BiosRst EQU #08 +0002+ 8954 +0003+ 8954 ;Функции работы с памятью +0004+ 8954 Bios.Emm_Fn0 EQU #C0 +0005+ 8954 Bios.Emm_Fn1 EQU #C1 +0006+ 8954 Bios.Emm_Fn2 EQU #C2 +0007+ 8954 Bios.Emm_Fn3 EQU #C3 +0008+ 8954 Bios.Emm_Fn4 EQU #C4 +0009+ 8954 Bios.Emm_Fn5 EQU #C5 +0010+ 8954 Bios.Emm_Fn6 EQU #C6 +0011+ 8954 Bios.Emm_Fn7 EQU #C7 +0012+ 8954 Bios.Emm_Fn8 EQU #C8 +0013+ 8954 Bios.Emm_Fn9 EQU #C9 +0014+ 8954 +0015+ 8954 +0016+ 8954 ;Функции управления окнами и режимами экрана +0017+ 8954 Bios.Win_Open EQU #B0 +0018+ 8954 Bios.Win_Close EQU #B1 +0019+ 8954 Bios.Win_Copy_Win EQU #B2 +0020+ 8954 Bios.Win_Restore_Win EQU #B3 +0021+ 8954 Bios.Win_Get_Sym EQU #B4 +0022+ 8954 Bios.Win_Put_Sym EQU #B5 +0023+ 8954 Bios.Win_Set_ZG EQU #B6 +0024+ 8954 Bios.Win_Move_Win EQU #B7 +0025+ 8954 Bios.Win_Get_ZG EQU #B8 +0026+ 8954 +0027+ 8954 +0028+ 8954 +0029+ 8954 ;Функции вывода текста на экран +0030+ 8954 Bios.Lp_Print_All EQU #81 +0031+ 8954 Bios.Lp_Print_Sym EQU #82 +0032+ 8954 Bios.Lp_Print_Atr EQU #83 +0033+ 8954 Bios.Lp_Set_Place EQU #84 +0034+ 8954 Bios.Lp_Print_Ln EQU #85 +0035+ 8954 Bios.Lp_Print_Ln2 EQU #86 +0036+ 8954 Bios.Lp_Print_Ln3 EQU #87 +0037+ 8954 Bios.Lp_Print_Ln4 EQU #88 +0038+ 8954 Bios.Lp_Cls_Win EQU #89 +0039+ 8954 Bios.Lp_Scroll_Up EQU #8A +0040+ 8954 Bios.Lp_Print_Ln5 EQU #8B +0041+ 8954 Bios.Lp_Print_Ln6 EQU #8C +0042+ 8954 Bios.Lp_Cls_Win2 EQU #8D +0043+ 8954 Bios.Lp_Get_Place EQU #8E +0044+ 8954 +0045+ 8954 ;Функции работы с жесткими дисками и дисководами +0046+ 8954 Bios.Drv_Reset EQU #51 +0047+ 8954 Bios.Drv_Verify EQU #54 +0048+ 8954 Bios.Drv_Read EQU #55 +0049+ 8954 Bios.Drv_Write EQU #56 +0050+ 8954 Bios.Drv_Detect EQU #57 +0051+ 8954 Bios.Drv_Get_Par EQU #58 +0052+ 8954 Bios.Drv_Set_Par EQU #59 +0053+ 8954 Bios.Ext_Version EQU #5A +0054+ 8954 Bios.Drv_List EQU #5F +0055+ 8954 +0056+ 8954 +0057+ 8954 +0058+ 8954 +0059+ 8954 +0060+ 8954 +0370 8954 include "EQU\port.asm";"D:\WORKAST\EQU\port" +0001+ 8954 EmmWin.P0 EQU #82 +0002+ 8954 EmmWin.P1 EQU #A2 +0003+ 8954 EmmWin.P2 EQU #C2 +0004+ 8954 EmmWin.P3 EQU #E2 +0005+ 8954 +0371 8954 include "disasm.asm";"D:\WORKAST\DEMON\disasm" +0001+ 8954 ;[]=========================================================================[] +0002+ 8954 ;[] Дизассемблер монитора-отладчика DemoN [] +0003+ 8954 ;[] v0.01 - последние изменения 10.10.2004 [] +0004+ 8954 ;[] v0.02 - последние изменения 20.03.2005 [] +0005+ 8954 ;[] v0.03 - последние изменения 16.02.2006 [] +0006+ 8954 ;[] v0.10 - последние изменения 10.09.2006 [] +0007+ 8954 ;[] [] +0008+ 8954 ;[] DisAsm - вывод листинга [] +0009+ 8954 ;[] AttrList - вывод атрибутов строки листинга [] +0010+ 8954 ;[] UpAdres - расчет предыдущего адреса строки листинга [] +0011+ 8954 ;[] List - формирование строки листинга [] +0012+ 8954 ;[]=========================================================================[] +0013+ 8954 +0014+ 8954 ;[]=========================================================================[] +0015+ 8954 ;[] Вывод листинга [] +0016+ 8954 ;[]=========================================================================[] +0017+ 8954 DisAsm: +0018+ 8954 2A 55 AB ld hl,(ListAdr) ;адрес первой строки листинга +0019+ 8957 11 1A 01 ld de,0x011A ;координаты печати +0020+ 895A D5 .L1 push de +0021+ 895B E5 push hl +0022+ 895C D5 push de +0023+ 895D 7A ld a,d +0024+ 895E 3D dec a +0025+ 895F 87 add a,a +0026+ 8960 4F ld c,a +0027+ 8961 06 00 ld b,0 +0028+ 8963 EB ex de,hl +0029+ 8964 21 55 AB ld hl,ListAdr +0030+ 8967 09 add hl,bc +0031+ 8968 73 ld (hl),e ;адрес строки листинга +0032+ 8969 23 inc hl +0033+ 896A 72 ld (hl),d +0034+ 896B EB ex de,hl +0035+ 896C D1 pop de +0036+ 896D +0037+ 896D CD 9B 89 call AttrList ;окрасить строку +0038+ 8970 +0039+ 8970 CD 67 8E .L2 call PrintReg +0040+ 8973 E1 pop hl +0041+ 8974 CD 42 8A call List +0042+ 8977 D1 pop de +0043+ 8978 +0044+ 8978 ; push af ;длина кода временно +0045+ 8978 +0046+ 8978 3A 7D AB ld a,(ListFormat) ;форматный вывод +0047+ 897B B7 or a +0048+ 897C C4 0C 8A call nz,LFormat +0049+ 897F +0050+ 897F D5 push de +0051+ 8980 E5 push hl +0052+ 8981 F3 di +0053+ 8982 3E 15 ld a,21 +0054+ 8984 83 add a,e +0055+ 8985 5F ld e,a ;новая координата X +0056+ 8986 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати +0057+ 8988 CF rst BiosRst +0058+ 8989 ; ld c,Dss.Locate +0059+ 8989 ; rst DssRst +0060+ 8989 21 87 8D ld hl,List.String +0061+ 898C 01 86 20 ld bc,32*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки +0062+ 898F CF rst BiosRst +0063+ 8990 FB ei +0064+ 8991 ; ld c,Dss.PChars +0065+ 8991 ; rst DssRst +0066+ 8991 E1 pop hl +0067+ 8992 D1 pop de +0068+ 8993 +0069+ 8993 ;печать длины кода в поле метки (временно) +0070+ 8993 ; pop af +0071+ 8993 ; push de +0072+ 8993 ; push hl +0073+ 8993 ; ld e,0x24 +0074+ 8993 ; push de +0075+ 8993 ; ld h,0 +0076+ 8993 ; ld l,a +0077+ 8993 ; ld de,.Buf +0078+ 8993 ; call NumToStr8 +0079+ 8993 ; pop de +0080+ 8993 ; ld c,Dss.Locate +0081+ 8993 ; rst DssRst +0082+ 8993 ; ld hl,.Buf +0083+ 8993 ; ld c,Dss.PChars +0084+ 8993 ; rst DssRst +0085+ 8993 ; pop hl +0086+ 8993 ; pop de +0087+ 8993 ; jr $+5 +0088+ 8993 ;.Buf db "123",0 +0089+ 8993 ;end (временно) +0090+ 8993 +0091+ 8993 14 inc d ;следующая строка +0092+ 8994 3A C3 9B ld a,(KList.Descript) ;кол-во строк листинга +0093+ 8997 BA cp d +0094+ 8998 30 C0 jr nc,.L1 +0095+ 899A C9 ret +0096+ 899B +0097+ 899B ;[]=========================================================================[] +0098+ 899B ;[] Вывод атрибутов строки листинга [] +0099+ 899B ;[] Вход: DE - координаты подсветки [] +0100+ 899B ;[] HL - текущий адрес листинга [] +0101+ 899B ;[]=========================================================================[] +0102+ 899B AttrList: +0103+ 899B F3 di +0104+ 899C E5 push hl ;текущий адрес листинга +0105+ 899D D5 push de ;текущие координаты +0106+ 899E +0107+ 899E E5 push hl +0108+ 899F ED 4B 3D AB ld bc,(Reg._PC) ;адрес программного счетчика +0109+ 89A3 B7 or a ;сброс флага C +0110+ 89A4 ED 42 sbc hl,bc +0111+ 89A6 E1 pop hl +0112+ 89A7 20 05 jr nz,.L2 +0113+ 89A9 3A 16 AB ld a,(Color._PC) ;цвет программного курсора +0114+ 89AC 18 20 jr .L0 +0115+ 89AE +0116+ 89AE E5 .L2 push hl +0117+ 89AF D5 push de +0118+ 89B0 E5 push hl +0119+ 89B1 01 7D 00 ld bc,Rezident.End-Rezident;длина резидента +0120+ 89B4 2A 20 AB ld hl,(RezAdr) ;начало резидента +0121+ 89B7 E5 push hl +0122+ 89B8 09 add hl,bc ;конечный адрес резидента +0123+ 89B9 D1 pop de +0124+ 89BA 1B dec de +0125+ 89BB 1B dec de +0126+ 89BC 1B dec de +0127+ 89BD 1B dec de +0128+ 89BE C1 pop bc +0129+ 89BF +0130+ 89BF CD C4 92 call AdrArea +0131+ 89C2 D1 pop de +0132+ 89C3 E1 pop hl +0133+ 89C4 38 05 jr c,.L3 +0134+ 89C6 3A 17 AB ld a,(Color.RezArea) ;цвет области размещения резидента +0135+ 89C9 18 03 jr .L0 +0136+ 89CB +0137+ 89CB 3A 11 AB .L3 ld a,(Color.Screen) ;основной цвет +0138+ 89CE +0139+ 89CE 32 D6 89 .L0 ld (.L1+1),a +0140+ 89D1 1D dec e +0141+ 89D2 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати +0142+ 89D4 CF rst BiosRst +0143+ 89D5 1E 00 .L1 ld e,0 ;цвет подсветки +0144+ 89D7 01 83 36 ld bc,54*256+Bios.Lp_Print_Atr ;в рег.B длина строки +0145+ 89DA CF rst BiosRst +0146+ 89DB D1 pop de +0147+ 89DC E1 pop hl +0148+ 89DD FB ei +0149+ 89DE C9 ret +0150+ 89DF +0151+ 89DF ;[]=========================================================================[] +0152+ 89DF ;[] Расчет предыдущего адреса строки листинга [] +0153+ 89DF ;[] Вход: HL - адрес текущей строки [] +0154+ 89DF ;[] Выход: HL - адрес предыдущей строки [] +0155+ 89DF ;[]=========================================================================[] +0156+ 89DF UpAdres: +0157+ 89DF 11 FC FF ld de,-4 +0158+ 89E2 19 add hl,de ;4-х байтная команда? +0159+ 89E3 CD 6C 92 call Ld_a_hl +0160+ 89E6 ; ld a,(hl) +0161+ 89E6 FE DD cp 0xDD ;префикс 0xDD +0162+ 89E8 28 06 jr z,$+8 +0163+ 89EA F6 30 or 00110000b ;маска для префиксов 0xED,0xFD +0164+ 89EC FE FD cp 0xFD +0165+ 89EE 20 08 jr nz,.L1 +0166+ 89F0 E5 push hl +0167+ 89F1 CD 42 8A call List +0168+ 89F4 E1 pop hl +0169+ 89F5 FE 04 cp 4 +0170+ 89F7 C8 ret z +0171+ 89F8 +0172+ 89F8 23 .L1 inc hl +0173+ 89F9 E5 push hl ;3-х байтная команда? +0174+ 89FA CD 42 8A call List +0175+ 89FD E1 pop hl +0176+ 89FE FE 03 cp 3 +0177+ 8A00 C8 ret z +0178+ 8A01 +0179+ 8A01 23 inc hl +0180+ 8A02 E5 push hl ;2-х байтная команда? +0181+ 8A03 CD 42 8A call List +0182+ 8A06 E1 pop hl +0183+ 8A07 FE 02 cp 2 +0184+ 8A09 C8 ret z +0185+ 8A0A +0186+ 8A0A 23 inc hl +0187+ 8A0B C9 ret ;1-о байтная команда! +0188+ 8A0C +0189+ 8A0C ;[]=========================================================================[] +0190+ 8A0C ;[] Форматирование строки листинга [] +0191+ 8A0C ;[]=========================================================================[] +0192+ 8A0C LFormat: +0193+ 8A0C E5 push hl +0194+ 8A0D 21 92 8D ld hl,List.String+11 ;начало строки +0195+ 8A10 01 02 00 ld bc,2 ;макс кол-во вставляемых пробелов +0196+ 8A13 7E .L2 ld a,(hl) +0197+ 8A14 B7 or a +0198+ 8A15 28 08 jr z,.Exit +0199+ 8A17 FE 20 cp 0x20 ;пробел +0200+ 8A19 28 06 jr z,.L1 +0201+ 8A1B 23 inc hl +0202+ 8A1C 0D dec c +0203+ 8A1D 20 F4 jr nz,.L2 +0204+ 8A1F +0205+ 8A1F E1 .Exit pop hl +0206+ 8A20 C9 ret +0207+ 8A21 +0208+ 8A21 D5 .L1 push de +0209+ 8A22 C5 push bc +0210+ 8A23 E5 push hl +0211+ 8A24 21 A5 8D ld hl,List.String+30 ;конец строки +0212+ 8A27 54 ld d,h +0213+ 8A28 5D ld e,l +0214+ 8A29 B7 or a +0215+ 8A2A ED 42 sbc hl,bc +0216+ 8A2C C1 pop bc +0217+ 8A2D C5 push bc +0218+ 8A2E E5 push hl +0219+ 8A2F ED 42 sbc hl,bc ;кол-во байт +0220+ 8A31 44 ld b,h +0221+ 8A32 4D ld c,l +0222+ 8A33 E1 pop hl +0223+ 8A34 ED B8 lddr +0224+ 8A36 E1 pop hl +0225+ 8A37 C1 pop bc ;кол-во пробелов +0226+ 8A38 41 ld b,c +0227+ 8A39 23 .L3 inc hl ;адрес вставки +0228+ 8A3A 3E 20 ld a,0x20 +0229+ 8A3C 77 ld (hl),a +0230+ 8A3D 10 FA djnz .L3 +0231+ 8A3F D1 pop de +0232+ 8A40 E1 pop hl +0233+ 8A41 C9 ret +0234+ 8A42 +0235+ 8A42 ;[]=========================================================================[] +0236+ 8A42 ;[] Формирование строки листинга [] +0237+ 8A42 ;[] Вход: HL - адрес памяти дизассемблирования [] +0238+ 8A42 ;[] Выход: HL - следующий за дизассемблированной командой адрес памяти [] +0239+ 8A42 ;[] A - длина кода команды [] +0240+ 8A42 ;[]=========================================================================[] +0241+ 8A42 List: +0242+ 8A42 AF xor a ;длина кода команды +0243+ 8A43 32 A7 8D ld (.Byte),a +0244+ 8A46 E5 push hl +0245+ 8A47 54 ld d,h +0246+ 8A48 5D ld e,l +0247+ 8A49 +0248+ 8A49 21 87 8D ld hl,.String ;очистка буфера строки +0249+ 8A4C ; di ;с использованием акселя +0250+ 8A4C ; ld d,d ;включить аксель +0251+ 8A4C ; ld a,32 ;длина буфера и байт заполнитель +0252+ 8A4C ; ld c,c ;команда заполнения +0253+ 8A4C ; ld (hl),a ;заполнить +0254+ 8A4C ; ld b,b ;выключить аксель +0255+ 8A4C ; ei +0256+ 8A4C 3E 20 ld a,32 ;длина буфера и байт заполнитель +0257+ 8A4E 47 ld b,a +0258+ 8A4F 77 ld (hl),a +0259+ 8A50 23 inc hl +0260+ 8A51 10 FC djnz $-2 +0261+ 8A53 +0262+ 8A53 DD 21 89 8D ld ix,.String+2 ;адрес в строке для след.кода +0263+ 8A57 EB ex de,hl +0264+ 8A58 ; ld a,(hl) ;байт из памяти +0265+ 8A58 CD 6C 92 call Ld_a_hl +0266+ 8A5B +0267+ 8A5B ;=============================== +0268+ 8A5B FE DD cp 0xDD ;префикс #DD +0269+ 8A5D 28 0C jr z,.L43 +0270+ 8A5F FE FD cp 0xFD ;префикс #FD +0271+ 8A61 C2 04 8B jp nz,.L30 +0272+ 8A64 +0273+ 8A64 11 46 44 ld de,"DF" +0274+ 8A67 3E 59 ld a,"Y" +0275+ 8A69 18 05 jr .L42 +0276+ 8A6B +0277+ 8A6B 11 44 44 .L43 ld de,"DD" +0278+ 8A6E 3E 58 ld a,"X" +0279+ 8A70 +0280+ 8A70 ED 53 87 8D .L42 ld (.String),de ;префикс в строку +0281+ 8A74 32 6B 8D ld (.IRS1+1),a ;корректировка рег.пары +0282+ 8A77 32 E9 8B ld (.L9+1),a +0283+ 8A7A 32 AC 8C ld (.L13+6),a +0284+ 8A7D 3E 01 ld a,1 +0285+ 8A7F 32 A7 8D ld (.Byte),a ;длина кода команды +0286+ 8A82 E1 pop hl +0287+ 8A83 23 inc hl +0288+ 8A84 ; ld a,(hl) ;следующий байт команды +0289+ 8A84 CD 6C 92 call Ld_a_hl +0290+ 8A87 E5 push hl +0291+ 8A88 FE CB cp 0xCB +0292+ 8A8A 28 25 jr z,.L40 ;команды #DD(#FD)#CB +0293+ 8A8C +0294+ 8A8C 21 67 B0 ld hl,CodeDDFD ;таблица кодов +0295+ 8A8F 01 55 00 ld bc,85 ;размер таблицы +0296+ 8A92 ED B1 cpir ;поиск кода +0297+ 8A94 28 0F jr z,.L45 +0298+ 8A96 E1 pop hl +0299+ 8A97 01 DE B4 ld bc,ED00 +0300+ 8A9A 11 90 8D ld de,.String+9 ;копирование мнемоники NOP * +0301+ 8A9D 0A ld a,(bc) +0302+ 8A9E B7 or a +0303+ 8A9F C8 ret z +0304+ 8AA0 12 ld (de),a +0305+ 8AA1 13 inc de +0306+ 8AA2 03 inc bc +0307+ 8AA3 18 F8 jr $-6 +0308+ 8AA5 +0309+ 8AA5 21 54 00 .L45 ld hl,84 ;размер таблицы +0310+ 8AA8 B7 or a +0311+ 8AA9 ED 42 sbc hl,bc +0312+ 8AAB 11 BC B0 ld de,TablDDFD +0313+ 8AAE C3 D6 8B jp .L_12+3 +0314+ 8AB1 +0315+ 8AB1 DD 21 8B 8D .L40 ld ix,.String+4 ;адрес в строке для след.кода +0316+ 8AB5 11 43 42 ld de,"BC" ;префикс в строку +0317+ 8AB8 ED 53 89 8D ld (.String+2),de +0318+ 8ABC 3E 04 ld a,4 ;длина кода +0319+ 8ABE 32 A7 8D ld (.Byte),a +0320+ 8AC1 E1 pop hl +0321+ 8AC2 23 inc hl +0322+ 8AC3 CD 6C 92 call Ld_a_hl +0323+ 8AC6 47 ld b,a +0324+ 8AC7 ; ld b,(hl) ;байт-смещение +0325+ 8AC7 23 inc hl +0326+ 8AC8 CD 6C 92 call Ld_a_hl +0327+ 8ACB ; ld a,(hl) ;следующий байт команды +0328+ 8ACB 23 inc hl +0329+ 8ACC E5 push hl +0330+ 8ACD 4F ld c,a +0331+ 8ACE 26 00 ld h,0 +0332+ 8AD0 FE 40 cp 0x40 ;от 0 до 0x3F (сдвиги) +0333+ 8AD2 38 15 jr c,.L44 +0334+ 8AD4 +0335+ 8AD4 CD F7 8C call .ComCBBit ;мнемоника BIT,SET,RES +0336+ 8AD7 79 ld a,c +0337+ 8AD8 FE 80 cp 0x80 ;команда BIT +0338+ 8ADA 30 08 jr nc,.L41 +0339+ 8ADC CD 1D 8D call .NomBit ;номер бита +0340+ 8ADF CD 59 8D call .IndexRegSh ;индексная пара со смещением +0341+ 8AE2 18 14 jr .L46 +0342+ 8AE4 +0343+ 8AE4 CD 1D 8D .L41 call .NomBit ;номер бита +0344+ 8AE7 18 03 jr .L44+3 +0345+ 8AE9 +0346+ 8AE9 CD 04 8D .L44 call .ComCBSh ;мнемоника +0347+ 8AEC CD 2C 8D call .RegName ;регистр +0348+ 8AEF 20 04 jr nz,$+6 +0349+ 8AF1 3E 2C ld a,"," ;разделитель +0350+ 8AF3 12 ld (de),a +0351+ 8AF4 13 inc de +0352+ 8AF5 CD 59 8D call .IndexRegSh ;индексная пара со смещением +0353+ 8AF8 +0354+ 8AF8 79 .L46 ld a,c +0355+ 8AF9 CD 74 91 call ConvHexStr +0356+ 8AFC DD 75 02 ld (ix+2),l +0357+ 8AFF DD 74 03 ld (ix+3),h +0358+ 8B02 E1 pop hl +0359+ 8B03 C9 ret +0360+ 8B04 +0361+ 8B04 ;=============================== +0362+ 8B04 FE CB .L30 cp 0xCB ;префикс #CB +0363+ 8B06 C2 3D 8B jp nz,.L20 +0364+ 8B09 11 43 42 ld de,"BC" ;префикс в строку +0365+ 8B0C ED 53 87 8D ld (.String),de +0366+ 8B10 E1 pop hl +0367+ 8B11 23 inc hl +0368+ 8B12 CD 6C 92 call Ld_a_hl +0369+ 8B15 ; ld a,(hl) ;следующий байт команды +0370+ 8B15 23 inc hl +0371+ 8B16 E5 push hl +0372+ 8B17 4F ld c,a +0373+ 8B18 26 00 ld h,0 +0374+ 8B1A FE 40 cp 0x40 ;от 0 до 0x3F (сдвиги) +0375+ 8B1C 30 05 jr nc,.L31 +0376+ 8B1E CD 04 8D call .ComCBSh ;мнемоника +0377+ 8B21 18 06 jr .L31+6 +0378+ 8B23 CD F7 8C .L31 call .ComCBBit ;мнемоника +0379+ 8B26 CD 1D 8D call .NomBit ;номер бита +0380+ 8B29 CD 2C 8D call .RegName ;регистр +0381+ 8B2C C4 4A 8D call nz,.HLReg +0382+ 8B2F 79 ld a,c +0383+ 8B30 CD 74 91 call ConvHexStr +0384+ 8B33 DD 75 00 ld (ix+0),l +0385+ 8B36 DD 74 01 ld (ix+1),h +0386+ 8B39 E1 pop hl +0387+ 8B3A 3E 02 ld a,2 ;длина кода команды +0388+ 8B3C C9 ret +0389+ 8B3D +0390+ 8B3D ;=============================== +0391+ 8B3D FE ED .L20 cp 0xED ;префикс #ED +0392+ 8B3F 20 2D jr nz,.L10 +0393+ 8B41 3E 01 ld a,1 +0394+ 8B43 32 A7 8D ld (.Byte),a ;длина кода +0395+ 8B46 11 45 44 ld de,"DE" ;префикс в строку +0396+ 8B49 ED 53 87 8D ld (.String),de +0397+ 8B4D E1 pop hl +0398+ 8B4E 23 inc hl +0399+ 8B4F E5 push hl +0400+ 8B50 CD 6C 92 call Ld_a_hl +0401+ 8B53 ; ld a,(hl) ;следующий байт команды +0402+ 8B53 FE 40 cp 0x40 ;от 0 до 0x3F +0403+ 8B55 38 12 jr c,.L21 +0404+ 8B57 11 A8 B3 ld de,TablED-0x40*2 +0405+ 8B5A FE 7F cp 0x7F ;от 0x40 до 0x7E из таблицы +0406+ 8B5C 38 75 jr c,.L_12 +0407+ 8B5E FE A0 cp 0xA0 ;от 0x7F до 0x9F +0408+ 8B60 38 07 jr c,.L21 +0409+ 8B62 11 66 B3 ld de,TablED-0xA0*2+0x40*2-2 +0410+ 8B65 FE BC cp 0xBC ;от 0xBC до 0xFF +0411+ 8B67 38 6A jr c,.L_12 +0412+ 8B69 21 DE B4 .L21 ld hl,ED00 ;команда "NOP *" +0413+ 8B6C 18 6E jr .L_2-3 +0414+ 8B6E +0415+ 8B6E ;=============================== +0416+ 8B6E DD 21 87 8D .L10 ld ix,.String +0417+ 8B72 11 CF AB ld de,Tabl00_3F ;таблица смещений +0418+ 8B75 FE 40 cp 0x40 ;команды 0x00...0x3F +0419+ 8B77 38 5A jr c,.L_12 +0420+ 8B79 11 02 AE ld de,TablC0_FF ;таблица смещений +0421+ 8B7C 4F ld c,a +0422+ 8B7D D6 C0 sub 0xC0 ;команды 0xC0...0xFF +0423+ 8B7F 30 52 jr nc,.L_12 +0424+ 8B81 +0425+ 8B81 79 ld a,c +0426+ 8B82 FE 80 cp 0x80 +0427+ 8B84 30 2A jr nc,.L8 +0428+ 8B86 21 26 B0 ld hl,MHALT +0429+ 8B89 FE 76 cp 0x76 ;код команды HALT +0430+ 8B8B 28 4F jr z,.L_2-3 +0431+ 8B8D +0432+ 8B8D 21 90 8D ld hl,.String+9 +0433+ 8B90 36 4C ld (hl),"L" ;мнемоника LD +0434+ 8B92 23 inc hl +0435+ 8B93 36 44 ld (hl),"D" +0436+ 8B95 23 inc hl +0437+ 8B96 36 20 ld (hl)," " +0438+ 8B98 23 inc hl +0439+ 8B99 0F rrca +0440+ 8B9A 0F rrca +0441+ 8B9B 0F rrca +0442+ 8B9C EB ex de,hl +0443+ 8B9D CD 2D 8D call .RegName+1 ;печать регистра +0444+ 8BA0 C4 4A 8D call nz,.HLReg +0445+ 8BA3 3E 2C ld a,"," ;разделитель +0446+ 8BA5 12 ld (de),a +0447+ 8BA6 13 inc de +0448+ 8BA7 CD 2C 8D call .RegName ;печать регистра +0449+ 8BAA C4 4A 8D call nz,.HLReg +0450+ 8BAD AF xor a +0451+ 8BAE 18 4A jr .L1 +0452+ 8BB0 +0453+ 8BB0 E6 38 .L8 and 00111000b ;ADD,ADC,SUB,SBC,AND,XOR,OR,CP +0454+ 8BB2 0F rrca +0455+ 8BB3 0F rrca +0456+ 8BB4 6F ld l,a +0457+ 8BB5 26 00 ld h,0 +0458+ 8BB7 11 2B B0 ld de,TablM +0459+ 8BBA 19 add hl,de ;смещение в таблице +0460+ 8BBB 7E ld a,(hl) +0461+ 8BBC 23 inc hl +0462+ 8BBD 66 ld h,(hl) +0463+ 8BBE 6F ld l,a +0464+ 8BBF 11 90 8D ld de,.String+9 ;копирование в строку-буфер +0465+ 8BC2 7E ld a,(hl) +0466+ 8BC3 12 ld (de),a +0467+ 8BC4 13 inc de +0468+ 8BC5 23 inc hl +0469+ 8BC6 B7 or a +0470+ 8BC7 20 F9 jr nz,$-5 +0471+ 8BC9 1B dec de +0472+ 8BCA CD 2C 8D call .RegName ;печать регистра +0473+ 8BCD C4 4A 8D call nz,.HLReg +0474+ 8BD0 AF xor a +0475+ 8BD1 18 27 jr .L1 +0476+ 8BD3 +0477+ 8BD3 6F .L_12 ld l,a ;расчет адреса в таблице +0478+ 8BD4 26 00 ld h,0 +0479+ 8BD6 29 add hl,hl ;*2 +0480+ 8BD7 19 add hl,de +0481+ 8BD8 7E ld a,(hl) +0482+ 8BD9 23 inc hl +0483+ 8BDA 66 ld h,(hl) +0484+ 8BDB 6F ld l,a ;адрес строки-мнемоники +0485+ 8BDC +0486+ 8BDC 11 90 8D ld de,.String+9 ;копирование в строку-буфер +0487+ 8BDF 7E .L_2 ld a,(hl) +0488+ 8BE0 FE 20 cp 0x20 +0489+ 8BE2 38 16 jr c,.L1 +0490+ 8BE4 FE 78 cp "x" ;индексный регистр +0491+ 8BE6 20 02 jr nz,$+4 +0492+ 8BE8 3E 58 .L9 ld a,"X" +0493+ 8BEA 12 ld (de),a +0494+ 8BEB FE 29 cp ")" +0495+ 8BED 20 07 jr nz,$+9 +0496+ 8BEF 22 A8 8D ld (.TablAdr),hl +0497+ 8BF2 ED 53 AA 8D ld (.StrAdr),de +0498+ 8BF6 23 inc hl +0499+ 8BF7 13 inc de +0500+ 8BF8 18 E5 jr .L_2 +0501+ 8BFA +0502+ 8BFA 08 .L1 exa +0503+ 8BFB E1 pop hl ;печать байта +0504+ 8BFC CD 6C 92 call Ld_a_hl +0505+ 8BFF ; ld a,(hl) +0506+ 8BFF 23 inc hl +0507+ 8C00 E5 push hl +0508+ 8C01 CD 74 91 call ConvHexStr +0509+ 8C04 DD 75 00 ld (ix+0),l +0510+ 8C07 DD 74 01 ld (ix+1),h +0511+ 8C0A 08 exa +0512+ 8C0B CA B2 8C jp z,.LE +0513+ 8C0E +0514+ 8C0E 3D dec a ;2-х байтная команда (1) +0515+ 8C0F 20 0A jr nz,.L3 +0516+ 8C11 CD B8 8C call .TwoByteCom +0517+ 8C14 E1 pop hl +0518+ 8C15 3A A7 8D ld a,(.Byte) +0519+ 8C18 3C inc a +0520+ 8C19 3C inc a ;длина кода +0521+ 8C1A C9 ret +0522+ 8C1B +0523+ 8C1B 3D .L3 dec a ;3-х байтная команда (2) +0524+ 8C1C 20 0A jr nz,.L4 +0525+ 8C1E CD D0 8C call .ThreeByteCom +0526+ 8C21 E1 pop hl +0527+ 8C22 3A A7 8D ld a,(.Byte) +0528+ 8C25 C6 03 add a,3 ;длина кода +0529+ 8C27 C9 ret +0530+ 8C28 +0531+ 8C28 3D .L4 dec a ;команды относительного перехода (3) +0532+ 8C29 20 29 jr nz,.L7 +0533+ 8C2B E1 pop hl +0534+ 8C2C CD 6C 92 call Ld_a_hl +0535+ 8C2F ; ld a,(hl) ;2-й байт команды +0536+ 8C2F 23 inc hl +0537+ 8C30 E5 push hl +0538+ 8C31 4F ld c,a +0539+ 8C32 CD 74 91 call ConvHexStr +0540+ 8C35 DD 75 02 ld (ix+2),l +0541+ 8C38 DD 74 03 ld (ix+3),h +0542+ 8C3B 79 ld a,c +0543+ 8C3C 06 00 ld b,0 +0544+ 8C3E E1 pop hl +0545+ 8C3F E5 push hl ;текущий адрес +0546+ 8C40 CB 7F bit 7,a ;знак числа +0547+ 8C42 28 08 jr z,$+10 +0548+ 8C44 ED 44 neg +0549+ 8C46 B7 or a ;сброс флага C +0550+ 8C47 4F ld c,a +0551+ 8C48 ED 42 sbc hl,bc ;отрицательное смещение +0552+ 8C4A 18 01 jr $+3 +0553+ 8C4C 09 add hl,bc ;положительное смещение +0554+ 8C4D CD 3D 91 call NumToStr16 +0555+ 8C50 E1 pop hl +0556+ 8C51 3E 02 ld a,2 ;длина кода +0557+ 8C53 C9 ret +0558+ 8C54 +0559+ 8C54 3D .L7 dec a ;команды работы с портами (4) +0560+ 8C55 20 0D jr nz,.L5 +0561+ 8C57 3C inc a +0562+ 8C58 32 A7 8D ld (.Byte),a ;длина кода +0563+ 8C5B ED 5B AA 8D ld de,(.StrAdr) ;адрес вставки +0564+ 8C5F CD B8 8C call .TwoByteCom +0565+ 8C62 18 2E jr .L6 +0566+ 8C64 +0567+ 8C64 3D .L5 dec a ;3-х байтные косвенной адресации (5) +0568+ 8C65 20 11 jr nz,.L11 +0569+ 8C67 3A A7 8D ld a,(.Byte) +0570+ 8C6A 3C inc a +0571+ 8C6B 3C inc a +0572+ 8C6C 32 A7 8D ld (.Byte),a ;длина кода +0573+ 8C6F ED 5B AA 8D ld de,(.StrAdr) ;адрес вставки +0574+ 8C73 CD D0 8C call .ThreeByteCom +0575+ 8C76 18 1A jr .L6 +0576+ 8C78 +0577+ 8C78 3D .L11 dec a ;индексные регистры со смещением (6) +0578+ 8C79 20 37 jr nz,.LE +0579+ 8C7B 3E 02 ld a,2 +0580+ 8C7D 32 A7 8D ld (.Byte),a ;длина кода +0581+ 8C80 ED 5B AA 8D ld de,(.StrAdr) ;адрес вставки +0582+ 8C84 E1 pop hl +0583+ 8C85 CD 6C 92 call Ld_a_hl +0584+ 8C88 47 ld b,a +0585+ 8C89 ; ld b,(hl) +0586+ 8C89 23 inc hl +0587+ 8C8A E5 push hl +0588+ 8C8B DD 21 8B 8D ld ix,.String+4 +0589+ 8C8F CD 59 8D call .IndexRegSh +0590+ 8C92 2A A8 8D .L6 ld hl,(.TablAdr) ;адрес в таблице мнемоник +0591+ 8C95 7E ld a,(hl) +0592+ 8C96 FE 20 cp 0x20 +0593+ 8C98 30 0C jr nc,.L13 +0594+ 8C9A 78 ld a,b +0595+ 8C9B FE 2C cp "," ;мнемоника оканч. на "," +0596+ 8C9D 20 13 jr nz,.LE +0597+ 8C9F CD B8 8C call .TwoByteCom +0598+ 8CA2 E1 pop hl +0599+ 8CA3 3E 04 ld a,4 ;длина кода +0600+ 8CA5 C9 ret +0601+ 8CA6 +0602+ 8CA6 47 .L13 ld b,a +0603+ 8CA7 FE 78 cp "x" ;индексный регистр +0604+ 8CA9 20 02 jr nz,$+4 +0605+ 8CAB 3E 58 ld a,"X" +0606+ 8CAD 12 ld (de),a +0607+ 8CAE 23 inc hl +0608+ 8CAF 13 inc de +0609+ 8CB0 18 E3 jr .L6+3 +0610+ 8CB2 +0611+ 8CB2 E1 .LE pop hl +0612+ 8CB3 3A A7 8D ld a,(.Byte) ;длина кода +0613+ 8CB6 3C inc a +0614+ 8CB7 C9 ret +0615+ 8CB8 +0616+ 8CB8 ;======== печать второго кода двухбайтной команды ======== +0617+ 8CB8 .TwoByteCom: +0618+ 8CB8 C1 pop bc ;адрес возврата +0619+ 8CB9 E1 pop hl +0620+ 8CBA CD 6C 92 call Ld_a_hl +0621+ 8CBD ; ld a,(hl) ;2-й байт команды +0622+ 8CBD 23 inc hl +0623+ 8CBE E5 push hl +0624+ 8CBF C5 push bc +0625+ 8CC0 4F ld c,a +0626+ 8CC1 CD 74 91 call ConvHexStr +0627+ 8CC4 DD 75 02 ld (ix+2),l +0628+ 8CC7 DD 74 03 ld (ix+3),h +0629+ 8CCA 69 ld l,c +0630+ 8CCB 26 00 ld h,0 +0631+ 8CCD C3 5E 91 jp NumToStr8 +0632+ 8CD0 +0633+ 8CD0 ;======== печать второго и третьего кода трехбайтной команды ======== +0634+ 8CD0 .ThreeByteCom: +0635+ 8CD0 C1 pop bc ;адрес возврата +0636+ 8CD1 E1 pop hl +0637+ 8CD2 CD 6C 92 call Ld_a_hl +0638+ 8CD5 ; ld a,(hl) ;2-й байт команды +0639+ 8CD5 23 inc hl +0640+ 8CD6 08 exa +0641+ 8CD7 CD 6C 92 call Ld_a_hl +0642+ 8CDA ; ld a,(hl) ;3-й байт команды +0643+ 8CDA 23 inc hl +0644+ 8CDB E5 push hl +0645+ 8CDC C5 push bc +0646+ 8CDD 47 ld b,a +0647+ 8CDE CD 74 91 call ConvHexStr +0648+ 8CE1 DD 75 04 ld (ix+4),l +0649+ 8CE4 DD 74 05 ld (ix+5),h +0650+ 8CE7 08 exa +0651+ 8CE8 4F ld c,a +0652+ 8CE9 CD 74 91 call ConvHexStr +0653+ 8CEC DD 75 02 ld (ix+2),l +0654+ 8CEF DD 74 03 ld (ix+3),h +0655+ 8CF2 60 ld h,b ;в HL - число +0656+ 8CF3 69 ld l,c +0657+ 8CF4 C3 3D 91 jp NumToStr16 +0658+ 8CF7 +0659+ 8CF7 ;======== печать мнемоник команд с префиксом 0xCB (сдвиги, битовые) ======== +0660+ 8CF7 ;A - байт команды +0661+ 8CF7 ;DE - адрес в строке +0662+ 8CF7 .ComCBBit: +0663+ 8CF7 E6 C0 and 11000000b +0664+ 8CF9 07 rlca +0665+ 8CFA 07 rlca +0666+ 8CFB 07 rlca +0667+ 8CFC 07 rlca +0668+ 8CFD 6F ld l,a +0669+ 8CFE 11 18 B4 ld de,CB40-4 +0670+ 8D01 19 add hl,de +0671+ 8D02 18 0D jr .ComCBSh1 +0672+ 8D04 .ComCBSh: +0673+ 8D04 E6 38 and 00111000b ;смещение в таблице +0674+ 8D06 0F rrca +0675+ 8D07 0F rrca +0676+ 8D08 6F ld l,a +0677+ 8D09 11 EE B3 ld de,TablCB +0678+ 8D0C 19 add hl,de +0679+ 8D0D 7E ld a,(hl) +0680+ 8D0E 23 inc hl +0681+ 8D0F 66 ld h,(hl) +0682+ 8D10 6F ld l,a +0683+ 8D11 11 90 8D .ComCBSh1 ld de,.String+9 ;копирование в строку-буфер +0684+ 8D14 7E ld a,(hl) +0685+ 8D15 12 ld (de),a +0686+ 8D16 13 inc de +0687+ 8D17 23 inc hl +0688+ 8D18 FE 20 cp " " ;последний символ мнемоники +0689+ 8D1A 20 F8 jr nz,$-6 +0690+ 8D1C C9 ret +0691+ 8D1D +0692+ 8D1D ;======== вычисление номера бита в битовых командах BIT, SET, RES ======== +0693+ 8D1D ;C - байт команды +0694+ 8D1D ;DE - адрес в строке +0695+ 8D1D .NomBit: +0696+ 8D1D 79 ld a,c +0697+ 8D1E E6 38 and 00111000b ;номер бита +0698+ 8D20 0F rrca +0699+ 8D21 0F rrca +0700+ 8D22 0F rrca +0701+ 8D23 C6 30 add a,"0" +0702+ 8D25 12 ld (de),a +0703+ 8D26 3E 2C ld a,"," +0704+ 8D28 13 inc de +0705+ 8D29 12 ld (de),a +0706+ 8D2A 13 inc de +0707+ 8D2B C9 ret +0708+ 8D2C +0709+ 8D2C ;======== печать имени регистра ======== +0710+ 8D2C ;C - команда +0711+ 8D2C ;DE - адрес в строке +0712+ 8D2C .RegName: +0713+ 8D2C 79 ld a,c +0714+ 8D2D E6 07 and 00000111b ;регистр +0715+ 8D2F C6 42 add a,"B" +0716+ 8D31 FE 46 cp "F" ;B,C,D,E +0717+ 8D33 38 11 jr c,.RN1 +0718+ 8D35 3C inc a +0719+ 8D36 3C inc a +0720+ 8D37 FE 48 cp "H" +0721+ 8D39 28 0B jr z,.RN1 +0722+ 8D3B C6 03 add a,3 +0723+ 8D3D FE 4C cp "L" +0724+ 8D3F 28 05 jr z,.RN1 +0725+ 8D41 D6 0D sub 13 +0726+ 8D43 FE 41 cp "A" +0727+ 8D45 C0 ret nz ;относительная адресация +0728+ 8D46 12 .RN1 ld (de),a +0729+ 8D47 13 inc de +0730+ 8D48 AF xor a +0731+ 8D49 C9 ret +0732+ 8D4A +0733+ 8D4A ;======== печать (HL) ======== +0734+ 8D4A ;DE - адрес в строке +0735+ 8D4A .HLReg: +0736+ 8D4A EB ex de,hl +0737+ 8D4B 36 28 ld (hl),"(" +0738+ 8D4D 23 inc hl +0739+ 8D4E 36 48 ld (hl),"H" +0740+ 8D50 23 inc hl +0741+ 8D51 36 4C ld (hl),"L" +0742+ 8D53 23 inc hl +0743+ 8D54 36 29 ld (hl),")" +0744+ 8D56 23 inc hl +0745+ 8D57 EB ex de,hl +0746+ 8D58 C9 ret +0747+ 8D59 +0748+ 8D59 ;======== печать индексной регистровой пары со смещением ======== +0749+ 8D59 ;B - смещение +0750+ 8D59 ;DE - адрес в строке +0751+ 8D59 .IndexRegSh: +0752+ 8D59 78 ld a,b +0753+ 8D5A CD 74 91 call ConvHexStr +0754+ 8D5D DD 75 00 ld (ix+0),l +0755+ 8D60 DD 74 01 ld (ix+1),h +0756+ 8D63 EB ex de,hl +0757+ 8D64 36 28 ld (hl),"(" +0758+ 8D66 23 inc hl +0759+ 8D67 36 49 ld (hl),"I" +0760+ 8D69 23 inc hl +0761+ 8D6A 36 58 .IRS1 ld (hl),"X" +0762+ 8D6C 23 inc hl +0763+ 8D6D 3E 2B ld a,"+" ;положительное смещение +0764+ 8D6F 77 ld (hl),a +0765+ 8D70 78 ld a,b ;смещение +0766+ 8D71 CB 78 bit 7,b +0767+ 8D73 28 06 jr z,$+8 +0768+ 8D75 3E 2D ld a,"-" ;отрицательное смещение +0769+ 8D77 77 ld (hl),a +0770+ 8D78 78 ld a,b ;смещение +0771+ 8D79 ED 44 neg +0772+ 8D7B 23 inc hl +0773+ 8D7C EB ex de,hl +0774+ 8D7D 6F ld l,a +0775+ 8D7E 26 00 ld h,0 +0776+ 8D80 CD 5E 91 call NumToStr8 +0777+ 8D83 3E 29 ld a,")" +0778+ 8D85 12 ld (de),a +0779+ 8D86 C9 ret +0780+ 8D87 +0781+ 8D87 +0782+ 8D87 .String db "00112233 01234567890123456789012" +0782+ 8D87 3030313132323333203031323334353637383930313233343536373839303132 +0783+ 8DA7 00 .Byte db 0 +0784+ 8DA8 00 00 .TablAdr dw 0 +0785+ 8DAA 00 00 .StrAdr dw 0 +0786+ 8DAC +0787+ 8DAC +0372 8DAC include "util.asm";"D:\WORKAST\DEMON\util" +0001+ 8DAC ;[]=========================================================================[] +0002+ 8DAC ;[] Подпрограммы-утилиты монитора-отладчика DemoN [] +0003+ 8DAC ;[] v0.01 - последние изменения 29.08.2004 [] +0004+ 8DAC ;[] v0.02 - последние изменения 20.03.2005 [] +0005+ 8DAC ;[] v0.03 - последние изменения 25.02.2006 [] +0006+ 8DAC ;[] v0.10 - последние изменения 17.05.2006 [] +0007+ 8DAC ;[] [] +0008+ 8DAC ;[] SaveAllRegs - сохранение значений регистровых пар [] +0009+ 8DAC ;[] RestAllRegs - востановление значений регистровых пар [] +0010+ 8DAC ;[] PrnStrColor - печать строки символов с атрибутами [] +0011+ 8DAC ;[] PrintReg - печать двухбайтового числа [] +0012+ 8DAC ;[] PrintStrAF - печать значения регистровой пары AF и флагов [] +0013+ 8DAC ;[] PrintStrReg - печать значений регистровых пар с адресуемыми байтами [] +0014+ 8DAC ;[] PrintStrWin - печать номеров банок в окнах [] +0015+ 8DAC ;[] PrintSPDn - печать глубины стека [] +0016+ 8DAC ;[] PrintStrSp - печать значений стека [] +0017+ 8DAC ;[] PrintDump - печать дампа [] +0018+ 8DAC ;[] PrintStrDump - печать строки дампа [] +0019+ 8DAC ;[] ReplSymNoPrint - замена непечатных символов в строке [] +0020+ 8DAC ;[] NumToStr16 - формирование 16-тиричного числа [] +0021+ 8DAC ;[] NumToStr8 - формирование 8-ричного числа [] +0022+ 8DAC ;[] ConvHexStr - конвертирование числа в HEX-строку [] +0023+ 8DAC ;[] ConvDecStr - конвертирование 16-битного числа в DEC-строку [] +0024+ 8DAC ;[] CursorSet - прорисовка курсора [] +0025+ 8DAC ;[] CursorRes - востановление экрана под курсором [] +0026+ 8DAC ;[] Ld_a_bc - чтение байта из памяти с проверкой адреса, адрес в BC [] +0027+ 8DAC ;[] Ld_a_hl - чтение байта из памяти с проверкой адреса, адрес в HL [] +0028+ 8DAC ;[] Ld_hl_a - запись байта в память с проверкой адреса, адрес в HL [] +0029+ 8DAC ;[] AdrArea - определение принадлежности адреса области памяти [] +0030+ 8DAC ;[]=========================================================================[] +0031+ 8DAC +0032+ 8DAC ;[]=========================================================================[] +0033+ 8DAC ;[] Сохранение значений регистровых пар [] +0034+ 8DAC ;[]=========================================================================[] +0035+ 8DAC SaveAllRegs: +0036+ 8DAC 22 29 AB ld (Reg._HL),hl +0037+ 8DAF ED 53 2B AB ld (Reg._DE),de +0038+ 8DB3 ED 43 2D AB ld (Reg._BC),bc +0039+ 8DB7 +0040+ 8DB7 DD 22 25 AB ld (Reg._IX),ix +0041+ 8DBB FD 22 27 AB ld (Reg._IY),iy +0042+ 8DBF F5 push af +0043+ 8DC0 E1 pop hl +0044+ 8DC1 22 2F AB ld (Reg._AF),hl +0045+ 8DC4 ED 5F ld a,r +0046+ 8DC6 32 39 AB ld (Reg._IR),a +0047+ 8DC9 ED 57 ld a,i +0048+ 8DCB 32 3A AB ld (Reg._IR+1),a +0049+ 8DCE +0050+ 8DCE D9 exx +0051+ 8DCF 08 ex af,af' +0052+ 8DD0 +0053+ 8DD0 22 31 AB ld (Reg._HL_),hl +0054+ 8DD3 ED 53 33 AB ld (Reg._DE_),de +0055+ 8DD7 ED 43 35 AB ld (Reg._BC_),bc +0056+ 8DDB F5 push af +0057+ 8DDC E1 pop hl +0058+ 8DDD 22 37 AB ld (Reg._AF_),hl +0059+ 8DE0 08 ex af,af' +0060+ 8DE1 D9 exx +0061+ 8DE2 +0062+ 8DE2 21 3F AB ld hl,WinPage ;сохранение номеров страниц +0063+ 8DE5 DB 82 in a,(EmmWin.P0) ;0-е окно +0064+ 8DE7 77 ld (hl),a +0065+ 8DE8 23 inc hl +0066+ 8DE9 DB A2 in a,(EmmWin.P1) ;1-е окно +0067+ 8DEB 77 ld (hl),a +0068+ 8DEC 23 inc hl +0069+ 8DED DB C2 in a,(EmmWin.P2) ;2-е окно +0070+ 8DEF 77 ld (hl),a +0071+ 8DF0 23 inc hl +0072+ 8DF1 DB E2 in a,(EmmWin.P3) ;3-е окно +0073+ 8DF3 77 ld (hl),a +0074+ 8DF4 C9 ret +0075+ 8DF5 +0076+ 8DF5 ;[]=========================================================================[] +0077+ 8DF5 ;[] Востановление значений регистровых пар [] +0078+ 8DF5 ;[]=========================================================================[] +0079+ 8DF5 RestAllRegs: +0080+ 8DF5 3A 39 AB ld a,(Reg._IR) +0081+ 8DF8 ED 4F ld r,a +0082+ 8DFA 3A 3A AB ld a,(Reg._IR+1) +0083+ 8DFD ED 47 ld i,a +0084+ 8DFF 2A 2F AB ld hl,(Reg._AF) +0085+ 8E02 E5 push hl +0086+ 8E03 F1 pop af +0087+ 8E04 2A 29 AB ld hl,(Reg._HL) +0088+ 8E07 ED 5B 2B AB ld de,(Reg._DE) +0089+ 8E0B ED 4B 2D AB ld bc,(Reg._BC) +0090+ 8E0F DD 2A 25 AB ld ix,(Reg._IX) +0091+ 8E13 FD 2A 27 AB ld iy,(Reg._IY) +0092+ 8E17 +0093+ 8E17 D9 exx +0094+ 8E18 08 ex af,af' +0095+ 8E19 2A 37 AB ld hl,(Reg._AF_) +0096+ 8E1C E5 push hl +0097+ 8E1D F1 pop af +0098+ 8E1E 2A 31 AB ld hl,(Reg._HL_) +0099+ 8E21 ED 5B 33 AB ld de,(Reg._DE_) +0100+ 8E25 ED 4B 35 AB ld bc,(Reg._BC_) +0101+ 8E29 08 ex af,af' +0102+ 8E2A D9 exx +0103+ 8E2B +0104+ 8E2B C9 ret +0105+ 8E2C +0106+ 8E2C ;[]=========================================================================[] +0107+ 8E2C ;[] Печать строки символов [] +0108+ 8E2C ;[] Вход: HL - адрес строки символов [] +0109+ 8E2C ;[] [] +0110+ 8E2C ;[] Формат строки: 0x16, Столбец, Строка, Символы, 0x00 [] +0111+ 8E2C ;[]=========================================================================[] +0112+ 8E2C 3A 11 AB ld a,(Color.Screen) ;основной цвет +0113+ 8E2F 32 5C 8E ld (PrnStrColor.L1+5),a +0114+ 8E32 PrnStrColor: +0115+ 8E32 7E ld a,(hl) +0116+ 8E33 FE 16 cp 0x16 ;код установки позиции курсора +0117+ 8E35 20 0A jr nz,.L2 +0118+ 8E37 23 inc hl +0119+ 8E38 5E ld e,(hl) ;столбец +0120+ 8E39 7B ld a,e +0121+ 8E3A 32 66 8E ld (PrtXCoord),a +0122+ 8E3D 23 inc hl +0123+ 8E3E 56 ld d,(hl) ;строка +0124+ 8E3F 23 inc hl +0125+ 8E40 7E ld a,(hl) ;символ +0126+ 8E41 FE 0D .L2 cp 0x0D +0127+ 8E43 20 07 jr nz,.L3 +0128+ 8E45 14 inc d +0129+ 8E46 3A 66 8E ld a,(PrtXCoord) +0130+ 8E49 5F ld e,a +0131+ 8E4A 18 17 jr .L4 +0132+ 8E4C FE 17 .L3 cp 0x17 +0133+ 8E4E 20 07 jr nz,.L1 +0134+ 8E50 23 inc hl +0135+ 8E51 7E ld a,(hl) +0136+ 8E52 32 5C 8E ld (PrnStrColor.L1+5),a +0137+ 8E55 23 inc hl +0138+ 8E56 7E ld a,(hl) +0139+ 8E57 B7 .L1 or a +0140+ 8E58 C8 ret z ;выход если конец строки +0141+ 8E59 E5 push hl +0142+ 8E5A D5 push de +0143+ 8E5B ;печать ч/з биос или дсс? +0144+ 8E5B ifdef D_PRINTCH_BIOS +0145+ 8E5B~ ld h,0x03 ;атрибут +0146+ 8E5B~ ld l,a +0147+ 8E5B~ sub a ;идентификатор окна +0148+ 8E5B~ ; ld a,(Demon.Bios_Win) +0149+ 8E5B~ ld bc,SysSymb*256+Bios.Win_Put_Sym +0150+ 8E5B~ rst BiosRst +0151+ 8E5B else +0152+ 8E5B 06 03 ld b,0x03 +0153+ 8E5D 0E 58 ld c,Dss.WrChar +0154+ 8E5F D7 rst DssRst +0155+ 8E60 endif +0156+ 8E60 D1 pop de +0157+ 8E61 E1 pop hl +0158+ 8E62 1C inc e +0159+ 8E63 23 .L4 inc hl +0160+ 8E64 18 CC jr PrnStrColor +0161+ 8E66 00 PrtXCoord db 0 +0162+ 8E67 ;[]=========================================================================[] +0163+ 8E67 ;[] Печать двухбайтового числа [] +0164+ 8E67 ;[] Вход: DE - координаты печати [] +0165+ 8E67 ;[] HL - значение регистровой пары [] +0166+ 8E67 ;[]=========================================================================[] +0167+ 8E67 PrintReg: +0168+ 8E67 F3 di +0169+ 8E68 E5 push hl +0170+ 8E69 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати +0171+ 8E6B CF rst BiosRst +0172+ 8E6C E1 pop hl +0173+ 8E6D +0174+ 8E6D 3A 7E AB ld a,(DecHex) ;систем счисления +0175+ 8E70 B7 or a +0176+ 8E71 28 08 jr z,.Hex +0177+ 8E73 +0178+ 8E73 11 98 8E ld de,.String +0179+ 8E76 CD 91 91 call ConvDecStr +0180+ 8E79 18 14 jr .Print +0181+ 8E7B +0182+ 8E7B 3E 23 .Hex ld a,"#" +0183+ 8E7D 32 98 8E ld (.String),a +0184+ 8E80 4D ld c,l +0185+ 8E81 7C ld a,h +0186+ 8E82 CD 74 91 call ConvHexStr +0187+ 8E85 22 99 8E ld (.String+1),hl ;старший байт +0188+ 8E88 79 ld a,c +0189+ 8E89 CD 74 91 call ConvHexStr +0190+ 8E8C 22 9B 8E ld (.String+3),hl ;младший байт +0191+ 8E8F 21 98 8E .Print ld hl,.String ;печатаемая строка +0192+ 8E92 01 86 05 ld bc,5*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки +0193+ 8E95 CF rst BiosRst +0194+ 8E96 FB ei +0195+ 8E97 C9 ret +0196+ 8E98 +0197+ 8E98 2330313233 .String db "#0123" +0198+ 8E9D +0199+ 8E9D ;[]=========================================================================[] +0200+ 8E9D ;[] Печать значения регистровой пары AF и флагов [] +0201+ 8E9D ;[] Вход: DE - координаты печати [] +0202+ 8E9D ;[] HL - значение регистровой пары [] +0203+ 8E9D ;[]=========================================================================[] +0204+ 8E9D PrintStrAF: +0205+ 8E9D 7C ld a,h ;значение регистра A +0206+ 8E9E E5 push hl +0207+ 8E9F 32 09 8F ld (.String+11),a +0208+ 8EA2 +0209+ 8EA2 21 FF 8E ld hl,.String+1 ;двоичное значение +0210+ 8EA5 D5 push de +0211+ 8EA6 11 31 30 ld de,0x3031 ;"01" +0212+ 8EA9 06 08 ld b,8 +0213+ 8EAB 07 .L1 rlca +0214+ 8EAC 38 03 jr c,$+5 +0215+ 8EAE 72 ld (hl),d ;"0" +0216+ 8EAF 18 01 jr $+3 +0217+ 8EB1 73 ld (hl),e ;"1" +0218+ 8EB2 23 inc hl +0219+ 8EB3 10 F6 djnz .L1 +0220+ 8EB5 D1 pop de +0221+ 8EB6 +0222+ 8EB6 04 inc b ;B=1 +0223+ 8EB7 23 inc hl +0224+ 8EB8 23 inc hl +0225+ 8EB9 CD 27 91 call ReplSymNoPrint +0226+ 8EBC +0227+ 8EBC E1 pop hl +0228+ 8EBD 7D ld a,l ;флаги +0229+ 8EBE E5 push hl +0230+ 8EBF 21 0B 8F ld hl,.Flags +0231+ 8EC2 06 08 ld b,8 +0232+ 8EC4 CB 9F res 3,a ;сброс неизвестных флагов +0233+ 8EC6 CB AF res 5,a +0234+ 8EC8 07 .L2 rlca +0235+ 8EC9 38 04 jr c,$+6 +0236+ 8ECB CB EE set 5,(hl) ;сброшен +0237+ 8ECD 18 02 jr $+4 +0238+ 8ECF CB AE res 5,(hl) ;установлен +0239+ 8ED1 23 inc hl +0240+ 8ED2 10 F4 djnz .L2 +0241+ 8ED4 E1 pop hl +0242+ 8ED5 +0243+ 8ED5 D5 push de +0244+ 8ED6 CD 67 8E call PrintReg ;печать значения рег.пары +0245+ 8ED9 D1 pop de +0246+ 8EDA D5 push de +0247+ 8EDB 3E 06 ld a,6 +0248+ 8EDD 83 add a,e +0249+ 8EDE 5F ld e,a +0250+ 8EDF 0E 84 ld c,Bios.Lp_Set_Place +0251+ 8EE1 F3 di +0252+ 8EE2 CF rst BiosRst +0253+ 8EE3 21 FE 8E ld hl,.String +0254+ 8EE6 01 86 0D ld bc,13*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки +0255+ 8EE9 F3 di +0256+ 8EEA CF rst BiosRst +0257+ 8EEB D1 pop de +0258+ 8EEC 14 inc d +0259+ 8EED 1D dec e +0260+ 8EEE 1D dec e +0261+ 8EEF 1D dec e +0262+ 8EF0 0E 84 ld c,Bios.Lp_Set_Place +0263+ 8EF2 F3 di +0264+ 8EF3 CF rst BiosRst +0265+ 8EF4 21 0B 8F ld hl,.Flags +0266+ 8EF7 01 86 08 ld bc,8*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки +0267+ 8EFA F3 di +0268+ 8EFB CF rst BiosRst +0269+ 8EFC FB ei +0270+ 8EFD C9 ret +0271+ 8EFE +0272+ 8EFE .String db '%01010101 " "' +0272+ 8EFE 25303130313031303120222022 +0273+ 8F0B .Flags db "SZ.H.PNC" +0273+ 8F0B 535A2E482E504E43 +0274+ 8F13 +0275+ 8F13 ;[]=========================================================================[] +0276+ 8F13 ;[] Печать значений регистровых пар с адресуемыми байтами [] +0277+ 8F13 ;[] Вход: DE - координаты печати [] +0278+ 8F13 ;[] HL - значение регистровой пары [] +0279+ 8F13 ;[]=========================================================================[] +0280+ 8F13 PrintStrReg: +0281+ 8F13 E5 push hl +0282+ 8F14 44 ld b,h +0283+ 8F15 4D ld c,l +0284+ 8F16 +0285+ 8F16 CD 47 92 call Ld_a_bc ;ld a,(bc) адресуемые байты +0286+ 8F19 32 72 8F ld (.String+10),a +0287+ 8F1C CD 74 91 call ConvHexStr +0288+ 8F1F 22 68 8F ld (.String),hl +0289+ 8F22 03 inc bc +0290+ 8F23 CD 47 92 call Ld_a_bc ;ld a,(bc) +0291+ 8F26 32 73 8F ld (.String+11),a +0292+ 8F29 CD 74 91 call ConvHexStr +0293+ 8F2C 22 6A 8F ld (.String+2),hl +0294+ 8F2F 03 inc bc +0295+ 8F30 CD 47 92 call Ld_a_bc ;ld a,(bc) +0296+ 8F33 32 74 8F ld (.String+12),a +0297+ 8F36 CD 74 91 call ConvHexStr +0298+ 8F39 22 6D 8F ld (.String+5),hl +0299+ 8F3C 03 inc bc +0300+ 8F3D CD 47 92 call Ld_a_bc ;ld a,(bc) +0301+ 8F40 32 75 8F ld (.String+13),a +0302+ 8F43 CD 74 91 call ConvHexStr +0303+ 8F46 22 6F 8F ld (.String+7),hl +0304+ 8F49 +0305+ 8F49 21 72 8F ld hl,.String+10 ;замена непечатных символов +0306+ 8F4C 06 04 ld b,4 +0307+ 8F4E CD 27 91 call ReplSymNoPrint +0308+ 8F51 +0309+ 8F51 E1 pop hl +0310+ 8F52 D5 push de +0311+ 8F53 CD 67 8E call PrintReg ;печать значения рег.пары +0312+ 8F56 D1 pop de +0313+ 8F57 F3 di +0314+ 8F58 3E 06 ld a,6 +0315+ 8F5A 83 add a,e +0316+ 8F5B 5F ld e,a +0317+ 8F5C 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати +0318+ 8F5E CF rst BiosRst +0319+ 8F5F 21 68 8F ld hl,.String ;печатаемая строка +0320+ 8F62 01 86 0E ld bc,14*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки +0321+ 8F65 CF rst BiosRst +0322+ 8F66 FB ei +0323+ 8F67 C9 ret +0324+ 8F68 +0325+ 8F68 .String db "0123 4567 ABCD" +0325+ 8F68 3031323320343536372041424344 +0326+ 8F76 +0327+ 8F76 ;[]=========================================================================[] +0328+ 8F76 ;[] Печать номеров банок в окнах [] +0329+ 8F76 ;[] Вход: HL - адрес сохраненных номеров [] +0330+ 8F76 ;[]=========================================================================[] +0331+ 8F76 PrintStrWin: +0332+ 8F76 21 3F AB ld hl,WinPage ;вывод номеров банок в окнах +0333+ 8F79 11 98 8F ld de,.String+3 +0334+ 8F7C 06 04 ld b,4 +0335+ 8F7E C5 .L1 push bc +0336+ 8F7F 7E ld a,(hl) +0337+ 8F80 23 inc hl +0338+ 8F81 E5 push hl +0339+ 8F82 6F ld l,a +0340+ 8F83 26 00 ld h,0 +0341+ 8F85 CD 5E 91 call NumToStr8 ;конвертирование в HEX-строку +0342+ 8F88 13 inc de +0343+ 8F89 13 inc de +0344+ 8F8A 13 inc de +0345+ 8F8B E1 pop hl +0346+ 8F8C C1 pop bc +0347+ 8F8D 10 EF djnz .L1 +0348+ 8F8F +0349+ 8F8F 21 95 8F ld hl,.String +0350+ 8F92 C3 2C 8E jp PrnStrColor-6 +0351+ 8F95 +0352+ 8F95 .String db 0x16,0x02,0x12,"#01" +0352+ 8F95 160212233031 +0353+ 8F9B db 0x16,0x08,0x12,"#02" +0353+ 8F9B 160812233032 +0354+ 8FA1 db 0x16,0x0E,0x12,"#03" +0354+ 8FA1 160E12233033 +0355+ 8FA7 db 0x16,0x14,0x12,"#04",0 +0355+ 8FA7 16141223303400 +0356+ 8FAE +0357+ 8FAE ;[]=========================================================================[] +0358+ 8FAE ;[] Печать глубины стека [] +0359+ 8FAE ;[]=========================================================================[] +0360+ 8FAE PrintSPDn: +0361+ 8FAE 3A 22 AB ld a,(StackDown) +0362+ 8FB1 6F ld l,a +0363+ 8FB2 3E 7F ld a,0x7F +0364+ 8FB4 BD cp l ;отрицательное? +0365+ 8FB5 30 05 jr nc,.L1 +0366+ 8FB7 CB BD res 7,l ;сбросить минус +0367+ 8FB9 3C inc a +0368+ 8FBA 95 sub l +0369+ 8FBB 6F ld l,a +0370+ 8FBC 26 00 .L1 ld h,0 +0371+ 8FBE 11 F2 8F ld de,.String+1 +0372+ 8FC1 D5 push de +0373+ 8FC2 CD AF 91 call ConvDecStr8 +0374+ 8FC5 E1 pop hl +0375+ 8FC6 2B dec hl +0376+ 8FC7 01 30 03 ld bc,3*256+"0" +0377+ 8FCA 71 ld (hl),c +0378+ 8FCB 7E ld a,(hl) ;гашение незначащих нулей +0379+ 8FCC B9 cp c +0380+ 8FCD 20 06 jr nz,$+8 +0381+ 8FCF 3E 20 ld a,0x20 +0382+ 8FD1 77 ld (hl),a +0383+ 8FD2 23 inc hl +0384+ 8FD3 10 F6 djnz $-8 +0385+ 8FD5 3A 22 AB ld a,(StackDown) +0386+ 8FD8 CB 7F bit 7,a +0387+ 8FDA 28 04 jr z,$+6 +0388+ 8FDC 2B dec hl ;отрицательное число +0389+ 8FDD 3E 2D ld a,"-" +0390+ 8FDF 77 ld (hl),a +0391+ 8FE0 +0392+ 8FE0 11 0A 14 ld de,0x140A +0393+ 8FE3 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати +0394+ 8FE5 F3 di +0395+ 8FE6 CF rst BiosRst +0396+ 8FE7 21 F1 8F ld hl,.String ;печатаемая строка +0397+ 8FEA 01 86 04 ld bc,4*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки +0398+ 8FED F3 di +0399+ 8FEE CF rst BiosRst +0400+ 8FEF FB ei +0401+ 8FF0 C9 ret +0402+ 8FF1 +0403+ 8FF1 00 .String ds 4 +0404+ 8FF5 +0405+ 8FF5 ;[]=========================================================================[] +0406+ 8FF5 ;[] Печать значений стека [] +0407+ 8FF5 ;[]=========================================================================[] +0408+ 8FF5 PrintStrSP: +0409+ 8FF5 3A 66 90 ld a,(.StrSp) ;строка с вершиной стека +0410+ 8FF8 3C inc a +0411+ 8FF9 28 0D jr z,.L4 ;если вершина стека не попадает в дамп +0412+ 8FFB 2A 3B AB ld hl,(Reg._SP) +0413+ 8FFE 2B dec hl +0414+ 8FFF 2B dec hl +0415+ 9000 23 inc hl +0416+ 9001 23 inc hl +0417+ 9002 3D dec a +0418+ 9003 20 FB jr nz,$-3 +0419+ 9005 22 23 AB ld (StackDump),hl +0420+ 9008 +0421+ 9008 2A 23 AB .L4 ld hl,(StackDump) ;начало дампа +0422+ 900B 11 01 16 ld de,#1601 ;координаты печати +0423+ 900E 3E FF ld a,-1 +0424+ 9010 32 66 90 ld (.StrSp),a +0425+ 9013 +0426+ 9013 06 08 ld b,8 ;кол-во строк дампа +0427+ 9015 C5 .L3 push bc +0428+ 9016 D5 push de ;координаты +0429+ 9017 E5 push hl +0430+ 9018 B7 or a ;сброс флага C +0431+ 9019 78 ld a,b +0432+ 901A ED 4B 3B AB ld bc,(Reg._SP) ;адрес вершины стека +0433+ 901E ED 42 sbc hl,bc +0434+ 9020 20 0C jr nz,.L2 +0435+ 9022 47 ld b,a +0436+ 9023 3E 08 ld a,8 +0437+ 9025 90 sub b +0438+ 9026 32 66 90 ld (.StrSp),a ;номер строки в дампе с вершиной стека +0439+ 9029 3A 15 AB ld a,(Color._SP) ;цвет вершины стека +0440+ 902C 18 03 jr .L2+3 +0441+ 902E 3A 11 AB .L2 ld a,(Color.Screen) ;основной цвет +0442+ 9031 32 39 90 ld (.L1+1),a ;записали цвет +0443+ 9034 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати +0444+ 9036 F3 di +0445+ 9037 CF rst BiosRst +0446+ 9038 1E 00 .L1 ld e,0 ;цвет подсветки +0447+ 903A 01 83 0B ld bc,11*256+Bios.Lp_Print_Atr ;в рег.B длина строки +0448+ 903D CF rst BiosRst +0449+ 903E E1 pop hl +0450+ 903F D1 pop de +0451+ 9040 D5 push de +0452+ 9041 E5 push hl +0453+ 9042 CD 67 8E call PrintReg ;печать адреса +0454+ 9045 E1 pop hl +0455+ 9046 D1 pop de +0456+ 9047 D5 push de +0457+ 9048 2B dec hl +0458+ 9049 2B dec hl +0459+ 904A E5 push hl +0460+ 904B 3E 06 ld a,6 +0461+ 904D 83 add a,e +0462+ 904E 5F ld e,a +0463+ 904F +0464+ 904F 23 inc hl +0465+ 9050 23 inc hl +0466+ 9051 CD 6C 92 call Ld_a_hl +0467+ 9054 4F ld c,a +0468+ 9055 23 inc hl +0469+ 9056 CD 6C 92 call Ld_a_hl +0470+ 9059 6F ld l,a +0471+ 905A 61 ld h,c +0472+ 905B +0473+ 905B CD 67 8E call PrintReg ;печать значения стека +0474+ 905E E1 pop hl +0475+ 905F D1 pop de +0476+ 9060 14 inc d +0477+ 9061 C1 pop bc +0478+ 9062 10 B1 djnz .L3 +0479+ 9064 FB ei +0480+ 9065 C9 ret +0481+ 9066 +0482+ 9066 06 .StrSp db 6 +0483+ 9067 +0484+ 9067 ;[]=========================================================================[] +0485+ 9067 ;[] Печать дампа [] +0486+ 9067 ;[]=========================================================================[] +0487+ 9067 PrintDump: +0488+ 9067 11 0E 16 ld de,0x160E ;координаты +0489+ 906A 2A 43 AB ld hl,(Dump1) +0490+ 906D 06 08 ld b,8 ;количество строк +0491+ 906F D5 push de +0492+ 9070 C5 push bc +0493+ 9071 E5 push hl +0494+ 9072 CD 97 90 call PrintStrDump +0495+ 9075 E1 pop hl +0496+ 9076 01 10 00 ld bc,16 +0497+ 9079 09 add hl,bc +0498+ 907A C1 pop bc +0499+ 907B D1 pop de +0500+ 907C 14 inc d ;следующая строка +0501+ 907D 10 F0 djnz $-14 +0502+ 907F C9 ret +0503+ 9080 +0504+ 9080 21 45 AB ld hl,Dump ;вывод дампа +0505+ 9083 ; ld de,0x160E ;координаты +0506+ 9083 06 08 ld b,8 ;количество строк +0507+ 9085 D5 push de +0508+ 9086 C5 push bc +0509+ 9087 4E ld c,(hl) ;младший байт адреса +0510+ 9088 23 inc hl +0511+ 9089 E5 push hl +0512+ 908A 66 ld h,(hl) ;старший байт адреса +0513+ 908B 69 ld l,c +0514+ 908C CD 97 90 call PrintStrDump +0515+ 908F E1 pop hl +0516+ 9090 23 inc hl +0517+ 9091 C1 pop bc +0518+ 9092 D1 pop de +0519+ 9093 14 inc d ;следующая строка +0520+ 9094 10 EF djnz $-15 +0521+ 9096 C9 ret +0522+ 9097 +0523+ 9097 ;[]=========================================================================[] +0524+ 9097 ;[] Печать строки дампа [] +0525+ 9097 ;[] Вход: DE - координаты печати [] +0526+ 9097 ;[] HL - адрес начала строки [] +0527+ 9097 ;[]=========================================================================[] +0528+ 9097 PrintStrDump: +0529+ 9097 D5 push de +0530+ 9098 E5 push hl +0531+ 9099 +0532+ 9099 44 ld b,h +0533+ 909A 4D ld c,l +0534+ 909B 11 EE 90 ld de,.String +0535+ 909E DD 21 17 91 ld ix,.String+41 +0536+ 90A2 DD E5 push ix +0537+ 90A4 +0538+ 90A4 3E 08 ld a,8 +0539+ 90A6 08 .L1 exa +0540+ 90A7 CD 47 92 call Ld_a_bc ;ld a,(bc) +0541+ 90AA DD 77 00 ld (ix),a +0542+ 90AD DD 23 inc ix +0543+ 90AF CD 74 91 call ConvHexStr +0544+ 90B2 EB ex de,hl +0545+ 90B3 73 ld (hl),e +0546+ 90B4 23 inc hl +0547+ 90B5 72 ld (hl),d +0548+ 90B6 23 inc hl +0549+ 90B7 EB ex de,hl +0550+ 90B8 03 inc bc +0551+ 90B9 CD 47 92 call Ld_a_bc ;ld a,(bc) +0552+ 90BC DD 77 00 ld (ix),a +0553+ 90BF DD 23 inc ix +0554+ 90C1 CD 74 91 call ConvHexStr +0555+ 90C4 EB ex de,hl +0556+ 90C5 73 ld (hl),e +0557+ 90C6 23 inc hl +0558+ 90C7 72 ld (hl),d +0559+ 90C8 23 inc hl +0560+ 90C9 23 inc hl +0561+ 90CA EB ex de,hl +0562+ 90CB 03 inc bc +0563+ 90CC 08 exa +0564+ 90CD 3D dec a +0565+ 90CE 20 D6 jr nz,.L1 +0566+ 90D0 +0567+ 90D0 06 10 ld b,16 +0568+ 90D2 E1 pop hl +0569+ 90D3 CD 27 91 call ReplSymNoPrint ;замена непечатных символов +0570+ 90D6 +0571+ 90D6 E1 pop hl +0572+ 90D7 D1 pop de +0573+ 90D8 D5 push de +0574+ 90D9 CD 67 8E call PrintReg ;печать адреса строки +0575+ 90DC D1 pop de +0576+ 90DD F3 di +0577+ 90DE 3E 07 ld a,7 +0578+ 90E0 83 add a,e +0579+ 90E1 5F ld e,a +0580+ 90E2 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати +0581+ 90E4 CF rst BiosRst +0582+ 90E5 21 EE 90 ld hl,.String +0583+ 90E8 01 86 39 ld bc,57*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки +0584+ 90EB CF rst BiosRst +0585+ 90EC FB ei +0586+ 90ED C9 ret +0587+ 90EE +0588+ 90EE .String db "1000 2000 3000 4000 5000 6000 7000 8000 " +0588+ 90EE 3130303020323030302033303030203430303020353030302036303030203730 +0588+ 910E 303020383030302020 +0589+ 9117 db "0123456789ABCDEF" +0589+ 9117 30313233343536373839414243444546 +0590+ 9127 +0591+ 9127 ;[]=========================================================================[] +0592+ 9127 ;[] Замена непечатных символов в строке [] +0593+ 9127 ;[] Вход: B - длина строки [] +0594+ 9127 ;[] HL - адрес начала строки [] +0595+ 9127 ;[]=========================================================================[] +0596+ 9127 ReplSymNoPrint: +0597+ 9127 3A 5C AA ld a,(SymbolNoPrint) +0598+ 912A 4F ld c,a +0599+ 912B 7E .L1 ld a,(hl) +0600+ 912C FE 7F cp 127 +0601+ 912E 28 08 jr z,$+10 +0602+ 9130 FE FF cp 0xFF +0603+ 9132 28 04 jr z,$+6 +0604+ 9134 FE 20 cp " " +0605+ 9136 30 01 jr nc,$+3 +0606+ 9138 71 ld (hl),c +0607+ 9139 23 inc hl +0608+ 913A 10 EF djnz .L1 +0609+ 913C C9 ret +0610+ 913D +0611+ 913D ;[]=========================================================================[] +0612+ 913D ;[] Формирование 16-тибитного числа [] +0613+ 913D ;[] Вход: DE - адрес буфера [] +0614+ 913D ;[] HL - число [] +0615+ 913D ;[]=========================================================================[] +0616+ 913D NumToStr16: +0617+ 913D 3A 7E AB ld a,(DecHex) ;систем счисления +0618+ 9140 B7 or a +0619+ 9141 C2 91 91 jp nz,ConvDecStr +0620+ 9144 +0621+ 9144 3E 23 ld a,"#" +0622+ 9146 12 ld (de),a +0623+ 9147 13 inc de +0624+ 9148 4D ld c,l +0625+ 9149 7C ld a,h +0626+ 914A CD 74 91 call ConvHexStr +0627+ 914D EB ex de,hl +0628+ 914E 73 ld (hl),e ;старший байт +0629+ 914F 23 inc hl +0630+ 9150 72 ld (hl),d +0631+ 9151 23 inc hl +0632+ 9152 EB ex de,hl +0633+ 9153 79 ld a,c +0634+ 9154 CD 74 91 call ConvHexStr +0635+ 9157 EB ex de,hl +0636+ 9158 73 ld (hl),e ;младший байт +0637+ 9159 23 inc hl +0638+ 915A 72 ld (hl),d +0639+ 915B 23 inc hl +0640+ 915C EB ex de,hl +0641+ 915D C9 ret +0642+ 915E +0643+ 915E ;[]=========================================================================[] +0644+ 915E ;[] Формирование 8-битного числа [] +0645+ 915E ;[] Вход: DE - адрес буфера [] +0646+ 915E ;[] HL - число [] +0647+ 915E ;[]=========================================================================[] +0648+ 915E NumToStr8: +0649+ 915E 3A 7E AB ld a,(DecHex) ;систем счисления +0650+ 9161 B7 or a +0651+ 9162 C2 AF 91 jp nz,ConvDecStr8 +0652+ 9165 +0653+ 9165 3E 23 .Hex ld a,"#" +0654+ 9167 12 ld (de),a +0655+ 9168 13 inc de +0656+ 9169 7D ld a,l +0657+ 916A CD 74 91 call ConvHexStr +0658+ 916D EB ex de,hl +0659+ 916E 73 ld (hl),e +0660+ 916F 23 inc hl +0661+ 9170 72 ld (hl),d +0662+ 9171 23 inc hl +0663+ 9172 EB ex de,hl +0664+ 9173 C9 ret +0665+ 9174 +0666+ 9174 ;[]=========================================================================[] +0667+ 9174 ;[] Конвертирование числа в HEX-строку [] +0668+ 9174 ;[] Вход: A - число [] +0669+ 9174 ;[] Выход: HL - HEX-строка [] +0670+ 9174 ;[]=========================================================================[] +0671+ 9174 ConvHexStr: +0672+ 9174 F5 push af +0673+ 9175 0F rrca +0674+ 9176 0F rrca +0675+ 9177 0F rrca +0676+ 9178 0F rrca +0677+ 9179 E6 0F and 0x0F +0678+ 917B C6 30 add a,0x30 +0679+ 917D FE 3A cp 0x3A +0680+ 917F 38 02 jr c,$+4 +0681+ 9181 C6 07 add a,7 +0682+ 9183 +0683+ 9183 6F ld l,a +0684+ 9184 F1 pop af +0685+ 9185 E6 0F and 0x0F +0686+ 9187 C6 30 add a,0x30 +0687+ 9189 FE 3A cp 0x3A +0688+ 918B 38 02 jr c,$+4 +0689+ 918D C6 07 add a,7 +0690+ 918F 67 ld h,a +0691+ 9190 C9 ret +0692+ 9191 +0693+ 9191 ;[]=========================================================================[] +0694+ 9191 ;[] Конвертирование 16-битного числа в DEC-строку [] +0695+ 9191 ;[] Вход: HL - число [] +0696+ 9191 ;[] DE - адрес начала DEC-строки [] +0697+ 9191 ;[]=========================================================================[] +0698+ 9191 ConvDecStr: +0699+ 9191 01 F0 D8 ld bc,-10000 +0700+ 9194 3E FF ld a,0xFF +0701+ 9196 3C inc a +0702+ 9197 09 add hl,bc +0703+ 9198 38 FC jr c,$-2 +0704+ 919A ED 42 sbc hl,bc +0705+ 919C C6 30 add a,"0" +0706+ 919E 12 ld (de),a +0707+ 919F 13 inc de +0708+ 91A0 +0709+ 91A0 01 18 FC ld bc,-1000 +0710+ 91A3 3E FF ld a,0xFF +0711+ 91A5 3C inc a +0712+ 91A6 09 add hl,bc +0713+ 91A7 38 FC jr c,$-2 +0714+ 91A9 ED 42 sbc hl,bc +0715+ 91AB C6 30 add a,"0" +0716+ 91AD 12 ld (de),a +0717+ 91AE 13 inc de +0718+ 91AF ConvDecStr8: +0719+ 91AF 01 9C FF ld bc,-100 +0720+ 91B2 3E FF ld a,0xFF +0721+ 91B4 3C inc a +0722+ 91B5 09 add hl,bc +0723+ 91B6 38 FC jr c,$-2 +0724+ 91B8 ED 42 sbc hl,bc +0725+ 91BA C6 30 add a,"0" +0726+ 91BC 12 ld (de),a +0727+ 91BD 13 inc de +0728+ 91BE ConvDecStr8_1: +0729+ 91BE 01 F6 FF ld bc,-10 +0730+ 91C1 3E FF ld a,0xFF +0731+ 91C3 3C inc a +0732+ 91C4 09 add hl,bc +0733+ 91C5 38 FC jr c,$-2 +0734+ 91C7 ED 42 sbc hl,bc +0735+ 91C9 +0736+ 91C9 C6 30 add a,"0" +0737+ 91CB 12 ld (de),a +0738+ 91CC 13 inc de +0739+ 91CD +0740+ 91CD 7D ld a,l +0741+ 91CE C6 30 add a,"0" +0742+ 91D0 12 ld (de),a +0743+ 91D1 13 inc de +0744+ 91D2 C9 ret +0745+ 91D3 +0746+ 91D3 ;[]=========================================================================[] +0747+ 91D3 ;[] Прорисовка курсора [] +0748+ 91D3 ;[] Вход: B - длина курсора [] +0749+ 91D3 ;[] HL - координаты курсора [] +0750+ 91D3 ;[]=========================================================================[] +0751+ 91D3 CursorSet: +0752+ 91D3 22 36 92 ld (CursorRes+1),hl +0753+ 91D6 EB ex de,hl +0754+ 91D7 68 ld l,b ;размер по вертикали +0755+ 91D8 26 01 ld h,1 ;размер по горизонтали +0756+ 91DA 22 39 92 ld (CursorRes+4),hl +0757+ 91DD DD 21 09 92 ld ix,.Buffer +0758+ 91E1 D5 push de +0759+ 91E2 E5 push hl +0760+ 91E3 DD E5 push ix +0761+ 91E5 C5 push bc +0762+ 91E6 ifdef D_PRINTCH_BIOS +0763+ 91E6~ xor a +0764+ 91E6~ ld c,Bios.Win_Copy_Win ;копирование в буфер +0765+ 91E6~ di +0766+ 91E6~ rst BiosRst +0767+ 91E6~ ei +0768+ 91E6 else +0769+ 91E6 3A 1E AB ld a,(BankDebug) +0770+ 91E9 47 ld b,a +0771+ 91EA 0E 59 ld c,Dss.WinCopy +0772+ 91EC D7 rst DssRst +0773+ 91ED endif +0774+ 91ED +0775+ 91ED C1 pop bc ;в B длина курсора +0776+ 91EE E1 pop hl +0777+ 91EF E5 push hl +0778+ 91F0 23 inc hl +0779+ 91F1 7E ld a,(hl) ;цвет символов +0780+ 91F2 32 43 92 ld (CursorRes.L1+1),a +0781+ 91F5 3A 19 AB ld a,(Color.Cursor) +0782+ 91F8 77 .L1 ld (hl),a +0783+ 91F9 23 inc hl ;к байту цвета +0784+ 91FA 23 inc hl +0785+ 91FB 10 FB djnz .L1 +0786+ 91FD +0787+ 91FD DD E1 pop ix +0788+ 91FF E1 pop hl +0789+ 9200 D1 pop de +0790+ 9201 ifdef D_PRINTCH_BIOS +0791+ 9201~ xor a +0792+ 9201~ ld c,Bios.Win_Restore_Win ;вывод курсора на экран +0793+ 9201~ di +0794+ 9201~ rst BiosRst +0795+ 9201~ ei +0796+ 9201 else +0797+ 9201 3A 1E AB ld a,(BankDebug) +0798+ 9204 47 ld b,a +0799+ 9205 0E 5A ld c,Dss.WinRest +0800+ 9207 D7 rst DssRst +0801+ 9208 endif +0802+ 9208 C9 ret +0803+ 9209 +0804+ 9209 00 .Buffer ds 22*2 ;max длина курсора +0805+ 9235 +0806+ 9235 ;[]=========================================================================[] +0807+ 9235 ;[] Востановление экрана под курсором [] +0808+ 9235 ;[]=========================================================================[] +0809+ 9235 CursorRes: +0810+ 9235 11 00 00 ld de,0 ;координаты +0811+ 9238 21 00 00 ld hl,0 ;размер +0812+ 923B 45 ld b,l ;длина +0813+ 923C D5 push de +0814+ 923D E5 push hl +0815+ 923E 21 09 92 ld hl,CursorSet.Buffer +0816+ 9241 E5 push hl +0817+ 9242 3E 00 .L1 ld a,0 ;цвет +0818+ 9244 23 inc hl ;к байту цвета +0819+ 9245 18 B1 jr CursorSet.L1 +0820+ 9247 +0821+ 9247 ;[]=========================================================================[] +0822+ 9247 ;[] Чтение байта из памяти с проверкой адреса [] +0823+ 9247 ;[] Вход: BC или HL - адрес в памяти [] +0824+ 9247 ;[] Выход: A - считанный байт [] +0825+ 9247 ;[]=========================================================================[] +0826+ 9247 Ld_a_bc: +0827+ 9247 3E C0 ld a,11000000b ;проверка диапазона +0828+ 9249 A0 and b +0829+ 924A 28 10 jr z,.L1 ;в 0-м окне +0830+ 924C FE 80 cp 10000000b ;во 2-ом окне +0831+ 924E 0A ld a,(bc) +0832+ 924F C0 ret nz ;возвращаем байт, если нет +0833+ 9250 3A 41 AB ld a,(WinPage+2) ;номер банки под отладчиком +0834+ 9253 D3 E2 out (EmmWin.P3),a ;в третье окно ее +0835+ 9255 CB F0 set 6,b ;корректируем адрес +0836+ 9257 0A ld a,(bc) ;читаем байт +0837+ 9258 CB B0 res 6,b ;востанавливаем адрес +0838+ 925A 18 33 jr Ld_a_hl.L1 +0839+ 925C 3A 3F AB .L1 ld a,(WinPage) ;номер банки в 0-м +0840+ 925F D3 E2 out (EmmWin.P3),a ;в третье окно ее +0841+ 9261 CB F0 set 6,b ;корректируем адрес +0842+ 9263 CB F8 set 7,b +0843+ 9265 0A ld a,(bc) ;читаем байт +0844+ 9266 CB B0 res 6,b ;востанавливаем адрес +0845+ 9268 CB B8 res 7,b +0846+ 926A 18 23 jr Ld_a_hl.L1 +0847+ 926C Ld_a_hl: +0848+ 926C 3E C0 ld a,11000000b ;проверка диапазона +0849+ 926E A4 and h +0850+ 926F 28 10 jr z,.L2 ;в 0-м окне +0851+ 9271 FE 80 cp 10000000b ;во 2-ом окне +0852+ 9273 7E ld a,(hl) +0853+ 9274 C0 ret nz ;возвращаем байт, если нет +0854+ 9275 3A 41 AB ld a,(WinPage+2) ;номер банки под отладчиком +0855+ 9278 D3 E2 out (EmmWin.P3),a ;в третье окно ее +0856+ 927A CB F4 set 6,h ;корректируем адрес +0857+ 927C 7E ld a,(hl) ;читаем байт +0858+ 927D CB B4 res 6,h ;востанавливаем адрес +0859+ 927F 18 0E jr .L1 +0860+ 9281 3A 3F AB .L2 ld a,(WinPage) ;номер банки в 0-м окне +0861+ 9284 D3 E2 out (EmmWin.P3),a ;в третье окно ее +0862+ 9286 CB F4 set 6,h ;корректируем адрес +0863+ 9288 CB FC set 7,h +0864+ 928A 7E ld a,(hl) ;читаем байт +0865+ 928B CB B4 res 6,h ;востанавливаем адрес +0866+ 928D CB BC res 7,h +0867+ 928F F5 .L1 push af +0868+ 9290 3A 42 AB ld a,(WinPage+3) ;номер банки из 3-го окна +0869+ 9293 D3 E2 out (EmmWin.P3),a ;востанавливаем +0870+ 9295 F1 pop af +0871+ 9296 C9 ret +0872+ 9297 +0873+ 9297 ;[]=========================================================================[] +0874+ 9297 ;[] Запись байта в память с проверкой адреса [] +0875+ 9297 ;[] Вход: HL - адрес в памяти [] +0876+ 9297 ;[] A - записываемый байт [] +0877+ 9297 ;[]=========================================================================[] +0878+ 9297 Ld_hl_a: +0879+ 9297 F5 push af +0880+ 9298 3E C0 ld a,11000000b ;проверка диапазона +0881+ 929A A4 and h +0882+ 929B 28 12 jr z,.L2 ;в 0-ом окне +0883+ 929D FE 80 cp 10000000b ;во 2-ом окне? +0884+ 929F 28 03 jr z,.L1 +0885+ 92A1 F1 pop af +0886+ 92A2 77 ld (hl),a ;записали байт, если нет +0887+ 92A3 C9 ret +0888+ 92A4 3A 41 AB .L1 ld a,(WinPage+2) ;номер банки под отладчиком +0889+ 92A7 D3 E2 out (EmmWin.P3),a ;в третье окно ее +0890+ 92A9 CB F4 set 6,h ;корректируем адрес +0891+ 92AB F1 pop af +0892+ 92AC 77 ld (hl),a ;пишем байт +0893+ 92AD 18 0D jr .L3 +0894+ 92AF 3A 3F AB .L2 ld a,(WinPage) ;номер банки в 0-ом +0895+ 92B2 D3 E2 out (EmmWin.P3),a ;в третье окно ее +0896+ 92B4 CB F4 set 6,h ;корректируем адрес +0897+ 92B6 CB FC set 7,h +0898+ 92B8 F1 pop af +0899+ 92B9 77 ld (hl),a ;пишем байт +0900+ 92BA CB BC res 7,h ;востанавливаем адрес +0901+ 92BC CB B4 .L3 res 6,h +0902+ 92BE 3A 42 AB ld a,(WinPage+3) ;номер банки из 3-го окна +0903+ 92C1 D3 E2 out (EmmWin.P3),a ;востанавливаем +0904+ 92C3 C9 ret +0905+ 92C4 +0906+ 92C4 ;[]=========================================================================[] +0907+ 92C4 ;[] Определение принадлежности адреса области памяти [] +0908+ 92C4 ;[] Вход: HL - нижний адрес области памяти [] +0909+ 92C4 ;[] DE - верхний адрес области памяти [] +0910+ 92C4 ;[] BC - адрес [] +0911+ 92C4 ;[] Выход: флаг C - адрес не принадлежит области памяти [] +0912+ 92C4 ;[] флаг NC - адрес принадлежит области памяти [] +0913+ 92C4 ;[]=========================================================================[] +0914+ 92C4 AdrArea: +0915+ 92C4 B7 or a +0916+ 92C5 ED 42 sbc hl,bc +0917+ 92C7 D8 ret c +0918+ 92C8 EB ex de,hl +0919+ 92C9 B7 or a +0920+ 92CA ED 42 sbc hl,bc +0921+ 92CC 3F ccf +0922+ 92CD C9 ret +0923+ 92CE +0924+ 92CE +0373 92CE include "file.asm";"D:\WORKAST\DEMON\file" +0001+ 92CE ;[]=========================================================================[] +0002+ 92CE ;[] Файловые процедуры монитора-отладчика DemoN [] +0003+ 92CE ;[] v0.10 - последние изменения 27.08.2006 [] +0004+ 92CE ;[]=========================================================================[] +0005+ 92CE LoadFile: +0006+ 92CE AF xor a ;выкл часов +0007+ 92CF 32 5D AA ld (ClockOn),a +0008+ 92D2 01 54 01 ld bc,0x0100+Dss.SelPage ;системный экран +0009+ 92D5 D7 rst DssRst +0010+ 92D6 +0011+ 92D6 21 FE AA ld hl,Str.Load ;сообщение о загрузке файла +0012+ 92D9 0E 5C ld c,Dss.PChars +0013+ 92DB D7 rst DssRst +0014+ 92DC +0015+ 92DC CD EC 92 call LoadExe +0016+ 92DF +0017+ 92DF 3A 5E AA ld a,(DemonScreen) +0018+ 92E2 47 ld b,a +0019+ 92E3 0E 54 ld c,Dss.SelPage +0020+ 92E5 D7 rst DssRst +0021+ 92E6 3E FF ld a,On ;вкл часов +0022+ 92E8 32 5D AA ld (ClockOn),a +0023+ 92EB C9 ret +0024+ 92EC +0025+ 92EC LoadExe: +0026+ 92EC 21 80 94 ld hl,FDebug ;имя файла +0027+ 92EF 3E 01 ld a,1 ;открыть для чтения +0028+ 92F1 0E 11 ld c,Dss.Open +0029+ 92F3 D7 rst DssRst +0030+ 92F4 DA 05 95 jp c,PrErDss ;выход с ошибкой +0031+ 92F7 +0032+ 92F7 32 7F 94 ld (FId),a ;запомнить файловый манипулятор +0033+ 92FA +0034+ 92FA 21 80 94 ld hl,FDebug ;буфер для загрузки заголовка +0035+ 92FD 11 7F 00 ld de,0x7F ;кол-во считываемых байт +0036+ 9300 0E 13 ld c,Dss.Read ;чтение +0037+ 9302 D7 rst DssRst +0038+ 9303 DA 05 95 jp c,PrErDss ;выход с ошибкой +0039+ 9306 +0040+ 9306 2A 80 94 ld hl,(FDebug) ;заголовок EXE-файла +0041+ 9309 11 45 58 ld de,0x5845 ;'EX' проверка идентификатора +0042+ 930C ED 52 sbc hl,de +0043+ 930E 20 3A jr nz,.L1 +0044+ 9310 21 83 94 ld hl,FDebug+3 +0045+ 9313 7E ld a,(hl) ;версия EXE-файла +0046+ 9314 B7 or a +0047+ 9315 20 33 jr nz,.L1 +0048+ 9317 23 inc hl +0049+ 9318 5E ld e,(hl) ;начало исполняемого кода +0050+ 9319 23 inc hl +0051+ 931A 56 ld d,(hl) +0052+ 931B 01 0B 00 ld bc,11 ;пропускаем флаг загрузчика и зарезервированные байты +0053+ 931E 09 add hl,bc +0054+ 931F 7E ld a,(hl) ;мл.байт расположения кода в памяти +0055+ 9320 32 03 95 ld (FRam),a +0056+ 9323 23 inc hl +0057+ 9324 7E ld a,(hl) ;ст.байт расположения кода в памяти +0058+ 9325 32 04 95 ld (FRam+1),a +0059+ 9328 23 inc hl +0060+ 9329 7E ld a,(hl) ;мл.байт адреса запуска +0061+ 932A 32 3D AB ld (Reg._PC),a +0062+ 932D 32 55 AB ld (ListAdr),a ;мл.байт адреса листинга +0063+ 9330 23 inc hl +0064+ 9331 7E ld a,(hl) ;ст.байт адреса запуска +0065+ 9332 32 3E AB ld (Reg._PC+1),a +0066+ 9335 32 56 AB ld (ListAdr+1),a ;ст.байт адреса листинга +0067+ 9338 23 inc hl +0068+ 9339 7E ld a,(hl) ;мл.байт стека программы +0069+ 933A 32 3B AB ld (Reg._SP),a +0070+ 933D 23 inc hl +0071+ 933E 7E ld a,(hl) ;ст.байт стека программы +0072+ 933F 32 3C AB ld (Reg._SP+1),a +0073+ 9342 7B ld a,e +0074+ 9343 32 8A 93 ld (.L2+2),a +0075+ 9346 7A ld a,d +0076+ 9347 32 8B 93 ld (.L2+3),a +0077+ 934A +0078+ 934A 21 00 00 .L1 ld hl,0 +0079+ 934D DD 21 00 00 ld ix,0 ;смещение в файле +0080+ 9351 01 15 02 ld bc,2*256+Dss.Move_FP ;относительно конца +0081+ 9354 D7 rst DssRst +0082+ 9355 DA 05 95 jp c,PrErDss ;выход с ошибкой +0083+ 9358 +0084+ 9358 E5 push hl +0085+ 9359 ED 5B 03 95 ld de,(FRam) ;адрес расположения кода +0086+ 935D CB F2 set 6,d +0087+ 935F CB BA res 7,d ;грузим через 1-е окно +0088+ 9361 21 00 80 ld hl,0x8000 +0089+ 9364 B7 or a ;сбросить флаг C +0090+ 9365 ED 52 sbc hl,de ;кол-во считываемых байт +0091+ 9367 22 9E 93 ld (.L6+1),hl +0092+ 936A EB ex de,hl +0093+ 936B 22 A1 93 ld (.L6+4),hl +0094+ 936E E1 pop hl +0095+ 936F CD 52 94 call NBank ;определить кол-во банок +0096+ 9372 DA 05 95 jp c,PrErDss ;выход с ошибкой +0097+ 9375 +0098+ 9375 32 7D 94 ld (MemId+1),a ;кол-во выделяемых страниц +0099+ 9378 47 ld b,a +0100+ 9379 0E 3D ld c,Dss.GetMem ;выделение памяти +0101+ 937B D7 rst DssRst +0102+ 937C DA 05 95 jp c,PrErDss ;выход с ошибкой +0103+ 937F 32 7C 94 ld (MemId),a ;id блока памяти +0104+ 9382 +0105+ 9382 3A 7F 94 ld a,(FId) ;файловый манипулятор +0106+ 9385 21 00 00 ld hl,0 +0107+ 9388 DD 21 00 00 .L2 ld ix,0 ;смещение в файле +0108+ 938C 01 15 00 ld bc,Dss.Move_FP ;относительно начала +0109+ 938F D7 rst DssRst +0110+ 9390 DA 05 95 jp c,PrErDss ;выход с ошибкой +0111+ 9393 +0112+ 9393 3A 7C 94 ld a,(MemId) ;id блока памяти +0113+ 9396 01 39 00 ld bc,Dss.SetWin1 ;вкл 1-ю банку в 1-е окно +0114+ 9399 D7 rst DssRst +0115+ 939A DA 05 95 jp c,PrErDss ;выход с ошибкой +0116+ 939D +0117+ 939D 11 FF 3F .L6 ld de,0x3FFF ;кол-во считываемых байт +0118+ 93A0 21 00 40 ld hl,0x4000 ;адрес загрузки кода +0119+ 93A3 3E 01 ld a,1 ;счетчик банок +0120+ 93A5 32 7E 94 ld (MemId+2),a +0121+ 93A8 3A 7F 94 .L5 ld a,(FId) ;файловый манипулятор +0122+ 93AB 0E 13 ld c,Dss.Read ;чтение +0123+ 93AD D7 rst DssRst +0124+ 93AE DA 05 95 jp c,PrErDss ;выход с ошибкой +0125+ 93B1 +0126+ 93B1 ED 4B 7D 94 ld bc,(MemId+1) +0127+ 93B5 78 ld a,b +0128+ 93B6 B9 cp c ;загрзили весь файл? +0129+ 93B7 28 15 jr z,.L4 ;переход, если да +0130+ 93B9 +0131+ 93B9 3C inc a +0132+ 93BA 32 7E 94 ld (MemId+2),a ;увеличить счетчик банок +0133+ 93BD 3A 7C 94 ld a,(MemId) ;id блока памяти +0134+ 93C0 0E 39 ld c,Dss.SetWin1 ;вкл банку в 1-е окно +0135+ 93C2 D7 rst DssRst +0136+ 93C3 DA 05 95 jp c,PrErDss ;выход с ошибкой +0137+ 93C6 +0138+ 93C6 21 00 40 ld hl,0x4000 ;адрес в памяти для загрузки +0139+ 93C9 11 FF 3F ld de,0x3FFF ;кол-во загружаемых байт +0140+ 93CC 18 DA jr .L5 +0141+ 93CE +0142+ 93CE 3A 7F 94 .L4 ld a,(FId) ;файловый манипулятор +0143+ 93D1 0E 12 ld c,Dss.Close ;закрыть файл +0144+ 93D3 D7 rst DssRst +0145+ 93D4 DA 05 95 jp c,PrErDss ;выход с ошибкой +0146+ 93D7 +0147+ 93D7 3A 7C 94 ld a,(MemId) ;id блока памяти +0148+ 93DA 01 C4 00 ld bc,Bios.Emm_Fn4 ;вычислить физ номер 1-й банки +0149+ 93DD CF rst BiosRst +0150+ 93DE D8 ret c ;выход с ошибкой +0151+ 93DF 32 78 94 ld (BankP),a +0152+ 93E2 3A 7D 94 ld a,(MemId+1) ;кол-во выделенных страниц +0153+ 93E5 3D dec a +0154+ 93E6 28 2F jr z,.L7 +0155+ 93E8 +0156+ 93E8 3A 7C 94 ld a,(MemId) ;id блока памяти +0157+ 93EB 01 C4 01 ld bc,1*256+Bios.Emm_Fn4 ;вычислить физ номер 2-й банки +0158+ 93EE CF rst BiosRst +0159+ 93EF D8 ret c ;выход с ошибкой +0160+ 93F0 32 79 94 ld (BankP+1),a +0161+ 93F3 3A 7D 94 ld a,(MemId+1) ;кол-во выделенных страниц +0162+ 93F6 FE 02 cp 2 +0163+ 93F8 28 1D jr z,.L7 +0164+ 93FA +0165+ 93FA 3A 7C 94 ld a,(MemId) ;id блока памяти +0166+ 93FD 01 C4 02 ld bc,2*256+Bios.Emm_Fn4 ;вычислить физ номер 3-й банки +0167+ 9400 CF rst BiosRst +0168+ 9401 D8 ret c ;выход с ошибкой +0169+ 9402 32 7A 94 ld (BankP+2),a +0170+ 9405 3A 7D 94 ld a,(MemId+1) ;кол-во выделенных страниц +0171+ 9408 FE 03 cp 3 +0172+ 940A 28 0B jr z,.L7 +0173+ 940C +0174+ 940C 3A 7C 94 ld a,(MemId) ;id блока памяти +0175+ 940F 01 C4 03 ld bc,3*256+Bios.Emm_Fn4 ;вычислить физ номер 4-й банки +0176+ 9412 CF rst BiosRst +0177+ 9413 D8 ret c ;выход с ошибкой +0178+ 9414 32 7B 94 ld (BankP+3),a +0179+ 9417 +0180+ 9417 21 3F AB .L7 ld hl,WinPage +0181+ 941A 11 78 94 ld de,BankP +0182+ 941D 3A 7D 94 ld a,(MemId+1) ;кол-во выделенных страниц +0183+ 9420 47 ld b,a +0184+ 9421 FE 05 cp 5 +0185+ 9423 38 02 jr c,$+4 +0186+ 9425 06 04 ld b,4 ;подключаем не более 4 банок +0187+ 9427 3A 04 95 ld a,(FRam+1) ;ст.адрес расположения кода +0188+ 942A E6 C0 and 0xC0 ;окно с расположением кода +0189+ 942C B7 or a ;0-е окно +0190+ 942D 20 07 jr nz,.L8 +0191+ 942F 4F ld c,a +0192+ 9430 1A ld a,(de) +0193+ 9431 77 ld (hl),a ;подключить банку программы +0194+ 9432 05 dec b +0195+ 9433 C8 ret z ;выход, если больше нет банок +0196+ 9434 +0197+ 9434 79 ld a,c +0198+ 9435 13 inc de +0199+ 9436 23 .L8 inc hl +0200+ 9437 FE 40 cp 0x40 ;1-е окно +0201+ 9439 20 07 jr nz,.L9 +0202+ 943B 4F ld c,a +0203+ 943C 1A ld a,(de) +0204+ 943D 77 ld (hl),a ;подключить банку программы +0205+ 943E 05 dec b +0206+ 943F C8 ret z ;выход, если больше нет банок +0207+ 9440 +0208+ 9440 79 ld a,c +0209+ 9441 13 inc de +0210+ 9442 23 .L9 inc hl +0211+ 9443 FE 80 cp 0x80 ;2-е окно +0212+ 9445 20 07 jr nz,.L10 +0213+ 9447 4F ld c,a +0214+ 9448 1A ld a,(de) +0215+ 9449 77 ld (hl),a ;подключить банку программы +0216+ 944A 05 dec b +0217+ 944B C8 ret z ;выход, если больше нет банок +0218+ 944C +0219+ 944C 79 ld a,c +0220+ 944D 13 inc de +0221+ 944E 23 .L10 inc hl ;иначе 3-е окно +0222+ 944F 1A ld a,(de) +0223+ 9450 77 ld (hl),a ;подключить банку программы +0224+ 9451 +0225+ 9451 C9 ret +0226+ 9452 +0227+ 9452 ;[]=========================================================================[] +0228+ 9452 ;[] Вычисление необходимого кол-ва банок для загрузки файла в память [] +0229+ 9452 ;[] Вход: HL:IX - длина файла в байтах [] +0230+ 9452 ;[] DE - кол-во байт для загрузки в 1-ю банку [] +0231+ 9452 ;[] Выход: A - кол-во необходимых банок [] +0232+ 9452 ;[] флаг C - ошибка, код ошибки в A [] +0233+ 9452 ;[]=========================================================================[] +0234+ 9452 NBank: +0235+ 9452 DD E5 push ix +0236+ 9454 44 ld b,h +0237+ 9455 4D ld c,l +0238+ 9456 E1 pop hl +0239+ 9457 03 inc bc +0240+ 9458 AF xor a +0241+ 9459 3C inc a +0242+ 945A ED 52 sbc hl,de +0243+ 945C 30 02 jr nc,$+4 +0244+ 945E 18 0C jr .L5 +0245+ 9460 11 00 40 ld de,16384 ;размер банки +0246+ 9463 F5 push af +0247+ 9464 F1 .L2 pop af +0248+ 9465 3C .L1 inc a +0249+ 9466 28 0D jr z,.L3 +0250+ 9468 ED 52 sbc hl,de +0251+ 946A 30 F9 jr nc,.L1 +0252+ 946C 0B .L5 dec bc +0253+ 946D F5 push af +0254+ 946E 78 ld a,b +0255+ 946F B1 or c +0256+ 9470 20 F2 jr nz,.L2 +0257+ 9472 F1 pop af +0258+ 9473 B7 or a ;сбросить флаг C +0259+ 9474 C9 ret +0260+ 9475 +0261+ 9475 3E 1E .L3 ld a,0x1E ;"Недостаточно памяти" +0262+ 9477 ; JP ErrorDSS +0263+ 9477 C9 ret +0264+ 9478 +0265+ 9478 00 BankP ds 4 ;номера банок загружаемой проги +0266+ 947C 00 MemId ds 3 ;id-блока памяти под файл, +0267+ 947F ;кол-во выделенных банок, +0268+ 947F ;счетчик загруженных банок +0269+ 947F 00 FId db 0 ;файловый манипулятор +0270+ 9480 00 FDebug ds 128 +0271+ 9500 00 db 0 +0272+ 9501 00 42 FStart dw 0x4200 +0273+ 9503 00 00 FRam dw 0 ;адрес расположения кода в памяти +0274+ 9505 +0275+ 9505 +0374 9505 include "error.asm";"D:\WORKAST\DEMON\error" +0001+ 9505 ;[]=========================================================================[] +0002+ 9505 ;[] Обработка ошибок монитора-отладчика DemoN [] +0003+ 9505 ;[] v0.10 - последние изменения 27.08.2006 [] +0004+ 9505 ;[] [] +0005+ 9505 ;[] ErDss - определение ошибки DSS по ее коду [] +0006+ 9505 ;[]=========================================================================[] +0007+ 9505 +0008+ 9505 ;[]=========================================================================[] +0009+ 9505 ;[] Ошибки DSS [] +0010+ 9505 ;[] Вход: A - код ошибки [] +0011+ 9505 ;[] Выход: A - код ошибки [] +0012+ 9505 ;[] HL - строка-описание ошибки [] +0013+ 9505 ;[]=========================================================================[] +0014+ 9505 PrErDss: +0015+ 9505 CD 12 95 call ErDss +0016+ 9508 0E 5C ld c,Dss.PChars ;вывести сообщение об ошибке +0017+ 950A D7 rst DssRst +0018+ 950B 21 0E AB ld hl,Str.DA ;перевод строки +0019+ 950E 0E 5C ld c,Dss.PChars +0020+ 9510 D7 rst DssRst +0021+ 9511 C9 ret +0022+ 9512 +0023+ 9512 ErDss: +0024+ 9512 .MaxError equ 0x26 +0025+ 9512 FE 27 cp .MaxError+1 ;максимальный код ошибки + 1 +0026+ 9514 38 02 jr c,$+4 +0027+ 9516 3E 26 ld a,.MaxError +0028+ 9518 +0029+ 9518 F5 push af +0030+ 9519 87 add a,a +0031+ 951A 21 C1 97 ld hl,.Tabl +0032+ 951D 16 00 ld d,0 +0033+ 951F 5F ld e,a +0034+ 9520 19 add hl,de +0035+ 9521 7E ld a,(hl) +0036+ 9522 23 inc hl +0037+ 9523 66 ld h,(hl) +0038+ 9524 6F ld l,a +0039+ 9525 F1 pop af +0040+ 9526 C9 ret +0041+ 9527 +0042+ 9527 .e01 db "Invalid function",0 +0042+ 9527 496E76616C69642066756E6374696F6E00 +0043+ 9538 .e02 db "Invalid drive number",0 +0043+ 9538 496E76616C6964206472697665206E756D62657200 +0044+ 954D .e03 db "File not found",0 +0044+ 954D 46696C65206E6F7420666F756E6400 +0045+ 955C .e04 db "Path not found",0 +0045+ 955C 50617468206E6F7420666F756E6400 +0046+ 956B .e05 db "Invalid handle",0 +0046+ 956B 496E76616C69642068616E646C6500 +0047+ 957A .e06 db "Too many open files",0 +0047+ 957A 546F6F206D616E79206F70656E2066696C657300 +0048+ 958E .e07 db "File already exists",0 +0048+ 958E 46696C6520616C72656164792065786973747300 +0049+ 95A2 .e08 db "File read only",0 +0049+ 95A2 46696C652072656164206F6E6C7900 +0050+ 95B1 .e09 db "Root overflow",0 +0050+ 95B1 526F6F74206F766572666C6F7700 +0051+ 95BF .e0A db "No free space",0 +0051+ 95BF 4E6F206672656520737061636500 +0052+ 95CD .e0B db "Directory not empty",0 +0052+ 95CD 4469726563746F7279206E6F7420656D70747900 +0053+ 95E1 .e0C db "Can't delete current directory",0 +0053+ 95E1 43616E27742064656C6574652063757272656E74206469726563746F727900 +0054+ 9600 .e0D db "Invalid media",0 +0054+ 9600 496E76616C6964206D6564696100 +0055+ 960E .e0E db "Unknown operation",0 ;(невозм. операция) +0055+ 960E 556E6B6E6F776E206F7065726174696F6E00 +0056+ 9620 .e0F db "Directory exist",0 +0056+ 9620 4469726563746F727920657869737400 +0057+ 9630 .e10 db "Invalid filename",0 +0057+ 9630 496E76616C69642066696C656E616D6500 +0058+ 9641 .e11 db "Invalid EXE-file",0 +0058+ 9641 496E76616C6964204558452D66696C6500 +0059+ 9652 .e12 db "Not supported EXE-file",0 +0059+ 9652 4E6F7420737570706F72746564204558452D66696C6500 +0060+ 9669 .e13 db "Access denied",0 +0060+ 9669 4163636573732064656E69656400 +0061+ 9677 .e14 db "Not ready",0 +0061+ 9677 4E6F7420726561647900 +0062+ 9681 .e15 db "Seek error",0 +0062+ 9681 5365656B206572726F7200 +0063+ 968C .e16 db "Sector not found",0 +0063+ 968C 536563746F72206E6F7420666F756E6400 +0064+ 969D .e17 db "CRC error",0 +0064+ 969D 435243206572726F7200 +0065+ 96A7 .e18 db "Write protect",0 +0065+ 96A7 57726974652070726F7465637400 +0066+ 96B5 .e19 db "Read error",0 +0066+ 96B5 52656164206572726F7200 +0067+ 96C0 .e1A db "Write error",0 +0067+ 96C0 5772697465206572726F7200 +0068+ 96CC .e1B db "Drive failure",0 +0068+ 96CC 4472697665206661696C75726500 +0069+ 96DA .e1C db "Extended error: 28",0 +0069+ 96DA 457874656E646564206572726F723A20323800 +0070+ 96ED .e1D db "Extended error: 29",0 +0070+ 96ED 457874656E646564206572726F723A20323900 +0071+ 9700 .e1E db "Not enough memory",0 +0071+ 9700 4E6F7420656E6F756768206D656D6F727900 +0072+ 9712 .e1F db "Invalid memory block",0 +0072+ 9712 496E76616C6964206D656D6F727920626C6F636B00 +0073+ 9727 .e20 db "Extended error: 32",0 +0073+ 9727 457874656E646564206572726F723A20333200 +0074+ 973A .e21 db "Extended error: 33",0 +0074+ 973A 457874656E646564206572726F723A20333300 +0075+ 974D .e22 db "Extended error: 34",0 +0075+ 974D 457874656E646564206572726F723A20333400 +0076+ 9760 .e23 db "Too many files",0 ;(список файлов) +0076+ 9760 546F6F206D616E792066696C657300 +0077+ 976F .e24 db "(слишком большая влож. папок или >= 1024 папок)",0 +0077+ 976F 28E1ABA8E8AAAEAC20A1AEABECE8A0EF20A2ABAEA62E20AFA0AFAEAA20A8ABA8 +0077+ 978F 203E3D203130323420AFA0AFAEAA2900 +0078+ 979F .e25 db "User abort",0 ;(операция прервана пользователем) +0078+ 979F 557365722061626F727400 +0079+ 97AA .e26 db "Unknown error: 38..255",0 ;38 +0079+ 97AA 556E6B6E6F776E206572726F723A2033382E2E32353500 +0080+ 97C1 +0081+ 97C1 .Tabl dw .e01,.e02,.e03,.e04,.e05,.e06,.e07,.e08 +0081+ 97C1 279538954D955C956B957A958E95A295 +0082+ 97D1 dw .e09,.e0A,.e0B,.e0C,.e0D,.e0E,.e0F,.e10 +0082+ 97D1 B195BF95CD95E19500960E9620963096 +0083+ 97E1 dw .e11,.e12,.e13,.e14,.e15,.e16,.e17,.e18 +0083+ 97E1 419652966996779681968C969D96A796 +0084+ 97F1 dw .e19,.e1A,.e1B,.e1C,.e1D,.e1E,.e1F,.e20 +0084+ 97F1 B596C096CC96DA96ED96009712972797 +0085+ 9801 dw .e21,.e22,.e23,.e24,.e25,.e26 +0085+ 9801 3A974D9760976F979F97AA97 +0086+ 980D +0087+ 980D +0375 980D include "clock.asm";"D:\WORKAST\DEMON\clock" +0001+ 980D ;[]=========================================================================[] +0002+ 980D ;[] Вывод часов [] +0003+ 980D ;[] v0.03 - последние изменения 01.02.2006 [] +0004+ 980D ;[]=========================================================================[] +0005+ 980D Clock: +0006+ 980D 3A 5D AA ld a,(ClockOn) ;флаг вывода часов +0007+ 9810 3C inc a +0008+ 9811 C0 ret nz +0009+ 9812 0E 21 ld c,Dss.SysTime +0010+ 9814 D7 rst DssRst ;прочитать данные о времени +0011+ 9815 11 3E 98 ld de,.String +0012+ 9818 D5 push de +0013+ 9819 C5 push bc +0014+ 981A E5 push hl +0015+ 981B 6C ld l,h ;часы +0016+ 981C 26 00 ld h,0 +0017+ 981E CD BE 91 call ConvDecStr8_1 +0018+ 9821 13 inc de +0019+ 9822 E1 pop hl ;минуты +0020+ 9823 26 00 ld h,0 +0021+ 9825 CD BE 91 call ConvDecStr8_1 +0022+ 9828 13 inc de +0023+ 9829 E1 pop hl +0024+ 982A 6C ld l,h ;секунды +0025+ 982B 26 00 ld h,0 +0026+ 982D CD BE 91 call ConvDecStr8_1 +0027+ 9830 11 47 00 ld de,71 +0028+ 9833 0E 84 ld c,Bios.Lp_Set_Place ;установка позиции печати +0028+ 9835 CF rst BiosRst +0029+ 9836 F3 di +0030+ 9837 E1 pop hl +0031+ 9838 01 86 08 ld bc,8*256+Bios.Lp_Print_Ln2 ;в рег.B длина строки +0031+ 983B CF rst BiosRst +0032+ 983C F3 di +0033+ 983D C9 ret +0034+ 983E +0035+ 983E .String db "00:00:00" +0035+ 983E 30303A30303A3030 +0036+ 9846 +0037+ 9846 +0376 9846 include "keyb.asm";"D:\WORKAST\DEMON\keyb" +0001+ 9846 ;[]=========================================================================[] +0002+ 9846 ;[] Обработка клавиатуры [] +0003+ 9846 ;[] v0.01 - последние изменения 10.10.2004 [] +0004+ 9846 ;[] v0.02 - последние изменения 27.03.2005 [] +0005+ 9846 ;[] v0.03 - последние изменения 11.03.2006 [] +0006+ 9846 ;[] v0.10 - последние изменения 14.05.2006 [] +0007+ 9846 ;[]=========================================================================[] +0008+ 9846 CD 35 92 call CursorRes ;выкл курсор +0009+ 9849 CD 3C 88 call Refresh ;обновление экрана +0010+ 984C 18 03 jr Keyb +0011+ 984E CD 35 92 call CursorRes ;выкл курсор +0012+ 9851 Keyb: +0013+ 9851 CD B3 99 call Cursor ;вкл курсор +0014+ 9854 CD D3 91 call CursorSet +0015+ 9857 0E 31 ld c,Dss.ScanKey ;состояние клавиатуры +0016+ 9859 D7 rst DssRst +0017+ 985A 28 FB jr z,Keyb+6 +0018+ 985C 78 ld a,b ;состояние +0019+ 985D E6 F0 and 11110000b +0020+ 985F 28 6C jr z,.L100 +0021+ 9861 +0022+ 9861 ;Обработка комбинации Shift + символ +0023+ 9861 E6 C0 and 11000000b ; +0024+ 9863 B7 or a +0025+ 9864 28 11 jr z,.L1 +0026+ 9866 7A ld a,d +0027+ 9867 FE 8F cp 0x80+0x0F ;Shift+Tab +0028+ 9869 20 EC jr nz,Keyb+6 +0029+ 986B 21 B2 99 ld hl,Keyb.WinScreen +0030+ 986E 7E ld a,(hl) +0031+ 986F 3D dec a +0032+ 9870 20 02 jr nz,$+4 +0033+ 9872 3E 04 ld a,4 +0034+ 9874 77 ld (hl),a ;номер окна дампа +0035+ 9875 18 D7 jr Keyb-3 +0036+ 9877 +0037+ 9877 ;Обработка комбинации Alt + символ +0038+ 9877 78 .L1 ld a,b +0039+ 9878 E6 F0 and 11110000b +0040+ 987A FE 10 cp 00010000b ; +0041+ 987C 20 06 jr nz,.L10 +0042+ 987E 7A ld a,d ;позиционный код +0043+ 987F FE AB cp 0x80+0x2B ;+ +0044+ 9881 20 01 jr nz,.L10 +0045+ 9883 C8 ret z ;выход +0046+ 9884 +0047+ 9884 ;Обработка комбинации Ctrl + символ +0048+ 9884 FE 20 .L10 cp 00100000b ; +0049+ 9886 C2 A0 99 jp nz,.L0 +0050+ 9889 7A ld a,d ;позиционный код +0051+ 988A +0052+ 988A FE 92 cp 0x80+0x12 ;+ (dEc/hEx) +0053+ 988C 20 09 jr nz,.L11 +0054+ 988E 3A 7E AB ld a,(DecHex) +0055+ 9891 2F cpl +0056+ 9892 32 7E AB ld (DecHex),a +0057+ 9895 18 AF jr Keyb-11 +0058+ 9897 +0059+ 9897 FE 93 .L11 cp 0x80+0x13 ;+ резидент +0060+ 9899 20 20 jr nz,.L12 +0061+ 989B CD 35 92 call CursorRes +0062+ 989E 06 05 ld b,5 ;длина строки ввода +0063+ 98A0 21 13 14 ld hl,0x1413 +0064+ 98A3 E5 push hl +0065+ 98A4 C5 push bc +0066+ 98A5 CD D3 91 call CursorSet +0067+ 98A8 C1 pop bc +0068+ 98A9 E1 pop hl +0069+ 98AA CD AA 9C call InputLine +0070+ 98AD DA 4E 98 jp c,Keyb-3 +0071+ 98B0 CD 30 9C call PutAdres +0072+ 98B3 DA 4E 98 jp c,Keyb-3 +0073+ 98B6 CD E7 A1 call KReg.Rez ;новый адрес резидента +0074+ 98B9 18 8B jr Keyb-11 +0075+ 98BB +0076+ 98BB FE AA .L12 cp 0x80+0x2A ;+ +0077+ 98BD CA 39 99 jp z,.L202-2 ;выполнение команды +0078+ 98C0 +0079+ 98C0 FE AC cp 0x80+0x2C ;+ +0080+ 98C2 CA 1B 99 jp z,.L200+5 ;выполнение команды +0081+ 98C5 +0082+ 98C5 FE AD cp 0x80+0x2D ;+ +0083+ 98C7 CA 52 99 jp z,.L203+4 ;пропуск команды +0084+ 98CA +0085+ 98CA ; cp 0x80+0x48 ; +0086+ 98CA ; call z,ScreenS ;сохранение экрана в файл +0087+ 98CA +0088+ 98CA .L13 ;... +0089+ 98CA C3 A0 99 jp .L0 +0090+ 98CD +0091+ 98CD ;Обработка ASCII кодов +0092+ 98CD 7B .L100 ld a,e +0093+ 98CE FE 1B cp 0x1B ; - вкл.системного экрана +0094+ 98D0 20 44 jr nz,.L200 +0095+ 98D2 AF xor a ;выкл часов +0096+ 98D3 32 5D AA ld (ClockOn),a +0097+ 98D6 3A 5F AA ld a,(OSScreen) +0098+ 98D9 47 ld b,a +0099+ 98DA C5 push bc +0100+ 98DB 3A 60 AA ld a,(OSGrafMode) +0101+ 98DE 0E 50 ld c,Dss.SetVMod ;системный экран +0102+ 98E0 D7 rst DssRst +0103+ 98E1 C1 pop bc +0104+ 98E2 3A 5E AA ld a,(DemonScreen) +0105+ 98E5 B8 cp b +0106+ 98E6 20 11 jr nz,.NoRest +0107+ 98E8 11 00 00 ld de,0 ;Если экраны ОС и Демона совпадают - +0108+ 98EB 21 50 20 ld hl,#2050 ;восстанавливаем скрин +0109+ 98EE 3A 61 AA ld a,(BufPage) +0110+ 98F1 47 ld b,a +0111+ 98F2 0E 5A ld c,Dss.WinRest +0112+ 98F4 DD 21 00 C0 ld ix,#c000 +0113+ 98F8 D7 rst DssRst +0114+ 98F9 0E 30 .NoRest ld c,Dss.WaitKey +0115+ 98FB D7 rst DssRst ;ждем Any Key +0116+ 98FC 3A 5E AA ld a,(DemonScreen) +0117+ 98FF 47 ld b,a +0118+ 9900 3E 03 ld a,3 +0119+ 9902 0E 50 ld c,Dss.SetVMod +0120+ 9904 C5 push bc +0121+ 9905 D7 rst DssRst +0122+ 9906 C1 pop bc +0123+ 9907 3A 5F AA ld a,(OSScreen) +0124+ 990A B8 cp b +0125+ 990B CC EF 82 call z,RefreshScreen ;Если экраны совпадают - перерисовываем +0126+ 990E 3E FF ld a,On ;вкл часов +0127+ 9910 32 5D AA ld (ClockOn),a +0128+ 9913 C3 57 98 jp Keyb+6 +0129+ 9916 +0130+ 9916 ;Обработка позиционного кода +0131+ 9916 7A .L200 ld a,d +0132+ 9917 FE 3B cp 0x3b ; +0133+ 9919 20 09 jr nz,.L208 +0134+ 991B CD CB 88 call DemonHelp +0135+ 991E ; ld c,Dss.WaitKey +0136+ 991E ; rst DssRst ;ждем Any Key +0137+ 991E +0138+ 991E CD EF 82 .NoExit call RefreshScreen +0139+ 9921 C3 57 98 jp Keyb+6 +0140+ 9924 FE 3D .L208 cp 0x3d +0141+ 9926 20 05 jr nz,.L207 +0142+ 9928 CD A6 B6 call LoadBinDialog +0143+ 992B 18 F1 jr .NoExit +0144+ 992D .L207 +0145+ 992D FE 42 cp 0x42 ; +0146+ 992F 20 04 jr nz,.L201 +0147+ 9931 3E 00 ld a,Off ;флаг пропуска подпрограмм +0148+ 9933 18 06 jr .L202 +0149+ 9935 +0150+ 9935 FE 41 .L201 cp 0x41 ; +0151+ 9937 20 15 jr nz,.L203 +0152+ 9939 3E FF ld a,On ;флаг трассировки подпрограмм +0153+ 993B 32 7B A9 .L202 ld (Step.Flag),a +0154+ 993E 21 66 90 ld hl,PrintStrSP.StrSp +0155+ 9941 7E ld a,(hl) ;строка вершины стека +0156+ 9942 3C inc a +0157+ 9943 20 03 jr nz,$+5 +0158+ 9945 3E 06 ld a,6 ;вернуть вершину стека +0159+ 9947 77 ld (hl),a +0160+ 9948 CD 64 A6 call Step +0161+ 994B C3 46 98 jp Keyb-11 +0162+ 994E +0163+ 994E FE 43 .L203 cp 0x43 ; +0164+ 9950 20 22 jr nz,.L204 +0165+ 9952 2A 3D AB ld hl,(Reg._PC) +0166+ 9955 CD 42 8A call List ;следующая команда +0167+ 9958 22 3D AB ld (Reg._PC),hl ;новый PC +0168+ 995B E5 push hl +0169+ 995C 3A C3 9B ld a,(KList.Descript) ;количество строк листинга +0170+ 995F CD D1 9B call AdrListTabl ;нижний адрес листинга +0171+ 9962 ED 5B 55 AB ld de,(ListAdr) ;верхний адрес листинга +0172+ 9966 C1 pop bc ;новый PC +0173+ 9967 CD C4 92 call AdrArea +0174+ 996A D2 46 98 jp nc,Keyb-11 +0175+ 996D ED 43 55 AB ld (ListAdr),bc ;новая страница листинга +0176+ 9971 C3 46 98 jp Keyb-11 +0177+ 9974 +0178+ 9974 FE 0F .L204 cp 0x0F ; +0179+ 9976 20 0F jr nz,.L205 +0180+ 9978 21 B2 99 ld hl,Keyb.WinScreen +0181+ 997B 7E ld a,(hl) +0182+ 997C 3C inc a +0183+ 997D FE 05 cp 5 +0184+ 997F 20 02 jr nz,$+4 +0185+ 9981 3E 01 ld a,1 +0186+ 9983 77 ld (hl),a ;номер окна дампа +0187+ 9984 C3 4E 98 jp Keyb-3 +0188+ 9987 +0189+ 9987 FE 48 .L205 cp 0x48 ; +0190+ 9989 20 06 jr nz,.L206 +0191+ 998B CD FA A9 call SaveScr ;сохранение экрана в файл +0192+ 998E C3 57 98 jp Keyb+6 +0193+ 9991 +0194+ 9991 FE 44 .L206 cp 0x44 ; +0195+ 9993 20 0B jr nz,.L0 +0196+ 9995 ;выход +0197+ 9995 DD 21 7F AB ld ix,ExitDlg +0198+ 9999 CD D5 B9 call DialogWindow +0199+ 999C C9 ret +0200+ 999D CD 01 83 call ClearScreen +0201+ 99A0 3A B2 99 .L0 ld a,(.WinScreen) ;активное окно +0202+ 99A3 3D dec a +0203+ 99A4 CA 1C 9A jp z,KList +0204+ 99A7 3D dec a +0205+ 99A8 CA FC A3 jp z,KDump +0206+ 99AB 3D dec a +0207+ 99AC CA AE 9F jp z,KReg +0208+ 99AF C3 A4 A2 jp KStack +0209+ 99B2 +0210+ 99B2 01 .WinScreen db 1 ;номер активного окна +0211+ 99B3 ;1 - окно листинга +0212+ 99B3 ;2 - окно дампа +0213+ 99B3 ;3 - окно регистров +0214+ 99B3 ;4 - окно стека +0215+ 99B3 +0216+ 99B3 ;Прорисовка курсора +0217+ 99B3 Cursor: +0218+ 99B3 3A B2 99 ld a,(Keyb.WinScreen) ;активное окно +0219+ 99B6 3D dec a +0220+ 99B7 28 1E jr z,.L1 +0221+ 99B9 3D dec a +0222+ 99BA 28 33 jr z,.L2 +0223+ 99BC 3D dec a +0224+ 99BD 28 48 jr z,.L3 +0225+ 99BF ;Окно дампа стека +0226+ 99BF ED 5B F3 A3 ld de,(KStack.Coordinate) ;расчет курсора +0227+ 99C3 21 F7 A3 ld hl,KStack.Descript+2 +0228+ 99C6 43 ld b,e +0229+ 99C7 23 inc hl +0230+ 99C8 23 inc hl +0231+ 99C9 10 FC djnz $-2 +0232+ 99CB 7E ld a,(hl) ;длина курсора +0233+ 99CC 32 A5 A3 ld (KStack.L201+1),a +0234+ 99CF 47 ld b,a +0235+ 99D0 2B dec hl +0236+ 99D1 5E ld e,(hl) ;X-координата курсора +0237+ 99D2 EB ex de,hl +0238+ 99D3 22 A7 A3 ld (KStack.L201+3),hl +0239+ 99D6 C9 ret +0240+ 99D7 ;Окно листинга +0241+ 99D7 ED 5B C1 9B .L1 ld de,(KList.Coordinate) ;расчет курсора +0242+ 99DB 21 C5 9B ld hl,KList.Descript+2 +0243+ 99DE 43 ld b,e +0244+ 99DF 23 inc hl +0245+ 99E0 23 inc hl +0246+ 99E1 10 FC djnz $-2 +0247+ 99E3 7E ld a,(hl) ;длина курсора +0248+ 99E4 32 44 9B ld (KList.L201+1),a +0249+ 99E7 47 ld b,a +0250+ 99E8 2B dec hl +0251+ 99E9 5E ld e,(hl) ;X-координата курсора +0252+ 99EA EB ex de,hl +0253+ 99EB 22 46 9B ld (KList.L201+3),hl +0254+ 99EE C9 ret +0255+ 99EF ;Окно дампа +0256+ 99EF ED 5B A0 A5 .L2 ld de,(KDump.Coordinate) ;расчет курсора +0257+ 99F3 21 A4 A5 ld hl,KDump.Descript+2 +0258+ 99F6 43 ld b,e +0259+ 99F7 23 inc hl +0260+ 99F8 23 inc hl +0261+ 99F9 10 FC djnz $-2 +0262+ 99FB 7E ld a,(hl) ;длина курсора +0263+ 99FC 32 FB A4 ld (KDump.L201+1),a +0264+ 99FF 47 ld b,a +0265+ 9A00 2B dec hl +0266+ 9A01 5E ld e,(hl) ;X-координата курсора +0267+ 9A02 EB ex de,hl +0268+ 9A03 22 FD A4 ld (KDump.L201+3),hl +0269+ 9A06 C9 ret +0270+ 9A07 ;Окно регистров +0271+ 9A07 CD 06 A2 .L3 call KReg.DescCalc +0272+ 9A0A 50 ld d,b +0273+ 9A0B 43 ld b,e ;колонока в строке +0274+ 9A0C 23 inc hl +0275+ 9A0D 23 inc hl +0276+ 9A0E 10 FC djnz $-2 +0277+ 9A10 7E ld a,(hl) ;длина курсора +0278+ 9A11 32 4B A0 ld (KReg.L201+1),a +0279+ 9A14 47 ld b,a +0280+ 9A15 2B dec hl +0281+ 9A16 5E ld e,(hl) ;X-координата курсора +0282+ 9A17 EB ex de,hl +0283+ 9A18 22 4D A0 ld (KReg.L201+3),hl +0284+ 9A1B C9 ret +0285+ 9A1C +0286+ 9A1C ;Обработка клавиш в окне листинга +0287+ 9A1C KList: +0288+ 9A1C 78 ld a,b ;состояние +0289+ 9A1D E6 F0 and 11110000b +0290+ 9A1F 28 6F jr z,.L100 +0291+ 9A21 +0292+ 9A21 ;Обработка комбинации Alt + символ +0293+ 9A21 FE 10 cp 00010000b ; +0294+ 9A23 20 03 jr nz,.L10 +0295+ 9A25 C3 57 98 jp Keyb+6 +0296+ 9A28 +0297+ 9A28 ;Обработка комбинации Ctrl + символ +0298+ 9A28 FE 20 .L10 cp 00100000b ; +0299+ 9A2A C2 57 98 jp nz,Keyb+6 +0300+ 9A2D +0301+ 9A2D 7A ld a,d ;позиционный код +0302+ 9A2E FE AB cp 0x80+0x2B ;+ +0303+ 9A30 C2 3C 9A jp nz,.L20 +0304+ 9A33 +0305+ 9A33 CD CE 9B call AdrListTabl-3 ;выборка адреса листинга по N строки +0306+ 9A36 22 3D AB ld (Reg._PC),hl +0307+ 9A39 C3 9F 9B jp .NewLA1+3 +0308+ 9A3C +0309+ 9A3C 78 .L20 ld a,b +0310+ 9A3D FE 22 cp 00100010b ;правый +0311+ 9A3F 20 19 jr nz,.L21 +0312+ 9A41 01 A3 9B ld bc,.CtrlTabl +0313+ 9A44 CD DF 9B call AdrCtrlTabl ;выборка строки в таблице +0314+ 9A47 D2 57 98 jp nc,Keyb+6 ;не цифровые клавиши +0315+ 9A4A +0316+ 9A4A 3A C2 9B ld a,(.Coordinate+1) +0317+ 9A4D 02 ld (bc),a ;номер строки листинга +0318+ 9A4E 03 inc bc +0319+ 9A4F CD D1 9B call AdrListTabl ;выборка адреса листинга по N строки +0320+ 9A52 7D ld a,l +0321+ 9A53 02 ld (bc),a +0322+ 9A54 03 inc bc +0323+ 9A55 7C ld a,h +0324+ 9A56 02 ld (bc),a +0325+ 9A57 C3 57 98 jp Keyb+6 +0326+ 9A5A +0327+ 9A5A FE 28 .L21 cp 00101000b ;левый +0328+ 9A5C C2 57 98 jp nz,Keyb+6 +0329+ 9A5F +0330+ 9A5F 7A ld a,d ;позиционный код +0331+ 9A60 FE 80 cp 0x80+0x00 ;Ctrl+"`" +0332+ 9A62 C2 79 9A jp nz,.L22 +0333+ 9A65 +0334+ 9A65 3A A2 9B ld a,(.CtrlWin) +0335+ 9A68 67 ld h,a +0336+ 9A69 2E 00 ld l,0 +0337+ 9A6B C6 40 add a,0x40 ;следующее окно +0338+ 9A6D 32 A2 9B ld (.CtrlWin),a +0339+ 9A70 3A C4 9B ld a,(.Descript+1) +0340+ 9A73 32 C2 9B ld (.Coordinate+1),a +0341+ 9A76 C3 9C 9B jp .NewLA1 +0342+ 9A79 +0343+ 9A79 01 A3 9B .L22 ld bc,.CtrlTabl +0344+ 9A7C CD DF 9B call AdrCtrlTabl ;выборка строки в таблице +0345+ 9A7F D2 57 98 jp nc,Keyb+6 +0346+ 9A82 +0347+ 9A82 0A ld a,(bc) ;номер строки листинга +0348+ 9A83 B7 or a +0349+ 9A84 CA 57 98 jp z,Keyb+6 ;нет данных +0350+ 9A87 +0351+ 9A87 03 inc bc +0352+ 9A88 0A ld a,(bc) +0353+ 9A89 6F ld l,a +0354+ 9A8A 03 inc bc +0355+ 9A8B 0A ld a,(bc) +0356+ 9A8C 67 ld h,a ;адрес из буфера +0357+ 9A8D C3 8E 9B jp .NewLA +0358+ 9A90 +0359+ 9A90 ;Обработка позиционного кода +0360+ 9A90 7B .L100 ld a,e ;ASCII код +0361+ 9A91 32 3D 9B ld (.L200+1),a +0362+ 9A94 7A ld a,d ;позиционный код +0363+ 9A95 +0364+ 9A95 ED 5B C1 9B ld de,(.Coordinate) ;текущие координаты курсора +0365+ 9A99 FE 56 cp 0x56 ; +0366+ 9A9B 20 0F jr nz,.L101 +0367+ 9A9D 3A C5 9B ld a,(.Descript+2) ;кол-во колонок +0368+ 9AA0 BB cp e +0369+ 9AA1 7B ld a,e +0370+ 9AA2 20 01 jr nz,$+3 +0371+ 9AA4 AF xor a +0372+ 9AA5 3C inc a +0373+ 9AA6 32 C1 9B ld (.Coordinate),a ;текущая колонка +0374+ 9AA9 C3 4E 98 jp Keyb-3 +0375+ 9AAC +0376+ 9AAC FE 54 .L101 cp 0x54 ; +0377+ 9AAE 20 10 jr nz,.L102 +0378+ 9AB0 7B ld a,e ;текущая колонка +0379+ 9AB1 FE 01 cp 1 +0380+ 9AB3 20 04 jr nz,$+6 +0381+ 9AB5 3A C5 9B ld a,(.Descript+2) ;кол-во колонок +0382+ 9AB8 3C inc a +0383+ 9AB9 3D dec a +0384+ 9ABA 32 C1 9B ld (.Coordinate),a ;текущая колонка +0385+ 9ABD C3 4E 98 jp Keyb-3 +0386+ 9AC0 +0387+ 9AC0 2A C3 9B .L102 ld hl,(.Descript) +0388+ 9AC3 FE 52 cp 0x52 ; +0389+ 9AC5 20 11 jr nz,.L103 +0390+ 9AC7 7A ld a,d ;текущая строка +0391+ 9AC8 BD cp l +0392+ 9AC9 20 06 jr nz,.L104 +0393+ 9ACB 2A 57 AB ld hl,(ListAdr+2) ;адрес следующей строки +0394+ 9ACE C3 9C 9B jp .NewLA1 +0395+ 9AD1 3C .L104 inc a +0396+ 9AD2 32 C2 9B ld (.Coordinate+1),a +0397+ 9AD5 C3 4E 98 jp Keyb-3 +0398+ 9AD8 +0399+ 9AD8 FE 58 .L103 cp 0x58 ; +0400+ 9ADA 20 14 jr nz,.L105 +0401+ 9ADC 7A ld a,d ;текущая строка +0402+ 9ADD BC cp h +0403+ 9ADE 20 09 jr nz,.L107 +0404+ 9AE0 2A 55 AB ld hl,(ListAdr) ;адрес верхней строки листинга +0405+ 9AE3 CD DF 89 call UpAdres ;предыдущий адрес +0406+ 9AE6 C3 9C 9B jp .NewLA1 +0407+ 9AE9 3D .L107 dec a +0408+ 9AEA 32 C2 9B ld (.Coordinate+1),a +0409+ 9AED C3 4E 98 jp Keyb-3 +0410+ 9AF0 +0411+ 9AF0 FE 53 .L105 cp 0x53 ; +0412+ 9AF2 20 11 jr nz,.L108 +0413+ 9AF4 7A ld a,d ;текущая строка +0414+ 9AF5 BD cp l +0415+ 9AF6 20 06 jr nz,.L106 +0416+ 9AF8 CD D1 9B call AdrListTabl +0417+ 9AFB C3 9C 9B jp .NewLA1 +0418+ 9AFE 7D .L106 ld a,l ;на последнюю строку +0419+ 9AFF 32 C2 9B ld (.Coordinate+1),a +0420+ 9B02 C3 4E 98 jp Keyb-3 +0421+ 9B05 +0422+ 9B05 FE 59 .L108 cp 0x59 ; +0423+ 9B07 20 1A jr nz,.L110 +0424+ 9B09 7A ld a,d ;текущая строка +0425+ 9B0A BC cp h +0426+ 9B0B 20 0F jr nz,.L109 +0427+ 9B0D 2D dec l ;кол-во строк - 1 +0428+ 9B0E 45 ld b,l +0429+ 9B0F 2A 55 AB ld hl,(ListAdr) ;адрес первой строки +0430+ 9B12 C5 push bc +0431+ 9B13 CD DF 89 call UpAdres ;предыдущий адрес +0432+ 9B16 C1 pop bc +0433+ 9B17 10 F9 djnz $-5 +0434+ 9B19 C3 9C 9B jp .NewLA1 +0435+ 9B1C 7C .L109 ld a,h ;на первую строку +0436+ 9B1D 32 C2 9B ld (.Coordinate+1),a +0437+ 9B20 C3 4E 98 jp Keyb-3 +0438+ 9B23 +0439+ 9B23 FE 57 .L110 cp 0x57 ; +0440+ 9B25 20 08 jr nz,.L111 +0441+ 9B27 3E 01 ld a,1 +0442+ 9B29 32 C1 9B ld (.Coordinate),a ;первая колонка +0443+ 9B2C C3 4E 98 jp Keyb-3 +0444+ 9B2F +0445+ 9B2F FE 51 .L111 cp 0x51 ; +0446+ 9B31 20 09 jr nz,.L200 +0447+ 9B33 3A C5 9B ld a,(.Descript+2) ;последняя колонка +0448+ 9B36 32 C1 9B ld (.Coordinate),a ;первая колонка +0449+ 9B39 C3 4E 98 jp Keyb-3 +0450+ 9B3C +0451+ 9B3C ;Обработка ASCII кодов +0452+ 9B3C 3E 00 .L200 ld a,0 +0453+ 9B3E FE 0D cp 0x0D ; +0454+ 9B40 C2 5A 9B jp nz,.NewPCAdr ;Keyb+6 +0455+ 9B43 06 00 .L201 ld b,0 ;длина строки ввода +0456+ 9B45 21 00 00 ld hl,0 ;координаты строки ввода +0457+ 9B48 3A C1 9B ld a,(.Coordinate) +0458+ 9B4B 3D dec a ;колонка адреса +0459+ 9B4C 28 35 jr z,.InAdres +0460+ 9B4E 3D dec a ;колонка метки +0461+ 9B4F 28 03 jr z,$+5 +0462+ 9B51 3D dec a ;колонка кода команды +0463+ 9B52 28 14 jr z,.InCode +0464+ 9B54 CD AA 9C call InputLine +0465+ 9B57 C3 4E 98 jp Keyb-3 +0466+ 9B5A FE 7A .NewPCAdr cp "z" ; +0467+ 9B5C C2 57 98 jp nz,Keyb+6 +0468+ 9B5F CD CE 9B call AdrListTabl-3 ;Установить новый PC +0469+ 9B62 22 3D AB ld (Reg._PC),HL +0470+ 9B65 C3 46 98 jp Keyb-11 +0471+ 9B68 CD AA 9C .InCode call InputLine ;ввод кода в 3 колонке +0472+ 9B6B DA 4E 98 jp c,Keyb-3 ;завершение ввода по +0473+ 9B6E CD F1 9B call PutCode +0474+ 9B71 38 D0 jr c,.L201 ;ошибка в веденных данных +0475+ 9B73 CD CE 9B call AdrListTabl-3 ;адрес текущей строки +0476+ 9B76 11 2C 9C ld de,PutCode.Buffer +0477+ 9B79 1A ld a,(de) ;запись кода в память +0478+ 9B7A CD 97 92 call Ld_hl_a +0479+ 9B7D 13 inc de +0480+ 9B7E 23 inc hl +0481+ 9B7F 10 F8 djnz $-6 +0482+ 9B81 18 1C jr .NewLA1+3 +0483+ 9B83 +0484+ 9B83 CD AA 9C .InAdres call InputLine ;ввод адреса в 1 колонке +0485+ 9B86 DA 4E 98 jp c,Keyb-3 ;завершение ввода по +0486+ 9B89 CD 30 9C call PutAdres +0487+ 9B8C 38 B5 jr c,.L201 ;ошибка в веденных данных +0488+ 9B8E +0489+ 9B8E 3A C2 9B .NewLA ld a,(.Coordinate+1) +0490+ 9B91 3D dec a +0491+ 9B92 28 08 jr z,.NewLA1 +0492+ 9B94 47 ld b,a +0493+ 9B95 C5 push bc +0494+ 9B96 CD DF 89 call UpAdres ;предыдущий адрес +0495+ 9B99 C1 pop bc +0496+ 9B9A 10 F9 djnz $-5 +0497+ 9B9C 22 55 AB .NewLA1 ld (ListAdr),hl +0498+ 9B9F C3 46 98 jp Keyb-11 +0499+ 9BA2 +0500+ 9BA2 00 .CtrlWin db 0 ;окно для Ctrl+"`" +0501+ 9BA3 00 .CtrlTabl ds 30 ;буффер для адр быстр перехода +0502+ 9BC1 01 02 .Coordinate dw 0x0201 ;курсор (стр/кол курсора) +0503+ 9BC3 .Descript: +0504+ 9BC3 14 01 dw 0x0114 ;первая/последняя строка окна +0505+ 9BC5 04 db 4 ;кол-во колонок +0506+ 9BC6 +0507+ 9BC6 1A db 0x1A ;N столбца колонки +0508+ 9BC7 05 db 5 ;ширина колонки +0509+ 9BC8 20 db 0x20 +0510+ 9BC9 0E db 14 +0511+ 9BCA 2F db 0x2F +0512+ 9BCB 08 db 8 +0513+ 9BCC 38 db 0x38 +0514+ 9BCD 16 db 22 +0515+ 9BCE +0516+ 9BCE ;[]=========================================================================[] +0517+ 9BCE ;[] Выборка адреса листинга из таблицы [] +0518+ 9BCE ;[] Выход: HL - адрес листинга в текущей строке [] +0519+ 9BCE ;[]=========================================================================[] +0520+ 9BCE 3A C2 9B ld a,(KList.Coordinate+1) ;номер текущей строки листинга +0521+ 9BD1 AdrListTabl: +0522+ 9BD1 3D dec a +0523+ 9BD2 87 add a,a ;*2 +0524+ 9BD3 5F ld e,a +0525+ 9BD4 16 00 ld d,0 +0526+ 9BD6 21 55 AB ld hl,ListAdr ;таблица адресов листинга +0527+ 9BD9 19 add hl,de ;строка в таблице +0528+ 9BDA 7E ld a,(hl) +0529+ 9BDB 23 inc hl +0530+ 9BDC 66 ld h,(hl) +0531+ 9BDD 6F ld l,a ;адрес строки листинга +0532+ 9BDE C9 ret +0533+ 9BDF +0534+ 9BDF ;[]=========================================================================[] +0535+ 9BDF ;[] Выборка адреса цифровых клавиш из таблицы [] +0536+ 9BDF ;[] Вход: D - позиционный код цифровой клавиши [] +0537+ 9BDF ;[] BC - адрес начала таблицы [] +0538+ 9BDF ;[] Выход: BC - адрес в таблице [] +0539+ 9BDF ;[] Флаг NC - нажата не цифровая клавиша [] +0540+ 9BDF ;[]=========================================================================[] +0541+ 9BDF AdrCtrlTabl: +0542+ 9BDF 7A ld a,d +0543+ 9BE0 E6 7F and 01111111b ;сброс старшего бита +0544+ 9BE2 3D dec a +0545+ 9BE3 3D dec a +0546+ 9BE4 FE 0A cp 0x0A ;проверка цифровых клавиш верхнего ряда +0547+ 9BE6 D0 ret nc +0548+ 9BE7 B7 or a +0549+ 9BE8 37 scf +0550+ 9BE9 C8 ret z ;выход, если "0" +0551+ 9BEA 03 inc bc +0552+ 9BEB 03 inc bc +0553+ 9BEC 03 inc bc +0554+ 9BED 3D dec a +0555+ 9BEE 20 FA jr nz,$-4 +0556+ 9BF0 C9 ret +0557+ 9BF1 +0558+ 9BF1 ;[]=========================================================================[] +0559+ 9BF1 ;[] Получение кода из строки ввода [] +0560+ 9BF1 ;[] Вход: C - длина строки ввода [] +0561+ 9BF1 ;[] Выход: .Buffer - захваченные байты [] +0562+ 9BF1 ;[] B - количество захваченных байт [] +0563+ 9BF1 ;[] флаг C - ошибка [] +0564+ 9BF1 ;[]=========================================================================[] +0565+ 9BF1 PutCode: +0566+ 9BF1 11 B8 9E ld de,InputLine.Buffer +0567+ 9BF4 21 2C 9C ld hl,.Buffer +0568+ 9BF7 79 ld a,c +0569+ 9BF8 3D dec a +0570+ 9BF9 D8 ret c ;нулевая строка +0571+ 9BFA 3C inc a +0572+ 9BFB CB 3F srl a +0573+ 9BFD 47 ld b,a +0574+ 9BFE 28 1C jr z,.L3 ;обработка одного символа +0575+ 9C00 4F ld c,a +0576+ 9C01 3E C9 ld a,0xC9 ;RET +0577+ 9C03 30 01 jr nc,$+3 +0578+ 9C05 AF xor a ;NOP +0579+ 9C06 32 1B 9C ld (.L3-1),a +0580+ 9C09 +0581+ 9C09 E5 .L2 push hl +0582+ 9C0A 21 00 00 ld hl,0 +0583+ 9C0D 3E 02 ld a,2 +0584+ 9C0F CD 4C 9C call PutHex +0585+ 9C12 7D ld a,l +0586+ 9C13 E1 pop hl +0587+ 9C14 D8 ret c ;выход с ошибкой +0588+ 9C15 77 ld (hl),a +0589+ 9C16 23 inc hl +0590+ 9C17 0D dec c +0591+ 9C18 20 EF jr nz,.L2 +0592+ 9C1A B7 or a +0593+ 9C1B C9 ret +0594+ 9C1C +0595+ 9C1C 04 .L3 inc b +0596+ 9C1D E5 push hl +0597+ 9C1E 21 00 00 ld hl,0 +0598+ 9C21 3E 01 ld a,1 +0599+ 9C23 CD 4C 9C call PutHex +0600+ 9C26 7D ld a,l +0601+ 9C27 E1 pop hl +0602+ 9C28 D8 ret c ;выход с ошибкой +0603+ 9C29 77 ld (hl),a +0604+ 9C2A B7 or a +0605+ 9C2B C9 ret +0606+ 9C2C +0607+ 9C2C 00 .Buffer ds 4 +0608+ 9C30 +0609+ 9C30 ;[]=========================================================================[] +0610+ 9C30 ;[] Получение адреса из строки ввода [] +0611+ 9C30 ;[] Вход: C - длина строки ввода [] +0612+ 9C30 ;[] Выход: HL - число [] +0613+ 9C30 ;[] флаг C - ошибка [] +0614+ 9C30 ;[]=========================================================================[] +0615+ 9C30 PutAdres: +0616+ 9C30 79 ld a,c +0617+ 9C31 3D dec a +0618+ 9C32 D8 ret c ;нулевая строка +0619+ 9C33 11 B8 9E ld de,InputLine.Buffer +0620+ 9C36 21 00 00 ld hl,0 +0621+ 9C39 1A ld a,(de) +0622+ 9C3A CD 91 9C call CapsLetter +0623+ 9C3D FE 58 cp "X" ;hex-число +0624+ 9C3F 28 02 jr z,$+4 +0625+ 9C41 FE 23 cp "#" ;hex-число +0626+ 9C43 79 ld a,c +0627+ 9C44 20 29 jr nz,PutDec +0628+ 9C46 13 inc de +0629+ 9C47 13 inc de +0630+ 9C48 3D dec a +0631+ 9C49 3D dec a +0632+ 9C4A D8 ret c +0633+ 9C4B 3C inc a +0634+ 9C4C +0635+ 9C4C 08 PutHex exa +0636+ 9C4D 1A ld a,(de) +0637+ 9C4E CD 8A 9C call Numeric ;цифра? +0638+ 9C51 38 0C jr c,.L1 +0639+ 9C53 CD 91 9C call CapsLetter ;лат.буквы в верхний регистр +0640+ 9C56 FE 47 cp "F"+1 +0641+ 9C58 3F ccf +0642+ 9C59 D8 ret c ;выход с ошибкой +0643+ 9C5A FE 41 cp "A" +0644+ 9C5C D8 ret c ;выход с ошибкой +0645+ 9C5D D6 07 sub 0x07 +0646+ 9C5F D6 30 .L1 sub 0x30 +0647+ 9C61 29 add hl,hl ;*16 +0648+ 9C62 29 add hl,hl +0649+ 9C63 29 add hl,hl +0650+ 9C64 29 add hl,hl +0651+ 9C65 B5 or l +0652+ 9C66 6F ld l,a +0653+ 9C67 13 inc de +0654+ 9C68 13 inc de +0655+ 9C69 08 exa +0656+ 9C6A 3D dec a +0657+ 9C6B 20 DF jr nz,PutHex +0658+ 9C6D B7 or a ;сброс флага C +0659+ 9C6E C9 ret +0660+ 9C6F +0661+ 9C6F 08 PutDec exa +0662+ 9C70 1A ld a,(de) +0663+ 9C71 CD 8A 9C call Numeric ;цифра? +0664+ 9C74 3F ccf +0665+ 9C75 D8 ret c ;выход если нет +0666+ 9C76 4D ld c,l +0667+ 9C77 44 ld b,h +0668+ 9C78 29 add hl,hl ;*10 +0669+ 9C79 29 add hl,hl +0670+ 9C7A 09 add hl,bc +0671+ 9C7B 29 add hl,hl +0672+ 9C7C 06 00 ld b,0 +0673+ 9C7E D6 30 sub 0x30 +0674+ 9C80 4F ld c,a +0675+ 9C81 09 add hl,bc +0676+ 9C82 13 inc de +0677+ 9C83 13 inc de +0678+ 9C84 08 exa +0679+ 9C85 3D dec a +0680+ 9C86 20 E7 jr nz,PutDec +0681+ 9C88 B7 or a ;сброс флага C +0682+ 9C89 C9 ret +0683+ 9C8A +0684+ 9C8A ;[]=========================================================================[] +0685+ 9C8A ;[] Проверка кода символа на принадлежность к цифрам (коды 0x30...0x39) [] +0686+ 9C8A ;[] Вход: A - код символа [] +0687+ 9C8A ;[] Выход: флаг C - цифра; Флаг NC - не цифра [] +0688+ 9C8A ;[]=========================================================================[] +0689+ 9C8A FE 30 Numeric cp "0" +0690+ 9C8C 3F ccf +0691+ 9C8D D0 ret nc +0692+ 9C8E FE 3A cp 3Ah +0693+ 9C90 C9 ret +0694+ 9C91 +0695+ 9C91 ;[]=========================================================================[] +0696+ 9C91 ;[] Перевод символов латинского алфавита a...z в верхний регистр [] +0697+ 9C91 ;[] Вход: A - код символа [] +0698+ 9C91 ;[] Выход: A - код символа в верхнем регистре [] +0699+ 9C91 ;[]=========================================================================[] +0700+ 9C91 FE 61 CapsLetter cp "a" ;<"a" +0701+ 9C93 D8 ret c +0702+ 9C94 FE 7B cp "z"+1 ;>"z" +0703+ 9C96 D0 ret nc +0704+ 9C97 E6 DF and 11011111b ;преобразование символа +0705+ 9C99 C9 ret +0706+ 9C9A +0707+ 9C9A E5 InputLine1 push hl +0708+ 9C9B C5 push bc +0709+ 9C9C CD D3 91 call CursorSet +0710+ 9C9F C1 pop bc +0711+ 9CA0 E1 pop hl +0712+ 9CA1 18 07 jr InputLine +0713+ 9CA3 +0714+ 9CA3 ;[]=========================================================================[] +0715+ 9CA3 ;[] Ввод строки символов с клавиатуры [] +0716+ 9CA3 ;[] Вход: B - длина строки ввода [] +0717+ 9CA3 ;[] HL - координаты курсора [] +0718+ 9CA3 ;[] Выход: флаг C - флаг NC - [] +0719+ 9CA3 ;[] C - длина введенной строки, если [] +0720+ 9CA3 ;[]=========================================================================[] +0721+ 9CA3 InputLineEd: +0722+ 9CA3 3A 1B AB ld a,(Color.InLineEd) ;цвет строки ввода +0723+ 9CA6 4F ld c,a +0724+ 9CA7 AF xor a +0725+ 9CA8 18 06 jr InputLine+6 +0726+ 9CAA InputLine: +0727+ 9CAA 3A 1A AB ld a,(Color.InLine) ;цвет строки ввода +0728+ 9CAD 4F ld c,a +0729+ 9CAE 3E FF ld a,On +0730+ 9CB0 32 B2 9E ld (.EntEnd),a +0731+ 9CB3 3E C3 ld a,0xC3 ;код JP +0732+ 9CB5 32 34 9D ld (.L15),a +0733+ 9CB8 22 AA 9F ld (CursPos),hl +0734+ 9CBB 22 B3 9E ld (.Coordinate),hl +0735+ 9CBE 21 B5 9E ld hl,.Pos +0736+ 9CC1 AF xor a ;текущая позиция +0737+ 9CC2 77 ld (hl),a +0738+ 9CC3 23 inc hl +0739+ 9CC4 71 ld (hl),c ;цвет +0740+ 9CC5 23 inc hl +0741+ 9CC6 70 ld (hl),b ;длина строки редактирования +0742+ 9CC7 23 inc hl ;начало буфера редактирования +0743+ 9CC8 11 09 92 ld de,CursorSet.Buffer ;буфер строки под курсором +0744+ 9CCB ;ld c,a ;окраска строки редактирования +0745+ 9CCB 1A .L1 ld a,(de) +0746+ 9CCC 77 ld (hl),a +0747+ 9CCD 23 inc hl +0748+ 9CCE 13 inc de +0749+ 9CCF 71 ld (hl),c +0750+ 9CD0 23 inc hl +0751+ 9CD1 13 inc de +0752+ 9CD2 10 F7 djnz .L1 +0753+ 9CD4 +0754+ 9CD4 CD 1C 9E call .PrintInLine ;напечатать строку +0755+ 9CD7 3A B2 9E ld a,(.EntEnd) +0756+ 9CDA B7 or a +0757+ 9CDB C4 05 9E call nz,.EndString ;курсор в конец строки +0758+ 9CDE +0759+ 9CDE 3E FF .L100 ld a,On ;включить програм курсор +0760+ 9CE0 32 A6 9F ld (CursOnOff),a +0761+ 9CE3 21 DE 9C ld hl,.L100 +0762+ 9CE6 E5 push hl ;адрес возврата +0763+ 9CE7 0E 31 ld c,Dss.ScanKey ;состояние клавиатуры +0764+ 9CE9 D7 rst DssRst +0765+ 9CEA 28 FB jr z,$-3 +0766+ 9CEC +0767+ 9CEC FE 20 cp 0x20 ;есть ASCII-код +0768+ 9CEE 38 49 jr c,.L3 +0769+ 9CF0 +0770+ 9CF0 F5 push af +0771+ 9CF1 3A B5 9E ld a,(.Pos) +0772+ 9CF4 08 exa +0773+ 9CF5 21 B6 9E ld hl,.Color ;текущий цвет строки ввода +0774+ 9CF8 3A 1A AB ld a,(Color.InLine) +0775+ 9CFB BE cp (hl) +0776+ 9CFC CC 32 9E call z,.ClearInLine +0777+ 9CFF CC EA 9D call z,.HomeString +0778+ 9D02 CD 7A 9E call .NextPos ;на выходе в HL адрес .Pos +0779+ 9D05 28 1F jr z,.L12 +0780+ 9D07 3A A8 9F ld a,(CursInsOvr) ;режим Ins/Ovr +0781+ 9D0A B7 or a +0782+ 9D0B 20 19 jr nz,.L12 ;переход если Ovr +0783+ 9D0D 3A B7 9E ld a,(.Len) +0784+ 9D10 5F ld e,a +0785+ 9D11 3D dec a ;длина строки - 1 +0786+ 9D12 87 add a,a +0787+ 9D13 06 00 ld b,0 +0788+ 9D15 4F ld c,a +0789+ 9D16 56 ld d,(hl) ;позиция печати символа +0790+ 9D17 21 B8 9E ld hl,.Buffer +0791+ 9D1A 09 add hl,bc ;конец буфера +0792+ 9D1B 23 inc hl +0793+ 9D1C 7B ld a,e +0794+ 9D1D 92 sub d ;кол-во сдвигаемых символов +0795+ 9D1E 87 add a,a +0796+ 9D1F 4F ld c,a +0797+ 9D20 54 ld d,h +0798+ 9D21 5D ld e,l +0799+ 9D22 2B dec hl +0800+ 9D23 2B dec hl +0801+ 9D24 ED B8 lddr ;раздвижка строки +0802+ 9D26 08 .L12 exa +0803+ 9D27 87 add a,a +0804+ 9D28 06 00 ld b,0 +0805+ 9D2A 4F ld c,a +0806+ 9D2B 21 B8 9E ld hl,.Buffer +0807+ 9D2E 09 add hl,bc ;адрес в буфере +0808+ 9D2F F1 pop af +0809+ 9D30 77 ld (hl),a ;символ в буфер +0810+ 9D31 CD 85 9F call ResCurs +0811+ 9D34 C3 1C 9E .L15 jp .PrintInLine +0812+ 9D37 18 16 jr .L14 +0813+ 9D39 +0814+ 9D39 FE 1B .L3 cp 0x1B ; +0815+ 9D3B 20 06 jr nz,.L13 +0816+ 9D3D CD 85 9F call ResCurs +0817+ 9D40 E1 pop hl ;востановить стек +0818+ 9D41 37 scf +0819+ 9D42 C9 ret +0820+ 9D43 +0821+ 9D43 FE 0D .L13 cp 0x0D ; +0822+ 9D45 20 0D jr nz,.L2 +0823+ 9D47 3E FF ld a,On +0824+ 9D49 32 B2 9E ld (.EntEnd),a +0825+ 9D4C CD 85 9F call ResCurs +0826+ 9D4F E1 .L14 pop hl ;востановить стек +0827+ 9D50 CD 63 9E call .EndPos ;длина введенной строки +0828+ 9D53 C9 ret +0829+ 9D54 +0830+ 9D54 7A .L2 ld a,d +0831+ 9D55 FE 4F cp 0x4F ; +0832+ 9D57 20 2D jr nz,.L9 +0833+ 9D59 CD 85 9F call ResCurs +0834+ 9D5C 21 B6 9E ld hl,.Color ;текущий цвет строки ввода +0835+ 9D5F 3A 1A AB ld a,(Color.InLine) +0836+ 9D62 BE cp (hl) +0837+ 9D63 CC 32 9E call z,.ClearInLine +0838+ 9D66 21 B5 9E .L11 ld hl,.Pos +0839+ 9D69 7E ld a,(hl) ;позиция курсора +0840+ 9D6A 87 add a,a +0841+ 9D6B 5F ld e,a +0842+ 9D6C 23 inc hl +0843+ 9D6D 23 inc hl +0844+ 9D6E 7E ld a,(hl) ;длина строки +0845+ 9D6F 3D dec a +0846+ 9D70 87 add a,a +0847+ 9D71 93 sub e ;проверка конца строки +0848+ 9D72 4F ld c,a +0849+ 9D73 06 00 ld b,0 +0850+ 9D75 50 ld d,b +0851+ 9D76 23 inc hl ;начало буфера +0852+ 9D77 19 add hl,de ;адрес курсора +0853+ 9D78 E5 push hl +0854+ 9D79 D1 pop de +0855+ 9D7A 23 inc hl +0856+ 9D7B 23 inc hl +0857+ 9D7C 28 02 jr z,$+4 ;если в конце строки +0858+ 9D7E ED B0 ldir +0859+ 9D80 3E 20 ld a," " +0860+ 9D82 12 ld (de),a ;последний символ +0861+ 9D83 C3 1C 9E jp .PrintInLine +0862+ 9D86 +0863+ 9D86 FE 0E .L9 cp 0x0E ; +0864+ 9D88 20 15 jr nz,.L10 +0865+ 9D8A CD 85 9F call ResCurs +0866+ 9D8D CD 4A 9E call .ColorInLine ;сменить цвет строки +0867+ 9D90 21 B5 9E ld hl,.Pos +0868+ 9D93 7E ld a,(hl) ;позиция курсора +0869+ 9D94 B7 or a +0870+ 9D95 CA 1C 9E jp z,.PrintInLine ;если в начале строки +0871+ 9D98 35 dec (hl) ;уменьшить позицию +0872+ 9D99 21 AA 9F ld hl,CursPos +0873+ 9D9C 35 dec (hl) ;курсор влево +0874+ 9D9D 18 C7 jr .L11 +0875+ 9D9F +0876+ 9D9F FE 50 .L10 cp 0x50 ; +0877+ 9DA1 20 08 jr nz,.L5 +0878+ 9DA3 3A A8 9F ld a,(CursInsOvr) +0879+ 9DA6 2F cpl +0880+ 9DA7 32 A8 9F ld (CursInsOvr),a +0881+ 9DAA C9 ret +0882+ 9DAB +0883+ 9DAB FE 56 .L5 cp 0x56 ; +0884+ 9DAD 20 15 jr nz,.L6 +0885+ 9DAF CD 85 9F call ResCurs +0886+ 9DB2 CD 4A 9E call .ColorInLine ;сменить цвет строки +0887+ 9DB5 CC 1C 9E call z,.PrintInLine +0888+ 9DB8 CD 63 9E call .EndPos +0889+ 9DBB C8 ret z +0890+ 9DBC 3A B5 9E ld a,(.Pos) +0891+ 9DBF B9 cp c +0892+ 9DC0 D0 ret nc +0893+ 9DC1 C3 7A 9E jp .NextPos +0894+ 9DC4 +0895+ 9DC4 FE 54 .L6 cp 0x54 ; +0896+ 9DC6 20 15 jr nz,.L7 +0897+ 9DC8 CD 85 9F call ResCurs +0898+ 9DCB CD 4A 9E call .ColorInLine ;сменить цвет строки +0899+ 9DCE CC 1C 9E call z,.PrintInLine +0900+ 9DD1 21 B5 9E ld hl,.Pos ;позиция курсора +0901+ 9DD4 7E ld a,(hl) +0902+ 9DD5 B7 or a +0903+ 9DD6 C8 ret z +0904+ 9DD7 35 dec (hl) +0905+ 9DD8 21 AA 9F ld hl,CursPos ;координаты програм курсора +0906+ 9DDB 35 dec (hl) +0907+ 9DDC C9 ret +0908+ 9DDD +0909+ 9DDD FE 57 .L7 cp 0x57 ; +0910+ 9DDF 20 18 jr nz,.L8 +0911+ 9DE1 CD 85 9F call ResCurs +0912+ 9DE4 CD 4A 9E call .ColorInLine ;сменить цвет строки +0913+ 9DE7 CC 1C 9E call z,.PrintInLine +0914+ 9DEA 21 B5 9E .HomeString ld hl,.Pos ;позиция курсора +0915+ 9DED 7E ld a,(hl) +0916+ 9DEE B7 or a +0917+ 9DEF C8 ret z +0918+ 9DF0 3A B3 9E ld a,(.Coordinate) ;координаты начала строки +0919+ 9DF3 32 AA 9F ld (CursPos),a +0920+ 9DF6 AF xor a +0921+ 9DF7 77 ld (hl),a ;обнулить позицию печати +0922+ 9DF8 C9 ret +0923+ 9DF9 +0924+ 9DF9 FE 51 .L8 cp 0x51 ; +0925+ 9DFB C0 ret nz +0926+ 9DFC CD 85 9F call ResCurs +0927+ 9DFF CD 4A 9E call .ColorInLine ;сменить цвет строки +0928+ 9E02 CC 1C 9E call z,.PrintInLine +0929+ 9E05 CD 63 9E .EndString call .EndPos +0930+ 9E08 C8 ret z +0931+ 9E09 3A B7 9E ld a,(.Len) +0932+ 9E0C ; dec a ;длина строки ввода - 1 +0933+ 9E0C 91 sub c ;заполнена полностью? +0934+ 9E0D 20 01 jr nz,$+3 +0935+ 9E0F 0D dec c +0936+ 9E10 21 B5 9E ld hl,.Pos +0937+ 9E13 71 ld (hl),c ;позиция в конце строки +0938+ 9E14 3A B3 9E ld a,(.Coordinate) +0939+ 9E17 81 add a,c +0940+ 9E18 32 AA 9F ld (CursPos),a ;новая позиция програм курсора +0941+ 9E1B C9 ret +0942+ 9E1C +0943+ 9E1C DD 21 B8 9E .PrintInLine ld ix,.Buffer ;буфер строки +0944+ 9E20 3A B7 9E ld a,(.Len) +0945+ 9E23 6F ld l,a +0946+ 9E24 26 01 ld h,1 ;размеры буфера +0947+ 9E26 ED 5B B3 9E ld de,(.Coordinate) ;координаты в экране +0948+ 9E2A ifdef D_PRINTCH_BIOS +0949+ 9E2A~ xor a +0950+ 9E2A~ ld c,Bios.Win_Restore_Win ;вывод буфера на экран +0951+ 9E2A~ di +0952+ 9E2A~ rst BiosRst +0953+ 9E2A~ ei +0954+ 9E2A else +0955+ 9E2A 3A 1E AB ld a,(BankDebug) +0956+ 9E2D 47 ld b,a +0957+ 9E2E 0E 5A ld c,Dss.WinRest +0958+ 9E30 D7 rst DssRst +0959+ 9E31 endif +0960+ 9E31 C9 ret +0961+ 9E32 +0962+ 9E32 21 B7 9E .ClearInLine ld hl,.Len ;очистка строки ввода +0963+ 9E35 46 ld b,(hl) ;длина строки ввода +0964+ 9E36 3E 20 ld a," " ;пробел +0965+ 9E38 23 inc hl ;начало буфера строки +0966+ 9E39 77 ld (hl),a +0967+ 9E3A 23 inc hl +0968+ 9E3B 10 FB djnz $-3 +0969+ 9E3D AF xor a ;позиция печати +0970+ 9E3E 32 B5 9E ld (.Pos),a +0971+ 9E41 08 exa +0972+ 9E42 3A B3 9E ld a,(.Coordinate) +0973+ 9E45 32 AA 9F ld (CursPos),a +0974+ 9E48 18 08 jr $+10 +0975+ 9E4A +0976+ 9E4A 21 B6 9E .ColorInLine ld hl,.Color ;окраска в основной цвет +0977+ 9E4D 3A 1A AB ld a,(Color.InLine) +0978+ 9E50 BE cp (hl) +0979+ 9E51 C0 ret nz +0980+ 9E52 3A 1B AB ld a,(Color.InLineEd) ;цвет строки ввода +0981+ 9E55 32 B6 9E ld (.Color),a +0982+ 9E58 21 B7 9E ld hl,.Len ;длина строки ввода +0983+ 9E5B 46 ld b,(hl) +0984+ 9E5C 23 inc hl +0985+ 9E5D 23 inc hl +0986+ 9E5E 77 ld (hl),a +0987+ 9E5F 23 inc hl +0988+ 9E60 10 FB djnz $-3 +0989+ 9E62 C9 ret +0990+ 9E63 +0991+ 9E63 21 B8 9E .EndPos ld hl,.Buffer ;поиск позиции послед. символа +0992+ 9E66 3A B7 9E ld a,(.Len) +0993+ 9E69 4F ld c,a +0994+ 9E6A 3D dec a +0995+ 9E6B 87 add a,a +0996+ 9E6C 5F ld e,a +0997+ 9E6D 16 00 ld d,0 +0998+ 9E6F 19 add hl,de +0999+ 9E70 7E ld a,(hl) +1000+ 9E71 2B dec hl +1001+ 9E72 2B dec hl +1002+ 9E73 FE 20 cp " " ;ищем конец строки +1003+ 9E75 C0 ret nz +1004+ 9E76 0D dec c +1005+ 9E77 20 F7 jr nz,$-7 +1006+ 9E79 C9 ret +1007+ 9E7A +1008+ 9E7A 21 B5 9E .NextPos ld hl,.Pos ;расчет следующей позиции +1009+ 9E7D 3A B7 9E ld a,(.Len) +1010+ 9E80 3D dec a +1011+ 9E81 BE cp (hl) +1012+ 9E82 20 0B jr nz,.L16 +1013+ 9E84 3A B2 9E ld a,(.EntEnd) ;заканчивать по ENTER +1014+ 9E87 3C inc a +1015+ 9E88 C8 ret z ;последняя позиция в строке +1016+ 9E89 3E CD ld a,0xCD ;код CALL +1017+ 9E8B 32 34 9D ld (.L15),a +1018+ 9E8E C9 ret +1019+ 9E8F 34 .L16 inc (hl) ;увеличение позиции +1020+ 9E90 3A AA 9F ld a,(CursPos) ;координаты програм курсора +1021+ 9E93 3C inc a +1022+ 9E94 32 AA 9F ld (CursPos),a +1023+ 9E97 C9 ret +1024+ 9E98 ;[]=========================================================================[] +1025+ 9E98 ;[] Копирование из буфера строки ввода [] +1026+ 9E98 ;[]=========================================================================[] +1027+ 9E98 ;Вход: +1028+ 9E98 ;DE - адрес назначения +1029+ 9E98 ;C - длина строки +1030+ 9E98 +1031+ 9E98 21 B8 9E .FromBuffer ld hl,.Buffer +1032+ 9E9B 06 00 ld b,0 +1033+ 9E9D 7E .FB1 ld a,(hl) +1034+ 9E9E 12 ld (de),a +1035+ 9E9F 23 inc hl +1036+ 9EA0 23 inc hl +1037+ 9EA1 13 inc de +1038+ 9EA2 0D dec c +1039+ 9EA3 20 F8 jr nz,.FB1 +1040+ 9EA5 C9 ret +1041+ 9EA6 ;[]=========================================================================[] +1042+ 9EA6 ;[] Копирование в буфер строки ввода [] +1043+ 9EA6 ;[]=========================================================================[] +1044+ 9EA6 ;Вход: +1045+ 9EA6 ;HL - адрес строки +1046+ 9EA6 ;C - длина строки +1047+ 9EA6 +1048+ 9EA6 11 B8 9E .ToBuffer ld de,.Buffer +1049+ 9EA9 7E .TB1 ld a,(hl) +1050+ 9EAA 12 ld (de),a +1051+ 9EAB 13 inc de +1052+ 9EAC 13 inc de +1053+ 9EAD 23 inc hl +1054+ 9EAE 0D dec c +1055+ 9EAF 20 F8 jr nz,.TB1 +1056+ 9EB1 C9 ret +1057+ 9EB2 FF .EntEnd db On ;флаг окончания строки ENTER +1058+ 9EB3 00 00 .Coordinate dw 0 ;начало строки в экране +1059+ 9EB5 ;последовательность переменных не изменять! +1060+ 9EB5 00 .Pos db 0 ;позиция курсора в строке +1061+ 9EB6 00 .Color db 0 ;цвет строки ввода +1062+ 9EB7 00 .Len db 0 ;длина строки ввода +1063+ 9EB8 00 .Buffer ds 22*2 ;буфер строки ввода +1064+ 9EE4 +1065+ 9EE4 ;[]=========================================================================[] +1066+ 9EE4 ;[] Программное создние мигающего курсора [] +1067+ 9EE4 ;[]=========================================================================[] +1068+ 9EE4 +1069+ 9EE4 ;======== Подготовка дополнительного знакогенератора ======== +1070+ 9EE4 PreparChar: +1071+ 9EE4 11 00 80 ld de,OrgAdr-0x100 ;буфер для 2kB знакогенератора +1072+ 9EE7 0E B8 ld c,Bios.Win_Get_ZG ;получить сист. знакогенератор +1073+ 9EE9 CF rst BiosRst +1074+ 9EEA 21 00 87 ld hl,OrgAdr-0x100+7*256 +1075+ 9EED 01 FF 00 ld bc,0x00FF +1076+ 9EF0 71 ld (hl),c +1077+ 9EF1 23 inc hl +1078+ 9EF2 10 FC djnz $-2 +1079+ 9EF4 +1080+ 9EF4 11 00 80 ld de,OrgAdr-0x100 ;уст.знакогенератор 0x5B +1081+ 9EF7 0E B6 ld c,Bios.Win_Set_ZG +1082+ 9EF9 3E 5B ld a,0x5B +1083+ 9EFB CF rst BiosRst +1084+ 9EFC +1085+ 9EFC 2A 39 00 ld hl,(0039h) ;установка вектора (для мигания курсора) +1086+ 9EFF 22 31 9F ld (Rst38.Vect+1),hl +1087+ 9F02 21 09 9F ld hl,Rst38 +1088+ 9F05 22 39 00 ld (0039h),hl +1089+ 9F08 C9 ret +1090+ 9F09 +1091+ 9F09 F3 Rst38 di ;вектор курсора +1092+ 9F0A FD E5 push iy +1093+ 9F0C DD E5 push ix +1094+ 9F0E E5 push hl +1095+ 9F0F D5 push de +1096+ 9F10 C5 push bc +1097+ 9F11 F5 push af +1098+ 9F12 D9 exx +1099+ 9F13 08 exa +1100+ 9F14 E5 push hl +1101+ 9F15 D5 push de +1102+ 9F16 C5 push bc +1103+ 9F17 F5 push af +1104+ 9F18 CD 0D 98 call Clock +1105+ 9F1B 3A A6 9F ld a,(CursOnOff) +1106+ 9F1E B7 or a +1107+ 9F1F C4 33 9F call nz,CuttingCurs +1108+ 9F22 F1 pop af +1109+ 9F23 C1 pop bc +1110+ 9F24 D1 pop de +1111+ 9F25 E1 pop hl +1112+ 9F26 D9 exx +1113+ 9F27 08 exa +1114+ 9F28 F1 pop af +1115+ 9F29 C1 pop bc +1116+ 9F2A D1 pop de +1117+ 9F2B E1 pop hl +1118+ 9F2C DD E1 pop ix +1119+ 9F2E FD E1 pop iy +1120+ 9F30 C3 00 00 .Vect jp 0x0000 ;адрес сист. вектора RST 38 +1121+ 9F33 +1122+ 9F33 ;======== Обработка программного курсора ======== +1123+ 9F33 3A A9 9F CuttingCurs ld a,(TimerFlash) ;пауза мигания +1124+ 9F36 3D dec a +1125+ 9F37 CC 3E 9F call z,.L1 +1126+ 9F3A 32 A9 9F ld (TimerFlash),a +1127+ 9F3D C9 ret +1128+ 9F3E +1129+ 9F3E 3A A7 9F .L1 ld a,(CursPutRes) +1130+ 9F41 2F cpl +1131+ 9F42 32 A7 9F ld (CursPutRes),a +1132+ 9F45 +1133+ 9F45 ED 5B AA 9F ld de,(CursPos) +1134+ 9F49 ED 53 9A 9F ld (ResCurs.L1+1),de +1135+ 9F4D B7 or a ;флаг Put / Res +1136+ 9F4E 28 0C jr z,.L3 ;установка курсора +1137+ 9F50 ;иначе сброс курсора +1138+ 9F50 2A AC 9F ld hl,(CursSymb) ;символ и его цвет +1139+ 9F53 97 sub a ;сброс id окна +1140+ 9F54 06 1B ld b,SysSymb ;системный знакогенератор +1141+ 9F56 0E B5 ld c,Bios.Win_Put_Sym ;положить символ +1142+ 9F58 CF rst BiosRst +1143+ 9F59 3E 10 ld a,PauseFlash ;пауза мигания +1144+ 9F5B C9 ret +1145+ 9F5C +1146+ 9F5C 0E B4 .L3 ld c,Bios.Win_Get_Sym ;получить символ +1147+ 9F5E 97 sub a ;сброс id окна +1148+ 9F5F CF rst BiosRst +1149+ 9F60 22 AC 9F ld (CursSymb),hl ;символ и его цвет +1150+ 9F63 +1151+ 9F63 ED 5B AA 9F ld de,(CursPos) ;позиция печати +1152+ 9F67 3A A8 9F ld a,(CursInsOvr) ;флаг режима Ins / Ovr +1153+ 9F6A B7 or a +1154+ 9F6B 28 0F jr z,.L4 ;режим вставки +1155+ 9F6D ;иначе режим замены +1156+ 9F6D 7C ld a,h +1157+ 9F6E 07 rlca +1158+ 9F6F 07 rlca +1159+ 9F70 07 rlca +1160+ 9F71 07 rlca +1161+ 9F72 67 ld h,a +1162+ 9F73 97 sub a ;сброс id окна +1163+ 9F74 06 1B ld b,SysSymb ;системный знакогенератор +1164+ 9F76 ; ld l,0xDC ;курсор режима замены +1165+ 9F76 0E B5 ld c,Bios.Win_Put_Sym ;символ на экран +1166+ 9F78 CF rst BiosRst +1167+ 9F79 3E 10 ld a,PauseFlash ;пауза мигания +1168+ 9F7B C9 ret +1169+ 9F7C +1170+ 9F7C 97 .L4 sub a ;сброс id окна +1171+ 9F7D 06 5B ld b,0x5B ;модиф. знакогенератор +1172+ 9F7F 0E B5 ld c,Bios.Win_Put_Sym ;символ на экран +1173+ 9F81 CF rst BiosRst +1174+ 9F82 3E 10 ld a,PauseFlash ;пауза мигания +1175+ 9F84 C9 ret +1176+ 9F85 +1177+ 9F85 ;======== Принудительный сброс курсора ======== +1178+ 9F85 3A A6 9F ResCurs ld a,(CursOnOff) +1179+ 9F88 B7 or a +1180+ 9F89 C8 ret z ;курсор не установлен +1181+ 9F8A E5 push hl +1182+ 9F8B 3E FF ld a,On +1183+ 9F8D 32 A7 9F ld (CursPutRes),a +1184+ 9F90 3C inc a +1185+ 9F91 32 A6 9F ld (CursOnOff),a +1186+ 9F94 3E 01 ld a,1 ;пауза мигания +1187+ 9F96 32 A9 9F ld (TimerFlash),a +1188+ 9F99 11 00 00 .L1 ld de,0 ;последние координаты курсора +1189+ 9F9C 2A AC 9F ld hl,(CursSymb) +1190+ 9F9F 01 B5 1B ld bc,0x1B00+Bios.Win_Put_Sym +1191+ 9FA2 97 sub a ;сбросить id окна +1192+ 9FA3 CF rst BiosRst +1193+ 9FA4 E1 pop hl +1194+ 9FA5 C9 ret +1195+ 9FA6 +1196+ 9FA6 00 CursOnOff db Off ;флаг курсора 00-выкл/FF-вкл +1197+ 9FA7 FF CursPutRes db On ;флаг 00-Res/FF-Put +1198+ 9FA8 00 CursInsOvr db Ins ;флаг 00-Ins/FF-Ovr +1199+ 9FA9 01 TimerFlash db 1 ;таймер +1200+ 9FAA 00 00 CursPos dw 0 ;позиция курсора +1201+ 9FAC 00 00 CursSymb dw 0 ;символ под курсором +1202+ 9FAE +1203+ 9FAE +0377 9FAE include "kreg.asm";"D:\WORKAST\DEMON\kreg" +0001+ 9FAE ;[]=========================================================================[] +0002+ 9FAE ;[] Обработка клавиатуры в окне регистров [] +0003+ 9FAE ;[] v0.03 - последние изменения 11.03.2006 [] +0004+ 9FAE ;[] v0.10 - последние изменения 14.05.2006 [] +0005+ 9FAE ;[]=========================================================================[] +0006+ 9FAE KReg: +0007+ 9FAE ; ld a,b ;состояние +0008+ 9FAE ; and 0b11110000 +0009+ 9FAE ; jr z,.L100 +0010+ 9FAE +0011+ 9FAE ;Обработка комбинации Shift + символ +0012+ 9FAE ; and 0b11000000 ; +0013+ 9FAE ; or a +0014+ 9FAE ; jp z,Keyb+6 +0015+ 9FAE ; ld a,d +0016+ 9FAE ; cp 0x80+0x0F ;Shift+Tab +0017+ 9FAE ; jp nz,Keyb+6 +0018+ 9FAE ; ld a,2 ;номер окна дампа +0019+ 9FAE ; ld (Keyb.WinScreen),a +0020+ 9FAE ; jp Keyb-3 +0021+ 9FAE +0022+ 9FAE ;Обработка позиционного кода +0023+ 9FAE 7B .L100 ld a,e ;ASCII код +0024+ 9FAF 32 44 A0 ld (.L200+1),a +0025+ 9FB2 7A ld a,d ;позиционный код +0026+ 9FB3 +0027+ 9FB3 FE 56 cp 0x56 ; +0028+ 9FB5 20 10 jr nz,.L101 +0029+ 9FB7 CD 06 A2 call .DescCalc +0030+ 9FBA 7E ld a,(hl) ;кол-во колонок +0031+ 9FBB BB cp e +0032+ 9FBC 7B ld a,e +0033+ 9FBD 20 01 jr nz,$+3 +0034+ 9FBF AF xor a +0035+ 9FC0 3C inc a +0036+ 9FC1 32 2C A2 ld (.Coordinate),a ;текущая колонка +0037+ 9FC4 C3 4E 98 jp Keyb-3 +0038+ 9FC7 +0039+ 9FC7 FE 54 .L101 cp 0x54 ; +0040+ 9FC9 20 11 jr nz,.L102 +0041+ 9FCB CD 06 A2 call .DescCalc +0042+ 9FCE 7B ld a,e ;текущая колонка +0043+ 9FCF FE 01 cp 1 +0044+ 9FD1 20 02 jr nz,$+4 +0045+ 9FD3 7E ld a,(hl) ;кол-во колонок +0046+ 9FD4 3C inc a +0047+ 9FD5 3D dec a +0048+ 9FD6 32 2C A2 ld (.Coordinate),a ;текущая колонка +0049+ 9FD9 C3 4E 98 jp Keyb-3 +0050+ 9FDC +0051+ 9FDC 2A 2E A2 .L102 ld hl,(.Descript) +0052+ 9FDF ED 5B 2C A2 ld de,(.Coordinate) +0053+ 9FE3 FE 52 cp 0x52 ; +0054+ 9FE5 20 09 jr nz,.L103 +0055+ 9FE7 7A ld a,d ;текущая строка +0056+ 9FE8 BD cp l +0057+ 9FE9 20 02 jr nz,.L104 +0058+ 9FEB 7C ld a,h ;1-я строка +0059+ 9FEC 3D dec a +0060+ 9FED 3C .L104 inc a +0061+ 9FEE 18 0B jr .L107+1 +0062+ 9FF0 +0063+ 9FF0 FE 58 .L103 cp 0x58 ; +0064+ 9FF2 20 10 jr nz,.L105 +0065+ 9FF4 7A ld a,d ;текущая строка +0066+ 9FF5 BC cp h +0067+ 9FF6 20 02 jr nz,.L107 +0068+ 9FF8 7D ld a,l ;адрес последней строки +0069+ 9FF9 3C inc a +0070+ 9FFA 3D .L107 dec a +0071+ 9FFB 67 ld h,a +0072+ 9FFC 2E 01 ld l,1 +0073+ 9FFE 22 2C A2 ld (.Coordinate),hl +0074+ A001 C3 4E 98 jp Keyb-3 +0075+ A004 +0076+ A004 06 03 .L105 ld b,3 +0077+ A006 FE 53 cp 0x53 ; +0078+ A008 20 0D jr nz,.L108 +0079+ A00A 21 24 A2 ld hl,.PgDown +0080+ A00D 7A ld a,d ;текущая строка +0081+ A00E BE cp (hl) +0082+ A00F 38 03 jr c,$+5 +0083+ A011 23 inc hl +0084+ A012 10 FA djnz $-4 +0085+ A014 7E ld a,(hl) +0086+ A015 18 E4 jr .L107+1 +0087+ A017 +0088+ A017 FE 59 .L108 cp 0x59 ; +0089+ A019 20 0E jr nz,.L110 +0090+ A01B 21 28 A2 ld hl,.PgUp +0091+ A01E 7A ld a,d ;текущая строка +0092+ A01F BE cp (hl) +0093+ A020 30 03 jr nc,$+5 +0094+ A022 23 inc hl +0095+ A023 10 FA djnz $-4 +0096+ A025 7E ld a,(hl) +0097+ A026 3D dec a +0098+ A027 18 D2 jr .L107+1 +0099+ A029 +0100+ A029 FE 57 .L110 cp 0x57 ; +0101+ A02B 20 08 jr nz,.L111 +0102+ A02D 3E 01 ld a,1 +0103+ A02F 32 2C A2 ld (.Coordinate),a ;первая колонка +0104+ A032 C3 4E 98 jp Keyb-3 +0105+ A035 +0106+ A035 FE 51 .L111 cp 0x51 ; +0107+ A037 20 0A jr nz,.L200 +0108+ A039 CD 06 A2 call .DescCalc +0109+ A03C 7E ld a,(hl) ;последняя колонка +0110+ A03D 32 2C A2 ld (.Coordinate),a ;первая колонка +0111+ A040 C3 4E 98 jp Keyb-3 +0112+ A043 +0113+ A043 ;.L112 cp 0x0F ; +0114+ A043 ; jr nz,.L200 +0115+ A043 ; ld a,4 ;номер окна листинга +0116+ A043 ; ld (Keyb.WinScreen),a +0117+ A043 ; jp Keyb-3 +0118+ A043 +0119+ A043 ;Обработка ASCII кодов +0120+ A043 3E 00 .L200 ld a,0 ;ASCII код +0121+ A045 FE 0D cp 0x0D ; +0122+ A047 C2 57 98 jp nz,Keyb+6 +0123+ A04A 06 00 .L201 ld b,0 ;длина строки ввода +0124+ A04C 21 00 00 ld hl,0 ;координаты строки ввода +0125+ A04F +0126+ A04F 78 ld a,b +0127+ A050 3D dec a +0128+ A051 C2 DB A0 jp nz,.L205 +0129+ A054 ED 5B 2C A2 ld de,(.Coordinate) +0130+ A058 7A ld a,d ;номер строки +0131+ A059 4B ld c,e ;номер колонки +0132+ A05A EB ex de,hl ;координаты +0133+ A05B 21 30 AB ld hl,Reg._AF+1 ;рег A +0134+ A05E FE 06 cp 6 ;строка с парой AF? +0135+ A060 28 26 jr z,.L207 +0136+ A062 21 38 AB ld hl,Reg._AF_+1 ;рег A' +0137+ A065 FE 0B cp 11 ;строка с парой AF'? +0138+ A067 28 1F jr z,.L207 +0139+ A069 21 2F AB ld hl,Reg._AF ;рег F +0140+ A06C FE 07 cp 7 ;строка с парой AF? +0141+ A06E 28 07 jr z,$+9 +0142+ A070 21 37 AB ld hl,Reg._AF_ ;рег F' +0143+ A073 FE 0C cp 12 ;строка с парой AF'? +0144+ A075 20 3B jr nz,.L206 +0145+ A077 79 ld a,c ;коррекция номеров бит +0146+ A078 FE 04 cp 4 ;колонка 4..6? +0147+ A07A 38 03 jr c,$+5 +0148+ A07C 0C inc c +0149+ A07D 18 05 jr .L207-4 +0150+ A07F FE 03 cp 3 ;колонка 3? +0151+ A081 28 01 jr z,.L207-4 +0152+ A083 0D dec c +0153+ A084 3E 07 ld a,7 +0154+ A086 18 06 jr .L208 +0155+ A088 3E 0A .L207 ld a,10 ;колонки с битами +0156+ A08A B9 cp c +0157+ A08B 28 25 jr z,.L206 +0158+ A08D 3D dec a +0159+ A08E 91 .L208 sub c ;номер бита +0160+ A08F 07 rlca +0161+ A090 07 rlca +0162+ A091 07 rlca ;заготовка для битовых операций +0163+ A092 47 ld b,a +0164+ A093 F6 46 or 01000110b ;для BIT +0165+ A095 32 A5 A0 ld ($+16),a +0166+ A098 78 ld a,b +0167+ A099 F6 C6 or 11000110b ;для SET +0168+ A09B 32 A9 A0 ld ($+14),a +0169+ A09E 78 ld a,b +0170+ A09F F6 86 or 10000110b ;для RES +0171+ A0A1 32 AE A0 ld ($+13),a +0172+ A0A4 CB 46 bit 0,(hl) ;состояние бита +0173+ A0A6 20 05 jr nz,$+7 +0174+ A0A8 CB C6 set 0,(hl) ;установка бита +0175+ A0AA C3 46 98 jp Keyb-11 +0176+ A0AD CB 86 res 0,(hl) ;сброс бита +0177+ A0AF C3 46 98 jp Keyb-11 +0178+ A0B2 +0179+ A0B2 EB .L206 ex de,hl ;координаты +0180+ A0B3 CD AA 9C call InputLine ;ввод символа +0181+ A0B6 DA 4E 98 jp c,Keyb-3 ;завершение ввода по +0182+ A0B9 11 2A A1 ld de,.L204-5 +0183+ A0BC D5 push de +0184+ A0BD ED 5B 2C A2 ld de,(.Coordinate) +0185+ A0C1 21 30 AB ld hl,Reg._AF+1 +0186+ A0C4 7A ld a,d +0187+ A0C5 11 00 00 ld de,0 +0188+ A0C8 FE 06 cp 6 ;строка с парой AF +0189+ A0CA C8 ret z +0190+ A0CB 21 38 AB ld hl,Reg._AF_+1 +0191+ A0CE FE 0B cp 11 ;строка с парой AF'? +0192+ A0D0 C8 ret z +0193+ A0D1 ED 5B 2C A2 ld de,(.Coordinate) +0194+ A0D5 7B ld a,e +0195+ A0D6 D6 06 sub 6 +0196+ A0D8 5F ld e,a +0197+ A0D9 18 17 jr .L209 +0198+ A0DB +0199+ A0DB 3D .L205 dec a ;байты в минидампе +0200+ A0DC 20 5D jr nz,.L202 +0201+ A0DE CD AA 9C call InputLine ;ввод числа +0202+ A0E1 DA 4E 98 jp c,Keyb-3 ;завершение ввода по +0203+ A0E4 CD F1 9B call PutCode +0204+ A0E7 DA 4A A0 jp c,.L201 ;ошибка в веденных данных +0205+ A0EA 11 2F A1 ld de,.L204 +0206+ A0ED D5 push de +0207+ A0EE ED 5B 2C A2 ld de,(.Coordinate) +0208+ A0F2 15 .L209 dec d +0209+ A0F3 20 04 jr nz,$+6 +0210+ A0F5 2A 25 AB ld hl,(Reg._IX) +0211+ A0F8 C9 ret +0212+ A0F9 15 dec d +0213+ A0FA 20 04 jr nz,$+6 +0214+ A0FC 2A 27 AB ld hl,(Reg._IY) +0215+ A0FF C9 ret +0216+ A100 15 dec d +0217+ A101 20 04 jr nz,$+6 +0218+ A103 2A 29 AB ld hl,(Reg._HL) +0219+ A106 C9 ret +0220+ A107 15 dec d +0221+ A108 20 04 jr nz,$+6 +0222+ A10A 2A 2B AB ld hl,(Reg._DE) +0223+ A10D C9 ret +0224+ A10E 15 dec d +0225+ A10F 20 04 jr nz,$+6 +0226+ A111 2A 2D AB ld hl,(Reg._BC) +0227+ A114 C9 ret +0228+ A115 15 dec d +0229+ A116 15 dec d +0230+ A117 15 dec d +0231+ A118 20 04 jr nz,$+6 +0232+ A11A 2A 31 AB ld hl,(Reg._HL_) +0233+ A11D C9 ret +0234+ A11E 15 dec d +0235+ A11F 20 04 jr nz,$+6 +0236+ A121 2A 33 AB ld hl,(Reg._DE_) +0237+ A124 C9 ret +0238+ A125 15 dec d +0239+ A126 2A 35 AB ld hl,(Reg._BC_) +0240+ A129 C9 ret +0241+ A12A +0242+ A12A 3A B8 9E ld a,(InputLine.Buffer) +0243+ A12D 18 05 jr $+7 +0244+ A12F 3A 2C 9C .L204 ld a,(PutCode.Buffer) ;записываемый байт +0245+ A132 1D dec e +0246+ A133 1D dec e ;смещение в минидампе +0247+ A134 19 add hl,de ;адрес в памяти +0248+ A135 CD 97 92 call Ld_hl_a ;записали +0249+ A138 C3 46 98 jp Keyb-11 +0250+ A13B +0251+ A13B 3D .L202 dec a ;однобайтное число (номер банки) +0252+ A13C 20 32 jr nz,.L203 +0253+ A13E CD AA 9C call InputLine ;ввод числа +0254+ A141 DA 4E 98 jp c,Keyb-3 ;завершение ввода по +0255+ A144 CD 30 9C call PutAdres +0256+ A147 DA 4A A0 jp c,.L201 ;ошибка в веденных данных +0257+ A14A 11 46 98 ld de,Keyb-11 +0258+ A14D D5 push de +0259+ A14E 7D ld a,l +0260+ A14F ED 5B 2C A2 ld de,(.Coordinate) +0261+ A153 1D dec e ;колонка в строке +0262+ A154 20 04 jr nz,$+6 +0263+ A156 32 3F AB ld (WinPage),a ;0-е окно +0264+ A159 C9 ret +0265+ A15A 1D dec e +0266+ A15B 20 06 jr nz,$+8 +0267+ A15D 32 40 AB ld (WinPage+1),a ;1-е окно +0268+ A160 D3 A2 out (EmmWin.P1),a +0269+ A162 C9 ret +0270+ A163 1D dec e +0271+ A164 20 04 jr nz,$+6 +0272+ A166 32 41 AB ld (WinPage+2),a ;2-е окно +0273+ A169 C9 ret +0274+ A16A 32 42 AB ld (WinPage+3),a ;3-е окно +0275+ A16D D3 E2 out (EmmWin.P3),a +0276+ A16F C9 ret +0277+ A170 +0278+ A170 3D .L203 dec a ;глубина стека +0279+ A171 20 07 jr nz,.L210 +0280+ A173 AF xor a ;обнулить +0281+ A174 32 22 AB ld (StackDown),a +0282+ A177 C3 46 98 jp Keyb-11 +0283+ A17A +0284+ A17A .L210 ;dec a ;двухбайтное число +0285+ A17A ;jp nz,Keyb+6 +0286+ A17A CD AA 9C call InputLine ;ввод числа в рег пары +0287+ A17D DA 4E 98 jp c,Keyb-3 ;завершение ввода по +0288+ A180 CD 30 9C call PutAdres +0289+ A183 DA 4A A0 jp c,.L201 ;ошибка в веденных данных +0290+ A186 11 46 98 ld de,Keyb-11 +0291+ A189 D5 push de +0292+ A18A ED 5B 2C A2 ld de,(.Coordinate) +0293+ A18E 15 dec d +0294+ A18F 20 04 jr nz,$+6 +0295+ A191 22 25 AB ld (Reg._IX),hl +0296+ A194 C9 ret +0297+ A195 15 dec d +0298+ A196 20 04 jr nz,$+6 +0299+ A198 22 27 AB ld (Reg._IY),hl +0300+ A19B C9 ret +0301+ A19C 15 dec d +0302+ A19D 20 04 jr nz,$+6 +0303+ A19F 22 29 AB ld (Reg._HL),hl +0304+ A1A2 C9 ret +0305+ A1A3 15 dec d +0306+ A1A4 20 04 jr nz,$+6 +0307+ A1A6 22 2B AB ld (Reg._DE),hl +0308+ A1A9 C9 ret +0309+ A1AA 15 dec d +0310+ A1AB 20 04 jr nz,$+6 +0311+ A1AD 22 2D AB ld (Reg._BC),hl +0312+ A1B0 C9 ret +0313+ A1B1 15 dec d +0314+ A1B2 20 04 jr nz,$+6 +0315+ A1B4 22 2F AB ld (Reg._AF),hl +0316+ A1B7 C9 ret +0317+ A1B8 15 dec d +0318+ A1B9 15 dec d +0319+ A1BA 20 04 jr nz,$+6 +0320+ A1BC 22 31 AB ld (Reg._HL_),hl +0321+ A1BF C9 ret +0322+ A1C0 15 dec d +0323+ A1C1 20 04 jr nz,$+6 +0324+ A1C3 22 33 AB ld (Reg._DE_),hl +0325+ A1C6 C9 ret +0326+ A1C7 15 dec d +0327+ A1C8 20 04 jr nz,$+6 +0328+ A1CA 22 35 AB ld (Reg._BC_),hl +0329+ A1CD C9 ret +0330+ A1CE 15 dec d +0331+ A1CF 20 04 jr nz,$+6 +0332+ A1D1 22 37 AB ld (Reg._AF_),hl +0333+ A1D4 C9 ret +0334+ A1D5 15 dec d +0335+ A1D6 15 dec d +0336+ A1D7 20 0B jr nz,$+13 +0337+ A1D9 1D dec e +0338+ A1DA 28 04 jr z,$+6 +0339+ A1DC 22 39 AB ld (Reg._IR),hl +0340+ A1DF C9 ret +0341+ A1E0 22 3D AB ld (Reg._PC),hl +0342+ A1E3 C9 ret +0343+ A1E4 1D dec e +0344+ A1E5 28 1B jr z,.L211 +0345+ A1E7 01 7D 00 .Rez ld bc,Rezident.End-Rezident;длина резидента +0346+ A1EA E5 push hl ;новое начало резидента +0347+ A1EB 09 add hl,bc ;новый конечный адрес резидента +0348+ A1EC 7C ld a,h +0349+ A1ED E6 C0 and 11000000b +0350+ A1EF 57 ld d,a +0351+ A1F0 E1 pop hl +0352+ A1F1 7C ld a,h +0353+ A1F2 E6 C0 and 11000000b +0354+ A1F4 BA cp d ;резидент пересекает окно? +0355+ A1F5 28 07 jr z,.L212 +0356+ A1F7 62 ld h,d +0357+ A1F8 2E 00 ld l,0 +0358+ A1FA 2B dec hl ;последний адрес окна с резидентом +0359+ A1FB B7 or a +0360+ A1FC ED 42 sbc hl,bc +0361+ A1FE 22 20 AB .L212 ld (RezAdr),hl +0362+ A201 C9 ret +0363+ A202 22 3B AB .L211 ld (Reg._SP),hl +0364+ A205 C9 ret +0365+ A206 +0366+ A206 ;Расчет дескриптора строки в окне регистров +0367+ A206 ED 5B 2C A2 .DescCalc ld de,(.Coordinate) ;текущие координаты +0368+ A20A 21 2F A2 ld hl,.Descript+1 +0369+ A20D 42 ld b,d ;номер строки +0370+ A20E 23 inc hl ;дескриптор строки +0371+ A20F 23 inc hl +0372+ A210 10 FC djnz $-2 +0373+ A212 7E ld a,(hl) ;номер дескриптора строки +0374+ A213 87 add a,a +0375+ A214 4F ld c,a +0376+ A215 2B dec hl +0377+ A216 46 ld b,(hl) +0378+ A217 C5 push bc +0379+ A218 06 00 ld b,0 +0380+ A21A 21 4E A2 ld hl,.DTabl +0381+ A21D 09 add hl,bc +0382+ A21E 7E ld a,(hl) ;начало дескриптора +0383+ A21F 23 inc hl +0384+ A220 66 ld h,(hl) +0385+ A221 6F ld l,a +0386+ A222 C1 pop bc +0387+ A223 C9 ret +0388+ A224 +0389+ A224 02 07 0C 0F .PgDown db 2,7,12,15 +0390+ A228 0E 09 04 02 .PgUp db 14,9,4,2 +0391+ A22C +0392+ A22C 01 01 .Coordinate dw 0x0101 ;курсор (стр/кол курсора) +0393+ A22E +0394+ A22E .Descript: +0395+ A22E 0F 01 dw 0x010F ;первая/кол-во строк окна +0396+ A230 +0397+ A230 01 00 db 0x01,0 ;номер строки, номер дескриптора +0398+ A232 02 00 04 00 db 0x02,0,0x04,0 +0399+ A236 db 0x05,0,0x06,0,0x07,1 +0399+ A236 050006000701 +0400+ A23C db 0x08,2,0x0A,0,0x0B,0 +0400+ A23C 08020A000B00 +0401+ A242 db 0x0C,0,0x0D,1,0x0E,2 +0401+ A242 0C000D010E02 +0402+ A248 db 0x10,3,0x12,4,0x14,5 +0402+ A248 100312041405 +0403+ A24E +0404+ A24E .DTabl dw .D1,.D2,.D3,.D4,.D5,.D6 +0404+ A24E 5AA26DA282A28FA294A29DA2 +0405+ A25A +0406+ A25A 09 .D1 db 9 ;кол-во колонок для пар +0407+ A25B 04 db 0x04 ;N столбца колонки +0408+ A25C 05 db 5 ;ширина колонки +0409+ A25D db 0x0A,2,0x0C,2,0x0F,2,0x11,2 +0409+ A25D 0A020C020F021102 +0410+ A265 db 0x14,1,0x15,1,0x16,1,0x17,1 +0410+ A265 1401150116011701 +0411+ A26D +0412+ A26D 0A .D2 db 10 ;кол-во колонок для пары AF +0413+ A26E 04 db 0x04 ;N столбца колонки +0414+ A26F 05 db 5 ;ширина колонки +0415+ A270 db 0x0B,1,0x0C,1,0x0D,1,0x0E,1 +0415+ A270 0B010C010D010E01 +0416+ A278 db 0x0F,1,0x10,1,0x11,1,0x12,1 +0416+ A278 0F01100111011201 +0417+ A280 15 01 db 0x15,1 +0418+ A282 +0419+ A282 06 .D3 db 6 ;кол-во колонок для флагов +0420+ A283 01 db 0x01 ;N столбца колонки +0421+ A284 01 db 1 ;ширина колонки +0422+ A285 02 01 04 01 db 0x02,1,0x04,1 +0423+ A289 db 0x06,1,0x07,1,0x08,1 +0423+ A289 060107010801 +0424+ A28F +0425+ A28F 02 .D4 db 2 ;кол-во колонок для PC IR +0426+ A290 04 db 0x04 ;N столбца колонки +0427+ A291 05 db 5 ;ширина колонки +0428+ A292 0D 05 db 0x0D,5 +0429+ A294 +0430+ A294 04 .D5 db 4 ;кол-во колонок для банок +0431+ A295 02 db 0x02 ;N столбца колонки +0432+ A296 03 db 3 ;ширина колонки +0433+ A297 db 0x08,3,0x0E,3,0x14,3 +0433+ A297 08030E031403 +0434+ A29D +0435+ A29D 03 .D6 db 3 ;кол-во колонок +0436+ A29E 04 db 0x04 ;N столбца колонки +0437+ A29F 05 db 5 ;ширина колонки +0438+ A2A0 0A 04 db 0x0A,4 +0439+ A2A2 13 05 db 0x13,5 +0440+ A2A4 +0441+ A2A4 +0378 A2A4 include "kstack.asm";"D:\WORKAST\DEMON\kstack" +0001+ A2A4 ;[]=========================================================================[] +0002+ A2A4 ;[] Обработка клавиатуры в окне дампа стека [] +0003+ A2A4 ;[] v0.10 - последние изменения 18.03.2006 [] +0004+ A2A4 ;[]=========================================================================[] +0005+ A2A4 KStack: +0006+ A2A4 78 ld a,b ;состояние +0007+ A2A5 E6 F0 and 11110000b +0008+ A2A7 ; ld b,a +0009+ A2A7 28 28 jr z,.L100 +0010+ A2A9 +0011+ A2A9 ;Обработка комбинации Shift + символ +0012+ A2A9 ; and 11000000b ; +0013+ A2A9 ; or a +0014+ A2A9 ; jr z,.L10 +0015+ A2A9 ; ld a,d +0016+ A2A9 ;; cp 0x80+0x0F ;Shift+Tab +0017+ A2A9 ;; jp nz,Keyb+6 +0018+ A2A9 ;; ld a,3 ;номер окна дампа +0019+ A2A9 ;; ld (Keyb.WinScreen),a +0020+ A2A9 ; jp Keyb-3 +0021+ A2A9 +0022+ A2A9 ;Обработка комбинации Ctrl + символ +0023+ A2A9 ; ld a,b +0024+ A2A9 FE 20 cp 00100000b ; +0025+ A2AB C2 57 98 jp nz,Keyb+6 +0026+ A2AE 7A ld a,d ;позиционный код +0027+ A2AF FE AB cp 0x80+0x2B ;+ +0028+ A2B1 C2 57 98 jp nz,Keyb+6 +0029+ A2B4 2A 23 AB ld hl,(StackDump) +0030+ A2B7 ED 4B F3 A3 ld bc,(.Coordinate) +0031+ A2BB 78 ld a,b +0032+ A2BC 06 16 ld b,0x16 ;x-кордината 1 строки +0033+ A2BE 90 sub b +0034+ A2BF 07 rlca ;*2 +0035+ A2C0 06 00 ld b,0 +0036+ A2C2 4F ld c,a +0037+ A2C3 B7 or a +0038+ A2C4 ED 42 sbc hl,bc +0039+ A2C6 22 3B AB ld (Reg._SP),hl +0040+ A2C9 3E FF ld a,-1 +0041+ A2CB 32 66 90 ld (PrintStrSP.StrSp),a +0042+ A2CE C3 46 98 jp Keyb-11 +0043+ A2D1 +0044+ A2D1 ;Обработка позиционного кода +0045+ A2D1 7B .L100 ld a,e ;ASCII код +0046+ A2D2 32 9E A3 ld (.L200+1),a +0047+ A2D5 7A ld a,d ;позиционный код +0048+ A2D6 +0049+ A2D6 ED 5B F3 A3 ld de,(.Coordinate) ;текущие координаты курсора +0050+ A2DA FE 56 cp 0x56 ; +0051+ A2DC 20 0F jr nz,.L101 +0052+ A2DE 3A F7 A3 ld a,(.Descript+2) ;кол-во колонок +0053+ A2E1 BB cp e +0054+ A2E2 7B ld a,e +0055+ A2E3 20 01 jr nz,$+3 +0056+ A2E5 AF xor a +0057+ A2E6 3C inc a +0058+ A2E7 32 F3 A3 ld (.Coordinate),a ;текущая колонка +0059+ A2EA C3 4E 98 jp Keyb-3 +0060+ A2ED +0061+ A2ED FE 54 .L101 cp 0x54 ; +0062+ A2EF 20 10 jr nz,.L102 +0063+ A2F1 7B ld a,e ;текущая колонка +0064+ A2F2 FE 01 cp 1 +0065+ A2F4 20 04 jr nz,$+6 +0066+ A2F6 3A F7 A3 ld a,(.Descript+2) ;кол-во колонок +0067+ A2F9 3C inc a +0068+ A2FA 3D dec a +0069+ A2FB 32 F3 A3 ld (.Coordinate),a ;текущая колонка +0070+ A2FE C3 4E 98 jp Keyb-3 +0071+ A301 +0072+ A301 2A F5 A3 .L102 ld hl,(.Descript) +0073+ A304 FE 52 cp 0x52 ; +0074+ A306 20 1F jr nz,.L103 +0075+ A308 7A ld a,d ;текущая строка +0076+ A309 BD cp l +0077+ A30A 20 14 jr nz,.L104 +0078+ A30C 2A 23 AB ld hl,(StackDump) ;адрес 1-ой строки +0079+ A30F 2B dec hl +0080+ A310 2B dec hl +0081+ A311 22 23 AB ld (StackDump),hl +0082+ A314 21 66 90 ld hl,PrintStrSP.StrSp ;строка верш.стека +0083+ A317 3E FF ld a,-1 +0084+ A319 BE cp (hl) ;в дампе? +0085+ A31A 28 01 jr z,$+3 +0086+ A31C 35 dec (hl) +0087+ A31D C3 46 98 jp Keyb-11 +0088+ A320 3C .L104 inc a +0089+ A321 32 F4 A3 ld (.Coordinate+1),a +0090+ A324 C3 4E 98 jp Keyb-3 +0091+ A327 +0092+ A327 FE 58 .L103 cp 0x58 ; +0093+ A329 20 22 jr nz,.L105 +0094+ A32B 7A ld a,d ;текущая строка +0095+ A32C BC cp h +0096+ A32D 20 17 jr nz,.L107 +0097+ A32F 2A 23 AB ld hl,(StackDump) ;адрес 1-ой строки +0098+ A332 23 inc hl +0099+ A333 23 inc hl +0100+ A334 22 23 AB ld (StackDump),hl +0101+ A337 21 66 90 ld hl,PrintStrSP.StrSp ;строка верш.стека +0102+ A33A 7E ld a,(hl) +0103+ A33B FE 07 cp 7 ;на последней строке? +0104+ A33D 38 03 jr c,$+5 +0105+ A33F 3E FE ld a,-2 +0106+ A341 77 ld (hl),a ;верш.стека не попадает в дамп +0107+ A342 34 inc (hl) +0108+ A343 C3 46 98 jp Keyb-11 +0109+ A346 3D .L107 dec a +0110+ A347 32 F4 A3 ld (.Coordinate+1),a +0111+ A34A C3 4E 98 jp Keyb-3 +0112+ A34D +0113+ A34D FE 53 .L105 cp 0x53 ; +0114+ A34F 20 1F jr nz,.L108 +0115+ A351 7A ld a,d ;текущая строка +0116+ A352 BD cp l +0117+ A353 20 14 jr nz,.L106 +0118+ A355 2A 23 AB ld hl,(StackDump) +0119+ A358 01 0E 00 ld bc,2*7 +0120+ A35B B7 or a +0121+ A35C ED 42 sbc hl,bc +0122+ A35E 22 23 AB ld (StackDump),hl +0123+ A361 3E FF ld a,-1 +0124+ A363 32 66 90 ld (PrintStrSP.StrSp),a ;строка верш.стека +0125+ A366 C3 46 98 jp Keyb-11 +0126+ A369 7D .L106 ld a,l ;на последнюю строку +0127+ A36A 32 F4 A3 ld (.Coordinate+1),a +0128+ A36D C3 4E 98 jp Keyb-3 +0129+ A370 +0130+ A370 FE 59 .L108 cp 0x59 ; +0131+ A372 20 1D jr nz,.L110 +0132+ A374 7A ld a,d ;текущая строка +0133+ A375 BC cp h +0134+ A376 20 12 jr nz,.L109 +0135+ A378 2A 23 AB ld hl,(StackDump) +0136+ A37B 01 0E 00 ld bc,2*7 +0137+ A37E 09 add hl,bc +0138+ A37F 22 23 AB ld (StackDump),hl +0139+ A382 3E FF ld a,-1 +0140+ A384 32 66 90 ld (PrintStrSP.StrSp),a ;строка верш.стека +0141+ A387 C3 46 98 jp Keyb-11 +0142+ A38A 7C .L109 ld a,h ;на первую строку +0143+ A38B 32 F4 A3 ld (.Coordinate+1),a +0144+ A38E C3 4E 98 jp Keyb-3 +0145+ A391 +0146+ A391 FE 57 .L110 cp 0x57 ; +0147+ A393 20 08 jr nz,.L200 +0148+ A395 3E 06 ld a,6 +0149+ A397 32 66 90 ld (PrintStrSP.StrSp),a ;строка верш.стека +0150+ A39A C3 46 98 jp Keyb-11 +0151+ A39D +0152+ A39D ;.L111 cp 0x0F ; +0153+ A39D ; jr nz,.L200 +0154+ A39D ; ld a,1 ;номер окна листинга +0155+ A39D ; ld (Keyb.WinScreen),a +0156+ A39D ; jp Keyb-3 +0157+ A39D +0158+ A39D ;Обработка ASCII кодов +0159+ A39D 3E 00 .L200 ld a,0 ;ASCII код +0160+ A39F FE 0D cp 0x0D ; +0161+ A3A1 C2 57 98 jp nz,Keyb+6 +0162+ A3A4 06 00 .L201 ld b,0 ;длина строки ввода +0163+ A3A6 21 00 00 ld hl,0 ;координаты строки ввода +0164+ A3A9 CD AA 9C call InputLine ;ввод числа +0165+ A3AC DA 4E 98 jp c,Keyb-3 ;завершение ввода по +0166+ A3AF CD 30 9C call PutAdres +0167+ A3B2 DA A4 A3 jp c,.L201 ;ошибка в веденных данных +0168+ A3B5 ED 4B F3 A3 ld bc,(.Coordinate) +0169+ A3B9 78 ld a,b +0170+ A3BA 06 16 ld b,0x16 ;x-кордината 1 строки +0171+ A3BC 90 sub b +0172+ A3BD EB ex de,hl +0173+ A3BE 2A 23 AB ld hl,(StackDump) +0174+ A3C1 47 ld b,a ;номер строки 0..7 +0175+ A3C2 07 rlca ;*2 +0176+ A3C3 0D dec c +0177+ A3C4 4F ld c,a +0178+ A3C5 20 1B jr nz,.L202 ;переход - если данные, иначе алрес +0179+ A3C7 +0180+ A3C7 3A 66 90 ld a,(PrintStrSP.StrSp) ;строка верш.стека +0181+ A3CA B8 cp b +0182+ A3CB 28 0E jr z,.L203 +0183+ A3CD 06 00 ld b,0 ;не на вершине стека +0184+ A3CF EB ex de,hl ;HL - введенный адрес +0185+ A3D0 09 add hl,bc +0186+ A3D1 22 23 AB ld (StackDump),hl +0187+ A3D4 3E FF ld a,-1 +0188+ A3D6 32 66 90 ld (PrintStrSP.StrSp),a +0189+ A3D9 18 04 jr .L203+4 +0190+ A3DB ED 53 3B AB .L203 ld (Reg._SP),de ;адрес введен на вершине стека +0191+ A3DF C3 46 98 jp Keyb-11 +0192+ A3E2 +0193+ A3E2 06 00 .L202 ld b,0 ;ввод данных +0194+ A3E4 B7 or a +0195+ A3E5 ED 42 sbc hl,bc +0196+ A3E7 7A ld a,d ;запись данных в память +0197+ A3E8 CD 97 92 call Ld_hl_a +0198+ A3EB 23 inc hl +0199+ A3EC 7B ld a,e +0200+ A3ED CD 97 92 call Ld_hl_a +0201+ A3F0 C3 46 98 jp Keyb-11 +0202+ A3F3 +0203+ A3F3 +0204+ A3F3 01 16 .Coordinate dw 0x1601 ;курсор (стр/кол курсора) +0205+ A3F5 .Descript: +0206+ A3F5 1D 16 dw 0x161D ;первая/последняя строка окна +0207+ A3F7 02 db 2 ;кол-во колонок +0208+ A3F8 +0209+ A3F8 01 db 0x01 ;N столбца колонки +0210+ A3F9 05 db 5 ;ширина колонки +0211+ A3FA 07 05 db 0x07,5 +0212+ A3FC +0213+ A3FC +0379 A3FC include "kdump.asm";"D:\WORKAST\DEMON\kdump" +0001+ A3FC ;[]=========================================================================[] +0002+ A3FC ;[] Обработка клавиатуры в окне дампа [] +0003+ A3FC ;[] v0.10 - последние изменения 31.03.2006 [] +0004+ A3FC ;[]=========================================================================[] +0005+ A3FC KDump: +0006+ A3FC 78 ld a,b ;состояние +0007+ A3FD E6 F0 and 11110000b +0008+ A3FF 28 30 jr z,.L100 +0009+ A401 +0010+ A401 ;Обработка комбинации Ctrl + символ +0011+ A401 FE 20 .L10 cp 00100000b ; +0012+ A403 C2 31 A4 jp nz,.L100 +0013+ A406 7A ld a,d ;позиционный код +0014+ A407 +0015+ A407 FE D1 cp 0x80+0x51 ;++ +0047+ A43C 20 0F jr nz,.L101 +0048+ A43E 3A A4 A5 ld a,(.Descript+2) ;кол-во колонок +0049+ A441 BB cp e +0050+ A442 7B ld a,e +0051+ A443 20 01 jr nz,$+3 +0052+ A445 AF xor a +0053+ A446 3C inc a +0054+ A447 32 A0 A5 ld (.Coordinate),a ;текущая колонка +0055+ A44A C3 4E 98 jp Keyb-3 +0056+ A44D +0057+ A44D FE 54 .L101 cp 0x54 ; +0058+ A44F 20 10 jr nz,.L102 +0059+ A451 7B ld a,e ;текущая колонка +0060+ A452 FE 01 cp 1 +0061+ A454 20 04 jr nz,$+6 +0062+ A456 3A A4 A5 ld a,(.Descript+2) ;кол-во колонок +0063+ A459 3C inc a +0064+ A45A 3D dec a +0065+ A45B 32 A0 A5 ld (.Coordinate),a ;текущая колонка +0066+ A45E C3 4E 98 jp Keyb-3 +0067+ A461 +0068+ A461 2A A2 A5 .L102 ld hl,(.Descript) +0069+ A464 FE 52 cp 0x52 ; +0070+ A466 20 18 jr nz,.L103 +0071+ A468 7A ld a,d ;текущая строка +0072+ A469 BD cp l +0073+ A46A 20 0D jr nz,.L104 +0074+ A46C 2A 43 AB ld hl,(Dump1) +0075+ A46F 01 10 00 ld bc,16 +0076+ A472 09 add hl,bc +0077+ A473 22 43 AB ld (Dump1),hl +0078+ A476 C3 46 98 jp Keyb-11 +0079+ A479 3C .L104 inc a +0080+ A47A 32 A1 A5 ld (.Coordinate+1),a +0081+ A47D C3 4E 98 jp Keyb-3 +0082+ A480 +0083+ A480 FE 58 .L103 cp 0x58 ; +0084+ A482 20 1A jr nz,.L105 +0085+ A484 7A ld a,d ;текущая строка +0086+ A485 BC cp h +0087+ A486 20 0F jr nz,.L107 +0088+ A488 2A 43 AB ld hl,(Dump1) +0089+ A48B 01 10 00 ld bc,16 +0090+ A48E B7 or a +0091+ A48F ED 42 sbc hl,bc +0092+ A491 22 43 AB ld (Dump1),hl +0093+ A494 C3 46 98 jp Keyb-11 +0094+ A497 3D .L107 dec a +0095+ A498 32 A1 A5 ld (.Coordinate+1),a +0096+ A49B C3 4E 98 jp Keyb-3 +0097+ A49E +0098+ A49E FE 53 .L105 cp 0x53 ; +0099+ A4A0 20 18 jr nz,.L108 +0100+ A4A2 7A ld a,d ;текущая строка +0101+ A4A3 BD cp l +0102+ A4A4 20 0D jr nz,.L106 +0103+ A4A6 2A 43 AB ld hl,(Dump1) +0104+ A4A9 01 70 00 ld bc,16*7 +0105+ A4AC 09 add hl,bc +0106+ A4AD 22 43 AB ld (Dump1),hl +0107+ A4B0 C3 46 98 jp Keyb-11 +0108+ A4B3 7D .L106 ld a,l ;на последнюю строку +0109+ A4B4 32 A1 A5 ld (.Coordinate+1),a +0110+ A4B7 C3 4E 98 jp Keyb-3 +0111+ A4BA +0112+ A4BA FE 59 .L108 cp 0x59 ; +0113+ A4BC 20 1C jr nz,.L110 +0114+ A4BE 7A ld a,d ;текущая строка +0115+ A4BF BC cp h +0116+ A4C0 20 11 jr nz,.L109 +0117+ A4C2 2A 43 AB ld hl,(Dump1) +0118+ A4C5 01 70 00 ld bc,16*7 +0119+ A4C8 B7 or a +0120+ A4C9 ED 42 sbc hl,bc +0121+ A4CB 22 43 AB ld (Dump1),hl +0122+ A4CE C3 46 98 jp Keyb-11 +0123+ A4D1 20 00 jr nz,.L109 +0124+ A4D3 7C .L109 ld a,h ;на первую строку +0125+ A4D4 32 A1 A5 ld (.Coordinate+1),a +0126+ A4D7 C3 4E 98 jp Keyb-3 +0127+ A4DA +0128+ A4DA FE 57 .L110 cp 0x57 ; +0129+ A4DC 20 08 jr nz,.L111 +0130+ A4DE 3E 01 ld a,1 +0131+ A4E0 32 A0 A5 ld (.Coordinate),a ;первая колонка +0132+ A4E3 C3 4E 98 jp Keyb-3 +0133+ A4E6 +0134+ A4E6 FE 51 .L111 cp 0x51 ; +0135+ A4E8 20 09 jr nz,.L200 +0136+ A4EA 3A A4 A5 ld a,(.Descript+2) +0137+ A4ED 32 A0 A5 ld (.Coordinate),a ;первая колонка +0138+ A4F0 C3 4E 98 jp Keyb-3 +0139+ A4F3 +0140+ A4F3 ;Обработка ASCII кодов +0141+ A4F3 3E 00 .L200 ld a,0 ;ASCII код +0142+ A4F5 FE 0D cp 0x0D ; +0143+ A4F7 C2 57 98 jp nz,Keyb+6 +0144+ A4FA 06 00 .L201 ld b,0 ;длина строки ввода +0145+ A4FC 21 00 00 ld hl,0 ;координаты строки ввода +0146+ A4FF +0147+ A4FF 78 ld a,b +0148+ A500 3D dec a +0149+ A501 28 25 jr z,.L202 +0150+ A503 3D dec a +0151+ A504 28 37 jr z,.L203 +0152+ A506 +0153+ A506 CD AA 9C call InputLine ;ввод адреса +0154+ A509 DA 4E 98 jp c,Keyb-3 ;завершение ввода по +0155+ A50C CD 30 9C call PutAdres +0156+ A50F DA FA A4 jp c,.L201 ;ошибка в веденных данных +0157+ A512 11 10 00 ld de,16 ;кол-во байт в строке +0158+ A515 3A A1 A5 ld a,(.Coordinate+1) ;номер строки +0159+ A518 D6 16 sub 0x16 ;координата первой строки +0160+ A51A 28 06 jr z,$+8 +0161+ A51C 47 ld b,a +0162+ A51D B7 or a +0163+ A51E ED 52 sbc hl,de +0164+ A520 10 FB djnz $-3 +0165+ A522 22 43 AB ld (Dump1),hl +0166+ A525 C3 46 98 jp Keyb-11 +0167+ A528 +0168+ A528 CD A3 9C .L202 call InputLineEd ;ввод символа +0169+ A52B DA 4E 98 jp c,Keyb-3 ;завершение ввода по +0170+ A52E CD 8D A5 call .L299 +0171+ A531 79 ld a,c +0172+ A532 D6 12 sub 18 ;первая колонка в поле данных +0173+ A534 4F ld c,a +0174+ A535 3A B8 9E ld a,(InputLine.Buffer) +0175+ A538 11 22 12 ld de,256*18+34 ;1-я и последняя+1 колонки +0176+ A53B 18 19 jr .L204 +0177+ A53D +0178+ A53D CD A3 9C .L203 call InputLineEd ;ввод кода символа +0179+ A540 DA 4E 98 jp c,Keyb-3 ;завершение ввода по +0180+ A543 CD F1 9B call PutCode +0181+ A546 DA FA A4 jp c,.L201 ;ошибка в веденных данных +0182+ A549 CD 8D A5 call .L299 +0183+ A54C 79 ld a,c +0184+ A54D D6 02 sub 2 ;первая колонка в поле данных +0185+ A54F 4F ld c,a +0186+ A550 3A 2C 9C ld a,(PutCode.Buffer) ;записываемый байт +0187+ A553 11 12 02 ld de,256*2+18 ;1-я и последняя+1 колонки +0188+ A556 09 .L204 add hl,bc +0189+ A557 CD 97 92 call Ld_hl_a +0190+ A55A 3A B2 9E ld a,(InputLine.EntEnd) ;ввод закончен ENTER +0191+ A55D B7 or a +0192+ A55E C2 46 98 jp nz,Keyb-11 ;да +0193+ A561 21 A0 A5 ld hl,.Coordinate ;текущие координаты курсора +0194+ A564 34 inc (hl) +0195+ A565 7B ld a,e ;первая колонка данных +0196+ A566 BE cp (hl) +0197+ A567 20 15 jr nz,.L205 +0198+ A569 7A ld a,d +0199+ A56A 77 ld (hl),a ;в начало строки кода +0200+ A56B 23 inc hl +0201+ A56C 3E 1D ld a,0x1D ;последняя строка дампа +0202+ A56E BE cp (hl) +0203+ A56F 20 0C jr nz,.L205-1 +0204+ A571 2A 43 AB ld hl,(Dump1) ;сдвинуть дамп +0205+ A574 01 10 00 ld bc,16 +0206+ A577 09 add hl,bc +0207+ A578 22 43 AB ld (Dump1),hl +0208+ A57B 18 01 jr .L205 +0209+ A57D 34 inc (hl) +0210+ A57E CD 35 92 .L205 call CursorRes ;выкл курсор +0211+ A581 CD 3C 88 call Refresh ;обновление экрана +0212+ A584 CD B3 99 call Cursor ;вкл курсор +0213+ A587 CD D3 91 call CursorSet +0214+ A58A C3 FA A4 jp .L201 +0215+ A58D +0216+ A58D 11 10 00 .L299 ld de,16 ;кол-во байт в строке +0217+ A590 2A 43 AB ld hl,(Dump1) ;адрес в первой строке +0218+ A593 ED 4B A0 A5 ld bc,(.Coordinate) +0219+ A597 78 ld a,b +0220+ A598 D6 16 sub 0x16 ;координата первой строки +0221+ A59A 47 ld b,a +0222+ A59B C8 ret z +0223+ A59C 19 add hl,de +0224+ A59D 10 FD djnz $-1 +0225+ A59F C9 ret +0226+ A5A0 +0227+ A5A0 01 16 .Coordinate dw 0x1601 ;курсор (стр/кол курсора) +0228+ A5A2 .Descript: +0229+ A5A2 1D 16 dw 0x161D ;первая/последняя строка окна +0230+ A5A4 21 db 33 ;кол-во колонок +0231+ A5A5 +0232+ A5A5 0E db 0x0E ;N столбца колонки +0233+ A5A6 05 db 5 ;ширина колонки +0234+ A5A7 15 02 17 02 db 0x15,2,0x17,2 +0235+ A5AB 1A 02 1C 02 db 0x1A,2,0x1C,2 +0236+ A5AF 1F 02 21 02 db 0x1F,2,0x21,2 +0237+ A5B3 24 02 26 02 db 0x24,2,0x26,2 +0238+ A5B7 29 02 2B 02 db 0x29,2,0x2B,2 +0239+ A5BB 2E 02 30 02 db 0x2E,2,0x30,2 +0240+ A5BF 33 02 35 02 db 0x33,2,0x35,2 +0241+ A5C3 38 02 3A 02 db 0x38,2,0x3A,2 +0242+ A5C7 db 0x3E,1,0x3F,1,0x40,1,0x41,1 +0242+ A5C7 3E013F0140014101 +0243+ A5CF db 0x42,1,0x43,1,0x44,1,0x45,1 +0243+ A5CF 4201430144014501 +0244+ A5D7 db 0x46,1,0x47,1,0x48,1,0x49,1 +0244+ A5D7 4601470148014901 +0245+ A5DF db 0x4A,1,0x4B,1,0x4C,1,0x4D,1 +0245+ A5DF 4A014B014C014D01 +0246+ A5E7 +0247+ A5E7 +0380 A5E7 include "rez.asm";"D:\WORKAST\DEMON\rez" +0001+ A5E7 ;[]=========================================================================[] +0002+ A5E7 ;[] Резидент отладчика [] +0003+ A5E7 ;[] v0.03 - последние изменения 24.02.2006 [] +0004+ A5E7 ;[] Принцип работы (два варианта): [] +0005+ A5E7 ;[] 1. Резидент расположен не во втором окне памяти (0x8000...0xBFFF) [] +0006+ A5E7 ;[] Из отладчика готовится резидент (настраиваются все адреса) и копируется [] +0007+ A5E7 ;[] по адресу расположения, управление из отладчика передается на метку [] +0008+ A5E7 ;[] Rezident.Start1, после чего происходит востановление банки памяти, рас- [] +0009+ A5E7 ;[] положенной под отладчиком и выполнение отлаживаемой команды. Возврат [] +0010+ A5E7 ;[] в резидент осуществляется на метку Rezident.RetIn1 и далее после вос- [] +0011+ A5E7 ;[] тановления банки с отладчиком возврат в отладчик. [] +0012+ A5E7 ;[] 2. Резидент расположен во втором окне памяти (0x8000...0xBFFF) [] +0013+ A5E7 ;[] Поскольку в этом окне работает сам отладчик, то переход в резидент и [] +0014+ A5E7 ;[] возврат в отладчик после трассировки команды выполняется при помощи [] +0015+ A5E7 ;[] вспомогательной процедуры длиной 7 байт расположеной по адресу [] +0016+ A5E7 ;[] AdrTmpBuf. После коррекции всех адресов в отладчике и сохранении акку- [] +0017+ A5E7 ;[] мулятора отлаживаемой программы по адресу Rezident+1 и пары HL по адре- [] +0018+ A5E7 ;[] ce Rezident+2 управление передается по адресу AdrTmpBuf, где расположен [] +0019+ A5E7 ;[] следующий код отключающий банку с отладчиком: [] +0020+ A5E7 ;[] ld a,НомерБанкиПодОтладчиком [] +0021+ A5E7 ;[] out (НомерПорта2Окна),a [] +0022+ A5E7 ;[] jp Rezident.Start [] +0023+ A5E7 ;[] Далее резидент востанавливает 7 байт запорченых вышепреведенной проце- [] +0024+ A5E7 ;[] дурой, а также пару HL и аккумулятор и переходит к трассировке. Возврат [] +0025+ A5E7 ;[] происходит на метку Rezident.RetIn, где после сохранения аккумулятора и [] +0026+ A5E7 ;[] пары HL сохраняется 7 байт памяти из адреса AdrTmpBuf и туда прописыва- [] +0027+ A5E7 ;[] ется код востановления банки с отладчиком: [] +0028+ A5E7 ;[] ld a,НомерБанкиСОтладчиком [] +0029+ A5E7 ;[] out (НомерПорта2Окна),a [] +0030+ A5E7 ;[] jp ВОтладчик [] +0031+ A5E7 ;[] После возврата в отладчик востанавливается память запорченая резидентом [] +0032+ A5E7 ;[] и временной процедурой [] +0033+ A5E7 ;[]=========================================================================[] +0034+ A5E7 AdrTmpBuf equ 0xFF00 +0035+ A5E7 Rezident: +0036+ A5E7 00 ds 11 +0037+ A5F2 +0038+ A5F2 21 00 00 .Start ld hl,0 ;вост. памяти запорченной при +0039+ A5F5 22 00 FF ld (AdrTmpBuf),hl ;размещении резидента +0040+ A5F8 21 00 00 ld hl,0 ;во 2-м окне +0041+ A5FB 22 02 FF ld (AdrTmpBuf+2),hl +0042+ A5FE 21 00 00 ld hl,0 +0043+ A601 22 04 FF ld (AdrTmpBuf+4),hl +0044+ A604 3E 00 ld a,0 +0045+ A606 32 06 FF ld (AdrTmpBuf+6),a +0046+ A609 2A E9 A5 .K2 ld hl,(Rezident+2) ;востановили HL +0047+ A60C 18 04 jr .K3 +0048+ A60E ;...востановить банку во 2-м окне +0049+ A60E 3E FF .Start1 ld a,0xFF ;банка под demon'ом +0050+ A610 D3 C2 out (EmmWin.P2),a +0051+ A612 3A E8 A5 .K3 ld a,(Rezident+1) ;востановим аккумулятор +0052+ A615 +0053+ A615 C3 00 00 .Step jp 0 ;переход на выполнение +0054+ A618 +0055+ A618 32 E8 A5 .RetIn ld (Rezident+1),a ;сохраним аккумулятор +0056+ A61B 22 E9 A5 .K4 ld (Rezident+2),hl ;сохраним HL +0057+ A61E 2A 00 FF ld hl,(AdrTmpBuf) ;сохранение памяти +0058+ A621 22 EB A5 .K5 ld (Rezident+4),hl +0059+ A624 2A 02 FF ld hl,(AdrTmpBuf+2) +0060+ A627 22 ED A5 ld (Rezident+6),hl +0061+ A62A 2A 04 FF ld hl,(AdrTmpBuf+4) +0062+ A62D 22 EF A5 ld (Rezident+8),hl +0063+ A630 3A 06 FF ld a,(AdrTmpBuf+6) +0064+ A633 32 F1 A5 ld (Rezident+10),a +0065+ A636 21 3E FF .BankD1 ld hl,0xFF3E ;ld a,0xFF - N банки с отладч +0066+ A639 22 00 FF ld (AdrTmpBuf),hl +0067+ A63C 21 D3 C2 ld hl,EmmWin.P2*256+0xD3 ;out (EmmWin.P2),a +0068+ A63F 22 02 FF ld (AdrTmpBuf+2),hl +0069+ A642 21 C3 00 .Return1 ld hl,0xC3 ;jp в отладчик +0070+ A645 22 04 FF ld (AdrTmpBuf+4),hl +0071+ A648 3E 00 ld a,0 +0072+ A64A 32 06 FF ld (AdrTmpBuf+6),a +0073+ A64D DB C2 in a,(EmmWin.P2) ;номер банки под demon'ом +0074+ A64F 32 E7 A5 .K6 ld (Rezident),a ;сохранили +0075+ A652 C3 00 FF jp AdrTmpBuf +0076+ A655 +0077+ A655 32 E8 A5 .RetIn1 ld (Rezident+1),a ;сохраним аккумулятор +0078+ A658 ;...сохранить банку из 2-го окна +0079+ A658 DB C2 in a,(EmmWin.P2) ;номер банки под demon'ом +0080+ A65A 32 E7 A5 .K1 ld (Rezident),a ;сохранили +0081+ A65D 3E FF .BankD ld a,0xFF ;банка с demon'ом +0082+ A65F D3 C2 out (EmmWin.P2),a +0083+ A661 +0084+ A661 C3 00 00 .Return jp 0 +0085+ A664 +0086+ A664 .End +0087+ A664 +0088+ A664 +0381 A664 include "step.asm";"D:\WORKAST\DEMON\step" +0001+ A664 ;[]=========================================================================[] +0002+ A664 ;[] Отладка команд программы [] +0003+ A664 ;[] v0.03 - последние изменения 10.03.2006 [] +0004+ A664 ;[] v0.10 - последние изменения 18.03.2006 [] +0005+ A664 ;[]=========================================================================[] +0006+ A664 Step: +0007+ A664 F3 di +0008+ A665 3A 41 AB ld a,(WinPage+2) ;банка под demon'ом +0009+ A668 32 0F A6 ld (Rezident.Start1+1),a ;в резидент ее +0010+ A66B 32 61 A9 ld (.BankP+1),a +0011+ A66E 3A 1E AB ld a,(BankDebug) ;банка с demon'ом +0012+ A671 32 5E A6 ld (Rezident.BankD+1),a ;в резидент ее +0013+ A674 32 38 A6 ld (Rezident.BankD1+2),a +0014+ A677 21 F8 A8 ld hl,Step.Run+3 ;точка возврата в отладчик +0015+ A67A 22 62 A6 ld (Rezident.Return+1),hl ;прописываем в резиденте +0016+ A67D 7D ld a,l +0017+ A67E 32 44 A6 ld (Rezident.Return1+2),a +0018+ A681 7C ld a,h +0019+ A682 32 49 A6 ld (Rezident.Return1+7),a +0020+ A685 2A 3D AB ld hl,(Reg._PC) +0021+ A688 22 16 A6 ld (Rezident.Step+1),hl ;адрес отлаживаемой команды +0022+ A68B +0023+ A68B 3A 2F AB ld a,(Reg._AF) ;флаг +0024+ A68E 47 ld b,a +0025+ A68F CD 6C 92 call Ld_a_hl +0026+ A692 ; ld a,(hl) ;код команды +0027+ A692 +0028+ A692 4F ld c,a +0029+ A693 E6 CF and 11001111b +0030+ A695 FE C5 cp 11000101b ;PUSH +0031+ A697 CC 67 A9 call z,.SpdInc +0032+ A69A FE C1 cp 11000001b ;POP +0033+ A69C CC 71 A9 call z,.SpdDec +0034+ A69F +0035+ A69F 79 ld a,c +0036+ A6A0 FE CD cp 0xCD ;CALL +0037+ A6A2 20 0A jr nz,.L7 +0038+ A6A4 3A 7B A9 ld a,(.Flag) +0039+ A6A7 3C inc a +0040+ A6A8 C2 FF A7 jp nz,.L2 ;без захода в подпрограмму +0041+ A6AB C3 EF A7 jp .L8 +0042+ A6AE FE C9 .L7 cp 0xC9 ;RET +0043+ A6B0 CA E2 A7 jp z,.L9 +0044+ A6B3 FE C3 cp 0xC3 ;JP +0045+ A6B5 CA F2 A7 jp z,.L8+3 +0046+ A6B8 FE 18 cp 0x18 ;JR +0047+ A6BA CA 48 A7 jp z,.L6 +0048+ A6BD FE 10 cp 0x10 ;DJNZ +0049+ A6BF 20 10 jr nz,.L18 +0050+ A6C1 3A 7B A9 ld a,(.Flag) +0051+ A6C4 3C inc a +0052+ A6C5 C2 FF A7 jp nz,.L2 ;без отладки цикла +0053+ A6C8 3A 2E AB ld a,(Reg._BC+1) +0054+ A6CB 3D dec a +0055+ A6CC 20 7A jr nz,.L6 +0056+ A6CE C3 FF A7 jp .L2 +0057+ A6D1 23 .L18 inc hl ;следующий байт соманды +0058+ A6D2 08 exa +0059+ A6D3 CD 6C 92 call Ld_a_hl +0060+ A6D6 4F ld c,a +0061+ A6D7 08 exa +0062+ A6D8 ; ld c,(hl) +0063+ A6D8 2B dec hl +0064+ A6D9 FE ED cp 0xED ;префикс для RETI, RETN +0065+ A6DB 20 0B jr nz,.L10 +0066+ A6DD 79 ld a,c +0067+ A6DE FE 4D cp 0x4D ;RETI +0068+ A6E0 CA E2 A7 jp z,.L9 +0069+ A6E3 FE 45 cp 0x45 ;RETN +0070+ A6E5 CA E2 A7 jp z,.L9 +0071+ A6E8 FE DD .L10 cp 0xDD ;префикс для IX +0072+ A6EA 20 11 jr nz,.L25 +0073+ A6EC 79 ld a,c +0074+ A6ED FE E5 cp 0xE5 ;PUSH IX +0075+ A6EF CC 67 A9 call z,.SpdInc +0076+ A6F2 FE E1 cp 0xE1 ;POP IX +0077+ A6F4 CC 71 A9 call z,.SpdDec +0078+ A6F7 ED 5B 25 AB ld de,(Reg._IX) +0079+ A6FB 18 19 jr .L24 +0080+ A6FD FE FD .L25 cp 0xFD ;префикс для IY +0081+ A6FF 20 11 jr nz,.L24-4 +0082+ A701 79 ld a,c +0083+ A702 FE E5 cp 0xE5 ;PUSH IY +0084+ A704 CC 67 A9 call z,.SpdInc +0085+ A707 FE E1 cp 0xE1 ;POP IY +0086+ A709 CC 71 A9 call z,.SpdDec +0087+ A70C ED 5B 27 AB ld de,(Reg._IY) +0088+ A710 18 04 jr .L24 +0089+ A712 ED 5B 29 AB ld de,(Reg._HL) +0090+ A716 FE E9 .L24 cp 0xE9 ;JP (HL/IX/IY) +0091+ A718 20 04 jr nz,.L23 +0092+ A71A EB ex de,hl +0093+ A71B C3 02 A8 jp .L2+3 +0094+ A71E FE 38 .L23 cp 0x38 ;JR C, +0095+ A720 20 07 jr nz,.L19 +0096+ A722 CB 40 bit 0,b ;флаг C +0097+ A724 CA FF A7 jp z,.L2 ;нет перехода +0098+ A727 18 1F jr .L6 ;переход +0099+ A729 FE 30 .L19 cp 0x30 ;JR NC, +0100+ A72B 20 07 jr nz,.L20 +0101+ A72D CB 40 bit 0,b ;флаг C +0102+ A72F C2 FF A7 jp nz,.L2 ;нет перехода +0103+ A732 18 14 jr .L6 ;переход +0104+ A734 FE 28 .L20 cp 0x28 ;JR Z, +0105+ A736 20 07 jr nz,.L21 +0106+ A738 CB 70 bit 6,b ;флаг Z +0107+ A73A CA FF A7 jp z,.L2 ;нет перехода +0108+ A73D 18 09 jr .L6 ;переход +0109+ A73F FE 20 .L21 cp 0x20 ;JR NZ, +0110+ A741 20 1E jr nz,.L22 +0111+ A743 CB 70 bit 6,b ;флаг Z +0112+ A745 C2 FF A7 jp nz,.L2 ;нет перехода +0113+ A748 +0114+ A748 23 .L6 inc hl +0115+ A749 CD 6C 92 call Ld_a_hl +0116+ A74C ; ld a,(hl) ;смещение +0117+ A74C 23 inc hl +0118+ A74D 06 00 ld b,0 +0119+ A74F 4F ld c,a +0120+ A750 CB 7F bit 7,a ;знак числа +0121+ A752 28 09 jr z,$+11 +0122+ A754 ED 44 neg +0123+ A756 B7 or a ;сброс флага C +0124+ A757 4F ld c,a +0125+ A758 ED 42 sbc hl,bc ;отрицательное смещение +0126+ A75A C3 02 A8 jp .L2+3 +0127+ A75D 09 add hl,bc ;положительное смещение +0128+ A75E C3 02 A8 jp .L2+3 +0129+ A761 +0130+ A761 E6 C7 .L22 and 11000111b +0131+ A763 FE C7 cp 11000111b ;RST x +0132+ A765 20 15 jr nz,.L27 +0133+ A767 3A 7B A9 ld a,(.Flag) +0134+ A76A 3C inc a +0135+ A76B C2 FF A7 jp nz,.L2 ;без захода в подпрограмму +0136+ A76E CD 67 A9 call .SpdInc +0137+ A771 CD 6C 92 call Ld_a_hl +0138+ A774 ; ld a,(hl) ;байт комнды +0139+ A774 E6 38 and 00111000b ;адрес перехода +0140+ A776 26 00 ld h,0 +0141+ A778 6F ld l,a +0142+ A779 C3 02 A8 jp .L2+3 +0143+ A77C FE C2 .L27 cp 11000010b ;JP flag +0144+ A77E 28 0E jr z,.L26 +0145+ A780 FE C0 cp 11000000b ;RET flag +0146+ A782 28 0A jr z,.L26 +0147+ A784 FE C4 cp 11000100b ;CALL flag +0148+ A786 20 77 jr nz,.L2 +0149+ A788 3A 7B A9 ld a,(.Flag) +0150+ A78B 3C inc a +0151+ A78C 20 71 jr nz,.L2 ;без захода в подпрограмму +0152+ A78E CD 6C 92 .L26 call Ld_a_hl +0153+ A791 ; ld a,(hl) ;код команды +0154+ A791 E6 38 and 00111000b ;флаги +0155+ A793 28 1E jr z,.L11 ;JP/CALL/RET NZ, +0156+ A795 FE 08 cp 00001000b +0157+ A797 28 20 jr z,.L12 ;JP/CALL/RET Z, +0158+ A799 FE 10 cp 00010000b +0159+ A79B 28 22 jr z,.L13 ;JP/CALL/RET NC, +0160+ A79D FE 18 cp 00011000b +0161+ A79F 28 24 jr z,.L14 ;JP/CALL/RET C, +0162+ A7A1 FE 20 cp 00100000b +0163+ A7A3 28 26 jr z,.L15 ;JP/CALL/RET PO, +0164+ A7A5 FE 28 cp 00101000b +0165+ A7A7 28 28 jr z,.L16 ;JP/CALL/RET PE, +0166+ A7A9 FE 30 cp 00110000b +0167+ A7AB 28 2A jr z,.L17 ;JP/CALL/RET P, +0168+ A7AD CB 78 bit 7,b ;JP/CALL/RET M, флаг S +0169+ A7AF 28 4E jr z,.L2 ;нет перехода +0170+ A7B1 18 28 jr .L5 ;переход +0171+ A7B3 CB 70 .L11 bit 6,b ;флаг Z +0172+ A7B5 20 48 jr nz,.L2 ;нет перехода +0173+ A7B7 18 22 jr .L5 ;переход +0174+ A7B9 CB 70 .L12 bit 6,b ;флаг Z +0175+ A7BB 28 42 jr z,.L2 ;нет перехода +0176+ A7BD 18 1C jr .L5 ;переход +0177+ A7BF CB 40 .L13 bit 0,b ;флаг C +0178+ A7C1 20 3C jr nz,.L2 ;нет перехода +0179+ A7C3 18 16 jr .L5 ;переход +0180+ A7C5 CB 40 .L14 bit 0,b ;флаг C +0181+ A7C7 28 36 jr z,.L2 ;нет перехода +0182+ A7C9 18 10 jr .L5 ;переход +0183+ A7CB CB 50 .L15 bit 2,b ;флаг P/V +0184+ A7CD 20 30 jr nz,.L2 ;нет перехода +0185+ A7CF 18 0A jr .L5 ;переход +0186+ A7D1 CB 50 .L16 bit 2,b ;флаг P/V +0187+ A7D3 28 2A jr z,.L2 ;нет перехода +0188+ A7D5 18 04 jr .L5 ;переход +0189+ A7D7 CB 78 .L17 bit 7,b ;флаг S +0190+ A7D9 20 24 jr nz,.L2 ;нет перехода +0191+ A7DB +0192+ A7DB CD 6C 92 .L5 call Ld_a_hl +0193+ A7DE ; ld a,(hl) ;код команды +0194+ A7DE E6 07 and 00000111b ;отследить RET'ы +0195+ A7E0 20 09 jr nz,.L8-4 +0196+ A7E2 CD 71 A9 .L9 call .SpdDec +0197+ A7E5 2A 3B AB ld hl,(Reg._SP) ;стек +0198+ A7E8 2B dec hl +0199+ A7E9 18 07 jr .L8+3 +0200+ A7EB FE 02 cp 00000010b ;отследить JP +0201+ A7ED 28 03 jr z,.L8+3 +0202+ A7EF CD 67 A9 .L8 call .SpdInc +0203+ A7F2 23 inc hl +0204+ A7F3 CD 6C 92 call Ld_a_hl +0205+ A7F6 47 ld b,a +0206+ A7F7 ; ld a,(hl) +0207+ A7F7 23 inc hl +0208+ A7F8 CD 6C 92 call Ld_a_hl +0209+ A7FB ; ld h,(hl) +0210+ A7FB 67 ld h,a +0211+ A7FC 68 ld l,b +0212+ A7FD 18 03 jr .L2+3 +0213+ A7FF CD 42 8A .L2 call List ;следующая команда +0214+ A802 22 3D AB ld (Reg._PC),hl ;новый PC +0215+ A805 E5 push hl +0216+ A806 E5 push hl +0217+ A807 3A C3 9B ld a,(KList.Descript) ;количество строк листинга +0218+ A80A CD D1 9B call AdrListTabl ;нижний адрес листинга +0219+ A80D ED 5B 55 AB ld de,(ListAdr) ;верхний адрес листинга +0220+ A811 C1 pop bc ;новый PC +0221+ A812 CD C4 92 call AdrArea +0222+ A815 30 04 jr nc,.L1+4 +0223+ A817 +0224+ A817 ED 43 55 AB .L1 ld (ListAdr),bc ;новая страница листинга +0225+ A81B E1 pop hl +0226+ A81C +0227+ A81C CD 6C 92 call Ld_a_hl ;следующие за командой байты +0228+ A81F 4F ld c,a +0229+ A820 23 inc hl +0230+ A821 CD 6C 92 call Ld_a_hl +0231+ A824 47 ld b,a +0232+ A825 23 inc hl +0233+ A826 CD 6C 92 call Ld_a_hl +0234+ A829 C5 push bc +0235+ A82A F5 push af +0236+ A82B E5 push hl +0237+ A82C +0238+ A82C E5 push hl +0239+ A82D 2A 20 AB ld hl,(RezAdr) ;адрес посадки резидента +0240+ A830 7C ld a,h +0241+ A831 E6 C0 and 11000000b +0242+ A833 FE 80 cp 10000000b ;окно посадки резидента +0243+ A835 3E FF ld a,0xFF ;FF - резидент во 2-м окне +0244+ A837 20 05 jr nz,.L30 +0245+ A839 11 31 00 ld de,Rezident.RetIn-Rezident +0246+ A83C 18 04 jr .L30+4 +0247+ A83E 11 6E 00 .L30 ld de,Rezident.RetIn1-Rezident +0248+ A841 3C inc a ;0 - резидент не во 2-м окне +0249+ A842 32 7C A9 ld (.WRez),a +0250+ A845 19 add hl,de ;адрес возврата в резидент +0251+ A846 EB ex de,hl +0252+ A847 E1 pop hl +0253+ A848 7A ld a,d ;прописываем после +0254+ A849 CD 97 92 call Ld_hl_a ;отлаживаемой команды +0255+ A84C 2B dec hl +0256+ A84D 7B ld a,e +0257+ A84E CD 97 92 call Ld_hl_a +0258+ A851 2B dec hl +0259+ A852 3E C3 ld a,0xC3 ;JP +0260+ A854 CD 97 92 call Ld_hl_a +0261+ A857 +0262+ A857 2A 20 AB ld hl,(RezAdr) ;адрес посадки +0263+ A85A E5 push hl ;коррекция адресов кода резидента +0264+ A85B 22 5B A6 ld (Rezident.K1+1),hl ;номер банки под отладчиком +0265+ A85E 22 50 A6 ld (Rezident.K6+1),hl +0266+ A861 23 inc hl +0267+ A862 22 13 A6 ld (Rezident.K3+1),hl ;аккумулятор прграммы +0268+ A865 22 19 A6 ld (Rezident.RetIn+1),hl +0269+ A868 22 56 A6 ld (Rezident.RetIn1+1),hl +0270+ A86B 23 inc hl +0271+ A86C 22 0A A6 ld (Rezident.K2+1),hl ;пара HL программы +0272+ A86F 22 1C A6 ld (Rezident.K4+1),hl +0273+ A872 23 inc hl +0274+ A873 23 inc hl +0275+ A874 22 22 A6 ld (Rezident.K5+1),hl ;1 и 2 байты буфера +0276+ A877 23 inc hl +0277+ A878 23 inc hl +0278+ A879 22 28 A6 ld (Rezident.K5+7),hl ;3 и 4 байты буфера +0279+ A87C 23 inc hl +0280+ A87D 23 inc hl +0281+ A87E 22 2E A6 ld (Rezident.K5+13),hl ;5 и 6 байты буфера +0282+ A881 23 inc hl +0283+ A882 23 inc hl +0284+ A883 22 34 A6 ld (Rezident.K5+19),hl ;7 байт буфера +0285+ A886 +0286+ A886 3A 7C A9 ld a,(.WRez) ;флаг посадки резидента +0287+ A889 B7 or a +0288+ A88A 20 09 jr nz,.L31 +0289+ A88C 11 27 00 ld de,Rezident.Start1-Rezident +0290+ A88F 2A 20 AB ld hl,(RezAdr) ;адрес посадки +0291+ A892 19 add hl,de ;старт резидента не во 2-м окне +0292+ A893 18 28 jr .L32 +0293+ A895 +0294+ A895 23 .L31 inc hl ;старт резидента во 2-м окне +0295+ A896 22 65 A9 ld (.Run1+1),hl +0296+ A899 +0297+ A899 21 00 FF ld hl,AdrTmpBuf +0298+ A89C 11 F3 A5 ld de,Rezident.Start+1 ;сохранение 7 байт в резиденте +0299+ A89F 06 03 ld b,3 +0300+ A8A1 7E .L33 ld a,(hl) +0301+ A8A2 12 ld (de),a +0302+ A8A3 23 inc hl +0303+ A8A4 13 inc de +0304+ A8A5 7E ld a,(hl) +0305+ A8A6 12 ld (de),a +0306+ A8A7 23 inc hl +0307+ A8A8 13 inc de +0308+ A8A9 13 inc de +0309+ A8AA 13 inc de +0310+ A8AB 13 inc de +0311+ A8AC 13 inc de +0312+ A8AD 10 F2 djnz .L33 +0313+ A8AF 7E ld a,(hl) +0314+ A8B0 12 ld (de),a +0315+ A8B1 +0316+ A8B1 11 66 A9 ld de,.Run1+2 ;вспомогательная процедура +0317+ A8B4 06 07 ld b,7 ;длина +0318+ A8B6 1A .L34 ld a,(de) +0319+ A8B7 77 ld (hl),a +0320+ A8B8 2B dec hl +0321+ A8B9 1B dec de +0322+ A8BA 10 FA djnz .L34 +0323+ A8BC 23 inc hl +0324+ A8BD +0325+ A8BD 22 F6 A8 .L32 ld (.Run+1),hl +0326+ A8C0 +0327+ A8C0 3A 30 AB ld a,(Reg._AF+1) ;аккумулятор программы +0328+ A8C3 32 E8 A5 ld (Rezident+1),a ;в резидент +0329+ A8C6 2A 29 AB ld hl,(Reg._HL) ;пара HL +0330+ A8C9 22 E9 A5 ld (Rezident+2),hl ;в резидент +0331+ A8CC +0332+ A8CC E1 pop hl ;адрес посадки резидента +0333+ A8CD 11 E7 A5 ld de,Rezident ;начало резидента +0334+ A8D0 01 7D A9 ld bc,.Buffer +0335+ A8D3 3E 7D ld a,Rezident.End-Rezident ;длина резидента +0336+ A8D5 F5 .L3 push af +0337+ A8D6 CD 6C 92 call Ld_a_hl +0338+ A8D9 02 ld (bc),a ;сохранение памяти под резидентом +0339+ A8DA 1A ld a,(de) ;копирование резидента +0340+ A8DB CD 97 92 call Ld_hl_a +0341+ A8DE 03 inc bc +0342+ A8DF 13 inc de +0343+ A8E0 23 inc hl +0344+ A8E1 F1 pop af +0345+ A8E2 3D dec a +0346+ A8E3 20 F0 jr nz,.L3 +0347+ A8E5 +0348+ A8E5 3A 3F AB ld a,(WinPage) ;банка в 0-ом окне +0349+ A8E8 D3 82 out (EmmWin.P0),a +0350+ A8EA +0351+ A8EA CD F5 8D call RestAllRegs +0352+ A8ED ED 73 1C AB ld (StackDebug),sp ;стек отладчика +0353+ A8F1 ED 7B 3B AB ld sp,(Reg._SP) ;стек программы +0354+ A8F5 C3 00 00 .Run jp 0 ;пуск резидента +0355+ A8F8 +0356+ A8F8 ED 73 3B AB ld (Reg._SP),sp ;стек программы +0357+ A8FC ED 7B 1C AB ld sp,(StackDebug) ;стек отладчика +0358+ A900 CD AC 8D call SaveAllRegs +0359+ A903 DB 82 in a,(EmmWin.P0) +0360+ A905 32 3F AB ld (WinPage),a ;банка в 0-ом окне +0361+ A908 3A 1F AB ld a,(BankOS) ;банка с OS +0362+ A90B D3 82 out (EmmWin.P0),a +0363+ A90D +0364+ A90D 2A 20 AB ld hl,(RezAdr) +0365+ A910 CD 6C 92 call Ld_a_hl +0366+ A913 32 41 AB ld (WinPage+2),a ;номер банки во 2-ом окне +0367+ A916 23 inc hl ;аккумулятор программа +0368+ A917 CD 6C 92 call Ld_a_hl +0369+ A91A 32 30 AB ld (Reg._AF+1),a +0370+ A91D 3A 7C A9 ld a,(.WRez) ;флаг резидента +0371+ A920 B7 or a +0372+ A921 28 1B jr z,.L35 ;не во 2-м окне +0373+ A923 23 inc hl ;регистр L программы +0374+ A924 CD 6C 92 call Ld_a_hl +0375+ A927 32 29 AB ld (Reg._HL),a +0376+ A92A 23 inc hl ;регистр H программы +0377+ A92B CD 6C 92 call Ld_a_hl +0378+ A92E 32 2A AB ld (Reg._HL+1),a +0379+ A931 06 07 ld b,7 +0380+ A933 11 00 FF ld de,AdrTmpBuf +0381+ A936 23 .L36 inc hl ;буфер 7-ми байт +0382+ A937 CD 6C 92 call Ld_a_hl +0383+ A93A 12 ld (de),a ;востановили +0384+ A93B 13 inc de +0385+ A93C 10 F8 djnz .L36 +0386+ A93E +0387+ A93E E1 .L35 pop hl +0388+ A93F F1 pop af ;востановили код команды +0389+ A940 C1 pop bc +0390+ A941 CD 97 92 call Ld_hl_a +0391+ A944 2B dec hl +0392+ A945 78 ld a,b +0393+ A946 CD 97 92 call Ld_hl_a +0394+ A949 2B dec hl +0395+ A94A 79 ld a,c +0396+ A94B CD 97 92 call Ld_hl_a +0397+ A94E +0398+ A94E 11 7D A9 ld de,.Buffer ;восстановление памяти под резидентом +0399+ A951 2A 20 AB ld hl,(RezAdr) ;адрес посадки +0400+ A954 06 7D ld b,Rezident.End-Rezident ;длина резидента +0401+ A956 1A .L4 ld a,(de) +0402+ A957 CD 97 92 call Ld_hl_a +0403+ A95A 13 inc de +0404+ A95B 23 inc hl +0405+ A95C 10 F8 djnz .L4 +0406+ A95E FB ei +0407+ A95F C9 ret +0408+ A960 +0409+ A960 3E FF .BankP ld a,0xFF ;(2) банка под отладчиком +0410+ A962 D3 C2 out (EmmWin.P2),a ;(2) +0411+ A964 C3 00 00 .Run1 jp 0 ;(3) переход в резидент +0412+ A967 +0413+ A967 F5 .SpdInc push af ;увеличение глубины стека +0414+ A968 3A 22 AB ld a,(StackDown) +0415+ A96B 3C inc a +0416+ A96C 32 22 AB ld (StackDown),a +0417+ A96F F1 pop af +0418+ A970 C9 ret +0419+ A971 +0420+ A971 F5 .SpdDec push af ;уменьшение глубины стека +0421+ A972 3A 22 AB ld a,(StackDown) +0422+ A975 3D dec a +0423+ A976 32 22 AB ld (StackDown),a +0424+ A979 F1 pop af +0425+ A97A C9 ret +0426+ A97B +0427+ A97B FF .Flag db On ;флаг захода в подпрограммы +0428+ A97C 00 .WRez db 0 ;флаг окна посадки резидента +0429+ A97D +0430+ A97D 00 .Buffer ds Rezident.End-Rezident ;длина резидента +0431+ A9FA +0432+ A9FA +0382 A9FA include "savescr.asm";"D:\WORKAST\DEMON\savescr" +0001+ A9FA ;[]=========================================================================[] +0002+ A9FA ;[] Сохранение экрана в файл [] +0003+ A9FA ;[] v0.03 - последние изменения 11.03.2006 [] +0004+ A9FA ;[]=========================================================================[] +0005+ A9FA SaveScr: +0006+ A9FA 01 3D 01 ld bc,1*256+Dss.GetMem +0007+ A9FD D7 rst DssRst ;выделение банки памяти +0008+ A9FE D8 ret c ;выход с ошибкой +0009+ A9FF 32 5A AA ld (.Id),a +0010+ AA02 01 3B 00 ld bc,Dss.SetWin3 +0011+ AA05 D7 rst DssRst ;включение банки в 3-е окно +0012+ AA06 32 5B AA ld (.Id+1),a ;замещаемая страница +0013+ AA09 11 00 00 ld de,0 ;позиция на экране +0014+ AA0C 21 00 C0 ld hl,0xC000 +0015+ AA0F D5 .L1 push de +0016+ AA10 E5 push hl +0017+ AA11 0E 57 ld c,Dss.RdChar +0018+ AA13 D7 rst DssRst ;считать символ с экрана +0019+ AA14 E1 pop hl +0020+ AA15 D1 pop de +0021+ AA16 77 ld (hl),a +0022+ AA17 23 inc hl +0023+ AA18 1C inc e +0024+ AA19 7B ld a,e +0025+ AA1A FE 50 cp 0x50 ;закончилась строка? +0026+ AA1C 20 F1 jr nz,.L1 +0027+ AA1E 01 0A 0D ld bc,0x0D0A ;конец строки +0028+ AA21 70 ld (hl),b +0029+ AA22 23 inc hl +0030+ AA23 71 ld (hl),c +0031+ AA24 23 inc hl +0032+ AA25 1E 00 ld e,0 ;начало строки +0033+ AA27 14 inc d +0034+ AA28 7A ld a,d +0035+ AA29 FE 20 cp 0x20 ;конец экрана? +0036+ AA2B 20 E2 jr nz,.L1 +0037+ AA2D +0038+ AA2D 21 50 AA ld hl,.NameF ;имя файла +0039+ AA30 AF xor a ;атрибут +0040+ AA31 0E 0A ld c,Dss.Create +0041+ AA33 D7 rst DssRst +0042+ AA34 38 0E jr c,.L2 ;ошибка +0043+ AA36 F5 push af +0044+ AA37 21 00 C0 ld hl,0xC000 ;начало записываемой памяти +0045+ AA3A 11 40 0A ld de,82*32 ;размер записываемой инфы +0046+ AA3D 0E 14 ld c,Dss.Write +0047+ AA3F D7 rst DssRst ;записать +0048+ AA40 F1 pop af +0049+ AA41 0E 12 ld c,Dss.Close +0050+ AA43 D7 rst DssRst ;закрыть файл +0051+ AA44 +0052+ AA44 3A 5A AA .L2 ld a,(.Id) ;id памяти +0053+ AA47 0E 3E ld c,Dss.FreeMem +0054+ AA49 D7 rst DssRst ;освободить память +0055+ AA4A 3A 5B AA ld a,(.Id+1) +0056+ AA4D D3 E2 out (EmmWin.P3),a ;востановили банку +0057+ AA4F C9 ret +0058+ AA50 +0059+ AA50 .NameF db "demon.$$$",0 +0059+ AA50 64656D6F6E2E24242400 +0060+ AA5A 00 .Id ds 2 ;id выделенного блока +0061+ AA5C +0062+ AA5C ;11:11 18.02.2011 Заглушка Не было исходника :( +0063+ AA5C ; include "d:\workast\demon\screen\scrdemon" +0064+ AA5C +0065+ AA5C +0383 AA5C include "data.asm";"D:\WORKAST\DEMON\data" +0001+ AA5C ;[]=========================================================================[] +0002+ AA5C ;[] Данные монитора-отладчика DemoN [] +0003+ AA5C ;[] v0.01 - последние изменения 10.10.2004 [] +0004+ AA5C ;[] v0.02 - последние изменения 11.03.2005 [] +0005+ AA5C ;[] v0.03 - последние изменения 05.02.2006 [] +0006+ AA5C ;[] v0.10 - последние изменения 10.09.2006 [] +0007+ AA5C ;[]=========================================================================[] +0008+ AA5C B0 SymbolNoPrint db #b0;"." ;символы < пробела +0009+ AA5D FF ClockOn db On ;признак вывода часов +0010+ AA5E 00 DemonScreen db 0 ;номер экрана отладчика +0011+ AA5F 00 OSScreen db 0 ;Номер экрана ОСи +0012+ AA60 00 OSGrafMode db 0 ;Графический режим оси +0013+ AA61 FF BufPage db 255 ;Номер страницы с оконным буфером +0014+ AA62 +0015+ AA62 0D 0A Hello db 13,10 +0016+ AA64 ; db "Версия откомпилирована специально для Василия Иванова!",13,10,10 +0017+ AA64 db "DemoN v" +0017+ AA64 44656D6F4E2076 +0018+ AA6B incbin "VERSION\major.bin" +0019+ AA6C 2E db "." +0020+ AA6D incbin "VERSION\minor.bin" +0021+ AA6F db " build " +0021+ AA6F 206275696C6420 +0022+ AA76 incbin "VERSION\build.bin" +0023+ AA7A db " (alpha) ",13,10 +0023+ AA7A 2028616C70686129203C4372656174656420627920416C706861205374756469 +0023+ AA9A 6F3E0D0A +0024+ AA9E db "Last edition " +0024+ AA9E 4C6173742065646974696F6E20 +0025+ AAAB incbin "VERSION\date.bin" +0026+ AAB1 db " (BLR " +0026+ AAB1 2028424C5220 +0027+ AAB7 incbin "VERSION\time.bin" +0028+ AABC 29 0D 0A db ")",13,10 +0029+ AABF db "FidoNet: Igor Zhadinets 2:454/5.18; " +0029+ AABF 4669646F4E65743A2049676F72205A686164696E65747320323A3435342F352E +0029+ AADF 31383B20 +0030+ AAE3 db "e-mail: igor_ast@tut.by",13,10,10,0 +0030+ AAE3 652D6D61696C3A2069676F725F617374407475742E62790D0A0A00 +0031+ AAFE Str: +0032+ AAFE .Load db "Load file ...",0x0D,0x0A,0 +0032+ AAFE 4C6F61642066696C65202E2E2E0D0A00 +0033+ AB0E 0D 0A 00 .DA db 0x0d,0x0A,0 +0034+ AB11 +0035+ AB11 PauseFlash equ 16 ;частота мигания прогр.курсора +0036+ AB11 +0037+ AB11 Color: +0038+ AB11 07 .Screen db 00000111b ;основной цвет экрана +0039+ AB12 03 .Border db 00000011b ;цвет рамки +0040+ AB13 02 .TextStrReg db 00000010b ;цвет регистровых пар +0041+ AB14 05 .TextStrWin db 00000101b ;цвет номеров окон +0042+ AB15 06 ._SP db 00000110b ;подсветка вершины стека +0043+ AB16 71 ._PC db 01110001b ;подсветка выполняемой стр. +0044+ AB17 0E .RezArea db 00001110b ;подсветка резидента +0045+ AB18 04 .TextStrLogo db 00000100b ;цвет лого программы +0046+ AB19 1D .Cursor db 00011101b ;цвет курсора-указателя +0047+ AB1A 3F .InLine db 00111111b ;цвет строки ввода +0048+ AB1B 31 .InLineEd db 00110001b ;цвет строки ввода при ред. +0049+ AB1C +0050+ AB1C 00 StackDebug ds 2 ;адрес стека отладчика +0051+ AB1E 00 BankDebug ds 1 ;номер банки отладчика +0052+ AB1F 00 BankOS ds 1 ;номер банки с OS +0053+ AB20 00 70 RezAdr dw 0x7000 ;адрес посадки резидента +0054+ AB22 00 StackDown ds 1 ;глубина стека +0055+ AB23 0A 80 StackDump dw 0x800A ;начало дампа стека +0056+ AB25 +0057+ AB25 Reg: ;значение регистровых пар +0058+ AB25 00 00 ._IX dw 0 +0059+ AB27 00 00 ._IY dw 0 +0060+ AB29 00 00 ._HL dw 0 +0061+ AB2B 00 00 ._DE dw 0 +0062+ AB2D 00 00 ._BC dw 0 +0063+ AB2F 00 00 ._AF dw 0 +0064+ AB31 00 00 ._HL_ dw 0 +0065+ AB33 00 00 ._DE_ dw 0 +0066+ AB35 00 00 ._BC_ dw 0 +0067+ AB37 00 00 ._AF_ dw 0 +0068+ AB39 00 00 ._IR dw 0 +0069+ AB3B FE 7F ._SP dw 0x7FFE +0070+ AB3D 00 00 ._PC dw 0 +0071+ AB3F +0072+ AB3F FF FF FF FF WinPage: db 0xFF,0xFF,0xFF,0xFF ;адреса подключенных страниц +0073+ AB43 +0074+ AB43 00 40 Dump1 dw 0x4000 ;адрес начала динамического дампа +0075+ AB45 Dump: ;адреса начала строк дампа +0076+ AB45 B8 9E dw InputLine.Buffer;0x4100 +0077+ AB47 C8 9E dw InputLine.Buffer+16;0x8100 +0078+ AB49 2C 9C dw PutCode.Buffer;0xC100 +0079+ AB4B 80 52 dw 0x5280 +0080+ AB4D 80 92 dw 0x9280 +0081+ AB4F 80 D2 dw 0xD280 +0082+ AB51 00 60 dw 0x6000 +0083+ AB53 00 A0 dw 0xA000 +0084+ AB55 +0085+ AB55 00 ListAdr: ds 40 ;буфер хранения адресов листинга +0086+ AB7D FF ListFormat: db -1 ;форматный вывод листинга +0087+ AB7E ;-1 - да; 0 - нет +0088+ AB7E +0089+ AB7E 00 DecHex db 0 ;0-HEX FF-DEC система +0090+ AB7F +0091+ AB7F ;======== Констатнты ====== +0092+ AB7F On equ 0xFF +0093+ AB7F Off equ 0 +0094+ AB7F Ins equ 0 +0095+ AB7F Ovr equ 0xFF +0096+ AB7F SysSymb equ 0x1B ;системный знакогенератор +0097+ AB7F +0098+ AB7F ;печать через п/п биоса +0099+ AB7F ifdef D_PRINTCH_BIOS +0100+ AB7F~ Demon.Bios_Win db 0 ;идентификатор окна биоса +0101+ AB7F~ MainWin db 80,32,0,0,00110000b,0,0,0 +0102+ AB7F~ ds 26,0 +0103+ AB7F endif +0104+ AB7F +0105+ AB7F ;-------------------------------------- +0106+ AB7F ;Диалоговое окно для пп выхода +0107+ AB7F ;-------------------------------------- +0108+ AB7F ExitDlg db 6,22,13,32,6,#40 +0108+ AB7F 06160D200640 +0109+ AB85 db "Confirmation",0 +0109+ AB85 436F6E6669726D6174696F6E00 +0110+ AB92 db " You really want to quit?" +0110+ AB92 2020596F75207265616C6C792077616E7420746F20717569743F +0111+ ABAC db 0x16,32,17,"OK Cancel",0 +0111+ ABAC 1620114F4B20202020202043616E63656C00 +0112+ ABBE 02 db 2 +0113+ ABBF 1D 11 08 02 db 29,17,8,2 ;Ok +0114+ ABC3 00 00 00 00 dw 0,0 +0115+ ABC7 27 11 08 02 db 39,17,8,2 ;Cancel +0116+ ABCB 00 00 1E 99 dw 0,Keyb.NoExit +0384 ABCF include "tabl.asm";"D:\WORKAST\DEMON\tabl" +0001+ ABCF ;[]=========================================================================[] +0002+ ABCF ;[] Таблицы дизассемблера монитора-отладчика DemoN [] +0003+ ABCF ;[] v0.01 - последние изменения 10.10.2004 [] +0004+ ABCF ;[] v0.02 - последние изменения 29.11.2004 [] +0005+ ABCF ;[] v0.03 - последние изменения 29.01.2006 [] +0006+ ABCF ;[]=========================================================================[] +0007+ ABCF Tabl00_3F: +0008+ ABCF dw M00,M01,M02,M03,M04,M05,M06,M07,M08,M09,M0A,M0B,M0C,M0D,M0E,M0F +0008+ ABCF 4FAC53AC5AAC64AC6BAC71AC77AC7DAC82AC8CAC96ACA0ACA7ACADACB3ACB9AC +0009+ ABEF dw M10,M11,M12,M13,M14,M15,M16,M17,M18,M19,M1A,M1B,M1C,M1D,M1E,M1F +0009+ ABEF BEACC4ACCBACD5ACDCACE2ACE8ACEEACF2ACF6AC00AD0AAD11AD17AD1DAD23AD +0010+ AC0F dw M20,M21,M22,M23,M24,M25,M26,M27,M28,M29,M2A,M2B,M2C,M2D,M2E,M2F +0010+ AC0F 27AD2EAD35AD3EAD45AD4BAD51AD57AD5BAD61AD6BAD74AD7BAD81AD87AD8DAD +0011+ AC2F dw M30,M31,M32,M33,M34,M35,M36,M37,M38,M39,M3A,M3B,M3C,M3D,M3E,M3F +0011+ AC2F 91AD98AD9FADA7ADAEADB7ADC0ADC9ADCDADD3ADDDADE5ADECADF2ADF8ADFEAD +0012+ AC4F +0013+ AC4F 4E 4F 50 00 M00 db "NOP",0 +0014+ AC53 M01 db "LD BC,",2 +0014+ AC53 4C442042432C02 +0015+ AC5A M02 db "LD (BC),A",0 +0015+ AC5A 4C4420284243292C4100 +0016+ AC64 M03 db "INC BC",0 +0016+ AC64 494E4320424300 +0017+ AC6B M04 db "INC B",0 +0017+ AC6B 494E43204200 +0018+ AC71 M05 db "DEC B",0 +0018+ AC71 444543204200 +0019+ AC77 M06 db "LD B,",1 +0019+ AC77 4C4420422C01 +0020+ AC7D 524C434100 M07 db "RLCA",0 +0021+ AC82 M08 db "EX AF,AF'",0 +0021+ AC82 45582041462C41462700 +0022+ AC8C M09 db "ADD HL,BC",0 +0022+ AC8C 41444420484C2C424300 +0023+ AC96 M0A db "LD A,(BC)",0 +0023+ AC96 4C4420412C2842432900 +0024+ ACA0 M0B db "DEC BC",0 +0024+ ACA0 44454320424300 +0025+ ACA7 M0C db "INC C",0 +0025+ ACA7 494E43204300 +0026+ ACAD M0D db "DEC C",0 +0026+ ACAD 444543204300 +0027+ ACB3 M0E db "LD C,",1 +0027+ ACB3 4C4420432C01 +0028+ ACB9 5252434100 M0F db "RRCA",0 +0029+ ACBE M10 db "DJNZ ",3 +0029+ ACBE 444A4E5A2003 +0030+ ACC4 M11 db "LD DE,",2 +0030+ ACC4 4C442044452C02 +0031+ ACCB M12 db "LD (DE),A",0 +0031+ ACCB 4C4420284445292C4100 +0032+ ACD5 M13 db "INC DE",0 +0032+ ACD5 494E4320444500 +0033+ ACDC M14 db "INC D",0 +0033+ ACDC 494E43204400 +0034+ ACE2 M15 db "DEC D",0 +0034+ ACE2 444543204400 +0035+ ACE8 M16 db "LD D,",1 +0035+ ACE8 4C4420442C01 +0036+ ACEE 52 4C 41 00 M17 db "RLA",0 +0037+ ACF2 4A 52 20 03 M18 db "JR ",3 +0038+ ACF6 M19 db "ADD HL,DE",0 +0038+ ACF6 41444420484C2C444500 +0039+ AD00 M1A db "LD A,(DE)",0 +0039+ AD00 4C4420412C2844452900 +0040+ AD0A M1B db "DEC DE",0 +0040+ AD0A 44454320444500 +0041+ AD11 M1C db "INC E",0 +0041+ AD11 494E43204500 +0042+ AD17 M1D db "DEC E",0 +0042+ AD17 444543204500 +0043+ AD1D M1E db "LD E,",1 +0043+ AD1D 4C4420452C01 +0044+ AD23 52 52 41 00 M1F db "RRA",0 +0045+ AD27 M20 db "JR NZ,",3 +0045+ AD27 4A52204E5A2C03 +0046+ AD2E M21 db "LD HL,",2 +0046+ AD2E 4C4420484C2C02 +0047+ AD35 M22 db "LD (),HL",5 +0047+ AD35 4C442028292C484C05 +0048+ AD3E M23 db "INC HL",0 +0048+ AD3E 494E4320484C00 +0049+ AD45 M24 db "INC H",0 +0049+ AD45 494E43204800 +0050+ AD4B M25 db "DEC H",0 +0050+ AD4B 444543204800 +0051+ AD51 M26 db "LD H,",1 +0051+ AD51 4C4420482C01 +0052+ AD57 44 41 41 00 M27 db "DAA",0 +0053+ AD5B M28 db "JR Z,",3 +0053+ AD5B 4A52205A2C03 +0054+ AD61 M29 db "ADD HL,HL",0 +0054+ AD61 41444420484C2C484C00 +0055+ AD6B M2A db "LD HL,()",5 +0055+ AD6B 4C4420484C2C282905 +0056+ AD74 M2B db "DEC HL",0 +0056+ AD74 44454320484C00 +0057+ AD7B M2C db "INC L",0 +0057+ AD7B 494E43204C00 +0058+ AD81 M2D db "DEC L",0 +0058+ AD81 444543204C00 +0059+ AD87 M2E db "LD L,",1 +0059+ AD87 4C44204C2C01 +0060+ AD8D 43 50 4C 00 M2F db "CPL",0 +0061+ AD91 M30 db "JR NC,",3 +0061+ AD91 4A52204E432C03 +0062+ AD98 M31 db "LD SP,",2 +0062+ AD98 4C442053502C02 +0063+ AD9F M32 db "LD (),A",5 +0063+ AD9F 4C442028292C4105 +0064+ ADA7 M33 db "INC SP",0 +0064+ ADA7 494E4320535000 +0065+ ADAE M34 db "INC (HL)",0 +0065+ ADAE 494E432028484C2900 +0066+ ADB7 M35 db "DEC (HL)",0 +0066+ ADB7 4445432028484C2900 +0067+ ADC0 M36 db "LD (HL),",1 +0067+ ADC0 4C442028484C292C01 +0068+ ADC9 53 43 46 00 M37 db "SCF",0 +0069+ ADCD M38 db "JR C,",3 +0069+ ADCD 4A5220432C03 +0070+ ADD3 M39 db "ADD HL,SP",0 +0070+ ADD3 41444420484C2C535000 +0071+ ADDD M3A db "LD A,()",5 +0071+ ADDD 4C4420412C282905 +0072+ ADE5 M3B db "DEC SP",0 +0072+ ADE5 44454320535000 +0073+ ADEC M3C db "INC A",0 +0073+ ADEC 494E43204100 +0074+ ADF2 M3D db "DEC A",0 +0074+ ADF2 444543204100 +0075+ ADF8 M3E db "LD A,",1 +0075+ ADF8 4C4420412C01 +0076+ ADFE 43 43 46 00 M3F db "CCF",0 +0077+ AE02 +0078+ AE02 TablC0_FF: +0079+ AE02 dw MC0,MC1,MC2,MC3,MC4,MC5,MC6,MC7,MC8,MC9,MCA,M00,MCC,MCD,MCE,MCF +0079+ AE02 82AE89AE90AE97AE9BAEA4AEACAEB3AEB9AEBFAEC3AE4FACC9AED1AED7AEDEAE +0080+ AE22 dw MD0,MD1,MD2,MD3,MD4,MD5,MD6,MD7,MD8,MD9,MDA,MDB,MDC,MDD,MDE,MDF +0080+ AE22 E4AEEBAEF2AEF9AE02AF0BAF13AF18AF20AF26AF2AAF30AF38AF40AF43AF4AAF +0081+ AE42 dw ME0,ME1,ME2,ME3,ME4,ME5,ME6,ME7,ME8,ME9,MEA,MEB,MEC,M00,MEE,MEF +0081+ AE42 52AF59AF60AF67AF72AF7BAF83AF88AF90AF97AF9FAFA6AFAFAF4FACB8AFBDAF +0082+ AE62 dw MF0,MF1,MF2,MF3,MF4,MF5,MF6,MF7,MF8,MF9,MFA,MFB,MFC,MFD,MFE,MFF +0082+ AE62 C5AFCBAFD2AFD8AFDBAFE3AFEBAFEFAFF7AFFDAF06B00CB00FB017B01AB01EB0 +0083+ AE82 +0084+ AE82 MC0 db "RET NZ",0 +0084+ AE82 524554204E5A00 +0085+ AE89 MC1 db "POP BC",0 +0085+ AE89 504F5020424300 +0086+ AE90 MC2 db "JP NZ,",2 +0086+ AE90 4A50204E5A2C02 +0087+ AE97 4A 50 20 02 MC3 db "JP ",2 +0088+ AE9B MC4 db "CALL NZ,",2 +0088+ AE9B 43414C4C204E5A2C02 +0089+ AEA4 MC5 db "PUSH BC",0 +0089+ AEA4 5055534820424300 +0090+ AEAC MC6 db "ADD A,",1 +0090+ AEAC 41444420412C01 +0091+ AEB3 MC7 db "RST 0",0 +0091+ AEB3 525354203000 +0092+ AEB9 MC8 db "RET Z",0 +0092+ AEB9 524554205A00 +0093+ AEBF 52 45 54 00 MC9 db "RET",0 +0094+ AEC3 MCA db "JP Z,",2 +0094+ AEC3 4A50205A2C02 +0095+ AEC9 MCC db "CALL Z,",2 +0095+ AEC9 43414C4C205A2C02 +0096+ AED1 MCD db "CALL ",2 +0096+ AED1 43414C4C2002 +0097+ AED7 MCE db "ADC A,",1 +0097+ AED7 41444320412C01 +0098+ AEDE MCF db "RST 8",0 +0098+ AEDE 525354203800 +0099+ AEE4 MD0 db "RET NC",0 +0099+ AEE4 524554204E4300 +0100+ AEEB MD1 db "POP DE",0 +0100+ AEEB 504F5020444500 +0101+ AEF2 MD2 db "JP NC,",2 +0101+ AEF2 4A50204E432C02 +0102+ AEF9 MD3 db "OUT (),A",4 +0102+ AEF9 4F55542028292C4104 +0103+ AF02 MD4 db "CALL NC,",2 +0103+ AF02 43414C4C204E432C02 +0104+ AF0B MD5 db "PUSH DE",0 +0104+ AF0B 5055534820444500 +0105+ AF13 5355422001 MD6 db "SUB ",1 +0106+ AF18 MD7 db "RST #10",0 +0106+ AF18 5253542023313000 +0107+ AF20 MD8 db "RET C",0 +0107+ AF20 524554204300 +0108+ AF26 45 58 58 00 MD9 db "EXX",0 +0109+ AF2A MDA db "JP C,",2 +0109+ AF2A 4A5020432C02 +0110+ AF30 MDB db "IN A,()",4 +0110+ AF30 494E20412C282904 +0111+ AF38 MDC db "CALL C,",2 +0111+ AF38 43414C4C20432C02 +0112+ AF40 44 44 00 MDD db "DD",0 +0113+ AF43 MDE db "SBC A,",1 +0113+ AF43 53424320412C01 +0114+ AF4A MDF db "RST #18",0 +0114+ AF4A 5253542023313800 +0115+ AF52 ME0 db "RET PO",0 +0115+ AF52 52455420504F00 +0116+ AF59 ME1 db "POP HL",0 +0116+ AF59 504F5020484C00 +0117+ AF60 ME2 db "JP PO,",2 +0117+ AF60 4A5020504F2C02 +0118+ AF67 ME3 db "EX (SP),HL",0 +0118+ AF67 455820285350292C484C00 +0119+ AF72 ME4 db "CALL PO,",2 +0119+ AF72 43414C4C20504F2C02 +0120+ AF7B ME5 db "PUSH HL",0 +0120+ AF7B 5055534820484C00 +0121+ AF83 414E442001 ME6 db "AND ",1 +0122+ AF88 ME7 db "RST #20",0 +0122+ AF88 5253542023323000 +0123+ AF90 ME8 db "RET PE",0 +0123+ AF90 52455420504500 +0124+ AF97 ME9 db "JP (HL)",0 +0124+ AF97 4A502028484C2900 +0125+ AF9F MEA db "JP PE,",2 +0125+ AF9F 4A502050452C02 +0126+ AFA6 MEB db "EX DE,HL",0 +0126+ AFA6 45582044452C484C00 +0127+ AFAF MEC db "CALL PE,",2 +0127+ AFAF 43414C4C2050452C02 +0128+ AFB8 584F522001 MEE db "XOR ",1 +0129+ AFBD MEF db "RST #28",0 +0129+ AFBD 5253542023323800 +0130+ AFC5 MF0 db "RET P",0 +0130+ AFC5 524554205000 +0131+ AFCB MF1 db "POP AF",0 +0131+ AFCB 504F5020414600 +0132+ AFD2 MF2 db "JP P,",2 +0132+ AFD2 4A5020502C02 +0133+ AFD8 44 49 00 MF3 db "DI",0 +0134+ AFDB MF4 db "CALL P,",2 +0134+ AFDB 43414C4C20502C02 +0135+ AFE3 MF5 db "PUSH AF",0 +0135+ AFE3 5055534820414600 +0136+ AFEB 4F 52 20 01 MF6 db "OR ",1 +0137+ AFEF MF7 db "RST #30",0 +0137+ AFEF 5253542023333000 +0138+ AFF7 MF8 db "RET M",0 +0138+ AFF7 524554204D00 +0139+ AFFD MF9 db "LD SP,HL",0 +0139+ AFFD 4C442053502C484C00 +0140+ B006 MFA db "JP M,",2 +0140+ B006 4A50204D2C02 +0141+ B00C 45 49 00 MFB db "EI",0 +0142+ B00F MFC db "CALL M,",2 +0142+ B00F 43414C4C204D2C02 +0143+ B017 46 44 00 MFD db "FD",0 +0144+ B01A 43 50 20 01 MFE db "CP ",1 +0145+ B01E MFF db "RST #38",0 +0145+ B01E 5253542023333800 +0146+ B026 +0147+ B026 48414C5400 MHALT db "HALT",0 +0148+ B02B +0149+ B02B TablM: +0150+ B02B dw M80,M88,M90,M98,MA0,MA8,MB0,MB8 +0150+ B02B 3BB042B049B04EB055B05AB05FB063B0 +0151+ B03B +0152+ B03B M80 db "ADD A,",0 +0152+ B03B 41444420412C00 +0153+ B042 M88 db "ADC A,",0 +0153+ B042 41444320412C00 +0154+ B049 5355422000 M90 db "SUB ",0 +0155+ B04E M98 db "SBC A,",0 +0155+ B04E 53424320412C00 +0156+ B055 414E442000 MA0 db "AND ",0 +0157+ B05A 584F522000 MA8 db "XOR ",0 +0158+ B05F 4F 52 20 00 MB0 db "OR ",0 +0159+ B063 43 50 20 00 MB8 db "CP ",0 +0160+ B067 +0161+ B067 CodeDDFD: +0162+ B067 db 0x09,0x19,0x21,0x22,0x23,0x24,0x25,0x26,0x29 +0162+ B067 091921222324252629 +0163+ B070 db 0x2A,0x2B,0x2C,0x2D,0x2E,0x34,0x35,0x36,0x39 +0163+ B070 2A2B2C2D2E34353639 +0164+ B079 db 0x44,0x45,0x46,0x4C,0x4D,0x4E,0x54,0x55,0x56 +0164+ B079 4445464C4D4E545556 +0165+ B082 db 0x5C,0x5D,0x5E,0x60,0x61,0x62,0x63,0x64,0x65 +0165+ B082 5C5D5E606162636465 +0166+ B08B db 0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E +0166+ B08B 666768696A6B6C6D6E +0167+ B094 db 0x6F,0x70,0x71,0x72,0x73,0x74,0x75,0x77,0x7C +0167+ B094 6F707172737475777C +0168+ B09D db 0x7D,0x7E,0x84,0x85,0x86,0x8C,0x8D,0x8E,0x94 +0168+ B09D 7D7E8485868C8D8E94 +0169+ B0A6 db 0x95,0x96,0x9C,0x9D,0x9E,0xA4,0xA5,0xA6,0xAC +0169+ B0A6 95969C9D9EA4A5A6AC +0170+ B0AF db 0xAD,0xAE,0xB4,0xB5,0xB6,0xBC,0xBD,0xBE,0xE1 +0170+ B0AF ADAEB4B5B6BCBDBEE1 +0171+ B0B8 E3 E5 E9 F9 db 0xE3,0xE5,0xE9,0xF9 +0172+ B0BC +0173+ B0BC TablDDFD: +0174+ B0BC dw DD09,DD19,DD21,DD22,DD23,DD24,DD25,DD26,DD29 +0174+ B0BC 66B170B17AB181B18AB191B198B19FB1A6B1 +0175+ B0CE dw DD2A,DD2B,DD2C,DD2D,DD2E,DD34,DD35,DD36,DD39 +0175+ B0CE B0B1B9B1C0B1C7B1CEB1D5B1DBB1E1B1E7B1 +0176+ B0E0 dw DD44,DD45,DD46,DD4C,DD4D,DD4E,DD54,DD55,DD56 +0176+ B0E0 F1B1F9B101B208B210B218B21FB227B22FB2 +0177+ B0F2 dw DD5C,DD5D,DD5E,DD60,DD61,DD62,DD63,DD64,DD65 +0177+ B0F2 36B23EB246B24DB255B25DB265B26DB276B2 +0178+ B104 dw DD66,DD67,DD68,DD69,DD6A,DD6B,DD6C,DD6D,DD6E +0178+ B104 7FB286B28EB296B29EB2A6B2AEB2B7B2C0B2 +0179+ B116 dw DD6F,DD70,DD71,DD72,DD73,DD74,DD75,DD77,DD7C +0179+ B116 C7B2CFB2D6B2DDB2E4B2EBB2F2B2F9B200B3 +0180+ B128 dw DD7D,DD7E,DD84,DD85,DD86,DD8C,DD8D,DD8E,DD94 +0180+ B128 08B310B317B320B329B331B33AB343B34BB3 +0181+ B13A dw DD95,DD96,DD9C,DD9D,DD9E,DDA4,DDA5,DDA6,DDAC +0181+ B13A 52B359B35FB368B371B379B380B387B38DB3 +0182+ B14C dw DDAD,DDAE,DDB4,DDB5,DDB6,DDBC,DDBD,DDBE,DDE1 +0182+ B14C 94B39BB3A1B3A7B3ADB3B2B3B8B3BEB3C3B3 +0183+ B15E dw DDE3,DDE5,DDE9,DDF9 +0183+ B15E CAB3D5B3DDB3E5B3 +0184+ B166 +0185+ B166 DD09 db "ADD Ix,BC",0 +0185+ B166 4144442049782C424300 +0186+ B170 DD19 db "ADD Ix,DE",0 +0186+ B170 4144442049782C444500 +0187+ B17A DD21 db "LD Ix,",2 +0187+ B17A 4C442049782C02 +0188+ B181 DD22 db "LD (),Ix",5 +0188+ B181 4C442028292C497805 +0189+ B18A DD23 db "INC Ix",0 +0189+ B18A 494E4320497800 +0190+ B191 DD24 db "INC Hx",0 +0190+ B191 494E4320487800 +0191+ B198 DD25 db "DEC Hx",0 +0191+ B198 44454320487800 +0192+ B19F DD26 db "LD Hx,",1 +0192+ B19F 4C442048782C01 +0193+ B1A6 DD29 db "ADD Ix,Ix",0 +0193+ B1A6 4144442049782C497800 +0194+ B1B0 DD2A db "LD Ix,()",5 +0194+ B1B0 4C442049782C282905 +0195+ B1B9 DD2B db "DEC Ix",0 +0195+ B1B9 44454320497800 +0196+ B1C0 DD2C db "INC Lx",0 +0196+ B1C0 494E43204C7800 +0197+ B1C7 DD2D db "DEC Lx",0 +0197+ B1C7 444543204C7800 +0198+ B1CE DD2E db "LD Lx,",1 +0198+ B1CE 4C44204C782C01 +0199+ B1D5 DD34 db "INC )",6 +0199+ B1D5 494E43202906 +0200+ B1DB DD35 db "DEC )",6 +0200+ B1DB 444543202906 +0201+ B1E1 DD36 db "LD ),",6 +0201+ B1E1 4C4420292C06 +0202+ B1E7 DD39 db "ADD Ix,SP",0 +0202+ B1E7 4144442049782C535000 +0203+ B1F1 DD44 db "LD B,Hx",0 +0203+ B1F1 4C4420422C487800 +0204+ B1F9 DD45 db "LD B,Lx",0 +0204+ B1F9 4C4420422C4C7800 +0205+ B201 DD46 db "LD B,)",6 +0205+ B201 4C4420422C2906 +0206+ B208 DD4C db "LD C,Hx",0 +0206+ B208 4C4420432C487800 +0207+ B210 DD4D db "LD C,Lx",0 +0207+ B210 4C4420432C4C7800 +0208+ B218 DD4E db "LD C,)",6 +0208+ B218 4C4420432C2906 +0209+ B21F DD54 db "LD D,Hx",0 +0209+ B21F 4C4420442C487800 +0210+ B227 DD55 db "LD D,Lx",0 +0210+ B227 4C4420442C4C7800 +0211+ B22F DD56 db "LD D,)",6 +0211+ B22F 4C4420442C2906 +0212+ B236 DD5C db "LD E,Hx",0 +0212+ B236 4C4420452C487800 +0213+ B23E DD5D db "LD E,Lx",0 +0213+ B23E 4C4420452C4C7800 +0214+ B246 DD5E db "LD E,)",6 +0214+ B246 4C4420452C2906 +0215+ B24D DD60 db "LD Hx,B",0 +0215+ B24D 4C442048782C4200 +0216+ B255 DD61 db "LD Hx,C",0 +0216+ B255 4C442048782C4300 +0217+ B25D DD62 db "LD Hx,D",0 +0217+ B25D 4C442048782C4400 +0218+ B265 DD63 db "LD Hx,E",0 +0218+ B265 4C442048782C4500 +0219+ B26D DD64 db "LD Hx,Hx",0 +0219+ B26D 4C442048782C487800 +0220+ B276 DD65 db "LD Hx,Lx",0 +0220+ B276 4C442048782C4C7800 +0221+ B27F DD66 db "LD H,)",6 +0221+ B27F 4C4420482C2906 +0222+ B286 DD67 db "LD Lx,A",0 +0222+ B286 4C44204C782C4100 +0223+ B28E DD68 db "LD Lx,B",0 +0223+ B28E 4C44204C782C4200 +0224+ B296 DD69 db "LD Lx,C",0 +0224+ B296 4C44204C782C4300 +0225+ B29E DD6A db "LD Lx,D",0 +0225+ B29E 4C44204C782C4400 +0226+ B2A6 DD6B db "LD Lx,E",0 +0226+ B2A6 4C44204C782C4500 +0227+ B2AE DD6C db "LD Lx,Hx",0 +0227+ B2AE 4C44204C782C487800 +0228+ B2B7 DD6D db "LD Lx,Lx",0 +0228+ B2B7 4C44204C782C4C7800 +0229+ B2C0 DD6E db "LD L,)",6 +0229+ B2C0 4C44204C2C2906 +0230+ B2C7 DD6F db "LD Lx,A",0 +0230+ B2C7 4C44204C782C4100 +0231+ B2CF DD70 db "LD ),B",6 +0231+ B2CF 4C4420292C4206 +0232+ B2D6 DD71 db "LD ),C",6 +0232+ B2D6 4C4420292C4306 +0233+ B2DD DD72 db "LD ),D",6 +0233+ B2DD 4C4420292C4406 +0234+ B2E4 DD73 db "LD ),E",6 +0234+ B2E4 4C4420292C4506 +0235+ B2EB DD74 db "LD ),H",6 +0235+ B2EB 4C4420292C4806 +0236+ B2F2 DD75 db "LD ),L",6 +0236+ B2F2 4C4420292C4C06 +0237+ B2F9 DD77 db "LD ),A",6 +0237+ B2F9 4C4420292C4106 +0238+ B300 DD7C db "LD A,Hx",0 +0238+ B300 4C4420412C487800 +0239+ B308 DD7D db "LD A,Lx",0 +0239+ B308 4C4420412C4C7800 +0240+ B310 DD7E db "LD A,)",6 +0240+ B310 4C4420412C2906 +0241+ B317 DD84 db "ADD A,Hx",0 +0241+ B317 41444420412C487800 +0242+ B320 DD85 db "ADD A,Lx",0 +0242+ B320 41444420412C4C7800 +0243+ B329 DD86 db "ADD A,)",6 +0243+ B329 41444420412C2906 +0244+ B331 DD8C db "ADC E,Hx",0 +0244+ B331 41444320452C487800 +0245+ B33A DD8D db "ADC E,Lx",0 +0245+ B33A 41444320452C4C7800 +0246+ B343 DD8E db "ADC E,)",6 +0246+ B343 41444320452C2906 +0247+ B34B DD94 db "SUB Hx",0 +0247+ B34B 53554220487800 +0248+ B352 DD95 db "SUB Lx",0 +0248+ B352 535542204C7800 +0249+ B359 DD96 db "SUB )",6 +0249+ B359 535542202906 +0250+ B35F DD9C db "SBC A,Hx",0 +0250+ B35F 53424320412C487800 +0251+ B368 DD9D db "SBC A,Lx",0 +0251+ B368 53424320412C4C7800 +0252+ B371 DD9E db "SBC A,)",6 +0252+ B371 53424320412C2906 +0253+ B379 DDA4 db "AND Hx",0 +0253+ B379 414E4420487800 +0254+ B380 DDA5 db "AND Lx",0 +0254+ B380 414E44204C7800 +0255+ B387 DDA6 db "AND )",6 +0255+ B387 414E44202906 +0256+ B38D DDAC db "XOR Hx",0 +0256+ B38D 584F5220487800 +0257+ B394 DDAD db "XOR Lx",0 +0257+ B394 584F52204C7800 +0258+ B39B DDAE db "XOR )",6 +0258+ B39B 584F52202906 +0259+ B3A1 DDB4 db "OR Hx",0 +0259+ B3A1 4F5220487800 +0260+ B3A7 DDB5 db "OR Lx",0 +0260+ B3A7 4F52204C7800 +0261+ B3AD 4F52202906 DDB6 db "OR )",6 +0262+ B3B2 DDBC db "CP Hx",0 +0262+ B3B2 435020487800 +0263+ B3B8 DDBD db "CP Lx",0 +0263+ B3B8 4350204C7800 +0264+ B3BE 4350202906 DDBE db "CP )",6 +0265+ B3C3 DDE1 db "POP Ix",0 +0265+ B3C3 504F5020497800 +0266+ B3CA DDE3 db "EX (SP),Ix",0 +0266+ B3CA 455820285350292C497800 +0267+ B3D5 DDE5 db "PUSH Ix",0 +0267+ B3D5 5055534820497800 +0268+ B3DD DDE9 db "JP (Ix)",0 +0268+ B3DD 4A50202849782900 +0269+ B3E5 DDF9 db "LD SP,Ix",0 +0269+ B3E5 4C442053502C497800 +0270+ B3EE +0271+ B3EE TablCB: +0272+ B3EE dw CB00,CB08,CB10,CB18,CB20,CB28,CB30,CB38 +0272+ B3EE FEB302B406B409B40CB410B414B418B4 +0273+ B3FE +0274+ B3FE 52 4C 43 20 CB00 db "RLC " +0275+ B402 52 52 43 20 CB08 db "RRC " +0276+ B406 52 4C 20 CB10 db "RL " +0277+ B409 52 52 20 CB18 db "RR " +0278+ B40C 53 4C 41 20 CB20 db "SLA " +0279+ B410 53 52 41 20 CB28 db "SRA " +0280+ B414 53 4C 49 20 CB30 db "SLI " +0281+ B418 53 52 4C 20 CB38 db "SRL " +0282+ B41C 42 49 54 20 CB40 db "BIT " +0283+ B420 52 45 53 20 CB80 db "RES " +0284+ B424 53 45 54 20 CBC0 db "SET " +0285+ B428 +0286+ B428 TablED: +0287+ B428 dw ED40,ED41,ED42,ED43,ED44,ED45,ED46,ED47 +0287+ B428 E4B4EDB4F7B401B50AB50EB513B518B5 +0288+ B438 dw ED48,ED49,ED4A,ED4B,ED44,ED4D,ED4E,ED4F +0288+ B438 1FB528B532B53CB50AB545B54AB551B5 +0289+ B448 dw ED50,ED51,ED52,ED53,ED44,ED45,ED56,ED57 +0289+ B448 58B561B56BB575B50AB50EB57EB583B5 +0290+ B458 dw ED58,ED59,ED5A,ED5B,ED44,ED4D,ED5E,ED5F +0290+ B458 8AB593B59DB5A7B50AB545B5B0B5B5B5 +0291+ B468 dw ED60,ED61,ED62,ED63,ED44,ED45,ED46,ED67 +0291+ B468 BCB5C5B5CFB5D9B50AB50EB513B5E2B5 +0292+ B478 dw ED68,ED69,ED6A,ED6B,ED44,ED4D,ED4E,ED6F +0292+ B478 E6B5EFB5F9B503B60AB545B54AB50CB6 +0293+ B488 dw ED70,ED71,ED72,ED73,ED44,ED45,ED56,ED00 +0293+ B488 10B619B623B62DB60AB50EB57EB5DEB4 +0294+ B498 dw ED78,ED79,ED7A,ED7B,ED44,ED4D,ED5E +0294+ B498 36B63FB649B653B60AB545B5B0B5 +0295+ B4A6 dw EDA0,EDA1,EDA2,EDA3,ED00,ED00,ED00,ED00 +0295+ B4A6 5CB660B664B668B6DEB4DEB4DEB4DEB4 +0296+ B4B6 dw EDA8,EDA9,EDAA,EDAB,ED00,ED00,ED00,ED00 +0296+ B4B6 6DB671B675B679B6DEB4DEB4DEB4DEB4 +0297+ B4C6 dw EDB0,EDB1,EDB2,EDB3,ED00,ED00,ED00,ED00 +0297+ B4C6 7EB683B688B68DB6DEB4DEB4DEB4DEB4 +0298+ B4D6 dw EDB8,EDB9,EDBA,EDBB +0298+ B4D6 92B697B69CB6A1B6 +0299+ B4DE +0300+ B4DE ED00 db "NOP *",0 +0300+ B4DE 4E4F50202A00 +0301+ B4E4 ED40 db "IN B,(C)",0 +0301+ B4E4 494E20422C28432900 +0302+ B4ED ED41 db "OUT (C),B",0 +0302+ B4ED 4F5554202843292C4200 +0303+ B4F7 ED42 db "SBC HL,BC",0 +0303+ B4F7 53424320484C2C424300 +0304+ B501 ED43 db "LD (),BC",5 +0304+ B501 4C442028292C424305 +0305+ B50A 4E 45 47 00 ED44 db "NEG",0 +0306+ B50E 5245544E00 ED45 db "RETN",0 +0307+ B513 494D203000 ED46 db "IM 0",0 +0308+ B518 ED47 db "LD I,A",0 +0308+ B518 4C4420492C4100 +0309+ B51F ED48 db "IN C,(C)",0 +0309+ B51F 494E20432C28432900 +0310+ B528 ED49 db "OUT (C),C",0 +0310+ B528 4F5554202843292C4300 +0311+ B532 ED4A db "ADC HL,BC",0 +0311+ B532 41444320484C2C424300 +0312+ B53C ED4B db "LD BC,()",5 +0312+ B53C 4C442042432C282905 +0313+ B545 5245544900 ED4D db "RETI",0 +0314+ B54A ED4E db "IM 0 *",0 +0314+ B54A 494D2030202A00 +0315+ B551 ED4F db "LD R,A",0 +0315+ B551 4C4420522C4100 +0316+ B558 ED50 db "IN D,(C)",0 +0316+ B558 494E20442C28432900 +0317+ B561 ED51 db "OUT (C),D",0 +0317+ B561 4F5554202843292C4400 +0318+ B56B ED52 db "SBC HL,DE",0 +0318+ B56B 53424320484C2C444500 +0319+ B575 ED53 db "LD (),DE",5 +0319+ B575 4C442028292C444505 +0320+ B57E 494D203100 ED56 db "IM 1",0 +0321+ B583 ED57 db "LD A,I",0 +0321+ B583 4C4420412C4900 +0322+ B58A ED58 db "IN E,(C)",0 +0322+ B58A 494E20452C28432900 +0323+ B593 ED59 db "OUT (C),E",0 +0323+ B593 4F5554202843292C4500 +0324+ B59D ED5A db "ADC HL,DE",0 +0324+ B59D 41444320484C2C444500 +0325+ B5A7 ED5B db "LD DE,()",5 +0325+ B5A7 4C442044452C282905 +0326+ B5B0 494D203200 ED5E db "IM 2",0 +0327+ B5B5 ED5F db "LD A,R",0 +0327+ B5B5 4C4420412C5200 +0328+ B5BC ED60 db "IN H,(C)",0 +0328+ B5BC 494E20482C28432900 +0329+ B5C5 ED61 db "OUT (C),H",0 +0329+ B5C5 4F5554202843292C4800 +0330+ B5CF ED62 db "SBC HL,HL",0 +0330+ B5CF 53424320484C2C484C00 +0331+ B5D9 ED63 db "LD (),HL",5 +0331+ B5D9 4C442028292C484C05 +0332+ B5E2 52 52 44 00 ED67 db "RRD",0 +0333+ B5E6 ED68 db "IN L,(C)",0 +0333+ B5E6 494E204C2C28432900 +0334+ B5EF ED69 db "OUT (C),L",0 +0334+ B5EF 4F5554202843292C4C00 +0335+ B5F9 ED6A db "ADC HL,HL",0 +0335+ B5F9 41444320484C2C484C00 +0336+ B603 ED6B db "LD HL,()",5 +0336+ B603 4C4420484C2C282905 +0337+ B60C 52 4C 44 00 ED6F db "RLD",0 +0338+ B610 ED70 db "IN F,(C)",0 +0338+ B610 494E20462C28432900 +0339+ B619 ED71 db "OUT (C),*",0 +0339+ B619 4F5554202843292C2A00 +0340+ B623 ED72 db "SBC HL,SP",0 +0340+ B623 53424320484C2C535000 +0341+ B62D ED73 db "LD (),SP",5 +0341+ B62D 4C442028292C535005 +0342+ B636 ED78 db "IN A,(C)",0 +0342+ B636 494E20412C28432900 +0343+ B63F ED79 db "OUT (C),A",0 +0343+ B63F 4F5554202843292C4100 +0344+ B649 ED7A db "ADC HL,SP",0 +0344+ B649 41444320484C2C535000 +0345+ B653 ED7B db "LD SP,()",5 +0345+ B653 4C442053502C282905 +0346+ B65C 4C 44 49 00 EDA0 db "LDI",0 +0347+ B660 43 50 49 00 EDA1 db "CPI",0 +0348+ B664 49 4E 49 00 EDA2 db "INI",0 +0349+ B668 4F55544900 EDA3 db "OUTI",0 +0350+ B66D 4C 44 44 00 EDA8 db "LDD",0 +0351+ B671 43 50 44 00 EDA9 db "CPD",0 +0352+ B675 49 4E 44 00 EDAA db "IND",0 +0353+ B679 4F55544400 EDAB db "OUTD",0 +0354+ B67E 4C44495200 EDB0 db "LDIR",0 +0355+ B683 4350495200 EDB1 db "CPIR",0 +0356+ B688 494E495200 EDB2 db "INIR",0 +0357+ B68D 4F54495200 EDB3 db "OTIR",0 +0358+ B692 4C44445200 EDB8 db "LDDR",0 +0359+ B697 4350445200 EDB9 db "CPDR",0 +0360+ B69C 494E445200 EDBA db "INDR",0 +0361+ B6A1 4F54445200 EDBB db "OTDR",0 +0362+ B6A6 +0363+ B6A6 +0385 B6A6 include "loadbin.asm" +0001+ B6A6 DD 21 F3 B7 LoadBinDialog ld ix,.LoadBinWnd +0002+ B6AA CD D5 B9 call DialogWindow +0003+ B6AD C9 ret +0004+ B6AE .LoadBinEditFN ;ld hl,.LoadBinFileName +0005+ B6AE ;ld c,20 +0006+ B6AE ;call InputLine.ToBuffer +0007+ B6AE 21 24 0F .L003 ld hl,#0f24 +0008+ B6B1 06 14 ld b,20 +0009+ B6B3 CD 9A 9C call InputLine1 +0010+ B6B6 38 EE jr c,LoadBinDialog +0011+ B6B8 79 ld a,c +0012+ B6B9 A7 and a +0013+ B6BA 28 F2 jr z,.L003 +0014+ B6BC 32 EE B7 ld (.filenamelen),a +0015+ B6BF C5 push bc +0016+ B6C0 11 12 B8 ld de,.LoadBinFileName +0017+ B6C3 CD 98 9E call InputLine.FromBuffer +0018+ B6C6 C1 pop bc +0019+ B6C7 3E 14 ld a,20 +0020+ B6C9 91 sub c +0021+ B6CA 28 07 jr z,.L001 +0022+ B6CC 47 ld b,a +0023+ B6CD 3E 20 ld a,32 +0024+ B6CF 12 .L002 ld (de),a +0025+ B6D0 13 inc de +0026+ B6D1 10 FC djnz .L002 +0027+ B6D3 18 D1 .L001 jr LoadBinDialog +0028+ B6D5 +0029+ B6D5 21 21 10 .EditAddres ld hl,#1021 +0030+ B6D8 06 05 ld b,5 +0031+ B6DA CD 9A 9C call InputLine1 +0032+ B6DD 38 C7 jr c,LoadBinDialog +0033+ B6DF C5 push bc +0034+ B6E0 CD 30 9C call PutAdres +0035+ B6E3 C1 pop bc +0036+ B6E4 38 EF jr c,.EditAddres +0037+ B6E6 22 EF B7 ld (.LoadToAdr),hl +0038+ B6E9 11 2F B8 ld de,.AdresTxt +0039+ B6EC CD 98 9E call InputLine.FromBuffer +0040+ B6EF 18 B5 jr LoadBinDialog +0041+ B6F1 21 31 10 .EditLenght ld hl,#1031 +0042+ B6F4 06 05 ld b,5 +0043+ B6F6 CD 9A 9C call InputLine1 +0044+ B6F9 38 AB jr c,LoadBinDialog +0045+ B6FB C5 push bc +0046+ B6FC CD 30 9C call PutAdres +0047+ B6FF C1 pop bc +0048+ B700 38 EF jr c,.EditLenght +0049+ B702 22 F1 B7 ld (.LoadLen),hl +0050+ B705 11 3F B8 ld de,.LenTxt +0051+ B708 CD 98 9E call InputLine.FromBuffer +0052+ B70B 18 99 jr LoadBinDialog +0053+ B70D .LoadBIN +0054+ B70D AF xor a +0055+ B70E 32 5D AA ld (ClockOn),a +0056+ B711 0E 11 ld c,Dss.Open +0057+ B713 21 12 B8 ld hl,.LoadBinFileName +0058+ B716 E5 push hl +0059+ B717 3A EE B7 ld a,(.filenamelen) +0060+ B71A 16 00 ld d,0 +0061+ B71C 5F ld e,a +0062+ B71D 19 add hl,de +0063+ B71E 22 2B B7 ld (.restadr+1),hl +0064+ B721 36 00 ld (hl),0 +0065+ B723 E1 pop hl +0066+ B724 3E 01 ld a,1 +0067+ B726 D7 rst DssRst +0068+ B727 DA CF B7 jp c,.Err1 +0069+ B72A 21 00 00 .restadr ld hl,0 +0070+ B72D 36 20 ld (hl),32 +0071+ B72F 32 ED B7 ld (.FMid),a +0072+ B732 2A EF B7 ld hl,(.LoadToAdr) +0073+ B735 3E 01 ld a,1 ;рфЁхё т юсырёЄш #0000-7fff? +0074+ B737 CB 7C bit 7,h +0075+ B739 28 08 jr z,.adr0000 +0076+ B73B 3C inc a ;#8000-#bfff? +0077+ B73C CB 74 bit 6,h +0078+ B73E 28 08 jr z,.adr +0079+ B740 3C inc a ;#c000-ffff !!! +0080+ B741 18 05 jr .adr +0081+ B743 CB 74 .adr0000 bit 6,h +0082+ B745 20 01 jr nz,.adr +0083+ B747 97 sub a +0084+ B748 32 EC B7 .adr ld (.bank),a +0085+ B74B CB F4 set 6,h ;рфЁхё чруЁєчъш =>#4XXX +0086+ B74D CB BC res 7,h +0087+ B74F 22 7D B7 ld (.LoadFirst+4),hl +0088+ B752 E5 push hl +0089+ B753 21 00 00 ld hl,0 ;╙чэрхь фышэє Їрщыр +0090+ B756 DD 21 00 00 ld ix,0 +0091+ B75A 06 02 ld b,2 +0092+ B75C 0E 15 ld c,Dss.Move_FP +0093+ B75E D7 rst DssRst +0094+ B75F 22 F1 B7 ld (.LoadLen),HL +0095+ B762 22 A5 B7 ld (.LoadEnd+1),hl +0096+ B765 E1 pop hl +0097+ B766 A7 .Load00 and a +0098+ B767 EB ex hl,de +0099+ B768 11 00 80 ld de,#8000 +0100+ B76B ED 52 sbc hl,de +0101+ B76D 22 7A B7 ld (.LoadFirst+1),hl +0102+ B770 ED 5B A5 B7 ld de,(.LoadEnd+1) +0103+ B774 A7 and a +0104+ B775 ED 52 sbc hl,de +0105+ B777 38 2B jr c,.LoadEnd +0106+ B779 11 00 00 .LoadFirst ld de,0 ;ъюышўхёЄтю срщЄ, ъюЄюЁ√х эрфю ёўшЄрЄ№ т яхЁтє■ срэъє +0107+ B77C 21 00 00 ld hl,0 ;рфЁхё, ъєфр ёърўрЄ№ +0108+ B77F CD DA B7 .LoadNext call .Bank1 +0109+ B782 0E 13 ld c,Dss.Read +0110+ B784 3A ED B7 ld a,(.FMid) +0111+ B787 D7 rst DssRst +0112+ B788 38 3D jr c,.Err +0113+ B78A 21 EC B7 ld hl,.bank +0114+ B78D 34 inc (hl) +0115+ B78E 2A A5 B7 ld hl,(.LoadEnd+1) +0116+ B791 11 00 40 ld de,#4000 +0117+ B794 A7 and a +0118+ B795 ED 52 sbc hl,de +0119+ B797 38 0B jr c,.LoadEnd ;╬ёЄрыюё№ ьхэ№°х 16╩с +0120+ B799 22 A5 B7 ld (.LoadEnd+1),hl +0121+ B79C 21 00 40 ld hl,#4000 +0122+ B79F 11 00 40 ld de,#4000 +0123+ B7A2 18 DB jr .LoadNext +0124+ B7A4 11 00 00 .LoadEnd ld de,0 ;ъюышўхёЄтю срщЄ, ъюЄюЁ√х эхюсїюфшью фюўшЄрЄ№ +0125+ B7A7 CD DA B7 call .Bank1 +0126+ B7AA 21 00 40 ld hl,#4000 +0127+ B7AD 3A ED B7 ld a,(.FMid) +0128+ B7B0 0E 13 ld c,Dss.Read +0129+ B7B2 D7 rst DssRst +0130+ B7B3 38 12 jr c,.Err +0131+ B7B5 3A ED B7 ld a,(.FMid) +0132+ B7B8 0E 12 ld c,Dss.Close +0133+ B7BA D7 rst DssRst +0134+ B7BB +0135+ B7BB 2A EF B7 ld hl,(.LoadToAdr) +0136+ B7BE 22 55 AB ld (ListAdr),hl +0137+ B7C1 3A 40 AB ld a,(WinPage+1) +0138+ B7C4 D3 A2 out (EmmWin.P1),a +0139+ B7C6 C9 ret +0140+ B7C7 F5 .Err push af +0141+ B7C8 3A ED B7 ld a,(.FMid) +0142+ B7CB 0E 12 ld c,Dss.Close +0143+ B7CD D7 rst DssRst +0144+ B7CE F1 pop af +0145+ B7CF FB .Err1 ei +0146+ B7D0 CD 12 95 call ErDss +0147+ B7D3 0E 5C ld c,Dss.PChars ;т√тюф ЄхъёЄр ю°шсъш ш юцшфрэш  any key +0148+ B7D5 D7 rst DssRst +0149+ B7D6 0E 30 ld c,Dss.WaitKey +0150+ B7D8 D7 rst DssRst +0151+ B7D9 C9 ret +0152+ B7DA +0153+ B7DA E5 .Bank1 push hl +0154+ B7DB D5 push de +0155+ B7DC 3A EC B7 ld a,(.bank) +0156+ B7DF 6F ld l,a +0157+ B7E0 26 00 ld h,0 +0158+ B7E2 11 3F AB ld de,WinPage +0159+ B7E5 19 add hl,de +0160+ B7E6 7E ld a,(hl) +0161+ B7E7 D3 A2 out (EmmWin.P1),a +0162+ B7E9 D1 pop de +0163+ B7EA E1 pop hl +0164+ B7EB C9 ret +0165+ B7EC +0166+ B7EC +0167+ B7EC +0168+ B7EC 00 .bank db 0 +0169+ B7ED 00 .FMid db 0 +0170+ B7EE 00 .filenamelen db 0 +0171+ B7EF 00 40 .LoadToAdr dw #4000 +0172+ B7F1 00 10 .LoadLen dw #1000 +0173+ B7F3 .LoadBinWnd db 2,23,13,36,6,7 +0173+ B7F3 02170D240607 +0174+ B7F9 db "Load BIN-file",0 +0174+ B7F9 4C6F61642042494E2D66696C6500 +0175+ B807 db "Filename: " +0175+ B807 46696C656E616D653A2020 +0176+ B812 20 .LoadBinFileName ds 20,32 +0177+ B826 0D db 0X0D +0178+ B827 db "Addres: " +0178+ B827 4164647265733A20 +0179+ B82F .AdresTxt db "#4000 Lenght: " +0179+ B82F 23343030302020204C656E6768743A20 +0180+ B83F 2331303030 .LenTxt db "#1000" +0181+ B844 db 0x16,10+23,4+13,"OK Cancel",0 +0181+ B844 1621114F4B2020202020202043616E63656C00 +0182+ B857 05 db 5 +0183+ B858 23 0F 16 02 db 35,15,22,2 ;Filename +0184+ B85C 00 00 AE B6 dw 0,.LoadBinEditFN +0185+ B860 20 10 07 02 db 32,16,7,2 ;Addres +0186+ B864 00 00 D5 B6 dw 0,.EditAddres +0187+ B868 30 10 07 02 db 48,16,7,2 ;Lenght +0188+ B86C 00 00 F1 B6 dw 0,.EditLenght +0189+ B870 1E 11 08 02 db 30,17,8,2 ;OK +0190+ B874 00 00 0D B7 dw 0,.LoadBIN +0191+ B878 29 11 08 02 db 41,17,8,2 ;Cancel +0192+ B87C 00 00 00 00 dw 0,0 +0386 B880 include "windows.asm" +0001+ B880 +0002+ B880 ;IX - WINDOW DESCRIPTOR +0003+ B880 ;+0 - FLAG: +0004+ B880 ; BITS: 0 - STANDART WINDOW +0005+ B880 ; 1 - 0 - WITHOUT HEADER / 1 - WITH HEADER +0006+ B880 ; 2 - 0 - ORDINARY FRAME / 1 - DOUBLE FRAME +0007+ B880 ;+1 - X COORD +0008+ B880 ;+2 - Y COORD +0009+ B880 ;+3 - LENGHT +0010+ B880 ;+4 - HEIGHT +0011+ B880 ;+5 - ATTR +0012+ B880 +0013+ B880 +0014+ B880 DD CB 00 46 Windows BIT 0,(IX+0) +0015+ B884 28 13 JR Z,NO_STAND_WIN +0016+ B886 DD 7E 01 LD A,(IX+1) +0017+ B889 11 FC FF LD DE,-4 +0018+ B88C DD 19 ADD IX,DE +0019+ B88E DD E5 PUSH IX +0020+ B890 DD 21 50 BA LD IX,STANDART +0021+ B894 DD 77 05 LD (IX+5),A +0022+ B897 18 02 JR STAND_WIN +0023+ B899 NO_STAND_WIN +0024+ B899 DD E5 PUSH IX +0025+ B89B STAND_WIN +0026+ B89B CD 09 B9 CALL Rectang +0027+ B89E CD 2E B9 CALL Frame +0028+ B8A1 DD CB 00 4E BIT 1,(IX+0) +0029+ B8A5 C4 EE B8 CALL NZ,WinHeader +0030+ B8A8 E1 POP HL +0031+ B8A9 ; PUSH HL +0032+ B8A9 11 06 00 LD DE,6 +0033+ B8AC 19 ADD HL,DE +0034+ B8AD DD CB 00 4E bit 1,(ix+0) +0035+ B8B1 DD 7E 05 ld a,(IX+5) +0036+ B8B4 28 23 jr z,WinNoHeader +0037+ B8B6 0F RRCA +0038+ B8B7 0F RRCA +0039+ B8B8 0F RRCA +0040+ B8B9 0F RRCA +0041+ B8BA E6 7F AND #7F +0042+ B8BC 32 5C 8E ld (PrnStrColor.L1+5),a +0043+ B8BF E5 push hl +0044+ B8C0 CD CC B9 call MenuItemLen +0045+ B8C3 DD 7E 03 ld a,(ix+3) +0046+ B8C6 98 sbc a,b +0047+ B8C7 DD 5E 01 ld e,(ix+1) +0048+ B8CA A7 and a +0049+ B8CB 1F rra +0050+ B8CC 83 add a,e +0051+ B8CD 5F ld e,a +0052+ B8CE DD 56 02 ld d,(ix+2) +0053+ B8D1 E1 pop hl +0054+ B8D2 CD 32 8E CALL PrnStrColor +0055+ B8D5 23 inc hl +0056+ B8D6 DD 7E 05 ld a,(IX+5) +0057+ B8D9 WinNoHeader +0058+ B8D9 32 5C 8E ld (PrnStrColor.L1+5),a +0059+ B8DC DD 56 02 ld d,(ix+2) ;╩ююЁфшэрЄ√ т юъэх +0060+ B8DF DD 5E 01 ld e,(ix+1) +0061+ B8E2 14 inc d +0062+ B8E3 14 inc d +0063+ B8E4 1C inc e +0064+ B8E5 1C inc e +0065+ B8E6 7B ld a,e +0066+ B8E7 32 66 8E ld (PrtXCoord),a +0067+ B8EA ; LD (WINDOW_TXT),HL +0068+ B8EA CD 32 8E CALL PrnStrColor +0069+ B8ED ; EX (DE),HL +0070+ B8ED C9 RET +0071+ B8EE +0072+ B8EE ;╨шёютрэшх чруюыютър юъэр +0073+ B8EE WinHeader +0074+ B8EE DD 5E 01 LD E,(IX+1) +0075+ B8F1 DD 56 02 LD D,(IX+2) +0076+ B8F4 DD 6E 03 LD L,(IX+3) +0077+ B8F7 26 01 LD H,1 +0078+ B8F9 DD 7E 05 LD A,(IX+5) +0079+ B8FC 0F RRCA +0080+ B8FD 0F RRCA +0081+ B8FE 0F RRCA +0082+ B8FF 0F RRCA +0083+ B900 E6 7F AND #7F +0084+ B902 47 LD B,A +0085+ B903 3E 20 LD A,#20 +0086+ B905 CD 1E B9 CALL FillBox +0087+ B908 C9 RET +0088+ B909 +0089+ B909 ;╧ЁюЎхфєЁр юётюсюцфхэш  яЁ ьюєуюы№эющ яыю∙рфш юъэр +0090+ B909 ;═р тїюф: IX - рфЁхё юяшёрЄхы  +0091+ B909 DD 5E 01 Rectang LD E,(IX+1) +0092+ B90C DD 56 02 LD D,(IX+2) +0093+ B90F DD 66 04 LD H,(IX+4) +0094+ B912 DD 6E 03 LD L,(IX+3) +0095+ B915 DD 46 05 LD B,(IX+5) +0096+ B918 3E 20 LD A,#20 +0097+ B91A CD 1E B9 CALL FillBox +0098+ B91D C9 RET +0099+ B91E +0100+ B91E E5 FillBox PUSH HL +0101+ B91F D5 PUSH DE +0102+ B920 0E 58 FillB1 LD C,Dss.WrChar +0103+ B922 D7 RST DssRst +0104+ B923 1C INC E +0105+ B924 2D DEC L +0106+ B925 20 F9 JR NZ,FillB1 +0107+ B927 D1 POP DE +0108+ B928 E1 POP HL +0109+ B929 14 INC D +0110+ B92A 25 DEC H +0111+ B92B 20 F1 JR NZ,FillBox +0112+ B92D C9 RET +0113+ B92E +0114+ B92E +0115+ B92E 21 56 BA Frame LD HL,FrameType1 +0116+ B931 DD CB 00 56 BIT 2,(IX+0) ;windows type flag +0117+ B935 28 03 JR Z,Frame1 +0118+ B937 21 5C BA LD HL,FrameType2 +0119+ B93A DD 56 02 Frame1 LD D,(IX+2) +0120+ B93D DD 5E 01 LD E,(IX+1) +0121+ B940 DD 46 05 LD B,(IX+5) +0122+ B943 D5 PUSH DE +0123+ B944 E5 PUSH HL +0124+ B945 ; PUSH BC +0125+ B945 7E LD A,(HL) +0126+ B946 0E 58 LD C,Dss.WrChar +0127+ B948 D7 RST DssRst +0128+ B949 ; POP BC +0129+ B949 E1 POP HL +0130+ B94A D1 POP DE +0131+ B94B DD 7E 03 LD A,(IX+3) +0132+ B94E 3D DEC A +0133+ B94F 83 ADD A,E +0134+ B950 5F LD E,A +0135+ B951 23 INC HL +0136+ B952 7E LD A,(HL) +0137+ B953 0E 58 LD C,Dss.WrChar +0138+ B955 D5 PUSH DE +0139+ B956 E5 PUSH HL +0140+ B957 D7 RST DssRst +0141+ B958 E1 POP HL +0142+ B959 D1 POP DE +0143+ B95A DD 7E 04 LD A,(IX+4) +0144+ B95D 3D DEC A +0145+ B95E 82 ADD A,D +0146+ B95F 57 LD D,A +0147+ B960 23 INC HL +0148+ B961 7E LD A,(HL) +0149+ B962 D5 PUSH DE +0150+ B963 E5 PUSH HL +0151+ B964 0E 58 LD C,Dss.WrChar +0152+ B966 D7 RST DssRst +0153+ B967 E1 POP HL +0154+ B968 D1 POP DE +0155+ B969 DD 5E 01 LD E,(IX+1) +0156+ B96C 23 INC HL +0157+ B96D 7E LD A,(HL) +0158+ B96E 0E 58 LD C,Dss.WrChar +0159+ B970 D7 RST DssRst +0160+ B971 ;HORIZONTAL LINES +0161+ B971 23 INC HL +0162+ B972 7E LD A,(HL) +0163+ B973 32 93 B9 LD (FramHor),A +0164+ B976 23 INC HL +0165+ B977 E5 PUSH HL +0166+ B978 DD 66 02 LD H,(IX+2) +0167+ B97B DD 7E 04 LD A,(IX+4) +0168+ B97E 3D DEC A +0169+ B97F 84 ADD A,H +0170+ B980 6F LD L,A +0171+ B981 DD 7E 03 LD A,(IX+3) +0172+ B984 D6 02 SUB 2 +0173+ B986 0E 58 LD C,Dss.WrChar +0174+ B988 DD 5E 01 LD E,(IX+1) +0175+ B98B 1C INC E +0176+ B98C DD 46 05 LD B,(IX+5) +0177+ B98F F5 FramHl1 PUSH AF +0178+ B990 E5 PUSH HL +0179+ B991 54 LD D,H +0180+ B992 3E 00 LD A,0 +0181+ B994 FramHor EQU $-1 +0182+ B994 F5 PUSH AF +0183+ B995 D7 RST DssRst +0184+ B996 F1 POP AF +0185+ B997 55 LD D,L +0186+ B998 D7 RST DssRst +0187+ B999 E1 POP HL +0188+ B99A F1 POP AF +0189+ B99B 1C INC E +0190+ B99C 3D DEC A +0191+ B99D 20 F0 JR NZ,FramHl1 +0192+ B99F E1 POP HL +0193+ B9A0 ;VERTICAL LINES +0194+ B9A0 7E LD A,(HL) +0195+ B9A1 32 BF B9 LD (FramVer),A +0196+ B9A4 DD 66 01 LD H,(IX+1) +0197+ B9A7 DD 7E 03 LD A,(IX+3) +0198+ B9AA 3D DEC A +0199+ B9AB 84 ADD A,H +0200+ B9AC 6F LD L,A +0201+ B9AD DD 7E 04 LD A,(IX+4) +0202+ B9B0 D6 02 SUB 2 +0203+ B9B2 0E 58 LD C,Dss.WrChar +0204+ B9B4 DD 56 02 LD D,(IX+2) +0205+ B9B7 14 INC D +0206+ B9B8 DD 46 05 LD B,(IX+5) +0207+ B9BB F5 FramVl1 PUSH AF +0208+ B9BC E5 PUSH HL +0209+ B9BD 5C LD E,H +0210+ B9BE 3E 00 LD A,0 +0211+ B9C0 FramVer EQU $-1 +0212+ B9C0 F5 PUSH AF +0213+ B9C1 D7 RST DssRst +0214+ B9C2 F1 POP AF +0215+ B9C3 5D LD E,L +0216+ B9C4 D7 RST DssRst +0217+ B9C5 E1 POP HL +0218+ B9C6 F1 POP AF +0219+ B9C7 14 INC D +0220+ B9C8 3D DEC A +0221+ B9C9 20 F0 JR NZ,FramVl1 +0222+ B9CB C9 RET +0223+ B9CC +0224+ B9CC ;╦╚╤╥└┼╥ ─╬ ╤╦┼─╙▐┘┼├╬ ╧╙═╩╥└ ╠┼═▐ +0225+ B9CC MenuItemLen +0226+ B9CC 06 00 LD B,0 +0227+ B9CE NextMnuItem +0228+ B9CE 7E LD A,(HL) +0229+ B9CF 23 INC HL +0230+ B9D0 A7 AND A +0231+ B9D1 C8 RET Z +0232+ B9D2 04 INC B +0233+ B9D3 18 F9 JR NextMnuItem +0234+ B9D5 +0235+ B9D5 +0236+ B9D5 ;╧ЁюЁшёютър юъэр ш юсЁрсюЄър фшрыюур +0237+ B9D5 DialogWindow +0238+ B9D5 CD 80 B8 call Windows +0239+ B9D8 23 inc hl +0240+ B9D9 ; jp WinDialog +0241+ B9D9 +0242+ B9D9 ;╧╧ юсЁрсюЄъш фшрыюуютюую юъэр +0243+ B9D9 ;Dialogs +0244+ B9D9 ;+0 (1) - Count of Items +0245+ B9D9 ;+1 (N) - Item Descriptor +0246+ B9D9 ;Descriptor +0247+ B9D9 ; +0 - X +0248+ B9D9 ; +1 - Y +0249+ B9D9 ; +2 - Len +0250+ B9D9 ; +3 - Attrib +0251+ B9D9 ; +4 (2) - Hot Key +0252+ B9D9 ; +6 (2) - Routine +0253+ B9D9 +0254+ B9D9 WinDialog: +0255+ B9D9 7E ld a,(hl) +0256+ B9DA 32 4E BA ld (DlgItemsCnt),a +0257+ B9DD 23 inc hl +0258+ B9DE 22 EF B9 ld (.DialogAdr),hl +0259+ B9E1 AF xor a +0260+ B9E2 32 4F BA ld (SelectedItem),a +0261+ B9E5 3A 4F BA .Lp1 ld a,(SelectedItem) +0262+ B9E8 6F ld l,a +0263+ B9E9 26 00 ld h,0 +0264+ B9EB 29 add hl,hl +0265+ B9EC 29 add hl,hl +0266+ B9ED 29 add hl,hl +0267+ B9EE 11 00 00 ld de,0 +0268+ B9F1 .DialogAdr equ $-2 +0269+ B9F1 19 add hl,de +0270+ B9F2 5E ld e,(hl) +0271+ B9F3 23 inc hl +0272+ B9F4 56 ld d,(hl) +0273+ B9F5 23 inc hl +0274+ B9F6 46 ld b,(hl) +0275+ B9F7 EB ex hl,de +0276+ B9F8 CD D3 91 call CursorSet +0277+ B9FB 0E 31 .Lp2 ld c,Dss.ScanKey +0278+ B9FD D7 rst DssRst +0279+ B9FE 28 FB jr z,.Lp2 +0280+ BA00 7A ld a,d +0281+ BA01 FE 52 cp #52 ; +0282+ BA03 20 13 jr nz,.Lp3 +0283+ BA05 3A 4E BA .LpDn ld a,(DlgItemsCnt) +0284+ BA08 47 ld b,a +0285+ BA09 3A 4F BA ld a,(SelectedItem) +0286+ BA0C 3C inc a +0287+ BA0D B8 cp b ;─юёЄшуыш ьръёшьры№эюую яєэъЄр +0288+ BA0E 28 EB jr z,.Lp2 +0289+ BA10 32 4F BA .Lp4 ld (SelectedItem),a +0290+ BA13 CD 35 92 call CursorRes +0291+ BA16 18 CD jr .Lp1 +0292+ BA18 FE 58 .Lp3 cp #58 ; +0293+ BA1A 20 09 jr nz,.Lp5 +0294+ BA1C 3A 4F BA .LpUp ld a,(SelectedItem) +0295+ BA1F A7 and a +0296+ BA20 28 D9 jr z,.Lp2 +0297+ BA22 3D dec a +0298+ BA23 18 EB jr .Lp4 +0299+ BA25 FE 54 .Lp5 cp #54 ; +0300+ BA27 28 F3 jr z,.LpUp +0301+ BA29 FE 56 cp #56 ; +0302+ BA2B 28 D8 jr z,.LpDn +0303+ BA2D .LpAscii +0304+ BA2D 7B ld a,e ;ASCII - ъюф +0305+ BA2E FE 0D cp #0D ; +0306+ BA30 20 C9 jr nz,.Lp2 +0307+ BA32 CD 35 92 call CursorRes +0308+ BA35 3A 4F BA ld a,(SelectedItem) +0309+ BA38 6F ld l,a +0310+ BA39 26 00 ld h,0 +0311+ BA3B 29 add hl,hl +0312+ BA3C 29 add hl,hl +0313+ BA3D 29 add hl,hl +0314+ BA3E ED 5B EF B9 ld de,(.DialogAdr) +0315+ BA42 19 add hl,de +0316+ BA43 11 06 00 ld de,6 +0317+ BA46 19 add hl,de +0318+ BA47 ifdef DEBUG +0319+ BA47~ push hl +0320+ BA47~ ld de,0 +0321+ BA47~ call PrintReg +0322+ BA47~ pop hl +0323+ BA47 endif +0324+ BA47 7E ld a,(hl) +0325+ BA48 23 inc hl +0326+ BA49 66 ld h,(hl) +0327+ BA4A 6F ld l,a +0328+ BA4B B4 or h +0329+ BA4C C8 ret z ;┼ёыш рфЁхё =0, Єю RET +0330+ BA4D ifdef DEBUG +0331+ BA4D~ push hl +0332+ BA4D~ ld de,8 +0333+ BA4D~ call PrintReg +0334+ BA4D~ pop hl +0335+ BA4D endif +0336+ BA4D E9 jp (hl) +0337+ BA4E DlgItemsCnt +0338+ BA4E 00 DB 0 +0339+ BA4F SelectedItem +0340+ BA4F 00 DB 0 +0341+ BA50 STANDART; TYPE, X, Y, L,H,COLOR +0342+ BA50 DEFB 5,10,13,#20,6,7 +0342+ BA50 050A0D200607 +0343+ BA56 +0344+ BA56 ;Ordinary frame +0345+ BA56 FrameType1 +0346+ BA56 DB #DA,#BF,#D9,#C0,#C4,#B3 +0346+ BA56 DABFD9C0C4B3 +0347+ BA5C ;Double frame +0348+ BA5C FrameType2 +0349+ BA5C DB #C9,#BB,#BC,#C8,#CD,#BA +0349+ BA5C C9BBBCC8CDBA +0387 BA62 +0388 BA62 EndOfDaemon +0389 BA62 savebin "demon.exe",STARTPRG,EndOfDaemon-STARTPRG + +Value Label +------ - ----------------------------------------------------------- +0x7F00 STARTPRG +0x8100 OrgAdr +0x00C2 EmmWin.P2 +0xAB1E BankDebug +0x0082 EmmWin.P0 +0xAB1F BankOS +0x8DAC SaveAllRegs +0xAB3F WinPage +0x8114 X CmdLine +0x8122 CmdLine.L1 +0x9480 FDebug +0x0043 Dss.GSwitch +0x0010 DssRst +0x92CE LoadFile +0x82AA Start +0x8128 HorizLine +0x8149 VerticalLine +0x815E Corner +0x81DA TextStrReg +0x8220 TextStrLogo +0x8270 TextStrWin +0x8289 TextStrRez +0x8290 DrawLine +0x829A DrawLine.L1 +0x0058 Dss.WrChar +0xAA62 Hello +0x005C Dss.PChars +0x0051 Dss.GetVMod +0x8809 Exit +0xAA60 OSGrafMode +0xAA5F OSScreen +0x003D Dss.GetMem +0xAA61 BufPage +0xAA5E DemonScreen +0x82DD StartNext +0x0059 Dss.WinCopy +0x0050 Dss.SetVMod +0x82E6 X StartNext.lp1 +0x8301 ClearScreen +0x830F DrawDemonScreen +0x8800 Start1 +0x82EF RefreshScreen +0x9235 CursorRes +0x883C Refresh +0x99B3 Cursor +0x91D3 CursorSet +0xAB11 Color.Screen +0x0089 Bios.Lp_Cls_Win +0x0008 BiosRst +0xAB12 Color.Border +0x8332 DrawCorner +0xAB13 Color.TextStrReg +0x8E57 PrnStrColor.L1 +0x8E32 PrnStrColor +0xAB14 Color.TextStrWin +0xAB18 Color.TextStrLogo +0xAB17 Color.RezArea +0x9EE4 PreparChar +0x9851 Keyb +0x9F30 Rst38.Vect +0x8837 ExitNext +0x005A Dss.WinRest +0x003E Dss.FreeMem +0x0041 Dss.Exit +0x883B X Return +0xAB25 Reg._IX +0x8F13 PrintStrReg +0xAB27 Reg._IY +0xAB29 Reg._HL +0xAB2B Reg._DE +0xAB2D Reg._BC +0xAB31 Reg._HL_ +0xAB33 Reg._DE_ +0xAB35 Reg._BC_ +0xAB2F Reg._AF +0x8E9D PrintStrAF +0xAB37 Reg._AF_ +0xAB3D Reg._PC +0x8E67 PrintReg +0xAB39 Reg._IR +0xAB3B Reg._SP +0x8FAE PrintSPDn +0xAB20 RezAdr +0x8F76 PrintStrWin +0x8FF5 PrintStrSP +0x9067 PrintDump +0x8954 DisAsm +0x88CB DemonHelp +0x88D5 HelpWnd +0xB9D5 DialogWindow +0x894B X HelpWndDlg +0x0000 X Dss.Version +0x0001 X Dss.ChDisk +0x0002 X Dss.CurDisk +0x0003 X Dss.DskInfo +0x0009 X Dss.BOOTDSK +0x000A Dss.Create +0x000B X Dss.Creat_N +0x000E X Dss.Delete +0x0010 X Dss.Rename +0x0011 Dss.Open +0x0012 Dss.Close +0x0013 Dss.Read +0x0014 Dss.Write +0x0015 Dss.Move_FP +0x0016 X Dss.Attrib +0x0017 X Dss.Get_D_T +0x0018 X Dss.Put_D_T +0x0019 X Dss.F_First +0x001A X Dss.F_Next +0x001B X Dss.MkDir +0x001C X Dss.RmDir +0x001D X Dss.ChDir +0x001E X Dss.CurDir +0x0021 Dss.SysTime +0x0022 X Dss.SetTime +0x0030 Dss.WaitKey +0x0031 Dss.ScanKey +0x0032 X Dss.EchoKey +0x0033 X Dss.CTRLKey +0x0035 X Dss.K_CLEAR +0x0036 X Dss.K_SETUP +0x0037 X Dss.TESTKEY +0x0038 X Dss.SetWin +0x0039 Dss.SetWin1 +0x003A X Dss.SetWin2 +0x003B Dss.SetWin3 +0x003C X Dss.INFOMEM +0x003F X Dss.SetMem +0x0040 X Dss.Exec +0x0042 X Dss.Wait +0x0044 X Dss.DosName +0x0045 X Dss.EX_Path +0x0046 X Dss.Environ +0x0047 X Dss.AppInfo +0x0052 X Dss.Locate +0x0053 X Dss.Cursor +0x0054 Dss.SelPage +0x0055 X Dss.Scroll +0x0056 X Dss.Clear +0x0057 Dss.RdChar +0x005B X Dss.PutChar +0x005F X Dss.Print +0x00C0 X Bios.Emm_Fn0 +0x00C1 X Bios.Emm_Fn1 +0x00C2 X Bios.Emm_Fn2 +0x00C3 X Bios.Emm_Fn3 +0x00C4 Bios.Emm_Fn4 +0x00C5 X Bios.Emm_Fn5 +0x00C6 X Bios.Emm_Fn6 +0x00C7 X Bios.Emm_Fn7 +0x00C8 X Bios.Emm_Fn8 +0x00C9 X Bios.Emm_Fn9 +0x00B0 X Bios.Win_Open +0x00B1 X Bios.Win_Close +0x00B2 X Bios.Win_Copy_Win +0x00B3 X Bios.Win_Restore_Win +0x00B4 Bios.Win_Get_Sym +0x00B5 Bios.Win_Put_Sym +0x00B6 Bios.Win_Set_ZG +0x00B7 X Bios.Win_Move_Win +0x00B8 Bios.Win_Get_ZG +0x0081 X Bios.Lp_Print_All +0x0082 X Bios.Lp_Print_Sym +0x0083 Bios.Lp_Print_Atr +0x0084 Bios.Lp_Set_Place +0x0085 X Bios.Lp_Print_Ln +0x0086 Bios.Lp_Print_Ln2 +0x0087 X Bios.Lp_Print_Ln3 +0x0088 X Bios.Lp_Print_Ln4 +0x008A X Bios.Lp_Scroll_Up +0x008B X Bios.Lp_Print_Ln5 +0x008C X Bios.Lp_Print_Ln6 +0x008D X Bios.Lp_Cls_Win2 +0x008E X Bios.Lp_Get_Place +0x0051 X Bios.Drv_Reset +0x0054 X Bios.Drv_Verify +0x0055 X Bios.Drv_Read +0x0056 X Bios.Drv_Write +0x0057 X Bios.Drv_Detect +0x0058 X Bios.Drv_Get_Par +0x0059 X Bios.Drv_Set_Par +0x005A X Bios.Ext_Version +0x005F X Bios.Drv_List +0x00A2 EmmWin.P1 +0x00E2 EmmWin.P3 +0xAB55 ListAdr +0x895A DisAsm.L1 +0x899B AttrList +0x8970 X DisAsm.L2 +0x8A42 List +0xAB7D ListFormat +0x8A0C LFormat +0x8D87 List.String +0x9BC3 KList.Descript +0x89AE AttrList.L2 +0xAB16 Color._PC +0x89CE AttrList.L0 +0xA664 Rezident.End +0xA5E7 Rezident +0x92C4 AdrArea +0x89CB AttrList.L3 +0x89D5 AttrList.L1 +0x89DF UpAdres +0x926C Ld_a_hl +0x89F8 UpAdres.L1 +0x8A13 LFormat.L2 +0x8A1F LFormat.Exit +0x8A21 LFormat.L1 +0x8A39 LFormat.L3 +0x8DA7 List.Byte +0x8A6B List.L43 +0x8B04 List.L30 +0x8A70 List.L42 +0x8D6A List.IRS1 +0x8BE8 List.L9 +0x8CA6 List.L13 +0x8AB1 List.L40 +0xB067 CodeDDFD +0x8AA5 List.L45 +0xB4DE ED00 +0xB0BC TablDDFD +0x8BD3 List.L_12 +0x8AE9 List.L44 +0x8CF7 List.ComCBBit +0x8AE4 List.L41 +0x8D1D List.NomBit +0x8D59 List.IndexRegSh +0x8AF8 List.L46 +0x8D04 List.ComCBSh +0x8D2C List.RegName +0x9174 ConvHexStr +0x8B3D List.L20 +0x8B23 List.L31 +0x8D4A List.HLReg +0x8B6E List.L10 +0x8B69 List.L21 +0xB428 TablED +0x8BDF List.L_2 +0xABCF Tabl00_3F +0xAE02 TablC0_FF +0x8BB0 List.L8 +0xB026 MHALT +0x8BFA List.L1 +0xB02B TablM +0x8DA8 List.TablAdr +0x8DAA List.StrAdr +0x8CB2 List.LE +0x8C1B List.L3 +0x8CB8 List.TwoByteCom +0x8C28 List.L4 +0x8CD0 List.ThreeByteCom +0x8C54 List.L7 +0x913D NumToStr16 +0x8C64 List.L5 +0x8C92 List.L6 +0x8C78 List.L11 +0x915E NumToStr8 +0xB41C CB40 +0x8D11 List.ComCBSh1 +0xB3EE TablCB +0x8D46 List.RN1 +0x8DF5 RestAllRegs +0x8E41 PrnStrColor.L2 +0x8E66 PrtXCoord +0x8E4C PrnStrColor.L3 +0x8E63 PrnStrColor.L4 +0xAB7E DecHex +0x8E7B PrintReg.Hex +0x8E98 PrintReg.String +0x9191 ConvDecStr +0x8E8F PrintReg.Print +0x8EFE PrintStrAF.String +0x8EAB PrintStrAF.L1 +0x9127 ReplSymNoPrint +0x8F0B PrintStrAF.Flags +0x8EC8 PrintStrAF.L2 +0x9247 Ld_a_bc +0x8F68 PrintStrReg.String +0x8F95 PrintStrWin.String +0x8F7E PrintStrWin.L1 +0xAB22 StackDown +0x8FBC PrintSPDn.L1 +0x8FF1 PrintSPDn.String +0x91AF ConvDecStr8 +0x9066 PrintStrSP.StrSp +0x9008 PrintStrSP.L4 +0xAB23 StackDump +0x9015 PrintStrSP.L3 +0x902E PrintStrSP.L2 +0xAB15 Color._SP +0x9038 PrintStrSP.L1 +0xAB43 Dump1 +0x9097 PrintStrDump +0xAB45 Dump +0x90EE PrintStrDump.String +0x90A6 PrintStrDump.L1 +0xAA5C SymbolNoPrint +0x912B ReplSymNoPrint.L1 +0x9165 X NumToStr8.Hex +0x91BE ConvDecStr8_1 +0x9209 CursorSet.Buffer +0x9242 CursorRes.L1 +0xAB19 Color.Cursor +0x91F8 CursorSet.L1 +0x925C Ld_a_bc.L1 +0x928F Ld_a_hl.L1 +0x9281 Ld_a_hl.L2 +0x9297 Ld_hl_a +0x92AF Ld_hl_a.L2 +0x92A4 Ld_hl_a.L1 +0x92BC Ld_hl_a.L3 +0xAA5D ClockOn +0xAAFE Str.Load +0x92EC LoadExe +0x00FF On +0x9505 PrErDss +0x947F FId +0x934A LoadExe.L1 +0x9503 FRam +0x9388 LoadExe.L2 +0x939D LoadExe.L6 +0x9452 NBank +0x947C MemId +0x93A8 LoadExe.L5 +0x93CE LoadExe.L4 +0x9478 BankP +0x9417 LoadExe.L7 +0x9436 LoadExe.L8 +0x9442 LoadExe.L9 +0x944E LoadExe.L10 +0x946C NBank.L5 +0x9464 NBank.L2 +0x9465 NBank.L1 +0x9475 NBank.L3 +0x9501 X FStart +0x9512 ErDss +0xAB0E Str.DA +0x0026 ErDss.MaxError +0x97C1 ErDss.Tabl +0x9527 ErDss.e01 +0x9538 ErDss.e02 +0x954D ErDss.e03 +0x955C ErDss.e04 +0x956B ErDss.e05 +0x957A ErDss.e06 +0x958E ErDss.e07 +0x95A2 ErDss.e08 +0x95B1 ErDss.e09 +0x95BF ErDss.e0A +0x95CD ErDss.e0B +0x95E1 ErDss.e0C +0x9600 ErDss.e0D +0x960E ErDss.e0E +0x9620 ErDss.e0F +0x9630 ErDss.e10 +0x9641 ErDss.e11 +0x9652 ErDss.e12 +0x9669 ErDss.e13 +0x9677 ErDss.e14 +0x9681 ErDss.e15 +0x968C ErDss.e16 +0x969D ErDss.e17 +0x96A7 ErDss.e18 +0x96B5 ErDss.e19 +0x96C0 ErDss.e1A +0x96CC ErDss.e1B +0x96DA ErDss.e1C +0x96ED ErDss.e1D +0x9700 ErDss.e1E +0x9712 ErDss.e1F +0x9727 ErDss.e20 +0x973A ErDss.e21 +0x974D ErDss.e22 +0x9760 ErDss.e23 +0x976F ErDss.e24 +0x979F ErDss.e25 +0x97AA ErDss.e26 +0x980D Clock +0x983E Clock.String +0x98CD Keyb.L100 +0x9877 Keyb.L1 +0x99B2 Keyb.WinScreen +0x9884 Keyb.L10 +0x99A0 Keyb.L0 +0x9897 Keyb.L11 +0x98BB Keyb.L12 +0x9CAA InputLine +0x9C30 PutAdres +0xA1E7 KReg.Rez +0x993B Keyb.L202 +0x9916 Keyb.L200 +0x994E Keyb.L203 +0x98CA X Keyb.L13 +0x98F9 Keyb.NoRest +0x9924 Keyb.L208 +0x991E Keyb.NoExit +0x992D Keyb.L207 +0xB6A6 LoadBinDialog +0x9935 Keyb.L201 +0x0000 Off +0xA97B Step.Flag +0xA664 Step +0x9974 Keyb.L204 +0x9BD1 AdrListTabl +0x9987 Keyb.L205 +0x9991 Keyb.L206 +0xA9FA SaveScr +0xAB7F ExitDlg +0x9A1C KList +0xA3FC KDump +0x9FAE KReg +0xA2A4 KStack +0x99D7 Cursor.L1 +0x99EF Cursor.L2 +0x9A07 Cursor.L3 +0xA3F3 KStack.Coordinate +0xA3F5 KStack.Descript +0xA3A4 KStack.L201 +0x9BC1 KList.Coordinate +0x9B43 KList.L201 +0xA5A0 KDump.Coordinate +0xA5A2 KDump.Descript +0xA4FA KDump.L201 +0xA206 KReg.DescCalc +0xA04A KReg.L201 +0x9A90 KList.L100 +0x9A28 KList.L10 +0x9A3C KList.L20 +0x9B9C KList.NewLA1 +0x9A5A KList.L21 +0x9BA3 KList.CtrlTabl +0x9BDF AdrCtrlTabl +0x9A79 KList.L22 +0x9BA2 KList.CtrlWin +0x9B8E KList.NewLA +0x9B3C KList.L200 +0x9AAC KList.L101 +0x9AC0 KList.L102 +0x9AD8 KList.L103 +0x9AD1 KList.L104 +0x9AF0 KList.L105 +0x9AE9 KList.L107 +0x9B05 KList.L108 +0x9AFE KList.L106 +0x9B23 KList.L110 +0x9B1C KList.L109 +0x9B2F KList.L111 +0x9B5A KList.NewPCAdr +0x9B83 KList.InAdres +0x9B68 KList.InCode +0x9BF1 PutCode +0x9C2C PutCode.Buffer +0x9EB8 InputLine.Buffer +0x9C1C PutCode.L3 +0x9C09 PutCode.L2 +0x9C4C PutHex +0x9C91 CapsLetter +0x9C6F PutDec +0x9C8A Numeric +0x9C5F PutHex.L1 +0x9C9A InputLine1 +0x9CA3 InputLineEd +0xAB1B Color.InLineEd +0xAB1A Color.InLine +0x9EB2 InputLine.EntEnd +0x9D34 InputLine.L15 +0x9FAA CursPos +0x9EB3 InputLine.Coordinate +0x9EB5 InputLine.Pos +0x9CCB InputLine.L1 +0x9E1C InputLine.PrintInLine +0x9E05 InputLine.EndString +0x9CDE InputLine.L100 +0x9FA6 CursOnOff +0x9D39 InputLine.L3 +0x9EB6 InputLine.Color +0x9E32 InputLine.ClearInLine +0x9DEA InputLine.HomeString +0x9E7A InputLine.NextPos +0x9D26 InputLine.L12 +0x9FA8 CursInsOvr +0x9EB7 InputLine.Len +0x9F85 ResCurs +0x9D4F InputLine.L14 +0x9D43 InputLine.L13 +0x9D54 InputLine.L2 +0x9E63 InputLine.EndPos +0x9D86 InputLine.L9 +0x9D66 InputLine.L11 +0x9D9F InputLine.L10 +0x9E4A InputLine.ColorInLine +0x9DAB InputLine.L5 +0x9DC4 InputLine.L6 +0x9DDD InputLine.L7 +0x9DF9 InputLine.L8 +0x9E8F InputLine.L16 +0x9E98 InputLine.FromBuffer +0x9E9D InputLine.FB1 +0x9EA6 X InputLine.ToBuffer +0x9EA9 InputLine.TB1 +0x9F09 Rst38 +0x9F33 CuttingCurs +0x9FA9 TimerFlash +0x9F3E CuttingCurs.L1 +0x9FA7 CursPutRes +0x9F99 ResCurs.L1 +0x9F5C CuttingCurs.L3 +0x9FAC CursSymb +0x001B SysSymb +0x0010 PauseFlash +0x9F7C CuttingCurs.L4 +0x0000 Ins +0x9FAE X KReg.L100 +0xA043 KReg.L200 +0x9FC7 KReg.L101 +0xA22C KReg.Coordinate +0x9FDC KReg.L102 +0xA22E KReg.Descript +0x9FF0 KReg.L103 +0x9FED KReg.L104 +0x9FFA KReg.L107 +0xA004 KReg.L105 +0xA017 KReg.L108 +0xA224 KReg.PgDown +0xA029 KReg.L110 +0xA228 KReg.PgUp +0xA035 KReg.L111 +0xA0DB KReg.L205 +0xA088 KReg.L207 +0xA0B2 KReg.L206 +0xA08E KReg.L208 +0xA12F KReg.L204 +0xA0F2 KReg.L209 +0xA13B KReg.L202 +0xA170 KReg.L203 +0xA17A KReg.L210 +0xA202 KReg.L211 +0xA1FE KReg.L212 +0xA24E KReg.DTabl +0xA25A KReg.D1 +0xA26D KReg.D2 +0xA282 KReg.D3 +0xA28F KReg.D4 +0xA294 KReg.D5 +0xA29D KReg.D6 +0xA2D1 KStack.L100 +0xA39D KStack.L200 +0xA2ED KStack.L101 +0xA301 KStack.L102 +0xA327 KStack.L103 +0xA320 KStack.L104 +0xA34D KStack.L105 +0xA346 KStack.L107 +0xA370 KStack.L108 +0xA369 KStack.L106 +0xA391 KStack.L110 +0xA38A KStack.L109 +0xA3E2 KStack.L202 +0xA3DB KStack.L203 +0xA431 KDump.L100 +0xA401 X KDump.L10 +0xA41A KDump.L11 +0xA4F3 KDump.L200 +0xA44D KDump.L101 +0xA461 KDump.L102 +0xA480 KDump.L103 +0xA479 KDump.L104 +0xA49E KDump.L105 +0xA497 KDump.L107 +0xA4BA KDump.L108 +0xA4B3 KDump.L106 +0xA4DA KDump.L110 +0xA4D3 KDump.L109 +0xA4E6 KDump.L111 +0xA528 KDump.L202 +0xA53D KDump.L203 +0xA58D KDump.L299 +0xA556 KDump.L204 +0xA57E KDump.L205 +0xFF00 AdrTmpBuf +0xA5F2 Rezident.Start +0xA609 Rezident.K2 +0xA612 Rezident.K3 +0xA60E Rezident.Start1 +0xA615 Rezident.Step +0xA618 Rezident.RetIn +0xA61B Rezident.K4 +0xA621 Rezident.K5 +0xA636 Rezident.BankD1 +0xA642 Rezident.Return1 +0xA64F Rezident.K6 +0xA655 Rezident.RetIn1 +0xA65A Rezident.K1 +0xA65D Rezident.BankD +0xA661 Rezident.Return +0xA960 Step.BankP +0xA8F5 Step.Run +0xA967 Step.SpdInc +0xA971 Step.SpdDec +0xA6AE Step.L7 +0xA7FF Step.L2 +0xA7EF Step.L8 +0xA7E2 Step.L9 +0xA748 Step.L6 +0xA6D1 Step.L18 +0xA6E8 Step.L10 +0xA6FD Step.L25 +0xA716 Step.L24 +0xA71E Step.L23 +0xA729 Step.L19 +0xA734 Step.L20 +0xA73F Step.L21 +0xA761 Step.L22 +0xA77C Step.L27 +0xA78E Step.L26 +0xA7B3 Step.L11 +0xA7B9 Step.L12 +0xA7BF Step.L13 +0xA7C5 Step.L14 +0xA7CB Step.L15 +0xA7D1 Step.L16 +0xA7D7 Step.L17 +0xA7DB Step.L5 +0xA817 Step.L1 +0xA83E Step.L30 +0xA97C Step.WRez +0xA895 Step.L31 +0xA8BD Step.L32 +0xA964 Step.Run1 +0xA8A1 Step.L33 +0xA8B6 Step.L34 +0xA97D Step.Buffer +0xA8D5 Step.L3 +0xAB1C StackDebug +0xA93E Step.L35 +0xA936 Step.L36 +0xA956 Step.L4 +0xAA5A SaveScr.Id +0xAA0F SaveScr.L1 +0xAA50 SaveScr.NameF +0xAA44 SaveScr.L2 +0xAAFE X Str +0xAB11 X Color +0xAB25 X Reg +0x00FF X Ovr +0xAC4F M00 +0xAC53 M01 +0xAC5A M02 +0xAC64 M03 +0xAC6B M04 +0xAC71 M05 +0xAC77 M06 +0xAC7D M07 +0xAC82 M08 +0xAC8C M09 +0xAC96 M0A +0xACA0 M0B +0xACA7 M0C +0xACAD M0D +0xACB3 M0E +0xACB9 M0F +0xACBE M10 +0xACC4 M11 +0xACCB M12 +0xACD5 M13 +0xACDC M14 +0xACE2 M15 +0xACE8 M16 +0xACEE M17 +0xACF2 M18 +0xACF6 M19 +0xAD00 M1A +0xAD0A M1B +0xAD11 M1C +0xAD17 M1D +0xAD1D M1E +0xAD23 M1F +0xAD27 M20 +0xAD2E M21 +0xAD35 M22 +0xAD3E M23 +0xAD45 M24 +0xAD4B M25 +0xAD51 M26 +0xAD57 M27 +0xAD5B M28 +0xAD61 M29 +0xAD6B M2A +0xAD74 M2B +0xAD7B M2C +0xAD81 M2D +0xAD87 M2E +0xAD8D M2F +0xAD91 M30 +0xAD98 M31 +0xAD9F M32 +0xADA7 M33 +0xADAE M34 +0xADB7 M35 +0xADC0 M36 +0xADC9 M37 +0xADCD M38 +0xADD3 M39 +0xADDD M3A +0xADE5 M3B +0xADEC M3C +0xADF2 M3D +0xADF8 M3E +0xADFE M3F +0xAE82 MC0 +0xAE89 MC1 +0xAE90 MC2 +0xAE97 MC3 +0xAE9B MC4 +0xAEA4 MC5 +0xAEAC MC6 +0xAEB3 MC7 +0xAEB9 MC8 +0xAEBF MC9 +0xAEC3 MCA +0xAEC9 MCC +0xAED1 MCD +0xAED7 MCE +0xAEDE MCF +0xAEE4 MD0 +0xAEEB MD1 +0xAEF2 MD2 +0xAEF9 MD3 +0xAF02 MD4 +0xAF0B MD5 +0xAF13 MD6 +0xAF18 MD7 +0xAF20 MD8 +0xAF26 MD9 +0xAF2A MDA +0xAF30 MDB +0xAF38 MDC +0xAF40 MDD +0xAF43 MDE +0xAF4A MDF +0xAF52 ME0 +0xAF59 ME1 +0xAF60 ME2 +0xAF67 ME3 +0xAF72 ME4 +0xAF7B ME5 +0xAF83 ME6 +0xAF88 ME7 +0xAF90 ME8 +0xAF97 ME9 +0xAF9F MEA +0xAFA6 MEB +0xAFAF MEC +0xAFB8 MEE +0xAFBD MEF +0xAFC5 MF0 +0xAFCB MF1 +0xAFD2 MF2 +0xAFD8 MF3 +0xAFDB MF4 +0xAFE3 MF5 +0xAFEB MF6 +0xAFEF MF7 +0xAFF7 MF8 +0xAFFD MF9 +0xB006 MFA +0xB00C MFB +0xB00F MFC +0xB017 MFD +0xB01A MFE +0xB01E MFF +0xB03B M80 +0xB042 M88 +0xB049 M90 +0xB04E M98 +0xB055 MA0 +0xB05A MA8 +0xB05F MB0 +0xB063 MB8 +0xB166 DD09 +0xB170 DD19 +0xB17A DD21 +0xB181 DD22 +0xB18A DD23 +0xB191 DD24 +0xB198 DD25 +0xB19F DD26 +0xB1A6 DD29 +0xB1B0 DD2A +0xB1B9 DD2B +0xB1C0 DD2C +0xB1C7 DD2D +0xB1CE DD2E +0xB1D5 DD34 +0xB1DB DD35 +0xB1E1 DD36 +0xB1E7 DD39 +0xB1F1 DD44 +0xB1F9 DD45 +0xB201 DD46 +0xB208 DD4C +0xB210 DD4D +0xB218 DD4E +0xB21F DD54 +0xB227 DD55 +0xB22F DD56 +0xB236 DD5C +0xB23E DD5D +0xB246 DD5E +0xB24D DD60 +0xB255 DD61 +0xB25D DD62 +0xB265 DD63 +0xB26D DD64 +0xB276 DD65 +0xB27F DD66 +0xB286 DD67 +0xB28E DD68 +0xB296 DD69 +0xB29E DD6A +0xB2A6 DD6B +0xB2AE DD6C +0xB2B7 DD6D +0xB2C0 DD6E +0xB2C7 DD6F +0xB2CF DD70 +0xB2D6 DD71 +0xB2DD DD72 +0xB2E4 DD73 +0xB2EB DD74 +0xB2F2 DD75 +0xB2F9 DD77 +0xB300 DD7C +0xB308 DD7D +0xB310 DD7E +0xB317 DD84 +0xB320 DD85 +0xB329 DD86 +0xB331 DD8C +0xB33A DD8D +0xB343 DD8E +0xB34B DD94 +0xB352 DD95 +0xB359 DD96 +0xB35F DD9C +0xB368 DD9D +0xB371 DD9E +0xB379 DDA4 +0xB380 DDA5 +0xB387 DDA6 +0xB38D DDAC +0xB394 DDAD +0xB39B DDAE +0xB3A1 DDB4 +0xB3A7 DDB5 +0xB3AD DDB6 +0xB3B2 DDBC +0xB3B8 DDBD +0xB3BE DDBE +0xB3C3 DDE1 +0xB3CA DDE3 +0xB3D5 DDE5 +0xB3DD DDE9 +0xB3E5 DDF9 +0xB3FE CB00 +0xB402 CB08 +0xB406 CB10 +0xB409 CB18 +0xB40C CB20 +0xB410 CB28 +0xB414 CB30 +0xB418 CB38 +0xB420 X CB80 +0xB424 X CBC0 +0xB4E4 ED40 +0xB4ED ED41 +0xB4F7 ED42 +0xB501 ED43 +0xB50A ED44 +0xB50E ED45 +0xB513 ED46 +0xB518 ED47 +0xB51F ED48 +0xB528 ED49 +0xB532 ED4A +0xB53C ED4B +0xB545 ED4D +0xB54A ED4E +0xB551 ED4F +0xB558 ED50 +0xB561 ED51 +0xB56B ED52 +0xB575 ED53 +0xB57E ED56 +0xB583 ED57 +0xB58A ED58 +0xB593 ED59 +0xB59D ED5A +0xB5A7 ED5B +0xB5B0 ED5E +0xB5B5 ED5F +0xB5BC ED60 +0xB5C5 ED61 +0xB5CF ED62 +0xB5D9 ED63 +0xB5E2 ED67 +0xB5E6 ED68 +0xB5EF ED69 +0xB5F9 ED6A +0xB603 ED6B +0xB60C ED6F +0xB610 ED70 +0xB619 ED71 +0xB623 ED72 +0xB62D ED73 +0xB636 ED78 +0xB63F ED79 +0xB649 ED7A +0xB653 ED7B +0xB65C EDA0 +0xB660 EDA1 +0xB664 EDA2 +0xB668 EDA3 +0xB66D EDA8 +0xB671 EDA9 +0xB675 EDAA +0xB679 EDAB +0xB67E EDB0 +0xB683 EDB1 +0xB688 EDB2 +0xB68D EDB3 +0xB692 EDB8 +0xB697 EDB9 +0xB69C EDBA +0xB6A1 EDBB +0xB7F3 LoadBinDialog.LoadBinWnd +0xB6AE LoadBinDialog.LoadBinEditFN +0xB6AE LoadBinDialog.L003 +0xB7EE LoadBinDialog.filenamelen +0xB812 LoadBinDialog.LoadBinFileName +0xB6D3 LoadBinDialog.L001 +0xB6CF LoadBinDialog.L002 +0xB6D5 LoadBinDialog.EditAddres +0xB7EF LoadBinDialog.LoadToAdr +0xB82F LoadBinDialog.AdresTxt +0xB6F1 LoadBinDialog.EditLenght +0xB7F1 LoadBinDialog.LoadLen +0xB83F LoadBinDialog.LenTxt +0xB70D LoadBinDialog.LoadBIN +0xB72A LoadBinDialog.restadr +0xB7CF LoadBinDialog.Err1 +0xB7ED LoadBinDialog.FMid +0xB743 LoadBinDialog.adr0000 +0xB748 LoadBinDialog.adr +0xB7EC LoadBinDialog.bank +0xB779 LoadBinDialog.LoadFirst +0xB7A4 LoadBinDialog.LoadEnd +0xB766 X LoadBinDialog.Load00 +0xB77F LoadBinDialog.LoadNext +0xB7DA LoadBinDialog.Bank1 +0xB7C7 LoadBinDialog.Err +0xB880 Windows +0xB899 NO_STAND_WIN +0xBA50 STANDART +0xB89B STAND_WIN +0xB909 Rectang +0xB92E Frame +0xB8EE WinHeader +0xB8D9 WinNoHeader +0xB9CC MenuItemLen +0xB91E FillBox +0xB920 FillB1 +0xBA56 FrameType1 +0xB93A Frame1 +0xBA5C FrameType2 +0xB993 FramHor +0xB98F FramHl1 +0xB9BF FramVer +0xB9BB FramVl1 +0xB9CE NextMnuItem +0xB9D9 X WinDialog +0xBA4E DlgItemsCnt +0xB9EF WinDialog.DialogAdr +0xBA4F SelectedItem +0xB9E5 WinDialog.Lp1 +0xB9FB WinDialog.Lp2 +0xBA18 WinDialog.Lp3 +0xBA05 WinDialog.LpDn +0xBA10 WinDialog.Lp4 +0xBA25 WinDialog.Lp5 +0xBA1C WinDialog.LpUp +0xBA2D X WinDialog.LpAscii +0xBA62 EndOfDaemon diff --git a/dm.gif b/dm.gif new file mode 100644 index 0000000..c50ddd0 Binary files /dev/null and b/dm.gif differ 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