koreth@ssyx.ucsc.edu.ucsc.edu (Steven Grimm) (12/28/88)
Submitted-by: madsen@sask.usask.ca (Jorgen Madsen) Posting-number: Volume 1, Issue 88 Archive-name: mx2v230/part08 #!/bin/sh # this is part 8 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file XMODEM.MOD continued # CurArch=8 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' >> XMODEM.MOD X WriteInt(mdmBadPackets,12); X WriteLn; X WriteString(" Naked packets sent "); X WriteInt(mdmNakedPackets,12); X WriteLn; X WriteString(" Bytes transferred "); X WriteAdr(ADDRESS(mdmBytesXferred),12); X WriteLn; XEND xmodemstat; X XPROCEDURE setbuffer(char: CharPtr; length: CARDINAL; value: CHAR); XVAR data : POINTER TO CHAR; XBEGIN X WHILE length#0 DO X data:=ADDRESS(char); X data^:=value; X INC(char); X DEC(length); X END; XEND setbuffer; X XPROCEDURE writeModem(char: CharPtr; count: LONGCARD); XVAR data : POINTER TO CHAR; XBEGIN X WHILE count#0 DO X DEC(count); X data:=ADDRESS(char); X INC(char); X X sendchar(data^); X END; XEND writeModem; X XPROCEDURE readModem(VAR char: CHAR; time: INTEGER); XVAR data : CHAR; X longchar : LONGCARD; X t : BITSET; X WaitTime : LONGCARD; X ticks : CARDINAL; XBEGIN X IF time=0 THEN X IF BConStat(AUX) THEN (* return char *) X longchar:=BConIn(AUX); X t:=BITSET(longchar); X EXCL(t,8); X char:=CHAR(t); X RETURN; X ELSE X char:=CHAR(255); X RETURN; X END; X END; X X WaitTime:=LONGCARD(time)+(GetTime() DIV 20); X ticks:=0; X LOOP X IF BConStat(AUX) THEN X longchar:=BConIn(AUX); X t:=BITSET(longchar); X EXCL(t,8); X char:=CHAR(t); X RETURN; X END; X IF ((GetTime() DIV 20)>WaitTime) X OR ((GetTime() DIV 20)=WaitTime) THEN X INC(ticks); X WaitTime:=LONGCARD(time)+(GetTime() DIV 20); X IF ticks=2 THEN X char:=CHAR(255); X RETURN; X END; X END; X END; (* loop *) XEND readModem; X XPROCEDURE flushinput(); XVAR char : LONGCARD; XBEGIN X WHILE BConStat(AUX) DO X char:=BConIn(AUX); X END; XEND flushinput; X XPROCEDURE sendchar(char: CHAR); XBEGIN X BConOut(AUX,char); XEND sendchar; X XPROCEDURE xmodemrec(filename: ARRAY OF CHAR): BOOLEAN; XVAR sectnum,sectcurr,sectcomp,fd : INTEGER; X errors : INTEGER; X firstchar : CHAR; X errorflag,goodcheck,crc1,crc2 : BOOLEAN; X checksum,j,bufptr : CARDINAL; X b : LONGCARD; X bufr : ARRAY [0..BUFSIZ] OF CHAR; XBEGIN X IF rec OR snd THEN X WriteLn; X WriteString(" XMODEM already active! "); X WriteLn; X RETURN FALSE; X END; X rec:=TRUE; X mdmini(); X SFirst(filename,0,result); X IF result=0 THEN X WriteLn; X WriteString(filename); X WriteString(" already exists! "); X WriteLn; X errorbells; X xmodemerror:=(-1); X rec:=FALSE; X RETURN FALSE; X END; X Create(filename,0,fd); X IF fd<0 THEN X WriteLn; X WriteString("GEMDOS ERROR # "); X WriteInt(fd,2); X WriteLn; X xmodemerror:=fd; X IF Close(fd) THEN END; X rec:=FALSE; X RETURN FALSE; X ELSE X Assign(xfrname,filename); X WriteString(" receiving "); X WriteString(filename); X WriteLn; X END; X(* crcmode:=TRUE; *) X sectnum:=0; errors:=0; bufptr:=0; X flushinput(); X IF crcmode THEN X sendchar(C); X ELSE X sendchar(NAK); X END; X X WHILE (firstchar#EOT) AND (errors#ERRORMAX) DO X errorflag:=FALSE; X X t1:=timerset(50); X REPEAT X readModem(readchar,5); X firstchar:=readchar; X IF xmodemabort THEN X IF Close(fd) THEN END; X xmodemerror:=(-11); X rec:=FALSE; X RETURN FALSE; X END; X IF timeup(t1) THEN X t1:=timerset(50); X flushinput(); X IF crcmode THEN X sendchar(C); X ELSE X sendchar(NAK); X END; X IF errors>ERRORMAX DIV 2 THEN crcmode:=NOT crcmode END; X INC(errors); X IF errors>ERRORMAX THEN X IF Close(fd) THEN END; X xmodemerror:=(-1); X rec:=FALSE; X RETURN FALSE; X END; X END; X UNTIL (firstchar=SOH) OR (firstchar=EOT); X X IF firstchar=SOH THEN X readModem(readchar,5); X sectcurr:=INTEGER(readchar); X readModem(readchar,5); X sectcomp:=INTEGER(readchar); X IF sectcurr+sectcomp=255 THEN X IF sectcurr=IAnd255(sectnum+1) THEN X checksum:=0; X FOR j:=bufptr TO bufptr+SECSIZ-1 DO X IF xmodemabort THEN X IF Close(fd) THEN END; X xmodemerror:=(-11); X rec:=FALSE; X RETURN FALSE; X END; X readModem(readchar,5); X bufr[j]:=readchar; X IF crcmode THEN X checksum:=crcupdate(checksum,bufr[j]); X ELSE X checksum:=checksum+CARDINAL(bufr[j]); X END; X END; (* for *) X X IF crcmode THEN X crc1:=FALSE; crc2:=FALSE; X (* X FOR j:=bufptr TO bufptr+SECSIZ-1 DO X checksum:=crcupdate(checksum,bufr[j]); X END; X *) X checksum:=crcfinish(checksum); X readModem(readchar,5); X IF readchar=CHAR(IAnd255(CARDINAL(WShr(checksum,8)))) THEN X crc1:=TRUE; X END; X readModem(readchar,5); X IF readchar=CHAR(IAnd255(checksum)) THEN X crc2:=TRUE; X END; X IF crc1 AND crc1 THEN X goodcheck:=TRUE; X ELSE X goodcheck:=FALSE; X END; X ELSE X (* X FOR j:=bufptr TO bufptr+SECSIZ-1 DO X checksum:=checksum+CARDINAL(bufr[j]); X END; X *) X readModem(readchar,5); X IF checksum=CARDINAL(readchar) THEN X goodcheck:=TRUE; X ELSE X goodcheck:=FALSE; X END; X END; X X X IF goodcheck THEN X INC(mdmPacketsReceived); X errors:=0; X INC(sectnum); X bufptr:=bufptr+SECSIZ; X mdmBytesXferred:=mdmBytesXferred+SECSIZ; X IF bufptr=BUFSIZ THEN X bufptr:=0; X b:=BUFSIZ; X Write(fd,b,ADR(bufr)); X END; X(* this is for error checking for the write *) X flushinput; X sendchar(ACK); X ELSE X INC(mdmBadPackets); X errorflag:=TRUE; X END; (* if *) X ELSE X IF sectnum=IAnd255(sectnum) THEN X flushinput; X sendchar(ACK); X ELSE X INC(mdmBadPackets); X errorflag:=TRUE; X END; X END; (* if *) X ELSE X INC(mdmBadPackets); X errorflag:=TRUE; X END; (* if *) X IF errorflag THEN X INC(errors); X flushinput; X IF crcmode THEN X sendchar(C); X ELSE X sendchar(NAK); X END; X END; X END; (* if *) X END; (* while *) X IF (firstchar=EOT) AND (errors< ERRORMAX) THEN X sendchar(ACK); X b:=LONGCARD(bufptr); X Write(fd,b,ADR(bufr)); X IF Close(fd) THEN END; X xmodemerror:=0; X rec:=FALSE; X ok:=TRUE; X RETURN TRUE; X END; X IF Close(fd) THEN END; X xmodemerror:=(-1); X rec:=FALSE; X RETURN FALSE; XEND xmodemrec; X XPROCEDURE xmodemsnd(filename: ARRAY OF CHAR): BOOLEAN; XVAR sectnum,attempts,fd : INTEGER; X checksum,j,bufptr : CARDINAL; X readchar,c,nak : CHAR; X b : LONGCARD; X dtaAdr : ADDRESS; X bufr : ARRAY [0..BUFSIZ] OF CHAR; XBEGIN X IF rec OR snd THEN X WriteLn; X WriteString(" XMODEM already active! "); X WriteLn; X RETURN FALSE; X END; X snd:=TRUE; X(* crcmode:=TRUE; *) X mdmini(); X setbuffer(ADR(bufr),BUFSIZ,0c); (* clear buffer *) X Open(filename,0,fd); X IF fd<0 THEN X WriteLn; X WriteString("GEMDOS ERROR # "); X WriteInt(fd,2); X WriteLn; X xmodemerror:=fd; X IF Close(fd) THEN END; X snd:=FALSE; X RETURN FALSE; X ELSE X GetDTA(dtaAdr); X SFirst(filename,0,result); X filesize:=dtaAdr+26; X endblk:=INTEGER(((filesize^+127) DIV 128)+1); X Assign(xfrname,filename); X WriteString(" sending "); X WriteString(filename ); X WriteInt(endblk,5); X WriteString(" block(s)"); X WriteLn; X END; X attempts:=0; X sectnum:=1; X j:=0; X IF crcmode THEN X nak:=C; X ELSE X nak:=NAK; X END; X readModem(readchar,5); X c:=readchar; X WHILE (c#nak) AND (j<ERRORMAX) DO X readModem(readchar,20); X c:=readchar; X IF j> ERRORMAX DIV 2 THEN X crcmode:=NOT crcmode; X IF crcmode THEN X nak:=C; X ELSE X nak:=NAK; X END; X END; X INC(j); X IF xmodemabort OR (j=ERRORMAX) THEN X IF Close(fd) THEN END; X xmodemerror:=(-11); X snd:=FALSE; X RETURN FALSE; X END; X END; (* while *) X flushinput; X WHILE (endblk#0) AND (attempts#RETRYMAX) DO X setbuffer(ADR(bufr),BUFSIZ,CTRLZ); X b:=BUFSIZ; X Read(fd,b,ADR(bufr)); X bufptr:=0; X REPEAT X attempts:=0; X REPEAT X IF xmodemabort THEN X IF Close(fd) THEN END; X xmodemerror:=(-11); X snd:=FALSE; X RETURN FALSE; X END; X sendchar(SOH); X sendchar(CHAR(IAnd255(sectnum))); X sendchar(CHAR(255-IAnd255(sectnum))); X checksum:=0; X writeModem(ADR(bufr[bufptr]),SECSIZ); X IF crcmode THEN X FOR j:=bufptr TO bufptr+SECSIZ-1 DO X checksum:=crcupdate(checksum,bufr[j]); X END; X checksum:=crcfinish(checksum); X sendchar(CHAR(IAnd255(CARDINAL(WShr(checksum,8))))); X sendchar(CHAR(IAnd255(checksum))); X ELSE X FOR j:=bufptr TO bufptr+SECSIZ-1 DO X checksum:=checksum+CARDINAL(bufr[j]); X END; X sendchar(CHAR(IAnd255(checksum))); X END; X flushinput; X INC(mdmPacketsSent); X INC(attempts); X readModem(readchar,mtimeout); X c:=readchar; X IF c#ACK THEN X INC(mdmNakedPackets); X END; X UNTIL (c=ACK) OR (attempts=RETRYMAX); X IF attempts#RETRYMAX THEN X DEC(endblk); X bufptr:=bufptr+SECSIZ; X mdmBytesXferred:=mdmBytesXferred+SECSIZ; X INC(sectnum); X END; X UNTIL (bufptr=BUFSIZ) OR (attempts=RETRYMAX) OR (endblk=0); X END; (* while *) X X IF Close(fd) THEN END; X IF attempts=RETRYMAX THEN X xmodemerror:=(-1); X snd:=FALSE; X RETURN FALSE; X ELSE X attempts:=0; X REPEAT X sendchar(EOT); X INC(attempts); X readModem(readchar,5); X c:=readchar; X UNTIL (c=ACK) OR (attempts=RETRYMAX); X xmodemerror:=0; X snd:=FALSE; X ok:=TRUE; X RETURN TRUE; X END; XEND xmodemsnd; X XBEGIN XEND XMODEM. SHAR_EOF chmod 0600 XMODEM.MOD || echo "restore of XMODEM.MOD fails" sed 's/^X//' << 'SHAR_EOF' > XMODEMR.MOD && X(* X 1 check xmodem status X 2 change error-check method X 99 abort xmodem X*) XMODULE xmodemr; XFROM SYSCALL IMPORT EnableSpint,DisableSpint; XFROM GEMDOS IMPORT OldTerm,ConOut; XFROM GEMX IMPORT BasePageAddress; XFROM SYSTEM IMPORT ADR,ADDRESS; XFROM XMODEM IMPORT xmodemrec,xmodemabort,crcmode,xmodemerror, X xmodemstat; XVAR ok : BOOLEAN; X spintcmd : ARRAY [0..2] OF LONGCARD; X cmd : ARRAY [0..81] OF CHAR; X i,delay : CARDINAL; X XPROCEDURE run; XBEGIN X IF spintcmd[0]=1 THEN xmodemstat END; X IF spintcmd[0]=99 THEN xmodemabort:=TRUE END; XEND run; X XBEGIN X IF EnableSpint(1,run,ADR(spintcmd)) THEN X spintcmd[1]:=LONGCARD(xmodemstat); X crcmode:=TRUE; X FOR i:=1 TO ORD(BasePageAddress^.CmdLine[0])+1 DO X cmd[i-1]:=BasePageAddress^.CmdLine[i]; X END; X cmd[ORD(BasePageAddress^.CmdLine[0])]:=0c; X IF BasePageAddress^.CmdLine[0]#0c THEN X IF cmd[0]='-' THEN X crcmode:=FALSE; X FOR i:=0 TO ORD(BasePageAddress^.CmdLine[0]) DO X cmd[i]:=cmd[i+1]; X END; X END; X IF xmodemrec(cmd) THEN X ConOut(7c); X ELSE X FOR i:=0 TO 3 DO X FOR delay:=0 TO 10000 DO END; X ConOut(7c); X END; X END; (* get the file *) X END; X DisableSpint(1); X OldTerm; X END; XEND xmodemr. X SHAR_EOF chmod 0600 XMODEMR.MOD || echo "restore of XMODEMR.MOD fails" sed 's/^X//' << 'SHAR_EOF' > XMODEMT.MOD && X(* X 1 check xmodem status X 2 change error-check method X 99 abort xmodem X*) XMODULE xmodemt; XFROM SYSCALL IMPORT EnableSpint,DisableSpint; XFROM GEMDOS IMPORT OldTerm,ConOut; XFROM GEMX IMPORT BasePageAddress; XFROM SYSTEM IMPORT ADR,ADDRESS; XFROM XMODEM IMPORT xmodemsnd,xmodemabort,crcmode,xmodemerror, X xmodemstat; XVAR ok : BOOLEAN; X spintcmd : ARRAY [0..2] OF LONGCARD; X cmd : ARRAY [0..81] OF CHAR; X i,delay : CARDINAL; X XPROCEDURE run; XBEGIN X IF spintcmd[0]=1 THEN xmodemstat END; X IF spintcmd[0]=99 THEN xmodemabort:=TRUE END; XEND run; X XBEGIN X IF EnableSpint(1,run,ADR(spintcmd)) THEN X spintcmd[1]:=LONGCARD(xmodemstat); X crcmode:=TRUE; X FOR i:=1 TO ORD(BasePageAddress^.CmdLine[0])+1 DO X cmd[i-1]:=BasePageAddress^.CmdLine[i]; X END; X cmd[ORD(BasePageAddress^.CmdLine[0])]:=0c; X IF BasePageAddress^.CmdLine[0]#0c THEN X IF cmd[0]='-' THEN X crcmode:=FALSE; X FOR i:=0 TO ORD(BasePageAddress^.CmdLine[0]) DO X cmd[i]:=cmd[i+1]; X END; X END; X IF xmodemsnd(cmd) THEN X ConOut(7c); X ELSE X FOR i:=0 TO 3 DO X FOR delay:=0 TO 10000 DO END; X ConOut(7c); X END; X END; (* send the file *) X END; X DisableSpint(1); X OldTerm; X END; XEND xmodemt. X SHAR_EOF chmod 0600 XMODEMT.MOD || echo "restore of XMODEMT.MOD fails" sed 's/^X//' << 'SHAR_EOF' > XS.MOD && XMODULE xs; XFROM SYSCALL IMPORT SpintInfo; XFROM GEMDOS IMPORT Term; XFROM Terminal IMPORT WriteString,WriteLn; XVAR spintcmd : POINTER TO ARRAY [0..2] OF LONGCARD; X XS : PROC; X ok : BOOLEAN; XBEGIN X IF SpintInfo(1,spintcmd) THEN X XS:=PROC(spintcmd^[1]); X XS(); X ELSE X WriteLn; X WriteString("Background xmodem not running"); X WriteLn; X ok:=Term(-1); X END; X ok:=Term(0); XEND xs. SHAR_EOF chmod 0600 XS.MOD || echo "restore of XS.MOD fails" rm -f s2_seq_.tmp echo "You have unpacked the last part" exit 0