1
0
mirror of https://github.com/pkimpel/retro-b5500.git synced 2026-02-11 19:05:01 +00:00

1. Commit ALGOLXEM compiler source after conversion to E-mode and initial debugging. It's actually starting to work, folks...

2. Commit test cases used to debug ALGOLXEM under new "tests" directory.
3. Commit new CODEDUMP55.alg_m utility to prepare a semi-formatted dump of a B5500 code file.
4. Commit further typographical corrections to B5500 Algol compiler source uncovered during conversion and debugging of ALGOLXEM.
This commit is contained in:
paul.kimpel@digm.com
2012-04-20 17:46:34 +00:00
parent 0dd84ab0dc
commit 7904174733
6 changed files with 3442 additions and 1615 deletions

View File

@@ -720,7 +720,7 @@ DEFINE % %116-01007400
TION (IN [12:6]), AND THE FIRST 5 CHARACTERS OF ALPHA. 01014000
SUCCEDING WORDS CONTAIN THE REMAINING CHARACTORS OF ALPHA,01015000
FOLLOWED BY ANY ADDITIONAL INFORMATION. THE ELBAT WORD 01016000
AND THE ALPHA FOR ANY QUANTITY ARE NOT SPLUT ACROSS A ROW 01017000
AND THE ALPHA FOR ANY QUANTITY ARE NOT SPLIT ACROSS A ROW 01017000
OF INFO. FOR PURPOSES OF FINDING AN IDENTIFIER OR 01018000
RESERVED WORD THE QUANTITIES ARE SCATTERED INTO 125 01019000
DIFERENT LISTS OR STACKES. WHICH STACK CONTAINS A QUANTITY01020000
@@ -768,7 +768,7 @@ COMMENT INFO FORMAT 01028000
NOW S[L] POINTS TO THE ENTRY FOR B AND IT POINTS TO THE 01062000
ENTRY FOR A. 01063000
SIMILARLY,AFTER C IS ENTERED 01064000
A[L] POINTS TO C,WHOSE ENTRY POINTS TO B WHOSE ENTRY 01065000
S[L] POINTS TO C,WHOSE ENTRY POINTS TO B WHOSE ENTRY 01065000
POINTS TO A. 01066000
THE SECOND WORD OF EACH ENTRY IN INFO IS MADE UP AS FOLLOWS: 01067000
FWDPT =[1:1],THIS TELLS WHETHER A PROCEDURE WAS DECLARED 01068000
@@ -4448,7 +4448,7 @@ INTEGER PROCEDURE GETSPACE(PERMANENT,L); VALUE PERMANENT,L; 05331000
PRTIMAX ~ (GS ~ PRTIMAX)+1 END 05350000
ELSE IF MODE = 0 THEN BEGIN 05351000
Q ~ SPRT[ROW ~ PRTI.[38:5]]; 05352000
M ~ MASK(COL ~ PRTI.[43:4]-35); 05353000
M ~ MASK(COL ~ PRTI.[43:5]-35); 05353000
COL ~ COL+35; 05354000
L1: IF REAL(M AND Q) ! 0 05355000
THEN BEGIN 05356000
@@ -5245,7 +5245,7 @@ FCR:= (LCR:=MKABS(TBUFF[9]))-9 END; %104-07025030
PCTR IS A COUNT OF THE NUMBER OF PARAMETERS 07052000
COMPILED. 07053000
ACLASS IS THE CLASS OF THE ACTUAL PARAMETER- 07054000
SCLASS IS TEH CLASS OF THE FORMAL PARAMETER. 07055000
SCLASS IS THE CLASS OF THE FORMAL PARAMETER. 07055000
THEY ARE PUT IN A NORMALIZED FORM IN ORDER 07056000
TO ALLOW INTEGER, REAL, AND ALPHA TO HAVE 07057000
SIMILAR MEANINGS; 07058000
@@ -6283,6 +6283,7 @@ PROCEDURE CMPLXSTMT; FORWARD ; 07777777
GO TO XXX 07859090
END ELSE 07859100
$ SET OMIT = NOT TSPOL 07859900
$ POP OMIT % [NOT IN ORIGINAL LISTING] 07899000
BEGIN ERROR(100); GO TO XXX END; 07900000
IF STEPI ! LEFTPAREN THEN 07901000
BEGIN ERR(105); GO TO XXX END; 07902000
@@ -6533,7 +6534,7 @@ PROCEDURE KLUDGE(T); VALUE T; INTEGER T; 07930000
IF FORCLASS(STEPV) THEN 08182000
IF SIMPLE(CONSTANB,B,SIGNB) THEN 08183000
IF FORCLASS(UNTILV) THEN 08184000
IF SIMPLE(CONSTANC,C,SIGNC) THEN 08185000
IF SIMPLE(CONSTANC,Q,SIGNC) THEN 08185000
IF FORCLASS(DOV) THEN 08186000
BEGIN 08187000
PLUG(CONSTANA,A); 08188000
@@ -8033,7 +8034,7 @@ FILL INFO[2,*] WITH OCT0030000120000000, "2LB000", % THESE ENTRIES ARE 09214105
OCT0130000000040000, "3ERF00", OCT0000000012500000,%651 09214410
OCT0130000000040000, "5GAMMA", OCT0000000012600000,%654 09214415
OCT0130000000040000, "5LNGAM", OCT0000000012700000,%657 09214420
OCT0130000000040000, "3TAN00", OCT0000000011100000,%660 09214425
OCT0130000000040000, "3TAN00", OCT0000000011100007,%660 09214425
OCT0130000260000000, "4FAST0", %663 09214426
OCT0130000270000000, "4SLOW0", %665 09214427
OCT0130000240000000, "7PROTE", "CT000000", %667 09214428
@@ -8257,7 +8258,7 @@ COMMENT ADD IN CORE ESTIMATE FOR SORT; 09361181
IF GTI1 } 32000 THEN GTI1~ 32000; 09361200
COMMENT AT THIS POINT GTI1 HAS THE NEEDED TOTAL CORE REQD; 09361210
COMMENT WRITE OUT FILE PARAMETER BLOCK; 09393000
GTI1~MIN((IDLOC-IDLOCTEMP).[33:15]+1, 128);% AHA 09394000
GT1~MIN((IDLOC-IDLOCTEMP).[33:15]+1, 128);% AHA 09394000
MOVE(GT1,IDARRAY[0],EDOC[0,0]); 09395000
ZEROUT(IDARRAY[0],0,30); 09395500
IDARRAY[4]:=MOVEANDBLOCK(EDOC,GT1,0); %106-09396000
@@ -8452,7 +8453,7 @@ END END END PROGRAM; 09420000
REPEAT~F-SKIP; F~SKIP; 10127000
WHIPOUT(EDOC[F.[38:3],F.[41:7]]&REPEAT[28:38:10]); 10127100
F~SKIP+REPEAT; S~TRUE; CODE~RRIGHT END 10127200
ELSE IF ELCLASS = "0" 10128000
ELSE IF ELCLASS = "O" 10128000
THEN BEGIN CODE~RO; W~8 END 10129000
ELSE IF ELCLASS = "D" 10130000
THEN BEGIN CODE~RD; W~8 END 10131000
@@ -8557,7 +8558,7 @@ END END END PROGRAM; 09420000
L2: NEXTENT; GO TO EXIT; 10172000
EX: FORMATPHRASE ~ TRUE; ERR(136); 10173000
EXIT: END FORMATPHRASE; 10174000
COMMENT GETINT DOES A CALL ON NEXTEND AND CHECKS TO SEE IF AN INTEGER 10175000
COMMENT GETINT DOES A CALL ON NEXTENT AND CHECKS TO SEE IF AN INTEGER 10175000
WAS THE RESULT: IF NOT ERROR - OTHERWISE MAKE SIGN PLUS; 10176000
BOOLEAN PROCEDURE GETINT; 10177000
BEGIN NEXTENT; IF ELCLASS ~ - ELCLASS < 0 THEN 10178000
@@ -9999,7 +10000,7 @@ COMMENT 13294000
KOUNT~COUNT; 13306000
ACCUM[0].INCR~WORDCOUNT; 13307000
ACCUM[0].LINK ~STACKHEAD[SCRAM];STACKHEAD[SCRAM]~NEXTINFO; 13308000
ACCUM[1].PURPT~NEXTINFO~LASTINFO; 13309000
ACCUM[1].PURPT~NEXTINFO-LASTINFO; 13309000
MOVE(WORDCOUNT,ACCUM,INFO[NEXTINFO.LINKR,NEXTINFO.LINKC]); 13310000
IF XREF THEN % MAKE DECLARATION REFERENCE %116-13310050
IF (ACCUM[0].CLASS ! DEFINEDID OR NOT %116-13310075
@@ -10032,7 +10033,7 @@ COMMENT 13317000
ENTRY ASSUMES THAT I IS POINTING AT AN IDENTIFIER WHICH 13318000
IS BEING DECLARED AND MAKES UP THE ELBAT ENTRY FOR IT 13319000
ACCORD TO TYPE .IF THE ENTRY IS AN ARRAY AND NOT 13320000
A SPECIFICATION THEN A DESCRIPTOR IS PALCED IN THE STACK 13321000
A SPECIFICATION THEN A DESCRIPTOR IS PLACED IN THE STACK 13321000
FOR THE UPCOMING COMMUNICATE TO GET STORAGE FOR THE ARRAY(S) ;13322000
BEGIN 13323000
BOOLEAN SVTOG;% 13323010
@@ -10252,7 +10253,7 @@ TWO:IF STEPI=ADOP THEN 13474000
ULITOG~FALSE; 13523000
AEXP; 13524000
EMITL(JUNK); 13525000
EMITL(ISN); 13526000
EMITO(ISN); 13526000
CSZ: IF LLITOG AND ULITOG THEN 13527000
BEGIN 13528000
L~ARPROGS; 13529000
@@ -11652,7 +11653,7 @@ COMMENT **** MONITOR FUNCTION M1 GOES HERE ; 15238000
COMMENT 203 VARIABLE- THE NUMBER OF SUBSCRIPTS USED IN A ROW * 15257000
ROW DESIGNATOR DOES NOT MATCH THE ARRAY * 15258000
DECLARATION. *;15259000
IF STEPI = RTBRKET THEN 15260000
IF STEPI ! RTBRKET THEN 15260000
BEGIN ERR(204);GO EXIT END; 15261000
COMMENT 204 VARIABLE- COMPILER EXPECTS A ] IN A ROW DESIGNATER *;15262000
IF P1 ! FA THEN 15262500

