Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| z9001:software:chip_8 [2021/02/18 15:14] – angelegt 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 | ||
| - | Auf dem COSMAC VIP muss ein CHIP-8-Interpreter eingegeben werden. Dieser interpretiert dann den CHIP-8-Programmcode und führt so die Programme aus. Der CHIP-8-Interpreter ist extrem platzsparend programmiert, | + | {{:z9001: | 
| - | 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, | + | Als Dateiendung wird automatisch CH8 vergeben. | 
| - | Im VIPER-Magazin 1-01 June 1978 werden zusätzliche Hinweise zur Programmierung mit CHIP-8 | + | 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 | 
| - | Ausgabe VIPER-Magazin 1-02 August 1978 liefert Informationen über die Arbeitsweise des CHIP-8-Interpreters. Es gibt Ablaufpläne und kommentierte Listings. -> [[homecomputer: | + | RUN startet das aktuelle Programm. Im Fenster laufen | 
| - | http://mattmik.com/chip8.html beschreibt ausführlich den CHIP-8-Maschinencode. | + | 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 41: | Zeile 132: | ||
| | Tastatur | 4x4-Tastenfeld | | | Tastatur | 4x4-Tastenfeld | | ||
| | Sound | Beepton | | | Sound | Beepton | | ||
| - | |||
| - | |||
| - | Der originale [[homecomputer: | ||
| - | Es sind viele speicherplatzsparende Programmkniffe enthalten, ein Blick in den Quellcode lohn sich! | ||
| - | z.B. Fx-Befehle, Bitmuster der Hexziffern | ||
| Zeile 103: | 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 122: | 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 160: | 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 | ||
| + | </ | ||