DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦a86e6ef64⟧ TextFile

    Length: 10496 (0x2900)
    Types: TextFile
    Names: »TXAB.PAS«

Derivation

└─⟦692ac107c⟧ Bits:30005923 PolyPascal-80 V3.10 arbejdsdiskette 1
    └─ ⟦this⟧ »TXAB.PAS« 

TextFile

PROGRAM txaa;
CONST
  callid	= 'OZ6OH';
  sio		= true;
  status	= 1;	(* SIO-PORTENS STATUS-PORT 			*)
  data 		= 0;	(* SIO-PORTENS DATA-PORT 			*)
  rdy		= 1;	(* RECIEVE RDY-FLAG 				*)
  delfac	= 600;	(* DELAY FACTOR					*)

PROCEDURE rtson;
begin
  port(.status.) := $15;
  port(.status.) := $6A;
end;

PROCEDURE rtsoff;
begin
  port(.status.) := $15;
  port(.status.) := $68;
end;

CONST
  version   = ' 10/04/85 -2235';
  atx = @0;
  soh = @1;
  stx = @2;
  etx = @3;
  eot = @4;
  syn = @5;
  ack = @6;
  nak = @7;
  dle = @8;
  
LABEL exit;

TYPE
   hexstr = STRING(.4.);
   rec = ARRAY(.0..127.) OF byte;
   str14 = STRING(.14.);
   str30 = STRING(.30.);
   str50 = STRING(.50.);
   str80 = STRING(.80.);
   
VAR
   ss,abort : boolean;
   s,ssav : str80;
   parm : str50 AT $80;
   ch : byte;
   filn : str14;
   ifil : FILE;
   fill,i,j,m,t,sum : integer;
   buffer : ARRAY(.0..7.) OF rec;
   
FUNCTION hex(tal,cif : integer) : hexstr;
CONST
   hexcif : ARRAY(.0..15.) OF char = '0123456789ABCDEF';
VAR
   h : hexstr;
   c : integer;
BEGIN
   h(.0.) := chr(cif);
   FOR c := cif DOWNTO 1 DO
   BEGIN
      h(.c.) := hexcif(.tal AND 15.);
      tal := tal SHR 4;
   END;
   hex := h;
END;

FUNCTION ascii(rc : rec) : boolean;
VAR
  i : integer;
BEGIN
  ascii := true;
  FOR i := 0 TO 127 DO
    IF (rc(.i.) > 127) OR (rc(.i.) < 9) THEN ascii := false;
END;
  
FUNCTION ipa : boolean;
VAR c : char;
BEGIN
  ipa := port(.status.) AND rdy = rdy;
  IF keypress THEN
  BEGIN
    read(kbd,c);
    CASE c OF
      'Q','q' : abort := true;
      'R','r' : BEGIN
      		ss := true;
      		ssav := '';
      		END;
      'F','f' : BEGIN
      		ss := true;
      		ssav := 'OK';
      		END;
      OTHERWISE BEGIN
      		ss := true;
      		write(c);
      		readln(ssav);
      		ssav := c + ssav;
      		END;
      END;
  END;
END;

PROCEDURE delay(i : integer);
VAR n,j : integer;
BEGIN
  FOR n := 0 TO i DO FOR j := 0 TO delfac DO BEGIN END;
END;

PROCEDURE resrts;
VAR n,j : integer;
BEGIN;
  delay(10);
  IF sio THEN
  BEGIN
    port(.status.) := $15;
    port(.status.) := $68;
  END;
END;

PROCEDURE setrts;
BEGIN;
  write('WAIT');
  IF sio THEN
  BEGIN
    port(.status.) := $15;
    port(.status.) := $6A;
  END;
  delay(100);
  write(@8,@8,@8,@8);
END;

PROCEDURE txnak;
BEGIN
  setrts;
  FOR i := 0 TO 5 DO write(aux,syn);
  FOR i := 0 TO 5 DO write(aux,nak);
  resrts;
END;

FUNCTION getch : char;
VAR
  c : char;
  timer : integer;
  timout : boolean;
BEGIN;
(*$I-*)
  IF sio THEN
  BEGIN
    REPEAT
      timer := 0;
      REPEAT
        timer := succ(timer);
        timout := timer=15000;
      UNTIL ipa OR abort OR ss OR timout;
      IF timout THEN
      BEGIN
        writeln('>>>TIMEOUT<<<');
        txnak;
      END;
    UNTIL ipa OR abort OR ss;
    IF ipa THEN getch := chr(port(.data.));
  END ELSE
  BEGIN
    read(aux,c);
    getch := c;
  END;
END;

PROCEDURE getflt;
LABEL exit;
VAR
  i : integer;
BEGIN;
  i := 1;
  REPEAT
    s(.i.) := getch;
    IF ss OR abort THEN GOTO exit;
    i := i+1;
  UNTIL (s(.i-1.) IN (.@0..@10,@13.));
  s(.0.) := chr(i-2);
