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

⟦2f94abc01⟧ TextFile

    Length: 10240 (0x2800)
    Types: TextFile
    Names: »RXAB.PAS«

Derivation

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

TextFile

PROGRAM rxaa; (*$I-*)

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

VAR
  abort : boolean;

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

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

FUNCTION getch : char;
FUNCTION ipa : boolean;
  VAR c : char;
  BEGIN
    IF keypress THEN
    BEGIN
      read(kbd,c);
      abort := (c='Q') or (c='q');
    END;
    ipa := port(.status.) AND rdy=rdy;
  END;
BEGIN; (*getch*)
  REPEAT UNTIL ipa OR abort;
  IF ipa THEN getch := chr(port(.data.));
END;

CONST
   version = '24.2.85.2255';
   atx = @0;	(* KOMMER FØR LÆNGDEN I TEKST FELTET I HEX-RECORD *)
   soh = @1;	(* KOMMER FØR NAVNE-HEADER 			*)
   stx = @2;	(* KOMMER FØR LÆNGDEN I TEKST FELTET I ASCII-RECORD*)
   etx = @3;	(* AFSLUTTER TEKSTFELTET 			*)
   eot = @4;	(* AFSLUTTER TRANSMISSIONEN 			*)
   syn = @5;	(* INDLEDER HVER TRANSMISSION 			*)
   ack = @6;	(* INDLEDER RESPONSE 				*)
   nak = @7;	(* SENDES HVIS RESPONSE MANGLER 		*)
   dle = @8;	(* KOMMER FØR STX ELLER ATX ELLER ETX 		*)
   cr = @13;

LABEL
   afslut,exit;

TYPE
   rec = ARRAY(.0..127.) OF byte;
   rbuf = ARRAY(.0..255.) OF char;
  
VAR
  ackmsg : STRING(.50.);
  i_s : STRING(.6.);
  dr : STRING(.4.);
  ofil : FILE;
  rbuffer : ARRAY(.0..7.) OF rbuf;
  fbuffer : ARRAY(.0..7.) OF rec;
  asci : ARRAY(.0..7.) OF boolean;
  i,j,m,t : integer;
  flt : STRING(.4.);
  sv,ch : char;
  mflag,mode : integer;
  slut,altok : boolean;
  ok,modt : ARRAY(.0..7.) OF boolean;
  lgt,sum : ARRAY(.0..7.) OF integer;
  filn : STRING(.14.);
  max : integer;
  
PROCEDURE resrts;
VAR n,j : integer;
BEGIN;
  FOR n := 0 TO 10 DO FOR j := 0 TO delfac DO BEGIN END;
  rtsoff;
END;

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

PROCEDURE setrts;
BEGIN;
  rtson;
  delay(100);
END;

PROCEDURE getflt;
LABEL exit;
var
 i : integer;
BEGIN;
  FOR i := 1 TO 4 DO
  BEGIN;
    flt(.i.) := getch;
    IF abort THEN GOTO exit;
  END;
  flt(.0.) := @4;
exit:
END;

PROCEDURE retnavn;
VAR
  ok : boolean;
  fil : FILE;
  fn : STRING(.14.);
BEGIN;
  ok := true;
  close(ofil);
  REPEAT	(* FIND ET FILNAVN SOM IKKE FINDES PÅ DRIVE DR *)
    IF filn(.2.) = ':' THEN filn := copy(filn,3,len(filn)-2);
    assign (fil,dr+filn);
    reset(fil);
    ok := iores = 0;
    IF ok THEN
    BEGIN;
      fn := '';
      writeln(dr+filn,' FINDES I FORVEJEN,');
      writeln;
      writeln('TAST <RETURN> FOR OVERSKRIVNING AF GL. FILE - ');
      write  ('ELLER INDTAST NYT FILE-NAVN:');
      readln(fn);
      IF len(fn) = 0 THEN
      BEGIN
        close(fil);
        erase(fil);
      END ELSE filn := fn;
    END;
  UNTIL NOT ok;	(* FILNAVN OG DRIVE FUNDET *)
  assign(ofil,dr+'RXA.$$$');
  rename(ofil,filn);
  writeln('SLUT PÅ MODTAGELSE AF FILE ',dr+filn);
