Forum: Mikrocontroller und Digitale Elektronik [Spielekonsole] Form der Spiele


von Chuu (Gast)


Lesenswert?

Hallo!

Ich entwickle gerade eine einfache kleine Spielekonsole auf Basis eines
MSP430F1611. Gamepad, Audio, SDC und Text-LCD (jaja) habe ich schon.
Mein einziges Problem ist, in welcher Form ich die Spele entwickle.

Ich habe diverse Möglichkeiten gefunden:
- Nativer Code: Da der MSP430 eine von Neumann-Architekur ist, könnte
ich das Spiel (oder Teile davon) in den RAM laden und dort ausführen.
Aber wie soll das Spiel auf meine I/O Routinen zugreifen? Selbst wenn
ich die Addressen der Funktionen in die Spiele hardcode: Wenn ich das
OS modifieziere ist alles fürn A****. Dynamic Linking muss her. Das
erscheint mir aber sehr kompieliert und DOS-like Software-Interrupts
gibt es ja nicht, oder?
- Byte Code: Dieverse Sprachen (LISP z.B.) lassen sich ja in ByteCode
übersetzen. Nur müset ich dafür einen Interpreter schreiben oder
portieren. Das erscheint mir aber auch recht schwer und hört sich nach
viel Code an, für den ich möglicherweise keinen Platz habe. Oder gibt
es möglicherweise (für LISP z.B.) einen Bytecode-Interpreter, der
klein, erweiterbar und einfach zui portieren ist?
- Interpreter: Ich könnte einen kleinen Interpreter für z.B. LISP
schreiben. LISP scheint mir nicht sonderlich schwer zu interpretieren
sein. Hört sich aber dennoch nach einem längeren Projekt an. Oder gibt
es vielleicht ein kleinen erweiterbaren, einfach zu portierenden
LISP-Interpreter? In lex/yacc wär mir hier natürlich am liebsten.
- externer Controller: Ich könnte auch einen externen Controller (hab
hier noch ein paar atmega8 rumfliegen) über z.B. SPI anschließen, der
der Konsole Befehle gibt. Da wär aber mit Hardwareaufwand verbunden.
Außerdem habe ich doch schon die SDC-Ansteuerung fertig.

Was würdet ihr tun?

MfG

von Simon K. (simon) Benutzerseite


Lesenswert?

Das habe ich mich auch schonmal gefragt... Wie auch immer, der Gameboy
hat native Assembler Befehle in einem EEPROM in der Cartridge
gespeichert. Wird dieses eingesteckt und der Gameboy angeschaltet, wird
ins EEPROM immer an Adresse XYZ gesprungen und von dort aus das Programm
mit den nativen Befehlen gestartet.
I/O Geräte liegen beim Gameboy direkt am Daten/Adressbus.
Dementsprechend wird auch so auf diese Geräte zugegriffen. Sprich:
Wirkliche I/O Routinen gibts hier nicht.

von Eckhard (Gast)


Lesenswert?

Hallo,

Du könntest einfach eine Spruntabelle zu deinen I/O Funktionen
benutzen. So liegt die Adresse der Funktion immer an der selben Stelle
egal wo die Funktion sich wirklich befindet. Eine andere Variante sind
Software Interrupts oder Traps, weiß nicht ob der MSP430 sowas hat. Als
Bytecode Interpreter würde ich eher in richtung FORTH gehen. LISP halte
ich bei den resourcen doch für nichtz so geeignet.

Eckhard

von さくら (Gast)


Lesenswert?

Hi!

Traps oder Software-Interrupts hat der MSP430 leider nicht. Die Idee
meiner Vorposters mit der Sprungstabelle ist nicht schlecht, allerdings
muss man dann zur Kompilier-Zeit irgendwie wissen wo welche Funktion
liegen wird und diese Informationen an einem bestimmten Ort ablegen.
Außerdem müsste man den Code der Spiele in ein spezielles Format
bringen, befreit von Interrupt-Vektoren und anderem Overhead. Und
schließlich darf der Code der Spiele nicht in den RAM-Bereich
schreiben, in dem das 'OS' seine Daten hat. Das halte ich für ein
Ein-Mann-Projekt für viel zu kompliziert.

Bytecode-Interpreter sind 'ne schöne Sache. Allerdings etwas langsam,
wenn man nicht gerade einen ARM verwendet. Wenn es bei dir aber nicht
auf Geschwindigkeit ankommt, kann man das machen. Du könntest zum
Beispiel NanoVM auf den MSP430 portieren. Ich hab mir den Sourcecode
mal genauer angesehen, so schwer ist das nicht.

Von einem Richtigen Interpreter kann ich nur abraten. Das ist für einen
MSP430 wirklich zu langsam und zu Speicherfressend (RAM und ROM).

Die Sache mit dem Externen Controller halte ich für eine gute Idee. Das
bedeutet zwar etwas mehr Hardwareaufwand, ist aber schnell. Die SD-Karte
kannst du ja zum speichern von Speilständen od.Ä. verwenden (wie bei der
PS).

von Michael U. (Gast)


Lesenswert?

Hallo,

machs wie beim guten alten C64: das OS kopiert als erstes eine
Vektorliste mit den Startadressen der OS- und IRQ-Routinen in
festgelegter Form an eine feste Position ins Ram.
Alle Aufrufe gehen indirekt über diese Vektoren.
Das Spiel kann diese Vektoren benutzen und auch ändern, um z.B. eigene
Routinen für die gleiche Funktion zu benutzen oder IRQ-Handler
einzuhängen. Bei den IRQ muß das Game dann klären, ob es ein IRQ ist
und sonst in den Originalaufruf des Vektors springen.

Dazu noch eine Modulkennung vereinbaren (muß ja nicht CBM64 sein...),
auf die das OS testet und dann dort in eine feststehende Vektoradresse
verzweigt.

Gruß aus Berlin
Michael

von Michael König (Gast)


Lesenswert?

Für Spiele bietet sich normalerweise immer nativer Code an, da es in
diesem Anwendungsbereich meist auf Geschwindigkeit ankommt.

Ausnahmen bestätigen natürlich die Regel, allerdings würde ich kein
LISP verwenden (obwohl es mit "Abuse" mindestens ein Spiel gibt, das
in LISP geschrieben wurde). Falls es unbedingt so ähnlich sein soll,
würde ich eher Scheme nehmen, da das kompakter und vom Konzept her
etwas sauberer ist. Allerdings frage ich mich, wozu man bei einem Spiel
eine funktionale Sprache erster Ordnung brauchen sollte.

Recht beliebt bei professionellen Spieleentwicklern scheint Lua zu
sein, mit dem Beispielsweise das Lucas-Arts-Spiel "Grim Fandango" und
die Addons in "WoW" realisiert sind:
http://www.lua.org/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.