exit:
END;

PROCEDURE getresponse;
LABEL exit;
VAR
   st : STRING(.4.);
   c : char;
BEGIN
   ss := false;
   abort := false;
   REPEAT c := getch UNTIL (c = syn) OR abort OR ss;
   IF ss OR abort THEN GOTO exit;
   REPEAT c := getch UNTIL (c = ack) OR abort OR ss;
   IF ss OR abort THEN GOTO exit;
   getflt;
   IF ss OR abort THEN GOTO exit;
   REPEAT c := getch UNTIL (c = etx) OR abort OR ss;
   exit:
   IF ss THEN IF ssav = '' THEN
     FOR i := 0 TO 7 DO
     BEGIN
       IF i+m < fill THEN
       BEGIN
         str(i+m,st);
         s := s + st + ' ';
       END;
     END ELSE s := ssav;
END;

FUNCTION strinp(s : str30;x,y,l : integer) : str30;
CONST
  dots = '..............................';
VAR
  p : integer;
  ch : char;
PROCEDURE dyt; BEGIN write(@7); END;

BEGIN
  gotoxy(x,y);
  write(s,copy(dots,1,l-len(s)));
  p := 0;
  REPEAT
    gotoxy(x+p,y);
    read(kbd,ch);
    CASE ch OF
      @$7f,@8
            : BEGIN
               IF p = 0 THEN dyt ELSE
               BEGIN
                 s := copy(s,1,p-1)+copy(s,p+1,l);
          	 write(@8,copy(s,p,l),'.');
       	         p := p-1;
               END;
      	     END;
      ^L   : BEGIN
               p := 0;
               s := '';
               gotoxy(x,y);
               write(copy(dots,1,l));
      	     END;
      ^S   : IF (p > 0) THEN p :=p-1 ELSE dyt;
      ^D   : IF (p < len(s)) THEN p := p+1 ELSE dyt;
      ^A   : p := 0;
      ^F   : p := len(s);
      ^G   : IF (p = l) OR (p = len(s)) THEN dyt ELSE
             BEGIN
               s := copy(s,1,p)+copy(s,p+2,l);
               write(copy(s,p+1,l),'.');
             END;
      ' '..'ü'
           : BEGIN
      	     IF len(s) = l THEN dyt ELSE
      	     BEGIN;
      	       IF p = 0 THEN s := ch+copy(s,1,l-1)
      	                ELSE s := copy(s,1,p)+ch+copy(s,p+1,l-1);
      	       p := p+1;
      	       write(copy(s,p,l));
      	     END;
      END;
    END;
  UNTIL (ord(ch)=13);
  gotoxy(x+len(s),y);
  write('':l - len(s));
  gotoxy(x+len(s),y);
  strinp:=s;
END;

PROCEDURE getfil;
VAR
  ok : boolean;
LABEL exit;
BEGIN;
   REPEAT
   ok := true;
   gotoxy(0,2);
   write(clreos,'FILENAVN:');
   filn := strinp('',10,2,14);
   if len(filn) = 0 THEN GOTO exit;
   assign (ifil,filn);
   (*$I-*)
   reset (ifil);
   IF iores <> 0 THEN ok := false;
   IF NOT ok THEN writeln(@7);
   UNTIL ok;
   IF filn(.2.) = ':' THEN filn := copy(filn,3,len(filn)-2);
exit:
END;

PROCEDURE presat(sum : integer);
BEGIN;
  IF sum < 1000 THEN write(aux,'0');
  IF sum < 100 THEN write(aux,'0');
  IF sum < 10 THEN write(aux,'0');
  write(aux,sum);
END;

PROCEDURE txbuf(i : integer);
VAR
  as : boolean;
BEGIN
   as := ascii(buffer(.i.));
   write(i+m:5);
   IF as THEN write('A') ELSE write('X');
   FOR j := 0 TO 4 DO write(aux,syn);
   write(aux,dle);
   IF as THEN write(aux,atx) ELSE write(aux,stx);
   sum := i+m;
   presat(sum);
   IF as THEN
   FOR j := 0 TO 127 DO
   BEGIN
      write(aux,chr(buffer(.i.)(.j.)));
      sum := (sum+buffer(.i.)(.j.)) MOD 10000;
   END ELSE
   FOR j := 0 TO 127 DO
   BEGIN;
      write(aux,hex(buffer(.i.)(.j.),2));
      sum := (sum+buffer(.i.)(.j.)) MOD 10000;
   END;
   write(aux,dle);
   write(aux,etx);
   presat(sum);
END;

PROCEDURE txhdr;
VAR sv : char;
BEGIN;
  REPEAT
    setrts;
    sv := ' ';
    FOR j := 0 TO 4 DO write(aux,syn);
    write(aux,dle);
    write(aux,soh);
    sum := length(ifil);
    presat(sum);
    write(aux,filn);
    write(aux,dle);
    write(aux,etx);
    resrts;
    getresponse; sv := 'F'
  UNTIL (sv = 'F') OR (sv = 'f');
