1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-01-13 15:17:03 +00:00

Release emulator version 0.15:

1. Initial implementation of a datacom terminal.
2. Initial implementation (read-only) of magnetic tape drives.
3. Further work towards getting P2 to function (but not working yet).
4. Allow device driver classes to be optionally included in the global UI script.
5. Fix callback arguments handling in SetCallback.
6. Decrease width of SPO window slightly.
7. Improve trapping and printing of SPO keystrokes, based on datacom implementation.
8. Minor performance tuning improvements.
9. Dump raw header words in octal in tools/B5500DiskDirList.html script.
10. New wiki pages and several updates to existing ones.
This commit is contained in:
Paul Kimpel 2013-11-15 05:33:58 +00:00
parent be8a333cce
commit ad9a584814

View File

@ -23561,3 +23561,252 @@ EOF: END COOLOFF;% 38376000
HEADER[4].[11:1]~1; END; 38411800
END; IF ACCESS = 4 THEN ACCESS := 2; 38411900
END;% 38412000
END;% 38412100
HEADER[4].[43:1]:=FPB[FNUM+3].[15:1]; 38412200
IF (NOT REW) OR LOCK OR REL OR TIME THEN 38419000
BEGIN 38420000
FORMS~HEADER[3]; 38421000
STREAM(PF~[FIB[4]],D~FPB[FNUM+2].[18:30],H~[HEADER[3]],S~[T]); 38422000
BEGIN SI~PF;SI~SI+5;DS~3 OCT;SI~LOC D;DI~H;DS~8 OCT END; 38423000
HEADER[3]~(P(DUP,LOD,SSN))&(P(DUP))[12:30:18]&T[2:38:10]; 38424000
END; 38425000
IF LOCK OR HEADER[4].[43:1] THEN 38426000
BEGIN IF NOT HEADER[4] THEN%FILE IS BEING CREATED 38427000
BEGIN 38428000
IF KRUNCH THEN KRUNCHER(HEADER); 38429000
HEADER[4].[9:3]:=5;% MARK AS NEW FORMAT,ACCESSED 38430000
IF JAR[P1MIX,0] < 0 AND FIB[4].[29:1] THEN 38431000
% COMPILER CLOSING CODE FILE WITH LOCK *********************************38432000
BEGIN 38433000
SEG0:=[M[TYPEDSPACE(62,SEGZEROAREAV)]]&30[SIZE];38434000
SKEL ~ 31 INX SEG0; T3 ~ JAR[P1MIX,2].[FF]; 38435000
% READ IN SEGMENT ZERO 38436000
DISKWAIT(-SEG0.[CF],30,HEADER[10]]; 38437000
% READ IN SKELETON SHEET 38438000
DISKWAIT(-SKEL.[CF],30,T3); 38439000
IF SKEL[20]<0 THEN SKEL[20] ~ SEG0[7].[FF]; 38440000
IF JAR[P1MIX,2].[8:10]=1 THEN 38441000
BEGIN % COMPILE AND GO **********************38442000
SKEL[6]:=JAR[P1MIX,6]& 38442100
(PRT[P1MIX,3].[8:10]+20)[CTF]; 38442200
DISKWAIT(SKEL.[CF],30,T3); 38443000
COMPGO ~ TRUE; 38444000
END 38445000
ELSE 38446000
BEGIN % COMPILE TO LIBRARY ******************38447000
FOR T1 ~ 15 STEP 1 UNTIL 22 DO 38448000
SEG0[T1] ~ SKEL[T1]; 38449000
IF (T2 ~ SKEL[13]) = 0 THEN GO TO L3; 38450000
SKEL[13] ~ 0; % IN CASE I CALL TERMINATE 38451000
DISKWAIT(SKEL.[CF],30,T3); 38452000
IF(T1:=DISKADDRESS(MID,FID,FPB[FNUM+3],HEADER[7]:= % (SHM)38453000
(*P(DUP))+1,HEADER,0))=0 THEN 38454000
FILEMESS(-"DISK ","OVRFLOW",MID,FID,38455000
R,D,C); 38456000
SEG0[15] ~ T1 ~ HEADER[7]; 38457000
L1: DISKWAIT(-SKEL.[CF],30,T2); 38458000
FORGETESPDISK(T2); 38459000
IF (T2~SKEL[29]) = 0 THEN GO TO L2; 38460000
IF(T3:=DISKADDRESS(MID,FID,FPB[FNUM+3],HEADER[7]:= % (SHM)38461000
(*P(DUP))+1,HEADER,0))=0 THEN 38462000
FILEMESS(-"DISK ","OVRFLOW",MID,FID,38463000
R,D,C); 38464000
SKEL[29] ~ T3 ~ HEADER[7]; 38465000
DISKWAIT(SKEL.[CF],30, 38466000
I~HEADER[T1 DIV HEADER[8]+10] + 38467000
T1 MOD HEADER[8]); 38468000
T1 ~ T3; 38469000
GO TO L1; 38470000
L2: DISKWAIT(SKEL.[CF],30, 38471000
I~HEADER[T1 DIV HEADER[8]+10] + 38472000
T1 MOD HEADER[8]); 38473000
L3: SEG9[6] ~ P(DUP,LOD,SSN); % "NEW FORMAT" 38474000
HEADER[4].[10:1]~1;%MARK AS PROGRAM FILE 38475000
DISKWAIT(SEG0.[CF],30,HEADER[10]); 38476000
END COPY OF LABEL EQUATION CARDS; 38477000
FORGETSPACE(SEG0); 38478000
IF HEADER[7]<HEADER[8]-1 THEN 38479000
BEGIN FORGETUSERDISK(HEADER[10]+HEADER[7]+1, 38480000
HEADER[7]-HEADER[8]+1); 38481000
HEADER[8] ~ HEADER[7]+1; 38482000
END; 38483000
FOR T1:=-1 STEP 1 UNTIL 4 DO 38484000
DUMMY :: IF P(.OBJTYPE,T1,+,LOD)=ABS(JAR[P1MIX,0]) THEN 38485000
HEADER[4].[36:6]:=T1+2; 38486000
END; 38488000
HEADER[1]~FORMS&HEADER[3][6:30:18]; 38489000
IF (HEADER[2]:=USERCODE[P1MIX]).[1:1] OR 38490000
MCP=NOT(-0) THEN HEADER[2]~0; 38491000
HEADER[5] := HEADER[6] := 0; 38492000
IF COMPGO THEN 38494000
BEGIN PRT[P1MIX,@26]~IOD~GETESPDISK; 38495000
DISKWAIT(HEADER.[CF],30,IOD); 38496000
END ELSE 38497000
BEGIN 38498000
ENTERUSERFILE(MID,FID,HEADER.[CF]-1); 38499000
END; 38500000
END;% 38501000
END;% 38502000
IF REW AND NOT(LOCK OR REL OR TIME) THEN 38503000
BEGIN 38503200
IF HEADER[4] THEN 38503400
IF WRITTENON THEN HEADER[4].[11;1]:=1; 38503600
STATE.[39:4]:=2; 38503800
END ELSE 38504000
BEGIN 38504500
HEADER[1]~FORMS&HEADER[3][6:30:18]; 38505000
IF HEADER[4] THEN%FILE ALREADY EXISTS 38506000
BEGIN 38507000
J:=WRITTENON OR HEADER[4].[11:1]; 38507500
$ SET OMIT = SHAREDISK 38507799
I~IF FIB[5].[1:1] OR NOT J THEN FIB[5].[13;3]~10 ELSE 38507800
(HEADER INX 0)&FIB[5][30:13:3]; 38508000
$ POP OMIT 38508001
$ SET OMIT = NOT SHAREDISK 38508599
IF(I~DIRECTORYSEARCH(MID,FID&J[3:47:1],I))!0 THEN 38509000
IF PURGE THEN 38510000
IF M[I+4].[12:4]=0 THEN 38511000
IF NOT SYSTEMFILE(MID,FID) THEN 38512000
IF SECURITYCHECK(MID,FID,USERCODE[P1MIX],I).[45:1] THEN 38513000
P(DIRECTORYSEARCH(-MID,FID,7),DEL); 38515000
IF I NEQ 0 THEN FORGETSPACE(I); 38516000
END ELSE% 38517000
IF NOT LOCK THEN% 38518000
IF HEADER[4].[43:1] THEN P(DIRECTORYSEARCH(-MID,FID,7),DEL) ELSE 38518500
BEGIN 38519000
$ SET OMIT = NOT(DISKLOG) 38520000
FOR I~10 STEP 1 UNTIL 29 DO% 38522000
IF HEADER[I]!0 THEN FORGETUSERDISK(HEADER[I],-HEADER(8]);% 38523000
END; 38524000
FORGETSPACE(HEADER); 38525000
STATE.[39:4]~1;% 38526000
END; 38527000
IF NOT COBOL THEN FIB[4].[27:3]~3; 38528000
GO CLEANUP;% 38529000
OBJTYPE::: "BASIC ", %1% 38530000
"ALGOL ", %2% 38531000
"COBOL ", %3% 38532000
"FORTRAN", %4% 38533000
"TSPOL ", %5% 38534000
"XALGOL ", %6% 38535000
0; %DUMMY% 38536000
CLEANUP: 38537000
P(P&RCW[CTC],0,RDS,0,XCH,P&P[CTF],STF); 38538000
END DISK CLOSE; 38539000
PROCEDURE BACKCLOSE(ALPHA); VALUE ALPHA; INTEGER ALPHA;% 38540000
BEGIN REAL RCW=+0,MSCW=-2; 38541000
ARRAY FIB=+1[*],FPB=+2[*],HEADER=+3[*];% 38542000
DONT ADD ANY DECLARATIONS BETWEEN "HEADER" AND "KIND" %%% MCP 38543000
INTEGER KIND=+4,NBUFS=+5,U=+6,BLEN=+7,CODE=+8, 38544000
UNLABELED=+9,COBOL=+10,I=+11,J=+12, 38545000
FNUM=+13; 38546000
REAL MID=+14,FID=+15,R=+16,D=+17,C=+18,FORMS=+19,STATE=+20; 38547000
LABEL AGAIN,EOF,EOT,CLOSEOUT,PBD,PUD; 38548000
LABEL ZEROKDADDR; %175-38548010
REAL STA=+21;% 38548100
REAL T1=+22,T2=+23,T3=+24,IOD=+25;% 38549000
ARRAY SEG0=+26[*],SKEL=+27[*]; 38550000
SUBROUTINE COOLOFF;% 38552000
BEGIN FOR I~0 STEP 1 UNTIL NBUFS-1 DO% 38553000
BEGIN IF NOT M[ALPHA+I].[19:1] THEN% 38554000
SLEEP([M[ALPHA+I]],IOMASK);% 38555000
IF KIND!4 THEN 38556000
IF M[ALPHA+I].[27:1] THEN GO TO EOF;% 38557000
END;% 38558000
EOF: END COOLOFF;% 38559000
REAL T=+28,ACCESS=+29;% 38561000
BOOLEAN COMPGO=+30; 38562000
REAL TYPE=+31; 38562100
DEFINE REW=CODE.[47:1]#,% 38563000
REL=CODE.[46:1]#,% 38564000
TIME=CODE.[45:1]#,% 38565000
LOCK=NOT CODE.[44:1]#,% 38566000
PURGE=NOT CODE.[43:1]#,% 38567000
$ SET OMIT = PACKETS 38567950
DEFINE TOREELNO = 42:42:6#; 38568100
$ POP OMIT OMIT 38568150
% 38569000
SUBROUTINE CKBKUP; 38570000
BEGIN M[M[ALPHA]INX 17 ]~M[ALPHA]&(FIB[5] )[FTC]; 38571000
FIB[5]~P(DUP,LOD,0,1,CFX,+); 38572000
IF NOT PRTROW[P1MIX].[7:1] THEN 38573000
IF FIB[14].[CF]=FIB[14].[FF] 38573100
THEN BEGIN PBIO(ALPHA,FIB[14]);SLEEP([M[ALPHA]],IOMASK)END ELSE38574000
BEGIN; STREAM(S~ M[ALPHA],Z~FIB[14].[FF]); 38575000
BEGIN SI~S; DS~18 WDS END; 38576000
FIB[14].[FF]~P(DUP).[FF]-18; 38577000
END; END; 38578000
P(RCW,MSCW,STF); 38580000
RCW:=RCW&P(XCH)[CTC]; 38581000
J~LOCK; 38581100
IF T1~(FIB[9].[1:1] AND KIND=7) THEN % MULTI-REEL PBT FILE 38581200
BEGIN 38581300
FIB[9].[1:1]~0; 38581400
COOLOFF; 38581500
GO TO EOT; 38581600
END; 38581700
IF M[FIB[14].[3:15] INX NOT 0] = 0 THEN % %175-38581800
BEGIN %175-38581900
I:=TYPE>20; % 1=PUD %175-38581910
R:=M[FIB[14].[3:16]+6]; % PB REEL NO. %175-38581920
GO TO ZERODKADDR; %175-38581930
END; 38581940
IF FIB[17]<0 THEN 38582000
BEGIN M[ALPHA].[FF]~@60020; IF TYPE<20 THEN CKBKUP; 38583000
M[ALPHA].[18:1]~0; CKBKUP END% 38584000
ELSE IF FIB[17]<BLEN THEN% 38585000
BEGIN IF NOT COBOL THEN FIB[17]~FIB[17]-(STATE.[46:2]=3);% 38586000
STREAM(N:=FIB[17],D:=M[ALPHA].[CF]); 38587000
BEGIN N(DS:=8 LIT " "); END; 38587500
M[ALPHA]~FLAG(FIB[16]&0[20:47:1]); CKBKUP; 38588000
END ELSE COOLOFF; 38589000
M[ALPHA]~(*P(DUP))&(@60000)[CTF]; %150-38590000
IF TYPE<20 THEN %150-38590100
M[ALPHA]~(*P(DUP))&(IF SEPARATE THEN 1 ELSE @20)[27:42:6];%150-38590200
IF NOT UNLABELED THEN 38591000
BEGIN IF TYPE<20 THEN CKBKUP; 38591100
M[ALPHA]~(*P(DUP))&2[18:45:3]&M[ALPHA-2][8:8:10]; 38592000
IF NOT SEPARATE THEN M[ALPHA]~(*P(DUP))&1[27:42:6]; %150-38592100
STREAM(L~M[ALPHA-2],B~M[ALPHA]); BEGIN SI~L; DS~17 WDS END; 38593000
END; %150-38594000
IF NOT SEPARATE THEN M[ALPHA]~P(DUP,LOD)&1[27:42:6]; %150-38594100
M[ALPHA].[20:1]~1; %150-38594200
IF FIB[14].[FF]!FIB[14].[CF] THEN %150-38594300
BEGIN CKBKUP; FIB[14].[FF]~P(DUP);END; CKBKUP; 38595000
IF KIND=12 THEN % PBD 38596000
BEGIN T~FIB[14].[3:15]; 38597000
IF (R:=M[T+7]|3) NEQ 0 THEN 38598000
BEGIN IF R < PBDROWSZ THEN 38598100
BEGIN FORGETUSERDISK(M[T+10]+R,PBDROWSZ-R+1); 38599000
M[T+8]~R; 38600000
END; 38601000
END; %601-38601100
M[T+1]~M[T+3]; 38602000
STREAM(A~FPB[FNUM+2].[18:30],T~T+3); 38603000
BEGIN SI~LOC A;DS~8 OCT;DI~DI-8;DS~2 LIT"+2"; 38604000
SI~T;SI~SI+5;DS~3 CHR; 38605000
END; 38606000
M[T+1].[6:18]~M[T+3].[30:18]; 38607000
IF I:=TYPE>20 THEN M[T+5].[3:1]:=0; 38607100
R:=M[T+6]; 38607200
$ SET OMIT = DATACOM AND RJE 38607299
P(0); 38607300
$ POP OMIT 38607301
$ SET OMIT = NOT(DATACOM AND RJE ) 38607399
M[T+6]:=P(XCH); 38607900
M[T+5].[2:1]~0; 38607950
DISKWAIT(T,30,M[T-1]); 38608000
D:=R&1[TOREELNO]; 38608100
AGAIN: P(DIRECTORYSEARCH(-(IF I THEN P(PUD) ELSE P(PBD)),D,14), 38608200
DEL); 38608300
IF D!R THEN 38608400
BEGIN STREAM(ONE:=1, D:=[D]); 38608500
BEGIN SI:=LOC ONE; DS:=8 ADD END; 38608600
GO AGAIN; 38608700
END; 38608800
$ SET OMIT = NOT PACKETS 38608890
IF (T1:=PSEUDOMIX[P1MIX])=0 THEN P(1) ELSE 38608900
IF PACKETPAGE[T1-32]=0 THEN P(1) ELSE P(0); 38608910
IF P OR 1 THEN %105-38608920
BEGIN PBCOUNT:=PBCOUNT+1; 38609000
$ POP OMIT 38609010