forked from MirrorRepos/RomWBW
Browse Source
Changes to support a modified Prolog Keypad and LCD driver card - Heavily inspired by the lcd.asm module, but separated out to allow for future keyboard support.work
5 changed files with 343 additions and 3 deletions
@ -0,0 +1,316 @@ |
|||
; |
|||
;================================================================================================== |
|||
; 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 |
|||
|
|||
|
|||
|
|||
Loading…
Reference in new issue