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 15:15] – [CHIP-8] 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:
  
-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, ...)+{{:z9001:software:chip8-2.png|}}
  
-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 "Bildschirm"
 + 
 +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 94: 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 113: 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 151: 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.1613661335.txt.gz
  • Zuletzt geändert: 2021/02/18 15:15
  • von volkerp