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

216 lines
8.8 KiB
NASM

;[]=========================================================================[]
;[] Обработка клавиатуры в окне дампа стека []
;[] v0.10 - последние изменения 18.03.2006 []
;[]=========================================================================[]
KStack:
ld a,b ;состояние <Shift><Alt><Ctrl>
and SHIFTS_MASK
; ld b,a
jr z,.L100
;Обработка комбинации Shift + символ
; and 11000000b ;<Shift>
; or a
; jr z,.L10
; ld a,d
;; cp 0x80+0x0F ;Shift+Tab
;; jp nz,KEYB.Keyb.Keyb_L1
;; ld a,3 ;номер окна дампа
;; ld (Keyb.WinScreen),a
; jp Keyb_NC
;Обработка комбинации Ctrl + символ
; ld a,b
cp CTRL_FLAG ; <Ctrl>
jp nz,KEYB.Keyb_L1
ld a,d ; позиционный код
cp SHIFTED_KEY+X_KEY ; <Ctrl>+<X>
jp nz,KEYB.Keyb_L1
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.Keyb_RF
; Обработка позиционного кода
.L100 ld a,e ; ASCII код
ld (.L200+1),a
ld a,d ; позиционный код
ld de,(.Coordinate) ; текущие координаты курсора
cp RIGHT_KEY ; <Right>
jr nz,.L101
ld a,(.Descript+2) ; кол-во колонок
cp e
ld a,e
jr nz,.LA2E6
xor a
.LA2E6
inc a
ld (.Coordinate),a ; текущая колонка
jp KEYB.Keyb_NC
.L101 cp LEFT_KEY ; <Left>
jr nz,.L102
ld a,e ; текущая колонка
cp 1
jr nz,.LA2FA
ld a,(.Descript+2) ; кол-во колонок
inc a
.LA2FA
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,(StackDump) ; адрес 1-ой строки
dec hl
dec hl
ld (StackDump),hl
ld hl,PrintStrSP.StrSp ; строка верш.стека
ld a,-1
cp (hl) ; в дампе?
jr z,.LA31D
dec (hl)
.LA31D
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,(StackDump) ; адрес 1-ой строки
inc hl
inc hl
ld (StackDump),hl
ld hl,PrintStrSP.StrSp ; строка верш.стека
ld a,(hl)
cp 7 ; на последней строке?
jr c,.LA342
ld a,-2
ld (hl),a ; верш.стека не попадает в дамп
.LA342
inc (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,(StackDump)
ld bc,2*7
or a
sbc hl,bc
ld (StackDump),hl
ld a,-1
ld (PrintStrSP.StrSp),a ; строка верш.стека
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,(StackDump)
ld bc,2*7
add hl,bc
ld (StackDump),hl
ld a,-1
ld (PrintStrSP.StrSp),a ; строка верш.стека
jp KEYB.Keyb_RF
.L109 ld a,h ; на первую строку
ld (.Coordinate+1),a
jp KEYB.Keyb_NC
.L110 cp HOME_KEY ; <Home>
jr nz,.L200
ld a,6
ld (PrintStrSP.StrSp),a ; строка верш.стека
jp KEYB.Keyb_RF
;.L111 cp 0x0F ;<Tab>
; jr nz,.L200
; ld a,1 ; номер окна листинга
; ld (Keyb.WinScreen),a
; jp KEYB.Keyb_NC
;Обработка ASCII кодов
.L200 ld a,0 ; ASCII код
cp 0x0D ; <Enter>
jp nz,KEYB.Keyb_L1
.L201
.ESTR_LEN+* ld b,0 ; длина строки ввода
.ESTR_POS+* ld hl,0 ; координаты строки ввода
call KEYB.InputLine ; ввод числа
jp c,KEYB.Keyb_NC ; завершение ввода по <ESC>
call KEYB.PutAddress
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.Keyb_RF
.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.Keyb_RF
.Coordinate DW 0x1601 ;курсор (стр/кол курсора)
.Descript
DW 0x161D ;первая/последняя строка окна
DB 2 ;кол-во колонок
DB 0x01 ;N столбца колонки
DB 5 ;ширина колонки
DB 0x07,5