Browse Source

Refactoring

patch
Wayne Warthen 7 years ago
parent
commit
877d868745
  1. 1
      Doc/ChangeLog.txt
  2. 125
      Source/HBIOS/dbgmon.asm
  3. 338
      Source/HBIOS/dsky.asm
  4. 6
      Source/HBIOS/romldr.asm

1
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
-------------

125
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

338
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)
; PC0 ROW 0 DI (>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

6
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
;

Loading…
Cancel
Save