codecin 5.4.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. codecin/__init__.py +27 -0
  2. codecin/aot.py +229 -0
  3. codecin/assembler.py +548 -0
  4. codecin/cache.py +71 -0
  5. codecin/cin.py +2558 -0
  6. codecin/cli.py +282 -0
  7. codecin/config.py +58 -0
  8. codecin/console.py +183 -0
  9. codecin/cpu.py +1654 -0
  10. codecin/crom.py +222 -0
  11. codecin/debugger.py +659 -0
  12. codecin/disasm.py +86 -0
  13. codecin/errors.py +58 -0
  14. codecin/isa.py +457 -0
  15. codecin/jit.py +270 -0
  16. codecin/libcodecin_native.so +0 -0
  17. codecin/logger.py +145 -0
  18. codecin/memory.py +348 -0
  19. codecin/native/aot/aot.go +70 -0
  20. codecin/native/aot/build.go +219 -0
  21. codecin/native/aot/stub_main.go.txt +22 -0
  22. codecin/native/build.ps1 +33 -0
  23. codecin/native/build.sh +48 -0
  24. codecin/native/cmd/codecin/main.go +287 -0
  25. codecin/native/compiler/codegen.go +1938 -0
  26. codecin/native/compiler/compile_test.go +164 -0
  27. codecin/native/compiler/parser.go +1071 -0
  28. codecin/native/compiler/syscalls.go +86 -0
  29. codecin/native/compiler/tokenizer.go +336 -0
  30. codecin/native/compiler/types.go +213 -0
  31. codecin/native/engine/audio.go +152 -0
  32. codecin/native/engine/audio_other.go +46 -0
  33. codecin/native/engine/audio_windows.go +43 -0
  34. codecin/native/engine/canvas.go +271 -0
  35. codecin/native/engine/crom.go +86 -0
  36. codecin/native/engine/encode.go +93 -0
  37. codecin/native/engine/engine_test.go +198 -0
  38. codecin/native/engine/isa_gen.go +445 -0
  39. codecin/native/engine/system.go +190 -0
  40. codecin/native/engine/termux.go +113 -0
  41. codecin/native/engine/version_gen.go +7 -0
  42. codecin/native/engine/vm.go +1157 -0
  43. codecin/native/go.mod +3 -0
  44. codecin/native/ir/ir.go +48 -0
  45. codecin/native/main.go +225 -0
  46. codecin/native.py +336 -0
  47. codecin/registers.py +130 -0
  48. codecin/stats.py +235 -0
  49. codecin-5.4.2.dist-info/METADATA +985 -0
  50. codecin-5.4.2.dist-info/RECORD +54 -0
  51. codecin-5.4.2.dist-info/WHEEL +5 -0
  52. codecin-5.4.2.dist-info/entry_points.txt +2 -0
  53. codecin-5.4.2.dist-info/licenses/LICENSE +7 -0
  54. codecin-5.4.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,198 @@
