Der GMC-4 Befehlssatz

Der GMC-4 verfügt über einen einfachen Befehlssatz, der an Assembler angelehnt ist, teilweise aber auch höhere Funktionen enthält, hinter denen sich komplexe Unterprogramme des Interpreters verstecken.
Es gibt vier 4-Bit-Register A, B, Y und Z und einen zusätzlichen zweiten Registersatz A‘, B‘, Y‘ und Z‘. Jedes dieser Register kann eine Zahl zwischen 0 und 15 enthalten. Die meisten Befehle verwenden das Register A.
Zusätzlich gibt es ein Flag, also einen 1-Bit-Merker, der wie eine Flagge hoch- oder runtergesetzt werden kann. Viele Befehle setzen das Flag grundsätzlich auf 1, andere setzen es in Abhängigkeit von der jeweiligen Aktion wahlweise auf Null oder Eins. Der Zustand des Flags wird vom Sprungbefehl ausgewertet. Der Sprung zur angegebenen Adresse wird nur dann ausgeführt, wenn Flag=1 ist.
Code | Befehl | Wirkung | Flag | Kommentar |
0 | KA | A=K | 0, 1 | Tastendruck nach A übernehmen, Flag = 0 bei Tastendruck, sonst Flag = 1 (KA = Key to A) |
1 | AO | Op=A | 1 | A an Siebensegmentanzeige ausgeben (AO = A to Output) |
2 | CH | A<=>B Y<=>Z | 1 | Tausche A und B sowie Y und Z (CH = Change) |
3 | CY | Ar<=>Yr | 1 | Austausch der Inhalte von A und Y (CY = Change A and Y) |
4 | AM | M=A | 1 | A in RAM-Adr (50+Y) kopieren (AM = A to Memory) |
5 | MA | A=M | 1 | RAM-Adr (50+Y) in A zurücklesen (MA = Memory to A) |
6 | M+ | A=M+A | 0, 1 | RAM-Adr (50+Y) zu A addieren, bei Überlauf: Flag = 1 |
7 | M- | A=M-A | 0, 1 | RAM-Adr (50+Y) von A subtrahieren, bei Überlauf: Flag = 1 |
8 | TIA [ ] | A=[ ] | 1 | Konstante in A laden (TIA = Transfer Immediate to A) |
9 | AIA [ ] | A=A+[ ] | 0, 1 | Konstante zu A addieren, bei Überlauf: Flag = 1 (AIA = Add Immediate to A) |
A | TIY [ ] | Y=[ ] | 1 | Konstante in Y laden (TIY = Transfer Immediate to Y) |
B | AIY [ ] | Y=Y+[ ] | 0, 1 | Konstante zu Y addieren, bei Überlauf: Flag = 1 (AIY = Add Immediate to Y) |
C | CIA [ ] | A=[ ] ? | 0, 1 | A mit Konstante vergleichen, bei Übereinstimmung: Flag =0 (Compare Immediate and A) |
D | CIY [ ] | Y=[ ] ? | 0, 1 | Y mit Konstante vergleichen, bei Übereinstimmung: Flag =0 (Compare Immediate and Y) |
E | CAL | — | — | Unterprogrammaufrufe, Erweiterte Befehle (Call) |
F | JUMP [ ] [ ] | Adr= [ ] [ ] | 1 | Direkter Sprung zur Adresse [High] [Low] wenn Flag = 1 |
Unterprogramme:
Code | Befehl | Flag | Kommentar |
E 0 | CAL RSTO | 1 | Siebensegmentanzeige löschen |
E 1 | CAL SETR | 1 | Einzelne LED einschalten. In Y wird die Nummer der LED (0-6) übergeben. |
E 2 | CAL RSTR | 1 | Einzelne LED ausschalten. In Y wird die Nummer der LED (0-6) übergeben. |
E4 | CAL CMPL | 1 | Komplement des A-Registers (aus F wird 0) |
E 5 | CAL CHNG | 1 | Inhalte der Register A,B,Y,Z mit A‘,B‘,Y‘,Z‘ tauschen |
E 6 | CAL SIFT | 0, 1 | A-Register bitweise nach recht schieben. Flag wird 1 wenn das rechte Bit 0 war. |
E 7 | CAL ENDS | 1 | Ende-Sound |
E 8 | CAL ERRS | 1 | Error-Sound |
E 9 | CAL SHTS | 1 | Kurzer Ton |
E A | CAL LONS | 1 | Langer Ton |
E B | CAL SUND | 1 | Note spielen, die im A-Register übergeben wird (1 … E) |
E C | CAL TIMR | 1 | (A + 1) * 0,1 Sekunden warten |
E D | CAL DSPR | 1 | Ausgabe der RAM-Adressen 5F (high) und 5E (low) an die LEDs |