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

⟦bbd8e26f8⟧ TextFile

    Length: 33280 (0x8200)
    Types: TextFile
    Notes: RCSL-43-GL-4928, RCSL-43-GL-4931, RCSL-43-GL-4934, RCSL-43-GL-8545, RCSL-43-GL-8547, RCSL-46-GL-8546
    Names: »S1052«

Derivation

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

TextFile

!						RCSL  : 46-GL8546

						AUTHOR:	PBP

						EDITED:	79.02.12
























		PROGRAM RC36-01052.01

		3740 DISKETTE TO LABELLED MAG-TAPE WITH LOG.








KEYWORDS:	MUSIL,CONVERSION,B3740,MTA,SP,LISTING

ABSTRACT:	THIS PROGRAM HANDLES DISKETTES WRITTEN
		IN IBM 3740 FORMAT WITH EBCDIC DATA.
		OUTPUT IS ON STANDARD IBM OS LABELLED MAGNETIC
		TAPES WITH EBCDIC CODE DATA. THE INPUT RECORDS
		ARE MAX. 512 CHARACTERS. ONE INPUT RECORD
		IS ONE BLOCK ON THE MAGNETIC TAPE. THE MAGNETIC
		TAPE WILL ONLY CONTAIN ONE DATASET.
		A LOG CONTAINING STATISTICS FOR THE JOB IS
		OUTPUT ON EITHER SERIAL PRINTER OR TTY.
		THE PROGRAM MUST BE OPERATED FROM TTY.

RCSL 43-GL8545:	ASCII SOURCE TAPE	
RCSL 43-GL8547:	REL.BIN/TTY		!
«ff»
!						RC36-01052 PAGE 01




TITLE:		3740 DISKETTE TO LABELLED MAG-TAPE WITH LOG.

ABSTRACT:	THIS PROGRAM HANDLES DISKETTES WRITTEN
		IN IBM 3740 FORMAT WITH EBCDIC DATA.
		OUTPUT IS ON STANDARD IBM OS LABELLED MAGNETIC
		TAPES WITH EBCDIC CODE DATA. THE INPUT RECORDS
		ARE MAX. 512 CHARACTERS. ONE INPUT RECORD
		IS ONE BLOCK ON THE MAGNETIC TAPE. THE MAGNETIC
		TAPE WILL ONLY CONTAIN ONE DATASET.
		A LOG CONTAINING STATISTICS FOR THE JOB IS
		OUTPUT ON EITHER SERIAL PRINTER OR TTY.
		THE PROGRAM MUST BE OPERATED FROM TTY.


SIZE:		9510 BYTES. INCLUDING TWO 512 BYTES INPUT BUFFERS
		AND TWO 256 BYTES OUTPUT BUFFER.


DATE:           79.02.12.

RUNTIME PARAMETERS:

    VOLUME IDENT :		(MAX 6 CHARACTERS). DISKETTE VOLUME
				IDENT. IF THIS PARAMETER IS EMPTY,
				NO CHECK OF VOLUME IDENT ON DISKETTE
				IS PERFORMED.

    DATASET NAME   :		(MAX 8 CHARACTERS). NAME OF DATASET
				ON DISKETTE TO BE CONVERTED. IF THIS
				PARAMETER IS EMPTY, ALL DATASETS WILL
				BE TRANSFERRED.
    IN BLOCKNO     : 00001	NEXT RECORD TO BE READ FROM DISKETTE.
    RECORDSIZE     : 00172	OUTPUT RECORDSIZE MAX. 256 CHARACTERS.
    LABELCHECK     :   +	INDICATES IF EXPIRATION DATE ON THE OUTPUT
				TAPE SHOULD BE CHECKED BEFORE WRITING.
    VOL SER NO     :		(MAX. 6 CHARACTERS)
				  IF THIS PARAMETER IS EMPTY, THE OUTPUTTAPE
				MUST CONTAIN A VOLUME LABEL. AFTER
				PROCESSING THIS PARAMETER CONTAINS
				THE VOLUME SERIAL NUMBER.
				  IF THE PARAMETER IS NON EMPTY AND THE
				OUTPUTTAPE HAS A VOLUME LABEL, THEN
				THE VOLUME SERIAL NUMBER MUST BE THE
				SAME AS THE PARAMETER.
				  FINALLY, IF THE PARAMETER IS NON-
				EMPTY AND THE OUTPUTTAPE HAS NO
				VOLUME LABEL, A VOLUME LABEL WITH THIS
				SERIAL NUMBER IS CREATED.
    DATA IDENTIFIER:		(MAX.17 CHARACTERS)
    EXPIRATION DATE: 00000	(5 DIGITS) YYDDD (DDD: DAY-NO - YY: YEAR).
    OUT BLOCKNO    : 00001	NEXT BLOCK TO BE WRITTEN TO MAGTAPE.
    MT UNIT	   : 00000	MT UNIT NUMBER. ( 0 - 3 ).
    MT DENSITY     : 1600 	1600/800.
    LOGPRINT       :  + 	+ INDICATES LOG ON SERIAL PRINTER.
				- INDICATES LOG ON TTY.


