summaryrefslogtreecommitdiff
path: root/basic/source/inc/opcodes.hxx
blob: b9c5e692a1aa0c2d9a1b917eb754154a6a34c97f (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
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: */