|
|
@ -69,33 +69,33 @@ SIO0B_DAT .EQU SIO0BASE + $05 |
|
|
; |
|
|
; |
|
|
#IF (SIOCNT >= 2) |
|
|
#IF (SIOCNT >= 2) |
|
|
; |
|
|
; |
|
|
#IF (SIO1MODE == SIOMODE_STD) |
|
|
|
|
|
|
|
|
#IF (SIO1MODE == SIOMODE_STD) |
|
|
SIO1A_CMD .EQU SIO1BASE + $01 |
|
|
SIO1A_CMD .EQU SIO1BASE + $01 |
|
|
SIO1A_DAT .EQU SIO1BASE + $00 |
|
|
SIO1A_DAT .EQU SIO1BASE + $00 |
|
|
SIO1B_CMD .EQU SIO1BASE + $03 |
|
|
SIO1B_CMD .EQU SIO1BASE + $03 |
|
|
SIO1B_DAT .EQU SIO1BASE + $02 |
|
|
SIO1B_DAT .EQU SIO1BASE + $02 |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF (SIO1MODE == SIOMODE_RC) |
|
|
|
|
|
|
|
|
#IF (SIO1MODE == SIOMODE_RC) |
|
|
SIO1A_CMD .EQU SIO1BASE + $00 |
|
|
SIO1A_CMD .EQU SIO1BASE + $00 |
|
|
SIO1A_DAT .EQU SIO1BASE + $01 |
|
|
SIO1A_DAT .EQU SIO1BASE + $01 |
|
|
SIO1B_CMD .EQU SIO1BASE + $02 |
|
|
SIO1B_CMD .EQU SIO1BASE + $02 |
|
|
SIO1B_DAT .EQU SIO1BASE + $03 |
|
|
SIO1B_DAT .EQU SIO1BASE + $03 |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF (SIO1MODE == SIOMODE_SMB) |
|
|
|
|
|
|
|
|
#IF (SIO1MODE == SIOMODE_SMB) |
|
|
SIO1A_CMD .EQU SIO1BASE + $02 |
|
|
SIO1A_CMD .EQU SIO1BASE + $02 |
|
|
SIO1A_DAT .EQU SIO1BASE + $00 |
|
|
SIO1A_DAT .EQU SIO1BASE + $00 |
|
|
SIO1B_CMD .EQU SIO1BASE + $03 |
|
|
SIO1B_CMD .EQU SIO1BASE + $03 |
|
|
SIO1B_DAT .EQU SIO1BASE + $01 |
|
|
SIO1B_DAT .EQU SIO1BASE + $01 |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF (SIO1MODE == SIOMODE_ZP) |
|
|
|
|
|
|
|
|
#IF (SIO1MODE == SIOMODE_ZP) |
|
|
SIO1A_CMD .EQU SIO1BASE + $06 |
|
|
SIO1A_CMD .EQU SIO1BASE + $06 |
|
|
SIO1A_DAT .EQU SIO1BASE + $04 |
|
|
SIO1A_DAT .EQU SIO1BASE + $04 |
|
|
SIO1B_CMD .EQU SIO1BASE + $07 |
|
|
SIO1B_CMD .EQU SIO1BASE + $07 |
|
|
SIO1B_DAT .EQU SIO1BASE + $05 |
|
|
SIO1B_DAT .EQU SIO1BASE + $05 |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
@ -138,23 +138,23 @@ SIO_PREINIT2: |
|
|
OR A ; SET FLAGS |
|
|
OR A ; SET FLAGS |
|
|
JR Z,SIO_PREINIT3 ; IF ZERO, NO SIO DEVICES, ABORT |
|
|
JR Z,SIO_PREINIT3 ; IF ZERO, NO SIO DEVICES, ABORT |
|
|
; |
|
|
; |
|
|
#IF (INTMODE == 1) |
|
|
|
|
|
|
|
|
#IF (INTMODE == 1) |
|
|
; ADD IM1 INT CALL LIST ENTRY |
|
|
; ADD IM1 INT CALL LIST ENTRY |
|
|
LD HL,SIO_INT ; GET INT VECTOR |
|
|
LD HL,SIO_INT ; GET INT VECTOR |
|
|
CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST |
|
|
CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF (INTMODE == 2) |
|
|
|
|
|
|
|
|
#IF (INTMODE == 2) |
|
|
; SETUP IM2 VECTORS |
|
|
; SETUP IM2 VECTORS |
|
|
LD HL,SIO_INT0 |
|
|
LD HL,SIO_INT0 |
|
|
LD (SIO0_IVT),HL ; IVT INDEX |
|
|
LD (SIO0_IVT),HL ; IVT INDEX |
|
|
; |
|
|
; |
|
|
#IF (SIOCNT >= 2) |
|
|
|
|
|
|
|
|
#IF (SIOCNT >= 2) |
|
|
LD HL,SIO_INT1 |
|
|
LD HL,SIO_INT1 |
|
|
LD (SIO1_IVT),HL ; IVT INDEX |
|
|
LD (SIO1_IVT),HL ; IVT INDEX |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
@ -220,12 +220,12 @@ SIO_INT: |
|
|
CALL NZ,SIO_INT0 ; CALL IF CARD EXISTS |
|
|
CALL NZ,SIO_INT0 ; CALL IF CARD EXISTS |
|
|
RET NZ ; DONE IF INT HANDLED |
|
|
RET NZ ; DONE IF INT HANDLED |
|
|
; |
|
|
; |
|
|
#IF (SIOCNT >= 2) |
|
|
|
|
|
|
|
|
#IF (SIOCNT >= 2) |
|
|
; CHECK/HANDLE SECOND CARD (SIO1) IF IT EXISTS |
|
|
; CHECK/HANDLE SECOND CARD (SIO1) IF IT EXISTS |
|
|
LD A,(SIO1A_CFG + 1) ; GET SIO TYPE FOR FIRST CHANNEL OF SECOND SIO |
|
|
LD A,(SIO1A_CFG + 1) ; GET SIO TYPE FOR FIRST CHANNEL OF SECOND SIO |
|
|
OR A ; SET FLAGS |
|
|
OR A ; SET FLAGS |
|
|
CALL NZ,SIO_INT1 ; CALL IF CARD EXISTS |
|
|
CALL NZ,SIO_INT1 ; CALL IF CARD EXISTS |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
RET ; DONE |
|
|
RET ; DONE |
|
|
; |
|
|
; |
|
|
@ -239,7 +239,7 @@ SIO_INT0: |
|
|
LD IY,SIO0B_CFG ; POINT TO SIO0B CFG |
|
|
LD IY,SIO0B_CFG ; POINT TO SIO0B CFG |
|
|
JR SIO_INTRCV ; TRY TO RECEIVE FROM IT AND RETURN |
|
|
JR SIO_INTRCV ; TRY TO RECEIVE FROM IT AND RETURN |
|
|
; |
|
|
; |
|
|
#IF (SIOCNT >= 2) |
|
|
|
|
|
|
|
|
#IF (SIOCNT >= 2) |
|
|
; |
|
|
; |
|
|
SIO_INT1: |
|
|
SIO_INT1: |
|
|
; INTERRUPT HANDLER FOR SECOND SIO (SIO1) |
|
|
; INTERRUPT HANDLER FOR SECOND SIO (SIO1) |
|
|
@ -249,7 +249,7 @@ SIO_INT1: |
|
|
LD IY,SIO1B_CFG ; POINT TO SIO1B CFG |
|
|
LD IY,SIO1B_CFG ; POINT TO SIO1B CFG |
|
|
JR SIO_INTRCV ; TRY TO RECEIVE FROM IT AND RETURN |
|
|
JR SIO_INTRCV ; TRY TO RECEIVE FROM IT AND RETURN |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
; HANDLE INT FOR A SPECIFIC CHANNEL |
|
|
; HANDLE INT FOR A SPECIFIC CHANNEL |
|
|
; BASED ON UNIT CFG POINTED TO BY IY |
|
|
; BASED ON UNIT CFG POINTED TO BY IY |
|
|
@ -518,30 +518,30 @@ SIO_INITDEV1: |
|
|
LD C,75 ; DIVIDE BY 75 LIKE BAUD RATE |
|
|
LD C,75 ; DIVIDE BY 75 LIKE BAUD RATE |
|
|
CALL DIV32X8 ; HL NOW HAS (CLK / 75) |
|
|
CALL DIV32X8 ; HL NOW HAS (CLK / 75) |
|
|
; |
|
|
; |
|
|
#IF (SIODEBUG) |
|
|
|
|
|
|
|
|
#IF (SIODEBUG) |
|
|
PRTS(" CLK75=$") |
|
|
PRTS(" CLK75=$") |
|
|
CALL PRTHEX32 |
|
|
CALL PRTHEX32 |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
; SCALE DOWN THE 32 BIT VALUE TO FIT IN 16 BITS KEEPING |
|
|
; SCALE DOWN THE 32 BIT VALUE TO FIT IN 16 BITS KEEPING |
|
|
; TRACK OF THE NUMBER OF BITS SHIFTED OUT IN B |
|
|
; TRACK OF THE NUMBER OF BITS SHIFTED OUT IN B |
|
|
LD B,0 |
|
|
|
|
|
|
|
|
LD B,0 ; SHIFT COUNTER |
|
|
SIO_INITDEV1A: |
|
|
SIO_INITDEV1A: |
|
|
LD A,D |
|
|
|
|
|
OR E |
|
|
|
|
|
JR Z,SIO_INITDEV1B |
|
|
|
|
|
SRL D |
|
|
|
|
|
RR E |
|
|
|
|
|
RR H |
|
|
|
|
|
RR L |
|
|
|
|
|
INC B |
|
|
|
|
|
JR SIO_INITDEV1A |
|
|
|
|
|
|
|
|
LD A,D ; TEST MSB |
|
|
|
|
|
OR E ; ... FOR ZERO |
|
|
|
|
|
JR Z,SIO_INITDEV1B ; IF SO, DONE |
|
|
|
|
|
SRL D ; 32 BIT RIGHT SHIFT |
|
|
|
|
|
RR E ; ... |
|
|
|
|
|
RR H ; ... |
|
|
|
|
|
RR L ; ... |
|
|
|
|
|
INC B ; INCREMENT SHIFT COUNTER |
|
|
|
|
|
JR SIO_INITDEV1A ; AND LOOP |
|
|
SIO_INITDEV1B: |
|
|
SIO_INITDEV1B: |
|
|
; |
|
|
; |
|
|
#IF (SIODEBUG) |
|
|
|
|
|
|
|
|
#IF (SIODEBUG) |
|
|
PRTS(" CLK=$") |
|
|
PRTS(" CLK=$") |
|
|
CALL PRTHEX32 |
|
|
CALL PRTHEX32 |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
POP DE ; RECOVER INCOMING TARGET CFG |
|
|
POP DE ; RECOVER INCOMING TARGET CFG |
|
|
PUSH DE ; RESAVE IT |
|
|
PUSH DE ; RESAVE IT |
|
|
@ -557,38 +557,38 @@ SIO_INITDEV1B: |
|
|
LD DE,1 ; USE 1 FOR ENCODING CONSTANT |
|
|
LD DE,1 ; USE 1 FOR ENCODING CONSTANT |
|
|
CALL DECODE ; DE:HL := BAUD RATE, ERRORS IGNORED |
|
|
CALL DECODE ; DE:HL := BAUD RATE, ERRORS IGNORED |
|
|
; |
|
|
; |
|
|
#IF (SIODEBUG) |
|
|
|
|
|
|
|
|
#IF (SIODEBUG) |
|
|
PRTS(" BAUD75=$") |
|
|
PRTS(" BAUD75=$") |
|
|
CALL PRTHEX32 |
|
|
CALL PRTHEX32 |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
; SCALE DOWN CLK BY SAME AMOUNT AS BAUD RATE |
|
|
; SCALE DOWN CLK BY SAME AMOUNT AS BAUD RATE |
|
|
POP BC ; RESTORE BITS TO SHIFT |
|
|
POP BC ; RESTORE BITS TO SHIFT |
|
|
LD A,B |
|
|
|
|
|
OR A |
|
|
|
|
|
JR Z,SIO_INITDEV1D |
|
|
|
|
|
|
|
|
LD A,B ; PUT IN ACCUM |
|
|
|
|
|
OR A ; TEST FOR ZERO |
|
|
|
|
|
JR Z,SIO_INITDEV1D ; IF ZERO, NO SHIFT, SKIP |
|
|
SIO_INITDEV1C: |
|
|
SIO_INITDEV1C: |
|
|
SRL D |
|
|
|
|
|
RR E |
|
|
|
|
|
RR H |
|
|
|
|
|
RR L |
|
|
|
|
|
DJNZ SIO_INITDEV1C |
|
|
|
|
|
|
|
|
SRL D ; 32 BIT RIGHT SHIFT |
|
|
|
|
|
RR E ; ... |
|
|
|
|
|
RR H ; ... |
|
|
|
|
|
RR L ; ... |
|
|
|
|
|
DJNZ SIO_INITDEV1C ; LOOP UNTIL DONE SHIFTING |
|
|
SIO_INITDEV1D: |
|
|
SIO_INITDEV1D: |
|
|
; |
|
|
; |
|
|
#IF (SIODEBUG) |
|
|
|
|
|
|
|
|
#IF (SIODEBUG) |
|
|
PRTS(" BAUD=$") |
|
|
PRTS(" BAUD=$") |
|
|
CALL PRTHEX32 |
|
|
CALL PRTHEX32 |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
POP DE ; RECOVER CLOCK |
|
|
POP DE ; RECOVER CLOCK |
|
|
EX DE,HL ; SWAP CLOCK & BAUD FOR DIV |
|
|
EX DE,HL ; SWAP CLOCK & BAUD FOR DIV |
|
|
; *** HANDLE DIVIDE BY ZERO??? *** |
|
|
; *** HANDLE DIVIDE BY ZERO??? *** |
|
|
CALL DIV16 ; BC := HL/DE == TARGET DIVISOR |
|
|
CALL DIV16 ; BC := HL/DE == TARGET DIVISOR |
|
|
; |
|
|
; |
|
|
#IF (SIODEBUG) |
|
|
|
|
|
|
|
|
#IF (SIODEBUG) |
|
|
PRTS(" DIV=$") |
|
|
PRTS(" DIV=$") |
|
|
CALL PRTHEXWORD |
|
|
CALL PRTHEXWORD |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
; NOW THAT WE HAVE THE TARGET BAUD RATE DIVISOR, WE WILL |
|
|
; NOW THAT WE HAVE THE TARGET BAUD RATE DIVISOR, WE WILL |
|
|
; ATTEMPT TO IMPLEMENT IT. THE SIO ITSELF CAN APPLY |
|
|
; ATTEMPT TO IMPLEMENT IT. THE SIO ITSELF CAN APPLY |
|
|
@ -636,14 +636,14 @@ SIO_INITDEV4: |
|
|
; |
|
|
; |
|
|
POP DE ; RESTORE DE = SERIAL CONFIG |
|
|
POP DE ; RESTORE DE = SERIAL CONFIG |
|
|
; |
|
|
; |
|
|
#IF (SIODEBUG) |
|
|
|
|
|
|
|
|
#IF (SIODEBUG) |
|
|
PUSH BC |
|
|
PUSH BC |
|
|
PUSH HL |
|
|
PUSH HL |
|
|
POP BC |
|
|
POP BC |
|
|
PRTS(" CTCDIV=$") |
|
|
PRTS(" CTCDIV=$") |
|
|
CALL PRTHEXWORD |
|
|
CALL PRTHEXWORD |
|
|
POP BC |
|
|
POP BC |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF (CTCENABLE) |
|
|
#IF (CTCENABLE) |
|
|
LD A,(IY+13) ; GET CTC CHANNEL |
|
|
LD A,(IY+13) ; GET CTC CHANNEL |
|
|
@ -871,8 +871,7 @@ SIO_INITLEN .EQU $ - SIO_INITVALS |
|
|
; |
|
|
; |
|
|
SIO_INITDEFS: |
|
|
SIO_INITDEFS: |
|
|
.DB $00, $18 ; WR0: CHANNEL RESET CMD |
|
|
.DB $00, $18 ; WR0: CHANNEL RESET CMD |
|
|
;.DB $04, $C4 ; WR4: CLK BAUD PARITY STOP BIT |
|
|
|
|
|
.DB $04, $44 ; WR4: CLK BAUD PARITY STOP BIT |
|
|
|
|
|
|
|
|
.DB $04, $C4 ; WR4: CLK BAUD PARITY STOP BIT |
|
|
.DB $01, SIO_WR1VAL ; WR1: INTERRUPT STYLE |
|
|
.DB $01, SIO_WR1VAL ; WR1: INTERRUPT STYLE |
|
|
.DB $02, $00 ; WR2: IM2 VEC OFFSET |
|
|
.DB $02, $00 ; WR2: IM2 VEC OFFSET |
|
|
.DB $03, $E1 ; WR3: 8 BIT RCV, CTS/DCD AUTO, RX ENABLE |
|
|
.DB $03, $E1 ; WR3: 8 BIT RCV, CTS/DCD AUTO, RX ENABLE |
|
|
@ -1039,10 +1038,10 @@ SIO_MAP .DB 0 ; CHIP PRESENCE BITMAP |
|
|
SIO0A_RCVBUF .EQU 0 |
|
|
SIO0A_RCVBUF .EQU 0 |
|
|
SIO0B_RCVBUF .EQU 0 |
|
|
SIO0B_RCVBUF .EQU 0 |
|
|
; |
|
|
; |
|
|
#IF (SIOCNT >= 2) |
|
|
|
|
|
|
|
|
#IF (SIOCNT >= 2) |
|
|
SIO1A_RCVBUF .EQU 0 |
|
|
SIO1A_RCVBUF .EQU 0 |
|
|
SIO1B_RCVBUF .EQU 0 |
|
|
SIO1B_RCVBUF .EQU 0 |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#ELSE |
|
|
#ELSE |
|
|
; |
|
|
; |
|
|
@ -1060,7 +1059,7 @@ SIO0B_HD .DW SIO0B_BUF ; BUFFER HEAD POINTER |
|
|
SIO0B_TL .DW SIO0B_BUF ; BUFFER TAIL POINTER |
|
|
SIO0B_TL .DW SIO0B_BUF ; BUFFER TAIL POINTER |
|
|
SIO0B_BUF .FILL SIO_BUFSZ,0 ; RECEIVE RING BUFFER |
|
|
SIO0B_BUF .FILL SIO_BUFSZ,0 ; RECEIVE RING BUFFER |
|
|
; |
|
|
; |
|
|
#IF (SIOCNT >= 2) |
|
|
|
|
|
|
|
|
#IF (SIOCNT >= 2) |
|
|
; |
|
|
; |
|
|
; SIO1 CHANNEL A RECEIVE BUFFER |
|
|
; SIO1 CHANNEL A RECEIVE BUFFER |
|
|
SIO1A_RCVBUF: |
|
|
SIO1A_RCVBUF: |
|
|
@ -1076,7 +1075,7 @@ SIO1B_HD .DW SIO1B_BUF ; BUFFER HEAD POINTER |
|
|
SIO1B_TL .DW SIO1B_BUF ; BUFFER TAIL POINTER |
|
|
SIO1B_TL .DW SIO1B_BUF ; BUFFER TAIL POINTER |
|
|
SIO1B_BUF .FILL SIO_BUFSZ,0 ; RECEIVE RING BUFFER |
|
|
SIO1B_BUF .FILL SIO_BUFSZ,0 ; RECEIVE RING BUFFER |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
|