Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
z9001:software:chip_8 [2021/02/18 15:14] – angelegt volkerpz9001: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.pdf|Vortrag}} über die Programmiersprache CHIP-8 und die Implementation eines CHIP-8-Interpreters für den Z9001 gehalten.+CHIP8 ist ein Interpreter für die Programmiersprache [[homecomputer:chip8|]], s.a. [[wp>CHIP-8]]. 
 +Entwickelt habe ich diesen Interpreter 2013 für das [[sonstiges:kctreffen2013|]].
  
-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/Speichern/Editieren ergänzt.
  
 +===== 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:chip8.zip |}} Quellcode, Stand 22.2.2021 
 +  * {{ :z9001:software:chip8-bin.zip |}} ausführbare Datei + Chip-8-Programme (für USB/Diskette) 
 +  * {{sonstiges:chip8.pdf|Vortrag}} Mein Vortrag zum KC-Treffen 2013
  
 +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://www.chip8.com Die größte Sammlung an Programmen und Infos zu CHIP-8, Handbuch des COSMAC VIP +{{:z9001:software:chip8-1.png|}}
-  * http://oldcomputers.net/rca-cosmac-vip.html Infos zum COSMAC VIP +
-  * http://mattmik.com/documents.html die komplette Sammlung der VIPER-Magazine für die COSMAC VIP-Computer.+
  
 +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]] gestoßen.+{{:z9001:software:chip8-4.png|}}
  
-CHIP-8 wurde von Joseph Weisbecker, Mitarbeiter der RCA Laboratories, Princetown, Mitte der 70er-Jahre entwickeltUrsprünglich wurde die Sprache für Heimcomputer wie den COSMAC VIP oder den TELMAC konzipiertZiel war es, eine einfache Sprache zur plattformunabhängigen Entwicklung von Videospielen bereitzustellen.+Mit den Cursortasten bewegt man sich im virtuellen RAM-Bereich des CHIP-8-Systems 
 +Hex-Werte werden einfach überschrieben, mit STOP oder ESC beendet man den HEX-Editor. 
 +RUN startet das Programm direkt.
  
-CHIP-8 ist eine Maschinencode-Sprache für einen (theoretischen) 8-Bit-Prozessor. Es gibt nur 31(35) Maschinencode-Befehleallerdings sind einige darunter, die das Programmieren von Telespielen besonders erleichtern, so z.B. eine Sprite-Ausgabe mit Kollisionserkennung oder bedingte Sprünge bei nicht-/gedrückter Taste.+Durch Betätigen der Taste <L> werden CHIP8-Programme vom Datenträger geladenmit <S> wird das aktuelle Programm gespeichert. 
 +Bei der Arbeit mit USB oder Diskette werden zuvor die vorhandenen Programme aufgelistet:
  
-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, er belegt nicht einmal 0.5 KByte! Diese Kompaktheit spiegelt sich beispielsweise auch in den Hex-Werten der Maschinencode-Instruktionen wiederDie Befehle der F-Gruppe haben einen zweistellige Nummer, diese entspricht der Startadresse der zugehörigen Befehlsinterpretation. Damit sparte man sich die Bytes für eine zusätzliche Sprungtabelle. Auch der Zeichensatz ist clever komprimiert (s. Bild und VIPER 1-01).+{{:z9001:software:chip8-2.png|}}
  
-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, SNAKE, ...)+Als Dateiendung wird automatisch CH8 vergeben.
  
-Im VIPER-Magazin 1-01 June 1978 werden zusätzliche Hinweise zur Programmierung mit CHIP-8 gegeben.+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.
  
-Ausgabe VIPER-Magazin 1-02 August 1978 liefert Informationen über die Arbeitsweise des CHIP-8-InterpretersEs gibt Ablaufpläne und kommentierte Listings. -> [[homecomputer:chip8:chip8interpreter]]+RUN startet das aktuelle Programm. Im Fenster laufen die CHIP8-Programme auf einem 64x32 Pixel großen "Bildschirm".
  
