mirror of https://github.com/wwarthen/RomWBW.git
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.
316 lines
8.4 KiB
316 lines
8.4 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)
|
|
;
|
|
;===================================================================================================
|
|
;
|
|
; 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"
|
|
;
|
|
; 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 ; RESET GM7303 CONTROLLER, DELAYS ARE FIXED,
|
|
|
|
; INITIALISE LCD
|
|
CALL GM7303_RESET ; 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
|
|
;
|
|
; CALLED FROM HBIOS RIGHT BEFORE A DISK ACCESS
|
|
; HL: ADDRESS OF 32-BIT SECTOR NUMBER (LITTLE-ENDIAN)
|
|
;
|
|
; FORMAT: "Dsk99 R:12345678"
|
|
; 0123456789012345
|
|
;
|
|
GM7303_DSKACT:
|
|
; SAVE EVERYTHING
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
;
|
|
LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG
|
|
OR A ; SET FLAGS
|
|
JR Z,GM7303_DSKACT_Z ; HANDLE NOT PRESENT
|
|
;
|
|
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 A,3 ; POINT TO
|
|
CALL ADDHLA ; END OF DWORD (MSB)
|
|
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:
|
|
; CLEAN UP AND GO AWAY
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
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
|
|
|
|
|
|
; 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
|
|
;
|
|
GM7303_DELAY:
|
|
PUSH AF
|
|
PUSH DE
|
|
LD DE,3 ; 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:
|
|
GM7303_DISPLAY: ; 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
|
|
; LD A,045H ; NEXT BYTE TO SEND
|
|
OR A ; SET FLAGS
|
|
RET Z ; DONE WHEN NULL REACHED
|
|
INC DE ; BUMP POINTER
|
|
CALL GM7303_DISPLAY ; 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
|
|
;
|
|
|
|
; RESET LCD CONTROLLER MANUAL RESET METHOD
|
|
;
|
|
GM7303_RESET:
|
|
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_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
|
|
|
|
|
|
|
|
|