I wanted to write to the Third Millenium Arcade Board and the Super Sprite, but there's just one problem: The Super Sprite has its addresses at $C0F0 and $C0F1.
You can write to those addresses just fine in machine language with STA $C0F1 but an AppleSoft POKE doesn't work the same.
Applesoft POKE actually executes a STA ($50),Y to address $C0F1, but that actually reads $C0F1 before it writes $C0F1. It's kind of counter intuitive that you would have a read when you're trying to write something, but that's the wacky design of the 6502.
That read has the side effect of resetting the TMS9918A address pointer so when it writes, the TMS9918 thinks you want to specify the low byte of the address pointer. Each time you write $C0F1 it resets that pointer so you never actually finish setting the high byte of address pointer.
So you have to resort to assembly language, and I poke a little routine into memory and then call it. STA absolute doesn't have the same problem as the STA ($50),Y register indirect mode and it will write to $C0F1 properly without reading it first.
This applesoft program is horribly unoptimized, I just wanted something that would work.
It you let it run for a few minutes it will display the following:
(hint: display the frameskip with F11, set the frameskip to 6 with F8/F9 and unthrottle with F10 to speed things up)
./mame64 apple2e -sl4 arcbd -sl7 ssprite
The simple routines I poke into memory and call: 4000: 2 writes to C0F1 to set an address, reading C0F1 first to make sure we reset the address register It's a register write if the second byte has the hi byte set. 4014: same routine as 4000 It's an address write if the second byte has bit 6 set, bit 6 clear if just to read. 4028: write to C0F0, write DATA register 403C: read from C0F0, read DATA register ]CALL -151 *4000L 4000- AD F1 C0 LDA $C0F1 4003- A9 0F LDA #$0F 4005- 8D F1 C0 STA $C0F1 4008- A9 87 LDA #$87 400A- 8D F1 C0 STA $C0F1 400D- 60 RTS 400E- 00 BRK 400F- 00 BRK 4010- 00 BRK 4011- 00 BRK 4012- 00 BRK 4013- 00 BRK 4014- AD F1 C0 LDA $C0F1 4017- A9 00 LDA #$00 4019- 8D F1 C0 STA $C0F1 401C- A9 78 LDA #$78 401E- 8D F1 C0 STA $C0F1 4021- 60 RTS 4022- 00 BRK 4023- 00 BRK *L 4024- 00 BRK 4025- 00 BRK 4026- 00 BRK 4027- 00 BRK 4028- A9 78 LDA #$78 402A- 8D F0 C0 STA $C0F0 402D- 60 RTS 402E- 00 BRK 402F- 00 BRK 4030- 00 BRK 4031- 00 BRK 4032- 00 BRK 4033- 00 BRK 4034- 00 BRK 4035- 00 BRK 4036- 00 BRK 4037- 00 BRK 4038- 00 BRK 4039- 00 BRK 403A- 00 BRK *L 403B- 00 BRK 403C- AD C0 C0 LDA $C0C0 403F- 8D 4E 40 STA $404E 4042- 60 RTS 4043- 00 BRK 4044- 00 BRK 4045- 00 BRK 4046- 00 BRK 4047- 00 BRK 4048- 00 BRK 4049- 00 BRK 404A- 00 BRK 404B- 00 BRK 404C- 00 BRK 404D- 00 BRK 404E- 00 BRK 404F- 00 BRK 4050- 00 BRK 4051- 00 BRK 4052- 00 BRK
No comments:
Post a Comment