diff --git a/Source/HBIOS/sio.asm b/Source/HBIOS/sio.asm index 75ccdaf3..84ce75ff 100644 --- a/Source/HBIOS/sio.asm +++ b/Source/HBIOS/sio.asm @@ -757,6 +757,32 @@ SIO_OST: ; ; SIO_INITDEV: +; + ; TEST FOR -1 WHICH MEANS USE CURRENT CONFIG (JUST REINIT) ; PS + LD A,D ; TEST DE FOR ; PS + AND E ; ... VALUE OF -1 ; PS + INC A ; ... SO Z SET IF -1 ; PS + JR NZ,SIO_INITDEV1 ; IF DE == -1, REINIT CURRENT CONFIG ; PS +; + ; LOAD EXISTING CONFIG TO REINIT ;PS + LD E,(IY + 4) ; LOW BYTE ;PS + LD D,(IY + 5) ; HIGH BYTE ;PS + +; CHANGE INIT TABLE +; +SIO_INITDEV1: + ; DETERMINE DIVISOR + PUSH DE ; SAVE CONFIG + CALL SIO_COMPDIV ; COMPUTE DIVISOR TO BC + POP DE ; RESTORE CONFIG + RET NZ ; ABORT IF COMPDIV FAILS! +; + ; GOT A DIVISOR, COMMIT NEW CONFIG + LD (IY + 4),E ; SAVE LOW WORD + LD (IY + 5),D ; SAVE HI WORD + +; *** PUT CODE IN HERE TO UPDATE SIO PROGRAMMING TABLE BEFORE IT IS PROGRAMMED. + HB_DI ; AVOID CONFLICTS ; ; PROGRAM THE SIO/2 CHIP CHANNEL @@ -834,6 +860,59 @@ SIO_DETECT: ; ; ; +SIO_COMPDIV: + ; WE WANT TO DETERMINE A DIVISOR FOR THE UART CLOCK ; PS FROM UART.ASM + ; THAT RESULTS IN THE DESIRED BAUD RATE. +; + LD A,D ; GET CONFIG MSB + AND $1F ; ISOLATE ENCODED BAUD RATE + +#IF (SIODEBUG) + PUSH AF + PRTS(" ENCODE[$") + CALL PRTHEXBYTE + PRTC(']') + POP AF +#ENDIF + + CP SIOBAUD1 + LD E,$04 ; /1 N,8,1 + JR Z,BREX + CP SIOBAUD2 + LD E,$44 ; /16 N,8,1 + JR Z,BREX + CP SIOBAUD3 + LD E,$84 ; /32 N,8,1 + JR Z,BREX + CP SIOBAUD4 + LD E,$C4 ; /64 N,8,1 + JR Z,BREX ; RET NZ + +#IF (SIODEBUG) + PUSH AF + PRTS(" BR FAIL[$" + CALL PRTHEXBYTE + PRTC(']' + POP AF +#ENDIF + + RET ; NZ stus here indicating fail. + +BREX: ; Z status here indicating success + LD A,E + LD DE,SIO_INITVALS+3 + LD (DE),A + +#IF (SIODEBUG) + PUSH AF + PRTS(" MODE[$") + CALL PRTHEXBYTE + PRTC(']') + POP AF + +#ENDIF + + RET SIO_PRTCFG: ; ANNOUNCE PORT CALL NEWLINE ; FORMATTING