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 15:15] – [CHIP-8] volkerp | z9001:software:chip_8 [2022/08/02 10:15] (aktuell) – [Interna] volkerp | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | |||
====== CHIP-8 ====== | ====== CHIP-8 ====== | ||
- | Beim [[sonstiges:kctreffen2013|]] habe ich einen {{sonstiges: | + | CHIP8 ist ein Interpreter für die Programmiersprache |
+ | Entwickelt habe ich diesen Interpreter 2013 für das [[sonstiges: | ||
- | Der CHIP-8-Interpreter eignet sich aufgrund seiner einfachen Befehlssatzes ideal als Einstiegsobjekt in das Programmieren von Emulatoren. | + | 2021 hab ich den alten Quellcode hervorgeholt und um die überfälligen Teile Laden/ |
+ | ===== Speicherbelegung ===== | ||
- | ===== Z9001 ===== | + | | Dateiname | CHIP8.COM | |
+ | | Laden in | OS | | ||
+ | | Programmstandort | 0300h-10FFh | | ||
+ | | Arbeitsspeicher | 2000h-2EFFh | | ||
+ | | OS-Kommando | CHIP8 | | ||
+ | ===== Download ===== | ||
- | {{:homecomputer:chip8_z9001_2.gif?300|}} | + | * {{ :z9001:software: |
+ | * {{ : | ||
+ | * {{sonstiges: | ||
+ | Hinweis: Die Timer für Sound und Delay arbeiten offenbar nicht korrekt. | ||
+ | ===== Anleitung ===== | ||
- | ===== Links ===== | + | Nach Start meldet sich das Programm mit der Oberfläche und einer kurzen Hilfe: |
- | * http:// | + | {{:z9001:software:chip8-1.png|}} |
- | * http:// | + | |
- | * http:// | + | |
+ | Mit STOP (Strg-C) wird das Programm beendet. | ||
- | ===== CHIP-8 ===== | + | LIST startet den HEX-Editor. |
- | Durch Zufall bin ich auf eine recht alte Programmiersprache namens [[wp> | + | {{: |
- | CHIP-8 | + | Mit den Cursortasten bewegt man sich im virtuellen RAM-Bereich des CHIP-8-Systems. |
+ | Hex-Werte werden einfach überschrieben, | ||
+ | RUN startet das Programm direkt. | ||
- | CHIP-8 ist eine Maschinencode-Sprache für einen (theoretischen) 8-Bit-Prozessor. Es gibt nur 31(35) Maschinencode-Befehle; allerdings sind einige darunter, die das Programmieren von Telespielen besonders erleichtern, | + | Durch Betätigen der Taste <L> werden CHIP8-Programme vom Datenträger geladen; mit <S> wird das aktuelle Programm gespeichert. |
+ | Bei der Arbeit | ||
- | Einen guten Einstieg in die Programmierung mit CHIP-8 liefert das Handbuch zum COSMAC VIP (RCA COSMAC VIP CDP18S711 Instruction Manual; 130 S.). Hier sind auch 20 Spiele abgedruckt, die mit CHIP-8 laufen (PONG, TIC-TAC-TOE, | + | {{: |
- | Im VIPER-Magazin 1-01 June 1978 werden zusätzliche Hinweise zur Programmierung mit CHIP-8 gegeben. | + | Als Dateiendung wird automatisch CH8 vergeben. |
- | http://mattmik.com/chip8.html beschreibt ausführlich den CHIP-8-Maschinencode. | + | 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. |
+ | |||
+ | RUN startet das aktuelle Programm. Im Fenster laufen die CHIP8-Programme auf einem 64x32 Pixel großen " | ||
+ | |||
+ | Mit den Tasten < | ||
+ | |||
+ | - IBM-Logo\\ Anzeige des Logos, Ende mit ESC | ||
+ | - Breakout (Paul Vervalin, David Winter)\\ der Schläger wird links-rechts mit < | ||
+ | - Panzer (s. [[sonstiges: | ||
+ | - Pong (Paul Vervalin, David Winter)\\ linker Spieler hoch <1> runter <4> rechter Spieler hoch <C> runter <D> | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Innerhalb des Programmlaufs wird mit den 16 Tasten < | ||
+ | Mit ESC wird das Programm beendet, man landet wieder im Startbildschirm. | ||
+ | |||
+ | Die 16 Tasten sind beim Original in folgender Matrix angeordnet. Bei einigen Programmen spielt diese Anordnung eine Rolle, z.B. als Steuerkreuz mit den Tasten 2 - 6 - 8 - 4 oder links-rechts mit A und B und 0 als Aktionstaste. Die Tastenanordnung ist auch auf dem Bildschirm dargestellt. | ||
+ | |||
+ | < | ||
+ | +---+---+---+---+ | ||
+ | | 1 | 2 | 3 | C | | ||
+ | +---+---+---+---+ | ||
+ | | 4 | 5 | 6 | D | | ||
+ | +---+---+---+---+ | ||
+ | | 7 | 8 | 9 | E | | ||
+ | +---+---+---+---+ | ||
+ | | A | 0 | B | F | | ||
+ | +---+---+---+---+ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== 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 ===== | ||
+ | |||
+ | z.B. auf http://bitsavers.informatik.uni-stuttgart.de/components/ | ||
+ | |||
+ | * **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** | ||
+ | - 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 Deflection (John Fort) | ||
+ | - VIP Animal Race (Brian Astle) | ||
+ | - 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 ===== | ||
+ | |||
+ | Details zur Programmiersprache s. [[homecomputer: | ||
| virtueller Prozessor | 16 Register V0..VF\\ Index-/ | | virtueller Prozessor | 16 Register V0..VF\\ Index-/ | ||
Zeile 94: | 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 113: | 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 151: | Zeile 261: | ||
| 0mmm | MLS@mmm | | 0mmm | MLS@mmm | ||
- | Die Assemblerbezeichungen | + | Die Assemblerbezeichnungen |
- | ==== Beispiel: Panzer ==== | + | |
- | ; Tank, from VIPER vol 1, issue 1 june 1978, pp. 14 | ||
- | < | + | ==== Beispiel: wandernde Acht ==== |
- | 200 6120 init: V1=20 ; | + | |
- | 202 6210 V2=10 | + | |
- | 204 A240 I=240 | + | |
- | 206 D127 show: SHOW 7MI@V1V2 ; | + | |
- | 208 6002 key: V0=2 ;key wait | + | |
- | 20A E0A1 key1: SKIP;V0 NE KEY | + | |
- | 20C 1216 GO erase ; 216 | + | |
- | 20E 7002 V0+2 | + | |
- | 210 300A SKIP;V0 EQ 0A | + | |
- | 212 120A GO key ; 20A ;loop back to check next key | + | |
- | 214 1208 GO key1 ; 208 ;loop back to recheck next key | + | |
- | 216 D127 erase: SHOW 7MI@V1V2 ; | + | |
- | 218 4002 SKIP;V0 NE 02 ;change x or y | + | |
- | 21A 72FF V2+=FF ; = V2-1; move up | + | |
- | 21C 4004 SKIP;V0 NE 04 | + | |
- | 21E 71FF V1+=FF ; = V1-1; move left | + | |
- | 220 4006 SKIP;V0 NE 06 | + | |
- | 222 7101 V1+=01 ; move right | + | |
- | 224 4008 SKIP;V0 NE 08 | + | |
- | 226 7201 V2+=01 ; move down | + | |
- | 228 4002 SKIP;V0 NE 02 ; set pointer | + | |
- | 22A A240 I=s_up ;240 | + | |
- | 22C 4004 SKIP;V0 NE 04 | + | |
- | 22E A253 I=s_left ; | + | |
- | 230 4006 SKIP;V0 NE 06 | + | |
- | 232 A24D I=s_right | + | |
- | 234 4008 SKIP;V0 NE 08 | + | |
- | 236 A246 I=s_down ; | + | |
- | 238 1206 GO show ; | + | |
- | ; Sprites | + | Beispiel 2 aus "RCA COSMAC VIP Instruction Manual" |
- | 240 10 s_up: db 00010000b ; | + | |
- | 241 54 db 01010100b | + | |
- | 242 7C db 01111100b | + | |
- | 243 6C db 01101100b | + | |
- | 244 7C db 01111100b | + | |
- | 245 7C db 01111100b | + | |
- | 246 ; | + | |
- | 246 44 s_down: db 01000100b ; | + | |
- | 247 7C db 01111100b | + | |
- | 248 7C db 01111100b | + | |
- | 249 6C db 01101100b | + | |
- | 24A 7C db 01111100b | + | |
- | 24B 54 db 01010100b | + | |
- | 24C 10 db 00010000b | + | |
- | 24D ; | + | |
- | 24D 00 s_right: db 00000000b ; | + | |
- | 24E FC db 11111100b | + | |
- | 24F 78 db 01111000b | + | |
- | 250 6E db 01101110b | + | |
- | 251 78 db 01111000b | + | |
- | 252 FC db 11111100b | + | |
- | 253 ; | + | |
- | 253 00 s_left: db 00000000b ; | + | |
- | 254 3F db 00111111b | + | |
- | 255 1E db 00011110b | + | |
- | 256 76 db 01110110b | + | |
- | 257 1E db 00011110b | + | |
- | 258 3F db 00111111b | + | |
- | 259 00 db 00000000b | + | |
- | 25A END | + | Programm |
+ | < | ||
+ | 200: A2 10 61 00 62 00 D1 25 | ||
+ | 208: D1 25 71 01 72 01 12 06 | ||
+ | 210: F0 90 F0 90 F0 | ||
</ | </ | ||
+ | Assembler-Code | ||
+ | < | ||
+ | 200: | ||
+ | 202: | ||
+ | 204: | ||
+ | 206: L206 DRW V1, V2, #5 ; D125 " | ||
+ | 208: | ||
+ | 20A: | ||
+ | 20C: | ||
+ | 20E: | ||
+ | ; 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 | ||
+ | </ | ||