Browse Source

Inline the serial format code and add stop bit setting

pull/8/head
b1ackmai1er 8 years ago
committed by GitHub
parent
commit
d0ee99fff2
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 140
      Source/HBIOS/sio.asm

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

Loading…
Cancel
Save