«ff»
						RC36-01052 PAGE 02


OTHER OUTPUT MESSAGES:

    CONTSTATE:  +/-	STATE OF CONTINUE SWITCH.
			CONTSTATE=+ MEANS THAT MORE DISKETTES SHALL
			BE COPIED INTO ONE OUTPUTFILE.
			CONTSTATE=- MEANS THAT THE JOB IS TERMINATED
			AT END OF FILE FROM DISKETTE.
    PROG NO  :  1052	PROGRAM EXECUTION IS STOPPED.
    RUNNING		PROGRAM EXECUTION IS STARTED.
    MOUNT NEXT DISKETTE	END OF FILE WAS MET ON DISKETTE.
			AND CONTSTATE=+.
			    WRITE START, STOP OR CONT. (CONT WILL
			    TERMINATE THE JOB )
    TAPE PROTECTED	LABELCHEK = +, AND DATE < EXPIRATIONDATE
			ON OUTPUTTAPE.
    VOLUME LABEL MISSINGVOL SER NO IS EMPTY AND THERE IS NO
			VOLUME LABEL ON THE OUTPUTTAPE.
    EXPIRATION DATE ERROR EXPIRATION DATE > 99366.
    MT UNIT CONFLICT	MT UNIT NOT SPECIFIED TO 0 - 3.
    MT DENSITY ERROR	MT DENSITY NOT SPECIFIED TO 1600 OR 800.
    MOUNT DATA TAPE	MT-UNIT IS NOT ON-LINE.
    MT ERROR NNNNN	CONSULT THE RC3600 OPERATORS MANUAL.
    FD ERROR NNNNN	CONSULT THE RC3600 OPERATORS MANUAL.
    SP ERROR NNNNN	CONSULT THE RC3600 OPERATORS MANUAL.
    RECORDSIZE ERROR	RECORDLENGTH ON FD IS GREATER THAN RECORD-
			SIZE ON MT. SUSPEND JOB.
    END-OF-TAPE MARK	EOT MARK DETECTED.
			STOP WILL IN THIS CASE TERMINATE THE JOB.
    END JOB		PROGRAM EXECUTION IS TERMINATED NORMALLY,
			AND THE PROGRAM IS READY TO WRITE A NEW
			OUTPUTTAPE.
    SUSPENDED		THE JOB IS TERMINATED ABNORMALLY,AND THE
			OUTPUTTAPE IS REWOUND.
    ON/OFF		CURRENT STATE OF CONTINUE.

    **** NOTICE ****

    SPECIAL VERSION FOR RECIVING 512 BYTES BUFFERS.
«ff»
						  RC36-01052 PAGE 03  


INPUT MESSAGES:

    STOP		STOPS EXECUTION WRITING PROG NO  : 1052.
			STOP HAS NO EFFECT AFTER A DEVICE ERROR
			MESSAGE.
    SUSPEND		TERMINATES THE JOB, RELEASING DRIVERS.
			THE OUTPUTAPE IS REWOUND.
    <ESC>		NEXT PARAMETER IS DISPLAYED
    STATE		ALL RUNTIME PARAMETERS ARE DISPLAYED
    "VALUE"		CURRENTLY DISPLAYED RUNTIME PARAMETER
			IS CHANGED TO "VALUE".
    "TEXT"="VALUE"	THE RUNTIME PARAMETER IDENTIFIED BY "TEXT" IS
			CHANGED TO "VALUE"
    CONT		STATE OF CONTINUE SWITCH IS INVERTED.
			CURRENT STATE OF CONTINUE IS DISPLAYED(ON/OFF).
    START		PROGRAM EXECUTION IS STARTED.
			NOTE: AFTER MT ERROR START MEANS
			REPEATING THE WRITE/READ OPERATION.
			AFTER ERROR ON DISKETTE IT MEANS ACCEPTING
			THE ERRONEUS BLOCK.
    ACCEPT		IN CASE OF SEQUENCE ERROR AND DISKETTE IS
			WANTED ANYWAY, TYPE ACCEPT.


    LOG			THE LOG IS OUTPUT ON THE SELECTED LOG-DEVICE.

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
!
«ff»
						! RC36-01052 PAGE 04 !

CONST

NOQ=		13,

OPTXTS=
'<10>PROG NO        : 1052<0>
<10>VOLUME IDENT   : <0>
<10>DATASET NAME   : <0>
<10>IN BLOCKNO     : <0>
<10>RECORDSIZE     : <0>
<10>LABELCHECK     :  <0>
<10>VOL SER NO     : <0>
<10>DATA IDENTIFIER: <0>
<10>EXPIRATION DATE: <0>
<10>OUT BLOCKNO    : <0>
<10>MTUNIT         : <0>
<10>MTDENSITY      : <0>
<10>LOGPRINT       :  <0>',