END;

FUNCTION num(c : char) : boolean;
BEGIN;
  IF (c < '0') OR (c > '9') THEN num := false ELSE num := true;
END;

PROCEDURE retrans;
LABEL exit;
VAR
  t : ARRAY(.0..7.) OF integer;
  ok : boolean;
  i,j,g : integer;
FUNCTION nxtrng : boolean;
  VAR A : BOOLEAN;
  BEGIN
    A := TRUE;
    FOR I := 0 TO 7 DO
      IF M+I+8 < FILL THEN A := A AND (T(.I.)=I+M+8);
    NXTRNG := A and (m+8<fill);
  END;
BEGIN; (* RETRANS *)
  REPEAT
    REPEAT
      FOR i := 0 TO 7 DO t(.i.) := 0;
      ok := true;
      g := 0;
      writeln;
      s := '';
      getresponse;
      IF abort THEN GOTO exit;
      IF s = 'OK' THEN writeln('ALT OK') ELSE
      BEGIN
        writeln('RETRANSMITTER ',s) ;
        IF fill-m < 8 THEN i := fill-m-1 ELSE i := 7;
        i := 1;
        WHILE (len(s) > 0) AND (NOT num(s(.1.))) DO
        BEGIN	(* SUPPRESS LEADING BLANKS AND TEST FOR INVALID CH *)
          IF s(.1.) <> ' ' THEN ok := false;
          s := copy(s,2,len(s)-1);
        END;
        WHILE (len(s) > 0) AND (NOT num(s(.len(s).))) DO
	BEGIN	(* SUPPRESS TRAILING BLANKS AND TEST FOR INVALID CH *)
	  IF s(.len(s).) <> ' ' THEN ok := false;
	  s := copy(s,1,len(s)-1);
	END;
        WHILE i <= len(s) DO
        BEGIN;
          WHILE ((NOT num(s(.i.))) AND (i <= len(s))) DO
          BEGIN	(* TEST FOR VALID SPACES *)
            IF s(.i.) <> ' ' THEN ok := false;
            i := succ(i);
          END;
          WHILE (num(s(.i.)) AND (i <= len(s))) DO
          BEGIN
            t(.g.) := t(.g.)*10+ord(s(.i.))-$30;
            i := succ(i);
          END;
          g := succ(g);
        END;
        (* TEST FOR VALID NUMBERS *)
        FOR i := 0 TO g-1 DO IF I+M < FILL THEN
        	IF ((t(.i.) < m) OR (t(.i.) > m+7))
        	THEN ok := false;
        IF NXTRNG THEN
        BEGIN
          OK := TRUE;
          s := 'OK';
          G := 0;
        END;
        IF NOT ok THEN txnak;
      END;
    UNTIL ok;
    IF g > 0 THEN
    BEGIN;
      setrts;
      IF g > 0 THEN FOR g := 0 TO g-1 DO txbuf(t(.g.) MOD 8);
      FOR j := 0 TO 5 DO write(aux,eot);
      resrts;
    END;
  UNTIL s = 'OK';
exit:
END;

PROCEDURE nextblok;
BEGIN;
   i := 0;
   WHILE (NOT eof(ifil)) AND (i < 8) DO
   BEGIN
      blockread(ifil,buffer(.i.),1);
      i := succ(i);
   END;
   writeln('=>',fill-m:4,'  SECTOR(ER) RESTERER.');
   setrts;
   FOR i := 0 TO i-1 DO txbuf(i);
   FOR j := 0 TO 5 DO write(aux,eot);
   resrts;
   retrans;
   m := m+8;
END;

(* === *)

BEGIN;
   resrts;
   writeln(clrhom,rvson,'TXAB - SENDEPROGRAM, VERSION:',callid,version:13);
   writeln    ('===============================================',rvsoff);
   IF len(parm) > 0 THEN
   BEGIN
     filn := copy(parm,2,len(parm)-1);
     assign(ifil,filn);
     (*$I-*)
     reset(ifil);
     IF iores <> 0 THEN getfil;
   END ELSE getfil;
   IF LEN(filn) = 0 THEN GOTO exit;
   fill := length(ifil);
   writeln('FILENAVN:',filn,', LÆNGDE = ',fill:1,' SECTOR(ER).');
   writeln;
   m := 0;
   write('TAST <RETURN> FOR HEADER-BLOCK:');
   readln;
   txhdr;
   WHILE NOT eof(ifil) DO
   BEGIN
     nextblok;
     IF abort THEN GOTO exit;
   END;
   writeln('SLUT PÅ FILE ',filn);
exit:
IF abort THEN
BEGIN
  writeln;
  writeln(rvson,'PROGRAMMET AFBRUDT AF OPERTØREN.',rvsoff);
end;
END.
«eof»