END;

PROCEDURE getfiln;
VAR
   ok : boolean;
BEGIN;
  ok := true;
  bdos(45,255); (* set error status (only CP/M 3) *)
  dr := '';
  REPEAT
    writeln('VENT! - DISKEN AFPRØVES FOR PLADS M.M.');
    assign(ofil,dr+'RXA.$$$');
    rewrite(ofil);
    IF iores > 0 THEN ok := false ELSE ok := true;
    i := 0;
    WHILE (ok AND (i < max)) DO
    BEGIN
      blockwrite(ofil,fbuffer,1);
      IF iores > 0 THEN ok := false;
      i := succ(i);
    END;
    IF ok THEN close(ofil);
    IF iores > 0 THEN ok := false;
    assign(ofil,dr+'RXA.$$$');
    IF ok THEN rewrite(ofil);
    IF iores > 0 THEN ok := false;
    IF NOT ok THEN
    BEGIN
      writeln('-> DISKPROBLEMER ELLER PLADSPROBLEMER PÅ DISKEN');
      writeln('-> SKIFT DISK OG TAST <RETURN> ELLER ANGIV ANDEN DRIVE:');
      readln(trm,dr);
    END;
  UNTIL ok;
  writeln('KLAR TIL MODTAGNING AF FILE ',filn,' PÅ ',max:1,' SECTOR(ER).');
  bdos(45,0);
END;

PROCEDURE txresponse;
BEGIN
   setrts;
   FOR i := 0 TO 3 DO write(aux,syn);
   write(aux,ack);
   writeln(aux,ackmsg);
   writeln('OK  ');
   FOR i := 0 TO 3 DO write(aux,etx);
   resrts;
END;

PROCEDURE rxbuf;
LABEL exit;
BEGIN;
slut := false;
mode := 0;
WHILE NOT slut DO
  BEGIN;
  ch := getch;
  IF abort THEN GOTO exit;
  CASE mode OF
    0 : CASE ch OF
      syn : mode := 1;
         END;
     1 : CASE ch OF
         syn : BEGIN END;
         dle : mode := 2;
         eot : slut := true;
         nak : slut := true;
         END;
     2 : CASE ch OF
         syn : BEGIN END;
         stx : BEGIN;
               getflt;
               IF abort THEN GOTO exit;
               val(flt,i,j);
               write(i:8,'X');
               IF j > 0 THEN mode := 1
                 ELSE
               IF i - (i MOD 8) <> m THEN mode := 1
                 ELSE
                 BEGIN;
                    i := i MOD 8;
                    asci(.i.) := false;
                    modt(.i.) := true;
                    mode := 3;
                 END;
               END;
         atx : BEGIN;
               getflt;
               IF abort THEN GOTO exit;
               val(flt,i,j);
               write(i:8,'A');
               IF j > 0 THEN mode := 1
                 ELSE
               IF i - (i MOD 8) <> m THEN mode := 1
                 ELSE
                 BEGIN;
                    i := i MOD 8;
                    asci(.i.) := true;
                    modt(.i.) := true;
                    mode := 3;
                 END;
               END;
         soh : BEGIN;
                 getflt;
                 IF abort THEN GOTO exit;
                 val(flt,max,t);
                 IF t > 0 THEN
                 BEGIN
                   mode := 0;
                 END ELSE
                 BEGIN
                   filn := '';
                   mode := 10;
                 END;
               END;
         eot : slut := true;
         OTHERWISE mode := 1;
         END;
     3 : CASE ch OF
         syn : BEGIN END;
         dle : mode := 4;
         eot : slut := true;
         OTHERWISE IF j < 256 THEN
               BEGIN;
               rbuffer(.i.)(.j.) := ch;
               j := succ(j);
               END ELSE mode := 1;
         END;
     4 : CASE ch OF
         syn : BEGIN END;
         etx : BEGIN;
               getflt;
               IF abort THEN GOTO exit;
               val(flt,sum(.i.),t);
               IF t > 0 THEN sum(.i.) := 0;
               lgt(.i.) := j;
               mode := 1;
               END;
         eot : slut := true;
         OTHERWISE mode := 1;
         END;
    10 : CASE ch OF
         dle : BEGIN;
               getfiln;
               mode := 11;
               END;
         eot : slut := true;
         OTHERWISE
               BEGIN;
               filn(.0.) := succ(filn(.0.));
	       filn(.byte(filn(.0.)).) := ch;
	       END;
         END;
    11 : CASE ch OF
         etx,syn :
               begin
                 mode := 1;
                 txresponse;
               end;
         eot : slut := true;
         END;
     END;
   END;         