START=		'START',
STOP=		'STOP',
SUSPEND=	'SUSPEND',
CONT=		'CONT',
STATE=		'STATE',
ACCEPT	=	'ACCEPT',
MINUS=		'-',
PLUS=		'+',
FIVE=		'<5><0>',
FIFTEEN=	'<15><0>',
NL=		'<10><0>',
NEXTPARAM=	'<27>',
ENDLINE=	'<13><0>',
BELL=		'<7><7><7>',

RUNTXT=		'<8><4><10>RUNNING<13><0>',
SUSTXT=		'<7><10>SUSPENDED<13><10>',
FDTXT=		'<7><10>FD ERROR   ',
MTTXT=		'<7><10>MT ERROR   ',
EOJTXT=		'<14><7><10>END JOB<13><0>',
MOUNTDISK=	'<7><10>MOUNT DISKETTE<13><0>',
FDEOF=		'<7><10>MOUNT NEXT DISKETTE<13><0>',
MTMOUNTTAPE=	'<14><7><10>MOUNT DATA TAPE<13><0>',
ENDTAPE=	'<14><7><10>END-OF-TAPE MARK<13><0>',
CONTSTATE=	'<10>CONSTATE :   <0>',
IDENTEMPTY=	'<7><10>DATA IDENTIFIER EMPTY<13>',
WRONGVOL=	'<7><10>WRONG VOLUME LABEL<13>',
PROTECTTXT=	'<7><10>TAPE PROTECTED<13><0>',
EXERROR=	'<7><10>EXPIRATION DATE ERROR<13><0>',
DENERROR=	'<7><10>MT DENSITY ERROR<13><0>',
RECERROR=	'<7><10>RECORDSIZE ERROR<13><0>',
WRONGUNIT=	'<7><10>MT UNIT CONFLICT<13><0>',
VOLMIS=		'<7><10>VOLUME LABEL MISSING<13><0>',

INITEXP=	'00000<0>',
INITINF= '<0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0>',
INITVOLSER=	'      <0>',


READ=		8'122,
ZERO=		8'60,
ONE =           8'61,

ASCIISPS=	'                  ',
«ff»
						! RC36-01052 PAGE 05 !

VOL1=
'VOL10
                                                                           ',
HDR1=
'HDR1                 00000000010001000101
            0000000                    ',
HDR2=
'HDR2F000000000000
                                                               ',

EOF1=		'EOF1',
EOF2=		'EOF2',
VOL1L=		'<229><214><211><241>',
HDR1L=		'<200><196><217><241>',
HDR2L=		'<200><196><217><242>',

DEN800=		'2',
DEN1600=	'3',

ON=		'ON<13><0>',
OFF=		'OFF<13><0>',
C99366=		'99366',

TRUE=		-1,
FALSE=		-2,
UFORM=	0,


! ** LOGTEXTS ** !

LOGCMMD=	'LOG',
TTYNAME=	'TTY<0>',
LPTNAME=	'SP<0><0>',

NEWL=		'<10><10>',

LOGHEAD='** FD1 TO MT UNIT X **  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:      ..... RECORDS<10>',
STEXT2=		'WRITTEN:   ..... BLOCKS<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,


«ff»
						! RC36-01052 PAGE 06 !

! 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-01052 PAGE 07 !


! ASCII TO EBCDIC CONVERSION TABLE : !

AETAB= !       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-01052 PAGE 08 !

VAR


OPDUMMY:	STRING(2);	! RUNTIME PARAMETERS !
PROGNO:		INTEGER;
TPAR5:		INTEGER;
TPAR4:		INTEGER;
INBLOK:		INTEGER;
RECSIZE:	INTEGER;
LABELCHECK:	INTEGER;
TPAR3:		INTEGER;
TPAR1:		INTEGER;
TPAR2:		INTEGER;
BLOCKNO:	INTEGER;
MTUNIT:		INTEGER;
MTDENSITY:	INTEGER;
LOGPRINT:	INTEGER;

OPTEXT:		STRING(80);	! COMMUNICATION AREA !
OPSTRING:	STRING(80);
OPDEC:		STRING(10);

OPCONT:		STRING(2);	! INTERNAL VARIABLES !
NEXTCONT:	STRING(1);	! USED BY STANDARD   !
GLCONT:		STRING(1);	! PROCEDURES.        !
ERRORNO:        INTEGER;
MASK:           INTEGER;
TOM:		INTEGER;
SIGN:		INTEGER;
Q:		INTEGER;
PAR:		INTEGER;
LENGTH:		INTEGER;
P1:		INTEGER;
P2:		INTEGER;
P3:		INTEGER;
S1:		STRING(2);
S2:		STRING(2);
«ff»
						! RC36-01052 PAGE 09 !

