From 610a2746f58e00180f1ab048d3b859f0ab68c61f Mon Sep 17 00:00:00 2001 From: drj113 Date: Thu, 19 Sep 2024 13:46:55 +1000 Subject: [PATCH] gm7303 changes to support DSKY operations Changes to support GM7303 as a DSKY device --- Source/HBIOS/cfg_GMZ180.asm | 4 +- Source/HBIOS/dbgmon.asm | 13 +- Source/HBIOS/gm7303.asm | 359 ++++++++++++++++++++++++++++++------ Source/HBIOS/hbios.asm | 2 +- Source/HBIOS/hbios.inc | 1 + Source/HBIOS/romldr.asm | 9 +- Source/HBIOS/std.asm | 1 + 7 files changed, 332 insertions(+), 57 deletions(-) diff --git a/Source/HBIOS/cfg_GMZ180.asm b/Source/HBIOS/cfg_GMZ180.asm index 02d10263..2dd0658c 100644 --- a/Source/HBIOS/cfg_GMZ180.asm +++ b/Source/HBIOS/cfg_GMZ180.asm @@ -115,7 +115,7 @@ LEDMODE .SET LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .SET $0E ; STATUS LED PORT ADDRESS LEDDISKIO .SET TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .SET FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYENABLE .SET TRUE ; ENABLES DSKY FUNCTIONALITY DSKYDSKACT .SET FALSE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY ICMENABLE .SET FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) ICMPPIBASE .SET $60 ; BASE I/O ADDRESS OF ICM PPI @@ -126,7 +126,7 @@ H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY -GM7303ENABLE .SET TRUE ; ENABLES THE PROLOG 7303 BOARD WITH 16X2 LCD +GM7303ENABLE .SET TRUE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD GM7303BASE .SET $30 ; BASE ADDRESS FOR GM3703 BOARD GM7303DSKACT .SET TRUE ; ENABLE DISK ACTIVITY OF GM7303 LCD DISPLAY ; diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index 2d0231d8..fe4c0127 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -1750,17 +1750,28 @@ DSKY_HIGHLIGHT: CALL DSKY_PUTLED POP HL RET -; + DSKY_HIGHLIGHTFWDKEYLEDS .DB $00,$00,$00,$30,$00,$00,$00,$00 DSKY_HIGHLIGHTCMDKEYLEDS .DB $20,$00,$20,$3F,$00,$00,$00,$00 DSKY_HIGHLIGHTNUMKEYLEDS .DB $1F,$3F,$1F,$30,$00,$00,$00,$00 DSKY_HIGHLIGHTKEYLEDSOFF .DB $00,$00,$00,$00,$00,$00,$00,$00 ; +#IF (GM7303ENABLE) +; The GM7303 has an ASCII LCD display +CPUUP .DB "-CPU UP-",0 +MSGBOOT .DB "Boot! ",0 +ADDR .DB "Adr 0000",0 +PORT .DB "Port 00",0 +GOTO .DB "Go 0000",0 + +#ELSE IF (!GM7303ENABLE) + CPUUP .DB $40,$39,$73,$3E,$00,$3E,$73,$40 ; "-CPU UP-" (RAW SEG) MSGBOOT .DB $7F,$5C,$5C,$78,$82,$00,$00,$00 ; "Boot! " (RAW SEG) ADDR .DB $17,$18,$19,$10,$00,$00,$00,$00 ; "Adr 0000" (ENCODED) PORT .DB $13,$14,$15,$16,$10,$10,$00,$00 ; "Port 00" (ENCODED) GOTO .DB $1A,$14,$10,$10,$00,$00,$00,$00 ; "Go 0000" (ENCODED) +#ENDIF ; ;_HEX_7_SEG_DECODE_TABLE______________________________________________________ ; diff --git a/Source/HBIOS/gm7303.asm b/Source/HBIOS/gm7303.asm index a0f7430e..64901707 100644 --- a/Source/HBIOS/gm7303.asm +++ b/Source/HBIOS/gm7303.asm @@ -21,6 +21,19 @@ ; 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 @@ -37,7 +50,7 @@ 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_SET .EQU $20 ; SET INTERFACE PARAMS GM7303_FUNC_CGADR .EQU $40 ; SET CGRAM ADRESS GM7303_FUNC_DDADR .EQU $80 ; SET DDRAM ADDRESS ; @@ -51,26 +64,30 @@ GM7303_PREINIT: ; TEST FOR PRESENCE... CALL GM7303_DETECT ; PROBE FOR HARDWARE - LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG + LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG OR A ; SET FLAGS - RET Z ; BAIL OUT IF NOT PRESENT ; RESET GM7303 CONTROLLER, DELAYS ARE FIXED, + RET Z ; BAIL OUT IF NOT PRESENT + ; REGISTER DRIVER WITH HBIOS + LD BC,GM7303_DISPATCH + CALL DSKY_SETDISP +; ; INITIALISE LCD - CALL GM7303_RESET ; RESET THE LCD + CALL GM7303_RESETLCD ; RESET THE LCD PUSH HL LD HL,GM7303_INIT_TBL - LD D,04H ; 4 BYTES TO SEND + LD D,04H ; 4 BYTES TO SEND NEXT_INIT: - LD A,(HL) ; GET COMMAND - OUT (GM7303_DATA),A ; WRITE TO TO DISPLAY + 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 + CALL VDELAY ; DO IT POP DE INC HL DEC D ; (D)=00 -> COMMAND - JR NZ,NEXT_INIT ; NO - DO NEXT INIT COMMAND + JR NZ,NEXT_INIT ; NO - DO NEXT INIT COMMAND POP HL ; ; PUT SOMETHING ON THE DISPLAY @@ -94,7 +111,7 @@ GM7303_INIT: LD A,GM7303BASE CALL PRTHEXBYTE ; - LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG + LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG OR A ; SET FLAGS JR Z,GM7303_INIT1 ; HANDLE NOT PRESENT XOR A ; SIGNAL SUCCESS @@ -104,6 +121,230 @@ 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 + 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 + 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_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 +; +;__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 + + + ; ; CALLED FROM HBIOS RIGHT BEFORE A DISK ACCESS ; HL: ADDRESS OF 32-BIT SECTOR NUMBER (LITTLE-ENDIAN) @@ -119,15 +360,15 @@ GM7303_DSKACT: PUSH HL ; LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG - OR A ; SET FLAGS - JR Z,GM7303_DSKACT_Z ; HANDLE NOT PRESENT + OR A ; SET FLAGS + JR Z,GM7303_DSKACT_Z ; HANDLE NOT PRESENT ; PUSH HL - LD HL,$0100 ; ROW 1, COL 0 + LD HL,$0100 ; ROW 1, COL 0 CALL GM7303_GOTORC ; SET DISPLAY ADDRESS POP HL ; - LD DE,GM7303_STR_IO ; PREFIX + LD DE,GM7303_STR_IO ; PREFIX CALL GM7303_OUTDS ; SEND TO DISPLAY (COLS 0-5) LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM @@ -136,7 +377,7 @@ GM7303_DSKACT: LD A,' ' ; SEPARATOR CALL GM7303_OUTD ; SEND TO DISPLAY (COL 8) ; - LD A,(HB_DSKFUNC) ; ACTIVE DISK FUNCTION + LD A,(HB_DSKFUNC) ; ACTIVE DISK FUNCTION CP BF_DIOWRITE ; WRITE? LD A,'W' ; ASSUME WRITE JR Z,GM7303_DSKACT0 ; GO AHEAD @@ -148,7 +389,7 @@ GM7303_DSKACT0: CALL GM7303_OUTD ; SEND TO DISPLAY (COL 11) ; LD A,3 ; POINT TO - CALL ADDHLA ; END OF DWORD (MSB) + CALL ADDHLA ; END OF DWORD (MSB) LD B,4 ; DO 4 BYTES ; GM7303_DSKACT1: @@ -196,17 +437,27 @@ GM7303_AVAILABLE: LD (GM7303_PRESENT),A RET ; -; DELAY ROUTINE +; DELAY ROUTINE - SHORT ; GM7303_DELAY: PUSH AF PUSH DE - LD DE,3 ; WAIT PERIOD + 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 @@ -216,42 +467,40 @@ CMD_STROBE: ; Send a command to the LCD ; SET ENABLE LINE HIGH (BIT 0=1) ; CARRY ON THROUGH THE STROBE ROUTINE STROBE: - OR 01H ; SET ENABLE LINE HIGH (BIT 0=1) + 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) + 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 +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 + 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) + 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 + ; RETURN THROUGH THE STROBE ROUTINE -GM7303_COMMAND: ; OUTPUT COMMAND TO 7303 MODULE LCD +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) + 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 + 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) @@ -259,39 +508,39 @@ GM7303_OUTDS: 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 + 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 + JR GM7303_COMMAND ; AND SEND IT ; -; RESET LCD CONTROLLER MANUAL RESET METHOD +; LCD CONTROLLER MANUAL RESET METHOD ; -GM7303_RESET: +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) + LD A,01 ; SET ENABLE LINE HIGH (BIT 0=1) OUT (GM7303_CTRL),A - LD DE,5000/16 ; WAIT >40MS, WE USE 50MS + LD DE,5000/16 ; WAIT >40MS, WE USE 50MS CALL VDELAY ; DO IT - LD A,00 ; SET ENABLE LINE LOW (BIT 0=0) + LD A,00 ; SET ENABLE LINE LOW (BIT 0=0) OUT (GM7303_CTRL),A - LD A,01 ; SET ENABLE LINE HIGH (BIT 0=1) + LD A,01 ; SET ENABLE LINE HIGH (BIT 0=1) OUT (GM7303_CTRL),A - LD DE,500/16 ; WAIT >4MS, WE USE 5MS + LD DE,500/16 ; WAIT >4MS, WE USE 5MS CALL VDELAY ; DO IT - LD A,00 ; SET ENABLE LINE LOW (BIT 0=0) + LD A,00 ; SET ENABLE LINE LOW (BIT 0=0) OUT (GM7303_CTRL),A - LD A,01 ; SET ENABLE LINE HIGH (BIT 0=1) + LD A,01 ; SET ENABLE LINE HIGH (BIT 0=1) OUT (GM7303_CTRL),A - LD DE,500/16 ; WAIT >4MS, WE USE 5MS + LD DE,500/16 ; WAIT >4MS, WE USE 5MS CALL VDELAY ; DO IT - LD A,00 ; SET ENABLE LINE LOW (BIT 0=0) + LD A,00 ; SET ENABLE LINE LOW (BIT 0=0) OUT (GM7303_CTRL),A RET @@ -300,6 +549,11 @@ GM7303_RESET: ; GM7303_PRESENT .DB 0 ; NON-ZERO WHEN HARDWARE DETECTED ; +; 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 @@ -314,3 +568,4 @@ GM7303_STR_IO .DB "Dsk", 0 + diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 425ed608..64b9d0da 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -9202,4 +9202,4 @@ SLACK .EQU BNKTOP - $ #ENDIF #ENDIF ; - .END + .END \ No newline at end of file diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 7c27b975..5547397f 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -371,6 +371,7 @@ RTCDEV_EZ80 .EQU $07 ; EZ80 ON-CHIP RTC DSKYDEV_ICM .EQU $00 ; Intersil ICM7218 DSKYDEV_PKD .EQU $01 ; Intel P8279 DSKYDEV_H8P .EQU $02 ; Heath H8 Panel +DSKYDEV_GM7303 .EQU $03 ; Genesis GM7303 LCD Panel ; ; VIDEO DEVICE IDS ; diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index e6745893..0acb3ff7 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -2337,12 +2337,19 @@ str_help .db "\r\n" .db "\r\n [.] - Boot Disk Unit/Slice" .db 0 ; -#if (DSKYENABLE) +#if (DSKYENABLE & GM7303ENABLE) +; The GM7303 has an ASCII LCD display +msg_sel .db "Boot?", $00 +msg_boot .db "Boot...", $00 +msg_load .db "Load...", $00 +msg_go .db "Go...", $00 +#else if (DSKYENABLE & !GM7303ENABLE) ; Other DSKY devices use 7 segment LEDs msg_sel .db $7f,$5c,$5c,$78,$53,$00,$00,$00 ; "boot? " msg_boot .db $7f,$5c,$5c,$78,$80,$80,$80,$00 ; "boot... " msg_load .db $38,$5c,$5f,$5e,$80,$80,$80,$00 ; "load... " msg_go .db $3d,$5c,$80,$80,$80,$00,$00,$00 ; "go... " #endif + ; ;======================================================================= ; DSKY keypad led matrix masks diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 32e1bdd3..8944bbf7 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -172,6 +172,7 @@ LEDMODE_NABU .EQU 4 DSKYMODE_NONE .EQU 0 DSKYMODE_V1 .EQU 1 DSKYMODE_NG .EQU 2 +DSKYMODE_GM7303 .EQU 3 ; ; FD MODE SELECTIONS ;