From 877d86874502edde593b6dccaea7a5f2efe20862 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 20 Nov 2018 19:29:23 -0800 Subject: [PATCH] Refactoring --- Doc/ChangeLog.txt | 1 + Source/HBIOS/dbgmon.asm | 125 ++++++--------- Source/HBIOS/dsky.asm | 338 +++++++++++++++++++++------------------- Source/HBIOS/romldr.asm | 6 +- 4 files changed, 228 insertions(+), 242 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index bd0980d2..489701db 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -21,6 +21,7 @@ Version 2.9.1 - WBW: Refactored Debug Monitor w/ improved syntax parsing and help - PMS: Added Forth, Nascom BASIC, and Tasty BASIC to ROM - PMS: Refactored Rom Loader to support more ROM images, now table driven +- WBW: Refactored DSKY code Version 2.9.0 ------------- diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index 879beb5e..2dd8820a 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -29,6 +29,7 @@ JP DSKY_ENTRY JP UART_ENTRY ; +#DEFINE USEDELAY #INCLUDE "util.asm" ; ;__UART_ENTRY_________________________________________________________________ @@ -106,13 +107,14 @@ SERIALCMDLOOP: ;_____________________________________________________________________________ ; INITIALIZE: -; CALL CIOCON_DISP + (CF_INIT * 3) #IF (PLATFORM == PLT_UNA) ; INSTALL UNA INVOCATION VECTOR FOR RST 08 LD A,$C3 ; JP INSTRUCTION LD (8),A ; STORE AT 0x0008 LD HL,($FFFE) ; UNA ENTRY VECTOR LD (9),HL ; STORE AT 0x0009 +#ELSE + CALL DELAY_INIT #ENDIF RET ; @@ -914,6 +916,8 @@ TXT_HELP: #DEFINE DSKY_KBD #INCLUDE "dsky.asm" ; +KY_PR .EQU KY_FW ; USE [FW] FOR [PR] (PORT READ) +KY_PW .EQU KY_BK ; USE [BW] FOR [PW] (PORT WRITE) ; ;__DSKY_ENTRY_________________________________________________________________ ; @@ -923,14 +927,14 @@ TXT_HELP: DSKY_ENTRY: LD SP,MON_STACK ; SET THE STACK POINTER EI ; INTS OK NOW - CALL INITIALIZE ; INITIALIZE SYSTEM + CALL INITIALIZE ; ;__FRONT_PANEL_STARTUP________________________________________________________ ; ; START UP THE SYSTEM WITH THE FRONT PANEL INTERFACE ;_____________________________________________________________________________ ; - CALL MTERM_INIT ; INIT 8255 FOR MTERM + CALL DSKY_INIT ; INIT 8255 ; ;__COMMAND_PARSE______________________________________________________________ ; @@ -939,21 +943,21 @@ DSKY_ENTRY: ; FRONTPANELLOOP: LD HL,CPUUP ; SET POINTER TO DATA BUFFER - CALL DSKY_SHOWRAW ; DISPLAY + CALL DSKY_SHOWSEG ; DISPLAY CALL KB_GET ; GET KEY FROM KB - CP 10H ; IS PORT READ? + CP KY_PR ; IS PORT READ? JP Z,DOPORTREAD ; YES, JUMP - CP 11H ; IS PORT WRITE? + CP KY_PW ; IS PORT WRITE? JP Z,DOPORTWRITE ; YES, JUMP - CP 14H ; IS DEPOSIT? + CP KY_DE ; IS DEPOSIT? JP Z,DODEPOSIT ; YES, JUMP - CP 15H ; IS EXAMINE? + CP KY_EX ; IS EXAMINE? JP Z,DOEXAMINE ; YES, JUMP - CP 16H ; IS GO? + CP KY_GO ; IS GO? JP Z,DOGO ; YES, JUMP - CP 17H ; IS BO? + CP KY_BO ; IS BOOT? JP Z,DOBOOT ; YES, JUMP JR FRONTPANELLOOP ; LOOP @@ -988,9 +992,9 @@ PORTREADLOOP: CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS PORTREADGETKEY: CALL KB_GET ; GET KEY FROM KB - CP 12H ; [CL] PRESSED, EXIT + CP KY_CL ; [CL] PRESSED, EXIT JR Z,FRONTPANELLOOP ; - CP 10H ; [PR] PRESSED, PROMPT FOR NEW PORT + CP KY_PR ; [PR] PRESSED, PROMPT FOR NEW PORT JR Z,DOPORTREAD ; JR PORTREADGETKEY ; NO VALID KEY, LOOP ; @@ -1015,9 +1019,9 @@ PORTWRITELOOP: CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS PORTWRITEGETKEY: CALL KB_GET ; GET KEY FROM KB - CP 12H ; [CL] PRESSED, EXIT + CP KY_CL ; [CL] PRESSED, EXIT JR Z,FRONTPANELLOOP ; - CP 11H ; [PW] PRESSED, PROMPT FOR NEW PORT + CP KY_PW ; [PW] PRESSED, PROMPT FOR NEW PORT JR Z,DOPORTWRITE ; JR PORTWRITEGETKEY ; NO VALID KEY, LOOP ; @@ -1065,11 +1069,11 @@ EXAMINELOOP: CALL ENCDISPLAY ; DISPLAY BUFFER ON DISPLAYS EXAMINEGETKEY: CALL KB_GET ; GET KEY FROM KB - CP 12H ; [CL] PRESSED, EXIT + CP KY_CL ; [CL] PRESSED, EXIT JP Z,FRONTPANELLOOP ; - CP 13H ; [EN] PRESSED, INC ADDRESS AND LOOP + CP KY_EN ; [EN] PRESSED, INC ADDRESS AND LOOP JR Z,EXAMINEFW ; - CP 15H ; [DE] PRESSED, PROMPT FOR NEW ADDRESS + CP KY_EX ; [EX] PRESSED, PROMPT FOR NEW ADDRESS JR Z,DOEXAMINE ; JR EXAMINEGETKEY ; NO VALID KEY, LOOP EXAMINEFW: @@ -1102,11 +1106,11 @@ DEPOSITLOOP: CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS DEPOSITGETKEY: CALL KB_GET ; GET KEY FROM KB - CP 12H ; [CL] PRESSED, EXIT + CP KY_CL ; [CL] PRESSED, EXIT JP Z,FRONTPANELLOOP ; - CP 13H ; [EN] PRESSED, INC ADDRESS AND LOOP + CP KY_EN ; [EN] PRESSED, INC ADDRESS AND LOOP JR Z,DEPOSITFW ; - CP 14H ; [DE] PRESSED, PROMPT FOR NEW ADDRESS + CP KY_DE ; [DE] PRESSED, PROMPT FOR NEW ADDRESS JR Z,DODEPOSIT ; JR DEPOSITGETKEY ; NO VALID KEY, LOOP DEPOSITFW: @@ -1133,7 +1137,7 @@ GETADDR: ;_____________________________________________________________________________ ; GETVALW: - LD A,80H ; + LD A,$80 ; LD (DISPLAYBUF+4),A ; LD (DISPLAYBUF+5),A ; LD (DISPLAYBUF+6),A ; @@ -1142,11 +1146,11 @@ GETVALW1: CALL ENCDISPLAY ; GETVALWLOOP: CALL KB_GET ; - CP 10H ; + CP $10 ; JP M,GETVALWNUM ; NUMBER PRESSED, STORE IT - CP 13H ; EN PRESSED, DONE + CP KY_EN ; [EN] PRESSED, DONE JR Z,GETVALWDONE ; - CP 12H ; CLEAR PRESSED, CLEAR + CP KY_CL ; CLEAR PRESSED, CLEAR JR Z,GETVALW ; JR GETVALWLOOP ; INVALID KEY, LOOP GETVALWNUM: @@ -1206,18 +1210,18 @@ GETPORT: ;_____________________________________________________________________________ ; GETVALUE: - LD A,80H ; + LD A,$80 ; LD (DISPLAYBUF+6),A ; LD (DISPLAYBUF+7),A ; GETVALUE1: CALL ENCDISPLAY ; GETVALUELOOP: CALL KB_GET ; - CP 10H ; + CP $10 ; JP M,GETVALUENUM ; NUMBER PRESSED, STORE IT - CP 13H ; EN PRESSED, DONE + CP KY_EN ; [EN] PRESSED, DONE JR Z,GETVALUEDONE ; - CP 12H ; CLEAR PRESSED, CLEAR + CP KY_CL ; CLEAR PRESSED, CLEAR JR Z,GETVALUE ; JR GETVALUELOOP ; INVALID KEY, LOOP GETVALUENUM: @@ -1263,18 +1267,6 @@ PUTVALUE: INC DE ; NEXT BUFFER POSITION RET ; DONE ; -;__MTERM_INIT_________________________________________________________________ -; -; SETUP 8255, MODE 0, PORT A=OUT, PORT B=IN, PORT C=OUT/OUT -;_____________________________________________________________________________ -; -MTERM_INIT: - LD A, 82H - OUT (PPIX),A - LD A, 30H ;set PC4,5 to disable PPISD (if used) - OUT (PPIC),A ;won't affect DSKY - RET -; ;__KB_GET_____________________________________________________________________ ; ; GET A SINGLE KEY AND DECODE @@ -1285,7 +1277,7 @@ KB_GET: PUSH BC PUSH DE PUSH HL ; SAVE HL - CALL KY_GET ; GET A KEY + CALL DSKY_GETKEY ; GET A KEY POP HL ; RESTORE HL POP DE POP BC @@ -1297,13 +1289,9 @@ KB_GET: ;_____________________________________________________________________________ ; INITBUF: - ;PUSH BC - ;PUSH DE LD DE,DISPLAYBUF LD BC,8 LDIR - ;POP DE - ;POP BC RET ; ;__ENCDISPLAY_________________________________________________________________ @@ -1327,7 +1315,7 @@ ENCBUF0: PUSH AF ; SAVE AF PUSH BC ; SAVE BC PUSH DE ; SAVE DE - LD DE,DECODEBUF ; DESTINATION FOR DECODED BYTES + LD DE,DSKY_BUF ; DESTINATION FOR DECODED BYTES LD B,8 ; NUMBER OF BYTES TO DECODE ENCBUF1: LD A,(HL) ; GET SOURCE BYTE @@ -1347,8 +1335,8 @@ ENCBUF1: INC DE ; INC DEST BUF PTR POP HL ; RESTORE POINTER DJNZ ENCBUF1 ; LOOP THRU ALL BUF POSITIONS - LD HL,DECODEBUF ; POINT TO DECODED BUFFER - CALL DSKY_SHOWRAW ; DISPLAY IT + LD HL,DSKY_BUF ; POINT TO DECODED BUFFER + CALL DSKY_SHOWSEG ; DISPLAY IT POP DE ; RESTORE DE POP BC ; RESTORE BC POP AF ; RESTORE AF @@ -1359,38 +1347,26 @@ CPUUP .DB $84,$CB,$EE,$BB,$80,$BB,$EE,$84 ; "-CPU UP-" (RAW) ADDR .DB $17,$18,$19,$10,$00,$00,$00,$00 ; "Adr 0000" (ENCODED) PORT .DB $13,$14,$15,$16,$10,$10,$00,$00 ; "Port 00" (ENCODED) GOTO .DB $1A,$14,$10,$10,$00,$00,$00,$00 ; "Go 0000" (ENCODED) - -;_KB DECODE TABLE_____________________________________________________________ -; -KB_DECODE: -; 0 1 2 3 4 5 6 7 8 9 A B C D E F - .DB $41,$02,$42,$82,$04,$44,$84,$08,$48,$88,$10,$50,$90,$20,$60,$A0 -; FW BK CL EN DP EX GO BO - .DB $01,$81,$C1,$C2,$C4,$C8,$D0,$E0 -; -; F-KEYS, -; FW = FORWARD -; BK = BACKWARD -; CL = CLEAR -; EN = ENTER -; DP = DEPOSIT (INTO MEM) -; EX = EXAMINE (MEM) -; GO = GO -; BO = BOOT -;_____________________________________________________________________________ ; -;_HEX 7_SEG_DECODE_TABLE______________________________________________________ +;_HEX_7_SEG_DECODE_TABLE______________________________________________________ ; ; SET BIT 7 TO DISPLAY W/ DECIMAL POINT ;_____________________________________________________________________________ +; SEGDECODE: - ; 0 1 2 3 4 5 6 7 8 9 A B C D E F - .DB $7B,$30,$6D,$75,$36,$57,$5F,$70,$7F,$77,$7E,$1F,$4B,$3D,$4F,$4E - ; - . P o r t A d r G - .DB $00,$04,$00,$6E,$1D,$0C,$14,$7E,$3D,$0C,$5B + ; POS $00 $01 $02 $03 $04 $05 $06 $07 + ; GLYPH '0' '1' '2' '3' '4' '5' '6' '7' + .DB $7B, $30, $6D, $75, $36, $57, $5F, $70 +; + ; POS $08 $09 $0A $0B $0C $0D $0E $0F + ; GLYPH '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' + .DB $7F, $77, $7E, $1F, $4B, $3D, $4F, $4E +; + ; POS $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $1A + ; GLYPH ' ' '-' '.' 'P' 'o' 'r' 't' 'A' 'd' 'r' 'G' + .DB $00, $04, $00, $6E, $1D, $0C, $14, $7E, $3D, $0C, $5B ; DISPLAYBUF: .FILL 8,0 -DECODEBUF: .FILL 8,0 ; #ELSE ; @@ -1398,8 +1374,7 @@ DSKY_ENTRY: CALL PANIC ; #ENDIF - -;********************* END OF PROGRAM *********************************** +; ; SLACK .EQU (MON_END - $) .FILL SLACK,00H diff --git a/Source/HBIOS/dsky.asm b/Source/HBIOS/dsky.asm index 8d309ae6..60256e84 100644 --- a/Source/HBIOS/dsky.asm +++ b/Source/HBIOS/dsky.asm @@ -1,190 +1,204 @@ ; ;================================================================================================== -; DSKY KEYBOARD ROUTINES +; DSKY ROUTINES ;================================================================================================== ; PPIA .EQU PPIBASE + 0 ; PORT A PPIB .EQU PPIBASE + 1 ; PORT B PPIC .EQU PPIBASE + 2 ; PORT C PPIX .EQU PPIBASE + 3 ; PPI CONTROL PORT - ; -; _____C0______C1______C2______C3__ -;B5 | $20 D $60 E $A0 F $E0 BO -;B4 | $10 A $50 B $90 C $D0 GO -;B3 | $08 7 $48 8 $88 9 $C8 EX -;B2 | $04 4 $44 5 $84 6 $C4 DE -;B1 | $02 1 $42 2 $82 3 $C2 EN -;B0 | $01 FW $41 0 $81 BK $C1 CL -; -KY_0 .EQU 000H -KY_1 .EQU 001H -KY_2 .EQU 002H -KY_3 .EQU 003H -KY_4 .EQU 004H -KY_5 .EQU 005H -KY_6 .EQU 006H -KY_7 .EQU 007H -KY_8 .EQU 008H -KY_9 .EQU 009H -KY_A .EQU 00AH -KY_B .EQU 00BH -KY_C .EQU 00CH -KY_D .EQU 00DH -KY_E .EQU 00EH -KY_F .EQU 00FH -KY_FW .EQU 010H ; FORWARD -KY_BK .EQU 011H ; BACKWARD -KY_CL .EQU 012H ; CLEAR -KY_EN .EQU 013H ; ENTER -KY_DE .EQU 014H ; DEPOSIT -KY_EX .EQU 015H ; EXAMINE -KY_GO .EQU 016H ; GO -KY_BO .EQU 017H ; BOOT +; ICM7218A KEYPAD PPISD +; -------- -------- -------- +; PA0-7 IO0-7 +; PB0-5 COLS 0-5 +; PB6 +; PB7 DO (SD) +; PC1 ROW 1 CLK (>SD) +; PC2-3 ROWS 2-3 +; PC4 /CS (PRI) +; PC5 /CS (SEC) +; PC6 /WR +; PC7 MODE +; +; DSKY SCAN CODES ARE ONE BYTE: CCRRRRRR +; BITS 7-6 IDENTFY THE COLUMN OF THE KEY PRESSED +; BITS 5-0 ARE A BITMAP, WITH A BIT ON TO INDICATE ROW OF KEY PRESSED +; +; ____PC0________PC1________PC2_______PC3___ +; PB5 | $20 [D] $60 [E] $A0 [F] $E0 [BO] +; PB4 | $10 [A] $50 [B] $90 [C] $D0 [GO] +; PB3 | $08 [7] $48 [8] $88 [9] $C8 [EX] +; PB2 | $04 [4] $44 [5] $84 [6] $C4 [DE] +; PB1 | $02 [1] $42 [2] $82 [3] $C2 [EN] +; PB0 | $01 [FW] $41 [0] $81 [BK] $C1 [CL] ; ;__DSKY_INIT_________________________________________________________________________________________ ; -; CONFIGURE PARALLEL PORT AND CLEAR ANY BUFFERED CHARACTER +; CONFIGURE PARALLEL PORT AND CLEAR KEYPAD BUFFER ;____________________________________________________________________________________________________ ; DSKY_INIT: - LD A,82H + OR $FF ; SIGNAL TO WAIT FOR KEY RELEASE + LD (DSKY_KEYBUF),A ; SET IT +DSKY_RESET: + PUSH AF + LD A,$82 ; PA OUT, PB IN, PC OUT OUT (PPIX),A - LD A,30H ;disable /CS on PPISD card(s) + OR $70 ; PPISD AND 7218 INACTIVE OUT (PPIC),A - XOR A - LD (KY_BUF),A + POP AF RET - +; #IFDEF DSKY_KBD ; -;__KY_STAT___________________________________________________________________________________________ +KY_0 .EQU $00 +KY_1 .EQU $01 +KY_2 .EQU $02 +KY_3 .EQU $03 +KY_4 .EQU $04 +KY_5 .EQU $05 +KY_6 .EQU $06 +KY_7 .EQU $07 +KY_8 .EQU $08 +KY_9 .EQU $09 +KY_A .EQU $0A +KY_B .EQU $0B +KY_C .EQU $0C +KY_D .EQU $0D +KY_E .EQU $0E +KY_F .EQU $0F +KY_FW .EQU $10 ; FORWARD +KY_BK .EQU $11 ; BACKWARD +KY_CL .EQU $12 ; CLEAR +KY_EN .EQU $13 ; ENTER +KY_DE .EQU $14 ; DEPOSIT +KY_EX .EQU $15 ; EXAMINE +KY_GO .EQU $16 ; GO +KY_BO .EQU $17 ; BOOT ; -; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS -;____________________________________________________________________________________________________ +;__DSKY_GETKEY_____________________________________________________________________________________ ; -KY_STAT: - ; IF WE ALREADY HAVE A KEY, RETURN WITH NZ - LD A,(KY_BUF) - OR A - RET NZ - ; SCAN FOR A KEYPRESS, A=0 NO DATA OR A=RAW BYTE - CALL KY_SCAN ; SCAN KB ONCE - OR A ; SET FLAGS - RET Z ; NOTHING FOUND, GET OUT - LD (KY_BUF),A ; SAVE RAW KEYCODE - RET ; RETURN -; -;__KY_GET____________________________________________________________________________________________ -; -; GET A SINGLE KEY (WAIT FOR ONE IF NECESSARY) +; WAIT FOR A DSKY KEYPRESS AND RETURN ;____________________________________________________________________________________________________ ; -KY_GET: - ; SEE IF WE ALREADY HAVE A KEY SAVED, GO TO DECODE IF SO - LD A,(KY_BUF) - OR A - JR NZ,KY_DECODE - ; NO KEY SAVED, WAIT FOR ONE -KY_STATLOOP: - CALL KY_STAT - OR A - JR Z,KY_STATLOOP - ; DECODE THE RAW VALUE -KY_DECODE: - LD D,00H - LD HL,KY_KEYMAP ; POINT TO BEGINNING OF TABLE -KY_GET_LOOP: +DSKY_GETKEY: + CALL DSKY_STAT ; CHECK STATUS + JR Z,DSKY_GETKEY ; LOOP IF NOTHING READY + LD A,(DSKY_KEYBUF) + LD B,24 ; SIZE OF DECODE TABLE + LD C,0 ; INDEX + LD HL,DSKY_KEYMAP ; POINT TO BEGINNING OF TABLE +DSKY_GETKEY1: CP (HL) ; MATCH? - JR Z,KY_GET_DONE ; FOUND, DONE + JR Z,DSKY_GETKEY2 ; FOUND, DONE INC HL - INC D ; D + 1 - JR NZ,KY_GET_LOOP ; NOT FOUND, LOOP UNTIL EOT -KY_GET_DONE: - ; CLEAR OUT KEY_BUF - XOR A - LD (KY_BUF),A - ; RETURN THE INDEX POSITION WHERE THE RAW VALUE WAS FOUND - LD A,D + INC C ; BUMP INDEX + DJNZ DSKY_GETKEY1 ; LOOP UNTIL EOT + LD A,$FF ; NOT FOUND ERR, RETURN $FF + RET +DSKY_GETKEY2: + LD A,$FF ; SET KEY BUF TO $FF + LD (DSKY_KEYBUF),A ; DO IT + ; RETURN THE INDEX POSITION WHERE THE SCAN CODE WAS FOUND + LD A,C ; RETURN INDEX VALUE RET ; -;__KY_SCAN____________________________________________________________________________________________ +;__DSKY_STAT_________________________________________________________________________________________ ; -; SCAN KEYBOARD MATRIX FOR AN INPUT +; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS ;____________________________________________________________________________________________________ ; -KY_SCAN: - LD C,0000H - LD A,41H | 30H ; SCAN COL ONE - OUT (PPIC),A ; SEND TO COLUMN LINES - CALL DLY2 ; DEBOUNCE - IN A,(PPIB) ; GET ROWS - AND 7FH ;ignore PB7 for PPISD - CP 00H ; ANYTHING PRESSED? - JR NZ,KY_SCAN_FOUND ; YES, EXIT - - LD C,0040H - LD A,42H | 30H ; SCAN COL TWO - OUT (PPIC),A ; SEND TO COLUMN LINES - CALL DLY2 ; DEBOUNCE - IN A,(PPIB) ; GET ROWS - AND 7FH ;ignore PB7 for PPISD - CP 00H ; ANYTHING PRESSED? - JR NZ,KY_SCAN_FOUND ; YES, EXIT - - LD C,0080H - LD A,44H | 30H ; SCAN COL THREE - OUT (PPIC),A ; SEND TO COLUMN LINES - CALL DLY2 ; DEBOUNCE - IN A,(PPIB) ; GET ROWS - AND 7FH ;ignore PB7 for PPISD - CP 00H ; ANYTHING PRESSED? - JR NZ,KY_SCAN_FOUND ; YES, EXIT - - LD C,00C0H ; - LD A,48H | 30H ; SCAN COL FOUR - OUT (PPIC),A ; SEND TO COLUMN LINES - CALL DLY2 ; DEBOUNCE - IN A,(PPIB) ; GET ROWS - AND 7FH ;ignore PB7 for PPISD - CP 00H ; ANYTHING PRESSED? - JR NZ,KY_SCAN_FOUND ; YES, EXIT - - LD A,040H | 30H ; TURN OFF ALL COLUMNS - OUT (PPIC),A ; SEND TO COLUMN LINES - LD A,00H ; RETURN NULL - RET ; EXIT - -KY_SCAN_FOUND: - AND 3FH ; CLEAR TOP TWO BITS - OR C ; ADD IN ROW BITS - LD C,A ; STORE VALUE - - ; WAIT FOR KEY TO BE RELEASED - LD A,4FH | 30H ; SCAN ALL COL LINES - OUT (PPIC),A ; SEND TO COLUMN LINES - CALL DLY2 ; DEBOUNCE -KY_CLEAR_LOOP: ; WAIT FOR KEY TO CLEAR - IN A,(PPIB) ; GET ROWS - AND 7FH ;ignore PB7 for PPISD - CP 00H ; ANYTHING PRESSED? - JR NZ,KY_CLEAR_LOOP ; YES, LOOP UNTIL KEY RELEASED +DSKY_STAT: + LD A,(DSKY_KEYBUF) ; GET CURRENT BUF VAL + CP $FF ; $FF MEANS WE ARE WAITING FOR PREV KEY TO BE RELEASED + JR Z,DSKY_STAT1 ; CHECK FOR PREV KEY RELEASE + OR A ; DO WE HAVE A SCAN CODE BUFFERED ALREADY? + RET NZ ; IF SO, WE ARE DONE + JR DSKY_STAT2 ; OTHERWISE, DO KEY CHECK + +DSKY_STAT1: + ; WAITING FOR PREVIOUS KEY RELEASE + CALL DSKY_KEY ; SCAN + JR Z,DSKY_STAT2 ; IF ZERO, PREV KEY RELEASED, CONTINUE + XOR A ; SIGNAL NO KEY PRESSED + RET ; AND DONE - LD A,040H | 30H ; TURN OFF ALL COLUMNS - OUT (PPIC),A ; SEND TO COLUMN LINES - - LD A,C ; RESTORE VALUE - RET +DSKY_STAT2: + CALL DSKY_KEY ; SCAN + LD (DSKY_KEYBUF),A ; SAVE RESULT + RET ; RETURN WITH ZF SET APPROPRIATELY +; +;__DSKY_KEY_______________________________________________________________________________________ +; +; CHECK FOR KEY PRESS W/ DEBOUNCE +;____________________________________________________________________________________________________ +; +DSKY_KEY: + CALL DSKY_SCAN ; INITIAL KEY PRESS SCAN + LD E,A ; SAVE INITIAL SCAN VALUE +DSKY_KEY1: + ; MAX BOUNCE TIME FOR OMRON B3F IS 3MS + PUSH DE ; SAVE DE + LD DE,300 ; ~3MS DELAY + CALL VDELAY ; DO IT + CALL DSKY_SCAN ; REPEAT SCAN + POP DE ; RESTORE DE + RET Z ; IF NOTHING PRESSED, DONE + CP E ; SAME? + JR DSKY_KEY2 ; YES, READY TO RETURN + LD E,A ; OTHERWISE, SAVE NEW SCAN VAL + JR DSKY_KEY1 ; AND LOOP UNTIL STABLE VALUE +DSKY_KEY2: + OR A ; SET FLAGS BASED ON VALUE + RET ; AND DONE +; +;__DSKY_SCAN______________________________________________________________________________________ +; +; SCAN KEYPAD AND RETURN RAW SCAN CODE (RETURNS ZERO IF NO KEY PRESSED) +;____________________________________________________________________________________________________ +; +DSKY_SCAN: + LD B,4 ; 4 COLUMNS + LD C,$01 ; FIRST COLUMN + LD E,0 ; INITIAL COL ID +DSKY_SCAN1: + LD A,C ; COL TO A + OR $70 ; KEEP PPISD AND 7218 INACTIVE + OUT (PPIC),A ; ACTIVATE COL + IN A,(PPIB) ; READ ROW BITS + AND $3F ; MASK, WE ONLY HAVE 6 ROWS, OTHERS UNDEFINED + JR NZ,DSKY_SCAN2 ; IF NOT ZERO, GOT SOMETHING + RLC C ; NEXT COL + INC E ; BUMP COL ID + DJNZ DSKY_SCAN1 ; LOOP THROUGH ALL COLS + XOR A ; NOTHING FOUND, RETURN ZERO + JR DSKY_RESET ; RETURN VIA RESET +DSKY_SCAN2: + RRC E ; MOVE COL ID + RRC E ; ... TO HIGH BITS 6 & 7 + OR E ; COMBINE WITH ROW + JR DSKY_RESET ; RETURN VIA RESET ; ;_KEYMAP_TABLE_____________________________________________________________________________________________________________ ; -KY_KEYMAP: -; 0 1 2 3 4 5 6 7 - .DB 041H,002H,042H,082H,004H,044H,084H,008H -; 8 9 A B C D E F - .DB 048H,088H,010H,050H,090H,020H,060H,0A0H -; FW BK CL EN DE EX GO BO - .DB 001H,081H,0C1H,0C2H,0C4H,0C8H,0D0H,0E0H +DSKY_KEYMAP: + ; POS $00 $01 $02 $03 $04 $05 $06 $07 + ; KEY [0] [1] [2] [3] [4] [5] [6] [7] + .DB $41, $02, $42, $82, $04, $44, $84, $08 +; + ; POS $08 $09 $0A $0B $0C $0D $0E $0F + ; KEY [8] [9] [A] [B] [C] [D] [E] [F] + .DB $48, $88, $10, $50, $90, $20, $60, $A0 +; + ; POS $10 $11 $12 $13 $14 $15 $16 $17 + ; KEY [FW] [BK] [CL] [EN] [DE] [EX] [GO] [BO] + .DB $01, $81, $C1, $C2, $C4, $C8, $D0, $E0 +; +; KBD WORKING STORAGE +; +DSKY_KEYBUF .DB 0 ; #ENDIF ; DSKY_KBD ; @@ -217,14 +231,14 @@ DSKY_HEXOUT1: ; DSKY SHOW BUFFER ; HL: ADDRESS OF BUFFER ; ENTER @ SHOWHEX FOR HEX DECODING -; ENTER @ SHOWRAW FOR DIRECT SEGMENT DECODING +; ENTER @ SHOWSEG FOR SEGMENT DECODING ;================================================================================================== ; DSKY_SHOWHEX: LD A,$D0 ; 7218 -> (DATA COMING, HEXA DECODE) JR DSKY_SHOW -DSKY_SHOWRAW: +DSKY_SHOWSEG: LD A,$F0 ; 7218 -> (DATA COMING, NO DECODE) JR DSKY_SHOW @@ -235,34 +249,30 @@ DSKY_SHOW: CALL DSKY_COFF POP AF OUT (PPIA),A - CALL DSKY_STROBEC + CALL DSKY_STROBEC ; STROBE COMMAND LD B,DSKY_BUFLEN ; NUMBER OF DIGITS LD C,PPIA DSKY_HEXOUT2: OUTI JP Z,DSKY_STROBE ; DO FINAL STROBE AND RETURN - CALL DSKY_STROBE + CALL DSKY_STROBE ; STROBE BYTE VALUE JR DSKY_HEXOUT2 - -DSKY_STROBEC: +DSKY_STROBEC: ; COMMAND STROBE LD A,80H | 30H JP DSKY_STROBE0 - -DSKY_STROBE: +DSKY_STROBE: ; DATA STROBE LD A,00H | 30H ; SET WRITE STROBE - DSKY_STROBE0: OUT (PPIC),A ; OUT TO PORTC CALL DLY2 ; DELAY DSKY_COFF - LD A,40H | 30H ; SET CONTROL PORT OFF + LD A,40H | 30H ; QUIESCE OUT (PPIC),A ; OUT TO PORTC ; CALL DSKY_DELAY ; WAIT RET ; +; SEG DISPLAY WORKING STORAGE ; -; -KY_BUF .DB 0 DSKY_BUF: .FILL 8,0 DSKY_BUFLEN .EQU $ - DSKY_BUF DSKY_HEXBUF .FILL 4,0 diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 4848c65a..338dd755 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -155,7 +155,7 @@ MENU: #IF (DSKYENABLE) ; DISPLAY DSKY BOOT MESSAGE LD HL,BOOT ; POINT TO BOOT MESSAGE - CALL DSKY_SHOWRAW ; DISPLAY MESSAGE + CALL DSKY_SHOWSEG ; DISPLAY MESSAGE #ENDIF ; #IF (BOOTTYPE == BT_AUTO) @@ -217,10 +217,10 @@ SEL: SEL1: #IF (DSKYENABLE) ; HANDLE DSKY KEY INPUT - CALL KY_STAT ; CHECK DSKY INPUT + CALL DSKY_STAT ; CHECK DSKY INPUT OR A ; TEST FOR ZERO JR Z,SEL2 ; IF ZERO, NO KEY PRESSED - CALL KY_GET ; GET PENDING KEY PRESS + CALL DSKY_GETKEY ; GET PENDING KEY PRESS JR MATK ; AND HANDLE IT #ENDIF ;