Browse Source

gm7303 changes to support DSKY operations

Changes to support GM7303 as a DSKY device
master
drj113 1 year ago
parent
commit
610a2746f5
  1. 4
      Source/HBIOS/cfg_GMZ180.asm
  2. 13
      Source/HBIOS/dbgmon.asm
  3. 359
      Source/HBIOS/gm7303.asm
  4. 1
      Source/HBIOS/hbios.inc
  5. 9
      Source/HBIOS/romldr.asm
  6. 1
      Source/HBIOS/std.asm

4
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 LEDPORT .SET $0E ; STATUS LED PORT ADDRESS
LEDDISKIO .SET TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED 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 DSKYDSKACT .SET FALSE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY
ICMENABLE .SET FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) ICMENABLE .SET FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
ICMPPIBASE .SET $60 ; BASE I/O ADDRESS OF ICM PPI 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 LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY
LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER
LCDDSKACT .SET TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY 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 GM7303BASE .SET $30 ; BASE ADDRESS FOR GM3703 BOARD
GM7303DSKACT .SET TRUE ; ENABLE DISK ACTIVITY OF GM7303 LCD DISPLAY GM7303DSKACT .SET TRUE ; ENABLE DISK ACTIVITY OF GM7303 LCD DISPLAY
; ;

13
Source/HBIOS/dbgmon.asm

@ -1750,17 +1750,28 @@ DSKY_HIGHLIGHT:
CALL DSKY_PUTLED CALL DSKY_PUTLED
POP HL POP HL
RET RET
;
DSKY_HIGHLIGHTFWDKEYLEDS .DB $00,$00,$00,$30,$00,$00,$00,$00 DSKY_HIGHLIGHTFWDKEYLEDS .DB $00,$00,$00,$30,$00,$00,$00,$00
DSKY_HIGHLIGHTCMDKEYLEDS .DB $20,$00,$20,$3F,$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_HIGHLIGHTNUMKEYLEDS .DB $1F,$3F,$1F,$30,$00,$00,$00,$00
DSKY_HIGHLIGHTKEYLEDSOFF .DB $00,$00,$00,$00,$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) 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) 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) 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) 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) GOTO .DB $1A,$14,$10,$10,$00,$00,$00,$00 ; "Go 0000" (ENCODED)
#ENDIF
; ;
;_HEX_7_SEG_DECODE_TABLE______________________________________________________ ;_HEX_7_SEG_DECODE_TABLE______________________________________________________
; ;

359
Source/HBIOS/gm7303.asm

