home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari FTP
/
ATARI_FTP_0693.zip
/
ATARI_FTP_0693
/
Tex
/
td187src.lzh
/
MTRSC.I
< prev
next >
Wrap
Text File
|
1991-06-10
|
5KB
|
179 lines
(*#######################################################################
M A G I C R E S O U R C E
#######################################################################
V1.01 21.10.90 Peter Hellinger
V1.00 21.08.90 Peter Hellinger
#######################################################################*)
IMPLEMENTATION MODULE mtRsc;
(*------------------------------*)
(* COMPILERSWITCHES *)
(*------------------------------*)
(* TDI-Version: DEAKTIVIERT *)
(*------------------------------*)
(* V- Overflow-Checks *)
(* R- Range-Checks *)
(* S- Stack-Check *)
(* N- NIL-Checks *)
(* T- TDI-Compiler vor 3.01 *)
(* Q+ Branch statt Jumps *)
(* *)
(*------------------------------*)
(* MM2-Version: AKTIVIERT *)
(*------------------------------*)
(*$R- Range-Checks *)
(*$S- Stack-Check *)
(* *)
(*------------------------------*)
FROM SYSTEM IMPORT ADDRESS;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
FROM MagicSys IMPORT Null;
FROM MagicAES IMPORT AESPB, RsrcLoad, RsrcFree, RsrcGaddr,
RsrcSaddr, RsrcObfix, ShelFind;
FROM MagicStrings IMPORT Assign;
FROM mtAppl IMPORT InstallTermproc, MouseOn, MouseOff, MouseBusy, MouseArrow;
(**
IMPORT RTD;
**)
TYPE RESOURCE = POINTER TO Resource;
Resource = RECORD
addr: ADDRESS;
next: RESOURCE;
last: RESOURCE;
END;
VAR RscList: RESOURCE;
PROCEDURE LoadRsc (name: ARRAY OF CHAR; VAR rsc: RESOURCE): BOOLEAN;
VAR p, q: RESOURCE;
path: ARRAY [0..255] OF CHAR;
load: BOOLEAN;
adr: ADDRESS;
PROCEDURE new (): RESOURCE;
BEGIN
IF RscList = NIL THEN
NEW (RscList); RscList^.last:= NIL; RscList^.next:= NIL;
RETURN RscList;
ELSE
p:= RscList;
WHILE p^.next # NIL DO p:= p^.next; END;
NEW (q); p^.next:= q; q^.last:= p; q^.next:= NIL;
END;
RETURN q;
END new;
BEGIN
MouseBusy;
(** RTD.Write('Load RSC:', name); **)
Assign (name, path);
(* RTD.Write('To load:', path); *)
ShelFind (path);
(* RTD.Write('After ShelFind:', path); *)
adr:= AESPB.cbPglobal^.apPtree;
AESPB.cbPglobal^.apPtree:= Null;
load:= RsrcLoad (path);
MouseArrow;
IF load = FALSE THEN
(* RTD.Message('RSC not loaded'); *)
AESPB.cbPglobal^.apPtree:= adr;
rsc:= NIL;
RETURN FALSE;
END;
(* RTD.Message('RSC loaded'); *)
rsc:= new ();
rsc^.addr:= AESPB.cbPglobal^.apPtree;
RETURN TRUE;
END LoadRsc;
PROCEDURE FreeRsc (VAR rsc: RESOURCE);
VAR old: ADDRESS;
BEGIN
IF rsc # NIL THEN
old:= AESPB.cbPglobal^.apPtree;
AESPB.cbPglobal^.apPtree:= rsc^.addr;
RsrcFree;
IF old # rsc^.addr THEN
AESPB.cbPglobal^.apPtree:= old;
ELSE
IF rsc^.last # NIL THEN
AESPB.cbPglobal^.apPtree:= rsc^.last^.addr;
ELSIF rsc^.next # NIL THEN
AESPB.cbPglobal^.apPtree:= rsc^.next^.addr;
ELSE
AESPB.cbPglobal^.apPtree:= Null;
END;
END;
IF rsc^.last # NIL THEN
rsc^.last^.next:= rsc^.next;
ELSE
RscList:= rsc^.next;
END;
DISPOSE (rsc);
END;
END FreeRsc;
PROCEDURE FreeAll;
VAR p: RESOURCE;
BEGIN
IF RscList # NIL THEN
p:= RscList;
WHILE p # NIL DO
AESPB.cbPglobal^.apPtree:= p^.addr;
RsrcFree;
p:= p^.next;
END;
AESPB.cbPglobal^.apPtree:= Null;
RscList:= NIL;
END;
END FreeAll;
PROCEDURE GaddrRsc (rsc: RESOURCE; type, item: INTEGER): ADDRESS;
VAR old, ret: ADDRESS;
BEGIN
IF rsc # NIL THEN
old:= AESPB.cbPglobal^.apPtree;
AESPB.cbPglobal^.apPtree:= rsc^.addr;
ret:= RsrcGaddr (type, item);
AESPB.cbPglobal^.apPtree:= old;
RETURN ret;
END;
END GaddrRsc;
PROCEDURE SaddrRsc (rsc: RESOURCE; type, item: INTEGER; tree: ADDRESS);
VAR old: ADDRESS;
BEGIN
IF rsc # NIL THEN
old:= AESPB.cbPglobal^.apPtree;
AESPB.cbPglobal^.apPtree:= rsc^.addr;
RsrcSaddr (type, item, tree);
AESPB.cbPglobal^.apPtree:= old;
END;
END SaddrRsc;
PROCEDURE ObfixRsc (rsc: RESOURCE; tree: ADDRESS; object: INTEGER);
VAR old: ADDRESS;
BEGIN
IF rsc # NIL THEN
old:= AESPB.cbPglobal^.apPtree;
AESPB.cbPglobal^.apPtree:= rsc^.addr;
RsrcObfix (tree, object);
AESPB.cbPglobal^.apPtree:= old;
END;
END ObfixRsc;
BEGIN
RscList:= NIL;
InstallTermproc (FreeAll);
END mtRsc.