SCUMM/V6 opcodes

From ScummVM :: Wiki
< SCUMM
Revision as of 04:12, 14 January 2007 by MetaFox (talk | contribs) (beginning SCUMM/V6 opcodes page)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

SCUMM V6 opcodes

The following conventions are used in the encoding descriptions.

$AB The constant hexadecimal byte 0xAB.
value[8] A constant byte value.
value[16] A constant word LE value.

The following conventions are used in the stack descriptions.

(in1, in2, in3 : out1, out2) Indicates that the opcode is called with three items on the stack (the most recently pushed being in3) and replaces them with two items on the stack (the most recently pushed being out2).

abs ($C4)

Stack

(in : out)

Operation

out := abs(in)

The absolute value of the top-most item on the stack is calculated. (The absolute value being the value with the sign bit stripped off.)

actorFollowCamera ($79)

actorSet ($9D)

add ($14)

Stack

(in1, in2 : out)

Operation

out := in1 + in2

Performs a division operation on the stack.

animateActor ($82)

arrayOps (This instruction varies considerably according to the form.)

Encoding

load array:

   A4 CD arrayp16 

define array:

   A4 D0 arrayp16 data... 

set array:

   A4 D4 arrayp16 

Stack

...todo...

6.4.7 MM 95 beginOverride

MM 6C breakHere

MM CA breakMaybe

MM 5A byteArrayDec

=MM 52 byteArrayInc

byteArrayIndexedRead

Encoding

0A arrayp8

Stack

( indexx , indexy : value )

Operation

value := arrayp [ indexx , indexy ]

Reads the value at offset ( indexx , indexy ) from the array whose resource number is pointed to by arrayp . The array can be a byte or word array; byte values are not sign extended. Note that because arrayp is encoded as a byte, it can only point to a word variable in the range 0000 to 00FF. Use wordArrayIndexedRead for a more general form.

byteArrayIndexedWrite

Encoding

4A arrayp8

Stack ( indexx , indexy , value : -)

Operation arrayp [ indexx , indexy ] := value

Writes value to the array whose resource number is pointed to by arrayp at offset ( indexx , indexy ). The array can be a byte or word array; byte when writing to a byte array, value is truncated. Note that because arrayp is encoded as a byte, it can only point to a word variable in the range 0000 to 00FF. Use wordArrayIndexedWrite for a more general form.

byteArrayRead

Encoding

06 arrayp8

Stack

( index : value )

Operation

value := arrayp [0, index ]

Reads the value at position (0, index ) from the array whose resource number is pointed to by arrayp . The array can be a byte or word array; when writing to an array, byte values are not sign extended. Note that because arrayp is encoded as a byte, it can only point to a word variable in the range 0000 to 00FF. Use wordArrayRead for a more general form.

byteArrayWrite

Encoding

46 arrayp8

Stack

( index value : -)

Operation

arrayp [0, index ] := value

Writes value to the array whose resource number is pointed to by arrayp at offset (0, index ). The array can be a byte or word array; when writing to a byte array, value is truncated. Note that because arrayp is encoded as a byte, it can only point to a word variable in the range 0000 to 00FF. Use wordArrayWrite for a more general form.

MM 56 byteVarDec

MM 4E byteVarInc

MM 9A createBoxMatrix

MM 6B cursorCommand

MM 68 cutScene

delay

Encoding

B0

Stack

( delay : -)

Operation

Prevents the current thread from being rescheduled until delay ticks have passed. Deschedules immediately.

delayLonger

Encoding

B1

Stack

( delay : -)

Operation

Prevents the current thread from being rescheduled until delay× 60 ticks have passed ( delay seconds). Deschedules immediately.

delayVeryLong

Encoding

B2

Stack

( delay : -)

Operation

Prevents the current thread from being rescheduled until delay× 3600 ticks have passed ( delay minutes). Deschedules immediately.

dim

Encoding BC type8 arrayp16

Stack ( max : -)

Operation

Allocates or frees an array.

If type is CC, then the array whose resource number is pointed to by arrayp is freed. Otherwise, a new one-dimensional array with a maximum index of max (i.e., max is one less than the size) is allocated and the resource number written to arrayp .

When allocating an array, if type is C7 then the array will contain words; if it is CB, then it will contain bytes. All other values are undefined. [Currently they all produce a byte array. What are they?]

dim2

Encoding

C0 type8 arrayp16

Stack

( maxx , maxy : -)

Operation

Allocates an array.

A new two-dimensional array is allocated and the resource number is written to arrayp . The new array will have a maximum X index of maxx and a maximum Y index of maxy (i.e., maxy is one less than the size).

When allocating an array, if type is C7 then the array will contain words; if it is CB, then it will contain bytes. All other values are undefined. [Currently they all produce a byte array. What are they?]

MM C5 distObjectObject

MM C6 distObjectPt

MM C7 distPtPt

div

Encoding

17

Stack

( in1 , in2 : out )

Operation

out := in1 / in2

Performs a division operation on the stack. Note the order.

An attempt to divide by zero will cause undefined behaviour, and may cause the interpreter to crash.

MM 83 doSentence

drawBox

Encoding

A6

Stack

( left , top , right , bottom , colour : -)

Operation Draws a solid box on the backbuffer from ( left , top ) to ( right , bottom ) in the colour colour .

dup

Encoding 0C

Stack ( value  : value , value )

Operation Duplicates the top-most item on the stack.

MM 67 endCutScene

MM 96 endOverride

eq

Encoding

0E

Stack

( value1 , value2  : bool )

Operation

If value1=value2 , set bool to 1, otherwise set it to 0

Tests the top two values on the stack to see if they are equal.

MM 81 faceActor

MM 92 findInventory

MM A0 findObject

freezeUnfreeze

Encoding

6A

Stack

( bool  : -)

Operation

bool=0 :

   Thaw all currently frozen threads. 

0<bool<$80 :

   Freeze all threads that are not marked as unfreezable. 

bool³ $80 :

   Freeze all threads, even those that are marked as unfreezable. 

Freezing is a nestable operation; a thread which is frozen twice must be thawed twice before it becomes runnable again.

ge

Encoding

13

Stack

( value1 value2  : bool)

Operation

If value1³ value2 , set bool to 1, otherwise set it to 0

Compares the top two values on the stack. Note the order.

MM AB getActorAnimCounter1

MM 91 getActorCostume

MM A2 getActorElevation

MM 9F getActorFromXY

MM 8A getActorMoving

MM 8C getActorRoom

MM AA getActorScaleX

MM 90 getActorWalkBox

MM A8 getActorWidth

MM 93 getInventoryCount

MM 8F getObjectDir

MM 8D getObjectX

MM 8E getObjectY

MM 72 getOwner

getRandomNumber

Encoding

87

Stack

( max  : result )

Operation A random number in the range 0 to max inclusive is calculated, and the result pushed onto the stack. The result is also written to the RandomNumber word variable (see 6.5).

getRandomNumberRange

Encoding 88

Stack ( min , max , : result )

Operation A random number in the range min to max inclusive is calculated, and the result pushed onto the stack. The result is also written to the RandomNumber word variable (see 6.5).

MM 8B getScriptRunning

MM 6F getState

MM A3 getVerbEntryPoint

MM 94 getVerbFromXY

All material © 2000-2002 David Given, unless where stated otherwise.