Browse Source

Merge pull request #9 from b1ackmai1er/master

Fixed wrong port address, cleanups and move big conditional structure to external file.
pull/11/merge
Wayne Warthen 8 years ago
committed by GitHub
parent
commit
716ee19f6c
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 492
      Source/HBIOS/sio.asm
  2. 390
      Source/HBIOS/siobaud.inc

492
Source/HBIOS/sio.asm

@ -10,415 +10,39 @@
; F E D C B A 9 8 7 6 5 4 3 2 1 0 ; F E D C B A 9 8 7 6 5 4 3 2 1 0
; -- MSB (D REGISTER) -- -- LSB (E REGISTER) -- ; -- MSB (D REGISTER) -- -- LSB (E REGISTER) --
; ;
;
; FOR THE ECB-ZILOG-PERIPHERALS BOARD, INFORMATION ON JUMPER SETTINGS
; AND BAUD RATES CAN BE FOUND HERE:
; https://www.retrobrewcomputers.org/doku.php?id=boards:ecb:zilog-peripherals:clock-divider
;
; SIO PORT A (COM1:) and SIO PORT B (COM2:) ARE MAPPED TO DEVICE UC1: AND UL1: IN CP/M.
;
SIO_NONE .EQU 0 SIO_NONE .EQU 0
SIO_SIO .EQU 1 SIO_SIO .EQU 1
; ;
#IF (SIOMODE == SIOMODE_RC) #IF (SIOMODE == SIOMODE_RC)
SIOA_CMD .EQU SIOBASE + $00 ; PS
SIOA_DAT .EQU SIOBASE + $01 ; PS
SIOB_CMD .EQU SIOBASE + $02 ; PS
SIOB_DAT .EQU SIOBASE + $03 ; PS
SIOA_CMD .EQU SIOBASE + $00
SIOA_DAT .EQU SIOBASE + $01
SIOB_CMD .EQU SIOBASE + $02
SIOB_DAT .EQU SIOBASE + $03
#ENDIF #ENDIF
; ;
#IF (SIOMODE == SIOMODE_SMB) #IF (SIOMODE == SIOMODE_SMB)
SIOA_CMD .EQU SIOBASE + $02 ; PS
SIOA_DAT .EQU SIOBASE + $00 ; PS
SIOB_CMD .EQU SIOBASE + $03 ; PS
SIOB_WR4 .EQU SIOBASE + $01 ; PS
SIOA_CMD .EQU SIOBASE + $02
SIOA_DAT .EQU SIOBASE + $00
SIOB_CMD .EQU SIOBASE + $03
SIOB_DAT .EQU SIOBASE + $01
#ENDIF #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
#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
#IF (SIOMODE == SIOMODE_ZP)
SIOA_CMD .EQU SIOBASE + $06
SIOA_DAT .EQU SIOBASE + $04
SIOB_CMD .EQU SIOBASE + $07
SIOB_DAT .EQU SIOBASE + $05
#ENDIF #ENDIF
; ;
#IF (DEFSIOCLK/DEFSIODIV/16 == 75)
SIOBAUD2 .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
; CONDITIONALS THAT DETERMINE THE ENCODED VALUE OF THE BAUD RATE
; ;
#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
#INCLUDE "siobaud.inc"
; ;
SIO_PREINIT: SIO_PREINIT:
; ;
@ -786,21 +410,25 @@ SIO_OST:
INC A ; ACCUM := 1 TO SIGNAL 1 BUFFER POSITION INC A ; ACCUM := 1 TO SIGNAL 1 BUFFER POSITION
RET ; DONE RET ; DONE
; ;
; AT INITIALIZATION THE SETUP PARAMETER WORD IS TRANSLATED TO THE FORMAT
; REQUIRED BY THE SIO AND STORED IN A PORT/REGISTER INITIALIZATION TABLE,
; WHICH IS THEN LOADED INTO THE SIO.
; ;
; RTS, DTR AND XON SETTING IS NOT CURRENTLY SUPPORTED.
; MARK & SPACE PARITY AND 1.5 STOP BITS IS NOT SUPPORTED BY THE SIO.
; INITIALIZATION WILL NOT BE COMPLETED IF AN INVALID SETTING IS DETECTED.
; ;
SIO_INITDEV: 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
; TEST FOR -1 WHICH MEANS USE CURRENT CONFIG (JUST REINIT)
LD A,D ; TEST DE FOR
AND E ; ... VALUE OF -1
INC A ; ... SO Z SET IF -1
JR NZ,SIO_INITDEV1 ; IF DE == -1, REINIT CURRENT CONFIG
; ;
; LOAD EXISTING CONFIG TO REINIT ; PS
LD E,(IY+4) ; LOW BYTE ; PS
LD D,(IY+5) ; HIGH BYTE ; PS
;
; CHANGE INIT TABLE BASED ON DESIRED SERIAL LINE CHARACTERISTICS
; LOAD EXISTING CONFIG TO REINIT
LD E,(IY+4) ; LOW BYTE
LD D,(IY+5) ; HIGH BYTE
; ;
SIO_INITDEV1: SIO_INITDEV1:
PUSH DE ; SAVE CONFIG PUSH DE ; SAVE CONFIG
@ -815,8 +443,13 @@ SIO_INITDEV1:
PRTC(']') PRTC(']')
POP AF POP AF
#ENDIF #ENDIF
CP SIOBAUD1 ; We set the divider and the lower bit (d2) of the baud rate here
;
; ONLY FOUR BAUD RATES ARE POSSIBLE WITH A FIXED CLOCK.
; THESE ARE PREDETERMINED BY HARDWARE SETTINGS AND MATCHING
; CONFIGURATION SETTINGS. WE PRECALCULATED THE FOUR
; POSSIBLE ENCODED VALUES.
;
CP SIOBAUD1 ; We set the divider and the lower bit (d2) of the stop bits
LD D,$04 ; /1 N,8,1 LD D,$04 ; /1 N,8,1
JR Z,BROK JR Z,BROK
CP SIOBAUD2 CP SIOBAUD2
@ -827,8 +460,8 @@ SIO_INITDEV1:
JR Z,BROK JR Z,BROK
CP SIOBAUD4 CP SIOBAUD4
LD D,$C4 ; /64 N,8,1 LD D,$C4 ; /64 N,8,1
JR Z,BROK ; RET NZ
JR Z,BROK
#IF (SIODEBUG) #IF (SIODEBUG)
PUSH AF PUSH AF
PRTS(" BR FAIL[$") PRTS(" BR FAIL[$")
@ -857,43 +490,24 @@ BROK:
SRL A ; we know top bits are zero from previous test SRL A ; we know top bits are zero from previous test
SRL A ; add stop bits SRL A ; add stop bits
OR D ; carry = 0 OR D ; carry = 0
;
; SET DIVIDER, STOP AND PARITY WR4
;
LD BC,SIO_INITVALS+3 LD BC,SIO_INITVALS+3
LD (BC),A LD (BC),A
#IF (SIODEBUG) #IF (SIODEBUG)
PUSH AF PUSH AF
PRTS(" MODE[$")
PRTS(" WR4[$")
CALL PRTHEXBYTE CALL PRTHEXBYTE
PRTC(']') PRTC(']')
POP AF POP AF
#ENDIF #ENDIF
; THE # DATA BITS NEED TO BE CONVERTED FROM THE
; ROMWBW REPRESENTATION TO THE SIO ZILOG CODING
; XOR A
; RR E ; d0 of bits into carry
; RR A ; d0 into msb
; RR E ; d1 of bits into carry
; RR A ; d1 into msb
;; SCF ; 1 into msb
; RR A
; OR $8a
LD A,E
#IF (SIODEBUG)
PUSH AF
PRTS(" BITS[$")
CALL PRTHEXBYTE
PRTC(']')
POP AF
#ENDIF
; 112233445566d1d0 CC
LD A,E ; 112233445566d1d0 CC
RRA ; CC112233445566d1 d0 RRA ; CC112233445566d1 d0
RRA ; d0CC112233445566 d1 RRA ; d0CC112233445566 d1
RRA ; d1d0CC1122334455 66
RRA ; d1d0CC1122334455 66
LD D,A LD D,A
RRA ; 66d1d0CC11223344 55 RRA ; 66d1d0CC11223344 55
AND $60 ; 0011110000000000 00 AND $60 ; 0011110000000000 00
@ -906,7 +520,7 @@ BROK:
#IF (SIODEBUG) #IF (SIODEBUG)
PUSH AF PUSH AF
PRTS(" TXDATA[$")
PRTS(" WR5[$")
CALL PRTHEXBYTE CALL PRTHEXBYTE
PRTC(']') PRTC(']')
POP AF POP AF
@ -923,7 +537,7 @@ BROK:
#IF (SIODEBUG) #IF (SIODEBUG)
PUSH AF PUSH AF
PRTS(" RXDATA[$")
PRTS(" WR3[$")
CALL PRTHEXBYTE CALL PRTHEXBYTE
PRTC(']') PRTC(']')
POP AF POP AF
@ -969,7 +583,7 @@ BROK:
; ;
SIO_INITVALS: SIO_INITVALS:
.DB $00, $18 ; WR0: CHANNEL RESET .DB $00, $18 ; WR0: CHANNEL RESET
.DB $04, $00 ; WR4: CLK BAUD PARITY STOP BIT ; PST
.DB $04, $00 ; WR4: CLK BAUD PARITY STOP BIT
#IF (INTMODE == 0) #IF (INTMODE == 0)
.DB $01, $00 ; WR1: NO INTERRUPTS .DB $01, $00 ; WR1: NO INTERRUPTS
#ELSE #ELSE

390
Source/HBIOS/siobaud.inc

@ -0,0 +1,390 @@
;
; SIOBAUD1, SIOBAUD2, SIOBAUD3, SIOBAUD4 ARE SET TO THE
; ENCODED VALUE OF EACH POSSIBLE BAUD RATE WITH A FIXED CLOCK.
;
#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)
SIOBAUD2 .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
Loading…
Cancel
Save