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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#pragma once
// An opcode can have a length of 1, 3 or 5 bytes,
// depending on its numeric value (see below).
enum class SbiOpcode {
// all opcodes without operands
NOP_ = 0,
SbOP0_START = NOP_,
// operators
// the following operators are ordered
// the same way as the enum SbxVarOp
EXP_, MUL_, DIV_, MOD_, PLUS_, MINUS_, NEG_,
EQ_, NE_, LT_, GT_, LE_, GE_,
IDIV_, AND_, OR_, XOR_, EQV_, IMP_, NOT_,
CAT_,
// end of enum SbxVarOp
LIKE_, IS_,
// load/save
ARGC_, // establish new Argv
ARGV_, // TOS ==> current Argv
INPUT_, // Input ==> TOS
LINPUT_, // Line Input ==> TOS
GET_, // touch TOS
SET_, // save object TOS ==> TOS-1
PUT_, // TOS ==> TOS-1
PUTC_, // TOS ==> TOS-1, then ReadOnly
DIM_, // DIM
REDIM_, // REDIM
REDIMP_, // REDIM PRESERVE
ERASE_, // delete TOS
// branch
STOP_, // end of program
INITFOR_, // initialize FOR-variable
NEXT_, // increment FOR-variable
CASE_, // beginning CASE
ENDCASE_, // end CASE
STDERROR_, // standard error handling
NOERROR_, // no error handling
LEAVE_, // leave UP
// E/A
CHANNEL_, // TOS = channel number
BPRINT_, // print TOS
PRINTF_, // print TOS in field
BWRITE_, // write TOS
RENAME_, // Rename Tos+1 to Tos
PROMPT_, // TOS = Prompt for Input
RESTART_, // define restart point
CHAN0_, // I/O-channel 0
// miscellaneous
EMPTY_, // empty expression on stack
ERROR_, // TOS = error code
LSET_, // saving object TOS ==> TOS-1
RSET_, // saving object TOS ==> TOS-1
REDIMP_ERASE_, // Copies array to be later used by REDIM PRESERVE before erasing it
INITFOREACH_,
VBASET_, // VBA-like Set
ERASE_CLEAR_, // Erase array and clear variable
ARRAYACCESS_, // Assign parameters to TOS and get value, used for array of arrays
BYVAL_, // byref -> byval for lvalue parameter passed in call
SbOP0_END = BYVAL_,
// all opcodes with one operand
NUMBER_ = 0x40, // loading a numeric constant (+ID)
SbOP1_START = NUMBER_,
SCONST_, // loading a string constant (+ID)
CONST_, // Immediate Load (+ value)
ARGN_, // saving a named Arg in Argv (+StringID)
PAD_, // bring string to a firm length (+length)
// branch
JUMP_, // jump (+target)
JUMPT_, // evaluate TOS, conditional jump (+target)
JUMPF_, // evaluate TOS, conditional jump (+target)
ONJUMP_, // evaluate TOS, jump into JUMP-table (+MaxVal)
GOSUB_, // UP-call (+Target)
RETURN_, // UP-return (+0 or Target)
TESTFOR_, // test FOR-variable, increment (+Endlabel)
CASETO_, // Tos+1 <= Case <= Tos, 2xremove (+Target)
ERRHDL_, // error handler (+Offset)
RESUME_, // Resume after errors (+0 or 1 or Label)
// E/A
CLOSE_, // (+channel/0)
PRCHAR_, // (+char)
// management
SETCLASS_, // test set + class names (+StringId)
TESTCLASS_, // Check TOS class (+StringId)
LIB_, // set lib name for declare-procs (+StringId)
BASED_, // TOS is incremented by BASE, BASE is pushed before (+base)
// type adjustment in the Argv
ARGTYP_, // convert last parameter in Argv (+type)
VBASETCLASS_, // VBA-like Set
SbOP1_END = VBASETCLASS_,
// all opcodes with two operands
RTL_ = 0x80, // load from the RTL (+StringID+Typ)
SbOP2_START = RTL_,
FIND_, // load (+StringID+Typ)
ELEM_, // load element (+StringID+Typ)
PARAM_, // parameters (+Offset+Typ)
// branch
CALL_, // call DECLARE-method (+StringID+Typ)
CALLC_, // call Cdecl-DECLARE-Method (+StringID+Typ)
CASEIS_, // case-test (+Test-Opcode+True-Target)
// management
STMNT_, // begin of a statement (+Line+Col)
// E/A
OPEN_, // (+StreamMode+Flags)
// objects
LOCAL_, // define locals variables (+StringID+Typ)
PUBLIC_, // module global variables (+StringID+Typ)
GLOBAL_, // define global variables, public command (+StringID+Typ)
CREATE_, // create object (+StringId+StringID)
STATIC_, // static variable (+StringID+Typ) JSM
TCREATE_, // create user-defined object
DCREATE_, // create object-array (+StringId+StringID)
GLOBAL_P_, // define global variable that's not overwritten on restarting
// the Basic, P=PERSIST (+StringID+Typ)
FIND_G_, // finds global variable with special treatment due to GLOBAL_P_
DCREATE_REDIMP_, // redimension object-array (+StringId+StringID)
FIND_CM_, // Search inside a class module (CM) to enable global search in time
PUBLIC_P_, // Module global Variable (persisted between calls)(+StringID+Typ)
FIND_STATIC_, // local static var lookup (+StringID+Typ)
SbOP2_END = FIND_STATIC_
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|