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

477 lines
18 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.

;[]=========================================================================[]
;[] Обработка клавиатуры в окне регистров []
;[] 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