xref: /aoo4110/main/basic/source/classes/disas.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_basic.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <stdio.h>
28*b1cdbd2cSJim Jagielski #include <string.h>
29*b1cdbd2cSJim Jagielski #include <tools/stream.hxx>
30*b1cdbd2cSJim Jagielski #include <basic/sbx.hxx>
31*b1cdbd2cSJim Jagielski #include "sb.hxx"
32*b1cdbd2cSJim Jagielski #include "iosys.hxx"
33*b1cdbd2cSJim Jagielski #include "disas.hxx"
34*b1cdbd2cSJim Jagielski #include "sbtrace.hxx"
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski static const char* pOp1[] = {
38*b1cdbd2cSJim Jagielski 	"NOP",
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski 	// Operators
41*b1cdbd2cSJim Jagielski 	// the following operators have the same order as in
42*b1cdbd2cSJim Jagielski 	// enum SbxVarOp
43*b1cdbd2cSJim Jagielski 	"EXP", "MUL", "DIV", "MOD", "PLUS", "MINUS", "NEG",
44*b1cdbd2cSJim Jagielski 	"EQ", "NE", "LT", "GT", "LE", "GE",
45*b1cdbd2cSJim Jagielski 	"IDIV", "AND", "OR", "XOR", "EQV", "IMP", "NOT",
46*b1cdbd2cSJim Jagielski 	"CAT",
47*b1cdbd2cSJim Jagielski 	// End enum SbxVarOp
48*b1cdbd2cSJim Jagielski 	"LIKE", "IS",
49*b1cdbd2cSJim Jagielski 	// Load/Store
50*b1cdbd2cSJim Jagielski 	"ARGC",             // Create new Argv
51*b1cdbd2cSJim Jagielski 	"ARGV",             // TOS ==> current Argv
52*b1cdbd2cSJim Jagielski 	"INPUT",            // Input ==> TOS
53*b1cdbd2cSJim Jagielski 	"LINPUT",           // Line Input ==> TOS
54*b1cdbd2cSJim Jagielski 	"GET",              // get TOS
55*b1cdbd2cSJim Jagielski 	"SET",              // Save Object TOS ==> TOS-1
56*b1cdbd2cSJim Jagielski 	"PUT",              // TOS ==> TOS-1
57*b1cdbd2cSJim Jagielski 	"CONST",            // TOS ==> TOS-1, then ReadOnly
58*b1cdbd2cSJim Jagielski 	"DIM",              // DIM
59*b1cdbd2cSJim Jagielski 	"REDIM",            // REDIM
60*b1cdbd2cSJim Jagielski 	"REDIMP",           // REDIM PRESERVE
61*b1cdbd2cSJim Jagielski 	"ERASE",            // delete TOS
62*b1cdbd2cSJim Jagielski 	// Branch
63*b1cdbd2cSJim Jagielski 	"STOP",             // End of program
64*b1cdbd2cSJim Jagielski 	"INITFOR",          // FOR-Variable init
65*b1cdbd2cSJim Jagielski 	"NEXT",             // FOR-Variable increment
66*b1cdbd2cSJim Jagielski 	"CASE",             // Begin CASE
67*b1cdbd2cSJim Jagielski 	"ENDCASE",          // End CASE
68*b1cdbd2cSJim Jagielski 	"STDERR",           // Default error handling
69*b1cdbd2cSJim Jagielski 	"NOERROR",          // No error handling
70*b1cdbd2cSJim Jagielski 	"LEAVE",            // leave UP
71*b1cdbd2cSJim Jagielski 	// I/O
72*b1cdbd2cSJim Jagielski 	"CHANNEL",          // TOS = Channelnumber
73*b1cdbd2cSJim Jagielski 	"PRINT",            // print TOS
74*b1cdbd2cSJim Jagielski 	"PRINTF",           // print TOS in field
75*b1cdbd2cSJim Jagielski 	"WRITE",            // write TOS
76*b1cdbd2cSJim Jagielski 	"RENAME",           // Rename Tos+1 to Tos
77*b1cdbd2cSJim Jagielski 	"PROMPT",           // TOS = Prompt for Input
78*b1cdbd2cSJim Jagielski 	"RESTART",          // Define restart point
79*b1cdbd2cSJim Jagielski 	"STDIO",            // Switch to I/O channel 0
80*b1cdbd2cSJim Jagielski 	// Misc
81*b1cdbd2cSJim Jagielski 	"EMPTY",            // Empty statement to stack
82*b1cdbd2cSJim Jagielski 	"ERROR",            // TOS = error code
83*b1cdbd2cSJim Jagielski 	"LSET",             // Save object TOS ==> TOS-1
84*b1cdbd2cSJim Jagielski 	"RSET",             // Save object TOS ==> TOS-1 (TODO: Same as above?)
85*b1cdbd2cSJim Jagielski     "REDIMP_ERASE",
86*b1cdbd2cSJim Jagielski     "INITFOREACH",
87*b1cdbd2cSJim Jagielski 	"VBASET",
88*b1cdbd2cSJim Jagielski 	"ERASE_CLEAR",
89*b1cdbd2cSJim Jagielski 	"ARRAYACCESS",
90*b1cdbd2cSJim Jagielski 	"BYVAL"
91*b1cdbd2cSJim Jagielski };
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski static const char* pOp2[] = {
94*b1cdbd2cSJim Jagielski 	"NUMBER",            // Load a numeric constant (+ID)
95*b1cdbd2cSJim Jagielski 	"STRING",            // Load a string constant (+ID)
96*b1cdbd2cSJim Jagielski 	"CONSTANT",          // Immediate Load (+value)
97*b1cdbd2cSJim Jagielski 	"ARGN",              // Save named args in argv (+StringID)
98*b1cdbd2cSJim Jagielski 	"PAD",               // Pad String to defined length (+length)
99*b1cdbd2cSJim Jagielski 	// Branches
100*b1cdbd2cSJim Jagielski 	"JUMP",              // Jump to target (+Target)
101*b1cdbd2cSJim Jagielski 	"JUMP.T",            // evaluate TOS, conditional jump (+Target)
102*b1cdbd2cSJim Jagielski 	"JUMP.F",            // evaluate TOS, conditional jump (+Target)
103*b1cdbd2cSJim Jagielski 	"ONJUMP",            // evaluate TOS, jump into JUMP-table (+MaxVal)
104*b1cdbd2cSJim Jagielski 	"GOSUB",             // UP-Call (+Target)
105*b1cdbd2cSJim Jagielski 	"RETURN",            // UP-Return (+0 or Target)
106*b1cdbd2cSJim Jagielski 	"TESTFOR",           // Test FOR-Variable, increment (+Endlabel)
107*b1cdbd2cSJim Jagielski 	"CASETO",            // Tos+1 <= Case <= Tos, 2xremove (+Target)
108*b1cdbd2cSJim Jagielski 	"ERRHDL",            // Error-Handler (+Offset)
109*b1cdbd2cSJim Jagielski 	"RESUME",            // Resume after errors (+0 or 1 or Label)
110*b1cdbd2cSJim Jagielski 	// I/O
111*b1cdbd2cSJim Jagielski 	"CLOSE",             // (+channel/0)
112*b1cdbd2cSJim Jagielski 	"PRCHAR",            // (+char)
113*b1cdbd2cSJim Jagielski 	// Objects
114*b1cdbd2cSJim Jagielski 	"SETCLASS",          // Test Set + Classname (+StringId)
115*b1cdbd2cSJim Jagielski 	"TESTCLASS",         // Check TOS class (+StringId)
116*b1cdbd2cSJim Jagielski 	"LIB",               // Set Libname for Declare-Procs (+StringId)
117*b1cdbd2cSJim Jagielski 	// New since Beta 3 (TODO: Which Beta3?)
118*b1cdbd2cSJim Jagielski 	"BASED",             // TOS is incremted about BASE, push BASE before
119*b1cdbd2cSJim Jagielski 	"ARGTYP",            // Convert last parameter in argv (+Type)
120*b1cdbd2cSJim Jagielski 	"VBASETCLASS",
121*b1cdbd2cSJim Jagielski };
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski static const char* pOp3[] = {
124*b1cdbd2cSJim Jagielski 	// All opcodes with two operands
125*b1cdbd2cSJim Jagielski 	"RTL",              // Load from RTL (+StringID+Typ)
126*b1cdbd2cSJim Jagielski 	"FIND",             // Load (+StringID+Typ)
127*b1cdbd2cSJim Jagielski 	"ELEM",             // Load element (+StringID+Typ)
128*b1cdbd2cSJim Jagielski 	"PARAM",            // Parameter (+Offset+Typ)
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski     // Branching
131*b1cdbd2cSJim Jagielski 	"CALL",             // Call DECLARE method (+StringID+Typ)
132*b1cdbd2cSJim Jagielski 	"CALL.C",           // Call Cdecl-DECLARE method (+StringID+Typ)
133*b1cdbd2cSJim Jagielski 	"CASEIS",           // Case-Test (+Test-Opcode+False-Target)
134*b1cdbd2cSJim Jagielski 	"STMNT",            // Start of a statement (+Line+Col)
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski     // I/O
137*b1cdbd2cSJim Jagielski 	"OPEN",             // (+SvStreamFlags+Flags)
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski     // Objects and variables
140*b1cdbd2cSJim Jagielski 	"LOCAL",            // Local variables (+StringID+Typ)
141*b1cdbd2cSJim Jagielski 	"PUBLIC",           // Modul global var (+StringID+Typ)
142*b1cdbd2cSJim Jagielski 	"GLOBAL",           // Global var (+StringID+Typ)
143*b1cdbd2cSJim Jagielski 	"CREATE",           // Create object (+StringId+StringId)
144*b1cdbd2cSJim Jagielski 	"STATIC",           // Create static object (+StringId+StringId)
145*b1cdbd2cSJim Jagielski 	"TCREATE",          // Create User defined Object (+StringId+StringId)
146*b1cdbd2cSJim Jagielski 	"DCREATE",          // Create User defined Object-Array kreieren (+StringId+StringId)
147*b1cdbd2cSJim Jagielski     "GLOBAL_P",         // Define persistent global var (existing after basic restart)
148*b1cdbd2cSJim Jagielski                         // P=PERSIST (+StringID+Typ)
149*b1cdbd2cSJim Jagielski     "FIND_G",           // Searches for global var with special handling due to _GLOBAL_P
150*b1cdbd2cSJim Jagielski     "DCREATE_REDIMP",   // Change dimensions of a user defined Object-Array (+StringId+StringId)
151*b1cdbd2cSJim Jagielski     "FIND_CM",          // Search inside a class module (CM) to enable global search in time
152*b1cdbd2cSJim Jagielski     "PUBLIC_P",        	// Module global Variable (persisted between calls)(+StringID+Typ)
153*b1cdbd2cSJim Jagielski     "FIND_STATIC",     	// local static var lookup (+StringID+Typ)
154*b1cdbd2cSJim Jagielski };
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski static const char** pOps[3] = { pOp1, pOp2, pOp3 };
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski typedef void( SbiDisas::*Func )( String& );  // Processing routines
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski static const Func pOperand2[] = {
161*b1cdbd2cSJim Jagielski 	&SbiDisas::StrOp,	// Load a numeric constant (+ID)
162*b1cdbd2cSJim Jagielski 	&SbiDisas::StrOp,	// Load a string constant (+ID)
163*b1cdbd2cSJim Jagielski 	&SbiDisas::ImmOp,	// Immediate Load (+Wert)
164*b1cdbd2cSJim Jagielski 	&SbiDisas::StrOp,	// Save a named argument (+ID)
165*b1cdbd2cSJim Jagielski 	&SbiDisas::ImmOp,	// Strip String to fixed size (+length)
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski     // Branches
168*b1cdbd2cSJim Jagielski 	&SbiDisas::LblOp,	// Jump (+Target)
169*b1cdbd2cSJim Jagielski 	&SbiDisas::LblOp,	// eval TOS, conditional jump (+Target)
170*b1cdbd2cSJim Jagielski 	&SbiDisas::LblOp, 	// eval TOS, conditional jump (+Target)
171*b1cdbd2cSJim Jagielski 	&SbiDisas::OnOp,	// eval TOS, jump in JUMP table (+MaxVal)
172*b1cdbd2cSJim Jagielski 	&SbiDisas::LblOp,	// UP call (+Target)
173*b1cdbd2cSJim Jagielski 	&SbiDisas::ReturnOp,	// UP Return (+0 or Target)
174*b1cdbd2cSJim Jagielski 	&SbiDisas::LblOp,	// test FOR-Variable, increment (+Endlabel)
175*b1cdbd2cSJim Jagielski 	&SbiDisas::LblOp,	// Tos+1 <= Case <= Tos), 2xremove (+Target)
176*b1cdbd2cSJim Jagielski 	&SbiDisas::LblOp,	// Error handler (+Offset)
177*b1cdbd2cSJim Jagielski 	&SbiDisas::ResumeOp,	// Resume after errors (+0 or 1 or Label)
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski     // I/O
180*b1cdbd2cSJim Jagielski 	&SbiDisas::CloseOp,	// (+channel/0)
181*b1cdbd2cSJim Jagielski 	&SbiDisas::CharOp,	// (+char)
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski     // Objects
184*b1cdbd2cSJim Jagielski 	&SbiDisas::StrOp,   // Test classname (+StringId)
185*b1cdbd2cSJim Jagielski 	&SbiDisas::StrOp,   // TESTCLASS, Check TOS class (+StringId)
186*b1cdbd2cSJim Jagielski 	&SbiDisas::StrOp,   // Set libname for declare procs (+StringId)
187*b1cdbd2cSJim Jagielski 	&SbiDisas::ImmOp,   // TOS is incremented about BASE erhoeht, BASE pushed before
188*b1cdbd2cSJim Jagielski 	&SbiDisas::TypeOp,  // Convert last parameter to/in(?) argv (+Typ)
189*b1cdbd2cSJim Jagielski 	&SbiDisas::StrOp,   // VBASETCLASS (+StringId)
190*b1cdbd2cSJim Jagielski };
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski static const Func pOperand3[] = {
193*b1cdbd2cSJim Jagielski 	// All opcodes with two operands
194*b1cdbd2cSJim Jagielski 	&SbiDisas::VarOp,	// Load from RTL (+StringID+Typ)
195*b1cdbd2cSJim Jagielski 	&SbiDisas::VarOp,	// Load (+StringID+Typ)
196*b1cdbd2cSJim Jagielski 	&SbiDisas::VarOp,	// Load Element (+StringID+Typ)
197*b1cdbd2cSJim Jagielski 	&SbiDisas::OffOp,	// Parameter (+Offset+Typ)
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski 	// Branch
200*b1cdbd2cSJim Jagielski 	&SbiDisas::VarOp,	// Call DECLARE-Method (+StringID+Typ)
201*b1cdbd2cSJim Jagielski 	&SbiDisas::VarOp,	// Call CDecl-DECLARE-Methode (+StringID+Typ)
202*b1cdbd2cSJim Jagielski 	&SbiDisas::CaseOp,	// Case-Test (+Test-Opcode+False-Target)
203*b1cdbd2cSJim Jagielski 	&SbiDisas::StmntOp,	// Statement (+Row+Column)
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski 	// I/O
206*b1cdbd2cSJim Jagielski 	&SbiDisas::StrmOp,	// (+SvStreamFlags+Flags)
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski 	// Objects
209*b1cdbd2cSJim Jagielski 	&SbiDisas::VarDefOp,   // Define local var (+StringID+Typ)
210*b1cdbd2cSJim Jagielski 	&SbiDisas::VarDefOp,   // Define Module global var (+StringID+Typ)
211*b1cdbd2cSJim Jagielski 	&SbiDisas::VarDefOp,   // Define global var (+StringID+Typ)
212*b1cdbd2cSJim Jagielski 	&SbiDisas::Str2Op,     // Create object (+StringId+StringId)
213*b1cdbd2cSJim Jagielski 	&SbiDisas::VarDefOp,   // Define static object (+StringID+Typ)
214*b1cdbd2cSJim Jagielski 	&SbiDisas::Str2Op,     // Create User defined Object (+StringId+StringId)
215*b1cdbd2cSJim Jagielski 	&SbiDisas::Str2Op,     // Create User defined Object-Array (+StringId+StringId)
216*b1cdbd2cSJim Jagielski 	&SbiDisas::VarDefOp,   // Define persistent global var P=PERSIST (+StringID+Typ)
217*b1cdbd2cSJim Jagielski     &SbiDisas::VarOp,    // Searches for global var with special handling due to  _GLOBAL_P
218*b1cdbd2cSJim Jagielski 	&SbiDisas::Str2Op,     // Redimensionate User defined Object-Array (+StringId+StringId)
219*b1cdbd2cSJim Jagielski 	&SbiDisas::VarOp,	 // FIND_CM
220*b1cdbd2cSJim Jagielski 	&SbiDisas::VarDefOp, // PUBLIC_P
221*b1cdbd2cSJim Jagielski 	&SbiDisas::VarOp,	 // FIND_STATIC
222*b1cdbd2cSJim Jagielski };
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski // TODO: Why as method? Isn't a simple define sufficient?
_crlf()225*b1cdbd2cSJim Jagielski static const char* _crlf()
226*b1cdbd2cSJim Jagielski {
227*b1cdbd2cSJim Jagielski #if defined (UNX) || defined( PM2 )
228*b1cdbd2cSJim Jagielski 	return "\n";
229*b1cdbd2cSJim Jagielski #else
230*b1cdbd2cSJim Jagielski 	return "\r\n";
231*b1cdbd2cSJim Jagielski #endif
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski // This method exists because we want to load the file as own segment
Disassemble(String & rText)235*b1cdbd2cSJim Jagielski sal_Bool SbModule::Disassemble( String& rText )
236*b1cdbd2cSJim Jagielski {
237*b1cdbd2cSJim Jagielski 	rText.Erase();
238*b1cdbd2cSJim Jagielski 	if( pImage )
239*b1cdbd2cSJim Jagielski 	{
240*b1cdbd2cSJim Jagielski 		SbiDisas aDisas( this, pImage );
241*b1cdbd2cSJim Jagielski 		aDisas.Disas( rText );
242*b1cdbd2cSJim Jagielski 	}
243*b1cdbd2cSJim Jagielski 	return sal_Bool( rText.Len() != 0 );
244*b1cdbd2cSJim Jagielski }
245*b1cdbd2cSJim Jagielski 
SbiDisas(SbModule * p,const SbiImage * q)246*b1cdbd2cSJim Jagielski SbiDisas::SbiDisas( SbModule* p, const SbiImage* q ) : rImg( *q ), pMod( p )
247*b1cdbd2cSJim Jagielski {
248*b1cdbd2cSJim Jagielski 	memset( cLabels, 0, 8192 );
249*b1cdbd2cSJim Jagielski 	nLine = 0;
250*b1cdbd2cSJim Jagielski 	nOff = 0;
251*b1cdbd2cSJim Jagielski 	nPC = 0;
252*b1cdbd2cSJim Jagielski 	nOp1 = nOp2 = nParts = 0;
253*b1cdbd2cSJim Jagielski 	eOp = _NOP;
254*b1cdbd2cSJim Jagielski 	// Set Label-Bits
255*b1cdbd2cSJim Jagielski 	nOff = 0;
256*b1cdbd2cSJim Jagielski 	while( Fetch() )
257*b1cdbd2cSJim Jagielski 	{
258*b1cdbd2cSJim Jagielski 		switch( eOp )
259*b1cdbd2cSJim Jagielski 		{
260*b1cdbd2cSJim Jagielski 			case _RESUME: if( nOp1 <= 1 ) break;
261*b1cdbd2cSJim Jagielski 			case _RETURN: if( !nOp1 ) break;
262*b1cdbd2cSJim Jagielski 			case _JUMP:
263*b1cdbd2cSJim Jagielski 			case _JUMPT:
264*b1cdbd2cSJim Jagielski 			case _JUMPF:
265*b1cdbd2cSJim Jagielski 			case _GOSUB:
266*b1cdbd2cSJim Jagielski 			case _TESTFOR:
267*b1cdbd2cSJim Jagielski 			case _CASEIS:
268*b1cdbd2cSJim Jagielski 			case _CASETO:
269*b1cdbd2cSJim Jagielski 			case _ERRHDL:
270*b1cdbd2cSJim Jagielski                 cLabels[ (nOp1 & 0xffff) >> 3 ] |= ( 1 << ( nOp1 & 7 ) );
271*b1cdbd2cSJim Jagielski                 break;
272*b1cdbd2cSJim Jagielski 			default: break;
273*b1cdbd2cSJim Jagielski 		}
274*b1cdbd2cSJim Jagielski 	}
275*b1cdbd2cSJim Jagielski 	nOff = 0;
276*b1cdbd2cSJim Jagielski 	// Add the publics
277*b1cdbd2cSJim Jagielski 	for( sal_uInt16 i = 0; i < pMod->GetMethods()->Count(); i++ )
278*b1cdbd2cSJim Jagielski 	{
279*b1cdbd2cSJim Jagielski 		SbMethod* pMeth = PTR_CAST(SbMethod,pMod->GetMethods()->Get( i ));
280*b1cdbd2cSJim Jagielski 		if( pMeth )
281*b1cdbd2cSJim Jagielski 		{
282*b1cdbd2cSJim Jagielski 			sal_uInt16 nPos = (sal_uInt16) (pMeth->GetId());
283*b1cdbd2cSJim Jagielski 			cLabels[ nPos >> 3 ] |= ( 1 << ( nPos & 7 ) );
284*b1cdbd2cSJim Jagielski 		}
285*b1cdbd2cSJim Jagielski 	}
286*b1cdbd2cSJim Jagielski }
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski // Read current opcode
Fetch()289*b1cdbd2cSJim Jagielski sal_Bool SbiDisas::Fetch()
290*b1cdbd2cSJim Jagielski {
291*b1cdbd2cSJim Jagielski 	nPC = nOff;
292*b1cdbd2cSJim Jagielski 	if( nOff >= rImg.GetCodeSize() )
293*b1cdbd2cSJim Jagielski 		return sal_False;
294*b1cdbd2cSJim Jagielski 	const unsigned char* p = (const unsigned char*)( rImg.GetCode() + nOff );
295*b1cdbd2cSJim Jagielski 	eOp = (SbiOpcode) ( *p++ & 0xFF );
296*b1cdbd2cSJim Jagielski 	if( eOp <= SbOP0_END )
297*b1cdbd2cSJim Jagielski 	{
298*b1cdbd2cSJim Jagielski 		nOp1 = nOp2 = 0;
299*b1cdbd2cSJim Jagielski 		nParts = 1;
300*b1cdbd2cSJim Jagielski 		nOff++;
301*b1cdbd2cSJim Jagielski 		return sal_True;
302*b1cdbd2cSJim Jagielski 	}
303*b1cdbd2cSJim Jagielski 	else if( eOp <= SbOP1_END )
304*b1cdbd2cSJim Jagielski 	{
305*b1cdbd2cSJim Jagielski 		nOff += 5;
306*b1cdbd2cSJim Jagielski 		if( nOff > rImg.GetCodeSize() )
307*b1cdbd2cSJim Jagielski 			return sal_False;
308*b1cdbd2cSJim Jagielski 		nOp1 = *p++; nOp1 |= *p++ << 8; nOp1 |= *p++ << 16; nOp1 |= *p++ << 24;
309*b1cdbd2cSJim Jagielski 		nParts = 2;
310*b1cdbd2cSJim Jagielski 		return sal_True;
311*b1cdbd2cSJim Jagielski 	}
312*b1cdbd2cSJim Jagielski 	else if( eOp <= SbOP2_END )
313*b1cdbd2cSJim Jagielski 	{
314*b1cdbd2cSJim Jagielski 		nOff += 9;
315*b1cdbd2cSJim Jagielski 		if( nOff > rImg.GetCodeSize() )
316*b1cdbd2cSJim Jagielski 			return sal_False;
317*b1cdbd2cSJim Jagielski 		nOp1 = *p++; nOp1 |= *p++ << 8; nOp1 |= *p++ << 16; nOp1 |= *p++ << 24;
318*b1cdbd2cSJim Jagielski 		nOp2 = *p++; nOp2 |= *p++ << 8; nOp2 |= *p++ << 16; nOp2 |= *p++ << 24;
319*b1cdbd2cSJim Jagielski 		nParts = 3;
320*b1cdbd2cSJim Jagielski 		return sal_True;
321*b1cdbd2cSJim Jagielski 	}
322*b1cdbd2cSJim Jagielski 	else
323*b1cdbd2cSJim Jagielski 		return sal_False;
324*b1cdbd2cSJim Jagielski }
325*b1cdbd2cSJim Jagielski 
Disas(SvStream & r)326*b1cdbd2cSJim Jagielski void SbiDisas::Disas( SvStream& r )
327*b1cdbd2cSJim Jagielski {
328*b1cdbd2cSJim Jagielski 	String aText;
329*b1cdbd2cSJim Jagielski 	nOff = 0;
330*b1cdbd2cSJim Jagielski 	while( DisasLine( aText ) )
331*b1cdbd2cSJim Jagielski 	{
332*b1cdbd2cSJim Jagielski 		ByteString aByteText( aText, gsl_getSystemTextEncoding() );
333*b1cdbd2cSJim Jagielski 		r.WriteLine( aByteText );
334*b1cdbd2cSJim Jagielski 	}
335*b1cdbd2cSJim Jagielski }
336*b1cdbd2cSJim Jagielski 
Disas(String & r)337*b1cdbd2cSJim Jagielski void SbiDisas::Disas( String& r )
338*b1cdbd2cSJim Jagielski {
339*b1cdbd2cSJim Jagielski 	r.Erase();
340*b1cdbd2cSJim Jagielski 	String aText;
341*b1cdbd2cSJim Jagielski 	nOff = 0;
342*b1cdbd2cSJim Jagielski 	while( DisasLine( aText ) )
343*b1cdbd2cSJim Jagielski 	{
344*b1cdbd2cSJim Jagielski 		r += aText;
345*b1cdbd2cSJim Jagielski 		r.AppendAscii( _crlf() );
346*b1cdbd2cSJim Jagielski 	}
347*b1cdbd2cSJim Jagielski 	aText.ConvertLineEnd();
348*b1cdbd2cSJim Jagielski }
349*b1cdbd2cSJim Jagielski 
DisasLine(String & rText)350*b1cdbd2cSJim Jagielski sal_Bool SbiDisas::DisasLine( String& rText )
351*b1cdbd2cSJim Jagielski {
352*b1cdbd2cSJim Jagielski 	char cBuf[ 100 ];
353*b1cdbd2cSJim Jagielski 	const char* pMask[] = {
354*b1cdbd2cSJim Jagielski 		"%08" SAL_PRIXUINT32 "                            ",
355*b1cdbd2cSJim Jagielski 		"%08" SAL_PRIXUINT32 " %02X                   ",
356*b1cdbd2cSJim Jagielski 		"%08" SAL_PRIXUINT32 " %02X %08X          ",
357*b1cdbd2cSJim Jagielski 		"%08" SAL_PRIXUINT32 " %02X %08X %08X " };
358*b1cdbd2cSJim Jagielski 	rText.Erase();
359*b1cdbd2cSJim Jagielski 	if( !Fetch() )
360*b1cdbd2cSJim Jagielski 		return sal_False;
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski #ifdef DBG_TRACE_BASIC
363*b1cdbd2cSJim Jagielski 	String aTraceStr_STMNT;
364*b1cdbd2cSJim Jagielski #endif
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski 	// New line?
367*b1cdbd2cSJim Jagielski 	if( eOp == _STMNT && nOp1 != nLine )
368*b1cdbd2cSJim Jagielski 	{
369*b1cdbd2cSJim Jagielski         // Find line
370*b1cdbd2cSJim Jagielski         String aSource = rImg.aOUSource;
371*b1cdbd2cSJim Jagielski 		nLine = nOp1;
372*b1cdbd2cSJim Jagielski 		sal_uInt16 n = 0;
373*b1cdbd2cSJim Jagielski 		sal_uInt16 l = (sal_uInt16)nLine;
374*b1cdbd2cSJim Jagielski 		while( --l ) {
375*b1cdbd2cSJim Jagielski 			n = aSource.SearchAscii( "\n", n );
376*b1cdbd2cSJim Jagielski 			if( n == STRING_NOTFOUND ) break;
377*b1cdbd2cSJim Jagielski 			else n++;
378*b1cdbd2cSJim Jagielski 		}
379*b1cdbd2cSJim Jagielski 		// Show position
380*b1cdbd2cSJim Jagielski 		if( n != STRING_NOTFOUND )
381*b1cdbd2cSJim Jagielski 		{
382*b1cdbd2cSJim Jagielski 			sal_uInt16 n2 = aSource.SearchAscii( "\n", n );
383*b1cdbd2cSJim Jagielski 			if( n2 == STRING_NOTFOUND ) n2 = aSource.Len() - n;
384*b1cdbd2cSJim Jagielski 			String s( aSource.Copy( n, n2 - n + 1 ) );
385*b1cdbd2cSJim Jagielski 			sal_Bool bDone;
386*b1cdbd2cSJim Jagielski 			do {
387*b1cdbd2cSJim Jagielski 				bDone = sal_True;
388*b1cdbd2cSJim Jagielski 				n = s.Search( '\r' );
389*b1cdbd2cSJim Jagielski 				if( n != STRING_NOTFOUND ) bDone = sal_False, s.Erase( n, 1 );
390*b1cdbd2cSJim Jagielski 				n = s.Search( '\n' );
391*b1cdbd2cSJim Jagielski 				if( n != STRING_NOTFOUND ) bDone = sal_False, s.Erase( n, 1 );
392*b1cdbd2cSJim Jagielski 			} while( !bDone );
393*b1cdbd2cSJim Jagielski //          snprintf( cBuf, sizeof(cBuf), pMask[ 0 ], nPC );
394*b1cdbd2cSJim Jagielski //			rText += cBuf;
395*b1cdbd2cSJim Jagielski 			rText.AppendAscii( "; " );
396*b1cdbd2cSJim Jagielski 			rText += s;
397*b1cdbd2cSJim Jagielski 			rText.AppendAscii( _crlf() );
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski #ifdef DBG_TRACE_BASIC
400*b1cdbd2cSJim Jagielski 			aTraceStr_STMNT = s;
401*b1cdbd2cSJim Jagielski #endif
402*b1cdbd2cSJim Jagielski 		}
403*b1cdbd2cSJim Jagielski 	}
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski 	// Label?
406*b1cdbd2cSJim Jagielski 	const char* p = "";
407*b1cdbd2cSJim Jagielski 	if( cLabels[ nPC >> 3 ] & ( 1 << ( nPC & 7 ) ) )
408*b1cdbd2cSJim Jagielski 	{
409*b1cdbd2cSJim Jagielski 		// Public?
410*b1cdbd2cSJim Jagielski 		ByteString aByteMethName;
411*b1cdbd2cSJim Jagielski 		for( sal_uInt16 i = 0; i < pMod->GetMethods()->Count(); i++ )
412*b1cdbd2cSJim Jagielski 		{
413*b1cdbd2cSJim Jagielski 			SbMethod* pMeth = PTR_CAST(SbMethod,pMod->GetMethods()->Get( i ));
414*b1cdbd2cSJim Jagielski 			if( pMeth )
415*b1cdbd2cSJim Jagielski 			{
416*b1cdbd2cSJim Jagielski 				aByteMethName = ByteString( pMeth->GetName(), gsl_getSystemTextEncoding() );
417*b1cdbd2cSJim Jagielski 				if( pMeth->GetId() == nPC )
418*b1cdbd2cSJim Jagielski 				{
419*b1cdbd2cSJim Jagielski 					p = aByteMethName.GetBuffer();
420*b1cdbd2cSJim Jagielski 					break;
421*b1cdbd2cSJim Jagielski 				}
422*b1cdbd2cSJim Jagielski 				if( pMeth->GetId() >= nPC )
423*b1cdbd2cSJim Jagielski 					break;
424*b1cdbd2cSJim Jagielski 			}
425*b1cdbd2cSJim Jagielski 		}
426*b1cdbd2cSJim Jagielski         snprintf( cBuf, sizeof(cBuf), pMask[ 0 ], nPC );
427*b1cdbd2cSJim Jagielski 		rText.AppendAscii( cBuf );
428*b1cdbd2cSJim Jagielski 		if( p && *p )
429*b1cdbd2cSJim Jagielski 		{
430*b1cdbd2cSJim Jagielski 			rText.AppendAscii( p );
431*b1cdbd2cSJim Jagielski 		}
432*b1cdbd2cSJim Jagielski 		else
433*b1cdbd2cSJim Jagielski 		{
434*b1cdbd2cSJim Jagielski             // fix warning (now error) for "Lbl%04lX" format
435*b1cdbd2cSJim Jagielski   			snprintf( cBuf, sizeof(cBuf), "Lbl%08" SAL_PRIXUINT32, nPC );
436*b1cdbd2cSJim Jagielski 			rText.AppendAscii( cBuf );
437*b1cdbd2cSJim Jagielski 		}
438*b1cdbd2cSJim Jagielski 		rText += ':';
439*b1cdbd2cSJim Jagielski 		rText.AppendAscii( _crlf() );
440*b1cdbd2cSJim Jagielski 	}
441*b1cdbd2cSJim Jagielski     snprintf( cBuf, sizeof(cBuf), pMask[ nParts ], nPC, (sal_uInt16) eOp, nOp1, nOp2 );
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski 	String aPCodeStr;
444*b1cdbd2cSJim Jagielski 	aPCodeStr.AppendAscii( cBuf );
445*b1cdbd2cSJim Jagielski 	int n = eOp;
446*b1cdbd2cSJim Jagielski 	if( eOp >= SbOP2_START )
447*b1cdbd2cSJim Jagielski 		n -= SbOP2_START;
448*b1cdbd2cSJim Jagielski 	else if( eOp >= SbOP1_START )
449*b1cdbd2cSJim Jagielski 		n -= SbOP1_START;
450*b1cdbd2cSJim Jagielski 	aPCodeStr += '\t';
451*b1cdbd2cSJim Jagielski 	aPCodeStr.AppendAscii( pOps[ nParts-1 ][ n ] );
452*b1cdbd2cSJim Jagielski 	aPCodeStr += '\t';
453*b1cdbd2cSJim Jagielski 	switch( nParts )
454*b1cdbd2cSJim Jagielski 	{
455*b1cdbd2cSJim Jagielski 		case 2: (this->*( pOperand2[ n ] ) )( aPCodeStr ); break;
456*b1cdbd2cSJim Jagielski 		case 3: (this->*( pOperand3[ n ] ) )( aPCodeStr ); break;
457*b1cdbd2cSJim Jagielski 	}
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski 	rText += aPCodeStr;
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski #ifdef DBG_TRACE_BASIC
462*b1cdbd2cSJim Jagielski 	dbg_RegisterTraceTextForPC( pMod, nPC, aTraceStr_STMNT, aPCodeStr );
463*b1cdbd2cSJim Jagielski #endif
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski 	return sal_True;
466*b1cdbd2cSJim Jagielski }
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski // Read from StringPool
StrOp(String & rText)469*b1cdbd2cSJim Jagielski void SbiDisas::StrOp( String& rText )
470*b1cdbd2cSJim Jagielski {
471*b1cdbd2cSJim Jagielski 	String aStr = rImg.GetString( (sal_uInt16)nOp1 );
472*b1cdbd2cSJim Jagielski 	ByteString aByteString( aStr, RTL_TEXTENCODING_ASCII_US );
473*b1cdbd2cSJim Jagielski 	const char* p = aByteString.GetBuffer();
474*b1cdbd2cSJim Jagielski 	if( p )
475*b1cdbd2cSJim Jagielski 	{
476*b1cdbd2cSJim Jagielski 		rText += '"';
477*b1cdbd2cSJim Jagielski 		rText.AppendAscii( p );
478*b1cdbd2cSJim Jagielski 		rText += '"';
479*b1cdbd2cSJim Jagielski 	}
480*b1cdbd2cSJim Jagielski 	else
481*b1cdbd2cSJim Jagielski 	{
482*b1cdbd2cSJim Jagielski 		rText.AppendAscii( "?String? " );
483*b1cdbd2cSJim Jagielski 		rText += (sal_uInt16)nOp1;
484*b1cdbd2cSJim Jagielski 	}
485*b1cdbd2cSJim Jagielski }
486*b1cdbd2cSJim Jagielski 
Str2Op(String & rText)487*b1cdbd2cSJim Jagielski void SbiDisas::Str2Op( String& rText )
488*b1cdbd2cSJim Jagielski {
489*b1cdbd2cSJim Jagielski 	StrOp( rText );
490*b1cdbd2cSJim Jagielski 	rText += ',';
491*b1cdbd2cSJim Jagielski 	String s;
492*b1cdbd2cSJim Jagielski 	nOp1 = nOp2;
493*b1cdbd2cSJim Jagielski 	StrOp( s );
494*b1cdbd2cSJim Jagielski 	rText += s;
495*b1cdbd2cSJim Jagielski }
496*b1cdbd2cSJim Jagielski 
497*b1cdbd2cSJim Jagielski // Immediate Operand
ImmOp(String & rText)498*b1cdbd2cSJim Jagielski void SbiDisas::ImmOp( String& rText )
499*b1cdbd2cSJim Jagielski {
500*b1cdbd2cSJim Jagielski 	rText += String::CreateFromInt32(nOp1);
501*b1cdbd2cSJim Jagielski }
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski // OnGoto Operand
OnOp(String & rText)504*b1cdbd2cSJim Jagielski void SbiDisas::OnOp( String& rText )
505*b1cdbd2cSJim Jagielski {
506*b1cdbd2cSJim Jagielski 	rText += String::CreateFromInt32(nOp1 & 0x7FFF);
507*b1cdbd2cSJim Jagielski 	if( nOp1 & 0x800 )
508*b1cdbd2cSJim Jagielski 		rText.AppendAscii( "\t; Gosub" );
509*b1cdbd2cSJim Jagielski }
510*b1cdbd2cSJim Jagielski 
511*b1cdbd2cSJim Jagielski // Label
LblOp(String & rText)512*b1cdbd2cSJim Jagielski void SbiDisas::LblOp( String& rText )
513*b1cdbd2cSJim Jagielski {
514*b1cdbd2cSJim Jagielski 	char cBuf[ 10 ];
515*b1cdbd2cSJim Jagielski     snprintf( cBuf, sizeof(cBuf), "Lbl%04" SAL_PRIXUINT32, nOp1 );
516*b1cdbd2cSJim Jagielski 	rText.AppendAscii( cBuf );
517*b1cdbd2cSJim Jagielski }
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski // 0 or Label
ReturnOp(String & rText)520*b1cdbd2cSJim Jagielski void SbiDisas::ReturnOp( String& rText )
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski 	if( nOp1 )
523*b1cdbd2cSJim Jagielski 		LblOp( rText );
524*b1cdbd2cSJim Jagielski }
525*b1cdbd2cSJim Jagielski 
526*b1cdbd2cSJim Jagielski // 0, 1 or Label
ResumeOp(String & rText)527*b1cdbd2cSJim Jagielski void SbiDisas::ResumeOp( String& rText )
528*b1cdbd2cSJim Jagielski {
529*b1cdbd2cSJim Jagielski 	switch( nOp1 )
530*b1cdbd2cSJim Jagielski 	{
531*b1cdbd2cSJim Jagielski 		case 1: rText.AppendAscii( "NEXT" ); break;
532*b1cdbd2cSJim Jagielski 		case 2: LblOp( rText );
533*b1cdbd2cSJim Jagielski 	}
534*b1cdbd2cSJim Jagielski }
535*b1cdbd2cSJim Jagielski 
536*b1cdbd2cSJim Jagielski // print Prompt
537*b1cdbd2cSJim Jagielski // sal_False/TRUE
PromptOp(String & rText)538*b1cdbd2cSJim Jagielski void SbiDisas::PromptOp( String& rText )
539*b1cdbd2cSJim Jagielski {
540*b1cdbd2cSJim Jagielski 	if( nOp1 )
541*b1cdbd2cSJim Jagielski 		rText.AppendAscii( "\"? \"" );
542*b1cdbd2cSJim Jagielski }
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski // 0 or 1
CloseOp(String & rText)545*b1cdbd2cSJim Jagielski void SbiDisas::CloseOp( String& rText )
546*b1cdbd2cSJim Jagielski {
547*b1cdbd2cSJim Jagielski 	rText.AppendAscii( nOp1 ? "Channel" : "All" );
548*b1cdbd2cSJim Jagielski }
549*b1cdbd2cSJim Jagielski 
550*b1cdbd2cSJim Jagielski // Print character
CharOp(String & rText)551*b1cdbd2cSJim Jagielski void SbiDisas::CharOp( String& rText )
552*b1cdbd2cSJim Jagielski {
553*b1cdbd2cSJim Jagielski 	const char* p = NULL;
554*b1cdbd2cSJim Jagielski 	switch( nOp1 )
555*b1cdbd2cSJim Jagielski 	{
556*b1cdbd2cSJim Jagielski 		case  7: p = "'\\a'"; break;
557*b1cdbd2cSJim Jagielski 		case  9: p = "'\\t'"; break;
558*b1cdbd2cSJim Jagielski 		case 10: p = "'\\n'"; break;
559*b1cdbd2cSJim Jagielski 		case 12: p = "'\\f'"; break;
560*b1cdbd2cSJim Jagielski 		case 13: p = "'\\r'"; break;
561*b1cdbd2cSJim Jagielski 	}
562*b1cdbd2cSJim Jagielski 	if( p ) rText.AppendAscii( p );
563*b1cdbd2cSJim Jagielski 	else if( nOp1 >= ' ' )
564*b1cdbd2cSJim Jagielski 		rText += '\'',
565*b1cdbd2cSJim Jagielski 		rText += (char) nOp1,
566*b1cdbd2cSJim Jagielski 		rText += '\'';
567*b1cdbd2cSJim Jagielski 	else
568*b1cdbd2cSJim Jagielski 		rText.AppendAscii( "char " ),
569*b1cdbd2cSJim Jagielski 		rText += (sal_uInt16)nOp1;
570*b1cdbd2cSJim Jagielski }
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski // Print var: String-ID and type
VarOp(String & rText)573*b1cdbd2cSJim Jagielski void SbiDisas::VarOp( String& rText )
574*b1cdbd2cSJim Jagielski {
575*b1cdbd2cSJim Jagielski 	rText += rImg.GetString( (sal_uInt16)(nOp1 & 0x7FFF) );
576*b1cdbd2cSJim Jagielski 	rText.AppendAscii( "\t; " );
577*b1cdbd2cSJim Jagielski     // The type
578*b1cdbd2cSJim Jagielski 	sal_uInt32 n = nOp1;
579*b1cdbd2cSJim Jagielski 	nOp1 = nOp2;
580*b1cdbd2cSJim Jagielski 	TypeOp( rText );
581*b1cdbd2cSJim Jagielski 	if( n & 0x8000 )
582*b1cdbd2cSJim Jagielski 		rText.AppendAscii( ", Args" );
583*b1cdbd2cSJim Jagielski }
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski // Define variable: String-ID and type
VarDefOp(String & rText)586*b1cdbd2cSJim Jagielski void SbiDisas::VarDefOp( String& rText )
587*b1cdbd2cSJim Jagielski {
588*b1cdbd2cSJim Jagielski 	rText += rImg.GetString( (sal_uInt16)(nOp1 & 0x7FFF) );
589*b1cdbd2cSJim Jagielski 	rText.AppendAscii( "\t; " );
590*b1cdbd2cSJim Jagielski     // The Typ
591*b1cdbd2cSJim Jagielski 	nOp1 = nOp2;
592*b1cdbd2cSJim Jagielski 	TypeOp( rText );
593*b1cdbd2cSJim Jagielski }
594*b1cdbd2cSJim Jagielski 
595*b1cdbd2cSJim Jagielski // Print variable: Offset and Typ
OffOp(String & rText)596*b1cdbd2cSJim Jagielski void SbiDisas::OffOp( String& rText )
597*b1cdbd2cSJim Jagielski {
598*b1cdbd2cSJim Jagielski 	rText += String::CreateFromInt32( nOp1 & 0x7FFF );
599*b1cdbd2cSJim Jagielski 	rText.AppendAscii( "\t; " );
600*b1cdbd2cSJim Jagielski 	// The type
601*b1cdbd2cSJim Jagielski 	sal_uInt32 n = nOp1;
602*b1cdbd2cSJim Jagielski 	nOp1 = nOp2;
603*b1cdbd2cSJim Jagielski 	TypeOp( rText );
604*b1cdbd2cSJim Jagielski 	if( n & 0x8000 )
605*b1cdbd2cSJim Jagielski 		rText.AppendAscii( ", Args" );
606*b1cdbd2cSJim Jagielski }
607*b1cdbd2cSJim Jagielski 
608*b1cdbd2cSJim Jagielski // Data type
609*b1cdbd2cSJim Jagielski #ifdef HP9000 // TODO: remove this!
610*b1cdbd2cSJim Jagielski static char* SbiDisas_TypeOp_pTypes[13] = {
611*b1cdbd2cSJim Jagielski 	"Empty","Null","Integer","Long","Single","Double",
612*b1cdbd2cSJim Jagielski 	"Currency","Date","String","Object","Error","Boolean",
613*b1cdbd2cSJim Jagielski 	"Variant" };
614*b1cdbd2cSJim Jagielski #define pTypes SbiDisas_TypeOp_pTypes
615*b1cdbd2cSJim Jagielski #endif
TypeOp(String & rText)616*b1cdbd2cSJim Jagielski void SbiDisas::TypeOp( String& rText )
617*b1cdbd2cSJim Jagielski {
618*b1cdbd2cSJim Jagielski 	// AB 19.1.96: Typ kann Flag f�r BYVAL enthalten (StepARGTYP)
619*b1cdbd2cSJim Jagielski 	if( nOp1 & 0x8000 )
620*b1cdbd2cSJim Jagielski 	{
621*b1cdbd2cSJim Jagielski 		nOp1 &= 0x7FFF;		// Flag wegfiltern
622*b1cdbd2cSJim Jagielski 		rText.AppendAscii( "BYVAL " );
623*b1cdbd2cSJim Jagielski 	}
624*b1cdbd2cSJim Jagielski 	if( nOp1 < 13 )
625*b1cdbd2cSJim Jagielski 	{
626*b1cdbd2cSJim Jagielski #ifndef HP9000
627*b1cdbd2cSJim Jagielski 		static char pTypes[][13] = {
628*b1cdbd2cSJim Jagielski 			"Empty","Null","Integer","Long","Single","Double",
629*b1cdbd2cSJim Jagielski 			"Currency","Date","String","Object","Error","Boolean",
630*b1cdbd2cSJim Jagielski 			"Variant" };
631*b1cdbd2cSJim Jagielski #endif
632*b1cdbd2cSJim Jagielski 		rText.AppendAscii( pTypes[ nOp1 ] );
633*b1cdbd2cSJim Jagielski 	}
634*b1cdbd2cSJim Jagielski 	else
635*b1cdbd2cSJim Jagielski 	{
636*b1cdbd2cSJim Jagielski 		rText.AppendAscii( "type " );
637*b1cdbd2cSJim Jagielski 		rText += (sal_uInt16)nOp1;
638*b1cdbd2cSJim Jagielski 	}
639*b1cdbd2cSJim Jagielski }
640*b1cdbd2cSJim Jagielski #ifdef HP9000
641*b1cdbd2cSJim Jagielski #undef pTypes
642*b1cdbd2cSJim Jagielski #endif
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski // sal_True-Label, condition Opcode
CaseOp(String & rText)645*b1cdbd2cSJim Jagielski void SbiDisas::CaseOp( String& rText )
646*b1cdbd2cSJim Jagielski {
647*b1cdbd2cSJim Jagielski 	LblOp( rText );
648*b1cdbd2cSJim Jagielski 	rText += ',';
649*b1cdbd2cSJim Jagielski 	rText.AppendAscii( pOp1[ nOp2 - SbxEQ + _EQ ] );
650*b1cdbd2cSJim Jagielski }
651*b1cdbd2cSJim Jagielski 
652*b1cdbd2cSJim Jagielski // Row, column
StmntOp(String & rText)653*b1cdbd2cSJim Jagielski void SbiDisas::StmntOp( String& rText )
654*b1cdbd2cSJim Jagielski {
655*b1cdbd2cSJim Jagielski 	rText += String::CreateFromInt32( nOp1 );
656*b1cdbd2cSJim Jagielski 	rText += ',';
657*b1cdbd2cSJim Jagielski 	sal_uInt32 nCol = nOp2 & 0xFF;
658*b1cdbd2cSJim Jagielski 	sal_uInt32 nFor = nOp2 / 0x100;
659*b1cdbd2cSJim Jagielski     rText += String::CreateFromInt32( nCol );
660*b1cdbd2cSJim Jagielski 	rText.AppendAscii( " (For-Level: " );
661*b1cdbd2cSJim Jagielski 	rText += String::CreateFromInt32( nFor );
662*b1cdbd2cSJim Jagielski 	rText += ')';
663*b1cdbd2cSJim Jagielski }
664*b1cdbd2cSJim Jagielski 
665*b1cdbd2cSJim Jagielski // open mode, flags
StrmOp(String & rText)666*b1cdbd2cSJim Jagielski void SbiDisas::StrmOp( String& rText )
667*b1cdbd2cSJim Jagielski {
668*b1cdbd2cSJim Jagielski 	char cBuf[ 10 ];
669*b1cdbd2cSJim Jagielski     snprintf( cBuf, sizeof(cBuf), "%04" SAL_PRIXUINT32, nOp1 );
670*b1cdbd2cSJim Jagielski 	rText.AppendAscii( cBuf );
671*b1cdbd2cSJim Jagielski 	if( nOp2 & SBSTRM_INPUT )
672*b1cdbd2cSJim Jagielski 		rText.AppendAscii( ", Input" );
673*b1cdbd2cSJim Jagielski 	if( nOp2 & SBSTRM_OUTPUT )
674*b1cdbd2cSJim Jagielski 		rText.AppendAscii( ", Output" );
675*b1cdbd2cSJim Jagielski 	if( nOp2 & SBSTRM_APPEND )
676*b1cdbd2cSJim Jagielski 		rText.AppendAscii( ", Append" );
677*b1cdbd2cSJim Jagielski 	if( nOp2 & SBSTRM_RANDOM )
678*b1cdbd2cSJim Jagielski 		rText.AppendAscii( ", Random" );
679*b1cdbd2cSJim Jagielski 	if( nOp2 & SBSTRM_BINARY )
680*b1cdbd2cSJim Jagielski 		rText.AppendAscii( ", Binary" );
681*b1cdbd2cSJim Jagielski }
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski 
684