mirror of https://github.com/wwarthen/RomWBW.git
25 changed files with 352 additions and 5 deletions
@ -0,0 +1,298 @@ |
|||||
|
; |
||||
|
;================================================================================================== |
||||
|
; ESP32 DRIVER |
||||
|
; |
||||
|
; SUPPORTS DAN WERNER'S NHYODYNE (MBC) ESP32 MODULE |
||||
|
; https://github.com/danwerner21/nhyodyne/tree/main/Z80ESP |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
; TODO: |
||||
|
; |
||||
|
ESP_IOBASE .EQU $9C |
||||
|
ESP_0_IO .EQU ESP_IOBASE + 0 |
||||
|
ESP_1_IO .EQU ESP_IOBASE + 1 |
||||
|
ESP_STAT .EQU ESP_IOBASE + 2 |
||||
|
; |
||||
|
; ESP STATUS PORT |
||||
|
; MSB XX S S S S S S |
||||
|
; | | | | | +- ESP0 READY OUTPUT |
||||
|
; | | | | +--- ESP0 BUSY |
||||
|
; | | | +----- ESP0 SPARE |
||||
|
; | | +------- ESP1 READY OUTPUT |
||||
|
; | +--------- ESP1 BUSY |
||||
|
; +----------- ESP1 SPARE |
||||
|
; |
||||
|
ESP_0_RDY .EQU %00000001 |
||||
|
ESP_0_BUSY .EQU %00000010 |
||||
|
ESP_0_SPARE .EQU %00000100 |
||||
|
ESP_1_RDY .EQU %00001000 |
||||
|
ESP_1_BUSY .EQU %00010000 |
||||
|
ESP_1_SPARE .EQU %00100000 |
||||
|
; |
||||
|
; COMMAND OPCODES |
||||
|
; |
||||
|
ESP_CMD_NOP .EQU 0 ; NO OP |
||||
|
ESP_CMD_COUT .EQU 1 ; CHAR OUT |
||||
|
ESP_CMD_SOUT .EQU 2 ; STRING OUT |
||||
|
ESP_CMD_KIN .EQU 3 ; KEY IN |
||||
|
ESP_CMD_KST .EQU 4 ; KBD BUF STATUS |
||||
|
ESP_CMD_DISC .EQU $FF ; DISCOVER |
||||
|
; |
||||
|
; GLOBAL ESP INITIALIZATION |
||||
|
; |
||||
|
ESP_INIT: |
||||
|
; |
||||
|
CALL NEWLINE ; FORMATTING |
||||
|
PRTS("ESP: IO=0x$") |
||||
|
LD A,ESP_IOBASE |
||||
|
CALL PRTHEXBYTE |
||||
|
; |
||||
|
CALL ESP_DETECT |
||||
|
LD DE,ESP_STR_NOHW |
||||
|
JP NZ,WRITESTR |
||||
|
; |
||||
|
; PRINT FIRMWARE VERSION |
||||
|
PRTS(" F/W=$") |
||||
|
CALL ESP_PRTVER |
||||
|
; |
||||
|
CALL ESPCON_INIT ; CONSOLE INITIALIZATION |
||||
|
; |
||||
|
RET |
||||
|
; |
||||
|
;================================================================================================== |
||||
|
; ESP32 INTERFACE FUNCTIONS |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
ESP_DETECT: |
||||
|
CALL ESP_CLR ; CLEAR ANY PENDING DATA |
||||
|
RET NZ ; IF FAILS, ASSUME NOT PRESENT |
||||
|
LD A,ESP_CMD_DISC ; DISCOVER COMMAND |
||||
|
CALL ESP_OUT ; SEND IT |
||||
|
LD DE,10 ; DELAY 160US |
||||
|
CALL VDELAY ; ... TO ENSURE OUTPUT RDY SET |
||||
|
IN A,(ESP_STAT) ; GET STATUS |
||||
|
AND ESP_0_RDY ; ISOLATE OUTPUT READY BIT |
||||
|
XOR ESP_0_RDY ; INVERT SO 0=FOUND |
||||
|
RET ; DONE |
||||
|
; |
||||
|
; CLEAR ESP INPUT QUEUE |
||||
|
; |
||||
|
ESP_CLR: |
||||
|
LD B,0 ; MAX CHARS TO READ |
||||
|
ESP_CLR0: |
||||
|
CALL ESP_WTNBSY ; WAIT TILL NOT BUSY |
||||
|
IN A,(ESP_STAT) ; GET STATUS |
||||
|
AND ESP_0_RDY ; IS THERE MORE DATA? |
||||
|
RET Z ; IF NOT, DONE |
||||
|
IN A,(ESP_0_IO) ; GET CHAR |
||||
|
DJNZ ESP_CLR0 ; LOOP TILL DONE |
||||
|
OR $FF ; SIGNAL FAILURE |
||||
|
RET |
||||
|
; |
||||
|
; PRINT ESP VERSION STRING TO CONSOLE |
||||
|
; |
||||
|
ESP_PRTVER: |
||||
|
CALL ESP_CLR ; CLEAR ANY PENDING DATA |
||||
|
LD A,ESP_CMD_DISC ; DISCOVER COMMAND |
||||
|
CALL ESP_OUT ; SEND IT |
||||
|
CALL ESP_WTRDY ; WAIT FOR READY TO OUTPUT |
||||
|
ESP_PRTVER1: |
||||
|
CALL ESP_WTNBSY ; WAIT TILL NOT BUSY |
||||
|
IN A,(ESP_STAT) ; GET STATUS |
||||
|
AND ESP_0_RDY ; ISOLATE OUTPUT READY BIT |
||||
|
RET Z ; DONE IF NOTHING READY |
||||
|
CALL ESP_IN ; GET NEXT CHAR |
||||
|
CALL COUT ; PRINT CHAR |
||||
|
JR ESP_PRTVER1 ; LOOP |
||||
|
; |
||||
|
; SEND BYTE TO ESP |
||||
|
; |
||||
|
ESP_OUT: |
||||
|
PUSH AF ; SAVE VALUE |
||||
|
CALL ESP_WTNBSY ; WAIT TILL NOT BUSY |
||||
|
POP AF ; POP VALUE |
||||
|
OUT (ESP_0_IO),A ; SEND CHARACTER |
||||
|
JR ESP_WTBSY ; RETURN VIA WTBSY |
||||
|
; |
||||
|
; GET BYTE FROM ESP (BLOCKING) |
||||
|
; |
||||
|
ESP_INWAIT: |
||||
|
CALL ESP_WTNBSY ; WAIT TILL NOT BUSY |
||||
|
CALL ESP_WTRDY ; WAIT FOR READY TO OUTPUT |
||||
|
; FALL THRU (GET CHAR VIA ESP_IN) |
||||
|
; |
||||
|
; GET BYTE FROM ESP (NON BLOCKING) |
||||
|
; |
||||
|
ESP_IN: |
||||
|
CALL ESP_WTNBSY ; WAIT TILL NOT BUSY |
||||
|
ESP_IN1: |
||||
|
IN A,(ESP_0_IO) ; GET BYTE |
||||
|
PUSH AF ; SAVE VALUE |
||||
|
CALL ESP_WTBSY ; WAIT TILL BUSY |
||||
|
POP AF ; RESTORE VALUE |
||||
|
RET ; AND RETURN |
||||
|
; |
||||
|
; WAIT FOR ESP TO BE NOT BUSY |
||||
|
; |
||||
|
ESP_WTNBSY: |
||||
|
LD B,0 ; MAX TRIES |
||||
|
ESP_WTNBSY1: |
||||
|
IN A,(ESP_STAT) ; GET STATUS |
||||
|
AND ESP_0_BUSY ; IS ESP BUSY? |
||||
|
RET Z ; RETURN IF NOT BUSY |
||||
|
DJNZ ESP_WTNBSY1 ; ELSE LOOP |
||||
|
OR $FF ; SIGNAL TIMEOUT |
||||
|
RET ; AND RETURN |
||||
|
; |
||||
|
; WAIT FOR ESP TO BE BUSY |
||||
|
; |
||||
|
ESP_WTBSY: |
||||
|
LD B,20 ; MAX TRIES |
||||
|
ESP_WTBSY1: |
||||
|
IN A,(ESP_STAT) ; GET STATUS |
||||
|
AND ESP_0_BUSY ; IS ESP BUSY? |
||||
|
XOR ESP_0_BUSY ; INVERT |
||||
|
RET Z ; RETURN IF BUSY |
||||
|
DJNZ ESP_WTBSY1 ; ELSE LOOP |
||||
|
OR $FF ; SIGNAL TIMEOUT |
||||
|
RET ; AND RETURN |
||||
|
; |
||||
|
; WAIT FOR ESP TO BE READY TO OUTPUT |
||||
|
; |
||||
|
ESP_WTRDY: |
||||
|
LD B,0 ; MAX TRIES |
||||
|
ESP_WTRDY1: |
||||
|
IN A,(ESP_STAT) ; GET STATUS |
||||
|
AND ESP_0_RDY ; IS ESP READY TO OUTPUT |
||||
|
XOR ESP_0_RDY ; INVERT, 0=READY |
||||
|
RET Z ; RETURN IF READY |
||||
|
DJNZ ESP_WTRDY1 ; ELSE LOOP |
||||
|
OR $FF ; SIGNAL TIMEOUT |
||||
|
RET ; AND RETURN |
||||
|
; |
||||
|
; |
||||
|
; |
||||
|
ESP_STR_NOHW .TEXT " NOT PRESENT$" |
||||
|
ESP_STR_UPGRADE .TEXT " !!!UPGRADE REQUIRED!!!$" |
||||
|
; |
||||
|
;================================================================================================== |
||||
|
; ESP32 CONSOLE DRIVER |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
; |
||||
|
ESPCON_ROWS .EQU 25 ; VGA DISPLAY ROWS |
||||
|
ESPCON_COLS .EQU 80 ; VGA DISPLAY COLS |
||||
|
; |
||||
|
; |
||||
|
; |
||||
|
ESPCON_INIT: |
||||
|
; |
||||
|
CALL NEWLINE |
||||
|
PRTS("ESPCON:$") |
||||
|
; |
||||
|
; DISPLAY CONSOLE DIMENSIONS |
||||
|
CALL PC_SPACE |
||||
|
LD A,ESPCON_COLS |
||||
|
CALL PRTDECB |
||||
|
LD A,'X' |
||||
|
CALL COUT |
||||
|
LD A,ESPCON_ROWS |
||||
|
CALL PRTDECB |
||||
|
CALL PRTSTRD |
||||
|
.TEXT " TEXT (ANSI)$" |
||||
|
; |
||||
|
; ADD OURSELVES TO CIO DISPATCH TABLE |
||||
|
; |
||||
|
LD D,0 ; PHYSICAL UNIT IS ZERO |
||||
|
LD E,CIODEV_ESPCON ; DEVICE TYPE |
||||
|
LD BC,ESPCON_FNTBL ; BC := FUNCTION TABLE ADDRESS |
||||
|
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED |
||||
|
LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE |
||||
|
; |
||||
|
XOR A ; SIGNAL SUCCESS |
||||
|
RET |
||||
|
; |
||||
|
; DRIVER FUNCTION TABLE |
||||
|
; |
||||
|
ESPCON_FNTBL: |
||||
|
.DW ESPCON_IN |
||||
|
.DW ESPCON_OUT |
||||
|
.DW ESPCON_IST |
||||
|
.DW ESPCON_OST |
||||
|
.DW ESPCON_INITDEV |
||||
|
.DW ESPCON_QUERY |
||||
|
.DW ESPCON_DEVICE |
||||
|
#IF (($ - ESPCON_FNTBL) != (CIO_FNCNT * 2)) |
||||
|
.ECHO "*** INVALID ESPCON FUNCTION TABLE ***\n" |
||||
|
#ENDIF |
||||
|
; |
||||
|
; |
||||
|
; |
||||
|
ESPCON_IN: |
||||
|
CALL ESPCON_IST |
||||
|
JR Z,ESPCON_IN |
||||
|
LD A,ESP_CMD_KIN ; KBD INPUT |
||||
|
CALL ESP_OUT ; SEND CMD OPCODE |
||||
|
CALL ESP_INWAIT ; GET KEY |
||||
|
LD E,A ; PUT IN E |
||||
|
XOR A ; SIGNAL SUCCES |
||||
|
RET ; AND DONE |
||||
|
; |
||||
|
; |
||||
|
; |
||||
|
ESPCON_IST: |
||||
|
LD A,ESP_CMD_KST ; KBD BUF STATUS |
||||
|
CALL ESP_OUT ; SEND CMD OPCODE |
||||
|
CALL ESP_INWAIT ; GET BUF SIZE |
||||
|
OR A ; SET FLAGS |
||||
|
RET Z ; AND DONE |
||||
|
OR A |
||||
|
RET |
||||
|
; |
||||
|
; |
||||
|
; |
||||
|
ESPCON_OUT: |
||||
|
PUSH DE |
||||
|
LD A,ESP_CMD_COUT ; CHAR OUT OPCODE |
||||
|
CALL ESP_OUT |
||||
|
POP DE |
||||
|
LD A,E |
||||
|
CALL ESP_OUT ; SEND CHAR VALUE |
||||
|
XOR A ; SIGNAL SUCCESS |
||||
|
RET |
||||
|
; |
||||
|
; |
||||
|
; |
||||
|
ESPCON_OST: |
||||
|
OR $FF ; SIGNAL OUTPUT QUEUE READY |
||||
|
RET ; RETURN |
||||
|
; |
||||
|
; |
||||
|
; |
||||
|
ESPCON_INITDEV: |
||||
|
SYSCHKERR(ERR_NOTIMPL) |
||||
|
RET |
||||
|
; |
||||
|
; |
||||
|
; |
||||
|
ESPCON_QUERY: |
||||
|
LD DE,0 |
||||
|
LD HL,0 |
||||
|
XOR A |
||||
|
RET |
||||
|
; |
||||
|
; |
||||
|
; |
||||
|
ESPCON_DEVICE: |
||||
|
LD D,CIODEV_ESPCON ; D := DEVICE TYPE |
||||
|
LD E,0 ; E := DEVICE NUM, ALWAYS 0 |
||||
|
LD C,$BF ; C := DEVICE TYPE, 0xBF IS PROP TERM |
||||
|
LD H,0 ; H := 0, DRIVER HAS NO MODES |
||||
|
LD L,ESP_IOBASE ; L := BASE I/O ADDRESS |
||||
|
XOR A ; SIGNAL SUCCESS |
||||
|
RET |
||||
|
; |
||||
|
;============================================================================= |
||||
|
; DATA STORAGE |
||||
|
;============================================================================= |
||||
|
; |
||||
Loading…
Reference in new issue