Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
homecomputer:chip8 [2013/04/15 13:35] – [COSMAC VIP] volkerp | homecomputer:chip8 [2021/02/23 09:54] (aktuell) – [Links] volkerp | ||
---|---|---|---|
Zeile 11: | Zeile 11: | ||
Hergestellt wurde der COSMAC VIP bereits 1977, der LC-80 folgte erst 8 Jahre später! | Hergestellt wurde der COSMAC VIP bereits 1977, der LC-80 folgte erst 8 Jahre später! | ||
- | {{http:// | + | {{: |
^ Merkmal ^ Beschreibung | | ^ Merkmal ^ Beschreibung | | ||
Zeile 22: | Zeile 22: | ||
| Peripherie | Kassettenrekorder | | | Peripherie | Kassettenrekorder | | ||
| Software | Programmiersprache CHIP-8 | | | Software | Programmiersprache CHIP-8 | | ||
+ | |||
===== Links ===== | ===== Links ===== | ||
Zeile 27: | Zeile 28: | ||
* http:// | * http:// | ||
* http:// | * http:// | ||
+ | |||
+ | weitere Dokumente | ||
+ | * http:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | |||
+ | Octo - eine moderne Chip8 IDE | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
===== CHIP-8 ===== | ===== CHIP-8 ===== | ||
- | CHIP-8 ist eine Maschinencode-Sprache für einen (theoretischen) 8-Bit-Prozessor. Es gibt nur 31(35) Maschinencode-Befehle; | + | CHIP-8 ist eine Maschinencode-Sprache für einen (theoretischen) 8-Bit-Prozessor. Es gibt nur 31(35) Maschinencode-Befehle; |
- | 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, | + | 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, |
- | Einen guten Einstieg in die Programmierung mit CHIP-8 liefert das Handbuch zum COSMAC VIP (RCA COSMAC VIP CDP18S711 | + | Einen guten Einstieg in die Programmierung mit CHIP-8 liefert das Handbuch zum COSMAC VIP (RCA COSMAC VIP CDP18S711 |
Im VIPER-Magazin 1-01 June 1978 werden zusätzliche Hinweise zur Programmierung mit CHIP-8 gegeben. | Im VIPER-Magazin 1-01 June 1978 werden zusätzliche Hinweise zur Programmierung mit CHIP-8 gegeben. | ||
- | Ausgabe VIPER-Magazin 1-02 August 1978 liefert Informationen über die Arbeitsweise des CHIP-8-Interpreters. Es gibt Ablaufpläne und kommentierte Listings. | + | Ausgabe VIPER-Magazin 1-02 August 1978 liefert Informationen über die Arbeitsweise des CHIP-8-Interpreters. Es gibt Ablaufpläne und kommentierte Listings. |
http:// | http:// | ||
+ | |||
+ | | virtueller Prozessor | 16 Register V0..VF\\ Index-/ | ||
+ | | Grafik | 64x32 Pixel, Torus | | ||
+ | | Tastatur | 4x4-Tastenfeld | | ||
+ | | 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 | ||
+ | |||
+ | |||
+ | **Die Virtuelle Maschine** | ||
+ | |||
+ | ==== Speicher ==== | ||
+ | |||
+ | |||
+ | Die CHIP-8 Speicher-Adressen liegen im Bereich von 200h bis FFFh, das reicht für 3.584 Bytes. | ||
+ | Der Grund für den Speicher ab 200h ist, dass im VIP Cosmac und Telmac 1800 die | ||
+ | ersten 512 Byte für den CHIP8-Interpreter reserviert sind. Auf diesen Maschinen | ||
+ | wurden die obersten 256 Bytes (F00h-FFFh auf einem 4K-Maschine) für die Anzeige | ||
+ | aktualisieren vorbehalten, | ||
+ | Call-Stack, den internen Gebrauch, und die Variablen vorbehalten. | ||
+ | |||
+ | ==== Register ==== | ||
+ | |||
+ | |||
+ | CHIP-8 verfügt über 16 8-Bit-Register V0..VF. Das VF-Register dient auch als Carry-Flag. | ||
+ | |||
+ | * 16 x 8-Bit-Register V0..VF | ||
+ | * 16-Bit-Index-/ | ||
+ | * 8-Bit-Register Delay Timer DT | ||
+ | * 8-Bit-Register Sound Timer ST | ||
+ | * (16-Bit Stackregister SP) | ||
+ | * (16-Bit Program Counter PC) | ||
+ | |||
+ | |||
+ | ==== Stack ==== | ||
+ | |||
+ | |||
+ | Der Stack wird nur verwendet, um die Rückkehr-Adressen zu speichern, wenn | ||
+ | Unterprogramme aufgerufen werden. Original ist Speicher für bis zu 12 | ||
+ | Verschachtelungsebenen vorhanden. | ||
+ | |||
+ | ==== Timer ==== | ||
+ | |||
+ | |||
+ | CHIP-8 verfügt über zwei Timer. Beide werden automatisch mit 60 Hz dekrementiert, | ||
+ | Delay Timer DT: Dieser Timer soll für das Timing der Ereignisse von | ||
+ | Spielen verwendet werden. Sein Wert kann eingestellt und gelesen werden. Sound- | ||
+ | Timer ST: Dieser Timer ist für Sound-Effekte gedacht. Solange der Wert ungleich Null | ||
+ | ist, wird ein Piepton erzeugt. | ||
+ | |||
+ | ==== Tastatur ==== | ||
+ | |||
+ | |||
+ | Die Eingabe erfolgt mit einer Hex-Tastatur mit 16 Tasten von 0 bis F. | ||
+ | ' | ||
+ | Es gibt drei Opcodes zur Tastaturabfrage. Eine | ||
+ | überspringt eine Anweisung, wenn eine bestimmte Taste gedrückt wird, eine weitere | ||
+ | überspringt eine Anweisung, wenn eine bestimmte Taste nicht gedrückt wird. Die | ||
+ | dritte wartet auf einen Tastendruck, | ||
+ | Datenregister. | ||
+ | |||
+ | ==== Grafik und Sound ==== | ||
+ | |||
+ | |||
+ | Die Display-Auflösung beträgt 64 × 32 Pixel, und die Farbe ist einfarbig. 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, | ||
+ | invertieren die Farbe der entsprechenden Bildschirm-Pixel, | ||
+ | Sprite-Pixel nichts verändern. | ||
+ | |||
+ | Wenn beim Zeichnen des Sprites alle Bildschirm-Pixel invertiert wurden, wird | ||
+ | das Carry-Flag (VF) wird auf 1 gesetzt, sonst ist es 0. | ||
+ | |||
+ | Wie zuvor beschrieben, | ||
+ | Sound Timer ungleich Null ist. | ||
+ | |||
+ | ==== Opcode Tabelle ==== | ||
+ | |||
+ | |||
+ | CHIP-8 verfügt über 35 Opcodes, die alle zwei Byte lang sind. Das höchstwertige Byte | ||
+ | wird zuerst gespeichert. Die Opcodes sind unten in hexadezimal und mit den folgenden | ||
+ | Symbolen aufgelistet: | ||
+ | |||
+ | * mmm: Adresse | ||
+ | * kk: 8-Bit-Konstante | ||
+ | * n: 4-Bit-Konstante | ||
+ | * x und y: 4-Bit-Register | ||
+ | |||
+ | ^ Hex ^ Symbolisch | ||
+ | | 1mmm | GO mmm | JP addr | Go to 0MMM | | ||
+ | | Bmmm | GO mmm+V0 | ||
+ | | 2mmm | DO mmm | CALL addr | Do subroutine at 0MMM (must end with 00EE) | | ||
+ | | 00EE | RET | RET | Return from subroutine | ||
+ | | 3xkk | SKIP;Vx EQ kk | SE Vx, byte | Skip next instruction if VX = KK | | ||
+ | | 4xkk | SKIP;Vx NE kk | SNE Vx, byte | Skip next instruction if VX <> KK | | ||
+ | | 5xy0 | SKIP;Vx EQ Vy | SE Vx, Vy | Skip next instruction if VX = VY | | ||
+ | | 9xy0 | SKIP;Vx NE Vy | SNE Vx, Vy | Skip next instruction if VX <> VY | | ||
+ | | Ex9E | SKIP;Vx EQ KEY | SKP Vx | Skip next instruction if VX = Hex key (LSD) | | ||
+ | | ExA1 | SKIP;Vx NE KEY | SKNP Vx | Skip next instruction if VX <> Hex key (LSD) | | ||
+ | | 6xkk | Vx=kk | LD Vx, byte | Let VX = KK | | ||
+ | | Cxkk | Vx=RND | ||
+ | | 7xkk | Vx=Vx+kk | ||
+ | | 8xy0 | Vx=Vy | LD Vx, Vy | Let VX = VY | | ||
+ | | 8xy1 | Vx=Vx/ | ||
+ | | 8xy2 | Vx=Vx& | ||
+ | | 8xy4 | Vx=Vx+Vy | ||
+ | | 8xy5 | Vx=Vx-Vy | ||
+ | | Fx07 | Vx=TIME | ||
+ | | Fx0A | Vx=KEY | ||
+ | | Fx15 | TIME=Vx | ||
+ | | Fx18 | SND=Vx | ||
+ | | Ammm | I=mmm | LD I, addr | Let I = 0MMM | | ||
+ | | Fx1E | I=I+Vx | ||
+ | | Fx29 | I=Vx(LSDP) | ||
+ | | Fx33 | MI=Vx(3DD) | ||
+ | | Fx55 | MI=V0: | ||
+ | | Fx65 | V0: | ||
+ | | 00E0 | ERASE | CLS | Erase display (all 0' | ||
+ | | DxyN | SHOW nMI@VxVy | ||
+ | | 0mmm | MLS@mmm | ||
+ | |||
+ | Die Assemblerbezeichungen entsprechen http:// | ||
+ | ==== Beispiel: Panzer ==== | ||
+ | |||
+ | ; Tank, from VIPER vol 1, issue 1 june 1978, pp. 14 | ||
+ | |||
+ | < | ||
+ | 200 6120 init: | ||
+ | 202 6210 V2=10 | ||
+ | 204 A240 I=240 | ||
+ | 206 D127 show: SHOW 7MI@V1V2 ; | ||
+ | 208 6002 key: | ||
+ | 20A E0A1 key1: | ||
+ | 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 ; | ||
+ | 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 | ||
+ | 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 | ||
+ | </ | ||
+ | |||
===== Emulation ===== | ===== Emulation ===== | ||
Zeile 51: | Zeile 256: | ||
* Listenpunkt | * Listenpunkt | ||
+ | |||
+ | EMMA 02 emuliert den COSMAC VIP | ||
+ | |||
+ | VISION8 ist ein CHIP-8-Emulator | ||
+ | |||
+ | CHIPPER V2.11 ist ein Assembler für Chip-8. | ||
===== Z9001 ===== | ===== Z9001 ===== | ||
- | Beim [[sonstiges: | + | Beim [[sonstiges: |
+ | |||
+ | {{: | ||