diff --git a/Source/HBIOS/sio.asm b/Source/HBIOS/sio.asm index 84ce75ff..e1ca02b8 100644 --- a/Source/HBIOS/sio.asm +++ b/Source/HBIOS/sio.asm @@ -19,7 +19,6 @@ SIOA_CMD .EQU SIOBASE + $00 ;PS SIOA_DAT .EQU SIOBASE + $01 ;PS SIOB_CMD .EQU SIOBASE + $02 ;PS SIOB_DAT .EQU SIOBASE + $03 ;PS -SIO_WR4 .EQU $C4 ;PS CLK/64=115200 BAUD, NO PARITY, 1 STOP BIT ; 11000100 11=*64 00=8bit sync character 01=1 stop bit 0 = parity even/odd 0=parity disabled #ENDIF ; #IF (SIOMODE == SIOMODE_SMB) @@ -27,7 +26,6 @@ SIOA_CMD .EQU SIOBASE + $02 ;PS SIOA_DAT .EQU SIOBASE + $00 ;PS SIOB_CMD .EQU SIOBASE + $03 ;PS SIOB_WR4 .EQU SIOBASE + $01 ;PS -SIO_CFG .EQU $C4 ;PS CLK/64=115200 BAUD, NO PARITY, 1 STOP BIT ; 11000100 11=*64 00=8bit sync character 01=1 stop bit 0 = parity even/odd 0=parity disabled #ENDIF ; #IF (SIOMODE == SIOMODE_ZP) ;PS @@ -35,7 +33,6 @@ SIOA_CMD .EQU SIOBASE + $06 ;PS SIOA_DAT .EQU SIOBASE + $04 ;PS SIOB_CMD .EQU SIOBASE + $07 ;PS SIOB_DAT .EQU SIOBASE + $05 ;PS -SIO_WR4 .EQU $44 ;PS CLK/16=38400 BAUD, NO PARITY, 1 STOP BIT ; PS 01000100 10=*16 00=8bit sync character 01=1 stop bit 0 = parity even/odd 0=parity disabled #ENDIF ;PS ; @@ -493,7 +490,7 @@ SIO_INITUNIT: LD HL,SIO_DEV ; POINT TO CURRENT UART DEVICE NUM LD A,(HL) ; PUT IN ACCUM INC (HL) ; INCREMENT IT (FOR NEXT LOOP) - LD (IY),A ; UDPATE UNIT NUM + LD (IY),A ; UPDATE UNIT NUM ; SET DEFAULT CONFIG LD DE,-1 ; LEAVE CONFIG ALONE @@ -771,21 +768,79 @@ SIO_INITDEV: ; 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! + PUSH DE ; SAVE CONFIG + + 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 ; We set the divider and the lower bit (d2) of the baud rate here + LD D,$04 ; /1 N,8,1 + JR Z,BROK + CP SIOBAUD2 + LD D,$44 ; /16 N,8,1 + JR Z,BROK + CP SIOBAUD3 + LD D,$84 ; /32 N,8,1 + JR Z,BROK + CP SIOBAUD4 + LD D,$C4 ; /64 N,8,1 + JR Z,BROK ; RET NZ + +#IF (SIODEBUG) + PUSH AF + PRTS(" BR FAIL[$") + CALL PRTHEXBYTE + PRTC(']') + POP AF +#ENDIF ; - ; GOT A DIVISOR, COMMIT NEW CONFIG +EXITINIT: + POP DE + RET ; NZ status here indicating fail / invalid baud rate. + +BROK: + LD A,E + AND $E0 + JR NZ,EXITINIT ; NZ status here indicates dtr, xon, parity mark or space so return + + LD A,E ; set stop bit (d3) and add divider + AND $04 + RLA + OR D ; carry gets reset here + + +; LD A,E ; get the parity bits +; SRL A ; move them to bottom two bits +; SRL A ; we know top bits are zero from previous test +; SRL A ; add stop bits +; OR D + + LD DE,SIO_INITVALS+3 + LD (DE),A + +#IF (SIODEBUG) + PUSH AF + PRTS(" MODE[$") + CALL PRTHEXBYTE + PRTC(']') + POP AF +#ENDIF + + POP DE ; RESTORE 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 + ; PROGRAM THE SIO CHIP CHANNEL LD C,(IY + 3) ; COMMAND PORT LD HL,SIO_INITVALS ; POINT TO INIT VALUES LD B,SIO_INITLEN ; COUNT OF BYTES TO WRITE @@ -818,7 +873,7 @@ SIO_INITDEV1: ; SIO_INITVALS: .DB $00, $18 ; WR0: CHANNEL RESET - .DB $04, $SIO_WR4 ; WR4: CLK BAUD PARITY STOP BIT ; PST + .DB $04, $00 ; WR4: CLK BAUD PARITY STOP BIT ; PST .DB $01, $18 ; WR1: INTERRUPT ON ALL RECEIVE CHARACTERS .DB $02, IVT_SER0 ; WR2: INTERRUPT VECTOR OFFSET .DB $03, $C1 ; WR3: 8 BIT RCV, RX ENABLE @@ -860,59 +915,6 @@ 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 @@ -981,7 +983,7 @@ SIOB_BUFSZ .EQU $ - SIOB_BUF ; SIZE OF RING BUFFER ; SIO PORT TABLE ; SIO_CFG: - ; SIO/2 CHANNEL A + ; SIO CHANNEL A .DB 0 ; DEVICE NUMBER (SET DURING INIT) .DB 0 ; SIO TYPE (SET DURING INIT) .DB 0 ; SIO CHANNEL (A) @@ -989,7 +991,7 @@ SIO_CFG: .DW DEFSIOACFG ; LINE CONFIGURATION .DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; - ; SIO/2 CHANNEL B + ; SIO CHANNEL B .DB 0 ; DEVICE NUMBER (SET DURING INIT) .DB 0 ; SIO TYPE (SET DURING INIT) .DB 1 ; SIO CHANNEL (B)