ThKattanek / emu64

C64 Emulator
https://www.thorsten-kattanek.de/index.php/projekte/emu64
GNU General Public License v2.0
38 stars 6 forks source link

Gauntlet - The Deeper Dungeons - Cartridge Check -> Failed #180

Closed ThKattanek closed 5 years ago

ThKattanek commented 5 years ago

VICE TESTPROG https://sourceforge.net/p/vice-emu/code/HEAD/tree/testprogs/C64/openio/gauntlet.prg

ThKattanek commented 5 years ago

Fehler gefunden! Auszug aus dem VIC II Artikel

Der Adreßbereich $de00-$dfff des 6510 (siehe 2.4.1.) ist für externe Erweiterungen des C64 reserviert und normalerweise mit keinem anderen Baustein (RAM, I/O) verbunden. Ein Lesezugriff von diesen Adressen liefert scheinbar zufällige Daten. Dasselbe gilt für die oberen Nybbles der Adressen $d800-$dbff (das Farb-RAM).

Auf einigen C64 sind diese Daten jedoch gar nicht „zufällig”, sondern sind vielmehr mit den Daten identisch, die der VIC in der ersten Phase des Taktzyklus aus dem Speicher gelesen hat. Dieser Effekt ist jedoch nicht auf allen Geräten und nicht immer präzise nachvollziehbar.

Davon abgesehen, daß man dadurch die Möglichkeit hat, das VIC-Timing allein per Software zu vermessen (die Timing-Diagramme aus [4], auf denen auch die Diagramme in diesem Artikel basieren, sind z.B. mit dieser Methode erstellt worden), kann man den 6510 auch Programme im $de00-Bereich oder im Farb-RAM ausführen lassen, wenn man den VIC eine derartige Grafik darstellen läßt, daß der 6510 aus den vom VIC gelesenen Grafikdaten gültige Opcodes erhält.

Mit einem ähnlichen Effekt kann man auch vom Prozessor aus die RAM-Adressen 0 und 1 beschreiben. Diese sind eigentlich nicht zugänglich, da an diesen Adressen prozessorintern das Datenrichtungsregister und das Datenregister des 6510-I/O-Ports eingeblendet werden und bei einem Schreibzugriff die Datenbustreiber im Tri-State bleiben. Allerdings wird die R/W-Leitung auf Low gelegt (dies ist damit zu erklären, daß der I/O-Port erst nachträglich in das existierende Design des 6502 integriert wurde) und dadurch gelangt das in der ersten Taktphase vom VIC gelesene Byte ins RAM. Will man also einen bestimmten Wert an Adresse 0 oder 1 schreiben, so muß man nur ein beliebiges Byte an diese Adressen schreiben und dafür sorgen, daß der VIC in der Phase zuvor den gewünschten Wert aus dem RAM gelesen hat.

Die Adressen 0 und 1 lassen sich natürlich auch wieder vom Prozessor aus lesen. Entweder über den $de00-Bereich oder mit Hilfe von Spritekollisionen. Dabei läßt man den VIC eine Bitmap ab Adresse 0 darstellen und bewegt ein Sprite, das nur aus einem Pixel besteht, über die einzelnen Bits der ersten beiden Bytes der Bitmap. Je nachdem, ob eine Kollision registriert wurde oder nicht, kann man so den Zustand der einzelnen Bits herausfinden und zu einem Byte zusammensetzen.

ThKattanek commented 5 years ago

Das ganze noch für das Farbram umsetzen.