mirror of
https://github.com/romychs/DemoN.git
synced 2025-04-09 22:06:42 +03:00
433 lines
18 KiB
NASM
433 lines
18 KiB
NASM
;[]=========================================================================[]
|
||
;[] Отладка команд программы []
|
||
;[] v0.03 - последние изменения 10.03.2006 []
|
||
;[] v0.10 - последние изменения 18.03.2006 []
|
||
;[]=========================================================================[]
|
||
MODULE STEP
|
||
Step
|
||
di
|
||
ld a,(WinPage+2) ; банка под demon'ом
|
||
ld (Rezident.Start1+1),a ; в резидент ее
|
||
ld (.BankP+1),a
|
||
ld a,(BankDebug) ; банка с demon'ом
|
||
ld (Rezident.BankD+1),a ; в резидент ее
|
||
ld (Rezident.BankD1+2),a
|
||
ld hl,Step.Run+3 ; точка возврата в отладчик
|
||
ld (Rezident.Return+1),hl ; прописываем в резиденте
|
||
ld a,l
|
||
ld (Rezident.Return1+2),a
|
||
ld a,h
|
||
ld (Rezident.Return1+7),a
|
||
ld hl,(Reg._PC)
|
||
ld (Rezident.Step+1),hl ; адрес отлаживаемой команды
|
||
|
||
ld a,(Reg._AF) ; флаг
|
||
ld b,a
|
||
call Ld_a_hl
|
||
; ld a,(hl) ; код команды
|
||
|
||
ld c,a
|
||
and 11001111b
|
||
cp 11000101b ; PUSH
|
||
call z,.SpdInc
|
||
cp 11000001b ; POP
|
||
call z,.SpdDec
|
||
|
||
ld a,c
|
||
cp 0xCD ; CALL
|
||
jr nz,.L7
|
||
ld a,(.Flag)
|
||
inc a
|
||
jp nz,.L2 ; без захода в подпрограмму
|
||
jp .L8
|
||
.L7 cp 0xC9 ; RET
|
||
jp z,.L9
|
||
cp 0xC3 ; JP
|
||
jp z,.L8+3
|
||
cp 0x18 ; JR
|
||
jp z,.L6
|
||
cp 0x10 ; DJNZ
|
||
jr nz,.L18
|
||
ld a,(.Flag)
|
||
inc a
|
||
jp nz,.L2 ; без отладки цикла
|
||
ld a,(Reg._BC+1)
|
||
dec a
|
||
jr nz,.L6
|
||
jp .L2
|
||
.L18 inc hl ; следующий байт соманды
|
||
exa
|
||
call Ld_a_hl
|
||
ld c,a
|
||
exa
|
||
; ld c,(hl)
|
||
dec hl
|
||
cp 0xED ; префикс для RETI, RETN
|
||
jr nz,.L10
|
||
ld a,c
|
||
cp 0x4D ; RETI
|
||
jp z,.L9
|
||
cp 0x45 ; RETN
|
||
jp z,.L9
|
||
.L10 cp 0xDD ; префикс для IX
|
||
jr nz,.L25
|
||
ld a,c
|
||
cp 0xE5 ; PUSH IX
|
||
call z,.SpdInc
|
||
cp 0xE1 ; POP IX
|
||
call z,.SpdDec
|
||
ld de,(Reg._IX)
|
||
jr .L24
|
||
.L25 cp 0xFD ; префикс для IY
|
||
jr nz,.L24-4
|
||
ld a,c
|
||
cp 0xE5 ; PUSH IY
|
||
call z,.SpdInc
|
||
cp 0xE1 ; POP IY
|
||
call z,.SpdDec
|
||
ld de,(Reg._IY)
|
||
jr .L24
|
||
ld de,(Reg._HL)
|
||
.L24 cp 0xE9 ; JP (HL/IX/IY)
|
||
jr nz,.L23
|
||
ex de,hl
|
||
jp .NPC
|
||
.L23 cp 0x38 ; JR C,
|
||
jr nz,.L19
|
||
bit 0,b ; флаг C
|
||
jp z,.L2 ; нет перехода
|
||
jr .L6 ; переход
|
||
.L19 cp 0x30 ; JR NC,
|
||
jr nz,.L20
|
||
bit 0,b ; флаг C
|
||
jp nz,.L2 ; нет перехода
|
||
jr .L6 ; переход
|
||
.L20 cp 0x28 ; JR Z,
|
||
jr nz,.L21
|
||
bit 6,b ; флаг Z
|
||
jp z,.L2 ; нет перехода
|
||
jr .L6 ; переход
|
||
.L21 cp 0x20 ; JR NZ,
|
||
jr nz,.L22
|
||
bit 6,b ; флаг Z
|
||
jp nz,.L2 ; нет перехода
|
||
.L6 inc hl
|
||
call Ld_a_hl
|
||
; ld a,(hl) ; смещение
|
||
inc hl
|
||
ld b,0
|
||
ld c,a
|
||
bit 7,a ; знак числа
|
||
jr z,$+11
|
||
neg
|
||
or a ; сброс флага C
|
||
ld c,a
|
||
sbc hl,bc ; отрицательное смещение
|
||
jp .NPC
|
||
add hl,bc ; положительное смещение
|
||
jp .NPC
|
||
|
||
.L22 and 11000111b
|
||
cp 11000111b ; RST x
|
||
jr nz,.L27
|
||
ld a,(.Flag)
|
||
inc a
|
||
jp nz,.L2 ; без захода в подпрограмму
|
||
call .SpdInc
|
||
call Ld_a_hl
|
||
; ld a,(hl) ; байт комнды
|
||
and 00111000b ; адрес перехода
|
||
ld h,0
|
||
ld l,a
|
||
jp .NPC
|
||
.L27 cp 11000010b ; JP flag
|
||
jr z,.L26
|
||
cp 11000000b ; RET flag
|
||
jr z,.L26
|
||
cp 11000100b ; CALL flag
|
||
jr nz,.L2
|
||
ld a,(.Flag)
|
||
inc a
|
||
jr nz,.L2 ; без захода в подпрограмму
|
||
.L26 call Ld_a_hl
|
||
; ld a,(hl) ; код команды
|
||
and 00111000b ; флаги
|
||
jr z,.L11 ; JP/CALL/RET NZ,
|
||
cp 00001000b
|
||
jr z,.L12 ; JP/CALL/RET Z,
|
||
cp 00010000b
|
||
jr z,.L13 ; JP/CALL/RET NC,
|
||
cp 00011000b
|
||
jr z,.L14 ; JP/CALL/RET C,
|
||
cp 00100000b
|
||
jr z,.L15 ; JP/CALL/RET PO,
|
||
cp 00101000b
|
||
jr z,.L16 ; JP/CALL/RET PE,
|
||
cp 00110000b
|
||
jr z,.L17 ; JP/CALL/RET P,
|
||
bit 7,b ; JP/CALL/RET M, флаг S
|
||
jr z,.L2 ; нет перехода
|
||
jr .L5 ; переход
|
||
.L11 bit 6,b ; флаг Z
|
||
jr nz,.L2 ; нет перехода
|
||
jr .L5 ; переход
|
||
.L12 bit 6,b ; флаг Z
|
||
jr z,.L2 ; нет перехода
|
||
jr .L5 ; переход
|
||
.L13 bit 0,b ; флаг C
|
||
jr nz,.L2 ; нет перехода
|
||
jr .L5 ; переход
|
||
.L14 bit 0,b ; флаг C
|
||
jr z,.L2 ; нет перехода
|
||
jr .L5 ; переход
|
||
.L15 bit 2,b ; флаг P/V
|
||
jr nz,.L2 ; нет перехода
|
||
jr .L5 ; переход
|
||
.L16 bit 2,b ; флаг P/V
|
||
jr z,.L2 ; нет перехода
|
||
jr .L5 ; переход
|
||
.L17 bit 7,b ; флаг S
|
||
jr nz,.L2 ; нет перехода
|
||
|
||
.L5 call Ld_a_hl
|
||
; ld a,(hl) ; код команды
|
||
and 00000111b ; отследить RET'ы
|
||
jr nz,.L8-4
|
||
.L9 call .SpdDec
|
||
ld hl,(Reg._SP) ; стек
|
||
dec hl
|
||
jr .L8+3
|
||
cp 00000010b ; отследить JP
|
||
jr z,.L8+3
|
||
.L8 call .SpdInc
|
||
inc hl
|
||
call Ld_a_hl
|
||
ld b,a
|
||
; ld a,(hl)
|
||
inc hl
|
||
call Ld_a_hl
|
||
; ld h,(hl)
|
||
ld h,a
|
||
ld l,b
|
||
jr .NPC
|
||
.L2 call List ; следующая команда
|
||
.NPC
|
||
ld (Reg._PC),hl ; новый PC
|
||
push hl
|
||
push hl
|
||
ld a,(KEYB.KList.Descript) ; количество строк листинга
|
||
call KEYB.AdrListTabl ; нижний адрес листинга
|
||
ld de,(ListAddr) ; верхний адрес листинга
|
||
pop bc ; новый PC
|
||
call AdrArea
|
||
jr nc,.L1+4
|
||
|
||
.L1 ld (ListAddr),bc ; новая страница листинга
|
||
pop hl
|
||
|
||
call Ld_a_hl ; следующие за командой байты
|
||
ld c,a
|
||
inc hl
|
||
call Ld_a_hl
|
||
ld b,a
|
||
inc hl
|
||
call Ld_a_hl
|
||
push bc
|
||
push af
|
||
push hl
|
||
|
||
push hl
|
||
ld hl,(RezAdr) ; адрес посадки резидента
|
||
ld a,h
|
||
and 11000000b
|
||
cp 10000000b ; окно посадки резидента
|
||
ld a,0xFF ; FF - резидент во 2-м окне
|
||
jr nz,.L30
|
||
ld de,Rezident.RetIn-Rezident
|
||
jr .L30+4
|
||
.L30 ld de,Rezident.RetIn1-Rezident
|
||
inc a ; 0 - резидент не во 2-м окне
|
||
ld (.WRez),a
|
||
add hl,de ; адрес возврата в резидент
|
||
ex de,hl
|
||
pop hl
|
||
ld a,d ; прописываем после
|
||
call Ld_hl_a ; отлаживаемой команды
|
||
dec hl
|
||
ld a,e
|
||
call Ld_hl_a
|
||
dec hl
|
||
ld a,0xC3 ; JP
|
||
call Ld_hl_a
|
||
|
||
ld hl,(RezAdr) ; адрес посадки
|
||
push hl ; коррекция адресов кода резидента
|
||
ld (Rezident.K1+1),hl ; номер банки под отладчиком
|
||
ld (Rezident.K6+1),hl
|
||
inc hl
|
||
ld (Rezident.K3+1),hl ; аккумулятор прграммы
|
||
ld (Rezident.RetIn+1),hl
|
||
ld (Rezident.RetIn1+1),hl
|
||
inc hl
|
||
ld (Rezident.K2+1),hl ; пара HL программы
|
||
ld (Rezident.K4+1),hl
|
||
inc hl
|
||
inc hl
|
||
ld (Rezident.K5+1),hl ; 1 и 2 байты буфера
|
||
inc hl
|
||
inc hl
|
||
ld (Rezident.K5+7),hl ; 3 и 4 байты буфера
|
||
inc hl
|
||
inc hl
|
||
ld (Rezident.K5+13),hl ; 5 и 6 байты буфера
|
||
inc hl
|
||
inc hl
|
||
ld (Rezident.K5+19),hl ; 7 байт буфера
|
||
|
||
ld a,(.WRez) ; флаг посадки резидента
|
||
or a
|
||
jr nz,.L31
|
||
ld de,Rezident.Start1-Rezident
|
||
ld hl,(RezAdr) ; адрес посадки
|
||
add hl,de ; старт резидента не во 2-м окне
|
||
jr .L32
|
||
|
||
.L31 inc hl ; старт резидента во 2-м окне
|
||
ld (.Run1+1),hl
|
||
|
||
ld hl,AdrTmpBuf
|
||
ld de,Rezident.Start+1 ; сохранение 7 байт в резиденте
|
||
ld b,3
|
||
.L33 ld a,(hl)
|
||
ld (de),a
|
||
inc hl
|
||
inc de
|
||
ld a,(hl)
|
||
ld (de),a
|
||
inc hl
|
||
inc de
|
||
inc de
|
||
inc de
|
||
inc de
|
||
inc de
|
||
djnz .L33
|
||
ld a,(hl)
|
||
ld (de),a
|
||
|
||
ld de,.Run1+2 ; вспомогательная процедура
|
||
ld b,7 ; длина
|
||
.L34 ld a,(de)
|
||
ld (hl),a
|
||
dec hl
|
||
dec de
|
||
djnz .L34
|
||
inc hl
|
||
|
||
.L32 ld (.Run+1),hl
|
||
|
||
ld a,(Reg._AF+1) ; аккумулятор программы
|
||
ld (Rezident+1),a ; в резидент
|
||
ld hl,(Reg._HL) ; пара HL
|
||
ld (Rezident+2),hl ; в резидент
|
||
|
||
pop hl ; адрес посадки резидента
|
||
ld de,Rezident ; начало резидента
|
||
ld bc,.Buffer
|
||
ld a,Rezident.End-Rezident ; длина резидента
|
||
.L3 push af
|
||
call Ld_a_hl
|
||
ld (bc),a ; сохранение памяти под резидентом
|
||
ld a,(de) ; копирование резидента
|
||
call Ld_hl_a
|
||
inc bc
|
||
inc de
|
||
inc hl
|
||
pop af
|
||
dec a
|
||
jr nz,.L3
|
||
|
||
ld a,(WinPage) ; банка в 0-ом окне
|
||
out (EmmWin.P0),a
|
||
|
||
call RestAllRegs
|
||
ld (StackDebug),sp ; стек отладчика
|
||
ld sp,(Reg._SP) ; стек программы
|
||
.Run jp 0 ; пуск резидента
|
||
|
||
ld (Reg._SP),sp ; стек программы
|
||
ld sp,(StackDebug) ; стек отладчика
|
||
call SaveAllRegs
|
||
in a,(EmmWin.P0)
|
||
ld (WinPage),a ; банка в 0-ом окне
|
||
ld a,(BankOS) ; банка с OS
|
||
out (EmmWin.P0),a
|
||
|
||
ld hl,(RezAdr)
|
||
call Ld_a_hl
|
||
ld (WinPage+2),a ; номер банки во 2-ом окне
|
||
inc hl ; аккумулятор программа
|
||
call Ld_a_hl
|
||
ld (Reg._AF+1),a
|
||
ld a,(.WRez) ; флаг резидента
|
||
or a
|
||
jr z,.L35 ; не во 2-м окне
|
||
inc hl ; регистр L программы
|
||
call Ld_a_hl
|
||
ld (Reg._HL),a
|
||
inc hl ; регистр H программы
|
||
call Ld_a_hl
|
||
ld (Reg._HL+1),a
|
||
ld b,7
|
||
ld de,AdrTmpBuf
|
||
.L36 inc hl ; буфер 7-ми байт
|
||
call Ld_a_hl
|
||
ld (de),a ; востановили
|
||
inc de
|
||
djnz .L36
|
||
|
||
.L35 pop hl
|
||
pop af ; востановили код команды
|
||
pop bc
|
||
call Ld_hl_a
|
||
dec hl
|
||
ld a,b
|
||
call Ld_hl_a
|
||
dec hl
|
||
ld a,c
|
||
call Ld_hl_a
|
||
|
||
ld de,.Buffer ; восстановление памяти под резидентом
|
||
ld hl,(RezAdr) ; адрес посадки
|
||
ld b,Rezident.End-Rezident ; длина резидента
|
||
.L4 ld a,(de)
|
||
call Ld_hl_a
|
||
inc de
|
||
inc hl
|
||
djnz .L4
|
||
ei
|
||
ret
|
||
|
||
.BankP ld a,0xFF ; (2) банка под отладчиком
|
||
out (EmmWin.P2),a ; (2)
|
||
.Run1 jp 0 ; (3) переход в резидент
|
||
|
||
.SpdInc push af ; увеличение глубины стека
|
||
ld a,(StackDown)
|
||
inc a
|
||
ld (StackDown),a
|
||
pop af
|
||
ret
|
||
|
||
.SpdDec push af ; уменьшение глубины стека
|
||
ld a,(StackDown)
|
||
dec a
|
||
ld (StackDown),a
|
||
pop af
|
||
ret
|
||
|
||
.Flag DB On ; флаг захода в подпрограммы
|
||
.WRez DB 0 ; флаг окна посадки резидента
|
||
|
||
.Buffer DS Rezident.End-Rezident ; длина резидента
|
||
|
||
ENDMODULE |