Code: Select all
; ; Prior to entry: ; ; a1 = $ffff8260 (i.e. 72Hz override) ; a0 = $ffff820a (i.e. 50/60Hz mode selection) ; ; d2 = 4, d4 = 0 ; ; (and a3 = $ffff8240, the start of the palette, a5 = pointer to a colour table, d0 = line count-1) ; begin: 0: nop 4: move.b d2, (a1) ; switch to 72Hz at n = 8 12: move.b d4, (a1) ; switch to 50Hz at n = 16 20: moveq #20, d1 loop: 24...: nop 28...: dbf d1, loop ; d1 was loaded with 20, so loop occurs 21 times; in net, ; factoring in Dtack delay on the first access in the dbf each ; time, it costs: ; ; 20 * ; np [nop], n np np [dbf, branching] = 16 ; + 1 * ; np [nop], n np np np [dbf, no branch due to counter expiry] = 20 ; ; = 340 cycles total, and it started at n = 24 ; => it ends at n = 364 364: nop 368: nop 372: nop 376: move.b d4, (a0) ; switch to 60Hz at n = 380 [+ 1] = 381 384: move.b d3, (a0) ; switch to 50Hz at n = 388 [+ 1] = 389 392: nop 396: nop 400: nop 404: nop 408: nop 412: nop 416: nop 420: nop 424: nop 428: nop 432: nop 436: nop 440: nop 444: move.b d2, (a1) ; switch to 72Hz at n = 448 452: nop 456: move.b d4, (a1) ; switch to 50Hz at n = 460 464: move.w (a5)+, $1e(a3) ; palette change 480: nop 484: nop 488: nop 492: nop 496: nop 500: dbf d0, begin ; branch taken, so +12 = 512, as expected.
Pulling out just the mode changes, I get relative spacings:
- 8: switch to 72Hz;
- 16: switch to 50Hz;
- 381: switch to 60Hz;
- 389: switch to 50Hz;
- 448: switch to 72Hz;
- 460: switch to 50Hz.
- the switch to 72Hz at the 8th cycle of the loop and to 50Hz on the 16th opens the left border by toggling into 72Hz mode across wiki cycle 4;
- the switch to 60Hz at 381 and back to 50Hz at 389 opens the right border by switching from 50 to 60 between wiki cycles 372 and 376; and
- the switch to 72Hz at 448 and back to 50Hz again at 460 removes horizontal blank by being in 72Hz mode during wiki cycle 450.
If all of the above is correct, and the wiki information is sufficiently complete, DE will first go active at wiki cycle 4, and will remain active until hsync begins at wiki cycle 462.
That seems to imply 462 - 4 = 458 cycles of load being active. So 114 loads (and partway towards a 115th, but without reaching it).
114 isn't a multiple of four. It's 28 columns of four words, plus another two words.
So, question one: is 114 loads correct according to that evidence? Have I made any errors in my workings so far?
Questions two and onward: if 114 words is correct, what happens to the dangling two words? The wiki mentions a check as to whether the FIFO is full every 16 cycles — is that 16 cycles while load is active (rather than in geeneral), and is the count to 16 reset when load goes inactive? If so then is it correct to think the dangling two words will be fetched but not used?
I can't see how a model where the two words get used on the next line works, without ending up with pixels over the retrace period that would really mess up the output. But maybe my complete understanding of the Shifter side of things is amiss?