diff --git a/SYMBOL/DCMCP.esp_m b/SYMBOL/DCMCP.esp_m index 28a4e0c..a490421 100644 --- a/SYMBOL/DCMCP.esp_m +++ b/SYMBOL/DCMCP.esp_m @@ -17007,3 +17007,68 @@ COMMENT STACK NOW CONTAINS : 0 FOR IDENTIFIER & NO. OF CHRS% 20352000 2(36(IF SC=">" THEN %890-20374403 BEGIN CARDLOC~SI;DI~CARDLOC;DS~ LIT "=" END; %890-20374404 IF SC="}" THEN %890-20374405 + BEGIN CARDLOC~SI;DI~CARDLOC;DS~ LIT """ END; %890-20374406 + SI~SI+1;)) %890-20374407 + END; %890-20374408 + $ SET OMIT = NOT(PACKETS) 20374409 + IF UNITNO GEQ 32 AND NOT LASTSCAN.[2:1] THEN 20374410 + BEGIN STREAM(CARDLOC, I~I~SPACE(10)); 20374415 + BEGIN DS~5LIT">"; 20374420 + SI~CARDLOC; 2(DS~36 CHR); DS~LIT"~"; 20374425 + END; SPOUTER(I,UNITNO,64); 20374430 + END; 20374435 + $ POP OMIT 20374436 + GO TO GOGO; 20374500 + END; 20374600 + IF KOUNT = "1" THEN% 20375000 + BEGIN LASTSCAN ~ -1; GO TO PERPER END;% 20376000 + I ~ IF KOUNT ="/" THEN SLASH ELSE% 20377000 + (IF KOUNT = @14 THEN QUEST ELSE% 20378000 + (IF KOUNT ="," THEN COMMA ELSE% 20379000 + (IF KOUNT = "=" THEN EQUAL ELSE % THIS IS AS IN SYMBOL 20380000 + (IF KOUNT = "]" THEN RB ELSE 20380100 + (IF KOUNT = "[" THEN RB ELSE 20380200 + (IF KOUNT = "#" THEN POUND ELSE SPECI)))))); 20380500 + TYPE1: SCN~I; 20381000 + END SCAN ;% 20382000 +PROCEDURE SEEKNAM(A,B,C,D,E,N,XLST); VALUE A,B; 20382010 + REAL A,B,C,D,E,N; ARRAY XLST[*]; 20382015 + BEGIN 20382020 + LABEL FIND,L; 20382030 + ARRAY NB[*]; 20382040 + REAL I,K,T,X; INTEGER J; BOOLEAN INXLST; 20382050 + INTEGER J1,J2,J3,K1,K2; 20382052 + LABEL RESTART; 20382054 + IF C=0 THEN 20382056 + BEGIN N:=SPACE(60);-1; 20382058 + J1:=J3:=0; K1:=K2:=MODULUS-1; 20382060 + IF A GEQ 0 THEN J1:=K1:=(A.[6:18]+A.[24:24]) MOD MODULUS; 20382062 + IF B GEQ 0 THEN J3:=K2:=(B.[6:18]+B.[24:24]) MOD MODULUS; 20382064 + END ELSE 20382066 + BEGIN I:=(T:=M[N]).[42:6]; 20382068 + J1:=T.[36:6]; J2:=T.[30:6]; J3:=T.[12:6]; 20382070 + K1:=T.[24:6]; K2:=T.[18:6]; 20382072 + END; 20382074 + NB:=[M[N+1]]&60[8:38:10]; 20382076 + IF C NEQ 0 THEN GO TO RESTART; 20382095 + FOR J1:=J1 STEP 1 UNTIL K1 DO 20382100 + FOR J2:=J3 STEP 1 UNTIL K2 DO 20382110 + BEGIN J:=SCRAMBLE(J1,J2); 20382120 + DO BEGIN 20382130 + DISKWAIT(-N-1,60,J); 20382140 + FOR I:=0 STEP 3 UNTIL 57 DO 20382150 + BEGIN 20382160 + IF (T:=NB[I]) NEQ @14 THEN 20382165 + IF (T EQV A)=NOT 0 OR A<0 THEN 20382170 + IF (NB[I+1] EQV B)=NOT 0 OR B LSS 0 THEN 20382200 + IF (X:=XLST.[8:10]-2) GEQ 0 THEN % EXCEPT LIST EXISTS20382220 + BEGIN INXLST:=FALSE; 20382240 + FOR K:=0 STEP 2 UNTIL X DO 20382260 + IF (XLST[K] EQV T)=NOT 0 OR XLST[K] LSS 0 THEN 20382280 + IF (XLST[K+1] EQV NB[I+1])=NOT 0 OR XLST[K+1] LSS 0 20382300 + THEN BEGIN INXLST:=TRUE; 20382320 + IF NOT (XLST[K].[1:1] OR XLST[K+1].[1;1]) 20382340 + THEN BEGIN XLST[K]:=XLST[X]; 20382360 + XLST[K+1]:=XLST[X+1]; 20382380 + XLST.[8:10]:=XLST.[8:10]-2; 20382400 + END; 20382420 diff --git a/emulator/B5500Processor.js b/emulator/B5500Processor.js index 235b6ea..0093607 100644 --- a/emulator/B5500Processor.js +++ b/emulator/B5500Processor.js @@ -1209,31 +1209,26 @@ B5500Processor.prototype.singlePrecisionCompare = function() { ma = this.A % 0x8000000000; // extract the A mantissa mb = this.B % 0x8000000000; // extract the B mantissa + // Extract the exponents and signs. If the exponents are unequal, normalize + // each until the high-order octade is non-zero or the exponents are equal. if (ma == 0) { // if A mantissa is zero ea = sa = 0; // consider A to be completely zero } else { ea = (this.A - ma)/0x8000000000; sa = ((ea >>> 7) & 0x01); ea = (ea & 0x40 ? -(ea & 0x3F) : (ea & 0x3F)); - } - if (mb == 0) { // if B mantissa is zero - eb = sb = 0; // consider B to be completely zero - } else { // rats, we actually have to do this - eb = (this.B - mb)/0x8000000000; - sb = (eb >>> 7) & 0x01; - eb = (eb & 0x40 ? -(eb & 0x3F) : (eb & 0x3F)); - } - - // If the exponents are unequal, normalize each until the high-order octade - // is non-zero or the exponents are equal - if (ma) { // Normalize A while (ma < 0x1000000000 && ea != eb) { this.cycleCount++; ma *= 8; // shift left ea--; } - } - if (mb) { // Normalize B + } + if (mb == 0) { // if B mantissa is zero + eb = sb = 0; // consider B to be completely zero + } else { + eb = (this.B - mb)/0x8000000000; + sb = (eb >>> 7) & 0x01; + eb = (eb & 0x40 ? -(eb & 0x3F) : (eb & 0x3F)); while (mb < 0x1000000000 && eb != ea) { this.cycleCount++; mb *= 8; // shift left @@ -1241,7 +1236,7 @@ B5500Processor.prototype.singlePrecisionCompare = function() { } } - // Compare signs, exponents, and normalized magnitudes, in that order + // Compare signs, exponents, and normalized magnitudes, in that order. if (sb == sa) { // if signs are equal: if (eb == ea) { // if exponents are equal: if (mb = ma) { // if magnitudes are equal: