/**************************************************************
 * 
 * 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
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef _OPCODES_HXX
#define _OPCODES_HXX

#include "sbintern.hxx"

#ifdef MTW
#undef _NUMBER
#endif

// Ein Opcode ist entweder 1, 3 oder 5 Bytes lang, je nach numerischen
// Wert des Opcodes (s.u.).

enum SbiOpcode {
	// Alle Opcodes ohne Operanden
	_NOP = 0,

	SbOP0_START = _NOP,

	// Operatoren
	// die folgenden Operatoren sind genauso angeordnet
	// wie der enum SbxVarOp
	_EXP, _MUL, _DIV, _MOD, _PLUS, _MINUS, _NEG,
	_EQ,  _NE,  _LT,  _GT, _LE, _GE,
	_IDIV, _AND, _OR, _XOR, _EQV, _IMP, _NOT,
	_CAT,
	// Ende enum SbxVarOp
	_LIKE, _IS,
	// Laden/speichern
	_ARGC,              // neuen Argv einrichten
	_ARGV,              // TOS ==> aktueller Argv
	_INPUT,             // Input ==> TOS
	_LINPUT,            // Line Input ==> TOS
	_GET,				// TOS anfassen
	_SET,               // Speichern Objekt TOS ==> TOS-1
	_PUT,				// TOS ==> TOS-1
	_PUTC,				// TOS ==> TOS-1, dann ReadOnly
	_DIM,               // DIM
	_REDIM,             // REDIM
	_REDIMP,            // REDIM PRESERVE
	_ERASE,             // TOS loeschen
	// Verzweigen
	_STOP,              // Programmende
	_INITFOR,           // FOR-Variable initialisieren
	_NEXT,              // FOR-Variable inkrementieren
	_CASE,				// Anfang CASE
	_ENDCASE,           // Ende CASE
	_STDERROR,          // Standard-Fehlerbehandlung
	_NOERROR,           // keine Fehlerbehandlung
	_LEAVE,             // UP verlassen
	// E/A
	_CHANNEL,           // TOS = Kanalnummer
	_BPRINT,            // print TOS
	_PRINTF,            // print TOS in field
	_BWRITE,            // write TOS
	_RENAME,            // Rename Tos+1 to Tos
	_PROMPT,            // TOS = Prompt for Input
	_RESTART,           // Restartpunkt definieren
	_CHAN0,				// I/O-Kanal 0
	// Sonstiges
	_EMPTY,             // Leeren Ausdruck auf Stack
	_ERROR,				// TOS = Fehlercode
	_LSET,				// Speichern Objekt TOS ==> TOS-1
	_RSET,              // Speichern Objekt 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,

	// Alle Opcodes mit einem Operanden

	_NUMBER = 0x40,     // Laden einer numerischen Konstanten (+ID)

	SbOP1_START = _NUMBER,

	_SCONST,            // Laden einer Stringkonstanten (+ID)
	_CONST,             // Immediate Load (+Wert)
	_ARGN,              // Speichern eines named Args in Argv (+StringID)
	_PAD,               // String auf feste Laenge bringen (+Laenge)
	// Verzweigungen
	_JUMP,              // Sprung (+Target)
	_JUMPT,             // TOS auswerten, bedingter Sprung (+Target)
	_JUMPF,             // TOS auswerten, bedingter Sprung (+Target)
	_ONJUMP,            // TOS auswerten, Sprung in JUMP-Tabelle (+MaxVal)
	_GOSUB,             // UP-Aufruf (+Target)
	_RETURN,            // UP-Return (+0 oder Target)
	_TESTFOR,           // FOR-Variable testen, inkrementieren (+Endlabel)
	_CASETO,            // Tos+1 <= Case <= Tos, 2xremove (+Target)
	_ERRHDL,            // Fehler-Handler (+Offset)
	_RESUME,            // Resume nach Fehlern (+0 or 1 or Label)
	// E/A
	_CLOSE,             // (+Kanal/0)
	_PRCHAR,            // (+char)
	// Verwaltung
	_SETCLASS,          // Set + Klassennamen testen (+StringId)
	_TESTCLASS,         // Check TOS class (+StringId)
	_LIB,				// Libnamen fuer Declare-Procs setzen (+StringId)
	_BASED,          	// TOS wird um BASE erhoeht, BASE davor gepusht (+base)
	// Typanpassung im Argv
	_ARGTYP,          	// Letzten Parameter in Argv konvertieren (+Typ)
	_VBASETCLASS,       // VBA-like Set
	SbOP1_END,

	// Alle Opcodes mit zwei Operanden

	_RTL = 0x80,   		// Laden aus RTL (+StringID+Typ)

	SbOP2_START = _RTL,

	_FIND,       		// Laden (+StringID+Typ)
	_ELEM,       		// Laden Element (+StringID+Typ)
	_PARAM,				// Parameter (+Offset+Typ)
	// Verzweigen
	_CALL,				// DECLARE-Methode rufen (+StringID+Typ)
	_CALLC,				// Cdecl-DECLARE-Methode rufen (+StringID+Typ)
	_CASEIS,            // Case-Test (+Test-Opcode+True-Target)
	// Verwaltung
	_STMNT,             // Beginn eines Statements (+Line+Col)
	// E/A
	_OPEN,              // (+SvStreamFlags+Flags)
	// Objekte
	_LOCAL,				// Lokale Variable definieren (+StringID+Typ)
	_PUBLIC, 			// Modulglobale Variable (+StringID+Typ)
	_GLOBAL,			// Globale Variable definieren, public-Anweisung (+StringID+Typ)
	_CREATE,			// Objekt kreieren (+StringId+StringID)
	_STATIC,			// Statische Variabl (+StringID+Typ) JSM
	_TCREATE,			// User Defined Objekt kreieren
	_DCREATE,			// Objekt-Array kreieren (+StringId+StringID)
	_GLOBAL_P,      	// Globale Variable definieren, die beim Neustart von Basic
                        // nicht ueberschrieben wird, P=PERSIST (+StringID+Typ)
	_FIND_G,        	// Sucht globale Variable mit Spezialbehandlung wegen _GLOBAL_P
    _DCREATE_REDIMP,	// Objekt-Array redimensionieren (+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

};



#endif
