Hallo Besucher, der Thread wurde 1,7k mal aufgerufen und enthält 13 Antworten

letzter Beitrag von peiselulli am

Benötige Hilfe für Data Science Projekt mit C64 Emulator

  • Hi, da ich mich gerade in Data Science fortbilde, hatte ich folgende Idee für eine im Rahmen des Studiums erforderliche Projekteinreichung: Ein altes C64 Spiel mithilfe von Data Science Methoden zu analysieren, um mittels der Data Science Algorithmen Rückschlüsse auf die implementierte Spiellogik einerseits, und andererseits auf erfolgreiche/nichterfolgreiche Spielstrategien anhand bestimmter Spielsituationen zu ziehen. Welches Spiel habe ich dafür im Blick? Natürlich M.U.L.E. ;-)


    Um mit Data Science Methoden zu analysieren, benötige ich jedoch eine große Rohdatenbasis über abgelaufene M.U.L.E. Spiele.
    Dies ist in M.U.L.E. "relativ" einfach möglich, da man automatisiert vier Computergegner gegeneinander spielen lassen kann. Das noch im Warp-Modus, so kann man relativ schnell eine Datenbasis für viele Spiele zusammenbekommen.


    Mein Problem ist nun, aus den automatisch ablaufenden Spielen die für die Data Science Analyse notwendigen Daten abzugreifen und extern zu speichern.


    Nun die konkrete Frage an die Emulator-Experten hier im Forum:


    Kann ich einen Emulator so konfigurieren, dass er zu bestimmten Zuständen des C64 ein Logfile schreibt?
    Ziel wäre es, für jedes Spiel folgende Daten zu erfassen:
    - pro Spielrunde 1-12 (am Ende jeweils):
    --- Nummer der Runde (1-12)
    --- in der Runde aufgetretene Ereignisse pro Spieler (good/bad, Typ)
    --- pro Spieler - wurde der Wampus gefangen (ja/nein)
    --- in der Runde aufgetretenes planetares Ereignis (good/bad, Typ)
    --- Endstand der Runde pro Spieler (Money, Goods Value, Land Value, Platz in Rangfolge 1-4)
    --- für Runde 12: planetarer Endstand mit Rangfolge der Spieler und


    Dazu müsste ich den Code von M.U.L.E. soweit reverse engineeren, dass ich weiß, in welchen Stellen der memory map die jeweiligen Variablen zu finden sind. Allein das ist schon eine Herausforderung, aber sicherlich machbar.


    Aber selbst wenn ich das dann weiß - ist das, was ich vorhabe, mit Vice oder einem anderen Emulator grundsätzlich machbar, oder ist das aussichtslos?


    Über Hilfe in Form von Tipps oder auch Unterstützung beim Reverse Engineering würde ich mich sehr freuen!

    Gruß, Goethe.
    _______________
    C64, C128DCR, SX64, C16, plus/4, A1200+Blizzard1230/IV, A600HD+Vampire600V2, A300+ACA620, MEGA65, Atari 800+810
    Vectrex, Game Boy, NDSi, GameCube, Game Gear, Mega Drive, Mega CD, 32X, Multimega, Nomad, Saturn, Dreamcast, XBox, PS2, PSP, PS3, PS Vita, Ouya, PS4, PS5

  • aber sicherlich machbar.

    Aufwendig ja, aber durchaus machbar. Kommt halt darauf an, wie gut oder schlecht der Code strukturiert ist. (Besteht M.U.L.E. eigentlich aus Assemblercode oder Basic?)


    Was den Emulator anbelangt, so wäre es wichtig festzustellen, ob der Code eventuell auf extrem C64-spezifische Elemente zurückgreift (z. B. Erzeugung von Zufallszahlen mittels SID-Rauschgenerator). Sollte der Code vom Aufbau her nämlich relativ hardwareunabhängig sein, bestände auch die vielleicht noch einfachere Möglichkeit, diesen auf einem simplen 6502-Emulator laufen zu lassen. Ein eingestreuter BRK-Befehl kann dann dazu dienen, die von Dir genannten Daten direkt vom Emulator aus in eine Textdatei zu schreiben. Um das beurteilen zu können, müßte man daher mal zunächst eine Probedisassemblierung vornehmen.
    Kleine Frage nebenbei: Arbeitest Du unter Windows oder Linux etc?

  • Ergänzung: Im C64-Wiki steht ja, daß peiselulli 2011 eine Version für den 4 Spieler Joystick-Adapter erstellt hat. Vielleicht solltest Du mal freundlich bei ihm anfragen, ob er Dir (s)eine disassemblierte Version zur Verfügung stellen kann.
    Und noch eine Frage nebenbei: Wie sieht es mit Deinen Programmierkenntnissen aus?


  • Besteht M.U.L.E. eigentlich aus Assemblercode oder Basic?Was den Emulator anbelangt, so wäre es wichtig festzustellen, ob der Code eventuell auf extrem C64-spezifische Elemente zurückgreift?
    Kleine Frage nebenbei: Arbeitest Du unter Windows oder Linux etc?


    M.U.L.E. ist m.W. Assemblercode. Es ist aber unwahrscheinlich, dass der C64 M.U.L.E. Code viele C64 Spezifika nutzt, da es sich ja um eine Portierung eines Atari 800 Originals handelt. Insofern erwarte ich da nichts ungewöhnliches.


    Ich arbeite eigentlich zu 100% unter Linux, habe aber unter Linux auch eine Win10-VM am Start und dort auch die aktuellen C64 Entwicklungstools wie C64Studio, CBM prg Studio, charpad, spritepad installiert.

    Ergänzung: Im C64-Wiki steht ja, daß peiselulli 2011 eine Version für den 4 Spieler Joystick-Adapter erstellt hat. Vielleicht solltest Du mal freundlich bei ihm anfragen, ob er Dir (s)eine disassemblierte Version zur Verfügung stellen kann.
    Und noch eine Frage nebenbei: Wie sieht es mit Deinen Programmierkenntnissen aus?

    Das ist eine gute Idee. @peiselulli - hast Du das evtl. noch und würdest mein Projektchen unterstützen können?


    Zum Thema meine Programmierkenntnisse: Die sind seit Mitte der 90er ziemlich eingerostet. Seinerzeit habe ich zunächst in Basic, dann auch in Assembler programmiert.


    Aber ich habe richtig Lust, diese Kenntnisse im Rahmen dieses Projektes wieder aufleben zu lassen, nicht nur dafür, sondern auch um ein paar andere C64 Projekte in Angriff zu nehmen.
    Dafür brauche ich einen Mentor.


    Beispiele meiner damaligen "Künste" finden sich hier: Dackel Klatsch, Diamond Hunters, 2 Worms War, The Ultimate Wormgame.
    Dazu habe ich noch ein paar 1581 Disk Tools programmiert und einige Spiele auf 1581-Fähigkeit gehackt (z.B. M.U.L.E.), was ich aber nie irgendwo veröffentlicht hatte. Dazu müsste ich mal in den Tiefen meiner Disksammlung wühlen.

    Gruß, Goethe.
    _______________
    C64, C128DCR, SX64, C16, plus/4, A1200+Blizzard1230/IV, A600HD+Vampire600V2, A300+ACA620, MEGA65, Atari 800+810
    Vectrex, Game Boy, NDSi, GameCube, Game Gear, Mega Drive, Mega CD, 32X, Multimega, Nomad, Saturn, Dreamcast, XBox, PS2, PSP, PS3, PS Vita, Ouya, PS4, PS5

  • OT: "Dackel Klatsch" Titel gefällt :)

    Ich war jung und brauchte die Rebellion. ;-)
    Sollte nur eine Parodie auf das Sega Mega Drive Spiel "Double Clutch" sein. (Double Clutch, Dackel Klatsch. Get it? Haha.)
    Ist aber eine tierverachtende Gewaltorgie geworden. Hm. Zurück auf Los.

    Gruß, Goethe.
    _______________
    C64, C128DCR, SX64, C16, plus/4, A1200+Blizzard1230/IV, A600HD+Vampire600V2, A300+ACA620, MEGA65, Atari 800+810
    Vectrex, Game Boy, NDSi, GameCube, Game Gear, Mega Drive, Mega CD, 32X, Multimega, Nomad, Saturn, Dreamcast, XBox, PS2, PSP, PS3, PS Vita, Ouya, PS4, PS5

  • Meine Frage nach der Programmierung bezog sich nicht nur auf die Programmierung auf dem C64, sondern auch auf dem PC, wenn es z. B. darum geht, einen Emulator selbständig so zu verändern, daß er die Daten ausspuckt, die Du brauchst. Es wäre ja nicht das große Problem, einen 6502-Emulator zusammenzuschustern (z. B. in C), aber es wäre gut, wenn Du den dann nach Belieben weiter für Dich anpassen könntest.


    Hab übrigens vorhin mal einen kurzen Blick in den Code geworfen. Sieht so aus, als wäre es Assembler.

  • Meine Frage nach der Programmierung bezog sich nicht nur auf die Programmierung auf dem C64, sondern auch auf dem PC, wenn es z. B. darum geht, einen Emulator selbständig so zu verändern, daß er die Daten ausspuckt, die Du brauchst.

    Auweia! Also wenn ich für die o.g. Anforderungen einen eigenen Emulator-Fork programmieren müsste, bin ich raus. Ich hatte gehofft, das wäre mit Bordmitteln eines bestehenden möglich.
    Offensichtlich ist das eine so nerdige Anforderung, dass noch kein Emulator das aktuell ermöglicht.


    Ohne Emulator-Fork könnte es aber evtl. so funktionieren:
    - bei jeder gewünschten Zeitpunkt des Spiels manuell einen Snapshot speichern
    - ein kleines Progrämmchen schreiben, was aus der Memory Map des Snapshots dann eine CSV-Datei schreibt. Dazu reichen meine PC-Programmierkenntnisse dann noch aus, in python ist sowas schnell erledigt.


    Das wäre allerdings ein ziemlicher manueller Aufwand, da ein Snapshot nach jeder Spielrunde 1-12 manuell erstellt werden müsste, und somit der Vorteil eines Warp Mode auch geringer wird.
    Außerdem werde ich die Daten zu den aufgetretenen Events so wohl nicht erhaschen können, ohne eine Codeänderung von M.U.L.E. durchzuführen (bei Auftreten der Events irgendwo in einen freien Speicherbereich des C64 loggen).
    Wahrscheinlich werde ich aber dennoch diesen Weg gehen.


    Dabei könnte vieleicht auch der Source-Code der Atari-Version hilfreich sein.

    Danke, das ist sicher ein guter Start.

    Gruß, Goethe.
    _______________
    C64, C128DCR, SX64, C16, plus/4, A1200+Blizzard1230/IV, A600HD+Vampire600V2, A300+ACA620, MEGA65, Atari 800+810
    Vectrex, Game Boy, NDSi, GameCube, Game Gear, Mega Drive, Mega CD, 32X, Multimega, Nomad, Saturn, Dreamcast, XBox, PS2, PSP, PS3, PS Vita, Ouya, PS4, PS5

  • Emulator-Fork

    Nee, nee, das darfst Du Dir nicht so vorstellen. Es würde sich bei dem Emulator nur um ein kleines Programm handeln (eine Textdatei), die das Spiel in ein Speicherarray lädt und dann Befehl für Befehl ausführt, emuliert halt. Vor der Ausführung wird das Spiel noch an einer oder mehreren Stellen gepatcht, indem z. B. ein illegaler, d. h. im Spiel nicht verwendeter Opcode eingebaut wird.
    Dieser einfache 6502-Emulator führt dann jeden 6502-Befehl aus, bis er auf diesen neuen Opcode trifft, woraufhin dann die benötigten Daten in eine Datei geschrieben werden. Es geht folglich lediglich darum, diesen Teil zum Schreiben der Daten anzupassen, damit Du eigenständig auch ohne Hilfe von außen nach Belieben die Form der Daten ändern oder erweitern kannst. Wenn Du Python kannst, sollte es kein Problem für Dich sein, ein paar fprint-Befehle in C abzuändern.
    Bedenke bitte: Auf welchem Wege könntest Du sonst einen Emulator dazu bringen, die oben genannten Daten für Dich auszugeben? Mit einer einfachen Änderung in einer Konfiguration wäre dies gar nicht zu erreichen. Dafür sind Deine Anforderungen viel zu spezifisch. Im Grunde genommen bräuchtest Du für so etwas eine Emulator-interne Scriptsprache, mit anderen Worten: Nicht mehr oder weniger als ich gerade geschrieben habe.
    Die Voraussetzungen sind also stets folgende:
    1.) Du kannst den Originalcode so patchen, daß er an einer bestimmten Stelle unterbrochen werden kann. Alternativ weißt Du an welcher einmaligen Stelle im Programm die Daten ausgegeben werden können und kannst so einen Breakpoint setzen.
    2.) Du weißt vom Code her, wo die benötigten Daten stehen.
    3.) Du kannst das Programm so ändern, daß es ohne menschliche Aktion durchläuft.
    Das Problem ist also nicht wirklich der Emulator, sondern daß Du den Programmcode für das Spiel verstehst.
    Nebenbei: Sprichst Du Französisch?

  • Ja, ich habe nun auf jeden Fall verstanden, dass meine sehr speziellen Anforderungen wohl nur dann erfüllt werden können, wenn ich den Code von M.U.L.E. anpasse.


    Aber dann wäre das sicher machbar, denn:
    1. Es gibt im Spiel M.U.L.E. (nach einigen manuell notwendigen Eingaben) einen Zeitpunkt, zu dem es dann anfängt, komplett automatisch von Runde 1 bis Runde 12 durchzulaufen
    2. Der Memory-Snapshot sowie Program Counter und Stack dieses Zeitpunkts wäre dann die Basis dafür, den Rest im angepassten Emulator ablaufen zu lassen und am Ende von Runde 12 den Breakpoint zu erreichen


    Ich muss nun
    - den M.U.L.E. Code verstehen... Die größte Hürde für mich.
    - einen Speicherbereich finden, in dem ich die von mir gewünschten zu speichernden Informationen während des automatischen Ablaufs des Spiels zwischenspeichere
    - den M.U.L.E. Code so modifizieren, dass die von mir gewünschten Informationen während des automatischen Ablaufs in den gefundenen Speicherbereich geschrieben werden, und am Ende von Spielrunde 12 den illegalen Opcode setzen als Basis für Auswertung des Zwischenspeichers und Abspeichern als CSV Datei durch eigenen Code.
    Das ganze könnte man dann sogar sicher so scripten, dass es in einer Schleife läuft, so dass schnell zigtausend Spiele á 12 Runden zusammenkommen, was eine hinreichend große Datenbasis für das Data Science Projekt darstellt.


    Viel zu tun... Das reißt leider voll die Zeitlinie für mein Projekt ("due end of next week"), sodass ich für meine Fortbildung sicher etwas viel einfacheres werde machen müssen.


    Aber ich finde es ist eine schöne Herausforderung es nebenbei weiter zu treiben, da ich den M.U.L.E. Code sowieso schon immer mal verstehen wollte. :-)


    Nebenbei: Sprichst Du Französisch?

    Französisch spreche ich leider nicht, wieso? Aber es gibt ja Google Translate für schriftliche Infos...

    Gruß, Goethe.
    _______________
    C64, C128DCR, SX64, C16, plus/4, A1200+Blizzard1230/IV, A600HD+Vampire600V2, A300+ACA620, MEGA65, Atari 800+810
    Vectrex, Game Boy, NDSi, GameCube, Game Gear, Mega Drive, Mega CD, 32X, Multimega, Nomad, Saturn, Dreamcast, XBox, PS2, PSP, PS3, PS Vita, Ouya, PS4, PS5

  • Französisch spreche ich leider nicht, wieso?

    Hatte bei einem flüchtigen Blick in den von ogd vorgeschlagenen disassemblierten Code den Eindruck, daß der Autor Kommentare zum Code größtenteils auf Französisch verfaßt hat.

    ("due end of next week")

    Das ist in der Tat zu knapp. Schade. Sah nach einem interessanten Projekt für die Fortbildung aus, aber sicherlich lohnt es sich auch, privat daran zu arbeiten.


    Was den freien Speicherbereich anbelangt, so empfiehlt es sich, das Ram unter dem IO ($d000-$dfff) näher anzugucken, da ältere Spiele dieses oftmals nicht benutzt haben. Wenn Du jedoch ohnehin einen geänderten Emulator verwendest, kannst Du Dir die Daten auch direkt nach jeder Runde ausgeben lassen. Das erspart ein wenig Arbeit.


    Viel Erfolg bei Deinem Vorhaben! Und es wäre nett, wenn Du uns gelegentlich von Deinen Fortschritten berichten könntest.