-http://mattmik.com/chip8.html beschreibt ausführlich den CHIP-8-Maschinencode.+Mit den Tasten <1>..<4> werden 4 integrierte Programme geladen und gleich gestartet. 
 + 
 +  - IBM-Logo\\ Anzeige des Logos, Ende mit ESC 
 +  - Breakout (Paul Vervalin, David Winter)\\ der Schläger wird links-rechts mit <4>-<6> bewegt. 
 +  - Panzer (s. [[sonstiges:kctreffen2013|]])\\ Panzer bewegen hoch <2> - rechts <6>  - runter <8> - links <4> 
 +  - Pong (Paul Vervalin, David Winter)\\ linker Spieler hoch <1> runter <4> rechter Spieler hoch <C> runter <D> 
 + 
 +{{:z9001:software:chip8-3.png|}} 
 + 
 +Innerhalb des Programmlaufs wird mit den 16 Tasten <0>..<9>, <A>..<F> gesteuert. Die konkrete Bedienung ist beim jeweiligen Programm aufgeführt. 
 +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. 
 + 
 +<code> 
 ++---+---+---+---+ 
 +| 1 | 2 | 3 | C | 
 ++---+---+---+---+ 
 +| 4 | 5 | 6 | D | 
 ++---+---+---+---+ 
 +| 7 | 8 | 9 | E | 
 ++---+---+---+---+ 
 +| A | 0 | B | F | 
 ++---+---+---+---+ 
 +</code> 
 + 
 + 
 +===== Interna ===== 
 + 
 +Der eigentliche CHIP-8-Maschinencode-Interpreter basiert auf dem Programm Chip83 v0.1 by Joe Wingbermuehle; orig. für TI-83 in Z80-Code geschrieben. 
 +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/rca/cosmac/ zu finden: 
 + 
 +  * **COSMAC_VIP_Instruction_Manual_1978.pdf**   Handbuch zum VIP, enthält Einführung in CHIP-8 und 20 Programme für CHIP-
 +    - 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 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:chip8|]] und [[homecomputer:chip8:referenz|]].
  
 | virtueller Prozessor | 16 Register V0..VF\\ Index-/Adressregister I\\  (Stackregister SP)\\ (Program Counter PC) \\ Delay Timer DT\\ Sound Timer ST | | virtueller Prozessor | 16 Register V0..VF\\ Index-/Adressregister I\\  (Stackregister SP)\\ (Program Counter PC) \\ Delay Timer DT\\ Sound Timer ST |
Zeile 41: Zeile 132:
 | Tastatur | 4x4-Tastenfeld | | Tastatur | 4x4-Tastenfeld |
 | Sound | Beepton | | Sound | Beepton |
- 
- 
-Der originale [[homecomputer:chip8:chip8interpreter]] ist eine coole Software, umfasst nur 500 Byte, davon 1/3 für Sprite-Befehl! 
-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. Grafiken +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+ 
 +<code> 
 ++---------------------+ --> x 
 +|(0,0)          (63,0)|  (x,y) 
 +|                     | 
 +|                     |  
 +|(0,31)        (63,31)| 
 ++---------------------+ 
 +
 +
 +
 +</code> 
 + 
 +Grafiken werden auf dem Bildschirm allein durch Sprites gezeichnet, die 8 Pixel breit
 sind und von 1 bis 15 Pixel hoch sein können. Sprite-Pixel, die gesetzt sind, sind und von 1 bis 15 Pixel hoch sein können. Sprite-Pixel, die gesetzt sind,
 invertieren die Farbe der entsprechenden Bildschirm-Pixel, während nicht gesetzten invertieren die Farbe der entsprechenden Bildschirm-Pixel, während nicht gesetzten
 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 200..EFF 
-  * kk: 8-Bit-Konstante +  * kk: 8-Bit-Konstante 00..FF 
-  * n: 4-Bit-Konstante +  * n: 4-Bit-Konstante 0..F 
-  * x und y: 4-Bit-Register +  * x und y: 4-Bit Register-Nr 0..F
  
 ^ Hex   ^ Symbolisch      ^ Assembler           ^ Beschreibung                                                                                                                                                                                       ^ ^ Hex   ^ Symbolisch      ^ Assembler           ^ Beschreibung                                                                                                                                                                                       ^
Zeile 160: Zeile 261:
 | 0mmm  | MLS@mmm         | SYS addr            | Do 1802 machine language subroutine at 0MMM (subroutine must end with D4 byte)                                                                                                                     | | 0mmm  | MLS@mmm         | SYS addr            | Do 1802 machine language subroutine at 0MMM (subroutine must end with D4 byte)                                                                                                                     |
  
