-
Notifications
You must be signed in to change notification settings - Fork 28
PLASMA Byte Codes
David Schmenk edited this page Apr 16, 2018
·
5 revisions
The compact code representation comes through the use of opcodes closely matched to the PLASMA compiler.
TOS: Top Of Stack value
NOS: Next On Stack value (TOS-1)
| OPCODE | Name | Description | Operation |
|---|---|---|---|
| $00-$1F | CN | Constant Nybble | OPCODE/2 ==> TOS |
| $20 | MINUS_ONE | constant -1 | -1 ==> TOS |
| $22 | BREQ | Branch EQual | NOS == TOS ?? IP = IP + OFFSET |
| $24 | BRNE | Branch Not Equal | NOS <> TOS ?? IP = IP + OFFSET |
| $26 | LA | Load Address | ABSOLUTE ADDR ==> TOS |
| $28 | LLA | Load Local Address | LOCAL ADDR ==> TOS |
| $2A | CB | Constant Byte | CONSTANT BYTE ==> TOS |
| $2C | CW | Constant Word | CONSTANT WORD ==> TOS |
| $2E | CS | Constant String | STRING ADDR ==> TOS |
| $30 | DROP | DROP top value | TOS ==> |
| $32 | DROP2 | DROP top 2 values | NOS, TOS ==> |
| $34 | DUP | DUPlicate top value | TOS ==> TOS |
| $36 | DIVMOD | DIVide & MOD tos,nos | NOS / TOS ==> TOS, NOS % TOS ==> NOS |
| $38 | ADDI | ADD Immediate byte | TOS + IMM8 ==> TOS |
| $3A | SUBI | SUB Immediate byte | TOS - IMM8 ==> TOS |
| $3C | ANDI | AND Immediate byte | TOS & IMM8 ==> TOS |
| $3E | ORI | OR Immediate byte | TOS | IMM8 ==> TOS |
| $40 | ISEQ | IS nos EQual tos | NOS == TOS ==> TOS |
| $42 | ISNE | IS nos Not Equal to tos | NOS <> TOS ==> TOS |
| $44 | ISGT | IS nos Greater Than tos | NOS > TOS ==> TOS |
| $46 | ISLT | IS nos Less Than tos | NOS < TOS ==> TOS |
| $48 | ISGE | IS nos Greater or Equal to tos | NOS >= TOS ==> TOS |
| $4A | ISLE | IS nos Less or Equal to tos | NOS <= TOS ==> TOS |
| $4C | BRFLS | BRanch FaLSe | TOS == 0 ?? IP = IP + OFFSET |
| $4E | BRTRU | BRanch TRUe | TOS <> 0 ?? IP = IP + OFFSET |
| $50 | BRNCH | BRaNCH | IP = IP + OFFSET |
| $52 | SEL | SELect cases | TOS == CASE ?? IP = IP + OFFSET (FOR ALL CASES) |
| $54 | CALL | CALL address | PUSH(IP+2), IP = ADDRESS |
| $56 | ICAL | Indirect CALl | PUSH(IP+2), IP = TOS |
| $58 | ENTER | ENTER frame size, param count | FP = FP - FRAME SIZE, PARAMS ==> LOCALS |
| $5A | LEAVE | LEAVE frame size | FP = FP + FRAME SIZE, IP = PULL() |
| $5C | RET | RETurn | IP = PULL() |
| $5E | CFFB | Constant $FF Byte | CONSTANT BYTE + $FF00 ==> TOS |
| $60 | LB | Load Byte | (TOS) ==> TOS |
| $62 | LW | Load Word | (TOS) ==> TOS |
| $64 | LLB | Load Local Byte | FP[LOCAL] ==> TOS |
| $66 | LLW | Load Local Word | FP[LOCAL] ==> TOS |
| $68 | LAB | Load Absolute Byte | MEM[ADDR] ==> TOS |
| $6A | LAW | Load Absolute Word | MEM[ADDR] ==> TOS |
| $6C | DLB | Duplicate to Local Byte | TOS ==> FP[LOCAL], TOS ==> TOS |
| $6E | DLW | Duplicate to Local Word | TOS ==> FP[LOCAL], TOS ==> TOS |
| $70 | SB | Store Byte | NOS ==> (TOS) |
| $72 | SW | Store Word | NOS ==> (TOS) |
| $74 | SLB | Store Local Byte | TOS ==> FP[LOCAL] |
| $76 | SLW | Store Local Word | TOS ==> FP[LOCAL] |
| $78 | SAB | Store Absolute Byte | TOS ==> MEM[ADDR] |
| $7A | SAW | Store Absolute Word | TOS ==> MEM[ADDR] |
| $7C | DAB | Duplicate to Absolute Byte | TOS ==> MEM[ADDR], TOS ==> TOS |
| $7E | DAW | Duplicate to Absolute Word | TOS ==> MEM[ADDR], TOS ==> TOS |
| $80 | NOT | logical NOT | !TOS ==> TOS |
| $82 | ADD | ADD nos to tos | NOS + TOS ==> TOS |
| $84 | SUB | SUBtract tos from nos | NOS - TOS ==> TOS |
| $86 | MUL | MULtiply nos times tos | NOS * TOS ==> TOS |
| $88 | DIV | DIVide nos by tos | NOS / TOS ==> TOS |
| $8A | MOD | MODulo nos by tos | NOS % TOS ==> TOS |
| $8C | INCR | INCRement tos | TOS + 1 ==> TOS |
| $8E | DECR | DECRement tos | TOS - 1 ==> TOS |
| $90 | NEG | NEGate tos | -TOS ==> TOS |
| $92 | COMP | COMPliment tos | ~TOS ==> TOS |
| $94 | AND | bitwise AND | NOS & TOS ==> TOS |
| $96 | IOR | bitwise Inclusive OR | NOS | TOS ==> TOS |
| $98 | XOR | bitwise eXclusive OR | NOS ^ TOS ==> TOS |
| $9A | SHL | SHift Left | NOS << TOS ==> TOS |
| $9C | SHR | SHift Right | NOS >> TOS ==> TOS |
| $9E | IDXW | InDeX Word | TOS * 2 + NOS ==> TOS |
| $A0 | BRGT | BRanch GReater than (FOR/NEXT) | TOS > NOS ?? IP = IP + OFFSET |
| $A2 | BRLT | BRanch Less Than (FOR/NEXT) | TOS < NOS ?? IP = IP + OFFSET |
| $A4 | INCBRLE | INCrement, BRanch Less Equal (FOR/NEXT) | TOS + 1 ==> TOS, TOS <= NOS ?? IP = IP + OFFSET |
| $A6 | ADDBRLE | ADD, BRanch Less Equal (FOR/NEXT) | NOS + TOS ==> TOS, TOS <= NOS ?? IP = IP + OFFSET |
| $A8 | DECBRGE | DECrement, BRanch Greater Equal (FOR/NEXT) | TOS - 1 ==> TOS, TOS >= NOS ?? IP = IP + OFFSET |
| $AA | SUBBRGE | SUBtract, BRanch GReater Equal (FOR/NEXT) | NOS = TOS ==> TOS, TOS >= NOS :: IP = IP + OFFSET |
| $AC | BRAND | BRanch AND (SHORT CIRCUIT) | TOS == 0 ?? IP = IP + OFFSET :: TOS ==> TOS |
| $AE | BROR | BRanch OR (SHORT CIRCUIT) | TOS <> 0 ?? IP = IP + OFFSET :: TOS ==> TOS |
| $B0 | ADDLB | ADD Local Byte | TOS + FP[LOCAL] ==> TOS |
| $B2 | ADDLW | ADD Local Word | TOS + FP[LOCAL] ==> TOS |
| $B4 | ADDAB | ADD Absolute Byte | TOS + MEM[ADDR] ==> TOS |
| $B6 | ADDAW | ADD Absolute Word | TOS + MEM[ADDR] ==> TOS |
| $B8 | IDXLB | INDeX word by Local Byte | TOS + FP[LOCAL] * 2 ==> TOS |
| $BA | IDXLW | INDeX word by Local Word | TOS + FP[LOCAL] * 2 ==> TOS |
| $BC | IDXAB | INDeX word by Absolute Byte | TOS + MEM[ADDR] * 2 ==> TOS |
| $BE | IDXAW | INDeX word by Absolute Word | TOS + MEM[ADDR] * 2 ==> TOS |
| $C0 | NATV | back to in-line NATiVe code | JUMP (IP) |
Bytecode interpreters: 6502, 65802
Bytecode compilers: 6502, 65802, Just-In-Time Compiler Implementation