Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
z9001:software:chip_8 [2021/02/18 16:50] – volkerp | z9001:software:chip_8 [2022/08/02 10:15] (aktuell) – [Interna] volkerp | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | |||
====== CHIP-8 ====== | ====== CHIP-8 ====== | ||
- | CHIP8 ist ein Interpreter für die [[homecomputer: | + | CHIP8 ist ein Interpreter für die Programmiersprache |
Entwickelt habe ich diesen Interpreter 2013 für das [[sonstiges: | Entwickelt habe ich diesen Interpreter 2013 für das [[sonstiges: | ||
+ | |||
+ | 2021 hab ich den alten Quellcode hervorgeholt und um die überfälligen Teile Laden/ | ||
===== Speicherbelegung ===== | ===== Speicherbelegung ===== | ||
Zeile 12: | Zeile 15: | ||
| OS-Kommando | CHIP8 | | | OS-Kommando | CHIP8 | | ||
+ | ===== Download ===== | ||
+ | |||
+ | * {{ : | ||
+ | * {{ : | ||
+ | * {{sonstiges: | ||
+ | Hinweis: Die Timer für Sound und Delay arbeiten offenbar nicht korrekt. | ||
===== Anleitung ===== | ===== Anleitung ===== | ||
Zeile 19: | Zeile 28: | ||
{{: | {{: | ||
- | Mit STOP (Strg-C) wird der CHIP8-Interpreter | + | Mit STOP (Strg-C) wird das Programm |
LIST startet den HEX-Editor. | LIST startet den HEX-Editor. | ||
Zeile 36: | Zeile 45: | ||
Als Dateiendung wird automatisch CH8 vergeben. | Als Dateiendung wird automatisch CH8 vergeben. | ||
- | Hinweis: Bei der Arbeit mit USB oder Diskette werden die Programme OHNE den typischen KC-Vorblock gespeichert. Die CH8-Dateien sind hier | + | Hinweis: Bei der Arbeit mit USB oder Diskette werden die Programme OHNE den typischen KC-Vorblock gespeichert. Die CH8-Dateien sind hier reine Binärdateien und kompatibel zu den im Internet verfügbaren CHIP-8-Programmen. |
- | reine Binärdateien und kompatibel zu den im Internet verfügbaren CHIP-8-Programmen. | + | |
RUN startet das aktuelle Programm. Im Fenster laufen die CHIP8-Programme auf einem 64x32 Pixel großen " | RUN startet das aktuelle Programm. Im Fenster laufen die CHIP8-Programme auf einem 64x32 Pixel großen " | ||
Zeile 45: | Zeile 52: | ||
- IBM-Logo\\ Anzeige des Logos, Ende mit ESC | - IBM-Logo\\ Anzeige des Logos, Ende mit ESC | ||
- | - Breakout\\ der Schläger wird links-rechts mit < | + | - Breakout |
- Panzer (s. [[sonstiges: | - Panzer (s. [[sonstiges: | ||
- | - Pong\\ linker Spieler hoch <1> runter <4> rechter Spieler hoch <C> runter <D> | + | - Pong (Paul Vervalin, David Winter)\\ linker Spieler hoch <1> runter <4> rechter Spieler hoch <C> runter <D> |
{{: | {{: | ||
Zeile 67: | Zeile 74: | ||
+---+---+---+---+ | +---+---+---+---+ | ||
</ | </ | ||
+ | |||
+ | |||
+ | ===== Interna ===== | ||
+ | |||
+ | Der eigentliche CHIP-8-Maschinencode-Interpreter basiert auf dem Programm Chip83 v0.1 by Joe Wingbermuehle; | ||
+ | Load/Save setzt die BDOS-Erweiterung von USB-OS bzw. Disk-OS (USBX bzw. DOSX) voraus. Ohne diese Erweiterung wird nur ein BOS-Error ausgegeben. | ||
===== Links ===== | ===== Links ===== | ||
- | * http://www.chip8.com Die größte Sammlung an Programmen und Infos zu CHIP-8, Handbuch des COSMAC | + | z.B. auf http://bitsavers.informatik.uni-stuttgart.de/ |
- | * http:// | + | |
+ | * **COSMAC_VIP_Instruction_Manual_1978.pdf** | ||
+ | - VIP Kaleidoscope | ||
+ | - VIP Video Display Drawing Game | ||
+ | - VIP Wipe Off | ||
+ | - VIP Space Intercept | ||
+ | - VIP 4096-Bit Picture | ||
+ | - VIP Figure Shooting at Moving Target | ||
+ | - VIP Tick-Tack-Toe Game | ||
+ | - VIP Spooky Spot | ||
+ | - VIP Jackpot | ||
+ | - VIP Snake Race | ||
+ | - VIP Card Matching Game | ||
+ | - VIP Armored Vehicle Clash | ||
+ | - VIP Hi-Lo | ||
+ | - VIP Hex Reflex | ||
+ | - VIP Dot-Dash | ||
+ | - VIP A-Mazing | ||
+ | - VIP Deduce | ||
+ | - VIP Shooting Stars | ||
+ | - VIP Strike-9 | ||
+ | - VIP Card Game (like the well-known acey-ducey) | ||
+ | * **VP-710_RCA_COSMAC_VIP_Game_Manual_Dec78.pdf** enthält weitere 16 Programme für CHIP-8 | ||
+ | - VIP Pinball (Andrew Modla) | ||
+ | - VIP Message Center (Andrew Modla) | ||
+ | - VIP Bingo (Andrew Modla) | ||
+ | - VIP Blackjack (Andrew Modla) | ||
+ | - VIP Slide (Joyce Weisbecker) | ||
+ | - VIP Reversi (Philip Baltzer) | ||
+ | - VIP Bowling (Gooitzen van der Wal) | ||
+ | | ||
+ | | ||
+ | - VIP Most Dangerous Game (Peter Maruhnic) | ||
+ | - VIP Sum Fun (Joyce Weisbecker) | ||
+ | - VIP Sequence Shoot (Joyce Weisbecker) | ||
+ | - VIP Biorhythm (Jef Winsor) | ||
+ | - VIP Programmable Space fighters (Jef Winsor) | ||
+ | - VIP Lunar Lander | ||
+ | - VIP Blockout (Steve Houk) | ||
===== CHIP-8 ===== | ===== CHIP-8 ===== | ||
- | Details zur Programmiersprache s. [[homecomputer: | + | Details zur Programmiersprache s. [[homecomputer: |
| virtueller Prozessor | 16 Register V0..VF\\ Index-/ | | virtueller Prozessor | 16 Register V0..VF\\ Index-/ | ||
Zeile 138: | Zeile 189: | ||
- | Die Display-Auflösung beträgt 64 × 32 Pixel, und die Farbe ist einfarbig. | + | Die Display-Auflösung beträgt 64 × 32 Pixel, und die Farbe ist einfarbig. |
- | werden auf dem Bildschirm allein durch Sprites gezeichnet, die 8 Pixel breit | + | |
+ | < | ||
+ | +---------------------+ --> x | ||
+ | |(0, | ||
+ | | | | ||
+ | | | | ||
+ | |(0, | ||
+ | +---------------------+ | ||
+ | | | ||
+ | v | ||
+ | y | ||
+ | </ | ||
+ | |||
+ | Grafiken | ||
sind und von 1 bis 15 Pixel hoch sein können. Sprite-Pixel, | sind und von 1 bis 15 Pixel hoch sein können. Sprite-Pixel, | ||
invertieren die Farbe der entsprechenden Bildschirm-Pixel, | invertieren die Farbe der entsprechenden Bildschirm-Pixel, | ||
Sprite-Pixel nichts verändern. | Sprite-Pixel nichts verändern. | ||
+ | |||
+ | Beim Zeichnen der Sprites werden 8 Pixel ab Position (x,y) gezeichnet, dann 8 Pixel ab Position (x,y+1) usw. | ||
Wenn beim Zeichnen des Sprites alle Bildschirm-Pixel invertiert wurden, wird | Wenn beim Zeichnen des Sprites alle Bildschirm-Pixel invertiert wurden, wird | ||
Zeile 157: | Zeile 223: | ||
Symbolen aufgelistet: | Symbolen aufgelistet: | ||
- | * mmm: Adresse | + | * mmm: Adresse |
- | * kk: 8-Bit-Konstante | + | * kk: 8-Bit-Konstante |
- | * n: 4-Bit-Konstante | + | * n: 4-Bit-Konstante |
- | * x und y: 4-Bit-Register | + | * x und y: 4-Bit Register-Nr 0..F |
^ Hex ^ Symbolisch | ^ Hex ^ Symbolisch | ||
Zeile 195: | Zeile 261: | ||
| 0mmm | MLS@mmm | | 0mmm | MLS@mmm | ||
- | Die Assemblerbezeichungen | + | Die Assemblerbezeichnungen |
- | + | ||
- | Auf http:// | + | |
==== Beispiel: wandernde Acht ==== | ==== Beispiel: wandernde Acht ==== | ||
+ | |||
+ | Beispiel 2 aus "RCA COSMAC VIP Instruction Manual" | ||
Programm | Programm | ||
< | < | ||
- | 200: A2 10 61 00 62 00 D1 25 | + | 200: A2 10 61 00 62 00 D1 25 |
208: D1 25 71 01 72 01 12 06 | 208: D1 25 71 01 72 01 12 06 | ||
- | 210: F0 90 F0 90 F0 00 00 00 | + | 210: F0 90 F0 90 F0 |
</ | </ | ||
Assembler-Code | Assembler-Code | ||
- | < | + | < |
- | L200: LD | + | 200: |
- | LD V1, #00 ; 6100 | + | 202: LD V1, #00 ; 6100 Startposition (0,0) |
- | LD V2, #00 ; 6200 | + | 204: LD V2, #00 ; 6200 |
- | L206: DRW V1, V2, #5 | + | 206: L206 |
- | DRW V1, V2, #5 | + | 208: DRW V1, V2, #5 ; D125 und wieder löschen |
- | ADD V1, #01 ; 7101 | + | 20A: ADD V1, #01 ; 7101 Position nach rechts |
- | ADD V2, #01 ; 7201 | + | 20C: ADD V2, #01 ; 7201 und unten verändern |
- | JP | + | 20E: JP |
- | L210: db #F0, #90, #F0, #90, #F0 | + | ; Sprite " |
+ | 210: L210 DB | ||
+ | 211: | ||
+ | 212: | ||
+ | 213: | ||
+ | 214: | ||
</ | </ | ||
+ | ==== Beispiel: Zähler ==== | ||
+ | |||
+ | Beispiel 3 aus "RCA COSMAC VIP Instruction Manual" | ||
+ | |||
+ | Der **FX29**-Befehl setzt I auf ein Fünf-Byte-Muster im internen Speicher, das die niederwertige hexadezimale Ziffer von VX darstellt. Wenn VX = 07 ist, dann zeigt I auf die Adresse eines " | ||
+ | |||
+ | Das folgende Programm veranschaulicht die Verwendung der Anweisungen für FX29 und FX33. | ||
+ | Dieses Programm erhöht kontinuierlich V3 und konvertiert es | ||
+ | in Dezimalform und zeigt es auf dem Bildschirm an. | ||
+ | |||
+ | Programm | ||
+ | < | ||
+ | 200: 63 00 A3 00 F3 33 F2 65 | ||
+ | 208: 64 00 65 00 F0 29 D4 55 | ||
+ | 210: 74 05 F1 29 D4 55 74 05 | ||
+ | 218: F2 29 D4 55 66 03 F6 18 | ||
+ | 220: 66 20 F6 15 F6 07 36 00 | ||
+ | 228: 12 24 73 01 00 E0 12 02 | ||
+ | </ | ||
+ | |||
+ | Assembler-Code (erstellt mit c8dasm) | ||
+ | |||
+ | < | ||
+ | L200: LD V3, #00 ; 6300 Startwert | ||
+ | L202: LD | ||
+ | LD | ||
+ | LD V2, [I] ; F265 Werte aus dem Speicher ab Position I in die Register V0 bis V2 kopieren | ||
+ | LD V4, #00 ; 6400 Position (0,0) | ||
+ | LD V5, #00 ; 6500 | ||
+ | LD | ||
+ | DRW V4, V5, #5 ; D455 anzeigen | ||
+ | ADD V4, #05 ; 7405 Position (5,0) | ||
+ | LD | ||
+ | DRW V4, V5, #5 ; D455 anzeigen | ||
+ | ADD V4, #05 ; 7405 Position (10,0) | ||
+ | LD | ||
+ | DRW V4, V5, #5 ; D455 anzeigen | ||
+ | LD V6, #03 ; 6603 | ||
+ | LD ST, V6 ; F618 Sound Timer = 3 (kurzer Piep) | ||
+ | LD V6, #20 ; 6620 | ||
+ | LD DT, V6 ; F615 Delay Timer = 20 (0,3 s) | ||
+ | L224: LD V6, DT ; F607 Warten bis Delay Timer = 0 | ||
+ | SE V6, #00 ; 3600 Nächste Anweisung überspringen, | ||
+ | JP | ||
+ | ADD V3, #01 ; 7301 Zähler erhöhen | ||
+ | CLS ; 00E0 Bildschirm löschen | ||
+ | JP | ||
+ | </ | ||