View File

@@ -0,0 +1,55 @@
$ SET LIST $ PRT DEBUGN 00000100120418PK
% CASE VS. SWITCH 10/01/70 ROSE & PK 00002000
BEGIN 00003000
INTEGER I, J, K; 00004000
FILE OUT PR 18 (2,15); 00005000
BEGIN %%% INNER BLOCK %%% 00006000
REAL X, Y, Z; 00007000
LABEL L1, L2, L3; 00008000
SWITCH S ~ L1, L2, L3; 00008500
ALPHA ARRAY A[0:I], B[0:2|I]; 00009000120418PK
FORMAT F1 (X20,O,X5,2O); 00010000
00011000
STREAM PROCEDURE MOVEPRT (PRT25, A, N1, N2); 00012000
VALUE N1, N2; 00013000
BEGIN 00014000
SI ~ LOC PRT25; SI ~ SI - 21; 00015000
DI ~ A; 00016000
N1(2(DS ~ 32 WDS)); N2(DS ~ WDS); 00017000
END MOVEPRT; 00018000
00019000
STREAM PROCEDURE BINOCT (N1, N2, S, D); 00020000
VALUE N1, N2; 00021000
BEGIN 00022000
SI ~ S; 00023000
DI ~ D; 00024000
N1(32(32(DS~ 3 RESET; 3(IF SB THEN DS ~ SET ELSE DS ~ RESET; 00025000
SKIP SB)))); 00026000
N2(16(DS ~ 3 RESET; 3(IF SB THEN DS ~ SET ELSE DS ~ RESET; 00027000
SKIP SB))); 00028000
END BINOCT; 00029000
00030000
L1: 00031000
J ~ 3; GO TO S[J]; 00032000
L2: 00033000
CASE J MOD 10 OF 00034000
BEGIN 00035000
J ~ 3; 00036000
K ~ J; 00037000
X ~ K +J; 00038000
Y ~ X ~ SQRT(X); 00039000
; 00040000
Z ~ 2|Y + 6.0; 00041000120418PK
; 00042000
K ~ 5000; 00043000
END CASE; 00044000
L3: 00045000
MOVEPRT (I, A[*], I DIV 64, I MOD 64); 00046000
BINOCT (I DIV 64, I MOD 64, A[*], B[*]); 00047000
FOR J ~ 0 STEP 1 UNTIL I DO 00048000
BEGIN 00049000
BINOCT (0, 1, J, Y); 00050000
WRITE (PR, F1, Y, B[J|2], B[J|2+1]); 00051000120418PK
END; 00052000
END INNER BLOCK; 00053000
END. 00054000

