|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 14720 (0x3980) Types: TextFile Names: »HDX.PAS«
└─⟦692ac107c⟧ Bits:30005923 PolyPascal-80 V3.10 arbejdsdiskette 1 └─ ⟦this⟧ »HDX.PAS«
PROGRAM hdx;(*$I-*) CONST st = 1; dt = 0; rd = 1; delfac = 500; VAR filn : string(.14.); fil : text; line : string(.127.); mode,i : integer; c : char; wait,valid,tx,rx,slut : boolean; 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 getresp; begin readln; end; FUNCTION ipa : boolean; BEGIN ipa := port(.st.) AND rd = rd; END; PROCEDURE getaux; VAR ok : boolean; BEGIN ok := false; repeat REPEAT UNTIL ipa OR keypress; IF keypress THEN BEGIN read(kbd,c); IF c = ^B then BEGIN mode := 3; ok := true; writeln(@8,@8,@8,@8,@8,@8,@8,clreol); END; IF c = ^X then begin mode := 0; tx := true; END; slut := c = ^Z; ok := tx OR slut; END ELSE BEGIN c := chr(port(.dt.)and 127); CASE mode of 0 : IF c = ^B THEN mode := 1; 1 : IF c = ^B then begin writeln(@8,@8,@8,@8,@8,@8,@8,clreol); mode := 2; END; 2 : IF c <> ^B then begin mode := 3; ok := true; END; END; IF mode = 3 then begin ok := true; IF c = ^Z THEN slut := true; IF c = ^X then begin mode := 0; tx := true; END; IF ok THEN IF c = @13 THEN writeln ELSE write(c); END; END; UNTIL ok; END; PROCEDURE getcon; var i : integer; BEGIN read(kbd,c); CASE c OF ^X : rx := true; ^Z : begin write(aux,c); slut := true; end; ^F : BEGIN write(clrhom,rvson,'Hvilken file skal sendes?',rvsoff); readln(filn); assign(fil,filn); reset(fil); IF IORES <> 0 THEN WRITELN('ERROR') ELSE BEGIN writeln(rvson,'>>>>> START PÅ FIL ',filn,' <<<<<',rvsoff); writeln(aux,'>>>>> START PÅ FIL ',filn,' <<<<<'); i := 0; while not (eof(fil) or keypress) do BEGIN readln(fil,line); writeln(line); writeln(aux,line); i := succ(i); if i mod 20 = 0 then getresp; END; END; close(fil); if keypress then BEGIN writeln(rvson,'>>>>> FILTRANSMISSION AFBRUDT <<<<<',RVSOFF); writeln(aux,'>>>>> FILTRANSMISSION AFBRUDT <<<<<<'); END ELSE BEGIN writeln(rvson,'>>>>> SLUT PÅ FIL ',filn,' <<<<<',rvsoff); writeln(aux,'>>>>> SLUT PÅ FIL ',filn,' <<<<<'); END; END; @13 :BEGIN writeln; writeln(aux); END; OTHERWISE begin write(c); write(aux,c); END; END; END; PROCEDURE setrts; BEGIN writeln; writeln(rvson,'>>>>> TRANSMITTING <<<<<',rvsoff); rx := false; write('WAIT'); port(.st.) := $15; port(.st.) := $6A; delay(100); FOR i := 0 TO 5 DO write(aux,^B); write(@8,@8,@8,@8,clreol); END; PROCEDURE resrts; BEGIN FOR i := 0 TO 5 DO write(aux,^X); writeln; IF NOT slut THEN write(rvson,'>>>>> RECIEVING <<<<<',rvsoff,' CLOSED'); tx := false; delay(10); port(.st.) := $15; port(.st.) := $68; mode := 0; END; BEGIN; (* MAIN *) writeln(clrhom,rvson,' COMMUNICATION PROGRAM '); WRITELN (' ^X = TX/RX-TOGGEL, ^Z = TERMINATE PROGRAM ',rvsoff); slut := false; REPEAT resrts; IF NOT slut THEN REPEAT getaux UNTIL tx OR slut; IF NOT slut then begin setrts; writeln(aux,'OZ6OH VIBESKRAENTEN 9 PHONE 02 977013 2750 BALLERUP '); REPEAT getcon UNTIL rx OR slut; END; UNTIL slut; resrts; writeln; writeln; writeln(rvson,'>>>>> COMMUNICATION TERMINATED <<<<<',rvsoff); (*$I+*) END. 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 = ' 30.8.84.2030'; 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=10000; 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 : 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; BEGIN; REPEAT ok := true; gotoxy(0,2); write(clreos,'FILENAVN:'); filn := strinp('',10,2,14); 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); fill := length(ifil); writeln(', LÆNGDE = ',fill:4); writeln; 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; write('TAST "F" FOR FORTSÆTTELSE, "R" FOR REPETETION:'); REPEAT read(kbd,sv) UNTIL sv IN (.'F','R','f','r'.); writeln(sv); 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,'TXAA - SENDEPROGRAM, VERSION:',callid,version:13); writeln ('==============================================='); IF len(parm) > 0 THEN BEGIN filn := copy(parm,2,len(parm)-1); assign(ifil,filn); (*$I-*) reset(ifil); IF iores <> 0 THEN getfil ELSE BEGIN fill := length(ifil); writeln('FILENAVN:',filn,', LÆNGDE = ',fill:1,' SECTOR(ER).'); writeln; END; END ELSE getfil; 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 writeln(rvson,'PROGRAMMET AFBRUDT AF OPERTØREN.',rvsoff); END. «eof»