|
|
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: 28672 (0x7000)
Types: TextFile
Notes: RCSL-43-GL-, RCSL-43-GL-4928, RCSL-43-GL-4931, RCSL-43-GL-4934, RCSL-43-GL-8472, RCSL-43-GL-8473, RCSL-43-GL-8474
Names: »S1049«
└─⟦a59f0a452⟧ Bits:30000472 DOMUS disk image
└─⟦this⟧ »/S1049«
S1049! RCSL: 43-GL8473
AUTHOR: PBP
EDITED: 79.02.05
PROGRAM RC36-01049.01
IBM LABELLED TAPE TO 3740
FORMATTED DISKETTE WITH LOG.
KEYWORDS: MUSIL, CONVERTION, MT0, FD0, SP, FDUNIT0, LISTING.
ABSTRACT: THIS PROGRAM HANDLES IBM LABELLED TAPES WITH A
MAXIMUM BLOCKSIZE OF 2000 BYTES, EACH BLOCK
CONSISTING OF FIXED LENGTH RECORDS WITH
EBCDIC CODE DATA. THE BLOCKS ARE COPIED TO IBM-
DISKETTES WITHOUT CONVERSION.
A LOG CONTAINING STATISTICS FOR THE JOB IS
OUTPUT ON EITHER SERIAL PRINTER OR TTY.
THE PROGRAM MUST BE OPERATED FROM TTY .
RCSL:43-GL8472 ASCII SOURCE
RCSL:43-GL8474 REL.BIN
!«ff»
! RC36-01049 PAGE 01
TITLE: IBM LABELLED TAPE TO 3740 FORMATTED DISKETTE
ABSTRACT: THIS PROGRAM HANDLES IBM LABELLED TAPES WITH A MAXIMUM
BLOCKSIZE OF 2000 BYTES ,CONSISTING OF FIXED LENGTH
RECORDS WITH EBCEDIC CODE DATA. THE BLOCKS ARE COPIED TO
IBM-DISKETTES WITHOUT CONVERSION.
A LOG CONTAINING STATISTICS FOR THE JOB IS
OUTPUT ON EITHER SERIAL PRINTER OR TTY.
THE PROGRAM CAN BE OPERATED FROM TTY .
SIZE: 9838 BYTES. INCLUDING ONE 2000 BYTES INPUT BUFFER
AND TWO 512 BYTES OUTPUT BUFFERS.
DATE: 79.02.05
RUNTIME PARAMETERS:
VOLUME IDENT : (MAX 6 CHARACTERS). DISKETTE VOLUME
IDENT. THE IDENT WILL ALWAYS BE CHECKED ,
SO THIS PARAMETER MUST BE FILLED.
DATASET NAME : (MAX 8 CHARACTERS). NAME OF DATASET
ON DISKETTE.
OUT BLOCKNO : 00001 NEXT RECORD TO BE WRITTEN TO DISKETTE.
DATASET NO : 00001 DATASET NUMBER TO BE READ FROM TAPE.
IN BLOCKNO : 00001 NEXT BLOCK TO BE READ FROM TAPE.
RECORDSIZE : 00080 LENGTH OF INPUT RECORD, MAX. 172.
MT UNIT : 00000 MT UNIT NUMBER. ( 0 - 3 ).
LOGPRINT : + + INDICATES LOG ON SERIAL PRINTER.
- INDICATES LOG ON TTY.
OUTPUT MESSAGES:
PROG NO : 1049 PROGRAM EXECUTION IS STOPPED.
RUNNING : PROGRAM EXECUTION IS STARTED.
SUSPENDED: DRIVERS RELEASED, PROGRAM EXECUTION IS STOPPED.
MOUNT DATA TAPE MT-UNIT IS NOT ON-LINE.
MT ERROR NNNNN CONSULT THE RC3600 OPERATORS MANUAL.
FD ERROR NNNNN CONSULT THE RC3600 OPERTORS MANUAL.
SP ERROR NNNNN CONSULT THE RC3600 OPERATORS MANUAL.
END JOB PROGRAM EXECUTION IS TERMINATED.
!
«ff»
! RC36-001049 PAGE 02
INPUT MESSAGES:
STOP STOPS EXECUTION WRITING PROG NO : 1049.
SUSPEND STOPS PROGRAM EXECUTION RELEASING DRIVERS
<ESC> NEXT PARAMETER IS DISPLAYED.
STATE ALL PARAMETERS ARE DISPLAYED (TTY ONLY).
"TEXT=VALUE" THE PARAMETER IDENTIFIED BY "TEXT" IS
CHANGED TO "VALUE".
LOG LOG IS OUTPUT ON SELECTED DEVICE.
START PROGRAM EXECUTION IS STARTED.
NOTE :AFTER MT ERROR START MEANS ACCEPTING
THE ERRONIOUS INPUT, AFTER FD ERROR START
MEANS REPEATING THE WRITE OPERATION.
"VALUE" CURRENTLY DISPLAYED PARAMETER IS CHANGED
TO "VALUE"
OTHER OUTPUT MESSAGES:
MOUNT LABEL TAPE THE INPUTTAPE HAS NO VOL1 LABEL.
HDRLABEL MISSING THE DATASET HAS NO HDR1 LABEL.
RECODSIZE ERROR THE SPECIFIED RECORDSIZE MUST BE LESS
THAN 172.
DISKETTE VOLUME CONFLICT
VOLUME IDENT ON DISKETTE IS NOT EQUAL
TO SPECIFIED VOLUME IDENT PARAMETER.
DISKETTE FULL-MOUNT NEXT
DISKETTE IS FILLED, MOUNT NEXT AND
WRITE START.
CATALOG FULL CATALOG IS FILLED, AND DISKETTE MUST BE
REINITIALIZED.
BOE ERROR BEGIN OF DATASET IS OUTSIDE DISKETTE OR
NOT IBM STANDARD.
BAD DISKETTE ERMAP NOT FOUND OR DISKETTE CONTAINS DELE-
TED TRACKS.
CATALOG ENTRY IS DEFECT AT DATASET NUMBER NNNNN
CATALOG CONTAINS DELETED SECTORS OR SECTORS
WITH PARITY ERRORS IN DATASET NNNNN.
MOUNT ANOTHER DISKETTE
ERROR ON DISKETTE, MUNT ANOTHER AND WRITE
START, STOP OR SUSPEND.
!
«ff»
! RC36-01049 PAGE 03 !
!
DESCRIPTION OF THE LOG:
THE LOG CONTAINS A HEADLINE DESCRIBING INPUT AND OUTPUT
MEDIUM (DRIVER NAMES), DATE AND TIME.
AFTER THE HEADLINE THE ACTUAL POSITIONS ON INPUT/OUTPUT
DEVICES ARE PRINTED. THE VOLUME-NUMBER/DATASET-NUMBER
AND RECORD/BLOCK NUMBERS ARE USED. (RECORD/BLOCK NUMBERS
ARE THE NEXT RECORD/BLOCK TO BE WRITTEN).
THE "TOTAL STATISIICS FOR JOB" CONTAINS THE TOTAL AMOUNT
OF RECORDS/BLOCKS HAVING BEEN READ/WRITTEN.
THE "JOB STATUS" DESCRIBES THE ACTUAL STATE OF THE JOB:
NOT STARTED AFTER LOAD OF PROGRAM OR END OF JOB.
STOPPED JOB IS STOPPED BU OPERATOR.
RUNNING JOB IS RUNNING OR WAITING FOR NEW INPUT/
OUTPUT MEDIUM.
END OF JOB NORMAL TERMINATION OF JOB.
I/O ERROR NNN ERROR NNN ON INPUT/OUTPUT DEVICE, CONSULT
OPERATORS MANUAL.
SUSPENDED THE JOB IS TERMINATED BY THE SUSPEND COMMAND.
SPECIAL REQIREMENTS:
P0149 RCSL: 43-GL4928
P0150 RCSL: 43-GL4931
P0151 RCSL: 43-GL4934
FILL RCSL: 43-GLXXXX
!
«ff»
!RC36-01049 PAGE 03A!
CONST
NOQ= 9,
OPTXTS=
'<10>PROG NO : 1049<0>
<10>VOLUME IDENT : <0>
<10>DATASET NAME : <0>
<10>OUT BLOCKNO : <0>
<10>DATASET NO : <0>
<10>IN BLOCKNO : <0>
<10>RECORDSIZE : <0>
<10>MTUNIT : <0>
<10>LOGPRINT : <0>',
START= 'START',
STOP= 'STOP',
SUSPEND= 'SUSPEND',
STATE= 'STATE',
NEXTPARAM= '<27>',
ENDLINE= '<13><0>',
NL= '<10>',
RETURN= '<13>',
MINUS= '-',
PLUS= '+',
RUNTXT= '<10>RUNNING<13>',
MTTXT= '<7><10>MT ERROR ',
FDTXT= '<7><10>FD ERROR ',
EOJTXT= '<14><7><10>END JOB<13><0>',
SUSTXT= '<7><10>SUSPENDED<13><0>',
MTMOUNTTAPE= '<14><7><10>MOUNT DATA TAPE<13><0>',
MAXBLOCK= 1912,
FALSE= -2,
TRUE= -1,
IDLE= 0,
RUNNING= 1,
STOPPING= 2,
HARDBITCHECK= 5,
FIRSTOFFLINE= 6,
B10= 32,
IBMSPACE= "<64>",
EBL= "<211>",
BOE= "<240><241><240><240><241>",
C= "<195>",
EBEOD= "<247><244><240><240><241>",
EBC128= '<241><242><248>',
U= 0,
UB= 1,
«ff»
!RC36-01049 PAGE 04 !
CHANGE= '<7><10>MOUNT ANOTHER DISKETTE<10>',
CHANGEDISK= '<7><10>DISCETTE FULL - MOUNT NEXT DISKETTE <10>",
RLTOOLONG= '<7><10>RECORDSIZE ERROR<10>',
CATFAIL= '<7><10>CATALOG ENTRY IS DEFECT AT DATASET NUMBER <10>',
FREERMAP= "<197><217><212><193><215><64><64><64><64><64><64>",
NOTPOSS= '<7><10>BAD DISKETTE<10>',
DSNLIMIT= '<7><10>CATALOG FULL<10>',
BOEERROR= '<7><10>BOE ERROR<13><0>',
MOUNTTXT= '<7><10>MOUNT LABEL TAPE<13><0>',
HDRMIS= '<7><10>HDRLABEL MISSING<13><0>',
WRONGVOL= '<7><10>DISKETTE VOLUME CONFLICT<10>',
WRONGUNIT= '<7><10>MT UNIT CONFLICT<13><0>',
INITINF= '<0><0><0><0><0><0><0><0><0><0>',
VOL1= '<229><214><211><241>',
HDR1= '<200><196><217><241>',
! ** LOGTEXTS ** !
LOGCMMD= 'LOG',
TTYNAME= 'TTY<0>',
LPTNAME= 'SP<0><0>',
NEWL= '<10><10>',
LOGHEAD='** MT UNIT X TO FD0 ** DATE ........ TIME ........<10><10>',
POSHEAD= 'POSITIONS ON INPUT AND OUTPUT:<10><10>',
PTEXT1= 'DISKETTE ... RECORD .....<10>',
PTEXT2= 'DATASET ... BLOCK .....<10>',
STATHEAD= '<10>TOTAL STATISTICS FOR JOB<10><10>',
STEXT1= 'READ: ..... BLOCKS<10>',
STEXT2= 'WRITTEN: ..... RECORDS<10>',
STATUSHEAD= '<10>JOB STATUS: ',
! PROGRAM STATES !
INITEXT= 'NOT STARTED',
RUNTEXT= 'RUNNING',
STOPTEXT= 'STOPPED',
SUSPTEXT= 'SUSPENDED',
EOJTEXT= 'END OF JOB',
ERRTEXT= 'I/O ERROR ..... ',
LPTTXT= 'SP ERROR ',
RUNNI= 2,
PSTOP= 3,
PSUSP= 4,
PEOJ= 5,
IOERROR= 6,
FDUNIT= 0,
«ff»
! RC36-01049 PAGE 05 !
! EBCDIC TO ASCII CONVERSION TABLE : !
EATAB=! 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 32 32 32 32 32 32 32
! 40 ! 32 32 32 32 32 32 32 32
! 48 ! 32 32 32 32 32 32 32 32
! 56 ! 32 32 32 32 32 32 32 32
! 64 ! 32 32 32 32 32 32 32 32
! 72 ! 32 32 32 46 60 40 43 94
! 80 ! 38 32 32 32 32 32 32 32
! 88 ! 32 32 33 36 42 41 59 94
! 96 ! 45 47 32 32 32 32 32 32
! 104 ! 32 32 124 44 37 95 62 63
! 112 ! 32 32 32 32 32 32 32 32
! 120 ! 32 32 58 35 64 39 61 34
! 128 ! 32 65 66 67 68 69 70 71
! 136 ! 72 73 32 32 32 32 32 32
! 144 ! 32 74 75 76 77 78 79 80
! 152 ! 81 82 32 32 32 32 32 32
! 160 ! 32 126 83 84 85 86 87 88
! 168 ! 89 90 32 32 32 91 32 32
! 176 ! 32 32 32 32 32 32 32 32
! 184 ! 32 32 32 32 32 93 32 32
! 192 ! 123 65 66 67 68 69 70 71
! 200 ! 72 73 32 32 32 32 32 32
! 208 ! 125 74 75 76 77 78 79 80
! 216 ! 81 82 32 32 32 32 32 32
! 224 ! 92 32 83 84 85 86 87 88
! 232 ! 89 90 32 32 32 32 32 32
! 240 ! 48 49 50 51 52 53 54 55
! 248 ! 56 57 94 32 32 32 32 32
#,
«ff»
! RC36-01049 PAGE 07 !
! ASCII TO EBCDIC CONVERSION TABLE : !
ASCTOEB= ! 0 1 2 3 4 5 6 7!
#
! 0 ! 64 64 64 64 64 64 64 64
! 8 ! 64 64 64 64 64 64 64 64
! 16 ! 64 64 64 64 64 64 64 64
! 24 ! 64 64 64 64 64 64 64 64
! 32 ! 64 90 127 123 91 108 80 125
! 40 ! 77 93 92 78 107 96 75 97
! 48 ! 240 241 242 243 244 245 246 247
! 56 ! 248 249 122 94 76 126 110 111
! 64 ! 124 193 194 195 196 197 198 199
! 72 ! 200 201 209 210 211 212 213 214
! 80 ! 215 216 217 226 227 228 229 230
! 88 ! 231 232 233 173 224 189 250 109
! 96 ! 121 129 130 131 132 133 134 135
! 104 ! 136 137 145 146 147 148 149 150
! 112 ! 151 152 153 162 163 164 165 166
! 120 ! 167 168 169 192 106 208 161 7
#;
«ff»
! RC36-01049 PAGE 07 !
VAR
OPDUMMY: STRING(2); ! RUNTIME PARAMETERS!
PROGNO: INTEGER;
TPAR1: INTEGER;
TPAR2: INTEGER;
OBLOCK: INTEGER;
DATASET: INTEGER;
BLOCKNO: INTEGER;
RECSIZE: INTEGER;
MTUNIT: INTEGER;
LOGPRINT: INTEGER;
OPTEXT: STRING(20); !COMMUNICATION AREA!
OPSTRING: STRING(20);
OPDEC: STRING(10);
ERRORNO: INTEGER; !INTERNAL VARIABLES!
MASK: INTEGER;
TOM: INTEGER;
SIGN: INTEGER;
Q: INTEGER;
PAR: INTEGER;
P1: INTEGER;
P2: INTEGER;
P3: INTEGER;
STOPPED: INTEGER;
S1: STRING(2);
S2: STRING(2);
S3: STRING(1);
EOD: INTEGER;
L1: INTEGER;
L: INTEGER;
NEWDSN: INTEGER;
RUNNINGSTATUS: INTEGER;
HELP2: STRING(6);
HELP: STRING(6);
EOFSWITCH: INTEGER;
INDEX: INTEGER;
INBLOK: INTEGER;
FILENO: INTEGER;
SIZE: INTEGER;
COUNT: INTEGER;
LENGTH: INTEGER;
POS: INTEGER;
VOLNAME: STRING(6);
DATESTR: STRING(6);
DATE1: STRING(8);
VOLID: STRING(7);
DATASETNAME: STRING(9);
HELP1: INTEGER;
HELP3: INTEGER;
«ff»
! RC36-01049 PAGE 08 !
DISKBUF: RECORD
DATA: STRING(80);
BEG: STRING(4) FROM 1;
DSN: STRING(8) FROM 6;
RLE: STRING(3) FROM 25;
BOE: STRING(5) FROM 29;
EOE: STRING(5) FROM 35;
MVI: STRING(1) FROM 45;
VSN: STRING(2) FROM 46;
CDT: STRING(6) FROM 48;
EDT: STRING(6) FROM 67;
EOD: STRING(5) FROM 75
END;
! ** LOG VARIABLES ** !
NEXTLP: INTEGER;
PSTATE: INTEGER;
TAPENO: INTEGER;
RECTOTAL: INTEGER;
SAVEIN: INTEGER;
SAVEOUT: INTEGER;
DELETEIN: INTEGER;
DELETEOUT: INTEGER;
BFACTOR: INTEGER;
SECTORNO: INTEGER;
LDATE: STRING(8);
LHELP: STRING(6);
«ff»
!RC36-01049 PAGE 09 !
IN: FILE
'MT0',
14,
1,
2000,
U;
GIVEUP MTINERROR,
2'0110001111111110
OF STRING(1);
OUT: FILE
'FD0',
14,
2,
512,
UB;
GIVEUP FDERROR,
2'1110011111111110
OF RECORD
MAX: STRING(128);
BEG: STRING(4) FROM 1;
VOL: STRING(6) FROM 5;
DSN: STRING(8) FROM 6;
RLE: STRING(3) FROM 25;
BOE: STRING(5) FROM 29;
EOE: STRING(5) FROM 35;
MVI: STRING(1) FROM 45;
VSN: STRING(2) FROM 46;
CDT: STRING(6) FROM 48;
EDT: STRING(6) FROM 67;
EOD: STRING(5) FROM 75
END;
LOG: FILE ! LOG FILE DESCRIPTION !
'SP', ! NAME OF DEVICE DRIVER !
1, ! KIND= CHAR ORIENTED !
1, ! BUFFERS !
80, ! SHARESIZE !
U; ! UNDEFINED !
GIVEUP
LOGERROR, ! LOG ERROR PROCEDURE !
2'1100001011110110 ! GIVE UP MASK !
OF STRING(80);
«ff»
! RC36-01049 PAGE 10 !
PROCEDURE GETTIME(VAR TIME : STRING(8));
CODEBODY P0149;
PROCEDURE GETLDATE(VAR DATE: STRING(8));
CODEBODY P0150;
PROCEDURE PRINTLOG;
BEGIN
IF LOGPRINT=TRUE THEN
LOG.ZNAME:=LPTNAME
ELSE
LOG.ZNAME:=TTYNAME;
OPEN(LOG,3);
OUTTEXT(LOG,NEWL);
! LOG - HEAD !
GETLDATE(LDATE);
MOVE(LDATE,0,LOGHEAD,29,8);
GETTIME(LDATE);
MOVE(LDATE,0,LOGHEAD,43,8);
INSERT(MTUNIT+48,LOGHEAD,11);
OUTTEXT(LOG,LOGHEAD);
! ACTUAL POSITIONS !
BINDEC(TAPENO,LHELP);
MOVE(LHELP,2,PTEXT1,11,3);
BINDEC(OBLOCK,LHELP);
MOVE(LHELP,0,PTEXT1,24,5);
BINDEC(DATASET,LHELP);
MOVE(LHELP,2,PTEXT2,11,3);
BINDEC(BLOCKNO,LHELP);
MOVE(LHELP,0,PTEXT2,24,5);
OUTTEXT(LOG,POSHEAD);
OUTTEXT(LOG,PTEXT2);
OUTTEXT(LOG,PTEXT1);
! STATISTICS !
BINDEC(BLOCKNO-1,LHELP);
MOVE(LHELP,0,STEXT1,11,5);
BINDEC(RECTOTAL,LHELP);
MOVE(LHELP,0,STEXT2,11,5);
OUTTEXT(LOG,STATHEAD);
OUTTEXT(LOG,STEXT1);
OUTTEXT(LOG,STEXT2);
! PROGRAM STATE !
OUTTEXT(LOG,STATUSHEAD);
IF PSTATE = 1 THEN OUTTEXT(LOG,INITEXT);
IF PSTATE = RUNNI THEN OUTTEXT(LOG,RUNTEXT);
IF PSTATE = PSTOP THEN OUTTEXT(LOG,STOPTEXT);
IF PSTATE = PSUSP THEN OUTTEXT(LOG,SUSPTEXT);
IF PSTATE = PEOJ THEN OUTTEXT(LOG,EOJTEXT);
IF PSTATE = IOERROR THEN
BEGIN
BINDEC(ERRORNO,LHELP);
MOVE(LHELP,0,ERRTEXT,12,5);
OUTTEXT(LOG,ERRTEXT);
END;
OUTTEXT(LOG,NEWL);
CLOSE(LOG,1);
END;
«ff»
! RC36-01049 PAGE 11 !
PROCEDURE FILL(CONST CHAR: INTEGER;
VAR TEXT: STRING(1);
CONST POS: INTEGER;
CONST LGT: INTEGER);
CODEBODY;
PROCEDURE OPSTOP;
BEGIN
OPWAIT(LENGTH);
OPTEXT:=OPSTRING;
OPIN(OPSTRING);
STOPPED:= 0;
IF OPTEXT = LOGCMMD THEN PRINTLOG;
IF OPTEXT=STOP THEN STOPPED:= 1;
IF OPTEXT=START THEN STOPPED:= 2;
IF OPTEXT=SUSPEND THEN STOPPED:=3;
END;
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-001049 PAGE 12 !
PROCEDURE OPCOM;
BEGIN
1000: Q:=0;
1010: REPEAT BEGIN
IF OPTEXT=STATE THEN
BEGIN Q:=1;
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 = -3 THEN OPMESS(VOLID);
IF PAR = -4 THEN OPMESS(DATASETNAME);
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 OPTEXT=SUSPEND THEN GOTO 12;
IF LENGTH > 6 THEN DIRECTUPDATE;
IF OPTEXT = START THEN GOTO 1070;
IF OPTEXT = STOP THEN GOTO 1000;
IF OPTEXT = LOGCMMD THEN BEGIN PRINTLOG; GOTO 1040; END;
IF OPTEXT = NEXTPARAM THEN GOTO 1060;
IF OPTEXT = NL THEN GOTO 1020;
IF OPTEXT = ENDLINE THEN GOTO 1020;
IF PAR = -3 THEN
BEGIN
IF LENGTH > 7 THEN LENGTH := 7;
VOLID:=INITINF;
MOVE(OPTEXT,0,VOLID,0,LENGTH-1);
GOTO 1055;
END;
IF PAR = -4 THEN
BEGIN
IF LENGTH >9 THEN LENGTH:=9;
DATASETNAME:=INITINF;
IF BYTE OPTEXT < 65 THEN GOTO 1020;
INDEX:=0;
REPEAT
BEGIN
MOVE (OPTEXT,INDEX,S3,0,1);
IF BYTE S3 = 32 THEN GOTO 1020;
INDEX:=INDEX+1;
END
UNTIL INDEX >= LENGTH-1;
MOVE(OPTEXT,0,DATASETNAME,0,LENGTH-1);
END;
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);
1055: 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-01049 PAGE 13 !
PROCEDURE CHANGEFD;
BEGIN
CLOSE(OUT,1);
REPEAT
BEGIN
OPSTOP;
IF STOPPED = 1 THEN BEGIN PSTATE:=PSTOP; GOTO 1; END;
IF STOPPED = 3 THEN GOTO 12;
END
UNTIL OPTEXT = START;
END;
PROCEDURE TESTCATALOGSECTOR;
BEGIN
L:=0;
REPEAT
OUT.ZMODE:=FDUNIT*256+3+B10;
OUT.ZSHAREL:=128;
OUT.ZREM:=OUT.ZSHAREL;
TRANSFER(OUT,0,FDUNIT*256);
WAITTRANSFER(OUT);
SETPOSITION(OUT,0,NEWDSN);
PUTREC(OUT,128); OUT^:=DISKBUF.DATA;
FILL(0,OUT^,80,48);
CLOSE(OUT,0);
RUNNINGSTATUS:=HARDBITCHECK;
OUT.ZMODE:=FDUNIT*256+1+B10;
OUT.ZSHAREL:=128;
TRANSFER(OUT,0,FDUNIT*256);
WAITTRANSFER(OUT);
SETPOSITION(OUT,0,NEWDSN);
GETREC(OUT,L1)
UNTIL RUNNINGSTATUS = HARDBITCHECK;
IF L >= 6 THEN
BEGIN
BINDEC(NEWDSN-7,HELP);
MOVE(HELP,3,CATFAIL,43,2);
OPMESS(CATFAIL);
CHANGEFD;
END;
END;
«ff»
! RC36-01049 PAGE 14 !
PROCEDURE INITPOSITION;
BEGIN
199: IF RECSIZE > 172 THEN
BEGIN
OPMESS(RLTOOLONG);
GOTO 290;
END;
IF IN.ZMODE = 0 THEN
BEGIN
INSERT(MTUNIT+48,IN.ZNAME,2);
IF MTUNIT >= 0 THEN IF MTUNIT <= 3 THEN GOTO 205;
OPMESS(WRONGUNIT);
GOTO 290;
205: FILENO:=1;
BFACTOR:=1;
IF RECSIZE > 128 THEN BFACTOR:=2;
OPEN(IN,1);
SETPOSITION(IN,1,1);
GETREC(IN,SIZE);
IF IN^ <> VOL1 THEN
BEGIN
OPMESS(MOUNTTXT);
210: CLOSE(IN,TRUE);
GOTO 290;
END;
INBLOK:=2;
IF DATASET > 1 THEN
BEGIN
INBLOK:=1;
FILENO:=(DATASET-1)*3 +1;
END;
SETPOSITION(IN,FILENO,INBLOK);
GETREC(IN,SIZE);
IF IN^ <> HDR1 THEN
BEGIN
OPMESS(HDRMIS);
GOTO 210;
END;
FILENO:=FILENO+1;
INBLOK:=1;
CLOSE(IN,0);
IN.ZFORM:=UB;
OPEN(IN,1);
GOTO 299;
290: REPEAT OPSTOP UNTIL STOPPED <> 0;
IF STOPPED = 1 THEN GOTO 1;
IF STOPPED = 3 THEN GOTO 12;
GOTO 199;
END;
299: SETPOSITION(IN,FILENO,BLOCKNO);
END;
«ff»
! RC36-01049 PAGE 15 !
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
IN.Z0:=IN.Z0 AND 8'177757;
IF IN.Z0 SHIFT 7 < 0 THEN
BEGIN
EOFSWITCH:=1;
GOTO 9;
END;
IF IN.Z0 SHIFT 1 < 0 THEN OPMESS(MTMOUNTTAPE);
IF IN.Z0 SHIFT 1 > 0 THEN
BEGIN
OPMESS(MTTXT);
MASK:=IN.Z0;
SHOWERROR;
PSTATE:=IOERROR;
END;
IF IN.Z0<>0 THEN
BEGIN
2999: REPEAT OPSTOP UNTIL STOPPED <> 0;
IF STOPPED = 1 THEN GOTO 2999;
IF STOPPED=3 THEN GOTO 12;
OPMESS(RUNTXT);
END;
3000: END;
«ff»
! RC36-01049 PAGE 16 !
PROCEDURE LOGERROR;
BEGIN
NEXTLP:= LOG.Z0 AND 8'000020;
LOG.Z0:=LOG.Z0 - NEXTLP;
IF LOG.Z0 SHIFT 1 < 0 THEN LOG.Z0:= LOG.Z0 AND 8'041342;
IF LOG.Z0 = 8'040000 THEN IF NEXTLP <> 0 THEN
LOG.Z0:= NEXTLP;
IF LOG.Z0 AND 8'001342 <> 0 THEN
LOG.Z0:=LOG.Z0 AND 8'001342;
IF LOG.Z0 <> 0 THEN
BEGIN
OPMESS(LPTTXT);
MASK:=LOG.Z0;
SHOWERROR;
NEXTLP:=0;
4000: OPWAIT(LENGTH);
OPTEXT:=OPSTRING;
OPIN(OPSTRING);
IF OPTEXT = START THEN
BEGIN
IF LOG.Z0 AND 8'141342 <> 0 THEN
REPEATSHARE(LOG);
END ELSE
GOTO 4000;
END;
END;
PROCEDURE INITSTAT;
BEGIN
PSTATE := 1;
TAPENO := 1;
RECTOTAL := 0;
SAVEIN := 1;
SAVEOUT := 1;
END;
PROCEDURE OUTUPDATE;
BEGIN
OBLOCK:=(OUT.ZBLOCK-POS+BFACTOR-1)/BFACTOR;
SAVEOUT:=OBLOCK;
END;
«ff»
!RC36-01049 PAGE 17 !
PROCEDURE FDERROR;
BEGIN
IF RUNNINGSTATUS = FIRSTOFFLINE THEN
BEGIN
RUNNINGSTATUS:=RUNNING;
REPEATSHARE(OUT);
END;
IF RUNNINGSTATUS = HARDBITCHECK THEN
IF OUT.Z0 AND 8'000052 <> 0 THEN
BEGIN
L:=L+1;OUT.ZREM:=1;
IF L < 6 THEN RUNNINGSTATUS:= STOPPING;
GOTO 400;
END;
IF OUT.Z0 <> 0 THEN
BEGIN
OPMESS(FDTXT);
MASK:=OUT.Z0;
SHOWERROR;
PSTATE:=IOERROR;
REPEAT OPSTOP UNTIL STOPPED > 1;
IF STOPPED = 3 THEN GOTO 12;
OPMESS(RUNTXT);
END;
REPEATSHARE(OUT);
400:
END;
PROCEDURE TRACKSE; !HANDLES EXEPTIONS IN TRACK-SECTOR CALCULATION!
BEGIN
IF L = 0 THEN
BEGIN
L:=26;
L1:=L1-1;
END;
BINDEC(L,HELP2);
BINDEC(L1,HELP);
MOVE(HELP,3,HELP2,0,2);
END;
PROCEDURE LASTBUFFER;
BEGIN
IF OUT.ZREM > 0 THEN
BEGIN
HELP3:=OUT.ZREM;
PUTREC(OUT,HELP3);
FILL(64,OUT^,0,HELP3);
END;
WAITZONE(OUT);
END;
«ff»
!RC36-01049 PAGE 18 !
PROCEDURE TERMINATE;
BEGIN
LASTBUFFER;
OUTUPDATE;
EOD:=OUT.ZBLOCK-HELP3/128;
L1:=EOD/26; !TRACK!
L:=EOD-L1*26; !SECTOR!
TRACKSE;
CONVERT(HELP2,DISKBUF.EOD,ASCTOEB,5);
L:=L-1;
TRACKSE;
CONVERT(HELP2,DISKBUF.EOE,ASCTOEB,5);
!WRITE NEW HEADER AND TEST FOR HARD ERROR !
IF EOFSWITCH = 1 THEN
BEGIN
IF COUNT = 1 THEN DISKBUF.MVI:=IBMSPACE
ELSE DISKBUF.MVI:=EBL;
END ELSE
DISKBUF.MVI:=C;
EOFSWITCH:=0;
BINDEC(COUNT,HELP2); CONVERT(HELP2,HELP,ASCTOEB,6);
MOVE(HELP,3,DISKBUF.VSN,0,2);
TESTCATALOGSECTOR;
CLOSE(OUT,1);
END;
PROCEDURE DISKPOSITION;
BEGIN
SECTORNO:=OBLOCK+POS;
IF BFACTOR = 2 THEN SECTORNO:=OBLOCK*BFACTOR+POS-1;
SETPOSITION(OUT,0,SECTORNO);
END;
«ff»
!RC36-01049 PAGE 19 !
PROCEDURE CHECKDISKETTE;
BEGIN
FILL(64,DISKBUF.DATA,0,80);
40: RUNNINGSTATUS:=FIRSTOFFLINE;
NEWDSN:=8;
LENGTH:=128;
OUT.ZMODE:=FDUNIT*256+17+B10;
OUT.ZSHAREL:=128;
OUT.ZREM:=0;
TRANSFER(OUT,0,FDUNIT*256);
WAITTRANSFER(OUT);
SETPOSITION(OUT,0,5);
RUNNINGSTATUS:=RUNNING;
GETREC(OUT,LENGTH);
IF OUT^ <> FREERMAP THEN !CHECK OF ERMAP!
BEGIN
OPMESS(NOTPOSS);
OPMESS(CHANGE);
CHANGEFD;
GOTO 40;
END;
SETPOSITION(OUT,0,7);
GETREC(OUT,LENGTH);
CONVERT(VOLID,VOLNAME,ASCTOEB,6);
IF OUT^.VOL <> VOLNAME THEN
BEGIN
OPMESS(WRONGVOL);
CHANGEFD;
GOTO 40;
END;
SETPOSITION(OUT,0,NEWDSN);
GETLDATE(DATE1);
MOVE(DATE1,0,DATESTR,0,2);
MOVE(DATE1,3,DATESTR,2,5); MOVE(DATE1,6,DATESTR,4,2);
50: GETREC(OUT,LENGTH);
IF NEWDSN > 26 THEN
BEGIN
OPMESS(DSNLIMIT);
OPMESS(CHANGE);
CHANGEFD;
GOTO 40;
END;
IF OUT^ = HDR1 THEN !BRAND NEW DISKETTE!
IF OUT^.BOE = OUT^.EOD THEN GOTO 53
ELSE ! SEARCH FOR FREE DATASET !
BEGIN
NEWDSN:=NEWDSN + 1;
GOTO 50;
END;
SETPOSITION(OUT,0,NEWDSN-1);
GETREC(OUT,LENGTH);
53: DISKBUF.BOE:=OUT^.EOD;
IF DISKBUF.BOE > EBEOD THEN GOTO 55;
IF DISKBUF.BOE < BOE THEN
BEGIN
55: OPMESS(BOEERROR);
OPMESS(CHANGE);
CHANGEFD;
GOTO 40;
END;
«ff»
! RC36-01049 PAGE 20 !
CONVERT(DISKBUF.BOE,HELP,EATAB,5);
INSERT(0,HELP,2);
DECBIN(HELP,POS);
MOVE(HELP,3,HELP,0,2);
DECBIN(HELP,LENGTH);
POS:= POS*26 + LENGTH;
IF POS >= MAXBLOCK THEN
BEGIN
OPMESS(CHANGEDISK);
CHANGEFD;
GOTO 40;
END;
CLOSE(OUT,0);
COUNT:=COUNT+1;
OUT.ZMODE:=FDUNIT*256+3+B10;
OUT.ZSHAREL:=128;
OUT.ZREM:=0;
TRANSFER(OUT,0,FDUNIT*256);
WAITTRANSFER(OUT);
SETPOSITION(OUT,0,POS);
POS:=POS-1;
IF RECSIZE <= 128 THEN
BEGIN
BINDEC(RECSIZE,HELP2);
CONVERT(HELP2,HELP,ASCTOEB,6);
MOVE(HELP,2,DISKBUF.RLE,0,3);
END ELSE
DISKBUF.RLE:=EBC128;
DISKBUF.BEG:=HDR1;
CONVERT(DATESTR,DISKBUF.CDT,ASCTOEB,6);
CONVERT(DATASETNAME,DISKBUF.DSN,ASCTOEB,8);
OUT.ZSHAREL:=512;
OUT.ZREM:=OUT.ZSHAREL;
END;
«ff»
!RC36-01049 PAGE 21!
BEGIN
IN.ZBLOCK:=1;NEWDSN:=8;BLOCKNO:=1;FILENO:=1;
RECSIZE:=80;EOFSWITCH:=0;COUNT:=0;DATASET:=1;
OPIN(OPSTRING); RUNNINGSTATUS:=IDLE;
TPAR1:=-3; TPAR2:=-4; VOLID:=INITINF; DATASETNAME:=INITINF;
MTUNIT:=0; LOGPRINT:=TRUE; OBLOCK:=1; HELP3:=0;
INITSTAT;
1: OPCOM;
2: INITPOSITION;
IF OUT.ZMODE = 0 THEN CHECKDISKETTE;
DISKPOSITION;
3: REPEAT !MAIN LOOP!
DELETEIN:=SAVEIN-BLOCKNO;
DELETEOUT:=SAVEOUT-OBLOCK;
GETREC(IN,RECSIZE);
BLOCKNO:=IN.ZBLOCK;
SAVEIN:=BLOCKNO;
PSTATE:=RUNNI;
INDEX:=0;
WHILE RECSIZE-INDEX >= 128 DO
BEGIN
PUTREC(OUT,128);
MOVE(IN^,INDEX,OUT^,0,128);
INDEX:=INDEX+128;
END;
PUTREC(OUT,128);
MOVE(IN^,INDEX,OUT^,0,RECSIZE-INDEX);
FILL(64,OUT^,RECSIZE-INDEX,128-(RECSIZE-INDEX));
RECTOTAL:=RECTOTAL+1;
OUTUPDATE;
IF DELETEIN = DELETEOUT THEN
RECTOTAL:=RECTOTAL-DELETEIN;
IF DELETEIN > DELETEOUT THEN
RECTOTAL:=RECTOTAL-DELETEOUT;
IF OUT.ZBLOCK >= MAXBLOCK THEN
BEGIN
TERMINATE;
OPMESS(CHANGEDISK);
CHANGEFD;
TAPENO:=TAPENO+1;
CHECKDISKETTE;
END
UNTIL OPTEST <> 0;
IF OPSTRING = LOGCMMD THEN GOTO 5;
LASTBUFFER;
5: OUTUPDATE;
OPSTOP;
IF STOPPED = 1 THEN BEGIN PSTATE:=PSTOP; GOTO 1; END;
IF STOPPED = 3 THEN GOTO 12;
GOTO 3;
«ff»
! RC36-01049 PAGE 22 !
! END OF MT FILE !
9: TERMINATE;
PSTATE:=PEOJ;
OPMESS(EOJTXT);
GOTO 13;
! SUSPEND !
12: OUT.ZMODE:=0;
CLOSE(OUT,1);
PSTATE:=PSUSP;
OPMESS(SUSTXT);
! END OF JOB !
13: CLOSE(IN,1);
PRINTLOG;
INITSTAT;
BLOCKNO:=1;
FILENO:=1;
DATASET:=1;
OBLOCK:=1;
IN.ZFORM:=U;
COUNT:=0;
HELP3:=0;
REPEAT OPSTOP UNTIL STOPPED <> 0;
IF STOPPED = 1 THEN GOTO 1;
IF STOPPED = 3 THEN GOTO 12;
OPMESS(RUNTXT);
GOTO 2;
END;
«ff»
«nul»