A while back I did an entry on Faster Initialization for the 2600. Today's entry is about squeezing the bytes out of the Initialization routine to the bare minimum. Here is a routine I came up with a while back:
;Economical 8 byte initialization routine;By Omegamatrix cld.loopClear: ldx #$0A ; ASL opcode = $0A inx txs pha bne .loopClear+1 ; jump between operator and operand to do ASL;A = 0;X = 0;Y = random;SP = $FF;Carry is clear
While there are no illegal opcodes used in this routine, there are still a few tricks:
1) The accumulator is never loaded. Instead it gets left shifted, and eventually after 8 shifts A=0.
2) The opcode for ASL is used to load the X register with 10 the first time through. Subsequent loops jump between the operator and operand for LDX #$0A to perform ASL.
3) The writes with PHA start at $0B (REFP0), but the TIA registers will all get cleared through their mirrored addresses at $40-$7F.
SP REGISTER WRITE VALUE (FROM ACCUMULATOR, which gets ASL'd)$0B REFP0 %XXXXXXXX <--- first time through$0C REFP1 %XXXXXXX0 <--- second pass, etc...$0D PF0 %XXXXXX00$0E PF1 %XXXXX000$0F PF2 %XXXX0000$10 RESP0 %XXX00000$11 RESP1 %XX000000$12 RESM0 %X0000000$13 RESM1 %00000000$14 RESBL A=0 for now on;writes continue to start of TIA mirrors SP REGISTER WRITE VALUE (FROM ACCUMULATOR)$40 VSYNC 0$41 VBLANK 0$42 WSYNC 0...;Writes continue through ZP $80-$FF clearing RIOT RAM;At end of routine TIA registers and RIOT RAM cleared,;A=X=0, SP = $FF, Y=random, Carry is clear
You probably have noticed that I have skipped using SEI. I did this because there is no interrupt line on the 2600. However, there is always a chance one of the weird clones will. Insert SEI at the top of the initialization routine if you feel the need.