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