EOT:		INTEGER;	! INTERNAL VARIABLES !
TAPESREAD:	INTEGER;
INT1:		INTEGER;
EXYYDDD:	INTEGER;
FILENO:		INTEGER;
NEWMT:		INTEGER;
MTREADMODE:	INTEGER;
READGIVEUP:	INTEGER;
IDENTLENGTH:	INTEGER;
STOPPED:	INTEGER;
RECLENGTH:	INTEGER;
SEQCHECK:	INTEGER;
INDEX:		INTEGER;
OFFLINE:	INTEGER;
HELP1:          INTEGER;
HELP2:          INTEGER;
HELP3:          INTEGER;
I:              INTEGER;
SERIALTEXT:	STRING(7);
TAPEVOLSER:	STRING(6);
IDENTTEXT:	STRING(20);
CREDATE:	STRING(6);
EXPDATE:	STRING(6);
H1LABEL:	STRING(80);
H2LABEL:	STRING(80);
DATE:		STRING(5);
TAPEDATE:	STRING(5);
BLKNO:		STRING(6);
RECLGT:		STRING(6);

STR3740:	STRING(18);


VOLUMEID:	STRING(7);
DATASETNAME:	STRING(9);


! ** LOG VARIABLES ** !

NEXTLP:		INTEGER;
PSTATE:		INTEGER;

DISKNO:		INTEGER;
RECTOTAL:	INTEGER;
SAVEIN:		INTEGER;
SAVEOUT:	INTEGER;
DELETEIN:	INTEGER;
DELETEOUT:	INTEGER;
BFACTOR:	INTEGER;
SECTORNO:	INTEGER;

LDATE:		STRING(8);
LHELP:		STRING(6);
«ff»
						! RC36-01052 PAGE 10 !

IN:	FILE			! INPUT FILE DESCRIPTION !
	'B3740',			! NAME OF INPUT DRIVER !
	14,			! KIND=	BLOCKED, !
				!       REPEATABLE, !
				!       POSITIONABLE, !
	2,			! BUFFERS !
	512,			! SHARESIZE !
	UB;			! UNDEFINED !
	CONV STR3740;
	GIVEUP
	RDERROR,		! FD ERROR PROCEDURE !
	2'1110011111111110	! GIVE UP MASK !

	OF STRING(1);		! RECORD STRUCTURE !



