initstabilise lda $d012 ldx #10 ; 2 - dex ; (10 * 5) + 4 bpl - ; 54 nop ; 2 eor $d012 - $ff,x; 5 = 63 bne initstabilise; 7 = 70 [...]; timer setup
Stupid question from a layman - where this stabilizing piece of code is supposed to go exactly to do its job and not crash the whole thing? :)
$183c a0 9e ldy #$9e $183e a2 19 ldx #$19 $1840 18 clc $1841 10 fa bpl $083d
The code location can't be $183c, can't it? Also the SHX instruction behaves unpredictable when a page is crossed, so I'm afraid this one won't work.
Btw, maybe you could summarize all the known allowed code locations where any SHX or SHY variant could work?
high byte of address written to, when: +--------+------------------+---------------+ | | no DMA on cycleN | DMA on cycleN | +--------+------------------+---------------+ |page | | | |not | H | H | |crossed | | | +--------+------------------+---------------+ |page | | | |crossed | X&(H+1) | X&(H+1) | | | | | +--------+------------------+---------------+ value written, when: +--------+------------------+---------------+ | | no DMA on cycleN | DMA on cycleN | +--------+------------------+---------------+ |page | | | |not | X&(H+1) | X | |crossed | | | +--------+------------------+---------------+ |page | | | |crossed | X&(H+1) | X | | | | | +--------+------------------+---------------+
Thanks! I should have looked at the latest version of the "No More Secrets" document.
[...]The (currently) shortest code that can be placed anywhere was proposed in post #44.
Quiss came up with a very bright idea in post #50 that uses the instabilities of the SHX instruction. It uses less RAM, but it has some restrictions on code location. Shorter variants were found, but they have much stronger location restrictions.
ldx #initval ldy #<(zp_pos+1) loop: shx $ffff,y lda <($100 + zp_pos - initval),x beq loop
ldy #init_value ;Init code sync: lax $dc04 sbx #51 sty ZP ;RRW instruction. Part of init code. cpx $dc04 bne sync: