|
|
|
@ -589,6 +589,55 @@ SIO_INITDEV1D: |
|
|
|
PRTS(" DIV=$") |
|
|
|
CALL PRTHEXWORD |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (CTCENABLE) |
|
|
|
; |
|
|
|
LD A,(IY+13) ; GET CTC CHANNEL |
|
|
|
INC A ; $FF -> 0 |
|
|
|
JR Z,SIO_ADJDONE ; NO CTC CHANNEL, BYPASS |
|
|
|
; |
|
|
|
; HERE WE NEED TO ACCOUNT FOR A SPECIAL CASE OF THE CTC. |
|
|
|
; IF THE CTC TRIGGER RATE IS MORE THAN HALF OF THE CTC CLOCK, |
|
|
|
; THEN THE CTC WILL ONLY COUNT EVERY OTHER TRIGGER PULSE. |
|
|
|
; IN THIS SITUATION, WE NEED TO CUT THE DIVISOR IN HALF |
|
|
|
; TO ACCOUNT FOR THIS. |
|
|
|
; FOR NOW, I JUST TEST TO SEE IF THE CTC TRIGGER AND THE CTC |
|
|
|
; CLOCK ARE THE SAME. I DOUBT THERE IS ANY REALISTIC |
|
|
|
; SCENARIO WHERE THE TRIGGER IS GREATER THAN HALF THE |
|
|
|
; CLOCK BUT ALSO NOT EQUAL TO THE CLOCK. |
|
|
|
; I DON'T DEFINITELY KNOW THE CTC CLOCK FREQ, BUT ASSUME IT |
|
|
|
; IS THE SAME AS THE CPU CLOCK, WHICH IT SHOULD BE. |
|
|
|
; FINALLY, NOTE THAT I AM COMPARING AGAINST THE CPU SPEED |
|
|
|
; DECLARED IN THE BUILD CONFIG, NOT THE DYNAMICALLY MEASURED |
|
|
|
; CPU SPEED. THIS IS CORRECT BECAUSE WE ARE REALLY TRYING TO |
|
|
|
; TEST IF THE CPU CLOCK AND THE TRIGGER FREQ ARE THE *SAME*. |
|
|
|
; ONLY COMPARING THE HIGH WORD VALUES, THAT SHOULD BE ENOUGH. |
|
|
|
; |
|
|
|
LD A,$FF & (CPUOSC >> 24) ; HIGH BYTE OF CPU FREQ |
|
|
|
CP (IY+12) ; CP TO HIGH BYTE OF TRG |
|
|
|
JR NZ,SIO_ADJDONE ; IF NE, SKIP ADJUSTMENT |
|
|
|
LD A,$FF & (CPUOSC >> 16) ; HIGH BYTE OF CPU FREQ |
|
|
|
CP (IY+11) ; CP TO HIGH BYTE OF TRG |
|
|
|
JR NZ,SIO_ADJDONE ; IF NE, SKIP ADJUSTMENT |
|
|
|
; |
|
|
|
SRL B ; RIGHT SHIFT HL |
|
|
|
RR C ; ... TO DIVIDE BY 2 |
|
|
|
JR NC,SIO_ADJDONE ; DONE IF NO CARRY |
|
|
|
; |
|
|
|
; IF CARRY, RESULTANT CIVISOR IS UNWORKABLE |
|
|
|
POP DE ; POP STACK |
|
|
|
JR SIO_INITFAIL ; AND FAIL |
|
|
|
|
|
|
|
; *** CHECK FOR CARRY??? *** |
|
|
|
; |
|
|
|
#IF (SIODEBUG) |
|
|
|
PRTS(" DIV=$") |
|
|
|
CALL PRTHEXWORD |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
SIO_ADJDONE: |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; NOW THAT WE HAVE THE TARGET BAUD RATE DIVISOR, WE WILL |
|
|
|
; ATTEMPT TO IMPLEMENT IT. THE SIO ITSELF CAN APPLY |
|
|
|
@ -628,7 +677,7 @@ SIO_INITDEV2: |
|
|
|
OR B ; ZERO BITS TO SHIFT? |
|
|
|
JR Z,SIO_INITDEV4 ; BYPASS SHIFTING IF SO |
|
|
|
SIO_INITDEV3: |
|
|
|
RR H ; SHIFT HL RIGHT BY |
|
|
|
SRL H ; SHIFT HL RIGHT BY |
|
|
|
RR L ; ONE BIT |
|
|
|
DJNZ SIO_INITDEV3 ; UNTIL ALL BITS DONE |
|
|
|
SIO_INITDEV4: |
|
|
|
@ -646,6 +695,7 @@ SIO_INITDEV4: |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (CTCENABLE) |
|
|
|
; |
|
|
|
LD A,(IY+13) ; GET CTC CHANNEL |
|
|
|
INC A ; $FF -> 0 |
|
|
|
JR Z,SIO_NOCTC ; NO CTC CHANNEL, BYPASS |
|
|
|
|