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

924 lines
39 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.

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