Quote: "I suspect what's happening to Dar13 is that not enough stack space is being reserved for the UDT parameter within the function"
I was wrong.
It's that the calling code is only passing the first 4 bytes of each register to the stack before the function is called.
Now we know what's happening, but we don't know the circumstances - when I arrange GG's code in the same order as was used to generate the problem in the original code (global, assign, call function, define type, function), it compiles and runs cleanly
sync on : sync rate 60 :sync
//ENUM: EWS_PARENTS
#constant EWS_NONE -1
#constant EWS_UP 1
#constant EWS_DOWN 2
#constant EWS_LEFT 3
#constant EWS_RIGHT 4
#constant EWS_DYNAMIC 5
global VECTOR_ZERO as vector3df
VECTOR_ZERO.x=0 : VECTOR_ZERO.y=0 : VECTOR_ZERO.z=0
global check
test=wtld_makeObjectCube(3,VECTOR_ZERO,VECTOR_ZERO,EWS_UP)
repeat
set cursor 20, 20
print test, " ", check
sync
until spacekey()
end
type vector3df
x as float
y as float
z as float
endtype
function wtld_makeObjectCube(r as integer,pos as vector3df,rot as vector3df,ews_Parent as integer)
//Some useful local variables
local oID as integer : oID=find free object() : //Kinda need this...
//setting up the object
make object cube oID,r
position object oID,pos.x,pos.y,pos.z
rotate object oID,rot.x,rot.y,rot.z
//Putting the object in a group
//ews_Parent has a very strange value...
//Not sure why??
g_o=ews_Parent
if ews_Parent=EWS_UP
place object in group oID,EWS_UP
endif
if ews_Parent=EWS_DOWN
place object in group oID,EWS_DOWN
endif
if ews_Parent=EWS_RIGHT
place object in group oID,EWS_RIGHT
endif
if ews_Parent=EWS_LEFT
place object in group oID,EWS_LEFT
endif
if ews_Parent=EWS_NONE
place object in group oID,0
endif
if ews_Parent=EWS_DYNAMIC
place object in group oID,EWS_DYNAMIC
endif
//return the object ID instead of index, get that later
check = g_o
endfunction oID
(Relevant sections from Dar13's dbm file - it's the lines starting with '68' that show what parameters are being pushed onto the stack)
35 LINE : global ZERO_VEC as vector3df
35 MOV EAX IMM4 , 0
35 MOV MEM4 EAX @ZERO_VEC ; ASSIGN X TO X
35 MOV MEM IMM4 @$_SLN_, 35
35 MOV EAX MEM4 @$_ERR_
35 CMP EAX4 0
35 JNE $labelend ; CALL Normal Runtime Error Hook
36 LINE : ZERO_VEC.x,0 : ZERO_VEC.y,0 : ZERO_VEC.z,0
36 MOV EAX IMM4 , 0
36 PUSH EAX ; PUSH TO STACK
36 MOV EBX IMM4 [5
36 CALL EBX ; CALL [dbprocore.dll ,?CastLtoF@@YAKH@Z
36 POP EBX ; POP EBX FROM STACK
36 MOV MEM4 EAX @$F1 ; ASSIGN EAX TO X
36 MOV EAX MEM4 @$F1
36 MOV MEM4 EAX @ZERO_VEC ; ASSIGN X TO X
36 MOV MEM IMM4 @$_SLN_, 36
36 MOV EAX MEM4 @$_ERR_
36 CMP EAX4 0
36 JNE $labelend ; CALL Normal Runtime Error Hook
36 MOV EAX IMM4 , 0
36 PUSH EAX ; PUSH TO STACK
36 MOV EBX IMM4 [5
36 CALL EBX ; CALL [dbprocore.dll ,?CastLtoF@@YAKH@Z
36 POP EBX ; POP EBX FROM STACK
36 MOV MEM4 EAX @$F1 ; ASSIGN EAX TO X
36 MOV EAX MEM4 @$F1
36 MOV ECX IMM4 @ZERO_VEC
36 MOV [ECX+A] EAX4 4 ; ASSIGN X TO X
36 MOV MEM IMM4 @$_SLN_, 36
36 MOV EAX MEM4 @$_ERR_
36 CMP EAX4 0
36 JNE $labelend ; CALL Normal Runtime Error Hook
36 MOV EAX IMM4 , 0
36 PUSH EAX ; PUSH TO STACK
36 MOV EBX IMM4 [5
36 CALL EBX ; CALL [dbprocore.dll ,?CastLtoF@@YAKH@Z
36 POP EBX ; POP EBX FROM STACK
36 MOV MEM4 EAX @$F1 ; ASSIGN EAX TO X
36 MOV EAX MEM4 @$F1
36 MOV ECX IMM4 @ZERO_VEC
36 MOV [ECX+A] EAX4 8 ; ASSIGN X TO X
36 MOV MEM IMM4 @$_SLN_, 36
36 MOV EAX MEM4 @$_ERR_
36 CMP EAX4 0
36 JNE $labelend ; CALL Normal Runtime Error Hook
37 LINE :
67 LINE :
68 LINE : test,wtld_makeObjectCube(20,VECTOR_ZERO,VECTOR_ZERO,1)
68 ??? ; NOT IMPLEMENTED
68 ??? ; NOT IMPLEMENTED
68 MOV EAX IMM4 , 1
68 PUSH EAX ; PUSH TO STACK
68 MOV EAX IMM4 @$E2
68 ADD EAX IMM4 4
68 SUB EAX IMM4 4
68 PUSH [EAX] ; PUSH UDT TO STACK
68 MOV EAX IMM4 @$E1
68 ADD EAX IMM4 4
68 SUB EAX IMM4 4
68 PUSH [EAX] ; PUSH UDT TO STACK
68 MOV EAX IMM4 , 20
68 PUSH EAX ; PUSH TO STACK
68 CALL MEM $label wtld_makeObjectCube; DIRECT SUBCALL
68 ADD ESP 16 ; ADD ESP
68 MOV MEM4 EAX @$L4 ; ASSIGN EAX TO X
68 MOV MEM IMM4 @$_SLN_, 68
68 MOV EAX MEM4 @$_ERR_
68 CMP EAX4 0
68 JNE $labelend ; CALL Normal Runtime Error Hook
68 MOV EAX MEM4 @$L4
68 MOV MEM4 EAX @test ; ASSIGN X TO X
68 MOV MEM IMM4 @$_SLN_, 68
68 MOV EAX MEM4 @$_ERR_
68 CMP EAX4 0
68 JNE $labelend ; CALL Normal Runtime Error Hook
69 LINE : :`:`:`:`:`:`:`:`
127 LINE : type vector3df
128 LINE : x as float
129 LINE : y as float
130 LINE : z as float
131 LINE : endtype
227 LINE :
228 LINE : function wtld_makeObjectCube(r as integer,pos as vector3df,rot as vector3df,ews_Parent as integer)
228 MOV EBX IMM4 [21
228 CALL EBX ; CALL [dbprocore.dll ,?EarlyEnd@@YAXXZ
228 JMP $labelend ; DIRECT JUMP
228 MOV MEM IMM4 @$_SLN_, 228
228 MOV EAX MEM4 @$_ERR_
228 CMP EAX4 0
228 JNE $labelend ; CALL Normal Runtime Error Hook
228 PUSH EBP ; PUSH EBP
228 MOV EBP ESP ; MOV EBP ESP
228 SUB ESP 64 ; SUB ESP
228 MOV EAX ESP
228 MOV ECX IMM4 7
228 MOV SIB[EAX:ECX*4],IMM4 , 0
228 LOOP ECX , -9 ; CLEAR STACK
229 LINE : :`:`:`:`:`:`:`:`:`:`:`:`:`:`s
230 LINE : local oID as integer : oID,find free object() : :`:`:`:`:`:`:`:`:`:`
230 MOV EAX IMM4 , 0
230 MOV [EBP+A] EAX4 -8 ; ASSIGN X TO X
230 MOV MEM IMM4 @$_SLN_, 230
230 MOV EAX MEM4 @$_ERR_
230 CMP EAX4 0
230 JNE $labelend ; CALL Normal Runtime Error Hook
230 MOV EBX IMM4 [25
230 CALL EBX ; CALL [Matrix1Util_19.dll ,FindFreeObject
230 MOV [EBP+A] EAX4 -12 ; ASSIGN EAX TO X
230 MOV MEM IMM4 @$_SLN_, 230
230 MOV EAX MEM4 @$_ERR_
230 CMP EAX4 0
230 JNE $labelend ; CALL Normal Runtime Error Hook
230 MOV EAX4 [EBP+A] -12
230 MOV [EBP+A] EAX4 -8 ; ASSIGN X TO X
230 MOV MEM IMM4 @$_SLN_, 230
230 MOV EAX MEM4 @$_ERR_
230 CMP EAX4 0
230 JNE $labelend ; CALL Normal Runtime Error Hook
231 LINE :
232 LINE : :`:`:`:`:`:`:`:`:`:`:`t
233 LINE : make object cube oID,r
233 MOV EAX4 [EBP+A] 8
233 PUSH EAX ; PUSH TO STACK
233 MOV EBX IMM4 [5
233 CALL EBX ; CALL [dbprocore.dll ,?CastLtoF@@YAKH@Z
233 POP EBX ; POP EBX FROM STACK
233 MOV [EBP+A] EAX4 -20 ; ASSIGN EAX TO X
233 MOV EAX4 [EBP+A] -20
233 PUSH EAX ; PUSH TO STACK
233 MOV EAX4 [EBP+A] -8
233 PUSH EAX ; PUSH TO STACK
233 MOV EBX IMM4 [26
233 CALL EBX ; CALL [DBProBasic3DDebug.dll ,?MakeCube@@YAXHM@Z
233 POP EBX ; POP EBX FROM STACK
233 POP EBX ; POP EBX FROM STACK
233 MOV MEM IMM4 @$_SLN_, 233
233 MOV EAX MEM4 @$_ERR_
233 CMP EAX4 0
233 JNE $labelend ; CALL Normal Runtime Error Hook
234 LINE : position object oID,pos.x,pos.y,pos.z
234 MOV EAX4 [EBP+A] 20
234 PUSH EAX ; PUSH TO STACK
234 MOV EAX4 [EBP+A] 16
234 PUSH EAX ; PUSH TO STACK
234 MOV EAX4 [EBP+A] 12
234 PUSH EAX ; PUSH TO STACK
234 MOV EAX4 [EBP+A] -8
234 PUSH EAX ; PUSH TO STACK
234 MOV EBX IMM4 [22
234 CALL EBX ; CALL [DBProBasic3DDebug.dll ,?Position@@YAXHMMM@Z
234 POP EBX ; POP EBX FROM STACK
234 POP EBX ; POP EBX FROM STACK
234 POP EBX ; POP EBX FROM STACK
234 POP EBX ; POP EBX FROM STACK
234 MOV MEM IMM4 @$_SLN_, 234
234 MOV EAX MEM4 @$_ERR_
234 CMP EAX4 0
234 JNE $labelend ; CALL Normal Runtime Error Hook
DEBUG:
STRUCT@integer Overall Size:4
STRUCT@float Overall Size:4
STRUCT@string Overall Size:4
STRUCT@boolean Overall Size:1
STRUCT@byte Overall Size:1
STRUCT@word Overall Size:2
STRUCT@dword Overall Size:4
STRUCT@double float Overall Size:8
STRUCT@double integer Overall Size:8
STRUCT@label Overall Size:4
STRUCT@dabel Overall Size:4
STRUCT@integer array Overall Size:4
STRUCT@float array Overall Size:4
STRUCT@string array Overall Size:4
STRUCT@boolean array Overall Size:4
STRUCT@byte array Overall Size:4
STRUCT@word array Overall Size:4
STRUCT@dword array Overall Size:4
STRUCT@double float array Overall Size:4
STRUCT@double integer array Overall Size:4
STRUCT@anytype non casted Overall Size:4
STRUCT@userdefined var ptr Overall Size:4
STRUCT@userdefined array ptr Overall Size:4
USERSTRUCT@vector3df Overall Size:12
STRUCT@x TYPE>float OFFSET>0
STRUCT@y TYPE>float OFFSET>4
STRUCT@z TYPE>float OFFSET>8
FS@wtld_makeObjectCube Overall Size:60 Parameter Count:5
STRUCT@returnvalue TYPE>integer OFFSET>0
STRUCT@r TYPE>integer OFFSET>4
STRUCT@pos TYPE>vector3df OFFSET>8
STRUCT@rot TYPE>vector3df OFFSET>20
STRUCT@ews_Parent TYPE>integer OFFSET>32
STRUCT@oID TYPE>integer OFFSET>36
STRUCT@$L0 TYPE>integer OFFSET>40
STRUCT@$L1 TYPE>integer OFFSET>44
STRUCT@$F0 TYPE>float OFFSET>48
STRUCT@$F1 TYPE>float OFFSET>52
STRUCT@$F2 TYPE>float OFFSET>56