I’m still not completely happy with the mockingboard implementation but one can play with it and if it doesn’t work nicely just turn it off (it’s off per default).
Skyfox starts playing music but hangs later which doesn’t happen when the mockingboard is turned off. Another bug is that from time to time I just hear statics and a new recompilation under Quartus fixed that. So something with the timing might not be okay. I’ve added a .sdc file which made it a little bit more stable but I’m open for hints on how to stabilize it.
I fixed another issue which annoyed me lately. When doing a reset the Apple II preserves it memory and software is able to alter the reset vector. At memory $3F2 and $3F3 the reset address is stored and when altered a reset brings you to the prompt (at best) or just hangs somewhere and you can only turn off the MiST. If $3F4 would be a random value and not the XOR between $A5 and $3F3 the Apple II would “think” its a cold boot and starts the Autostart ROM.
I just set $3F4 to zero when the cold boot option in the osd is pressed and the Apple II resets and tries to start from disk.
After the Saturn RAM expansion I’ve looked around for an easy follow up project which I could do in my little spare time. The mockingboard looked like an reasonable addition since the used components where already available as hdl sources (beside the speech chip). I found several schematics for the board which differed slightly. I’ve started with the mockingboard clone by Bill Garber:
Pretty quick I heard the sound effects of the mockingboard system disc (mockingboard1.dsk, youtube). Unfortunately only effects could be heard. It was quiet when it should play the music or the effect when the text scrolls up.
After some fiddling with the clocks and connecting the IRQ line to the processor the Apple resets to the monitor prompt when the text should scroll up. I spend many hours on debugging with different clocks but I didn’t find the cause. Later on I noticed that it always happens when the VIA dropped the IRQ line. Afterwards it was never raised again.
As usual Signaltap was quite a help. The Apple manual (Understanding the Apple II) stated that the reset vector for the IRQ routine is at $FFFE and $FFFF. For my rom it shows $FF59 and looking around I found that it means it jumps right away to the monitoring prompt, *gotcha*.
But what does it mean? I found a quite useful discussion about here: mockingboards. It looks like that on Apple II without the autostart rom the IRQ reset vector should be at $FA86 and on Apple II+ at $FA40. $FF59 is the jump address for RESET on an Apple II. So there’s something wrong with my rom. I’ve changed the IRQ routine to $FA40 ($FFFE=40, $FFFF=FA) and voila it worked and music was played.
It’s still a little wonky and need more debugging (skyfox crashes, no sound on GI Joe) but this could also be some bad disk images.
Finally I got the Saturn RAM expansion working. It was a stupid mistake with the ram addressing. Now the RAMTEST128K test program runs through without an error. The card is implemented in slot 5. A second card could be added if necessary.
To get it working some utilities are needed which can be obtained from here: Saturn 128K RAM Software. It includes programs like movedos, ramexpand and pseudo disk (ram disk).
I’ve added a 16KB RAM expansion to the MiST port of the Apple II+. It’s seen as a language card in slot 0.
I’m also working on a Saturn 128KB RAM expansion but it’s not working yet and need some more work.
To implement both I made use of some manuals available on the net which show the control codes for those cards which need to be implemented in the hardware.
I’ve uploaded a new binary with 8kb more RAM (28kb in total) and cartridge multipart support.
To run multipart crt’s turn on “CRT with load address:yes” and load the lower part first.
Use the Tosec crt’s without the “[a]” in the name because we need the load address. Load the $4000 or $6000 part first and then the $A000 part. The $A000 crt will trigger a reset and starts the game.