Browse Source

Add basic support for configurable port and baud

patch
b1ackmai1er 8 years ago
committed by GitHub
parent
commit
398dec28e9
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 423
      Source/HBIOS/sio.asm

423
Source/HBIOS/sio.asm

@ -10,26 +10,421 @@
; F E D C B A 9 8 7 6 5 4 3 2 1 0
; -- MSB (D REGISTER) -- -- LSB (E REGISTER) --
;
SIO_DEBUG .EQU FALSE
;
SIO_NONE .EQU 0
SIO_SIO .EQU 1
;
#IF (SIOMODE == SIOMODE_RC)
SIOA_CMD .EQU $80
SIOA_DAT .EQU $81
SIOB_CMD .EQU $82
SIOB_DAT .EQU $83
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)
SIOA_CMD .EQU $82
SIOA_DAT .EQU $80
SIOB_CMD .EQU $83
SIOB_DAT .EQU $81
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
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
;
#IF (DEFSIOCLK/DEFSIODIV/1 == 75)
SIOBAUD1 .EQU 0
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 150)
SIOBAUD1 .EQU 1
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 300)
SIOBAUD1 .EQU 2
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 600)
SIOBAUD1 .EQU 3
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 1200)
SIOBAUD1 .EQU 4
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 2400)
SIOBAUD1 .EQU 5
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 4800)
SIOBAUD1 .EQU 6
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 9600)
SIOBAUD1 .EQU 7
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 19200)
SIOBAUD1 .EQU 8
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 38400)
SIOBAUD1 .EQU 9
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 76800)
SIOBAUD1 .EQU 10
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 153600)
SIOBAUD1 .EQU 11
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 307200)
SIOBAUD1 .EQU 12
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 614400)
SIOBAUD1 .EQU 13
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 =1228800)
SIOBAUD1 .EQU 14
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 =2457600)
SIOBAUD1 .EQU 15
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 225)
SIOBAUD1 .EQU 16
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 450)
SIOBAUD1 .EQU 17
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 900)
SIOBAUD1 .EQU 18
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 1800)
SIOBAUD1 .EQU 19
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 3600)
SIOBAUD1 .EQU 20
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 7200)
SIOBAUD1 .EQU 21
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 14400)
SIOBAUD1 .EQU 22
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 28800)
SIOBAUD1 .EQU 23
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 57600)
SIOBAUD1 .EQU 24
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 115200)
SIOBAUD1 .EQU 25
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 230400)
SIOBAUD1 .EQU 26
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 == 921600)
SIOBAUD1 .EQU 28
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 =1843200)
SIOBAUD1 .EQU 29
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 =3686400)
SIOBAUD1 .EQU 30
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/1 =7372800)
SIOBAUD1 .EQU 31
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 75)
SIOBAUD1 .EQU 0
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 150)
SIOBAUD2 .EQU 1
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 300)
SIOBAUD2 .EQU 2
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 600)
SIOBAUD2 .EQU 3
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 1200)
SIOBAUD2 .EQU 4
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 2400)
SIOBAUD2 .EQU 5
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 4800)
SIOBAUD2 .EQU 6
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 9600)
SIOBAUD2 .EQU 7
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 19200)
SIOBAUD2 .EQU 8
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 38400)
SIOBAUD2 .EQU 9
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 76800)
SIOBAUD2 .EQU 10
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 153600)
SIOBAUD2 .EQU 11
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 307200)
SIOBAUD2 .EQU 12
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 614400)
SIOBAUD2 .EQU 13
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 =1228800)
SIOBAUD2 .EQU 14
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 =2457600)
SIOBAUD2 .EQU 15
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 225)
SIOBAUD2 .EQU 16
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 450)
SIOBAUD2 .EQU 17
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 900)
SIOBAUD2 .EQU 18
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 1800)
SIOBAUD2 .EQU 19
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 3600)
SIOBAUD2 .EQU 20
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 7200)
SIOBAUD2 .EQU 21
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 14400)
SIOBAUD2 .EQU 22
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 28800)
SIOBAUD2 .EQU 23
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 57600)
SIOBAUD2 .EQU 24
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 115200)
SIOBAUD2 .EQU 25
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 230400)
SIOBAUD2 .EQU 26
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 460800)
SIOBAUD2 .EQU 27
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 == 921600)
SIOBAUD2 .EQU 28
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 ==1843200)
SIOBAUD2 .EQU 29
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 ==3686400)
SIOBAUD2 .EQU 30
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/16 ==7372800)
SIOBAUD2 .EQU 31
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 75)
SIOBAUD3 .EQU 0
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 150)
SIOBAUD3 .EQU 1
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 300)
SIOBAUD3 .EQU 2
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 600)
SIOBAUD3 .EQU 3
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 1200)
SIOBAUD3 .EQU 4
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 2400)
SIOBAUD3 .EQU 5
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 4800)
SIOBAUD3 .EQU 6
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 9600)
SIOBAUD3 .EQU 7
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 19200)
SIOBAUD3 .EQU 8
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 38400)
SIOBAUD3 .EQU 9
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 76800)
SIOBAUD3 .EQU 10
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 153600)
SIOBAUD3 .EQU 11
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 307200)
SIOBAUD3 .EQU 12
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 614400)
SIOBAUD3 .EQU 13
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32==1228800)
SIOBAUD3 .EQU 14
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32==2457600)
SIOBAUD3 .EQU 15
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 225)
SIOBAUD3 .EQU 16
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 450)
SIOBAUD3 .EQU 17
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 900)
SIOBAUD3 .EQU 18
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 1800)
SIOBAUD3 .EQU 19
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 3600)
SIOBAUD3 .EQU 20
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 7200)
SIOBAUD3 .EQU 21
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 14400)
SIOBAUD3 .EQU 22
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 28800)
SIOBAUD3 .EQU 23
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 57600)
SIOBAUD3 .EQU 24
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32= 115200)
SIOBAUD3 .EQU 25
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32= 230400)
SIOBAUD3 .EQU 26
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 460800)
SIOBAUD3 .EQU 27
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32== 921600)
SIOBAUD3 .EQU 28
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32==1843200)
SIOBAUD3 .EQU 29
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32==3686400)
SIOBAUD3 .EQU 30
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/32==7372800)
SIOBAUD3 .EQU 31
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 75)
SIOBAUD4 .EQU 0
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 150)
SIOBAUD4 .EQU 1
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 300)
SIOBAUD4 .EQU 2
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 600)
SIOBAUD4 .EQU 3
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 1200)
SIOBAUD4 .EQU 4
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 2400)
SIOBAUD4 .EQU 5
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 4800)
SIOBAUD4 .EQU 6
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 9600)
SIOBAUD4 .EQU 7
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 19200)
SIOBAUD4 .EQU 8
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 38400)
SIOBAUD4 .EQU 9
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 76800)
SIOBAUD4 .EQU 10
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 153600)
SIOBAUD4 .EQU 11
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 307200)
SIOBAUD4 .EQU 12
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 614400)
SIOBAUD4 .EQU 13
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64==1228800)
SIOBAUD4 .EQU 14
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64==2457600)
SIOBAUD4 .EQU 15
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 225)
SIOBAUD4 .EQU 16
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 450)
SIOBAUD4 .EQU 17
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 900)
SIOBAUD4 .EQU 18
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 1800)
SIOBAUD4 .EQU 19
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 3600)
SIOBAUD4 .EQU 20
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 7200)
SIOBAUD4 .EQU 21
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 14400)
SIOBAUD4 .EQU 22
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 28800)
SIOBAUD4 .EQU 23
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 57600)
SIOBAUD4 .EQU 24
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 115200)
SIOBAUD4 .EQU 25
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 230400)
SIOBAUD4 .EQU 26
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 460800)
SIOBAUD4 .EQU 27
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64== 921600)
SIOBAUD4 .EQU 28
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64==1843200)
SIOBAUD4 .EQU 29
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64==3686400)
SIOBAUD4 .EQU 30
#ENDIF
#IF (DEFSIOCLK/DEFSIODIV/64==7372800)
SIOBAUD4 .EQU 31
#ENDIF
;
SIO_PREINIT:
;
@ -314,6 +709,10 @@ SIO_OUT:
#IF (SIOMODE == SIOMODE_SMB)
DEC C ; DECREMENT CMD PORT TWICE TO GET DATA PORT
DEC C
#ENDIF
#IF (SIOMODE == SIOMODE_ZP)
DEC C ; DECREMENT CMD PORT TWICE TO GET DATA PORT
DEC C
#ENDIF
OUT (C),E ; SEND CHAR FROM E
XOR A ; SIGNAL SUCCESS
@ -393,7 +792,7 @@ SIO_INITDEV:
;
SIO_INITVALS:
.DB $00, $18 ; WR0: CHANNEL RESET
.DB $04, $C4 ; WR4: CLK/64=115200 BAUD, NO PARITY, 1 STOP BIT
.DB $04, $SIO_WR4 ; 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
@ -508,7 +907,7 @@ SIO_CFG:
.DB 0 ; SIO TYPE (SET DURING INIT)
.DB 0 ; SIO CHANNEL (A)
.DB SIOA_CMD ; BASE PORT (CMD PORT)
.DW DEFSERCFG ; LINE CONFIGURATION
.DW DEFSIOACFG ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; SIO/2 CHANNEL B
@ -516,7 +915,7 @@ SIO_CFG:
.DB 0 ; SIO TYPE (SET DURING INIT)
.DB 1 ; SIO CHANNEL (B)
.DB SIOB_CMD ; BASE PORT (CMD PORT)
.DW DEFSERCFG ; LINE CONFIGURATION
.DW DEFSIOBCFG ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
SIO_CNT .EQU ($ - SIO_CFG) / 8

Loading…
Cancel
Save