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:
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