[comp.sys.mac.programmer] Assembly Code for List Manager, What is Wrong here?

BRBOYER@MTUS5.CTS.MTU.EDU (Rucell) (05/09/91)

  Hello.  I am having a bit of trouble with this assembly code segment.  What
I am trying to do is this:  Setup a UserItem Dialog with a List.  I have got
most of it working OK, but right in the middle of drawing the Dialog Items, it
crashs just after the box is formed.  I am not quite sure why.  Can anybody
see what could be wrong?  Thanks much...

;------------------------------------------------------------------------------

 InitLists
         MOVE.L          GroupPtr(V),-(SP)               ;Get DlogItem Info
         MOVE            #MainGroup,-(SP)
         PEA             ItemType(V)
         PEA             ItemHndl(V)
         PEA             Box(V)
         _GetDItem
 
         MOVE.L          GroupPtr(V),-(SP)               ;Set UserItem to draw
         MOVE            #MainGroup,-(SP)                ; Procedure
         MOVE            ItemType(V),-(SP)
         PEA             DrawGrpList
         PEA             Box(V)
         _SetDItem
 
         PEA             SizeRect(V)                     ;Calculate Initial
         CLR.L           -(SP)                           ; Array
         MOVE            #1,-(SP)
         CLR             -(SP)
         _SetRect
 
         CLR.L           -(SP)                           ;LNew up a new LIST
         PEA             Box(V)
         PEA             SizeRect(V)
         MOVE            #16,-(SP)
         CLR             -(SP)
         CLR             -(SP)
         MOVE.L          GroupPtr(V),-(SP)
         MOVE            #True,-(SP)
         MOVE            #False,-(SP)
         MOVE            #False,-(SP)
         MOVE            #True,-(SP)
         MOVE            #68,-(SP)
         _Pack0
         MOVE.L          (SP)+,GroupListHndl(V)
 
         PEA             Str1(V)                         ;Get String from Rsrc
         MOVE            #128,-(SP)
         MOVE            #5,-(SP)
         JSR             GetIndString
 
         LEA             Str1(V),A0                      ;Put Str into List
         CLR             D0
         MOVE.B          (A0)+,D0
         MOVE.L          A0,-(SP)
         MOVE            D0,-(SP)
         CLR.L           -(SP)
         MOVE.L          GroupListHndl(V),-(SP)
         MOVE            #88,-(SP)
         _Pack0
 
         RTS

 DrawGrpList
         MOVE.L          6(SP),A3                        ;Save Window Ptr
         MOVE            4(SP),D4                        ;Save Dialog Item
 
         MOVE.L          A3,-(SP)                        ;Get Box Size
         MOVE            D4,-(SP)
         PEA             ItemType(V)
         PEA             ItemHndl(V)
         PEA             Box(V)
         _GetDItem
 
         PEA             Box(V)                          ;Draw Rectangle
         MOVE.L          #-1,-(SP)
         _InsetRect
         PEA             Box(V)
         _FrameRect
 
         MOVE.L          visRgn(A3),-(SP)                ;LUpdate
         MOVE.L          GroupListHndl(V),-(SP)
         MOVE            #100,-(SP)
         _Pack0
 
         MOVE.L          (SP)+,A0                        ;Return
         ADD.L           #6,SP
         JMP             (A0)
 

;------------------------------------------------------------------------------

   Bradley R. Boyer     ##### #   #  ###    BRBOYER@mtus5.cts.mtu.edu
                          #   #  #  #   #   BRBOYER%MTUS5.BITNET
 |"How could it have |   # #  ###   #####
 | been me?  I wasn't|    #   #  #  #   #   Phi Kappa Theta - Michigan Chi Rho
 | even there!"      |  ##### #   #  ###    Michigan Technological University

------ Posted using NetFeed, THE Macintosh <====> UseNet Interface Program ----

mandel@vax.anes.tulane.edu (Jeff E Mandel MD MS) (05/11/91)

In article <050991.121525BRBOYER@MTUS5.CTS.MTU.EDU>, BRBOYER@MTUS5.CTS.MTU.EDU (Rucell) writes:
>
>  Hello.  I am having a bit of trouble with this assembly code segment.  What
>I am trying to do is this:  Setup a UserItem Dialog with a List.  I have got
>most of it working OK, but right in the middle of drawing the Dialog Items, it
>crashs just after the box is formed.  I am not quite sure why.  Can anybody
>see what could be wrong?  Thanks much...
>
Here is a carved up assembly language program that does something close to what
you want. It is written with the MPW structured assembly macros, so it may be
difficult for you to follow, but hey, it's free.