@ -21,6 +21,19 @@
; KEYBOARD 0X30 OUTPUT (COLUMN BIT 0-3) ; KEYBOARD 0X30 OUTPUT (COLUMN BIT 0-3)
; 0X30 INPUT (ROW BIT 0-5) ; 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 ; 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_ENTRY .EQU $04 ; SET CUR DIR AND DISPLAY SHIFT
GM7303_FUNC_DISP .EQU $08 ; DISP, CUR, BLINK ON/OFF GM7303_FUNC_DISP .EQU $08 ; DISP, CUR, BLINK ON/OFF
GM7303_FUNC_SHIFT .EQU $10 ; MOVE CUR / SHIFT DISP 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_CGADR .EQU $40 ; SET CGRAM ADRESS
GM7303_FUNC_DDADR .EQU $80 ; SET DDRAM ADDRESS GM7303_FUNC_DDADR .EQU $80 ; SET DDRAM ADDRESS
; ;
@ -51,26 +64,30 @@ GM7303_PREINIT:
; TEST FOR PRESENCE... ; TEST FOR PRESENCE...
CALL GM7303_DETECT ; PROBE FOR HARDWARE CALL GM7303_DETECT ; PROBE FOR HARDWARE
LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG
LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG
OR A ; SET FLAGS 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 ; INITIALISE LCD
CALL GM7303_RESET ; RESET THE LCD
CALL GM7303_RESETLCD ; RESET THE LCD
PUSH HL PUSH HL
LD HL,GM7303_INIT_TBL LD HL,GM7303_INIT_TBL
LD D,04H ; 4 BYTES TO SEND
LD D,04H ; 4 BYTES TO SEND
NEXT_INIT: 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 CALL CMD_STROBE ; COMMAND STROBE
PUSH DE PUSH DE
LD DE,5000/16 ; WAIT >4MS, WE USE 5MS LD DE,5000/16 ; WAIT >4MS, WE USE 5MS
CALL VDELAY ; DO IT
CALL VDELAY ; DO IT
POP DE POP DE
INC HL INC HL
DEC D ; (D)=00 -> COMMAND 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 POP HL
; ;
; PUT SOMETHING ON THE DISPLAY ; PUT SOMETHING ON THE DISPLAY
@ -94,7 +111,7 @@ GM7303_INIT:
LD A,GM7303BASE LD A,GM7303BASE
CALL PRTHEXBYTE CALL PRTHEXBYTE
; ;
LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG
LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG
OR A ; SET FLAGS OR A ; SET FLAGS
JR Z,GM7303_INIT1 ; HANDLE NOT PRESENT JR Z,GM7303_INIT1 ; HANDLE NOT PRESENT
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
@ -104,6 +121,230 @@ GM7303_INIT1:
PRTS(" NOT PRESENT$") PRTS(" NOT PRESENT$")
OR $FF OR $FF
RET 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 ; CALLED FROM HBIOS RIGHT BEFORE A DISK ACCESS
; HL: ADDRESS OF 32-BIT SECTOR NUMBER (LITTLE-ENDIAN) ; HL: ADDRESS OF 32-BIT SECTOR NUMBER (LITTLE-ENDIAN)
@ -119,15 +360,15 @@ GM7303_DSKACT:
PUSH HL PUSH HL
; ;
LD A,(GM7303_PRESENT) ; GET PRESENCE FLAG 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 PUSH HL
LD HL,$0100 ; ROW 1, COL 0
LD HL,$0100 ; ROW 1, COL 0
CALL GM7303_GOTORC ; SET DISPLAY ADDRESS CALL GM7303_GOTORC ; SET DISPLAY ADDRESS
POP HL POP HL
; ;
LD DE,GM7303_STR_IO ; PREFIX
LD DE,GM7303_STR_IO ; PREFIX
CALL GM7303_OUTDS ; SEND TO DISPLAY (COLS 0-5) CALL GM7303_OUTDS ; SEND TO DISPLAY (COLS 0-5)
LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM
@ -136,7 +377,7 @@ GM7303_DSKACT:
LD A,' ' ; SEPARATOR LD A,' ' ; SEPARATOR
CALL GM7303_OUTD ; SEND TO DISPLAY (COL 8) 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? CP BF_DIOWRITE ; WRITE?
LD A,'W' ; ASSUME WRITE LD A,'W' ; ASSUME WRITE
JR Z,GM7303_DSKACT0 ; GO AHEAD JR Z,GM7303_DSKACT0 ; GO AHEAD
@ -148,7 +389,7 @@ GM7303_DSKACT0:
CALL GM7303_OUTD ; SEND TO DISPLAY (COL 11) CALL GM7303_OUTD ; SEND TO DISPLAY (COL 11)
; ;
LD A,3 ; POINT TO LD A,3 ; POINT TO
CALL ADDHLA ; END OF DWORD (MSB)
CALL ADDHLA ; END OF DWORD (MSB)
LD B,4 ; DO 4 BYTES LD B,4 ; DO 4 BYTES
; ;
GM7303_DSKACT1: GM7303_DSKACT1:
@ -196,17 +437,27 @@ GM7303_AVAILABLE:
LD (GM7303_PRESENT),A LD (GM7303_PRESENT),A
RET RET
; ;
; DELAY ROUTINE
; DELAY ROUTINE - SHORT
; ;
GM7303_DELAY: GM7303_DELAY:
PUSH AF PUSH AF
PUSH DE 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 CALL VDELAY ; DO IT
POP DE POP DE
POP AF POP AF
RET RET
CMD_STROBE: ; Send a command to the LCD 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) ; SET ENABLE LINE HIGH (BIT 0=1)
; CARRY ON THROUGH THE STROBE ROUTINE ; CARRY ON THROUGH THE STROBE ROUTINE
STROBE: STROBE:
OR 01H ; SET ENABLE LINE HIGH (BIT 0=1)
OR 01H ; SET ENABLE LINE HIGH (BIT 0=1)
OUT (GM7303_CTRL),A OUT (GM7303_CTRL),A
CALL GM7303_DELAY 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 OUT (GM7303_CTRL),A
CALL GM7303_DELAY CALL GM7303_DELAY
RET ; EXIT 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 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: 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 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 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 ; SEND DATA STRING
; DE=STRING ADDRESS, NULL TERMINATED ; DE=STRING ADDRESS, NULL TERMINATED
; ;
GM7303_OUTDS: GM7303_OUTDS:
LD A,(DE) ; NEXT BYTE TO SEND 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 JR GM7303_OUTDS ; LOOP AS NEEDED
; ;
; GOTO ROW(H),COL(L) ; GOTO ROW(H),COL(L)
@ -259,39 +508,39 @@ GM7303_OUTDS:
GM7303_GOTORC: GM7303_GOTORC:
PUSH HL ; SAVE INCOMING PUSH HL ; SAVE INCOMING
LD A,H ; ROW # TO A 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 POP HL ; RECOVER INCOMING
ADD A,L ; ADD COLUMN ADD A,L ; ADD COLUMN
ADD A,GM7303_FUNC_DDADR ; ADD SET DDRAM COMMAND 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 LD A,GM7303_FUNC_SET | %11000 ; 8 BIT INTERFACE, COMMAND MODE, 2 LINES
OUT (GM7303_DATA),A 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 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 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 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 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 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 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 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 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 OUT (GM7303_CTRL),A
RET RET
@ -300,6 +549,11 @@ GM7303_RESET:
; ;
GM7303_PRESENT .DB 0 ; NON-ZERO WHEN HARDWARE DETECTED 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_ROWS .DB $00,$40 ; ROW START INDEX FOR 2 LINE DISPLAY
; ;
GM7303_INIT_TBL: ; TABLE OF INITIALISATION COMMANDS FOR THE LCD GM7303_INIT_TBL: ; TABLE OF INITIALISATION COMMANDS FOR THE LCD
@ -314,3 +568,4 @@ GM7303_STR_IO .DB "Dsk", 0