1
+ package engine
2
+
3
+ import (
4
+ "bytes"
5
+ "compress/zlib"
6
+ "hash/crc32"
7
+ "strings"
8
+ "testing"
9
+
10
+ "codecin-native/ir"
11
+ )
12
+
13
+ // 锁定 docs/SUGGESTIONS.md 批次 B 的引擎侧加固:
14
+ // * decodeBytecode 不再信任不可信头部 (版本 / count / argc / opcode);
15
+ // * 步数用尽报错误而不是伪装成正常停机;
16
+ // * CROM 解压有上限 (zip bomb) 且 mem_size 必须自洽。
17
+
18
+ func tinyProgram() ir.Program {
19
+ return ir.Program{
20
+ Instructions: []ir.Instr{
21
+ {Op: "MOV", Args: []ir.Operand{ir.Reg(0), ir.Imm(42)}},
22
+ {Op: "HALT"},
23
+ },
24
+ Labels: map[string]int{"main": 0},
25
+ DataLabels: map[string]int{},
26
+ }
27
+ }
28
+
29
+ func TestEncodeRunRoundTrip(t *testing.T) {
30
+ prog := tinyProgram()
31
+ bc, err := EncodeProgram(prog, 0)
32
+ if err != nil {
33
+ t.Fatalf("encode: %v", err)
34
+ }
35
+ mem := make([]byte, 4096)
36
+ sp := int64(len(mem) - 8)
37
+ res := Run(bc, mem, 0, sp, int64(len(mem)/2), nil, 1000)
38
+ if res == nil {
39
+ t.Fatal("Run 返回 nil")
40
+ }
41
+ if res.ErrMsg != "" {
42
+ t.Fatalf("意外错误: %s", res.ErrMsg)
43
+ }
44
+ if res.Regs[0] != 42 {
45
+ t.Fatalf("R0 = %d, 期望 42", res.Regs[0])
46
+ }
47
+ }
48
+
49
+ func TestDecodeRejectsMalformedInput(t *testing.T) {
50
+ valid, err := EncodeProgram(tinyProgram(), 0)
51
+ if err != nil {
52
+ t.Fatalf("encode: %v", err)
53
+ }
54
+ if _, _, ok := decodeBytecode(valid); !ok {
55
+ t.Fatal("合法字节码被拒绝")
56
+ }
57
+
58
+ cases := []struct {
59
+ name string
60
+ bc []byte
61
+ }{
62
+ {"empty", []byte{}},
63
+ {"bad_magic", append([]byte("XXXX"), valid[4:]...)},
64
+ {"short", valid[:6]},
65
+ }
66
+ for _, c := range cases {
67
+ if _, _, ok := decodeBytecode(c.bc); ok {
68
+ t.Errorf("%s: 畸形字节码被接受", c.name)
69
+ }
70
+ }
71
+
72
+ // 版本字节
73
+ badVer := append([]byte{}, valid...)
74
+ badVer[4] = 99
75
+ if _, _, ok := decodeBytecode(badVer); ok {
76
+ t.Error("未知版本被接受")
77
+ }
78
+
79
+ // count 声明远超实际长度 (旧实现按 count 预分配 -> OOM)
80
+ huge := []byte{'U', 'C', 'B', 'C', 1, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF}
81
+ if _, _, ok := decodeBytecode(huge); ok {
82
+ t.Error("超大 count 被接受")
83
+ }
84
+
85
+ // argc 与操作码不匹配 (MOV 需要 2 个操作数, 这里声明 0 个)
86
+ argcBad := []byte{'U', 'C', 'B', 'C', 1, 0, 0, 0, 0, 1, 0, 0, 0, opMOV, 0}
87
+ if _, _, ok := decodeBytecode(argcBad); ok {
88
+ t.Error("argc 不匹配的字节码被接受")
89
+ }
90
+
91
+ // 未定义 opcode
92
+ opBad := []byte{'U', 'C', 'B', 'C', 1, 0, 0, 0, 0, 1, 0, 0, 0, 250, 0}
93
+ if _, _, ok := decodeBytecode(opBad); ok {
94
+ t.Error("未知操作码被接受")
95
+ }
96
+ }
97
+
98
+ func TestStepLimitIsAnError(t *testing.T) {
99
+ // JMP 自身 = 死循环
100
+ prog := ir.Program{
101
+ Instructions: []ir.Instr{
102
+ {Op: "JMP", Args: []ir.Operand{ir.Label("loop")}},
103
+ {Op: "HALT"},
104
+ },
105
+ Labels: map[string]int{"loop": 0},
106
+ DataLabels: map[string]int{},
107
+ }
108
+ bc, err := EncodeProgram(prog, 0)
109
+ if err != nil {
110
+ t.Fatalf("encode: %v", err)
111
+ }
112
+ mem := make([]byte, 4096)
113
+ res := Run(bc, mem, 0, int64(len(mem)-8), int64(len(mem)/2), nil, 500)
114
+ if res == nil {
115
+ t.Fatal("Run 返回 nil")
116
+ }
117
+ if res.Status != StatusError {
118
+ t.Fatalf("步数用尽应返回 StatusError, 实际 status=%d", res.Status)
119
+ }
120
+ if !strings.Contains(res.ErrMsg, "limit") {
121
+ t.Fatalf("错误信息应提到 limit, 实际: %q", res.ErrMsg)
122
+ }
123
+ }
124
+
125
+ func TestCromRoundTrip(t *testing.T) {
126
+ data := []byte(strings.Repeat("codecin", 64))
127
+ for _, compress := range []bool{false, true} {
128
+ packed := CromPack(data, compress)
129
+ raw, flags, ok := CromUnpack(packed)
130
+ if !ok {
131
+ t.Fatalf("compress=%v: 解包失败", compress)
132
+ }
133
+ if !bytes.Equal(raw, data) {
134
+ t.Fatalf("compress=%v: 内容不一致", compress)
135
+ }
136
+ if compress && flags&0x01 == 0 {
137
+ t.Fatalf("compress=%v: flags 未标记压缩", compress)
138
+ }
139
+ }
140
+ }
141
+
142
+ func TestCromRejectsBadInput(t *testing.T) {
143
+ // magic / 版本
144
+ if _, _, ok := CromUnpack([]byte("XXXX................")); ok {
145
+ t.Error("坏 magic 被接受")
146
+ }
147
+ bad := CromPack([]byte("abc"), false)
148
+ bad[4] = 99
149
+ if _, _, ok := CromUnpack(bad); ok {
150
+ t.Error("未知版本被接受")
151
+ }
152
+ // CRC 破坏
153
+ bad2 := CromPack([]byte("abcdefgh"), true)
154
+ bad2[len(bad2)-1] ^= 0xFF
155
+ if _, _, ok := CromUnpack(bad2); ok {
156
+ t.Error("CRC 损坏被接受")
157
+ }
158
+ // zip bomb: 头部 mem_size 远小于实际解压长度
159
+ bomb := cromWithDeclaredSize(t, 1024, bytes.Repeat([]byte{0}, 8<<20))
160
+ if _, _, ok := CromUnpack(bomb); ok {
161
+ t.Error("zip bomb 被接受")
162
+ }
163
+ // mem_size 大于实际载荷
164
+ mismatch := cromWithDeclaredSize(t, 1<<20, []byte("short"))
165
+ if _, _, ok := CromUnpack(mismatch); ok {
166
+ t.Error("mem_size 与载荷不符被接受")
167
+ }
168
+ }
169
+
170
+ // cromWithDeclaredSize 手工构造头部 mem_size 与载荷不符的 CROM。
171
+ func cromWithDeclaredSize(t *testing.T, declared uint32, raw []byte) []byte {
172
+ t.Helper()
173
+ var buf bytes.Buffer
174
+ w := zlib.NewWriter(&buf)
175
+ if _, err := w.Write(raw); err != nil {
176
+ t.Fatalf("zlib write: %v", err)
177
+ }
178
+ if err := w.Close(); err != nil {
179
+ t.Fatalf("zlib close: %v", err)
180
+ }
181
+ payload := buf.Bytes()
182
+
183
+ out := make([]byte, 16+len(payload))
184
+ copy(out[0:4], "CROM")
185
+ out[4] = cromVersion
186
+ out[5] = byte(declared)
187
+ out[6] = byte(declared >> 8)
188
+ out[7] = byte(declared >> 16)
189
+ out[8] = byte(declared >> 24)
190
+ out[9] = 0x01 // 压缩
191
+ crc := crc32.ChecksumIEEE(payload)
192
+ out[10] = byte(crc)
193
+ out[11] = byte(crc >> 8)
194
+ out[12] = byte(crc >> 16)
195
+ out[13] = byte(crc >> 24)
196
+ copy(out[16:], payload)
197
+ return out
198
+ }
@@ -0,0 +1,445 @@
1
+ // Code generated by script/gen_native_isa.py from codecin/isa.py; DO NOT EDIT.
2
+ // 单一事实来源: codecin/isa.py Opcode / Syscall / KIND_* 常量.
3
+ // 修改指令集后运行: python script/gen_native_isa.py
4
+
5
+ package engine
6
+
7
+ // 操作数种类 (与 isa.py KIND_* 一致)
8
+ const kindReg = 0
9
+ const kindImm = 1
10
+ const kindVec = 2
11
+ const kindVecLane = 3
12
+ const kindMem = 4
13
+ const kindCond = 5
14
+ const kindFloat = 6
15
+ const kindStr = 7
16
+
17
+ // 操作码 (与 isa.py Opcode 完整一致; 原生 VM 仅实现子集, 见 vm.go opcodeSupported)
18
+ const opMOV = 0
19
+ const opLOAD = 1
20
+ const opSTORE = 2
21
+ const opADD = 3
22
+ const opSUB = 4
23
+ const opMUL = 5
24
+ const opDIV = 6
25
+ const opAND = 7
26
+ const opOR = 8
27
+ const opXOR = 9
28
+ const opSHL = 10
29
+ const opSHR = 11
30
+ const opINC = 12
31
+ const opDEC = 13
32
+ const opCMP = 14
33
+ const opJMP = 15
34
+ const opJZ = 16
35
+ const opJNZ = 17
36
+ const opJE = 18
37
+ const opJL = 19
38
+ const opJG = 20
39
+ const opPUSH = 21
40
+ const opPOP = 22
41
+ const opCALL = 23
42
+ const opRET = 24
43
+ const opIN = 25
44
+ const opOUT = 26
45
+ const opHALT = 27
46
+ const opADDS = 28
47
+ const opSUBS = 29
48
+ const opADDC = 30
49
+ const opSUBC = 31
50
+ const opLSL = 32
51
+ const opLSR = 33
52
+ const opASR = 34
53
+ const opROR = 35
54
+ const opMVN = 36
55
+ const opEOR = 37
56
+ const opBIC = 38
57
+ const opORN = 39
58
+ const opLDR = 40
59
+ const opSTR = 41
60
+ const opLDP = 42
61
+ const opSTP = 43
62
+ const opCBZ = 44
63
+ const opCBNZ = 45
64
+ const opTBZ = 46
65
+ const opTBNZ = 47
66
+ const opB = 48
67
+ const opBL = 49
68
+ const opBR = 50
69
+ const opNOP = 51
70
+ const opWFE = 52
71
+ const opWFI = 53
72
+ const opSEV = 54
73
+ const opCSEL = 55
74
+ const opCSINC = 56
75
+ const opCSINV = 57
76
+ const opCSNEG = 58
77
+ const opSXTB = 59
78
+ const opSXTH = 60
79
+ const opSXTW = 61
80
+ const opUXTB = 62
81
+ const opUXTH = 63
82
+ const opCLZ = 64
83
+ const opCLS = 65
84
+ const opRBIT = 66
85
+ const opREV = 67
86
+ const opFADD = 68
87
+ const opFSUB = 69
88
+ const opFMUL = 70
89
+ const opFDIV = 71
90
+ const opFCMP = 72
91
+ const opFCVT = 73
92
+ const opFABS = 74
93
+ const opFNEG = 75
94
+ const opLDRS = 76
95
+ const opSTRS = 77
96
+ const opVADD = 78
97
+ const opVSUB = 79
98
+ const opVMUL = 80
99
+ const opVDIV = 81
100
+ const opVLD1 = 82
101
+ const opVST1 = 83
102
+ const opLB = 84
103
+ const opLH = 85
104
+ const opLW = 86
105
+ const opLD = 87
106
+ const opSB = 88
107
+ const opSH = 89
108
+ const opSW = 90
109
+ const opSD = 91
110
+ const opADDI = 92
111
+ const opSLTI = 93
112
+ const opSLTIU = 94
113
+ const opXORI = 95
114
+ const opORI = 96
115
+ const opANDI = 97
116
+ const opSLLI = 98
117
+ const opSRLI = 99
118
+ const opSRAI = 100
119
+ const opBEQ = 101
120
+ const opBNE = 102
121
+ const opBLT = 103
122
+ const opBGE = 104
123
+ const opBLTU = 105
124
+ const opBGEU = 106
125
+ const opJALR = 107
126
+ const opJAL = 108
127
+ const opLUI = 109
128
+ const opAUIPC = 110
129
+ const opSYS = 111
130
+
131
+ // 操作码名 -> 编码 (供 UCBC 编码器使用)
132
+ var opcodeByName = map[string]uint8{
133
+ "MOV": opMOV,
134
+ "LOAD": opLOAD,
135
+ "STORE": opSTORE,
136
+ "ADD": opADD,
137
+ "SUB": opSUB,
138
+ "MUL": opMUL,
139
+ "DIV": opDIV,
140
+ "AND": opAND,
141
+ "OR": opOR,
142
+ "XOR": opXOR,
143
+ "SHL": opSHL,
144
+ "SHR": opSHR,
145
+ "INC": opINC,
146
+ "DEC": opDEC,
147
+ "CMP": opCMP,
148
+ "JMP": opJMP,
149
+ "JZ": opJZ,
150
+ "JNZ": opJNZ,
151
+ "JE": opJE,
152
+ "JL": opJL,
153
+ "JG": opJG,
154
+ "PUSH": opPUSH,
155
+ "POP": opPOP,
156
+ "CALL": opCALL,
157
+ "RET": opRET,
158
+ "IN": opIN,
159
+ "OUT": opOUT,
160
+ "HALT": opHALT,
161
+ "ADDS": opADDS,
162
+ "SUBS": opSUBS,
163
+ "ADDC": opADDC,
164
+ "SUBC": opSUBC,
165
+ "LSL": opLSL,
166
+ "LSR": opLSR,
167
+ "ASR": opASR,
168
+ "ROR": opROR,
169
+ "MVN": opMVN,
170
+ "EOR": opEOR,
171
+ "BIC": opBIC,
172
+ "ORN": opORN,
173
+ "LDR": opLDR,
174
+ "STR": opSTR,
175
+ "LDP": opLDP,
176
+ "STP": opSTP,
177
+ "CBZ": opCBZ,
178
+ "CBNZ": opCBNZ,
179
+ "TBZ": opTBZ,
180
+ "TBNZ": opTBNZ,
181
+ "B": opB,
182
+ "BL": opBL,
183
+ "BR": opBR,
184
+ "NOP": opNOP,
185
+ "WFE": opWFE,
186
+ "WFI": opWFI,
187
+ "SEV": opSEV,
188
+ "CSEL": opCSEL,
189
+ "CSINC": opCSINC,
190
+ "CSINV": opCSINV,
191
+ "CSNEG": opCSNEG,
192
+ "SXTB": opSXTB,
193
+ "SXTH": opSXTH,
194
+ "SXTW": opSXTW,
195
+ "UXTB": opUXTB,
196
+ "UXTH": opUXTH,
197
+ "CLZ": opCLZ,
198
+ "CLS": opCLS,
199
+ "RBIT": opRBIT,
200
+ "REV": opREV,
201
+ "FADD": opFADD,
202
+ "FSUB": opFSUB,
203
+ "FMUL": opFMUL,
204
+ "FDIV": opFDIV,
205
+ "FCMP": opFCMP,
206
+ "FCVT": opFCVT,
207
+ "FABS": opFABS,
208
+ "FNEG": opFNEG,
209
+ "LDRS": opLDRS,
210
+ "STRS": opSTRS,
211
+ "VADD": opVADD,
212
+ "VSUB": opVSUB,
213
+ "VMUL": opVMUL,
214
+ "VDIV": opVDIV,
215
+ "VLD1": opVLD1,
216
+ "VST1": opVST1,
217
+ "LB": opLB,
218
+ "LH": opLH,
219
+ "LW": opLW,
220
+ "LD": opLD,
221
+ "SB": opSB,
222
+ "SH": opSH,
223
+ "SW": opSW,
224
+ "SD": opSD,
225
+ "ADDI": opADDI,
226
+ "SLTI": opSLTI,
227
+ "SLTIU": opSLTIU,
228
+ "XORI": opXORI,
229
+ "ORI": opORI,
230
+ "ANDI": opANDI,
231
+ "SLLI": opSLLI,
232
+ "SRLI": opSRLI,
233
+ "SRAI": opSRAI,
234
+ "BEQ": opBEQ,
235
+ "BNE": opBNE,
236
+ "BLT": opBLT,
237
+ "BGE": opBGE,
238
+ "BLTU": opBLTU,
239
+ "BGEU": opBGEU,
240
+ "JALR": opJALR,
241
+ "JAL": opJAL,
242
+ "LUI": opLUI,
243
+ "AUIPC": opAUIPC,
244
+ "SYS": opSYS,
245
+ }
246
+
247
+ // 每个操作码的参数个数 (-1 表示变长, 不校验);
248
+ // 与 isa.py Constants.ARG_COUNTS 一致。原生 VM 用它校验不可信字节码,
249
+ // 避免 argc 与操作码不匹配时 execute 里 args[i] 越界 panic。
250
+ var argCounts = [112]int16{
251
+ opMOV: 2,
252
+ opLOAD: 2,
253
+ opSTORE: 2,
254
+ opADD: 2,
255
+ opSUB: 2,
256
+ opMUL: 2,
257
+ opDIV: 2,
258
+ opAND: 2,
259
+ opOR: 2,
260
+ opXOR: 2,
261
+ opSHL: 2,
262
+ opSHR: 2,
263
+ opINC: 1,
264
+ opDEC: 1,
265
+ opCMP: 2,
266
+ opJMP: 1,
267
+ opJZ: 1,
268
+ opJNZ: 1,
269
+ opJE: 1,
270
+ opJL: 1,
271
+ opJG: 1,
272
+ opPUSH: 1,
273
+ opPOP: 1,
274
+ opCALL: 1,
275
+ opRET: 0,
276
+ opIN: 1,
277
+ opOUT: 1,
278
+ opHALT: 0,
279
+ opADDS: 3,
280
+ opSUBS: 3,
281
+ opADDC: 3,
282
+ opSUBC: 3,
283
+ opLSL: 3,
284
+ opLSR: 3,
285
+ opASR: 3,
286
+ opROR: 3,
287
+ opMVN: 2,
288
+ opEOR: 3,
289
+ opBIC: 3,
290
+ opORN: 3,
291
+ opLDR: 2,
292
+ opSTR: 2,
293
+ opLDP: 3,
294
+ opSTP: 3,
295
+ opCBZ: 2,
296
+ opCBNZ: 2,
297
+ opTBZ: 3,
298
+ opTBNZ: 3,
299
+ opB: -1,
300
+ opBL: 1,
301
+ opBR: 1,
302
+ opNOP: 0,
303
+ opWFE: 0,
304
+ opWFI: 0,
305
+ opSEV: 0,
306
+ opCSEL: 4,
307
+ opCSINC: 4,
308
+ opCSINV: 4,
309
+ opCSNEG: 4,
310
+ opSXTB: 2,
311
+ opSXTH: 2,
312
+ opSXTW: 2,
313
+ opUXTB: 2,
314
+ opUXTH: 2,
315
+ opCLZ: 2,
316
+ opCLS: 2,
317
+ opRBIT: 2,
318
+ opREV: 2,
319
+ opFADD: 3,
320
+ opFSUB: 3,
321
+ opFMUL: 3,
322
+ opFDIV: 3,
323
+ opFCMP: 2,
324
+ opFCVT: 2,
325
+ opFABS: 2,
326
+ opFNEG: 2,
327
+ opLDRS: 2,
328
+ opSTRS: 2,
329
+ opVADD: 3,
330
+ opVSUB: 3,
331
+ opVMUL: 3,
332
+ opVDIV: 3,
333
+ opVLD1: 2,
334
+ opVST1: 2,
335
+ opLB: 2,
336
+ opLH: 2,
337
+ opLW: 2,
338
+ opLD: 2,
339
+ opSB: 2,
340
+ opSH: 2,
341
+ opSW: 2,
342
+ opSD: 2,
343
+ opADDI: 3,
344
+ opSLTI: 3,
345
+ opSLTIU: 3,
346
+ opXORI: 3,
347
+ opORI: 3,
348
+ opANDI: 3,
349
+ opSLLI: 3,
350
+ opSRLI: 3,
351
+ opSRAI: 3,
352
+ opBEQ: 3,
353
+ opBNE: 3,
354
+ opBLT: 3,
355
+ opBGE: 3,
356
+ opBLTU: 3,
357
+ opBGEU: 3,
358
+ opJALR: -1,
359
+ opJAL: 2,
360
+ opLUI: 2,
361
+ opAUIPC: 2,
362
+ opSYS: -1,
363
+ }
364
+
365
+ // SYS 功能号 (与 isa.py Syscall 一致)
366
+ const sysSQRT = 0
367
+ const sysPOW = 1
368
+ const sysABS = 2
369
+ const sysSIN = 3
370
+ const sysCOS = 4
371
+ const sysTAN = 5
372
+ const sysFADD = 6
373
+ const sysFSUB = 7
374
+ const sysFMUL = 8
375
+ const sysFDIV = 9
376
+ const sysFCMP = 10
377
+ const sysFTOI = 11
378
+ const sysITOF = 12
379
+ const sysRAND = 13
380
+ const sysSRAND = 14
381
+ const sysTIME = 15
382
+ const sysSTRLEN = 16
383
+ const sysSTRCMP = 17
384
+ const sysSTRCPY = 18
385
+ const sysSTRCAT = 19
386
+ const sysMALLOC = 20
387
+ const sysPRINTFLO = 21
388
+ const sysITOA = 22
389
+ const sysFTOA = 23
390
+ const sysPRINTSTR = 24
391
+ const sysSTRCONCAT = 25
392
+ const sysBOOLSTR = 26
393
+ const sysABORT = 27
394
+ const sysSUBSTR = 28
395
+ const sysINDEXOF = 29
396
+ const sysTOUPPER = 30
397
+ const sysTOLOWER = 31
398
+ const sysFLOOR = 32
399
+ const sysCEIL = 33
400
+ const sysROUND = 34
401
+ const sysATOI = 35
402
+ const sysTRIM = 36
403
+ const sysLTRIM = 37
404
+ const sysRTRIM = 38
405
+ const sysAUDIOPLAY = 39
406
+ const sysAUDIOSTOP = 40
407
+ const sysAUDIOVOL = 41
408
+ const sysAUDIOWAIT = 42
409
+ const sysCANVASNEW = 43
410
+ const sysCANVASSET = 44
411
+ const sysCANVASRECT = 45
412
+ const sysCANVASCIRC = 46
413
+ const sysCANVASTEXT = 47
414
+ const sysCANVASLINE = 48
415
+ const sysCANVASSAVE = 49
416
+ const sysCANVASSHOW = 50
417
+ const sysFILEREAD = 51
418
+ const sysFILEWRITE = 52
419
+ const sysFILEAPPEND = 53
420
+ const sysFILEEXISTS = 54
421
+ const sysFILEDELETE = 55
422
+ const sysFILESIZE = 56
423
+ const sysMKDIR = 57
424
+ const sysDIRLIST = 58
425
+ const sysEXEC = 59
426
+ const sysEXECOUTPUT = 60
427
+ const sysGETENV = 61
428
+ const sysSETENV = 62
429
+ const sysOSNAME = 63
430
+ const sysHOSTNAME = 64
431
+ const sysUSERNAME = 65
432
+ const sysCWD = 66
433
+ const sysHOMEDIR = 67
434
+ const sysTERMUXAVAIL = 68
435
+ const sysTERMUXNOTIFY = 69
436
+ const sysTERMUXTOAST = 70
437
+ const sysTERMUXCLIPGET = 71
438
+ const sysTERMUXCLIPSET = 72
439
+ const sysTERMUXBATTERY = 73
440
+ const sysTERMUXVIBRATE = 74
441
+ const sysTERMUXTTS = 75
442
+ const sysTERMUXLOCATION = 76
443
+ const sysTERMUXWIFI = 77
444
+ const sysTERMUXDIALOG = 78
445
+ const sysTERMUXSMS = 79