|
|
DataMuseum.dkPresents historical artifacts from the history of: RegneCentralen RC3600/RC7000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RegneCentralen RC3600/RC7000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 13824 (0x3600)
Types: TextFile
Notes: RCSL-43-GL-8608, RCSL-43-GL-8609, RCSL-43-GL-8610
Names: »S988«
└─⟦a59f0a452⟧ Bits:30000472 DOMUS disk image
└─⟦this⟧ »/S988«
! RCSL: 43-GL8609
AUTHOR: PBP
EDITED: 79.02.16
PROGRAM RC36-00988.01
CASSETTE PRINT IMAGE
KEYWORDS: MUSIL,CONVERSION,CT0,SP,LISTING
ABSTRACT: THIS PROGRAM HANDLES NO LABEL CASSETTE TAPES WITH A
BLOCKSIZE OF 256 BYTES, EACH BLOCK CONSISTING
OF FIXED LENGTH RECORDS WITH ASCII CODE DATA.
OUTPUT ON SERIAL PRINTER.
THE PROGRAM MUST BE OPERATED FROM TTY.
RCSL 43-GL8608: ASCII SOURCE TAPE
RCSL 43-GL8610: REL.BIN/TTY !
«ff»
! RC36-00988 PAGE 01
TITLE: CASSETTE PRINT IMAGE.
ABSTRACT: THIS PROGRAM HANDLES CASSETTE TAPES WITH A
BLOCKSIZE OF 256 BYTES, EACH BLOCK CONSISTING
OF FIXED LENGTH RECORDS WITH ASCII CODE DATA.
OUTPUT ON SERIAL PRINTER.
THE PROGRAM MUST BE OPERATED FROM TTY.
SIZE: 3902 BYTES. INCLUDING ONE 256 BYTES INPUT BUFFERS
AND FOUR 133 BYTES OUTPUT BUFFERS.
DATE: 79.02.16.
RUNTIME PARAMETERS:
BLOCK NO : 00001 NEXT BLOCK TO BE READ FROM CURRENT FILE.
FILE NO : 00002 THE FILE FROM WHICH THE BLOCK IS READ.
RECSIZE : 00080 RECORDSIZE ON CASSETTE TAPE, MAX 256.
ECMA34V2 : + + INDICATES ECMA 34 VERS 2 STANDARD.
- INDICATES ECMA 34 VERS 1 STANDARD.
TEXAS : - + INDICATES TEXAS SILENT CASSETTE
- INDICATES CASETTE IN ECMA FORMAT
SPECIFIED ABOVE.
REWIND : + INDICATES IF REWIND OF TAPE AT EOF.
MARGIN : 00000 SPACES TO THE LEFT OF THE PRINT LINE.
OTHER OUTPUT MESSAGES:
CONTSTATE: +/- STATE OF CONTINUE SWITCH (TTY ONLY).
PROG NO : 988 PROGRAM EXECUTION IS STOPPED.
RUNNING PROGRAM EXECUTION IS STARTED.
MARGINERROR MARGIN > 20.
MOUNT CASSETTE CASSETTE TAPE IS NOT MOUNTED CORRECTLY.
CT ERROR NNNNN CONSULT THE RC3600 OPERATORS MANUAL.
SP ERROR NNNNN CONSULT THE RC3600 OPERATORS MANUAL.
END JOB PROGRAM EXECUTION IS TERMINATED.
SUSPENDED PROGRAM EXECUTION IS STOPPED, RELEASING DRIVERS.
INPUT MESSAGES:
STOP STOPS EXECUTION WRITING PROG NO : 988.
<ESC> NEXT PARAMETER IS DISPLAYED
STATE ALL PARAMETERS ARE DISPLAYED (TTY ONLY).
"VALUE" CURRENTLY DISPLAYED PARAMETER IS CHANGED
TO "VALUE".
"TEXT"="VALUE" THE PARAMETER IDENTIFIED BY "TEXT" IS
CHANGED TO "VALUE".
CONT STATE OF CONTINUE SWITCH IS INVERTED.
SUSPEND PROGRAM EXECUTION IS STOPPED AND DRIVERS RELEASED.
START PROGRAM EXECUTION IS STARTED.
NOTE: AFTER CT ERROR START MEANS ACCEPTING
THE ERRONEOUS INPUT, AFTER SP ERROR START
MEANS REPEATING THE PRINT OPERATION.
SPECIAL REQUIREMENTS: NONE.
!
«ff»
! RC36-00988 PAGE 02 !
CONST
NOQ= 8,
OPTXTS=
'<14><6>
<10>PROG NO : 988<0>
<10>BLOCK NO : <0>
<10>FILE NO : <0>
<10>RECSIZE : <0>
<10>ECMA34V2 : <0>
<10>TEXAS : <0>
<10>REWIND : <0>
<10>MARGIN : <0>',
START= 'START',
STOP= 'STOP',
CONT= 'CONT',
SUSPEND= 'SUSPEND',
STATE= 'STATE',
MINUS= '-',
PLUS= '+',
FIVE= '<5><0>',
FIFTEEN= '<15><0>',
NL= '<10>',
NEXTPARAM= '<27>',
SP1A= '<9>',
ENDLINE= '<13><0>',
RUNTXT= '<8><4><10>RUNNING<13><0>',
MARGINERROR= '<10>MARGINERROR<13><0>',
MTMOUNTTAPE= '<7><10>MOUNT CASSETTE<13><0>',
MTTXT= '<7><10>CT ERROR ',
LPTXT= '<7><10>SP ERROR ',
EOJTXT= '<14><7><10>END JOB<13><0>',
SUSTXT= '<7><10>SUSPENDED<13><0>',
CONTSTATE= '<10>CONTSTATE: <0>',
TRUE= -1,
FALSE= -2,
«ff»
! RC36-00988 PAGE 2A !
LPTABLE=
! ASCII TO ASCII TABLE USED FOR TEXAS SILENT CASETTE
0 1 2 3 4 5 6 7 !
#
! 0! 32 32 32 32 32 32 32 32
! 8! 32 32 32 32 32 32 32 32
! 16! 32 32 32 32 32 32 32 32
! 24! 32 32 32 32 32 32 32 32
! 32! 32 33 34 35 36 37 38 39
! 40! 40 41 42 43 44 45 46 47
! 48! 48 49 50 51 52 53 54 55
! 56! 56 57 58 59 60 61 62 63
! 64! 64 65 66 67 68 69 70 71
! 72! 72 73 74 75 76 77 78 79
! 80! 80 81 82 83 84 85 86 87
! 88! 88 89 90 91 92 93 94 95
! 96! 96 97 98 99 100 101 102 103
! 104! 104 105 106 107 108 109 110 111
! 112! 112 113 114 115 116 117 118 119
! 120! 120 121 122 123 124 125 126 127
! 128! 32 32 32 32 32 32 32 32
! 136! 32 32 32 32 32 32 32 32
! 144! 32 32 32 32 32 32 32 32
! 152! 32 32 32 32 32 32 32 32
! 160! 32 32 32 32 32 32 32 32
! 168! 32 32 32 32 32 32 32 32
! 176! 32 32 32 32 32 32 32 32
! 184! 32 32 32 32 32 32 32 32
! 192! 32 32 32 32 32 32 32 32
! 200! 32 32 32 32 32 32 32 32
! 208! 32 32 32 32 32 32 32 32
! 216! 32 32 32 32 32 32 32 32
! 224! 32 32 32 32 32 32 32 32
! 232! 32 32 32 32 32 32 32 32
! 240! 32 32 32 32 32 32 32 32
! 248! 32 32 32 32 32 32 32 32
#;
«ff»
! RC36-00988 PAGE 03 !
VAR
OPDUMMY: STRING(2); ! RUNTIME PARAMETERS !
PROGNO: INTEGER;
BLOCKNO: INTEGER;
FILENO: INTEGER;
RECLENGTH: INTEGER;
ECMA34V2: INTEGER;
TEXAS: INTEGER;
REWIND: INTEGER;
MARGIN: INTEGER;
OPTEXT: STRING(20); ! COMMUNICATION AREA !
OPSTRING: STRING(20);
OPDEC: STRING(10);
OPCONT: STRING(2); ! INTERNAL VARIABLES !
NEXTCONT: STRING(1);
GLCONT: STRING(1);
ERRORNO: INTEGER;
MASK: INTEGER;
TOM: INTEGER;
SIGN: INTEGER;
Q: INTEGER;
PAR: INTEGER;
LENGTH: INTEGER;
INDEX: INTEGER;
LPLENGTH: INTEGER;
LPDATALENGTH: INTEGER;
P1: INTEGER;
P2: INTEGER;
P3: INTEGER;
S1: STRING(2);
S2: STRING(2);
NEXTLP: INTEGER;
STOPPED: INTEGER;
«ff»
! RC36-00988 PAGE 04 !
IN: FILE ! INPUT FILE DESCRIPTION !
'CT0', ! NAME OF INPUT DRIVER !
14, ! KIND= REPEATABLE, !
! POSITIONABLE, !
! BLOCKED. !
1, ! BUFFERS !
256, ! BUFFERSIZE !
UB; ! UNIDENTIFIED BLOCKED !
CONV LPTABLE;
GIVEUP
MTINERROR, ! MT ERROR PROCEDURE !
2'0111001111111111 ! GIVE UP MASK !
! ALL REPEATABLE BITS OFF !
! AND BIT 15 ON !
OF STRING(80); ! RECORD STRUCTURE !
OUT: FILE ! OUTPUT FILE DESCRIPTION !
'SP', ! NAME OF OUTPUT DRIVER !
2, ! KIND= BLOCKED !
4, ! BUFFERS !
133, ! BUFFERSIZE !
U; ! UNDEFINED !
GIVEUP
LPERROR, ! LP ERROR PROCEDURE !
2'1100001011110110 ! GIVE UP MASK !
OF RECORD ! RECORD STRUCTURE !
CCW: STRING(1);
DATA: STRING(132) FROM 2
END;
«ff»
! RC36-00988 PAGE 05 !
PROCEDURE CONTINUE;
BEGIN
GLCONT:=OPCONT;
OPCONT:=NEXTCONT;
NEXTCONT:=GLCONT;
OPMESS(OPCONT);
END;
PROCEDURE OPSTOP;
BEGIN
OPWAIT(LENGTH);
OPTEXT := OPSTRING;
OPIN(OPSTRING);
STOPPED := 0;
IF OPTEXT = SUSPEND THEN STOPPED:= 3;
IF OPTEXT = START THEN STOPPED := 2;
IF OPTEXT = STOP THEN STOPPED := 1;
IF OPTEXT = CONT THEN CONTINUE;
END;
PROCEDURE INITPOSITION;
BEGIN
IF IN.ZMODE = 0 THEN
BEGIN
IF TEXAS = TRUE THEN OPEN(IN,17) ELSE
BEGIN
IF ECMA34V2 = TRUE THEN OPEN(IN,1)
ELSE OPEN(IN,9);
END;
END;
IF OUT.ZMODE=0 THEN OPEN(OUT,7);
SETPOSITION(IN,FILENO,BLOCKNO);
100: IF MARGIN > 20 THEN
BEGIN
OPMESS(MARGINERROR);
OPSTOP;
IF STOPPED = 1 THEN GOTO 1;
GOTO 100;
END;
SETPOSITION(OUT,MARGIN,0);
LPLENGTH:=133 - MARGIN;
LPDATALENGTH:=LPLENGTH-1;
END;
«ff»
! RC36-00988 PAGE 06 !
PROCEDURE DIRECTUPDATE;
BEGIN
P1:=0; ! INDEX IN INPUT STRING !
P2:=0; ! INDEX IN CONSTANT STRING !
P3:=1; ! PARAMETER NUMBER IN CONSTANT STRING !
REPEAT BEGIN
MOVE(OPTEXT,P1,S1,0,1);
MOVE(OPTXTS,P2,S2,0,1);
WHILE BYTE S1 <> BYTE S2 DO
BEGIN
IF BYTE S2 = 0 THEN P3:=P3+1;
P2:=P2+1;
MOVE(OPTXTS,P2,S2,0,1);
IF P3>NOQ THEN S2:=S1;
END;
IF P3<=NOQ THEN
BEGIN
WHILE BYTE S1 = BYTE S2 DO
BEGIN
P1:=P1+1;
P2:=P2+1;
MOVE(OPTEXT,P1,S1,0,1);
MOVE(OPTXTS,P2,S2,0,1);
IF BYTE S1 = 61 THEN
BEGIN
MOVE(OPTEXT,P1+1,OPTEXT,0,10);
LENGTH:=LENGTH-P1-1;
Q:=P3;
MOVE(OPDUMMY,Q*2,OPDUMMY,0,2);
PAR:= WORD OPDUMMY;
P3:=NOQ;
END;
END;
P2:=P2-P1+1;
P1:=0;
END;
END UNTIL P3>=NOQ;
END;
«ff»
! RC36-00988 PAGE 07 !
PROCEDURE OPCOM;
BEGIN
1000: Q:=0;
1010: REPEAT BEGIN
IF OPTEXT=STATE THEN
BEGIN Q:=1; OPMESS(CONTSTATE); IF OPCONT=FIVE THEN
OPMESS(PLUS); IF OPCONT=FIFTEEN THEN
OPMESS(MINUS); GOTO 1040;
END;
1015: Q:=Q+1;
1020: OPSTATUS(1 SHIFT(16-Q),OPTXTS); IF Q<>1 THEN BEGIN
MOVE(OPDUMMY,Q*2,OPDUMMY,0,2);
PAR:= WORD OPDUMMY;
IF PAR = -1 THEN OPMESS(PLUS);
IF PAR = -2 THEN OPMESS(MINUS);
IF PAR >= 0 THEN
BEGIN BINDEC(PAR,OPDEC); OPMESS(OPDEC); END; END;
IF OPTEXT=STATE THEN GOTO 1060;
1040: OPMESS(ENDLINE);
OPWAIT(LENGTH);
OPTEXT:=OPSTRING;
OPIN(OPSTRING);
IF OPTEXT=STATE THEN BEGIN Q:=0; GOTO 1015; END;
IF LENGTH > 6 THEN DIRECTUPDATE;
IF LENGTH > 6 THEN GOTO 1020;
IF OPTEXT = START THEN GOTO 1070;
IF OPTEXT = STOP THEN GOTO 1000;
IF OPTEXT = CONT THEN
BEGIN CONTINUE; GOTO 1040; END;
IF OPTEXT = NEXTPARAM THEN GOTO 1060;
IF OPTEXT = NL THEN GOTO 1020;
IF OPTEXT = ENDLINE THEN GOTO 1020;
SIGN:=0;
IF OPTEXT = MINUS THEN SIGN:=-1;
IF OPTEXT = PLUS THEN SIGN:=+1;
IF SIGN <> 0 THEN INSERT(48,OPTEXT,0);
DECBIN(OPTEXT,TOM);
IF PAR < 0 THEN
BEGIN IF SIGN=0 THEN GOTO 1020; PAR:=-2;
IF SIGN=1 THEN PAR:=-1; GOTO 1050;
END;
IF SIGN=0 THEN
BEGIN SIGN:=1; PAR:=0; END;
PAR:=PAR+TOM*SIGN;
IF PAR<0 THEN GOTO 1020;
1050: INSERT(PAR SHIFT(-8),OPDUMMY,0);
INSERT(PAR, OPDUMMY,1);
MOVE(OPDUMMY,0,OPDUMMY,Q*2,2);
IF OPTEST <> 0 THEN GOTO 1040;
GOTO 1020;
1060: IF OPTEXT=STATE THEN IF Q<NOQ THEN GOTO 1015;
END UNTIL Q>=NOQ; GOTO 1000;
1070: OPMESS(RUNTXT);
END;
«ff»
! RC36-00988 PAGE 08 !
PROCEDURE SHOWERROR;
BEGIN
ERRORNO:=20;
WHILE MASK>0 DO
BEGIN
MASK:=MASK SHIFT 1;
ERRORNO:=ERRORNO+1
END;
BINDEC(ERRORNO,OPTEXT);
OPMESS(OPTEXT); OPMESS(ENDLINE);
END;
PROCEDURE MTINERROR;
BEGIN
IF IN.Z0 AND 256 <> 0 THEN !EOF! GOTO 9;
IF IN.Z0 AND 8'20 <> 0 THEN !EOT! GOTO 100;
BLOCKNO:=IN.ZBLOCK;
IF IN.Z0 SHIFT 1 < 0 THEN OPMESS(MTMOUNTTAPE);
IF TEXAS = TRUE THEN
BEGIN
IF IN.Z0 AND 8'010000 <> 0 THEN
GOTO 9;
END;
IF IN.Z0 SHIFT 1 >= 0 THEN
BEGIN
OPMESS(MTTXT);
MASK:=IN.Z0;
SHOWERROR;
END;
REPEAT OPSTOP UNTIL STOPPED <> 0;
IF STOPPED = 3 THEN GOTO 12;
IF STOPPED = 1 THEN GOTO 1;
OPMESS(RUNTXT);
100: END;
PROCEDURE LPERROR;
BEGIN
NEXTLP:= OUT.Z0 AND 8'000020;
OUT.Z0:= OUT.Z0-NEXTLP;
IF OUT.Z0 SHIFT 1 < 0 THEN OUT.Z0:= OUT.Z0 AND 8'041342;
IF OUT.Z0 = 8'040000 THEN
IF NEXTLP <> 0 THEN OUT.Z0:= NEXTLP;
IF OUT.Z0 AND 8'001342 <> 0 THEN
OUT.Z0:= OUT.Z0 AND 8'001342;
IF OUT.Z0<>0 THEN
BEGIN
OPMESS(LPTXT);
MASK:=OUT.Z0;
SHOWERROR;
NEXTLP:=0;
REPEAT OPSTOP UNTIL STOPPED <> 0;
IF STOPPED = 3 THEN GOTO 12;
OPMESS(RUNTXT);
IF OUT.Z0 AND 8'141362 <> 0 THEN
REPEATSHARE(OUT);
END;
END;
«ff»
! RC36-00988 PAGE 09 !
BEGIN
IN.ZBLOCK:=1; BLOCKNO:=1; FILENO:=2; REWIND:=-1;
MARGIN:=0; RECLENGTH := 80; NEXTLP:=0; ECMA34V2:=TRUE;
OPCONT:=FIFTEEN; NEXTCONT:=FIVE; OPIN(OPSTRING); TEXAS:=FALSE;
1: OPCOM;
2: INITPOSITION;
3: REPEAT
BEGIN
GETREC(IN,RECLENGTH);
BLOCKNO:=IN.ZBLOCK;
INDEX:=0;
WHILE RECLENGTH - INDEX >= LPDATALENGTH DO
BEGIN
PUTREC(OUT,LPLENGTH);
OUT^.CCW:=SP1A;
MOVE(IN^,INDEX,OUT^.DATA,0,LPDATALENGTH);
INDEX:=INDEX + LPDATALENGTH;
END;
PUTREC(OUT,RECLENGTH-INDEX+1);
MOVE(IN^,INDEX,OUT^.DATA,0,RECLENGTH-INDEX);
OUT^.CCW:=SP1A;
END
UNTIL OPTEST <> 0;
WAITZONE(OUT);
OPSTOP;
IF STOPPED = 1 THEN GOTO 1;
IF STOPPED = 3 THEN GOTO 12;
GOTO 3;
! END OF FILE HANDELING !
9: CLOSE(OUT,1);
BLOCKNO:=1; FILENO:=FILENO+1;
IF OPCONT = FIVE THEN
BEGIN
CLOSE(IN,1);
FILENO:=2;
OPMESS(MTMOUNTTAPE);
END;
IF OPCONT = FIFTEEN THEN
BEGIN
CLOSE(IN,REWIND+2);
IF REWIND=-1 THEN FILENO:=2;
OPMESS(EOJTXT);
END;
13: REPEAT OPSTOP UNTIL STOPPED <> 0;
IF STOPPED = 1 THEN GOTO 1;
IF STOPPED = 3 THEN GOTO 12;
OPMESS(RUNTXT);
GOTO 2;
12: OPMESS(SUSTXT);
OUT.ZMODE:=0;
CLOSE(IN,1);
CLOSE(OUT,1);
FILENO:=2;
BLOCKNO:=1;
GOTO 13;
END;
«ff»
«nul»