-Die Assemblerbezeichungen entsprechen http://devernay.free.fr/hacks/chip8/C8TECH10.HTM +Die Assemblerbezeichnungen entsprechen http://devernay.free.fr/hacks/chip8/C8TECH10.HTM ([[homecomputer:chip8:referenz|]])
-==== BeispielPanzer ====+
  
-; Tank, from VIPER vol 1, issue 1 june 1978, pp. 14 
  
-<code>    +==== Beispielwandernde Acht ====
-200 6120  init: V1=20 ;initialize +
-202 6210  V2=10 +
-204 A240  I=240 +
-206 D127  show: SHOW 7MI@V1V2 ;show tank +
-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 ;erase tank +
-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 ;253 +
-230 4006  SKIP;V0 NE 06 +
-232 A24D  I=s_right       ;24D +
-234 4008  SKIP;V0 NE 08 +
-236 A246  I=s_down ;246 +
-238 1206  GO show ;206 ; jump to show+
  
-; Sprites +Beispiel 2 aus "RCA COSMAC VIP Instruction Manual" S.16
-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 
 +<code> 
 +200: A2 10 61 00 62 00 D1 25 
 +208: D1 25 71 01 72 01 12 06 
 +210: F0 90 F0 90 F0   
 </code> </code>
  
 +Assembler-Code
 +<code>
 +200:         LD   I, L210    ; A210   Index auf L210 
 +202:         LD   V1, #00    ; 6100   Startposition (0,0)
 +204:         LD   V2, #00    ; 6200   
 +206: L206    DRW  V1, V2, #5 ; D125   "8" zeichnen (5 Bytes ab I)
 +208:         DRW  V1, V2, #5 ; D125   und wieder löschen
 +20A:         ADD  V1, #01    ; 7101   Position nach rechts
 +20C:         ADD  V2, #01    ; 7201   und unten verändern
 +20E:         JP   L206       ; 1206   und neu zeichnen
 +     ; Sprite "8" (4x5 Pixel)
 +210: L210    DB   %11110000  ; F0     ####....
 +211:         DB   %10010000  ; 90     #..#....
 +212:         DB   %11110000  ; F0     ####....
 +213:         DB   %10010000  ; 90     #..#....
 +214:         DB   %11110000  ; F0     ####....
 +</code>
 +
 +==== Beispiel: Zähler ====
 +
 +Beispiel 3 aus "RCA COSMAC VIP Instruction Manual" S.16
 +
 +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 "7" -Musters, das dann auf dem Bildschirm mit einer **DXYN**-Anweisung angezeigt werden kann. N muss für diese eingebauten hexadezimalen Muster immer 5 sein.
 +
 +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
 +<code>
 +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
 +</code>
 +
 +Assembler-Code (erstellt mit c8dasm)
 +
 +<code>   
 +L200: LD   V3, #00            ; 6300  Startwert
 +L202: LD   I,  #300           ; A300  Speicheradr. für BCD-Zahl
 +      LD   B,  V3             ; F333  Speichert die BCD-Darstellung von V3 an den Speicherplätzen I, I+1 und I+2.
 +      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   F,  V0             ; F029  I auf Ziffern-Sprite für V0 setzen (Hunderter)
 +      DRW  V4, V5, #5         ; D455  anzeigen
 +      ADD  V4, #05            ; 7405  Position (5,0)
 +      LD   F,  V1             ; F129  I auf Ziffern-Sprite für V1 setzen (Zehner)
 +      DRW  V4, V5, #5         ; D455  anzeigen
 +      ADD  V4, #05            ; 7405  Position (10,0)
 +      LD   F,  V2             ; F229  I auf Ziffern-Sprite für V1 setzen (Einer)
 +      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, wenn V6=0 
 +      JP   L224               ; 1224  sonst weiter warten
 +      ADD  V3, #01            ; 7301  Zähler erhöhen
 +      CLS                     ; 00E0  Bildschirm löschen
 +      JP   L202               ; 1202  neu anzeigen
 +</code>
  
  
  • z9001/software/chip_8.1613661267.txt.gz
  • Zuletzt geändert: 2021/02/18 15:14
  • von volkerp