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

260 lines
10 KiB
NASM

;[]=========================================================================[]
;[] Обработка клавиатуры в окне дампа []
;[] v0.10 - последние изменения 31.03.2006 []
;[]=========================================================================[]
MODULE KDUMP
KDump:
ld a,b ; состояние <Shift><Alt><Ctrl>
and 11110000b
jr z,.L100
; Обработка комбинации Ctrl + символ
.L10 cp 00100000b ; <Ctrl>
jp nz,.L100
ld a,d ; позиционный код
cp SHIFTED_KEY+END_KEY ; <Ctrl>+<End>
jr nz,.L11
ld hl,.Coordinate ; текущая колонка
ld a,16
cp (hl)
jr nc,.L415
ld a,32
.L415
inc a
ld (hl),a
jp KEYB.Keyb_NC
.L11 cp SHIFTED_KEY+HOME_KEY ; <Ctrl>+<Home>
jp nz,KEYB.Keyb_NC
; jr nz,.L11
ld hl,.Coordinate ; текущая колонка
ld a,18
cp (hl)
jr c,.L11P8
ld a,2
cp (hl)
jr c,.L11P8
dec a
.L11P8
ld (hl),a
jp KEYB.Keyb_NC
; Обработка позиционного кода
.L100 ld a,e ; ASCII код
ld (.L200+1),a
ld a,d ; позиционный код
ld de,(.Coordinate) ; текущие координаты курсора
cp 0x56 ; <Right>
jr nz,.L101
ld a,(.Descript+2) ; кол-во колонок
cp e
ld a,e
jr nz,.LA446
xor a
.LA446
inc a
ld (.Coordinate),a ; текущая колонка
jp KEYB.Keyb_NC
.L101 cp 0x54 ; <Left>
jr nz,.L102
ld a,e ; текущая колонка
cp 1
jr nz,.L101P6
ld a,(.Descript+2) ; кол-во колонок
inc a
.L101P6
dec a
ld (.Coordinate),a ; текущая колонка
jp KEYB.Keyb_NC
.L102 ld hl,(.Descript)
cp DN_KEY ; <Down>
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.Keyb_RF
.L104 inc a
ld (.Coordinate+1),a
jp KEYB.Keyb_NC
.L103 cp UP_KEY ; <Up>
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.Keyb_RF
.L107 dec a
ld (.Coordinate+1),a
jp KEYB.Keyb_NC
.L105 cp PGDN_KEY ; <PgDown>
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.Keyb_RF
.L106 ld a,l ; на последнюю строку
ld (.Coordinate+1),a
jp KEYB.Keyb_NC
.L108 cp PGUP_KEY ; <PgUp>
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.Keyb_RF
jr nz,.L109
.L109 ld a,h ; на первую строку
ld (.Coordinate+1),a
jp KEYB.Keyb_NC
.L110 cp HOME_KEY ; <Home>
jr nz,.L111
ld a,1
ld (.Coordinate),a ; первая колонка
jp KEYB.Keyb_NC
.L111 cp END_KEY ; <End>
jr nz,.L200
ld a,(.Descript+2)
ld (.Coordinate),a ; первая колонка
jp KEYB.Keyb_NC
; Обработка ASCII кодов
.L200 ld a,0 ; ASCII код
cp ENTER_KEY ; <Enter>
jp nz,KEYB.Keyb_L1
.L201
.ESTR_LEN+* ld b,0 ; длина строки ввода
.ESTR_POS+* ld hl,0 ; координаты строки ввода
ld a,b
dec a
jr z,.L202
dec a
jr z,.L203
call KEYB.InputLine ; ввод адреса
jp c,KEYB.Keyb_NC ; завершение ввода по <ESC>
call KEYB.PutAddress
jp c,.L201 ; ошибка в веденных данных
ld de,16 ; кол-во байт в строке
ld a,(.Coordinate+1) ; номер строки
sub 0x16 ; координата первой строки
jr z,.L522
ld b,a
.L51D
or a
sbc hl,de
djnz .L51D
.L522
ld (Dump1),hl
jp KEYB.Keyb_RF
.L202 call KEYB.InputLineEd ; ввод символа
jp c,KEYB.Keyb_NC ; завершение ввода по <ESC>
call .L299
ld a,c
sub 18 ; первая колонка в поле данных
ld c,a
ld a,(KEYB.InputLine.Buffer)
ld de,256*18+34 ; 1-я и последняя+1 колонки
jr .L204
.L203 call KEYB.InputLineEd ; ввод кода символа
jp c,KEYB.Keyb_NC ; завершение ввода по <ESC>
call KEYB.PutCode
jp c,.L201 ; ошибка в веденных данных
call .L299
ld a,c
sub 2 ; первая колонка в поле данных
ld c,a
ld a,(KEYB.PutCode.Buffer) ; записываемый байт
ld de,256*2+18 ; 1-я и последняя+1 колонки
.L204 add hl,bc
call Ld_hl_a
ld a,(KEYB.InputLine.EntEnd) ; ввод закончен ENTER
or a
jp nz,KEYB.Keyb_RF ; да
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,.L205M1
ld hl,(Dump1) ; сдвинуть дамп
ld bc,16
add hl,bc
ld (Dump1),hl
jr .L205
.L205M1
inc (hl)
.L205 call CursorRes ; выкл курсор
call Refresh ; обновление экрана
call KEYB.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
.LA59C
add hl,de
djnz .LA59C
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
ENDMODULE