mirror of
https://github.com/romychs/DemoN.git
synced 2025-04-09 22:06:42 +03:00
477 lines
18 KiB
NASM
477 lines
18 KiB
NASM
;[]=========================================================================[]
|
||
;[] Обработка клавиатуры в окне регистров []
|
||
;[] v0.03 - последние изменения 11.03.2006 []
|
||
;[] v0.10 - последние изменения 14.05.2006 []
|
||
;[]=========================================================================[]
|
||
MODULE KREG
|
||
KReg
|
||
; ld a,b ;состояние <Shift><Alt><Ctrl>
|
||
; and 0b11110000
|
||
; jr z,.L100
|
||
|
||
; Обработка комбинации Shift + символ
|
||
; and 0b11000000 ;<Shift>
|
||
; or a
|
||
; jp z,KEYB.Keyb.Keyb_L1
|
||
; ld a,d
|
||
; cp 0x80+0x0F ;Shift+Tab
|
||
; jp nz,KEYB.Keyb.Keyb_L1
|
||
; ld a,2 ;номер окна дампа
|
||
; ld (Keyb.WinScreen),a
|
||
; jp Keyb_NC
|
||
|
||
; Обработка позиционного кода
|
||
.L100 ld a,e ; ASCII код
|
||
ld (.ASC_COD),a
|
||
ld a,d ; позиционный код
|
||
|
||
cp RIGHT_KEY ; <Right>
|
||
jr nz,.L101
|
||
call .DescCalc
|
||
ld a,(hl) ; кол-во колонок
|
||
cp e
|
||
ld a,e
|
||
jr nz,.L9FC0
|
||
xor a
|
||
.L9FC0
|
||
inc a
|
||
ld (.Coordinate),a ; текущая колонка
|
||
jp KEYB.Keyb_NC
|
||
|
||
.L101 cp LEFT_KEY ; <Left>
|
||
jr nz,.L102
|
||
call .DescCalc
|
||
ld a,e ; текущая колонка
|
||
cp 1
|
||
jr nz,.L9FD5
|
||
ld a,(hl) ; кол-во колонок
|
||
inc a
|
||
.L9FD5
|
||
dec a
|
||
ld (.Coordinate),a ; текущая колонка
|
||
jp KEYB.Keyb_NC
|
||
|
||
.L102 ld hl,(.Descript)
|
||
ld de,(.Coordinate)
|
||
cp DN_KEY ; <Down>
|
||
jr nz,.L103
|
||
ld a,d ; текущая строка
|
||
cp l
|
||
jr nz,.L104
|
||
ld a,h ; 1-я строка
|
||
dec a
|
||
.L104 inc a
|
||
jr .L107P1
|
||
|
||
.L103 cp UP_KEY ; <Up>
|
||
jr nz,.L105
|
||
ld a,d ; текущая строка
|
||
cp h
|
||
jr nz,.L107
|
||
ld a,l ; адрес последней строки
|
||
inc a
|
||
.L107 dec a
|
||
.L107P1 ld h,a
|
||
ld l,1
|
||
ld (.Coordinate),hl
|
||
jp KEYB.Keyb_NC
|
||
|
||
.L105 ld b,3
|
||
cp PGDN_KEY ; <PgDown>
|
||
jr nz,.L108
|
||
ld hl,.PgDown
|
||
ld a,d ; текущая строка
|
||
.LA00E
|
||
cp (hl)
|
||
jr c,.LA014
|
||
inc hl
|
||
djnz .LA00E
|
||
.LA014
|
||
ld a,(hl)
|
||
jr .L107+1
|
||
|
||
.L108 cp PGUP_KEY ; <PgUp>
|
||
jr nz,.L110
|
||
ld hl,.PgUp
|
||
ld a,d ; текущая строка
|
||
.LA01F
|
||
cp (hl)
|
||
jr nc,.LA025
|
||
inc hl
|
||
djnz .LA01F
|
||
.LA025
|
||
ld a,(hl)
|
||
dec a
|
||
jr .L107P1
|
||
|
||
.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
|
||
call .DescCalc
|
||
ld a,(hl) ; последняя колонка
|
||
ld (.Coordinate),a ; первая колонка
|
||
jp KEYB.Keyb_NC
|
||
|
||
;.L112 cp 0x0F ; <Tab>
|
||
; jr nz,.L200
|
||
; ld a,4 ; номер окна листинга
|
||
; ld (Keyb.WinScreen),a
|
||
; jp Keyb_NC
|
||
|
||
; Обработка ASCII кодов
|
||
.L200
|
||
.ASC_COD+* 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
|
||
jp nz,.L205
|
||
ld de,(.Coordinate)
|
||
ld a,d ; номер строки
|
||
ld c,e ; номер колонки
|
||
ex de,hl ; координаты
|
||
ld hl,Reg._AF+1 ; рег A
|
||
cp 6 ; строка с парой AF?
|
||
jr z,.L207
|
||
ld hl,Reg._AF_+1 ; рег A'
|
||
cp 11 ; строка с парой AF'?
|
||
jr z,.L207
|
||
ld hl,Reg._AF ; рег F
|
||
cp 7 ; строка с парой AF?
|
||
jr z,.LA077
|
||
ld hl,Reg._AF_ ; рег F'
|
||
cp 12 ; строка с парой AF'?
|
||
jr nz,.L206
|
||
.LA077
|
||
ld a,c ; коррекция номеров бит
|
||
cp 4 ; колонка 4..6?
|
||
jr c,.LA07F
|
||
inc c
|
||
jr .L207-4
|
||
.LA07F
|
||
cp 3 ; колонка 3?
|
||
jr z,.L207-4
|
||
dec c
|
||
ld a,7
|
||
jr .L208
|
||
.L207 ld a,10 ; колонки с битами
|
||
cp c
|
||
jr z,.L206
|
||
dec a
|
||
.L208 sub c ; номер бита
|
||
rlca
|
||
rlca
|
||
rlca ; заготовка для битовых операций
|
||
ld b,a
|
||
or 01000110b ; для BIT
|
||
ld (.BIT_TST),a
|
||
ld a,b
|
||
or 11000110b ; для SET
|
||
ld (.BIT_SET),a
|
||
ld a,b
|
||
or 10000110b ; для RES
|
||
ld (.BIT_RST),a
|
||
.BIT_TST+1 bit 0,(hl) ; состояние бита
|
||
jr nz,.LA0AD
|
||
.BIT_SET+1 set 0,(hl) ; установка бита
|
||
jp KEYB.Keyb_RF
|
||
.LA0AD
|
||
.BIT_RST+1 res 0,(hl) ; сброс бита
|
||
jp KEYB.Keyb_RF
|
||
|
||
.L206 ex de,hl ; координаты
|
||
call KEYB.InputLine ; ввод символа
|
||
jp c,KEYB.Keyb_NC ; завершение ввода по <ESC>
|
||
ld de,.L204-5
|
||
push de
|
||
ld de,(.Coordinate)
|
||
ld hl,Reg._AF+1
|
||
ld a,d
|
||
ld de,0
|
||
cp 6 ; строка с парой AF
|
||
ret z
|
||
ld hl,Reg._AF_+1
|
||
cp 11 ; строка с парой AF'?
|
||
ret z
|
||
ld de,(.Coordinate)
|
||
ld a,e
|
||
sub 6
|
||
ld e,a
|
||
jr .L209
|
||
|
||
.L205 dec a ; байты в минидампе
|
||
jr nz,.L202
|
||
call KEYB.InputLine ; ввод числа
|
||
jp c,KEYB.Keyb_NC ; завершение ввода по <ESC>
|
||
call KEYB.PutCode
|
||
jp c,.L201 ; ошибка в веденных данных
|
||
ld de,.L204
|
||
push de
|
||
ld de,(.Coordinate)
|
||
.L209 dec d
|
||
jr nz,.LA0F9
|
||
ld hl,(Reg._IX)
|
||
ret
|
||
.LA0F9
|
||
dec d
|
||
jr nz,.LA100
|
||
ld hl,(Reg._IY)
|
||
ret
|
||
.LA100
|
||
dec d
|
||
jr nz,.LA107
|
||
ld hl,(Reg._HL)
|
||
ret
|
||
.LA107
|
||
dec d
|
||
jr nz,.LA10E
|
||
ld hl,(Reg._DE)
|
||
ret
|
||
.LA10E
|
||
dec d
|
||
jr nz,.LA115
|
||
ld hl,(Reg._BC)
|
||
ret
|
||
.LA115
|
||
dec d
|
||
dec d
|
||
dec d
|
||
jr nz,.LA11E
|
||
ld hl,(Reg._HL_)
|
||
ret
|
||
.LA11E
|
||
dec d
|
||
jr nz,.LA125
|
||
ld hl,(Reg._DE_)
|
||
ret
|
||
.LA125
|
||
dec d
|
||
ld hl,(Reg._BC_)
|
||
ret
|
||
|
||
ld a,(KEYB.InputLine.Buffer)
|
||
jr .LA134
|
||
.L204 ld a,(KEYB.PutCode.Buffer) ; записываемый байт
|
||
dec e
|
||
dec e ; смещение в минидампе
|
||
.LA134
|
||
add hl,de ; адрес в памяти
|
||
call Ld_hl_a ; записали
|
||
jp KEYB.Keyb_RF
|
||
|
||
.L202 dec a ; однобайтное число (номер банки)
|
||
jr nz,.L203
|
||
call KEYB.InputLine ; ввод числа
|
||
jp c,KEYB.Keyb_NC ; завершение ввода по <ESC>
|
||
call KEYB.PutAddress
|
||
jp c,.L201 ; ошибка в веденных данных
|
||
ld de,KEYB.Keyb_RF
|
||
push de
|
||
ld a,l
|
||
ld de,(.Coordinate)
|
||
dec e ; колонка в строке
|
||
jr nz,.LA15A
|
||
ld (WinPage),a ; 0-е окно
|
||
ret
|
||
.LA15A
|
||
dec e
|
||
jr nz,.LA163
|
||
ld (WinPage+1),a ; 1-е окно
|
||
out (EmmWin.P1),a
|
||
ret
|
||
.LA163
|
||
dec e
|
||
jr nz,.LA16A
|
||
ld (WinPage+2),a ; 2-е окно
|
||
ret
|
||
.LA16A
|
||
ld (WinPage+3),a ; 3-е окно
|
||
out (EmmWin.P3),a
|
||
ret
|
||
|
||
.L203 dec a ; глубина стека
|
||
jr nz,.L210
|
||
xor a ; обнулить
|
||
ld (StackDown),a
|
||
jp KEYB.Keyb_RF
|
||
|
||
.L210 ;dec a ; двухбайтное число
|
||
;jp nz,KEYB.Keyb.Keyb_L1
|
||
call KEYB.InputLine ; ввод числа в рег пары
|
||
jp c,KEYB.Keyb_NC ; завершение ввода по <ESC>
|
||
call KEYB.PutAddress
|
||
jp c,.L201 ; ошибка в веденных данных
|
||
ld de,KEYB.Keyb_RF
|
||
push de
|
||
ld de,(.Coordinate)
|
||
dec d
|
||
jr nz,.LA195
|
||
ld (Reg._IX),hl
|
||
ret
|
||
.LA195
|
||
dec d
|
||
jr nz,.LA19C
|
||
ld (Reg._IY),hl
|
||
ret
|
||
.LA19C
|
||
dec d
|
||
jr nz,.LA1A3
|
||
ld (Reg._HL),hl
|
||
ret
|
||
.LA1A3
|
||
dec d
|
||
jr nz,.LA1AA
|
||
ld (Reg._DE),hl
|
||
ret
|
||
.LA1AA
|
||
dec d
|
||
jr nz,.LA1B1
|
||
ld (Reg._BC),hl
|
||
ret
|
||
.LA1B1
|
||
dec d
|
||
jr nz,.LA1B8
|
||
ld (Reg._AF),hl
|
||
ret
|
||
.LA1B8
|
||
dec d
|
||
dec d
|
||
jr nz,.LA1C0
|
||
ld (Reg._HL_),hl
|
||
ret
|
||
.LA1C0
|
||
dec d
|
||
jr nz,.LA1C7
|
||
ld (Reg._DE_),hl
|
||
ret
|
||
.LA1C7
|
||
dec d
|
||
jr nz,.LA1CE
|
||
ld (Reg._BC_),hl
|
||
ret
|
||
.LA1CE
|
||
dec d
|
||
jr nz,.LA1D5
|
||
ld (Reg._AF_),hl
|
||
ret
|
||
.LA1D5
|
||
dec d
|
||
dec d
|
||
jr nz,.LA1E4
|
||
dec e
|
||
jr z,.LA1E0
|
||
ld (Reg._IR),hl
|
||
ret
|
||
.LA1E0
|
||
ld (Reg._PC),hl
|
||
ret
|
||
.LA1E4
|
||
dec e
|
||
jr z,.L211
|
||
.Rez ld bc,Rezident.End-Rezident ; длина резидента
|
||
push hl ; новое начало резидента
|
||
add hl,bc ; новый конечный адрес резидента
|
||
ld a,h
|
||
and 11000000b
|
||
ld d,a
|
||
pop hl
|
||
ld a,h
|
||
and 11000000b
|
||
cp d ; резидент пересекает окно?
|
||
jr z,.L212
|
||
ld h,d
|
||
ld l,0
|
||
dec hl ; последний адрес окна с резидентом
|
||
or a
|
||
sbc hl,bc
|
||
.L212 ld (RezAdr),hl
|
||
ret
|
||
.L211 ld (Reg._SP),hl
|
||
ret
|
||
|
||
; Расчет дескриптора строки в окне регистров
|
||
.DescCalc ld de,(.Coordinate) ; текущие координаты
|
||
ld hl,.Descript+1
|
||
ld b,d ; номер строки
|
||
.LA20E
|
||
inc hl ; дескриптор строки
|
||
inc hl
|
||
djnz .LA20E
|
||
ld a,(hl) ; номер дескриптора строки
|
||
add a,a
|
||
ld c,a
|
||
dec hl
|
||
ld b,(hl)
|
||
push bc
|
||
ld b,0
|
||
ld hl,.DTabl
|
||
add hl,bc
|
||
ld a,(hl) ; начало дескриптора
|
||
inc hl
|
||
ld h,(hl)
|
||
ld l,a
|
||
pop bc
|
||
ret
|
||
|
||
.PgDown DB 2,7,12,15
|
||
.PgUp DB 14,9,4,2
|
||
|
||
.Coordinate DW 0x0101 ; курсор (стр/кол курсора)
|
||
|
||
.Descript:
|
||
DW 0x010F ; первая/кол-во строк окна
|
||
|
||
DB 0x01,0 ; номер строки, номер дескриптора
|
||
DB 0x02,0,0x04,0
|
||
DB 0x05,0,0x06,0,0x07,1
|
||
DB 0x08,2,0x0A,0,0x0B,0
|
||
DB 0x0C,0,0x0D,1,0x0E,2
|
||
DB 0x10,3,0x12,4,0x14,5
|
||
|
||
.DTabl DW .D1,.D2,.D3,.D4,.D5,.D6
|
||
|
||
.D1 DB 9 ; кол-во колонок для пар
|
||
DB 0x04 ; N столбца колонки
|
||
DB 5 ; ширина колонки
|
||
DB 0x0A,2,0x0C,2,0x0F,2,0x11,2
|
||
DB 0x14,1,0x15,1,0x16,1,0x17,1
|
||
|
||
.D2 DB 10 ; кол-во колонок для пары AF
|
||
DB 0x04 ; N столбца колонки
|
||
DB 5 ; ширина колонки
|
||
DB 0x0B,1,0x0C,1,0x0D,1,0x0E,1
|
||
DB 0x0F,1,0x10,1,0x11,1,0x12,1
|
||
DB 0x15,1
|
||
|
||
.D3 DB 6 ; кол-во колонок для флагов
|
||
DB 0x01 ; N столбца колонки
|
||
DB 1 ; ширина колонки
|
||
DB 0x02,1,0x04,1
|
||
DB 0x06,1,0x07,1,0x08,1
|
||
|
||
.D4 DB 2 ; кол-во колонок для PC IR
|
||
DB 0x04 ; N столбца колонки
|
||
DB 5 ; ширина колонки
|
||
DB 0x0D,5
|
||
|
||
.D5 DB 4 ; кол-во колонок для банок
|
||
DB 0x02 ; N столбца колонки
|
||
DB 3 ; ширина колонки
|
||
DB 0x08,3,0x0E,3,0x14,3
|
||
|
||
.D6 DB 3 ; кол-во колонок
|
||
DB 0x04 ; N столбца колонки
|
||
DB 5 ; ширина колонки
|
||
DB 0x0A,4
|
||
DB 0x13,5
|
||
|
||
ENDMODULE |