1
Source/HBIOS/hbios.inc

@ -371,6 +371,7 @@ RTCDEV_EZ80 .EQU $07 ; EZ80 ON-CHIP RTC
DSKYDEV_ICM .EQU $00 ; Intersil ICM7218 DSKYDEV_ICM .EQU $00 ; Intersil ICM7218
DSKYDEV_PKD .EQU $01 ; Intel P8279 DSKYDEV_PKD .EQU $01 ; Intel P8279
DSKYDEV_H8P .EQU $02 ; Heath H8 Panel DSKYDEV_H8P .EQU $02 ; Heath H8 Panel
DSKYDEV_GM7303 .EQU $03 ; Genesis GM7303 LCD Panel
; ;
; VIDEO DEVICE IDS ; VIDEO DEVICE IDS
; ;

9
Source/HBIOS/romldr.asm

@ -2337,12 +2337,19 @@ str_help .db "\r\n"
.db "\r\n <u>[.<s>] - Boot Disk Unit/Slice" .db "\r\n <u>[.<s>] - Boot Disk Unit/Slice"
.db 0 .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_sel .db $7f,$5c,$5c,$78,$53,$00,$00,$00 ; "boot? "
msg_boot .db $7f,$5c,$5c,$78,$80,$80,$80,$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_load .db $38,$5c,$5f,$5e,$80,$80,$80,$00 ; "load... "
msg_go .db $3d,$5c,$80,$80,$80,$00,$00,$00 ; "go... " msg_go .db $3d,$5c,$80,$80,$80,$00,$00,$00 ; "go... "
#endif #endif
; ;
;======================================================================= ;=======================================================================
; DSKY keypad led matrix masks ; DSKY keypad led matrix masks

1
Source/HBIOS/std.asm

@ -172,6 +172,7 @@ LEDMODE_NABU .EQU 4
DSKYMODE_NONE .EQU 0 DSKYMODE_NONE .EQU 0
DSKYMODE_V1 .EQU 1 DSKYMODE_V1 .EQU 1
DSKYMODE_NG .EQU 2 DSKYMODE_NG .EQU 2
DSKYMODE_GM7303 .EQU 3
; ;
; FD MODE SELECTIONS ; FD MODE SELECTIONS
; ;

Loading…
Cancel
Save