|
|
|
@ -8,7 +8,7 @@ |
|
|
|
; |
|
|
|
; TODO: |
|
|
|
; - CLEAR CONSOLE SCREEN AT INITIALIZATION |
|
|
|
; - INITIALIZE BAUD/MODE OF SERIAL INTERFACES AT INITIALIZATION |
|
|
|
; - INITIALIZE BAUD/MODE OF SERIAL INTERFACES AT INITIALIZATION? |
|
|
|
; |
|
|
|
ESP_IOBASE .EQU $9C |
|
|
|
ESP_0_IO .EQU ESP_IOBASE + 0 |
|
|
|
@ -126,19 +126,52 @@ ESP_INIT6: |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
ESP_DETECT: |
|
|
|
; TRY TO DETECT IF PORT IS FLOATING AND |
|
|
|
; FAIL DETECTION IF SO |
|
|
|
LD C,(IY+ESP_CFG_ST) ; ESP STATUS PORT |
|
|
|
IN A,(C) ; READ IT |
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
AND %11100000 ; ISOLATE TOP 3 BITS |
|
|
|
CP $00 ; ALWAYS ZERO IF PRESENT |
|
|
|
RET NZ ; ABORT ON FAILURE |
|
|
|
; |
|
|
|
; ESP32 PROCESSOR MAY TAKE A FEW SECONDS TO START UP, SO |
|
|
|
; HERE WE WAIT FOR BUSY TO CLEAR WITH ABOUT A 5 SECOND TIMEOUT |
|
|
|
LD B,0 ; LOOP UP TO 256 TIMES |
|
|
|
LD C,(IY+ESP_CFG_ST) ; ESP STATUS PORT |
|
|
|
ESP_DETECT1: |
|
|
|
IN A,(C) ; GET STATUS |
|
|
|
AND (IY+ESP_CFG_BSYMSK) ; IS ESP BUSY? |
|
|
|
JR Z,ESP_DETECT2 ; MOVE ALONG IF NOT BUSY |
|
|
|
LD DE,1500 ; 1500 * 16US = 24MS |
|
|
|
CALL VDELAY ; DELAY |
|
|
|
DJNZ ESP_DETECT1 ; LOOP |
|
|
|
OR $FF ; SIGNAL FAILURE |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
ESP_DETECT2: |
|
|
|
;LD A,B ; *DEBUG* |
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
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 |
|
|
|
; |
|
|
|
; LOOK FOR SIGNATURE STARTING WITH "ESP" |
|
|
|
CALL ESP_INWAIT ; ATTEMPT TO GET CHAR |
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
CP 'E' |
|
|
|
RET NZ |
|
|
|
CALL ESP_INWAIT ; ATTEMPT TO GET CHAR |
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
CP 'S' |
|
|
|
RET NZ |
|
|
|
CALL ESP_INWAIT ; ATTEMPT TO GET CHAR |
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
CP 'P' |
|
|
|
RET |
|
|
|
; |
|
|
|
@ -162,13 +195,14 @@ ESP_CLR0: |
|
|
|
; |
|
|
|
ESP_PRTVER: |
|
|
|
CALL ESP_CLR ; CLEAR ANY PENDING DATA |
|
|
|
;LD DE,1000 ; SMALL DELAY HERE |
|
|
|
;CALL VDELAY ; ... SEEMS TO HELP RELIABILITY |
|
|
|
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 |
|
|
|
AND (IY+ESP_CFG_RDYMSK) ; ISOLATE OUTPUT READY BIT |
|
|
|
RET Z ; DONE IF NOTHING READY |
|
|
|
CALL ESP_IN ; GET NEXT CHAR |
|
|
|
@ -208,19 +242,29 @@ ESP_IN1: |
|
|
|
; |
|
|
|
ESP_WTNBSY: |
|
|
|
LD B,0 ; MAX TRIES |
|
|
|
;PUSH HL ; SAVE HL |
|
|
|
;LD HL,0 ; MAX TRIES |
|
|
|
ESP_WTNBSY1: |
|
|
|
LD C,(IY+ESP_CFG_ST) ; ESP STATUS PORT |
|
|
|
IN A,(C) ; GET STATUS |
|
|
|
AND (IY+ESP_CFG_BSYMSK) ; IS ESP BUSY? |
|
|
|
RET Z ; RETURN IF NOT BUSY |
|
|
|
;JR Z,ESP_WTNBSY_Z ; RETURN IF NOT BUSY |
|
|
|
DJNZ ESP_WTNBSY1 ; ELSE LOOP |
|
|
|
;DEC HL ; DEC LOOP COUNTER |
|
|
|
;LD A,H ; CHECK FOR |
|
|
|
;OR L ; ... TIMEOUT |
|
|
|
;JR NZ,ESP_WTNBSY1 ; LOOP AS NEEDED |
|
|
|
CALL PC_ASTERISK ; *DEBUG* |
|
|
|
OR $FF ; SIGNAL TIMEOUT |
|
|
|
;ESP_WTNBSY_Z: |
|
|
|
;POP HL ; RECOVER HL |
|
|
|
RET ; AND RETURN |
|
|
|
; |
|
|
|
; WAIT FOR ESP TO BE BUSY |
|
|
|
; |
|
|
|
ESP_WTBSY: |
|
|
|
LD B,20 ; MAX TRIES |
|
|
|
LD B,3 ; MAX TRIES |
|
|
|
ESP_WTBSY1: |
|
|
|
LD C,(IY+ESP_CFG_ST) ; ESP STATUS PORT |
|
|
|
IN A,(C) ; GET STATUS |
|
|
|
@ -230,6 +274,27 @@ ESP_WTBSY1: |
|
|
|
DJNZ ESP_WTBSY1 ; ELSE LOOP |
|
|
|
OR $FF ; SIGNAL TIMEOUT |
|
|
|
RET ; AND RETURN |
|
|
|
;;;; |
|
|
|
;;;; WAIT FOR ESP TO BE READY TO OUTPUT |
|
|
|
;;;; |
|
|
|
;;;ESP_WTRDY: |
|
|
|
;;; PUSH HL ; SAVE HL |
|
|
|
;;; LD HL,0 ; MAX TRIES |
|
|
|
;;;ESP_WTRDY1: |
|
|
|
;;; LD C,(IY+ESP_CFG_ST) ; ESP STATUS PORT |
|
|
|
;;; IN A,(C) ; GET STATUS |
|
|
|
;;; XOR $FF ; INVERT SO 0=READY |
|
|
|
;;; AND (IY+ESP_CFG_RDYMSK) ; IS ESP READY TO OUTPUT |
|
|
|
;;; JR Z,ESP_WTRDY_Z ; RETURN IF READY |
|
|
|
;;; DEC HL ; DEC LOOP COUNTER |
|
|
|
;;; LD A,H ; CHECK FOR |
|
|
|
;;; OR L ; ... TIMEOUT |
|
|
|
;;; JR NZ,ESP_WTRDY1 ; LOOP AS NEEDED |
|
|
|
;;; CALL PC_PERIOD ; *DEBUG* |
|
|
|
;;; OR $FF ; SIGNAL TIMEOUT |
|
|
|
;;;ESP_WTRDY_Z: |
|
|
|
;;; POP HL ; RECOVER HL |
|
|
|
;;; RET ; AND RETURN |
|
|
|
; |
|
|
|
; WAIT FOR ESP TO BE READY TO OUTPUT |
|
|
|
; |
|
|
|
@ -242,6 +307,7 @@ ESP_WTRDY1: |
|
|
|
AND (IY+ESP_CFG_RDYMSK) ; IS ESP READY TO OUTPUT |
|
|
|
RET Z ; RETURN IF READY |
|
|
|
DJNZ ESP_WTRDY1 ; ELSE LOOP |
|
|
|
CALL PC_PERIOD ; *DEBUG* |
|
|
|
OR $FF ; SIGNAL TIMEOUT |
|
|
|
RET ; AND RETURN |
|
|
|
; |
|
|
|
|