;[]=========================================================================[] ;[] Обработка клавиатуры в окне регистров [] ;[] v0.03 - последние изменения 11.03.2006 [] ;[] v0.10 - последние изменения 14.05.2006 [] ;[]=========================================================================[] MODULE KREG KReg ; ld a,b ;состояние ; and 0b11110000 ; jr z,.L100 ; Обработка комбинации Shift + символ ; and 0b11000000 ; ; 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 ; 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 ; 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 ; 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 ; 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 ; 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 ; 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 ; jr nz,.L111 ld a,1 ld (.Coordinate),a ; первая колонка jp KEYB.Keyb_NC .L111 cp END_KEY ; jr nz,.L200 call .DescCalc ld a,(hl) ; последняя колонка ld (.Coordinate),a ; первая колонка jp KEYB.Keyb_NC ;.L112 cp 0x0F ; ; jr nz,.L200 ; ld a,4 ; номер окна листинга ; ld (Keyb.WinScreen),a ; jp Keyb_NC ; Обработка ASCII кодов .L200 .ASC_COD+* ld a,0 ; ASCII код cp ENTER_KEY ; 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 ; завершение ввода по 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 ; завершение ввода по 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 ; завершение ввода по 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 ; завершение ввода по 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