[net.sources.mac] ETHZ Standalone Implementation Module

bobc@tikal.UUCP (Bob Campbell) (05/14/86)

# The rest of this file is a shell script which will extract:
# SYSTEMX.MOD ScrapManager.MOD Storage.MOD Streams.MOD
echo x - SYSTEMX.MOD
cat >SYSTEMX.MOD <<'!Funky!Stuff!'
IMPLEMENTATION MODULE SYSTEMX;
 
FROM SYSTEM IMPORT ADDRESS,CODE,SETREG,REGISTER,ADR,PROCESS;

CONST
    FADDS   =   01000H;
    FSUBS   =   01002H;
    FMULS   =   01004H;
    FDIVS   =   01006H;
    FCMPS   =   01008H;
    
    FTINTX  =   00016H;
    
    FX2S    =   01010H;
    FS2X    =   0100EH;
    
    FX2L    =   02810H;
    FL2X    =   0280EH;
    
(*$P-*)
PROCEDURE DoCASE;
BEGIN
    CODE(0205FH);                   (* MOVEA.L  (A7)+,A0                *)
    CODE(09090H);                   (* SUB.L    (A0),DO                 *)
    CODE(0B0A8H);CODE(00004H);  (* CMP.L    0004(A0),D0             *)
    CODE(0620CH);                   (* BHI      $1 {+12}                    *)
    CODE(0E380H);                   (* ASL.L    #1,D0                       *)
    CODE(0D0A8H);CODE(00008H);  (* ADD.L    0008(A0),D0             *)
    CODE(0D0F0H);CODE(00800H);  (* ADDA.L   00(A0,DO.W),A0          *)
    CODE(04ED0H);                   (* JMP      (A0)                    *)
                            (* $1 *)
    CODE(0D1E8H);CODE(00008H);  (* ADDA.L   0008(A0),A0             *)
    CODE(05988H);                   (* SUBQ.L   #4,A0                       *)
    CODE(04ED0H);                   (* JMP      (A0)                    *)
END DoCASE;

PROCEDURE DoHALT;
(*$P-*)
BEGIN
    CODE(0A9FFH); (* CALL DEBUGGER *)
    CODE(04E75H);
END DoHALT;

PROCEDURE CheckStack;
(*$P-*)
BEGIN
    (* STUBED OUT FOR NOW! *)
    CODE(04E75H);               (* RTS      *)
END CheckStack;

PROCEDURE SYSProc20;
(*$P-*)
BEGIN
(* 0000    MOVEQ.L  #0007,D0              *)    CODE(07007H);
    DoHALT;
END SYSProc20;

PROCEDURE NEWPROCESS;
(*$P-*)
BEGIN
    CODE(0700AH);               (* MOVEQ.L  #000A,D0                    *)
    DoHALT;
END NEWPROCESS;

PROCEDURE TRANSFER;
(*$P-*)
BEGIN
    CODE(0700BH);               (* MOVEQ.L  #000B,DO                    *)
    DoHALT;
END TRANSFER;

PROCEDURE SYSProc21;
(*$P-*)
BEGIN
(*
 *  Procedure Code Proc # 21
 *   Entry Point  0000, number of bytes = 40
 *)
(* 0000    MOVE.W   #2700,SR              *) CODE(046FCH);CODE(02700);
(* 0004    MOVE.L   A6,-(A7)              *) CODE(02F0EH);
(* 0006    MOVE.L   USP,A6                *) CODE(04E6EH);
(* 0008    MOVE.L   A5,-(A6)              *) CODE(02D0DH);
(* 000A    LEA      A6,FFCC(A6)           *) CODE(04DEEH); CODE(0FFCCH);
(* 000E    MOVE.L   (A7)+,-(A6)           *) CODE(02D1FH);
(* 0010    MOVE.W   (A7)+,-(A6)           *) CODE(03D1FH);
(* 0012    MOVE.L   (A7)+,-(A6)           *) CODE(02D1FH);
(* 0014    MOVE.L   A6,(A0)               *) CODE(0208EH);
(* 0016    MOVEA.L  (A1),A6               *) CODE(02C51H);
(* 0018    MOVE.L   (A6)+,-(A7)           *) CODE(02F1EH);
(* 001A    MOVE.W   (A6)+,-(A7)           *) CODE(03F1EH);
(* 001C    MOVE.L   (A6)+,-(A7)           *) CODE(02F1EH);
(* 001E    MOVEM.L  D0-A5,(A6)+           *) CODE(04CDEH); CODE(03FFFH);
(* 0022    MOVE.L   A6,USP                *) CODE(04E66H);
(* 0024    MOVEA.L  (A7)+,A6              *) CODE(02C5FH);
(* 0026    RTE                            *) CODE(04E73H);
END SYSProc21;

PROCEDURE IOTRANSFER(p1,p2:PROCESS; via:ADDRESS);
(*$P-*)
BEGIN
    CODE(0700CH);               (* MOVEQ.L  #000C,DO                    *)
    DoHALT;
END IOTRANSFER;

PROCEDURE SYSProc7;
(* IF D0 = 2 THEN LISTEN ELSIF D0 = 3 THEN SYSRESET END *)
(*$P-*)
BEGIN
    CODE(0700DH);
    DoHALT;
END SYSProc7;

PROCEDURE SYSLongMult;
(*$P-*)
BEGIN
    CODE(04E56H);CODE(00000H);  (* LINK     A6,#0000                    *)
    CODE(048E7H);CODE(07C00H);  (* MOVEM.L  D5-D1,-(A7)                 *)
    CODE(0222EH);CODE(00008H);  (* MOVE.L   0008(A6),D1                 *)
    CODE(0242EH);CODE(0000CH);  (* MOVE.L   000C(A6),D2                 *)
    CODE(02601H);               (* MOVE.L   D1,D3                       *)
    CODE(02801H);               (* MOVE.L   D1,D4                       *)
    CODE(02A02H);               (* MOVE.L   D2,D5                       *)
    CODE(04844H);               (* SWAP     D4                          *)
    CODE(04845H);               (* SWAP     D5                          *)
    CODE(0C2C2H);               (* MULU.W   D2,D1                       *)
    CODE(0C4C4H);               (* MULU.W   D4,D2                       *)
    CODE(0C6C5H);               (* MULU.W   D5,D3                       *)
    CODE(0C8C5H);               (* MULU.W   D5,D4                       *)
    CODE(04841H);               (* SWAP     D1                          *)
    CODE(0D242H);               (* ADD.W    D2,D1                       *)
    CODE(04285H);               (* CLR.L    D5                          *)
    CODE(0D985H);               (* ADDX.L   D5,D4                       *)
    CODE(0D243H);               (* ADD.W    D3,D1                       *)
    CODE(0D985H);               (* ADDX.L   D5,D4                       *)
    CODE(04841H);               (* SWAP     D1                          *)
    CODE(04242H);               (* CLR.W    D2                          *)
    CODE(04243H);               (* CLR.W    D3                          *)
    CODE(04842H);               (* SWAP     D2                          *)
    CODE(04843H);               (* SWAP     D3                          *)
    CODE(0D483H);               (* ADD.L    D3,D2                       *)
    CODE(0D484H);               (* ADD.L    D4,D2                       *)
    CODE(02D41H);CODE(0000CH);  (* MOVE.L   D1,000C(A6)                 *)
    CODE(04CDFH);CODE(00008H);  (* MOVE.L   D2,0008(A6)                 *)
    CODE(04E5EH);               (* UNLK     A6                          *)
    CODE(04E75H);               (* RTS                                  *)
END SYSLongMult;

PROCEDURE SYSLongDivMod;
(*$P-*)
BEGIN
    CODE(04E56H);CODE(00000H);  (* LINK     A6,#0000                    *)
    CODE(048E7H);CODE(07800H);  (* MOVEM.L  D4-D1,-(A7)                 *)
    CODE(0222EH);CODE(0000CH);  (* MOVE.L   000C(A6),D1                 *)
    CODE(0242EH);CODE(00008H);  (* MOVE.L   0008(A6),D2                 *)
    CODE(0B4BCH);CODE(00000H);
                 CODE(0FFFFH);  (* CMP.L    #0000FFFF,D2                *)
    CODE(0621EH);               (* BHI      $1 {+30}                    *)
    CODE(04243H);               (* CLR.W    D3                          *)
    CODE(082C2H);               (* DIVU.W   D2,D1                       *)
    CODE(0680EH);               (* BVC      $2 {+14}                    *)
    CODE(03801H);               (* MOVE.W   D1,D4                       *)
    CODE(04241H);               (* CLR.W    D1                          *)
    CODE(04841H);               (* SWAP     D1                          *)
    CODE(082C2H);               (* DIVU.W   D2,D1                       *)
    CODE(03601H);               (* MOVE.W   D1,D3                       *)
    CODE(03204H);               (* MOVE.W   D4,D1                       *)
    CODE(082C2H);               (* DIVU.W   D2,D1                       *)
                        (* $2: *)
    CODE(04843H);               (* SWAP     D3                          *)
    CODE(03601H);               (* MOVE.W   D1,D3                       *)
    CODE(04241H);               (* CLR.W    D1                          *)
    CODE(04841H);               (* SWAP     D1                          *)
    CODE(0601EH);               (* BRA      $3 {+30}                    *)
                        (* $1: *)
    CODE(04283H);               (* CLR.L    D3                          *)
    CODE(03601H);               (* MOVE.W   D1,D3                       *)
    CODE(04843H);               (* SWAP     D3                          *)
    CODE(04241H);               (* CLR.W    D1                          *)
    CODE(04841H);               (* SWAP     D1                          *)
    CODE(0383CH);CODE(0000FH);  (* MOVE.W   #000F,D4                    *)
                        (* $5: *)
    CODE(0E38BH);               (* LSL.L    #1,D3                       *)
    CODE(0E391H);               (* ROXL.L   #1,D1                       *)
    CODE(0B282H);               (* CMP.L    D2,D1                       *)
    CODE(06504H);               (* BCS      $4 {+4}                     *)
    CODE(09282H);               (* SUB.L    D2,D1                       *)
    CODE(05243H);               (* ADDQ.W   #1,D3                       *)
                        (* $4: *)
    CODE(051CCH);CODE(0FFF2H);  (* DBF      D4,$5 {-14}                 *)
                        (* $3: *)
    CODE(02D43H);CODE(0000CH);  (* MOVE.L   D3,000C(A6)                 *)
    CODE(02D41H);CODE(00008H);  (* MOVE.L   D1,0008(A6)                 *)
    CODE(04CDFH);CODE(0001EH);  (* MOVEM.L  D1-D4,(A7)+                 *)
    CODE(04E5EH);               (* UNLK     A6                          *)
    CODE(04E75H);               (* RTS                                  *)
END SYSLongDivMod;

PROCEDURE SYSLongIntMult;
(*$P-*)
BEGIN
(* Procedure Code Proc # 10 *)
(* Entry Point 0000, number of bytes = 92 *)
(* 0000    LINK     A6,#0000              *) CODE(04E56H); CODE(00000H);
(* 0004    MOVEM.L  D7-D1,-(A7)           *) CODE(048E7H); CODE(07F00H);
(* 0008    MOVE.L   0008(A6),D1           *) CODE(0222EH); CODE(00008H);
(* 000C    MOVE.L   000C(A6),D2           *) CODE(0242EH); CODE(0000CH);
(* 0010    MOVE.L   D1,D3                 *) CODE(02601H);
(* 0012    MOVE.L   D1,D4                 *) CODE(02801H);
(* 0014    MOVE.L   D2,D5                 *) CODE(02A02H);
(* 0016    MOVE.L   D1,D6                 *) CODE(02C01H);
(* 0018    CLR.L    D7                    *) CODE(04287H);
(* 001A    SWAP     D4                    *) CODE(04844H);
(* 001C    SWAP     D5                    *) CODE(04845H);
(* 001E    MULU.W   D2,D1                 *) CODE(0C2C2H);
(* 0020    MULU.W   D4,D2                 *) CODE(0C4C4H);
(* 0022    MULU.W   D5,D3                 *) CODE(0C6C5H);
(* 0024    MULU.W   D5,D4                 *) CODE(0C8C5H);
(* 0026    SWAP     D1                    *) CODE(04841H);
(* 0028    ADD.W    D2,D1                 *) CODE(0D987H);
(* 002A    ADDX.L   D7,D4                 *) CODE(0D987H);
(* 002C    ADD.W    D3,D1                 *) CODE(0D243H);
(* 002E    ADDX.L   D7,D4                 *) CODE(0D987H);
(* 0030    SWAP     D1                    *) CODE(04841H);
(* 0032    CLR.W    D2                    *) CODE(04242H);
(* 0034    CLR.W    D3                    *) CODE(04243H);
(* 0036    SWAP     D2                    *) CODE(04842H);
(* 0038    SWAP     D3                    *) CODE(04843H);
(* 003A    ADD.L    D3,D2                 *) CODE(0D483H);
(* 003C    ADD.L    D4,D2                 *) CODE(0D484H);
(* 003E    SWAP     D5                    *) CODE(04845H);
(* 0040    TST.L    D6                    *) CODE(04A86H);
(* 0042    BPI      2    {0046}           *) CODE(06A02H);
(* 0044    SUB.L    D5,D2                 *) CODE(09485H);
(* 0046    TST.L    D5                    *) CODE(04A85H);
(* 0048    BPI      2    {004C}           *) CODE(06A02H);
(* 004A    SUB.L    D6,D2                 *) CODE(09486H);
(* 004C    MOVE.L   D1,000C(A6)           *) CODE(02D41H); CODE(0000CH);
(* 0050    MOVE.L   D2,0008(A6)           *) CODE(02D42H); CODE(00008H);
(* 0054    MOVEM.L  D1-D7,(A7)+           *) CODE(04CDFH); CODE(000FEH);
(* 0058    UNLK      A6                   *) CODE(04E5EH);
(* 005A    RTS                            *) CODE(04E75H);
END SYSLongIntMult;

PROCEDURE SYSProc11;
(*$P-*)
BEGIN
(*Procedure Code Proc # 11                *)
(* Entry Point  0000, number of bytes = 16*)
(* 0000    LINK     A6,#0000              *) CODE(04E56H); CODE(00000H);
(* 0004    MOVEQ.L  #0008,D0              *) CODE(07008H);
        DoHALT;
(* 000C    UNLK      A6                   *) CODE(04E5EH);
(* 000E    RTS                            *) CODE(04E75H);
END SYSProc11;

PROCEDURE SYSRealAdd;
(*$P-*)
BEGIN
(*  LEA -12(SP),SP      ;TMP        *)  CODE(04FEFH);CODE(0FFF4H);
(*  PEA 20(SP)          ;DEST       *)  CODE(0486FH);CODE(20);
(*  PEA 4(SP)           ;ADR(TMP)   *)  CODE(0486FH);CODE(4);
(*  MOVE    #FS2X,-(SP)             *)  CODE(03F3CH);CODE(FS2X);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  PEA 16(SP)          ;SRC        *)  CODE(0486FH);CODE(16);
(*  PEA 4(SP)           ;ADR(TMP)   *)  CODE(0486FH);CODE(4);
(*  MOVE    #FADDS,-(SP)                *)  CODE(03F3CH);CODE(FADDS);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  PEA (SP)            ;TMP        *)  CODE(04857H);
(*  PEA 24(SP)          ;DEST       *)  CODE(0486FH);CODE(24);
(*  MOVE    #FX2S,-(SP)             *)  CODE(03F3CH);CODE(FX2S);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  LEA 12(SP),SP                   *)  CODE(04FEFH);CODE(12);
(*  RTS                             *)  CODE(04E75H);
END SYSRealAdd;

PROCEDURE SYSRealSub;
(*$P-*)
BEGIN
(*  LEA -12(SP),SP      ;TMP        *)  CODE(04FEFH);CODE(0FFF4H);
(*  PEA 20(SP)          ;DEST       *)  CODE(0486FH);CODE(20);
(*  PEA 4(SP)           ;ADR(TMP)   *)  CODE(0486FH);CODE(4);
(*  MOVE    #FS2X,-(SP)             *)  CODE(03F3CH);CODE(FS2X);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  PEA 16(SP)          ;SRC        *)  CODE(0486FH);CODE(16);
(*  PEA 4(SP)           ;ADR(TMP)   *)  CODE(0486FH);CODE(4);
(*  MOVE    #FSUBS,-(SP)                *)  CODE(03F3CH);CODE(FSUBS);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  PEA (SP)            ;TMP        *)  CODE(04857H);
(*  PEA 24(SP)          ;DEST       *)  CODE(0486FH);CODE(24);
(*  MOVE    #FX2S,-(SP)             *)  CODE(03F3CH);CODE(FX2S);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  LEA 12(SP),SP                   *)  CODE(04FEFH);CODE(12);
(*  RTS                             *)  CODE(04E75H);
END SYSRealSub;

PROCEDURE SYSRealMult;
(*$P-*)
BEGIN
(*  LEA -12(SP),SP      ;TMP        *)  CODE(04FEFH);CODE(0FFF4H);
(*  PEA 20(SP)          ;DEST       *)  CODE(0486FH);CODE(20);
(*  PEA 4(SP)           ;ADR(TMP)   *)  CODE(0486FH);CODE(4);
(*  MOVE    #FS2X,-(SP)             *)  CODE(03F3CH);CODE(FS2X);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  PEA 16(SP)          ;SRC        *)  CODE(0486FH);CODE(16);
(*  PEA 4(SP)           ;ADR(TMP)   *)  CODE(0486FH);CODE(4);
(*  MOVE    #FMULS,-(SP)                *)  CODE(03F3CH);CODE(FMULS);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  PEA (SP)            ;TMP        *)  CODE(04857H);
(*  PEA 24(SP)          ;DEST       *)  CODE(0486FH);CODE(24);
(*  MOVE    #FX2S,-(SP)             *)  CODE(03F3CH);CODE(FX2S);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  LEA 12(SP),SP                   *)  CODE(04FEFH);CODE(12);
(*  RTS                             *)  CODE(04E75H);
END SYSRealMult;

PROCEDURE SYSRealDiv;
(*$P-*)
BEGIN
(*  DEST    :=  DEST / SRC          *)
(*  LEA -12(SP),SP      ;TMP        *)  CODE(04FEFH);CODE(0FFF4H);
(*  PEA 20(SP)          ;DEST       *)  CODE(0486FH);CODE(20);
(*  PEA 4(SP)           ;ADR(TMP)   *)  CODE(0486FH);CODE(4);
(*  MOVE    #FS2X,-(SP)             *)  CODE(03F3CH);CODE(FS2X);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  PEA 16(SP)          ;SRC        *)  CODE(0486FH);CODE(16);
(*  PEA 4(SP)           ;ADR(TMP)   *)  CODE(0486FH);CODE(4);
(*  MOVE    #FDIVS,-(SP)                *)  CODE(03F3CH);CODE(FDIVS);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  PEA (SP)            ;TMP        *)  CODE(04857H);
(*  PEA 24(SP)          ;DEST       *)  CODE(0486FH);CODE(24);
(*  MOVE    #FX2S                       *)  CODE(03F3CH);CODE(FX2S);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  LEA 12(SP),SP                   *)  CODE(04FEFH);CODE(12);
(*  RTS                             *)  CODE(04E75H);
END SYSRealDiv;

PROCEDURE SYSRealCMP;
(*Procedure Code Proc # 16                   *)
(* Entry Point  0000, number of bytes = 66   *)
(*$P-*)
BEGIN
(*  LEA -12(SP),SP      ;TMP        *)  CODE(04FEFH);CODE(0FFF4H);
(*  PEA 20(SP)          ;SRC        *)  CODE(0486FH);CODE(20);
(*  PEA 4(SP)           ;ADR(TMP)   *)  CODE(0486FH);CODE(4);
(*  MOVE    #FS2X,-(SP)             *)  CODE(03F3CH);CODE(FS2X);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  PEA 16(SP)          ;DEST       *)  CODE(0486FH);CODE(16);
(*  PEA 4(SP)           ;ADR(TMP)   *)  CODE(0486FH);CODE(4);
(*  MOVE    #FCMPS,-(SP)                *)  CODE(03F3CH);CODE(FCMPS);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  LEA 12(SP),SP                   *)  CODE(04FEFH);CODE(12);
(*  RTS                             *)  CODE(04E75H);
END SYSRealCMP;

PROCEDURE SYSRealTST;
(*$P-*)
BEGIN
(*  CLR.L   -(SP)                       *)  CODE(042A7H);
(*  LEA -12(SP),SP      ;TMP        *)  CODE(04FEFH);CODE(0FFF4H);
(*  PEA 12(SP)          ;SRC        *)  CODE(0486FH);CODE(12);
(*  PEA 4(SP)           ;ADR(TMP)   *)  CODE(0486FH);CODE(4);
(*  MOVE    #FS2X,-(SP)             *)  CODE(03F3CH);CODE(FS2X);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  PEA 20(SP)          ;DEST       *)  CODE(0486FH);CODE(20);
(*  PEA 4(SP)           ;ADR(TMP)   *)  CODE(0486FH);CODE(4);
(*  MOVE    #FCMPS,-(SP)        *)  CODE(03F3CH);CODE(FCMPS);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  LEA 16(SP),SP                   *)  CODE(04FEFH);CODE(16);
(*  RTS                             *)  CODE(04E75H);
END SYSRealTST;

PROCEDURE SYSRealFLOAT;
(*$P-*)
BEGIN
(*  LEA -12(SP),SP      ;TMP        *)  CODE(04FEFH);CODE(0FFF4H);
(*  PEA 16(SP)          ;SRC        *)  CODE(0486FH);CODE(16);
(*  PEA 4(SP)           ;ADR(TMP)   *)  CODE(0486FH);CODE(4);
(*  MOVE    #FL2X,-(SP)             *)  CODE(03F3CH);CODE(FL2X);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  PEA (SP)            ;TMP        *)  CODE(04857H);
(*  PEA 20(SP)          ;RETURN *)  CODE(0486FH);CODE(20);
(*  MOVE    #FX2S                       *)  CODE(03F3CH);CODE(FX2S);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  LEA 12(SP),SP                   *)  CODE(04FEFH);CODE(12);
(*  RTS                             *)  CODE(04E75H);
END SYSRealFLOAT;

PROCEDURE SYSRealTRUNC;
(*$P-*)
BEGIN
(*  LEA -12(SP),SP      ;TMP        *)  CODE(04FEFH);CODE(0FFF4H);
(*  PEA 16(SP)          ;SRC        *)  CODE(0486FH);CODE(16);
(*  PEA 4(SP)           ;ADR(TMP)   *)  CODE(0486FH);CODE(4);
(*  MOVE    #FS2X,-(SP)             *)  CODE(03F3CH);CODE(FS2X);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  PEA (SP)            ;TMP        *)  CODE(04857H);
(*  MOVE    #FTINTX,-(SP)               *)  CODE(03F3CH);CODE(FTINTX);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  PEA (SP)            ;TMP        *)  CODE(04857H);
(*  PEA 20(SP)          ;RETURN *)  CODE(0486FH);CODE(20);
(*  MOVE    #FX2L,-(SP)             *)  CODE(03F3CH);CODE(FX2L);
(*  _FP68K  ; A9EB                  *)  CODE(0A9EBH);
(*  LEA 12(SP),SP                   *)  CODE(04FEFH);CODE(12);
(*  RTS                             *)  CODE(04E75H);
END SYSRealTRUNC;
(*$P-*)
END SYSTEMX.
!Funky!Stuff!
echo x - ScrapManager.MOD
cat >ScrapManager.MOD <<'!Funky!Stuff!'
IMPLEMENTATION MODULE ScrapManager;

FROM SYSTEM IMPORT ADDRESS,CODE,ADR;
FROM MacSYSTEM IMPORT LONGINT,Handle;
FROM QuickDraw IMPORT Str255;
FROM ResourceManager IMPORT ResType;

CONST
    GetRet      = 0285FH;   (* MOVEA (A7)+,A4       *)
    Return      = 04ED4H;   (* JMP  A4              *)
    SaveA7      = 0264FH;   (* MOVEA A7,A3      *)
    RestoreA7   = 02E4BH;   (* MOVEA A3,A7      *)


PROCEDURE InfoScrap():PScrapStuff;
(*$P+*)(*$S-*)
BEGIN
  RETURN(PScrapStuff(0960H))
END InfoScrap;

PROCEDURE UnloadScrap():LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FAH);
  CODE(RestoreA7);
  CODE(Return);
END UnloadScrap;

PROCEDURE LoadScrap():LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FBH);
  CODE(RestoreA7);
  CODE(Return);
END LoadScrap;

PROCEDURE xGetScrap(hDest:Handle;theType:LONGINT;VAR offset:LONGINT):LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FDH);
  CODE(RestoreA7);
  CODE(Return);
END xGetScrap;

TYPE Converter = RECORD CASE INTEGER OF
    0:  r:ResType;
    | 1:  l:LONGINT
    END
  END;
  
PROCEDURE GetScrap(hDest:Handle;theType:ResType;VAR offset:LONGINT):LONGINT;
(*$P+*)(*$S-*)
VAR
  c:Converter;
BEGIN
  c.r := theType;
  RETURN(xGetScrap(hDest,c.l,offset));
END GetScrap;

PROCEDURE ZeroScrap():LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FCH);
  CODE(RestoreA7);
  CODE(Return);
END ZeroScrap;

PROCEDURE xPutScrap(length:LONGINT;theType:LONGINT;source:ADDRESS):LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FEH);
  CODE(RestoreA7);
  CODE(Return);
END xPutScrap;
PROCEDURE PutScrap(length:LONGINT;theType:ResType;source:ADDRESS):LONGINT;
(*$P+*)(*$S-*)
VAR
  c:Converter;
BEGIN
  c.r := theType;
  RETURN(xPutScrap(length,c.l,source))
END PutScrap

END ScrapManager.
!Funky!Stuff!
echo x - Storage.MOD
cat >Storage.MOD <<'!Funky!Stuff!'
IMPLEMENTATION MODULE Storage;
(*$S-*)
(*  Because the stack checking is turned off in the SYSTEMX.MOD file it is
 *  Turned off here also.
 *)
(*  Created for standalone MacIntosh Code By Bob Campbell 10.02.86 
 * The Implementation now used the A-Line calls to the memory manager
 *  All of the storage allocated is set to zero.  The Calls CreateHeap,
 *  and DestroyHeap have been removed.
 *)
FROM SYSTEM IMPORT ADDRESS,CODE,ADR,REGISTER,SETREG;
CONST
    GetRet  = 0285FH;       (* MOVEA (A7)+,A4       *)
    Return  = 04ED4H;       (* JMP  A4              *)
    SaveA7      = 0264FH;   (* MOVEA A7,A3      *)
    RestoreA7       = 02E4BH;   (* MOVEA A3,A7      *)

    noErr       =   0;

PROCEDURE ALLOCATE (VAR addr : ADDRESS; amount : CARDINAL);
 (* allocates the requested amount of memory (in bytes) and returns the     *)
 (* starting address . Return NIL if the amount is not available                *)
 (* Note that the memory is cleared by the trap call                            *)
BEGIN
    SETREG(0,amount);
    CODE(0A31EH);
    IF (REGISTER(0) # noErr) THEN
        addr := NIL
    ELSE
        addr := REGISTER(8)
    END
END ALLOCATE;


PROCEDURE DEALLOCATE (VAR addr : ADDRESS; amount : CARDINAL);
 (* deallocates the given amount of memory (in bytes).              *)
(*$S-*)
BEGIN
    SETREG(8,addr);
    CODE(0A01FH);
END DEALLOCATE;

PROCEDURE Available (amount : CARDINAL) : BOOLEAN;
 (* returns TRUE if an ALLOCATE of the specified amount (in bytes)  *)
 (* of memory would be possible                                         *)
BEGIN
    SETREG(0,amount);
    CODE(0A040H);
    RETURN(INTEGER(REGISTER(0)) = 0)
END Available;

END Storage.

!Funky!Stuff!
echo x - Streams.MOD
cat >Streams.MOD <<'!Funky!Stuff!'
IMPLEMENTATION MODULE Streams;

(*
 * Modified from the  book "PROGRAMMING IN
 * MODULA-2" by Miklaus Wirth Edited by
 * David Gries pages 103 and 104.
 *)
 
FROM SYSTEM IMPORT ADR,REGISTER,SETREG,CODE,ADDRESS,WORD;
FROM MacSYSTEM IMPORT LONGINT,OSErr,noErr;
FROM Storage IMPORT ALLOCATE,DEALLOCATE;
FROM FileTypes IMPORT 
    OSType,ParamBlkPtr,ParamBlockRec,ParamBlkType,FInfo,
    fsAtMark,fsFromStart,fsFromMark,fsCurPerm,
    fsRdPerm,fsWrPerm,fsRdWrPerm,
    badMDBErr,bdNamErr,dirFulErr,dskFulErr,dupFNErr,eofErr,extFSErr,
    fBsyErr,fLckdErr,fnfErr,fnOpnErr,fsRnErr,ioErr,mFulErr,nsDrvErr,
    noMacDskErr,nsvErr,opWrErr,paramErr,permErr,posErr,rfNumErr,
    tmfoErr,volOffLinErr,volOnLinErr,vLckdErr,wrPermErr,wPrErr;
FROM PascalStrings IMPORT MakeModulaString,MakePascalString;

CONST
    OpenTrap      =   0A000H;
    CloseTrap     =   0A001H;
    ReadTrap      =  0A002H;
    WriteTrap         =   0A003H;
    CreateTrap        =  0A008H;
    DeleteTrap        =   0A009H;
    GetFileInfoTrap    =  0A00CH;
    SetFileInfoTrap    =  0A00DH;

    GetEOFTrap        =  0A011H;
    SetEOFTrap        =  0A012H;
    GetFPosTrap       =  0A018H;
    SetFPosTrap       =  0A044H;

TYPE
(* Changing Information About Files *)
PROCEDURE GetFInfo(VAR File:ARRAY OF CHAR;vRef:INTEGER;VAR fndr:FInfo);
VAR PB:ParamBlockRec;
    Str:ARRAY[0..255] OF CHAR;
BEGIN
    PB.ioCompletion := ADDRESS(0);
    MakePascalString(File,Str);
    PB.ioNamePtr := ADR(Str);
    PB.ioVRefNum := vRef;
    PB.ioVersNum := 0C;
    PB.ioFDirIndex := 0;
    SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
    CODE(GetFileInfoTrap);
    IF (PB.ioResult = noErr) THEN
        fndr := PB.ioFlFndrInfo
    END;
END GetFInfo;

PROCEDURE SetFInfo(VAR File:ARRAY OF CHAR;vRef:INTEGER;fndrInfo:FInfo);
VAR
    PB:ParamBlockRec;
    Str:ARRAY[0..255] OF CHAR;
BEGIN
    PB.ioCompletion := ADDRESS(0);
    MakePascalString(File,Str);
    PB.ioNamePtr := ADR(Str);
    PB.ioVRefNum := vRef;
    PB.ioVersNum := 0C;
    PB.ioFDirIndex := 0;
    SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
    CODE(GetFileInfoTrap);   (* get create/modification times *)
    PB.ioFlFndrInfo := fndrInfo;
    SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
    CODE(SetFileInfoTrap);
END SetFInfo;

PROCEDURE Open(VAR File:STREAM; VAR Name:ARRAY OF CHAR;vRef:INTEGER;
    Mode:OpenMode);
VAR
    Str: POINTER TO ARRAY[0..255] OF CHAR;
BEGIN
    NEW(File);
    IF (File = NIL) THEN RETURN END;
    WITH File^ DO
        IsOpen :=  FALSE;
        EOSPos    :=  0;
        CurrentPos := 0;
        ALLOCATE(Str,HIGH(Name) + 2);
        IF (Str = NIL) THEN
            DISPOSE(File);
            File := NIL;
            RETURN
        END;
        ALLOCATE(Buffer,524);
        IF (Buffer = NIL) THEN
            DISPOSE(File);
            DEALLOCATE(Str,HIGH(Name) + 2);
            File := NIL;
            RETURN
        END;
        PB.ioCompletion := ADDRESS(0);
        MakePascalString(Name,Str^);
        PB.ioNamePtr := ADDRESS(Str);
        PB.ioVRefNum := vRef;
        PB.ioVersNum := 0C;
        CASE Mode OF
        ReadOnly:
            PB.ioPermssn := fsRdPerm
        | WriteOnly:
            PB.ioPermssn := fsWrPerm
        | ReadWrite:
            PB.ioPermssn := fsRdWrPerm
        END;
        PB.ioMisc := Buffer;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(OpenTrap);
        FileNum := PB.ioRefNum;
        IF (PB.ioResult = opWrErr) THEN
            DEALLOCATE(Buffer,524);    (* File is already open *)
            Buffer := NIL;         (* using other buffer *)
            IF Mode = WriteOnly THEN
            SetEOF(File,0)
            END;
            GetEOF(File,EOSPos);
            CurrentPos := 0;
        ELSIF NOT(PB.ioResult = noErr) THEN
            DEALLOCATE(PB.ioMisc,524);
            DEALLOCATE(Str,HIGH(Name) + 2);
            DISPOSE(File);
            File := NIL;
        ELSE 
            IsOpen := TRUE;
            IF Mode = WriteOnly THEN
                SetEOF(File,0)
            END;
            GetEOF(File,EOSPos);
            CurrentPos := 0;
        END;
    END (* WITH *)
END Open;

PROCEDURE Close(File:STREAM);
BEGIN
    WITH File^ DO
        PB.ioCompletion := ADDRESS(0);
        PB.ioRefNum := FileNum;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(CloseTrap);
        DEALLOCATE(PB.ioNamePtr,ORD(PB.ioNamePtr^[0])+1);
        IF (Buffer # NIL) THEN
            DEALLOCATE(Buffer,524);
        END;
        IsOpen := FALSE;
    END
END Close;

PROCEDURE Create(VAR Name:ARRAY OF CHAR;vRef:INTEGER;
    creator,type:OSType);
VAR PB:ParamBlockRec;
    Str:ARRAY[0..255] OF CHAR;
    f:FInfo;
    ret : OSErr;
BEGIN
    PB.ioCompletion := ADDRESS(0);
    MakePascalString(Name,Str);
    PB.ioNamePtr := ADR(Str);
    PB.ioVRefNum := vRef;
    PB.ioFVersNum := 0C;
    SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
    CODE(CreateTrap);
    GetFInfo(Name,vRef,f);
    f.fdType := type;
    f.fdCreator := creator;
    SetFInfo(Name,vRef,f);
END Create;

PROCEDURE WriteWord(File:STREAM;w:WORD);
BEGIN
    WITH File^ DO
        PB.ioReqCount := 2;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := ADR(w);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(WriteTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            EOSPos := 0
        ELSE
            GetEOF(File,EOSPos)
        END
    END
END WriteWord;

PROCEDURE WriteChar(File:STREAM;c:CHAR);
BEGIN
    WITH File^ DO
        PB.ioReqCount := 1;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := ADR(c);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(WriteTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            EOSPos := 0
        ELSE
            GetEOF(File,EOSPos)
        END
    END
END WriteChar;

PROCEDURE WriteBuffer(File:STREAM;b:ADDRESS;len:LONGINT):LONGINT;
BEGIN
    WITH File^ DO
        PB.ioReqCount := len;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := b;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(WriteTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            EOSPos := 0;
            RETURN(0)
        ELSE
            GetEOF(File,EOSPos)
        END;
        RETURN(PB.ioActCount);
    END
END WriteBuffer;
 
PROCEDURE ReadWord(File:STREAM;VAR w:WORD);
BEGIN
    WITH File^ DO
        PB.ioReqCount := 2;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := ADR(w);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(ReadTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            w := WORD(0);
            EOSPos := 0
        END
    END
END ReadWord;

PROCEDURE ReadChar(File:STREAM;VAR c:CHAR);
BEGIN
    WITH File^ DO
        PB.ioReqCount := 1;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := ADR(c);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(ReadTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            c := 0C;
            EOSPos := 0
        END
    END
END ReadChar;

PROCEDURE ReadBuffer(File:STREAM;buff:ADDRESS;count:LONGINT):LONGINT;
VAR
BEGIN
    WITH File^ DO
        IF (count = 0) THEN RETURN(0) END;
        PB.ioCompletion := ADDRESS(0);
        PB.ioRefNum := FileNum;
        PB.ioReqCount := count;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := buff;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(ReadTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            EOSPos := 0;
            RETURN(0)
        ELSE
            RETURN(PB.ioActCount)
        END
    END
END ReadBuffer;

PROCEDURE EOS(s:STREAM):BOOLEAN;
BEGIN
    RETURN(s^.CurrentPos >= s^.EOSPos);
END EOS;

PROCEDURE Reset(s:STREAM);    
BEGIN
    SetPos(s,0);
END Reset;

PROCEDURE GetPos(File:STREAM;VAR FilePos:LONGINT);
BEGIN
    WITH File^ DO
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(GetFPosTrap);
        FilePos := PB.ioPosOffset;
    END
END GetPos;

PROCEDURE SetPos(File:STREAM;posOff:LONGINT);
BEGIN
    WITH File^ DO
        PB.ioPosMode := fsFromStart;
        PB.ioPosOffset := posOff;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(SetFPosTrap);
        CurrentPos := PB.ioPosOffset;
    END
END SetPos;

PROCEDURE GetEOF(File:STREAM;VAR logEOF:LONGINT);
BEGIN
    WITH File^ DO
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(GetEOFTrap);
        logEOF := PB.ioMisc;
    END
END GetEOF;

PROCEDURE SetEOF(File:STREAM;logEOF:LONGINT);
BEGIN
    WITH File^ DO
        PB.ioMisc := ADDRESS(logEOF);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(SetEOFTrap);
    END
END SetEOF;  

END Streams.
!Funky!Stuff!
# The rest of this file is a shell script which will extract:
# SYSTEMX.MOD ScrapManager.MOD Storage.MOD Streams.MOD
echo x - SYSTEMX.MOD
cat >SYSTEMX.MOD <<'!Funky!Stuff!'
IMPLEMENTATION MODULE SYSTEMX;
 
FROM SYSTEM IMPORT ADDRESS,CODE,SETREG,REGISTER,ADR,PROCESS;

CONST
	FADDS	=	01000H;
	FSUBS	=	01002H;
	FMULS	=	01004H;
	FDIVS	=	01006H;
	FCMPS	=	01008H;
	
	FTINTX	=	00016H;
	
	FX2S	=	01010H;
	FS2X	=	0100EH;
	
	FX2L	=	02810H;
	FL2X	=	0280EH;
	
(*$P-*)
PROCEDURE DoCASE;
BEGIN
	CODE(0205FH);					(* MOVEA.L	(A7)+,A0				*)
	CODE(09090H);					(* SUB.L	(A0),DO					*)
	CODE(0B0A8H);CODE(00004H);	(* CMP.L	0004(A0),D0				*)
	CODE(0620CH);					(* BHI		$1 {+12}					*)
	CODE(0E380H);					(* ASL.L	#1,D0						*)
	CODE(0D0A8H);CODE(00008H);	(* ADD.L	0008(A0),D0				*)
	CODE(0D0F0H);CODE(00800H);	(* ADDA.L	00(A0,DO.W),A0			*)
	CODE(04ED0H);					(* JMP		(A0)					*)
							(* $1 *)
	CODE(0D1E8H);CODE(00008H);	(* ADDA.L	0008(A0),A0				*)
	CODE(05988H);					(* SUBQ.L	#4,A0						*)
	CODE(04ED0H);					(* JMP		(A0)					*)
END DoCASE;

PROCEDURE DoHALT;
(*$P-*)
BEGIN
	CODE(0A9FFH); (* CALL DEBUGGER *)
	CODE(04E75H);
END DoHALT;

PROCEDURE CheckStack;
(*$P-*)
BEGIN
	(* STUBED OUT FOR NOW! *)
	CODE(04E75H);				(* RTS		*)
END CheckStack;

PROCEDURE SYSProc20;
(*$P-*)
BEGIN
(* 0000    MOVEQ.L  #0007,D0              *)	CODE(07007H);
	DoHALT;
END SYSProc20;

PROCEDURE NEWPROCESS;
(*$P-*)
BEGIN
	CODE(0700AH);				(* MOVEQ.L	#000A,D0					*)
	DoHALT;
END NEWPROCESS;

PROCEDURE TRANSFER;
(*$P-*)
BEGIN
	CODE(0700BH);				(* MOVEQ.L	#000B,DO					*)
	DoHALT;
END TRANSFER;

PROCEDURE SYSProc21;
(*$P-*)
BEGIN
(*
 *  Procedure Code Proc # 21
 *   Entry Point  0000, number of bytes = 40
 *)
(* 0000    MOVE.W   #2700,SR              *) CODE(046FCH);CODE(02700);
(* 0004    MOVE.L   A6,-(A7)              *) CODE(02F0EH);
(* 0006    MOVE.L   USP,A6                *) CODE(04E6EH);
(* 0008    MOVE.L   A5,-(A6)              *) CODE(02D0DH);
(* 000A    LEA      A6,FFCC(A6)           *) CODE(04DEEH); CODE(0FFCCH);
(* 000E    MOVE.L   (A7)+,-(A6)           *) CODE(02D1FH);
(* 0010    MOVE.W   (A7)+,-(A6)           *) CODE(03D1FH);
(* 0012    MOVE.L   (A7)+,-(A6)           *) CODE(02D1FH);
(* 0014    MOVE.L   A6,(A0)               *) CODE(0208EH);
(* 0016    MOVEA.L  (A1),A6               *) CODE(02C51H);
(* 0018    MOVE.L   (A6)+,-(A7)           *) CODE(02F1EH);
(* 001A    MOVE.W   (A6)+,-(A7)           *) CODE(03F1EH);
(* 001C    MOVE.L   (A6)+,-(A7)           *) CODE(02F1EH);
(* 001E    MOVEM.L  D0-A5,(A6)+           *) CODE(04CDEH); CODE(03FFFH);
(* 0022    MOVE.L   A6,USP                *) CODE(04E66H);
(* 0024    MOVEA.L  (A7)+,A6              *) CODE(02C5FH);
(* 0026    RTE                            *) CODE(04E73H);
END SYSProc21;

PROCEDURE IOTRANSFER(p1,p2:PROCESS; via:ADDRESS);
(*$P-*)
BEGIN
	CODE(0700CH);				(* MOVEQ.L	#000C,DO					*)
	DoHALT;
END IOTRANSFER;

PROCEDURE SYSProc7;
(* IF D0 = 2 THEN LISTEN ELSIF D0 = 3 THEN SYSRESET END *)
(*$P-*)
BEGIN
	CODE(0700DH);
	DoHALT;
END SYSProc7;

PROCEDURE SYSLongMult;
(*$P-*)
BEGIN
	CODE(04E56H);CODE(00000H);	(* LINK		A6,#0000					*)
	CODE(048E7H);CODE(07C00H);	(* MOVEM.L	D5-D1,-(A7)					*)
	CODE(0222EH);CODE(00008H);	(* MOVE.L	0008(A6),D1					*)
	CODE(0242EH);CODE(0000CH);	(* MOVE.L	000C(A6),D2					*)
	CODE(02601H);				(* MOVE.L	D1,D3						*)
	CODE(02801H);				(* MOVE.L	D1,D4						*)
	CODE(02A02H);				(* MOVE.L	D2,D5						*)
	CODE(04844H);				(* SWAP		D4							*)
	CODE(04845H);				(* SWAP		D5							*)
	CODE(0C2C2H);				(* MULU.W	D2,D1						*)
	CODE(0C4C4H);				(* MULU.W	D4,D2						*)
	CODE(0C6C5H);				(* MULU.W	D5,D3						*)
	CODE(0C8C5H);				(* MULU.W	D5,D4						*)
	CODE(04841H);				(* SWAP		D1							*)
	CODE(0D242H);				(* ADD.W	D2,D1						*)
	CODE(04285H);				(* CLR.L	D5							*)
	CODE(0D985H);				(* ADDX.L	D5,D4						*)
	CODE(0D243H);				(* ADD.W	D3,D1						*)
	CODE(0D985H);				(* ADDX.L	D5,D4						*)
	CODE(04841H);				(* SWAP		D1							*)
	CODE(04242H);				(* CLR.W	D2							*)
	CODE(04243H);				(* CLR.W	D3							*)
	CODE(04842H);				(* SWAP		D2							*)
	CODE(04843H);				(* SWAP		D3							*)
	CODE(0D483H);				(* ADD.L	D3,D2						*)
	CODE(0D484H);				(* ADD.L	D4,D2						*)
	CODE(02D41H);CODE(0000CH);	(* MOVE.L	D1,000C(A6)					*)
	CODE(04CDFH);CODE(00008H);	(* MOVE.L	D2,0008(A6)					*)
	CODE(04E5EH);				(* UNLK		A6							*)
	CODE(04E75H);				(* RTS									*)
END SYSLongMult;

PROCEDURE SYSLongDivMod;
(*$P-*)
BEGIN
	CODE(04E56H);CODE(00000H);	(* LINK		A6,#0000					*)
	CODE(048E7H);CODE(07800H);	(* MOVEM.L	D4-D1,-(A7)					*)
	CODE(0222EH);CODE(0000CH);	(* MOVE.L	000C(A6),D1					*)
	CODE(0242EH);CODE(00008H);	(* MOVE.L	0008(A6),D2					*)
	CODE(0B4BCH);CODE(00000H);
				 CODE(0FFFFH);	(* CMP.L	#0000FFFF,D2				*)
	CODE(0621EH);				(* BHI		$1 {+30}					*)
	CODE(04243H);				(* CLR.W	D3							*)
	CODE(082C2H);				(* DIVU.W	D2,D1						*)
	CODE(0680EH);				(* BVC		$2 {+14}					*)
	CODE(03801H);				(* MOVE.W	D1,D4						*)
	CODE(04241H);				(* CLR.W	D1							*)
	CODE(04841H);				(* SWAP		D1							*)
	CODE(082C2H);				(* DIVU.W	D2,D1						*)
	CODE(03601H);				(* MOVE.W	D1,D3						*)
	CODE(03204H);				(* MOVE.W	D4,D1						*)
	CODE(082C2H);				(* DIVU.W	D2,D1						*)
						(* $2: *)
	CODE(04843H);				(* SWAP		D3							*)
	CODE(03601H);				(* MOVE.W	D1,D3						*)
	CODE(04241H);				(* CLR.W	D1							*)
	CODE(04841H);				(* SWAP		D1							*)
	CODE(0601EH);				(* BRA		$3 {+30}					*)
						(* $1: *)
	CODE(04283H);				(* CLR.L	D3							*)
	CODE(03601H);				(* MOVE.W	D1,D3						*)
	CODE(04843H);				(* SWAP		D3							*)
	CODE(04241H);				(* CLR.W	D1							*)
	CODE(04841H);				(* SWAP		D1							*)
	CODE(0383CH);CODE(0000FH);	(* MOVE.W	#000F,D4					*)
						(* $5: *)
	CODE(0E38BH);				(* LSL.L	#1,D3						*)
	CODE(0E391H);				(* ROXL.L	#1,D1						*)
	CODE(0B282H);				(* CMP.L	D2,D1						*)
	CODE(06504H);				(* BCS		$4 {+4}						*)
	CODE(09282H);				(* SUB.L	D2,D1						*)
	CODE(05243H);				(* ADDQ.W	#1,D3						*)
						(* $4: *)
	CODE(051CCH);CODE(0FFF2H);	(* DBF		D4,$5 {-14}					*)
						(* $3: *)
	CODE(02D43H);CODE(0000CH);	(* MOVE.L	D3,000C(A6)					*)
	CODE(02D41H);CODE(00008H);	(* MOVE.L	D1,0008(A6)					*)
	CODE(04CDFH);CODE(0001EH);	(* MOVEM.L	D1-D4,(A7)+					*)
	CODE(04E5EH);				(* UNLK		A6							*)
	CODE(04E75H);				(* RTS									*)
END SYSLongDivMod;

PROCEDURE SYSLongIntMult;
(*$P-*)
BEGIN
(* Procedure Code Proc # 10 *)
(* Entry Point 0000, number of bytes = 92 *)
(* 0000    LINK     A6,#0000              *) CODE(04E56H); CODE(00000H);
(* 0004    MOVEM.L  D7-D1,-(A7)           *) CODE(048E7H); CODE(07F00H);
(* 0008    MOVE.L   0008(A6),D1           *) CODE(0222EH); CODE(00008H);
(* 000C    MOVE.L   000C(A6),D2           *) CODE(0242EH); CODE(0000CH);
(* 0010    MOVE.L   D1,D3                 *) CODE(02601H);
(* 0012    MOVE.L   D1,D4                 *) CODE(02801H);
(* 0014    MOVE.L   D2,D5                 *) CODE(02A02H);
(* 0016    MOVE.L   D1,D6                 *) CODE(02C01H);
(* 0018    CLR.L    D7                    *) CODE(04287H);
(* 001A    SWAP     D4                    *) CODE(04844H);
(* 001C    SWAP     D5                    *) CODE(04845H);
(* 001E    MULU.W   D2,D1                 *) CODE(0C2C2H);
(* 0020    MULU.W   D4,D2                 *) CODE(0C4C4H);
(* 0022    MULU.W   D5,D3                 *) CODE(0C6C5H);
(* 0024    MULU.W   D5,D4                 *) CODE(0C8C5H);
(* 0026    SWAP     D1                    *) CODE(04841H);
(* 0028    ADD.W    D2,D1                 *) CODE(0D987H);
(* 002A    ADDX.L   D7,D4                 *) CODE(0D987H);
(* 002C    ADD.W    D3,D1                 *) CODE(0D243H);
(* 002E    ADDX.L   D7,D4                 *) CODE(0D987H);
(* 0030    SWAP     D1                    *) CODE(04841H);
(* 0032    CLR.W    D2                    *) CODE(04242H);
(* 0034    CLR.W    D3                    *) CODE(04243H);
(* 0036    SWAP     D2                    *) CODE(04842H);
(* 0038    SWAP     D3                    *) CODE(04843H);
(* 003A    ADD.L    D3,D2                 *) CODE(0D483H);
(* 003C    ADD.L    D4,D2                 *) CODE(0D484H);
(* 003E    SWAP     D5                    *) CODE(04845H);
(* 0040    TST.L    D6                    *) CODE(04A86H);
(* 0042    BPI      2    {0046}           *) CODE(06A02H);
(* 0044    SUB.L    D5,D2                 *) CODE(09485H);
(* 0046    TST.L    D5                    *) CODE(04A85H);
(* 0048    BPI      2    {004C}           *) CODE(06A02H);
(* 004A    SUB.L    D6,D2                 *) CODE(09486H);
(* 004C    MOVE.L   D1,000C(A6)           *) CODE(02D41H); CODE(0000CH);
(* 0050    MOVE.L   D2,0008(A6)           *) CODE(02D42H); CODE(00008H);
(* 0054    MOVEM.L  D1-D7,(A7)+           *) CODE(04CDFH); CODE(000FEH);
(* 0058    UNLK      A6                   *) CODE(04E5EH);
(* 005A    RTS                            *) CODE(04E75H);
END SYSLongIntMult;

PROCEDURE SYSProc11;
(*$P-*)
BEGIN
(*Procedure Code Proc # 11                *)
(* Entry Point  0000, number of bytes = 16*)
(* 0000    LINK     A6,#0000              *) CODE(04E56H); CODE(00000H);
(* 0004    MOVEQ.L  #0008,D0              *) CODE(07008H);
		DoHALT;
(* 000C    UNLK      A6                   *) CODE(04E5EH);
(* 000E    RTS                            *) CODE(04E75H);
END SYSProc11;

PROCEDURE SYSRealAdd;
(*$P-*)
BEGIN
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	20(SP)			;DEST		*)	CODE(0486FH);CODE(20);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FS2X,-(SP)				*)	CODE(03F3CH);CODE(FS2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	16(SP)			;SRC		*)	CODE(0486FH);CODE(16);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FADDS,-(SP)				*)	CODE(03F3CH);CODE(FADDS);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	(SP)			;TMP		*)	CODE(04857H);
(*	PEA	24(SP)			;DEST		*)	CODE(0486FH);CODE(24);
(*	MOVE	#FX2S,-(SP)				*)	CODE(03F3CH);CODE(FX2S);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	12(SP),SP					*)	CODE(04FEFH);CODE(12);
(*	RTS								*)	CODE(04E75H);
END SYSRealAdd;

PROCEDURE SYSRealSub;
(*$P-*)
BEGIN
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	20(SP)			;DEST		*)	CODE(0486FH);CODE(20);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FS2X,-(SP)				*)	CODE(03F3CH);CODE(FS2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	16(SP)			;SRC		*)	CODE(0486FH);CODE(16);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FSUBS,-(SP)				*)	CODE(03F3CH);CODE(FSUBS);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	(SP)			;TMP		*)	CODE(04857H);
(*	PEA	24(SP)			;DEST		*)	CODE(0486FH);CODE(24);
(*	MOVE	#FX2S,-(SP)				*)	CODE(03F3CH);CODE(FX2S);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	12(SP),SP					*)	CODE(04FEFH);CODE(12);
(*	RTS								*)	CODE(04E75H);
END SYSRealSub;

PROCEDURE SYSRealMult;
(*$P-*)
BEGIN
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	20(SP)			;DEST		*)	CODE(0486FH);CODE(20);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FS2X,-(SP)				*)	CODE(03F3CH);CODE(FS2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	16(SP)			;SRC		*)	CODE(0486FH);CODE(16);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FMULS,-(SP)				*)	CODE(03F3CH);CODE(FMULS);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	(SP)			;TMP		*)	CODE(04857H);
(*	PEA	24(SP)			;DEST		*)	CODE(0486FH);CODE(24);
(*	MOVE	#FX2S,-(SP)				*)	CODE(03F3CH);CODE(FX2S);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	12(SP),SP					*)	CODE(04FEFH);CODE(12);
(*	RTS								*)	CODE(04E75H);
END SYSRealMult;

PROCEDURE SYSRealDiv;
(*$P-*)
BEGIN
(*	DEST	:=	DEST / SRC			*)
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	20(SP)			;DEST		*)	CODE(0486FH);CODE(20);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FS2X,-(SP)				*)	CODE(03F3CH);CODE(FS2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	16(SP)			;SRC		*)	CODE(0486FH);CODE(16);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FDIVS,-(SP)				*)	CODE(03F3CH);CODE(FDIVS);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	(SP)			;TMP		*)	CODE(04857H);
(*	PEA	24(SP)			;DEST		*)	CODE(0486FH);CODE(24);
(*	MOVE	#FX2S						*)	CODE(03F3CH);CODE(FX2S);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	12(SP),SP					*)	CODE(04FEFH);CODE(12);
(*	RTS								*)	CODE(04E75H);
END SYSRealDiv;

PROCEDURE SYSRealCMP;
(*Procedure Code Proc # 16                   *)
(* Entry Point  0000, number of bytes = 66   *)
(*$P-*)
BEGIN
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	20(SP)			;SRC		*)	CODE(0486FH);CODE(20);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FS2X,-(SP)				*)	CODE(03F3CH);CODE(FS2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	16(SP)			;DEST		*)	CODE(0486FH);CODE(16);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FCMPS,-(SP)				*)	CODE(03F3CH);CODE(FCMPS);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	12(SP),SP					*)	CODE(04FEFH);CODE(12);
(*	RTS								*)	CODE(04E75H);
END SYSRealCMP;

PROCEDURE SYSRealTST;
(*$P-*)
BEGIN
(*	CLR.L	-(SP)						*)	CODE(042A7H);
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	12(SP)			;SRC		*)	CODE(0486FH);CODE(12);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FS2X,-(SP)				*)	CODE(03F3CH);CODE(FS2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	20(SP)			;DEST		*)	CODE(0486FH);CODE(20);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FCMPS,-(SP)		*)	CODE(03F3CH);CODE(FCMPS);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	16(SP),SP					*)	CODE(04FEFH);CODE(16);
(*	RTS								*)	CODE(04E75H);
END SYSRealTST;

PROCEDURE SYSRealFLOAT;
(*$P-*)
BEGIN
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	16(SP)			;SRC		*)	CODE(0486FH);CODE(16);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FL2X,-(SP)				*)	CODE(03F3CH);CODE(FL2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	(SP)			;TMP		*)	CODE(04857H);
(*	PEA	20(SP)			;RETURN	*)	CODE(0486FH);CODE(20);
(*	MOVE	#FX2S						*)	CODE(03F3CH);CODE(FX2S);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	12(SP),SP					*)	CODE(04FEFH);CODE(12);
(*	RTS								*)	CODE(04E75H);
END SYSRealFLOAT;

PROCEDURE SYSRealTRUNC;
(*$P-*)
BEGIN
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	16(SP)			;SRC		*)	CODE(0486FH);CODE(16);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FS2X,-(SP)				*)	CODE(03F3CH);CODE(FS2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	(SP)			;TMP		*)	CODE(04857H);
(*	MOVE	#FTINTX,-(SP)				*)	CODE(03F3CH);CODE(FTINTX);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	(SP)			;TMP		*)	CODE(04857H);
(*	PEA	20(SP)			;RETURN	*)	CODE(0486FH);CODE(20);
(*	MOVE	#FX2L,-(SP)				*)	CODE(03F3CH);CODE(FX2L);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	12(SP),SP					*)	CODE(04FEFH);CODE(12);
(*	RTS								*)	CODE(04E75H);
END SYSRealTRUNC;
(*$P-*)
END SYSTEMX.
!Funky!Stuff!
echo x - ScrapManager.MOD
cat >ScrapManager.MOD <<'!Funky!Stuff!'
IMPLEMENTATION MODULE ScrapManager;

FROM SYSTEM IMPORT ADDRESS,CODE,ADR;
FROM MacSYSTEM IMPORT LONGINT,Handle;
FROM QuickDraw IMPORT Str255;
FROM ResourceManager IMPORT ResType;

CONST
	GetRet 		= 0285FH;	(* MOVEA (A7)+,A4		*)
	Return 		= 04ED4H;	(* JMP	A4				*)
	SaveA7		= 0264FH;	(* MOVEA A7,A3		*)
	RestoreA7	= 02E4BH;	(* MOVEA A3,A7		*)


PROCEDURE InfoScrap():PScrapStuff;
(*$P+*)(*$S-*)
BEGIN
  RETURN(PScrapStuff(0960H))
END InfoScrap;

PROCEDURE UnloadScrap():LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FAH);
  CODE(RestoreA7);
  CODE(Return);
END UnloadScrap;

PROCEDURE LoadScrap():LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FBH);
  CODE(RestoreA7);
  CODE(Return);
END LoadScrap;

PROCEDURE xGetScrap(hDest:Handle;theType:LONGINT;VAR offset:LONGINT):LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FDH);
  CODE(RestoreA7);
  CODE(Return);
END xGetScrap;

TYPE Converter = RECORD CASE INTEGER OF
    0:  r:ResType;
    | 1:  l:LONGINT
    END
  END;
  
PROCEDURE GetScrap(hDest:Handle;theType:ResType;VAR offset:LONGINT):LONGINT;
(*$P+*)(*$S-*)
VAR
  c:Converter;
BEGIN
  c.r := theType;
  RETURN(xGetScrap(hDest,c.l,offset));
END GetScrap;

PROCEDURE ZeroScrap():LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FCH);
  CODE(RestoreA7);
  CODE(Return);
END ZeroScrap;

PROCEDURE xPutScrap(length:LONGINT;theType:LONGINT;source:ADDRESS):LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FEH);
  CODE(RestoreA7);
  CODE(Return);
END xPutScrap;
PROCEDURE PutScrap(length:LONGINT;theType:ResType;source:ADDRESS):LONGINT;
(*$P+*)(*$S-*)
VAR
  c:Converter;
BEGIN
  c.r := theType;
  RETURN(xPutScrap(length,c.l,source))
END PutScrap

END ScrapManager.
!Funky!Stuff!
echo x - Storage.MOD
cat >Storage.MOD <<'!Funky!Stuff!'
IMPLEMENTATION MODULE Storage;
(*$S-*)
(*	Because the stack checking is turned off in the SYSTEMX.MOD file it is
 *	Turned off here also.
 *)
(*	Created for standalone MacIntosh Code By Bob Campbell 10.02.86 
 * The Implementation now used the A-Line calls to the memory manager
 *	All of the storage allocated is set to zero.  The Calls CreateHeap,
 *	and DestroyHeap have been removed.
 *)
FROM SYSTEM IMPORT ADDRESS,CODE,ADR,REGISTER,SETREG;
CONST
	GetRet 	= 0285FH;		(* MOVEA (A7)+,A4		*)
	Return 	= 04ED4H;		(* JMP	A4				*)
	SaveA7		= 0264FH;	(* MOVEA A7,A3		*)
	RestoreA7		= 02E4BH;	(* MOVEA A3,A7		*)

	noErr		=	0;

PROCEDURE ALLOCATE (VAR addr : ADDRESS; amount : CARDINAL);
 (* allocates the requested amount of memory (in bytes) and returns the		*)
 (* starting address . Return NIL if the amount is not available				*)
 (*	Note that the memory is cleared by the trap call							*)
BEGIN
	SETREG(0,amount);
	CODE(0A31EH);
	IF (REGISTER(0) # noErr) THEN
		addr := NIL
	ELSE
		addr := REGISTER(8)
	END
END ALLOCATE;


PROCEDURE DEALLOCATE (VAR addr : ADDRESS; amount : CARDINAL);
 (* deallocates the given amount of memory (in bytes).				*)
(*$S-*)
BEGIN
	SETREG(8,addr);
	CODE(0A01FH);
END DEALLOCATE;

PROCEDURE Available (amount : CARDINAL) : BOOLEAN;
 (* returns TRUE if an ALLOCATE of the specified amount (in bytes)	*)
 (* of memory would be possible											*)
BEGIN
	SETREG(0,amount);
	CODE(0A040H);
	RETURN(INTEGER(REGISTER(0)) = 0)
END Available;

END Storage.

!Funky!Stuff!
echo x - Streams.MOD
cat >Streams.MOD <<'!Funky!Stuff!'
IMPLEMENTATION MODULE Streams;

(*
 * Modified from the  book "PROGRAMMING IN
 * MODULA-2" by Miklaus Wirth Edited by
 * David Gries pages 103 and 104.
 *)
 
FROM SYSTEM IMPORT ADR,REGISTER,SETREG,CODE,ADDRESS,WORD;
FROM MacSYSTEM IMPORT LONGINT,OSErr,noErr;
FROM Storage IMPORT ALLOCATE,DEALLOCATE;
FROM FileTypes IMPORT 
    OSType,ParamBlkPtr,ParamBlockRec,ParamBlkType,FInfo,
    fsAtMark,fsFromStart,fsFromMark,fsCurPerm,
    fsRdPerm,fsWrPerm,fsRdWrPerm,
    badMDBErr,bdNamErr,dirFulErr,dskFulErr,dupFNErr,eofErr,extFSErr,
    fBsyErr,fLckdErr,fnfErr,fnOpnErr,fsRnErr,ioErr,mFulErr,nsDrvErr,
    noMacDskErr,nsvErr,opWrErr,paramErr,permErr,posErr,rfNumErr,
    tmfoErr,volOffLinErr,volOnLinErr,vLckdErr,wrPermErr,wPrErr;
FROM PascalStrings IMPORT MakeModulaString,MakePascalString;

CONST
    OpenTrap      =   0A000H;
    CloseTrap     =   0A001H;
    ReadTrap      =  0A002H;
    WriteTrap         =   0A003H;
    CreateTrap        =  0A008H;
    DeleteTrap        =   0A009H;
    GetFileInfoTrap    =  0A00CH;
    SetFileInfoTrap    =  0A00DH;

    GetEOFTrap        =  0A011H;
    SetEOFTrap        =  0A012H;
    GetFPosTrap       =  0A018H;
    SetFPosTrap       =  0A044H;

TYPE
(* Changing Information About Files *)
PROCEDURE GetFInfo(VAR File:ARRAY OF CHAR;vRef:INTEGER;VAR fndr:FInfo);
VAR PB:ParamBlockRec;
    Str:ARRAY[0..255] OF CHAR;
BEGIN
    PB.ioCompletion := ADDRESS(0);
    MakePascalString(File,Str);
    PB.ioNamePtr := ADR(Str);
    PB.ioVRefNum := vRef;
    PB.ioVersNum := 0C;
    PB.ioFDirIndex := 0;
    SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
    CODE(GetFileInfoTrap);
    IF (PB.ioResult = noErr) THEN
        fndr := PB.ioFlFndrInfo
    END;
END GetFInfo;

PROCEDURE SetFInfo(VAR File:ARRAY OF CHAR;vRef:INTEGER;fndrInfo:FInfo);
VAR
    PB:ParamBlockRec;
    Str:ARRAY[0..255] OF CHAR;
BEGIN
    PB.ioCompletion := ADDRESS(0);
    MakePascalString(File,Str);
    PB.ioNamePtr := ADR(Str);
    PB.ioVRefNum := vRef;
    PB.ioVersNum := 0C;
    PB.ioFDirIndex := 0;
    SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
    CODE(GetFileInfoTrap);   (* get create/modification times *)
    PB.ioFlFndrInfo := fndrInfo;
    SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
    CODE(SetFileInfoTrap);
END SetFInfo;

PROCEDURE Open(VAR File:STREAM; VAR Name:ARRAY OF CHAR;vRef:INTEGER;
    Mode:OpenMode);
VAR
    Str: POINTER TO ARRAY[0..255] OF CHAR;
BEGIN
    NEW(File);
    IF (File = NIL) THEN RETURN END;
    WITH File^ DO
        IsOpen :=  FALSE;
        EOSPos    :=  0;
        CurrentPos := 0;
        ALLOCATE(Str,HIGH(Name) + 2);
        IF (Str = NIL) THEN
            DISPOSE(File);
            File := NIL;
            RETURN
        END;
        ALLOCATE(Buffer,524);
        IF (Buffer = NIL) THEN
            DISPOSE(File);
            DEALLOCATE(Str,HIGH(Name) + 2);
            File := NIL;
            RETURN
        END;
        PB.ioCompletion := ADDRESS(0);
        MakePascalString(Name,Str^);
        PB.ioNamePtr := ADDRESS(Str);
        PB.ioVRefNum := vRef;
        PB.ioVersNum := 0C;
        CASE Mode OF
        ReadOnly:
            PB.ioPermssn := fsRdPerm
        | WriteOnly:
            PB.ioPermssn := fsWrPerm
        | ReadWrite:
            PB.ioPermssn := fsRdWrPerm
        END;
        PB.ioMisc := Buffer;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(OpenTrap);
        FileNum := PB.ioRefNum;
        IF (PB.ioResult = opWrErr) THEN
            DEALLOCATE(Buffer,524);    (* File is already open *)
            Buffer := NIL;         (* using other buffer *)
            IF Mode = WriteOnly THEN
            SetEOF(File,0)
            END;
            GetEOF(File,EOSPos);
            CurrentPos := 0;
        ELSIF NOT(PB.ioResult = noErr) THEN
            DEALLOCATE(PB.ioMisc,524);
            DEALLOCATE(Str,HIGH(Name) + 2);
            DISPOSE(File);
            File := NIL;
        ELSE 
            IsOpen := TRUE;
            IF Mode = WriteOnly THEN
                SetEOF(File,0)
            END;
            GetEOF(File,EOSPos);
            CurrentPos := 0;
        END;
    END (* WITH *)
END Open;

PROCEDURE Close(File:STREAM);
BEGIN
    WITH File^ DO
        PB.ioCompletion := ADDRESS(0);
        PB.ioRefNum := FileNum;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(CloseTrap);
        DEALLOCATE(PB.ioNamePtr,ORD(PB.ioNamePtr^[0])+1);
        IF (Buffer # NIL) THEN
            DEALLOCATE(Buffer,524);
        END;
        IsOpen := FALSE;
    END
END Close;

PROCEDURE Create(VAR Name:ARRAY OF CHAR;vRef:INTEGER;
    creator,type:OSType);
VAR PB:ParamBlockRec;
    Str:ARRAY[0..255] OF CHAR;
    f:FInfo;
    ret : OSErr;
BEGIN
    PB.ioCompletion := ADDRESS(0);
    MakePascalString(Name,Str);
    PB.ioNamePtr := ADR(Str);
    PB.ioVRefNum := vRef;
    PB.ioFVersNum := 0C;
    SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
    CODE(CreateTrap);
    GetFInfo(Name,vRef,f);
    f.fdType := type;
    f.fdCreator := creator;
    SetFInfo(Name,vRef,f);
END Create;

PROCEDURE WriteWord(File:STREAM;w:WORD);
BEGIN
    WITH File^ DO
        PB.ioReqCount := 2;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := ADR(w);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(WriteTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            EOSPos := 0
        ELSE
            GetEOF(File,EOSPos)
        END
    END
END WriteWord;

PROCEDURE WriteChar(File:STREAM;c:CHAR);
BEGIN
    WITH File^ DO
        PB.ioReqCount := 1;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := ADR(c);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(WriteTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            EOSPos := 0
        ELSE
            GetEOF(File,EOSPos)
        END
    END
END WriteChar;

PROCEDURE WriteBuffer(File:STREAM;b:ADDRESS;len:LONGINT):LONGINT;
BEGIN
    WITH File^ DO
        PB.ioReqCount := len;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := b;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(WriteTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            EOSPos := 0;
            RETURN(0)
        ELSE
            GetEOF(File,EOSPos)
        END;
        RETURN(PB.ioActCount);
    END
END WriteBuffer;
 
PROCEDURE ReadWord(File:STREAM;VAR w:WORD);
BEGIN
    WITH File^ DO
        PB.ioReqCount := 2;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := ADR(w);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(ReadTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            w := WORD(0);
            EOSPos := 0
        END
    END
END ReadWord;

PROCEDURE ReadChar(File:STREAM;VAR c:CHAR);
BEGIN
    WITH File^ DO
        PB.ioReqCount := 1;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := ADR(c);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(ReadTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            c := 0C;
            EOSPos := 0
        END
    END
END ReadChar;

PROCEDURE ReadBuffer(File:STREAM;buff:ADDRESS;count:LONGINT):LONGINT;
VAR
BEGIN
    WITH File^ DO
        IF (count = 0) THEN RETURN(0) END;
        PB.ioCompletion := ADDRESS(0);
        PB.ioRefNum := FileNum;
        PB.ioReqCount := count;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := buff;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(ReadTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            EOSPos := 0;
            RETURN(0)
        ELSE
            RETURN(PB.ioActCount)
        END
    END
END ReadBuffer;

PROCEDURE EOS(s:STREAM):BOOLEAN;
BEGIN
    RETURN(s^.CurrentPos >= s^.EOSPos);
END EOS;

PROCEDURE Reset(s:STREAM);    
BEGIN
    SetPos(s,0);
END Reset;

PROCEDURE GetPos(File:STREAM;VAR FilePos:LONGINT);
BEGIN
    WITH File^ DO
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(GetFPosTrap);
        FilePos := PB.ioPosOffset;
    END
END GetPos;

PROCEDURE SetPos(File:STREAM;posOff:LONGINT);
BEGIN
    WITH File^ DO
        PB.ioPosMode := fsFromStart;
        PB.ioPosOffset := posOff;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(SetFPosTrap);
        CurrentPos := PB.ioPosOffset;
    END
END SetPos;

PROCEDURE GetEOF(File:STREAM;VAR logEOF:LONGINT);
BEGIN
    WITH File^ DO
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(GetEOFTrap);
        logEOF := PB.ioMisc;
    END
END GetEOF;

PROCEDURE SetEOF(File:STREAM;logEOF:LONGINT);
BEGIN
    WITH File^ DO
        PB.ioMisc := ADDRESS(logEOF);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(SetEOFTrap);
    END
END SetEOF;  

END Streams.
!Funky!Stuff!
# The rest of this file is a shell script which will extract:
# SYSTEMX.MOD ScrapManager.MOD Storage.MOD Streams.MOD
echo x - SYSTEMX.MOD
cat >SYSTEMX.MOD <<'!Funky!Stuff!'
IMPLEMENTATION MODULE SYSTEMX;
 
FROM SYSTEM IMPORT ADDRESS,CODE,SETREG,REGISTER,ADR,PROCESS;

CONST
	FADDS	=	01000H;
	FSUBS	=	01002H;
	FMULS	=	01004H;
	FDIVS	=	01006H;
	FCMPS	=	01008H;
	
	FTINTX	=	00016H;
	
	FX2S	=	01010H;
	FS2X	=	0100EH;
	
	FX2L	=	02810H;
	FL2X	=	0280EH;
	
(*$P-*)
PROCEDURE DoCASE;
BEGIN
	CODE(0205FH);					(* MOVEA.L	(A7)+,A0				*)
	CODE(09090H);					(* SUB.L	(A0),DO					*)
	CODE(0B0A8H);CODE(00004H);	(* CMP.L	0004(A0),D0				*)
	CODE(0620CH);					(* BHI		$1 {+12}					*)
	CODE(0E380H);					(* ASL.L	#1,D0						*)
	CODE(0D0A8H);CODE(00008H);	(* ADD.L	0008(A0),D0				*)
	CODE(0D0F0H);CODE(00800H);	(* ADDA.L	00(A0,DO.W),A0			*)
	CODE(04ED0H);					(* JMP		(A0)					*)
							(* $1 *)
	CODE(0D1E8H);CODE(00008H);	(* ADDA.L	0008(A0),A0				*)
	CODE(05988H);					(* SUBQ.L	#4,A0						*)
	CODE(04ED0H);					(* JMP		(A0)					*)
END DoCASE;

PROCEDURE DoHALT;
(*$P-*)
BEGIN
	CODE(0A9FFH); (* CALL DEBUGGER *)
	CODE(04E75H);
END DoHALT;

PROCEDURE CheckStack;
(*$P-*)
BEGIN
	(* STUBED OUT FOR NOW! *)
	CODE(04E75H);				(* RTS		*)
END CheckStack;

PROCEDURE SYSProc20;
(*$P-*)
BEGIN
(* 0000    MOVEQ.L  #0007,D0              *)	CODE(07007H);
	DoHALT;
END SYSProc20;

PROCEDURE NEWPROCESS;
(*$P-*)
BEGIN
	CODE(0700AH);				(* MOVEQ.L	#000A,D0					*)
	DoHALT;
END NEWPROCESS;

PROCEDURE TRANSFER;
(*$P-*)
BEGIN
	CODE(0700BH);				(* MOVEQ.L	#000B,DO					*)
	DoHALT;
END TRANSFER;

PROCEDURE SYSProc21;
(*$P-*)
BEGIN
(*
 *  Procedure Code Proc # 21
 *   Entry Point  0000, number of bytes = 40
 *)
(* 0000    MOVE.W   #2700,SR              *) CODE(046FCH);CODE(02700);
(* 0004    MOVE.L   A6,-(A7)              *) CODE(02F0EH);
(* 0006    MOVE.L   USP,A6                *) CODE(04E6EH);
(* 0008    MOVE.L   A5,-(A6)              *) CODE(02D0DH);
(* 000A    LEA      A6,FFCC(A6)           *) CODE(04DEEH); CODE(0FFCCH);
(* 000E    MOVE.L   (A7)+,-(A6)           *) CODE(02D1FH);
(* 0010    MOVE.W   (A7)+,-(A6)           *) CODE(03D1FH);
(* 0012    MOVE.L   (A7)+,-(A6)           *) CODE(02D1FH);
(* 0014    MOVE.L   A6,(A0)               *) CODE(0208EH);
(* 0016    MOVEA.L  (A1),A6               *) CODE(02C51H);
(* 0018    MOVE.L   (A6)+,-(A7)           *) CODE(02F1EH);
(* 001A    MOVE.W   (A6)+,-(A7)           *) CODE(03F1EH);
(* 001C    MOVE.L   (A6)+,-(A7)           *) CODE(02F1EH);
(* 001E    MOVEM.L  D0-A5,(A6)+           *) CODE(04CDEH); CODE(03FFFH);
(* 0022    MOVE.L   A6,USP                *) CODE(04E66H);
(* 0024    MOVEA.L  (A7)+,A6              *) CODE(02C5FH);
(* 0026    RTE                            *) CODE(04E73H);
END SYSProc21;

PROCEDURE IOTRANSFER(p1,p2:PROCESS; via:ADDRESS);
(*$P-*)
BEGIN
	CODE(0700CH);				(* MOVEQ.L	#000C,DO					*)
	DoHALT;
END IOTRANSFER;

PROCEDURE SYSProc7;
(* IF D0 = 2 THEN LISTEN ELSIF D0 = 3 THEN SYSRESET END *)
(*$P-*)
BEGIN
	CODE(0700DH);
	DoHALT;
END SYSProc7;

PROCEDURE SYSLongMult;
(*$P-*)
BEGIN
	CODE(04E56H);CODE(00000H);	(* LINK		A6,#0000					*)
	CODE(048E7H);CODE(07C00H);	(* MOVEM.L	D5-D1,-(A7)					*)
	CODE(0222EH);CODE(00008H);	(* MOVE.L	0008(A6),D1					*)
	CODE(0242EH);CODE(0000CH);	(* MOVE.L	000C(A6),D2					*)
	CODE(02601H);				(* MOVE.L	D1,D3						*)
	CODE(02801H);				(* MOVE.L	D1,D4						*)
	CODE(02A02H);				(* MOVE.L	D2,D5						*)
	CODE(04844H);				(* SWAP		D4							*)
	CODE(04845H);				(* SWAP		D5							*)
	CODE(0C2C2H);				(* MULU.W	D2,D1						*)
	CODE(0C4C4H);				(* MULU.W	D4,D2						*)
	CODE(0C6C5H);				(* MULU.W	D5,D3						*)
	CODE(0C8C5H);				(* MULU.W	D5,D4						*)
	CODE(04841H);				(* SWAP		D1							*)
	CODE(0D242H);				(* ADD.W	D2,D1						*)
	CODE(04285H);				(* CLR.L	D5							*)
	CODE(0D985H);				(* ADDX.L	D5,D4						*)
	CODE(0D243H);				(* ADD.W	D3,D1						*)
	CODE(0D985H);				(* ADDX.L	D5,D4						*)
	CODE(04841H);				(* SWAP		D1							*)
	CODE(04242H);				(* CLR.W	D2							*)
	CODE(04243H);				(* CLR.W	D3							*)
	CODE(04842H);				(* SWAP		D2							*)
	CODE(04843H);				(* SWAP		D3							*)
	CODE(0D483H);				(* ADD.L	D3,D2						*)
	CODE(0D484H);				(* ADD.L	D4,D2						*)
	CODE(02D41H);CODE(0000CH);	(* MOVE.L	D1,000C(A6)					*)
	CODE(04CDFH);CODE(00008H);	(* MOVE.L	D2,0008(A6)					*)
	CODE(04E5EH);				(* UNLK		A6							*)
	CODE(04E75H);				(* RTS									*)
END SYSLongMult;

PROCEDURE SYSLongDivMod;
(*$P-*)
BEGIN
	CODE(04E56H);CODE(00000H);	(* LINK		A6,#0000					*)
	CODE(048E7H);CODE(07800H);	(* MOVEM.L	D4-D1,-(A7)					*)
	CODE(0222EH);CODE(0000CH);	(* MOVE.L	000C(A6),D1					*)
	CODE(0242EH);CODE(00008H);	(* MOVE.L	0008(A6),D2					*)
	CODE(0B4BCH);CODE(00000H);
				 CODE(0FFFFH);	(* CMP.L	#0000FFFF,D2				*)
	CODE(0621EH);				(* BHI		$1 {+30}					*)
	CODE(04243H);				(* CLR.W	D3							*)
	CODE(082C2H);				(* DIVU.W	D2,D1						*)
	CODE(0680EH);				(* BVC		$2 {+14}					*)
	CODE(03801H);				(* MOVE.W	D1,D4						*)
	CODE(04241H);				(* CLR.W	D1							*)
	CODE(04841H);				(* SWAP		D1							*)
	CODE(082C2H);				(* DIVU.W	D2,D1						*)
	CODE(03601H);				(* MOVE.W	D1,D3						*)
	CODE(03204H);				(* MOVE.W	D4,D1						*)
	CODE(082C2H);				(* DIVU.W	D2,D1						*)
						(* $2: *)
	CODE(04843H);				(* SWAP		D3							*)
	CODE(03601H);				(* MOVE.W	D1,D3						*)
	CODE(04241H);				(* CLR.W	D1							*)
	CODE(04841H);				(* SWAP		D1							*)
	CODE(0601EH);				(* BRA		$3 {+30}					*)
						(* $1: *)
	CODE(04283H);				(* CLR.L	D3							*)
	CODE(03601H);				(* MOVE.W	D1,D3						*)
	CODE(04843H);				(* SWAP		D3							*)
	CODE(04241H);				(* CLR.W	D1							*)
	CODE(04841H);				(* SWAP		D1							*)
	CODE(0383CH);CODE(0000FH);	(* MOVE.W	#000F,D4					*)
						(* $5: *)
	CODE(0E38BH);				(* LSL.L	#1,D3						*)
	CODE(0E391H);				(* ROXL.L	#1,D1						*)
	CODE(0B282H);				(* CMP.L	D2,D1						*)
	CODE(06504H);				(* BCS		$4 {+4}						*)
	CODE(09282H);				(* SUB.L	D2,D1						*)
	CODE(05243H);				(* ADDQ.W	#1,D3						*)
						(* $4: *)
	CODE(051CCH);CODE(0FFF2H);	(* DBF		D4,$5 {-14}					*)
						(* $3: *)
	CODE(02D43H);CODE(0000CH);	(* MOVE.L	D3,000C(A6)					*)
	CODE(02D41H);CODE(00008H);	(* MOVE.L	D1,0008(A6)					*)
	CODE(04CDFH);CODE(0001EH);	(* MOVEM.L	D1-D4,(A7)+					*)
	CODE(04E5EH);				(* UNLK		A6							*)
	CODE(04E75H);				(* RTS									*)
END SYSLongDivMod;

PROCEDURE SYSLongIntMult;
(*$P-*)
BEGIN
(* Procedure Code Proc # 10 *)
(* Entry Point 0000, number of bytes = 92 *)
(* 0000    LINK     A6,#0000              *) CODE(04E56H); CODE(00000H);
(* 0004    MOVEM.L  D7-D1,-(A7)           *) CODE(048E7H); CODE(07F00H);
(* 0008    MOVE.L   0008(A6),D1           *) CODE(0222EH); CODE(00008H);
(* 000C    MOVE.L   000C(A6),D2           *) CODE(0242EH); CODE(0000CH);
(* 0010    MOVE.L   D1,D3                 *) CODE(02601H);
(* 0012    MOVE.L   D1,D4                 *) CODE(02801H);
(* 0014    MOVE.L   D2,D5                 *) CODE(02A02H);
(* 0016    MOVE.L   D1,D6                 *) CODE(02C01H);
(* 0018    CLR.L    D7                    *) CODE(04287H);
(* 001A    SWAP     D4                    *) CODE(04844H);
(* 001C    SWAP     D5                    *) CODE(04845H);
(* 001E    MULU.W   D2,D1                 *) CODE(0C2C2H);
(* 0020    MULU.W   D4,D2                 *) CODE(0C4C4H);
(* 0022    MULU.W   D5,D3                 *) CODE(0C6C5H);
(* 0024    MULU.W   D5,D4                 *) CODE(0C8C5H);
(* 0026    SWAP     D1                    *) CODE(04841H);
(* 0028    ADD.W    D2,D1                 *) CODE(0D987H);
(* 002A    ADDX.L   D7,D4                 *) CODE(0D987H);
(* 002C    ADD.W    D3,D1                 *) CODE(0D243H);
(* 002E    ADDX.L   D7,D4                 *) CODE(0D987H);
(* 0030    SWAP     D1                    *) CODE(04841H);
(* 0032    CLR.W    D2                    *) CODE(04242H);
(* 0034    CLR.W    D3                    *) CODE(04243H);
(* 0036    SWAP     D2                    *) CODE(04842H);
(* 0038    SWAP     D3                    *) CODE(04843H);
(* 003A    ADD.L    D3,D2                 *) CODE(0D483H);
(* 003C    ADD.L    D4,D2                 *) CODE(0D484H);
(* 003E    SWAP     D5                    *) CODE(04845H);
(* 0040    TST.L    D6                    *) CODE(04A86H);
(* 0042    BPI      2    {0046}           *) CODE(06A02H);
(* 0044    SUB.L    D5,D2                 *) CODE(09485H);
(* 0046    TST.L    D5                    *) CODE(04A85H);
(* 0048    BPI      2    {004C}           *) CODE(06A02H);
(* 004A    SUB.L    D6,D2                 *) CODE(09486H);
(* 004C    MOVE.L   D1,000C(A6)           *) CODE(02D41H); CODE(0000CH);
(* 0050    MOVE.L   D2,0008(A6)           *) CODE(02D42H); CODE(00008H);
(* 0054    MOVEM.L  D1-D7,(A7)+           *) CODE(04CDFH); CODE(000FEH);
(* 0058    UNLK      A6                   *) CODE(04E5EH);
(* 005A    RTS                            *) CODE(04E75H);
END SYSLongIntMult;

PROCEDURE SYSProc11;
(*$P-*)
BEGIN
(*Procedure Code Proc # 11                *)
(* Entry Point  0000, number of bytes = 16*)
(* 0000    LINK     A6,#0000              *) CODE(04E56H); CODE(00000H);
(* 0004    MOVEQ.L  #0008,D0              *) CODE(07008H);
		DoHALT;
(* 000C    UNLK      A6                   *) CODE(04E5EH);
(* 000E    RTS                            *) CODE(04E75H);
END SYSProc11;

PROCEDURE SYSRealAdd;
(*$P-*)
BEGIN
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	20(SP)			;DEST		*)	CODE(0486FH);CODE(20);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FS2X,-(SP)				*)	CODE(03F3CH);CODE(FS2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	16(SP)			;SRC		*)	CODE(0486FH);CODE(16);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FADDS,-(SP)				*)	CODE(03F3CH);CODE(FADDS);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	(SP)			;TMP		*)	CODE(04857H);
(*	PEA	24(SP)			;DEST		*)	CODE(0486FH);CODE(24);
(*	MOVE	#FX2S,-(SP)				*)	CODE(03F3CH);CODE(FX2S);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	12(SP),SP					*)	CODE(04FEFH);CODE(12);
(*	RTS								*)	CODE(04E75H);
END SYSRealAdd;

PROCEDURE SYSRealSub;
(*$P-*)
BEGIN
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	20(SP)			;DEST		*)	CODE(0486FH);CODE(20);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FS2X,-(SP)				*)	CODE(03F3CH);CODE(FS2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	16(SP)			;SRC		*)	CODE(0486FH);CODE(16);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FSUBS,-(SP)				*)	CODE(03F3CH);CODE(FSUBS);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	(SP)			;TMP		*)	CODE(04857H);
(*	PEA	24(SP)			;DEST		*)	CODE(0486FH);CODE(24);
(*	MOVE	#FX2S,-(SP)				*)	CODE(03F3CH);CODE(FX2S);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	12(SP),SP					*)	CODE(04FEFH);CODE(12);
(*	RTS								*)	CODE(04E75H);
END SYSRealSub;

PROCEDURE SYSRealMult;
(*$P-*)
BEGIN
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	20(SP)			;DEST		*)	CODE(0486FH);CODE(20);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FS2X,-(SP)				*)	CODE(03F3CH);CODE(FS2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	16(SP)			;SRC		*)	CODE(0486FH);CODE(16);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FMULS,-(SP)				*)	CODE(03F3CH);CODE(FMULS);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	(SP)			;TMP		*)	CODE(04857H);
(*	PEA	24(SP)			;DEST		*)	CODE(0486FH);CODE(24);
(*	MOVE	#FX2S,-(SP)				*)	CODE(03F3CH);CODE(FX2S);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	12(SP),SP					*)	CODE(04FEFH);CODE(12);
(*	RTS								*)	CODE(04E75H);
END SYSRealMult;

PROCEDURE SYSRealDiv;
(*$P-*)
BEGIN
(*	DEST	:=	DEST / SRC			*)
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	20(SP)			;DEST		*)	CODE(0486FH);CODE(20);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FS2X,-(SP)				*)	CODE(03F3CH);CODE(FS2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	16(SP)			;SRC		*)	CODE(0486FH);CODE(16);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FDIVS,-(SP)				*)	CODE(03F3CH);CODE(FDIVS);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	(SP)			;TMP		*)	CODE(04857H);
(*	PEA	24(SP)			;DEST		*)	CODE(0486FH);CODE(24);
(*	MOVE	#FX2S						*)	CODE(03F3CH);CODE(FX2S);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	12(SP),SP					*)	CODE(04FEFH);CODE(12);
(*	RTS								*)	CODE(04E75H);
END SYSRealDiv;

PROCEDURE SYSRealCMP;
(*Procedure Code Proc # 16                   *)
(* Entry Point  0000, number of bytes = 66   *)
(*$P-*)
BEGIN
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	20(SP)			;SRC		*)	CODE(0486FH);CODE(20);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FS2X,-(SP)				*)	CODE(03F3CH);CODE(FS2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	16(SP)			;DEST		*)	CODE(0486FH);CODE(16);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FCMPS,-(SP)				*)	CODE(03F3CH);CODE(FCMPS);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	12(SP),SP					*)	CODE(04FEFH);CODE(12);
(*	RTS								*)	CODE(04E75H);
END SYSRealCMP;

PROCEDURE SYSRealTST;
(*$P-*)
BEGIN
(*	CLR.L	-(SP)						*)	CODE(042A7H);
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	12(SP)			;SRC		*)	CODE(0486FH);CODE(12);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FS2X,-(SP)				*)	CODE(03F3CH);CODE(FS2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	20(SP)			;DEST		*)	CODE(0486FH);CODE(20);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FCMPS,-(SP)		*)	CODE(03F3CH);CODE(FCMPS);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	16(SP),SP					*)	CODE(04FEFH);CODE(16);
(*	RTS								*)	CODE(04E75H);
END SYSRealTST;

PROCEDURE SYSRealFLOAT;
(*$P-*)
BEGIN
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	16(SP)			;SRC		*)	CODE(0486FH);CODE(16);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FL2X,-(SP)				*)	CODE(03F3CH);CODE(FL2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	(SP)			;TMP		*)	CODE(04857H);
(*	PEA	20(SP)			;RETURN	*)	CODE(0486FH);CODE(20);
(*	MOVE	#FX2S						*)	CODE(03F3CH);CODE(FX2S);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	12(SP),SP					*)	CODE(04FEFH);CODE(12);
(*	RTS								*)	CODE(04E75H);
END SYSRealFLOAT;

PROCEDURE SYSRealTRUNC;
(*$P-*)
BEGIN
(*	LEA	-12(SP),SP		;TMP		*)	CODE(04FEFH);CODE(0FFF4H);
(*	PEA	16(SP)			;SRC		*)	CODE(0486FH);CODE(16);
(*	PEA	4(SP)			;ADR(TMP)	*)	CODE(0486FH);CODE(4);
(*	MOVE	#FS2X,-(SP)				*)	CODE(03F3CH);CODE(FS2X);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	(SP)			;TMP		*)	CODE(04857H);
(*	MOVE	#FTINTX,-(SP)				*)	CODE(03F3CH);CODE(FTINTX);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	PEA	(SP)			;TMP		*)	CODE(04857H);
(*	PEA	20(SP)			;RETURN	*)	CODE(0486FH);CODE(20);
(*	MOVE	#FX2L,-(SP)				*)	CODE(03F3CH);CODE(FX2L);
(*	_FP68K	; A9EB					*)	CODE(0A9EBH);
(*	LEA	12(SP),SP					*)	CODE(04FEFH);CODE(12);
(*	RTS								*)	CODE(04E75H);
END SYSRealTRUNC;
(*$P-*)
END SYSTEMX.
!Funky!Stuff!
echo x - ScrapManager.MOD
cat >ScrapManager.MOD <<'!Funky!Stuff!'
IMPLEMENTATION MODULE ScrapManager;

FROM SYSTEM IMPORT ADDRESS,CODE,ADR;
FROM MacSYSTEM IMPORT LONGINT,Handle;
FROM QuickDraw IMPORT Str255;
FROM ResourceManager IMPORT ResType;

CONST
	GetRet 		= 0285FH;	(* MOVEA (A7)+,A4		*)
	Return 		= 04ED4H;	(* JMP	A4				*)
	SaveA7		= 0264FH;	(* MOVEA A7,A3		*)
	RestoreA7	= 02E4BH;	(* MOVEA A3,A7		*)


PROCEDURE InfoScrap():PScrapStuff;
(*$P+*)(*$S-*)
BEGIN
  RETURN(PScrapStuff(0960H))
END InfoScrap;

PROCEDURE UnloadScrap():LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FAH);
  CODE(RestoreA7);
  CODE(Return);
END UnloadScrap;

PROCEDURE LoadScrap():LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FBH);
  CODE(RestoreA7);
  CODE(Return);
END LoadScrap;

PROCEDURE xGetScrap(hDest:Handle;theType:LONGINT;VAR offset:LONGINT):LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FDH);
  CODE(RestoreA7);
  CODE(Return);
END xGetScrap;

TYPE Converter = RECORD CASE INTEGER OF
    0:  r:ResType;
    | 1:  l:LONGINT
    END
  END;
  
PROCEDURE GetScrap(hDest:Handle;theType:ResType;VAR offset:LONGINT):LONGINT;
(*$P+*)(*$S-*)
VAR
  c:Converter;
BEGIN
  c.r := theType;
  RETURN(xGetScrap(hDest,c.l,offset));
END GetScrap;

PROCEDURE ZeroScrap():LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FCH);
  CODE(RestoreA7);
  CODE(Return);
END ZeroScrap;

PROCEDURE xPutScrap(length:LONGINT;theType:LONGINT;source:ADDRESS):LONGINT;
(*$P-*)
BEGIN
  CODE(GetRet);
  CODE(SaveA7);
  CODE(0A9FEH);
  CODE(RestoreA7);
  CODE(Return);
END xPutScrap;
PROCEDURE PutScrap(length:LONGINT;theType:ResType;source:ADDRESS):LONGINT;
(*$P+*)(*$S-*)
VAR
  c:Converter;
BEGIN
  c.r := theType;
  RETURN(xPutScrap(length,c.l,source))
END PutScrap

END ScrapManager.
!Funky!Stuff!
echo x - Storage.MOD
cat >Storage.MOD <<'!Funky!Stuff!'
IMPLEMENTATION MODULE Storage;
(*$S-*)
(*	Because the stack checking is turned off in the SYSTEMX.MOD file it is
 *	Turned off here also.
 *)
(*	Created for standalone MacIntosh Code By Bob Campbell 10.02.86 
 * The Implementation now used the A-Line calls to the memory manager
 *	All of the storage allocated is set to zero.  The Calls CreateHeap,
 *	and DestroyHeap have been removed.
 *)
FROM SYSTEM IMPORT ADDRESS,CODE,ADR,REGISTER,SETREG;
CONST
	GetRet 	= 0285FH;		(* MOVEA (A7)+,A4		*)
	Return 	= 04ED4H;		(* JMP	A4				*)
	SaveA7		= 0264FH;	(* MOVEA A7,A3		*)
	RestoreA7		= 02E4BH;	(* MOVEA A3,A7		*)

	noErr		=	0;

PROCEDURE ALLOCATE (VAR addr : ADDRESS; amount : CARDINAL);
 (* allocates the requested amount of memory (in bytes) and returns the		*)
 (* starting address . Return NIL if the amount is not available				*)
 (*	Note that the memory is cleared by the trap call							*)
VAR
	zero:ADDRESS;
BEGIN
	CODE(04280H);		(* CLR D0 *)
	SETREG(0,amount);
	CODE(0A31EH);
	IF (REGISTER(0) # noErr) THEN
		addr := NIL
	ELSE
		addr := REGISTER(8)
	END
END ALLOCATE;


PROCEDURE DEALLOCATE (VAR addr : ADDRESS; amount : CARDINAL);
 (* deallocates the given amount of memory (in bytes).				*)
(*$S-*)
BEGIN
	SETREG(8,addr);
	CODE(0A01FH);
END DEALLOCATE;

PROCEDURE Available (amount : CARDINAL) : BOOLEAN;
 (* returns TRUE if an ALLOCATE of the specified amount (in bytes)	*)
 (* of memory would be possible											*)
BEGIN
	CODE(04280H);		(* CLR D0 *)
	SETREG(0,amount);
	CODE(0A040H);
	RETURN(INTEGER(REGISTER(0)) = 0)
END Available;

END Storage.

!Funky!Stuff!
echo x - Streams.MOD
cat >Streams.MOD <<'!Funky!Stuff!'
IMPLEMENTATION MODULE Streams;

(*
 * Modified from the  book "PROGRAMMING IN
 * MODULA-2" by Miklaus Wirth Edited by
 * David Gries pages 103 and 104.
 *)
 
FROM SYSTEM IMPORT ADR,REGISTER,SETREG,CODE,ADDRESS,WORD;
FROM MacSYSTEM IMPORT LONGINT,OSErr,noErr;
FROM Storage IMPORT ALLOCATE,DEALLOCATE;
FROM FileTypes IMPORT 
    OSType,ParamBlkPtr,ParamBlockRec,ParamBlkType,FInfo,
    fsAtMark,fsFromStart,fsFromMark,fsCurPerm,
    fsRdPerm,fsWrPerm,fsRdWrPerm,
    badMDBErr,bdNamErr,dirFulErr,dskFulErr,dupFNErr,eofErr,extFSErr,
    fBsyErr,fLckdErr,fnfErr,fnOpnErr,fsRnErr,ioErr,mFulErr,nsDrvErr,
    noMacDskErr,nsvErr,opWrErr,paramErr,permErr,posErr,rfNumErr,
    tmfoErr,volOffLinErr,volOnLinErr,vLckdErr,wrPermErr,wPrErr;
FROM PascalStrings IMPORT MakeModulaString,MakePascalString;

CONST
    OpenTrap      =   0A000H;
    CloseTrap     =   0A001H;
    ReadTrap      =  0A002H;
    WriteTrap         =   0A003H;
    CreateTrap        =  0A008H;
    DeleteTrap        =   0A009H;
    GetFileInfoTrap    =  0A00CH;
    SetFileInfoTrap    =  0A00DH;

    GetEOFTrap        =  0A011H;
    SetEOFTrap        =  0A012H;
    GetFPosTrap       =  0A018H;
    SetFPosTrap       =  0A044H;

TYPE
(* Changing Information About Files *)
PROCEDURE GetFInfo(VAR File:ARRAY OF CHAR;vRef:INTEGER;VAR fndr:FInfo);
VAR PB:ParamBlockRec;
    Str:ARRAY[0..255] OF CHAR;
BEGIN
    PB.ioCompletion := ADDRESS(0);
    MakePascalString(File,Str);
    PB.ioNamePtr := ADR(Str);
    PB.ioVRefNum := vRef;
    PB.ioVersNum := 0C;
    PB.ioFDirIndex := 0;
    SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
    CODE(GetFileInfoTrap);
    IF (PB.ioResult = noErr) THEN
        fndr := PB.ioFlFndrInfo
    END;
END GetFInfo;

PROCEDURE SetFInfo(VAR File:ARRAY OF CHAR;vRef:INTEGER;fndrInfo:FInfo);
VAR
    PB:ParamBlockRec;
    Str:ARRAY[0..255] OF CHAR;
BEGIN
    PB.ioCompletion := ADDRESS(0);
    MakePascalString(File,Str);
    PB.ioNamePtr := ADR(Str);
    PB.ioVRefNum := vRef;
    PB.ioVersNum := 0C;
    PB.ioFDirIndex := 0;
    SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
    CODE(GetFileInfoTrap);   (* get create/modification times *)
    PB.ioFlFndrInfo := fndrInfo;
    SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
    CODE(SetFileInfoTrap);
END SetFInfo;

PROCEDURE Open(VAR File:STREAM; VAR Name:ARRAY OF CHAR;vRef:INTEGER;
    Mode:OpenMode);
VAR
    Str: POINTER TO ARRAY[0..255] OF CHAR;
BEGIN
    NEW(File);
    IF (File = NIL) THEN RETURN END;
    WITH File^ DO
        IsOpen :=  FALSE;
        EOSPos    :=  0;
        CurrentPos := 0;
        ALLOCATE(Str,HIGH(Name) + 2);
        IF (Str = NIL) THEN
            DISPOSE(File);
            File := NIL;
            RETURN
        END;
        ALLOCATE(Buffer,524);
        IF (Buffer = NIL) THEN
            DISPOSE(File);
            DEALLOCATE(Str,HIGH(Name) + 2);
            File := NIL;
            RETURN
        END;
        PB.ioCompletion := ADDRESS(0);
        MakePascalString(Name,Str^);
        PB.ioNamePtr := ADDRESS(Str);
        PB.ioVRefNum := vRef;
        PB.ioVersNum := 0C;
        CASE Mode OF
        ReadOnly:
            PB.ioPermssn := fsRdPerm
        | WriteOnly:
            PB.ioPermssn := fsWrPerm
        | ReadWrite:
            PB.ioPermssn := fsRdWrPerm
        END;
        PB.ioMisc := Buffer;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(OpenTrap);
        FileNum := PB.ioRefNum;
        IF (PB.ioResult = opWrErr) THEN
            DEALLOCATE(Buffer,524);    (* File is already open *)
            Buffer := NIL;         (* using other buffer *)
            IF Mode = WriteOnly THEN
            SetEOF(File,0)
            END;
            GetEOF(File,EOSPos);
            CurrentPos := 0;
        ELSIF NOT(PB.ioResult = noErr) THEN
            DEALLOCATE(PB.ioMisc,524);
            DEALLOCATE(Str,HIGH(Name) + 2);
            DISPOSE(File);
            File := NIL;
        ELSE 
            IsOpen := TRUE;
            IF Mode = WriteOnly THEN
                SetEOF(File,0)
            END;
            GetEOF(File,EOSPos);
            CurrentPos := 0;
        END;
    END (* WITH *)
END Open;

PROCEDURE Close(File:STREAM);
BEGIN
    WITH File^ DO
        PB.ioCompletion := ADDRESS(0);
        PB.ioRefNum := FileNum;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(CloseTrap);
        DEALLOCATE(PB.ioNamePtr,ORD(PB.ioNamePtr^[0])+1);
        IF (Buffer # NIL) THEN
            DEALLOCATE(Buffer,524);
        END;
        IsOpen := FALSE;
    END
END Close;

PROCEDURE Create(VAR Name:ARRAY OF CHAR;vRef:INTEGER;
    creator,type:OSType);
VAR PB:ParamBlockRec;
    Str:ARRAY[0..255] OF CHAR;
    f:FInfo;
    ret : OSErr;
BEGIN
    PB.ioCompletion := ADDRESS(0);
    MakePascalString(Name,Str);
    PB.ioNamePtr := ADR(Str);
    PB.ioVRefNum := vRef;
    PB.ioFVersNum := 0C;
    SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
    CODE(CreateTrap);
    GetFInfo(Name,vRef,f);
    f.fdType := type;
    f.fdCreator := creator;
    SetFInfo(Name,vRef,f);
END Create;

PROCEDURE WriteWord(File:STREAM;w:WORD);
BEGIN
    WITH File^ DO
        PB.ioReqCount := 2;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := ADR(w);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(WriteTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            EOSPos := 0
        ELSE
            GetEOF(File,EOSPos)
        END
    END
END WriteWord;

PROCEDURE WriteChar(File:STREAM;c:CHAR);
BEGIN
    WITH File^ DO
        PB.ioReqCount := 1;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := ADR(c);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(WriteTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            EOSPos := 0
        ELSE
            GetEOF(File,EOSPos)
        END
    END
END WriteChar;

PROCEDURE WriteBuffer(File:STREAM;b:ADDRESS;len:LONGINT):LONGINT;
BEGIN
    WITH File^ DO
        PB.ioReqCount := len;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := b;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(WriteTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            EOSPos := 0;
            RETURN(0)
        ELSE
            GetEOF(File,EOSPos)
        END;
        RETURN(PB.ioActCount);
    END
END WriteBuffer;
 
PROCEDURE ReadWord(File:STREAM;VAR w:WORD);
BEGIN
    WITH File^ DO
        PB.ioReqCount := 2;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := ADR(w);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(ReadTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            w := WORD(0);
            EOSPos := 0
        END
    END
END ReadWord;

PROCEDURE ReadChar(File:STREAM;VAR c:CHAR);
BEGIN
    WITH File^ DO
        PB.ioReqCount := 1;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := ADR(c);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(ReadTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            c := 0C;
            EOSPos := 0
        END
    END
END ReadChar;

PROCEDURE ReadBuffer(File:STREAM;buff:ADDRESS;count:LONGINT):LONGINT;
VAR
BEGIN
    WITH File^ DO
        IF (count = 0) THEN RETURN(0) END;
        PB.ioCompletion := ADDRESS(0);
        PB.ioRefNum := FileNum;
        PB.ioReqCount := count;
        PB.ioPosMode := 0;
        PB.ioPosOffset := 0;
        PB.ioBuffer := buff;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(ReadTrap);
        CurrentPos := PB.ioPosOffset;
        IF PB.ioResult # noErr THEN
            EOSPos := 0;
            RETURN(0)
        ELSE
            RETURN(PB.ioActCount)
        END
    END
END ReadBuffer;

PROCEDURE EOS(s:STREAM):BOOLEAN;
BEGIN
    RETURN(s^.CurrentPos >= s^.EOSPos);
END EOS;

PROCEDURE Reset(s:STREAM);    
BEGIN
    SetPos(s,0);
END Reset;

PROCEDURE GetPos(File:STREAM;VAR FilePos:LONGINT);
BEGIN
    WITH File^ DO
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(GetFPosTrap);
        FilePos := PB.ioPosOffset;
    END
END GetPos;

PROCEDURE SetPos(File:STREAM;posOff:LONGINT);
BEGIN
    WITH File^ DO
        PB.ioPosMode := fsFromStart;
        PB.ioPosOffset := posOff;
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(SetFPosTrap);
        CurrentPos := PB.ioPosOffset;
    END
END SetPos;

PROCEDURE GetEOF(File:STREAM;VAR logEOF:LONGINT);
BEGIN
    WITH File^ DO
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(GetEOFTrap);
        logEOF := PB.ioMisc;
    END
END GetEOF;

PROCEDURE SetEOF(File:STREAM;logEOF:LONGINT);
BEGIN
    WITH File^ DO
        PB.ioMisc := ADDRESS(logEOF);
        SETREG(8,ADR(PB));       (* A0 := ADR(PB) *)
        CODE(SetEOFTrap);
    END
END SetEOF;  

END Streams.
!Funky!Stuff!