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

⟦33f6cff93⟧ TextFile

    Length: 13824 (0x3600)
    Types: TextFile
    Notes: RCSL-43-GL-8608, RCSL-43-GL-8609, RCSL-43-GL-8610
    Names: »S988«

Derivation

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

TextFile

!						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»