1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-01-11 23:42:42 +00:00
Paul Kimpel 2c72f7fd1d Commit CUBE Library version 13 of February 1972.
1. Commit library tape images, directories, and extracted text files.
2. Commit additional utilities under Unisys-Emode-Tools.
2018-05-27 11:24:23 -07:00

407 lines
36 KiB
Plaintext

$ SET LINEINFO 00000100
$ SET LISTOMITTED 00000200
$ SET OMIT 00001000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00002000
%% %%00003000
%% TAPUT/TAPBCD %%00004000
%% %%00005000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00006000
%% %%00007000
%% COPYRIGHT (C) 2018: %%00008000
%% Paradigm Corporation %%00009000
%% 9747 Businesspark Ave., Suite 220 %%00010000
%% San Diego CA 92131-1653 %%00011000
%% voice 858-536-5533, http://www.digm.com %%00012000
%% %%00013000
%% Licensed under the Simple Public License (SimPL) 2.0 %%00013100
%% %%00013200
%% This material may be copied and used under the terms of %%00013300
%% that license. This copyright notice must be preserved and %%00013400
%% appropriate credit given in any derivative materials. %%00013500
%% %%00013600
%% This material is offered AS-IS WITH NO WARRANTY. Paradigm hereby %%00013700
%% disclaims all warranties respecting this material, expressed or %%00013800
%% implied, including without limitation warranty of design, %%00013900
%% merchantability, fitness for a particular purpose and against %%00014000
%% infringement. %%00014100
%% %%00016000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00017000
%% >>>> DO NOT RESEQUENCE THIS SOURCE FILE! <<<< %%00017100
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00017200
%% Maintenance updates will be applied using the sequence %%00017300
%% number configuration in the file. Mass resequencing will %%00017400
%% destroy the ability to apply source-level patches to this file. %%00017500
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00017600
00020000
THIS PROGRAM TRANSLATES A MAGNETIC TAPE IMAGE FILE IN SIMH .TAP 00021000
FORMAT TO PAUL PIERCE'S .BCD FORMAT FOR 7-TRACK TAPES. THE PROGRAM 00021100
ASSUMES THE .TAP FILE IS IN STREAM FORMAT AND HAS BEEN COPIED TO AN 00021200
MCP SYSTEM WITHOUT TRANSLATION OR CONVERSION OF ANY FORM -- IT 00021300
SHOULD BE JUST AN OCTET STREAM. THE .BCD FILES IS SIMILARLY WRITTEN 00021400
WITHOUT TRANSLATION AS AN MCP STREAM FILE. SEE: 00021500
00021600
http://simh.trailing-edge.com/docs/simh_magtape.pdf 00021700
http://www.piercefuller.com/oldibm-shadow/tool.html 00021800
00021900
TO RUN THIS PROGRAM, EQUATE FILE "TAP" TO THE .TAP FILE AND 00022000
"BCD" TO THE NAME OF THE CONVERTED FILE TO BE CREATED, E.G., 00022100
RUN OBJECT/TAPUT/TAPBCD; 00022200
FILE TAP=TAP/IMAGE ON PACK; 00022300
FILE BCD=BCD/IMAGE ON PACK; 00022400
00900000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00900010
MODIFICATION LOG. 00900020
----------------- 00900030
2018-05-03 P.KIMPEL, PARADIGM CORPORATION, SAN DIEGO, CA. 00900040
CLONED FROM TAPUT/MAKETAPE, SEE: 00900041
http://paradigmfutil.sourceforge.net/. 00900042
2018-05-06 P.KIMPEL 00900050
MODIFY TO COPY ERROR BLOCKS AND EMIT A WARNING MESSAGE. 00900051
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00998000
$ POP OMIT 00999000
01000000
BEGIN 01002000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%01003000
%% GENERAL DEFINES %%01004000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%01005000
01100000
DEFINE 01101000
CPW = 6 #, % CHAR PER WORD 01102000
BPW = 48 #, % BITS PER WORD 01103000
SECTORSIZE = 30 #, % WORDS PER SECTOR 01104000
TICK = (2.4@-6) #, % CPU CLOCK PERIOD [SEC] 01105000
TICKSPERDAY = (24*3600/TICK) #, 01106000
ALL1 = (REAL(NOT FALSE)) #, 01107000
UNITSOF(V,BASE) = (((V)+((BASE)-1)) DIV (BASE)) #, 01108000
INCREMENTSOF(V,BASE)= (UNITSOF((V),(BASE))*(BASE)) #, 01109000
P0(A) = POINTER(A,0) #, 01110000
P8(A) = POINTER(A,8) #, 01111000
WDS(BYTES) = UNITSOF(BYTES, CPW) #, 01112000
SECTORS(WDS) = UNITSOF(WDS, SECTORSIZE) #, 01113000
LOG10(X) = (((FIRSTONE(SCALERIGHTF(X,12))-1).[5:4])+1) #, 01114000
BIT(X) = (X) DIV BPW].[(BPW-1) - (X) MOD BPW : 1 #, 01115000
CORRECTLY(V,B) = ((V).[(B)*(BPW DIV CPW)-1:BPW]) FOR (B) #, 01116000
LOGICAL(A,OP,B) = (REAL(BOOLEAN(A) OP BOOLEAN(B))) #, 01117000
CAND(A,B) = (IF (A) THEN (B) ELSE FALSE) #, 01118000
COR(A,B) = (IF (A) THEN TRUE ELSE (B)) #, 01119000
01200000
%----- EBCDIC CHARACTER DEFINES ----- 01200100
NUL = 48"00" #, 01200200
SP = " " #, 01202400
01210000
%----- TIME(6) WORD LAYOUT ----- 01210100
T6DATEF = [47:16] #, % JULIAN DATE - 1970000 01210200
T6JULIANBIASV = 1970000 #, 01210300
T6TIMEF = [31:32] #, % TIME OF DAY, TICKS DIV 16 01210400
T6SECONDS(T) = ((T).T6TIMEF*(16*TICK)) #, 01210500
01220000
%----- TIME(7) WORD LAYOUT ----- 01220100
T7YEARF = [47:12] #, % CCYY 01220200
T7MONTHF = [35:6] #, 01220300
T7DAYF = [29:6] #, 01220400
T7HOURF = [23:6] #, 01220500
T7MINUTEF = [17:6] #, 01220600
T7SECONDF = [11:6] #, 01220700
T7WEEKDAYF = [5:6] #, % 0=SUNDAY, 1=MONDAY, ... 01220800
T7YYYYMMDD(T) = ((T.T7YEARF*100 + T.T7MONTHF)*100 + T.T7DAYF) #,01220900
01250000
%----- LOGICAL I/O RESULT WORD (STATE ATTRIBUTE) LAYOUT ----- 01251000
LIOSIZEF = [47:20] #, % ACTUAL DATA TRANSFER LENGTH 01252000
LIORESULTLISTF = [27:1] #, % RESULT LIST VALID 01253000
LIOENUMRESULTF = [26:10] #, % ENUMERATED I/O RESULT VALUE 01254000
LIOTIMEOUTF = [15:1] #, % I/O TIMED OUT 01255000
LIOBREAKF = [13:1] #, % BREAK ON OUTPUT 01256000
LIOSHORTBLOCKF = [10:1] #, % SHORT BLOCK OR STREAM CHUNK 01257000
LIOEOFF = [9:1] #, % END OF FILE 01258000
LIOPARITYF = [7:1] #, % PARITY ERROR 01259000
LIOLENGTHERRORF = [4:1] #, % RECORD LENGTH ERROR 01260000
LIOCANCELEDF = [2:1] #, % I/O CANCELED 01261000
LIOATTENTIONF = [1:1] #, % ENUMERATED RESULT NOT VALID 01262000
LIOERRORF = [0:1] #, % SOME ERROR OCCURRED 01263000
01500000
%----- TAPE CONVERSION DEFINES ----- 01500100
TAPEMAXRECSIZE = 4"FFFF" #, 01500200
TAPEMARK = 48"8F" #, % EVEN PARITY >= CHARACTER CODE 01500300
01899900
ZZGENERAL = #; 01900000
02000000
FILE 02000100
TAP (KIND=DISK, FILESTRUCTURE=STREAM, FILEUSE=IN, 02000200
MAXRECSIZE=1, FRAMESIZE=8, ANYSIZEIO, DEPENDENTINTMODE), 02000300
BCD (KIND=DISK, FILESTRUCTURE=STREAM, FILEUSE=OUT, NEWFILE, 02000500
MAXRECSIZE=1, FRAMESIZE=8, ANYSIZEIO, FLEXIBLE); 02000600
02100000
EBCDIC ARRAY 02100100
BUF[0:TAPEMAXRECSIZE-1]; 02100200
02200000
TRANSLATETABLE 02200100
BCDTOODDPARITY( 02200200
EBCDIC TO 48"4C", 02200220
02200240
48"000102030405060708090A0B0C0D0E0F" TO 02200300
48"400102430445460708494A0B4C0D0E4F", 02200400
02200500
48"101112131415161718191A1B1C1D1E1F" TO 02200600
48"105152135415165758191A5B1C5D5E1F", 02200700
02200800
48"202122232425262728292A2B2C2D2E2F" TO 02200900
48"206162236425266768292A6B2C6D6E2F", 02201000
02201100
48"303132333435363738393A3B3C3D3E3F" TO 02201200
48"703132733475763738797A3B7C3D3E7F"); 02201300
09700000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%09700100
%% MESSAGE MECHANISM %%09700200
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%09700300
09700400
DEFINE 09700500
%----- MLSDISPLAY MESSAGE NUMBERS ----- 09700600
MSG_VERSION = 1 #, 09700700
MSG_TAPCTLWORDERR = 2 #, 09700800
MSG_TAPDATAERR = 3 #, 09700900
MSG_FILEWRITEERR = 4 #, 09701000
MSG_TAPEORERR = 5 #, 09701100
MSG_TAPEORMISMATCH = 6 #, 09701200
MSG_TAPINVALIDCTL = 7 #, 09701300
MSG_TAPEOF = 8 #, 09701400
MSG_TAPEERROR = 9 #, 09701500
09749000
MSG_INVALIDMESSAGE = 0 #, 09749100
09749200
MSG_DISPLAYID = "TAP-BCD: " #; 09749300
09750000
OUTPUTMESSAGE ARRAY 09750100
MSGS(ENGLISH( 09750200
MSG_VERSION = MSG_DISPLAYID 09750300
"TAP-BCD version " <1>, 09750400
MSG_TAPCTLWORDERR = MSG_DISPLAYID 09750500
"Error reading TAP control word @ " <1> ": " <2>, 09750600
MSG_TAPDATAERR = MSG_DISPLAYID 09750700
"Error reading TAP data record @ " <1> ": " <2>, 09750800
MSG_FILEWRITEERR = MSG_DISPLAYID 09750900
"Error writing output file @ " <1> ": " <2>, 09751000
MSG_TAPEORERR = MSG_DISPLAYID 09751100
"Error reading TAP end-record control @ " <1> ": " <2>, 09751200
MSG_TAPEORMISMATCH = MSG_DISPLAYID 09751300
"TAP end-record control size mismatch @ " <1> ": " <2>, 09751400
MSG_TAPINVALIDCTL = MSG_DISPLAYID 09751500
"Invalid TAP control word @ " <1> ": " <2>, 09751600
MSG_TAPEOF = MSG_DISPLAYID 09751700
"TAP file EOF encountered @ " <1> "(" <2> ")", 09751800
MSG_TAPEERROR = MSG_DISPLAYID 09751900
"TAP file error block @ " <1> "(" <2> ")", 09752000
09799000
MSG_INVALIDMESSAGE = MSG_DISPLAYID 09799100
"Invalid message 0" 09799200
)); 09799300
09800000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%09800100
PROCEDURE DISPLAY1N(MSGX, V1); 09800200
VALUE MSGX, V1; 09800300
INTEGER MSGX; 09800400
REAL V1; 09800500
BEGIN COMMENT 09800600
DISPLAYS A MESSAGE WITH ONE NUMERIC PARAMETER. 09800700
; 09800800
MLSDISPLAY(MSGS[MSGX], STRING(V1,*)); 09800900
END DISPLAY1N; 09801000
09801100
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%09801200
PROCEDURE DISPLAY1N1H(MSGX, V1, V2); 09801300
VALUE MSGX, V1, V2; 09801400
INTEGER MSGX, V1; 09801500
REAL V2; 09801600
BEGIN COMMENT 09801700
DISPLAYS A MESSAGE WITH ONE NUMERIC AND ONE HEX PARAMETER. 09801800
; 09801900
EBCDIC ARRAY 09802000
A[0:CPW*2]; 09802100
HEX ARRAY 09802200
H[0] = A; 09802300
09802400
REPLACE H[CPW*2] BY V2 FOR CPW*2; 09802500
REPLACE A[0] BY H[CPW*2] FOR CPW*2 WITH HEXTOEBCDIC; 09802600
MLSDISPLAY(MSGS[MSGX], STRING(V1,*), STRING(A[0], CPW*2)); 09802700
END DISPLAY1N1H; 09802800
09802900
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%09803000
PROCEDURE DISPLAY1N1S(MSGX, V1, P, LEN); 09803100
VALUE MSGX, V1, P, LEN; 09803200
INTEGER MSGX, LEN; 09803300
REAL V1; 09803400
POINTER P; 09803500
BEGIN COMMENT 09803600
DISPLAYS A MESSAGE WITH ONE NUMERIC AND ONE STRING PARAMETER. 09803700
; 09803800
MLSDISPLAY(MSGS[MSGX], STRING(V1,*), STRING(P,LEN)); 09803900
END DISPLAY1N1S; 09804000
09804100
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%09804200
PROCEDURE DISPLAY2N(MSGX, V1, V2); 09804300
VALUE MSGX, V1, V2; 09804400
INTEGER MSGX; 09804500
REAL V1, V2; 09804600
BEGIN COMMENT 09804700
DISPLAYS A MESSAGE WITH TWO NUMERIC PARAMETERS. 09804800
; 09804900
MLSDISPLAY(MSGS[MSGX], STRING(V1,*), STRING(V2,*)); 09805000
END DISPLAY2N; 09805100
80000000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%80000100
REAL PROCEDURE BIGENDIAN(V, BYTES); 80000200
VALUE V, BYTES; 80000300
REAL V; 80000400
INTEGER BYTES; 80000500
BEGIN COMMENT 80000600
CONVERTS THE LOW-ORDER "BYTES" OF A WORD (UP TO 6) FROM 80000700
LITTLE-ENDIAN TO BIG-ENDIAN BYTE ORDER. 80000800
; 80000900
80001000
BIGENDIAN:= (V.[47:8] & V[15:39:8] & V[23:31:8] & 80001100
V[31:23:8] & V[39:15:8] & V[47:7:8]).[47:BYTES*8]; 80001200
END BIGENDIAN; 80001300
80200000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%80200100
BOOLEAN PROCEDURE READTAP(TAPCOUNT, BUF, BLOCKLENGTH, MSGX); 80200200
VALUE TAPCOUNT, BLOCKLENGTH, MSGX; 80200300
EBCDIC ARRAY BUF[0]; 80200400
INTEGER TAPCOUNT, BLOCKLENGTH, MSGX; 80200500
BEGIN COMMENT 80200600
READS THE NEXT "BLOCKLENGTH" BYTES FROM THE INPUT .TAP FILE INTO 80200700
"BUF", CHECKING FOR LOGICAL I/O ERRORS AND A MATCHING ACTUALLY- 80200800
READ LENGTH (A MISMATCH USUALLY IMPLIES AN IMPENDING ERROR OR 80200900
EOF ON THE NEXT READ). 80201000
; 80201100
BOOLEAN 80201200
IORESULT; 80201300
80201400
IORESULT:= READ(TAP, BLOCKLENGTH, BUF); 80201500
IF IORESULT THEN 80201600
BEGIN 80201620
IF IORESULT.LIOEOFF THEN 80201640
DISPLAY2N(MSG_TAPEOF, TAPCOUNT, MSGX) 80201660
ELSE 80201680
DISPLAY1N1H(MSGX, TAPCOUNT, REAL(IORESULT)); 80201700
END 80201750
ELSE 80201800
IF REAL(IORESULT).LIOSIZEF ^= BLOCKLENGTH THEN 80201900
BEGIN 80202000
DISPLAY2N(MSGX, TAPCOUNT, REAL(IORESULT)); 80202100
IORESULT.[0:1]:= TRUE; 80202200
END; 80202300
80202400
READTAP:= IORESULT; 80202500
END READTAP; 80202600
81000000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%81000100
PROCEDURE CONVERTTAPE; 81000200
BEGIN COMMENT 81000300
DRIVER FOR CONVERTING THE .TAP FILE TO A .BCD FILE. 81000400
; 81000500
INTEGER 81000600
BLOCKSIZE, % ACTUAL TAPE BLOCK SIZE 81000700
BLOCKLENGTH, % ROUNDED-UP .TAP BLOCK SIZE 81000800
TAPCOUNT; % COUNT OF .TAP CONTROL BLOCKS 81000900
REAL 81001000
CTLW; % .TAP CONTROL WORD (32 BITS) 81001100
BOOLEAN 81001200
IORESULT, % LOGICAL I/O RESULT (STATE) 81001300
DONE; % LOOP CONTROL 81001400
81001500
DO BEGIN 81001600
TAPCOUNT:= *+1; 81001700
IORESULT:= READTAP(TAPCOUNT, BUF, 4, MSG_TAPCTLWORDERR); 81001800
IF IORESULT THEN 81001900
BEGIN 81001920
IF IORESULT.LIOEOFF THEN 81001940
DONE:= TRUE 81001960
ELSE 81001980
MYSELF.STATUS:= VALUE(TERMINATED); 81002000
END 81002050
ELSE 81002100
BEGIN 81002200
CTLW:= BIGENDIAN(REAL(BUF, 4), 4); 81002300
81002400
IF CTLW = 4"00000000" THEN 81002500
BEGIN % EOF (TAPEMARK) 81002600
REPLACE BUF BY TAPEMARK; 81002700
WRITE(BCD, 1, BUF); 81002800
END 81002900
81003000
ELSE IF CTLW.[30:7] = 0 THEN 81003100
BEGIN % NORMAL BLOCK WRITE 81003200
BLOCKSIZE:= CTLW.[23:24]; 81003300
BLOCKLENGTH:= (BLOCKSIZE+1) & 0[0:1]; 81003400
IORESULT:= READTAP(TAPCOUNT, BUF, BLOCKLENGTH, MSG_TAPDATAERR); 81003500
IF IORESULT THEN 81003600
MYSELF.STATUS:= VALUE(TERMINATED) 81003700
ELSE 81003800
BEGIN 81003900
IF CTLW.[31:8] = 4"80" THEN 81003905
DISPLAY1N1H(MSG_TAPEERROR, TAPCOUNT, CTLW); 81003910
81003915
REPLACE BUF BY BUF FOR BLOCKSIZE WITH BCDTOODDPARITY; 81003920
REPLACE BUF BY (REAL(BUF,1) & (1)[7:1]).[7:48] FOR 1; 81003940
IORESULT:= WRITE(BCD, BLOCKSIZE, BUF); 81004000
IF IORESULT THEN 81004100
BEGIN 81004200
DISPLAY1N1H(MSG_FILEWRITEERR, TAPCOUNT, REAL(IORESULT)); 81004300
MYSELF.STATUS:= VALUE(TERMINATED); 81004400
END 81004500
ELSE 81004600
BEGIN 81004700
IORESULT:= READTAP(TAPCOUNT, BUF, 4, MSG_TAPEORERR); 81004800
IF IORESULT THEN 81004920
MYSELF.STATUS:= VALUE(TERMINATED) 81004940
ELSE 81004960
IF BIGENDIAN(REAL(BUF, 4), 4) ^= CTLW THEN 81005000
BEGIN 81005100
DISPLAY2N(MSG_TAPEORMISMATCH, TAPCOUNT, 81005200
BIGENDIAN(REAL(BUF, 4), 4)); 81005300
MYSELF.STATUS:= VALUE(TERMINATED); 81005400
END; 81005500
END; 81005600
END; 81005700
END 81005800
81006500
ELSE IF CTLW = 4"FFFFFFFF" THEN 81006600
DONE:= TRUE % END-OF-MEDIUM, QUIT 81006700
81006800
ELSE IF CTLW = 4"FFFFFFFE" THEN 81006900
BEGIN END % ERASE GAP -- IGNORE THIS 81007000
81007100
ELSE 81007200
BEGIN % UNRECOGNIZED CONTROL WORD 81007300
DISPLAY1N1H(MSG_TAPINVALIDCTL, TAPCOUNT, CTLW); 81007400
MYSELF.STATUS:= VALUE(TERMINATED); 81007500
END; 81007600
END; 81007700
END 81007800
UNTIL DONE; 81007900
81008000
END CONVERTTAPE; 81008100
99900000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%99902000
%% OUTER BLOCK %%99903000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%99904000
REAL 99904100
T7; % TIME(7) TIMESTAMP WORD 99904200
99910000
T7:= COMPILETIME(7); 99910100
REPLACE BUF BY 99910200
T7.T7YEARF FOR 4 DIGITS, T7.T7MONTHF FOR 2 DIGITS, 99910300
T7.T7DAYF FOR 2 DIGITS, "-", 99910400
T7.T7HOURF FOR 2 DIGITS, T7.T7MINUTEF FOR 2 DIGITS; 99910500
MLSDISPLAY(MSGS[MSG_VERSION], STRING(BUF, 13)); 99910600
99910700
OPEN(TAP); 99910800
BCD.INTMODE:= TAP.INTMODE; 99910820
BCD.EXTMODE:= TAP.EXTMODE; 99910840
OPEN(BCD); 99910900
99911000
CONVERTTAPE; 99911100
99911200
CLOSE(BCD, CRUNCH); 99911300
CLOSE(TAP); 99911400
END. 99999900