Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!linus!philabs!cmcl2!harvard!seismo!rochester!bullwinkle!uw-beaver!tikal!bobc From: bobc@tikal.UUCP (Bob Campbell) Newsgroups: net.sources.mac Subject: ETHZ Standalone Implementation Modules (1 of 6) Message-ID: <428@tikal.UUCP> Date: Mon, 12-May-86 11:44:48 EDT Article-I.D.: tikal.428 Posted: Mon May 12 11:44:48 1986 Date-Received: Thu, 15-May-86 06:40:07 EDT Reply-To: bobc@tikal.UUCP (Bob Campbell) Organization: Teltone Corp., Kirkland, WA Lines: 3843 # The rest of this file is a shell script which will extract: # BDPackage.MOD ControlManager.MOD Conversions.MOD Cursors.MOD DeskManager.MOD DialogManager.MOD echo x - BDPackage.MOD cat >BDPackage.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE BDPackage; FROM SYSTEM IMPORT ADDRESS,CODE,ADR,REGISTER,SETREG; FROM MacSYSTEM IMPORT LONGINT; FROM PascalStrings IMPORT MakeModulaString,MakePascalString; CONST GetRet = 0285FH; (* MOVEA (A7)+,A4 *) Return = 04ED4H; (* JMP A4 *) SaveA7 = 0264FH; (* MOVEA A7,A3 *) RestoreA7 = 02E4BH; (* MOVEA A3,A7 *) Push = 03F3CH; (* MOVE #VAL,-(A7) *) Pack7 = 0A9EEH; pNumToString= 0; pStringToNum= 1; PROCEDURE xStringToNum(theString:ADDRESS;VAR theNum:LONGINT); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(Push); CODE(pStringToNum); CODE(Pack7); CODE(RestoreA7); CODE(Return); END xStringToNum; PROCEDURE NumToString(theNum:LONGINT;VAR theString:ARRAY OF CHAR); (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN SETREG(0,theNum); SETREG(8,ADR(Str)); CODE(Push); CODE(pNumToString); CODE(Pack7); MakeModulaString(Str,theString) END NumToString; PROCEDURE StringToNum(VAR theString:ARRAY OF CHAR;VAR theNum:LONGINT); (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN MakePascalString(theString,Str); SETREG(8,ADR(Str)); CODE(Push); CODE(pStringToNum); CODE(Pack7); theNum := REGISTER(0) END StringToNum END BDPackage. !Funky!Stuff! echo x - ControlManager.MOD cat >ControlManager.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE ControlManager; FROM SYSTEM IMPORT ADDRESS,CODE,ADR,SETREG,REGISTER; FROM MacSYSTEM IMPORT LONGINT,Handle; FROM QuickDraw IMPORT Point,Rect; FROM WindowManager IMPORT WindowPtr; FROM PascalStrings IMPORT MakePascalString,MakeModulaString; CONST GetRet = 0285FH; (* MOVEA (A7)+,A4 *) Return = 04ED4H; (* JMP (A4) *) SaveA7 = 0264FH; (* MOVEA A7,A3 *) RestoreA7 = 02E4BH; (* MOVEA A3,A7 *) (* Init and Alloc *) PROCEDURE xNewControl(Wind:WindowPtr;VAR bounds:Rect;title:ADDRESS; visible:BOOLEAN;value:INTEGER;min,max:INTEGER;procID:INTEGER; refCon:LONGINT): ControlHandle; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A954H); CODE(RestoreA7); CODE(Return); END xNewControl; PROCEDURE NewControl(Wind:WindowPtr;bounds:Rect;VAR title:ARRAY OF CHAR; visible:BOOLEAN;value:INTEGER;min,max:INTEGER;procID:INTEGER; refCon:LONGINT): ControlHandle; (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN MakePascalString(title,Str); RETURN(xNewControl(Wind,bounds,ADR(Str),visible,value,min,max,procID,refCon)) END NewControl; PROCEDURE GetNewControl (controlID:INTEGER;wind:WindowPtr):ControlHandle; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9BEH); CODE(RestoreA7); CODE(Return); END GetNewControl; PROCEDURE DisposeControl (theControl:ControlHandle); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A955H); CODE(RestoreA7); CODE(Return); END DisposeControl; PROCEDURE KillControls (wind:WindowPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A956H); CODE(RestoreA7); CODE(Return); END KillControls; (* Control Display *) PROCEDURE xSetCTitle (theControl:ControlHandle;title:ADDRESS); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95FH); CODE(RestoreA7); CODE(Return); END xSetCTitle; PROCEDURE SetCTitle (theControl:ControlHandle;VAR title:ARRAY OF CHAR); (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN MakePascalString(title,Str); xSetCTitle(theControl,ADR(Str)) END SetCTitle; PROCEDURE xGetCTitle (theControl:ControlHandle;title:ADDRESS); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95EH); CODE(RestoreA7); CODE(Return); END xGetCTitle; PROCEDURE GetCTitle (theControl:ControlHandle;VAR title:ARRAY OF CHAR); (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN xGetCTitle(theControl,ADR(Str)); MakeModulaString(Str,title) END GetCTitle; PROCEDURE HideControl (theControl:ControlHandle); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A958H); CODE(RestoreA7); CODE(Return); END HideControl; PROCEDURE ShowControl (theControl:ControlHandle); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A957H); CODE(RestoreA7); CODE(Return); END ShowControl; PROCEDURE DrawControls (theWindow:WindowPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A969H); CODE(RestoreA7); CODE(Return); END DrawControls; PROCEDURE HiliteControl (theControl:ControlHandle;hiliteState:INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95DH); CODE(RestoreA7); CODE(Return); END HiliteControl; (* Mouse Location *) PROCEDURE xTestControl(theControl:ControlHandle;thePoint:LONGINT):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A966H); CODE(RestoreA7); CODE(Return); END xTestControl; PROCEDURE TestControl (theControl: ControlHandle;thePoint:Point):INTEGER; (*$P+*)(*$S-*) BEGIN RETURN(xTestControl(theControl,thePoint.param)) END TestControl; PROCEDURE xFindControl(thePoint:LONGINT;theWindow:WindowPtr; VAR whichControl:ControlHandle):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A96CH); CODE(RestoreA7); CODE(Return); END xFindControl; PROCEDURE FindControl(thePoint:Point;theWindow:WindowPtr; VAR whichControl:ControlHandle):INTEGER; (*$P+*)(*$S-*) BEGIN RETURN(xFindControl(thePoint.param,theWindow,whichControl)) END FindControl; PROCEDURE xTrackControl(theControl:ControlHandle;startPt:LONGINT; actionProc: ADDRESS):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A968H); CODE(RestoreA7); CODE(Return); END xTrackControl; PROCEDURE TrackControl (theControl: ControlHandle; startPt:Point; actionProc: ADDRESS):INTEGER; (*$P+*)(*$S-*) BEGIN RETURN(xTrackControl(theControl,startPt.param,actionProc)) END TrackControl; VAR ProcA:PROC; PROCEDURE ProcAInterface; (*$P-*) BEGIN CODE(04E56H);CODE(0); (* LINK A6,#0 *) CODE(048E7H);CODE(0FFFCH); (* MOVEM.L D0-D7/A0-A5,-(A7)*) SETREG(8,ProcA); CODE(04E90H); (* JSR (A0) *) CODE(04CDFH);CODE(03FFFH); (* MOVEM.L (A7)+,D0-D7/A0-A5*) CODE(04E5EH); (* UNLK A6 *) CODE(04E75H); (* RTS *) END ProcAInterface; PROCEDURE TrackProcA(p:PROC):ADDRESS; (*$P+*)(*$S-*) BEGIN ProcA := p; SETREG(8,ProcAInterface); RETURN(REGISTER(8)) END TrackProcA; VAR ProcB:PROCHI; PROCEDURE ProcBInterface; (*$P-*) BEGIN CODE(04E56H);CODE(0); (* LINK A6,#0 *) CODE(048E7H);CODE(0FFFCH); (* MOVEM.L D0-D7/A0-A5,-(A7) *) CODE(02F2EH);CODE(0AH); (* MOVE.L 0A(A6),-(A7) *) CODE(03F2EH);CODE(08H); (* MOVE.W 08(A6),-(A7) *) SETREG(8,ProcB); CODE(04E90H); (* JSR (A6) *) CODE(05C8FH); (* ADDQ.L #6,A7 *) CODE(04CDFH);CODE(03FFFH); (* MOVEM.L (A7)+,D0-D7/A0-A4 *) CODE(04E5EH); (* UNLK A6 *) CODE(02F5FH);CODE(2H); (* MOVE.L (A7)+,2(A7) *) CODE(0548FH); (* ADDQ.L #2,A7 *) CODE(04E75H); (* RTS *) END ProcBInterface; PROCEDURE TrackProcB(p:PROCHI):ADDRESS; (*$P+*)(*$S-*) BEGIN ProcB := p; SETREG(8,ProcBInterface); RETURN(REGISTER(8)) END TrackProcB; (* Control Movement and Sizing *) PROCEDURE MoveControl (theControl: ControlHandle; h,v: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A959H); CODE(RestoreA7); CODE(Return); END MoveControl; PROCEDURE xDragControl (theControl: ControlHandle; startPt:LONGINT; VAR limitRect,slopRect: Rect; axis: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A967H); CODE(RestoreA7); CODE(Return); END xDragControl; PROCEDURE DragControl (theControl: ControlHandle; startPt:Point; limitRect,slopRect: Rect; axis: INTEGER); (*$P+*)(*$S-*) BEGIN xDragControl(theControl,startPt.param,limitRect,slopRect,axis) END DragControl; PROCEDURE SizeControl (theControl: ControlHandle; w,h: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95CH); CODE(RestoreA7); CODE(Return); END SizeControl; (* Control Setting and Range *) PROCEDURE SetCtlValue (theControl: ControlHandle; theValue: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A963H); CODE(RestoreA7); CODE(Return); END SetCtlValue; PROCEDURE GetCtlValue (theControl: ControlHandle):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A960H); CODE(RestoreA7); CODE(Return); END GetCtlValue; PROCEDURE SetCtlMin (theControl: ControlHandle;minValue:INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A964H); CODE(RestoreA7); CODE(Return); END SetCtlMin; PROCEDURE GetCtlMin (theControl: ControlHandle):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A961H); CODE(RestoreA7); CODE(Return); END GetCtlMin; PROCEDURE SetCtlMax (theControl: ControlHandle; maxValue:INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A965H); CODE(RestoreA7); CODE(Return); END SetCtlMax; PROCEDURE GetCtlMax (theControl: ControlHandle):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A962H); CODE(RestoreA7); CODE(Return); END GetCtlMax; (* Miscellaneous Utilities *) PROCEDURE SetCRefCon (theControl: ControlHandle; data: LONGINT); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95BH); CODE(RestoreA7); CODE(Return); END SetCRefCon; PROCEDURE GetCRefCon (theControl: ControlHandle):LONGINT; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95AH); CODE(RestoreA7); CODE(Return); END GetCRefCon; PROCEDURE SetCtlAction (theControl: ControlHandle;actionProc:ADDRESS); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A96BH); CODE(RestoreA7); CODE(Return); END SetCtlAction; PROCEDURE GetCtlAction (theControl: ControlHandle):ADDRESS; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A96BH); CODE(RestoreA7); CODE(Return); END GetCtlAction; END ControlManager. !Funky!Stuff! echo x - Conversions.MOD cat >Conversions.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE Conversions; FROM SYSTEM IMPORT WORD; PROCEDURE PAD(VAR s:ARRAY OF CHAR;size:INTEGER;c:CHAR); VAR i :CARDINAL; BEGIN IF (size >= 0) THEN FOR i := 0 TO size DO s[i] := c END END END PAD; PROCEDURE NtoS(x,base: CARDINAL; size:INTEGER; VAR str:ARRAY OF CHAR;sign,first:BOOLEAN;pad:CHAR):INTEGER; VAR RetSize : INTEGER; High : INTEGER; BEGIN High := VAL(INTEGER,HIGH(str)); IF (x = 0) THEN IF (first) THEN IF (size > High) THEN size := High END; IF (sign) THEN PAD(str,size - 2,pad); IF (size = 0) THEN size := 1; END; str[size - 1] := '-'; ELSE PAD(str,size - 1,pad); END; str[size] := '0'; ELSE IF (sign) THEN IF (size < 0) THEN PAD(str,High,'*'); RETURN(-2) END; PAD(str,size - 1,pad); str[size] := '-' ELSE PAD(str,size,pad); END; END; (*IF*) IF (first AND (size # High)) THEN str[size + 1] := 0C END; RETURN(size) ELSE (* x is not 0 *) IF (size < 0) THEN size := 0 END; RetSize := NtoS(x DIV base,base,size - 1,str,sign,FALSE,pad); IF (RetSize = -2) THEN RETURN(RetSize) END; IF size <= RetSize THEN size := RetSize + 1; END; IF (size > High) THEN PAD(str,High,'*'); RETURN(-2); ELSE str[size] := CHR(ORD('0') + x MOD base); IF str[size] > '9' THEN str[size] := CHR(ORD(str[size]) - ORD('0') + ORD('A') - 10) END; IF (first AND (size # High)) THEN str[size + 1] := 0C END; RETURN(size) END END END NtoS; PROCEDURE IntToStr(i : INTEGER;VAR s : ARRAY OF CHAR; p : CARDINAL):BOOLEAN; VAR RetSize : INTEGER; BEGIN IF (p = 0) THEN RetSize := 0 ELSE RetSize := VAL(INTEGER,p) - 1; END; RetSize := NtoS(ABS(i),10,RetSize,s,(i < 0),TRUE,' '); RETURN(RetSize # -2) END IntToStr; PROCEDURE StrToInt(VAR s : ARRAY OF CHAR; VAR x : INTEGER):BOOLEAN; VAR i : CARDINAL; neg : BOOLEAN; BEGIN i := 0; x := 0; WHILE ((i < HIGH(s)) AND ((s[i] = ' ') OR (s[i] = ' '))) DO INC(i) END; (* Assert at worst i = HIGH(s) *) IF (s[i] = '-') THEN neg := TRUE; INC(i); IF (i > HIGH(s)) THEN RETURN(FALSE) END END; REPEAT IF ((s[i] < '0') OR (s[i] > '9')) THEN RETURN(FALSE) ELSE x := x * 10 + INTEGER(ORD(s[i])) - INTEGER(ORD('0')) END; INC(i) UNTIL ((i > HIGH(s)) OR (s[i] = 0C)); IF neg THEN x := -x; END; RETURN(TRUE) END StrToInt; PROCEDURE CardToStr(c : CARDINAL; VAR s : ARRAY OF CHAR; p : CARDINAL):BOOLEAN; VAR RetSize : INTEGER; BEGIN IF (p = 0) THEN RetSize := 0 ELSE RetSize := VAL(INTEGER,p) - 1; END; RetSize := NtoS(c,10,RetSize,s,FALSE,TRUE,' '); RETURN(RetSize # -2) END CardToStr; PROCEDURE StrToCard(VAR s:ARRAY OF CHAR; VAR c:CARDINAL):BOOLEAN; VAR i : CARDINAL; BEGIN i := 0; c := 0; WHILE ((i < HIGH(s)) AND ((s[i] = ' ') OR (s[i] = ' '))) DO INC(i) END; (* Assert at worst i = HIGH(s) *) REPEAT IF ((s[i] < '0') OR (s[i] > '9')) THEN RETURN(FALSE) ELSE c := c * 10 + ORD(s[i]) - ORD('0') END; INC(i) UNTIL ((i > HIGH(s)) OR (s[i] = 0C)); RETURN(TRUE) END StrToCard; PROCEDURE HexToStr(w:WORD;VAR s:ARRAY OF CHAR; p : CARDINAL):BOOLEAN; VAR RetSize : INTEGER; BEGIN IF (p = 0) THEN RetSize := 0 ELSE RetSize := VAL(INTEGER,p) - 1; END; RetSize := NtoS(CARDINAL(w),16,RetSize,s,FALSE,TRUE,'0'); RETURN(RetSize # -2) END HexToStr; PROCEDURE StrToHex(VAR s:ARRAY OF CHAR;VAR w:WORD):BOOLEAN; VAR i : CARDINAL; c : CARDINAL; BEGIN i := 0; c := 0; WHILE ((i < HIGH(s)) AND ((s[i] = ' ') OR (s[i] = ' '))) DO INC(i) END; (* Assert at worst i = HIGH(s) *) REPEAT IF ((s[i] < '0') OR (s[i] > '9')) THEN IF ((s[i] >= 'A') AND (s[i] <= 'F')) THEN c := c * 10 + ORD(s[i]) - ORD('A') + 10 ELSE RETURN(FALSE) END ELSE c := c * 10 + ORD(s[i]) - ORD('0') END; INC(i) UNTIL ((i > HIGH(s)) OR (s[i] = 0C)); w := WORD(c); RETURN(TRUE) END StrToHex; PROCEDURE OctToStr(w:WORD;VAR s:ARRAY OF CHAR; p : CARDINAL):BOOLEAN; VAR RetSize : INTEGER; BEGIN IF (p = 0) THEN RetSize := 0 ELSE RetSize := VAL(INTEGER,p) - 1; END; RetSize := NtoS(CARDINAL(w),8,RetSize,s,FALSE,TRUE,'0'); RETURN(RetSize # -2) END OctToStr; PROCEDURE StrToOct(VAR s:ARRAY OF CHAR;VAR w:WORD):BOOLEAN; VAR i : CARDINAL; c : CARDINAL; BEGIN i := 0; c := 0; WHILE ((i < HIGH(s)) AND ((s[i] = ' ') OR (s[i] = ' '))) DO INC(i) END; (* Assert at worst i = HIGH(s) *) REPEAT IF ((s[i] < '0') OR (s[i] > '7')) THEN RETURN(FALSE) ELSE c := c * 10 + ORD(s[i]) - ORD('0') END; INC(i) UNTIL ((i > HIGH(s)) OR (s[i] = 0C)); w := WORD(c); RETURN(TRUE) END StrToOct; END Conversions. !Funky!Stuff! echo x - Cursors.MOD cat >Cursors.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE Cursors; FROM SYSTEM IMPORT ADDRESS,WORD,CODE,ADR,REGISTER; FROM MacSYSTEM IMPORT LONGINT; FROM QuickDraw IMPORT Point,Rect,Bits16,Cursor; CONST GetRet = 0285FH; (* MOVEA (A7)+,A4 *) Return = 04ED4H; (* JMP A4 *) SaveA7 = 0264FH; (* MOVEA A7,A3 *) RestoreA7 = 02E4BH; (* MOVEA A3,A7 *) (* Cursor Routines *) PROCEDURE GetCursor(cursorID:INTEGER):CursHandle; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B9H); CODE(RestoreA7); CODE(Return); END GetCursor; PROCEDURE xShieldCursor(shieldRect:Rect;offsetPt:LONGINT); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A855H); CODE(RestoreA7); CODE(Return); END xShieldCursor; PROCEDURE ShieldCursor(shieldRect:Rect;offsetPt:Point); (*$P+*)(*$S-*) BEGIN xShieldCursor(shieldRect,offsetPt.param) END ShieldCursor; PROCEDURE InitCursor; (*$P+*)(*$S-*) BEGIN CODE(0A850H); END InitCursor; PROCEDURE SetCursor(VAR crsr: Cursor); (*$P-*) BEGIN CODE(GetRet);CODE(SaveA7); CODE(0A851H); CODE(RestoreA7);CODE(Return); END SetCursor; PROCEDURE HideCursor; (*$P+*)(*$S-*) BEGIN CODE(0A852H); END HideCursor; PROCEDURE ShowCursor; (*$P+*)(*$S-*) BEGIN CODE(0A853H); END ShowCursor; PROCEDURE ObscureCursor; (*$P+*)(*S-*) BEGIN CODE(0A856H); END ObscureCursor; END Cursors. !Funky!Stuff! echo x - DeskManager.MOD cat >DeskManager.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE DeskManager; FROM SYSTEM IMPORT ADDRESS,WORD,CODE,ADR,REGISTER; FROM MacSYSTEM IMPORT LONGINT; FROM EventManager IMPORT EventRecord; FROM WindowManager IMPORT WindowPtr; CONST GetRet = 0285FH; (* MOVEA (A7)+,A4 *) Return = 04ED4H; (* JMP A4 *) SaveA7 = 0264FH; (* MOVEA A7,A3 *) RestoreA7 = 02E4BH; (* MOVEA A3,A7 *) PROCEDURE xOpenDeskAcc(theAcc:ADDRESS):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B6H); CODE(RestoreA7); CODE(Return); END xOpenDeskAcc; (* This is for the silly null in DeskAcc names *) PROCEDURE DeskAccString(VAR in,out:ARRAY OF CHAR); (*$P+*)(*$S-*) VAR i:CARDINAL; BEGIN out[1] := in[0]; (* copy the null *) i := 1; REPEAT out[i + 1] := in[i]; INC(i); UNTIL ((i > HIGH(in)) OR (in[i] = 0C)); out[0] := CHR(i) END DeskAccString; PROCEDURE OpenDeskAcc(VAR theAcc:ARRAY OF CHAR):INTEGER; (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN DeskAccString(theAcc,Str); RETURN(xOpenDeskAcc(ADR(Str))) END OpenDeskAcc; PROCEDURE CloseDeskAcc(refNum:INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B7H); CODE(RestoreA7); CODE(Return); END CloseDeskAcc; PROCEDURE SystemClick(VAR theEvent:EventRecord;theWindow:WindowPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B3H); CODE(RestoreA7); CODE(Return); END SystemClick; PROCEDURE SystemEdit(editCmd:INTEGER):BOOLEAN; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9C2H); CODE(RestoreA7); CODE(Return); END SystemEdit; PROCEDURE SystemTask; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B4H); CODE(RestoreA7); CODE(Return); END SystemTask; PROCEDURE SystemEvent(VAR theEvent:EventRecord):BOOLEAN; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B2H); CODE(RestoreA7); CODE(Return); END SystemEvent; PROCEDURE SystemMenu(menuResult:LONGINT); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B5H); CODE(RestoreA7); CODE(Return); END SystemMenu; END DeskManager. !Funky!Stuff! echo x - DialogManager.MOD cat >DialogManager.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE DialogManager; FROM SYSTEM IMPORT ADDRESS,CODE,ADR,SETREG,REGISTER; FROM Storage IMPORT ALLOCATE,DEALLOCATE; FROM QuickDraw IMPORT Rect; FROM MacSYSTEM IMPORT Handle, LONGINT, Ptr,StringPtr; FROM WindowManager IMPORT WindowPtr; FROM TextEdit IMPORT TEHandle,TECut,TECopy,TEPaste,TEDelete; FROM EventManager IMPORT EventRecord; FROM PascalStrings IMPORT MakePascalString, MakeModulaString; CONST GetRet=0285FH; Return=04ED4H; SaveA7=0264FH; RestoreA7=02E4BH; (* Misc *) VAR Sound : SoundProc; VAR MyParamText: ARRAY [0..3] OF StringPtr; PROCEDURE SoundInterface; (*$P-*) BEGIN CODE(04E56H);CODE(0); (* LINK A6,#0 *) CODE(048E7H);CODE(01F38H); (* MOVEM.L D3-D7/A2-A4,-(A7) *) CODE(03F2EH);CODE(08H); (* MOVE.W 08(A6),-(A7) *) SETREG(8,Sound); CODE(04E90H); (* JSR (A0) *) CODE(05C8FH); (* ADDQ.L #6,A7 *) CODE(04CDFH);CODE(01CF8H); (* MOVEM.L (A7)+,D3-D7/A2-A4 *) CODE(04E5EH); (* UNLK A6 *) CODE(0205FH); (* MOVEA.L (A7)+,A0 *) CODE(05C8FH); (* ADDQ.L #6,A7 *) CODE(04ED0H); (* JMP (A0) *) END SoundInterface; PROCEDURE UseSoundProc(MySound: SoundProc):ADDRESS; (*$P+*)(*$S-*) BEGIN Sound := MySound; SETREG(8,SoundInterface); RETURN(REGISTER(8)) END UseSoundProc; (* initialization *) PROCEDURE InitDialogs (restartProc: ADDRESS); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97BH); CODE(RestoreA7); CODE(Return); END InitDialogs; PROCEDURE ErrorSound (MySound: ADDRESS); BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98CH); CODE(RestoreA7); CODE(Return); END ErrorSound; PROCEDURE SetDAFont (fontNum: INTEGER); (*$P+*) BEGIN DlgFont := fontNum END SetDAFont; (* Creating and disposing OF dialogs *) PROCEDURE xNewDialog(dStorage:ADDRESS;VAR boundsRect:Rect; title:ADDRESS; visible: BOOLEAN; procID: INTEGER; behind: WindowPtr; goAwayFlag: BOOLEAN; refCon: LONGINT; items: Handle) : DialogPtr; (* $P- *) BEGIN CODE(GetRet);CODE(SaveA7); CODE(0A97DH); CODE(RestoreA7); CODE(Return); END xNewDialog; PROCEDURE NewDialog(dStorage: ADDRESS; boundsRect:Rect; VAR title:ARRAY OF CHAR; visible: BOOLEAN; procID: INTEGER; behind: WindowPtr; goAwayFlag: BOOLEAN; refCon: LONGINT; items: Handle) : DialogPtr; VAR s: ARRAY[0..255] OF CHAR; (*$P+*)(*$S-*) BEGIN MakePascalString(title,s); RETURN(xNewDialog(dStorage,boundsRect,ADR(s),visible,procID,behind, goAwayFlag,refCon,items)) END NewDialog; PROCEDURE GetNewDialog(dialogID:INTEGER;dStorage:ADDRESS; behind:WindowPtr):DialogPtr; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97CH); CODE(RestoreA7); CODE(Return) END GetNewDialog; PROCEDURE CloseDialog(theDialog: DialogPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A982H); CODE(RestoreA7); CODE(Return) END CloseDialog; PROCEDURE DisposDialog(theDialog:DialogPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A983H); CODE(RestoreA7); CODE(Return) END DisposDialog; PROCEDURE CouldDialog(dialogID: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A979H); CODE(RestoreA7); CODE(Return); END CouldDialog; PROCEDURE FreeDialog(dialogID: INTEGER); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97AH); CODE(RestoreA7); CODE(Return); END FreeDialog; (* Handling Dialog events *) PROCEDURE NoFilterProc():ADDRESS; BEGIN RETURN(ADDRESS(0)) END NoFilterProc; VAR Filter:FilterProc; PROCEDURE FilterInterface; (*$P-*) BEGIN CODE(04E56H);CODE(0); (* LINK A6,#0 *) CODE(048E7H);CODE(01F38H); (* MOVEM.L D3-D7/A2-A4,-(A7) *) CODE(04267H); (* CLR.W -(A7) *) CODE(02F2EH);CODE(010H); (* MOVE.L 010(A6),-(A7) *) CODE(02F2EH);CODE(0CH); (* MOVE.L 0C(A6),-(A7) *) CODE(02F2EH);CODE(08H); (* MOVE.L 08(A6),-(A7) *) SETREG(8,Filter); CODE(04E90H); (* JSR (A0) *) CODE(04FEFH);CODE(000CH); (* LEA A7,000C(A7) *) CODE(03D5FH);CODE(014H); (* MOVE.L (A7)+,14(A6) *) CODE(04CDFH);CODE(01CF8H); (* MOVEM.L (A7)+,D3-D7/A2-A4 *) CODE(04E5EH); (* UNLK A6 *) CODE(0205FH); (* MOVEA.L (A7)+,A0 *) CODE(04FEFH);CODE(000CH); (* LEA A7,000C(A7) *) CODE(04ED0H); (* JMP (A0) *) END FilterInterface; PROCEDURE UseFilterProc(myFilter:FilterProc):ADDRESS; (*$P+*)(*$S-*) BEGIN Filter := myFilter; SETREG(8,FilterInterface); RETURN(REGISTER(8)) END UseFilterProc; PROCEDURE ModalDialog(myFilter:ADDRESS; VAR itemHit: INTEGER); (* $P- *) BEGIN CODE(GetRet);CODE(SaveA7); CODE(0A991H); CODE(RestoreA7); CODE(Return); END ModalDialog; PROCEDURE IsDialogEvent(VAR theEvent: EventRecord) : BOOLEAN; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97FH); CODE(RestoreA7); CODE(Return); END IsDialogEvent; PROCEDURE DialogSelect(VAR theEvent: EventRecord; VAR theDialog: DialogPtr; VAR itemHit: INTEGER) : BOOLEAN; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A980H); CODE(RestoreA7); CODE(Return); END DialogSelect; PROCEDURE DlgCut(theDialog: DialogPtr); (*$P+*) VAR d : DialogPeek; BEGIN d := DialogPeek(theDialog); IF (d^.editField >= 0) THEN TECut(d^.textH) END END DlgCut; PROCEDURE DlgCopy(theDialog: DialogPtr); VAR d : DialogPeek; BEGIN d := DialogPeek(theDialog); IF (d^.editField >= 0) THEN TECopy(d^.textH) END END DlgCopy; PROCEDURE DlgPaste(theDialog: DialogPtr); VAR d : DialogPeek; BEGIN d := DialogPeek(theDialog); IF (d^.editField >= 0) THEN TEPaste(d^.textH) END END DlgPaste; PROCEDURE DlgDelete(theDialog: DialogPtr); VAR d : DialogPeek; BEGIN d := DialogPeek(theDialog); IF (d^.editField >= 0) THEN TEDelete(d^.textH) END END DlgDelete; PROCEDURE DrawDialog (theDialog: DialogPtr); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A981H); CODE(RestoreA7); CODE(Return); END DrawDialog; (* invoking alerts *) PROCEDURE Alert(alertID: INTEGER; myFilter:ADDRESS): INTEGER; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A985H); CODE(RestoreA7); CODE(Return); END Alert; PROCEDURE StopAlert(alertID: INTEGER; myFilter:ADDRESS): INTEGER; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A986H); CODE(RestoreA7); CODE(Return); END StopAlert; PROCEDURE NoteAlert(alertID: INTEGER; myFilter:ADDRESS): INTEGER; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A987H); CODE(RestoreA7); CODE(Return); END NoteAlert; PROCEDURE CautionAlert(alertID: INTEGER; myFilter:ADDRESS): INTEGER; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A988H); CODE(RestoreA7); CODE(Return); END CautionAlert; PROCEDURE CouldAlert(alertID: INTEGER); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A989H); CODE(RestoreA7); CODE(Return); END CouldAlert; PROCEDURE FreeAlert(alertID: INTEGER); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98AH); CODE(RestoreA7); CODE(Return); END FreeAlert; (* manipulation items in dialog and alerts *) PROCEDURE ParamText(VAR param0,param1,param2,param3: ARRAY OF CHAR); (*$P+*)(*$S-*) BEGIN IF (MyParamText[0] # NIL) THEN DEALLOCATE(MyParamText[0],255) END; ALLOCATE(MyParamText[0],HIGH(param0)+2); MakePascalString(param0,MyParamText[0]^); IF (MyParamText[1] # NIL) THEN DEALLOCATE(MyParamText[1],255) END; ALLOCATE(MyParamText[1],HIGH(param1)+2); MakePascalString(param1,MyParamText[1]^); IF (MyParamText[2] # NIL) THEN DEALLOCATE(MyParamText[2],255) END; ALLOCATE(MyParamText[2],HIGH(param2)+2); MakePascalString(param2,MyParamText[2]^); IF (MyParamText[3] # NIL) THEN DEALLOCATE(MyParamText[3],255) END; ALLOCATE(MyParamText[3],HIGH(param3)+2); MakePascalString(param3,MyParamText[3]^); DAStrings[0] := ADDRESS(MyParamText[0]); DAStrings[1] := ADDRESS(MyParamText[1]); DAStrings[2] := ADDRESS(MyParamText[2]); DAStrings[3] := ADDRESS(MyParamText[3]); END ParamText; PROCEDURE GetDItem(theDialog: DialogPtr; itemNo: INTEGER; VAR type: INTEGER; VAR item: Handle; VAR box: Rect); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98DH); CODE(RestoreA7); CODE(Return); END GetDItem; PROCEDURE SetDItem (theDialog: DialogPtr; itemNo: INTEGER; type: INTEGER; item: Handle; VAR box: Rect); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98EH); CODE(RestoreA7); CODE(Return); END SetDItem; PROCEDURE xGetIText(item: Handle; text: ADDRESS); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A990H); CODE(RestoreA7); CODE(Return); END xGetIText; PROCEDURE GetIText(item: Handle; VAR text: ARRAY OF CHAR); VAR s: ARRAY [0..255] OF CHAR; BEGIN xGetIText(item,ADR(s)); MakeModulaString(s,text); END GetIText; PROCEDURE xSetIText(item: Handle; text: ADDRESS); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98FH); CODE(RestoreA7); CODE(Return); END xSetIText; PROCEDURE SetIText(item: Handle; VAR text: ARRAY OF CHAR); VAR s: ARRAY [0..255] OF CHAR; BEGIN MakePascalString(text,s); xSetIText(item,ADR(s)); END SetIText; PROCEDURE SelIText(theDialog: DialogPtr; itemNo: INTEGER; strtSel,endSel: INTEGER); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97EH); CODE(RestoreA7); CODE(Return); END SelIText; PROCEDURE GetAlrtStage(): INTEGER; (*$P+*) BEGIN RETURN(ACount) END GetAlrtStage; PROCEDURE ResetAlrtStage; (*$P+*) BEGIN ACount := -1 END ResetAlrtStage; BEGIN MyParamText[0] := NIL; MyParamText[1] := NIL; MyParamText[2] := NIL; MyParamText[3] := NIL; InitDialogs(ADDRESS(0)); END DialogManager. !Funky!Stuff! # The rest of this file is a shell script which will extract: # BDPackage.MOD ControlManager.MOD Conversions.MOD Cursors.MOD DeskManager.MOD DialogManager.MOD echo x - BDPackage.MOD cat >BDPackage.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE BDPackage; FROM SYSTEM IMPORT ADDRESS,CODE,ADR,REGISTER,SETREG; FROM MacSYSTEM IMPORT LONGINT; FROM PascalStrings IMPORT MakeModulaString,MakePascalString; CONST GetRet = 0285FH; (* MOVEA (A7)+,A4 *) Return = 04ED4H; (* JMP A4 *) SaveA7 = 0264FH; (* MOVEA A7,A3 *) RestoreA7 = 02E4BH; (* MOVEA A3,A7 *) Push = 03F3CH; (* MOVE #VAL,-(A7) *) Pack7 = 0A9EEH; pNumToString= 0; pStringToNum= 1; PROCEDURE xStringToNum(theString:ADDRESS;VAR theNum:LONGINT); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(Push); CODE(pStringToNum); CODE(Pack7); CODE(RestoreA7); CODE(Return); END xStringToNum; PROCEDURE NumToString(theNum:LONGINT;VAR theString:ARRAY OF CHAR); (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN SETREG(0,theNum); SETREG(8,ADR(Str)); CODE(Push); CODE(pNumToString); CODE(Pack7); MakeModulaString(Str,theString) END NumToString; PROCEDURE StringToNum(VAR theString:ARRAY OF CHAR;VAR theNum:LONGINT); (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN MakePascalString(theString,Str); SETREG(8,ADR(Str)); CODE(Push); CODE(pStringToNum); CODE(Pack7); theNum := REGISTER(0) END StringToNum END BDPackage. !Funky!Stuff! echo x - ControlManager.MOD cat >ControlManager.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE ControlManager; FROM SYSTEM IMPORT ADDRESS,CODE,ADR,SETREG,REGISTER; FROM MacSYSTEM IMPORT LONGINT,Handle; FROM QuickDraw IMPORT Point,Rect; FROM WindowManager IMPORT WindowPtr; FROM PascalStrings IMPORT MakePascalString,MakeModulaString; CONST GetRet = 0285FH; (* MOVEA (A7)+,A4 *) Return = 04ED4H; (* JMP (A4) *) SaveA7 = 0264FH; (* MOVEA A7,A3 *) RestoreA7 = 02E4BH; (* MOVEA A3,A7 *) (* Init and Alloc *) PROCEDURE xNewControl(Wind:WindowPtr;VAR bounds:Rect;title:ADDRESS; visible:BOOLEAN;value:INTEGER;min,max:INTEGER;procID:INTEGER; refCon:LONGINT): ControlHandle; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A954H); CODE(RestoreA7); CODE(Return); END xNewControl; PROCEDURE NewControl(Wind:WindowPtr;bounds:Rect;VAR title:ARRAY OF CHAR; visible:BOOLEAN;value:INTEGER;min,max:INTEGER;procID:INTEGER; refCon:LONGINT): ControlHandle; (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN MakePascalString(title,Str); RETURN(xNewControl(Wind,bounds,ADR(Str),visible,value,min,max,procID,refCon)) END NewControl; PROCEDURE GetNewControl (controlID:INTEGER;wind:WindowPtr):ControlHandle; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9BEH); CODE(RestoreA7); CODE(Return); END GetNewControl; PROCEDURE DisposeControl (theControl:ControlHandle); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A955H); CODE(RestoreA7); CODE(Return); END DisposeControl; PROCEDURE KillControls (wind:WindowPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A956H); CODE(RestoreA7); CODE(Return); END KillControls; (* Control Display *) PROCEDURE xSetCTitle (theControl:ControlHandle;title:ADDRESS); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95FH); CODE(RestoreA7); CODE(Return); END xSetCTitle; PROCEDURE SetCTitle (theControl:ControlHandle;VAR title:ARRAY OF CHAR); (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN MakePascalString(title,Str); xSetCTitle(theControl,ADR(Str)) END SetCTitle; PROCEDURE xGetCTitle (theControl:ControlHandle;title:ADDRESS); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95EH); CODE(RestoreA7); CODE(Return); END xGetCTitle; PROCEDURE GetCTitle (theControl:ControlHandle;VAR title:ARRAY OF CHAR); (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN xGetCTitle(theControl,ADR(Str)); MakeModulaString(Str,title) END GetCTitle; PROCEDURE HideControl (theControl:ControlHandle); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A958H); CODE(RestoreA7); CODE(Return); END HideControl; PROCEDURE ShowControl (theControl:ControlHandle); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A957H); CODE(RestoreA7); CODE(Return); END ShowControl; PROCEDURE DrawControls (theWindow:WindowPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A969H); CODE(RestoreA7); CODE(Return); END DrawControls; PROCEDURE HiliteControl (theControl:ControlHandle;hiliteState:INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95DH); CODE(RestoreA7); CODE(Return); END HiliteControl; (* Mouse Location *) PROCEDURE xTestControl(theControl:ControlHandle;thePoint:LONGINT):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A966H); CODE(RestoreA7); CODE(Return); END xTestControl; PROCEDURE TestControl (theControl: ControlHandle;thePoint:Point):INTEGER; (*$P+*)(*$S-*) BEGIN RETURN(xTestControl(theControl,thePoint.param)) END TestControl; PROCEDURE xFindControl(thePoint:LONGINT;theWindow:WindowPtr; VAR whichControl:ControlHandle):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A96CH); CODE(RestoreA7); CODE(Return); END xFindControl; PROCEDURE FindControl(thePoint:Point;theWindow:WindowPtr; VAR whichControl:ControlHandle):INTEGER; (*$P+*)(*$S-*) BEGIN RETURN(xFindControl(thePoint.param,theWindow,whichControl)) END FindControl; PROCEDURE xTrackControl(theControl:ControlHandle;startPt:LONGINT; actionProc: ADDRESS):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A968H); CODE(RestoreA7); CODE(Return); END xTrackControl; PROCEDURE TrackControl (theControl: ControlHandle; startPt:Point; actionProc: ADDRESS):INTEGER; (*$P+*)(*$S-*) BEGIN RETURN(xTrackControl(theControl,startPt.param,actionProc)) END TrackControl; VAR ProcA:PROC; PROCEDURE ProcAInterface; (*$P-*) BEGIN CODE(04E56H);CODE(0); (* LINK A6,#0 *) CODE(048E7H);CODE(0FFFCH); (* MOVEM.L D0-D7/A0-A5,-(A7)*) SETREG(8,ProcA); CODE(04E90H); (* JSR (A0) *) CODE(04CDFH);CODE(03FFFH); (* MOVEM.L (A7)+,D0-D7/A0-A5*) CODE(04E5EH); (* UNLK A6 *) CODE(04E75H); (* RTS *) END ProcAInterface; PROCEDURE TrackProcA(p:PROC):ADDRESS; (*$P+*)(*$S-*) BEGIN ProcA := p; SETREG(8,ProcAInterface); RETURN(REGISTER(8)) END TrackProcA; VAR ProcB:PROCHI; PROCEDURE ProcBInterface; (*$P-*) BEGIN CODE(04E56H);CODE(0); (* LINK A6,#0 *) CODE(048E7H);CODE(0FFFCH); (* MOVEM.L D0-D7/A0-A5,-(A7) *) CODE(02F2EH);CODE(0AH); (* MOVE.L 0A(A6),-(A7) *) CODE(03F2EH);CODE(08H); (* MOVE.W 08(A6),-(A7) *) SETREG(8,ProcB); CODE(04E90H); (* JSR (A6) *) CODE(05C8FH); (* ADDQ.L #6,A7 *) CODE(04CDFH);CODE(03FFFH); (* MOVEM.L (A7)+,D0-D7/A0-A4 *) CODE(04E5EH); (* UNLK A6 *) CODE(02F5FH);CODE(2H); (* MOVE.L (A7)+,2(A7) *) CODE(0548FH); (* ADDQ.L #2,A7 *) CODE(04E75H); (* RTS *) END ProcBInterface; PROCEDURE TrackProcB(p:PROCHI):ADDRESS; (*$P+*)(*$S-*) BEGIN ProcB := p; SETREG(8,ProcBInterface); RETURN(REGISTER(8)) END TrackProcB; (* Control Movement and Sizing *) PROCEDURE MoveControl (theControl: ControlHandle; h,v: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A959H); CODE(RestoreA7); CODE(Return); END MoveControl; PROCEDURE xDragControl (theControl: ControlHandle; startPt:LONGINT; VAR limitRect,slopRect: Rect; axis: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A967H); CODE(RestoreA7); CODE(Return); END xDragControl; PROCEDURE DragControl (theControl: ControlHandle; startPt:Point; limitRect,slopRect: Rect; axis: INTEGER); (*$P+*)(*$S-*) BEGIN xDragControl(theControl,startPt.param,limitRect,slopRect,axis) END DragControl; PROCEDURE SizeControl (theControl: ControlHandle; w,h: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95CH); CODE(RestoreA7); CODE(Return); END SizeControl; (* Control Setting and Range *) PROCEDURE SetCtlValue (theControl: ControlHandle; theValue: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A963H); CODE(RestoreA7); CODE(Return); END SetCtlValue; PROCEDURE GetCtlValue (theControl: ControlHandle):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A960H); CODE(RestoreA7); CODE(Return); END GetCtlValue; PROCEDURE SetCtlMin (theControl: ControlHandle;minValue:INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A964H); CODE(RestoreA7); CODE(Return); END SetCtlMin; PROCEDURE GetCtlMin (theControl: ControlHandle):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A961H); CODE(RestoreA7); CODE(Return); END GetCtlMin; PROCEDURE SetCtlMax (theControl: ControlHandle; maxValue:INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A965H); CODE(RestoreA7); CODE(Return); END SetCtlMax; PROCEDURE GetCtlMax (theControl: ControlHandle):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A962H); CODE(RestoreA7); CODE(Return); END GetCtlMax; (* Miscellaneous Utilities *) PROCEDURE SetCRefCon (theControl: ControlHandle; data: LONGINT); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95BH); CODE(RestoreA7); CODE(Return); END SetCRefCon; PROCEDURE GetCRefCon (theControl: ControlHandle):LONGINT; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95AH); CODE(RestoreA7); CODE(Return); END GetCRefCon; PROCEDURE SetCtlAction (theControl: ControlHandle;actionProc:ADDRESS); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A96BH); CODE(RestoreA7); CODE(Return); END SetCtlAction; PROCEDURE GetCtlAction (theControl: ControlHandle):ADDRESS; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A96BH); CODE(RestoreA7); CODE(Return); END GetCtlAction; END ControlManager. !Funky!Stuff! echo x - Conversions.MOD cat >Conversions.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE Conversions; FROM SYSTEM IMPORT WORD; PROCEDURE PAD(VAR s:ARRAY OF CHAR;size:INTEGER;c:CHAR); VAR i :CARDINAL; BEGIN IF (size >= 0) THEN FOR i := 0 TO size DO s[i] := c END END END PAD; PROCEDURE NtoS(x,base: CARDINAL; size:INTEGER; VAR str:ARRAY OF CHAR;sign,first:BOOLEAN;pad:CHAR):INTEGER; VAR RetSize : INTEGER; High : INTEGER; BEGIN High := VAL(INTEGER,HIGH(str)); IF (x = 0) THEN IF (first) THEN IF (size > High) THEN size := High END; IF (sign) THEN PAD(str,size - 2,pad); IF (size = 0) THEN size := 1; END; str[size - 1] := '-'; ELSE PAD(str,size - 1,pad); END; str[size] := '0'; ELSE IF (sign) THEN IF (size < 0) THEN PAD(str,High,'*'); RETURN(-2) END; PAD(str,size - 1,pad); str[size] := '-' ELSE PAD(str,size,pad); END; END; (*IF*) IF (first AND (size # High)) THEN str[size + 1] := 0C END; RETURN(size) ELSE (* x is not 0 *) IF (size < 0) THEN size := 0 END; RetSize := NtoS(x DIV base,base,size - 1,str,sign,FALSE,pad); IF (RetSize = -2) THEN RETURN(RetSize) END; IF size <= RetSize THEN size := RetSize + 1; END; IF (size > High) THEN PAD(str,High,'*'); RETURN(-2); ELSE str[size] := CHR(ORD('0') + x MOD base); IF str[size] > '9' THEN str[size] := CHR(ORD(str[size]) - ORD('0') + ORD('A') - 10) END; IF (first AND (size # High)) THEN str[size + 1] := 0C END; RETURN(size) END END END NtoS; PROCEDURE IntToStr(i : INTEGER;VAR s : ARRAY OF CHAR; p : CARDINAL):BOOLEAN; VAR RetSize : INTEGER; BEGIN IF (p = 0) THEN RetSize := 0 ELSE RetSize := VAL(INTEGER,p) - 1; END; RetSize := NtoS(ABS(i),10,RetSize,s,(i < 0),TRUE,' '); RETURN(RetSize # -2) END IntToStr; PROCEDURE StrToInt(VAR s : ARRAY OF CHAR; VAR x : INTEGER):BOOLEAN; VAR i : CARDINAL; neg : BOOLEAN; BEGIN i := 0; x := 0; WHILE ((i < HIGH(s)) AND ((s[i] = ' ') OR (s[i] = ' '))) DO INC(i) END; (* Assert at worst i = HIGH(s) *) IF (s[i] = '-') THEN neg := TRUE; INC(i); IF (i > HIGH(s)) THEN RETURN(FALSE) END END; REPEAT IF ((s[i] < '0') OR (s[i] > '9')) THEN RETURN(FALSE) ELSE x := x * 10 + INTEGER(ORD(s[i])) - INTEGER(ORD('0')) END; INC(i) UNTIL ((i > HIGH(s)) OR (s[i] = 0C)); IF neg THEN x := -x; END; RETURN(TRUE) END StrToInt; PROCEDURE CardToStr(c : CARDINAL; VAR s : ARRAY OF CHAR; p : CARDINAL):BOOLEAN; VAR RetSize : INTEGER; BEGIN IF (p = 0) THEN RetSize := 0 ELSE RetSize := VAL(INTEGER,p) - 1; END; RetSize := NtoS(c,10,RetSize,s,FALSE,TRUE,' '); RETURN(RetSize # -2) END CardToStr; PROCEDURE StrToCard(VAR s:ARRAY OF CHAR; VAR c:CARDINAL):BOOLEAN; VAR i : CARDINAL; BEGIN i := 0; c := 0; WHILE ((i < HIGH(s)) AND ((s[i] = ' ') OR (s[i] = ' '))) DO INC(i) END; (* Assert at worst i = HIGH(s) *) REPEAT IF ((s[i] < '0') OR (s[i] > '9')) THEN RETURN(FALSE) ELSE c := c * 10 + ORD(s[i]) - ORD('0') END; INC(i) UNTIL ((i > HIGH(s)) OR (s[i] = 0C)); RETURN(TRUE) END StrToCard; PROCEDURE HexToStr(w:WORD;VAR s:ARRAY OF CHAR; p : CARDINAL):BOOLEAN; VAR RetSize : INTEGER; BEGIN IF (p = 0) THEN RetSize := 0 ELSE RetSize := VAL(INTEGER,p) - 1; END; RetSize := NtoS(CARDINAL(w),16,RetSize,s,FALSE,TRUE,'0'); RETURN(RetSize # -2) END HexToStr; PROCEDURE StrToHex(VAR s:ARRAY OF CHAR;VAR w:WORD):BOOLEAN; VAR i : CARDINAL; c : CARDINAL; BEGIN i := 0; c := 0; WHILE ((i < HIGH(s)) AND ((s[i] = ' ') OR (s[i] = ' '))) DO INC(i) END; (* Assert at worst i = HIGH(s) *) REPEAT IF ((s[i] < '0') OR (s[i] > '9')) THEN IF ((s[i] >= 'A') AND (s[i] <= 'F')) THEN c := c * 10 + ORD(s[i]) - ORD('A') + 10 ELSE RETURN(FALSE) END ELSE c := c * 10 + ORD(s[i]) - ORD('0') END; INC(i) UNTIL ((i > HIGH(s)) OR (s[i] = 0C)); w := WORD(c); RETURN(TRUE) END StrToHex; PROCEDURE OctToStr(w:WORD;VAR s:ARRAY OF CHAR; p : CARDINAL):BOOLEAN; VAR RetSize : INTEGER; BEGIN IF (p = 0) THEN RetSize := 0 ELSE RetSize := VAL(INTEGER,p) - 1; END; RetSize := NtoS(CARDINAL(w),8,RetSize,s,FALSE,TRUE,'0'); RETURN(RetSize # -2) END OctToStr; PROCEDURE StrToOct(VAR s:ARRAY OF CHAR;VAR w:WORD):BOOLEAN; VAR i : CARDINAL; c : CARDINAL; BEGIN i := 0; c := 0; WHILE ((i < HIGH(s)) AND ((s[i] = ' ') OR (s[i] = ' '))) DO INC(i) END; (* Assert at worst i = HIGH(s) *) REPEAT IF ((s[i] < '0') OR (s[i] > '7')) THEN RETURN(FALSE) ELSE c := c * 10 + ORD(s[i]) - ORD('0') END; INC(i) UNTIL ((i > HIGH(s)) OR (s[i] = 0C)); w := WORD(c); RETURN(TRUE) END StrToOct; END Conversions. !Funky!Stuff! echo x - Cursors.MOD cat >Cursors.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE Cursors; FROM SYSTEM IMPORT ADDRESS,WORD,CODE,ADR,REGISTER; FROM MacSYSTEM IMPORT LONGINT; FROM QuickDraw IMPORT Point,Rect,Bits16,Cursor; CONST GetRet = 0285FH; (* MOVEA (A7)+,A4 *) Return = 04ED4H; (* JMP A4 *) SaveA7 = 0264FH; (* MOVEA A7,A3 *) RestoreA7 = 02E4BH; (* MOVEA A3,A7 *) (* Cursor Routines *) PROCEDURE GetCursor(cursorID:INTEGER):CursHandle; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B9H); CODE(RestoreA7); CODE(Return); END GetCursor; PROCEDURE xShieldCursor(shieldRect:Rect;offsetPt:LONGINT); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A855H); CODE(RestoreA7); CODE(Return); END xShieldCursor; PROCEDURE ShieldCursor(shieldRect:Rect;offsetPt:Point); (*$P+*)(*$S-*) BEGIN xShieldCursor(shieldRect,offsetPt.param) END ShieldCursor; PROCEDURE InitCursor; (*$P+*)(*$S-*) BEGIN CODE(0A850H); END InitCursor; PROCEDURE SetCursor(VAR crsr: Cursor); (*$P-*) BEGIN CODE(GetRet);CODE(SaveA7); CODE(0A851H); CODE(RestoreA7);CODE(Return); END SetCursor; PROCEDURE HideCursor; (*$P+*)(*$S-*) BEGIN CODE(0A852H); END HideCursor; PROCEDURE ShowCursor; (*$P+*)(*$S-*) BEGIN CODE(0A853H); END ShowCursor; PROCEDURE ObscureCursor; (*$P+*)(*S-*) BEGIN CODE(0A856H); END ObscureCursor; END Cursors. !Funky!Stuff! echo x - DeskManager.MOD cat >DeskManager.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE DeskManager; FROM SYSTEM IMPORT ADDRESS,WORD,CODE,ADR,REGISTER; FROM MacSYSTEM IMPORT LONGINT; FROM EventManager IMPORT EventRecord; FROM WindowManager IMPORT WindowPtr; CONST GetRet = 0285FH; (* MOVEA (A7)+,A4 *) Return = 04ED4H; (* JMP A4 *) SaveA7 = 0264FH; (* MOVEA A7,A3 *) RestoreA7 = 02E4BH; (* MOVEA A3,A7 *) PROCEDURE xOpenDeskAcc(theAcc:ADDRESS):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B6H); CODE(RestoreA7); CODE(Return); END xOpenDeskAcc; (* This is for the silly null in DeskAcc names *) PROCEDURE DeskAccString(VAR in,out:ARRAY OF CHAR); (*$P+*)(*$S-*) VAR i:CARDINAL; BEGIN out[1] := in[0]; (* copy the null *) i := 1; REPEAT out[i + 1] := in[i]; INC(i); UNTIL ((i > HIGH(in)) OR (in[i] = 0C)); out[0] := CHR(i) END DeskAccString; PROCEDURE OpenDeskAcc(VAR theAcc:ARRAY OF CHAR):INTEGER; (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN DeskAccString(theAcc,Str); RETURN(xOpenDeskAcc(ADR(Str))) END OpenDeskAcc; PROCEDURE CloseDeskAcc(refNum:INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B7H); CODE(RestoreA7); CODE(Return); END CloseDeskAcc; PROCEDURE SystemClick(VAR theEvent:EventRecord;theWindow:WindowPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B3H); CODE(RestoreA7); CODE(Return); END SystemClick; PROCEDURE SystemEdit(editCmd:INTEGER):BOOLEAN; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9C2H); CODE(RestoreA7); CODE(Return); END SystemEdit; PROCEDURE SystemTask; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B4H); CODE(RestoreA7); CODE(Return); END SystemTask; PROCEDURE SystemEvent(VAR theEvent:EventRecord):BOOLEAN; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B2H); CODE(RestoreA7); CODE(Return); END SystemEvent; PROCEDURE SystemMenu(menuResult:LONGINT); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B5H); CODE(RestoreA7); CODE(Return); END SystemMenu; END DeskManager. !Funky!Stuff! echo x - DialogManager.MOD cat >DialogManager.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE DialogManager; FROM SYSTEM IMPORT ADDRESS,CODE,ADR,SETREG,REGISTER; FROM Storage IMPORT ALLOCATE,DEALLOCATE; FROM QuickDraw IMPORT Rect; FROM MacSYSTEM IMPORT Handle, LONGINT, Ptr,StringPtr; FROM WindowManager IMPORT WindowPtr; FROM TextEdit IMPORT TEHandle,TECut,TECopy,TEPaste,TEDelete; FROM EventManager IMPORT EventRecord; FROM PascalStrings IMPORT MakePascalString, MakeModulaString; CONST GetRet=0285FH; Return=04ED4H; SaveA7=0264FH; RestoreA7=02E4BH; (* Misc *) VAR Sound : SoundProc; VAR MyParamText: ARRAY [0..3] OF StringPtr; PROCEDURE SoundInterface; (*$P-*) BEGIN CODE(04E56H);CODE(0); (* LINK A6,#0 *) CODE(048E7H);CODE(01F38H); (* MOVEM.L D3-D7/A2-A4,-(A7) *) CODE(03F2EH);CODE(08H); (* MOVE.W 08(A6),-(A7) *) SETREG(8,Sound); CODE(04E90H); (* JSR (A0) *) CODE(05C8FH); (* ADDQ.L #6,A7 *) CODE(04CDFH);CODE(01CF8H); (* MOVEM.L (A7)+,D3-D7/A2-A4 *) CODE(04E5EH); (* UNLK A6 *) CODE(0205FH); (* MOVEA.L (A7)+,A0 *) CODE(05C8FH); (* ADDQ.L #6,A7 *) CODE(04ED0H); (* JMP (A0) *) END SoundInterface; PROCEDURE UseSoundProc(MySound: SoundProc):ADDRESS; (*$P+*)(*$S-*) BEGIN Sound := MySound; SETREG(8,SoundInterface); RETURN(REGISTER(8)) END UseSoundProc; (* initialization *) PROCEDURE InitDialogs (restartProc: ADDRESS); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97BH); CODE(RestoreA7); CODE(Return); END InitDialogs; PROCEDURE ErrorSound (MySound: ADDRESS); BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98CH); CODE(RestoreA7); CODE(Return); END ErrorSound; PROCEDURE SetDAFont (fontNum: INTEGER); (*$P+*) BEGIN DlgFont := fontNum END SetDAFont; (* Creating and disposing OF dialogs *) PROCEDURE xNewDialog(dStorage:ADDRESS;VAR boundsRect:Rect; title:ADDRESS; visible: BOOLEAN; procID: INTEGER; behind: WindowPtr; goAwayFlag: BOOLEAN; refCon: LONGINT; items: Handle) : DialogPtr; (* $P- *) BEGIN CODE(GetRet);CODE(SaveA7); CODE(0A97DH); CODE(RestoreA7); CODE(Return); END xNewDialog; PROCEDURE NewDialog(dStorage: ADDRESS; boundsRect:Rect; VAR title:ARRAY OF CHAR; visible: BOOLEAN; procID: INTEGER; behind: WindowPtr; goAwayFlag: BOOLEAN; refCon: LONGINT; items: Handle) : DialogPtr; VAR s: ARRAY[0..255] OF CHAR; (*$P+*)(*$S-*) BEGIN MakePascalString(title,s); RETURN(xNewDialog(dStorage,boundsRect,ADR(s),visible,procID,behind, goAwayFlag,refCon,items)) END NewDialog; PROCEDURE GetNewDialog(dialogID:INTEGER;dStorage:ADDRESS; behind:WindowPtr):DialogPtr; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97CH); CODE(RestoreA7); CODE(Return) END GetNewDialog; PROCEDURE CloseDialog(theDialog: DialogPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A982H); CODE(RestoreA7); CODE(Return) END CloseDialog; PROCEDURE DisposDialog(theDialog:DialogPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A983H); CODE(RestoreA7); CODE(Return) END DisposDialog; PROCEDURE CouldDialog(dialogID: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A979H); CODE(RestoreA7); CODE(Return); END CouldDialog; PROCEDURE FreeDialog(dialogID: INTEGER); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97AH); CODE(RestoreA7); CODE(Return); END FreeDialog; (* Handling Dialog events *) PROCEDURE NoFilterProc():ADDRESS; BEGIN RETURN(ADDRESS(0)) END NoFilterProc; VAR Filter:FilterProc; PROCEDURE FilterInterface; (*$P-*) BEGIN CODE(04E56H);CODE(0); (* LINK A6,#0 *) CODE(048E7H);CODE(01F38H); (* MOVEM.L D3-D7/A2-A4,-(A7) *) CODE(04267H); (* CLR.W -(A7) *) CODE(02F2EH);CODE(010H); (* MOVE.L 010(A6),-(A7) *) CODE(02F2EH);CODE(0CH); (* MOVE.L 0C(A6),-(A7) *) CODE(02F2EH);CODE(08H); (* MOVE.L 08(A6),-(A7) *) SETREG(8,Filter); CODE(04E90H); (* JSR (A0) *) CODE(04FEFH);CODE(000CH); (* LEA A7,000C(A7) *) CODE(03D5FH);CODE(014H); (* MOVE.L (A7)+,14(A6) *) CODE(04CDFH);CODE(01CF8H); (* MOVEM.L (A7)+,D3-D7/A2-A4 *) CODE(04E5EH); (* UNLK A6 *) CODE(0205FH); (* MOVEA.L (A7)+,A0 *) CODE(04FEFH);CODE(000CH); (* LEA A7,000C(A7) *) CODE(04ED0H); (* JMP (A0) *) END FilterInterface; PROCEDURE UseFilterProc(myFilter:FilterProc):ADDRESS; (*$P+*)(*$S-*) BEGIN Filter := myFilter; SETREG(8,FilterInterface); RETURN(REGISTER(8)) END UseFilterProc; PROCEDURE ModalDialog(myFilter:ADDRESS; VAR itemHit: INTEGER); (* $P- *) BEGIN CODE(GetRet);CODE(SaveA7); CODE(0A991H); CODE(RestoreA7); CODE(Return); END ModalDialog; PROCEDURE IsDialogEvent(VAR theEvent: EventRecord) : BOOLEAN; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97FH); CODE(RestoreA7); CODE(Return); END IsDialogEvent; PROCEDURE DialogSelect(VAR theEvent: EventRecord; VAR theDialog: DialogPtr; VAR itemHit: INTEGER) : BOOLEAN; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A980H); CODE(RestoreA7); CODE(Return); END DialogSelect; PROCEDURE DlgCut(theDialog: DialogPtr); (*$P+*) VAR d : DialogPeek; BEGIN d := DialogPeek(theDialog); IF (d^.editField >= 0) THEN TECut(d^.textH) END END DlgCut; PROCEDURE DlgCopy(theDialog: DialogPtr); VAR d : DialogPeek; BEGIN d := DialogPeek(theDialog); IF (d^.editField >= 0) THEN TECopy(d^.textH) END END DlgCopy; PROCEDURE DlgPaste(theDialog: DialogPtr); VAR d : DialogPeek; BEGIN d := DialogPeek(theDialog); IF (d^.editField >= 0) THEN TEPaste(d^.textH) END END DlgPaste; PROCEDURE DlgDelete(theDialog: DialogPtr); VAR d : DialogPeek; BEGIN d := DialogPeek(theDialog); IF (d^.editField >= 0) THEN TEDelete(d^.textH) END END DlgDelete; PROCEDURE DrawDialog (theDialog: DialogPtr); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A981H); CODE(RestoreA7); CODE(Return); END DrawDialog; (* invoking alerts *) PROCEDURE Alert(alertID: INTEGER; myFilter:ADDRESS): INTEGER; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A985H); CODE(RestoreA7); CODE(Return); END Alert; PROCEDURE StopAlert(alertID: INTEGER; myFilter:ADDRESS): INTEGER; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A986H); CODE(RestoreA7); CODE(Return); END StopAlert; PROCEDURE NoteAlert(alertID: INTEGER; myFilter:ADDRESS): INTEGER; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A987H); CODE(RestoreA7); CODE(Return); END NoteAlert; PROCEDURE CautionAlert(alertID: INTEGER; myFilter:ADDRESS): INTEGER; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A988H); CODE(RestoreA7); CODE(Return); END CautionAlert; PROCEDURE CouldAlert(alertID: INTEGER); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A989H); CODE(RestoreA7); CODE(Return); END CouldAlert; PROCEDURE FreeAlert(alertID: INTEGER); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98AH); CODE(RestoreA7); CODE(Return); END FreeAlert; (* manipulation items in dialog and alerts *) PROCEDURE ParamText(VAR param0,param1,param2,param3: ARRAY OF CHAR); (*$P+*)(*$S-*) BEGIN IF (MyParamText[0] # NIL) THEN DEALLOCATE(MyParamText[0],255) END; ALLOCATE(MyParamText[0],HIGH(param0)+2); MakePascalString(param0,MyParamText[0]^); IF (MyParamText[1] # NIL) THEN DEALLOCATE(MyParamText[1],255) END; ALLOCATE(MyParamText[1],HIGH(param1)+2); MakePascalString(param1,MyParamText[1]^); IF (MyParamText[2] # NIL) THEN DEALLOCATE(MyParamText[2],255) END; ALLOCATE(MyParamText[2],HIGH(param2)+2); MakePascalString(param2,MyParamText[2]^); IF (MyParamText[3] # NIL) THEN DEALLOCATE(MyParamText[3],255) END; ALLOCATE(MyParamText[3],HIGH(param3)+2); MakePascalString(param3,MyParamText[3]^); DAStrings[0] := ADDRESS(MyParamText[0]); DAStrings[1] := ADDRESS(MyParamText[1]); DAStrings[2] := ADDRESS(MyParamText[2]); DAStrings[3] := ADDRESS(MyParamText[3]); END ParamText; PROCEDURE GetDItem(theDialog: DialogPtr; itemNo: INTEGER; VAR type: INTEGER; VAR item: Handle; VAR box: Rect); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98DH); CODE(RestoreA7); CODE(Return); END GetDItem; PROCEDURE SetDItem (theDialog: DialogPtr; itemNo: INTEGER; type: INTEGER; item: Handle; VAR box: Rect); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98EH); CODE(RestoreA7); CODE(Return); END SetDItem; PROCEDURE xGetIText(item: Handle; text: ADDRESS); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A990H); CODE(RestoreA7); CODE(Return); END xGetIText; PROCEDURE GetIText(item: Handle; VAR text: ARRAY OF CHAR); VAR s: ARRAY [0..255] OF CHAR; BEGIN xGetIText(item,ADR(s)); MakeModulaString(s,text); END GetIText; PROCEDURE xSetIText(item: Handle; text: ADDRESS); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98FH); CODE(RestoreA7); CODE(Return); END xSetIText; PROCEDURE SetIText(item: Handle; VAR text: ARRAY OF CHAR); VAR s: ARRAY [0..255] OF CHAR; BEGIN MakePascalString(text,s); xSetIText(item,ADR(s)); END SetIText; PROCEDURE SelIText(theDialog: DialogPtr; itemNo: INTEGER; strtSel,endSel: INTEGER); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97EH); CODE(RestoreA7); CODE(Return); END SelIText; PROCEDURE GetAlrtStage(): INTEGER; (*$P+*) BEGIN RETURN(ACount) END GetAlrtStage; PROCEDURE ResetAlrtStage; (*$P+*) BEGIN ACount := -1 END ResetAlrtStage; BEGIN MyParamText[0] := NIL; MyParamText[1] := NIL; MyParamText[2] := NIL; MyParamText[3] := NIL; InitDialogs(ADDRESS(0)); END DialogManager. !Funky!Stuff! # The rest of this file is a shell script which will extract: # BDPackage.MOD ControlManager.MOD Conversions.MOD Cursors.MOD DeskManager.MOD DialogManager.MOD echo x - BDPackage.MOD cat >BDPackage.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE BDPackage; FROM SYSTEM IMPORT ADDRESS,CODE,ADR,REGISTER,SETREG; FROM MacSYSTEM IMPORT LONGINT; FROM PascalStrings IMPORT MakeModulaString,MakePascalString; CONST GetRet = 0285FH; (* MOVEA (A7)+,A4 *) Return = 04ED4H; (* JMP A4 *) SaveA7 = 0264FH; (* MOVEA A7,A3 *) RestoreA7 = 02E4BH; (* MOVEA A3,A7 *) Push = 03F3CH; (* MOVE #VAL,-(A7) *) Pack7 = 0A9EEH; pNumToString= 0; pStringToNum= 1; PROCEDURE xStringToNum(theString:ADDRESS;VAR theNum:LONGINT); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(Push); CODE(pStringToNum); CODE(Pack7); CODE(RestoreA7); CODE(Return); END xStringToNum; PROCEDURE NumToString(theNum:LONGINT;VAR theString:ARRAY OF CHAR); (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN SETREG(0,theNum); SETREG(8,ADR(Str)); CODE(Push); CODE(pNumToString); CODE(Pack7); MakeModulaString(Str,theString) END NumToString; PROCEDURE StringToNum(VAR theString:ARRAY OF CHAR;VAR theNum:LONGINT); (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN MakePascalString(theString,Str); SETREG(8,ADR(Str)); CODE(Push); CODE(pStringToNum); CODE(Pack7); theNum := REGISTER(0) END StringToNum END BDPackage. !Funky!Stuff! echo x - ControlManager.MOD cat >ControlManager.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE ControlManager; FROM SYSTEM IMPORT ADDRESS,CODE,ADR,SETREG,REGISTER; FROM MacSYSTEM IMPORT LONGINT,Handle; FROM QuickDraw IMPORT Point,Rect; FROM WindowManager IMPORT WindowPtr; FROM PascalStrings IMPORT MakePascalString,MakeModulaString; CONST GetRet = 0285FH; (* MOVEA (A7)+,A4 *) Return = 04ED4H; (* JMP (A4) *) SaveA7 = 0264FH; (* MOVEA A7,A3 *) RestoreA7 = 02E4BH; (* MOVEA A3,A7 *) (* Init and Alloc *) PROCEDURE xNewControl(Wind:WindowPtr;VAR bounds:Rect;title:ADDRESS; visible:BOOLEAN;value:INTEGER;min,max:INTEGER;procID:INTEGER; refCon:LONGINT): ControlHandle; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A954H); CODE(RestoreA7); CODE(Return); END xNewControl; PROCEDURE NewControl(Wind:WindowPtr;bounds:Rect;VAR title:ARRAY OF CHAR; visible:BOOLEAN;value:INTEGER;min,max:INTEGER;procID:INTEGER; refCon:LONGINT): ControlHandle; (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN MakePascalString(title,Str); RETURN(xNewControl(Wind,bounds,ADR(Str),visible,value,min,max,procID,refCon)) END NewControl; PROCEDURE GetNewControl (controlID:INTEGER;wind:WindowPtr):ControlHandle; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9BEH); CODE(RestoreA7); CODE(Return); END GetNewControl; PROCEDURE DisposeControl (theControl:ControlHandle); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A955H); CODE(RestoreA7); CODE(Return); END DisposeControl; PROCEDURE KillControls (wind:WindowPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A956H); CODE(RestoreA7); CODE(Return); END KillControls; (* Control Display *) PROCEDURE xSetCTitle (theControl:ControlHandle;title:ADDRESS); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95FH); CODE(RestoreA7); CODE(Return); END xSetCTitle; PROCEDURE SetCTitle (theControl:ControlHandle;VAR title:ARRAY OF CHAR); (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN MakePascalString(title,Str); xSetCTitle(theControl,ADR(Str)) END SetCTitle; PROCEDURE xGetCTitle (theControl:ControlHandle;title:ADDRESS); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95EH); CODE(RestoreA7); CODE(Return); END xGetCTitle; PROCEDURE GetCTitle (theControl:ControlHandle;VAR title:ARRAY OF CHAR); (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN xGetCTitle(theControl,ADR(Str)); MakeModulaString(Str,title) END GetCTitle; PROCEDURE HideControl (theControl:ControlHandle); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A958H); CODE(RestoreA7); CODE(Return); END HideControl; PROCEDURE ShowControl (theControl:ControlHandle); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A957H); CODE(RestoreA7); CODE(Return); END ShowControl; PROCEDURE DrawControls (theWindow:WindowPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A969H); CODE(RestoreA7); CODE(Return); END DrawControls; PROCEDURE HiliteControl (theControl:ControlHandle;hiliteState:INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95DH); CODE(RestoreA7); CODE(Return); END HiliteControl; (* Mouse Location *) PROCEDURE xTestControl(theControl:ControlHandle;thePoint:LONGINT):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A966H); CODE(RestoreA7); CODE(Return); END xTestControl; PROCEDURE TestControl (theControl: ControlHandle;thePoint:Point):INTEGER; (*$P+*)(*$S-*) BEGIN RETURN(xTestControl(theControl,thePoint.param)) END TestControl; PROCEDURE xFindControl(thePoint:LONGINT;theWindow:WindowPtr; VAR whichControl:ControlHandle):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A96CH); CODE(RestoreA7); CODE(Return); END xFindControl; PROCEDURE FindControl(thePoint:Point;theWindow:WindowPtr; VAR whichControl:ControlHandle):INTEGER; (*$P+*)(*$S-*) BEGIN RETURN(xFindControl(thePoint.param,theWindow,whichControl)) END FindControl; PROCEDURE xTrackControl(theControl:ControlHandle;startPt:LONGINT; actionProc: ADDRESS):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A968H); CODE(RestoreA7); CODE(Return); END xTrackControl; PROCEDURE TrackControl (theControl: ControlHandle; startPt:Point; actionProc: ADDRESS):INTEGER; (*$P+*)(*$S-*) BEGIN RETURN(xTrackControl(theControl,startPt.param,actionProc)) END TrackControl; VAR ProcA:PROC; PROCEDURE ProcAInterface; (*$P-*) BEGIN CODE(04E56H);CODE(0); (* LINK A6,#0 *) CODE(048E7H);CODE(0FFFCH); (* MOVEM.L D0-D7/A0-A5,-(A7)*) SETREG(8,ProcA); CODE(04E90H); (* JSR (A0) *) CODE(04CDFH);CODE(03FFFH); (* MOVEM.L (A7)+,D0-D7/A0-A5*) CODE(04E5EH); (* UNLK A6 *) CODE(04E75H); (* RTS *) END ProcAInterface; PROCEDURE TrackProcA(p:PROC):ADDRESS; (*$P+*)(*$S-*) BEGIN ProcA := p; SETREG(8,ProcAInterface); RETURN(REGISTER(8)) END TrackProcA; VAR ProcB:PROCHI; PROCEDURE ProcBInterface; (*$P-*) BEGIN CODE(04E56H);CODE(0); (* LINK A6,#0 *) CODE(048E7H);CODE(0FFFCH); (* MOVEM.L D0-D7/A0-A5,-(A7) *) CODE(02F2EH);CODE(0AH); (* MOVE.L 0A(A6),-(A7) *) CODE(03F2EH);CODE(08H); (* MOVE.W 08(A6),-(A7) *) SETREG(8,ProcB); CODE(04E90H); (* JSR (A6) *) CODE(05C8FH); (* ADDQ.L #6,A7 *) CODE(04CDFH);CODE(03FFFH); (* MOVEM.L (A7)+,D0-D7/A0-A4 *) CODE(04E5EH); (* UNLK A6 *) CODE(02F5FH);CODE(2H); (* MOVE.L (A7)+,2(A7) *) CODE(0548FH); (* ADDQ.L #2,A7 *) CODE(04E75H); (* RTS *) END ProcBInterface; PROCEDURE TrackProcB(p:PROCHI):ADDRESS; (*$P+*)(*$S-*) BEGIN ProcB := p; SETREG(8,ProcBInterface); RETURN(REGISTER(8)) END TrackProcB; (* Control Movement and Sizing *) PROCEDURE MoveControl (theControl: ControlHandle; h,v: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A959H); CODE(RestoreA7); CODE(Return); END MoveControl; PROCEDURE xDragControl (theControl: ControlHandle; startPt:LONGINT; VAR limitRect,slopRect: Rect; axis: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A967H); CODE(RestoreA7); CODE(Return); END xDragControl; PROCEDURE DragControl (theControl: ControlHandle; startPt:Point; limitRect,slopRect: Rect; axis: INTEGER); (*$P+*)(*$S-*) BEGIN xDragControl(theControl,startPt.param,limitRect,slopRect,axis) END DragControl; PROCEDURE SizeControl (theControl: ControlHandle; w,h: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95CH); CODE(RestoreA7); CODE(Return); END SizeControl; (* Control Setting and Range *) PROCEDURE SetCtlValue (theControl: ControlHandle; theValue: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A963H); CODE(RestoreA7); CODE(Return); END SetCtlValue; PROCEDURE GetCtlValue (theControl: ControlHandle):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A960H); CODE(RestoreA7); CODE(Return); END GetCtlValue; PROCEDURE SetCtlMin (theControl: ControlHandle;minValue:INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A964H); CODE(RestoreA7); CODE(Return); END SetCtlMin; PROCEDURE GetCtlMin (theControl: ControlHandle):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A961H); CODE(RestoreA7); CODE(Return); END GetCtlMin; PROCEDURE SetCtlMax (theControl: ControlHandle; maxValue:INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A965H); CODE(RestoreA7); CODE(Return); END SetCtlMax; PROCEDURE GetCtlMax (theControl: ControlHandle):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A962H); CODE(RestoreA7); CODE(Return); END GetCtlMax; (* Miscellaneous Utilities *) PROCEDURE SetCRefCon (theControl: ControlHandle; data: LONGINT); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95BH); CODE(RestoreA7); CODE(Return); END SetCRefCon; PROCEDURE GetCRefCon (theControl: ControlHandle):LONGINT; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A95AH); CODE(RestoreA7); CODE(Return); END GetCRefCon; PROCEDURE SetCtlAction (theControl: ControlHandle;actionProc:ADDRESS); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A96BH); CODE(RestoreA7); CODE(Return); END SetCtlAction; PROCEDURE GetCtlAction (theControl: ControlHandle):ADDRESS; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A96BH); CODE(RestoreA7); CODE(Return); END GetCtlAction; END ControlManager. !Funky!Stuff! echo x - Conversions.MOD cat >Conversions.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE Conversions; FROM SYSTEM IMPORT WORD; PROCEDURE PAD(VAR s:ARRAY OF CHAR;size:INTEGER;c:CHAR); VAR i :CARDINAL; BEGIN IF (size >= 0) THEN FOR i := 0 TO size DO s[i] := c END END END PAD; PROCEDURE NtoS(x,base: CARDINAL; size:INTEGER; VAR str:ARRAY OF CHAR;sign,first:BOOLEAN;pad:CHAR):INTEGER; VAR RetSize : INTEGER; High : INTEGER; BEGIN High := VAL(INTEGER,HIGH(str)); IF (x = 0) THEN IF (first) THEN IF (size > High) THEN size := High END; IF (sign) THEN PAD(str,size - 2,pad); IF (size = 0) THEN size := 1; END; str[size - 1] := '-'; ELSE PAD(str,size - 1,pad); END; str[size] := '0'; ELSE IF (sign) THEN IF (size < 0) THEN PAD(str,High,'*'); RETURN(-2) END; PAD(str,size - 1,pad); str[size] := '-' ELSE PAD(str,size,pad); END; END; (*IF*) IF (first AND (size # High)) THEN str[size + 1] := 0C END; RETURN(size) ELSE (* x is not 0 *) IF (size < 0) THEN size := 0 END; RetSize := NtoS(x DIV base,base,size - 1,str,sign,FALSE,pad); IF (RetSize = -2) THEN RETURN(RetSize) END; IF size <= RetSize THEN size := RetSize + 1; END; IF (size > High) THEN PAD(str,High,'*'); RETURN(-2); ELSE str[size] := CHR(ORD('0') + x MOD base); IF str[size] > '9' THEN str[size] := CHR(ORD(str[size]) - ORD('0') + ORD('A') - 10) END; IF (first AND (size # High)) THEN str[size + 1] := 0C END; RETURN(size) END END END NtoS; PROCEDURE IntToStr(i : INTEGER;VAR s : ARRAY OF CHAR; p : CARDINAL):BOOLEAN; VAR RetSize : INTEGER; BEGIN IF (p = 0) THEN RetSize := 0 ELSE RetSize := VAL(INTEGER,p) - 1; END; RetSize := NtoS(ABS(i),10,RetSize,s,(i < 0),TRUE,' '); RETURN(RetSize # -2) END IntToStr; PROCEDURE StrToInt(VAR s : ARRAY OF CHAR; VAR x : INTEGER):BOOLEAN; VAR i : CARDINAL; neg : BOOLEAN; BEGIN i := 0; x := 0; WHILE ((i < HIGH(s)) AND ((s[i] = ' ') OR (s[i] = ' '))) DO INC(i) END; (* Assert at worst i = HIGH(s) *) IF (s[i] = '-') THEN neg := TRUE; INC(i); IF (i > HIGH(s)) THEN RETURN(FALSE) END END; REPEAT IF ((s[i] < '0') OR (s[i] > '9')) THEN RETURN(FALSE) ELSE x := x * 10 + INTEGER(ORD(s[i])) - INTEGER(ORD('0')) END; INC(i) UNTIL ((i > HIGH(s)) OR (s[i] = 0C)); IF neg THEN x := -x; END; RETURN(TRUE) END StrToInt; PROCEDURE CardToStr(c : CARDINAL; VAR s : ARRAY OF CHAR; p : CARDINAL):BOOLEAN; VAR RetSize : INTEGER; BEGIN IF (p = 0) THEN RetSize := 0 ELSE RetSize := VAL(INTEGER,p) - 1; END; RetSize := NtoS(c,10,RetSize,s,FALSE,TRUE,' '); RETURN(RetSize # -2) END CardToStr; PROCEDURE StrToCard(VAR s:ARRAY OF CHAR; VAR c:CARDINAL):BOOLEAN; VAR i : CARDINAL; BEGIN i := 0; c := 0; WHILE ((i < HIGH(s)) AND ((s[i] = ' ') OR (s[i] = ' '))) DO INC(i) END; (* Assert at worst i = HIGH(s) *) REPEAT IF ((s[i] < '0') OR (s[i] > '9')) THEN RETURN(FALSE) ELSE c := c * 10 + ORD(s[i]) - ORD('0') END; INC(i) UNTIL ((i > HIGH(s)) OR (s[i] = 0C)); RETURN(TRUE) END StrToCard; PROCEDURE HexToStr(w:WORD;VAR s:ARRAY OF CHAR; p : CARDINAL):BOOLEAN; VAR RetSize : INTEGER; BEGIN IF (p = 0) THEN RetSize := 0 ELSE RetSize := VAL(INTEGER,p) - 1; END; RetSize := NtoS(CARDINAL(w),16,RetSize,s,FALSE,TRUE,'0'); RETURN(RetSize # -2) END HexToStr; PROCEDURE StrToHex(VAR s:ARRAY OF CHAR;VAR w:WORD):BOOLEAN; VAR i : CARDINAL; c : CARDINAL; BEGIN i := 0; c := 0; WHILE ((i < HIGH(s)) AND ((s[i] = ' ') OR (s[i] = ' '))) DO INC(i) END; (* Assert at worst i = HIGH(s) *) REPEAT IF ((s[i] < '0') OR (s[i] > '9')) THEN IF ((s[i] >= 'A') AND (s[i] <= 'F')) THEN c := c * 10 + ORD(s[i]) - ORD('A') + 10 ELSE RETURN(FALSE) END ELSE c := c * 10 + ORD(s[i]) - ORD('0') END; INC(i) UNTIL ((i > HIGH(s)) OR (s[i] = 0C)); w := WORD(c); RETURN(TRUE) END StrToHex; PROCEDURE OctToStr(w:WORD;VAR s:ARRAY OF CHAR; p : CARDINAL):BOOLEAN; VAR RetSize : INTEGER; BEGIN IF (p = 0) THEN RetSize := 0 ELSE RetSize := VAL(INTEGER,p) - 1; END; RetSize := NtoS(CARDINAL(w),8,RetSize,s,FALSE,TRUE,'0'); RETURN(RetSize # -2) END OctToStr; PROCEDURE StrToOct(VAR s:ARRAY OF CHAR;VAR w:WORD):BOOLEAN; VAR i : CARDINAL; c : CARDINAL; BEGIN i := 0; c := 0; WHILE ((i < HIGH(s)) AND ((s[i] = ' ') OR (s[i] = ' '))) DO INC(i) END; (* Assert at worst i = HIGH(s) *) REPEAT IF ((s[i] < '0') OR (s[i] > '7')) THEN RETURN(FALSE) ELSE c := c * 10 + ORD(s[i]) - ORD('0') END; INC(i) UNTIL ((i > HIGH(s)) OR (s[i] = 0C)); w := WORD(c); RETURN(TRUE) END StrToOct; END Conversions. !Funky!Stuff! echo x - Cursors.MOD cat >Cursors.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE Cursors; FROM SYSTEM IMPORT ADDRESS,WORD,CODE,ADR,REGISTER; FROM MacSYSTEM IMPORT LONGINT; FROM QuickDraw IMPORT Point,Rect,Bits16,Cursor; CONST GetRet = 0285FH; (* MOVEA (A7)+,A4 *) Return = 04ED4H; (* JMP A4 *) SaveA7 = 0264FH; (* MOVEA A7,A3 *) RestoreA7 = 02E4BH; (* MOVEA A3,A7 *) (* Cursor Routines *) PROCEDURE GetCursor(cursorID:INTEGER):CursHandle; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B9H); CODE(RestoreA7); CODE(Return); END GetCursor; PROCEDURE xShieldCursor(shieldRect:Rect;offsetPt:LONGINT); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A855H); CODE(RestoreA7); CODE(Return); END xShieldCursor; PROCEDURE ShieldCursor(shieldRect:Rect;offsetPt:Point); (*$P+*)(*$S-*) BEGIN xShieldCursor(shieldRect,offsetPt.param) END ShieldCursor; PROCEDURE InitCursor; (*$P+*)(*$S-*) BEGIN CODE(0A850H); END InitCursor; PROCEDURE SetCursor(VAR crsr: Cursor); (*$P-*) BEGIN CODE(GetRet);CODE(SaveA7); CODE(0A851H); CODE(RestoreA7);CODE(Return); END SetCursor; PROCEDURE HideCursor; (*$P+*)(*$S-*) BEGIN CODE(0A852H); END HideCursor; PROCEDURE ShowCursor; (*$P+*)(*$S-*) BEGIN CODE(0A853H); END ShowCursor; PROCEDURE ObscureCursor; (*$P+*)(*S-*) BEGIN CODE(0A856H); END ObscureCursor; END Cursors. !Funky!Stuff! echo x - DeskManager.MOD cat >DeskManager.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE DeskManager; FROM SYSTEM IMPORT ADDRESS,WORD,CODE,ADR,REGISTER; FROM MacSYSTEM IMPORT LONGINT; FROM EventManager IMPORT EventRecord; FROM WindowManager IMPORT WindowPtr; CONST GetRet = 0285FH; (* MOVEA (A7)+,A4 *) Return = 04ED4H; (* JMP A4 *) SaveA7 = 0264FH; (* MOVEA A7,A3 *) RestoreA7 = 02E4BH; (* MOVEA A3,A7 *) PROCEDURE xOpenDeskAcc(theAcc:ADDRESS):INTEGER; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B6H); CODE(RestoreA7); CODE(Return); END xOpenDeskAcc; (* This is for the silly null in DeskAcc names *) PROCEDURE DeskAccString(VAR in,out:ARRAY OF CHAR); (*$P+*)(*$S-*) VAR i:CARDINAL; BEGIN out[1] := in[0]; (* copy the null *) i := 1; REPEAT out[i + 1] := in[i]; INC(i); UNTIL ((i > HIGH(in)) OR (in[i] = 0C)); out[0] := CHR(i) END DeskAccString; PROCEDURE OpenDeskAcc(VAR theAcc:ARRAY OF CHAR):INTEGER; (*$P+*)(*$S-*) VAR Str:ARRAY [0..255] OF CHAR; BEGIN DeskAccString(theAcc,Str); RETURN(xOpenDeskAcc(ADR(Str))) END OpenDeskAcc; PROCEDURE CloseDeskAcc(refNum:INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B7H); CODE(RestoreA7); CODE(Return); END CloseDeskAcc; PROCEDURE SystemClick(VAR theEvent:EventRecord;theWindow:WindowPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B3H); CODE(RestoreA7); CODE(Return); END SystemClick; PROCEDURE SystemEdit(editCmd:INTEGER):BOOLEAN; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9C2H); CODE(RestoreA7); CODE(Return); END SystemEdit; PROCEDURE SystemTask; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B4H); CODE(RestoreA7); CODE(Return); END SystemTask; PROCEDURE SystemEvent(VAR theEvent:EventRecord):BOOLEAN; (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B2H); CODE(RestoreA7); CODE(Return); END SystemEvent; PROCEDURE SystemMenu(menuResult:LONGINT); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A9B5H); CODE(RestoreA7); CODE(Return); END SystemMenu; END DeskManager. !Funky!Stuff! echo x - DialogManager.MOD cat >DialogManager.MOD <<'!Funky!Stuff!' IMPLEMENTATION MODULE DialogManager; FROM SYSTEM IMPORT ADDRESS,CODE,ADR,SETREG,REGISTER; FROM Storage IMPORT ALLOCATE,DEALLOCATE; FROM QuickDraw IMPORT Rect; FROM MacSYSTEM IMPORT Handle, LONGINT, Ptr,StringPtr; FROM WindowManager IMPORT WindowPtr; FROM TextEdit IMPORT TEHandle,TECut,TECopy,TEPaste,TEDelete; FROM EventManager IMPORT EventRecord; FROM PascalStrings IMPORT MakePascalString, MakeModulaString; CONST GetRet=0285FH; Return=04ED4H; SaveA7=0264FH; RestoreA7=02E4BH; (* Misc *) VAR Sound : SoundProc; VAR MyParamText: ARRAY [0..3] OF StringPtr; PROCEDURE SoundInterface; (*$P-*) BEGIN CODE(04E56H);CODE(0); (* LINK A6,#0 *) CODE(048E7H);CODE(01F38H); (* MOVEM.L D3-D7/A2-A4,-(A7) *) CODE(03F2EH);CODE(08H); (* MOVE.W 08(A6),-(A7) *) SETREG(8,Sound); CODE(04E90H); (* JSR (A0) *) CODE(05C8FH); (* ADDQ.L #6,A7 *) CODE(04CDFH);CODE(01CF8H); (* MOVEM.L (A7)+,D3-D7/A2-A4 *) CODE(04E5EH); (* UNLK A6 *) CODE(0205FH); (* MOVEA.L (A7)+,A0 *) CODE(05C8FH); (* ADDQ.L #6,A7 *) CODE(04ED0H); (* JMP (A0) *) END SoundInterface; PROCEDURE UseSoundProc(MySound: SoundProc):ADDRESS; (*$P+*)(*$S-*) BEGIN Sound := MySound; SETREG(8,SoundInterface); RETURN(REGISTER(8)) END UseSoundProc; (* initialization *) PROCEDURE InitDialogs (restartProc: ADDRESS); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97BH); CODE(RestoreA7); CODE(Return); END InitDialogs; PROCEDURE ErrorSound (MySound: ADDRESS); BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98CH); CODE(RestoreA7); CODE(Return); END ErrorSound; PROCEDURE SetDAFont (fontNum: INTEGER); (*$P+*) BEGIN DlgFont := fontNum END SetDAFont; (* Creating and disposing OF dialogs *) PROCEDURE xNewDialog(dStorage:ADDRESS;VAR boundsRect:Rect; title:ADDRESS; visible: BOOLEAN; procID: INTEGER; behind: WindowPtr; goAwayFlag: BOOLEAN; refCon: LONGINT; items: Handle) : DialogPtr; (* $P- *) BEGIN CODE(GetRet);CODE(SaveA7); CODE(0A97DH); CODE(RestoreA7); CODE(Return); END xNewDialog; PROCEDURE NewDialog(dStorage: ADDRESS; boundsRect:Rect; VAR title:ARRAY OF CHAR; visible: BOOLEAN; procID: INTEGER; behind: WindowPtr; goAwayFlag: BOOLEAN; refCon: LONGINT; items: Handle) : DialogPtr; VAR s: ARRAY[0..255] OF CHAR; (*$P+*)(*$S-*) BEGIN MakePascalString(title,s); RETURN(xNewDialog(dStorage,boundsRect,ADR(s),visible,procID,behind, goAwayFlag,refCon,items)) END NewDialog; PROCEDURE GetNewDialog(dialogID:INTEGER;dStorage:ADDRESS; behind:WindowPtr):DialogPtr; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97CH); CODE(RestoreA7); CODE(Return) END GetNewDialog; PROCEDURE CloseDialog(theDialog: DialogPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A982H); CODE(RestoreA7); CODE(Return) END CloseDialog; PROCEDURE DisposDialog(theDialog:DialogPtr); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A983H); CODE(RestoreA7); CODE(Return) END DisposDialog; PROCEDURE CouldDialog(dialogID: INTEGER); (*$P-*) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A979H); CODE(RestoreA7); CODE(Return); END CouldDialog; PROCEDURE FreeDialog(dialogID: INTEGER); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97AH); CODE(RestoreA7); CODE(Return); END FreeDialog; (* Handling Dialog events *) PROCEDURE NoFilterProc():ADDRESS; BEGIN RETURN(ADDRESS(0)) END NoFilterProc; VAR Filter:FilterProc; PROCEDURE FilterInterface; (*$P-*) BEGIN CODE(04E56H);CODE(0); (* LINK A6,#0 *) CODE(048E7H);CODE(01F38H); (* MOVEM.L D3-D7/A2-A4,-(A7) *) CODE(04267H); (* CLR.W -(A7) *) CODE(02F2EH);CODE(010H); (* MOVE.L 010(A6),-(A7) *) CODE(02F2EH);CODE(0CH); (* MOVE.L 0C(A6),-(A7) *) CODE(02F2EH);CODE(08H); (* MOVE.L 08(A6),-(A7) *) SETREG(8,Filter); CODE(04E90H); (* JSR (A0) *) CODE(04FEFH);CODE(000CH); (* LEA A7,000C(A7) *) CODE(03D5FH);CODE(014H); (* MOVE.L (A7)+,14(A6) *) CODE(04CDFH);CODE(01CF8H); (* MOVEM.L (A7)+,D3-D7/A2-A4 *) CODE(04E5EH); (* UNLK A6 *) CODE(0205FH); (* MOVEA.L (A7)+,A0 *) CODE(04FEFH);CODE(000CH); (* LEA A7,000C(A7) *) CODE(04ED0H); (* JMP (A0) *) END FilterInterface; PROCEDURE UseFilterProc(myFilter:FilterProc):ADDRESS; (*$P+*)(*$S-*) BEGIN Filter := myFilter; SETREG(8,FilterInterface); RETURN(REGISTER(8)) END UseFilterProc; PROCEDURE ModalDialog(myFilter:ADDRESS; VAR itemHit: INTEGER); (* $P- *) BEGIN CODE(GetRet);CODE(SaveA7); CODE(0A991H); CODE(RestoreA7); CODE(Return); END ModalDialog; PROCEDURE IsDialogEvent(VAR theEvent: EventRecord) : BOOLEAN; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97FH); CODE(RestoreA7); CODE(Return); END IsDialogEvent; PROCEDURE DialogSelect(VAR theEvent: EventRecord; VAR theDialog: DialogPtr; VAR itemHit: INTEGER) : BOOLEAN; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A980H); CODE(RestoreA7); CODE(Return); END DialogSelect; PROCEDURE DlgCut(theDialog: DialogPtr); (*$P+*) VAR d : DialogPeek; BEGIN d := DialogPeek(theDialog); IF (d^.editField >= 0) THEN TECut(d^.textH) END END DlgCut; PROCEDURE DlgCopy(theDialog: DialogPtr); VAR d : DialogPeek; BEGIN d := DialogPeek(theDialog); IF (d^.editField >= 0) THEN TECopy(d^.textH) END END DlgCopy; PROCEDURE DlgPaste(theDialog: DialogPtr); VAR d : DialogPeek; BEGIN d := DialogPeek(theDialog); IF (d^.editField >= 0) THEN TEPaste(d^.textH) END END DlgPaste; PROCEDURE DlgDelete(theDialog: DialogPtr); VAR d : DialogPeek; BEGIN d := DialogPeek(theDialog); IF (d^.editField >= 0) THEN TEDelete(d^.textH) END END DlgDelete; PROCEDURE DrawDialog (theDialog: DialogPtr); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A981H); CODE(RestoreA7); CODE(Return); END DrawDialog; (* invoking alerts *) PROCEDURE Alert(alertID: INTEGER; myFilter:ADDRESS): INTEGER; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A985H); CODE(RestoreA7); CODE(Return); END Alert; PROCEDURE StopAlert(alertID: INTEGER; myFilter:ADDRESS): INTEGER; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A986H); CODE(RestoreA7); CODE(Return); END StopAlert; PROCEDURE NoteAlert(alertID: INTEGER; myFilter:ADDRESS): INTEGER; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A987H); CODE(RestoreA7); CODE(Return); END NoteAlert; PROCEDURE CautionAlert(alertID: INTEGER; myFilter:ADDRESS): INTEGER; (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A988H); CODE(RestoreA7); CODE(Return); END CautionAlert; PROCEDURE CouldAlert(alertID: INTEGER); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A989H); CODE(RestoreA7); CODE(Return); END CouldAlert; PROCEDURE FreeAlert(alertID: INTEGER); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98AH); CODE(RestoreA7); CODE(Return); END FreeAlert; (* manipulation items in dialog and alerts *) PROCEDURE ParamText(VAR param0,param1,param2,param3: ARRAY OF CHAR); (*$P+*)(*$S-*) BEGIN IF (MyParamText[0] # NIL) THEN DEALLOCATE(MyParamText[0],255) END; ALLOCATE(MyParamText[0],HIGH(param0)+2); MakePascalString(param0,MyParamText[0]^); IF (MyParamText[1] # NIL) THEN DEALLOCATE(MyParamText[1],255) END; ALLOCATE(MyParamText[1],HIGH(param1)+2); MakePascalString(param1,MyParamText[1]^); IF (MyParamText[2] # NIL) THEN DEALLOCATE(MyParamText[2],255) END; ALLOCATE(MyParamText[2],HIGH(param2)+2); MakePascalString(param2,MyParamText[2]^); IF (MyParamText[3] # NIL) THEN DEALLOCATE(MyParamText[3],255) END; ALLOCATE(MyParamText[3],HIGH(param3)+2); MakePascalString(param3,MyParamText[3]^); DAStrings[0] := ADDRESS(MyParamText[0]); DAStrings[1] := ADDRESS(MyParamText[1]); DAStrings[2] := ADDRESS(MyParamText[2]); DAStrings[3] := ADDRESS(MyParamText[3]); END ParamText; PROCEDURE GetDItem(theDialog: DialogPtr; itemNo: INTEGER; VAR type: INTEGER; VAR item: Handle; VAR box: Rect); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98DH); CODE(RestoreA7); CODE(Return); END GetDItem; PROCEDURE SetDItem (theDialog: DialogPtr; itemNo: INTEGER; type: INTEGER; item: Handle; VAR box: Rect); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98EH); CODE(RestoreA7); CODE(Return); END SetDItem; PROCEDURE xGetIText(item: Handle; text: ADDRESS); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A990H); CODE(RestoreA7); CODE(Return); END xGetIText; PROCEDURE GetIText(item: Handle; VAR text: ARRAY OF CHAR); VAR s: ARRAY [0..255] OF CHAR; BEGIN xGetIText(item,ADR(s)); MakeModulaString(s,text); END GetIText; PROCEDURE xSetIText(item: Handle; text: ADDRESS); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A98FH); CODE(RestoreA7); CODE(Return); END xSetIText; PROCEDURE SetIText(item: Handle; VAR text: ARRAY OF CHAR); VAR s: ARRAY [0..255] OF CHAR; BEGIN MakePascalString(text,s); xSetIText(item,ADR(s)); END SetIText; PROCEDURE SelIText(theDialog: DialogPtr; itemNo: INTEGER; strtSel,endSel: INTEGER); (* $P- *) BEGIN CODE(GetRet); CODE(SaveA7); CODE(0A97EH); CODE(RestoreA7); CODE(Return); END SelIText; PROCEDURE GetAlrtStage(): INTEGER; (*$P+*) BEGIN RETURN(ACount) END GetAlrtStage; PROCEDURE ResetAlrtStage; (*$P+*) BEGIN ACount := -1 END ResetAlrtStage; BEGIN MyParamText[0] := NIL; MyParamText[1] := NIL; MyParamText[2] := NIL; MyParamText[3] := NIL; InitDialogs(ADDRESS(0)); END DialogManager. !Funky!Stuff!