assembler: better header output
[awish.git] / vm.txt
blobe87d37b30104dae3b2894306f56e3d3a264e04e5
1 all numbers are int16_t
3 126 gvars
4 127 tvars
6 each op:
7   db opcode
8   db arg0
9   db arg1
10   db dvar
11 if argX is 255, then we have 'immediate' 2-byte value
14 opcode:
15   bits 6-7: # of operands (0-3)
16   bits 0-5: opcode (0-31)
18 operands:
19   255: immediate value, else:
20   bits 0-6: variable number
21   bit 7: if set, use global
23 'immediate' for storing: ignore
25 all jumps are absolute offsets (in bytes)
27 spriteid: bit 7 != 0: right (have any meaning only for banks 84 and 90)
29 opcodes:
30 ; opcodes 0-7
31   VM_ADD
32   VM_SUB
33   VM_MUL
34   VM_DIV
35   VM_MOD
36   VM_BOR
37   VM_XOR
38   VM_AND
40 ; opcodes 8-13
41   ; condition jump:
42   ; 3 args: dest, vi0, vi1
43   VM_JEQ  ; ==
44   VM_JNE  ; !=
45   VM_JLS  ; <
46   VM_JLE  ; <=
47   VM_JGR  ; >
48   VM_JGE  ; >=
50 ; opcode 14
51   VM_JMP  ; only 1st arg has any meaning
53 ; opcode 15
54   VM_END  ; stop thread and destroy object
56 ; opcodes 16-17
57   VM_BSR  ; only 1st arg has any meaning
58   VM_RET  ; no args
60 ; opcodes 18-19
61   VM_NEW  ; spawn thread (create new object); arg0: pc (arg1, arg2: args, can be ommited)
62   VM_BRK  ; 'break' until the next frame
64 ; opcode 20
65   VM_SET  ; var, value
67 ; opcode 21
68   ; call 'primitive'
69   VM_RST  ; 1st arg: function id; 2nd and 3rd args: arguments
71 ; working with map: get/set foreground/background
72 ; opcodes 22-25
73   VM_MGF  ; arg1: x; arg2: y; dest
74   VM_MGB  ; arg1: x; arg2: y; dest
75   VM_MSF  ; arg1: x; arg2: y; tile
76   VM_MSB  ; arg1: x; arg2: y; tile
79 death: block 'main' professor thread, remove it's sprite, spawn new 'dying' thread
80        'death' thread will set global flag 'done' when animation is compete
83 thread 0 is 'main' thread: title, professor, etc
85 max threads: 258 (256 objects, 'main' and one for moving lift, etc)