OUT:	FILE			! OUTPUT FILE DESCRIPTION !
	'MT0',			! NAME OF OUTPUT DRIVER !
	14,			! KIND=	REPEATABLE, !
				!	POSITIONABLE, !
				!	BLOCKED. !
	2,			! BUFFERS !
	256,			! SHARESIZE !
	U;			! UNDEFINED !

	GIVEUP
	MTOUTERROR,		! MT ERROR PROCEDURE !
	2'0110011111111110	! GIVE UP MASK !

	OF STRING(80);		! RECORD STRUCTURE !


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-01052 PAGE 10A !
	PROCEDURE GETTIME(VAR TIME : STRING(8));
	CODEBODY P0149;

	PROCEDURE GETLDATE(VAR DATE: STRING(8));
	CODEBODY P0150;

	PROCEDURE GETSDATE(VAR DATE: STRING(6));
	CODEBODY P0151;

    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,18);
	OUTTEXT(LOG,LOGHEAD);

	! ACTUAL POSITIONS !
	BINDEC(DISKNO,LHELP);
	MOVE(LHELP,2,PTEXT1,11,3);
	BINDEC(INBLOK,LHELP);
	MOVE(LHELP,0,PTEXT1,24,5);
	BINDEC(FILENO-1,LHELP);
	MOVE(LHELP,2,PTEXT2,11,3);
	BINDEC(BLOCKNO,LHELP);
	MOVE(LHELP,0,PTEXT2,24,5);
	OUTTEXT(LOG,POSHEAD);
	OUTTEXT(LOG,PTEXT1);
	OUTTEXT(LOG,PTEXT2);

	! STATISTICS !
	BINDEC(RECTOTAL,LHELP);
	MOVE(LHELP,0,STEXT1,11,5);
	BINDEC(BLOCKNO-1,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-01052 PAGE 11 !


	PROCEDURE CONTINUE;
	BEGIN
	    GLCONT:=OPCONT;
	    OPCONT:=NEXTCONT;
	    NEXTCONT:=GLCONT;
	    IF OPCONT=FIFTEEN THEN OPMESS(OFF);
	    IF OPCONT=FIVE THEN OPMESS(ON);
	END;

	PROCEDURE OPSTOP;
	BEGIN
	    OPWAIT(LENGTH);
	    OPTEXT:=OPSTRING;
	    OPIN(OPSTRING);
	    STOPPED:= 0;
	    IF OPTEXT=LOGCMMD THEN PRINTLOG;
	    IF OPTEXT=CONT THEN CONTINUE;
	    IF OPTEXT=STOP THEN STOPPED:= 1;
	    IF OPTEXT=START THEN STOPPED:= 2;
	    IF OPTEXT=SUSPEND THEN STOPPED:=3;
	END;


	PROCEDURE OPEN3740;
	BEGIN
		! TRANSFER VOL-ID + DATASETNAME + INFORMATION  !
		! ABOUT CHECK OF SEQUENCE-NUMBER ON	       !
		!  MULTI-VOLUME-DATASETS		       !


	    STR3740:=ASCIISPS;
	    INSERT(READ,STR3740,0);
	    INSERT(ONE,STR3740,1);
	    MOVE(VOLUMEID,0,STR3740,3,6);
	    MOVE(DATASETNAME,0,STR3740,9,8);
	    CONVERT(STR3740,STR3740,AETAB,18);
	    CONVERT(STR3740,STR3740,EATAB,18);

0:	    SEQCHECK:=0;
	    OPEN(IN,1);
	    IF SEQCHECK <> 0 THEN
	    BEGIN
		INSERT(READ,STR3740,2);
	        GOTO 0;
	        ! SEQENCE ERROR ACCEPTED !
	    END;
	END;

	PROCEDURE SECTORCALC;
	BEGIN
	    SECTORNO:=INBLOK;
	    IF BFACTOR = 2 THEN SECTORNO:=INBLOK*BFACTOR - 1;
	    IF SECTORNO <= 0 THEN SECTORNO:= 1;
	END;
«ff»

    						! RC36-01052 PAGE 12 !

	PROCEDURE INITPOSITION;
	BEGIN

	  ! PARAMETER CHECK !
2000:	  IF NEWMT=FALSE THEN GOTO 2009;


	    IF RECSIZE > 0 THEN
	    IF RECSIZE <= 256 THEN GOTO 2003;
	    OPMESS(RECERROR);
	    GOTO 2008;

2003:	    IF IDENTLENGTH=0 THEN
	    BEGIN OPMESS(IDENTEMPTY); GOTO 2008; END;

	    IF EXPDATE > C99366 THEN
	    BEGIN OPMESS(EXERROR); GOTO 2008; END;

	    INSERT(MTUNIT+48,OUT.ZNAME,2);
	    IF MTUNIT >= 0 THEN
	    IF MTUNIT <= 3 THEN GOTO 2006;
	    OPMESS(WRONGUNIT);
	    GOTO 2008;

2006:	    IF MTDENSITY = 800 THEN GOTO 2009;
	    IF MTDENSITY =1600 THEN GOTO 2009;
	    OPMESS(DENERROR);

2008:	    REPEAT OPSTOP UNTIL STOPPED <> 0;
	    IF STOPPED = 1 THEN GOTO 1;
	    IF STOPPED = 3 THEN GOTO 12;
	    GOTO 2000;

2009:	    IF IN.ZMODE = 0 THEN
	    BEGIN
		BFACTOR:=1;
		IF RECSIZE > 128 THEN BFACTOR:=2;
		SECTORCALC;
		OPEN3740;
		SETPOSITION(IN,0,SECTORNO);
	    END;

«ff»
						! RC36-01052 PAGE 13 !


	IF NEWMT = TRUE THEN
	BEGIN

	  ! CREATION AND CHECK OF LABELS !
	    ! LABELCHECK !
	    OUT.ZSHAREL:=80; OPEN(OUT,5);
	    SETPOSITION(OUT,1,1);
	    MTREADMODE:=TRUE; READGIVEUP:=FALSE;

	    GETSDATE(DATE);

2010:	    GETREC(OUT,RECLENGTH);
	    ! CHECK VOLUME LABEL !
	    IF READGIVEUP=TRUE THEN GOTO 2011;
	    IF RECLENGTH<>80 THEN GOTO 2011;
	    IF OUT^<>VOL1L THEN
	    BEGIN
	      ! NO VOLUME LABEL !
2011:	      IF SERIALTEXT=INITINF THEN
	      BEGIN
		OPMESS(VOLMIS);
		CLOSE(OUT,1); BLOCKNO:=1; GOTO 2008;
	      END;

	      ! CREATE VOLUME LABEL !
	      CLOSE(OUT,0); MTREADMODE:=FALSE;
	      OPEN(OUT,3); SETPOSITION(OUT,1,1);
	      PUTREC(OUT,80);
	      OUT^:=VOL1;
	      MOVE(SERIALTEXT,0,OUT^,4,6);
	      CONVERT(OUT^,OUT^,AETAB,80);
	    END ELSE
	    BEGIN
	      MOVE(OUT^,4,TAPEVOLSER,0,6);
	      CONVERT(TAPEVOLSER,TAPEVOLSER,EATAB,6);
	      IF SERIALTEXT=INITINF THEN
	      SERIALTEXT:=TAPEVOLSER
	      ELSE IF SERIALTEXT<>TAPEVOLSER THEN
	      BEGIN
		OPMESS(WRONGVOL);
		CLOSE(OUT,1); BLOCKNO:=1; GOTO 2008;
	      END;


	      IF LABELCHECK=TRUE THEN
	      BEGIN
	        GETREC(OUT,RECLENGTH);
	        IF READGIVEUP=TRUE THEN GOTO 2012;
	        IF RECLENGTH<>80 THEN GOTO 2012;
	        IF OUT^<>HDR1L THEN GOTO 2012;
	        ! HDR1 LABEL PRESENT. CHECK EXPIRATION DATE !
	        MOVE(OUT^,48,TAPEDATE,0,5);
	        CONVERT(TAPEDATE,TAPEDATE,EATAB,5);
	        IF TAPEDATE>DATE THEN
	        BEGIN
	          OPMESS(PROTECTTXT);
	          CLOSE(OUT,1); GOTO 2008;
	        END;
	      END ! LABELCHECK=TRUE !;
	    END !OUT^=VOL1L!;
2012:	    CLOSE(OUT,0); MTREADMODE:=FALSE;
«ff»
						! RC36-01052 PAGE 14 !


	    ! WRITE NEW HDR LABELS !
	    OPEN(OUT,3); SETPOSITION(OUT,1,2);
	    H1LABEL:=HDR1;
	    MOVE(IDENTTEXT,0,H1LABEL,4,IDENTLENGTH);
	    MOVE(DATE,0,H1LABEL,42,5);
	    MOVE(EXPDATE,0,H1LABEL,48,5);
	    MOVE(SERIALTEXT,0,H1LABEL,21,6);
	    PUTREC(OUT,80);
	    CONVERT(H1LABEL,OUT^,AETAB,80);
	    H2LABEL:=HDR2;
	    BINDEC(RECSIZE,RECLGT);
	    MOVE(RECLGT,0,H2LABEL,5,5);
	    MOVE(RECLGT,0,H2LABEL,10,5);
	    IF MTDENSITY=800 THEN MOVE(DEN800,0,H2LABEL,15,1);
	    IF MTDENSITY=1600 THEN MOVE(DEN1600,0,H2LABEL,15,1);
	    PUTREC(OUT,80);
	    CONVERT(H2LABEL,OUT^,AETAB,80);
	    CLOSE(OUT,0); FILENO:=2;

	    OUT.ZFORM:=UFORM;
	    OUT.ZSHAREL:=RECSIZE; OPEN(OUT,3);
	    NEWMT := FALSE;
	    SETPOSITION(OUT,FILENO,BLOCKNO);
	  END ! NEWMT=TRUE !

	  ELSE IF BLOCKNO<>OUT.ZBLOCK THEN SETPOSITION(OUT,FILENO,BLOCKNO);
	  IF IN.ZBLOCK <> INBLOK THEN
	  BEGIN
	    SECTORCALC;
	    SETPOSITION(IN,0,SECTORNO);
	  END;

	END ! INITPOSITION !;
«ff»
  						! RC 36-01052 PAGE 15 !

	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,20);
			    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-01052 PAGE 16 !

	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 = -3 THEN OPMESS(IDENTTEXT);
	        IF PAR = -4 THEN OPMESS(EXPDATE);
		IF PAR = -5 THEN OPMESS(SERIALTEXT);
		IF PAR = -6 THEN OPMESS(DATASETNAME);
		IF PAR = -7 THEN OPMESS(VOLUMEID);
		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 OPTEXT = START THEN GOTO 1070;
		IF OPTEXT = STOP  THEN GOTO 1000;
	        IF OPTEXT = SUSPEND THEN GOTO 12;
		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;
		IF OPTEXT = LOGCMMD THEN BEGIN PRINTLOG; GOTO 1040; END;
		IF PAR = -7 THEN
		BEGIN
		  IF LENGTH > 7 THEN LENGTH := 7;
		  VOLUMEID := INITINF;
		  MOVE(OPTEXT,0,VOLUMEID,0,LENGTH-1);
		  GOTO 1055;
		END;

		IF PAR = -6 THEN
		BEGIN
		  IF LENGTH > 9 THEN LENGTH := 9;
		  DATASETNAME:= INITINF;
		  MOVE(OPTEXT,0,DATASETNAME,0,LENGTH-1);
		  GOTO 1055;
		END;
