DemoN/step.asm
2024-08-08 14:52:38 +03:00

433 lines
18 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;[]=========================================================================[]
;[] Отладка команд программы []
;[] 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