View File

@@ -0,0 +1,2 @@
$ SET $ LIST PRT DEBUGN 00000010120419PK
BEGIN END. 00000100

View File

@@ -0,0 +1,5 @@
$ SET LIST $ PRT DEBUGN 00000100120417PK
BEGIN 00000200
INTEGER I, J; 00000300
J:= I+5; 00000400
END. 00000500

207
tools/CODEDUMP55.alg_m Normal file
View File

@@ -0,0 +1,207 @@
$ SET LINEINFO 00000100
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00001000
%% CODEDUMP55 %%00001100
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00001200
% 00001300
% MCP E-MODE PROGRAM TO DUMP A B-5500 CODE FILE IN OCTAL AND TO 00001400
% INTERPRET SEGMENT 0 AND THE SEGMENT DICTIONARY. 00001500
% 00001600
% TO USE, EQUATE FILE CODE TO THE B5500 CODE FILE. OUTPUT IS TO THE 00001700
% PRINTER FILE LINE. 00001800
% 00049900
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00050000
% 2012-04-19 P.KIMPEL 00050010
% ORIGINAL VERSION. 00050011
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00099000
BEGIN 00100000
DEFINE 00100100
SECTORSIZE = 30 #, 00100200
UNITSOF(V,U) = (((V)+(U-1)) DIV (U)) #, 00100300
INCREMENTSOF(V,U) = (UNITSOF(V,U)*U) #; 00100400
00110000
INTEGER 00120100
CODERECSIZE, 00120200
PRTSIZE, 00120300
SEGDICTSIZE; 00120400
00130000
REAL 00130100
T7; 00130200
00150000
ARRAY 00150100
A[0:29], 00150200
PRT[0:29], 00150300
SEGDICT[0:29], 00150400
SEGZERO[0:29]; 00150500
00170000
FILE 00170100
CODE (KIND=DISK, DEPENDENTSPECS, DEPENDENTINTMODE), 00170200
LINE (KIND=PRINTER, MAXRECSIZE=132, FRAMESIZE=8, FILEUSE=IO); 00170300
00300000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00300100
PROCEDURE DUMPSECTOR(SECTOR, BUF, BUFX); 00300200
VALUE SECTOR, BUFX; 00300300
INTEGER SECTOR, BUFX; 00300400
ARRAY BUF[0]; 00300500
BEGIN 00300600
INTEGER 00300700
ENDX, 00300800
X, 00300900
Y; 00301000
00301100
ENDX:= BUFX+SECTORSIZE-1; 00301200
WRITE(LINE, <X3,K5,X2,5(K4,X1,6(K16,X1),/,X10)>, 00301300
SECTOR, FOR X:= BUFX STEP 6 UNTIL ENDX DO [ 00301400
X, FOR Y:=0 STEP 1 UNTIL 5 DO BUF[X+Y]]); 00301500
END DUMPSECTOR; 00301600
00810000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00810100
PROCEDURE DUMPPRT(PRTLOC, PRTSIZE, PRT); 00810200
VALUE PRTLOC, PRTSIZE; 00810300
INTEGER PRTLOC, PRTSIZE; 00810400
ARRAY PRT[0]; 00810500
BEGIN 00810600
INTEGER 00810700
BUFX, 00810800
SECTOR; 00810900
00811000
WRITE(LINE, <"PRT:">); 00811100
SECTOR:= PRTLOC; 00811200
IF SIZE(PRT) < PRTSIZE THEN 00811300
RESIZE(PRT, INCREMENTSOF(PRTSIZE, SECTORSIZE)); 00811400
00811500
WHILE BUFX < PRTSIZE DO 00811600
BEGIN 00811700
READ(CODE[SECTOR], CODERECSIZE, PRT[BUFX]); 00811800
DUMPSECTOR(SECTOR, PRT, BUFX); 00811900
BUFX:=*+SECTORSIZE; 00812000
SECTOR:= *+1; 00812100
END WHILE; 00812200
END DUMPPRT; 00812300
00820000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00820100
PROCEDURE DUMPSEGDICT(DICTLOC, DICTSIZE, DICT, PRT); 00820200
VALUE DICTLOC, DICTSIZE; 00820300
INTEGER DICTLOC, DICTSIZE; 00820400
ARRAY DICT, PRT[0]; 00820500
BEGIN 00820600
INTEGER 00820700
BUFX, 00820800
PRTX, 00820900
SECTOR, 00821000
SECTOREND, 00821050
SEGSECTORS; 00821100
REAL 00821200
P, 00821300
W; 00821400
00821500
WRITE(LINE, <"SEGMENT DICTIONARY:">); 00821600
SECTOR:= DICTLOC; 00821700
IF SIZE(DICT) < DICTSIZE THEN 00821800
RESIZE(DICT, INCREMENTSOF(DICTSIZE, SECTORSIZE)); 00821900
00822000
WHILE BUFX < DICTSIZE DO 00822100
BEGIN 00822200
READ(CODE[SECTOR], CODERECSIZE, DICT[BUFX]); 00822300
BUFX:= *+SECTORSIZE; 00822400
END WHILE; 00822500
00822600
FOR BUFX:= 0 STEP 1 WHILE BUFX < DICTSIZE DO 00822700
BEGIN 00822800
W:= DICT[BUFX]; 00822900
IF W IS 0 THEN 00823000
WRITE(LINE, <K4,X2,"(ZERO)">, BUFX) 00823100
ELSE 00823200
BEGIN 00823300
SECTOR:= W.[14:15]; 00823400
SEGSECTORS:= UNITSOF(W.[29:15], SECTORSIZE); 00823500
SECTOREND:= SECTOR+SEGSECTORS-1; 00823600
PRTX:= W.[39:10]; 00823700
WRITE(LINE, <K4,X2,K16," TYPE=",I1," INTR=",I1," PRT-LNK=",K3, 00823800
" SIZE=",K5," ADDR=",K5>, 00823900
BUFX, W, W.[46:1]+1, W.[45:1], PRTX, W.[29:15], SECTOR); 00824000
00824100
IF PRTX > 0 THEN 00824200
BEGIN 00824300
DO BEGIN 00824400
P:= PRT[PRTX]; 00824500
WRITE(LINE, <X6,"PRT ",K4," STOP=",I1," LINK=",K4, 00824600
" SEG DICT=",K5," OFFSET=",K5>, 00824700
PRTX, P.[41:1], P.[40:11], P.[29:15], P.[14:15]); 00824800
PRTX:= P.[40:11]; 00824900
END 00825000
UNTIL BOOLEAN(P.[41:1]); % PRT STOPPER BIT 00825100
END; 00825200
00825300
IF BOOLEAN(W.[45:1]) THEN 00825400
WRITE(LINE) % AN INTRINSICS SEGMENT 00825500
ELSE 00825600
BEGIN 00825700
WRITE(LINE); 00825800
FOR SECTOR:= SECTOR STEP 1 WHILE SECTOR<=SECTOREND DO 00825900
BEGIN 00826000
READ(CODE[SECTOR], CODERECSIZE, A); 00826100
DUMPSECTOR(SECTOR, A, 0); 00826200
END FOR; 00826300
END; 00826400
END; 00826500
END FOR; 00826600
00826700
WRITE(LINE); 00826800
END DUMPSEGDICT; 00826900
00840000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00840100
PROCEDURE DUMPFPB(FPBLOC, FPBSIZE, BUF); 00840200
VALUE FPBLOC, FPBSIZE; 00840300
INTEGER FPBLOC, FPBSIZE; 00840400
ARRAY BUF[0]; 00840500
BEGIN 00840600
INTEGER 00840700
BUFX, 00840800
SECTOR; 00840900
00841000
WRITE(LINE, <"FPB:">); 00841100
SECTOR:= FPBLOC; 00841200
00841300
WHILE BUFX < FPBSIZE DO 00841400
BEGIN 00841500
READ(CODE[SECTOR], CODERECSIZE, BUF); 00841600
DUMPSECTOR(SECTOR, BUF, 0); 00841700
BUFX:=*+SECTORSIZE; 00841800
SECTOR:= *+1; 00841900
END WHILE; 00842000
END DUMPFPB; 00842100
00900000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00900100
%% OUTER BLOCK 00900200
00900300
OPEN(CODE); 00900400
CODERECSIZE:= CODE.MAXRECSIZE; 00900500
REPLACE POINTER(A,8) BY " " FOR 132; 00900600
REPLACE POINTER(A,8) BY "CODEDUMP55: ", CODE.LTITLE; 00900700
REPLACE POINTER(A[17],8)-5 BY " ", 00900800
(T7:= TIME(7)).[47:12] FOR 4 DIGITS, "-", 00900900
T7.[35:6] FOR 2 DIGITS, "-", 00901000
T7.[29:6] FOR 2 DIGITS, " ", 00901100
T7.[23:6] FOR 2 DIGITS, ":", 00901200
T7.[17:6] FOR 2 DIGITS; 00901300
WRITE(LINE[SPACE 2], 132, A); 00901400
00910000
READ(CODE[0], CODERECSIZE, SEGZERO); 00910100
00910200
WRITE(LINE, <"SEGMENT DICTIONARY AT SECTOR ",I6," FOR ",I6,/, 00910300
"PRT AT SECTOR ",I6," FOR ",I6,/, 00910400
"FPB AT SECTOR ",I6," FOR ",I6,/, 00910500
"STARTING SEGMENT NUMBER ",I6,/, 00910600
"NUMBER OF FILES ",I6,/, 00910700
"CORE ESTIMATE ",I6,/>, 00910800
SEGZERO[0], SEGZERO[1], SEGZERO[2], SEGZERO[3], 00910900
SEGZERO[4], SEGZERO[5], SEGZERO[6], 00911000
SEGZERO[7].[14:15], SEGZERO[7].[29:15]*64); 00911100
00911200
SEGDICTSIZE:= SEGZERO[1]; 00911300
PRTSIZE:= SEGZERO[3]; 00911400
DUMPPRT(SEGZERO[2], PRTSIZE, PRT); 00911500
DUMPFPB(SEGZERO[4], SEGZERO[5], A); 00911600
DUMPSEGDICT(SEGZERO[0], SEGDICTSIZE, SEGDICT, PRT); 00911700
00999800
END. 00999900

File diff suppressed because it is too large Load Diff