|
|
|
@ -10,415 +10,39 @@ |
|
|
|
; F E D C B A 9 8 7 6 5 4 3 2 1 0 |
|
|
|
; -- 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_SIO .EQU 1 |
|
|
|
; |
|
|
|
#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 |
|
|
|
; |
|
|
|
#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 |
|
|
|
; |
|
|
|
#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 |
|
|
|
; |
|
|
|
#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: |
|
|
|
; |
|
|
|
@ -786,21 +410,25 @@ SIO_OST: |
|
|
|
INC A ; ACCUM := 1 TO SIGNAL 1 BUFFER POSITION |
|
|
|
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: |
|
|
|
; |
|
|
|
; 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: |
|
|
|
PUSH DE ; SAVE CONFIG |
|
|
|
@ -815,8 +443,13 @@ SIO_INITDEV1: |
|
|
|
PRTC(']') |
|
|
|
POP AF |
|
|
|
#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 |
|
|
|
JR Z,BROK |
|
|
|
CP SIOBAUD2 |
|
|
|
@ -827,8 +460,8 @@ SIO_INITDEV1: |
|
|
|
JR Z,BROK |
|
|
|
CP SIOBAUD4 |
|
|
|
LD D,$C4 ; /64 N,8,1 |
|
|
|
JR Z,BROK ; RET NZ |
|
|
|
|
|
|
|
JR Z,BROK |
|
|
|
|
|
|
|
#IF (SIODEBUG) |
|
|
|
PUSH AF |
|
|
|
PRTS(" BR FAIL[$") |
|
|
|
@ -857,43 +490,24 @@ BROK: |
|
|
|
SRL A ; we know top bits are zero from previous test |
|
|
|
SRL A ; add stop bits |
|
|
|
OR D ; carry = 0 |
|
|
|
|
|
|
|
; |
|
|
|
; SET DIVIDER, STOP AND PARITY WR4 |
|
|
|
; |
|
|
|
LD BC,SIO_INITVALS+3 |
|
|
|
LD (BC),A |
|
|
|
|
|
|
|
#IF (SIODEBUG) |
|
|
|
PUSH AF |
|
|
|
PRTS(" MODE[$") |
|
|
|
PRTS(" WR4[$") |
|
|
|
CALL PRTHEXBYTE |
|
|
|
PRTC(']') |
|
|
|
POP AF |
|
|
|
#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 ; d0CC112233445566 d1 |
|
|
|
RRA ; d1d0CC1122334455 66 |
|
|
|
RRA ; d1d0CC1122334455 66 |
|
|
|
LD D,A |
|
|
|
RRA ; 66d1d0CC11223344 55 |
|
|
|
AND $60 ; 0011110000000000 00 |
|
|
|
@ -906,7 +520,7 @@ BROK: |
|
|
|
|
|
|
|
#IF (SIODEBUG) |
|
|
|
PUSH AF |
|
|
|
PRTS(" TXDATA[$") |
|
|
|
PRTS(" WR5[$") |
|
|
|
CALL PRTHEXBYTE |
|
|
|
PRTC(']') |
|
|
|
POP AF |
|
|
|
@ -923,7 +537,7 @@ BROK: |
|
|
|
|
|
|
|
#IF (SIODEBUG) |
|
|
|
PUSH AF |
|
|
|
PRTS(" RXDATA[$") |
|
|
|
PRTS(" WR3[$") |
|
|
|
CALL PRTHEXBYTE |
|
|
|
PRTC(']') |
|
|
|
POP AF |
|
|
|
@ -969,7 +583,7 @@ BROK: |
|
|
|
; |
|
|
|
SIO_INITVALS: |
|
|
|
.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) |
|
|
|
.DB $01, $00 ; WR1: NO INTERRUPTS |
|
|
|
#ELSE |
|
|
|
|