You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

669 lines
18 KiB

;
;==================================================================================================
; HARDWARE SUPPORT FOR GENESS MODULES 7303 STD BUS KEYBOARD/GM7303
; - INCORPORATES HITACHI HD44780 AS 2 X 16 DISPLAY AND 24 KEY HEX KEYPAD
;==================================================================================================
;
; Heavily derived from the lcd.asm driver, but forked because the 7303 card has keyboard
; functionality as well. Eventually will be used as a Z80/180 monitor tool
;
; The GM7303 supports an LCD display while the original has 2 DL1416 starburst displays.
;==================================================================================================
;
; CARD FUNCTIONS: (BASE_IO = 0x30)
;
; 20X2 LCD 0X30 OUTPUT (D0-D7)
; 0X31 OUTPUT (D0 - LCD E)
; (D1 - LCD R/W*)
; (D2 - LCD RS)
; S1 & S2 INPUT 0x30 INPUT (BIT 6,7)
; 8 OUTPUT LEDS 0x30 OUTPUT
; KEYBOARD 0X30 OUTPUT (COLUMN BIT 0-3)
; 0X30 INPUT (ROW BIT 0-5)
;
; GM7303 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 OFF TO INDICATE ROW KEY PRESSED
; ROW INPUTS ARE HELD lOW (NOTING I/P OF ROW BUFFER IS INVERTING)
;
; ___Col0_______Col1______Col2_______Col3____
; Row5| $20 [14] $60 [15] $A0 [16] $E0 [17]
; Row4| $10 [10] $50 [11] $90 [12] $D0 [13]
; Row3| $08 [C] $48 [D] $88 [E] $C8 [F]
; Row2| $04 [8] $44 [9] $84 [A] $C4 [B]
; Row1| $02 [4] $42 [5] $82 [6] $C2 [7]
; Row0| $01 [0] $41 [1] $81 [2] $C1 [3]
;
;===================================================================================================
;
; Date Change
; 05Sep2024 Initial development - basic init functions
; 06Sep2024 Working - Cleaned out functions that wont be used - TODO - Implement keyboard
;
;
GM7303_DATA .EQU GM7303BASE + 0 ; WRITE
GM7303_CTRL .EQU GM7303BASE + 1 ; WRITE
GM7303_KYBD .EQU GM7303BASE + 0 ; READ/WRITE
;
GM7303_FUNC_CLEAR .EQU $01 ; CLEAR DISPLAY
GM7303_FUNC_HOME .EQU $02 ; HOME CURSOR & REMOVE ALL SHIFTING
GM7303_FUNC_ENTRY .EQU $04 ; SET CUR DIR AND DISPLAY SHIFT
GM7303_FUNC_DISP .EQU $08 ; DISP, CUR, BLINK ON/OFF
GM7303_FUNC_SHIFT .EQU $10 ; MOVE CUR / SHIFT DISP
GM7303_FUNC_SET .EQU $20 ; SET INTERFACE PARAMS
GM7303_FUNC_CGADR .EQU $40 ; SET CGRAM ADRESS
GM7303_FUNC_DDADR .EQU $80 ; SET DDRAM ADDRESS
;
DEVECHO "GM7303: IO="
DEVECHO GM7303BASE
DEVECHO "\n"
;
;--------------------------------------------------------------------------------------------------
; HBIOS MODULE HEADER
;--------------------------------------------------------------------------------------------------
;
ORG_GM7303 .EQU $
;
.DW SIZ_GM7303 ; MODULE SIZE
.DW GM7303_INITPHASE ; ADR OF INIT PHASE HANDLER
;
GM7303_INITPHASE:
; INIT PHASE HANDLER, A=PHASE
CP HB_PHASE_PREINIT ; PREINIT PHASE?
JP Z,GM7303_PREINIT ; DO PREINIT
CP HB_PHASE_INIT ; INIT PHASE?
JP Z,GM7303_INIT ; DO INIT
RET ; DONE
;
; HARDWARE RESET PRIOR TO ROMWBW CONSOLE INITIALIZATION
;
GM7303_PREINIT:
; TEST FOR PRESENCE...
CALL GM7303_DETECT ; PROBE FOR HARDWARE
LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG
OR A ; SET FLAGS
RET Z ; BAIL OUT IF NOT PRESENT
; REGISTER DRIVER WITH HBIOS
LD BC,GM7303_DISPATCH
CALL DSKY_SETDISP
;
; INITIALISE LCD
CALL GM7303_RESETLCD ; RESET THE LCD
PUSH HL
LD HL,GM7303_INIT_TBL
LD D,04H ; 4 BYTES TO SEND
NEXT_INIT:
LD A,(HL) ; GET COMMAND
OUT (GM7303_DATA),A ; WRITE TO TO DISPLAY
CALL CMD_STROBE ; COMMAND STROBE
PUSH DE
LD DE,5000/16 ; WAIT >4MS, WE USE 5MS
CALL VDELAY ; DO IT
POP DE
INC HL
DEC D ; (D)=00 -> COMMAND
JR NZ,NEXT_INIT ; NO - DO NEXT INIT COMMAND
POP HL
;
; PUT SOMETHING ON THE DISPLAY
LD DE,GM7303_STR_BAN ; DISPLAY BANNER
CALL GM7303_OUTDS
; SECOND LINE
LD HL,$0100 ; ROW 2, COL 0
CALL GM7303_GOTORC
LD DE,GM7303_STR_CFG ; DISPLAY CONFIG
CALL GM7303_OUTDS
XOR A ; SIGNAL SUCCESS
RET ; DONE
;
; POST CONSOLE INITIALIZATION
;
GM7303_INIT:
CALL NEWLINE ; FORMATTING
PRTS("GM7303: IO=$")
LD A,GM7303BASE
CALL PRTHEXBYTE
;
LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG
OR A ; SET FLAGS
JR Z,GM7303_INIT1 ; HANDLE NOT PRESENT
XOR A ; SIGNAL SUCCESS
RET ; DONE
;
GM7303_INIT1:
PRTS(" NOT PRESENT$")
OR $FF
RET
GM7303_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,GM7303_RESET ; RESET DSKY HARDWARE
DEC A
JP Z,GM7303_STAT ; GET KEYPAD STATUS
DEC A
JP Z,GM7303_GETKEY ; READ A KEY FROM THE KEYPAD
DEC A
JP Z,GM7303_SHOWHEX ; DISPLAY A 32-BIT BINARY VALUE IN HEX
DEC A
;;;JP Z,GM7303_SHOWASCII ; DISPLAY ASCII TEXT
JP Z,GM7303_SHOWSEG ; DISPLAY SEGMENT MAPPED TEXT
DEC A
JP Z,GM7303_KEYLEDS ; SET KEYPAD LEDS
DEC A
JP Z,GM7303_STATLED ; SET STATUS LED
DEC A
JP Z,GM7303_BEEP ; BEEP DSKY SPEAKER
DEC A
JP Z,GM7303_DEVICE ; DEVICE INFO
DEC A
JP Z,GM7303_MESSAGE ; HANDLE MESSAGE
DEC A
JP Z,GM7303_EVENT ; HANDLE EVENT
SYSCHKERR(ERR_NOFUNC)
RET
;
; RESET 7303 -- CLEAR AND HOME LCD
;
GM7303_RESET:
GM7303_CLEAR:
LD A,GM7303_FUNC_CLEAR ; CLEAR SCREEN COMMAND
CALL GM7303_COMMAND ; SEND IT
JP GM7303_CLEARDELAY ; LONG DELAY FOR CLEAR - RETURN HAPPENS IN STROBE ROUTINE
;
; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS
;
GM7303_STAT:
LD A,(GM7303_KEYBUF) ; GET CURRENT BUF VAL
CP $FF ; $FF MEANS WE ARE WAITING FOR PREV KEY TO BE RELEASED
JR Z,GM7303_STAT1 ; CHECK FOR PREV KEY RELEASE
OR A ; DO WE HAVE A SCAN CODE BUFFERED ALREADY?
RET NZ ; IF SO, WE ARE DONE
JR GM7303_STAT2 ; OTHERWISE, DO KEY CHECK
GM7303_STAT1:
; WAITING FOR PREVIOUS KEY RELEASE
CALL GM7303_KEY ; SCAN
JR Z,GM7303_STAT2 ; IF ZERO, PREV KEY RELEASED, CONTINUE
XOR A ; SIGNAL NO KEY PRESSED
RET ; AND DONE
GM7303_STAT2:
CALL GM7303_KEY ; SCAN
LD (GM7303_KEYBUF),A ; SAVE RESULT
RET ; RETURN WITH ZF SET APPROPRIATELY
;
;
; WAIT FOR A GM7303 KEYPRESS AND RETURN
;
GM7303_GETKEY:
CALL GM7303_STAT ; CHECK STATUS
JR Z,GM7303_GETKEY ; LOOP IF NOTHING READY
LD A,(GM7303_KEYBUF)
LD B,24 ; SIZE OF DECODE TABLE
LD C,0 ; INDEX
LD HL,GM7303_KEYMAP ; POINT TO BEGINNING OF TABLE
GM7303_GETKEY1:
CP (HL) ; MATCH?
JR Z,GM7303_GETKEY2 ; FOUND, DONE
INC HL
INC C ; BUMP INDEX
DJNZ GM7303_GETKEY1 ; LOOP UNTIL EOT
GM7303_GETKEY1A:
LD A,$FF ; NOT FOUND ERR, RETURN $FF
RET
GM7303_GETKEY2:
LD A,$FF ; SET KEY BUF TO $FF
LD (GM7303_KEYBUF),A ; DO IT
; RETURN THE INDEX POSITION WHERE THE SCAN CODE WAS FOUND
LD E,C ; RETURN INDEX VALUE
XOR A ; SIGNAL SUCCESS
RET
;
; DISPLAY HEX VALUE FROM DE:HL
; To be written <--- DRJ
GM7303_SHOWHEX:
RET
GM7303_DISP_2N_HEX: ; DISPLAY N 2HEX VALUES FROM
CALL GM7303_DISP_2HEX ; MEMORY ON 2N DISPLAYS
DEC C
JP NZ,GM7303_DISP_2N_HEX
RET
GM7303_DISP_2HEX: ; DISPLAY 2 HEX CHARACTERS IN MEMORY LOCATIONS
LD D,(HL) ; (HL), IN DISPLAY POSITIONS (E),(E)+1
CALL GM7303_DISP_HEX
INC E
LD A,(HL)
RRC A
RRC A
RRC A
RRC A
LD D,A
CALL GM7303_DISP_HEX
INC E
INC HL ; (E)EXIT=(E)+2 (WAS INX H)
RET ; (HL)EXIT=(HL)+1
GM7303_DISP_HEX:
LD A,D ; DISPLAY LEAST SIGNIFICANT HEX DIGIT IN REGISTER D
CALL GM7303_HEX_ASC
LD D,A
JP GM7303_OUTD
GM7303_HEX_ASC:
AND $0F ; CONVERT LSD IN REG A TO ASCII
CP $0A ; IS A>9
JP C,GM7303_NUM_TEST
ADD A,$B7 ; YES - CONVERT TO C1-C6
RET ; EXIT
GM7303_NUM_TEST:
ADD A,$B0 ; NO, CONVERT TO B0-B9
RET ; EXIT
GM7303_SHOWSEG:
; CONVERT FROM SEG ALPHABET TO DISPLAY CODES
LD B,8 ; DO FOR ALL CHARS
LD DE,GM7303_BUF ; DESTINATION BUFFER
GM7303_SHOWSEG1:
LD A,(HL) ; GET SOURCE VALUE
INC HL ; BUMP FOR NEXT TIME
AND $7F ; REMOVE HI BIT (DP)
PUSH HL ; SAVE IT
LD HL,GM7303_SEGMAP ; POINT TO XLAT MAP
CALL ADDHLA ; OFFSET BY VALUE
LD A,(HL) ; GET NEW VALUE
LD (DE),A ; SAVE IT
INC DE ; BUMP PTR
POP HL ; RESTORE SOURCE PTR
DJNZ GM7303_SHOWSEG1 ; LOOP TILL DONE
;
; DISPLAY CONVERTED BUFFER
LD HL,GM7303_BUF ; BUFFER
; FALL THRU
GM7303_SHOWASCII: ; DISPLAY AN ASCII STRING ON THE GM7303 DISPLAY
; ENTER WITH HL- DATA TO PRINT (NULL TERMINATED)
PUSH HL ; SAVE THE POINTER TO THE STRING
CALL GM7303_CLEAR ; CLEAR THE DISPLAY
POP DE ; OUTDS EXPECTS STRING POINTER IN DE
CALL GM7303_OUTDS
XOR A ; RETURN SUCCESS
RET
;
;
;
GM7303_KEYLEDS:
GM7303_STATLED:
GM7303_BEEP:
XOR A ; UNSUPPORTED ROUTINES - PRETEND SUCCESS
RET
;
; DEVICE INFORMATION
;
GM7303_DEVICE:
LD D,DSKYDEV_GM7303 ; D := DEVICE TYPE
LD E,0 ; E := PHYSICAL DEVICE NUMBER
LD H,0 ; H := MODE
LD L,GM7303BASE ; L := BASE I/O ADDRESS
XOR A ; SIGNAL SUCCESS
RET
;
; MESSAGE HANDLER
;
GM7303_MESSAGE:
LD A,C ; GET MESSAGE ID
ADD A,A ; WORD OFFSET
LD HL,GM7303_MSGTBL ; START OF MESSAGE TABLE
CALL ADDHLA ; ADD OFFSET
LD A,(HL) ; SAVE LSB
INC HL ; BUMP TO MSB
LD H,(HL) ; GET MSB
LD L,A ; GET LSB
JR GM7303_SHOWASCII ; SHOW MESSAGE AND RETURN
;
; EVENT HANDLER
;
GM7303_EVENT:
LD A,C ; EVENT ID
OR A ; 0=CPUSPD
JR Z,GM7303_EVT_CPUSPD ; HANDLE CPU SPD CHANGE
DEC A ; 1=DSKACT
JR Z,GM7303_EVT_DSKACT ; HANDLE DISK ACTIVITY
XOR A
RET
;
; CPU SPEED CHANGE
;
GM7303_EVT_CPUSPD:
XOR A
RET
;
; DISK ACTIVITY
;
; CALLED FROM HBIOS RIGHT BEFORE A DISK ACCESS
;
; FORMAT: "Dsk99 R:12345678"
; 0123456789012345
;
GM7303_EVT_DSKACT:
;
PUSH HL
LD HL,$0100 ; ROW 1, COL 0
CALL GM7303_GOTORC ; SET DISPLAY ADDRESS
POP HL
;
LD DE,GM7303_STR_IO ; PREFIX
CALL GM7303_OUTDS ; SEND TO DISPLAY (COLS 0-5)
LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM
CALL GM7303_DSKACT_BYTE ; SEND TO DISPLAY (COLS 6-7) HEX???
;
LD A,' ' ; SEPARATOR
CALL GM7303_OUTD ; SEND TO DISPLAY (COL 8)
;
LD A,(HB_DSKFUNC) ; ACTIVE DISK FUNCTION
CP BF_DIOWRITE ; WRITE?
LD A,'W' ; ASSUME WRITE
JR Z,GM7303_DSKACT0 ; GO AHEAD
LD A,'R' ; OTHERWISE READ
GM7303_DSKACT0:
CALL GM7303_OUTD ; SEND CHAR (COL 10)
LD A,':' ; SEPARATOR
CALL GM7303_OUTD ; SEND TO DISPLAY (COL 11)
;
LD HL,HB_DSKADR+3 ; INPUT POINTER
LD B,4 ; DO 4 BYTES
;
GM7303_DSKACT1:
LD A,(HL) ; GET BYTE
CALL GM7303_DSKACT_BYTE ; SEND TO DISPLAY (COLS 12-19)
DEC HL ; DEC PTR
DJNZ GM7303_DSKACT1 ; DO ALL 4 BYTES
;
GM7303_DSKACT_Z:
RET
;;
GM7303_DSKACT_BYTE:
PUSH AF ; SAVE BYTE
RRCA ; DO TOP NIBBLE FIRST
RRCA
RRCA
RRCA
CALL HEXCONV ; CONVERT NIBBLE TO ASCII
CALL GM7303_OUTD ; SEND TO DISPLAY
POP AF ; RECOVER CURRENT BYTE
CALL HEXCONV ; CONVERT NIBBLE TO ASCII
CALL GM7303_OUTD ; SEND TO DISPLAY
RET ; DONE
;
;__GM7303_KEY___________________________________________________________________________________________
;
; CHECK FOR KEY PRESS W/ DEBOUNCE
;____________________________________________________________________________________________________
;
GM7303_KEY:
CALL GM7303_SCAN ; INITIAL KEY PRESS SCAN
LD E,A ; SAVE INITIAL SCAN VALUE
GM7303_KEY1:
; MAX BOUNCE TIME FOR OMRON B3F IS 3MS
PUSH DE ; SAVE DE
LD DE,300 ; ~3MS DELAY
CALL VDELAY ; DO IT
CALL GM7303_SCAN ; REPEAT SCAN
POP DE ; RESTORE DE
RET Z ; IF NOTHING PRESSED, DONE
CP E ; SAME?
JR GM7303_KEY2 ; YES, READY TO RETURN
LD E,A ; OTHERWISE, SAVE NEW SCAN VAL
JR GM7303_KEY1 ; AND LOOP UNTIL STABLE VALUE
GM7303_KEY2:
OR A ; SET FLAGS BASED ON VALUE
RET ; AND DONE
;
;__GM7303_SCAN__________________________________________________________________________________________
;
; SCAN KEYPAD AND RETURN RAW SCAN CODE (RETURNS ZERO IF NO KEY PRESSED)
;____________________________________________________________________________________________________
;
GM7303_SCAN:
LD B,4 ; 4 COLUMNS
LD C,$01 ; FIRST COLUMN
LD E,0 ; INITIAL COL ID
GM7303_SCAN1:
LD A,C ; COL TO A
AND $0F ; DON'T CHANGE THE LCD CONTROL BITS
OUT (GM7303_KYBD),A ; ACTIVATE COL
IN A,(GM7303_KYBD) ; READ ROW BITS
AND $3F ; MASK, WE ONLY HAVE 6 ROWS,
; OTHERS USED FOR STATUS SWITCHES
JR NZ,GM7303_SCAN2 ; IF NOT ZERO, GOT SOMETHING
RLC C ; NEXT COL
INC E ; BUMP COL ID
DJNZ GM7303_SCAN1 ; LOOP THROUGH ALL COLS
XOR A ; NOTHING FOUND, RETURN ZERO
RET
GM7303_SCAN2:
RRC E ; MOVE COL ID
RRC E ; ... TO HIGH BITS 6 & 7
OR E ; COMBINE WITH ROW
RET
;
;_ _TABLE_____________________________________________________________________________________________________________
;
GM7303_KEYMAP:
; POS $00 $01 $02 $03 $04 $05 $06 $07
; KEY [0] [1] [2] [3] [4] [5] [6] [7]
.DB $01, $41, $81, $C1, $02, $42, $82, $C2
;
; POS $08 $09 $0A $0B $0C $0D $0E $0F
; KEY [8] [9] [A] [B] [C] [D] [E] [F]
.DB $04, $44, $84, $C4, $08, $48, $88, $C8
;
; POS $10 $11 $12 $13 $14 $15 $16 $17
; KEY [FW] [BK] [CL] [EN] [DE] [EX] [GO] [BO]
.DB $10, $50, $90, $D0, $20, $60, $A0, $E0
; DETECT PRESENCE OF GM7303 CONTROLLER
; WE CAN'T USE CONTROLLER RAM AS THE GM7303 DOES NOT SUPPORT LCD READS
; SIMPLY TEST FOR THE EXISTANCE OF BUS PULLDOWN AT THE SWITCH PORT
;
GM7303_DETECT:
IN A,(GM7303_DATA) ; GET VALUE OF DATA INPUTS
CP 00 ; GM7303 PULLS DATA TO GROUND
JR Z,GM7303_AVAILABLE
GM7303_MISSING:
LD A,00
LD (GM7303_PRESENT),A
RET
GM7303_AVAILABLE:
LD A,$FF
LD (GM7303_PRESENT),A
RET
;
; DELAY ROUTINE - SHORT
;
GM7303_DELAY:
PUSH AF
PUSH DE
LD DE,3 ; WAIT PERIOD
CALL VDELAY ; DO IT
POP DE
POP AF
RET
;
; CLEAR DELAY ROUTINE - LONG
;
GM7303_CLEARDELAY:
PUSH AF
PUSH DE
LD DE,140 ; WAIT PERIOD
CALL VDELAY ; DO IT
POP DE
POP AF
RET
CMD_STROBE: ; Send a command to the LCD
LD A,01H ; (A) = (X,X,X,X,X,RS,R/W*, E)
; SET R/W* LINE low (BIT 1=0)
; SET RS line LOW FOR COMMAND (BIT 2=0)
; SET ENABLE LINE HIGH (BIT 0=1)
; CARRY ON THROUGH THE STROBE ROUTINE
STROBE:
OR 01H ; SET ENABLE LINE HIGH (BIT 0=1)
OUT (GM7303_CTRL),A
CALL GM7303_DELAY
XOR 01H ; SET ENABLE LINE LOW (BIT 0=0)
OUT (GM7303_CTRL),A
CALL GM7303_DELAY
RET ; EXIT
GM7303_OUTD: ; OUTPUT ASCII CHARACTER TO LCD DISPLAY
; CHAR IN A
AND 07FH
OUT (GM7303_DATA),A ; OUTPUT TO THE DATA PORT
; AND STROBE IT IN
DATA_STROBE:
LD A,04H ; SET R/W* LINE low (BIT 1=0)
; SET RS line HIGH FOR DATA (BIT 2=1)
; (A) = (X,X,X,X,X,RS,R/W*, E)
JP STROBE ; DO THE STROBE
; RETURN THROUGH THE STROBE ROUTINE
GM7303_COMMAND: ; OUTPUT COMMAND TO 7303 MODULE LCD
OUT (GM7303_DATA),A ; WRITE TO TO DISPLAY
JP CMD_STROBE ; COMMAND STROBE (STROBE ROUTING LETS US RETURN)
; SEND DATA STRING
; DE=STRING ADDRESS, NULL TERMINATED
;
GM7303_OUTDS:
LD A,(DE) ; NEXT BYTE TO SEND
OR A ; SET FLAGS
RET Z ; DONE WHEN NULL REACHED
INC DE ; BUMP POINTER
CALL GM7303_OUTD ; SEND IT
JR GM7303_OUTDS ; LOOP AS NEEDED
;
; GOTO ROW(H),COL(L)
;
GM7303_GOTORC:
PUSH HL ; SAVE INCOMING
LD A,H ; ROW # TO A
LD HL,GM7303_ROWS ; POINT TO ROWS TABLE
CALL ADDHLA ; INDEX TO ROW ENTRY
LD A,(HL) ; GET ROW START
POP HL ; RECOVER INCOMING
ADD A,L ; ADD COLUMN
ADD A,GM7303_FUNC_DDADR ; ADD SET DDRAM COMMAND
JR GM7303_COMMAND ; AND SEND IT
;
; LCD CONTROLLER MANUAL RESET METHOD
;
GM7303_RESETLCD:
LD A,GM7303_FUNC_SET | %11000 ; 8 BIT INTERFACE, COMMAND MODE, 2 LINES
OUT (GM7303_DATA),A
LD A,01 ; SET ENABLE LINE HIGH (BIT 0=1)
OUT (GM7303_CTRL),A
LD DE,5000/16 ; WAIT >40MS, WE USE 50MS
CALL VDELAY ; DO IT
LD A,00 ; SET ENABLE LINE LOW (BIT 0=0)
OUT (GM7303_CTRL),A
LD A,01 ; SET ENABLE LINE HIGH (BIT 0=1)
OUT (GM7303_CTRL),A
LD DE,500/16 ; WAIT >4MS, WE USE 5MS
CALL VDELAY ; DO IT
LD A,00 ; SET ENABLE LINE LOW (BIT 0=0)
OUT (GM7303_CTRL),A
LD A,01 ; SET ENABLE LINE HIGH (BIT 0=1)
OUT (GM7303_CTRL),A
LD DE,500/16 ; WAIT >4MS, WE USE 5MS
CALL VDELAY ; DO IT
LD A,00 ; SET ENABLE LINE LOW (BIT 0=0)
OUT (GM7303_CTRL),A
RET
;
; DATA STORAGE
;
GM7303_PRESENT .DB 0 ; NON-ZERO WHEN HARDWARE DETECTED
;
GM7303_BUF .FILL 8 ; USED BY SHOWSEG
.DB 0 ; NULL TERMINATOR FOR ABOVE
;
; KBD WORKING STORAGE
;
GM7303_KEYBUF .DB 0
;
;
GM7303_ROWS .DB $00,$40 ; ROW START INDEX FOR 2 LINE DISPLAY
;
GM7303_INIT_TBL: ; TABLE OF INITIALISATION COMMANDS FOR THE LCD
.DB 38H ; 8 BIT OPERATION, 2 LINE DISPLAY, 8X5 FONT
.DB 0EH ; TURN ON DISPLAY, CURSOR AND BLINK
.DB 06H ; SET CURSOR MOVE FROM LEFT TO RIGHT
.DB 01H ; CLEAR DISPLAY
;
GM7303_STR_BAN .DB "RomWBW ", BIOSVER, 0
GM7303_STR_CFG .DB "Build:", CONFIG, 0
GM7303_STR_IO .DB "Dsk", 0
;
GM7303_SEGMAP:
;
; POS $00 $01 $02 $03 $04 $05 $06 $07
; GLYPH '0' '1' '2' '3' '4' '5' '6' '7'
.DB "01234567"
;
; POS $08 $09 $0A $0B $0C $0D $0E $0F
; GLYPH '8' '9' 'A' 'B' 'C' 'D' 'E' 'F'
.DB "89ABCDEF"
;
; POS $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $1A
; GLYPH ' ' '-' '.' 'P' 'o' 'r' 't' 'A' 'd' 'r' 'G'
.DB " -.PortAdrG"
;
GM7303_MSGTBL:
.DW GM7303_MSG_LDR_SEL
.DW GM7303_MSG_LDR_BOOT
.DW GM7303_MSG_LDR_LOAD
.DW GM7303_MSG_LDR_GO
.DW GM7303_MSG_MON_RDY
.DW GM7303_MSG_MON_BOOT
;
GM7303_MSG_LDR_SEL .DB "Ready",0
GM7303_MSG_LDR_BOOT .DB "Boot...",0
GM7303_MSG_LDR_LOAD .DB "Load...",0
GM7303_MSG_LDR_GO .DB "Go...",0
GM7303_MSG_MON_RDY .DB "-CPU UP-",0
GM7303_MSG_MON_BOOT .DB "Boot!",0
;
;--------------------------------------------------------------------------------------------------
; HBIOS MODULE TRAILER
;--------------------------------------------------------------------------------------------------
;
END_GM7303 .EQU $
SIZ_GM7303 .EQU END_GM7303 - ORG_GM7303
;
MEMECHO "GM7303 occupies "
MEMECHO SIZ_GM7303
MEMECHO " bytes.\n"