[comp.sources.atari.st] v01i086: mx2v230 -- Multitasking kernel with utilities part06/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 86
Archive-name: mx2v230/part06

#!/bin/sh
# this is part 6 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file PASSWD.MOD continued
#
CurArch=6
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' >> PASSWD.MOD
X           black:=user[index];
X           crypt(input,black);
X           IF (Compare(black,password[index])=Equal) AND userfound THEN
X              EXIT;
X           END;
X           END;
X           IF (password[index][0]=0c) AND userfound THEN EXIT END;
X           WriteString("Incorrect Password not changed!");
X           WriteLn;
X           OldTerm;
X        END; (* loop *)
X        REPEAT
X        WriteString("New Password: ");
X        DoWrite:=noecho;
X        ReadString(password[index]);
X        DoWrite:=normal;
X        WriteLn;
X        IF Length(password[index])<4 THEN
X           WriteString("Password too short. Please use a longer password.");
X           WriteLn;
X        END;
X        UNTIL (Length(password[index])>=4);
X        black:=user[index];
X        crypt(password[index],black);
X        password[index]:=black;
X        ok:=Delete("passwd.old");
X        Rename("passwd","passwd.old");
X        ok:=Delete("passwd");
X        TextIO.SetDefaultIO("PASSWD",READWRITE,result);
X        FOR i:=0 TO USERS-1 DO               (* Write passwd file *)
X            IF user[i][0]#0c THEN
X                TextIO.WriteString(user[i]);
X                TextIO.Write(':');
X                TextIO.WriteString(password[i]);
X                TextIO.Write(':');
X                TextIO.WriteString(path[i]);
X                TextIO.Write(':');
X                TextIO.WriteString(prg[i]);
X                TextIO.Write(':');
X                TextIO.WriteString(com[i]);
X                TextIO.WriteLn;
X            END;
X        END; (* for *)
X        CloseStream(TextIO.in,result);
X        CloseStream(TextIO.out,result);
X        OldTerm;
XEND     PASSWD.
X
SHAR_EOF
chmod 0600 PASSWD.MOD || echo "restore of PASSWD.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > PIPE.DEF &&
X
X(*              Copyright 1987 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      12/8/87-FGB             *)
X(* Correct Bad error in PipeOpen causing pipe to be closed if   *)
X(* this routine is called               12/14/87-FGB            *)
X(*                                                              *)
X
XDEFINITION MODULE PIPE;
XFROM       SYSTEM       IMPORT  BYTE,WORD,LONGWORD;
X
XPROCEDURE OpenPipe(pipeName: ARRAY OF CHAR): LONGCARD; (* return pipe id *)
XPROCEDURE IsReadable(pipeid: LONGCARD): BOOLEAN;
XPROCEDURE IsWriteable(pipeid: LONGCARD): BOOLEAN;
XPROCEDURE ClosePipe(pipeid: LONGCARD);
XPROCEDURE PipeOpen(pipeid: LONGCARD): BOOLEAN;
X
XPROCEDURE PWriteByte(pipeid: LONGCARD; byte: BYTE): BOOLEAN;
XPROCEDURE PWriteWord(pipeid: LONGCARD; word: WORD): BOOLEAN;
XPROCEDURE PWriteLongWord(pipeid: LONGCARD; longword: LONGWORD): BOOLEAN;
X
XPROCEDURE PReadByte(pipeid: LONGCARD; VAR byte: BYTE): BOOLEAN;
XPROCEDURE PReadWord(pipeid: LONGCARD; VAR word: WORD): BOOLEAN;
XPROCEDURE PReadLongWord(pipeid: LONGCARD; VAR longword: LONGWORD): BOOLEAN;
XEND               PIPE.
SHAR_EOF
chmod 0600 PIPE.DEF || echo "restore of PIPE.DEF fails"
sed 's/^X//' << 'SHAR_EOF' > PIPE.MOD &&
X
X(*              Copyright 1987 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      12/8/87-FGB             *)
X(* Correct Bad error in PipeOpen causing pipe to be closed if   *)
X(* this routine is called               12/14/87                *)
X(*                                                              *)
X
X(*$S-,$T- *)
XIMPLEMENTATION MODULE PIPE [7];
XFROM    SYSTEM    IMPORT   BYTE,WORD,LONGWORD,ADDRESS,TSIZE,ADR;
XFROM    ATOMIC    IMPORT   pipetype,sysvariable,PIPE,pipeptr,buflength;
XFROM    SYSCALL   IMPORT   SysVar;
XFROM    Storage   IMPORT   ALLOCATE,DEALLOCATE;
XFROM    Strings   IMPORT   Assign,Compare,CompareResults;
XFROM    TextIO    IMPORT   WriteString,WriteLn,ReadLn;
XCONST             bufend = buflength-1;
XVAR               pipe1,pipe          :       pipeptr;
X                  junk                :       BYTE;
X                  pipespointer        :       POINTER TO pipetype;
X                  sysvar              :       sysvariable;
X                  I                   :       CARDINAL;
X                  found               :       BOOLEAN;
X                b                :         POINTER TO ARRAY [0..1] OF BYTE;
X                d                :         CARDINAL;
X                b1              :         POINTER TO ARRAY [0..3] OF BYTE;
X             newpipeptr         :     pipeptr;
X
XPROCEDURE       PWriteByte(p: LONGCARD; b: BYTE): BOOLEAN;
XBEGIN
X        IF NOT PipeOpen(p) THEN RETURN FALSE END;
X        pipe:=pipeptr(p);
X        IF (NOT (pipe^.cnt < buflength)) THEN RETURN FALSE END;
X        deposit(pipe,b);
X        RETURN TRUE;
XEND     PWriteByte;
X
XPROCEDURE       PReadByte(p: LONGCARD; VAR b: BYTE): BOOLEAN;
XBEGIN
X        IF NOT PipeOpen(p) THEN RETURN FALSE END;
X        pipe:=pipeptr(p);
X        IF (NOT (pipe^.cnt > 0)) THEN RETURN FALSE END;
X        b:=withdraw(pipe);
X        RETURN TRUE;
XEND     PReadByte;
X
XPROCEDURE       PWriteWord(p: LONGCARD; w: WORD): BOOLEAN;
XBEGIN
X        IF NOT PipeOpen(p) THEN RETURN FALSE END;
X        pipe:=pipeptr(p);
X        IF (NOT (pipe^.cnt < buflength-1)) THEN RETURN FALSE END;
X        b:=ADR(w);
X        FOR d:=0 TO 1 DO
X            deposit(pipe,b^[d]);
X        END;
X        RETURN TRUE;
XEND     PWriteWord;
X
XPROCEDURE       PReadWord(p: LONGCARD; VAR w: WORD): BOOLEAN;
XBEGIN
X        IF NOT PipeOpen(p) THEN RETURN FALSE END;
X        pipe:=pipeptr(p);
X        IF (NOT (pipe^.cnt > 1)) THEN RETURN FALSE END;
X        b:=ADR(w);
X        FOR d:=0 TO 1 DO
X            b^[d]:=withdraw(pipe);
X        END;
X        RETURN TRUE;
XEND     PReadWord;
X
XPROCEDURE       PWriteLongWord(p: LONGCARD; lw: LONGWORD): BOOLEAN;
XBEGIN
X        IF NOT PipeOpen(p) THEN RETURN FALSE END;
X        pipe:=pipeptr(p);
X        IF (NOT (pipe^.cnt < buflength-3)) THEN RETURN FALSE END;
X        b1:=ADR(lw);
X        FOR d:=0 TO 3 DO
X            deposit(pipe,b1^[d]);
X        END;
X        RETURN TRUE;
XEND     PWriteLongWord;
X
XPROCEDURE       PReadLongWord(p: LONGCARD; VAR lw: LONGWORD): BOOLEAN;
XBEGIN
X        IF NOT PipeOpen(p) THEN RETURN FALSE END;
X        pipe:=pipeptr(p);
X        IF (NOT (pipe^.cnt > 3)) THEN RETURN FALSE END;
X        b1:=ADR(lw);
X        FOR d:=0 TO 3 DO
X            b1^[d]:=withdraw(pipe);
X        END;
X        RETURN TRUE;
XEND     PReadLongWord;
X
XPROCEDURE      deposit(VAR tpipe: pipeptr; byte: BYTE);
XBEGIN
X        IF tpipe^.cnt < buflength THEN
X           INC(tpipe^.cnt);
X        ELSE
X           (* pipe full *)
X           RETURN;
X        END;
X        tpipe^.buf[tpipe^.bufhead]:=byte;
X        IF tpipe^.bufhead=bufend THEN
X           tpipe^.bufhead:=0;
X        ELSE
X           INC(tpipe^.bufhead);
X        END;
XEND     deposit;
X
XPROCEDURE      withdraw(VAR tpipe: pipeptr): BYTE;
XBEGIN
X        IF tpipe^.cnt > 0 THEN
X           DEC(tpipe^.cnt);
X        ELSE
X           (* pipe EMPTY *)
X           RETURN BYTE(0);
X        END;
X        IF tpipe^.buftail = bufend THEN
X           tpipe^.buftail:=0;
X        ELSE
X           INC(tpipe^.buftail);
X        END;
X        RETURN tpipe^.buf[tpipe^.buftail];
XEND     withdraw;
X
XPROCEDURE       OpenPipe(pipeName: ARRAY OF CHAR): LONGCARD;
XBEGIN
X        SysVar(sysvar);
X        pipespointer:=ADDRESS(sysvar.pipes);
X
X        I:=0;   (* look for pipe name in system pipe list *)
X        found:=FALSE;
X        WHILE (I#32) AND (pipespointer^[I]#NIL) DO
X              newpipeptr:=pipespointer^[I];
X              INC(I);
X              IF Compare(pipeName,newpipeptr^.pipename)=Equal THEN
X                 I:=32;
X                 found:=TRUE;
X              END;
X        END;
X
X        IF (NOT found) THEN
X           ALLOCATE(newpipeptr,LONGCARD(TSIZE(PIPE)));
X           Assign(newpipeptr^.pipename,pipeName);
X           newpipeptr^.bufhead:=0;
X           newpipeptr^.buftail:=bufend;
X           newpipeptr^.cnt:=0;
X           newpipeptr^.bufsize:=buflength;
X
X           (* put address of pipe in system list *)
X           I:=0;
X           LOOP
X                IF I=32 THEN HALT END;
X                IF pipespointer^[I]=NIL THEN
X                   pipespointer^[I]:=newpipeptr;
X                   EXIT;
X                END; 
X                INC(I);
X           END;
X        END;
X        RETURN LONGCARD(newpipeptr);
XEND     OpenPipe;
X
XPROCEDURE       ClosePipe(p: LONGCARD);
XVAR             pipe          :     pipeptr;
XBEGIN
X           pipe:=pipeptr(p);
X           SysVar(sysvar);
X           pipespointer:=ADDRESS(sysvar.pipes);
X
X           (* find address of pipe in system list *)
X           found:=FALSE;
X           I:=0;
X           LOOP
X                IF I=32 THEN EXIT END;
X                IF pipespointer^[I]=pipe THEN
X                   pipespointer^[I]:=NIL;
X                   found:=TRUE;
X                   EXIT;
X                END; 
X                INC(I);
X           END;
X
X        IF found THEN
X           DEALLOCATE(pipe,LONGCARD(TSIZE(PIPE)));
X        END;
XEND     ClosePipe;
X
XPROCEDURE       PipeOpen(p: LONGCARD): BOOLEAN;
XVAR             pipe          :     pipeptr;
XBEGIN
X           pipe:=pipeptr(p);
X           SysVar(sysvar);
X           pipespointer:=ADDRESS(sysvar.pipes);
X
X           (* find address of pipe in system list *)
X           I:=0;
X           LOOP
X                IF I=32 THEN RETURN FALSE END;
X                IF pipespointer^[I]=pipe THEN
X                   RETURN TRUE;
X                END; 
X                INC(I);
X           END;
XEND     PipeOpen;
X
XPROCEDURE       IsReadable(p: LONGCARD): BOOLEAN;
XBEGIN
X        pipe:=pipeptr(p);
X        IF pipe^.cnt > 0 THEN
X           RETURN TRUE;
X        ELSE
X           RETURN FALSE;
X        END;
XEND     IsReadable;
X
XPROCEDURE       IsWriteable(p: LONGCARD): BOOLEAN;
XBEGIN
X        pipe:=pipeptr(p);
X        IF pipe^.cnt < buflength THEN
X           RETURN TRUE;
X        ELSE
X           RETURN FALSE;
X        END;
XEND     IsWriteable;
X
XBEGIN
XEND                   PIPE.
SHAR_EOF
chmod 0600 PIPE.MOD || echo "restore of PIPE.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > PS.MOD &&
X(*$T-,$S-,$A+ *)
XMODULE  ps;
XFROM    SYSCALL IMPORT  SysVar,SysDes;
XFROM    GEMDOS  IMPORT  OldTerm,GetTime,GetDate,Alloc,Write;
XFROM    GEMX    IMPORT  BasePageAddress;
XFROM    SYSTEM  IMPORT  CODE,ADDRESS,ADR;
XFROM    Terminal        IMPORT  WriteString,WriteLn;
XFROM    XBIOS           IMPORT  SuperExec;
XFROM    ATOMIC          IMPORT  VERSION,SIGNAL,sysvariable,devicetype;
XFROM    Strings         IMPORT  String,Concat,Copy,Length;
XFROM    Conversions     IMPORT  ConvertToString;
XFROM    M2Conversions   IMPORT  ConvertCardinal,ConvertReal;
XFROM    BitStuff        IMPORT  WAnd,WShr;
XFROM    SCANNER         IMPORT  scinit,nxparm,ltext,etext,bkparm;
XFROM    TermBase        IMPORT  DoWrite,WriteProc;
X
XCONST
X  SPACES   = "                                                        ";
X  TITLE1 = "       ";
X  TITLE2 = " Copyright LogicTek 1987,1988 Fred Brooks ";
X  PS1      =
X"  current            system    user      total CPU    total context  CRON";
X  PS2      =
X"  time     date      memory    memory    time         switches       timer";
X  PS3      =
X"  Name           PID PPID Status Pri Init Time          CPU time    PORT";
XVAR     temp,pstemp             :       String;
X        time,date               :       CARDINAL;
X        membot [432H]           :       LONGCARD;
X        memtop [436H]           :       LONGCARD;
X        hz200  [4baH]           :       LONGCARD;
X        s0,currentprocess       :       SIGNAL;
X        sysvar                  :       sysvariable;
X        done,dmode,stmode       :       BOOLEAN;
X        temphz200,topusermem,botusermem,usermemleft,memreserve
X                                :       LONGCARD;
X
X
XPROCEDURE       FileWrite(char: CHAR);
XVAR     writecount      :       LONGCARD;
XBEGIN
X        writecount:=1;
X        Write(1,writecount,ADR(char));
XEND             FileWrite;
X
X(*$P- *)
XPROCEDURE       showmemory;
XVAR             memsize :       ADDRESS;
XBEGIN
X        topusermem:=memtop;
X        botusermem:=membot;
X        temphz200:=hz200;
X        Alloc(LONGCARD(-1),memsize);
X        usermemleft:=LONGCARD(memsize);
X        CODE(4e75H); (* rts *)
XEND     showmemory;
X(*$P+ *)
X
X(*$P- *)
XPROCEDURE       gettick;
XBEGIN
X        temphz200:=hz200;
X        CODE(4e75H); (* rts *)
XEND     gettick;
X(*$P+ *)
X
X
XPROCEDURE       FormatTD(time: CARDINAL; date: CARDINAL);
XBEGIN
X           ConvertCardinal(CARDINAL(WShr(WAnd(time,63488),11)),2,temp);
X           WriteString(temp); (* hour *)
X           WriteString(":");
X
X           ConvertCardinal(CARDINAL(WShr(WAnd(time,2016),5)),2,temp);
X           WriteString(temp); (* minute *)
X           WriteString(":");
X
X           ConvertCardinal(2*CARDINAL(WAnd(time,31)),2,temp);
X           WriteString(temp); (* second *)
X           WriteString(" ");
X
X           ConvertCardinal(CARDINAL(WShr(WAnd(date,480),5)),2,temp);
X           WriteString(temp); (* month *)
X           WriteString("/");
X
X           ConvertCardinal(CARDINAL(WAnd(date,31)),2,temp);
X           WriteString(temp); (* day *)
X           WriteString("/");
X
X           ConvertCardinal(80+CARDINAL(WShr(WAnd(date,65024),9)),2,temp);
X           WriteString(temp); (* year *)
X           WriteString("  ");
XEND             FormatTD;
X
XPROCEDURE       showtime(tick: LONGCARD);
XVAR             sec            :        REAL;
X                min,hour       :        LONGCARD;
XBEGIN
X           sec:=FLOAT(tick);
X           sec:=sec/200.0;
X           min:=TRUNCD(sec) DIV 60;
X           hour:=min DIV 60;
X           min:=min-(hour*60);
X           ConvertToString(hour,10,FALSE,temp,done);
X           scinit(ADR(temp),SIZE(temp));
X           nxparm;
X           ltext(ADR(temp),SIZE(temp));
X           WriteString(temp);
X           WriteString(":");
X           ConvertToString(min,10,FALSE,temp,done);
X           scinit(ADR(temp),SIZE(temp));
X           nxparm;
X           ltext(ADR(temp),SIZE(temp));
X           WriteString(temp);
X           WriteString(":");
X           sec:=sec-FLOAT(min*60)-FLOAT(hour*3600);
X           ConvertReal(sec,11,3,temp);
X           scinit(ADR(temp),SIZE(temp));
X           nxparm;
X           ltext(ADR(temp),SIZE(temp));
X           WriteString(temp);
XEND             showtime;
X
X(* return time in seconds *)
XPROCEDURE       converttime(time: CARDINAL): LONGCARD;
XVAR                h,m,s           :           LONGCARD;
XBEGIN
X        h:=LONGCARD(WShr(WAnd(time,63488),11));  (* hours *)
X        m:=LONGCARD(WShr(WAnd(time,2016),5));    (* minutes *)
X        s:=2*LONGCARD(WAnd(time,31));            (* seconds *)
X        RETURN s+(m*60)+(h*3600);
XEND             converttime;
X
X
XBEGIN
X           DoWrite:=WriteProc(FileWrite);
X           IF BasePageAddress^.CmdLine[2]='z' THEN stmode:=TRUE END;
X           SysDes(currentprocess);
X           SysVar(sysvar);
X           SuperExec(showmemory); (* return memsize *)
X           WriteLn;
X           WriteString(TITLE1);
X           WriteString(VERSION);
X           WriteString(TITLE2);
X           WriteLn;
X           GetTime(time);
X           GetDate(date);
X           WriteString(PS1);
X           WriteLn;
X           WriteString(PS2);
X           WriteLn;
X           WriteString("  ");
X           FormatTD(time,date);
X           ConvertToString(topusermem,10,FALSE,temp,done);
X           Copy(SPACES,0,10-Length(temp),pstemp);
X           Concat(temp,pstemp,temp);
X           WriteString(temp);
X           ConvertToString(usermemleft,10,FALSE,temp,done);
X           Copy(SPACES,0,10-Length(temp),pstemp);
X           Concat(temp,pstemp,temp);
X           WriteString(temp);
X           showtime(temphz200-sysvar.slicebegin^);
X           WriteString("    ");
X           ConvertToString(sysvar.contextswitch^,10,FALSE,temp,done);
X           Copy(SPACES,0,14-Length(temp),pstemp);
X           Concat(temp,pstemp,temp);
X           WriteString(temp);
X           IF sysvar.CronActive^ THEN
X              WriteString("ACTIVE");
X           ELSE
X              WriteString("INACTIVE");
X           END;
X           WriteLn;
X           WriteLn;
X           WriteString(PS3);
X           WriteLn;
X
X           s0:=currentprocess;
X           REPEAT
X              IF s0^.pid#1 THEN
X                 s0:=s0^.next
X              END;
X           UNTIL s0^.pid=1;
X           REPEAT
X            WITH s0^ DO
X            IF stmode THEN
X               IF wsp=NIL THEN dmode:=TRUE ELSE dmode:=FALSE END;
X            ELSE
X               IF wsp#NIL THEN dmode:=TRUE ELSE dmode:=FALSE END;
X            END;
X            IF dmode THEN (* display *)
X              WriteString("  ");
X              Copy(SPACES,0,15-Length(name),pstemp);
X              Concat(name,pstemp,temp);
X              WriteString(temp);
X              ConvertCardinal(pid,2,temp);
X              WriteString(temp);
X              WriteString("  ");
X              ConvertCardinal(ppid,2,temp);
X              WriteString(temp);
X              WriteString("   ");
X              IF active THEN
X                 IF ready THEN
X                    WriteString("Run    ");
X                 ELSE
X                    WriteString("Ready  ");
X                 END;
X              ELSE
X                 IF wsp=NIL THEN
X                    WriteString("Inactive");
X                 ELSE
X                    WriteString("Sleep  ");
X                 END;
X              END;
X              ConvertCardinal(pri,2,temp);
X              WriteString(temp);
X              WriteString("  ");
X              FormatTD(time,date);
X              showtime(tick);
X              WriteString("  ");
X              CASE Iport OF
X                printer :       WriteString("P"); |
X                aux     :       WriteString("A"); |
X                con     :       WriteString("C"); |
X                midi    :       WriteString("M"); |
X                null    :       WriteString("N"); |
X                dev0    :       WriteString("0"); |
X                dev1    :       WriteString("1"); |
X                dev2    :       WriteString("2"); |
X                dev3    :       WriteString("3"); |
X                dev4    :       WriteString("4"); |
X                dev5    :       WriteString("5"); |
X                dev6    :       WriteString("6"); |
X                dev7    :       WriteString("7"); |
X              END;
X              WriteString("/");
X              CASE Oport OF
X                printer :       WriteString("P"); |
X                aux     :       WriteString("A"); |
X                con     :       WriteString("C"); |
X                midi    :       WriteString("M"); |
X                null    :       WriteString("N"); |
X                dev0    :       WriteString("0"); |
X                dev1    :       WriteString("1"); |
X                dev2    :       WriteString("2"); |
X                dev3    :       WriteString("3"); |
X                dev4    :       WriteString("4"); |
X                dev5    :       WriteString("5"); |
X                dev6    :       WriteString("6"); |
X                dev7    :       WriteString("7"); |
X              END;
X              WriteLn;
X            END; (* if *)
X            END; (* with *)
X              s0:=s0^.next;
X           UNTIL (s0^.pid=0);
X           WriteLn;
X           ConvertToString(sysvar.sysmemsize^,10,FALSE,temp,done);
X           WriteString("  System Process Memory Remaining ");
X           WriteString(temp);
X           WriteLn;
X           WriteLn;
X        OldTerm;
XEND     ps.
SHAR_EOF
chmod 0600 PS.MOD || echo "restore of PS.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > REDIR.MOD &&
X
X(*              Copyright 1987 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      12/8/87-FGB             *)
X(*                                                              *)
X
XMODULE redir;
X(*$T- *)
XFROM SYSTEM IMPORT ADDRESS, CODE, REGISTER, SETREG;
XFROM GEMX   IMPORT BasePageAddress, BasePageType ;
XFROM GEMDOS IMPORT TermRes;
XFROM XBIOS  IMPORT SuperExec;
XVAR         cmd,dev,a7,sr,port,oldbios  :       ADDRESS;
X            bios [0b4H]                 :       ADDRESS;
X            aline [28H]                 :       ADDRESS;
X            gem   [88H]                 :       ADDRESS;
X            char                        :       CHAR;
X
X(*$P-,$S- *)
XPROCEDURE       changedevbios;
XBEGIN
X        CODE(48e7H,0fffeH);     (* save regs *)
X        CODE(306fH,60);         (* move.w 60(a7),a0  get sr *)
X        sr:=REGISTER(8);
X        IF sr<3ffH THEN        (* called from user mode *)
X           CODE(204fH);            (* move.l a7,a0 *)
X           a7:=REGISTER(8);        (* save ssp *)
X           CODE(4e68H,2e48H);      (* move.l usp,a0  move.l a0,a7 *)
X           CODE(306fH,2);  (* move.w 2(a7),a0 *)
X           dev:=REGISTER(8);
X           CODE(306fH,0);  (* move.w 0(a7),a0 *)
X           cmd:=REGISTER(8);
X           IF (cmd=1) OR (cmd=2) OR (cmd=3) OR (cmd=8) THEN
X              IF dev=2 THEN
X                 dev:=port; (* change to port *)
X                 SETREG(8,dev);
X                 CODE(3f48H,2); (* move.w a0,2(a7) set value in stack *)
X              END;
X           END;
X           SETREG(8,a7);
X           CODE(2e48H);            (* move.l a0,a7 *)
X        ELSE                       (* called from super mode *)
X           CODE(306fH,68);  (* move.w 68(a7),a0 *)
X           dev:=REGISTER(8);
X           CODE(306fH,66);  (* move.w 66(a7),a0 *)
X           cmd:=REGISTER(8);
X           IF (cmd=1) OR (cmd=2) OR (cmd=3) OR (cmd=8) THEN
X              IF dev=2 THEN
X                 dev:=port; (* change to port *)
X                 SETREG(8,dev);
X                 CODE(3f48H,68); (* move.w a0,68(a7) set value in stack *)
X              END;
X           END;
X        END;
X        SETREG(8,oldbios);  (* move trap adr *)
X        CODE(43faH,10); (* lea 12(pc),a1 *)
X        CODE(2288H); (* move.l a0,(a1) *)
X        CODE(4cdfH,7fffH); (* restore regs movem *)
X        CODE(4ef9H,0,0) (* jmp back to routine *)
XEND             changedevbios;
X(*$P+,$S+ *)
X        
X(*$P-,$S- *)
XPROCEDURE       dummyvector;
XBEGIN
X        CODE(4e73H); (* rte *)
XEND             dummyvector;
X(*$P+,$S+ *)
X        
X(*$P-,$S- *)
XPROCEDURE       setup;
XBEGIN
X        oldbios:=bios;
X        bios:=ADDRESS(changedevbios);
X(*        aline:=ADDRESS(dummyvector); *)
X        gem:=ADDRESS(dummyvector);
X        CODE(4e75H);    (* RTS *)
XEND             setup;
X(*$P+,$S+ *)
X        
XBEGIN;
X    char:=BasePageAddress^.CmdLine[1];
X    IF (char='m') OR (char='M') THEN
X       port:=3;   (* midi *)
X    ELSE
X       port:=1;   (* aux  *)
X    END;
X    SuperExec(setup);
X    WITH BasePageAddress^ DO
X    TermRes(CodeLen+BssLen+LONGCARD(CodeBase-ADDRESS(BasePageAddress)),0);
X    END;
XEND redir.
SHAR_EOF
chmod 0600 REDIR.MOD || echo "restore of REDIR.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > RUN.MOD &&
X
X(*              Copyright 1988 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      3/26/88-FGB             *)
X(*                                                              *)
X
XMODULE run; (* MX2 program pterm code buffer program *)
XFROM    GEMDOS  IMPORT  Term,Exec,ExecMode;
XFROM    GEMX    IMPORT  BasePageAddress;
XFROM    SCANNER IMPORT  scinit,nxparm,ltext,etext,bkparm;
XFROM    SYSTEM  IMPORT  ADR,ADDRESS;
XFROM    Strings IMPORT  String,Length,Pos,Concat;
XVAR     i                       :       INTEGER;
X        p                       :       CARDINAL;
X        ok                      :       BOOLEAN;
X        command,name,tail,temp  :       String;
XBEGIN
X        FOR i:=1 TO 79 DO
X            command[i-1]:=BasePageAddress^.CmdLine[i];
X        END;
X        command[ORD(BasePageAddress^.CmdLine[0])]:=CHAR(0);
X        scinit(ADR(command),SIZE(command));
X        nxparm;
X        ltext(ADR(name),SIZE(name));
X        nxparm;
X        etext(ADR(tail[1]),SIZE(tail));
X        bkparm;
X        etext(ADR(temp),SIZE(temp));
X        tail[0]:=CHAR(Length(temp));
X        IF Pos(name,".",0,p) THEN
X                Exec(loadExecute,name,tail,"",i);
X        ELSE
X                temp:=name;
X                Concat(name,".prg",name);
X                Exec(loadExecute,name,tail,"",i);
X                IF i=(-33) THEN
X                        name:=temp;
X                        Concat(name,".tos",name);
X                        Exec(loadExecute,name,tail,"",i);
X                END;
X                IF i=(-33) THEN
X                        name:=temp;
X                        Concat(name,".ttp",name);
X                        Exec(loadExecute,name,tail,"",i);
X                END;
X        END;
X        ok:=Term(i);
XEND     run.
X
SHAR_EOF
chmod 0600 RUN.MOD || echo "restore of RUN.MOD fails"
sed 's/^X//' << 'SHAR_EOF' > SCANNER.DEF &&
X
X(*              Copyright 1987 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      12/8/87-FGB             *)
X(*                                                              *)
X
XDEFINITION MODULE       SCANNER;
X
XFROM       SYSTEM       IMPORT  ADDRESS;
X
XTYPE    
X        modetype        =       (delimiter,register,translation);
X        modes           =       SET OF modetype;
X        scstate         =
X                RECORD
X                        return          :       LONGINT;
X                        auxreturn       :       LONGINT;
X                        disp            :       CARDINAL;
X                        prevdisp        :       CARDINAL;
X                        delim           :       ADDRESS;
X                        delimret        :       CARDINAL;
X                        bufadr          :       ADDRESS;
X                        buflen          :       CARDINAL;
X                        mode            :       modes;
X                END;
X
XVAR     state           :       scstate;
X
XPROCEDURE       scinit(bufadr: ADDRESS; buflen: CARDINAL);
XPROCEDURE       gtdisp(): CARDINAL;
XPROCEDURE       gbdisp(): CARDINAL;
XPROCEDURE       stdisp(disp: CARDINAL);
XPROCEDURE       nxparm;
XPROCEDURE       bkparm;
XPROCEDURE       dlim;
XPROCEDURE       stmode(mode: modes);
XPROCEDURE       char(VAR ch: CHAR);
XPROCEDURE       bkchar(VAR ch: CHAR);
XPROCEDURE       nxchar(VAR ch: CHAR);
XPROCEDURE       onenum;
XPROCEDURE       ltext(bufadr: ADDRESS; buflen: CARDINAL);
XPROCEDURE       etext(bufadr: ADDRESS; buflen: CARDINAL);
XEND                     SCANNER.
SHAR_EOF
chmod 0600 SCANNER.DEF || echo "restore of SCANNER.DEF fails"
sed 's/^X//' << 'SHAR_EOF' > SCANNER.MOD &&
X
X(*              Copyright 1987 fred brooks LogicTek             *)
X(*                                                              *)
X(*                                                              *)
X(*   First Release                      12/8/87-FGB             *)
X(*                                                              *)
X
XIMPLEMENTATION MODULE  SCANNER;
X(*$T-,$S-,$A+ *)
XFROM    SYSTEM  IMPORT  ADDRESS,ADR;
X
XTYPE 
X        charptr         =       POINTER TO CHAR; 
X        chset           =       SET OF CHAR;  
X(*             internal state record
X        scstate =
X                RECORD
X                        return          :       LONGINT;
X                        auxreturn       :       LONGINT;
X                        disp            :       CARDINAL;
X                        prevdisp        :       CARDINAL;
X                        delim           :       ADDRESS;
X                        delimret        :       CARDINAL;
X                        bufadr          :       ADDRESS;
X                        buflen          :       CARDINAL;
X                        mode            :       modes;
X                END;
X*)
X
XVAR     chrptr                          :       charptr;
X        cmdline,textline                :       ARRAY [0..81] OF CHAR;
X        ch                              :       CHAR;
X
XCONST   alpha   = chset{"A".."Z","a".."z"};
X        num     = chset{"+","-","0".."9"};
X(* Initialize the scanner and pass a buffer to be scanned. Only one buffer
Xmay be processed by the scanner at a time.                          *)
XPROCEDURE       scinit(bufadr: ADDRESS; buflen: CARDINAL);
XBEGIN
X        state.return:=0;
X        state.auxreturn:=0;
X        state.disp:=0;
X        state.prevdisp:=0;
X        state.delim:=NIL;
X        state.bufadr:=bufadr;
X        state.buflen:=buflen;
X        state.mode:=modes{};
X        state.delimret:=0;
XEND             scinit;
X
XPROCEDURE       gtdisp(): CARDINAL;
XBEGIN
XEND             gtdisp;
X
XPROCEDURE       gbdisp(): CARDINAL;
XBEGIN
XEND             gbdisp;
X
X(* set new value as the current scanner displacement *)
XPROCEDURE       stdisp(disp: CARDINAL);
XBEGIN
X        state.prevdisp:=state.disp;
X        IF bufeol(disp)=(-2) THEN (* past end of line *)
X           state.return:=(-2);
X        ELSE
X           state.prevdisp:=state.disp;
X           state.disp:=disp;
X           state.return:=0;
X        END;
XEND             stdisp;
X
XPROCEDURE       nxparm;
XVAR                i       :       CARDINAL;
X                   ch      :       CHAR;
XBEGIN
X        chrptr:=charptr(state.bufadr+ADDRESS(state.disp));
X        i:=state.disp;
X        LOOP
X                IF bufeol(i)<0 THEN
X                   state.return:=(-2); (* end of line *)
X                   EXIT;
X                END;
X                IF NOT delimit(chrptr^) THEN
X                   state.prevdisp:=state.disp;
X                   state.disp:=i;
X                   state.return:=0;
X                   EXIT;
X                END;
X                INC(i);
X                INC(chrptr);
X        END;
XEND             nxparm;
X
X(* return 0=not eol, -1=eol, -2=past eol *)
XPROCEDURE       bufeol(pos: CARDINAL): INTEGER;
XVAR             cptr        :          charptr;
X                eol         :          BOOLEAN;
X                i           :          CARDINAL;
XBEGIN
X        eol:=FALSE;
X        i:=0;
X        LOOP
X        cptr:=charptr(state.bufadr+ADDRESS(i));
X        IF i=state.buflen THEN
X           EXIT;
X        END;
X        IF cptr^='$' THEN (* search for " $" sequence *)
X           DEC(cptr);
X           IF cptr^=' ' THEN
X              DEC(i);
X              EXIT; (* i = eol *)
X           END;
X        END;
X        INC(i);
X        END; (* loop *)
X
X        IF (pos=i-1) THEN
X           state.delimret:=2;
X           RETURN (-1);
X        END;
X        IF (pos>i-1) THEN
X           state.delimret:=2;
X           RETURN (-2);
X        END;
X        RETURN 0;
XEND     bufeol;
X
XPROCEDURE       delimit(ch: CHAR): BOOLEAN;
XBEGIN
X        IF (ch=' ') OR (ch=CHAR(0)) THEN
X           state.delimret:=0;
X           RETURN TRUE;
X        END;
X        IF ch=',' THEN
X           state.delimret:=1;
X           RETURN TRUE;
X        END;
X        RETURN FALSE;
XEND             delimit;
X
XPROCEDURE       bkparm;
XBEGIN
X        state.disp:=state.prevdisp;
XEND             bkparm;
X
XPROCEDURE       dlim;
XBEGIN
XEND             dlim;
X
XPROCEDURE       stmode(mode: modes);
XBEGIN
XEND             stmode;
X
XPROCEDURE       char(VAR ch: CHAR);
XBEGIN
X        state.return:=0;
X        chrptr:=charptr(state.bufadr+ADDRESS(state.disp));
X        IF chrptr^#CHAR(0) THEN
X           IF state.disp<state.buflen-1 THEN
X              INC(state.disp);
X           ELSE
X              state.return:=(-2);
X           END;
X        ELSE
X           state.return:=(-2);
X        END;
X        ch:=chrptr^;
XEND             char;
X
XPROCEDURE       bkchar(VAR ch: CHAR);
XBEGIN
X        state.return:=0;
X        IF state.disp=0 THEN
X           state.return:=(-2);
X           ch:=CHAR(0);
X           RETURN;
X        END;
X        chrptr:=charptr(state.bufadr+ADDRESS(state.disp-1));
X        ch:=chrptr^;
XEND             bkchar;
X
XPROCEDURE       nxchar(VAR ch: CHAR);
XBEGIN
X        state.return:=0;
X        chrptr:=charptr(state.bufadr+ADDRESS(state.disp));
X        IF chrptr^#CHAR(0) THEN
X           IF state.disp<state.buflen-1 THEN
X           ELSE
X              state.return:=(-2);
X           END;
X        ELSE
X           state.return:=(-2);
X        END;
X        ch:=chrptr^;
XEND             nxchar;
X
XPROCEDURE       onenum;
XBEGIN
XEND             onenum;
X
XPROCEDURE       ltext(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 NOT delimit(chrptr^) 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 *)
SHAR_EOF
echo "End of part 6, continue with part 7"
echo "7" > s2_seq_.tmp
exit 0