exit:
END;

PROCEDURE convert;
VAR
  flt : STRING(.4.);
  ss,p,x : integer;
  
BEGIN;
   ok(.i.) := true;
   IF asci(.i.) THEN
   FOR j := 0 TO 127 DO
   BEGIN
     x := byte(rbuffer(.i.)(.j.));
     IF (x < $09) OR (x > $7F) THEN ok(.i.) := false;
     fbuffer(.i.)(.j.) := x;
   END ELSE
   FOR j := 0 TO 255 DO
   IF j MOD 2 = 0 THEN flt := '$'+rbuffer(.i.)(.j.)
                  ELSE
                  BEGIN;
                     flt := flt+rbuffer(.i.)(.j.);
                     val(flt,x,p);
                     IF p > 0 THEN ok(.i.) := false ELSE
                     fbuffer(.i.)(.j SHR 1.) := x;
                  END;
   ss := sum(.i.);
   FOR j := 0 TO 127 DO ss := ss - fbuffer(.i.)(.j.);
   ss := (ss - m - i) MOD 10000;
   IF ss <> 0 THEN ok(.i.) := false;
END;
   
(* üüü üüü MAIN PROGRAM üüü üüü *)

BEGIN;
resrts;
write(clrhom);
write	('PROGRAM RXAB - MODTAGER PROGRAM VERSION:');
writeln	(rvson,callid,version:13,rvsoff);
writeln ('==========================================================');
writeln	('VENTER PÅ MODTAGNING - TAST <RETURN> FOR AFBRYDELSE.');
abort := false;
m := 0;
REPEAT;
  FOR i := 0 TO 7 DO
  begin
    ok(.i.) := false;
    lgt(.i.) := 0;
    modt(.i.) := false;
    sum(.i.) := 0;
  end;
  REPEAT;
      rxbuf;
      IF abort THEN GOTO exit;
      altok := true;
      mflag := 0;
      write(cr,clreol);
      ackmsg := '';
      FOR i := 0 TO 7 DO
      BEGIN;
         IF (i+m < max) THEN
         BEGIN;
            str(i+m,i_s);
            IF NOT ok(.i.) THEN IF ((lgt(.i.) = 256) AND (NOT asci(.i.))
                                OR (lgt(.i.) = 128) AND (asci(.i.)))
                           THEN convert;
            IF NOT modt(.i.) THEN
               BEGIN;
                   altok := false;
                   mflag := 1;
                   ackmsg := ackmsg+i_s+' ';
               END ELSE
              IF NOT (modt(.i.) AND ok(.i.)) THEN
                BEGIN;
                   altok := false;
                   ackmsg := ackmsg+i_s+' ';
                END;
         END ELSE mflag := 1;
      IF modt(.i.) AND (mflag = 1) THEN altok := false;
      END;
      IF NOT altok THEN txresponse;
   UNTIL altok;
   m := m+8;
   IF m = max THEN mflag := 1;
   FOR i := 0 TO 7 DO IF ok(.i.) THEN blockwrite(ofil,fbuffer(.i.),1);
   ackmsg := 'OK';
   txresponse;
UNTIL mflag = 1;
retnavn;
GOTO afslut;
exit:
writeln;
writeln(rvson,'AFBRUDT AF OPERATØREN.',rvsoff);
afslut:
(*$I+*)
END.

FUNCTION getch : char;
BEGIN;
  IF sio THEN
  BEGIN
    REPEAT UNTIL ipa OR abort;
    IF ipa THEN getch := chr(port(.data.));
  END ELSE 
  BEGIN
    read(aux,ch);
    getch := ch;
  END;
END;

«eof»