mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Handle CTC anomaly
Small update to accommodate CTC behavior that occurs when the CTC trigger is more than half the CTC clock.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
#DEFINE RMN 1
|
||||
#DEFINE RUP 0
|
||||
#DEFINE RTP 0
|
||||
#DEFINE BIOSVER "3.1-pre.5"
|
||||
#DEFINE BIOSVER "3.1-pre.6"
|
||||
|
||||
@@ -3,5 +3,5 @@ rmn equ 1
|
||||
rup equ 0
|
||||
rtp equ 0
|
||||
biosver macro
|
||||
db "3.1-pre.5"
|
||||
db "3.1-pre.6"
|
||||
endm
|
||||
|
||||
Reference in New Issue
Block a user