diff --git a/Source/HBIOS/Build.cmd b/Source/HBIOS/Build.cmd index 35162fd4..134ffe24 100644 --- a/Source/HBIOS/Build.cmd +++ b/Source/HBIOS/Build.cmd @@ -244,5 +244,7 @@ call Build EPITX std || exit /b call Build NABU std || exit /b call Build FZ80 std || exit /b call Build UNA std || exit /b +call Build GMZ180 std || exit /b + goto :eof diff --git a/Source/HBIOS/Makefile.new b/Source/HBIOS/Makefile.new index 16d7f26e..9beb9d79 100644 --- a/Source/HBIOS/Makefile.new +++ b/Source/HBIOS/Makefile.new @@ -5,7 +5,7 @@ DIST_OBJECTS := \ RCZ80_zrc_ram RCZ80_zrc512 RPH_std SBC_std SBC_simh MBC_std \ DUO_std SCZ180_sc126 SCZ180_sc130 SCZ180_sc131 SCZ180_sc140 \ SCZ180_sc503 SCZ180_sc700 S100_std UNA_std Z80RETRO_std \ - ZETA_std ZETA2_std HEATH_std EPITX_std + ZETA_std ZETA2_std HEATH_std EPITX_std GMZ180_std # RCZ80_mt RCZ80_duart MON_std OBJECTS := $(DIST_OBJECTS) diff --git a/Source/HBIOS/cfg_gmz180.asm b/Source/HBIOS/cfg_gmz180.asm index c7a81604..e9524f0d 100644 --- a/Source/HBIOS/cfg_gmz180.asm +++ b/Source/HBIOS/cfg_gmz180.asm @@ -84,7 +84,7 @@ LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY DSKYDSKACT .EQU FALSE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI @@ -95,6 +95,9 @@ H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY +GM7303ENABLE .EQU TRUE ; ENABLES THE PROLOG 7303 BOARD WITH 16X2 LCD +GM7303BASE .EQU $30 ; BASE ADDRESS FOR GM3703 BOARD +GM7303DSKACT .EQU TRUE ; ENABLE DISK ACTIVITY OF GM7303 LCD DISPLAY ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE diff --git a/Source/HBIOS/gm7303.asm b/Source/HBIOS/gm7303.asm new file mode 100644 index 00000000..a0f7430e --- /dev/null +++ b/Source/HBIOS/gm7303.asm @@ -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 + + + diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 2fd51b5a..8e2b92f3 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2310,6 +2310,9 @@ HB_CPU1: #IF (H8PENABLE) CALL H8P_PREINIT #ENDIF +#IF (GM7303ENABLE) + CALL GM7303_PREINIT +#ENDIF ; FPLEDS(DIAG_05) ; @@ -3730,6 +3733,9 @@ HB_INITTBL: #IF (H8PENABLE) .DW H8P_INIT #ENDIF +#IF (GM7303ENABLE) + .DW GM7303_INIT +#ENDIF #IF (PLATFORM == PLT_NABU) .DW NABU_INIT #ENDIF @@ -4347,6 +4353,11 @@ HB_DSKACT: CALL LCD_DSKACT #ENDIF #ENDIF +#IF (GM7303ENABLE) + #IF (GM7303DSKACT) + CALL GM7303_DSKACT + #ENDIF +#ENDIF #IF (DSKYENABLE) #IF (DSKYDSKACT) ; @@ -7964,7 +7975,6 @@ PS_VDGDC .TEXT "GDC$" PS_VDTMS .TEXT "TMS$" PS_VDVGA .TEXT "VGA$" PS_VDVRC .TEXT "VRC$" -PS_VDEF .TEXT "EF$" PS_VDFV .TEXT "FV$" ; ; VIDEO TYPE STRINGS @@ -8024,6 +8034,15 @@ SIZ_LCD .EQU $ - ORG_LCD MEMECHO " bytes.\n" #ENDIF ; +#IF (GM7303ENABLE) +ORG_GM7303 .EQU $ + #INCLUDE "gm7303.asm" +SIZ_GM7303 .EQU $ - ORG_GM7303 + MEMECHO "GM7303 occupies " + MEMECHO SIZ_GM7303 + MEMECHO " bytes.\n" +#ENDIF +; #IF (H8PENABLE) ORG_H8P .EQU $ #INCLUDE "h8p.asm"