mirror of
https://github.com/romychs/DemoN.git
synced 2025-04-09 22:06:42 +03:00
216 lines
8.8 KiB
NASM
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
|
|
|