diff --git a/Source/HBIOS/esp.asm b/Source/HBIOS/esp.asm index f4f49b76..0f8d429a 100644 --- a/Source/HBIOS/esp.asm +++ b/Source/HBIOS/esp.asm @@ -33,7 +33,8 @@ ESP_1_SPARE .EQU %00100000 ; ; COMMAND OPCODES ; -ESP_CMD_NOP .EQU 0 ; NO OP +ESP_CMD_NOP .EQU 0 ; NO OP/SYNC +ESP_CMD_SYNC .EQU 0 ; NO OP/SYNC ESP_0_CMD_COUT .EQU 1 ; CHAR OUT ESP_0_CMD_CSTR .EQU 2 ; STRING OUT ESP_0_CMD_KIN .EQU 3 ; KEY IN @@ -76,11 +77,11 @@ ESP_INIT: ; ESP_INIT1: CALL ESP_PRTVER - + LD A,(ESP_PRES) SET 0,A LD (ESP_PRES),A - + ; ESP_INIT2: ; DETECT SECOND ESP32 MODULE @@ -151,6 +152,7 @@ ESP_DETECT1: RET ; DONE ; ESP_DETECT2: + CALL ESP_SYNC ;LD A,B ; *DEBUG* ;CALL PC_SPACE ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG* @@ -178,8 +180,8 @@ ESP_DETECT2: ; CLEAR ESP INPUT QUEUE ; ESP_CLR: - LD B,0 ; MAX CHARS TO READ -ESP_CLR0: +; LD B,0 ; MAX CHARS TO READ /Removed DDW +;ESP_CLR0: /Removed DDW CALL ESP_WTNBSY ; WAIT TILL NOT BUSY RET NZ ; BAIL OUT IF TIMEOUT IN A,(ESP_STAT) ; GET STATUS @@ -187,13 +189,28 @@ ESP_CLR0: RET Z ; IF NOT, DONE LD C,(IY+ESP_CFG_IO) ; ESP I/O PORT IN A,(C) ; GET BYTE - DJNZ ESP_CLR0 ; LOOP TILL DONE - OR $FF ; SIGNAL FAILURE + JP ESP_CLR +; DJNZ ESP_CLR0 ; LOOP TILL DONE /Removed DDW +; OR $FF ; SIGNAL FAILURE /Removed DDW +; RET /Removed DDW + +; +; RE-SYNC ESP (added DDW) +; +ESP_SYNC: + LD B,0 ; sync count -- WORST CASE PERFORMACE COULD BE IMPROVED BY REDUCING THIS VALUE +ESP_SYNC0: + PUSH BC + LD A,ESP_CMD_SYNC ; Sync ESP + CALL ESP_OUT ; SEND CMD OPCODE + POP BC + DJNZ ESP_SYNC0 ; LOOP TILL DONE RET ; ; PRINT ESP VERSION STRING TO CONSOLE ; ESP_PRTVER: + CALL ESP_SYNC CALL ESP_CLR ; CLEAR ANY PENDING DATA ;LD DE,1000 ; SMALL DELAY HERE ;CALL VDELAY ; ... SEEMS TO HELP RELIABILITY @@ -224,13 +241,13 @@ ESP_OUT: ESP_INWAIT: CALL ESP_WTNBSY ; WAIT TILL NOT BUSY CALL ESP_WTRDY ; WAIT FOR READY TO OUTPUT - ; FALL THRU (GET CHAR VIA ESP_IN) + JP ESP_IN1 ; Added DDW ; ; GET BYTE FROM ESP (NON BLOCKING) ; ESP_IN: CALL ESP_WTNBSY ; WAIT TILL NOT BUSY -ESP_IN1: +ESP_IN1: LD C,(IY+ESP_CFG_IO) ; ESP I/O PORT IN A,(C) ; GET BYTE PUSH AF ; SAVE VALUE @@ -244,7 +261,7 @@ ESP_WTNBSY: LD B,0 ; MAX TRIES ;PUSH HL ; SAVE HL ;LD HL,0 ; MAX TRIES -ESP_WTNBSY1: +ESP_WTNBSY1: LD C,(IY+ESP_CFG_ST) ; ESP STATUS PORT IN A,(C) ; GET STATUS AND (IY+ESP_CFG_BSYMSK) ; IS ESP BUSY? @@ -255,7 +272,7 @@ ESP_WTNBSY1: ;LD A,H ; CHECK FOR ;OR L ; ... TIMEOUT ;JR NZ,ESP_WTNBSY1 ; LOOP AS NEEDED - CALL PC_ASTERISK ; *DEBUG* + ;CALL PC_ASTERISK ; *DEBUG* OR $FF ; SIGNAL TIMEOUT ;ESP_WTNBSY_Z: ;POP HL ; RECOVER HL @@ -265,7 +282,7 @@ ESP_WTNBSY1: ; ESP_WTBSY: LD B,3 ; MAX TRIES -ESP_WTBSY1: +ESP_WTBSY1: LD C,(IY+ESP_CFG_ST) ; ESP STATUS PORT IN A,(C) ; GET STATUS XOR $FF ; INVERT SO 0=BUSY @@ -307,7 +324,8 @@ 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* + ;CALL PC_PERIOD ; *DEBUG* + CALL ESP_SYNC ; SOMETHING WENT WRONG, ENSURE SYNC (Added DDW) OR $FF ; SIGNAL TIMEOUT RET ; AND RETURN ; @@ -393,6 +411,7 @@ ESPCON_IN: ; ; ESPCON_IST: + CALL ESP_CLR ; CLEAR ANY PENDING DATA (Added DDW) LD A,ESP_0_CMD_KST ; KBD BUF STATUS CALL ESP_OUT ; SEND CMD OPCODE CALL ESP_INWAIT ; GET BUF SIZE @@ -423,7 +442,9 @@ ESPCON_OST: ; ; ESPCON_INITDEV: - SYSCHKERR(ERR_NOTIMPL) + CALL ESP_CLR + CALL ESP_SYNC +; SYSCHKERR(ERR_NOTIMPL) Removed DDW RET ; ; @@ -529,6 +550,7 @@ ESPSER_IN: ; ; ESPSER_IST: + CALL ESP_CLR ; CLEAR ANY PENDING DATA (Added DDW) LD A,ESP_CMD_SST ; SERIAL STATUS CALL ESP_OUT ; SEND CMD OPCODE CALL ESP_INWAIT ; GET BUF SIZE @@ -559,6 +581,8 @@ ESPSER_OST: ; ; ESPSER_INITDEV: + CALL ESP_CLR + CALL ESP_SYNC PUSH DE ; SAVE INCOMING CONFIG WORD ; ; XLATE NEW LINE MODE INTO C