User Tools

Site Tools

Action disabled: register

base:tod_calibration

The code below initializes the TOD 50/60 Hz pre-scaler of CIA based on the detected AC line frequency.

The idea is to use the horizontal retrace frequency (15.6-16 KHz) as base to measure the TOD tick interval. If it takes longer then a threshold the 50 Hz pre-scaler is used otherwise the 60 Hz one.

Advantages:

  • Independent of CPU clock so it works on SuperCPU
  • Does not hang on DC only powered machines
  • No need to switch off screen or sprites
  • Does not mess with timers or anything else

Of course timer NMIs should be avoided during calibration. If interrupts are already disabled it can be shortened by 3 bytes.

tod_cia		= $dc08			; or $dd08

tod_calibrate	ldy #255
		jsr tod_prescale	; use 50 Hz

		php			; no interrupts
		sei			; while measuring
		jsr tod_measure
		jsr tod_measure
		plp
tod_prescale	lda tod_cia+6
		asl a
		cpy #204		; threshold
		ror a
		sta tod_cia+6		; set pre-scaler
		rts

tod_measure	ldy #0
		sty tod_cia
tod_lp2		lda #64
tod_lp		cpx $d012
		beq tod_lp
		ldx $d012
		lsr a
		bne tod_lp
		lda tod_cia
		bne tod_done
		iny
		bne tod_lp2
tod_done	rts
base/tod_calibration.txt · Last modified: 2019-05-19 08:04 by soci