DataMuseum.dk

Presents historical artifacts from the history of:

RegneCentralen RC3600/RC7000

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

See our Wiki for more about RegneCentralen RC3600/RC7000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦cfa3fc856⟧ TextFile

    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«

Derivation

└─⟦a59f0a452⟧ Bits:30000472 DOMUS disk image
    └─ ⟦this⟧ »/S1049« 

TextFile

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»