226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
|
19=Departures, 32=Busy, 33=Invisible, 34=UserSignal, 35=UserState,
36=KeyCleared, 37=IsPlayer, 38=Destroyed, 39=Stealthy, 40=VisualOnly,
48=Msg, 49=MsgFrom, 50=MsgArg1, 51=MsgArg2, 64=Density, 65=Volume,
66=Strength, 67=Weight, 68=Distance, 69=Height, 70=Climb, 72=HardE,
73=HardN, 74=HardW, 75=HardS, 76=SharpE, 77=SharpN, 78=SharpW, 79=SharpS,
80=ShapeE, 81=ShapeN, 82=ShapeW, 83=ShapeS, 84=Shovable
[2*] Retrieve local variable from other object. Local variable numbers are
the same as opcode 1.
[3/1] Assignment to standard local variables of current object.
[5*] User-defined local variable; the second byte is zero-based local
variable number.
[6/1] Assignment to user-defined variable; the second byte is the
zero-based local variable number to write to.
[7*] Short decimal constant; the second byte is the 8-bit value.
[8*] Long decimal constant. The next two words are the small-endian 32-bit
number that it represents.
[9*] Short class constant; the second byte is a zero-based class number
(the class number is one-based at runtime).
[14*] Direction constant (0-7 for absolute, 8-15 for relative)
[16/1*] Unary operator: 0=negative, 1=bitwise NOT, 2=logical NOT
[17/2*] Binary operator: 0=multiply, 1=divide, 2=modulo
[18/2*] Binary operator: 0=add, 1=subtract, 2=AND, 3=OR, 4=XOR
|
|
|
>
>
>
>
>
>
>
>
>
|
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
|
19=Departures, 32=Busy, 33=Invisible, 34=UserSignal, 35=UserState,
36=KeyCleared, 37=IsPlayer, 38=Destroyed, 39=Stealthy, 40=VisualOnly,
48=Msg, 49=MsgFrom, 50=MsgArg1, 51=MsgArg2, 64=Density, 65=Volume,
66=Strength, 67=Weight, 68=Distance, 69=Height, 70=Climb, 72=HardE,
73=HardN, 74=HardW, 75=HardS, 76=SharpE, 77=SharpN, 78=SharpW, 79=SharpS,
80=ShapeE, 81=ShapeN, 82=ShapeW, 83=ShapeS, 84=Shovable
[2/1*] Retrieve local variable from other object. Local variable numbers
are the same as opcode 1.
[3/1] Assignment to standard local variables of current object.
[4/2] Assignment to standard local variable of other object (the first
(top) value taken from the stack is the value, and second is the object).
[5*] User-defined local variable; the second byte is zero-based local
variable number.
[6/1] Assignment to user-defined variable; the second byte is the
zero-based local variable number to write to.
[7*] Short decimal constant; the second byte is the 8-bit value.
[8*] Long decimal constant. The next two words are the small-endian 32-bit
number that it represents.
[9*] Short class constant; the second byte is a zero-based class number
(the class number is one-based at runtime).
[11*] Message constant; the second byte is the message number.
[13*] String literal. Follow by one WORD giving number of bytes of string
(including null terminator, always even), and then null-terminated special
text. There may be two null terminators if needed to make it even.
[14*] Direction constant (0-7 for absolute, 8-15 for relative)
[16/1*] Unary operator: 0=negative, 1=bitwise NOT, 2=logical NOT
[17/2*] Binary operator: 0=multiply, 1=divide, 2=modulo
[18/2*] Binary operator: 0=add, 1=subtract, 2=AND, 3=OR, 4=XOR
|
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
|
[32] ObjDir
[34] ObjAbove
[36] ObjBelow
[38] 0=ObjTopAt, 1=ObjBottomAt, 2=VolumeAt, 3=HeightAt, 4=Delta
[39*] Self
[40] ObjClassAt
[48*] Key
[49*] Animation constant: 0=STOP, 1=ONCE, 2=LOOP, 8=OSC
[50*] Keyboard constant: See section about key codes.
|
|
|
|
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
|
[32] ObjDir
[34] ObjAbove
[36] ObjBelow
[38/2*] 0=ObjTopAt, 1=ObjBottomAt, 2=VolumeAt, 3=HeightAt, 4=Delta
[39*] Self
[40/3*] ObjClassAt
[48*] Key
[49*] Animation constant: 0=STOP, 1=ONCE, 2=LOOP, 8=OSC
[50*] Keyboard constant: See section about key codes.
|
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
|
[59*] Bit constant 0-31; the second byte is the number 0-31, and at
runtime it is replaced by the relevant 32-bit number.
[60*] Sound constant (see section about user sounds)
[61] 0=ClassCount/1* (I don't know what this does), 1=GetArray
[68/1*] Move(Self, ...); minor code is 255
[69/2*] Move; minor code is 255
[80] SendMessage
[82] Broadcast
[84-] Move(Self, dir). The second byte is the direction to move. Unlike
the normal Move() function, this one adds Strength to Inertia instead of
setting Inertia equal to Strength (this seems to be a bug).
[85/2] Move; minor code is 255
[88] Create
[96] Comment. Has one WORD giving length of the comment text (including
the null terminator), and then the plain text of the comment (with CRLF
line endings), null terminated.
[97] Popup setting. Second byte is 0 for PopupColor or 1 for PopupLoc.
[98] Destroy
[100] CallSub
[101] Goto
[102] Return. Second byte is 0 for implicit end of SUBS block, 1 for
return from a subroutine, 2 for the end of a message block.
[103] Return short constant. Second byte is return value.
[104/1] Return
[105/1] If. Second byte is zero for block-if or one for inline-if. The
next word is the number of words to skip (including the count itself) if
the condition is false.
[106] Else
[107/3] ImageSeq (seems to do nothing?)
[108/3] ImageLoop (seems to do nothing?)
[109] PopUp
[110] JumpTo
[112] Sound
[114] Array operations. Second byte: 0 = definition of an array, 1 =
SetArray, 2 = InitArray.
[126] Animate
|
>
>
>
>
>
>
>
>
|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
|
|
|
>
|
>
>
|
|
>
>
|
|
|
>
>
|
|
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
|
[59*] Bit constant 0-31; the second byte is the number 0-31, and at
runtime it is replaced by the relevant 32-bit number.
[60*] Sound constant (see section about user sounds)
[61] 0=ClassCount/1* (I don't know what this does), 1=GetArray
[64/3*] SendMessage (to Self)
[65/4*] SendMessage
[66/3*] Broadcast; second byte is zero-based class number
[67/4*] Broadcast
[68/1*] Move(Self, ...); minor code is 255 to take the value from the
stack, or is another number for a direction constant (in this latter case
the same bug occurs as with opcode 84).
[69/2*] Move; minor code is same as opcode 68, but the bug with opcode 84
does not occur, regardless of the minor code.
[70/2*] JumpTo(Self, ...)
[71/3*] JumpTo
[72/5*] Create
[74*] Destroy(Self)
[75/1*] Destroy
[80/3] SendMessage(Self, ...)
[81/4] SendMessage
[82/3] Broadcast; second byte is zero-based class number
[83/4] Broadcast
[84] Move(Self, dir). The second byte is the direction to move. Unlike
the normal Move() function, this one adds Strength to Inertia instead of
setting Inertia equal to Strength (this seems to be a bug). If the minor
code is 255 then takes direction from stack and does not have this bug.
[85] Move. The second byte is the same as for opcode 84; if 255 then it
takes from the stack (before taking the object to move). In this case the
bug mentioned above does not occur regardless of what the minor code is.
[88/5] Create
[96] Comment. Has one WORD giving length of the comment text (including
the null terminator), and then the plain text of the comment (with CRLF
line endings), null terminated.
[97] Popup setting. Second byte is 0 for PopupColor or 1 for PopupLoc.
[98] Destroy(Self)
[99/1] Destroy
[100] CallSub
[101-] Goto; next WORD is address to branch to unconditionally
[102] Return. Second byte is 0 for implicit end of SUBS block, 1 for
return from a subroutine, 2 for the end of a message block.
[103-] Return short constant. Second byte is return value.
[104/1] Return
[105/1] If. Second byte is zero for block-if or one for inline-if. The
next word is the number of words to skip (including the count itself) if
the condition is false.
[106] Else
[107/3] ImageSeq (seems to do nothing?)
[108/3] ImageLoop (seems to do nothing?)
[109] PopUp. Values taken from the stack is one plus the minor code.
[110/2] JumpTo(Self, ...)
[111/3] JumpTo
[112] Sound
[114] Array operations. Second byte: 0 = definition of an array, 1 =
SetArray, 2 = InitArray.
[126] Animate
|