summaryrefslogtreecommitdiff
path: root/components/finsh/finsh_ops.h
blob: 0cc945f078e042464f3087fb7f854d7be56da905 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2010-03-22     Bernard      first version
 */
#ifndef __FINSH_OP_H__
#define __FINSH_OP_H__

#include "finsh_vm.h"

/*
 * FinC VM specification
 * Memory
 * .VAR
 *
 * .STACK
 *
 * .HEAP
 *
 * .TEXT
 * OP [op1]
 */

#define FINSH_OP_NOOP           0x00

/* add @ r1 = r2 + r3 */
#define FINSH_OP_ADD_BYTE       0x01
#define FINSH_OP_ADD_WORD       0x02
#define FINSH_OP_ADD_DWORD      0x03

/* sub @ r1 = r2 - r3 */
#define FINSH_OP_SUB_BYTE       0x04
#define FINSH_OP_SUB_WORD       0x05
#define FINSH_OP_SUB_DWORD      0x06

/* div @ r1 = r2 / r3 */
#define FINSH_OP_DIV_BYTE       0x07
#define FINSH_OP_DIV_WORD       0x08
#define FINSH_OP_DIV_DWORD      0x09

/* mod @ r1 = r2 % r3 */
#define FINSH_OP_MOD_BYTE       0x0A
#define FINSH_OP_MOD_WORD       0x0B
#define FINSH_OP_MOD_DWORD      0x0C

/* mul @ r1 = r2 * r3 */
#define FINSH_OP_MUL_BYTE       0x0D
#define FINSH_OP_MUL_WORD       0x0E
#define FINSH_OP_MUL_DWORD      0x0F

/* and @ r1 = r2 & r3 */
#define FINSH_OP_AND_BYTE       0x10
#define FINSH_OP_AND_WORD       0x11
#define FINSH_OP_AND_DWORD      0x12

/* or  @ r1 = r2 | r3 */
#define FINSH_OP_OR_BYTE        0x13
#define FINSH_OP_OR_WORD        0x14
#define FINSH_OP_OR_DWORD       0x15

/* xor @ r1 = r2 ^ r3 */
#define FINSH_OP_XOR_BYTE       0x16
#define FINSH_OP_XOR_WORD       0x17
#define FINSH_OP_XOR_DWORD      0x18

/* bw  @ r1 = ~r2 */
#define FINSH_OP_BITWISE_BYTE   0x19
#define FINSH_OP_BITWISE_WORD   0x1A
#define FINSH_OP_BITWISE_DWORD  0x1B

/* shl @ r1 = r2 << r3 */
#define FINSH_OP_SHL_BYTE       0x1C
#define FINSH_OP_SHL_WORD       0x1D
#define FINSH_OP_SHL_DWORD      0x1E

/* shr @ r1 = r2 >> r3 */
#define FINSH_OP_SHR_BYTE       0x1F
#define FINSH_OP_SHR_WORD       0x20
#define FINSH_OP_SHR_DWORD      0x21

/* ld  @ r1 = [r2] */
#define FINSH_OP_LD_BYTE        0x22
#define FINSH_OP_LD_WORD        0x23
#define FINSH_OP_LD_DWORD       0x24

#define FINSH_OP_LD_VALUE_BYTE  0x25
#define FINSH_OP_LD_VALUE_WORD  0x26
#define FINSH_OP_LD_VALUE_DWORD 0x27

/* st  @ [r2] = r1 */
#define FINSH_OP_ST_BYTE        0x28
#define FINSH_OP_ST_WORD        0x29
#define FINSH_OP_ST_DWORD       0x2A

/* pop */
#define FINSH_OP_POP            0x2B

/* call r1 @ [r1](stack) */
#define FINSH_OP_SYSCALL        0x2C

/* load value from stack */
#define FINSH_OP_LD_VALUE_BYTE_STACK    0x2D
#define FINSH_OP_LD_VALUE_WORD_STACK    0x2E
#define FINSH_OP_LD_VALUE_DWORD_STACK   0x2F

/* halt */
#define FINSH_OP_HALT           0xFF

typedef void (*op_func)();
extern const op_func op_table[];

#endif