[comp.sources.atari.st] v01i087: mx2v230 -- Multitasking kernel with utilities part07/08

koreth@ssyx.ucsc.edu.ucsc.edu (Steven Grimm) (12/28/88)

Submitted-by: madsen@sask.usask.ca (Jorgen Madsen)
Posting-number: Volume 1, Issue 87
Archive-name: mx2v230/part07

#!/bin/sh
# this is part 7 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file SCANNER.MOD continued
#
CurArch=7
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
sed 's/^X//' << 'SHAR_EOF' >> SCANNER.MOD
X                      state.return:=(-2);
X                      EXIT;
X                   END;
X                   state.disp:=i;
X                   state.return:=0;
X                   EXIT;
X                END;
X                INC(i);
X                INC(j);
X                INC(chrptr);
X                INC(textbuf);
X        END;
XEND             ltext;
X
XPROCEDURE       etext(bufadr: ADDRESS; buflen: CARDINAL);
XVAR                i,j     :       CARDINAL;
X                   textbuf :       charptr;
XBEGIN
X        textbuf:=bufadr;
X        j:=0;
X        chrptr:=charptr(state.bufadr+ADDRESS(state.disp));
X        i:=state.disp;
X        state.prevdisp:=state.disp;
X        IF delimit(chrptr^) THEN
X           textbuf^:=CHAR(0);
X           state.return:=(-1);
X           RETURN;
X        END;
X
X        LOOP
X                IF bufeol(i)=(-2) THEN (* past eol *)
X                   state.return:=(-2);
X                   EXIT;
X                END;
X                IF chrptr^# 0C THEN
X                   IF j<buflen THEN (* stop at end of buffer *)
X                      textbuf^:=chrptr^;
X                   END;
X                   state.disp:=i;
X                ELSE
X                   INC(j);
X                   IF NOT (j>buflen) THEN
X                      textbuf^:=CHAR(0);
X                   END;
X                   IF bufeol(i)=(-1) THEN (* if eol *)
X                      state.return:=(-2);
X                      EXIT;
X                   END;
X                   state.disp:=i;
X                   state.return:=0;
X                   EXIT;
X                END;
X                INC(i);
X                INC(j);
X                INC(chrptr);
X                INC(textbuf);
X        END;
XEND             etext;
X
XBEGIN
XEND                    SCANNER.
SHAR_EOF
chmod 0600 SCANNER.MOD || echo "restore of SCANNER.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > SPAWN.MOD &&
X
X(*              Copyright 1987 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      12/8/87-FGB             *)
X(*                                                              *)
X
X(*$A+,$S-,$T- *)
XMODULE  spawn;
XFROM    ATOMIC  IMPORT  MultiBegin,sysvariable,GEMTYPE,ROMDATE,
X                        OTOS,MTOS,OLDDATE,NEWDATE;
XFROM    SYSCALL IMPORT  SysVar,Sleep;
XFROM    SYSTEM  IMPORT  ADDRESS;
XFROM    GEMDOS  IMPORT  OldTerm;
XVAR           sv                              : sysvariable;
X              gem1     [OTOS]                 : POINTER TO GEMTYPE;
X              gem2     [MTOS]                 : POINTER TO GEMTYPE;
X
XBEGIN
X                SysVar(sv);
X                IF ROMDATE=OLDDATE THEN
X                   sv.bpsave^:=gem1^;
X                   sv.bpsave^[0]:=ADDRESS(gem1);
X                END;
X                IF ROMDATE=NEWDATE THEN
X                   sv.bpsave^:=gem2^;
X                   sv.bpsave^[0]:=ADDRESS(gem2);
X                END;
X                MultiBegin;
X                Sleep;
X                OldTerm;
XEND     spawn.
SHAR_EOF
chmod 0600 SPAWN.MOD || echo "restore of SPAWN.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > SPOOLER.MOD &&
X(* this module uses spint 0 to communicate with a controller program
X   Commands are sent via the spintinfo call. and pass values thru
X   the spintcmd variable. Please look at lp.mod for an example.
X   current commands are:
X   1    examine spool directory. print any files that exist then delete.
X   2    spool queue.
X   99   terminate spooler.prg.
X*)
X
XMODULE spooler;
XFROM   XBIOS    IMPORT  SuperExec;
XFROM   SYSTEM   IMPORT  BYTE,ADR,CODE,ADDRESS;
XFROM   GEMDOS   IMPORT  DirCreate,Open,Close,SetDTA,Delete,SFirst,SNext,
X                        SetPath,Alloc,Free,Read,GetPath,OldTerm;
XFROM   TextIO   IMPORT  WriteString,WriteLn,WriteAdr;
XFROM   BIOS     IMPORT  Device,BCosStat,BConOut; 
XFROM   Streams  IMPORT  OpenStream,CloseStream,StreamKinds,Stream;
XFROM   SYSCALL  IMPORT  EnableSpint,SwapProcess,SleepProcess,
X                        WakeupProcess,ProcessPid,DisableSpint;
XTYPE   dtatype  =       RECORD
X                res     :       ARRAY [0..20] OF BYTE;
X                attr    :       BYTE;
X                time    :       CARDINAL;
X                date    :       CARDINAL;
X                size    :       LONGCARD;
X                name    :       ARRAY [0..13] OF CHAR;
X                        END;
XVAR    result,i,return,d,pid                    :       INTEGER;
X       DTA                                      :       dtatype;
X       ok                                       :       BOOLEAN;
X       count                                    :       INTEGER;
X       ch                                       :       BYTE;
X       S                                        :       Stream;
X       endpos,currentpos,delay                  :       LONGCARD;
X       C,char                                   :       POINTER TO CHAR;
X       spintcmd                                 :       ARRAY [0..1] OF
X                                                        LONGCARD;
XPROCEDURE       sq;
XBEGIN
X           WriteLn;
X           IF currentpos#endpos THEN
X                WriteString("Printing ");
X                WriteString(DTA.name);
X                WriteAdr(ADDRESS(endpos),7);
X                WriteString(" total characters");
X                WriteAdr(ADDRESS(endpos-currentpos),7);
X                WriteString(" characters left to print.");
X           ELSE
X                WriteString("Nothing.");
X           END;
X           WriteLn;
XEND             sq;
X
XPROCEDURE       run;
XBEGIN
X        IF (spintcmd[0]=1) OR (spintcmd[0]=99) THEN
X           WakeupProcess(pid);
X        END;
X        IF spintcmd[0]=2 THEN
X           sq;
X        END;
XEND             run;
X
XBEGIN
X        spintcmd[1]:=LONGCARD(sq);
X        pid:=ProcessPid();
X        ok:=SetPath("\");
X        ok:=DirCreate("mx2spool");
X        IF ok THEN
X           WriteString("Creating spool directory -> \MX2SPOOL");
X           WriteLn;
X        END;
X        ok:=SetPath("\mx2spool");
X        IF NOT ok THEN
X           DisableSpint(0);
X           WriteString("Unable to create or use MX2SPOOL directory");
X           WriteLn;
X           OldTerm;
X        END;
X        ok:=EnableSpint(0,run,ADR(spintcmd)); (* spint to start spooler *)
X        SetDTA(ADR(DTA));
X        LOOP
X           SFirst("*.*",0,result);
X           WHILE result=0 DO
X
X        count:=0;
X        OpenStream(S,DTA.name,READ,return);
X        IF return<0 THEN
X        ELSE
X           currentpos:=0;
X           endpos:=S.endPos;
X           Alloc(endpos,C);
X           char:=C;
X           IF char#NIL THEN
X              Read(S.handle,endpos,char);
X              CloseStream(S,return);
X              WHILE (currentpos#endpos) DO
X                 WHILE NOT BCosStat(PRT) DO
X                    INC(delay);
X                    IF delay>1000 THEN
X                       delay:=0;
X                       SwapProcess;
X                    END;
X                 END;
X                 BConOut(PRT,char^);
X                 INC(currentpos);
X                 INC(char);
X                 INC(count);
X                 IF count>32 THEN
X                    count:=0;
X                    SwapProcess;
X                    IF spintcmd[0]=99 THEN
X                       DisableSpint(0);
X                       OldTerm;
X                    END;
X                 END;
X              END;
X              IF Free(C) THEN END;
X              BConOut(PRT,CHAR(0cH)); (* send formfeed *)
X           ELSE
X              CloseStream(S,return);
X              WriteString(DTA.name);
X              WriteString(" * SPOOLER OUT OF MEMORY *");
X              WriteLn;
X           END;
X        END;
X           ok:=Delete(DTA.name);
X           SNext(result);
X           END;
X           SleepProcess(pid);
X           IF spintcmd[0]=99 THEN
X              DisableSpint(0);
X              OldTerm;
X           END;
X        END;
XEND    spooler.
SHAR_EOF
chmod 0600 SPOOLER.MOD || echo "restore of SPOOLER.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > SQ.MOD &&
XMODULE  sq;
XFROM    SYSCALL         IMPORT  SpintInfo;
XFROM    GEMDOS          IMPORT  Term;
XFROM    Terminal        IMPORT  WriteString,WriteLn;
XVAR     spintcmd        :       POINTER TO ARRAY [0..1] OF LONGCARD;
X        SQ              :       PROC;
X        ok              :       BOOLEAN;
XBEGIN
X        IF SpintInfo(0,spintcmd) THEN
X           SQ:=PROC(spintcmd^[1]);
X           SQ();
X        ELSE
X           WriteLn;
X           WriteString("Background spooler not running");
X           WriteLn;
X           ok:=Term(-1);
X        END;
X        ok:=Term(0);
XEND     sq.
SHAR_EOF
chmod 0600 SQ.MOD || echo "restore of SQ.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > SUBMIT.MOD &&
X
X(*              Copyright 1987 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      12/8/87-FGB             *)
X(*                                                              *)
X
XMODULE submit;
X
XFROM SYSTEM IMPORT ADDRESS;
XFROM GEMX   IMPORT BasePageAddress ;
XFROM XBIOS  IMPORT IOREC,IORECPTR,SerialDevice,IORec;
XFROM    GEMDOS  IMPORT  OldTerm;
XVAR         char                        :       CHAR;
X            i                           :       CARDINAL;
X            kbdiorec                    :       IORECPTR;
X            ibuf                        :       POINTER TO ARRAY [0..63] OF
X                                                LONGCARD;
X
XBEGIN;
X    kbdiorec:=IORec(Keyboard);
X    ibuf:=kbdiorec^.ibuf;
X    char:=BasePageAddress^.CmdLine[1];
X    FOR i:=1 TO ORD(BasePageAddress^.CmdLine[0])+1 DO
X        ibuf^[i]:=LONGCARD(BasePageAddress^.CmdLine[i]);
X    END;
X    ibuf^[ORD(BasePageAddress^.CmdLine[0])+1]:=LONGCARD(0dH);
X    kbdiorec^.ibufhd:=0;
X    kbdiorec^.ibuftl:=(ORD(BasePageAddress^.CmdLine[0])+1)*4;
X    OldTerm;
XEND submit.
SHAR_EOF
chmod 0600 SUBMIT.MOD || echo "restore of SUBMIT.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > SUBMITA.MOD &&
X
X(*              Copyright 1987 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      12/8/87-FGB             *)
X(*                                                              *)
X
X(*$A+ *)
XMODULE submita;
XFROM SYSTEM IMPORT ADDRESS;
XFROM GEMX   IMPORT BasePageAddress ;
XFROM XBIOS  IMPORT IOREC,IORec,IORECPTR,SerialDevice;
XFROM GEMDOS IMPORT OldTerm;
XVAR         char                        :      CHAR;
X            i,count                     :      CARDINAL;
X            kbdiorec                    :      IORECPTR;
X            ibuf                        :      POINTER TO ARRAY [0..255] OF
X                                               CHAR;
X        
XBEGIN;
X    kbdiorec:=IORec(RS232);
X    ibuf:=kbdiorec^.ibuf;
X    char:=BasePageAddress^.CmdLine[1];
X    count:=ORD(BasePageAddress^.CmdLine[0])+1;
X    IF count>78 THEN count:=78 END;
X    FOR i:=1 TO count DO
X        ibuf^[i]:=CHAR(BasePageAddress^.CmdLine[i]);
X    END;
X    ibuf^[count]:=CHAR(0dH);
X    kbdiorec^.ibufhd:=0;
X    kbdiorec^.ibuftl:=count;
X    OldTerm;
XEND submita.
SHAR_EOF
chmod 0600 SUBMITA.MOD || echo "restore of SUBMITA.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > SUBMITM.MOD &&
X
X(*              Copyright 1987 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      12/8/87-FGB             *)
X(*                                                              *)
X
X(*$A+ *)
XMODULE submita;
XFROM SYSTEM IMPORT ADDRESS;
XFROM GEMX   IMPORT BasePageAddress ;
XFROM XBIOS  IMPORT IOREC,IORec,IORECPTR,SerialDevice;
XFROM GEMDOS IMPORT OldTerm;
XVAR         char                        :      CHAR;
X            i,count                     :      CARDINAL;
X            kbdiorec                    :      IORECPTR;
X            ibuf                        :      POINTER TO ARRAY [0..127] OF
X                                               CHAR;
X        
XBEGIN;
X    kbdiorec:=IORec(MIDI);
X    ibuf:=kbdiorec^.ibuf;
X    char:=BasePageAddress^.CmdLine[1];
X    count:=ORD(BasePageAddress^.CmdLine[0])+1;
X    IF count>78 THEN count:=78 END;
X    FOR i:=2 TO count DO
X        ibuf^[i]:=CHAR(BasePageAddress^.CmdLine[i-1]);
X    END;
X    ibuf^[count+1]:=CHAR(0dH);
X    kbdiorec^.ibufhd:=0;
X    kbdiorec^.ibuftl:=count+1;
X    OldTerm;
XEND submita.
SHAR_EOF
chmod 0600 SUBMITM.MOD || echo "restore of SUBMITM.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > SYS.MOD &&
X
X(*              Copyright 1987 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      12/8/87-FGB             *)
X(*                                                              *)
X
X(*$S-,$T- *)
XMODULE  SYS;
XFROM    SYSCALL IMPORT  SysCmd;
XFROM    GEMDOS  IMPORT  OldTerm;
XBEGIN
X        SysCmd; (* submit to kernal *)
X        OldTerm;
XEND     SYS.
SHAR_EOF
chmod 0600 SYS.MOD || echo "restore of SYS.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > SYSCALL.DEF &&
X
X(*              Copyright 1987 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      12/8/87-FGB             *)
X(* Add ProcessPid to return PID of calling process              *)
X(*                                      12/12/87-FGB            *)
X(* Added variable parm to StartProcess to pass info to process  *)
X(* in currentprocess.gemsave[15]        1/1/88-FGB              *)
X(*                                                              *)
X
XDEFINITION MODULE SYSCALL;
X
XFROM    ATOMIC  IMPORT  SIGNAL,sysvariable;
XFROM    SYSTEM  IMPORT  ADDRESS;
XFROM    Strings IMPORT  String;
X
XCONST   (* SYSTEM ERRORS *)
X
X        ENOERR           =       0;     (* no error *)
X        ENOENT           =       2;     (* no file or directory *)
X        ENORCH           =       3;     (* no such process *)
X        ENOMEM           =       12;    (* out of memory *)
X        EBADRQC          =       54;    (* bad request *)
X
X(* Read the program command line and pass it to kernel to execute *)
XPROCEDURE   SysCmd;
X
X(* Pass command line to kernal to execute *)
XPROCEDURE   SysReq(VAR command: ARRAY OF CHAR);
X
X(* Get the processdescriptor for the currentprocess *)
XPROCEDURE  SysDes(VAR currentprocess : SIGNAL);
X
X(* Get the systemvariables ,These are copies of the variables *)
XPROCEDURE  SysVar(VAR sysvar : sysvariable);
X
X(* Return PID of calling process *)
XPROCEDURE  ProcessPid(): INTEGER;
X
X(* Put procedure to sleep *)
XPROCEDURE        Sleep;
X
X(* check to see if special interrupt has happened , execute if triggered *)
XPROCEDURE CheckSpint;
X
X(*  Setup spint linkage to spintid *)
XPROCEDURE EnableSpint(spintid: CARDINAL; routine: PROC; data: ADDRESS): BOOLEAN;
X
X(*  request spint data and active info  return TRUE if active bit set *)
X(*  data will be set to NIL if the spint is disabled           *)
XPROCEDURE SpintInfo(spintid: CARDINAL; VAR data: ADDRESS): BOOLEAN;
X
X(*  remove spint linkage to spintid *)
XPROCEDURE DisableSpint(spintid: CARDINAL);
X
X(*  send spint to routine  *)
XPROCEDURE Trigger(spintid: CARDINAL): BOOLEAN;
X
X(*  Hold program interrupts *)
XPROCEDURE HoldSpint(spintid: CARDINAL);
X
X(*  Release program interrupts *)
XPROCEDURE ReleaseSpint(spintid: CARDINAL);
X
X(*  Wait a specified period of time for a program interrupt ticks are
X    in 200 hz clocks. If tick is -1 then wait forever for interrupt  *)
XPROCEDURE IntDelay(tick: LONGINT): INTEGER;
X
X(* create a process for the MX2 system, place in the scheduler ready
X   list, start new process *)
XPROCEDURE StartProcess(VAR P: PROC; 
X                       VAR n: LONGCARD; 
X                       VAR priority: INTEGER; 
X                       VAR pn: String;
X                       VAR parm: ADDRESS);
X
X(* store the currentprocess and switch to next process in ready list *)
XPROCEDURE SwapProcess;
X
X(* end process and remove it from the ready list, free memory used by
X   process *)
XPROCEDURE TermProcess(VAR id: INTEGER);
X
X(* return the next pid the system will use for a new process *)
XPROCEDURE NextPid(): INTEGER;
X
X(* tell scheduler not to run this process but keep in memory *)
XPROCEDURE SleepProcess(VAR id: INTEGER);
X
X(* tell scheduler tp sleep for msec 1000th of a second  *)
XPROCEDURE DozeProcess(VAR id: INTEGER; VAR msec: LONGCARD);
X
X(* Sleep process until the contents of 'loc' equals 'value AND mask'.
Xmsec is the timeout value in milliseconds if set the 0 it waits forever *)
XPROCEDURE WaitProcess(VAR id: INTEGER; VAR loc: ADDRESS;
X                      VAR value,mask,msec: LONGCARD);
X
X(* tell scheduler to start running this process again if it was sleeping
X   before *)
XPROCEDURE WakeupProcess(VAR id: INTEGER);
X
X(* change process priority *)
XPROCEDURE ChangeProcessPriority(VAR id: INTEGER; VAR pri: INTEGER);
X
X(* turn on the scheduler interrupt, and start normal process switching *)
XPROCEDURE MultiBegin;
X
X(* turn off the scheduler interrupt, used to stop process switching in
X   section of code that should not be swapped out *)
XPROCEDURE MultiEnd;
X
XEND               SYSCALL.
SHAR_EOF
chmod 0600 SYSCALL.DEF || echo "restore of SYSCALL.DEF fails"
sed 's/^X//' << 'SHAR_EOF' > SYSCALL.MOD &&
X
X(*              Copyright 1987 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      12/8/87-FGB             *)
X(* Added variable parm to StartProcess to pass info to process  *)
X(* in currentprocess.gemsave[15]        1/1/88-FGB              *)
X(* Fixed SpintInfo to give info anytime. It was giving info     *)
X(* only after a spint was enabled before it was executed.       *)
X(*                                      5/21/88-FGB             *)
X(*                                                              *)
X
X(*$S-,$T- *)
XIMPLEMENTATION MODULE  SYSCALL;
XFROM    ATOMIC  IMPORT  sysvariable,CheckFlag,SetFlag,MAGIC,SIGNAL,
X                        spinttype;
XFROM    XBIOS   IMPORT  SuperExec;
XFROM    SYSTEM  IMPORT  CODE,ADDRESS;
XFROM    GEMX    IMPORT  BasePageAddress;
XFROM    GEMDOS  IMPORT  GetPath,GetDrv,Super;
XFROM    Strings IMPORT  String;
X
XVAR     sysvar                  :       sysvariable;
X        sysvector [144H]        :       POINTER TO sysvariable;
X        goodbye                 :       BOOLEAN;
X        i,wait,drv              :       CARDINAL;
X        currentprocess          :       SIGNAL;
X        ssv                     :       ADDRESS;
X
X(*$P- *)
XPROCEDURE       submit;
XBEGIN
X        sysvar:=sysvector^;
X        CODE(4e75H); (* rts *)
XEND     submit;
X(*$P+ *)
X
XPROCEDURE       SysCmd;
XBEGIN
X        MultiEnd;
X        SuperExec(submit); 
X
X        FOR i:=1 TO 79 DO
X            sysvar.command^[i-1]:=BasePageAddress^.CmdLine[i];
X        END;
X        sysvar.command^[ORD(BasePageAddress^.CmdLine[0])]:=CHAR(0);
X
X        MultiBegin;
X        (* wait until no commands are being executed *)
X        REPEAT
X        UNTIL NOT CheckFlag(sysvar.request^.req);
X        MultiEnd;
X
X        (* tell SCHED that we want him to show his face *)
X        sysvar.request^.magic:=MAGIC;
X        currentprocess:=sysvar.currentprocess^;
X        sysvar.request^.pid:=currentprocess^.pid;
X        GetPath(currentprocess^.ipenvstr,0);
X        GetDrv(drv);
X        currentprocess^.flags[0]:=LONGCARD(drv);
X        SetFlag(sysvar.request^.req);
X        MultiBegin;
XEND     SysCmd;
X
XPROCEDURE       SysReq(VAR command: ARRAY OF CHAR);
XBEGIN
X        MultiEnd;
X        SuperExec(submit); 
X
X        FOR i:=0 TO HIGH(command)-1 DO
X            sysvar.command^[i]:=command[i];
X        END;
X        sysvar.command^[HIGH(command)]:=0C;
X
X        MultiBegin;
X        (* wait until no commands are being executed *)
X        REPEAT
X        UNTIL NOT CheckFlag(sysvar.request^.req);
X
X        (* tell SCHED that we want him to show his face *)
X        sysvar.request^.magic:=MAGIC;
X        currentprocess:=sysvar.currentprocess^;
X        sysvar.request^.pid:=currentprocess^.pid;
X        GetPath(currentprocess^.ipenvstr,0);
X        GetDrv(drv);
X        currentprocess^.flags[0]:=LONGCARD(drv);
X        SetFlag(sysvar.request^.req);
X        MultiBegin;
XEND     SysReq;
X
XPROCEDURE       SysDes(VAR cp: SIGNAL);
XBEGIN
X        SuperExec(submit); 
X        cp:=sysvar.currentprocess^;
XEND     SysDes;
X
XPROCEDURE       SysVar(VAR sv: sysvariable);
XBEGIN
X        SuperExec(submit); 
X        sv:=sysvar;
XEND     SysVar;
X
XPROCEDURE       ProcessPid(): INTEGER;
XBEGIN
X        SuperExec(submit);
X        SysVar(sysvar);
X        currentprocess:=sysvar.currentprocess^;
X        RETURN currentprocess^.pid;
XEND             ProcessPid;
X
XPROCEDURE       Sleep;
XVAR             pid      :       INTEGER;
XBEGIN
X        pid:=ProcessPid();
X        SleepProcess(pid);
XEND     Sleep;
X
XPROCEDURE       FindProcess(pid: INTEGER; cp: SIGNAL): SIGNAL;
XVAR             s                :         SIGNAL;
XBEGIN
X        s:=cp;
X        LOOP                    (* find  process id *)
X          s:=s^.next;
X          IF s^.pid=pid THEN     (* found id *)
X             RETURN s;
X          END;
X          IF s^.pid=cp^.pid THEN      (* id not found in list *)
X             RETURN NIL;
X          END;
X        END;
XEND     FindProcess;
X
XPROCEDURE       CheckSpint;
XBEGIN
X        SuperExec(submit);
X
X        FOR i:=0 TO 15 DO (* check all spints and run if set *)
X            IF (i IN sysvar.spintenable^)
X               AND (i IN sysvar.spintmask^) 
X               AND (ADDRESS(sysvar.spint^[i].proc)#NIL) THEN
X               sysvar.spint^[i].proc;
X            END;
X            EXCL(sysvar.spintenable^,i); (* clear flag after complete *)
X        END;
XEND     CheckSpint;
X
XPROCEDURE       EnableSpint(spintid: CARDINAL; routine: PROC;
X                            data: ADDRESS): BOOLEAN;
XBEGIN
X        SuperExec(submit);
X
X        IF spintid>15 THEN RETURN FALSE END;
X        sysvar.spint^[spintid].proc:=routine;
X        sysvar.spint^[spintid].data:=data;
X        INCL(sysvar.spintmask^,spintid);
X        RETURN TRUE;
XEND     EnableSpint;
X
XPROCEDURE       SpintInfo(spintid: CARDINAL; VAR data: ADDRESS): BOOLEAN;
XBEGIN
X        SuperExec(submit);
X        IF spintid>15 THEN RETURN FALSE END;
X        data:=sysvar.spint^[spintid].data;
X        IF ADDRESS(sysvar.spint^[spintid].proc)#NIL THEN
X           RETURN TRUE;
X        ELSE;
X           data:=NIL;
X           RETURN FALSE;
X        END;
XEND     SpintInfo;
X
XPROCEDURE       DisableSpint(spintid: CARDINAL);
XBEGIN
X        SuperExec(submit);
X
X        IF spintid>15 THEN RETURN END;
X        sysvar.spint^[spintid].proc:=PROC(NIL);
X        EXCL(sysvar.spintenable^,spintid);
X        EXCL(sysvar.spintmask^,spintid);
XEND     DisableSpint;
X
XPROCEDURE       HoldSpint(spintid: CARDINAL);
XBEGIN
X        SuperExec(submit);
X
X        IF spintid>15 THEN RETURN END;
X        EXCL(sysvar.spintmask^,spintid);
XEND     HoldSpint;
X
XPROCEDURE       ReleaseSpint(spintid: CARDINAL);
XBEGIN
X        SuperExec(submit);
X
X        IF spintid>15 THEN RETURN END;
X        INCL(sysvar.spintmask^,spintid);
XEND     ReleaseSpint;
X
XPROCEDURE       IntDelay(tick: LONGINT): INTEGER;
XVAR             cp      :       SIGNAL;
XBEGIN
X        SysDes(cp);
X        cp^.active:=FALSE; (* put process to sleep *)
X        MultiBegin;
X        REPEAT
X        UNTIL cp^.active; (* wait until active *)
XEND     IntDelay;
X
XPROCEDURE       Trigger(spintid: CARDINAL): BOOLEAN;
XBEGIN
X        SuperExec(submit);
X
X        IF spintid>15 THEN RETURN FALSE END;
X        INCL(sysvar.spintenable^,spintid);
X        RETURN TRUE;
XEND     Trigger;
X
XPROCEDURE StartProcess(VAR P: PROC; 
X                       VAR n: LONGCARD; 
X                       VAR priority: INTEGER; 
X                       VAR pn: String;
X                       VAR parm: ADDRESS);
XBEGIN
X        SuperExec(submit);
X        currentprocess:=sysvar.currentprocess^;
X        sysvar.request^.pid:=currentprocess^.pid;
X        sysvar.StartProcess(P,n,priority,pn,parm);
XEND     StartProcess;
X
XPROCEDURE SwapProcess;
XBEGIN
X        SuperExec(submit);
X        sysvar.SwapProcess;
XEND     SwapProcess;
X
XPROCEDURE TermProcess(VAR id: INTEGER);
XBEGIN
X        SuperExec(submit);
X        sysvar.TermProcess(id);
XEND     TermProcess;
X
XPROCEDURE NextPid(): INTEGER;
XVAR     Pid     :       INTEGER;
XBEGIN
X        SuperExec(submit);
X        Pid:=sysvar.NextPid();
X        RETURN Pid;
XEND     NextPid;
X
XPROCEDURE SleepProcess(VAR id: INTEGER);
XBEGIN
X        SuperExec(submit);
X        sysvar.SleepProcess(id);
XEND     SleepProcess;
X
XPROCEDURE DozeProcess(VAR id: INTEGER; VAR msec: LONGCARD);
XBEGIN
X        SuperExec(submit);
X        sysvar.DozeProcess(id,msec);
XEND     DozeProcess;
X
XPROCEDURE WaitProcess(VAR id: INTEGER; VAR loc: ADDRESS;
X                      VAR value,mask,msec: LONGCARD);
XBEGIN
X        SuperExec(submit);
X        sysvar.WaitProcess(id,loc,value,mask,msec);
XEND     WaitProcess;
X
XPROCEDURE WakeupProcess(VAR id: INTEGER);
XBEGIN
X        SuperExec(submit);
X        sysvar.WakeupProcess(id);
XEND     WakeupProcess;
X
XPROCEDURE ChangeProcessPriority(VAR id: INTEGER; VAR pri: INTEGER);
XBEGIN
X        SuperExec(submit);
X        sysvar.ChangeProcessPriority(id,pri);
XEND     ChangeProcessPriority;
X
XPROCEDURE MultiBegin;
XBEGIN
X        SuperExec(submit);
X        sysvar.MultiBegin;
XEND     MultiBegin;
X
XPROCEDURE MultiEnd;
XBEGIN
X        SuperExec(submit);
X        sysvar.MultiEnd;
XEND     MultiEnd;
X
XBEGIN
XEND     SYSCALL.
X
SHAR_EOF
chmod 0600 SYSCALL.MOD || echo "restore of SYSCALL.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > XA.MOD &&
XMODULE  xa;
XFROM    SYSCALL         IMPORT  SpintInfo,Trigger;
XFROM    GEMDOS          IMPORT  Term;
XFROM    Terminal        IMPORT  WriteString,WriteLn;
XVAR     spintcmd        :       POINTER TO ARRAY [0..2] OF LONGCARD;
X        ok              :       BOOLEAN;
XBEGIN
X        IF SpintInfo(1,spintcmd) THEN
X           spintcmd^[0]:=99;
X           ok:=Trigger(1);
X        ELSE
X           WriteLn;
X           WriteString("Background xmodem not running");
X           WriteLn;
X           ok:=Term(-1);
X        END;
X        ok:=Term(0);
XEND     xa.
SHAR_EOF
chmod 0600 XA.MOD || echo "restore of XA.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > XMODEM.DEF &&
X
X(*              Copyright 1987 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      12/8/87-FGB             *)
X(*                                                              *)
X
XDEFINITION MODULE XMODEM;
XFROM       Strings  IMPORT    String;
XVAR     xmodemerror     :       INTEGER; (* xmodem errors *)
X        xmodemabort     :       BOOLEAN; (* timeout or abort flag *)
X        crcmode         :       BOOLEAN; (* set crc or checksum *)
X        xfrname         :       String;
X        mdmPacketsSent          :       INTEGER;
X        mdmPacketsReceived      :       INTEGER;
X        mdmBadPackets           :       INTEGER;
X        mdmNakedPackets         :       INTEGER;
X        mdmBytesXferred         :       LONGCARD;
X        endblk                  :       INTEGER;
X
XPROCEDURE       xmodemrec(filename: ARRAY OF CHAR): BOOLEAN;
XPROCEDURE       xmodemsnd(filename: ARRAY OF CHAR): BOOLEAN;
XPROCEDURE       xmodemstat;
X
XEND  XMODEM.
SHAR_EOF
chmod 0600 XMODEM.DEF || echo "restore of XMODEM.DEF fails"
sed 's/^X//' << 'SHAR_EOF' > XMODEM.MOD &&
X
X(*              Copyright 1987 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      12/8/87-FGB             *)
X(*   Minor fixups                       3/7/88-FGB              *)
X(*                                                              *)
X
X(*$T-,$S-,$A+ *)
X(* This version of xmodem has been written using UNIX and the sealink
X   C programming versions as examples. Many thanks to those who have done
X   this before me.        Fred Brooks                                   *)
X
XIMPLEMENTATION MODULE XMODEM;
XFROM SYSTEM     IMPORT ADDRESS, CODE, REGISTER, SETREG, ADR, WORD;
XFROM GEMX       IMPORT BasePageAddress, BasePageType ;
XFROM BIOS       IMPORT BConStat, BCosStat, BConIn, BConOut, Device;
XFROM XBIOS      IMPORT SuperExec;
XFROM GEMDOS     IMPORT Create, Open, Close, Write, Read, GetDTA, SFirst;
XFROM TextIO     IMPORT WriteString, WriteLn, WriteInt,  WriteAdr;
XFROM BitStuff   IMPORT WAnd, WEor, WShl, WShr;
XFROM Strings    IMPORT String, Assign;
X
XTYPE            CharPtr       =          POINTER TO ARRAY [0..MAX(LONGINT)] OF CHAR;
X
XCONST           SECSIZ        =          80H;
X                BUFSIZ        =          200H;
X                ERRORMAX      =          20;
X                RETRYMAX      =          20;
X                SOH           =          1c;
X                EOT           =          4c;
X                ACK           =          6c;
X                NAK           =          25c;
X                C             =          103c;
X                RTS           =          4e75H;
X                BELL          =          7c;
X                CTRLZ         =          32c;
X
XVAR             result,mtimeout         :       INTEGER;
X                filename                :       String;
X                hz200 [04baH]           :       LONGCARD;
X                t1,prtime               :       LONGCARD;
X                readchar                :       CHAR;
X                filesize                :       POINTER TO LONGCARD;
X                snd,rec,ok              :       BOOLEAN;
X
X(*$P- *)
XPROCEDURE       rdtime();       (* read 200hz clock *)
XBEGIN
X        prtime:=hz200;
X        CODE(RTS);
XEND             rdtime;
X(*$P+ *)
X
XPROCEDURE       GetTime(): LONGCARD;
XBEGIN
X        SuperExec(rdtime);
X        RETURN prtime;
XEND             GetTime;
X
XPROCEDURE       timerset(time: INTEGER): LONGCARD;
XBEGIN
X        RETURN (LONGCARD(time)+(GetTime() DIV 20));
XEND             timerset;
X
XPROCEDURE       timeup(timer: LONGCARD): BOOLEAN;
XBEGIN
X        IF ((GetTime() DIV 20)>timer) OR ((GetTime() DIV 20)=timer) THEN
X           RETURN TRUE;
X        ELSE
X           RETURN FALSE;
X        END;
XEND             timeup;
X
XPROCEDURE       errorbells;
XVAR             i,delay        :       CARDINAL;
XBEGIN
X           FOR i:=0 TO 3 DO
X               FOR delay:=0 TO 10000 DO END;
X               BConOut(CON,BELL);
X           END;
XEND             errorbells;
X
XPROCEDURE       crcupdate(crcvalue: CARDINAL; data: CHAR): CARDINAL;
XCONST           GEN1X5X12X16                  =     1021H;
XVAR             i,xin,cha                     :     INTEGER;
X                t                             :     CARDINAL;
XBEGIN
X        cha:=INTEGER(data);
X        FOR i:=0 TO 7 DO
X            xin:=INTEGER(WAnd(crcvalue,8000H));
X            cha:=INTEGER(WShl(cha,1));
X            IF INTEGER(WAnd(cha,100H))#0 THEN
X               t:=crcvalue;
X               crcvalue:=1+CARDINAL(WShl(t,1));
X            ELSE
X               t:=crcvalue;
X               crcvalue:=0+CARDINAL(WShl(t,1));
X            END;
X            IF xin#0 THEN 
X               crcvalue:=CARDINAL(WEor(crcvalue,GEN1X5X12X16));
X            END;
X        END;
X        RETURN crcvalue;
XEND             crcupdate;
X
XPROCEDURE       crcfinish(crcvalue: CARDINAL): CARDINAL;
XBEGIN
X        RETURN CARDINAL(WAnd(crcupdate(crcupdate(crcvalue,0c),0c),0ffffH));
X
X
XEND             crcfinish;
X
XPROCEDURE       IAnd255(num: INTEGER): INTEGER;
XBEGIN
X        RETURN INTEGER(WAnd(num,0ffH));
XEND             IAnd255;
X
XPROCEDURE       mdmini;
XBEGIN
X        ok:=FALSE;
X        xmodemerror:=0;
X        xmodemabort:=FALSE;
X        mtimeout:=120;
X        mdmBytesXferred:=0;
X        mdmPacketsSent:=0;
X        mdmPacketsReceived:=0;
X        mdmBadPackets:=0;
X        mdmNakedPackets:=0;
XEND             mdmini;
X
XPROCEDURE       xmodemstat;
XBEGIN
X        WriteLn;
X        WriteString("      XMODEM STATUS       ");
X        IF rec THEN 
X           WriteString(" receiver active       ");
X           WriteString(xfrname);
X           IF crcmode THEN
X              WriteString(" CRC mode.");
X           ELSE
X              WriteString(" CHECKSUM mode.");
X           END;
X        END;
X        IF snd THEN 
X           WriteString(" transmitter active    "); 
X           WriteString(xfrname);
X           IF crcmode THEN
X              WriteString(" CRC mode.");
X           ELSE
X              WriteString(" CHECKSUM mode.");
X           END;
X        END;
X        WriteLn;
X        IF ok THEN
X           WriteString("       Transfer complete.  ");
X           WriteLn;
X        END;
X        IF xmodemerror#0 THEN
X           WriteString("       Transfer aborted!  ");
X           errorbells;
X           WriteLn;
X        END;
X        WriteLn;
X        WriteString(" Total packets sent  ");
X        WriteInt(mdmPacketsSent,12);
X        WriteLn;
X        WriteString(" Packets left        ");
X        WriteInt(endblk,12);
X        WriteLn;
X        WriteString(" Packets received    ");
X        WriteInt(mdmPacketsReceived,12);
X        WriteLn;
X        WriteString(" Bad packets         ");
SHAR_EOF
echo "End of part 7, continue with part 8"
echo "8" > s2_seq_.tmp
exit 0