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