shebanow@ernie.BERKELEY.EDU (Mike Shebanow) (11/28/85)
(beware the line eater) The next three postings contain the actual source files for IMLib, a library of routines which provide emulation for a large number of the [Pascal Only] routines described in Inside Mac. This posting contains IMLib.Job, the job file for MDSMake, and IMLib.link, the link file for the Consulair Linker. These files are only useable with Consulair C version 4.00 or higher, but users of other compilers may find some of the code educational (especially the code to read and create Finder arguments). A special note: IMLib REQUIRES the file PrLink.REL in order to link correctly. PrLink.REL was distributed by Apple with the Software Supplement, and is available for downloading on CompuServe & Delphi (and probably other boards as well). I am not posting PrLink.REL because it is Apple software and requires special permission to distribute. If you cannot get it from a friend, a bbs, or a users group, then you can safely delete all references to PrLink.REL and PrLinkage.* from the JOB and Link files and use the library without the printer code. The code has been copyrighted by its various authors. However, all the code has been published freely in one form or another, and you the authors have given their permission for the code to be distributed for non-commercial purposes. Correspondence can be sent to: Andrew Shebanow HyperSoft 2124 Kittredge Street #174 Berkeley CA 94704 or: CompuServe: 75046,677 Delphi: SHEBANOW WELL: shebanow or: send questions to net.micro.mac Have fun! ======================= IMLib.Job ============================ FileMgr.asm PrLinkage.asm TECalls.c Packages.asm ToolUtils.c FinderParms.c MemoryMgr.asm EventMgr.asm OSUtils.asm StringLib.c IMLib.link -> IMLib.rel : PrLink.REL ======================= IMLib.Link ============================ /Library IMLib /Create FileMgr PrLinkage PrLink TECalls Packages ToolUtils FinderParms MemoryMgr StringLib EventMgr OSUtils /End ============================= end =============================
shebanow@ernie.BERKELEY.EDU (Mike Shebanow) (11/28/85)
(beware the line eater)
=========================Packages.Asm==============================
;
; Packages.ASM Andrew G. Shebanow 8/31/85
;
; Portions of this code Copyright 1984,1985 Consulair Corp.
;
; This file contains routines to emulate the high level calls
; for all of the Macintosh packages (with the exception of the SANE
; related ones). These interface routines have the same names
; and calling conventions as the routines in Inside Mac. The routines
; are intended for use with Consulair's MacC compiler, but could
; be converted to any other compiler as well.
;
; The Standard File package routines are based on code written
; by Bill Duvall of Consulair Corp.
;
; Copyright 1985 HyperSoft All Rights Reserved
;
; Modifications:
; 10/18/85 Fixed StringToNum routine selector (AGS)
;
INCLUDE MacTraps.D
INCLUDE ToolEqu.D
INCLUDE SysEqu.D
; International Utilities
XDEF IUDateString
XDEF IUDatePString
XDEF IUTimeString
XDEF IUTimePString
XDEF IUMetric
XDEF IUGetIntl
XDEF IUSetIntl
XDEF IUCompString
XDEF IUMagString
XDEF IUEqualString
XDEF IUMagIDString
; Binary Decimal Conversion
XDEF NumToString
XDEF StringToNum
; Standard File
XDEF SFPutFile
XDEF SFPPutFile
XDEF SFGetFile
XDEF SFPGetFile
; Disk Initialization
XDEF DILoad
XDEF DIUnload
XDEF DIBadMount
XDEF DIFormat
XDEF DIVerify
XDEF DIZero
Module 'IntlTime'
; IUDateString(dateTime,form,theString)
; long dateTime; (D0)
; DateForm form; (D1)
; Str255 *theString; (D2)
IUDateString
MOVE.L D0,-(SP) ; dateTime
MOVE.W D1,-(SP) ; form
MOVE.L D2,-(SP) ; theString
MOVE #0,-(SP) ; routine selector
_Pack6
RTS
; IUDatePString(dateTime,form,theString,intlParam)
; long dateTime; (D0)
; DateForm form; (D1)
; Str255 *theString; (D2)
; Handle intlParam; (D3)
IUDatePString
MOVE.L D0,-(SP) ; dateTime
MOVE.W D1,-(SP) ; form
MOVE.L D2,-(SP) ; theString
MOVE.L D3,-(SP) ; intlParam
MOVE #14,-(SP) ; routine selector
_Pack6
RTS
; IUTimeString(dateTime,wantSeconds,theString)
; long dateTime; (D0)
; short wantSeconds; (D1) (actually boolean)
; Str255 *theString (D2)
IUTimeString
MOVE.L D0,-(SP) ; dateTime
MOVE.B D1,-(SP) ; wantSeconds (BOOLEAN)
MOVE.L D2,-(SP) ; theString
MOVE #2,-(SP) ; routine selector
_Pack6
RTS
; IUTimePString(dateTime,wantSeconds,theString,intlParam)
; long dateTime; (D0)
; short wantSeconds; (D1) (actually boolean)
; Str255 *theString (D2)
; Handle intlParam; (D3)
IUTimePString
MOVE.L D0,-(SP) ; dateTime
MOVE.B D1,-(SP) ; wantSeconds
MOVE.L D2,-(SP) ; theString
MOVE.L D3,-(SP) ; intlParam
MOVE #16,-(SP) ; routine selector
_Pack6
RTS
Module 'IntlMisc'
; char IUMetric() (actually boolean)
IUMetric
MOVE.B #0,-(SP) ; save space for result
MOVE #4,-(SP) ; routine selector
_Pack6
MOVE.B (SP)+,D0 ; get result
RTS ; result in D0???
; Handle IUGetIntl(theID)
; short theID; (D0)
IUGetIntl
MOVE.L #0,-(SP) ; save space for result
MOVE.W D0,-(SP) ; theID
MOVE #6,-(SP) ; routine selector
_Pack6
MOVE.L (SP)+,A0 ; save result in A0
RTS
; IUSetIntl(refNum,theID,intlParam)
; short refNum; (D0)
; short theID; (D1)
; Handle intlParam; (D2)
IUSetIntl
MOVE.W D0,-(SP) ; refnum
MOVE.W D1,-(SP) ; theID
MOVE.L D2,-(SP) ; intlParam
MOVE #8,-(SP) ; routine selector
_Pack6
RTS
Module 'IntlString'
; short IUCompString(aStr,bStr)
; Str255 *aStr; (D0)
; Str255 *bStr; (D1)
IUCompString
MOVE.L D0,A0 ; get pointer to string
MOVE.B (A0)+,D2 ; D2 = aLen
MOVE.L A0,D0 ; D0 = first char of aStr
MOVE.L D1,A0
MOVE.B (A0)+,D3 ; D3 = bLen
MOVE.L A0,D1 ; D1 = first char of bStr
BSR IUMagString
RTS ; result in D0
; short IUMagString(aStr,bStr,aLen,bLen)
; char *aStr; (D0)
; char *bStr; (D1)
; short aLen; (D2)
; short bLen; (D3)
IUMagString
MOVE.W #0,-(SP) ; save space for result
MOVE.L D0,-(SP) ; aStr
MOVE.L D1,-(SP) ; bStr
MOVE.W D2,-(SP) ; aLen
MOVE.W D3,-(SP) ; bLen
MOVE #10,-(SP) ; routine selector
_Pack6
MOVE.W (SP)+,D0
RTS ; result in D0
; short IUEqualString(aStr,bStr)
; Str255 *aStr; (D0)
; Str255 *bStr; (D1)
IUEqualString
MOVE.L D0,A0 ; get pointer to string
MOVE.B (A0)+,D2 ; D2 = aLen
AND.L #$0FF,D2
MOVE.L A0,D0 ; D0 = first char of aStr
MOVE.L D1,A0
MOVE.B (A0)+,D3 ; D3 = bLen
AND.L #$0FF,D3
MOVE.L A0,D1 ; D1 = first char of bStr
BSR IUMagIDString
RTS ; result in D0
; short IUMagIDString(aStr,bStr,aLen,bLen)
; char *aStr; (D0)
; char *bStr; (D1)
; short aLen; (D2)
; short bLen; (D3)
IUMagIDString
MOVE.W #0,-(SP) ; save space for result
MOVE.L D0,-(SP) ; aStr
MOVE.L D1,-(SP) ; bStr
MOVE.W D2,-(SP) ; aLen
MOVE.W D3,-(SP) ; bLen
MOVE #12,-(SP) ; routine selector
_Pack6
MOVE.W (SP)+,D0
RTS ; result in D0
Module 'Binary2Decimal'
; NumToString(theNum,theString)
; long theNum; (D0)
; Str255 *theString (D1)
NumToString
MOVE.L A0,-(SP) ; save A0
MOVE.L D1,A0 ; theString
MOVE #0,-(SP) ; routine selector
_Pack7
MOVE.L (SP)+,A0 ; restore A0
RTS
; StringToNum(theString,theNum)
; Str255 *theString; (D0)
; long *theNum; (D1)
StringToNum
MOVE.L D1,-(SP) ; save D1
MOVE.L D0,A0 ; A0 -> theString
MOVE #1,-(SP) ; routine selector
_Pack7
MOVE.L (SP)+,A0 ; move old D1 into A0
MOVE.L D0,(A0) ; save result
RTS
Module 'StdPutFile'
; SFPutFile(where, prompt, origName, dlgHook, reply)
; Point *where; (D0)
; struct PStr *prompt; (D1)
; struct PStr *origName; (D2)
; int (*dlgHook)(); (D3)
; SFReply *reply; (D4)
SFPutFile
MOVE.L D0,A0
MOVE.L (A0),-(SP) ; WHERE
MOVE.L D1,-(SP) ; PROMPT
MOVE.L D2,-(SP) ; origName
MOVE.L D3,-(SP) ; dlgHook
MOVE.L D4,-(SP) ; reply
MOVE #1,-(SP) ; routine selector
_Pack3
RTS
; SFPPutFile(where,prompt,origName,dlgHook,reply,dlgID,filterProc)
; Point *where; (D0)
; struct PStr *prompt; (D1)
; struct PStr *origName; (D2)
; int (*dlgHook)(); (D3)
; SFReply *reply; (D4)
; short dlgID; (D5)
; int (*dlgHook)() (D6)
SFPPutFile
MOVE.L D0,A0
MOVE.L (A0),-(SP) ; WHERE
MOVE.L D1,-(SP) ; PROMPT
MOVE.L D2,-(SP) ; origName
MOVE.L D3,-(SP) ; dlgHook
MOVE.L D4,-(SP) ; reply
MOVE.W D5,-(SP) ; dlgID
MOVE.L D6,-(SP) ; dlgHook
MOVE #3,-(SP) ; routine selector
_Pack3
RTS
Module 'StdGetFile'
; SFGetFile(where, prompt, fileFilter, numTypes, typeList, dlgHook, reply)
; Point *where; (D0)
; struct PStr *prompt; (D1)
; int (*fileFilter)(); (D2)
; short numTypes; (D3)
; SFTypeList *typeList; (D4)
; int (*dlgHook)(); (D5)
; SFReply *reply; (D6)
SFGetFile
MOVE.L D0,A0
MOVE.L (A0),-(SP) ; WHERE
MOVE.L D1,-(SP) ; PROMPT
MOVE.L D2,-(SP) ; FILTER PROC
MOVE.W D3,-(SP) ; numTypes
MOVE.L D4,-(SP) ; typeList
MOVE.L D5,-(SP) ; dlgHook
MOVE.L D6,-(SP) ; reply
MOVE #2,-(SP) ; routine selector
_Pack3
RTS
; SFPGetFile(where, prompt, fileFilter, numTypes, typeList,
; dlgHook, reply, dlgID, filterProc)
; Point *where; (D0)
; struct PStr *prompt; (D1)
; int (*fileFilter)(); (D2)
; short numTypes; (D3)
; SFTypeList *typeList; (D4)
; int (*dlgHook)(); (D5)
; SFReply *reply; (D6)
; short dlgID; 8(A6)
; int (*filterProc)() 12(A6)
SFPGetFile
LINK A6,#0
MOVE.L D0,A0
MOVE.L (A0),-(SP) ; WHERE
MOVE.L D1,-(SP) ; PROMPT
MOVE.L D2,-(SP) ; FILTER PROC
MOVE.W D3,-(SP) ; numTypes
MOVE.L D4,-(SP) ; typeList
MOVE.L D5,-(SP) ; dlgHook
MOVE.L D6,-(SP) ; reply
MOVE.W 10(A6),-(SP) ; dlgID
MOVE.L 12(A6),-(SP) ; filterProc
MOVE #4,-(SP) ; routine selector
_Pack3
UNLK A6
RTS
Module 'DiskInit'
; DILoad()
DILoad
MOVE #2,-(SP) ; routine selector
_Pack2
RTS
; DIUnload()
DIUnload
MOVE #4,-(SP) ; routine selector
_Pack2
RTS
; short DIBadMount(where,evtMessage)
; Point *where; (D0)
; long evtMessage; (D1)
DIBadMount
MOVE.W #0,-(SP) ; save space for result
MOVE.L D0,A0 ; convert point to long
MOVE.L (A0),-(SP) ; where
MOVE.L D1,-(SP) ; evtMessage
MOVE #0,-(SP) ; routine selector
_Pack2
MOVE.W (SP)+,D0
RTS ; D0 contains error
; short DIFormat(drvNum)
; short drvNum; (D0)
DIFormat
MOVE.W #0,-(SP) ; save space for result
MOVE.W D0,-(SP) ; drvNum
MOVE #6,-(SP) ; routine selector
_Pack2
MOVE.W (SP)+,D0
RTS ; D0 contains error
; short DIVerify(drvNum)
; short drvNum; (D0)
DIVerify
MOVE.W #0,-(SP) ; save space for result
MOVE.W D0,-(SP) ; drvNum
MOVE #8,-(SP) ; routine selector
_Pack2
MOVE.W (SP)+,D0
RTS ; D0 contains error
; short DIZero(drvNum,volName)
; short drvNum; (D0)
; Str255 *volName; (D1)
DIZero
MOVE.W #0,-(SP) ; save space for result
MOVE.W D0,-(SP) ; drvNum
MOVE.L D1,-(SP) ; volName
MOVE #10,-(SP) ; routine selector
_Pack2
MOVE.W (SP)+,D0
RTS ; D0 contains error
END
=========================StringLib.c==============================
/*
* StringLib.C Andrew G. Shebanow 8/2/85
*
* Routines for doing operations on Pascal strings in Mac C.
*
* Copyright 1985 HyperSoft All Rights Reserved
*/
#include <Memory.h>
#include <Resource.h>
/* this is a library of routines */
#Options M
/* some handy definitions */
/* miscellaneous definitions */
#define VOID void
#define BYTE char
#define WORD short
#define LONG int
#define UBYTE unsigned char
#define UWORD unsigned short
#define ULONG unsigned int
#define REG register
#define LOCAL static
#define GLOBAL /* */
#define EXTERN extern
#define TYPEDEF typedef
#define STRUCT struct
#define UNION union
/* pascal boolean definitions */
#define TRUE 1
#define FALSE 0
#define NULL 0
/*
* StrUpper:
*
* Converts a strings contents to uppercase. No checking for
* international characters is done.
*/
GLOBAL
VOID StrUpper(str)
StringPtr str;
{
UBYTE cntr, lim;
UBYTE ch;
lim = str->count;
for (cntr = 0; cntr < lim; cntr++)
{
ch = str->s[cntr];
if ((ch >= 'a') && (ch <= 'z'))
str->s[cntr] = (ch - 'a' + 'A');
}
}
/*
* AppendStr:
*
* Append str2 to str1. It is assumed that str1 has all 255 bytes
* of data allocated to it.
*/
GLOBAL
VOID AppendStr(str1,str2)
StringPtr str1;
StringPtr str2;
{
UBYTE cntr;
UBYTE lim;
UBYTE offst;
if ((str2 == NULL) || (str2->count == 0))
return;
if ((str1->count + str2->count) > 255)
lim = 255 - str1->count;
else lim = str2->count;
offst = str1->count;
for (cntr = 0; cntr < lim; cntr++)
str1->s[offst + cntr] = str2->s[cntr];
str1->count += lim;
}
/*
* CopyStr:
*
* copies source string to destination string.
*/
GLOBAL
VOID CopyStr(srcStr,dstStr)
REG StringPtr srcStr;
REG StringPtr dstStr;
{
REG UBYTE cntr;
REG UBYTE lim;
lim = srcStr->count;
dstStr->count = lim;
for (cntr = 0; cntr < lim; cntr++)
dstStr->s[cntr] = srcStr->s[cntr];
}
/*
* GetSuffix:
*
* searches a filename for a suffix (eg, ".c"), and copies the suffix
* into another string. Note that it searches BACKWARDS into the string, so
* the file 'Crazy Name.file.c' has a suffix string of '.c'!
*/
GLOBAL
LONG GetSuffix(fileName,suffix)
StringPtr fileName;
StringPtr suffix;
{
WORD cntr;
WORD lim;
WORD found = FALSE;
UBYTE dcntr = 0;
lim = (WORD) (fileName->count & 0x0ff);
suffix->count = 0;
if (lim == 0)
return(FALSE);
for (cntr = lim - 1; cntr >= 0; cntr--)
if (fileName->s[cntr] == '.')
{
found = TRUE;
break;
}
if (found == FALSE)
return(FALSE);
while (cntr < lim)
{
suffix->s[dcntr++] = fileName->s[cntr++];
suffix->count += 1;
}
return(TRUE);
}
/*
* ChangeSuffix:
*
* searches a string for a suffix (eg, ".c"), and copies the string
* to a destintaion string, using the new suffix passed to it.
*/
GLOBAL
VOID ChangeSuffix(srcStr,dstStr,suffix)
StringPtr srcStr;
StringPtr dstStr;
StringPtr suffix;
{
UBYTE cntr, lim;
WORD found = FALSE;
UBYTE dcntr = 0;
lim = srcStr->count;
dstStr->count = 0;
if (lim == 0)
{
/* copy suffix string to dest string */
CopyStr(suffix,dstStr);
return;
}
/* copy entire string */
CopyStr(srcStr,dstStr);
/* search for start of suffix, moving backwards */
for (cntr = lim - 1; cntr >= 0; cntr--)
if (dstStr->s[cntr] == '.')
{
found = TRUE;
break;
}
if (found == TRUE)
dstStr->count = cntr; /* truncate the string */
/* append new suffix */
AppendStr(dstStr,suffix);
return;
}
/**************************** end of StringLib.C *********************/
=========================TECalls.c==============================
/*
* TECalls.c Dave Burnard 7/6/85
*
* TEScrap ToolBox Extension Routines. Desribed in the TextEdit section
* of Inside Mac.
*
* Copyright 1985 Dave Burnard
*
* Modifications:
*
* 10/18/85 Cosmetic modifications to match rest of library (AGS)
*/
#Options +Z
#include "MacDefs.h"
#include "Memory.h"
#define OSErr short
/* ToolBox Global access */
#define TEScrpLength *((short *)0x0AB0)
#define TEScrpHandle *((Handle *)0x0AB4)
/*
* TEScrapHandle:
*
* returns a handle to the text edit scrap.
*/
Handle TEScrapHandle()
{
return(TEScrpHandle);
}
/*
* TEGetScrapLen:
*
* returns the length of the TextEdit scrap.
*/
long TEGetScrapLen()
{
return(TEScrpLength);
}
/*
* TESetScrapLen:
*
* sets the length of the text edit scrap. Presumably called after
* you put something in the scrap.
*/
void TESetScrapLen(length)
long length;
{
TEScrpLength = (short) length;
}
/*
* TEFromScrap:
*
* Sets the TE scrap to have a copy of the real scrap data.
* Note that the function actually returns the scrap length, not the
* OSErr as it should. Maybe a call to MemError() would result in
* the desired result?
*/
OSErr TEFromScrap()
{
long offset,length;
length = GetScrap(TEScrapHandle(), 'TEXT', &offset);
if (length > 0)
{
TESetScrapLen(length);
}
return((OSErr) length);
}
/*
* TEToScrap:
*
* copy TE scrap to real scrap. MUST be preceded by a call to ZeroScrap!
* Note that the function actually returns the scrap length, not the
* OSErr as it should. Maybe a call to MemError() would result in
* the desired result?
*/
OSErr TEToScrap()
{
Ptr *TEScrapH;
long length;
HLock(TEScrapH = TEScrapHandle());
length = PutScrap(TEGetScrapLen(), 'TEXT', *TEScrapH);
HUnlock(TEScrapH);
/* if length is <0, it is an error code */
if (length >= 0)
{
length = 0;
}
return((OSErr) length);
}
/****************************** end of TECalls.c *************************/
=========================ToolUtils.c==============================
/*
* ToolUtils.c Andrew G. Shebanow 9/3/85
*
* Implementation of ToolBox utility routines for MacC. These
* routines emulate the [ No Trap Macro ] routines documented in the
* ToolBox Utilities section of Inside Mac.
*/
#include <QuickDraw.h>
#include <Memory.h>
#include <Resource.h>
/* pascal boolean definitions */
#define TRUE 1
#define FALSE 0
#define NULL 0
/* this is a library of routines */
#Options M
/*
* GetIndString:
*
* This function attempts to read a 'STR#' resource into memory
* and extract an individual string from that resource.
*/
GetIndString(theString,strListID,index)
StringPtr theString; /* set to the string */
unsigned short strListID; /* the id of the STR# resource */
unsigned short index; /* index (range 1-n) of desired Str255 */
{
StringHandle strHandle;
register unsigned char *strPtr;
register unsigned char idx;
unsigned char lcntr, total;
unsigned short *cntPtr, cnt;
strHandle = (StringHandle) GetResource('STR#',strListID);
if (strHandle == NULL)
{
theString->count = 0;
return;
}
HLock(strHandle);
cntPtr = (unsigned short *) *strHandle;
cnt = *cntPtr;
if (index > cnt)
{
theString->count = 0;
return;
}
strPtr = (unsigned char *) ++cntPtr;
index -= 1;
for (idx = 0; idx < index; idx++)
{
/* get the strings before the desired string */
total = *strPtr;
strPtr += (total + 1);
}
theString->count = *strPtr;
strPtr++;
total = theString->count;
for (lcntr = 0; lcntr < total; lcntr++)
{
theString->s[lcntr] = *strPtr;
strPtr++;
}
HUnlock(strHandle);
}
typedef struct {
short count;
Pattern thePats[100];
} PatList;
GetIndPattern(thePattern,patListID,index)
Pattern *thePattern;
short patListID;
short index;
{
PatList **patHandle;
PatList *patPtr;
patHandle = (PatList **) GetResource('PAT#',patListID);
if (patHandle == NULL)
return;
HLock(patHandle);
patPtr = *patHandle;
if (index > patPtr->count)
{
HUnlock(patHandle);
return;
}
BlockMove(&(patPtr->thePats[index]),thePattern,8);
HUnlock(patHandle);
}
void ScreenRes(scrVRes,scrHRes)
short *scrVRes; /* D0.L */
short *scrHRes; /* D1.L */
{
#asm
; These constants are defined in
; Macintosh Technical Note 16: MacWorks XL Owners Manual
ScrVRes EQU $102
ScrHres EQU $104
MOVEM.L A0-A1,-(SP) ; save registers
MOVE.L D0,A0 ; put variables in address registers
MOVE.L D1,A1
MOVE.W ScrVRes,(A0) ; store into variable
MOVE.W ScrHRes,(A1) ; ditto
MOVEM.L (SP)+,A0-A1 ; restore registers
#endasm
}
/**************************** end of ToolUtils.c *********************/shebanow@ernie.BERKELEY.EDU (Mike Shebanow) (11/28/85)
(beware the line eater)
=========================EventMgr.Asm==============================
*
* EventMgr.asm Andrew G. Shebanow 11/27/85
*
* Glue code for the Event Manager (both Toolbox and OS level).
* Implements the [Pascal Only] calls defined in Inside Mac.
*
* For the IMLib library, using Mac C calling conventions.
*
* Copyright 1985 HyperSoft All Rights Reserved
*
* Standard includes
INCLUDE SysEquX.D
* Defined here:
XDEF GetCaretTime
XDEF GetDblTime
XDEF GetEvQHdr
XDEF SetEventMask
*
* long GetCaretTime()
*
Module 'GetCaretTime'
GetCaretTime
MOVE.L CaretTime,D0 ; just get it
RTS
*
* long GetDblTime()
*
Module 'GetDblTime'
GetDblTime
MOVE.L DoubleTime,D0 ; just get it
RTS
*
* QHdrPtr GetEvQHdr()
*
Module 'GetEvQHdr'
GetEvQHdr
MOVE.L EventQueue,A0 ; This is defined as a 10 byte
; area. Assuming that the first
; longword is the QHdrPtr value.
; Hopefully this is actually
; the correct pointer to return.
RTS
*
* SetEventMask(theMask)
* short theMask; (D0.W)
*
Module 'SetEventMask'
SetEventMask
MOVE.L A0,-(SP) ; save A0
MOVE.L #SysEvtMask,A0 ; A0 -> the os global variable
MOVE.W D0,(A0) ; store mask
MOVE.L (SP)+,A0 ; restore A0
RTS
END
************************* end of EventMgr.asm *************************
=========================FinderParms.c==============================
/*
* FinderParms.c Andrew G. Shebanow 8/31/85
*
* Routines to emulate the Pascal calls which return finder information
* (e.g., file arguments, open or print, etc). Written to
* interface to Consulair's MacC compiler.
*
* In addition, several additional calls have been added to the library.
* These routines let applications manipulate the application parms for
* another application prior to a Launch call.
*
* Copyright 1985 HyperSoft All Rights Reserved
*
* Modification History
*
* 9/9/85 Moved to C version (AGS)
* 9/9/85 Added code to set finder parms (AGS)
*/
#include "memory.h"
/* this is a library of routines */
#Options M
/* finder message open files or print files */
#define appOpen 0
#define appPrint 1
/* finder application parameter info */
typedef struct {
short vRefNum;
unsigned long fType;
short versNum;
Str255 fName;
} AppFile;
#define APPPARMHANDLE 0x0aec
typedef struct {
short message;
short count;
AppFile files[4]; /* actually open ended */
} AppParms;
short AddAppFile(appFile)
AppFile *appFile;
{
Handle appParmH;
AppParms *appParmPtr;
AppFile *newAppFile;
unsigned long appHsize, appFsize;
unsigned long newSize;
appParmH = (Handle) APPPARMHANDLE;
appParmH = (Handle) *appParmH;
appHsize = GetHandleSize(appParmH);
appFsize = (unsigned long) appFile->fName.count;
appFsize++;
if ((appFsize & 0x01) != 0)
appFsize++;
appFsize += 8;
newSize = appFsize + appHsize;
if (SetHandleSize(appParmH,newSize) != 0)
return(1);
appParmPtr = (AppParms *) *appParmH;
newAppFile = &(appParmPtr->files[appParmPtr->count]);
BlockMove(appFile,newAppFile,appFsize);
appParmPtr->count += 1;
return(0);
}
static asmprocs()
{
#asm
INCLUDE MACTRAPS.D
INCLUDE SYSEQU.D
INCLUDE TOOLEQU.D
; Routines declared here:
XDEF CountAppFiles
XDEF GetAppFiles
XDEF ClrAppFiles
XDEF ZeroAppFiles
XDEF SetAppMessage
XDEF GetAppName
XDEF GetFndrName
XDEF SetFndrName
XDEF LOCFindIndex
SModule 'FindIndex'
; LOCFindIndex
;
; finds the nth AppFile record.
;
; INPUT:
; A0.L pointer to AppParms
; D0.W index (1..count)
; OUTPUT:
; A1.L pointer to AppFile data or 0 if not found
LOCFindIndex
MOVEM.L A2-A4,-(SP) ; save regs
MOVE.L 0,A1 ; set result to 0
TST D0 ; test for legal index
BLE FindXit
CMP 2(A0),D0
BGT FindXit
LEA 4(A0),A2 ; start of first AppFile
MOVE D0,D1 ; D1 is loop counter
@1 SUBQ #1,D1 ; index from 0
BEQ @2 ; if 0 we are done
ADD.L #8,A2 ; start of filename string
MOVE.B (A2),D2 ; D2 gets filename size
AND.L #$0FF,D2 ; mask off high bits
ADDQ.L #1,D2 ; plus one more for size byte
BTST #0,D2 ; test for pad byte
BEQ @3 ; if odd count, we must pad
ADDQ.L #1,D2 ; add one for pad byte
@3 ADD.L D2,A2 ; add string size to address
BRA @1
@2 MOVE.L A2,A1 ; store in result
FindXit MOVEM.L (SP)+,A2-A4 ; restore regs
RTS
SModule 'CountAppFiles'
; void CountAppFiles(message,count)
; short *message; (D0)
; short *count; (D1)
CountAppFiles:
MOVEM.L A0-A2,-(SP) ; save regs
MOVE.L AppParmHandle,A0
MOVE.L (A0),A0 ; A0 points to AppParms
MOVE.L D0,A1 ; A1 points to message
MOVE.L D1,A2 ; A2 points to count
MOVE (A0),(A1) ; save into message
MOVE 2(A0),(A2) ; save into count
MOVEM.L (SP)+,A0-A2 ; restore regs
RTS
SModule 'GetAppFiles'
; void GetAppFiles(index,appFile)
; short index; (D0)
; AppFile *appFile; (D1)
GetAppFiles:
MOVEM.L A0-A2,-(SP) ; save regs
MOVE.L AppParmHandle,A0
MOVE.L (A0),A0 ; A0 points to AppParms
MOVE.L D1,A2 ; A2 points to appFile
JSR LOCFindIndex ; find index
CMP.L #0,A1
BEQ @1 ; if couldn't find, handle error
; copy AppFile data from A1 to appFile
MOVE.L A1,A0 ; source ptr
MOVE.L A2,A1 ; dest ptr
MOVE.L 8(A0),D0 ; put str len in D0
AND.L #$0FF,D0 ; mask hight bytes
ADDQ.L #1,D0
BTST #0,D0
BEQ @2 ; if odd number of bytes...
ADDQ.L #1,D0 ; pad with additional byte
@2 ADD.L #8,D0 ; add space for other data
_BlockMove
@1 MOVEM.L (SP)+,A0-A2 ; restore regs
RTS
SModule 'ClrAppFiles'
; void ClrAppFiles(index)
; short index; (D0)
ClrAppFiles:
MOVEM.L A0-A1,-(SP) ; save regs
MOVE.L AppParmHandle,A0
MOVE.L (A0),A0 ; A0 points to AppParms
JSR LOCFindIndex ; find index
CMP.L #0,A1
BEQ @1
MOVE.L #0,2(A1) ; clear out fType field
@1 MOVEM.L (SP)+,A0-A1 ; restore regs
RTS
SModule 'ZeroAppFiles'
; void ZeroAppFiles()
ZeroAppFiles
MOVEM.L A0-A1,-(SP) ; save regs
MOVE.L AppParmHandle,A0
MOVE.L (A0),A1 ; A1 points to AppParms
CLR.L (A1) ; set message & count to 0
MOVEQ.L #4,D0 ; set handle size to 4
_SetHandleSize
MOVEM.L (SP)+,A0-A1 ; restore regs
RTS
SModule 'SetAppMessage'
; void SetAppMessage(message)
; short message; (D0)
SetAppMessage
MOVE.L A0,-(SP) ; save regs
MOVE.L AppParmHandle,A0
MOVE.L (A0),A1 ; A1 points to AppParms
MOVE.W D0,(A0) ; move message into app parm area
MOVE.L (SP)+,A0 ; restore regs
RTS
SModule 'GetAppName'
; void GetAppName(appName)
; StringPtr appName; (D0)
;
; return name of current application
GetAppName
MOVEM.L A0-A1,-(SP)
TST.L D0
BEQ @1 ; if string pointer is null, return
LEA CurApName,A0 ; src <- CurApName global
MOVE.L D0,A1 ; dst <- appName
MOVE.B (A0),D0 ; get string size
AND.L #$0FF,D0
ADDQ.L #1,D0 ; add 1 for size byte
_BlockMove ; copy the string
@1 MOVEM.L (SP)+,A0-A1
RTS
SModule 'GetFndrName'
; GetFndrName(fndrName)
; StringPtr fndrName; (D0)
;
; return name of current finder.
;
GetFndrName
MOVEM.L A0-A1,-(SP)
TST.L D0
BEQ @1 ; if string pointer is null, return
LEA FinderName,A0 ; src <- FinderName
MOVE.L D0,A1 ; dst <- fndrName
MOVE.B (A0),D0 ; get string size
AND.L #$0FF,D0
ADDQ.L #1,D0 ; add 1 for size byte
_BlockMove ; copy the string
@1 MOVEM.L (SP)+,A0-A1
RTS
SModule 'SetFndrName'
; SetFndrName(fndrName)
; StringPtr fndrName; (D0)
;
; set current finder.
;
SetFndrName
MOVEM.L A0-A1,-(SP)
TST.L D0
BEQ @1 ; if string pointer is null, return
MOVE.L D0,A0 ; src <- fndrName
LEA FinderName,A1 ; dst <- FinderName global
MOVE.B (A0),D0 ; get string size
CMP.B #15,D0
BGT @1 ; if string to big, do nothing
AND.L #$0FF,D0
ADDQ.L #1,D0 ; add 1 for size byte
_BlockMove ; copy the string
@1 MOVEM.L (SP)+,A0-A1
RTS
#endasm
}
/********************* end of FinderParms.c *********************/
=========================MemoryMgr.Asm==============================
;
; MemoryMgr.Asm Andrew G. Shebanow 9/1/85
;
; Routines to emulate the [NO TRAP MACRO] routines documented in
; the Memory Manager section of Inside Mac.
;
; The routine MaxApplZone was taken from the 8/85 issue of MacTutor Magazine
; and is copyrighted by MacTutor Magazine.
;
; Copyright 1985 HyperSoft All Rights Reserved
;
; Modifications:
;
; 10/18/85 Made MemError return value of variable in
; Low Memory
;
INCLUDE MacTraps.D
INCLUDE SysEquX.D
; Declared here:
XDEF MaxApplZone
XDEF SystemZone
XDEF ApplicZone
XDEF GZCritical
XDEF GZSaveHnd
XDEF TopMem
XDEF MemError
; MaxApplZone()
;
; This routine from 8/85 issue of MacTutor magazine
;
; "MaxApplZone expands the application heap zone to the application heap
; limit without purging any blocks currently in the zone. If the zone
; already extends to the limit, it won't be changed"
; Inside Macintosh spec of MaxApplZone
MinBlkSize EQU 12 ; minimum physical size of block
MaxApplZone
MOVEM.L A0-A1,-(SP) ; save regs
MOVE.L ApplLimit,A0 ; A0 = application heap limit (ptr)
MOVE.L HeapEnd,A1 ; A1 = addr of cur zone trailer
MOVE.L A0,D0
SUB.L A1,D0 ; D0 = size of unused space (incl trailer)
MOVEQ #MinBlkSize,D1 ; D1 = min phys size of a block
CMP.L D1,D0 ; unused space < min block size?
BLO.S @0 ; if so, can't expand zone, bye-bye
MOVE.L A0,HeapEnd ; update HeapEnd to heap limit
MOVE.L D0,(A1) ; unused space = free block (header = size)
MOVE.L ApplZone,A1 ; A1 points to zone header
MOVE.L A0,(A1) ; ApplicZone->bkLim = heap limit
MOVE.L D1,(A0) ; make new zone trailer (free, size = min)
ADD.L D0,zcbFree(A1) ; update count of free bytes in zone
MOVEM.L (SP)+,A0-A1 ; restore regs
@0 RTS
; THz SystemZone()
SystemZone
MOVE.L SysZone,A0 ; SysZone is a pointer to system zone
RTS
; THz ApplicZone()
ApplicZone
MOVE.L ApplZone,A0 ; ApplZone is a pointer to applic zone
RTS
; char GZCritical()
GZCritical
MOVE.L #1,D0 ; default return is TRUE
MOVE.L GZMoveHnd,D1
BEQ.S @0
MOVE.L GZRootHnd,D1
BEQ.S @0
MOVE.B #0,D0 ; return false
@0 RTS
; Handle GZSaveHnd()
GZSaveHnd
MOVE.L GZRootHnd,A0
RTS
; Ptr TopMem()
TopMem
MOVE.L MemTop,A0
RTS
; OSErr MemError()
;
; Apple's document LoAlpha.TXT (from the Software Supplement)
; specifies address $220 as the location of the last memory manager
; error. However, this location is NOT part of SysEqu.TXT, and it may be
; used by Apple's memory manager glue routine to STORE the error instead
; of simply reading from it. No guarantee of valid results.
MemError
MOVE.W $220,D0
RTS
END
=========================OSUtils.Asm==============================
*
* OSUtils.asm Andrew G. Shebanow 11/27/85
*
* Routines to emulate the [Pascal Only] calls defined
* in the OS Utilities section of Inside Macintosh for Consulair C.
* Also includes one routine for Vertical Retrace Manager.
*
* Copyright 1985 HyperSoft All Rights Reserved
*
* Standard Includes:
INCLUDE SysEquX.D
INCLUDE MacTraps.D
* Defined here:
XDEF Environs
XDEF Restart
XDEF SetUpA5
XDEF RestoreA5
XDEF GetTime
XDEF SetTime
XDEF GetDateTime
XDEF GetSysPPtr
XDEF GetVBLQHdr
*
* Environs(rom,machine)
* short *rom; (D0.L)
* short *machine; (D1.L)
*
; these constants are defined by Macintsoh Tech Note #16: MacWorks XL
RomVers EQU $400008
Machine EQU $400009
Module 'Environs'
Environs
MOVEM.L A0-A1,-(SP) ; save regs
MOVE.L D0,A0
MOVE.L D1,A0
CLR.W (A0)
CLR.W (A1)
MOVE.B RomVers,1(A0) ; save version into lsb of var
MOVE.B Machine,1(A1) ; save machine into lsb of var
MOVEM.L (SP)+,A0-A1 ; restore regs
RTS
*
* Restart()
*
Module 'Restart'
Restart
RTS
*
* SetUpA5()
*
Module 'A5SetupRestore'
SavedA5 DS.L 1
SetUpA5
MOVE.L A4,-(SP) ; save regs
MOVE.L A5,A4 ; save old (and possibly wrong) A5
MOVE.L CurrentA5,A5 ; get real A5 FIRST
MOVE.L A4,SavedA5(A5) ; NOW use as index to global
MOVE.L (SP)+,A4 ; restore regs
RTS
*
* RestoreA5()
*
RestoreA5
MOVE.L CurrentA5,A5 ; make sure we are valid FIRST
MOVE.L SavedA5(A5),A5 ; set to old value
RTS
*
* GetTime(date)
* DateTimeRec *date; (D0.L)
*
Module 'GetTime'
GetTime
MOVEM.L D0/A0,-(SP) ; save regs
MOVE.L D0,A0
MOVE.L Time,D0
_Secs2Date ; call trap
MOVEM.L (SP)+,D0/A0 ; restore regs
RTS
*
* SetTime(date)
* DateTimeRec *date; (D0.L)
*
Module 'SetTime'
SetTime
MOVEM.L D0/A0,-(SP) ; save regs
MOVE.L D0,A0
_Date2Secs ; call trap
_SetDateTime ; store that time
MOVEM.L (SP)+,D0/A0 ; restore regs
RTS
*
* GetDateTime(secs)
* long *secs; (D0.L)
*
Module 'GetDateTime'
GetDateTime
MOVE.L A0,-(SP) ; save A0
MOVE.L D0,A0
MOVE.L Time,(A0) ; get value of variable
MOVE.L (SP)+,A0 ; restore A0
RTS
*
* SysPPtr GetSysPPtr()
*
Module 'GetSysPPtr'
GetSysPPtr
MOVE.L #SysParam,A0 ; store pointer in A0
RTS
*
* QHdrPtr GetVBLQHdr()
*
Module 'GetVBLQhdr'
GetVBLQHdr
MOVE.L vblQueue,A0 ; get address of queue ptr
RTS
END
*********************** end of OSUtils.ASM **************************