|
|
|
@ -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) |
|
|
|
|