# === BYTECODE SPECIFICATION ========================================= # Used by the compiler and VM. Kind of like a dino.h DATA: $VERSION is number $DEBUG is number $HEADER is number vector $HEADER* is number # offsets $OFFSET.CODE is number $OFFSET.VARS is number $OFFSET.TEXT is number $OFFSET.ARGV is number $OFFSET.TVAR is number $OFFSET.TLIT is number # constants $MAX.ARGS is number $TYPES is number vector $TYPENAMES is text vector # cpu instructions $CODES is number vector $NAMES is text vector $SIZES is number vector # numeric register addresses $A is number $X is number $Y is number $Z is number $C is number $E is number $I is number $T is number $SP is number $PC is number $AC is number # text register addresses @A is number @X is number @Y is number @T is number @E is number @ARGV is number # private $opname is text $opnum is number PROCEDURE: # bytecode format version store 2 in $VERSION # debug mode (does nothing) store 0 in $DEBUG # memory offsets store 5 in $OFFSET.CODE # First instruction store 16 in $OFFSET.VARS # 0x0010 - num variables store 12288 in $OFFSET.TEXT # 0x3000 - text registers store 12304 in $OFFSET.ARGV # 0x3010 - command line arguments store 12320 in $OFFSET.TVAR # 0x3020 - text variables store 16384 in $OFFSET.TLIT # 0x4000 - text literals # constants store 16 in $MAX.ARGS store 1 in $TYPES:"NUM" store 2 in $TYPES:"TXT" store 3 in $TYPES:"NMV" # number vector store 4 in $TYPES:"TXV" # text vector store 5 in $TYPES:"NML" # number literal store 6 in $TYPES:"TXL" # text literal store 7 in $TYPES:"LBL" # label store 8 in $TYPES:"SYM" # symbol like > or >= store "NUM" in $TYPENAMES:$TYPES:"NUM" store "TXT" in $TYPENAMES:$TYPES:"TXT" store "NMV" in $TYPENAMES:$TYPES:"NMV" store "TXV" in $TYPENAMES:$TYPES:"TXV" store "NML" in $TYPENAMES:$TYPES:"NML" store "TXL" in $TYPENAMES:$TYPES:"TXL" store "LBL" in $TYPENAMES:$TYPES:"LBL" store "SYM" in $TYPENAMES:$TYPES:"SYM" # bytecode header store character code of "L" in $HEADER:0 store character code of "D" in $HEADER:1 store character code of "P" in $HEADER:2 store character code of "L" in $HEADER:3 store $VERSION in $HEADER:4 store 5 in $HEADER* # num registers store 0 in $A store 1 in $X store 2 in $Y store 3 in $Z store 4 in $C store 5 in $E store 6 in $I store 7 in $T store 8 in $SP store 9 in $PC store 10 in $AC # text registers store $OFFSET.TEXT in @A add @A and 1 in @X add @X and 1 in @Y add @Y and 1 in @T add @T and 1 in @E store $OFFSET.ARGV in @ARGV store 1 in $opnum # make it easy to shuffle codes around for now # === CONTROL FLOW =================================================== store "JUMP" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "JIF" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "JIT" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "CALL" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "RETURN" in $opname store $opnum in $CODES:$opname store 0 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "EXIT" in $opname store $opnum in $CODES:$opname store 0 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "WAIT" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum # === MEMORY COMMANDS =============================================== store "STORE" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "SET" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "FETCH" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "PUSH" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "POP" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "STOREV" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "PUTV" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum # === ARITHMETIC ===================================================== store "EQ" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "GT" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "GTE" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "LT" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "LTE" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "ADD" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "SUB" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "MUL" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "DIV" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "MOD" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "ABS" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "CEIL" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "FLOOR" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "RANDOM" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "INCR" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "DECR" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum # === I/O COMMANDS ================================================== store "PRINT" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "PRINL" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "ACCEPT" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "ACCEOF" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "EXEC" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "EXECO" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "EXECC" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "READ" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "WRITE" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "APPEND" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum # === TEXT OPERATIONS =============================================== store "LEN" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "JOIN" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "GETC" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "GETCC" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "GETIDX" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "PUTCC" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "COUNT" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "SUBSTR" in $opname store $opnum in $CODES:$opname store 4 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "SPLIT" in $opname store $opnum in $CODES:$opname store 3 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "REPLCE" in $opname store $opnum in $CODES:$opname store 4 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "TRIM" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum # === VECTOR OPERATIONS ============================================= store "CLEAR" in $opname store $opnum in $CODES:$opname store 1 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "COPY" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "INDEXC" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum store "INDEXS" in $opname store $opnum in $CODES:$opname store 2 in $SIZES:$CODES:$opname store $opname in $NAMES:$CODES:$opname incr $opnum