«ff»
						! RC36-01052 PAGE 17 !


	        IF PAR=-3 THEN
	        BEGIN
	          IF LENGTH>18 THEN LENGTH:=18;
	          IDENTLENGTH:=LENGTH-1;
	          IDENTTEXT:=INITINF;
	          MOVE(OPTEXT,0,IDENTTEXT,0,IDENTLENGTH);
	          GOTO 1055;
	        END;
	        IF PAR=-4 THEN
	        BEGIN
	          IF LENGTH>6 THEN LENGTH:=6;
	          EXPDATE:=INITEXP;
	          MOVE(OPTEXT,0,EXPDATE,0,LENGTH-1);
	          GOTO 1055;
	        END;
		IF PAR = -5 THEN
		BEGIN
		  IF LENGTH>7 THEN LENGTH:=7;
		  IF LENGTH=1 THEN SERIALTEXT:=INITINF
		  ELSE SERIALTEXT:=INITVOLSER;
		  MOVE(OPTEXT,0,SERIALTEXT,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;


	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;
«ff»
						! RC36-01052 PAGE 18 !
	PROCEDURE RDERROR;
	BEGIN
	    IF IN.Z0 SHIFT 1 < 0 THEN
	    BEGIN
		OFFLINE:=OFFLINE-1;
		IF OFFLINE > 0 THEN REPEATSHARE(IN);
	        OPMESS(MOUNTDISK);
  		OFFLINE:=150;
	    END;
	    IF IN.Z0 AND 8'400 <> 0 THEN GOTO 9;
	    IF IN.Z0 AND 8'20 <> 0 THEN GOTO 9;

	    IF IN.Z0 SHIFT 1 > 0 THEN
	    BEGIN
		OPMESS(FDTXT);
		MASK:=IN.Z0;
		SHOWERROR;
	    END;
	    REPEAT OPSTOP;
		   PSTATE:=IOERROR;
		   IF OPTEXT = ACCEPT THEN
		   BEGIN
			IF IN.Z0 AND 8'2000 <> 0 THEN SEQCHECK:=1;
			GOTO 100;
		   END;
                   IF OPTEXT = STOP THEN GOTO 11;
                 ! INDSAT DEC 1983  ME.....!
		   IF OPTEXT = SUSPEND THEN GOTO 12
	    UNTIL OPTEXT = START;
100:	    OPMESS(RUNTXT);
	    REPEATSHARE(IN);

	END;

	PROCEDURE MTOUTERROR;
	BEGIN
	    IF OUT.Z0 AND 8'000020 <> 0 THEN EOT:= TRUE;
	    OUT.Z0:=OUT.Z0 AND 8'177757;
	    IF MTREADMODE = TRUE THEN
	      IF OUT.Z0 AND 8'000602 <> 0 THEN
	      BEGIN
		READGIVEUP:= TRUE; ! TIMER - EOF - BLOCKLENGTH ERROR !
		OUT.ZREM:= OUT.ZSHAREL;
		GOTO 3000;
	      END;
	    IF OUT.Z0 SHIFT 1 < 0 THEN OPMESS(MTMOUNTTAPE);
	    IF OUT.Z0 SHIFT 1 > 0 THEN
	    BEGIN
		OPMESS(MTTXT);
		MASK:=OUT.Z0;
		SHOWERROR;
		PSTATE:=IOERROR;
	    END;
	    IF OUT.Z0<>0 THEN
	    BEGIN
2999:		REPEAT OPSTOP UNTIL STOPPED <> 0;
		IF STOPPED = 1 THEN GOTO 2999;
	        IF STOPPED=3 THEN GOTO 12;
		OPMESS(RUNTXT);
		IF MTREADMODE = TRUE THEN GOTO 3000;
		IF OUT.Z0 AND 8'063352 <> 0 THEN
		REPEATSHARE(OUT);
	    END;
3000:	END;
«ff»
                                              ! RC36-01052 PAGE 18A !

	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;
	    DISKNO := 1;
	    RECTOTAL := 0;
	    SAVEIN := 1;
	    SAVEOUT := 1;
	END;

	PROCEDURE INITPARAMS;
	BEGIN
	    INBLOK := 1;
	    FILENO := 1;
	    BLOCKNO:= 1;
	    NEWMT := TRUE;
	    EOT := FALSE;
	    OFFLINE := 150;
	END;


	PROCEDURE OUTUPDATE;
	BEGIN
	    BLOCKNO := OUT.ZBLOCK;
	    SAVEOUT := BLOCKNO;
	END;

«ff»
						! RC36-01052 PAGE 19 !

	BEGIN

	  RECSIZE:=172;
	  LABELCHECK := TRUE;
	  TPAR1:=-3;
	  TPAR2:=-4;
	  TPAR3:=-5;
	  TPAR4:=-6;
	  TPAR5:=-7;

          OPTEXT:= RUNTEXT;
	  IDENTTEXT:= INITINF;
	  IDENTLENGTH:= 0;
	  SERIALTEXT:=INITINF;
	  VOLUMEID:=INITINF;
	  DATASETNAME:=INITINF;
	  EXYYDDD:= 0;
	  EXPDATE:= INITEXP;
	  LOGPRINT:=TRUE;
	  MTUNIT:=0;
	  MTDENSITY:= 1600;

	  OPCONT:= FIFTEEN;
	  NEXTCONT:= FIVE;

	  INITPARAMS;
	  INITSTAT;

	  OPIN(OPSTRING);

1:	  OPCOM;
          IF RECSIZE <= 128 THEN BEGIN
                                   HELP1:=4;
                                   HELP2:=128;
                                 END

                            ELSE BEGIN
                                   HELP1:=2;
                                   HELP2:=256;
                                 END;

2:	  INITPOSITION;
«ff»
						! RC36-01052 PAGE 20 !

	  ! MAIN LOOP !

3:	REPEAT

	    DELETEIN:=SAVEIN - INBLOK;
	    DELETEOUT:=SAVEOUT - BLOCKNO;

	    GETREC(IN,IN.ZSHAREL);

	    PSTATE:=RUNNI;
	    INBLOK:=IN.ZBLOCK/BFACTOR;
	    SAVEIN:=INBLOK;

	    IF DELETEIN = DELETEOUT THEN
	    RECTOTAL:=RECTOTAL - DELETEIN;

	    IF DELETEIN > DELETEOUT THEN
	    RECTOTAL:=RECTOTAL - DELETEOUT;

	    IF RECLENGTH > 512 THEN
	    BEGIN
		OPMESS(RECERROR);
		REPEAT OPSTOP UNTIL STOPPED > 2;
		IF STOPPED = 3 THEN GOTO 12;
	    END;

            I:=0;
            REPEAT
            BEGIN
              PUTREC(OUT,RECSIZE);
              MOVE(IN^,I*HELP2,OUT^,0,RECSIZE);
              I:=I+1;
              RECTOTAL:=RECTOTAL+1;
	      IF EOT = TRUE THEN
	      BEGIN
		  OPMESS(ENDTAPE);
		  REPEAT OPSTOP UNTIL STOPPED <> 0;
		  IF STOPPED = 3 THEN GOTO 12;
		  IF STOPPED = 1 THEN GOTO 11;
	      END;
            END
            UNTIL I=HELP1;
            OUTUPDATE

	UNTIL OPTEST <> 0;

	WAITZONE(OUT);
	OUTUPDATE;

	OPSTOP;
	IF STOPPED = 2 THEN GOTO 3;
	IF STOPPED = 3 THEN GOTO 12;
	IF STOPPED = 0 THEN GOTO 3;
	PSTATE:=PSTOP;
	GOTO 1;
«ff»
						! RC36-01052 PAGE 21 !


10:	  CLOSE(IN,1);
	  OPMESS(FDEOF);
	  REPEAT
	  BEGIN
	    OPSTOP;
	    IF OPCONT=FIFTEEN THEN GOTO 11;
	  END UNTIL STOPPED<>0;
	  INBLOK:=1;
	  IF STOPPED = 1 THEN BEGIN PSTATE:=PSTOP; GOTO 1; END;
	  IF STOPPED = 3 THEN GOTO 12;
	  DISKNO:=DISKNO+1;
	  OPEN3740;
	  SECTORCALC;
	  SETPOSITION(IN,0,SECTORNO);
	  OPMESS(RUNTXT);
	  GOTO 3;

	  ! END OF FILE FROM FD !
9:	  IF IN.ZREM > 0 THEN
          BEGIN
            IN.ZFIRST:=IN.ZTOP;
            HELP3:=IN.ZREM/HELP2;    ! USEFULL RECORDS !
            I:=0;
            REPEAT
            BEGIN
              PUTREC(OUT,RECSIZE);
              MOVE(IN^,I*HELP2,OUT^,0,RECSIZE);
              I:=I+1;
              RECTOTAL:=RECTOTAL+1;
            END UNTIL I=HELP3;
            OUTUPDATE;
          END;
          WAITZONE(OUT);

	  IF OPCONT = FIVE THEN
	  BEGIN
	    OUTUPDATE;
	    FILENO:= OUT.ZFILE;
	    GOTO 10;
	  END;

	  ! END OF JOB !
11:	  BLOCKNO:= OUT.ZBLOCK;
	  CLOSE(OUT,0);
	  OUT.ZFORM:=UFORM;
	  OUT.ZSHAREL:=80; OPEN(OUT,3);
	  SETPOSITION(OUT,3,1);
	  PUTREC(OUT,80);
	  H1LABEL:=EOF1;
	  BINDEC(BLOCKNO-1,BLKNO);
	  MOVE(BLKNO,0,H1LABEL,55,5);
	  CONVERT(H1LABEL,OUT^,AETAB,80);
	  PUTREC(OUT,80);
	  H2LABEL:=EOF2;
	  CONVERT(H2LABEL,OUT^,AETAB,80);
	  PSTATE:=PEOJ;
	  OPMESS(EOJTXT); GOTO 13;

	  ! SUSPEND !
12:	  OPMESS(SUSTXT); OUT.ZMODE:=0;
	  PSTATE:=PSUSP;

13:	  CLOSE(OUT,1); OUT.ZFORM:=UFORM; CLOSE(IN,1);

	  PRINTLOG;
	  INITPARAMS;
	  INITSTAT;

	  REPEAT OPSTOP UNTIL STOPPED <> 0;
	  IF STOPPED = 1 THEN GOTO 1;
	  IF STOPPED=3 THEN GOTO 12;
	  OPMESS(RUNTXT);
	  GOTO 2;
	END;
«ff»
«nul»