(BinHex-Stuffit, delete the signature at the end)
(This file must be converted with BinHex 4.0)
:#QaTFh4NCbjcDA3!8dP8)90*9#%!!!!!"c3!!!!!"*K6593K!!%!!!FdFNaKG3'
q!!!!&J!!!J))E'PcG%4R,Q&'D@aP)'C[FL""GA4[)%0KFf0KC'PZC`!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9%e38b!!!+431eHN8$jb!!!"IJ!
!#1)!!!%D!!!&P#(rZ&S!!!!!!!!bE!!!"!JSN!!*3B-"CF`*FkB-#$CTjY!"8@G
1'6NJdY!TdqC%J`3J%``*Bc%N!SJ5LCaa%DD&!)*8LQ#KdJ6+&"!%FqU-1E2Q6Ce
!J`)P"@A(PB!)a!8-i%G1R6&0`SbCii+-aj!!#D")5H+%5XJR6Mk'&!Xb5FdR8Vb
#E$,R$*1)G+V!)40Q)`J@)1$)5I0Q,jdm56DfJ5,RcCJ'C"0-+A)%kiNQCHBXE(K
eE"%mF2V5b9Ti6"NbGH5853"C-X-bE`NL!8$kM4ZTE`!`!N""YJ!h!Gc4cRhl6ce
!#Rcl*QJ!!!(CZrX*k)1F3J$PIBMkN!!68!!IT%S$8KZiP'!!K!$!b`$3"*U8"F)
)FJ!`RVa0+339$'Mhljr1*hF`!!N58%P#K8Q4J!P16#P$C`k)1R"!K!("*XdF1L$
5Z*%)JNbD-'cHR$R4)+!3*N'F,*Q#m)Q6NJQ'"*Pb-+",Q&2Sb0&i"L'8-(2'J)6
C*-`B0"V,)'`ba!B1'$*J0)!*48S5*e4D'M%#mqS3*P@)&!%4m!391@(Jc(%4KQ4
!Vf$&NNe)jFdE0NALe'(V0J(FX'2,4UQ6CXbD[([EGRAb&I"FKARQ)1DlZ,(FXP-
L&j%MKr*EaR&V*[aTZ1LBYBSr@`kFF($K0@63hR'KF8aI*Nq#%%&i!SSFN6RPe"P
MHLfCflPhPc85mXi31Qb+ZcK1e5V@PLm$GQd#jBQ8V'hb-,&)arHE-92,i)(c4Ji
GRlr(P#&64il5"'2XKk&6KXJC&K@jX8B2C*3K4KeR`'4&%&+!B%BDE2!R4a"Md*(
''flSF!8),)"!"aTP*%'%KKak##)9HF"4KJj-P2KK'8k%dFD+3Q`K3`dfG+%JJaR
ae`D++QV)3KSq)N%''b`1kD-8C95S!j-9XK!H%4q&G%D5[T9K"a6YdC%N'IZ&)F3
EGEK"aKa20NR(MP)Nm1)3CE#"**FDdG&KH10GK%3BCV+a)K-`L9(''4SP-%FBGT6
43a!aY"!%$5m3)8-,4-c!`Ke%SY%$#P$D5DFEG+3`98"02'&&%5i`J4#M,,5!`K4
3L"V3%##a!F)A4c$N4"Ph8!Q55#b#J!))4-"!BSG13&KL#c(S%!3)+8LCKkp@SQ"
%V$$4+ZHYZCEATE!JC,PPPpE'kLbd##@``a5)PQ'LZh$BCmH&G6M%RR[CeRVV3Yk
k"qk89BT8EJV"TS$3ZJbp#m)BpGN(+JKRS'8'PrL5DLUUUJB%m+pR$-a#%&*CI'U
U#,dDk`SIad$8a53(4-CcE168AKKRP)%#Sp(H`D3C3f"i-`bb*P$Ub&FJp$*d1cY
44aXhaj!!XdCN[(((%P$r,'Uqfq,+%"&*q#MXaY9H5c!6,)b3!#FGACI4KT!!4+S
0T-eL1mX#&c!&e(BE4V)aX0ahGlTh%%&VDqXAr(,Y03TJ#a`hf@D6PrED9bMTGST
`QaXjhHRL5CjjBr#pT*TrAcfV[PmNiFBF$(8+EYqJareXKb-dZb(XXN1E,405Y*`
!Q(5)5DDCDp(a"Ka-P'%'(32IRR[4,SFjCTPRZL$''h3)cl6B+a1081`Xm1ilp'[
YG!BDb'-rHYBpPdN(Nh13!#Q(I'KZ11`)*qM'h!N&Xb"T9fD-3+`-)$J#&9b`S4(
-!!48!*%EA$#&ZJd098,BAJcd0i1k6D%+3L#J"'XJZ6CdbJAL)erb!P)%0U"Z"!b
XfeGb&m'!9!SQ46"6%[U(YF%aB9Gh#"B+%X#k#[fY4*K,eqkFplXcrE"$38cA#)c
9)L3HV%"Q#%-G)V5`10PU$QR33aRUYMeMc3i%A$MBf6TL2)d3k8)ELGGj-N)',JE
N34%UJacQ3#f""8%'B`1L'a1`4"d)!BJ()i*XZVE(2[l4L3(C!4U!FS6Ih+'3!-B
k*"J2&T6Ib!N*lFRL(L[PadP5-MphBB-9j,JQ)5BJ@TV6%jq19$R4a34hZRZ6&8H
B!#1dahq9!N%23"!l",lKIm4kJ`T*ebh6NB&plT12$RPC2b,F,eJGiZ5'SK@%#L*
%F0a+A4RQB$Scr(*BeB6QZd4da(HpVC`[LY'-IKLdQ*!!$L9N1+E85$5rfR9)PR*
bJ4hfpX98dQ&2I@TPr[$*"Rh58QJXDk'E3+619ZS[C#6%`J#CPi"L$60V61!AR,B
eV(6+U!`VL%%jLh@XGfe8EiXVN6m"bXUpYDLGf2`#Nr`%P$)JXclb!9FiA`T$-aP
K"$#"b4D)m!3361%*64K,&@KLK#UdD!T8U-*@G+5Gm`f1Aa6$b,$%P9@AfUkU#@!
5(HVMKTk5!3S`G!)4!"HJ!!!:

Jeff E Mandel MD MS
Asst. Professor of Anesthesiology
Tulane University School of Medicine
New Orleans, LA
mandel@vax.anes.tulane.edu

kurash@chocorua (Mark Valence) (05/11/91)

In article <050991.121525BRBOYER@MTUS5.CTS.MTU.EDU> BRBOYER@MTUS5.CTS.MTU.EDU (Rucell) writes:
>
>  Hello.  I am having a bit of trouble with this assembly code segment.  What
>I am trying to do is this:  Setup a UserItem Dialog with a List.  I have got
>most of it working OK, but right in the middle of drawing the Dialog Items, it
>crashs just after the box is formed.  I am not quite sure why.  Can anybody
>see what could be wrong?  Thanks much...
>
>;------------------------------------------------------------------------------
>
> InitLists
>

Looks OK up to here, I assume you have equated 'V' to A5 or some similar
global variable pointer.  If not, then it must be equated to A6 or some
other register you are using for a Frame Pointer, and you have left out
the LINK or SUBA.L instructions for simplicity and to confuse me.

This next routine causes the problem, if what you have posted is the
entire routine:

> DrawGrpList
>         MOVE.L          6(SP),A3                        ;Save Window Ptr
>         MOVE            4(SP),D4                        ;Save Dialog Item
> 

AAAAAAHHHH!!!!  You must save registers D3-D7, A2-A4, and A5-A6 if you
plan on using them in this routine.  A simple 'MOVEM.L	D4/A3, -(SP)'
as the first instruction, and then 'MOVEM.L	(SP)+, D4/A3' before you
pop the return address into A0 will probably solve the problem.

>         [code removed]
>
>         MOVE.L          (SP)+,A0                        ;Return
>         ADD.L           #6,SP
>         JMP             (A0)
> 

If you have left the MOVEM's out for simplicity, then you might try
doing a _GetPort, _SetPort, _SetPort dance to be really retentive:

		MOVEM.L	usedRegs, -(SP)
		[grab the dialog pointer]
		SUBQ.L	#4, SP
		MOVE.L	SP, -(SP)
		_GetPort
		MOVE.L	A3, -(SP)
		_SetPort

		[do stuff with the user item]

		_SetPort						;old port was left on the stack
		MOVEM.L	(SP)+, usedRegs

This is rather retentive for the case of lists (the list manager does
this same thing inside of the _LUpdate routine), but if you want to
draw anything else, you might want to do this.  Maybe the dialog manager
does it too, I can't remember.  Yes, in fact I'm pretty sure it does
do this, so doing it again is kind of a waste.  However, if you do
save your registers, and it still craps out, try the above, it's all
I can think of that might be a problem (other than the register trashing).

>
>   Bradley R. Boyer     ##### #   #  ###    BRBOYER@mtus5.cts.mtu.edu
>                          #   #  #  #   #   BRBOYER%MTUS5.BITNET
> |"How could it have |   # #  ###   #####
> | been me?  I wasn't|    #   #  #  #   #   Phi Kappa Theta - Michigan Chi Rho
> | even there!"      |  ##### #   #  ###    Michigan Technological University

Well, neither was I.

Mark.