mirror of
https://github.com/pkimpel/retro-b5500.git
synced 2026-04-14 00:53:43 +00:00
Release emulator version 0.17:
1. Enable (finally!) functioning of P2, the second processor, in CentralControl and Processor. 2. Fix bugs in Character Mode syllables FAD, FSU: initial compare of operands was alphanumeric instead of numeric. 3. Fix bugs in Character Mode syllables TRN, TRZ, TBN: non-boundary destination words were not being fetched into the B register. 4. Enable configuration of additional tape drives (up to the maximum of 16). 5. Implement new flip-flop latching mechanism in CentralControl for use by B5500Console. 6. Optimize clearing of interrupts in Central Control. 7. Implement preliminary mechanism to allow P2 to be added to the configuration temporarily without altering B5500SystemConfiguration.js. 8. Implement new average slack and delay algorithms in Processor.schedule(). 9. Optimize some Character Mode syllables by substituting local variables for "this" properties. 10. Fix bugs in Processor single-precision divide syllables leaving the stack in an incorrect state after a divide by zero in Control State. 11. Further minor tweaks to performance throttling. 12. Optimize references to this.cc in Processor.run(). 13. Minor improvements to B5500MagTapeDrive: eliminate oscillation at load point, improve timing of rewind operations. 14. Implement build-release.cmd script to generate emulator release archive files. 15. Commit initial Mark-XVI TSSINT transcription from Fausto Saporito.
This commit is contained in:
@@ -23927,3 +23927,191 @@ ONE: BEGIN STREAM(I: F~"ENDPACK", D~M[ALPHA-2]);% 38711000
|
||||
I~TALLY;% 38716000
|
||||
END;% 38717000
|
||||
IF NOT P THEN% 38718000
|
||||
BEGIN BLASTQ(U);% 38719000
|
||||
DO UNTIL WAITIO(M[ALPHA-2],@40,U)!0;% 38720000
|
||||
GO TO ONE;% 38721000
|
||||
END;% 38722000
|
||||
END;% 38723000
|
||||
BLASTQ(U); 38724000
|
||||
CC:: 38725000
|
||||
M[M[ALPHA-2] INX NOT 3].[9:6]:=0; 38726000
|
||||
LABELTABLE[U]~-@14; 38730000
|
||||
RDCTABLE[U]~0; 38731000
|
||||
IF 32{U AND U{63 THEN PSEUDOCOPY~PSEUDOCOPY+1; 38732000
|
||||
INDEPENDENTRUNNER(P(..CONTROLCARD),(M[ALPHA-2].[CF])& 38732100
|
||||
$ SET OMIT = NOT(DATACOM AND RJE ) 38732199
|
||||
U[2:42:6]&JAR[P1MIX,6][1:1:1], 38732300
|
||||
192); 38732400
|
||||
GO CLOSEOUT;% 38733000
|
||||
CP: EMPTY;% 38735000
|
||||
IF NOT UNLABELED THEN P(WAITIO(M[ALPHA-2],0,U),DEL);% 38736000
|
||||
SETNOTINUSE(U,FORMS OR PUNCHLCK); 38737000
|
||||
GO CLOSEOUT;% 38738000
|
||||
LP: EMPTY;% 38740000
|
||||
IF SEPARATE THEN P(WAITIO(@4000100000,0,U),DEL) %150-38741000
|
||||
ELSE P(WAITIO(@4002000000,0,U),DEL); %150-38741100
|
||||
IF NOT UNLABELED THEN P(WAITIO(M[ALPHA-2],0,U),DEL);% 38742000
|
||||
IF NOT SEPARATE THEN P(WAITIO(@4000100000,0,U),DEL); %150-38742100
|
||||
SETNOTINUSE(U,FORMS); 38743000
|
||||
GO CLOSEOUT;% 38744000
|
||||
SP: IF STATE.[43:1] THEN COOLOFF ELSE EMPTY;% 38746000
|
||||
GO CLOSEOUT;% 38747000
|
||||
MT: IF NOT STATE.[41:1] THEN% 38749000
|
||||
BEGIN IF STATE.[43:1] THEN% 38750000
|
||||
BEGIN COOLOFF; BLASTQ(U);% 38751000
|
||||
IF NOT REW THEN 38752000
|
||||
BEGIN T~@1000000140000005&STATE[22:44:1];% 38753000
|
||||
IF I}NBUFS THEN DO UNTIL WAITIO(T,@377,U).[42:1]; 38754000
|
||||
IF NOT UNLABELED THEN 38754100
|
||||
P(WAITIO(T,@377,U),DEL); 38755000
|
||||
END;% 38756000
|
||||
END ELSE% 38757000
|
||||
BEGIN EMPTY;% 38758000
|
||||
EOFIT: T~@1737000000000000;% 38759000
|
||||
P(WAITIO([T],@40,U),DEL);% 38760000
|
||||
IF NOT UNLABELED THEN% 38761000
|
||||
BEGIN;STREAM(BC~FIB[6],RC~FIB[7],D~M[ALPHA-2]);% 38762000
|
||||
BEGIN SI~LOC BC; DI~DI+40;% 38763000
|
||||
DS~5 dec; DS~7 DEC;% 38764000
|
||||
END;% 38765000
|
||||
P(WAITIO(M[ALPHA-2],@40,U),DEL);% 38766000
|
||||
P(WAITIO([T],@40,U),DEL);% 38767000
|
||||
T~@1000000340000005;% 38768000
|
||||
P(WAITIO(T,@40,U) ,DEL);% 38769000
|
||||
END;% 38770000
|
||||
END;% 38771000
|
||||
END ELSE% 38772000
|
||||
IF FIB[18].[1:1]THEN BEGIN FIB[18].[1:1]~FIB[16]~0; 38773000
|
||||
FIB[10].[3:15]:=0; GO EOFIT END; 38773100
|
||||
IF REW THEN% 38774000
|
||||
BEGIN P(WAITIO(@4200000000,@377,U),DEL);% 38775000
|
||||
STATE.[40:1]~0;% 38776000
|
||||
END ELSE STATE.[40:1]~NOT STATE.[44:1];% 38777000
|
||||
PX: IF REL THEN% 38778000
|
||||
BEGIN SETNOTINUSE(U,0); 38779000
|
||||
STATE.[41:2]~1;% 38780000
|
||||
END ELSE STATE.[41:2]~2;% 38781000
|
||||
IF LOCK THEN% 38782000
|
||||
BEGIN SETNOTINUSE(U,1); 38783000
|
||||
STATE.[41:2]~1;% 38784000
|
||||
END;% 38785000
|
||||
IF U LSS 16 THEN 38786000
|
||||
IF PURGE THEN% 38787000
|
||||
BEGIN IF PRNTABLE[U]<0 THEN% 38788000
|
||||
BEGIN RDCTABLE[U].[8:6]~0; %538-38788500
|
||||
INDEPENDENTRUNNER(P(.PURGEID),U,64) 38789000
|
||||
END %538-38789050
|
||||
ELSE SETNOTINUSE(U,0); 38789100
|
||||
STATE.[41:2]~2;% 38790000
|
||||
END;% 38791000
|
||||
GO TO CLEANUP;% 38792000
|
||||
PP:: IF NOT STATE.[41:1] THEN% 38794000
|
||||
BEGIN EMPTY; P(WAITIO(@2004500000000,@40,U),DEL) END;% 38795000
|
||||
GO TO PX; 38796000
|
||||
PR:: IF NOT STATE.[41:1] THEN BEGIN COOLOFF; BLASTQ(U) END;% 38798000
|
||||
IF REW THEN P(WAITIO(@10340000000,@377,U),DEL);% 38799000
|
||||
GO TO PX;% 38800000
|
||||
CD:: 38802000
|
||||
IF M[ALPHA].[27:1] THEN MOVE(10,FIB[16].[33:15],M[ALPHA-2]) ELSE 38803000
|
||||
EOD: DO UNTIL READMEFROMDISK(CIDROW[U-32],M[ALPHA-2]); 38804000
|
||||
$ SET OMIT = PACKETS 38804999
|
||||
IF JAR[P1MIX,0]<0 AND PRT[P1MIX,21]!0 OR JAR[P1MIX,1]<0 THEN 38806000
|
||||
BEGIN 38806050
|
||||
$ SET OMIT = NOT(PACKETS) 38806099
|
||||
PACKETERR[U-32]:=TRUE; 38806200
|
||||
IF CIDTABLE[U-32,3] LEQ CIDTABLE[U-32,7] THEN 38806300
|
||||
$ POP OMIT 38806301
|
||||
BEGIN STREAM(E~"ENDWAIT": Q~@14, D~M[ALPHA-2]); 38807000
|
||||
BEGIN SI~LOC Q; SI~SI+7; IF SC!DC THEN DI~DI+1; Q~DI; SI~Q; 38808000
|
||||
L: IF SC=" " THEN BEGIN SI~SI+1; GO TO L END; 38809000
|
||||
DI~LOC E; DI~DI+1; IF 3 SC!DC THEN TALLY~1; 38810000
|
||||
$ SET OMIT = NOT(PACKETS) 38810099
|
||||
IF TOGGLE THEN 38810100
|
||||
BEGIN SI~SI-3; IF 4 SC=DC THEN TALLY~0; END; 38810200
|
||||
$ POP OMIT 38810201
|
||||
E~TALLY; 38810500
|
||||
END; 38811000
|
||||
IF P THEN GO TO EOD; 38812000
|
||||
END; 38813000
|
||||
END; 38813100
|
||||
KIND~0; 38814000
|
||||
GO TO CC; 38815000
|
||||
CLOSEOUT:: STATE.[39:4]~1; TIME~1; 38817000
|
||||
CLEANUP:: CLOSED: DK: BKUP: DC: 38818000
|
||||
P(P&RCW[CTC],0,RDS,0,XCH,P&P[CTF],STF); 38819000
|
||||
END OTHER CLOSE; 38820000
|
||||
PROCEDURE FILEOPEN(XTRA,ALPHA); 39000000
|
||||
VALUE ALPHA,XTRA; INTEGER ALPHA,XTRA; 39000100
|
||||
BEGIN REAL RCW=+0;% 39001000
|
||||
REAL IOM=IOMASK, IOMASK; 39001100
|
||||
REAL XTRAR=-4,XTRAC=-6; 39001200
|
||||
INTEGER NBUFS,FNUM,RLEN,TYPE,IO,BLEN,U,KIND, 39002000
|
||||
MODE,DIREC,FORMS,COBOL,UNLABELED,OPTIONAL,CNTCTL; 39003000
|
||||
REAL T1,T2,MASK,STATE; 39004000
|
||||
REAL MFID,FID; INTEGER REEL,CDATE,CYCLE; %KEEP THESE TOGETHER 39004100
|
||||
ARRAY FIB[*],FPB[*];% 39005000
|
||||
INTEGER ACCESS,FIB7; 39006000
|
||||
LABEL DCIN,PBS; 39006100
|
||||
LABEL DC19; 39006800
|
||||
LABEL DKRN,SPN,DKSN,DKUN,DKPN,DCN; 39007000
|
||||
SWITCH INSW~DKRN,SPN,DKSN,DKUN,DCIN; 39008000
|
||||
LABEL LOOK,EXIT,LOOKOUT,LPS,FINALIN,FINALOUT,SPDC;% 39009000
|
||||
REAL SUBROUTINE DSED; DSED:=TERMSET(P1MIX); 39009050
|
||||
REAL SUBROUTINE CNTLBITS;% 39026000
|
||||
CNTLBITS~IOMASK&MODE[21:47:1]&DIREC[22:47:1]&CNTCTL[23:47:1]39027000
|
||||
&IO[24:47:1]&(KIND=7 OR KIND>9 AND KIND{12)[20:47:1] 39028000
|
||||
&(IF KIND=1OR KIND=7OR KIND=12THEN@20ELSE 0)[27:42:6];39029000
|
||||
SUBROUTINE MAKEIODS;% 39031000
|
||||
BEGIN FIB[16]~T1~((BLEN-1)|DIREC+M[ALPHA])&CNTLBITS[18:18:15]% 39032000
|
||||
&(IF BLEN{1023 THEN BLEN ELSE 1023)[838:10]% 39033000
|
||||
&TINU[IF (KIND=7 OR KIND=12) THEN IF TYPE<20 39034000
|
||||
THEN 20 ELSE 22 ELSE 39034050
|
||||
IF KIND=11 THEN 23 ELSE U][3:3:5] OR M; 39034100
|
||||
FIB[19]~(IF STATE.[46:2]=0 THEN (DIREC INX T1)% 39035000
|
||||
&(2|DIREC+(BLEN>1023)+1)[3:43:5] ELSE% 39036000
|
||||
IF STATE.[46:2]=1 THEN ((NOT RLEN INX 2)|DIREC INX T1)39037000
|
||||
&RLEN[8:38:10]&(3|DIREC+2)[3:43:5] ELSE% 39038000
|
||||
(1-DIREC INX T1)&RLEN[8:38:10]&(DIREC+6)[3:43:5])% 39039000
|
||||
&IO[25:47:1];% 39040000
|
||||
IF NOT (IO OR COBOL)THEN% 39041000
|
||||
T1~FIB[19]&T1[3:3:5]&0[25:25:1];% 39042000
|
||||
FIB[10],[3:15]~M[ALPHA]-2; %HEAD OF BUFFER RING 39042100
|
||||
T2~T1.[33:15]-M[ALPHA];% 39043000
|
||||
FOR MASK~0 STEP 1 UNTIL NBUFS-1 DO% 39044000
|
||||
BEGIN %P 39045000
|
||||
M[ALPHA+MASK]~FLAG((P(DUP,LOD)+T2)&P(T1,XCH)[33:33:15]);% 39046000
|
||||
END;% 39047000
|
||||
END MAKEIODS;% 39048000
|
||||
LABEL DKR0,SPO,DKS0,DKU0,DKP0,DC0; 39049000
|
||||
SWITCH OUTSW~DKR0,SPO,DKS0,DKU0,DC0;% 39050000
|
||||
LABEL FIXFIB,FIND,SPACER;% 39054000
|
||||
LABEL PREFINAL,DK1;% 39055000
|
||||
ARRAY HEADER[*];% 39056000
|
||||
REAL TOG; 39056100
|
||||
LABEL AGN; 39056500
|
||||
FIB~M[ALPHA-3]; FPB~PRT[P1MIX,3];% 39083000
|
||||
IOMASK:=IOM; 39083100
|
||||
NBUFS~FIB[13].[1:9]; FNUM~FIB[4].[13:11]; BLEN~FIB[18].[3:15];% 39084000
|
||||
TYPE~FPB[FNUM+3].[43;5];% 39085000
|
||||
STREAM(S ~ [FPB[FNUM+2]], D ~ [REEL]);% 39086000
|
||||
BEGIN SI:=S;DS:=3OCT;DS:=5OCT;DS:=OCT END;% 39087000
|
||||
P(CDATE, RSB, .CDATE,~); 39087100
|
||||
IF FPB[FNUM+4]>0 THEN REEL ~ CDATE ~ CYCLE ~ 0; 39087500
|
||||
MODE~FIB[13].[24:1]; IO~FIB[13].[27:1]; RLEN~FIB[18].[33:15];% 39088000
|
||||
DIREC~FIB[13].[25:1]; FORMS~FPB[FNUM+3].[42:1];% 39089000
|
||||
STATE~FIB[5]; UNLABELED~FIB[4].[2:1]; 39090000
|
||||
MFID~FPB[FNUM]; FOD~FPB[FNUM+1]; OPTIONAL~FIB[4].[5:1];% 39091000
|
||||
COBOL~(FIB[13] AND 1)&([FIB].[8:10]=22)[1:47:1]; % COBOL 60 & 68 39091100
|
||||
KIND~FIB[4].[8:4]; IF FIB[13].[28:10]!0 THEN REEL~FIB[13].[28:10]; 39092000
|
||||
IF COBOL>0 OR FIB[4].[7:1] THEN % COBOL 60 OR SORT 39092010
|
||||
M[FIB INX NOT 1].[3:6]~2 39092020
|
||||
ELSE M[ALPHA-7].[3:6]~2; 39092030
|
||||
$ SET OMIT = NOT(DATACOM AND RJE ) 39092039
|
||||
IF TYPE=19 THEN GO TO DC19 ELSE 39092045
|
||||
IF TYPE=26 THEN GO TO DKPN ELSE 39092050
|
||||
IF TYPE>26 THEN GO TO DCN; 39092055
|
||||
IF (TYPE=0 AND NOT IO) OR TYPE GTR 20 THEN 39092060
|
||||
BEGIN IF USEPBD 39092070
|
||||
$ SET OMIT = NOT(DATACOM AND RJE ) 39092074
|
||||
THEN TYPE:=22; GO TO LOOKOUT; 39092080
|
||||
END; 39092090
|
||||
|
||||
690
Mark-XVI/SYMBOL/TSSINT.esp_m
Normal file
690
Mark-XVI/SYMBOL/TSSINT.esp_m
Normal file
@@ -0,0 +1,690 @@
|
||||
% I N T R I N S I C S M A R K XVI.0.00 10/01/74
|
||||
COMMENT: * TITLE: B5500/B5700 MARK XVI SYSTEM RELEASE *
|
||||
* FILE ID: SYMBOL/INTRINS TAPE ID: SYMBOL1/FILE000 *
|
||||
* THIS MATERIAL IS PROPRIETARY TO BURROUGHS CORPORATION *
|
||||
* AND IS NOT TO BE REPRODUCED, USED, OR DISCLOSED *
|
||||
* EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE OR UPON *
|
||||
* WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF *
|
||||
* BURROUGHS CORPORATION, DETROIT, MICHIGAN 48232 *
|
||||
* *
|
||||
* COPYRIGHT (C) 1971, 1972, 1974 *
|
||||
* BURROUGHS CORPORATION *
|
||||
* AA320206 AA393180 AA332366 *;
|
||||
BEGIN
|
||||
DEFINE ETRLNG = 5#,
|
||||
INTDESC(INTDESC1) = FLAG(INTDESC1 & 85[1:41:7]) #,
|
||||
INTCALL(INTCALL1,INTCALL2) = P(INTCALL2 & 85[1:41:7],
|
||||
INTCALL1,COC) #,
|
||||
CALLINT(CALLINT1) = P(CALLINT1 & 85[1:41:7],XCH,COC) #,
|
||||
COBOLDCI= @167 #,
|
||||
FORTERRI= @134 #,
|
||||
EXPI = @20 #,
|
||||
LNI = @17 #,
|
||||
DEXPI = @77 #,
|
||||
DLOGI = @101 #,
|
||||
CABSI = @53 #,
|
||||
SINI = @14 #,
|
||||
SQRTI = @13 #,
|
||||
ATAN2I = @114 #,
|
||||
DMODI = @65 #,
|
||||
DSINI = @105 #,
|
||||
DSQRTI = @123 #,
|
||||
XTOII = @6 #,
|
||||
CXTOII = @56 #,
|
||||
COSI = @15 #,
|
||||
TANI = @111 #,
|
||||
ARCTANI = @16 #,
|
||||
DATANI = @113 #,
|
||||
ARSINI = @116 #,
|
||||
GAMMAI = @126 #,
|
||||
EDITIT(EDITIT1,EDITIT2,EDITIT3,EDITIT4,EDITIT5) = P(MKS,
|
||||
EDITIT1,EDITIT2,EDITIT3,(-1),(EDITIT4),(EDITIT5),
|
||||
@153&85[1:41:7],XCH,COC) #,
|
||||
% EDITIT(BUFFADDRESS,FIELDWIDTH(W),TYPE,LOWPART,HIGHPART)
|
||||
% WILL EDIT THE VALUE (LOWPART,HIGHPART) INTO A FIELD
|
||||
% STARTING AT BUFFADDRESS. EDITIT RETURNS THE ENDING
|
||||
% ADDRESS. THE WIDTH OF THE EDITED FIELD IS CONSTRAINED
|
||||
% TO W CHARACTERS (EDITED VALUE IS RIGHT JUSTIFIED WITH
|
||||
% LEADING BLANKS IF W IS LARGER THAN NEEDED) -- BUT IF
|
||||
% W=0, THEN EDITIT WILL ADJUST THE FIELD WIDTH TO
|
||||
% ACCOMODATE FULL NUMERICAL SIGNIFICANCE. TYPE=2 => EDITIT
|
||||
% WILL CHOOSE BETWEEN REAL, INTEGER, AND DOUBLEPRECISION
|
||||
% EDITING (DOUBLEPRECISION IS USED IF LOWPART!0).
|
||||
% TYPE=1 => USE ONLY INTEGER, TYPE=3 => USE ONLY REAL,
|
||||
% TYPE=4 => USE ONLY LOGICAL, TYPE=5 => USE ONLY DOUBLE-
|
||||
% PRECISION.
|
||||
CTC = 33:33:15#,
|
||||
CTF = 18:33:15#,
|
||||
FTC = 33:18:15#,
|
||||
FTF = 18:18:15#,
|
||||
CF = 33:15#,
|
||||
FF = 18:15#;
|
||||
REAL JUNK = 5;
|
||||
NAME MEM=2, M=2, MEMORY=2 ;
|
||||
REAL BLKCNTRL = 5;
|
||||
DEFINE DUMPNOW(DUMPNOW1)=P(DUMPNOW1,0,48,COM,DEL,DEL)#,
|
||||
TRACENOW(TRACENOW1,TRACENOW2)=
|
||||
P(TRACENOW1,1,TRACENOW2 ,+ ,48,COM,DEL,DEL)#;
|
||||
PROCEDURE OUTPUTINT(TEN, FILX, CHSKP, LNSKP, FI, FRMT, LISX);% %WF
|
||||
VALUE CHSKP, LNSKP, FI, LISX;% %WF
|
||||
NAME FILX;% %WF
|
||||
ARRAY TEN[*], FRMT[*];% %WF
|
||||
REAL LISX;% %WF
|
||||
INTEGER CHSKP, LNSKP, FI;% %WF
|
||||
FORWARD;% CODE=00200000, INTRINSIC NUMBER=@ 1 %WF
|
||||
PROCEDURE INTRINSIC(DUPE, D, NUMDIM, SIZE, TYPE);% %WF
|
||||
VALUE DUPE, D, NUMDIM, SIZE, TYPE;% %WF
|
||||
NAME D;% %WF
|
||||
ARRAY DUPE[*];% %WF
|
||||
INTEGER NUMDIM, SIZE, TYPE;% %WF
|
||||
FORWARD;% CODE=00400000, INTRINSIC NUMBER=@ 2 %WF
|
||||
PROCEDURE INPUTINT(TEN, FILX, DKADR, ACT,% %WF
|
||||
FI, FRMT, LISX, EOFL, PARL);% %WF
|
||||
VALUE ACT, FI;% %WF
|
||||
NAME FILX, LISX;% %WF
|
||||
ARRAY TEN[*], FRMT[*];% %WF
|
||||
REAL EOFL, PARL;% %WF
|
||||
INTEGER DKADR, ACT, FI;% %WF
|
||||
FORWARD;% CODE=00600000, INTRINSIC NUMBER=@ 3 %WF
|
||||
PROCEDURE DISKSORT(T1, T2, RELA, ENDQ, BINGO, IPFIDX,% %WF
|
||||
OUTPRO, INPRO, OUTF, INF, OPTOG, IPTOG, DKO, DKI,% %WF
|
||||
TP1, TP2, TP3, TP4, TP5, NT, HIVALU, EQUALS,% %WF
|
||||
R, ALFA, CORESIZE, DISKSIZE);% %WF
|
||||
VALUE OPTOG, IPTOG, NT, HIVALU, EQUALS, R, ALFA,% %WF
|
||||
CORESIZE, DISKSIZE;% %WF
|
||||
NAME TP1, TP2, TP3, TP4, TP5;% %WF
|
||||
REAL T1, T2, RELA, ENDQ, BINGO, IPFIDX, OUTPRO, INPRO,% %WF
|
||||
OUTF, INF, DKO, DKI, NT, HIVALU, EQUALS, CORESIZE;% %WF
|
||||
BOOLEAN OPTOG, IPTOG, ALFA;% %WF
|
||||
INTEGER R, DISKSIZE;% %WF
|
||||
FORWARD;% CODE=00700000, INTRINSIC NUMBER=@ 4 %WF
|
||||
REAL PROCEDURE DUMPINT(SN, CV, BV, TIPE,% %WF
|
||||
TENS, ALFA, CHAR, FIEL, FORMT);% %WF
|
||||
VALUE SN, CV, BV, TIPE, TENS, ALFA, CHAR, FORMT;% %WF
|
||||
NAME FIEL;% %WF
|
||||
REAL SN, CV, BV, TIPE, TENS, ALFA, CHAR, FORMT;% %WF
|
||||
FORWARD;% CODE=42000000, INTRINSIC NUMBER=@ 5 %WF
|
||||
PROCEDURE XTOTHEIINT(BASE, EXPON, M, LOG, EXP);% %WF
|
||||
VALUE BASE, EXPON, M, LOG, EXP;% %WF
|
||||
REAL BASE, EXPON, M, LOG, EXP;%
|
||||
FORWARD;% CODE=42254000, INTRINSIC NUMBER=@ 6
|
||||
REAL PROCEDURE ABSINT(X);%
|
||||
VALUE X;%
|
||||
REAL X;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@ 7
|
||||
REAL PROCEDURE SIGNINT(X);%
|
||||
VALUE X;%
|
||||
REAL X;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@10
|
||||
INTEGER PROCEDURE ENTIERINT(X);%
|
||||
VALUE X;%
|
||||
REAL X;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@11
|
||||
REAL PROCEDURE TIMEINT(X);%
|
||||
VALUE X;%
|
||||
REAL X;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@12
|
||||
PROCEDURE SQRTINT(X);%
|
||||
VALUE X;%
|
||||
REAL X;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@13
|
||||
PROCEDURE SININT(X);%
|
||||
VALUE X;%
|
||||
REAL X;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@14
|
||||
PROCEDURE COSINT(X);%
|
||||
VALUE X;%
|
||||
REAL X;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@15
|
||||
REAL PROCEDURE ARCTANINT(X);%
|
||||
VALUE X;%
|
||||
REAL X;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@16
|
||||
PROCEDURE LNINT(X);%
|
||||
VALUE X;%
|
||||
REAL X;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@17
|
||||
REAL PROCEDURE EXPINT(X);%
|
||||
VALUE X;%
|
||||
REAL X;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@20
|
||||
REAL PROCEDURE GOTOSOLVERINT(L, X, F, B);%
|
||||
VALUE L, X, F, B;%
|
||||
ARRAY F[*];%
|
||||
REAL L, X, B;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@21
|
||||
PROCEDURE ALGOLWRITE(TEN, FILX, CHSKP, LNSKP, FI, AEXP,%
|
||||
ARRY, LINESKIP, CHANSKIP, SUPRS, NUMWDS, TANK);%
|
||||
VALUE CHSKP, LNSKP, FI, AEXP, LINESKIP,%
|
||||
CHANSKIP, SUPRS, NUMWDS, TANK;%
|
||||
NAME FILX, TANK;%
|
||||
ARRAY TEN[*], ARRY[*];%
|
||||
INTEGER CHSKP, LNSKP, FI, AEXP, LINESKIP,%
|
||||
CHANSKIP, SUPRS, NUMWDS;%
|
||||
FORWARD;% CODE=00100100, INTRINSIC NUMBER=@22
|
||||
PROCEDURE ALGOLREAD(TEN, FILX, DKADD, ACT, FI, AEXP,%
|
||||
ARRY, EOFL, PARL, DKADR, CODE, TANK);%
|
||||
VALUE ACT, FI, AEXP, DKADR, CODE, TANK;%
|
||||
NAME FILX, TANK;%
|
||||
ARRAY TEN[*], ARRY[*];%
|
||||
REAL DKADD, EOFL, PARL, DKADR, CODE;%
|
||||
INTEGER ACT, FI, AEXP;%
|
||||
FORWARD;% CODE=00500000, INTRINSIC NUMBER=@23
|
||||
PROCEDURE ALGOLSELECT(ACT1, ACT2, TANK, I);%
|
||||
VALUE ACT1, ACT2, TANK, I;%
|
||||
NAME TANK;%
|
||||
INTEGER ACT1, ACT2, I;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@24
|
||||
PROCEDURE COBOLFCR;%
|
||||
FORWARD;% CODE=43000000, INTRINSIC NUMBER=@25
|
||||
PROCEDURE COBOLID;% % GO TO 02700000
|
||||
FORWARD;% CODE=43230000, INTRINSIC NUMBER=@26
|
||||
PROCEDURE POLYMERGE(T1, T2, T3, ENDQ, BINGO, IPFIDX,%
|
||||
OUTPRO, INPRO, OUTF, INF, OPTOG, IPTOG, DKO, DKI,%
|
||||
TP1, TP2, TP3, TP4, TP5, NT, HIVALU, EQUALS,%
|
||||
R, ALFA, CORESIZE, DISKSIZE);%
|
||||
VALUE OPTOG, IPTOG, NT, HIVALU, EQUALS, R, ALFA,%
|
||||
CORESIZE, DISKSIZE;%
|
||||
NAME TP1, TP2, TP3, TP4, TP5;%
|
||||
REAL T1, T2, T3, ENDQ, BINGO, IPFIDX, OUTPRO, INPRO,%
|
||||
OUTF, INF, DKO, DKI, NT, HIVALU, EQUALS, R, CORESIZE;
|
||||
BOOLEAN OPTOG, IPTOG, ALFA;%
|
||||
INTEGER DISKSIZE;%
|
||||
FORWARD;% CODE=40140000, INTRINSIC NUMBER=@27
|
||||
PROCEDURE STATUSINT(T, C);%
|
||||
VALUE T, C;%
|
||||
REAL T;%
|
||||
INTEGER C;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@30
|
||||
REAL PROCEDURE MAXINT(X);%
|
||||
VALUE X;%
|
||||
REAL X;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@31
|
||||
REAL PROCEDURE MININT(X);%
|
||||
VALUE X;%
|
||||
REAL X;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@32
|
||||
PROCEDURE DELAYINT(ARRY, MASK, TIME);%
|
||||
VALUE ARRY, MASK, TIME;%
|
||||
ARRAY ARRY[*];%
|
||||
REAL MASK;%
|
||||
INTEGER TIME;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@33
|
||||
PROCEDURE SUPERMOVERINT(SORCE, DEST, AEXP);%
|
||||
VALUE AEXP;%
|
||||
ARRAY SORCE[*], DEST[*];%
|
||||
INTEGER AEXP;%
|
||||
FORWARD;% CODE= INTRINSIC NUMBER=@34
|
||||
PROCEDURE SISO; FORWARD; %INT#35,SEQ#08400000
|
||||
INTEGER PROCEDURE DELTA(P1,P2);%INT#36,SEQ#00022300
|
||||
VALUE P1,P2; INTEGER P1,P2; FORWARD;
|
||||
PROCEDURE ICVD; FORWARD; %INT#37,SEQ#00022500
|
||||
PROCEDURE DYNAMICDIALER(B, A, X, F);
|
||||
VALUE B, A, X, F;
|
||||
INTEGER B, A, X; BOOLEAN F;
|
||||
FORWARD;% CODE=00022700, INTRINSIC NUMBER=@40
|
||||
PROCEDURE SCAN(UPDPDD,PRT,UPDCDD,HISCOUNT,CASECODE,CHAR);
|
||||
VALUE PTR, HISCOUNT, CASECODE, CHAR;
|
||||
NAME UPDPDD, UPDCDD;
|
||||
INTEGER PTR, HISCOUNT, CASECODE, CHAR;
|
||||
FORWARD;
|
||||
PROCEDURE REPL; FORWARD; %INT#42,SEQ#08420000
|
||||
PROCEDURE COMPARE;FORWARD; %INT#43,SEQ#08430000
|
||||
PROCEDURE BASICPRINT(TYPE);
|
||||
VALUE TYPE;
|
||||
REAL TYPE;
|
||||
FORWARD; CODE=08500000, INTRINSIC NUMBER=@44
|
||||
PROCEDURE SWAP; FORWARD; %INT#45,SEQ#00023700
|
||||
PROCEDURE BASICINPUT(TYPES);
|
||||
VALUE TYPES;
|
||||
REAL TYPES;
|
||||
FORWARD;% CODE=08700000, INTRINSIC NUMBER=@46
|
||||
PROCEDURE READATA(TYPE);
|
||||
VALUE TYPE;
|
||||
REAL TYPE;
|
||||
FORWARD;% CODE=08600000, INTRINSIC NUMBER=@47
|
||||
PROCEDURE FTINT ; FORWARD; % 050
|
||||
PROCEDURE FTOUT ; FORWARD; % 051
|
||||
PROCEDURE DABS ; FORWARD; % 052
|
||||
PROCEDURE CABS ; FORWARD; % 053
|
||||
PROCEDURE AINT ; FORWARD; % 054
|
||||
PROCEDURE MATH ; FORWARD; % 055
|
||||
PROCEDURE XTOI ; FORWARD; % 056
|
||||
PROCEDURE IDINT ; FORWARD; % 057
|
||||
PROCEDURE FLOAT ; FORWARD; % 060
|
||||
PROCEDURE SNGL ; FORWARD; % 061
|
||||
PROCEDURE DBLE ; FORWARD; % 062
|
||||
PROCEDURE AMOD ; FORWARD; % 063
|
||||
PROCEDURE TIME ; FORWARD; % 064
|
||||
PROCEDURE DMOD ; FORWARD; % 065
|
||||
PROCEDURE DMAX1 ; FORWARD; % 066
|
||||
PROCEDURE DMIN1 ; FORWARD; % 067
|
||||
PROCEDURE SIGNV ; FORWARD; % 070
|
||||
PROCEDURE DSIGN ; FORWARD; % 071
|
||||
PROCEDURE DIIM ; FORWARD; % 072
|
||||
PROCEDURE REALP ; FORWARD; % 073
|
||||
PROCEDURE AIMAG ; FORWARD; % 074
|
||||
PROCEDURE CMPLX ; FORWARD; % 075
|
||||
PROCEDURE CONJG ; FORWARD; % 076
|
||||
PROCEDURE DEXP ; FORWARD; % 077
|
||||
PROCEDURE CEXP ; FORWARD; % 100
|
||||
PROCEDURE DLOG ; FORWARD; % 101
|
||||
PROCEDURE CLOG ; FORWARD; % 102
|
||||
PROCEDURE ALOG10; FORWARD; % 103
|
||||
PROCEDURE DLOG10; FORWARD; % 104
|
||||
PROCEDURE DSIN ; FORWARD; % 105
|
||||
PROCEDURE CSIN ; FORWARD; % 106
|
||||
PROCEDURE DCOS ; FORWARD; % 107
|
||||
PROCEDURE CCOS ; FORWARD; % 110
|
||||
PROCEDURE TANF ; FORWARD; % 111
|
||||
PROCEDURE COTAN ; FORWARD; % 112
|
||||
PROCEDURE DATAN ; FORWARD; % 113
|
||||
PROCEDURE ATAN2 ; FORWARD; % 114
|
||||
PROCEDURE DATAN2; FORWARD; % 115
|
||||
PROCEDURE ARSIN ; FORWARD; % 116
|
||||
PROCEDURE ARCOS ; FORWARD; % 117
|
||||
PROCEDURE SINH ; FORWARD; % 120
|
||||
PROCEDURE COSH ; FORWARD; % 121
|
||||
PROCEDURE TANH ; FORWARD; % 122
|
||||
PROCEDURE DSQRT ; FORWARD; % 123
|
||||
PROCEDURE CSQRT ; FORWARD; % 124
|
||||
PROCEDURE ERF ; FORWARD; % 125
|
||||
PROCEDURE GAMMA ; FORWARD; % 126
|
||||
PROCEDURE ALGAMA; FORWARD; % 127
|
||||
PROCEDURE ANDI ; FORWARD; % 130
|
||||
PROCEDURE ORI ; FORWARD; % 131
|
||||
PROCEDURE CMPL ; FORWARD; % 132
|
||||
PROCEDURE EQUIVP; FORWARD; % 133
|
||||
PROCEDURE FORTERR;FORWARD; % 134
|
||||
PROCEDURE MAX; FORWARD; % 135
|
||||
PROCEDURE MIN; FORWARD; % 136
|
||||
PROCEDURE IMOD; FORWARD; % 137
|
||||
PROCEDURE CONCAT; FORWARD; % 140
|
||||
PROCEDURE CONCAT;
|
||||
FORWARD;% CODE=08400000, INTRINSIC NUMBER=@140
|
||||
PROCEDURE MATRIXDIDDLER(A, B, C, TYPE);
|
||||
VALUE A, B, C, TYPE;
|
||||
ARRAY A[*], B[*], C[*];
|
||||
INTEGER TYPE;
|
||||
FORWARD;% CODE=08800000, INTRINSIC NUMBER=@~4~
|
||||
PROCEDURE INVERT(A, B);
|
||||
VALUE A, B;
|
||||
ARRAY A[*], B[*];
|
||||
FORWARD;% CODE=09100000, INTRINSIC NUMBER=@142
|
||||
PROCEDURE TRANSPOSE(A, B);
|
||||
VALUE A, B;
|
||||
ARRAY A[*], B[*];
|
||||
FORWARD;% CODE=08900000, INTRINSIC NUMBER=@143
|
||||
PROCEDURE MATRIXMULTIPLY(A, B, C);
|
||||
VALUE A, B, C;
|
||||
ARRAY A[*], B[*], C[*];
|
||||
FOWARD;% CODE=09000000, INTRINSIC NUMBER=@144
|
||||
PROCEDURE RANDOM(NUMBER, BASE);
|
||||
VALUE NUMBER;
|
||||
REAL NUMBER;
|
||||
INTEGER BASE;
|
||||
FORWARD;% CODE=00022900, INTRINSIC NUMBER=@145
|
||||
PROCEDURE FORTRANFREEREAD;
|
||||
FORWARD;% CODE=09200000, INTRINSIC NUMBER=@146
|
||||
PROCEDURE BASICLOSE(FILX);
|
||||
VALUE FILX; NAME FILX;
|
||||
BEGIN REAL SELECT=14, ALGOLWRITE=12; ARRAY AIT=6[*];
|
||||
REAL T,I; ARRAY FIB[*]; NAME M=2;
|
||||
SUBROUTINE MAYBEPRINT;
|
||||
BEGIN FIB:=FILX[NOT 2];
|
||||
IF FIB[5].[41:3]=0 THEN %NOT CLOSED-NOT INPUT
|
||||
IF FIB[4].[8:4] NEQ 10 THEN %NOT DATA COM
|
||||
IF FIB[20].[3:15]!0 THEN % DATA LEFT
|
||||
P(MKS,1,0,0,(FIB[20].[18:10]+1),FILX,ALGOLWRITE);
|
||||
END;
|
||||
IF P(.FILX,LOD)=0 THEN %EOJ FILE CLOSE
|
||||
BEGIN I:=AIT[0]+1; WHILE (T:=AIT[I:=I-1]).[8:10] NEQ 0
|
||||
DO IF T.[1:1] THEN
|
||||
BEGIN FILX:=M[M[T.[18:15]] INX 4]; MAYBEPRINT END;
|
||||
END ELSE %FILE RESTORE
|
||||
BEGIN MAYBEPRINT;
|
||||
P(MKS,2,0,[FILX[NOT 2]],4,SELECT);
|
||||
FIB[0]:=FIB[8]:=FIB[20]:=FIB[21]:=0;
|
||||
END;
|
||||
END BASIC FILE RESTORE;
|
||||
PROCEDURE FILEATTRIBUTES(T,E,D,V,G,I,TN); VALUE T,I,V,D,G; REAL D,G,I,E;
|
||||
INTEGER V; ARRAY TN[*]; NAME T; FORWARD; % CODE @ 0043000, INT # @150
|
||||
PROCEDURE COBOLDECIMALTOOCTALCONVERT(A); % INT #=@151, CODE=09300000
|
||||
VALUE A; NAME A; FORWARD ;
|
||||
PROCEDURE COBOLOCTOLTODECIMALCONVERT(A,L,H,R,N,S,T); % INT #=@152
|
||||
VALUE L,H,R,N,S,T; REAL L,H,R,N,S,T; NAME A; FORWARD; % CODE=09400000
|
||||
PROCEDURE FORTRANFREEWRITE(F,D,R,W,L,I,N,S); VALUE I,D,R,W,L; INTEGER R,
|
||||
W; REAL I,D,L; NAME F; ARRAY S[*],N[*]; FORWARD ;%COD @02976019.INT@153
|
||||
PROCEDURE FINNAME; FORWARD;
|
||||
PROCEDURE FOUTNAME; FORWARD;
|
||||
PROCEDURE FTINTFIX(F1,D2,F2,F3,L1,E1,E2,P1); VALUE D1,F2,L1,E1,E2,P1 ;
|
||||
REAL D1,F2,L1,E1,E2,P1; ARRAY F3[*]; NAME F1; FORWARD; % INTRINSIC @156
|
||||
PROCEDURE FTOUTFIX(F,D,R,Q,L,E,EL,PL); VALUE D,R,L,E,EL,PL; REAL D,R,L,E
|
||||
,EL,PL; NAME F; ARRAY Q[*]; FORWARD ; % CODE AT SEQ # 02886040, INT@157
|
||||
PROCEDURE FBINBACKBLOCK(F1,D,F2,F3,L,E1,E2,P1); VALUE D,F2,L,E1,E2,P1 ;
|
||||
REAL D,F2,L,E1,E2,P1; ARRAY F3[*]; NAME F1; FORWARD; % INT # @160.
|
||||
PROCEDURE COBOLVARSZ; FORWARD;% CODE=09500000 INT #=@161
|
||||
PROCEDURE COBOLIONONDSK; FORWARD;% CODE=096000000 INT #=@162
|
||||
PROCEDURE COBOLIODSK; FORWARD;% CODE=09700000 INT #=@163
|
||||
PROCEDURE FORTRANMEMHANDLER(A,H);VALUE H;REAL H;ARRAY A[*];FORWARD;%164
|
||||
PROCEDURE COBOLATT; FORWARD; % CODE = 02650000 INT # = @165 %CJC 103I
|
||||
PROCEDURE INTERRUPTER; FORWARD; % CODE=09800000; INT #=@166
|
||||
PROCEDURE COBOLDC; FORWARD; % CODE = 02690000 INT #=@167
|
||||
INTEGER PROCEDURE DELTA(P1,P2); VALUE P1,P2; REAL P1,P2; %@036
|
||||
BEGIN
|
||||
DEFINE
|
||||
DOT=[18:13]#, AMPER=[18:35:13]#;
|
||||
COMMENT @4000000=2|20, WHICH IS 1 LARGER THAN ANY 6500 COUNT.;
|
||||
COMMENT DELTA=2|20 IF DESC(P1)!DESC(P2) OR CSIZE-S ARE !;
|
||||
IF (P2-P1).[31:17]!0 THEN DELTA~@4000000 ELSE
|
||||
DELTA~P2.DOT-P1.DOT;
|
||||
END DELTA;
|
||||
|
||||
PROCEDURE ICVD; %37
|
||||
BEGIN
|
||||
DEFINE DOT=[18:13]#, AMPER=[18:35:13]#, CSIZE=[31:02]#,SIX=0#;
|
||||
ARRAY STRING[*];
|
||||
NAME M = 2;
|
||||
REAL PTR=-3; INTEGER N=-1;
|
||||
IF PTR.CSIZE!SIX THEN POLISH(M&1[17:47:01],9999,CDC,DEL);
|
||||
STRING ~ M[PTR];
|
||||
N~N; COMMENT MAKE SURE N IS INTEGERIZED;
|
||||
IF N>8 THEN POLISH(M&1[14:47:01],N,CDC,DEL);
|
||||
POLISH([STRING[(PTR.DOT+N-1).[35:10]]], DEL);
|
||||
STREAM(RESULT~0:S~[STRING[PTR.[18:10]]], N,
|
||||
SKS~PTR.[28:03]);
|
||||
BEGIN
|
||||
DI ~ LOC RESULT;
|
||||
SI ~ S; SI ~ SI+SKS
|
||||
DS ~ N OCT;
|
||||
END;
|
||||
PTR ~ P;
|
||||
END ICVD;
|
||||
PROCEDURE DYNAMICDIALER(A,B,X,F) ;
|
||||
VALUE B, A, X, F;
|
||||
INTEGER B, A, X; BOOLEAN F;
|
||||
BEGIN % A,B,X,Y,Z ARE AS IN Y&Z[A:B:X].
|
||||
% F=TRUE => X WAS LITERAL, AND TRB WILL BE DONE AFTER XITING.
|
||||
REAL Y=-7, Z=-6, C=+1 ;
|
||||
DEFINE Q= @3403007777777777 #, % MASK FOR ZERO-ING OUT THE G,H,K&V-
|
||||
% REGISTER PARTS OF THE ROW.
|
||||
R= @0055005500610065 #, % NOP,DIA,DIB,TRB.
|
||||
S= @0055703404210435 #; % NOP,LITC Y,STD,XIT.
|
||||
IF (A~A)<1 OR (B~B)<1 OR (X~X)<1 OR X+A>48 OR X+B>48
|
||||
THEN P((-63),26,COM) ;
|
||||
IF F THEN P(Q,AND,0&(B MOD 6)[4:9:3],A MOD 6,DIB 7,TRB 3,
|
||||
P&(B DIV 6)[12:45:3],A DIV 6,DIB 15,TRB 3,OR,0,0,XIT) ;
|
||||
GO P(P(R)&(B DIV 6)[12:45:3],A DIV 6,DIB 24,TRB 3,P&(B MOD 6)
|
||||
[15:9:3],A MOD 6,DIB 27,TRB 3,P&X[36:42:6],.A,~,S,.B,~,Y,Z,[A]);
|
||||
END DYNAMICDIALER;
|
||||
|
||||
|
||||
PROCEDURE RANDOM(NUMBER, BASE);
|
||||
VALUE NUMBER;
|
||||
REAL NUMBER;
|
||||
INTEGER BASE;
|
||||
BEGIN INTEGER N;
|
||||
REAL T;
|
||||
IF (T := NUMBER MOD 1.0)>0 THEN
|
||||
BEGIN BASE := T.[9:38]; P(RTN); END;
|
||||
IF NUMBER!0 THEN
|
||||
BEGIN T := POLISH(1, 1, COM);
|
||||
N := 0 & T[10:36:6] & T[16:42:6] & T[22:30:6]
|
||||
& ((T.[30:18])|P(DUP))[28:22:20];
|
||||
END ELSE IF (N := BASE)=0 THEN N := @2631353020000;
|
||||
T := 3 & (N.[10:26]|6137 + 2197513)[10:12:36];
|
||||
POLISH((((BASE := T) OR 0.5) - 0.5) + P(DUP), RTN);
|
||||
END RANDOM;
|
||||
|
||||
|
||||
PROCEDURE SWAP; % 045
|
||||
BEGIN
|
||||
ARRAY A = -2 [*,*], B = -1 [*,*];
|
||||
STREAM(A, B, CA~0, CB~0, FA~A.[18:15], FB~B.[18:15]);
|
||||
BEGIN
|
||||
SI ~ A; CA ~ SI;
|
||||
SI ~ B; CB ~ SI;
|
||||
DI ~ LOC B; DI ~ DI+5; SKIP 3 DB;
|
||||
SI ~ LOC CA; SI ~ SI+5; SKIP 3 SB;
|
||||
3(IF SB THEN DS ~ SET ELSE DS ~ RESET; SKIP SB); DS ~ 2 CHR;
|
||||
DI ~ DB; SI ~ LOC B; DS ~ WDS;
|
||||
DI ~ LOC A; DI ~ DI+5; SKIP 3 DB;
|
||||
SI ~ LOC CB; SI ~ SI+5; SKIP 2 SB;
|
||||
3(IF SB THEN DS ~ SET ELSE DS ~ RESET; SKIP SB); DS ~ 2 CHR;
|
||||
DI ~ FA; SI ~ LOC A; DS ~ WDS;
|
||||
END;
|
||||
END SWAP;
|
||||
|
||||
|
||||
|
||||
|
||||
COMMENT ALGOL WRITE INTRINSIC;%
|
||||
PROCEDURE ALGOLWRITE(TEN, FILX, CHSKP, LNSKP, FI, AEXP,
|
||||
ARRY, LINESKIP, CHANSKIP, SUPRS, NUMWDS, TANK);
|
||||
VALUE LINESKIP, CHANSKIP, SUPRS, NUMWDS, TANK,
|
||||
CHSKP, LNSKP, FI, ARRY;
|
||||
INTEGER CHSKP, LNSKP, FI, AEXP,
|
||||
LINESKIP, CHANSKIP, NUMWDS, SUPRS;
|
||||
NAME FILX, TANK;
|
||||
ARRAY ARRY[*], TEN[*];
|
||||
BEGIN REAL SELECT=14,REED=13,ADDRESS;%
|
||||
NAME MEM=2;%
|
||||
LABEL AB,ACTION;
|
||||
LABEL DS,WINDUP1;
|
||||
ARRAY FPB=3[*],FIB[*],HEADER[*];%
|
||||
INTEGER I,RSIZE;%
|
||||
INTEGER SPOUT;
|
||||
ARRAY TINK=TANK[*];
|
||||
REAL CHNSKP=CHANSKIP;
|
||||
REAL ALGOLWRITE=12;
|
||||
DEFINE FNUM = FIB[4].[11:31] #;
|
||||
$ SET OMIT = NOT(TIMESHARING)
|
||||
SUBROUTINE WAIT; POLISH(TANK, @2000000000, 36, COM, DEL DEL);
|
||||
$ POP OMIT
|
||||
$ SET OMIT = TIMESHARING
|
||||
LABEL ERR,LP1,MT1,CLOSED,DK1,SP1,CP1,DC1,PP1;%
|
||||
LABEL DCN1,DCN2,SPIN;
|
||||
$ SET OMIT = NOT SHAREDISK
|
||||
SWITCH SW1~ ERR,LP1,MT1,CLOSED,DK1,SP1,CP1,LP1,PP1,ERR,DC1,
|
||||
ERR,LP1,DCN1;
|
||||
LABEL LP2,MT2,DK2,SP2,CP2,DC2,PP2;%
|
||||
SWITCH SW2~ ERR,LP2,MT2,ERR,DK2,SP2,CP2,LP2,PP2,ERR,DC2,ERR,
|
||||
LP2,DCN2;
|
||||
LABEL DS1,DR1,DU1;%
|
||||
SWITCH DSW1~DS1,DR1,DU1,CLOSED;
|
||||
LABEL UT,PBIT,DWT,D19,RELEASE,STA,EXIT,L1,WINDUP,DBIT;%
|
||||
LABEL TYPEU,TYPEA,TYPEC;%
|
||||
SWITCH TYPE~TYPEU,TYPEA,ERR,TYPEC;%
|
||||
LABEL DS2,DR2,DU2;%
|
||||
SWITCH DSW2~DS2,DR2,DU2;%
|
||||
SUBROUTINE BLOCK;%
|
||||
BEGIN GO TO TYPE[I~FIB[5].[46:2]];%
|
||||
TYPEC: STREAM(D1~IOD,S~(NUMWDS~NUMWDS+1)|8,%
|
||||
D2~(TANK[0]~NUMWDS INX IOD));%
|
||||
BEGIN SI~LOC S; DI~DI-8; DS~4 DEC; DI~D1;%
|
||||
SI~D2; SI~SI-8; DI~DI-4; DS~4 CHR;%
|
||||
END;%
|
||||
IF (FIB[17]~FIB[17]-NUMWDS)>RSIZE+1 THEN BEGIN%
|
||||
OWT: FIB[7]~FIB[7]+1; P(XIT);%
|
||||
TYPEA: IF (FIB[17]~FIB[17]-RSIZE)}RSIZE THEN%
|
||||
BEGIN TANK[0]~RSIZE INX IOD; GO OWT END END;%
|
||||
NUMWDS~FIB[18].[18:5]-FIB[17]+(I=3);%
|
||||
TYPEU: END BLOCK;%
|
||||
REAL SUBROUTINE DISKADDRESS;%
|
||||
BEGIN%
|
||||
ADDRESS~(CHANSKIP DIV HEADER[0].[30:12])|HEADER[0].[42:6];%
|
||||
IF (SUPRS~ADDRESS DIV HEADER[1]+10)}30 THEN
|
||||
BEGIN P(0); GO TO EXIT END;
|
||||
IF HEADER[SUPRS]=0 THEN
|
||||
IF HEADER[9]>(SUPRS-10) THEN%
|
||||
P(FPB[FNUM+3],FPB[FNUM],FPB[FNUM+1],SUPRS,HEADER,
|
||||
4,11,COM,DEL,DEL,DEL,DEL,DEL,DEL) ELSE
|
||||
BEGIN P(0); GO TO EXIT END;%
|
||||
ADDRESS~HEADER[SUPRS]+SUPRS+ADDRESS MOD HEADER[1];%
|
||||
STREAM(D~[ADDRESS]); BEGIN SI~D; DS~8 DEC END; P(1);%
|
||||
EXIT: DISKADDRESS~P;%
|
||||
END DISKADDRESS;%
|
||||
IF TINK=0 THEN %WF
|
||||
BEGIN FIB ~ FILX[NOT 2]; %WF
|
||||
IF FIB[5].[11:2]<2 THEN P(MKS,"WRITING",FILX,7,SELECT) ;
|
||||
IF FIB[5].[43:1] THEN
|
||||
P(MKS, CHSKP, 0, FILX, 1, SELECT);
|
||||
IF LNSKP>1 AND ARRY{0 AND (I~FIB[4].[8:4])!1
|
||||
$ SET OMIT = NOT(TIMESHARING)
|
||||
AND I!7 AND I!12 AND I!10 THEN
|
||||
$ SET OMIT = TIMESHARING
|
||||
P(XIT);%CARRIAGE CONTROL ON NON-PRINTER FILE
|
||||
|
||||
|
||||
RSIZE ~ P(MKS, LNSKP, CHSKP, SUPRS, %WF
|
||||
(-1), FILX, ALGOLWRITE); %WF
|
||||
IF ARRY{0 THEN SUPRS ~ 1 ELSE %WF
|
||||
BEGIN % 11/24/72 - CORRECTED 10/3/73
|
||||
IF ARRY.[8:10]=P(DUP,0) THEN % INDEXED WRITE
|
||||
P(DEL,AEXP) % WRITE MIN(AEXP,RSIZE) WORDS
|
||||
ELSE % WRITE MIN(ARRY, SIZE,AEXP,RSIZE) WORDS
|
||||
IF P GTR P(DUP,AEXP) %
|
||||
THEN P(DEL,AEXP); %WF
|
||||
IF P(DUP)}RSIZE THEN P(DEL) ELSE RSIZE ~ P; %WF
|
||||
STREAM(P4 ~ [ARRY[0]], P3 ~ RSIZE, %WF
|
||||
P2 ~ P(DUP).[36:6], P1 ~ *FILX); %WF
|
||||
END; %WF
|
||||
END; %WF
|
||||
IF RSIZE>0 THEN P(MKS, LNSKP, %WF
|
||||
CHSKP, SUPRS, RSIZE, FILX, ALGOLWRITE); %WF
|
||||
FILX[NOT 4] ~ FILX[NOT 3] ~ 0; %WF
|
||||
P(XIT); %WF
|
||||
END; %WF
|
||||
FIB~TANK[NOT 2];%
|
||||
UT: I~FIB[4].[8:4]; RSIZE~FIB[18].[33:15];%
|
||||
SPOUT:=(I=5);
|
||||
$ SET OMIT = TIMESHARING
|
||||
IF CHNSKP.[4:1] THEN
|
||||
BEGIN CHNSKP.[4:1]~0;
|
||||
$ SET OMIT = NOT SHAREDISK
|
||||
END;
|
||||
IF NUMWDS<0 THEN GO TO SW1[I]; GO TO SW2[I];%
|
||||
LP1: MT1: SP1: CP1: PP1:
|
||||
%
|
||||
D19: IF IOD.[19:1] THEN%
|
||||
PBIT: IF IOD.[2:1] THEN P(RSIZE,RTN) ELSE%
|
||||
IF IOD.[25:1] THEN%
|
||||
CLOSED: BEGIN
|
||||
FIB[13].[27:1]~0;
|
||||
IF (I~(FPB[FNUM+3] AND 31)!10 AND I!12
|
||||
AND I!13 AND I!26 THEN FIB[5].[45:1]~0 ELSE
|
||||
FIB[5].[45:1]~P(TANK[NOT 3],DUP)!0 AND P(XCH)!15;
|
||||
P(TANK,0,11,COM,DEL,DEL) ;
|
||||
IF NOT FIB[5].[45:1] THEN GO UT ;
|
||||
P(TANK[NOT 3]); TANK[NOT 3]~TANK[NOT 4]~0 ;
|
||||
P(MKS,9,BLKCNTRL,DEL) ;% TAKE PARITY ACTION LBL BRNCH.
|
||||
P(1); GO TO DS;
|
||||
END ELSE
|
||||
IF IOD.[27:1] AND (I=2 OR I=7 OR I=8) THEN%
|
||||
BEGIN IF NOT FIB[4].[2:1] THEN%
|
||||
BEGIN HEADER~TANK[NOT 1];HEADER[4].[42:6]~1 END;
|
||||
IF I=7 THEN FIB[9].[1:1]~1; % MULTI-REEL PBT FILE
|
||||
I~FIB[13].[28:10]+1;%
|
||||
P(MKS,6,0,(NOT 2) INX TANK,4,SELECT);%
|
||||
FIB[13].[28:10]~I; GO TO CLOSED;%
|
||||
END ELSE%
|
||||
BEGIN
|
||||
ERR: P(3);
|
||||
DS: P(TANK,XCH,11,COM);
|
||||
END;
|
||||
WAIT; GO TO PBIT;%
|
||||
DK1: HEADER~*[FIB[14]]; GO TO DSW1[FIB[4].[27:3]];%
|
||||
DK2: HEADER~*[FIB[14]]; GO TO DSW2[FIB[4].[27:3]];%
|
||||
CP2: BLOCK; TANK[0]~FLAG(FIB[16])&CHANSKIP[32:47:1]; GO TO RELEASE;%
|
||||
LP2: IF SUPRS THEN STREAM(RSIZE,D~IOD); BEGIN RSIZE(DS~8 LIT " ") END;
|
||||
CHANSKIP~CHANSKIP+LINESKIP.[45:1];
|
||||
IF CHANSKIP!0 THEN%
|
||||
BEGIN IF (I~FIB[17]-RSIZE)>0 THEN%
|
||||
STREAM(I,D~RSIZE INX IOD); BEGIN I(DS~8 LIT " ") END;%
|
||||
END ELSE BLOCK;%
|
||||
TANK[0]~FLAG(FIB[16])&LINESKIP[27:47:1]&LINESKIP[28:46:1]%
|
||||
&CHANSKIP[29:44:4]&NUMWDS[8:38:10];%
|
||||
GO TO RELEASE;%
|
||||
SP2: PP2:%
|
||||
MT2: BLOCK;%
|
||||
P(TANK[0]~FLAG(FIB[16])&NUMWDS[8:38:10],NUMWDS,XCH,INX,%
|
||||
@3700000000000000,XCH,~);%
|
||||
IF SPOUT THEN % SPO OUTPUT
|
||||
IF FPB[FNUM+3].[42:6]=43 THEN P(XIT) ELSE %DUMMY
|
||||
P(0,0,NOT,IOD,INX,15,COM,XIT)
|
||||
ELSE
|
||||
RELEASE: P(FLAG(FIB[19])&IOD[3:3:5],TANK,PRL,DEL);%
|
||||
WINDUP: I~FIB[19].[33:15]-FIB[16].[33:15];%
|
||||
FIB[16].[33:15]~SUPRS~MEM[P(DUP) INX NOT 1].[18:15];%
|
||||
FIB[19].[33:15]~SUPRS+I;%
|
||||
WINDUP1:
|
||||
FIB[6]~FIB[6]+1; FIB[7]~FIB[7]+1; FIB[17]~FIB[18].[18:15];%
|
||||
P(XIT);%
|
||||
DU1:%
|
||||
DS1: IF LINESKIP!0 THEN%
|
||||
BEGIN IF IOD.[27:1] AND IOD.[19:1] THEN GO AB;
|
||||
IF FIB[17]=FIB[18].[18:15] THEN
|
||||
BEGIN CHANSKIP~FIB[7];%
|
||||
L1: IF DISKADDRESS THEN%
|
||||
IF IOD.[19:1] THEN DBIT: IF IOD.[2:1] THEN%
|
||||
BEGIN
|
||||
$ SET OMIT = NOT SHAREDISK
|
||||
MEM[FIB[16]]~ADDRESS;
|
||||
P(RSIZE,RTN);
|
||||
END ELSE
|
||||
IF IOD.[25:1] THEN GO TO CLOSED ELSE
|
||||
$ SET OMIT = NOT SHAREDISK
|
||||
BEGIN
|
||||
$ SET OMIT = NOT SHAREDISK
|
||||
GO TO AB;
|
||||
END ELSE
|
||||
BEGIN WAIT; GO TO DBIT; END ELSE
|
||||
BEGIN
|
||||
$ SET OMIT = NOT SHAREDISK
|
||||
GO TO AB;
|
||||
END;
|
||||
END; P(RSIZE,RTN);%
|
||||
END;%
|
||||
P(MKS,CHANSKIP,4,TANK,1,SELECT); GO TO L1;
|
||||
DS2: IF FIB[7]>HEADER[7] THEN HEADER[7]~FIB[7];%
|
||||
BLOCK; TANK[0]~FLAG(FIB[16]); GO RELEASE;%
|
||||
DR1: IF LINESKIP!0 THEN CHANSKIP~FIB[7] ELSE FIB[7]~CHANSKIP;%
|
||||
IF HEADER[7]<CHANSKIP THEN HEADER[7]~CHANSKIP;%
|
||||
$ SET OMIT = NOT SHAREDISK
|
||||
IF FIB[5].[46:2]=0 THEN GO TO L1;%
|
||||
IF DISKADDRESS THEN%
|
||||
BEGIN FIB[16].[24:1]~1;%
|
||||
$ SET OMIT = SHAREDISK
|
||||
P(MKS,CHANSKIP+1,1,TANK,REED,RTN);%
|
||||
$ SET POP OMIT
|
||||
$ SET OMIT = NOT SHAREDISK
|
||||
END;%
|
||||
$ SET OMIT = NOT SHAREDISK
|
||||
GO TO AB;
|
||||
DR2:
|
||||
$ SET OMIT = NOT SHAREDISK
|
||||
TANK[0]~FLAG(FIB[16])&0[24:24:1];
|
||||
P(FLAG(FIB[19])&IOD[3:3:5]&1[27:47:1],TANK,PRL,DEL);%
|
||||
$ SET OMIT = NOT SHAREDISK
|
||||
GO TO WINDUP;%
|
||||
DU2:: FIB[5].[43:2]~2;%
|
||||
IF FIB[7]>HEADER[7] THEN HEADER[7]~FIB[7];%
|
||||
BLOCK;%
|
||||
CHANSKIP~FIB[7]+FIB[13].[10:9]|HEADER[0].[30:12];%
|
||||
IF DISKADDRESS THEN%
|
||||
BEGIN P(TANK[0]~FLAG(FIB[16])&0[24:24:1],(NOT 0),XCH,INX,%
|
||||
ADDRESS,XCH,~);%
|
||||
P(FLAG(FIB[19])&1[24:47:1],TANK,PRL,DEL);%
|
||||
END ELSE%
|
||||
BEGIN TANK[0]~FLAG(FIB[16])&0[24:24:1];%
|
||||
P(FLAG(FIB[19]&1[24:44:4],TANK,PRL,DEL);%
|
||||
END;%
|
||||
GO TO WINDUP;%
|
||||
$ SET OMIT = NOT(TIMESHARING)
|
||||
DC1:: P(RSIZE, RTN);
|
||||
$ SET OMIT = TIMESHARING
|
||||
AB:: BEGIN IF(ADDRESS~TANK[NOT 4])=0 THEN GO ERR;
|
||||
ACTION:: TANK[NOT 3]~TANK[NOT 4] ~0;
|
||||
TANK[0] := IOD OR MEM;
|
||||
P(ADDRESS,MKS,9,JUNK); GO TO ERR;
|
||||
|
||||
1
build-release.cmd
Normal file
1
build-release.cmd
Normal file
@@ -0,0 +1 @@
|
||||
"%ProgramFiles%\7-Zip\7z.exe" a -tzip releases\retro-b5500-%1.zip build-release.cmd emulator\ webui\ -x!webui\tools\* -x!webui\prototypes\* tools\*.html tools\*.job
|
||||
@@ -55,19 +55,16 @@ function B5500CentralControl(global) {
|
||||
this.nextTimeStamp = 0; // Next actual Date.getTime() for timer tick
|
||||
this.timer = null; // Reference to the RTC setCallback id.
|
||||
|
||||
// Establish contexts for asynchronously-called methods
|
||||
this.boundTock = B5500CentralControl.bindMethod(this.tock, this);
|
||||
|
||||
this.clear(); // Create and initialize the Central Control state
|
||||
}
|
||||
|
||||
/**************************************/
|
||||
/* Global constants */
|
||||
|
||||
B5500CentralControl.version = "0.16";
|
||||
B5500CentralControl.version = "0.17";
|
||||
|
||||
B5500CentralControl.memReadCycles = 2; // assume 2 µs memory read cycle time (the other option was 3 µs)
|
||||
B5500CentralControl.memWriteCycles = 3; // assume 4 µs memory write cycle time (the other option was 6 µs)
|
||||
B5500CentralControl.memWriteCycles = 4; // assume 4 µs memory write cycle time (the other option was 6 µs)
|
||||
B5500CentralControl.rtcTick = 1000/60; // Real-time clock period, milliseconds
|
||||
|
||||
B5500CentralControl.pow2 = [ // powers of 2 from 0 to 52
|
||||
@@ -135,21 +132,21 @@ B5500CentralControl.unitSpecs = {
|
||||
DKA: {unitIndex: 29, designate: 6, unitClass: "B5500DiskUnit"},
|
||||
DRB: {unitIndex: 30, designate: 8, unitClass: null},
|
||||
DRA: {unitIndex: 31, designate: 4, unitClass: null},
|
||||
MTT: {unitIndex: 32, designate: 31, unitClass: null},
|
||||
MTS: {unitIndex: 33, designate: 29, unitClass: null},
|
||||
MTR: {unitIndex: 34, designate: 27, unitClass: null},
|
||||
MTP: {unitIndex: 35, designate: 25, unitClass: null},
|
||||
MTN: {unitIndex: 36, designate: 23, unitClass: null},
|
||||
MTM: {unitIndex: 37, designate: 21, unitClass: null},
|
||||
MTL: {unitIndex: 38, designate: 19, unitClass: null},
|
||||
MTK: {unitIndex: 39, designate: 17, unitClass: null},
|
||||
MTJ: {unitIndex: 40, designate: 15, unitClass: null},
|
||||
MTH: {unitIndex: 41, designate: 13, unitClass: null},
|
||||
MTF: {unitIndex: 42, designate: 11, unitClass: null},
|
||||
MTE: {unitIndex: 43, designate: 9, unitClass: null},
|
||||
MTD: {unitIndex: 44, designate: 7, unitClass: null},
|
||||
MTC: {unitIndex: 45, designate: 5, unitClass: null},
|
||||
MTB: {unitIndex: 46, designate: 3, unitClass: null},
|
||||
MTT: {unitIndex: 32, designate: 31, unitClass: "B5500MagTapeDrive"},
|
||||
MTS: {unitIndex: 33, designate: 29, unitClass: "B5500MagTapeDrive"},
|
||||
MTR: {unitIndex: 34, designate: 27, unitClass: "B5500MagTapeDrive"},
|
||||
MTP: {unitIndex: 35, designate: 25, unitClass: "B5500MagTapeDrive"},
|
||||
MTN: {unitIndex: 36, designate: 23, unitClass: "B5500MagTapeDrive"},
|
||||
MTM: {unitIndex: 37, designate: 21, unitClass: "B5500MagTapeDrive"},
|
||||
MTL: {unitIndex: 38, designate: 19, unitClass: "B5500MagTapeDrive"},
|
||||
MTK: {unitIndex: 39, designate: 17, unitClass: "B5500MagTapeDrive"},
|
||||
MTJ: {unitIndex: 40, designate: 15, unitClass: "B5500MagTapeDrive"},
|
||||
MTH: {unitIndex: 41, designate: 13, unitClass: "B5500MagTapeDrive"},
|
||||
MTF: {unitIndex: 42, designate: 11, unitClass: "B5500MagTapeDrive"},
|
||||
MTE: {unitIndex: 43, designate: 9, unitClass: "B5500MagTapeDrive"},
|
||||
MTD: {unitIndex: 44, designate: 7, unitClass: "B5500MagTapeDrive"},
|
||||
MTC: {unitIndex: 45, designate: 5, unitClass: "B5500MagTapeDrive"},
|
||||
MTB: {unitIndex: 46, designate: 3, unitClass: "B5500MagTapeDrive"},
|
||||
MTA: {unitIndex: 47, designate: 1, unitClass: "B5500MagTapeDrive"}};
|
||||
|
||||
|
||||
@@ -206,12 +203,12 @@ B5500CentralControl.prototype.clear = function clear() {
|
||||
this.LOFF = 0; // Load button pressed on console
|
||||
this.CTMF = 0; // Commence timing FF
|
||||
this.P2BF = 0; // Processor 2 busy FF
|
||||
this.HP2F = 1; // Halt processor 2 FF
|
||||
this.HP2F = 0; // Halt processor 2 FF
|
||||
|
||||
this.ccLatch = 0x20; // I/O Unit busy & P2 latched status (reset by console UI)
|
||||
this.interruptMask = 0; // Interrupt status mask
|
||||
this.interruptLatch = 0; // Interrupt latched status (reset by console UI)
|
||||
this.iouMask = 0; // I/O Unit busy status mask
|
||||
this.iouLatch = 0; // I/O Unit busy latched status (reset by console UI)
|
||||
this.unitBusyLatch = 0; // Peripheral unit latched status (reset by console UI)
|
||||
this.unitBusyMask = 0; // Peripheral unit busy-status bitmask
|
||||
|
||||
@@ -225,6 +222,7 @@ B5500CentralControl.prototype.clear = function clear() {
|
||||
this.P2 = (this.PB1L ? this.PA : this.PB);
|
||||
if (!this.P2) {
|
||||
this.P2BF = 1; // mark non-existent P2 as busy
|
||||
this.ccLatch |= 0x10;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -459,18 +457,6 @@ B5500CentralControl.prototype.clearInterrupt = function clearInterrupt() {
|
||||
case 0x12: // @22: Time interval
|
||||
this.CCI03F = 0;
|
||||
break;
|
||||
case 0x13: // @23: I/O busy
|
||||
this.CCI04F = 0;
|
||||
break;
|
||||
case 0x14: // @24: Keyboard request
|
||||
this.CCI05F = 0;
|
||||
break;
|
||||
case 0x15: // @25: Printer 1 finished
|
||||
this.CCI06F = 0;
|
||||
break;
|
||||
case 0x16: // @26: Printer 2 finished
|
||||
this.CCI07F = 0;
|
||||
break;
|
||||
case 0x17: // @27: I/O 1 finished
|
||||
this.CCI08F = 0;
|
||||
this.AD1F = 0; // make unit non-busy
|
||||
@@ -491,31 +477,33 @@ B5500CentralControl.prototype.clearInterrupt = function clearInterrupt() {
|
||||
this.AD4F = 0; // make unit non-busy
|
||||
this.iouMask &= 0x7;
|
||||
break;
|
||||
case 0x1B: // @33: P2 busy
|
||||
this.CCI12F = 0;
|
||||
case 0x15: // @25: Printer 1 finished
|
||||
this.CCI06F = 0;
|
||||
break;
|
||||
case 0x16: // @26: Printer 2 finished
|
||||
this.CCI07F = 0;
|
||||
break;
|
||||
|
||||
case 0x34: // @64-75: P1 syllable-dependent
|
||||
case 0x35:
|
||||
case 0x36:
|
||||
case 0x37:
|
||||
case 0x38:
|
||||
case 0x39:
|
||||
case 0x3A:
|
||||
case 0x3B:
|
||||
case 0x3C:
|
||||
case 0x3D:
|
||||
p1.I &= 0x0F;
|
||||
break;
|
||||
|
||||
case 0x1C: // @34: Inquiry request
|
||||
this.CCI13F = 0;
|
||||
break;
|
||||
case 0x1D: // @35: Special interrupt 1
|
||||
this.CCI14F = 0;
|
||||
break;
|
||||
case 0x1E: // @36: Disk file 1 read check finished
|
||||
this.CCI15F = 0;
|
||||
break;
|
||||
case 0x1F: // @37: Disk file 2 read check finished
|
||||
this.CCI16F = 0;
|
||||
case 0x14: // @24: Keyboard request
|
||||
this.CCI05F = 0;
|
||||
break;
|
||||
|
||||
case 0x20: // @40: P2 memory parity error
|
||||
if (p2) {p2.I &= 0xFE}
|
||||
break;
|
||||
case 0x21: // @41: P2 invalid address error
|
||||
if (p2) {p2.I &= 0xFD}
|
||||
break;
|
||||
case 0x22: // @42: P2 stack overflow
|
||||
if (p2) {p2.I &= 0xFB}
|
||||
break;
|
||||
case 0x24: // @44-55: P2 syllable-dependent
|
||||
case 0x25:
|
||||
case 0x26:
|
||||
@@ -538,19 +526,32 @@ B5500CentralControl.prototype.clearInterrupt = function clearInterrupt() {
|
||||
case 0x32: // @62: P1 stack overflow
|
||||
p1.I &= 0xFB;
|
||||
break;
|
||||
case 0x34: // @64-75: P1 syllable-dependent
|
||||
case 0x35:
|
||||
case 0x36:
|
||||
case 0x37:
|
||||
case 0x38:
|
||||
case 0x39:
|
||||
case 0x3A:
|
||||
case 0x3B:
|
||||
case 0x3C:
|
||||
case 0x3D:
|
||||
p1.I &= 0x0F;
|
||||
|
||||
case 0x20: // @40: P2 memory parity error
|
||||
if (p2) {p2.I &= 0xFE}
|
||||
break;
|
||||
case 0x21: // @41: P2 invalid address error
|
||||
if (p2) {p2.I &= 0xFD}
|
||||
break;
|
||||
case 0x22: // @42: P2 stack overflow
|
||||
if (p2) {p2.I &= 0xFB}
|
||||
break;
|
||||
|
||||
case 0x1E: // @36: Disk file 1 read check finished
|
||||
this.CCI15F = 0;
|
||||
break;
|
||||
case 0x1F: // @37: Disk file 2 read check finished
|
||||
this.CCI16F = 0;
|
||||
break;
|
||||
case 0x13: // @23: I/O busy
|
||||
this.CCI04F = 0;
|
||||
break;
|
||||
case 0x1B: // @33: P2 busy
|
||||
this.CCI12F = 0;
|
||||
break;
|
||||
case 0x1D: // @35: Special interrupt 1
|
||||
this.CCI14F = 0;
|
||||
break;
|
||||
default: // no interrupt vector was set
|
||||
break;
|
||||
}
|
||||
@@ -574,7 +575,7 @@ B5500CentralControl.prototype.tock = function tock() {
|
||||
}
|
||||
}
|
||||
interval = (this.nextTimeStamp += B5500CentralControl.rtcTick) - thisTime;
|
||||
this.timer = setCallback(this.boundTock, this, interval);
|
||||
this.timer = setCallback(tock, this, interval);
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
@@ -587,12 +588,18 @@ B5500CentralControl.prototype.readTimer = function readTimer() {
|
||||
|
||||
/**************************************/
|
||||
B5500CentralControl.prototype.haltP2 = function haltP2() {
|
||||
/* Called by P1 to halt P2. storeForInterrupt() will set P2BF=0 */
|
||||
/* Called by P1 to halt P2. We know that P2 is not currently running on this
|
||||
thread, so check to see if it's running at all and has a callback scheduled.
|
||||
If so, cancel the existing callback and schedule a new one for immediate
|
||||
execution. With HP2F set, P2 will store its registers and stop at next SECL */
|
||||
|
||||
this.HP2F = 1;
|
||||
// We know P2 is not currently running on this thread, so save its registers
|
||||
if (this.P2 && this.P2.busy) {
|
||||
this.P2.storeForInterrupt(1, 0);
|
||||
this.ccLatch |= 0x20;
|
||||
if (this.P2 && this.P2BF) {
|
||||
if (this.P2.scheduler) {
|
||||
clearCallback(this.P2.scheduler);
|
||||
}
|
||||
this.P2.scheduler = setCallback(this.P2.schedule, this.P2, 0);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -608,6 +615,7 @@ B5500CentralControl.prototype.initiateP2 = function initiateP2() {
|
||||
this.signalInterrupt();
|
||||
} else {
|
||||
this.P2BF = 1;
|
||||
this.ccLatch |= 0x10;
|
||||
this.HP2F = 0;
|
||||
this.P2.initiateAsP2();
|
||||
}
|
||||
@@ -620,22 +628,22 @@ B5500CentralControl.prototype.initiateIO = function initiateIO() {
|
||||
if (this.IO1 && this.IO1.REMF && !this.AD1F) {
|
||||
this.AD1F = 1;
|
||||
this.iouMask |= 0x1;
|
||||
this.iouLatch |= 0x1;
|
||||
this.ccLatch |= 0x1;
|
||||
this.IO1.initiate();
|
||||
} else if (this.IO2 && this.IO2.REMF && !this.AD2F) {
|
||||
this.AD2F = 1;
|
||||
this.iouMask |= 0x2;
|
||||
this.iouLatch |= 0x2;
|
||||
this.ccLatch |= 0x2;
|
||||
this.IO2.initiate();
|
||||
} else if (this.IO3 && this.IO3.REMF && !this.AD3F) {
|
||||
this.AD3F = 1;
|
||||
this.iouMask |= 0x4;
|
||||
this.iouLatch |= 0x4;
|
||||
this.ccLatch |= 0x4;
|
||||
this.IO3.initiate();
|
||||
} else if (this.IO4 && this.IO4.REMF && !this.AD4F) {
|
||||
this.AD4F = 1;
|
||||
this.iouMask |= 0x8;
|
||||
this.iouLatch |= 0x8;
|
||||
this.ccLatch |= 0x8;
|
||||
this.IO4.initiate();
|
||||
} else {
|
||||
this.CCI04F = 1; // set I/O busy interrupt
|
||||
@@ -700,30 +708,16 @@ B5500CentralControl.prototype.setUnitBusy = function setUnitBusy(index, busy) {
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500CentralControl.prototype.fetchInterruptLatch = function fetchInterruptLatch() {
|
||||
/* Returns and resets this.interruptLatch; used by console UI */
|
||||
var latch = this.interruptLatch;
|
||||
B5500CentralControl.prototype.fetchCCLatches = function fetchCCLatches(latches) {
|
||||
/* Returns the current latches in the "latches" array and and resets them.
|
||||
Used by the Console UI */
|
||||
|
||||
latches[0] = this.ccLatch;
|
||||
this.ccLatch = this.iouMask | (this.P2BF << 4) | (this.HP2F << 5);
|
||||
latches[1] = this.interruptLatch;
|
||||
this.interruptLatch = this.interruptMask;
|
||||
return latch;
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500CentralControl.prototype.fetchIOUnitLatch = function fetchIOUnitLatch() {
|
||||
/* Returns and resets this.iouLatch; used by console UI */
|
||||
var latch = this.iouLatch;
|
||||
|
||||
this.iouLatch = this.iouMask;
|
||||
return latch;
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
B5500CentralControl.prototype.fetchUnitBusyLatch = function fetchUnitBusyLatch() {
|
||||
/* Returns and resets this.unitBusyLatch; used by console UI */
|
||||
var latch = this.unitBusyLatch;
|
||||
|
||||
latches[2] = this.unitBusyLatch;
|
||||
this.unitBusyLatch = this.unitBusyMask;
|
||||
return latch;
|
||||
};
|
||||
|
||||
/**************************************/
|
||||
@@ -791,6 +785,7 @@ B5500CentralControl.prototype.load = function load(dontStart) {
|
||||
return function boundLoadCompleteAnon() {return that.loadComplete(dontStart)}
|
||||
}(this, dontStart));
|
||||
|
||||
this.clear(); // initialize P1/P2 configuration
|
||||
if (!this.P1 || this.P1.busy) { // P1 is busy or not available
|
||||
result = 1;
|
||||
} else if (!this.testUnitReady(22)) { // SPO not ready
|
||||
@@ -798,29 +793,28 @@ B5500CentralControl.prototype.load = function load(dontStart) {
|
||||
} else if (this.testUnitBusy(22)) { // SPO is busy
|
||||
result = 3;
|
||||
} else { // ready to rock 'n roll
|
||||
this.clear();
|
||||
this.nextTimeStamp = new Date().getTime();
|
||||
this.tock();
|
||||
this.LOFF = 1;
|
||||
if (this.IO1 && this.IO1.REMF && !this.AD1F) {
|
||||
this.AD1F = 1;
|
||||
this.iouMask |= 0x1;
|
||||
this.iouLatch |= 0x1;
|
||||
this.ccLatch |= 0x1;
|
||||
this.IO1.initiateLoad(this.cardLoadSelect, boundLoadComplete);
|
||||
} else if (this.IO2 && this.IO2.REMF && !this.AD2F) {
|
||||
this.AD2F = 1;
|
||||
this.iouMask |= 0x2;
|
||||
this.iouLatch |= 0x2;
|
||||
this.ccLatch |= 0x2;
|
||||
this.IO2.initiateLoad(this.cardLoadSelect, boundLoadComplete);
|
||||
} else if (this.IO3 && this.IO3.REMF && !this.AD3F) {
|
||||
this.AD3F = 1;
|
||||
this.iouMask |= 0x4;
|
||||
this.iouLatch |= 0x4;
|
||||
this.ccLatch |= 0x4;
|
||||
this.IO3.initiateLoad(this.cardLoadSelect, boundLoadComplete);
|
||||
} else if (this.IO4 && this.IO4.REMF && !this.AD4F) {
|
||||
this.AD4F = 1;
|
||||
this.iouMask |= 0x8;
|
||||
this.iouLatch |= 0x8;
|
||||
this.ccLatch |= 0x8;
|
||||
this.IO4.initiateLoad(this.cardLoadSelect, boundLoadComplete);
|
||||
} else {
|
||||
this.CCI04F = 1; // set I/O busy interrupt
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1854,7 +1854,6 @@ window.addEventListener("load", function() {
|
||||
|
||||
// Create a file entry for the system log
|
||||
createSystemLog(10000);
|
||||
/** enterFile("SYSTEM", "LOG", 1, 20000); **/
|
||||
|
||||
// Store the directory labels segment
|
||||
eu.put(fileLabels, directoryTop + 19); // write the directory block file labels
|
||||
|
||||
@@ -37,10 +37,13 @@ window.addEventListener("load", function() {
|
||||
var bNormal;
|
||||
var boundBlinkenlicht;
|
||||
var cc = new B5500CentralControl(this);
|
||||
var ccLatches = [0, 0, 0];
|
||||
var ccLightsMap = new Array(6);
|
||||
var elapsedAverage = 0;
|
||||
var elapsedLast = 0;
|
||||
var intLightsMap = new Array(48);
|
||||
var iouLightsMap = new Array(4);
|
||||
var lastInterruptMask = 0;
|
||||
var lastIOUMask = 0;
|
||||
var lastCCMask = 0;
|
||||
var lastUnitBusyMask = 0;
|
||||
var lastPANormalRate = -1;
|
||||
var lastPAControlRate = -1;
|
||||
@@ -50,6 +53,9 @@ window.addEventListener("load", function() {
|
||||
var procDelay;
|
||||
var procSlack;
|
||||
var showAnnunciators = true;
|
||||
var slackAlpha = 0.990; // decay factor for exponential weighted avg.
|
||||
var slackAverage = 0; // average P1 slack time
|
||||
var slackLast = 0; // last P1 total slack time
|
||||
var timer;
|
||||
var timerInterval = 50; // milliseconds
|
||||
|
||||
@@ -78,7 +84,6 @@ window.addEventListener("load", function() {
|
||||
$$("LoadSelectBtn").disabled = false;
|
||||
$$("LoadBtn").disabled = false;
|
||||
$$("HaltBtn").disabled = true;
|
||||
boundBlinkenlicht();
|
||||
window.focus();
|
||||
if (showAnnunciators) {
|
||||
$$("CentralControl").style.visibility = "visible";
|
||||
@@ -115,17 +120,25 @@ window.addEventListener("load", function() {
|
||||
cc.halt();
|
||||
$$("HaltBtn").disabled = true;
|
||||
$$("LoadBtn").disabled = false;
|
||||
if (timer) {
|
||||
clearTimeout(timer);
|
||||
timer = null;
|
||||
}
|
||||
}
|
||||
|
||||
function LoadBtn_Click(ev) {
|
||||
var result;
|
||||
|
||||
window.open("", "SPO").focus(); // re-focus the SPO window
|
||||
result = cc.load(false);
|
||||
switch (result) {
|
||||
case 0: // load initiated successfully
|
||||
$$("HaltBtn").className = "redButton";
|
||||
$$("HaltBtn").disabled = false;
|
||||
$$("LoadBtn").disabled = true;
|
||||
elapsedLast = 0;
|
||||
slackLast = slackAverage = 0;
|
||||
boundBlinkenlicht();
|
||||
break;
|
||||
case 1:
|
||||
alert("P1 busy or not available");
|
||||
@@ -189,41 +202,42 @@ window.addEventListener("load", function() {
|
||||
}
|
||||
|
||||
function displayCentralControl() {
|
||||
/* Displays the I/O and interrupt status in Central Control */
|
||||
/* Displays the I/O and interrupt status in CentralControl */
|
||||
var cells;
|
||||
var s;
|
||||
var interruptMask = cc.fetchInterruptLatch() % 0x4000;
|
||||
var interruptChange = lastInterruptMask ^ interruptMask;
|
||||
var iouMask = cc.fetchIOUnitLatch();
|
||||
var iouChange = lastIOUMask ^ iouMask;
|
||||
var unitBusyMask = cc.fetchUnitBusyLatch();
|
||||
var unitBusyChange = lastUnitBusyMask ^ unitBusyMask;
|
||||
var interruptMask;
|
||||
var interruptChange;
|
||||
var ccMask;
|
||||
var ccChange;
|
||||
var unitBusyMask;
|
||||
var unitBusyChange;
|
||||
var x;
|
||||
|
||||
cc.fetchCCLatches(ccLatches);
|
||||
ccMask = ccLatches[0];
|
||||
ccChange = lastCCMask ^ ccMask;
|
||||
lastCCMask = ccMask;
|
||||
|
||||
interruptMask = ccLatches[1] % 0x4000;
|
||||
interruptChange = lastInterruptMask ^ interruptMask;
|
||||
lastInterruptMask = interruptMask;
|
||||
lastIOUMask = iouMask;
|
||||
|
||||
unitBusyMask = ccLatches[2];
|
||||
unitBusyChange = lastUnitBusyMask ^ unitBusyMask;
|
||||
lastUnitBusyMask = unitBusyMask;
|
||||
|
||||
$$("AD1F").className = (cc.AD1F ? "busy" : "");
|
||||
$$("AD2F").className = (cc.AD2F ? "busy" : "");
|
||||
$$("AD3F").className = (cc.AD3F ? "busy" : "");
|
||||
$$("AD4F").className = (cc.AD4F ? "busy" : "");
|
||||
|
||||
/********** for P2 debugging **********
|
||||
$$("P2BF").className = (cc.P2BF ? "busy" : "");
|
||||
$$("HP2F").className = (cc.HP2F ? "busy" : "");
|
||||
|
||||
$$("PABZ").className = (cc.PA && cc.PA.busy ? "busy" : "");
|
||||
$$("PBBZ").className = (cc.PB && cc.PB.busy ? "busy" : "");
|
||||
**********/
|
||||
|
||||
x = 0;
|
||||
while (iouChange) {
|
||||
if (iouChange & 0x01) {
|
||||
iouLightsMap[x].className = (iouMask & 0x01 ? "busy" : "");
|
||||
while (ccChange) {
|
||||
if (ccChange & 0x01) {
|
||||
ccLightsMap[x].className = (ccMask & 0x01 ? "busy" : "");
|
||||
}
|
||||
iouMask >>>= 1;
|
||||
iouChange >>>= 1;
|
||||
ccMask >>>= 1;
|
||||
ccChange >>>= 1;
|
||||
x++;
|
||||
}
|
||||
|
||||
@@ -296,7 +310,7 @@ window.addEventListener("load", function() {
|
||||
}
|
||||
}
|
||||
|
||||
stateRate = 6 - stateRate;
|
||||
stateRate = Math.round(pa.controlCycles/cycles*6 + 0.49);
|
||||
if (stateRate != lastPAControlRate) {
|
||||
lastPAControlRate = stateRate;
|
||||
switch (stateRate) {
|
||||
@@ -364,7 +378,7 @@ window.addEventListener("load", function() {
|
||||
}
|
||||
}
|
||||
|
||||
stateRate = 6 - stateRate;
|
||||
stateRate = Math.round(pb.controlCycles/cycles*6 + 0.49);
|
||||
if (stateRate != lastPBControlRate) {
|
||||
lastPBControlRate = stateRate;
|
||||
switch (stateRate) {
|
||||
@@ -400,8 +414,14 @@ window.addEventListener("load", function() {
|
||||
while (et < 0) {
|
||||
et += stamp;
|
||||
}
|
||||
/**************
|
||||
elapsedAverage = (et-elapsedLast)*(1-slackAlpha) + elapsedAverage*slackAlpha;
|
||||
slackAverage = (p1.procSlack-slackLast)*(1-slackAlpha) + slackAverage*slackAlpha;
|
||||
elapsedLast = et;
|
||||
slackLast = p1.procSlack;
|
||||
**************/
|
||||
procDelay.innerHTML = p1.delayDeltaAvg.toFixed(1);
|
||||
procSlack.innerHTML = (p1.procSlack/et*100).toFixed(1) + "%";
|
||||
procSlack.innerHTML = (p1.procSlackAvg/p1.procRunAvg*100).toFixed(1) + "%";
|
||||
|
||||
if (showAnnunciators) {
|
||||
displayCentralControl();
|
||||
@@ -415,10 +435,12 @@ window.addEventListener("load", function() {
|
||||
var spec;
|
||||
var x;
|
||||
|
||||
iouLightsMap[0] = $$("AD1F");
|
||||
iouLightsMap[1] = $$("AD2F");
|
||||
iouLightsMap[2] = $$("AD3F");
|
||||
iouLightsMap[3] = $$("AD4F");
|
||||
ccLightsMap[0] = $$("AD1F");
|
||||
ccLightsMap[1] = $$("AD2F");
|
||||
ccLightsMap[2] = $$("AD3F");
|
||||
ccLightsMap[3] = $$("AD4F");
|
||||
ccLightsMap[4] = $$("P2BF");
|
||||
ccLightsMap[5] = $$("HP2F");
|
||||
|
||||
for (x=3; x<=16; x++) {
|
||||
intLightsMap[50-x] = $$("CCI" + (x+100).toString().substring(1) + "F");
|
||||
@@ -463,6 +485,12 @@ window.addEventListener("load", function() {
|
||||
$$("LoadBtn").addEventListener("click", LoadBtn_Click, false);
|
||||
$$("LoadSelectBtn").addEventListener("click", LoadSelectBtn_Click, false);
|
||||
|
||||
// A kludge, for sure
|
||||
$$("NotReadyBtn").addEventListener("click", function(ev) {
|
||||
B5500SystemConfiguration.PB ^= true;
|
||||
$$("RetroVersion").style.color = (B5500SystemConfiguration.PB ? "yellow" : "white");
|
||||
});
|
||||
|
||||
aControl = $$("AControlBtn");
|
||||
aNormal = $$("ANormalBtn");
|
||||
bControl = $$("BControlBtn");
|
||||
@@ -531,11 +559,11 @@ window.addEventListener("load", function() {
|
||||
<td id=CCI14F>SPEC <!-- Special interrupt #1 (not used) -->
|
||||
<td id=CCI15F>DK1F <!-- Disk file #1 read check finished -->
|
||||
<td id=CCI16F>DK2F <!-- Disk file #2 read check finished -->
|
||||
<td colspan=9>
|
||||
<td id=P2BF>P2BF <!-- Processor 2 busy FF -->
|
||||
<td id=HP2F>HP2F <!-- Halt Processor 2 FF -->
|
||||
<td id=PABZ>PABZ <!-- Processor A busy *** debug *** -->
|
||||
<td id=PBBZ>PBBZ <!-- Processor B busy *** debug *** -->
|
||||
<td colspan=9>
|
||||
<td id=procSlack>
|
||||
<td class=statLabel title="Percentage of time Processor A is throttling its performance">P1 Slack
|
||||
<tr id=CCPeripheralRow>
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
function B5500MagTapeDrive(mnemonic, unitIndex, designate, statusChange, signal) {
|
||||
/* Constructor for the MagTapeDrive object */
|
||||
var that = this;
|
||||
var x = (mnemonic == "MTA" ? 30 : 60);
|
||||
var x = ((mnemonic.charCodeAt(2) - "A".charCodeAt(0) + 1)*30);
|
||||
|
||||
this.mnemonic = mnemonic; // Unit mnemonic
|
||||
this.unitIndex = unitIndex; // Ready-mask bit number
|
||||
@@ -127,7 +127,7 @@ B5500MagTapeDrive.prototype.clear = function clear() {
|
||||
this.angle = 0; // current rotation angle of reel image [degrees]
|
||||
this.tapeInches = 0; // number of inches up-tape
|
||||
this.writeRing = false; // true if write ring is present and tape is writable
|
||||
this.atBOT = false; // true if tape at BOT
|
||||
this.atBOT = true; // true if tape at BOT
|
||||
this.atEOT = false; // true if tape at EOT
|
||||
|
||||
this.buffer = null; // IOUnit buffer
|
||||
@@ -168,7 +168,8 @@ B5500MagTapeDrive.prototype.removeClass = function removeClass(e, name) {
|
||||
/**************************************/
|
||||
B5500MagTapeDrive.prototype.spinReel = function spinReel(inches) {
|
||||
/* Rotates the reel image icon an appropriate amount based on the number of
|
||||
inches of tape movement */
|
||||
inches of tape movement. The rotation is limited to 33 degrees in either
|
||||
direction so that movement remains apparent to the viewer */
|
||||
var circumference = this.reelCircumference*(1 - this.tapeInches/this.maxTapeLength/2);
|
||||
var angle = inches/circumference*360;
|
||||
|
||||
@@ -192,6 +193,7 @@ B5500MagTapeDrive.prototype.setAtBOT = function setAtBOT(atBOT) {
|
||||
this.imgIndex = 0;
|
||||
this.tapeInches = 0;
|
||||
this.addClass(this.$$("MTAtBOTLight"), "whiteLit");
|
||||
this.progressBar.value = this.imgLength;
|
||||
this.reelIcon.style.transform = "rotate(0deg)";
|
||||
} else {
|
||||
this.removeClass(this.$$("MTAtBOTLight"), "whiteLit");
|
||||
@@ -208,6 +210,7 @@ B5500MagTapeDrive.prototype.setAtEOT = function setAtEOT(atEOT) {
|
||||
if (atEOT) {
|
||||
this.imgIndex = this.imgLength;
|
||||
this.addClass(this.$$("MTAtEOTLight"), "whiteLit");
|
||||
this.progressBar.value = 0;
|
||||
} else {
|
||||
this.removeClass(this.$$("MTAtEOTLight"), "whiteLit");
|
||||
}
|
||||
@@ -237,10 +240,14 @@ B5500MagTapeDrive.prototype.setTapeUnloaded = function setTapeUnloaded() {
|
||||
this.addClass(this.$$("MTLocalBtn"), "yellowLit");
|
||||
this.removeClass(this.$$("MTWriteRingBtn"), "redLit");
|
||||
this.addClass(this.$$("MTUnloadedLight"), "whiteLit");
|
||||
this.progressBar.value = 0;
|
||||
this.setAtBOT(false);
|
||||
this.setAtEOT(false);
|
||||
this.progressBar.value = 0;
|
||||
this.reelIcon.style.visibility = "hidden";
|
||||
if (this.timer) {
|
||||
clearCallback(this.timer);
|
||||
this.timer = null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -267,6 +274,10 @@ B5500MagTapeDrive.prototype.setTapeRemote = function setTapeRemote(ready) {
|
||||
this.statusChange(0);
|
||||
this.removeClass(this.$$("MTRemoteBtn"), "yellowLit");
|
||||
this.addClass(this.$$("MTLocalBtn"), "yellowLit");
|
||||
if (this.timer) {
|
||||
clearCallback(this.timer);
|
||||
this.timer = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -297,19 +308,29 @@ B5500MagTapeDrive.prototype.setWriteRing = function setWriteRing(writeRing) {
|
||||
/**************************************/
|
||||
B5500MagTapeDrive.prototype.tapeRewind = function tapeRewind(makeReady) {
|
||||
/* Rewinds the tape. Makes the drive not-ready and delays for an appropriate amount
|
||||
of time depending on how far up-tape we are. If makeReady is true, then readies
|
||||
the unit again when the rewind is complete [valid only when called from
|
||||
this.rewind()] */
|
||||
of time depending on how far up-tape we are. If makeReady is true [valid only when
|
||||
called from this.rewind()], then readies the unit again when the rewind is complete */
|
||||
var inches;
|
||||
var inchFactor = this.imgIndex/this.tapeInches;
|
||||
var lastStamp = new Date().getTime();
|
||||
var updateInterval = 30; // ms
|
||||
|
||||
function rewindFinish() {
|
||||
this.timer = null;
|
||||
this.busy = false;
|
||||
this.removeClass(this.$$("MTRewindingLight"), "whiteLit");
|
||||
if (makeReady) {
|
||||
this.ready = true;
|
||||
this.statusChange(1);
|
||||
}
|
||||
}
|
||||
|
||||
function rewindDelay() {
|
||||
var stamp = new Date().getTime();
|
||||
var interval = stamp - lastStamp;
|
||||
|
||||
if (interval <= 0) {
|
||||
interval = 1;
|
||||
interval = updateInterval/2;
|
||||
}
|
||||
if (this.tapeInches > 0) {
|
||||
inches = interval/1000*this.rewindSpeed;
|
||||
@@ -317,27 +338,25 @@ B5500MagTapeDrive.prototype.tapeRewind = function tapeRewind(makeReady) {
|
||||
this.spinReel(-inches);
|
||||
this.progressBar.value = this.imgLength - this.tapeInches*inchFactor;
|
||||
lastStamp = stamp;
|
||||
this.timer = setCallback(rewindDelay, this, 30);
|
||||
this.timer = setCallback(rewindDelay, this, updateInterval);
|
||||
} else {
|
||||
this.busy = false;
|
||||
this.spinReel(6);
|
||||
this.setAtBOT(true);
|
||||
this.progressBar.value = this.imgLength;
|
||||
this.removeClass(this.$$("MTRewindingLight"), "whiteLit");
|
||||
if (makeReady) {
|
||||
this.ready = true;
|
||||
this.statusChange(1);
|
||||
}
|
||||
this.timer = setCallback(rewindFinish, this, 2000);
|
||||
}
|
||||
}
|
||||
|
||||
if (this.tapeState != this.tapeUnloaded) {
|
||||
if (this.timer) {
|
||||
clearCallback(this.timer);
|
||||
this.timer = null;
|
||||
}
|
||||
if (this.tapeState != this.tapeUnloaded && !this.atBOT) {
|
||||
this.busy = true;
|
||||
this.ready = false;
|
||||
this.statusChange(0);
|
||||
this.setAtEOT(false);
|
||||
this.addClass(this.$$("MTRewindingLight"), "whiteLit");
|
||||
this.timer = setCallback(rewindDelay, this,
|
||||
this.startStopTime*1000 + this.initiateStamp - lastStamp);
|
||||
this.timer = setCallback(rewindDelay, this, 1000);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -399,12 +418,11 @@ B5500MagTapeDrive.prototype.fileSelector_onChange = function fileSelector_onChan
|
||||
that.image = new Uint8Array(ev.target.result);
|
||||
that.imgIndex = 0;
|
||||
that.imgLength = that.image.length;
|
||||
that.progressBar.value = that.imgLength;
|
||||
that.progressBar.max = that.imgLength;
|
||||
that.removeClass(that.$$("MTUnloadedLight"), "whiteLit");
|
||||
that.tapeState = that.tapeLocal;// setTapeRemote() requires it not to be unloaded
|
||||
that.setAtBOT(true);
|
||||
that.setAtEOT(false);
|
||||
that.setAtBOT(true);
|
||||
that.setTapeRemote(false);
|
||||
that.setWriteRing(false); // read-only for now...
|
||||
that.reelIcon.style.visibility = "visible";
|
||||
@@ -446,7 +464,9 @@ B5500MagTapeDrive.prototype.bcdSpaceForward = function bcdSpaceForward(checkEOF)
|
||||
var imgLength = this.imgLength; // tape image length
|
||||
var imgIndex = this.imgIndex; // current tape image offset
|
||||
|
||||
if (imgIndex < imgLength) {
|
||||
if (imgIndex >= imgLength) {
|
||||
this.errorMask |= 0x10; // report parity error if beyond end of tape
|
||||
} else {
|
||||
if (this.atBOT) {
|
||||
this.setAtBOT(false);
|
||||
}
|
||||
@@ -520,9 +540,6 @@ B5500MagTapeDrive.prototype.bcdSpaceBackward = function bcdSpaceBackward(checkEO
|
||||
}
|
||||
} while (c < 0x80);
|
||||
}
|
||||
if (imgIndex <= 0) {
|
||||
this.setAtBOT(true);
|
||||
}
|
||||
}
|
||||
this.imgIndex = imgIndex;
|
||||
};
|
||||
@@ -550,7 +567,9 @@ B5500MagTapeDrive.prototype.bcdReadForward = function bcdReadForward(oddParity)
|
||||
var imgIndex = this.imgIndex; // current tape image offset
|
||||
var xlate = (oddParity ? this.bcdXlateInOdd : this.bcdXlateInEven);
|
||||
|
||||
if (imgIndex < imgLength) {
|
||||
if (imgIndex >= imgLength) {
|
||||
this.errorMask |= 0x10; // report parity error if beyond end of tape
|
||||
} else {
|
||||
if (this.atBOT) {
|
||||
this.setAtBOT(false);
|
||||
}
|
||||
@@ -681,9 +700,6 @@ B5500MagTapeDrive.prototype.bcdReadBackward = function bcdReadBackward(oddParity
|
||||
}
|
||||
} while (true);
|
||||
}
|
||||
if (imgIndex <= 0) {
|
||||
this.setAtBOT(true);
|
||||
}
|
||||
}
|
||||
this.imgIndex = imgIndex;
|
||||
this.bufIndex = bufIndex;
|
||||
@@ -713,7 +729,8 @@ B5500MagTapeDrive.prototype.tapeDriveOnLoad = function tapeDriveOnLoad() {
|
||||
|
||||
this.window.addEventListener("beforeunload", this.beforeUnload, false);
|
||||
|
||||
this.tapeState = this.tapeLocal; // setTapeUnloaded() requires it not to be unloaded
|
||||
this.tapeState = this.tapeLocal; // setTapeUnloaded() requires it to be in local
|
||||
this.atBOT = true; // and also at BOT
|
||||
this.setTapeUnloaded();
|
||||
|
||||
this.$$("MTUnloadBtn").addEventListener("click", function startClick(ev) {
|
||||
@@ -849,7 +866,7 @@ B5500MagTapeDrive.prototype.space = function space(finish, length, control) {
|
||||
this.progressBar.value = 0;
|
||||
}
|
||||
}
|
||||
//console.log(this.mnemonic + " space: c=" + control + ", length=" + length +
|
||||
//console.log(this.mnemonic + " space: c=" + control + ", length=" + length +
|
||||
// ", count=" + imgCount + ", inches=" + this.tapeInches +
|
||||
// ", index=" + this.imgIndex + ", mask=" + this.errorMask.toString(8));
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user