Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
z9001:software:chip_8 [2021/02/18 16:50] volkerpz9001: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|]]-Sprache [[wp>CHIP-8]].+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|]]. Entwickelt habe ich diesen Interpreter 2013 für das [[sonstiges:kctreffen2013|]].
 +
 +2021 hab ich den alten Quellcode hervorgeholt und um die überfälligen Teile Laden/Speichern/Editieren ergänzt.
  
 ===== Speicherbelegung ===== ===== Speicherbelegung =====
Zeile 12: Zeile 15:
 | OS-Kommando | CHIP8 | | OS-Kommando | CHIP8 |
  
 +===== Download =====
 +
 +  * {{ :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 ===== ===== Anleitung =====
  
Zeile 19: Zeile 28:
 {{:z9001:software:chip8-1.png|}} {{:z9001:software:chip8-1.png|}}
  
-Mit STOP (Strg-C) wird der CHIP8-Interpreter beendet.+Mit STOP (Strg-C) wird das Programm beendet.
  
 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 "Bildschirm". RUN startet das aktuelle Programm. Im Fenster laufen die CHIP8-Programme auf einem 64x32 Pixel großen "Bildschirm".
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 <4>-<6> bewegt.+  - 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>   - Panzer (s. [[sonstiges:kctreffen2013|]])\\ Panzer bewegen hoch <2> - rechts <6>  - runter <8> - links <4>
-  - 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>
  
 {{:z9001:software:chip8-3.png|}} {{:z9001:software:chip8-3.png|}}
Zeile 67: Zeile 74:
 +---+---+---+---+ +---+---+---+---+
 </code> </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 ===== ===== Links =====
  
-  * http://www.chip8.com Die größte Sammlung an Programmen und Infos zu CHIP-8, Handbuch des COSMAC VIP +z.B. auf http://bitsavers.informatik.uni-stuttgart.de/components/rca/cosmac/ zu finden: 
-  * http://mattmik.com/documents.html die komplette Sammlung der VIPER-Magazine für die COSMAC VIP-Computer.+ 
 +  * **COSMAC_VIP_Instruction_Manual_1978.pdf**   Handbuch zum VIP, enthält Einführung in CHIP-8 und 20 Programme für CHIP-8 
 +    - 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 ===== ===== CHIP-8 =====
  
-Details zur Programmiersprache s. [[homecomputer:chip8|]].+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 138: 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 157: 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 195: 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|]])
- +
-Auf http://mattmik.com/chip8.html gibt es eine ausführliche Beschreibung des CHIP-8-Maschinencodes. +
  
  
 ==== Beispiel: wandernde Acht ==== ==== Beispiel: wandernde Acht ====
 +
 +Beispiel 2 aus "RCA COSMAC VIP Instruction Manual" S.16
  
 Programm Programm
 <code> <code>
-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   
 </code> </code>
  
 Assembler-Code Assembler-Code
-<code>    +<code> 
-L200: LD   I,  #210           ; A210 +200        LD   I, L210    ; A210   Index auf L210  
-      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         ; D125 +206L206    DRW  V1, V2, #5 ; D125   "8" zeichnen (5 Bytes ab I) 
-      DRW  V1, V2, #5         ; D125 +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   L206               ; 1206 +20E:         JP   L206       ; 1206   und neu zeichnen 
-L210db #F0#90#F0#90#F0+     ; Sprite "8" (4x5 Pixel) 
 +210L210    DB   %11110000 F0     ####.... 
 +211:         DB   %10010000 90     #..#.... 
 +212:         DB   %11110000 F0     ####.... 
 +213:         DB   %10010000 90     #..#.... 
 +214:         DB   %11110000 F0     ####....
 </code> </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.1613667019.txt.gz
  • Zuletzt geändert: 2021/02/18 16:50
  • von volkerp