From c1b8b5b3c6a937ace2d0c1f4f8cc58bd08812cbb Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Mon, 19 Feb 2018 19:45:21 +0100 Subject: [PATCH] MLSYS from around 1973. Needed to build ML ITS 785. --- src/mlsys/10d16k.1 | 413 +++++++ src/mlsys/10dmp.12 | 409 +++++++ src/mlsys/10dmp.13 | 413 +++++++ src/mlsys/boot.1 | 43 + src/mlsys/boot.2 | 44 + src/mlsys/decdsk.bin | Bin 0 -> 7857 bytes src/mlsys/decdsk.dmp108 | 892 +++++++++++++++ src/mlsys/decdsk.dmp109 | 895 +++++++++++++++ src/mlsys/dskdmp.switch | 5 + src/mlsys/its.bin | Bin 0 -> 197922 bytes src/mlsys/itsdin.6 | 118 ++ src/mlsys/itsdin.7 | 117 ++ src/mlsys/itsdin.8 | 119 ++ src/mlsys/itsutp.5 | 408 +++++++ src/mlsys/itsutp.6 | 413 +++++++ src/mlsys/mdsk.0 | 57 + src/mlsys/mdsk.1 | 57 + src/mlsys/mfsdfs.3 | 97 ++ src/mlsys/mfsdfs.4 | 98 ++ src/mlsys/msalv.14 | 1462 +++++++++++++++++++++++++ src/mlsys/msalv.bin | Bin 0 -> 13882 bytes src/mlsys/ntsddt.n77h | 2312 +++++++++++++++++++++++++++++++++++++++ 22 files changed, 8372 insertions(+) create mode 100644 src/mlsys/10d16k.1 create mode 100644 src/mlsys/10dmp.12 create mode 100644 src/mlsys/10dmp.13 create mode 100644 src/mlsys/boot.1 create mode 100644 src/mlsys/boot.2 create mode 100644 src/mlsys/decdsk.bin create mode 100644 src/mlsys/decdsk.dmp108 create mode 100644 src/mlsys/decdsk.dmp109 create mode 100644 src/mlsys/dskdmp.switch create mode 100644 src/mlsys/its.bin create mode 100644 src/mlsys/itsdin.6 create mode 100644 src/mlsys/itsdin.7 create mode 100644 src/mlsys/itsdin.8 create mode 100644 src/mlsys/itsutp.5 create mode 100644 src/mlsys/itsutp.6 create mode 100644 src/mlsys/mdsk.0 create mode 100644 src/mlsys/mdsk.1 create mode 100644 src/mlsys/mfsdfs.3 create mode 100644 src/mlsys/mfsdfs.4 create mode 100644 src/mlsys/msalv.14 create mode 100644 src/mlsys/msalv.bin create mode 100644 src/mlsys/ntsddt.n77h diff --git a/src/mlsys/10d16k.1 b/src/mlsys/10d16k.1 new file mode 100644 index 00000000..ccfd39b2 --- /dev/null +++ b/src/mlsys/10d16k.1 @@ -0,0 +1,413 @@ +;TITLE MACDMP - MAC DECTAPE UTILITY - R CLEMENTS 8 OCT 67 - V001 +MODE==0 + + IFE MODE,TITLE MACDMP TD10 TAPE CONTROL VERSION + IFN MODE,TITLE MACDMP 551/136 TAPE CONTROL VERSION + + NOSYMS + RIM10 +MEMSIZ==40000 ;16K + + DTC=320 + DTS=324 + +F=0 ;MUST BE 0. USED BY JRA'S +A=2 ;MISC TEMP. HOLDS 136 CONO INDEX IN UWAIT +B=1 ;TEMP. HOLDS BLOCK # COMPUTATION IN SEARCH +C=3 ;HOLDS BITS FOR DECTAPE CONO DURING I/O +D=4 ;HOLDS POINTERS FOR AOBJN'S THROUGH CORE +E=5 ;HOLDS COUNT OF WORDS IN CURRENT DT BLOCK +P=6 ;PC FOR JSP'S +CKS=7 ;USUALLY CHECKSUM +FILN=10 ;NUMBER OF FILE IN DIRECTORY, 1 TO 27 OCTAL +BLKNO=11 ;BLOCK NUMBER SEARCHED FOR ON TAPE +WRITE=12 ;MULTI-STATE FLAG FOR DEFINING I/O OPERATION + ;1=D 0=K -5=I -1=ELSE +PNTR=13 ;POINTER TO BYTE TABLE IN DIRECTORY +CH=14 ;HOLDS 6BIT CHARACTER OF COMMAND, OR -1 +Q=15 ;ANOTHER JSP AC +G=16 ;RARELY USED VERY TEMP + +DDT=MEMSIZ-4000 ;LOCATION OF HIGH DDT, MAC VERSION. +COMPTR=MEMSIZ-1 ;COMMAND POINTER, IF SUPPLIED + +DEFINE INFORM A,B +IF2,[PRINTX \A!B +\] +TERMIN + + LOC MEMSIZ-602 + LOZAD=.-1 ;WHEN CORE IS CLEARED, IT + ;IS FROM 40 THRU LOZAD + LOW=20 ;FIRST LOCATION CONSIDERED FOR DUMPING + HIGH=.-1 ;LAST LOCATION CONSIDERED FOR DUMPING +FOOF: BLOCK 1 ;NEEDED FOR ZERO CORE SEARCH, ZEROED AT BEG1 +TAB: BLOCK 200 ;FILE DIRECTORY +TAPENO: BLOCK 1 ;TAPE UNIT SHIFTED LEFT FOR CONO + ;INITIAL ENTRY IS AT BEGR, UNLESS A COMMAND POINTER IS +;SUPPLIED IN COMPTR. IN THAT CASE, ENTRY IS AT BEGR+1 + +BEGR: SETZM COMPTR ;CLEAR ANY JUNK IN COMMAND POINTER + CONO 635550 ;I/O RESET, ETC. +BEG: JSP P,CRR ;TYPE A CR-LF + MOVEI D,SPNT-1 ;PREPARE TO REMOVE AOBJN POINTERS +BEG1: SETZB A,FOOF ;CLEAR A TO PUT IN CORE, CLEAR + ;FOOF FOR THE NEXT ZERO CORE SEARCH + EXCH A,1(D) ;REMOVE HEADER LIST + AOBJN A,. ;COUNT THROUGH TO NEXT HEADER + TLNE A,-2 + JRST .-2 + MOVEI D,-1(A) ;ACCOUNT FOR OVERSHOOT IN AOBJN + JUMPN D,BEG1 ;IF WE DIDNT AOBJN A 0, GO FOR NEXT HDR + MOVE PNTR,[XWD 500,TAB+55] ;5 BIT BYTES IN DIRECTORY + SETZB CH,F +CRCH: SETOI WRITE,215 ;USED FOR CARRET TYPEOUT +TYI: MOVSI B,400000 ;INIT FILE NAME TO @ @ +SPACE: EXCH C,B ;COPY FIRST WORD OF NAME TO C + MOVSI B,400000 ;PREPARE FOR SECOND WORD + MOVSI E,20600 ;FAKE OUT END-TEST OF BYTE POINTER +;STOP TAPE DRIVE +IFN MODE,CONO UTC,0 +IFE MODE,CONO DTC,400000 +NEXT: ILDB A,@BEGR ;GIVES A 0 UNLESS COMMAND POINTER SUPPLIED + ;RH OF NEXT IS USED AS A CONSTANT + JUMPN A,RCH ;JUMP IF COMMEND READ FROM CORE + MOVNI FILN,1 ;INITIALIZATION FOR SEARCH + MOVEI BLKNO,0 ; " + CONSO TTY,40 ;TYPEIN FLAG? + JRST .-1 ;NO,WAIT + DATAI TTY,A ;GET TYPED IN CHARACTER + JSP P,TYO ;ECHO IT (WITH PARITY) +RCH: ANDI A,177 ;STRIP OFF PARITY + CAIN A,177 ;RUBOUT? + JRST BEGR ;YES. RESTART MACDMP + CAIE A,33 ;NEW ALTMODE? + CAIL A,175 ;OR 175 OR 176 ALTMODES? + JRST ALTTST ;YES, SOME ALTMODE. + CAIL A,140 ;LOWER CASE CHARACTER? + TRZ A,40 ;YES. CHANGE TO UPPER CASE + SUBI A,40 ;CONVERT TO SIXBIT + JUMPL A,CARRET ;ANY CONTROL CHARACTER + JUMPE A,SPACE ;CHAR WAS 40 +NEXT1: TLNE E,770000 ;NO MORE THAN SIX CHARS + IDPB A,E ;GOES INTO AC1 = B + JRST NEXT ;GET ANOTHER CHARACTER + + +;HERE ON JUMP BLOCK DURING LOADS, OR NUMBER>7 ALT +JBLK: CAILE CH,"M-40 ;SKIP IF SYMS NOT NEEDED + JRA CH,LOAD ;F=0 C(CH)LT=0 C(F)=-1 +;STOP TAPE DRIVE +IFN MODE,CONO UTC,0 +IFE MODE,CONO DTC,400000 + JUMPL CH,DDTG ;IF SYMS JUST READ + HRRM D,SADR ;SAVE STARTING ADDRESS +;THE FOLLOWING CONDITIONAL ASSEMBLY ASSURES THAT THE +;TRZA INSTRUCTION AT THRU+2 WILL CLEAR BIT 35. +IFE .&1,[ JUMPN CH,BEG ;IF NOT LOADGO COMMAND +SADR: JRST BEG ;CURRENT S.A. +] +IFN .&1,[SADR: JUMPE CH,BEG + JRST BEG +] +DDTG: HRROS DDT-1 ;TELL DDT ITS SYMBOL TABLE WAS BUGGERED + JRST DDT ;AND GO TO DDT + +LOADS: ;HERE TO LOAD TAPE TO CORE, OR VERIFY + MOVEI D,LOZAD+1 ;FIRST LOC NOT TO ZERO + SETZM 40 ;A "FEATURE" + MOVE C,[XWD 40,41] ;PREPARE TO CLEAR CORE. + CAIN CH,"T-40 ;IF "T", DONT CLOBBER DDT SYMS OR DDT + MOVE D,@DDT-1 ;GET FIRST LOC OF DDT SYMS + TRNN CH,3 ;SKIP ON M,N,I NOT ON L,T,@ + BLT C,-1(D) ;ZERO CORE +LOAD: JSP Q,LODUMP ;START READING FILE. LODUMP PROCESSES + ;ONE HEADER AND ITS DATA + JSP P,UWAIT ;GET THE CHECKSUM OF THAT HEADER BLOCK + CAMN CKS,D ;CHECK CHECKSUM + JRST LOAD ;IF OK, GET NEXT BLOCK.(IF NONE, + ;LODUMP RETURNS TO JBLK.) +DELE: JUMPE C,BEG ;IF C IS ZERO, NO I/O WAS DONE. + ;I.E., A "K" COMMAND + SKIPN E,WRITE ;SKIP IF NOT IN THE K PHASE OF A D COMMAND. + ;ALSO, SET E =0, SO SEARCH HAPPENS IN RBLK + AOJA WRITE,CLSTP ; 0 TO 1. GO DUMP OUT DIRECTORY. +ERR: SKIPA P,NEXT ;SET TO RETURN TO BEGR +CRR: SKIPA A,CRCH ;LIKE HRROI A,215 AND SKIPA + SKIPA A,FD3 ;GET A BELL CHARACTER +TYO: SKIPN COMPTR ;DONT TYO IF NO TYI, UNLESS ERR + DATAO TTY,A ;TYPE OUT + CONSZ TTY,20 ;WAIT FOR TTY TO FINISH + JRST .-1 ;NOT YET + CAIE A,215 ;IF CR TYPED IN, + JUMPGE A,(P) ;OR SIGN BIT OF CHAR ON,(SEE CRR) + MOVEI A,12 ;APPEND A LINEFEED + JRST TYO ;GO TYPE LF + + ALTTST: TLNN B,4040 ;IF ALPHA CHARACTERS, DONT GET CH + LDB CH,E ;LAST CH BEFORE ALT, -40 + JUMPN CH,ALTMD ;IF CH NOT NULL, GOT PROCESS ALTMODE +CARRET: AOJE A,NEXT1 ;IGNORE A ^_ + MOVSI FILN,-30 ;FILE NAME SPECIFIED. FIRST THING TO + ;DO IS LOOK IT UP IN DIRECTORY +LUP: AOJ FILN,DMP3A ;RH COUNTS BY 2,LH BY 1. NOTE AOBJN + SKIPN TAB-1(FILN) ;SEARCH FOR FREE FILE + SKIPE BLKNO,TAB(FILN) ;CHECK BOTH WORDS + TDZA BLKNO,BLKNO ;ENSURE CLEAR BLOCK NMBER + HRRM FILN,FREE ;SAVE NUMBER OF A FREE FILE + CAMN C,TAB-1(FILN) ;SEARCH FOR TYPED-IN FILE + CAME B,TAB(FILN) ;BOTH WORDS + AOBJN FILN,LUP ;NOT THIS ONE. KEEP LOOKING + JUMPL FILN,BEG69 ;IF FILE FOUND, JUMP + JUMPLE WRITE,ERR ;IF NOT FOUND, BETTER BE DUMP +FREE: MOVEI FILN,. ;DUMP & NOT FOUND, MAKE ENTRY WHERE FREE + ;(ADDRESS MODIFIED ABOVE) + SKIPE TAB(FILN) ;MAKE SURE HOLE AVAILABLE + JRST ERR ;NO FREE SLOTS + +BEG69: SKIPN WRITE ;DELETE? (K COMMAND) + SETZB B,C ;YES, KILL FILE + MOVEM C,TAB-1(FILN) ;CLEAR IF DELE, ENTER IF NEW DUMP + MOVEM B,TAB(FILN) ;BOTH WORDS + MOVEI FILN,1(FILN) ;FILN IS (2*FILE #-1)+1, NOW +1 MORE + LSH FILN,-1 ;FORM DIR NO 1 TO 27 + JUMPLE WRITE,BEG69A ;JUMP IF NOT DUMP COMMAND + ANDCAM WRITE,TAB+55(FILN) ;CLEAR MODE BIT,(WRITE)=1 + IORM WRITE,TAB+104(FILN) ;SET MODE BIT + +BEG69A: TRNE WRITE,4 ;SKIP IF MODIFY DIRECTORY (D,K,I) + SOJA F,LOADS ;ALL LOAD INSTRUCTIONS. F:=-1 + + +;DUMP WRITES OUT CORE ONTO TAPE + +;DUMP THRU DUMP2-1 SETS UP POINTERS TO NON-ZERO CORE AREAS. THESE +;AOBJN POINTERS ARE CALLED "HEADERS", AND PRECEDE THE DATA WHEN +;THE TAPE IS WRITTEN. THE DATA BLOCKS ARE EACH FOLLOWED BY A CHECKSUM. +;THE FIRST HEADER IS KEPT IN SPNT. SUCCESIVE HEADERS GO INTO THE FIRST +;ZERO WORD FOLLOWING THE BLOCK CORRESPONDING TO THE PREVIOUS HEADER. +;AFTER THE LAST NON-ZERO BLOCK IS (BY DEFINITION) A ZERO, WHICH +;TERMINATES THE HEADER LIST. THIS WORD MAY BE LOCATION FOOF (37176) IF +;CORE WAS FILLED UP TO THE BASE OF MACDMP. + +DUMP: ;HERE ON D,K,I. (BLKN)=0, FILN SET UP + MOVE A,[XWD LOW-HIGH,LOW] ;COUNTER TO EXAMINE + ;CORE FOR BLOCKS OF 0 + MOVEI CKS,SPNT ;FIRST HEADER GOES INTO SPNT +DMP1: SKIPE (A) ;FIND SOME NON-ZERO CORE + JRST DMP1C + AOBJN A,DMP1 ;ZERO. KEEP LOOKING. + TLNE A,-2 + JRST DMP1 +DMP1C: MOVEM A,D ;SAVE ADR +DMP1B: SKIPN (A) ;FIND SOME ZERO CORE + SKIPE 1(A) ;DON'T MAKE NEW BLOCK FOR 1 ZERO + CAIA + JRST DMP1A + AOBJN A,DMP1B ;NON-ZERO. KEEP LOOKING + TLNE A,-2 + JRST DMP1B +DMP1A: SUB D,A ;GET -COUNT IN BOTH HALVES OF D + ADDI D,(A) ;GET F.A. IN RH OF D + MOVEM D,(CKS) ;SAVE HEADER + MOVE CKS,A ;F.A.+W.C.IS ADR OF NEXT HEADER + ;I.E., FIRST 0 AFTER THE DATA + TLNE A,-1 + JRST DMP1 ;GET NEXT BLOCK IF MORE NON-ZERO CORE +DMP2: MOVE CKS,[JRST 1] ;OUTPUT A MAGIC WORD, SIMULATING + ;THE END OF THE DDT LOADER + MOVEI D,SPNT ;SET UP TO FOLLOW THE HEADERS. +DMP3A: JSP P,UWAIT ;START WRITING . THE POINTER IS IN + ;WORD FOLLOWING THE JSP. + JFCL CKS ;FIRST WORD TO LOOK LIKE END OF LOADER + ;ON SUCCESSIVE LOOPS, THIS OUTPUTS THE CKSM +DMP3: MOVE D,(D) ;GET HEADER + JUMPGE D,THRU ;IF NULL HEADER FOUND + SKIPA Q,LUP ;Q:= DMP3A AS A RETURN AFTER AOBJN +LODUMP: CAMN D,[JRST 1] ;LOAD COMMANDS ENTER HERE, TOO + TLO BLKNO,400000 ;JRST 1 DUMPED OR READ + JSP P,UWAIT + MOVE CKS,D ;IN/OUTPUT HEADER, ADD IT TO CKS + JUMPGE BLKNO,LODUMP ;WAIT FOR JRST 1 ON READS. + JUMPGE D,JBLK ;IF JRST BLOCK READ. CANT HAPPEN ON WRITE + JUMPGE CH,DMP5 ;IF NOT LOADING SYMS + HLRO P,D + ADD P,D + ADDB P,@DDT-1 ;COMPUTE LOAD ADR FOR SYMS AND UPDATE POINTER + HRR D,P +DMP5: ROT CKS,1 ;TRANSFER A DATA BLOCK + JSP P,UWAIT + ADD CKS,(D) ;IN/OUTPUT DATA WORD, AND CKSM IT + AOBJN D,DMP5 ;COUNT DOWN THE HEADER + TLNE D,-2 + JRST DMP5 + JRST (Q) ;END OF HEADER. TO DMP3A OR LOAD+1 + ;WRITE: 1=D 0=K -5=I -1=ELSE + +THRU: JUMPL WRITE,BEG + JSP P,UWAIT + TRZA WRITE,SADR ;OUTPUT JRST BLOCK, WRITE := 0 (WAS 1), THEN + ;CLEAR ANY FURTHER BLOCKS WITH THE + ;CURRENT FILE NUMBER (IF REUSING AN OLD NAME) +UWAIT: AOJL E,UWAIT1 ;RETURN ADDR = (P) DATA ADDR = @(P) + ;E IS -WD COUNT IN BLOCK OR POSITIVE + ;BYTE POINTER FIRST TIME THRU +MNLUP: AOSA BLKNO ;NEXT BLOCK IN THE DIRECTORY +MNLUP1: DPB B,PNTR ;FOR DELETE, 0 FILE NAME AND NUMBER + ILDB A,PNTR ;SEARCH FILE DIR + CAIN A,37 + JRST DELE ;END OF TAB MARKER, DELE GOES TO + ;CLSTP ON A "D" TO DUMP DIRECTORY + TLO A,-1(WRITE) ;0 ON D, -1 ON K OR K PHASE OF D + CAIE FILN,(A) ;IS THIS BLOCK ASSIGNED TO CURRENT FILE? + JUMPN A,MNLUP ;OR MAYBE FREE? JUMP IF IN USE BY + ;ANOTHER FILE. + DPB FILN,PNTR ;SMASH AWAY WRITE BLOCK ON D OR K. BUT + ;SEE MNLUP1 ON K. + JUMPE WRITE,MNLUP1 ;K COMMAND + + +;RBLK SEARCHES FOR THE BLOCK IN BLKNO, ENTERS IT GOING FORWARD, +;AND THEN READS INTO CORE, DUMPS CORE, OR COMPARES CORE AS +;DETERMINED BY CONTENTS OF WRITE. + +RBLK: HRRO C,TAPENO ;CURRENT TAPE NO. + ;SET LH TO PREPARE FOR JUMPN IN DELE +IFE MODE,[ + TRO B,-1 ;ENSURE GOING FORWARD WHEN FIRST SEARCH + CONSO DTC,300000 ;IS A DIRECTION ASSERTED? + TRO C,200000 ;NO. GO FORWARD +RB1: TRNN B,400001 ;DECIDE WHETHER TO TURN AROUND + TRO C,300000 ;TURN AROUND +RBG: CONO DTC,20200(C) ;ISSUE THE COMMAND TO TD10. + ;200=SEARCH, 300=READ, 700=WRITE. +UWAIT1: CONSZ DTS,672700 ;ANY ERRORS? + JRST ERR ;YES. GO DING AND THEN TYI + CONSO DTS,1 ;DATA READY? + JRST .-3 ;NO. GO WAIT SOME MORE + JUMPL E,INOUT(WRITE) ;IF IN MIDST OF A DT BLOCK, DISPATCH + DATAI DTC,B ;NO. SEARCHING. GET BLOCK NO. + TRZ C,300000 ;CLOBBER DIRECTION BITS IN CONO + SUBI B,(BLKNO) ;COMPARE WITH DESIRED BLOCK + CONSZ DTC,100000 ;COMPLEMENT DECISION IF GOING REVERSE + TRC B,-2 ;BIT 35 IS FOR TURNAROUND SPACE. +] +IFN MODE,[ + SETOB A,B ;GO FORWARD, SET DC FOR SEARCH + CONSZ UTS,40 ;IS CHECKSUM BEING WRITTEN? + JRST .-1 ;WAIT +RB1: TRNN B,400001 ;DECIDE WHETHER TO TURN AROUND + TRCA C,10000 ;CHANGE DIRECTION AND DELAY + CONSO UTC,200000 ;UNIT SELECTED? + TRO C,2000 ;INVOKE STARTUP DELAY +RBG: CONO UTC,220200(C) ;COMMAND TO THE 551. + ;200=SEARCH, 300=READ, 700=WRITE. + CONO DC,4011(A) ;COMMAND TO THE 136. +UWAIT1: CONSZ UTS,6 ;ANY ERRORS? + JRST ERR ;YES. GO DING AND THEN TYI + CONSO DC,1000 ;DATA READY? + JRST .-3 ;NO. WAIT SOME MORE + JUMPL E,INOUT(WRITE) ;IF IN MIDST OF A DT BLOCK, DISPATCH + DATAI DC,B ;NO. SEARCHING. GET BLOCK NUMBER + TRZ C,2000 ;DONT DELAY ANY MORE + SUBI B,(BLKNO) ;COMPARE WITH DESIRED BLOCK + TRNE C,10000 ;COMPLEMENT IF GOING REVERSE + TRC B,-2 ;BIT 35 IS FOR TURNAROUND SPACE. +] + JUMPN B,RB1 ;JUMP IF NOT GOING FORWARD INTO (BLKNO) + MOVNI E,200 ;WORDS PER BLOCK + TRO C,100 ;READ COMMAND, MAYBE + JUMPLE WRITE,RBG ;JUMP IF READ + TRO C,400 ;CHANGE TO WRITE COMMAND +IFN MODE,MOVNI A,401 ;SET 136 TO OUTPUT + JRST RBG ;AND GO PROCESS BLOCK. + +IFE MODE,[ + DATAI DTC,G ;THIS SEQUENCE FOR VERIFY ("I") + CAME G,@(P) ;CHECK WITH CORE + JRST ERR ;BAD COMPARE + JRST UWAIT2 ;OK + DATAI DTC,@(P) ;READ COMMANDS. GET WORD TO CORE +INOUT: JRST UWAIT2 ;INOUT-5 TO INOUT +1 ARE DISPATCHED TO. + DATAO DTC,@(P) ;OUTPUT TO TAPE +UWAIT2: AOJN E,UWAIT3 ;WAS THAT THE LAST WORD IN THE DT BLOCK? + CONO DTS,1 ;YES. GIVE FUNCTION STOP TO TD10 + CONSO DTS,100000 ;AND WAIT FOR CHECKSUM TO BE DONE + JRST .-1 ;NOT YET. WAIT +UWAIT3: SOJA E,0(P) ;DONE. COMPENSATE FOR THE AOJN ABOVE, AND + ;RETURN TO CALLER OF UWAIT OR RBLK +] + +IFN MODE,[ + DATAI DC,G ;THIS SEQUENCE FOR VERIFY ("I") + CAME G,@(P) ;CHECK WITH CORE + JRST ERR ;BAD COMPARE + JRST UWAIT2 ;OK + DATAI DC,@(P) ;READ COMMANDS. GET WORD TO CORE +INOUT: JRST UWAIT2 ;INOUT-5 THRU INOUT+1 ARE DISPATCHED TO. + DATAO DC,@(P) ;OUTPUT TO TAPE +UWAIT2: JRST 0(P) ;RETURN TO CALLER OF UWAIT OR RBLK. +] + +ALTMD: MOVEI A,"$ + JSP P,TYO ;ALTMODE IS PRINTED AS "$" + CAIE CH,"K-40 ;FOR K, WRITE := 0 + CAIN CH,"D-40 ;FOR D, WRITE :=1 + AOJLE WRITE,.-1 ;COUNT (WRITE) + CAIN CH,"G-40 ;GO TO PROGRAM? + JRST @SADR ;YES. JUMP OUT + CAIN CH,"F-40 ;FILE DIR PRINT? + JRST FDIR ;YES. PRINT FILE DIR OF THIS TAPE + CAIN CH,"I-40 ;CORE VS TAPE INTERROGATOR? + MOVNI WRITE,5 ;WRITE :=-5 FOR "I" + CAILE CH,27 ;SKIP IF OCTAL NUMBER + JRST TYI ;NO. GO PROCESS FILE NAME + LSH B,3 ;CONVERT SIXBIT TO OCTAL + LSHC F,3 ;F+1=B + JUMPN B,.-2 ;MAY BE MORE THAN 1 DIGIT (START ADR) + CAILE F,7 ;SKIP IF ONE DIGIT + JRA D,JBLK ;D:=SADR. DISPATCH TO JBLK WHICH SAVES SADR. +OPNTP: ;SHIFT UNIT NUMBER LEFT FOR CONO +IFE MODE, LSH F,11 +IFN MODE,LSH F,3 + MOVEM F,TAPENO ;SAVE IN CORE +IFE MODE, CONO DTC,10000 ;DESELECT OLD DRIVE +CLSTP: MOVEI BLKNO,100 ;BLK NO OF FILE DIR + JSP P,RBLK ;MOVE TO BLOCK 100 + JFCL TAB+200(E) ;READ OR WRITE DIR TAB AS DETERMINED BY WRITE + AOJL E,UWAIT1 ;COUNT THE 200 WORDS + JRST BEG ;GO ASK FOR NEXT COMMAND + + FDIR: MOVNI FILN,56 ;2*27(OCTAL) FILES. +FD2: JSP P,CRR ;CR-LF +FD3: AOJ FILN,207 ;USED FOR BELL TYPEOUT + SKIPN C,TAB+55(FILN) ;FIRST WORD OF NAME. IS IT BLANK? + AOJA C,FD1 ;YES. SET C=1 AND LOOP + JSP G,SIXBP ;PRINT FIRST WORD OF FILE NAME + MOVE C,TAB+56(FILN) ;SECOND WORD OF FILE NAME + JSP G,SIXBP ;PRINT AND CEAR C +FD1: AOJL FILN,FD2(C) ;CAN JUMP TO FD2 OR FD3. COUNT FILES. + JRST BEG ;ALL FILES PRINTED OR BLANK. RETURN. + +SIXBP: MOVNI B,7 ;SIXBP PRINTS C(C) IN 6BIT + ;AND APPENDS A SPACE + ;LEAVES (C)=0 +SIXBP1: MOVEI A,0 + LSHC A,6 + ADDI A,40 ;SIXBIT TO ASCII + JSP P,TYO ;TYPE OUT CHARACTER + AOJL B,SIXBP1 ;LOOP IF MORE CHARACTERS + JRST 0(G) ;RETURN + +SPNT: 0 ;POINTER TO HEADERS IN CORE. + + CONSTANTS + + SLOP=COMPTR-17-. ;THIS MANY WORDS BEFORE RESERVED AREA + ;FOR COMMAND STRINGS. + +INFORM ROOM AT TOP=,\ + + END BEGR + +  \ No newline at end of file diff --git a/src/mlsys/10dmp.12 b/src/mlsys/10dmp.12 new file mode 100644 index 00000000..c4072caa --- /dev/null +++ b/src/mlsys/10dmp.12 @@ -0,0 +1,409 @@ +;TITLE MACDMP - MAC DECTAPE UTILITY - R CLEMENTS 8 OCT 67 - V001 +MODE==0 + + IFE MODE,TITLE MACDMP TD10 TAPE CONTROL VERSION + IFN MODE,TITLE MACDMP 551/136 TAPE CONTROL VERSION + + NOSYMS + RIM10 +MEMSIZ==1000000 ;MOOOBY + + DTC=320 + DTS=324 + +F=0 ;MUST BE 0. USED BY JRA'S +A=2 ;MISC TEMP. HOLDS 136 CONO INDEX IN UWAIT +B=1 ;TEMP. HOLDS BLOCK # COMPUTATION IN SEARCH +C=3 ;HOLDS BITS FOR DECTAPE CONO DURING I/O +D=4 ;HOLDS POINTERS FOR AOBJN'S THROUGH CORE +E=5 ;HOLDS COUNT OF WORDS IN CURRENT DT BLOCK +P=6 ;PC FOR JSP'S +CKS=7 ;USUALLY CHECKSUM +FILN=10 ;NUMBER OF FILE IN DIRECTORY, 1 TO 27 OCTAL +BLKNO=11 ;BLOCK NUMBER SEARCHED FOR ON TAPE +WRITE=12 ;MULTI-STATE FLAG FOR DEFINING I/O OPERATION + ;1=D 0=K -5=I -1=ELSE +PNTR=13 ;POINTER TO BYTE TABLE IN DIRECTORY +CH=14 ;HOLDS 6BIT CHARACTER OF COMMAND, OR -1 +Q=15 ;ANOTHER JSP AC +G=16 ;RARELY USED VERY TEMP + +DDT=MEMSIZ-4000 ;LOCATION OF HIGH DDT, MAC VERSION. +COMPTR=MEMSIZ-1 ;COMMAND POINTER, IF SUPPLIED + +DEFINE INFORM A,B +IF2,[PRINTX \A!B +\] +TERMIN + + LOC MEMSIZ-602 + LOZAD=.-1 ;WHEN CORE IS CLEARED, IT + ;IS FROM 40 THRU LOZAD + LOW=20 ;FIRST LOCATION CONSIDERED FOR DUMPING + HIGH=.-1 ;LAST LOCATION CONSIDERED FOR DUMPING +FOOF: BLOCK 1 ;NEEDED FOR ZERO CORE SEARCH, ZEROED AT BEG1 +TAB: BLOCK 200 ;FILE DIRECTORY +TAPENO: BLOCK 1 ;TAPE UNIT SHIFTED LEFT FOR CONO + ;INITIAL ENTRY IS AT BEGR, UNLESS A COMMAND POINTER IS +;SUPPLIED IN COMPTR. IN THAT CASE, ENTRY IS AT BEGR+1 + +BEGR: SETZM COMPTR ;CLEAR ANY JUNK IN COMMAND POINTER + CONO 635550 ;I/O RESET, ETC. +BEG: JSP P,CRR ;TYPE A CR-LF + MOVEI D,SPNT-1 ;PREPARE TO REMOVE AOBJN POINTERS +BEG1: SETZB A,FOOF ;CLEAR A TO PUT IN CORE, CLEAR + ;FOOF FOR THE NEXT ZERO CORE SEARCH + EXCH A,1(D) ;REMOVE HEADER LIST + AOBJN A,. ;COUNT THROUGH TO NEXT HEADER + MOVEI D,-1(A) ;ACCOUNT FOR OVERSHOOT IN AOBJN + JUMPN D,BEG1 ;IF WE DIDNT AOBJN A 0, GO FOR NEXT HDR + MOVE PNTR,[XWD 500,TAB+55] ;5 BIT BYTES IN DIRECTORY + SETZB CH,F +CRCH: SETOI WRITE,215 ;USED FOR CARRET TYPEOUT +TYI: MOVSI B,400000 ;INIT FILE NAME TO @ @ +SPACE: EXCH C,B ;COPY FIRST WORD OF NAME TO C + MOVSI B,400000 ;PREPARE FOR SECOND WORD + MOVSI E,20600 ;FAKE OUT END-TEST OF BYTE POINTER +;STOP TAPE DRIVE +IFN MODE,CONO UTC,0 +IFE MODE,CONO DTC,400000 +NEXT: ILDB A,@BEGR ;GIVES A 0 UNLESS COMMAND POINTER SUPPLIED + ;RH OF NEXT IS USED AS A CONSTANT + JUMPN A,RCH ;JUMP IF COMMEND READ FROM CORE + MOVNI FILN,1 ;INITIALIZATION FOR SEARCH + MOVEI BLKNO,0 ; " + CONSO TTY,40 ;TYPEIN FLAG? + JRST .-1 ;NO,WAIT + DATAI TTY,A ;GET TYPED IN CHARACTER + JSP P,TYO ;ECHO IT (WITH PARITY) +RCH: ANDI A,177 ;STRIP OFF PARITY + CAIN A,177 ;RUBOUT? + JRST BEGR ;YES. RESTART MACDMP + CAIE A,33 ;NEW ALTMODE? + CAIL A,175 ;OR 175 OR 176 ALTMODES? + JRST ALTTST ;YES, SOME ALTMODE. + CAIL A,140 ;LOWER CASE CHARACTER? + TRZ A,40 ;YES. CHANGE TO UPPER CASE + SUBI A,40 ;CONVERT TO SIXBIT + JUMPL A,CARRET ;ANY CONTROL CHARACTER + JUMPE A,SPACE ;CHAR WAS 40 +NEXT1: TLNE E,770000 ;NO MORE THAN SIX CHARS + IDPB A,E ;GOES INTO AC1 = B + JRST NEXT ;GET ANOTHER CHARACTER + + +;HERE ON JUMP BLOCK DURING LOADS, OR NUMBER>7 ALT +JBLK: CAILE CH,"M-40 ;SKIP IF SYMS NOT NEEDED + JRA CH,LOAD ;F=0 C(CH)LT=0 C(F)=-1 +;STOP TAPE DRIVE +IFN MODE,CONO UTC,0 +IFE MODE,CONO DTC,400000 + JUMPL CH,DDTG ;IF SYMS JUST READ + HRRM D,SADR ;SAVE STARTING ADDRESS +;THE FOLLOWING CONDITIONAL ASSEMBLY ASSURES THAT THE +;TRZA INSTRUCTION AT THRU+2 WILL CLEAR BIT 35. +IFE .&1,[ JUMPN CH,BEG ;IF NOT LOADGO COMMAND +SADR: JRST BEG ;CURRENT S.A. +] +IFN .&1,[SADR: JUMPE CH,BEG + JRST BEG +] +DDTG: HRROS DDT-1 ;TELL DDT ITS SYMBOL TABLE WAS BUGGERED + JRST DDT ;AND GO TO DDT + +LOADS: ;HERE TO LOAD TAPE TO CORE, OR VERIFY + MOVEI D,LOZAD+1 ;FIRST LOC NOT TO ZERO + SETZM 40 ;A "FEATURE" + MOVE C,[XWD 40,41] ;PREPARE TO CLEAR CORE. + CAIN CH,"T-40 ;IF "T", DONT CLOBBER DDT SYMS OR DDT + MOVE D,@DDT-1 ;GET FIRST LOC OF DDT SYMS + TRNN CH,3 ;SKIP ON M,N,I NOT ON L,T,@ + BLT C,-1(D) ;ZERO CORE +LOAD: JSP Q,LODUMP ;START READING FILE. LODUMP PROCESSES + ;ONE HEADER AND ITS DATA + JSP P,UWAIT ;GET THE CHECKSUM OF THAT HEADER BLOCK + CAMN CKS,D ;CHECK CHECKSUM + JRST LOAD ;IF OK, GET NEXT BLOCK.(IF NONE, + ;LODUMP RETURNS TO JBLK.) +DELE: JUMPE C,BEG ;IF C IS ZERO, NO I/O WAS DONE. + ;I.E., A "K" COMMAND + SKIPN E,WRITE ;SKIP IF NOT IN THE K PHASE OF A D COMMAND. + ;ALSO, SET E =0, SO SEARCH HAPPENS IN RBLK + AOJA WRITE,CLSTP ; 0 TO 1. GO DUMP OUT DIRECTORY. +ERR: SKIPA P,NEXT ;SET TO RETURN TO BEGR +CRR: SKIPA A,CRCH ;LIKE HRROI A,215 AND SKIPA + SKIPA A,FD3 ;GET A BELL CHARACTER +TYO: SKIPN COMPTR ;DONT TYO IF NO TYI, UNLESS ERR + DATAO TTY,A ;TYPE OUT + CONSZ TTY,20 ;WAIT FOR TTY TO FINISH + JRST .-1 ;NOT YET + CAIE A,215 ;IF CR TYPED IN, + JUMPGE A,(P) ;OR SIGN BIT OF CHAR ON,(SEE CRR) + MOVEI A,12 ;APPEND A LINEFEED + JRST TYO ;GO TYPE LF + + ALTTST: TLNN B,4040 ;IF ALPHA CHARACTERS, DONT GET CH + LDB CH,E ;LAST CH BEFORE ALT, -40 + JUMPN CH,ALTMD ;IF CH NOT NULL, GOT PROCESS ALTMODE +CARRET: AOJE A,NEXT1 ;IGNORE A ^_ + MOVSI FILN,-30 ;FILE NAME SPECIFIED. FIRST THING TO + ;DO IS LOOK IT UP IN DIRECTORY +LUP: AOJ FILN,DMP3A ;RH COUNTS BY 2,LH BY 1. NOTE AOBJN + SKIPN TAB-1(FILN) ;SEARCH FOR FREE FILE + SKIPE BLKNO,TAB(FILN) ;CHECK BOTH WORDS + TDZA BLKNO,BLKNO ;ENSURE CLEAR BLOCK NMBER + HRRM FILN,FREE ;SAVE NUMBER OF A FREE FILE + CAMN C,TAB-1(FILN) ;SEARCH FOR TYPED-IN FILE + CAME B,TAB(FILN) ;BOTH WORDS + AOBJN FILN,LUP ;NOT THIS ONE. KEEP LOOKING + JUMPL FILN,BEG69 ;IF FILE FOUND, JUMP + JUMPLE WRITE,ERR ;IF NOT FOUND, BETTER BE DUMP +FREE: MOVEI FILN,. ;DUMP & NOT FOUND, MAKE ENTRY WHERE FREE + ;(ADDRESS MODIFIED ABOVE) + SKIPE TAB(FILN) ;MAKE SURE HOLE AVAILABLE + JRST ERR ;NO FREE SLOTS + +BEG69: SKIPN WRITE ;DELETE? (K COMMAND) + SETZB B,C ;YES, KILL FILE + MOVEM C,TAB-1(FILN) ;CLEAR IF DELE, ENTER IF NEW DUMP + MOVEM B,TAB(FILN) ;BOTH WORDS + MOVEI FILN,1(FILN) ;FILN IS (2*FILE #-1)+1, NOW +1 MORE + LSH FILN,-1 ;FORM DIR NO 1 TO 27 + JUMPLE WRITE,BEG69A ;JUMP IF NOT DUMP COMMAND + ANDCAM WRITE,TAB+55(FILN) ;CLEAR MODE BIT,(WRITE)=1 + IORM WRITE,TAB+104(FILN) ;SET MODE BIT + +BEG69A: TRNE WRITE,4 ;SKIP IF MODIFY DIRECTORY (D,K,I) + SOJA F,LOADS ;ALL LOAD INSTRUCTIONS. F:=-1 + + +;DUMP WRITES OUT CORE ONTO TAPE + +;DUMP THRU DUMP2-1 SETS UP POINTERS TO NON-ZERO CORE AREAS. THESE +;AOBJN POINTERS ARE CALLED "HEADERS", AND PRECEDE THE DATA WHEN +;THE TAPE IS WRITTEN. THE DATA BLOCKS ARE EACH FOLLOWED BY A CHECKSUM. +;THE FIRST HEADER IS KEPT IN SPNT. SUCCESIVE HEADERS GO INTO THE FIRST +;ZERO WORD FOLLOWING THE BLOCK CORRESPONDING TO THE PREVIOUS HEADER. +;AFTER THE LAST NON-ZERO BLOCK IS (BY DEFINITION) A ZERO, WHICH +;TERMINATES THE HEADER LIST. THIS WORD MAY BE LOCATION FOOF (37176) IF +;CORE WAS FILLED UP TO THE BASE OF MACDMP. + +DUMP: ;HERE ON D,K,I. (BLKN)=0, FILN SET UP + MOVE A,[XWD LOW-HIGH,LOW] ;COUNTER TO EXAMINE + ;CORE FOR BLOCKS OF 0 + MOVEI CKS,SPNT ;FIRST HEADER GOES INTO SPNT +DMP1: SKIPE (A) ;FIND SOME NON-ZERO CORE + JRST DMP1C + AOBJN A,DMP1 ;ZERO. KEEP LOOKING. + TLNE A,-2 + JRST DMP1 +DMP1C: MOVEM A,D ;SAVE ADR +DMP1B: SKIPN (A) ;FIND SOME ZERO CORE + SKIPE 1(A) ;DON'T MAKE NEW BLOCK FOR 1 ZERO + CAIA + JRST DMP1A + AOBJN A,DMP1B ;NON-ZERO. KEEP LOOKING +DMP1A: SUB D,A ;GET -COUNT IN BOTH HALVES OF D + ADDI D,(A) ;GET F.A. IN RH OF D + MOVEM D,(CKS) ;SAVE HEADER + MOVE CKS,A ;F.A.+W.C.IS ADR OF NEXT HEADER + ;I.E., FIRST 0 AFTER THE DATA + TLNE A,-1 + JRST DMP1 ;GET NEXT BLOCK IF MORE NON-ZERO CORE +DMP2: MOVE CKS,[JRST 1] ;OUTPUT A MAGIC WORD, SIMULATING + ;THE END OF THE DDT LOADER + MOVEI D,SPNT ;SET UP TO FOLLOW THE HEADERS. +DMP3A: JSP P,UWAIT ;START WRITING . THE POINTER IS IN + ;WORD FOLLOWING THE JSP. + JFCL CKS ;FIRST WORD TO LOOK LIKE END OF LOADER + ;ON SUCCESSIVE LOOPS, THIS OUTPUTS THE CKSM +DMP3: MOVE D,(D) ;GET HEADER + JUMPGE D,THRU ;IF NULL HEADER FOUND + SKIPA Q,LUP ;Q:= DMP3A AS A RETURN AFTER AOBJN +LODUMP: CAMN D,[JRST 1] ;LOAD COMMANDS ENTER HERE, TOO + TLO BLKNO,400000 ;JRST 1 DUMPED OR READ + JSP P,UWAIT + MOVE CKS,D ;IN/OUTPUT HEADER, ADD IT TO CKS + JUMPGE BLKNO,LODUMP ;WAIT FOR JRST 1 ON READS. + JUMPGE D,JBLK ;IF JRST BLOCK READ. CANT HAPPEN ON WRITE + JUMPGE CH,DMP5 ;IF NOT LOADING SYMS + HLRO P,D + ADD P,D + ADDB P,@DDT-1 ;COMPUTE LOAD ADR FOR SYMS AND UPDATE POINTER + HRR D,P +DMP5: ROT CKS,1 ;TRANSFER A DATA BLOCK + JSP P,UWAIT + ADD CKS,(D) ;IN/OUTPUT DATA WORD, AND CKSM IT + AOBJN D,DMP5 ;COUNT DOWN THE HEADER + TLNE D,-2 + JRST DMP5 + JRST (Q) ;END OF HEADER. TO DMP3A OR LOAD+1 + ;WRITE: 1=D 0=K -5=I -1=ELSE + +THRU: JUMPL WRITE,BEG + JSP P,UWAIT + TRZA WRITE,SADR ;OUTPUT JRST BLOCK, WRITE := 0 (WAS 1), THEN + ;CLEAR ANY FURTHER BLOCKS WITH THE + ;CURRENT FILE NUMBER (IF REUSING AN OLD NAME) +UWAIT: AOJL E,UWAIT1 ;RETURN ADDR = (P) DATA ADDR = @(P) + ;E IS -WD COUNT IN BLOCK OR POSITIVE + ;BYTE POINTER FIRST TIME THRU +MNLUP: AOSA BLKNO ;NEXT BLOCK IN THE DIRECTORY +MNLUP1: DPB B,PNTR ;FOR DELETE, 0 FILE NAME AND NUMBER + ILDB A,PNTR ;SEARCH FILE DIR + CAIN A,37 + JRST DELE ;END OF TAB MARKER, DELE GOES TO + ;CLSTP ON A "D" TO DUMP DIRECTORY + TLO A,-1(WRITE) ;0 ON D, -1 ON K OR K PHASE OF D + CAIE FILN,(A) ;IS THIS BLOCK ASSIGNED TO CURRENT FILE? + JUMPN A,MNLUP ;OR MAYBE FREE? JUMP IF IN USE BY + ;ANOTHER FILE. + DPB FILN,PNTR ;SMASH AWAY WRITE BLOCK ON D OR K. BUT + ;SEE MNLUP1 ON K. + JUMPE WRITE,MNLUP1 ;K COMMAND + + +;RBLK SEARCHES FOR THE BLOCK IN BLKNO, ENTERS IT GOING FORWARD, +;AND THEN READS INTO CORE, DUMPS CORE, OR COMPARES CORE AS +;DETERMINED BY CONTENTS OF WRITE. + +RBLK: HRRO C,TAPENO ;CURRENT TAPE NO. + ;SET LH TO PREPARE FOR JUMPN IN DELE +IFE MODE,[ + TRO B,-1 ;ENSURE GOING FORWARD WHEN FIRST SEARCH + CONSO DTC,300000 ;IS A DIRECTION ASSERTED? + TRO C,200000 ;NO. GO FORWARD +RB1: TRNN B,400001 ;DECIDE WHETHER TO TURN AROUND + TRO C,300000 ;TURN AROUND +RBG: CONO DTC,20200(C) ;ISSUE THE COMMAND TO TD10. + ;200=SEARCH, 300=READ, 700=WRITE. +UWAIT1: CONSZ DTS,672700 ;ANY ERRORS? + JRST ERR ;YES. GO DING AND THEN TYI + CONSO DTS,1 ;DATA READY? + JRST .-3 ;NO. GO WAIT SOME MORE + JUMPL E,INOUT(WRITE) ;IF IN MIDST OF A DT BLOCK, DISPATCH + DATAI DTC,B ;NO. SEARCHING. GET BLOCK NO. + TRZ C,300000 ;CLOBBER DIRECTION BITS IN CONO + SUBI B,(BLKNO) ;COMPARE WITH DESIRED BLOCK + CONSZ DTC,100000 ;COMPLEMENT DECISION IF GOING REVERSE + TRC B,-2 ;BIT 35 IS FOR TURNAROUND SPACE. +] +IFN MODE,[ + SETOB A,B ;GO FORWARD, SET DC FOR SEARCH + CONSZ UTS,40 ;IS CHECKSUM BEING WRITTEN? + JRST .-1 ;WAIT +RB1: TRNN B,400001 ;DECIDE WHETHER TO TURN AROUND + TRCA C,10000 ;CHANGE DIRECTION AND DELAY + CONSO UTC,200000 ;UNIT SELECTED? + TRO C,2000 ;INVOKE STARTUP DELAY +RBG: CONO UTC,220200(C) ;COMMAND TO THE 551. + ;200=SEARCH, 300=READ, 700=WRITE. + CONO DC,4011(A) ;COMMAND TO THE 136. +UWAIT1: CONSZ UTS,6 ;ANY ERRORS? + JRST ERR ;YES. GO DING AND THEN TYI + CONSO DC,1000 ;DATA READY? + JRST .-3 ;NO. WAIT SOME MORE + JUMPL E,INOUT(WRITE) ;IF IN MIDST OF A DT BLOCK, DISPATCH + DATAI DC,B ;NO. SEARCHING. GET BLOCK NUMBER + TRZ C,2000 ;DONT DELAY ANY MORE + SUBI B,(BLKNO) ;COMPARE WITH DESIRED BLOCK + TRNE C,10000 ;COMPLEMENT IF GOING REVERSE + TRC B,-2 ;BIT 35 IS FOR TURNAROUND SPACE. +] + JUMPN B,RB1 ;JUMP IF NOT GOING FORWARD INTO (BLKNO) + MOVNI E,200 ;WORDS PER BLOCK + TRO C,100 ;READ COMMAND, MAYBE + JUMPLE WRITE,RBG ;JUMP IF READ + TRO C,400 ;CHANGE TO WRITE COMMAND +IFN MODE,MOVNI A,401 ;SET 136 TO OUTPUT + JRST RBG ;AND GO PROCESS BLOCK. + +IFE MODE,[ + DATAI DTC,G ;THIS SEQUENCE FOR VERIFY ("I") + CAME G,@(P) ;CHECK WITH CORE + JRST ERR ;BAD COMPARE + JRST UWAIT2 ;OK + DATAI DTC,@(P) ;READ COMMANDS. GET WORD TO CORE +INOUT: JRST UWAIT2 ;INOUT-5 TO INOUT +1 ARE DISPATCHED TO. + DATAO DTC,@(P) ;OUTPUT TO TAPE +UWAIT2: AOJN E,UWAIT3 ;WAS THAT THE LAST WORD IN THE DT BLOCK? + CONO DTS,1 ;YES. GIVE FUNCTION STOP TO TD10 + CONSO DTS,100000 ;AND WAIT FOR CHECKSUM TO BE DONE + JRST .-1 ;NOT YET. WAIT +UWAIT3: SOJA E,0(P) ;DONE. COMPENSATE FOR THE AOJN ABOVE, AND + ;RETURN TO CALLER OF UWAIT OR RBLK +] + +IFN MODE,[ + DATAI DC,G ;THIS SEQUENCE FOR VERIFY ("I") + CAME G,@(P) ;CHECK WITH CORE + JRST ERR ;BAD COMPARE + JRST UWAIT2 ;OK + DATAI DC,@(P) ;READ COMMANDS. GET WORD TO CORE +INOUT: JRST UWAIT2 ;INOUT-5 THRU INOUT+1 ARE DISPATCHED TO. + DATAO DC,@(P) ;OUTPUT TO TAPE +UWAIT2: JRST 0(P) ;RETURN TO CALLER OF UWAIT OR RBLK. +] + +ALTMD: MOVEI A,"$ + JSP P,TYO ;ALTMODE IS PRINTED AS "$" + CAIE CH,"K-40 ;FOR K, WRITE := 0 + CAIN CH,"D-40 ;FOR D, WRITE :=1 + AOJLE WRITE,.-1 ;COUNT (WRITE) + CAIN CH,"G-40 ;GO TO PROGRAM? + JRST @SADR ;YES. JUMP OUT + CAIN CH,"F-40 ;FILE DIR PRINT? + JRST FDIR ;YES. PRINT FILE DIR OF THIS TAPE + CAIN CH,"I-40 ;CORE VS TAPE INTERROGATOR? + MOVNI WRITE,5 ;WRITE :=-5 FOR "I" + CAILE CH,27 ;SKIP IF OCTAL NUMBER + JRST TYI ;NO. GO PROCESS FILE NAME + LSH B,3 ;CONVERT SIXBIT TO OCTAL + LSHC F,3 ;F+1=B + JUMPN B,.-2 ;MAY BE MORE THAN 1 DIGIT (START ADR) + CAILE F,7 ;SKIP IF ONE DIGIT + JRA D,JBLK ;D:=SADR. DISPATCH TO JBLK WHICH SAVES SADR. +OPNTP: ;SHIFT UNIT NUMBER LEFT FOR CONO +IFE MODE, LSH F,11 +IFN MODE,LSH F,3 + MOVEM F,TAPENO ;SAVE IN CORE +IFE MODE, CONO DTC,10000 ;DESELECT OLD DRIVE +CLSTP: MOVEI BLKNO,100 ;BLK NO OF FILE DIR + JSP P,RBLK ;MOVE TO BLOCK 100 + JFCL TAB+200(E) ;READ OR WRITE DIR TAB AS DETERMINED BY WRITE + AOJL E,UWAIT1 ;COUNT THE 200 WORDS + JRST BEG ;GO ASK FOR NEXT COMMAND + + FDIR: MOVNI FILN,56 ;2*27(OCTAL) FILES. +FD2: JSP P,CRR ;CR-LF +FD3: AOJ FILN,207 ;USED FOR BELL TYPEOUT + SKIPN C,TAB+55(FILN) ;FIRST WORD OF NAME. IS IT BLANK? + AOJA C,FD1 ;YES. SET C=1 AND LOOP + JSP G,SIXBP ;PRINT FIRST WORD OF FILE NAME + MOVE C,TAB+56(FILN) ;SECOND WORD OF FILE NAME + JSP G,SIXBP ;PRINT AND CEAR C +FD1: AOJL FILN,FD2(C) ;CAN JUMP TO FD2 OR FD3. COUNT FILES. + JRST BEG ;ALL FILES PRINTED OR BLANK. RETURN. + +SIXBP: MOVNI B,7 ;SIXBP PRINTS C(C) IN 6BIT + ;AND APPENDS A SPACE + ;LEAVES (C)=0 +SIXBP1: MOVEI A,0 + LSHC A,6 + ADDI A,40 ;SIXBIT TO ASCII + JSP P,TYO ;TYPE OUT CHARACTER + AOJL B,SIXBP1 ;LOOP IF MORE CHARACTERS + JRST 0(G) ;RETURN + +SPNT: 0 ;POINTER TO HEADERS IN CORE. + + CONSTANTS + + SLOP=COMPTR-17-. ;THIS MANY WORDS BEFORE RESERVED AREA + ;FOR COMMAND STRINGS. + +INFORM ROOM AT TOP=,\ + + END BEGR + +  \ No newline at end of file diff --git a/src/mlsys/10dmp.13 b/src/mlsys/10dmp.13 new file mode 100644 index 00000000..9ec83b07 --- /dev/null +++ b/src/mlsys/10dmp.13 @@ -0,0 +1,413 @@ +;TITLE MACDMP - MAC DECTAPE UTILITY - R CLEMENTS 8 OCT 67 - V001 +MODE==0 + + IFE MODE,TITLE MACDMP TD10 TAPE CONTROL VERSION + IFN MODE,TITLE MACDMP 551/136 TAPE CONTROL VERSION + + NOSYMS + RIM10 +MEMSIZ==1000000 ;MOOOBY + + DTC=320 + DTS=324 + +F=0 ;MUST BE 0. USED BY JRA'S +A=2 ;MISC TEMP. HOLDS 136 CONO INDEX IN UWAIT +B=1 ;TEMP. HOLDS BLOCK # COMPUTATION IN SEARCH +C=3 ;HOLDS BITS FOR DECTAPE CONO DURING I/O +D=4 ;HOLDS POINTERS FOR AOBJN'S THROUGH CORE +E=5 ;HOLDS COUNT OF WORDS IN CURRENT DT BLOCK +P=6 ;PC FOR JSP'S +CKS=7 ;USUALLY CHECKSUM +FILN=10 ;NUMBER OF FILE IN DIRECTORY, 1 TO 27 OCTAL +BLKNO=11 ;BLOCK NUMBER SEARCHED FOR ON TAPE +WRITE=12 ;MULTI-STATE FLAG FOR DEFINING I/O OPERATION + ;1=D 0=K -5=I -1=ELSE +PNTR=13 ;POINTER TO BYTE TABLE IN DIRECTORY +CH=14 ;HOLDS 6BIT CHARACTER OF COMMAND, OR -1 +Q=15 ;ANOTHER JSP AC +G=16 ;RARELY USED VERY TEMP + +DDT=MEMSIZ-4000 ;LOCATION OF HIGH DDT, MAC VERSION. +COMPTR=MEMSIZ-1 ;COMMAND POINTER, IF SUPPLIED + +DEFINE INFORM A,B +IF2,[PRINTX \A!B +\] +TERMIN + + LOC MEMSIZ-602 + LOZAD=.-1 ;WHEN CORE IS CLEARED, IT + ;IS FROM 40 THRU LOZAD + LOW=20 ;FIRST LOCATION CONSIDERED FOR DUMPING + HIGH=.-1 ;LAST LOCATION CONSIDERED FOR DUMPING +FOOF: BLOCK 1 ;NEEDED FOR ZERO CORE SEARCH, ZEROED AT BEG1 +TAB: BLOCK 200 ;FILE DIRECTORY +TAPENO: BLOCK 1 ;TAPE UNIT SHIFTED LEFT FOR CONO + ;INITIAL ENTRY IS AT BEGR, UNLESS A COMMAND POINTER IS +;SUPPLIED IN COMPTR. IN THAT CASE, ENTRY IS AT BEGR+1 + +BEGR: SETZM COMPTR ;CLEAR ANY JUNK IN COMMAND POINTER + CONO 635550 ;I/O RESET, ETC. +BEG: JSP P,CRR ;TYPE A CR-LF + MOVEI D,SPNT-1 ;PREPARE TO REMOVE AOBJN POINTERS +BEG1: SETZB A,FOOF ;CLEAR A TO PUT IN CORE, CLEAR + ;FOOF FOR THE NEXT ZERO CORE SEARCH + EXCH A,1(D) ;REMOVE HEADER LIST + AOBJN A,. ;COUNT THROUGH TO NEXT HEADER + TLNE A,-2 + JRST .-2 + MOVEI D,-1(A) ;ACCOUNT FOR OVERSHOOT IN AOBJN + JUMPN D,BEG1 ;IF WE DIDNT AOBJN A 0, GO FOR NEXT HDR + MOVE PNTR,[XWD 500,TAB+55] ;5 BIT BYTES IN DIRECTORY + SETZB CH,F +CRCH: SETOI WRITE,215 ;USED FOR CARRET TYPEOUT +TYI: MOVSI B,400000 ;INIT FILE NAME TO @ @ +SPACE: EXCH C,B ;COPY FIRST WORD OF NAME TO C + MOVSI B,400000 ;PREPARE FOR SECOND WORD + MOVSI E,20600 ;FAKE OUT END-TEST OF BYTE POINTER +;STOP TAPE DRIVE +IFN MODE,CONO UTC,0 +IFE MODE,CONO DTC,400000 +NEXT: ILDB A,@BEGR ;GIVES A 0 UNLESS COMMAND POINTER SUPPLIED + ;RH OF NEXT IS USED AS A CONSTANT + JUMPN A,RCH ;JUMP IF COMMEND READ FROM CORE + MOVNI FILN,1 ;INITIALIZATION FOR SEARCH + MOVEI BLKNO,0 ; " + CONSO TTY,40 ;TYPEIN FLAG? + JRST .-1 ;NO,WAIT + DATAI TTY,A ;GET TYPED IN CHARACTER + JSP P,TYO ;ECHO IT (WITH PARITY) +RCH: ANDI A,177 ;STRIP OFF PARITY + CAIN A,177 ;RUBOUT? + JRST BEGR ;YES. RESTART MACDMP + CAIE A,33 ;NEW ALTMODE? + CAIL A,175 ;OR 175 OR 176 ALTMODES? + JRST ALTTST ;YES, SOME ALTMODE. + CAIL A,140 ;LOWER CASE CHARACTER? + TRZ A,40 ;YES. CHANGE TO UPPER CASE + SUBI A,40 ;CONVERT TO SIXBIT + JUMPL A,CARRET ;ANY CONTROL CHARACTER + JUMPE A,SPACE ;CHAR WAS 40 +NEXT1: TLNE E,770000 ;NO MORE THAN SIX CHARS + IDPB A,E ;GOES INTO AC1 = B + JRST NEXT ;GET ANOTHER CHARACTER + + +;HERE ON JUMP BLOCK DURING LOADS, OR NUMBER>7 ALT +JBLK: CAILE CH,"M-40 ;SKIP IF SYMS NOT NEEDED + JRA CH,LOAD ;F=0 C(CH)LT=0 C(F)=-1 +;STOP TAPE DRIVE +IFN MODE,CONO UTC,0 +IFE MODE,CONO DTC,400000 + JUMPL CH,DDTG ;IF SYMS JUST READ + HRRM D,SADR ;SAVE STARTING ADDRESS +;THE FOLLOWING CONDITIONAL ASSEMBLY ASSURES THAT THE +;TRZA INSTRUCTION AT THRU+2 WILL CLEAR BIT 35. +IFE .&1,[ JUMPN CH,BEG ;IF NOT LOADGO COMMAND +SADR: JRST BEG ;CURRENT S.A. +] +IFN .&1,[SADR: JUMPE CH,BEG + JRST BEG +] +DDTG: HRROS DDT-1 ;TELL DDT ITS SYMBOL TABLE WAS BUGGERED + JRST DDT ;AND GO TO DDT + +LOADS: ;HERE TO LOAD TAPE TO CORE, OR VERIFY + MOVEI D,LOZAD+1 ;FIRST LOC NOT TO ZERO + SETZM 40 ;A "FEATURE" + MOVE C,[XWD 40,41] ;PREPARE TO CLEAR CORE. + CAIN CH,"T-40 ;IF "T", DONT CLOBBER DDT SYMS OR DDT + MOVE D,@DDT-1 ;GET FIRST LOC OF DDT SYMS + TRNN CH,3 ;SKIP ON M,N,I NOT ON L,T,@ + BLT C,-1(D) ;ZERO CORE +LOAD: JSP Q,LODUMP ;START READING FILE. LODUMP PROCESSES + ;ONE HEADER AND ITS DATA + JSP P,UWAIT ;GET THE CHECKSUM OF THAT HEADER BLOCK + CAMN CKS,D ;CHECK CHECKSUM + JRST LOAD ;IF OK, GET NEXT BLOCK.(IF NONE, + ;LODUMP RETURNS TO JBLK.) +DELE: JUMPE C,BEG ;IF C IS ZERO, NO I/O WAS DONE. + ;I.E., A "K" COMMAND + SKIPN E,WRITE ;SKIP IF NOT IN THE K PHASE OF A D COMMAND. + ;ALSO, SET E =0, SO SEARCH HAPPENS IN RBLK + AOJA WRITE,CLSTP ; 0 TO 1. GO DUMP OUT DIRECTORY. +ERR: SKIPA P,NEXT ;SET TO RETURN TO BEGR +CRR: SKIPA A,CRCH ;LIKE HRROI A,215 AND SKIPA + SKIPA A,FD3 ;GET A BELL CHARACTER +TYO: SKIPN COMPTR ;DONT TYO IF NO TYI, UNLESS ERR + DATAO TTY,A ;TYPE OUT + CONSZ TTY,20 ;WAIT FOR TTY TO FINISH + JRST .-1 ;NOT YET + CAIE A,215 ;IF CR TYPED IN, + JUMPGE A,(P) ;OR SIGN BIT OF CHAR ON,(SEE CRR) + MOVEI A,12 ;APPEND A LINEFEED + JRST TYO ;GO TYPE LF + + ALTTST: TLNN B,4040 ;IF ALPHA CHARACTERS, DONT GET CH + LDB CH,E ;LAST CH BEFORE ALT, -40 + JUMPN CH,ALTMD ;IF CH NOT NULL, GOT PROCESS ALTMODE +CARRET: AOJE A,NEXT1 ;IGNORE A ^_ + MOVSI FILN,-30 ;FILE NAME SPECIFIED. FIRST THING TO + ;DO IS LOOK IT UP IN DIRECTORY +LUP: AOJ FILN,DMP3A ;RH COUNTS BY 2,LH BY 1. NOTE AOBJN + SKIPN TAB-1(FILN) ;SEARCH FOR FREE FILE + SKIPE BLKNO,TAB(FILN) ;CHECK BOTH WORDS + TDZA BLKNO,BLKNO ;ENSURE CLEAR BLOCK NMBER + HRRM FILN,FREE ;SAVE NUMBER OF A FREE FILE + CAMN C,TAB-1(FILN) ;SEARCH FOR TYPED-IN FILE + CAME B,TAB(FILN) ;BOTH WORDS + AOBJN FILN,LUP ;NOT THIS ONE. KEEP LOOKING + JUMPL FILN,BEG69 ;IF FILE FOUND, JUMP + JUMPLE WRITE,ERR ;IF NOT FOUND, BETTER BE DUMP +FREE: MOVEI FILN,. ;DUMP & NOT FOUND, MAKE ENTRY WHERE FREE + ;(ADDRESS MODIFIED ABOVE) + SKIPE TAB(FILN) ;MAKE SURE HOLE AVAILABLE + JRST ERR ;NO FREE SLOTS + +BEG69: SKIPN WRITE ;DELETE? (K COMMAND) + SETZB B,C ;YES, KILL FILE + MOVEM C,TAB-1(FILN) ;CLEAR IF DELE, ENTER IF NEW DUMP + MOVEM B,TAB(FILN) ;BOTH WORDS + MOVEI FILN,1(FILN) ;FILN IS (2*FILE #-1)+1, NOW +1 MORE + LSH FILN,-1 ;FORM DIR NO 1 TO 27 + JUMPLE WRITE,BEG69A ;JUMP IF NOT DUMP COMMAND + ANDCAM WRITE,TAB+55(FILN) ;CLEAR MODE BIT,(WRITE)=1 + IORM WRITE,TAB+104(FILN) ;SET MODE BIT + +BEG69A: TRNE WRITE,4 ;SKIP IF MODIFY DIRECTORY (D,K,I) + SOJA F,LOADS ;ALL LOAD INSTRUCTIONS. F:=-1 + + +;DUMP WRITES OUT CORE ONTO TAPE + +;DUMP THRU DUMP2-1 SETS UP POINTERS TO NON-ZERO CORE AREAS. THESE +;AOBJN POINTERS ARE CALLED "HEADERS", AND PRECEDE THE DATA WHEN +;THE TAPE IS WRITTEN. THE DATA BLOCKS ARE EACH FOLLOWED BY A CHECKSUM. +;THE FIRST HEADER IS KEPT IN SPNT. SUCCESIVE HEADERS GO INTO THE FIRST +;ZERO WORD FOLLOWING THE BLOCK CORRESPONDING TO THE PREVIOUS HEADER. +;AFTER THE LAST NON-ZERO BLOCK IS (BY DEFINITION) A ZERO, WHICH +;TERMINATES THE HEADER LIST. THIS WORD MAY BE LOCATION FOOF (37176) IF +;CORE WAS FILLED UP TO THE BASE OF MACDMP. + +DUMP: ;HERE ON D,K,I. (BLKN)=0, FILN SET UP + MOVE A,[XWD LOW-HIGH,LOW] ;COUNTER TO EXAMINE + ;CORE FOR BLOCKS OF 0 + MOVEI CKS,SPNT ;FIRST HEADER GOES INTO SPNT +DMP1: SKIPE (A) ;FIND SOME NON-ZERO CORE + JRST DMP1C + AOBJN A,DMP1 ;ZERO. KEEP LOOKING. + TLNE A,-2 + JRST DMP1 +DMP1C: MOVEM A,D ;SAVE ADR +DMP1B: SKIPN (A) ;FIND SOME ZERO CORE + SKIPE 1(A) ;DON'T MAKE NEW BLOCK FOR 1 ZERO + CAIA + JRST DMP1A + AOBJN A,DMP1B ;NON-ZERO. KEEP LOOKING + TLNE A,-2 + JRST DMP1B +DMP1A: SUB D,A ;GET -COUNT IN BOTH HALVES OF D + ADDI D,(A) ;GET F.A. IN RH OF D + MOVEM D,(CKS) ;SAVE HEADER + MOVE CKS,A ;F.A.+W.C.IS ADR OF NEXT HEADER + ;I.E., FIRST 0 AFTER THE DATA + TLNE A,-1 + JRST DMP1 ;GET NEXT BLOCK IF MORE NON-ZERO CORE +DMP2: MOVE CKS,[JRST 1] ;OUTPUT A MAGIC WORD, SIMULATING + ;THE END OF THE DDT LOADER + MOVEI D,SPNT ;SET UP TO FOLLOW THE HEADERS. +DMP3A: JSP P,UWAIT ;START WRITING . THE POINTER IS IN + ;WORD FOLLOWING THE JSP. + JFCL CKS ;FIRST WORD TO LOOK LIKE END OF LOADER + ;ON SUCCESSIVE LOOPS, THIS OUTPUTS THE CKSM +DMP3: MOVE D,(D) ;GET HEADER + JUMPGE D,THRU ;IF NULL HEADER FOUND + SKIPA Q,LUP ;Q:= DMP3A AS A RETURN AFTER AOBJN +LODUMP: CAMN D,[JRST 1] ;LOAD COMMANDS ENTER HERE, TOO + TLO BLKNO,400000 ;JRST 1 DUMPED OR READ + JSP P,UWAIT + MOVE CKS,D ;IN/OUTPUT HEADER, ADD IT TO CKS + JUMPGE BLKNO,LODUMP ;WAIT FOR JRST 1 ON READS. + JUMPGE D,JBLK ;IF JRST BLOCK READ. CANT HAPPEN ON WRITE + JUMPGE CH,DMP5 ;IF NOT LOADING SYMS + HLRO P,D + ADD P,D + ADDB P,@DDT-1 ;COMPUTE LOAD ADR FOR SYMS AND UPDATE POINTER + HRR D,P +DMP5: ROT CKS,1 ;TRANSFER A DATA BLOCK + JSP P,UWAIT + ADD CKS,(D) ;IN/OUTPUT DATA WORD, AND CKSM IT + AOBJN D,DMP5 ;COUNT DOWN THE HEADER + TLNE D,-2 + JRST DMP5 + JRST (Q) ;END OF HEADER. TO DMP3A OR LOAD+1 + ;WRITE: 1=D 0=K -5=I -1=ELSE + +THRU: JUMPL WRITE,BEG + JSP P,UWAIT + TRZA WRITE,SADR ;OUTPUT JRST BLOCK, WRITE := 0 (WAS 1), THEN + ;CLEAR ANY FURTHER BLOCKS WITH THE + ;CURRENT FILE NUMBER (IF REUSING AN OLD NAME) +UWAIT: AOJL E,UWAIT1 ;RETURN ADDR = (P) DATA ADDR = @(P) + ;E IS -WD COUNT IN BLOCK OR POSITIVE + ;BYTE POINTER FIRST TIME THRU +MNLUP: AOSA BLKNO ;NEXT BLOCK IN THE DIRECTORY +MNLUP1: DPB B,PNTR ;FOR DELETE, 0 FILE NAME AND NUMBER + ILDB A,PNTR ;SEARCH FILE DIR + CAIN A,37 + JRST DELE ;END OF TAB MARKER, DELE GOES TO + ;CLSTP ON A "D" TO DUMP DIRECTORY + TLO A,-1(WRITE) ;0 ON D, -1 ON K OR K PHASE OF D + CAIE FILN,(A) ;IS THIS BLOCK ASSIGNED TO CURRENT FILE? + JUMPN A,MNLUP ;OR MAYBE FREE? JUMP IF IN USE BY + ;ANOTHER FILE. + DPB FILN,PNTR ;SMASH AWAY WRITE BLOCK ON D OR K. BUT + ;SEE MNLUP1 ON K. + JUMPE WRITE,MNLUP1 ;K COMMAND + + +;RBLK SEARCHES FOR THE BLOCK IN BLKNO, ENTERS IT GOING FORWARD, +;AND THEN READS INTO CORE, DUMPS CORE, OR COMPARES CORE AS +;DETERMINED BY CONTENTS OF WRITE. + +RBLK: HRRO C,TAPENO ;CURRENT TAPE NO. + ;SET LH TO PREPARE FOR JUMPN IN DELE +IFE MODE,[ + TRO B,-1 ;ENSURE GOING FORWARD WHEN FIRST SEARCH + CONSO DTC,300000 ;IS A DIRECTION ASSERTED? + TRO C,200000 ;NO. GO FORWARD +RB1: TRNN B,400001 ;DECIDE WHETHER TO TURN AROUND + TRO C,300000 ;TURN AROUND +RBG: CONO DTC,20200(C) ;ISSUE THE COMMAND TO TD10. + ;200=SEARCH, 300=READ, 700=WRITE. +UWAIT1: CONSZ DTS,672700 ;ANY ERRORS? + JRST ERR ;YES. GO DING AND THEN TYI + CONSO DTS,1 ;DATA READY? + JRST .-3 ;NO. GO WAIT SOME MORE + JUMPL E,INOUT(WRITE) ;IF IN MIDST OF A DT BLOCK, DISPATCH + DATAI DTC,B ;NO. SEARCHING. GET BLOCK NO. + TRZ C,300000 ;CLOBBER DIRECTION BITS IN CONO + SUBI B,(BLKNO) ;COMPARE WITH DESIRED BLOCK + CONSZ DTC,100000 ;COMPLEMENT DECISION IF GOING REVERSE + TRC B,-2 ;BIT 35 IS FOR TURNAROUND SPACE. +] +IFN MODE,[ + SETOB A,B ;GO FORWARD, SET DC FOR SEARCH + CONSZ UTS,40 ;IS CHECKSUM BEING WRITTEN? + JRST .-1 ;WAIT +RB1: TRNN B,400001 ;DECIDE WHETHER TO TURN AROUND + TRCA C,10000 ;CHANGE DIRECTION AND DELAY + CONSO UTC,200000 ;UNIT SELECTED? + TRO C,2000 ;INVOKE STARTUP DELAY +RBG: CONO UTC,220200(C) ;COMMAND TO THE 551. + ;200=SEARCH, 300=READ, 700=WRITE. + CONO DC,4011(A) ;COMMAND TO THE 136. +UWAIT1: CONSZ UTS,6 ;ANY ERRORS? + JRST ERR ;YES. GO DING AND THEN TYI + CONSO DC,1000 ;DATA READY? + JRST .-3 ;NO. WAIT SOME MORE + JUMPL E,INOUT(WRITE) ;IF IN MIDST OF A DT BLOCK, DISPATCH + DATAI DC,B ;NO. SEARCHING. GET BLOCK NUMBER + TRZ C,2000 ;DONT DELAY ANY MORE + SUBI B,(BLKNO) ;COMPARE WITH DESIRED BLOCK + TRNE C,10000 ;COMPLEMENT IF GOING REVERSE + TRC B,-2 ;BIT 35 IS FOR TURNAROUND SPACE. +] + JUMPN B,RB1 ;JUMP IF NOT GOING FORWARD INTO (BLKNO) + MOVNI E,200 ;WORDS PER BLOCK + TRO C,100 ;READ COMMAND, MAYBE + JUMPLE WRITE,RBG ;JUMP IF READ + TRO C,400 ;CHANGE TO WRITE COMMAND +IFN MODE,MOVNI A,401 ;SET 136 TO OUTPUT + JRST RBG ;AND GO PROCESS BLOCK. + +IFE MODE,[ + DATAI DTC,G ;THIS SEQUENCE FOR VERIFY ("I") + CAME G,@(P) ;CHECK WITH CORE + JRST ERR ;BAD COMPARE + JRST UWAIT2 ;OK + DATAI DTC,@(P) ;READ COMMANDS. GET WORD TO CORE +INOUT: JRST UWAIT2 ;INOUT-5 TO INOUT +1 ARE DISPATCHED TO. + DATAO DTC,@(P) ;OUTPUT TO TAPE +UWAIT2: AOJN E,UWAIT3 ;WAS THAT THE LAST WORD IN THE DT BLOCK? + CONO DTS,1 ;YES. GIVE FUNCTION STOP TO TD10 + CONSO DTS,100000 ;AND WAIT FOR CHECKSUM TO BE DONE + JRST .-1 ;NOT YET. WAIT +UWAIT3: SOJA E,0(P) ;DONE. COMPENSATE FOR THE AOJN ABOVE, AND + ;RETURN TO CALLER OF UWAIT OR RBLK +] + +IFN MODE,[ + DATAI DC,G ;THIS SEQUENCE FOR VERIFY ("I") + CAME G,@(P) ;CHECK WITH CORE + JRST ERR ;BAD COMPARE + JRST UWAIT2 ;OK + DATAI DC,@(P) ;READ COMMANDS. GET WORD TO CORE +INOUT: JRST UWAIT2 ;INOUT-5 THRU INOUT+1 ARE DISPATCHED TO. + DATAO DC,@(P) ;OUTPUT TO TAPE +UWAIT2: JRST 0(P) ;RETURN TO CALLER OF UWAIT OR RBLK. +] + +ALTMD: MOVEI A,"$ + JSP P,TYO ;ALTMODE IS PRINTED AS "$" + CAIE CH,"K-40 ;FOR K, WRITE := 0 + CAIN CH,"D-40 ;FOR D, WRITE :=1 + AOJLE WRITE,.-1 ;COUNT (WRITE) + CAIN CH,"G-40 ;GO TO PROGRAM? + JRST @SADR ;YES. JUMP OUT + CAIN CH,"F-40 ;FILE DIR PRINT? + JRST FDIR ;YES. PRINT FILE DIR OF THIS TAPE + CAIN CH,"I-40 ;CORE VS TAPE INTERROGATOR? + MOVNI WRITE,5 ;WRITE :=-5 FOR "I" + CAILE CH,27 ;SKIP IF OCTAL NUMBER + JRST TYI ;NO. GO PROCESS FILE NAME + LSH B,3 ;CONVERT SIXBIT TO OCTAL + LSHC F,3 ;F+1=B + JUMPN B,.-2 ;MAY BE MORE THAN 1 DIGIT (START ADR) + CAILE F,7 ;SKIP IF ONE DIGIT + JRA D,JBLK ;D:=SADR. DISPATCH TO JBLK WHICH SAVES SADR. +OPNTP: ;SHIFT UNIT NUMBER LEFT FOR CONO +IFE MODE, LSH F,11 +IFN MODE,LSH F,3 + MOVEM F,TAPENO ;SAVE IN CORE +IFE MODE, CONO DTC,10000 ;DESELECT OLD DRIVE +CLSTP: MOVEI BLKNO,100 ;BLK NO OF FILE DIR + JSP P,RBLK ;MOVE TO BLOCK 100 + JFCL TAB+200(E) ;READ OR WRITE DIR TAB AS DETERMINED BY WRITE + AOJL E,UWAIT1 ;COUNT THE 200 WORDS + JRST BEG ;GO ASK FOR NEXT COMMAND + + FDIR: MOVNI FILN,56 ;2*27(OCTAL) FILES. +FD2: JSP P,CRR ;CR-LF +FD3: AOJ FILN,207 ;USED FOR BELL TYPEOUT + SKIPN C,TAB+55(FILN) ;FIRST WORD OF NAME. IS IT BLANK? + AOJA C,FD1 ;YES. SET C=1 AND LOOP + JSP G,SIXBP ;PRINT FIRST WORD OF FILE NAME + MOVE C,TAB+56(FILN) ;SECOND WORD OF FILE NAME + JSP G,SIXBP ;PRINT AND CEAR C +FD1: AOJL FILN,FD2(C) ;CAN JUMP TO FD2 OR FD3. COUNT FILES. + JRST BEG ;ALL FILES PRINTED OR BLANK. RETURN. + +SIXBP: MOVNI B,7 ;SIXBP PRINTS C(C) IN 6BIT + ;AND APPENDS A SPACE + ;LEAVES (C)=0 +SIXBP1: MOVEI A,0 + LSHC A,6 + ADDI A,40 ;SIXBIT TO ASCII + JSP P,TYO ;TYPE OUT CHARACTER + AOJL B,SIXBP1 ;LOOP IF MORE CHARACTERS + JRST 0(G) ;RETURN + +SPNT: 0 ;POINTER TO HEADERS IN CORE. + + CONSTANTS + + SLOP=COMPTR-17-. ;THIS MANY WORDS BEFORE RESERVED AREA + ;FOR COMMAND STRINGS. + +INFORM ROOM AT TOP=,\ + + END BEGR + +  \ No newline at end of file diff --git a/src/mlsys/boot.1 b/src/mlsys/boot.1 new file mode 100644 index 00000000..a86a4316 --- /dev/null +++ b/src/mlsys/boot.1 @@ -0,0 +1,43 @@ + + +TITLE DBOOT + +RIM10 +NOSYMS +B==2 +ICWA==30 + +MEMSIZ==1000000 + +.INSRT MLSYS;MDSK > + +LOC MEMSIZ-100 + +BOOT: CONSZ DPC,BUSY + JRST .-1 + MOVEI B,ICWA+2 ;SET UP CHANNEL PROG + MOVEM B,ICWA + SETZM ICWA+1 + SETZM ICWA+3 + DATAO DPC,CLATT1 + MOVE B,ERRWD + MOVEM B,@ICWA + DATAO DPC,SWPSK + CONSO DPC,DONE + JRST .-1 + DATAO DPC,SWPIN1 + CONSO DPC,DONE + JRST .-1 + DATAO DPC,SWPIN2 + CONSO DPC,DONE + JRST .-1 + JRST 4,. ;SHOULD BE CLOBBERED + +ERRWD: -2000,,MEMSIZ-2000-1 +CLATT1: DEASEC ALLATT +SWPSK: DSEEKC+200._22. +SWPIN1: DWRITC+200._22.+3_17.+6._12.+ICWA ;NBLKS 4 +SWPIN2: DREADC+200._22.+5_17.+4._12.+ICWA ;NBLKS 6 + +END BOOT +  \ No newline at end of file diff --git a/src/mlsys/boot.2 b/src/mlsys/boot.2 new file mode 100644 index 00000000..a30d70aa --- /dev/null +++ b/src/mlsys/boot.2 @@ -0,0 +1,44 @@ + + +TITLE DBOOT + +RIM10 +NOSYMS +B==2 +ICWA==30 + +MEMSIZ==1000000 + +.INSRT MLSYS;MDSK > + +LOC MEMSIZ-100 + +BOOT: CLEARM MEMSIZ-1 + CONSZ DPC,BUSY + JRST .-1 + MOVEI B,ICWA+2 ;SET UP CHANNEL PROG + MOVEM B,ICWA + SETZM ICWA+1 + SETZM ICWA+3 + DATAO DPC,CLATT1 + MOVE B,ERRWD + MOVEM B,@ICWA + DATAO DPC,SWPSK + CONSO DPC,DONE + JRST .-1 + DATAO DPC,SWPIN1 + CONSO DPC,DONE + JRST .-1 + DATAO DPC,SWPIN2 + CONSO DPC,DONE + JRST .-1 + JRST 4,. ;SHOULD BE CLOBBERED + +ERRWD: -2000,,MEMSIZ-2000-1 +CLATT1: DEASEC ALLATT +SWPSK: DSEEKC+200._22. +SWPIN1: DWRITC+200._22.+3_17.+6._12.+ICWA ;NBLKS 4 +SWPIN2: DREADC+200._22.+5_17.+4._12.+ICWA ;NBLKS 6 + +END BOOT +  \ No newline at end of file diff --git a/src/mlsys/decdsk.bin b/src/mlsys/decdsk.bin new file mode 100644 index 0000000000000000000000000000000000000000..43a9c775325a0ca887369a1b589cafcf1244d9b0 GIT binary patch literal 7857 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 UlBpetH+wdXy?|t5GQU9nFXVg{H~;_u literal 0 HcmV?d00001 diff --git a/src/mlsys/decdsk.dmp108 b/src/mlsys/decdsk.dmp108 new file mode 100644 index 00000000..f3c84b50 --- /dev/null +++ b/src/mlsys/decdsk.dmp108 @@ -0,0 +1,892 @@ + +TITLE DSKDMP +C=1 ;C-A-B FOR LINKS +A=2 +B=3 +D=4 +BLKIN=5 ;PSEUDO-CORE BLOCK IN CBUF +WRITE=6 ;NEG MEANS DUMP, RH 0 OR WRBIT +DIFF=7 ;DIFF CONO ALSO TEMP +HEAD=10 ;HEAD CONO ALSO TEMP +P=11 ;JSP AC +BLOK=12 +UNIT=13 ;UNIT AND M.A. DATAO +CMD=14 ;COMMAND CHAR +T=15 ;VERY TEMP +TT=16 ;ANOTHER JSP AC, ALSO VERY TEMP +BUFP=17 ;DBUF PNTR--LAST WORD USED + +.INSRT DSKDMP SWITCH +.INSRT MDSK > +.INSRT MFSDFS > +NDSK==2 +ICWA=30 + +LPM=102000,, +LPMR= LPM 2, + +DDT==MEMSIZ-4000 +IFN DBGSW,MEMSIZ==MEMSIZ-10000 ;MOVE DOWN UNDER DDT IF DEBUG MODE +CORE==MEMSIZ-12000 ;HIGHEST ADR ALWAYS IN CORE+1 +CORES==CORE_<-12> ;BLK # OF ABOVE (FIRST OF 4 BLKS SWAPPED OUT FOR BUFFER AREAS) +HIGH==MEMSIZ-100 ;HIGHEST ADR LOADED/DUMPED+1 +CBLK==NBLKS ;DPC ADR WHERE "CORE" BLK IS SAVED + + +ZZZ: IFE DBGSW,[ + MOVE T,.... ;THIS CODE BLTS THE FOLLOWING OFFSET CODE + BLT T,MEMSIZ-1-1 ;INTO HIGH MEMORY AND WRITES DSKDMP ON ITS + MOVE T,PROG+MEMSIZ-2-ERROR+1 + MOVEM T,ERROR+MEMSIZ-2-ERROR+1 ;AVOID LOSING DUE TO -1 BLT LOSSAGE +] + MOVEI T,ICWA+2 ;SET UP CHANNEL JUMP + MOVEM T,ICWA ;IN INITIAL CHANNEL ADDRESS + SETZM ICWA+1 ;AND CLEAR REMAINING STUFF + SETZM ICWA+3 + MOVSI T,-NDSK + SETZM QDED(T) + AOBJN T,.-1 ;ALL UNITS ON LINE + MOVEI UNIT,ERROR ;MAGIC BLOCK THEN STARTS IT + MOVEI BLOK,NBLKS+5 + MOVEI WRITE,10 + JSP TT,WRD3 + MOVEI BLOK,NBLKS+6 + MOVEI WRITE,10 + JSP TT,WRD3 + CONSZ DPC,ALLER +IFN DBGSW,JRST DDT +IFE DBGSW,JRST 4,ZZZ + JRST BEG + + +IFE DBGSW,[ +....: PROG,,ERROR + +LOC 2000 ;MAKE OFFSET CONVENIENT +PROG: OFFSET CORE+10000-. +]IFN DBGSW,LOC MEMSIZ-2000 + +ERROR: 0 + CLEARM MEMSIZ-1 ;DON'T READ ANY MORE COMMANDS FROM MEMORY + SOS T,ERROR ;PICK UP ERROR CODE FROM THE AC FIELD OF + LDB T,[270400+T,,] ;THE JSR ERROR + MOVE D,ERMESS(T) + JSP TT,PD ;PRINT OUT APPROPRIATE COMMENT + CAIL T,EBUG + JRST READ ;BAD ERROR - NO MORE DISKING +LOADG1: DATAI TTY,C ;FLUSH RANDOM CHARACTER + TRO CMD,10 ;MAKE SURE PSEUDO-CORE IN CORE + JRST LOADG ;BY SIMULATING END OF LOADING, NON-GOING COMMAND +BEG: CONO 635550 ;ENTER HERE, CLEAR WORLD + LPMR PGBLK + MOVEI B,ICWA+2 + MOVEM B,ICWA + CLEARM ICWA+1 + MOVSI B,-2000 ;SIZE OF DPC BLOCK + MOVEM B,@ICWA ;INTO CHANNEL PROGRAM + MOVE B,[-NXWDS,,XWDS-1] + MOVEM B,ICWA+3 + MOVSI B,-200+NXWDS + MOVEM B,ICWA+4 + CLEARM ICWA+5 + MOVSI B,-NDSK ;FOR NUMBER OF DISKS + SETOM PKNUM(B) ;SET DISK TO UNKNOWN + AOBJN B,.-1 + MOVE T,[JRST LOADG1] ;SET BOOTSTRAP TO MIDDLE OF WORLD + MOVEM T,BOOT + JSR EDMP,ERROR ;CAUSE TYPOUT BY SIMULATING ERROR +ERMESS: IRP XX,,[ECMP,EDIR,EEOF,ESNF,EFNF,EPNM,ECKS +EDSK,EDDT,EBUG,EC63,ECRD,ECWR,ECDR,EDMP]YY,,[CMPERR,DIRFUL +EOF,SYSNNF,FNF,PKNMTD,CKSERR,DSKFUL,NODDT,?BUG?,CLOB63 +CLOBRD,CLOBWR,DIRCLB,DSKDMP] +XX==.-ERMESS + SIXBIT \YY\ +TERMIN + +PD: JSP P,CRLF ;TYPE A CR +PD2: MOVEI C,40 + JSP P,TYO ;AND A SPACE + MOVE B,[440600,,D] +PD1: ILDB C,B ;AND THE SIXBIT CONTENTS OF D + ADDI C,40 + JSP P,TYO + TLNE B,770000 + JRST PD1 + JRST (TT) + +PNO: +C12: IDIVI C,10. ;PRINT CONTENTS OF C AS A TWO-DIGIT + DPB C,[60600,,A] ;DECIMAL NUMBER PRECEDED + MOVEI D,(SIXBIT /#00/+A) ;BY # + MOVE B,[300600,,D] + JRST PD1 + +WRCB: MOVEI UNIT,CBUF ;WRITE OUT CONTENTS OF CBUF + LSH BLKIN,-12 ;ON APPROPRIATE BLOCK + MOVEI BLOK,CBLK-CORES(BLKIN) + JRST WRM + +LODUMP: MOVEI UNIT,CORE ;DEPENDING ON SIGN BIT OF WRITE, LOAD OR DUMP + MOVEI BLOK,CBLK ;PSEUDO-CORE (766000-775777) +LODMP1: JSP TT,WRDM + ADDI UNIT,2000 + CAIGE UNIT,ERROR + AOJA BLOK,LODMP1 + MOVEI BLKIN,CORE + JRST (P) + +FD: HRRZ C,B ;SET UP POINTER IN C TO FETCH OR DEPOSIT + ;CONTENTS OF ADDRESS IN RIGHT HALF OF B +IFN DBGSW, SKIPGE WRITE ;LOAD DDT WHEN IN DEBUG MODE + CAIGE C,HIGH + CAIGE C,40 + JRST (P) + CAIGE C,CORE ;IF ADDR IS IN REAL CORE, RETURN IMMEDIATELY + JRST 1(P) +FDX: CAIL C,(BLKIN) ;ADDR IS IN PSEUDO-CORE--CHECK IF RIGHT + CAILE C,1777(BLKIN) ;BLOCK IS IN CBUF + JRST FD3 ;IT'S NOT THERE--READ IT IN +FD4: SUBI C,-CORE(BLKIN) ;IT'S THERE--SET UP RIGHT POINTER IN C + JRST 1(P) ;AND RETURN +FD3: JUMPLE WRITE,FD3A ;IF DUMP OR VERIFY DON'T BOTHER + ;TO WRITE OUT CURRENT BLOCK +FD3B: JSP TT,WRCB ;IF LOAD, WRITE CURRENT BLOCK FIRST +FD3A: MOVEI UNIT,CBUF + MOVE BLKIN,C + ANDI BLKIN,776000 + LDB BLOK,[121000,,BLKIN] + ADDI BLOK,CBLK-CORES + JSP TT,RDM ;READ IN CORRECT BLOCK + JRST FD4 ;SET UP POINTER AND RETURN + +GBP: IDIVI C,6 ;TURN USER DIRECTORY CHARACTER ADDR IN C + IMULI A,-60000 ;INTO A BYTE POINTER + HRLI C,440600(A) + ADDI C,DIR+UDDESC + JRST (TT) + +WD: AOBJN BUFP,WD1 ;READ, WRITE, OR VERIFY WORD IN D FROM, INTO, + JSP TT,NXTBLK ;OR AGAINST WORD IN DBUF + JSP TT,WRDB ;TIME TO REFILL OR EMPTY DBUF + MOVSI BUFP,-2000 ;RESET BUFFER POINTER +WD1: JUMPG WRITE,WD2 ;JUMP ON LOAD + JUMPL WRITE,WD3 ;JUMP ON WRITE + CAME D,DBUF(BUFP) ;HERE IF VERIFY + JSR ECMP,ERROR ;VERIFY COMPARE LOST + JRST (P) +WD2: SKIPA D,DBUF(BUFP) ;LOAD +WD3: MOVEM D,DBUF(BUFP) ;DUMP + JRST (P) + +NXTTUT: HRRZ B,CU ;SELECT NEXT UNIT AND READ ITS TUT + AOJ B, + CAIN B,NDSK + MOVEI B,0 + HRRM B,CU + CAIN B,@MU + JRST 1(TT) ;SKIP IF NO MORE + SKIPE QDED(B) + JRST NXTTUT ;UNIT NOT ON LINE +RDTUT: MOVEI BLOK,TUTBLK ;READ TUT OF CURRENT UNIT + MOVEI UNIT,TUT + SETOM PKNUM(B) ;ALWAYS READ HEADER FOR TUT + JRST RD + +NXTBW3: 0 + IBP DIRPT ;DO AN IDPB T,DIRPT CHECKING TO SEE IF + LDB DIFF,[1200,,DIRPT] ;RUNNING INTO NAME AREA + CAML DIFF,DIR+UDNAMP + JSR EDIR,ERROR + DPB T,DIRPT + JRST @NXTBW3 + +NXTBW: MOVE BLOK,LBLOCK ;FIND NEXT FREE BLOCK TO WRITE + MOVEI HEAD,1(BLOK) + ILDB T,TUTPT + JUMPN T,NXTBW1 ;JUMP IF VERY NEXT BLOCK NOT FREE + AOSG T,BLKCNT +NXTBW5: SOJA HEAD,NXTBW4 ;GENERATE LOAD ADR IF FIRST TIME (COMPENSATE FOR LBLOCK OFF BY 1) + CAIG T,UDTKMX-1 + JRST NXTBW2 ;NO NEED TO MODIFY DIRECTORY YET + CLEARM BLKCNT ;14 IN A ROW--RESET COUNTER AND +NXTBW6: JSR NXTBW3 ;DPB BYTE INTO DIRECTORY +NXTBW2: MOVE BLOK,HEAD + CAIL BLOK,NBLKS + JSR EDSK,ERROR ;NO MORE DISK LEFT + MOVEI T,1 + DPB T,TUTPT ;MARK BLOCK USED IN TUT + JRST WRDB1 +NXTBW1: ADDI HEAD,1 ;SEARCH FOR NEXT FREE BLOCK + ILDB T,TUTPT + JUMPN T,NXTBW1 + SUBM HEAD,BLOK + SKIPLE T,BLKCNT ;COME UP WITH DESC BYTE FOR LAST FEW BLOCKS + JSR NXTBW3 + CLEARM BLKCNT + JUMPL T,NXTBW5 ;FIRST TIME + MOVEI T,UDTKMX-1(BLOK) + CAIGE T,UDWPH ;CAN WE SAY SKIP N--TAKE 1? + JRST NXTBW6 ;YES +NXTBW4: MOVEI BLOK,NXLBYT + MOVE T,HEAD + ROT T,-NXLBYT*6 + ADDI T,UDWPH+1 + JSR NXTBW3 + ROT T,6 + SOJG BLOK,.-2 + JRST NXTBW6 + +NXTBLK: JUMPL WRITE,NXTBW ;GET NEXT BLOCK OF FILE--IF DUMP, FIND FREE + MOVE BLOK,LBLOCK ;BLOCK +NXTB6: SOSLE BLKCNT ;HAVE WE RUN OUT OF "TAKE N"? + AOJA BLOK,WRDB1 ;NO--TAKE NEXT BLOCK + ILDB T,DIRPT ;YES--GET NEXT DESC BYTE + CAILE T,UDWPH + JRST NXTB1 ;IT'S A LOAD ADDR + CAIE T,UDWPH + JUMPN T,NXTB2 ;IT'S A TAKE OR SKIP + CAIE CMD,'D ;IT'S 0 OR NULL--IF THIS IS A LOAD, IT'S AN + CAIN CMD,'K ;UNEXPECTED END OF FILE + JRST KILL1 ;IF LOAD OR KILL, O.K. + JSR EEOF,ERROR +NXTB1: MOVEI BLOK,-UDWPH-1(T) ;LOAD ADR + MOVEI BUFP,NXLBYTS +NXTB1A: MOVEI T,0 + CAIE CMD,'D + CAIN CMD,'K + DPB T,DIRPT ;IF KILLING FILE, ZERO THIS BYTE (OTHERS ZEROED AT KILL) + LSH BLOK,6 + ILDB T,DIRPT + ADD BLOK,T ;GET COMPLETE BLOCK NUMBER + SOJG BUFP,NXTB1A + JRST NXTB3 +NXTB2: MOVEM T,BLKCNT + CAIG T,UDTKMX + AOJA BLOK,WRDB1 ;TAKE N STARTING WITH NEXT ONE + ADDI BLOK,-UDTKMX+1(T) ;SKIP N- AND TAKE 1 +NXTB3: CLEARM BLKCNT +WRDB1: MOVEM BLOK,LBLOCK + JRST (TT) + +WRDM: SKIPL WRITE ;SEE WHETHER LOAD OR DUMP/VERIFY +RDM: TRZA WRITE,(WRITE) ;READ FROM MASTER UNIT +WRM: HRRI WRITE,10 ;WRITE ON MASTER UNIT +MU: IORI WRITE,0 ;MASTER UNIT SELECT STORED HERE + JRST WRD3A + +WRDB: MOVEI UNIT,DBUF ;READ OR WRITE DBUF FROM/ON CURRENT UNIT +WRD: SKIPL WRITE ;READ OR WRITE FROM/ON CURRENT UNIT +RD: TRZA WRITE,(WRITE) ;READ FROM CURRENT UNIT +WR: HRRI WRITE,10 ;WRITE ON CURRENT UNIT +CU: IORI WRITE,0 ;CURRENT UNIT SELECT STORED HERE +WRD3A: +WRD3: DPB WRITE,[360600,,DBLK] ;SET OP, UNIT SEL + DPB WRITE,[DUNFLD SEEK] + DPB WRITE,[DUNFLD RECAL] + HRLI UNIT,-2000 + MOVEM UNIT,@ICWA + SOS @ICWA + LDB UNIT,[300,,WRITE] ;ISOLATE FROM GARBAGE + MOVNI DIFF,11 ;INITIALIZE ERROR COUNTER + MOVEM DIFF,ERRCT ;10. LOSSES PERMITTED +WRD5: DATAO DPC,CLATT ;CLEAR ATTENTIONS + HRRZ DIFF,BLOK + IDIVI DIFF,NCBLKS + DPB DIFF,[DCYL SEEK] + DPB DIFF,[DCYL DBLK] + MOVE DIFF,HEAD + IMULI DIFF,NSSECS + IDIVI DIFF,NHSECS + DPB DIFF,[DSURF DBLK] + DPB HEAD,[DSECT DBLK] + DATAO DPC,SEEK + DATAI DPC,DIFF + TRNN DIFF,ALLATT + JRST .-2 + DATAO DPC,CLATT + TLNN DIFF,(ONCYL) + JRST WRD0 + DATAO DPC,DBLK + CONSO DPC,DONE + JRST .-1 + CONSO DPC,ALLER + JRST WRDX + HRRZM BLOK,BADBLK + AOSG ERRCT ;HARDWARE ERROR--CHECK COUNTER + JRST WRD5 ;TRY AGAIN + TRNE WRITE,10 ;GIVE UP--DISTINGUISH BETWEEN + JSR ECWR,ERROR ;WRITE ERRORS AND + JSR ECRD,ERROR ;READ ERRORS + +WRDX: HRRZ UNIT,@ICWA ;RESTORE ADDR + ADDI UNIT,1 ;COMPENSATE FOR IOWD LOSSAGE + DPB BLOK,[XWBLK,,XWDS] + TRZ WRITE,-1 ;FLUSH GARBAGE + JRST (TT) + +WRD0: AOSLE ERRCT + JSR EC63,ERROR + DATAO DPC,RECAL + DATAI DPC,DIFF + TRNN DIFF,ALLATT + JRST .-2 + JRST WRD5 + +DBLK: ICWA +SEEK: DSEEKC +RECAL: DRCALC +CLATT: DEASEC ALLATT + +TYI: ILDB C,MEMSIZ-1 ;CHECK FOR COMMANDS FROM MEMORY + JUMPN C,(P) ;FOUND ONE--RETURN + CLEARM MEMSIZ-1 + CONSO TTY,40 + JRST .-1 + DATAI TTY,C + ANDI C,177 + CAIGE C,175 + CAIN C,33 + JRST (P) ;DON'T ECHO GRITCHES +TYO: SKIPE MEMSIZ-1 + JRST (P) ;DON'T ECHO COMMANDS FROM MEMORY + HRRZ A,C ;COMPUTE PARITY + IMULI A,40201 + AND A,[1111111] + IMUL A,[1111111] + TLNE A,1 + IORI C,200 + CONSZ TTY,20 + JRST .-1 + DATAO TTY,C + ANDCMI C,200 + JUMPGE C,(P) ;CHECK FOR CRLF (AS OPPOSED TO ECHOING A CR) + SKIPA C,C12 ;TYPE AN LF +CRLF: HRROI C,15 + JRST TYO + +LINK: CAIE CMD,'D + CAIN CMD,'K + MOVSI WRITE,-1 ;MAKE THIS INFO MORE CONVENIENT + MOVE D,[440600,,C] + MOVEI T,0 +LINKL: ILDB TT,DIRPT + SKIPGE WRITE + DPB T,DIRPT ;CLOBBER CHARS READ FOR DUMP OR KILL + CAIN TT,'; + JRST LINKN + CAIN TT,': + JRST LINKQ +LINKQ1: IDPB TT,D + TLNE D,770000 + JRST LINKL +LINKN1: CAMGE D,[600,,B] ;THRU WITH FN2? + JRST LINKL + JUMPL WRITE,KILL1 + MOVEM A,FN1 + MOVEM B,FN2 + JRST MLOOK2 + +LINKN: TLNN D,770000 + JRST LINKN1 + IDPB T,D ;FILL OUT WITH SPACES + JRST LINKN + +LINKQ: ILDB TT,DIRPT + JUMPGE WRITE,LINKQ1 + DPB T,DIRPT + JRST LINKQ1 + +READ: MOVEI BLKIN,CORE + JSP P,CRLF + MOVEI CMD,0 ;INITIALIZE COMMAND +READ1A: MOVEI WRITE,0 ;INITIALIZE NUMBER + MOVSI B,(SIXBIT \@\) ;INITIALIZE 1ST FILE NAME +READ1: MOVEM B,FN1 +READ3A: MOVSI B,(SIXBIT \@\) ;INITIALIZE CURRENT FILE NAME + MOVE D,[440600,,B] +READ2: JSP P,TYI + CAIN C,177 + JRST READ ;IF RUBOUT START OVER + CAIGE C,175 + CAIN C,33 + JRST ALTMOD ;JUMP IF 33, 175, 176 + ASH WRITE,3 ;DOES NOT CHANGE SIGN OF WRITE + CAIL C,"0 + CAILE C,"7 + TLOA WRITE,400000 ;NON-NUMERIC CHAR--MAKE WRITE NEGATIVE + ADDI WRITE,-"0(C) ;NUMERIC CHAR--ACCUMULATE NUMBER + CAIN C,"; + JRST READ3 ;SET SYSTEM NAME + CAIN C,40 + JRST READ1 ;SET FIRST FILE NAME + CAIN C,^Q + JSP P,TYI ;QUOTED CHARACTER + CAIGE C,140 ;CHECK FOR LOWER CASE + SUBI C,40 + JUMPL C,DOIT ;IF LESS THAN 40 (EXC. ^Q) END OF COMMAND + TLNE D,770000 ;SKIP IF ALREADY SIX CHARS + IDPB C,D + JRST READ2 +READ3: MOVEM B,SYSN + CAIE CMD,'U + JRST READ3A + JRST DOIT ;IF COMMAND IS U GO LIST DIRECTORY + +PGBLK: BLOCK 8 + +ONOFF: CAIGE WRITE,NDSK + DPB CMD,[100,,QDED(WRITE)] ;LOW BIT OF CMD DETERMINES ON/OFF LINE STATUS + JRST READ + +ALT1: LDB CMD,D ;PICK UP COMMAND CHAR + CAIE CMD,'K + TRNN CMD,2 + JRST READ1A ;GET FILE NAME + JRST DOIT ;DON'T WANT FILE NAME--GO TO WORK + +ALTMOD: MOVEI C,"$ + JSP P,TYO ;ECHO DOLLAR SIGN + JUMPLE WRITE,ALT2 ;JUMP IF NOT LAST TYPED + JUMPN CMD,ONOFF ;JUMP IF + HRRM WRITE,SADR ;SET STARTING ADDR + JRST READ +ALT2: TLC D,360000 + TLCN D,360000 ;DON'T SKIP IF SINGLE CHARACTER BEFORE + JUMPE CMD,ALT1 ;JUMP IF NO COMMAND ALREADY TYPED +DOIT: MOVEM B,FN2 ;STORE SECOND FILE NAME + HRRZ B,MU + HRRM B,CU ;MAKE MASTER UNIT CURRENT UNIT + MOVNI WRITE,1 + JSP P,LODUMP ;DUMP OUT PSEUDO-CORE + CAIN CMD,'G + JRST LOADG0 ;GO + JSP TT,RDTUT + MOVE C,SYSN +MLOOK2: MOVSI WRITE,1 ;MAKE WRITE INDICATE LOAD + MOVEI BLOK,MFDBLK + MOVEI UNIT,DIR + JSP TT,RD ;READ MASTER DIRECTORY TO FIND WHERE USER DIRECTORY IS + CAIN CMD,'S + JRST LISTS ;LIST DISK ID'S AND SYSTEM NAMES + MOVE C,SYSN + MOVE T,DIR+MDNAMP +MLOOK: CAMN C,DIR+MNUNAM(T) ;LOOK UP SYSTEM NAME + JRST MLOOK1 + ADDI T,LMNBLK + CAIGE T,2000 + JRST MLOOK + JSR ESNF,ERROR ;NOT FOUND + +MLOOK1: MOVEI BLOK,2*NUDSL-2000(T) ;CONVERT USER SLOT TO BLOCK NUMBER + LSH BLOK,-1 + HRRM BLOK,UDBLK ;REMEMBER FOR KILL OR DUMP + MOVEI UNIT,DIR + JSP TT,RDM ;READ USER DIRECTORY +ULOOK: CAME C,DIR+UDNAME + JSR ECDR,ERROR ;WRONG ONE?? + CAIE CMD,'F + CAIN CMD,'U + JRST LISTFC ;LIST USER DIRECTORY + MOVSI TT,UNIGFL + MOVE T,DIR+UDNAMP + MOVE A,FN1 + MOVE B,FN2 +ULOOK1: CAMN A,DIR+UNFN1(T) ;LOOK UP FILE NAME + CAME B,DIR+UNFN2(T) + JRST ULOOK2 + TDNN TT,DIR+UNRNDM(T) ;IS THIS FILE FOR REAL? + JRST ULOOK3 +ULOOK2: ADDI T,LUNBLK + CAIGE T,2000 + JRST ULOOK1 + CAIE CMD,'D ;IF NOT FOUND BETTER BE DUMP + JSR EFNF,ERROR + MOVE T,DIR+UDNAMP +ULOOK4: SKIPN DIR+UNFN1(T) ;FIND FREE SLOT FOR NEW FILE + JRST DUMP + ADDI T,LUNBLK + CAIGE T,2000 + JRST ULOOK4 + MOVNI T,LUNBLK ;NO FREE SLOTS--TRY TO EXTEND NAME AREA DOWN + ADDM T,DIR+UDNAMP + MOVE T,DIR+UDESCP + IDIVI T,6 + ADDI T,UDDESC + CAMGE T,DIR+UDNAMP ;DID WE RUN INTO DESCRIPTOR AREA? + JRST DUMP0 + JSR EDIR,ERROR ;YES +ULOOK3: HRRM T,DMP4 ;IF FILE FOUND, SAVE SLOT NUMBER FOR DUMP + LDB C,[UNDSCP DIR+UNRNDM(T)] + JSP TT,GBP + MOVEM C,DIRPT ;SET UP DESCRIPTOR AREA BYTE POINTER + MOVSI TT,UNLINK + TDNE TT,DIR+UNRNDM(T) + JRST LINK ;FILE IS A LINK + LDB A,[UNPKN DIR+UNRNDM(T)] +ULOOK5: CAMN A,TUT+QPKNUM ;SEE IF IT'S MOUNTED + JRST LOAD + JSP TT,NXTTUT + JRST ULOOK5 + JSR EPNM,ERROR + +LOAD: CAIE CMD,'D ;GET HERE IF FILE FOUND + CAIN CMD,'K ;IF DUMP OR KILL, DELETE IT + JRST KILL +ZERO: MOVEI TT,CORE-1 + TRNN CMD,20 + JRST ZERO1 + MOVE B,SADR + SUBI B,1 + JSP P,FD ;GET DDT'S SYMBOL TABLE POINTER + JSR EDDT,ERROR ;CAN'T GET IT?? + HRROS B,(C) ;TELL DDT ITS SYMBOL TABLE WAS BUGGERED + HRRM B,LOADS4 + JSP P,FD + JSR EDDT,ERROR + MOVE D,(C) + MOVEM D,DDTM2 + MOVEI TT,CORE-1 + CAILE TT,(D) + HRRZ TT,D +ZERO1: TRNE CMD,1 + JRST LOAD1 ;NON-ZEROING COMMAND + SETZM 40 ;BEGIN CLEARING CORE + MOVE T,[40,,41] ;SET UP BLT POINTER +IFE FULHSW,[ ;CODE TO SKIP OVER NXM +ZERO2: CAIG TT,10*2000-1(T) ;MORE THAN 8K LEFT TO ZERO? + JRST ZERO4 ;NO, ZERO REMAINING WORDS AND PROCEED + BLT T,10*2000-1(T) ;ZERO NEXT 8K +ZERO3: ADDI T,10*2000 ;MOVE DEST OF BLT PNTR UP 8K + ANDCMI T,1777 ;ROUND DOWN TO 1K BOUNDARY + CONO 10000 ;CLEAR NXM + MOVES (T) ;SET NXM IF HOLE + CONSZ 10000 ;NXM GENERATED? + JRST ZERO3 ;YES, GO TO NEXT 8K + JRST ZERO2 ;NO, CLEAR THIS 8K +ZERO4:] + BLT T,(TT) ;AND CLEAR TO TOP BOUNDARY + TRNE CMD,20 + JRST LOAD1 ;IF SYMBOL-LOADING COMMAND, STOP THERE + CLEARM CBUF + MOVE T,[CBUF,,CBUF+1] + BLT T,CBUF+1777 + MOVEI UNIT,CBUF + MOVE BLOK,[-5,,CBLK] + JSP TT,WRM ;CLEAR PSEUDO-CORE + AOBJN BLOK,.-1 +LOAD1: SETZB BUFP,BLKCNT ;SET UP BUFP SO FIRST CALL TO WD WILL READ +LOAD2: JSP P,WD ;FIRST BLOCK OF FILE + CAME D,[JRST 1] ;LOOK FOR END OF SBLK LOADER + JRST LOAD2 + CAIN CMD,'I ;IF VERIFY, START SIMULATING DUMP + JRST DUMP.5 +LOAD3: JSP P,WD ;READ BLOCK HEADER + JUMPGE D,LOADS ;IT'S A JUMP BLOCK + MOVE A,D + MOVE B,D + JSR LOADB ;LOAD LOGICAL BLOCK INTO CORE + JRST LOAD3 + +LOADS: TRNN CMD,20 + JRST LOADJ ;DON'T LOAD SYMBOLS + MOVEM D,NXTBW3 ;SAVE S.A. +LOADS1: MOVE B,DDTM2 + JSP P,WD ;GET SYMBOL BLOCK HEADER + JUMPGE D,LOADS2 ;JUMP IF END OF SYMBOLS + MOVSS D + HRLI D,-1(D) + ADD B,D ;EFFECTIVELY SUBTRACTS LENGTH OF BLOCK FROM BOTH HALVES + MOVEM B,DDTM2 ;OF SYMBOL TABLE POINTER + HRL B,D ;SET UP AOBJN POINTER IN B + HRLZ A,D ;AND RECREATE HEADER IN A + JSR LOADB ;LOAD THE SYMBOLS + JRST LOADS1 + +LOADS2: MOVE D,DDTM2 +LOADS4: MOVEI B,. ;PNTR TO SYMTAB PNTR + JSP P,FD ;PUT BACK SYMBOL TABLE POINTER + JSR EBUG,ERROR ;CAN'T PUT IT BACK?? + MOVEM D,(C) + MOVE D,NXTBW3 ;"GIVE" S.A. TO DDT + JRST LOADG0 + +LOADJ: HRRM D,SADR ;SET STARTING ADDRESS FROM JUMP BLOCK +LOADG0: MOVE T,[CONSZ DPC,BUSY] + MOVEM T,BOOT +LOADG: JSP TT,WRCB ;MAKE SURE ALL LOADED CRUFT IN PSEUDO-CORE IS OUT + MOVEI WRITE,0 + JSP P,LODUMP ;AND LOAD IT ALL IN + TRNE CMD,10 + JRST READ ;NON-GOING COMMAND +GO: DATAO DPC,CLATT + MOVE B,ERRWD + MOVEM B,@ICWA + CLEARM ICWA+3 + DATAO DPC,SWPSK + CONSO DPC,DONE + JRST .-1 + DATAO DPC,SWPOU1 + CONSO DPC,DONE + JRST .-1 + DATAO DPC,SWPOU2 + JRST WAIT + +LOADB: 0 +LOAD4: JSP P,WD ;LOAD A LOGICAL BLOCK--AOBJN POINTER IN B, + ROT A,1 ;BLOCK HEADER IN A (FOR CHECKSUM) + ADD A,D ;ADD NEW WORD INTO CHECKSUM + JSP P,FD ;AND PREPARE TO SMASH IT AWAY + JRST .+2 ;LOCATION CAN'T BE LOADED + MOVEM D,(C) ;SMASH WORD AWAY + AOBJN B,LOAD4 + JSP P,WD + CAMN A,D ;CHECK THE CHECKSUM + JRST @LOADB + JSR ECKS,ERROR ;BAD CHECKSUM + +LISTS: JSP P,CRLF +LISTS2: CONSZ TTY,40 + JRST LOADG1 ;SHUT UP IF KEY HIT + MOVE C,TUT+QPKNUM ;TYPE PACK NUMBER + JSP TT,PNO + MOVE D,TUT+QPKID ;AND I.D. + JSP TT,PD2 + JSP TT,NXTTUT ;SAME FOR ALL DIRECTORIES + JRST LISTS2 + MOVE T,DIR+MDNAMP +LISTS1: CONSO TTY,40 ;STOP TYPING IF TTI FLAG ON + CAIL T,2000 + JRST LOADG1 + SKIPE D,DIR+MNUNAM(T) + JSP TT,PD ;TYPE OUT USER NAME + ADDI T,LMNBLK + JRST LISTS1 + +LISTFC: MOVE T,DIR+UDNAMP +LISTF1: CONSO TTY,40 ;STOP TYPING IF TTI FLAG ON + CAIL T,2000 + JRST LOADG1 + SKIPN DIR+UNFN1(T) ;SKIP IF FILE IN THIS SLOT + JRST LISTF2 + JSP P,CRLF + LDB C,[UNPKN DIR+UNRNDM(T)] + JSP TT,PNO ;TYPE PACK NUMBER + MOVE D,DIR+UNFN1(T) + JSP TT,PD2 ;TYPE FIRST FILE NAME + MOVE D,DIR+UNFN2(T) + JSP TT,PD2 ;AND SECOND FILE NAME +LISTF2: ADDI T,LUNBLK + JRST LISTF1 + +KILL: JSP TT,NXTB6 ;GET HERE ON KILL OR DUMP OF EXISTING FILE + MOVEI T,0 ;ZERO BYTES IN USER DIRECTORY DESCIPTOR AREA + DPB T,DIRPT ;NXTB6 JUMPS TO KILL1 AT END OF FILE + MOVE C,BLOK + JSP TT,GTP + ILDB T,C + CAIGE T,TUTLK-1 ;SOS USAGE OF THIS BLOCK + SOJL T,[JSR ECDR,ERROR] + DPB T,C + JRST KILL +KILL1: HRRZ T,DMP4 ;CLEAR OUT USER DIRECTORY SLOT + CLEARM DIR+UNFN1(T) + CLEARM DIR+UNFN2(T) + CLEARM DIR+UNRNDM(T) + MOVSI WRITE,-1 + CAIN CMD,'K + JRST KILDMP ;IF KILL DON'T DUMP + JRST DMP4 ;MUST DUMP ON SAME UNIT + +DUMP0: MOVE T,DIR+UDNAMP ;GET HERE IF SLOT CREATED AT BOTTOM OF NAME AREA +DUMP: HRRM T,DMP4 ;GET HERE IF EMPTY SLOT FOUND IN NAME AREA +DMP0: MOVEI D,0 ;GET HERE IF USING SLOT OF OLD FILE +DMP1: MOVE C,TUT+QSWAPA + MOVSI B,-NBLKS(C) + JSP TT,GTP +DMP2: ILDB T,C + SKIPE T + SUBI B,1 + AOBJN B,DMP2 + CAIG B,(D) ;RH OF D IS HIGHEST SO FAR, LH SAYS WHICH UNIT + JRST DMP5 ;NOT BETTER THAN RECORD + MOVE D,B ;NEW RECORD--RECORD IT + HRL D,CU +DMP5: JSP TT,NXTTUT ;TRY NEXT + JRST DMP1 + ;FALLS THRU AT END + +DMP3: HLRM D,CU ;SET CURRENT UNIT TO ONE WITH MOST FREE BLOCKS + JSP TT,RDTUT ;GET ITS TUT +DMP4: MOVEI T,. + MOVE A,FN1 + MOVE B,FN2 + MOVEM A,DIR+UNFN1(T) ;PUT CRUFT INTO SLOT + MOVEM B,DIR+UNFN2(T) + SETOM DIR+UNDATE(T) + MOVEM A,XWDS+XWFN1 + MOVEM B,XWDS+XWFN2 + MOVE C,SYSN + MOVEM C,XWDS+XWSYSN + MOVE C,DIR+UDESCP ;PUT DESCRIPTOR CHARACTER ADDRESS + MOVE B,TUT+QPKNUM ;AND PACK NUMBER + DPB B,[UNPKN C] + MOVEM C,DIR+UNRNDM(T) ;INTO USER DIRECTORY SLOT + MOVE C,TUT+QSWAPA + MOVEM C,LBLOCK + JSP TT,GTP + MOVEM C,TUTPT ;INITIALIZE TUT POINTER + MOVE C,DIR+UDESCP + JSP TT,GBP + MOVEM C,DIRPT ;INITIALIZE DESCRIPTOR AREA POINTER + SETOB WRITE,BLKCNT ;FORCE NXTBW TO LOAD ADR + HRLOI BUFP,-2001-1 ;SET UP BUFP SO FIRST WORD GOES IN DBUF+0 + MOVE D,[JRST 1] + JSP P,WD ;END OF SBLK LOADER + +DUMP.5: MOVSI WRITE,-'I(CMD) ;GET HERE IF VERIFY--SET WRITE NEGATIVE IF + MOVEI B,40 ;DUMP AND ZERO IF VERIFY--FIRST ADDR DUMPED IS 40 +DUMP1: +IFE FULHSW,[ ;SKIP OVER NXM ON DUMPING + CONSO 10000 ;NXM SET? + JRST DUMP1A ;NO, CONTINUE IN SEQUENCE + ADDI B,10*2000-1 ;SKIP 8K + TRZ B,1777 ;ROUND DOWN TO 8K BOUDARY + CONO 10000 ;CLEAR NXM +DUMP1A:] + JSP P,FD + JRST DUMPJ ;TIME TO WRITE JUMP BLOCK + SKIPN (C) ;LOOK FOR NON-ZEROES + AOJA B,DUMP1 + MOVE A,B ;FOUND SOME + HRLI B,-200 ;DON'T DUMP MORE THAN 200 OF THEM +DUMP2: JSP P,FD + JRST DUMP3 ;END OF CORE--WRITE OUT THIS BLOCK + SKIPE (C) ;LOOK FOR ZEROES + JRST DUMP2A + AOBJP B,DUMP3 ;JUMPS IF WE HAVE 200 WORDS' WORTH OF CRUD ANYWAY + JSP P,FD + JRST DUMP3 + SUBI B,1 + SKIPE (C) ;IF NOT TWO ZEROES DON'T END BLOCK +DUMP2A: AOBJN B,DUMP2 ;UNLESS THERE ARE ALREADY 200 WORDS +DUMP3: HRRM B,DUMP4 ;SAVE ADDRESS TO CONTINUE SEARCH + SUBM A,B ;GET MINUS THE LENGTH OF THE BLOCK + HRL A,B ;SET UP HEADER IN A + MOVE B,A ;AND B + MOVE D,A ;AND D + JSP P,WD ;WRITE HEADER +DUMP3A: JSP P,FD + JSR EBUG,ERROR ;CAN'T FETCH WORD WE FETCHED BEFORE?? + MOVE D,(C) + ROT A,1 + ADD A,D ;COMPUTE CHECKSUM + JSP P,WD + AOBJN B,DUMP3A + MOVE D,A + JSP P,WD ;WRITE OUT CHECKSUM +DUMP4: MOVEI B,. ;AND CONTINUE SEARCHING + JRST DUMP1 + +GTP: IDIVI C,36./TUTBYT + IMULI A,-10000*TUTBYT + HRLI C,440000+TUTBYT_6(A) + ADDI C,TUT + JRST (TT) + +DUMPJ: MOVE D,SADR + JSP P,WD ;WRITE OUT JUMP BLOCK + JUMPE WRITE,LOADG1 ;IF VERIFY, THAT'S ALL + JSP P,WD ;INDICATE NO SYMBOLS IN FILE + JSP TT,NXTBLK + JSP TT,WRDB ;WRITE OUT LAST BLOCK + SKIPE T,BLKCNT + JSR NXTBW3 ;STORE LAST DESCRIPTOR BYTE + MOVEI T,0 + JSR NXTBW3 ;AND INDICATE END OF FILE + LDB T,[360600,,DIRPT] + IDIVI T,6 + HRRZ TT,DIRPT + IMULI TT,6 + SUBI TT,6*-5-1(T) + HRRZM TT,DIR+UDESCP ;INDICATE NEW END OF DESCRIPTOR AREA +KILDMP: MOVEI UNIT,TUT + MOVEI BLOK,TUTBLK + JSP TT,WRD ;WRITE OUT MASTER DIRECTORY ON THIS UNIT + HRRZ B,CU + HRRM B,KD2 ;WRITE OUT USER DIRECTORY ON ALL UNITS +KD1: AOJ B, + CAIN B,NDSK + MOVEI B,0 + HRRM B,CU + SKIPE QDED(B) + JRST KD2 + MOVEI UNIT,DIR +UDBLK: MOVEI BLOK,. + JSP TT,WR +KD2: CAIN B,. + JRST LOADG1 + JRST KD1 + +ERRCT: 0 ;ERROR COUNTER +DDTM2: 0 ;DDT SYMBOL TABLE POINTER +LBLOCK: 0 ;LAST BLOCK WRITTEN OR READ +BLKCNT: 0 ;NUMBER OF BLOCKS READ OR WRITTEN CONSECUTIVELY +DIRPT: 0 ;DESCRIPTOR AREA BYTE POINTER +TUTPT: 0 ;TUT BYTE POINTER +FN1: 0 ;FILE NAME 1 +FN2: 0 ;FILE NAME 2 +PKNUM: REPEAT NDSK,-1 +QDED: BLOCK NDSK +XWDS: BLOCK NXWDS +CONSTA +BLOCK <.\67>-. +BADBLK: 0 ;BLOCK WITH HDWE ERROR +IRP XX,,\<.-1> +IF1,PRINTX BADBLK=XX + TERMIN +BLOCK ERROR+1700-. + +CBOOT: CLEARM MEMSIZ-1 ;BOOTSTRAP +BOOT: JRST BEG ;OR CONSZ DPC,BUSY OR JRST LOADG1 + JRST .-1 + MOVEI B,ICWA+2 ;SET UP CHANNEL PROG + MOVEM B,ICWA + SETZM ICWA+1 + SETZM ICWA+3 + DATAO DPC,CLATT1 + MOVE B,ERRWD + MOVEM B,@ICWA + DATAO DPC,SWPSK ;POSITION + CONSO DPC,DONE + JRST .-1 + DATAO DPC,SWPIN1 ;WRITE TOP BLOCK EXCEPT FOR TOP 100 WDS + CONSO DPC,DONE + JRST .-1 + DATAO DPC,SWPIN2 ;READ IN DSKDMP + CONSO DPC,DONE + JRST .-1 + JRST BEG + +ERRWD: -1700,,ERROR-1 +CLATT1: DEASEC ALLATT +SWPSK: DSEEKC+200._22. +SWPIN1: DWRITC+200._22.+3_17.+6._12.+ICWA ;NBLKS 4 +SWPIN2: DREADC+200._22.+4_17.+5._12.+ICWA ;NBLKS 5 +SWPOU1: DWRITC+200._22.+4_17.+5._12.+ICWA ;NBLKS 5 +SWPOU2: DREADC+200._22.+3_17.+6_12.+ICWA ;NBLKS 4 + +WAIT: CONSO DPC,DONE + JRST .-1 +SADR: JRST BOOT ;AND GO TO PROGRAM TO BE STARTED +SYSN: SIXBIT /./ + +OFFSET 0 +LOC CORE +CBUF: BLOCK 2000 ;PSEUDO-CORE BUFFER +DBUF: BLOCK 2000 ;DISK BUFFER +DIR: BLOCK 2000 ;DIRECTORY BUFFER +TUT: BLOCK 2000 +IFN .&777777-ERROR,PRINTX ;UGH +; +END ZZZ +  \ No newline at end of file diff --git a/src/mlsys/decdsk.dmp109 b/src/mlsys/decdsk.dmp109 new file mode 100644 index 00000000..b47e8f80 --- /dev/null +++ b/src/mlsys/decdsk.dmp109 @@ -0,0 +1,895 @@ + +TITLE DSKDMP +C=1 ;C-A-B FOR LINKS +A=2 +B=3 +D=4 +BLKIN=5 ;PSEUDO-CORE BLOCK IN CBUF +WRITE=6 ;NEG MEANS DUMP, RH 0 OR WRBIT +DIFF=7 ;DIFF CONO ALSO TEMP +HEAD=10 ;HEAD CONO ALSO TEMP +P=11 ;JSP AC +BLOK=12 +UNIT=13 ;UNIT AND M.A. DATAO +CMD=14 ;COMMAND CHAR +T=15 ;VERY TEMP +TT=16 ;ANOTHER JSP AC, ALSO VERY TEMP +BUFP=17 ;DBUF PNTR--LAST WORD USED + +.INSRT DSKDMP SWITCH +.INSRT MDSK > +.INSRT MFSDFS > +NDSK==2 +ICWA=30 + +LPM=102000,, +LPMR= LPM 2, + +DDT==MEMSIZ-4000 +IFN DBGSW,MEMSIZ==MEMSIZ-10000 ;MOVE DOWN UNDER DDT IF DEBUG MODE +CORE==MEMSIZ-12000 ;HIGHEST ADR ALWAYS IN CORE+1 +CORES==CORE_<-12> ;BLK # OF ABOVE (FIRST OF 4 BLKS SWAPPED OUT FOR BUFFER AREAS) +HIGH==MEMSIZ-100 ;HIGHEST ADR LOADED/DUMPED+1 +CBLK==NBLKS ;DPC ADR WHERE "CORE" BLK IS SAVED + + +ZZZ: IFE DBGSW,[ + MOVE T,.... ;THIS CODE BLTS THE FOLLOWING OFFSET CODE + BLT T,MEMSIZ-1-1 ;INTO HIGH MEMORY AND WRITES DSKDMP ON ITS + MOVE T,PROG+MEMSIZ-2-ERROR+1 + MOVEM T,ERROR+MEMSIZ-2-ERROR+1 ;AVOID LOSING DUE TO -1 BLT LOSSAGE +] + MOVEI T,ICWA+2 ;SET UP CHANNEL JUMP + MOVEM T,ICWA ;IN INITIAL CHANNEL ADDRESS + SETZM ICWA+1 ;AND CLEAR REMAINING STUFF + SETZM ICWA+3 + MOVSI T,-NDSK + SETZM QDED(T) + AOBJN T,.-1 ;ALL UNITS ON LINE + MOVEI UNIT,ERROR ;MAGIC BLOCK THEN STARTS IT + MOVEI BLOK,NBLKS+5 + MOVEI WRITE,10 + JSP TT,WRD3 + MOVEI BLOK,NBLKS+6 + MOVEI WRITE,10 + JSP TT,WRD3 + CONSZ DPC,ALLER +IFN DBGSW,JRST DDT +IFE DBGSW,JRST 4,ZZZ + JRST BEG + + +IFE DBGSW,[ +....: PROG,,ERROR + +LOC 2000 ;MAKE OFFSET CONVENIENT +PROG: OFFSET CORE+10000-. +]IFN DBGSW,LOC MEMSIZ-2000 + +ERROR: 0 + CLEARM MEMSIZ-1 ;DON'T READ ANY MORE COMMANDS FROM MEMORY + SOS T,ERROR ;PICK UP ERROR CODE FROM THE AC FIELD OF + LDB T,[270400+T,,] ;THE JSR ERROR + MOVE D,ERMESS(T) + JSP TT,PD ;PRINT OUT APPROPRIATE COMMENT + CAIL T,EBUG + JRST READ ;BAD ERROR - NO MORE DISKING +LOADG1: DATAI TTY,C ;FLUSH RANDOM CHARACTER + TRO CMD,10 ;MAKE SURE PSEUDO-CORE IN CORE + JRST LOADG ;BY SIMULATING END OF LOADING, NON-GOING COMMAND +BEG: CONO 635550 ;ENTER HERE, CLEAR WORLD + LPMR PGBLK + MOVEI B,ICWA+2 + MOVEM B,ICWA + CLEARM ICWA+1 + MOVSI B,-2000 ;SIZE OF DPC BLOCK + MOVEM B,@ICWA ;INTO CHANNEL PROGRAM + MOVE B,[-NXWDS,,XWDS-1] + MOVEM B,ICWA+3 + MOVSI B,-200+NXWDS + MOVEM B,ICWA+4 + CLEARM ICWA+5 + MOVSI B,-NDSK ;FOR NUMBER OF DISKS + SETOM PKNUM(B) ;SET DISK TO UNKNOWN + AOBJN B,.-1 + MOVE T,[JRST LOADG1] ;SET BOOTSTRAP TO MIDDLE OF WORLD + MOVEM T,BOOT + JSR EDMP,ERROR ;CAUSE TYPOUT BY SIMULATING ERROR +ERMESS: IRP XX,,[ECMP,EDIR,EEOF,ESNF,EFNF,EPNM,ECKS +EDSK,EDDT,EBUG,EC63,ECRD,ECWR,ECDR,EDMP,EMFC]YY,,[CMPERR,DIRFUL +EOF,SYSNNF,FNF,PKNMTD,CKSERR,DSKFUL,NODDT,?BUG?,CLOB63 +CLOBRD,CLOBWR,DIRCLB,DSKDMP,MFDCLB] +XX==.-ERMESS + SIXBIT \YY\ +TERMIN + +PD: JSP P,CRLF ;TYPE A CR +PD2: MOVEI C,40 + JSP P,TYO ;AND A SPACE + MOVE B,[440600,,D] +PD1: ILDB C,B ;AND THE SIXBIT CONTENTS OF D + ADDI C,40 + JSP P,TYO + TLNE B,770000 + JRST PD1 + JRST (TT) + +PNO: +C12: IDIVI C,10. ;PRINT CONTENTS OF C AS A TWO-DIGIT + DPB C,[60600,,A] ;DECIMAL NUMBER PRECEDED + MOVEI D,(SIXBIT /#00/+A) ;BY # + MOVE B,[300600,,D] + JRST PD1 + +WRCB: MOVEI UNIT,CBUF ;WRITE OUT CONTENTS OF CBUF + LSH BLKIN,-12 ;ON APPROPRIATE BLOCK + MOVEI BLOK,CBLK-CORES(BLKIN) + JRST WRM + +LODUMP: MOVEI UNIT,CORE ;DEPENDING ON SIGN BIT OF WRITE, LOAD OR DUMP + MOVEI BLOK,CBLK ;PSEUDO-CORE (766000-775777) +LODMP1: JSP TT,WRDM + ADDI UNIT,2000 + CAIGE UNIT,ERROR + AOJA BLOK,LODMP1 + MOVEI BLKIN,CORE + JRST (P) + +FD: HRRZ C,B ;SET UP POINTER IN C TO FETCH OR DEPOSIT + ;CONTENTS OF ADDRESS IN RIGHT HALF OF B +IFN DBGSW, SKIPGE WRITE ;LOAD DDT WHEN IN DEBUG MODE + CAIGE C,HIGH + CAIGE C,40 + JRST (P) + CAIGE C,CORE ;IF ADDR IS IN REAL CORE, RETURN IMMEDIATELY + JRST 1(P) +FDX: CAIL C,(BLKIN) ;ADDR IS IN PSEUDO-CORE--CHECK IF RIGHT + CAILE C,1777(BLKIN) ;BLOCK IS IN CBUF + JRST FD3 ;IT'S NOT THERE--READ IT IN +FD4: SUBI C,-CORE(BLKIN) ;IT'S THERE--SET UP RIGHT POINTER IN C + JRST 1(P) ;AND RETURN +FD3: JUMPLE WRITE,FD3A ;IF DUMP OR VERIFY DON'T BOTHER + ;TO WRITE OUT CURRENT BLOCK +FD3B: JSP TT,WRCB ;IF LOAD, WRITE CURRENT BLOCK FIRST +FD3A: MOVEI UNIT,CBUF + MOVE BLKIN,C + ANDI BLKIN,776000 + LDB BLOK,[121000,,BLKIN] + ADDI BLOK,CBLK-CORES + JSP TT,RDM ;READ IN CORRECT BLOCK + JRST FD4 ;SET UP POINTER AND RETURN + +GBP: IDIVI C,6 ;TURN USER DIRECTORY CHARACTER ADDR IN C + IMULI A,-60000 ;INTO A BYTE POINTER + HRLI C,440600(A) + ADDI C,DIR+UDDESC + JRST (TT) + +WD: AOBJN BUFP,WD1 ;READ, WRITE, OR VERIFY WORD IN D FROM, INTO, + JSP TT,NXTBLK ;OR AGAINST WORD IN DBUF + JSP TT,WRDB ;TIME TO REFILL OR EMPTY DBUF + MOVSI BUFP,-2000 ;RESET BUFFER POINTER +WD1: JUMPG WRITE,WD2 ;JUMP ON LOAD + JUMPL WRITE,WD3 ;JUMP ON WRITE + CAME D,DBUF(BUFP) ;HERE IF VERIFY + JSR ECMP,ERROR ;VERIFY COMPARE LOST + JRST (P) +WD2: SKIPA D,DBUF(BUFP) ;LOAD +WD3: MOVEM D,DBUF(BUFP) ;DUMP + JRST (P) + +NXTTUT: HRRZ B,CU ;SELECT NEXT UNIT AND READ ITS TUT + AOJ B, + CAIN B,NDSK + MOVEI B,0 + HRRM B,CU + CAIN B,@MU + JRST 1(TT) ;SKIP IF NO MORE + SKIPE QDED(B) + JRST NXTTUT ;UNIT NOT ON LINE +RDTUT: MOVEI BLOK,TUTBLK ;READ TUT OF CURRENT UNIT + MOVEI UNIT,TUT + SETOM PKNUM(B) ;ALWAYS READ HEADER FOR TUT + JRST RD + +NXTBW3: 0 + IBP DIRPT ;DO AN IDPB T,DIRPT CHECKING TO SEE IF + LDB DIFF,[1200,,DIRPT] ;RUNNING INTO NAME AREA + CAML DIFF,DIR+UDNAMP + JSR EDIR,ERROR + DPB T,DIRPT + JRST @NXTBW3 + +NXTBW: MOVE BLOK,LBLOCK ;FIND NEXT FREE BLOCK TO WRITE + MOVEI HEAD,1(BLOK) + ILDB T,TUTPT + JUMPN T,NXTBW1 ;JUMP IF VERY NEXT BLOCK NOT FREE + AOSG T,BLKCNT +NXTBW5: SOJA HEAD,NXTBW4 ;GENERATE LOAD ADR IF FIRST TIME (COMPENSATE FOR LBLOCK OFF BY 1) + CAIG T,UDTKMX-1 + JRST NXTBW2 ;NO NEED TO MODIFY DIRECTORY YET + CLEARM BLKCNT ;14 IN A ROW--RESET COUNTER AND +NXTBW6: JSR NXTBW3 ;DPB BYTE INTO DIRECTORY +NXTBW2: MOVE BLOK,HEAD + CAIL BLOK,NBLKS + JSR EDSK,ERROR ;NO MORE DISK LEFT + MOVEI T,1 + DPB T,TUTPT ;MARK BLOCK USED IN TUT + JRST WRDB1 +NXTBW1: ADDI HEAD,1 ;SEARCH FOR NEXT FREE BLOCK + ILDB T,TUTPT + JUMPN T,NXTBW1 + SUBM HEAD,BLOK + SKIPLE T,BLKCNT ;COME UP WITH DESC BYTE FOR LAST FEW BLOCKS + JSR NXTBW3 + CLEARM BLKCNT + JUMPL T,NXTBW5 ;FIRST TIME + MOVEI T,UDTKMX-1(BLOK) + CAIGE T,UDWPH ;CAN WE SAY SKIP N--TAKE 1? + JRST NXTBW6 ;YES +NXTBW4: MOVEI BLOK,NXLBYT + MOVE T,HEAD + ROT T,-NXLBYT*6 + ADDI T,UDWPH+1 + JSR NXTBW3 + ROT T,6 + SOJG BLOK,.-2 + JRST NXTBW6 + +NXTBLK: JUMPL WRITE,NXTBW ;GET NEXT BLOCK OF FILE--IF DUMP, FIND FREE + MOVE BLOK,LBLOCK ;BLOCK +NXTB6: SOSLE BLKCNT ;HAVE WE RUN OUT OF "TAKE N"? + AOJA BLOK,WRDB1 ;NO--TAKE NEXT BLOCK + ILDB T,DIRPT ;YES--GET NEXT DESC BYTE + CAILE T,UDWPH + JRST NXTB1 ;IT'S A LOAD ADDR + CAIE T,UDWPH + JUMPN T,NXTB2 ;IT'S A TAKE OR SKIP + CAIE CMD,'D ;IT'S 0 OR NULL--IF THIS IS A LOAD, IT'S AN + CAIN CMD,'K ;UNEXPECTED END OF FILE + JRST KILL1 ;IF LOAD OR KILL, O.K. + JSR EEOF,ERROR +NXTB1: MOVEI BLOK,-UDWPH-1(T) ;LOAD ADR + MOVEI BUFP,NXLBYTS +NXTB1A: MOVEI T,0 + CAIE CMD,'D + CAIN CMD,'K + DPB T,DIRPT ;IF KILLING FILE, ZERO THIS BYTE (OTHERS ZEROED AT KILL) + LSH BLOK,6 + ILDB T,DIRPT + ADD BLOK,T ;GET COMPLETE BLOCK NUMBER + SOJG BUFP,NXTB1A + JRST NXTB3 +NXTB2: MOVEM T,BLKCNT + CAIG T,UDTKMX + AOJA BLOK,WRDB1 ;TAKE N STARTING WITH NEXT ONE + ADDI BLOK,-UDTKMX+1(T) ;SKIP N- AND TAKE 1 +NXTB3: CLEARM BLKCNT +WRDB1: MOVEM BLOK,LBLOCK + JRST (TT) + +WRDM: SKIPL WRITE ;SEE WHETHER LOAD OR DUMP/VERIFY +RDM: TRZA WRITE,(WRITE) ;READ FROM MASTER UNIT +WRM: HRRI WRITE,10 ;WRITE ON MASTER UNIT +MU: IORI WRITE,0 ;MASTER UNIT SELECT STORED HERE + JRST WRD3A + +WRDB: MOVEI UNIT,DBUF ;READ OR WRITE DBUF FROM/ON CURRENT UNIT +WRD: SKIPL WRITE ;READ OR WRITE FROM/ON CURRENT UNIT +RD: TRZA WRITE,(WRITE) ;READ FROM CURRENT UNIT +WR: HRRI WRITE,10 ;WRITE ON CURRENT UNIT +CU: IORI WRITE,0 ;CURRENT UNIT SELECT STORED HERE +WRD3A: +WRD3: DPB WRITE,[360600,,DBLK] ;SET OP, UNIT SEL + DPB WRITE,[DUNFLD SEEK] + DPB WRITE,[DUNFLD RECAL] + HRLI UNIT,-2000 + MOVEM UNIT,@ICWA + SOS @ICWA + LDB UNIT,[300,,WRITE] ;ISOLATE FROM GARBAGE + MOVNI DIFF,11 ;INITIALIZE ERROR COUNTER + MOVEM DIFF,ERRCT ;10. LOSSES PERMITTED +WRD5: DATAO DPC,CLATT ;CLEAR ATTENTIONS + HRRZ DIFF,BLOK + IDIVI DIFF,NCBLKS + DPB DIFF,[DCYL SEEK] + DPB DIFF,[DCYL DBLK] + MOVE DIFF,HEAD + IMULI DIFF,NSSECS + IDIVI DIFF,NHSECS + DPB DIFF,[DSURF DBLK] + DPB HEAD,[DSECT DBLK] + DATAO DPC,SEEK + DATAI DPC,DIFF + TRNN DIFF,ALLATT + JRST .-2 + DATAO DPC,CLATT + TLNN DIFF,(ONCYL) + JRST WRD0 + DATAO DPC,DBLK + CONSO DPC,DONE + JRST .-1 + CONSO DPC,ALLER + JRST WRDX + HRRZM BLOK,BADBLK + AOSG ERRCT ;HARDWARE ERROR--CHECK COUNTER + JRST WRD5 ;TRY AGAIN + TRNE WRITE,10 ;GIVE UP--DISTINGUISH BETWEEN + JSR ECWR,ERROR ;WRITE ERRORS AND + JSR ECRD,ERROR ;READ ERRORS + +WRDX: HRRZ UNIT,@ICWA ;RESTORE ADDR + ADDI UNIT,1 ;COMPENSATE FOR IOWD LOSSAGE + DPB BLOK,[XWBLK,,XWDS] + TRZ WRITE,-1 ;FLUSH GARBAGE + JRST (TT) + +WRD0: AOSLE ERRCT + JSR EC63,ERROR + DATAO DPC,RECAL + DATAI DPC,DIFF + TRNN DIFF,ALLATT + JRST .-2 + JRST WRD5 + +DBLK: ICWA +SEEK: DSEEKC +RECAL: DRCALC +CLATT: DEASEC ALLATT + +TYI: ILDB C,MEMSIZ-1 ;CHECK FOR COMMANDS FROM MEMORY + JUMPN C,(P) ;FOUND ONE--RETURN + CLEARM MEMSIZ-1 + CONSO TTY,40 + JRST .-1 + DATAI TTY,C + ANDI C,177 + CAIGE C,175 + CAIN C,33 + JRST (P) ;DON'T ECHO GRITCHES +TYO: SKIPE MEMSIZ-1 + JRST (P) ;DON'T ECHO COMMANDS FROM MEMORY + HRRZ A,C ;COMPUTE PARITY + IMULI A,40201 + AND A,[1111111] + IMUL A,[1111111] + TLNE A,1 + IORI C,200 + CONSZ TTY,20 + JRST .-1 + DATAO TTY,C + ANDCMI C,200 + JUMPGE C,(P) ;CHECK FOR CRLF (AS OPPOSED TO ECHOING A CR) + SKIPA C,C12 ;TYPE AN LF +CRLF: HRROI C,15 + JRST TYO + +LINK: CAIE CMD,'D + CAIN CMD,'K + MOVSI WRITE,-1 ;MAKE THIS INFO MORE CONVENIENT + MOVE D,[440600,,C] + MOVEI T,0 +LINKL: ILDB TT,DIRPT + SKIPGE WRITE + DPB T,DIRPT ;CLOBBER CHARS READ FOR DUMP OR KILL + CAIN TT,'; + JRST LINKN + CAIN TT,': + JRST LINKQ +LINKQ1: IDPB TT,D + TLNE D,770000 + JRST LINKL +LINKN1: CAMGE D,[600,,B] ;THRU WITH FN2? + JRST LINKL + JUMPL WRITE,KILL1 + MOVEM A,FN1 + MOVEM B,FN2 + JRST MLOOK2 + +LINKN: TLNN D,770000 + JRST LINKN1 + IDPB T,D ;FILL OUT WITH SPACES + JRST LINKN + +LINKQ: ILDB TT,DIRPT + JUMPGE WRITE,LINKQ1 + DPB T,DIRPT + JRST LINKQ1 + +READ: MOVEI BLKIN,CORE + JSP P,CRLF + MOVEI CMD,0 ;INITIALIZE COMMAND +READ1A: MOVEI WRITE,0 ;INITIALIZE NUMBER + MOVSI B,(SIXBIT \@\) ;INITIALIZE 1ST FILE NAME +READ1: MOVEM B,FN1 +READ3A: MOVSI B,(SIXBIT \@\) ;INITIALIZE CURRENT FILE NAME + MOVE D,[440600,,B] +READ2: JSP P,TYI + CAIN C,177 + JRST READ ;IF RUBOUT START OVER + CAIGE C,175 + CAIN C,33 + JRST ALTMOD ;JUMP IF 33, 175, 176 + ASH WRITE,3 ;DOES NOT CHANGE SIGN OF WRITE + CAIL C,"0 + CAILE C,"7 + TLOA WRITE,400000 ;NON-NUMERIC CHAR--MAKE WRITE NEGATIVE + ADDI WRITE,-"0(C) ;NUMERIC CHAR--ACCUMULATE NUMBER + CAIN C,"; + JRST READ3 ;SET SYSTEM NAME + CAIN C,40 + JRST READ1 ;SET FIRST FILE NAME + CAIN C,^Q + JSP P,TYI ;QUOTED CHARACTER + CAIGE C,140 ;CHECK FOR LOWER CASE + SUBI C,40 + JUMPL C,DOIT ;IF LESS THAN 40 (EXC. ^Q) END OF COMMAND + TLNE D,770000 ;SKIP IF ALREADY SIX CHARS + IDPB C,D + JRST READ2 +READ3: MOVEM B,SYSN + CAIE CMD,'U + JRST READ3A + JRST DOIT ;IF COMMAND IS U GO LIST DIRECTORY + +PGBLK: BLOCK 8 + +ONOFF: CAIGE WRITE,NDSK + DPB CMD,[100,,QDED(WRITE)] ;LOW BIT OF CMD DETERMINES ON/OFF LINE STATUS + JRST READ + +ALT1: LDB CMD,D ;PICK UP COMMAND CHAR + CAIE CMD,'K + TRNN CMD,2 + JRST READ1A ;GET FILE NAME + JRST DOIT ;DON'T WANT FILE NAME--GO TO WORK + +ALTMOD: MOVEI C,"$ + JSP P,TYO ;ECHO DOLLAR SIGN + JUMPLE WRITE,ALT2 ;JUMP IF NOT LAST TYPED + JUMPN CMD,ONOFF ;JUMP IF + HRRM WRITE,SADR ;SET STARTING ADDR + JRST READ +ALT2: TLC D,360000 + TLCN D,360000 ;DON'T SKIP IF SINGLE CHARACTER BEFORE + JUMPE CMD,ALT1 ;JUMP IF NO COMMAND ALREADY TYPED +DOIT: MOVEM B,FN2 ;STORE SECOND FILE NAME + HRRZ B,MU + HRRM B,CU ;MAKE MASTER UNIT CURRENT UNIT + MOVNI WRITE,1 + JSP P,LODUMP ;DUMP OUT PSEUDO-CORE + CAIN CMD,'G + JRST LOADG0 ;GO + JSP TT,RDTUT + MOVE C,SYSN +MLOOK2: MOVSI WRITE,1 ;MAKE WRITE INDICATE LOAD + MOVEI BLOK,MFDBLK + MOVEI UNIT,DIR + JSP TT,RD ;READ MASTER DIRECTORY TO FIND WHERE USER DIRECTORY IS + MOVE T,DIR+MDCHK + CAME T,[SIXBIT /M.F.D./] + JSR EMFC,ERROR + CAIN CMD,'S + JRST LISTS ;LIST DISK ID'S AND SYSTEM NAMES + MOVE C,SYSN + MOVE T,DIR+MDNAMP +MLOOK: CAMN C,DIR+MNUNAM(T) ;LOOK UP SYSTEM NAME + JRST MLOOK1 + ADDI T,LMNBLK + CAIGE T,2000 + JRST MLOOK + JSR ESNF,ERROR ;NOT FOUND + +MLOOK1: MOVEI BLOK,2*NUDSL-2000(T) ;CONVERT USER SLOT TO BLOCK NUMBER + LSH BLOK,-1 + HRRM BLOK,UDBLK ;REMEMBER FOR KILL OR DUMP + MOVEI UNIT,DIR + JSP TT,RDM ;READ USER DIRECTORY +ULOOK: CAME C,DIR+UDNAME + JSR ECDR,ERROR ;WRONG ONE?? + CAIE CMD,'F + CAIN CMD,'U + JRST LISTFC ;LIST USER DIRECTORY + MOVSI TT,UNIGFL + MOVE T,DIR+UDNAMP + MOVE A,FN1 + MOVE B,FN2 +ULOOK1: CAMN A,DIR+UNFN1(T) ;LOOK UP FILE NAME + CAME B,DIR+UNFN2(T) + JRST ULOOK2 + TDNN TT,DIR+UNRNDM(T) ;IS THIS FILE FOR REAL? + JRST ULOOK3 +ULOOK2: ADDI T,LUNBLK + CAIGE T,2000 + JRST ULOOK1 + CAIE CMD,'D ;IF NOT FOUND BETTER BE DUMP + JSR EFNF,ERROR + MOVE T,DIR+UDNAMP +ULOOK4: SKIPN DIR+UNFN1(T) ;FIND FREE SLOT FOR NEW FILE + JRST DUMP + ADDI T,LUNBLK + CAIGE T,2000 + JRST ULOOK4 + MOVNI T,LUNBLK ;NO FREE SLOTS--TRY TO EXTEND NAME AREA DOWN + ADDM T,DIR+UDNAMP + MOVE T,DIR+UDESCP + IDIVI T,6 + ADDI T,UDDESC + CAMGE T,DIR+UDNAMP ;DID WE RUN INTO DESCRIPTOR AREA? + JRST DUMP0 + JSR EDIR,ERROR ;YES +ULOOK3: HRRM T,DMP4 ;IF FILE FOUND, SAVE SLOT NUMBER FOR DUMP + LDB C,[UNDSCP DIR+UNRNDM(T)] + JSP TT,GBP + MOVEM C,DIRPT ;SET UP DESCRIPTOR AREA BYTE POINTER + MOVSI TT,UNLINK + TDNE TT,DIR+UNRNDM(T) + JRST LINK ;FILE IS A LINK + LDB A,[UNPKN DIR+UNRNDM(T)] +ULOOK5: CAMN A,TUT+QPKNUM ;SEE IF IT'S MOUNTED + JRST LOAD + JSP TT,NXTTUT + JRST ULOOK5 + JSR EPNM,ERROR + +LOAD: CAIE CMD,'D ;GET HERE IF FILE FOUND + CAIN CMD,'K ;IF DUMP OR KILL, DELETE IT + JRST KILL +ZERO: MOVEI TT,CORE-1 + TRNN CMD,20 + JRST ZERO1 + MOVE B,SADR + SUBI B,1 + JSP P,FD ;GET DDT'S SYMBOL TABLE POINTER + JSR EDDT,ERROR ;CAN'T GET IT?? + HRROS B,(C) ;TELL DDT ITS SYMBOL TABLE WAS BUGGERED + HRRM B,LOADS4 + JSP P,FD + JSR EDDT,ERROR + MOVE D,(C) + MOVEM D,DDTM2 + MOVEI TT,CORE-1 + CAILE TT,(D) + HRRZ TT,D +ZERO1: TRNE CMD,1 + JRST LOAD1 ;NON-ZEROING COMMAND + SETZM 40 ;BEGIN CLEARING CORE + MOVE T,[40,,41] ;SET UP BLT POINTER +IFE FULHSW,[ ;CODE TO SKIP OVER NXM +ZERO2: CAIG TT,10*2000-1(T) ;MORE THAN 8K LEFT TO ZERO? + JRST ZERO4 ;NO, ZERO REMAINING WORDS AND PROCEED + BLT T,10*2000-1(T) ;ZERO NEXT 8K +ZERO3: ADDI T,10*2000 ;MOVE DEST OF BLT PNTR UP 8K + ANDCMI T,1777 ;ROUND DOWN TO 1K BOUNDARY + CONO 10000 ;CLEAR NXM + MOVES (T) ;SET NXM IF HOLE + CONSZ 10000 ;NXM GENERATED? + JRST ZERO3 ;YES, GO TO NEXT 8K + JRST ZERO2 ;NO, CLEAR THIS 8K +ZERO4:] + BLT T,(TT) ;AND CLEAR TO TOP BOUNDARY + TRNE CMD,20 + JRST LOAD1 ;IF SYMBOL-LOADING COMMAND, STOP THERE + CLEARM CBUF + MOVE T,[CBUF,,CBUF+1] + BLT T,CBUF+1777 + MOVEI UNIT,CBUF + MOVE BLOK,[-5,,CBLK] + JSP TT,WRM ;CLEAR PSEUDO-CORE + AOBJN BLOK,.-1 +LOAD1: SETZB BUFP,BLKCNT ;SET UP BUFP SO FIRST CALL TO WD WILL READ +LOAD2: JSP P,WD ;FIRST BLOCK OF FILE + CAME D,[JRST 1] ;LOOK FOR END OF SBLK LOADER + JRST LOAD2 + CAIN CMD,'I ;IF VERIFY, START SIMULATING DUMP + JRST DUMP.5 +LOAD3: JSP P,WD ;READ BLOCK HEADER + JUMPGE D,LOADS ;IT'S A JUMP BLOCK + MOVE A,D + MOVE B,D + JSR LOADB ;LOAD LOGICAL BLOCK INTO CORE + JRST LOAD3 + +LOADS: TRNN CMD,20 + JRST LOADJ ;DON'T LOAD SYMBOLS + MOVEM D,NXTBW3 ;SAVE S.A. +LOADS1: MOVE B,DDTM2 + JSP P,WD ;GET SYMBOL BLOCK HEADER + JUMPGE D,LOADS2 ;JUMP IF END OF SYMBOLS + MOVSS D + HRLI D,-1(D) + ADD B,D ;EFFECTIVELY SUBTRACTS LENGTH OF BLOCK FROM BOTH HALVES + MOVEM B,DDTM2 ;OF SYMBOL TABLE POINTER + HRL B,D ;SET UP AOBJN POINTER IN B + HRLZ A,D ;AND RECREATE HEADER IN A + JSR LOADB ;LOAD THE SYMBOLS + JRST LOADS1 + +LOADS2: MOVE D,DDTM2 +LOADS4: MOVEI B,. ;PNTR TO SYMTAB PNTR + JSP P,FD ;PUT BACK SYMBOL TABLE POINTER + JSR EBUG,ERROR ;CAN'T PUT IT BACK?? + MOVEM D,(C) + MOVE D,NXTBW3 ;"GIVE" S.A. TO DDT + JRST LOADG0 + +LOADJ: HRRM D,SADR ;SET STARTING ADDRESS FROM JUMP BLOCK +LOADG0: MOVE T,[CONSZ DPC,BUSY] + MOVEM T,BOOT +LOADG: JSP TT,WRCB ;MAKE SURE ALL LOADED CRUFT IN PSEUDO-CORE IS OUT + MOVEI WRITE,0 + JSP P,LODUMP ;AND LOAD IT ALL IN + TRNE CMD,10 + JRST READ ;NON-GOING COMMAND +GO: DATAO DPC,CLATT + MOVE B,ERRWD + MOVEM B,@ICWA + CLEARM ICWA+3 + DATAO DPC,SWPSK + CONSO DPC,DONE + JRST .-1 + DATAO DPC,SWPOU1 + CONSO DPC,DONE + JRST .-1 + DATAO DPC,SWPOU2 + JRST WAIT + +LOADB: 0 +LOAD4: JSP P,WD ;LOAD A LOGICAL BLOCK--AOBJN POINTER IN B, + ROT A,1 ;BLOCK HEADER IN A (FOR CHECKSUM) + ADD A,D ;ADD NEW WORD INTO CHECKSUM + JSP P,FD ;AND PREPARE TO SMASH IT AWAY + JRST .+2 ;LOCATION CAN'T BE LOADED + MOVEM D,(C) ;SMASH WORD AWAY + AOBJN B,LOAD4 + JSP P,WD + CAMN A,D ;CHECK THE CHECKSUM + JRST @LOADB + JSR ECKS,ERROR ;BAD CHECKSUM + +LISTS: JSP P,CRLF +LISTS2: CONSZ TTY,40 + JRST LOADG1 ;SHUT UP IF KEY HIT + MOVE C,TUT+QPKNUM ;TYPE PACK NUMBER + JSP TT,PNO + MOVE D,TUT+QPKID ;AND I.D. + JSP TT,PD2 + JSP TT,NXTTUT ;SAME FOR ALL DIRECTORIES + JRST LISTS2 + MOVE T,DIR+MDNAMP +LISTS1: CONSO TTY,40 ;STOP TYPING IF TTI FLAG ON + CAIL T,2000 + JRST LOADG1 + SKIPE D,DIR+MNUNAM(T) + JSP TT,PD ;TYPE OUT USER NAME + ADDI T,LMNBLK + JRST LISTS1 + +LISTFC: MOVE T,DIR+UDNAMP +LISTF1: CONSO TTY,40 ;STOP TYPING IF TTI FLAG ON + CAIL T,2000 + JRST LOADG1 + SKIPN DIR+UNFN1(T) ;SKIP IF FILE IN THIS SLOT + JRST LISTF2 + JSP P,CRLF + LDB C,[UNPKN DIR+UNRNDM(T)] + JSP TT,PNO ;TYPE PACK NUMBER + MOVE D,DIR+UNFN1(T) + JSP TT,PD2 ;TYPE FIRST FILE NAME + MOVE D,DIR+UNFN2(T) + JSP TT,PD2 ;AND SECOND FILE NAME +LISTF2: ADDI T,LUNBLK + JRST LISTF1 + +KILL: JSP TT,NXTB6 ;GET HERE ON KILL OR DUMP OF EXISTING FILE + MOVEI T,0 ;ZERO BYTES IN USER DIRECTORY DESCIPTOR AREA + DPB T,DIRPT ;NXTB6 JUMPS TO KILL1 AT END OF FILE + MOVE C,BLOK + JSP TT,GTP + ILDB T,C + CAIGE T,TUTLK-1 ;SOS USAGE OF THIS BLOCK + SOJL T,[JSR ECDR,ERROR] + DPB T,C + JRST KILL +KILL1: HRRZ T,DMP4 ;CLEAR OUT USER DIRECTORY SLOT + CLEARM DIR+UNFN1(T) + CLEARM DIR+UNFN2(T) + CLEARM DIR+UNRNDM(T) + MOVSI WRITE,-1 + CAIN CMD,'K + JRST KILDMP ;IF KILL DON'T DUMP + JRST DMP4 ;MUST DUMP ON SAME UNIT + +DUMP0: MOVE T,DIR+UDNAMP ;GET HERE IF SLOT CREATED AT BOTTOM OF NAME AREA +DUMP: HRRM T,DMP4 ;GET HERE IF EMPTY SLOT FOUND IN NAME AREA +DMP0: MOVEI D,0 ;GET HERE IF USING SLOT OF OLD FILE +DMP1: MOVE C,TUT+QSWAPA + MOVSI B,-NBLKS(C) + JSP TT,GTP +DMP2: ILDB T,C + SKIPE T + SUBI B,1 + AOBJN B,DMP2 + CAIG B,(D) ;RH OF D IS HIGHEST SO FAR, LH SAYS WHICH UNIT + JRST DMP5 ;NOT BETTER THAN RECORD + MOVE D,B ;NEW RECORD--RECORD IT + HRL D,CU +DMP5: JSP TT,NXTTUT ;TRY NEXT + JRST DMP1 + ;FALLS THRU AT END + +DMP3: HLRM D,CU ;SET CURRENT UNIT TO ONE WITH MOST FREE BLOCKS + JSP TT,RDTUT ;GET ITS TUT +DMP4: MOVEI T,. + MOVE A,FN1 + MOVE B,FN2 + MOVEM A,DIR+UNFN1(T) ;PUT CRUFT INTO SLOT + MOVEM B,DIR+UNFN2(T) + SETOM DIR+UNDATE(T) + MOVEM A,XWDS+XWFN1 + MOVEM B,XWDS+XWFN2 + MOVE C,SYSN + MOVEM C,XWDS+XWSYSN + MOVE C,DIR+UDESCP ;PUT DESCRIPTOR CHARACTER ADDRESS + MOVE B,TUT+QPKNUM ;AND PACK NUMBER + DPB B,[UNPKN C] + MOVEM C,DIR+UNRNDM(T) ;INTO USER DIRECTORY SLOT + MOVE C,TUT+QSWAPA + MOVEM C,LBLOCK + JSP TT,GTP + MOVEM C,TUTPT ;INITIALIZE TUT POINTER + MOVE C,DIR+UDESCP + JSP TT,GBP + MOVEM C,DIRPT ;INITIALIZE DESCRIPTOR AREA POINTER + SETOB WRITE,BLKCNT ;FORCE NXTBW TO LOAD ADR + HRLOI BUFP,-2001-1 ;SET UP BUFP SO FIRST WORD GOES IN DBUF+0 + MOVE D,[JRST 1] + JSP P,WD ;END OF SBLK LOADER + +DUMP.5: MOVSI WRITE,-'I(CMD) ;GET HERE IF VERIFY--SET WRITE NEGATIVE IF + MOVEI B,40 ;DUMP AND ZERO IF VERIFY--FIRST ADDR DUMPED IS 40 +DUMP1: +IFE FULHSW,[ ;SKIP OVER NXM ON DUMPING + CONSO 10000 ;NXM SET? + JRST DUMP1A ;NO, CONTINUE IN SEQUENCE + ADDI B,10*2000-1 ;SKIP 8K + TRZ B,1777 ;ROUND DOWN TO 8K BOUDARY + CONO 10000 ;CLEAR NXM +DUMP1A:] + JSP P,FD + JRST DUMPJ ;TIME TO WRITE JUMP BLOCK + SKIPN (C) ;LOOK FOR NON-ZEROES + AOJA B,DUMP1 + MOVE A,B ;FOUND SOME + HRLI B,-200 ;DON'T DUMP MORE THAN 200 OF THEM +DUMP2: JSP P,FD + JRST DUMP3 ;END OF CORE--WRITE OUT THIS BLOCK + SKIPE (C) ;LOOK FOR ZEROES + JRST DUMP2A + AOBJP B,DUMP3 ;JUMPS IF WE HAVE 200 WORDS' WORTH OF CRUD ANYWAY + JSP P,FD + JRST DUMP3 + SUBI B,1 + SKIPE (C) ;IF NOT TWO ZEROES DON'T END BLOCK +DUMP2A: AOBJN B,DUMP2 ;UNLESS THERE ARE ALREADY 200 WORDS +DUMP3: HRRM B,DUMP4 ;SAVE ADDRESS TO CONTINUE SEARCH + SUBM A,B ;GET MINUS THE LENGTH OF THE BLOCK + HRL A,B ;SET UP HEADER IN A + MOVE B,A ;AND B + MOVE D,A ;AND D + JSP P,WD ;WRITE HEADER +DUMP3A: JSP P,FD + JSR EBUG,ERROR ;CAN'T FETCH WORD WE FETCHED BEFORE?? + MOVE D,(C) + ROT A,1 + ADD A,D ;COMPUTE CHECKSUM + JSP P,WD + AOBJN B,DUMP3A + MOVE D,A + JSP P,WD ;WRITE OUT CHECKSUM +DUMP4: MOVEI B,. ;AND CONTINUE SEARCHING + JRST DUMP1 + +GTP: IDIVI C,36./TUTBYT + IMULI A,-10000*TUTBYT + HRLI C,440000+TUTBYT_6(A) + ADDI C,TUT + JRST (TT) + +DUMPJ: MOVE D,SADR + JSP P,WD ;WRITE OUT JUMP BLOCK + JUMPE WRITE,LOADG1 ;IF VERIFY, THAT'S ALL + JSP P,WD ;INDICATE NO SYMBOLS IN FILE + JSP TT,NXTBLK + JSP TT,WRDB ;WRITE OUT LAST BLOCK + SKIPE T,BLKCNT + JSR NXTBW3 ;STORE LAST DESCRIPTOR BYTE + MOVEI T,0 + JSR NXTBW3 ;AND INDICATE END OF FILE + LDB T,[360600,,DIRPT] + IDIVI T,6 + HRRZ TT,DIRPT + IMULI TT,6 + SUBI TT,6*-5-1(T) + HRRZM TT,DIR+UDESCP ;INDICATE NEW END OF DESCRIPTOR AREA +KILDMP: MOVEI UNIT,TUT + MOVEI BLOK,TUTBLK + JSP TT,WRD ;WRITE OUT MASTER DIRECTORY ON THIS UNIT + HRRZ B,CU + HRRM B,KD2 ;WRITE OUT USER DIRECTORY ON ALL UNITS +KD1: AOJ B, + CAIN B,NDSK + MOVEI B,0 + HRRM B,CU + SKIPE QDED(B) + JRST KD2 + MOVEI UNIT,DIR +UDBLK: MOVEI BLOK,. + JSP TT,WR +KD2: CAIN B,. + JRST LOADG1 + JRST KD1 + +ERRCT: 0 ;ERROR COUNTER +DDTM2: 0 ;DDT SYMBOL TABLE POINTER +LBLOCK: 0 ;LAST BLOCK WRITTEN OR READ +BLKCNT: 0 ;NUMBER OF BLOCKS READ OR WRITTEN CONSECUTIVELY +DIRPT: 0 ;DESCRIPTOR AREA BYTE POINTER +TUTPT: 0 ;TUT BYTE POINTER +FN1: 0 ;FILE NAME 1 +FN2: 0 ;FILE NAME 2 +PKNUM: REPEAT NDSK,-1 +QDED: BLOCK NDSK +XWDS: BLOCK NXWDS +CONSTA +BLOCK <.\67>-. +BADBLK: 0 ;BLOCK WITH HDWE ERROR +IRP XX,,\<.-1> +IF1,PRINTX BADBLK=XX + TERMIN +BLOCK ERROR+1700-. + +CBOOT: CLEARM MEMSIZ-1 ;BOOTSTRAP +BOOT: JRST BEG ;OR CONSZ DPC,BUSY OR JRST LOADG1 + JRST .-1 + MOVEI B,ICWA+2 ;SET UP CHANNEL PROG + MOVEM B,ICWA + SETZM ICWA+1 + SETZM ICWA+3 + DATAO DPC,CLATT1 + MOVE B,ERRWD + MOVEM B,@ICWA + DATAO DPC,SWPSK ;POSITION + CONSO DPC,DONE + JRST .-1 + DATAO DPC,SWPIN1 ;WRITE TOP BLOCK EXCEPT FOR TOP 100 WDS + CONSO DPC,DONE + JRST .-1 + DATAO DPC,SWPIN2 ;READ IN DSKDMP + CONSO DPC,DONE + JRST .-1 + JRST BEG + +ERRWD: -1700,,ERROR-1 +CLATT1: DEASEC ALLATT +SWPSK: DSEEKC+200._22. +SWPIN1: DWRITC+200._22.+3_17.+6._12.+ICWA ;NBLKS 4 +SWPIN2: DREADC+200._22.+4_17.+5._12.+ICWA ;NBLKS 5 +SWPOU1: DWRITC+200._22.+4_17.+5._12.+ICWA ;NBLKS 5 +SWPOU2: DREADC+200._22.+3_17.+6_12.+ICWA ;NBLKS 4 + +WAIT: CONSO DPC,DONE + JRST .-1 +SADR: JRST BOOT ;AND GO TO PROGRAM TO BE STARTED +SYSN: SIXBIT /./ + +OFFSET 0 +LOC CORE +CBUF: BLOCK 2000 ;PSEUDO-CORE BUFFER +DBUF: BLOCK 2000 ;DISK BUFFER +DIR: BLOCK 2000 ;DIRECTORY BUFFER +TUT: BLOCK 2000 +IFN .&777777-ERROR,PRINTX ;UGH +; +END ZZZ +  \ No newline at end of file diff --git a/src/mlsys/dskdmp.switch b/src/mlsys/dskdmp.switch new file mode 100644 index 00000000..af214d67 --- /dev/null +++ b/src/mlsys/dskdmp.switch @@ -0,0 +1,5 @@ +;PARAMETER FILE FOR DSKDMP +FULHSW==0 ;NON ZERO MEANS LOTS OF CORE +MEMSIZ=1000000 ;ACTUAL SIZE OF MEM +DBGSW==0 ;1 TO DEBUG THIS WITH DDT +  \ No newline at end of file diff --git a/src/mlsys/its.bin b/src/mlsys/its.bin new file mode 100644 index 0000000000000000000000000000000000000000..d02dada4e8f7ee6cd16f9dc3444fc352f913dee7 GIT binary patch literal 197922 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

cA?Bbg*Y|HS6vSbH^$GHsEu*ySx8e3vDi#e znJ=XgvaiV0AVcqyQd+R$4R^;n(I{`=xB5~*^cWL8JQ9DxZ!`l=Y=~72hvYSRF$r^R zNWwJ`r>yqj2BoUcoZ#-Qth7n5j4&d^BAr2S(vn9l%2hV#Vy64AYWx{`@J$&W1oaHU z@z|IrPIP%dC>NF%R5;8|Y&*kgbBHpHllu1bEGQ$RZZJC+5#J#eZWz++s~4q>gc~%K zubG5W1bC{k5pRE}Y8sV|@x>&ZOiX3N9}<>8{a5{2w?C;)z@TkR#Bt=R!}1B)ZCna3 zEe!p6PhvB62l5ij8lH6AT8Pr{oC<O?Uk$d{~)BtWH=jJN@6N!DiBk3Msooj7y>1&UDvL2W4l zcHKoHn57g<⪼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 literal 0 HcmV?d00001 diff --git a/src/mlsys/itsdin.6 b/src/mlsys/itsdin.6 new file mode 100644 index 00000000..e308e00b --- /dev/null +++ b/src/mlsys/itsdin.6 @@ -0,0 +1,118 @@ + +QINTE: CONI DPC,TT ;GET CONDITIONS + DATAI DPC,R + CONO DPC,175700+DSKCHN ;RESET CONDITIONS + MOVEM TT,QERST + CONSZ DPC,20 ;WAIT FOR UNBUSY + JRST 4,.-1 + MOVE E,QCHPRG + TRNE TT,20000 ;OVERRUN + JRST QOVR + TRNE TT,2000 ;NOT READY + JRST QNRDY + TDNE TT,[12010700] ;BITS 14,16,23,27-29 ARE LOSERS + JRST 4,. + TLNE TT,5 ;WD OR SECTOR PARITY ERROR + JRST QDE + TRNE TT,1000 ;WRITE LOCKED + JRST QIRWRE + TRNE TT,40000 ;SEARCH FAILED + JRST QHE + TRNN TT,100000 ;POWER FAILURE + JRST QINTE1 + CONSZ DPC,100000 ;TRY IT AGAIN + JRST 4,.-1 + JRST QHE +QINTE1: TLNE R,10 ;FILE UNSAFE + JRST 4,. ;NEED OPERATOR INTERVENTION + TLNE R,4 + JRST 4,. ;NO SUCH DRIVE + TLNE R,100 ;POSITION FAILURE + JRST QHE + AOS NQSE ;SPURIOUS ERROR + JRST QINTX ;IGNORE + +QIRWRE: JRST 4,. ;IRRECOVERABLE WRITE ERROR + +QNRDY: LDB Q,[410300,,R] ;WHICH DPC + SKIPN QSEEK(Q) + SKIPGE QRCAL(Q) ;NOT SEEKING OR RECALIBRATING IS ERROR + JRST QINTN2 + JRST 4,. + +QINTAT: CONI DPC,QERST + SETZM QSEEK(Q) + DATAO DPC,QATTNS(Q) ;CLEAR ATTNS + DATAI DPC,E + TLNN E,40 + JRST QREC + SETZM QRCAL(Q) + LDB E,[311000,,E] + MOVEM E,QPOS(Q) ;REMEMBER WHERE IT IS AT + JRST QINT ;TRY AGAIN + +QINT: AOS QGTBZY + MOVEM TT,QCST + TDNE TT,[17377700] ;ANY ERRORS? + JRST QINTE +QINTN2: DATAI DPC,R + SKIPGE QSDU ;DONT CLOB CMD BUF TO CLR ATTS DURING DATA XFER + TRNN R,776 ;ANY ATTNS + JRST QINTA ;NO +FINDQ: LDB I,[11000,,R] ;YES,FIND WHICH DRIVE + JFFO I,.+1 ;CLOBBERS Q + SUBI Q,28. + JRST QINTAT + +QINTA: SKIPGE Q,QSDU + JRST QINT1 ;NOT EXPECTING DATA COMPLETION + CONSO DPC,400000 + CONSO DPC,10 + JRST DSKEX + CONSZ DPC,20 + JRST 4,.-1 ;BUSY? + JRST QINTA1 QINT6A: IORI T,7000+ICWA ;DON'T STOP FOR PARITY ERRORS (PLUS INITIAL CHNL ADR) + MOVEM T,QCHPRG + DPB Q,[DUNFLD+QCHPRG] + HLLZS QICWA + DPB R,[121000,,QICWA] + MOVE E,R + LSH E,-10. + TRC E,7 + DPB E,[410300,,QICWA] ;SET UP HIGH ADR BITS + SOS TT,QICWA + MOVE E,QSGL(C) + PUSHJ P,QPOSR + IORB E,QCHPRG + SETOM QSLDD(C) +QOVR: CONSZ DPC,20 + JRST QOVR + CONO DPC,175700+DSKCHN + MOVEI TT,QICWA + HRRZM TT,ICWA + LDB TT,[DCYL E] + CAME TT,QPOS(Q) + JRST DSKEX ;DONT DO ANYTHING IF NOT WHERE YOU SHOULD BE + SETZM ICWA+1 + DATAO DPC,QCHPRG ;ENTRY ON OVERRUN + MOVE A,TIME + MOVEM A,LQTM + MOVEM Q,QSDU +QINTX: JRST DSKEX + + + QPOSR: CAIL E,NBLKS + JRST 4,. + MOVEI D,0 + IDIVI E,NBLKSC + DPB E,[DCYL+D] + MOVEM E,QSPPS(Q) + MOVE E,TT + IMULI E,NSSECS + IDIVI E,NHSECS + DPB E,[DSURF+D] + DPB TT,[DSECT+D] + DPB Q,[DUNFLD+D] + MOVE E,D + POPJ P, +  \ No newline at end of file diff --git a/src/mlsys/itsdin.7 b/src/mlsys/itsdin.7 new file mode 100644 index 00000000..030ef11e --- /dev/null +++ b/src/mlsys/itsdin.7 @@ -0,0 +1,117 @@ + +QINTE: CONI DPC,TT ;GET CONDITIONS + DATAI DPC,R + CONO DPC,175700+DSKCHN ;RESET CONDITIONS + MOVEM TT,QERST + CONSZ DPC,20 ;WAIT FOR UNBUSY + JRST 4,.-1 + MOVE E,QCHPRG + TRNE TT,20000 ;OVERRUN + JRST QOVR + TRNE TT,2000 ;NOT READY + JRST QNRDY + TDNE TT,[12010700] ;BITS 14,16,23,27-29 ARE LOSERS + JRST 4,. + TLNE TT,5 ;WD OR SECTOR PARITY ERROR + JRST QDE + TRNE TT,1000 ;WRITE LOCKED + JRST QIRWRE + TRNE TT,40000 ;SEARCH FAILED + JRST QHE + TRNN TT,100000 ;POWER FAILURE + JRST QINTE1 + CONSZ DPC,100000 ;TRY IT AGAIN + JRST 4,.-1 + JRST QHE +QINTE1: TLNE R,10 ;FILE UNSAFE + JRST 4,. ;NEED OPERATOR INTERVENTION + TLNE R,4 + JRST 4,. ;NO SUCH DRIVE + TLNE R,100 ;POSITION FAILURE + JRST QHE + AOS NQSE ;SPURIOUS ERROR + JRST QINTX ;IGNORE + +QIRWRE: JRST 4,. ;IRRECOVERABLE WRITE ERROR + +QNRDY: LDB Q,[410300,,R] ;WHICH DPC + SKIPN QSEEK(Q) + SKIPGE QRCAL(Q) ;NOT SEEKING OR RECALIBRATING IS ERROR + JRST QINTN2 + JRST 4,. + +QINTAT: CONI DPC,QERST + SETZM QSEEK(Q) + DATAO DPC,QATTNS(Q) ;CLEAR ATTNS + DATAI DPC,E + TLNN E,40 + JRST QREC + SETZM QRCAL(Q) + LDB E,[311000,,E] + MOVEM E,QPOS(Q) ;REMEMBER WHERE IT IS AT + JRST QINT ;TRY AGAIN + +QINT: AOS QGTBZY + MOVEM TT,QCST + TDNE TT,[17377700] ;ANY ERRORS? + JRST QINTE +QINTN2: DATAI DPC,R + SKIPGE QSDU ;DONT CLOB CMD BUF TO CLR ATTS DURING DATA XFER + TRNN R,776 ;ANY ATTNS + JRST QINTA ;NO +FINDQ: LDB I,[11000,,R] ;YES,FIND WHICH DRIVE + JFFO I,.+1 ;CLOBBERS Q + SUBI Q,28. + JRST QINTAT + +QINTA: SKIPGE Q,QSDU + JRST QINT1 ;NOT EXPECTING DATA COMPLETION + CONSO DPC,400000 + CONSO DPC,10 + JRST DSKEX + CONSZ DPC,20 + JRST 4,.-1 ;BUSY? + JRST QINTA1 QINT6A: IORI T,7000+ICWA ;DON'T STOP FOR PARITY ERRORS (PLUS INITIAL CHNL ADR) + MOVEM T,QCHPRG + DPB Q,[DUNFLD+QCHPRG] + HLLZS QICWA + DPB R,[121000,,QICWA] + LDB E,[100100,,R] ;MA17 + TRC E,7 + DPB E,[410300,,QICWA] ;SET UP HIGH ADR BITS + SOS TT,QICWA + MOVE E,QSGL(C) + PUSHJ P,QPOSR + IORB E,QCHPRG + SETOM QSLDD(C) +QOVR: CONSZ DPC,20 + JRST QOVR + CONO DPC,175700+DSKCHN + MOVEI TT,QICWA + HRRZM TT,ICWA + LDB TT,[DCYL E] + CAME TT,QPOS(Q) + JRST DSKEX ;DONT DO ANYTHING IF NOT WHERE YOU SHOULD BE + SETZM ICWA+1 + DATAO DPC,QCHPRG ;ENTRY ON OVERRUN + MOVE A,TIME + MOVEM A,LQTM + MOVEM Q,QSDU +QINTX: JRST DSKEX + + + QPOSR: CAIL E,NBLKS + JRST 4,. + MOVEI D,0 + IDIVI E,NBLKSC + DPB E,[DCYL+D] + MOVEM E,QSPPS(Q) + MOVE E,TT + IMULI E,NSSECS + IDIVI E,NHSECS + DPB E,[DSURF+D] + DPB TT,[DSECT+D] + DPB Q,[DUNFLD+D] + MOVE E,D + POPJ P, +  \ No newline at end of file diff --git a/src/mlsys/itsdin.8 b/src/mlsys/itsdin.8 new file mode 100644 index 00000000..d4963d7e --- /dev/null +++ b/src/mlsys/itsdin.8 @@ -0,0 +1,119 @@ + +QINTE: CONI DPC,TT ;GET CONDITIONS + DATAI DPC,R + CONO DPC,175700+DSKCHN ;RESET CONDITIONS + MOVEM TT,QERST + CONSZ DPC,20 ;WAIT FOR UNBUSY + JRST 4,.-1 + MOVE E,QCHPRG + TRNE TT,20000 ;OVERRUN + JRST QOVR + TRNE TT,2000 ;NOT READY + JRST QNRDY + TDNE TT,[12010700] ;BITS 14,16,23,27-29 ARE LOSERS + JRST 4,. + TLNE TT,5 ;WD OR SECTOR PARITY ERROR + JRST QDE + TRNE TT,1000 ;WRITE LOCKED + JRST QIRWRE + TRNE TT,40000 ;SEARCH FAILED + JRST QHE + TRNN TT,100000 ;POWER FAILURE + JRST QINTE1 + CONSZ DPC,100000 ;TRY IT AGAIN + JRST 4,.-1 + JRST QHE +QINTE1: TLNE R,10 ;FILE UNSAFE + JRST 4,. ;NEED OPERATOR INTERVENTION + TLNE R,4 + JRST 4,. ;NO SUCH DRIVE + TLNE R,100 ;POSITION FAILURE + JRST QHE + AOS NQSE ;SPURIOUS ERROR + JRST QINTX ;IGNORE + +QIRWRE: JRST 4,. ;IRRECOVERABLE WRITE ERROR + +QNRDY: LDB Q,[410300,,R] ;WHICH DPC + SKIPN QSEEK(Q) + SKIPGE QRCAL(Q) ;NOT SEEKING OR RECALIBRATING IS ERROR + JRST QINTN2 + JRST 4,. + +QINTAT: CONI DPC,QERST + SETZM QSEEK(Q) + DATAO DPC,QATTNS(Q) ;CLEAR ATTNS + DATAI DPC,E + TLNN E,40 + JRST QREC + SETZM QRCAL(Q) + LDB E,[311000,,E] + MOVEM E,QPOS(Q) ;REMEMBER WHERE IT IS AT + JRST QINT ;TRY AGAIN + +QINT: AOS QGTBZY + MOVEM TT,QCST + TDNE TT,[17377700] ;ANY ERRORS? + JRST QINTE +QINTN2: DATAI DPC,R + SKIPGE QSDU ;DONT CLOB CMD BUF TO CLR ATTS DURING DATA XFER + TRNN R,776 ;ANY ATTNS + JRST QINTA ;NO +FINDQ: LDB I,[11000,,R] ;YES,FIND WHICH DRIVE + JFFO I,.+1 ;CLOBBERS Q + SUBI Q,28. + JRST QINTAT + +QINTA: SKIPGE Q,QSDU + JRST QINT1 ;NOT EXPECTING DATA COMPLETION + CONSO DPC,400000 + CONSO DPC,10 + JRST DSKEX + CONSZ DPC,20 + JRST 4,.-1 ;BUSY? + JRST QINTA1 QINT6A: IORI T,7000+ICWA ;DON'T STOP FOR PARITY ERRORS (PLUS INITIAL CHNL ADR) + MOVEM T,QCHPRG + DPB Q,[DUNFLD+QCHPRG] + HLLZS QICWA + DPB R,[121000,,QICWA] + LDB E,[100100,,R] ;MA17 + TRC E,7 + DPB E,[410300,,QICWA] ;SET UP HIGH ADR BITS + MOVE TT,QICWA + SOS TT + HRRM TT,QICWA + MOVE E,QSGL(C) + PUSHJ P,QPOSR + IORB E,QCHPRG + SETOM QSLDD(C) +QOVR: CONSZ DPC,20 + JRST QOVR + CONO DPC,175700+DSKCHN + MOVEI TT,QICWA + HRRZM TT,ICWA + LDB TT,[DCYL E] + CAME TT,QPOS(Q) + JRST DSKEX ;DONT DO ANYTHING IF NOT WHERE YOU SHOULD BE + SETZM ICWA+1 + DATAO DPC,QCHPRG ;ENTRY ON OVERRUN + MOVE A,TIME + MOVEM A,LQTM + MOVEM Q,QSDU +QINTX: JRST DSKEX + + + QPOSR: CAIL E,NBLKS + JRST 4,. + MOVEI D,0 + IDIVI E,NBLKSC + DPB E,[DCYL+D] + MOVEM E,QSPPS(Q) + MOVE E,TT + IMULI E,NSSECS + IDIVI E,NHSECS + DPB E,[DSURF+D] + DPB TT,[DSECT+D] + DPB Q,[DUNFLD+D] + MOVE E,D + POPJ P, +  \ No newline at end of file diff --git a/src/mlsys/itsutp.5 b/src/mlsys/itsutp.5 new file mode 100644 index 00000000..57ff8599 --- /dev/null +++ b/src/mlsys/itsutp.5 @@ -0,0 +1,408 @@ +; T S UTAPE ROUTINES PI SERV + +TAPE: 0 +UTP1: 0 ;JRST PIPOS OR DATAI DC, OR JRST UTP3 + +BBLK + + SOS .-1 + AOSGE TAPCNT + JRST 12,@TAPE + +UTP3: CONO DTS,770001 + JRST 12,@TAPE + +PIPOS: MOVEM A,TAP1 + MOVEM B,TAP2 + MOVEM C,TAP3 + MOVE C,SUNIT + DATAI DTC,B + TDZE B,[1777#-1] + JRST PIPOS7 + MOVEM B, EUPOS(C) + HRRZM C, DG2(C) + SKIPGE UGOAL(C) + JRST PIPF1 + SUB B,UGOAL(C) + JUMPE B,PIPOS2 + ADD B,UDIR(C) + MOVMM B,UTENB + SKIPGE ULDCH(C) + JRST PIPOS3 + JUMPN B,PIPOS3 +PIPOSL: MOVEI A,40000+DCCHN_3 + DPB C,[110300,,A] ;SET SELECTED UNIT CONO DTC,FOO(A) + MOVE B,UDIR(C) + XCT UTST2(B) +PIPOS5: MOVE C,TAP3 + MOVE B,TAP2 + MOVE A,TAP1 + JRST 12,@TAPE + +PIPOS7: AOS BDBLKC + JRST PIPOSL + +EBLK + +BDBLKC: 0 + BBLK + +PIPOS3: MOVE A,UDIR(C) + LSH A,2 + SUB B,A + XOR B,UDIR(C) + MOVEI A,40000 + DPB C,[110300,,A] + JUMPG B,PIPOS4 ;GOING WRONG DIR +PIPOS6: MOVE B,TIME + MOVEM B,ULCTM(C) + ADD B,UTENB + MOVEM B,DRTM(C) +PIPF2: MOVE B,UDIR(C) + TRNN A,40000 + TRO A,30000 + XCT UTST2(B) +; CLEARM UDCC +; SETOM DCFREE + CONO DTS,770001 ;ENABLE ALL INTERUPTS AND SET FUNCTION STOP + JRST PIPOS5 + +PIPF1: MOVEI A,40000 + DPB C,[110300,,A] + MOVE B,TIME + MOVEM B,ULCTM(C) + JRST PIPF2 + PIPOS4: TRZ A,40000 ;TURN TAPE AROUND + CLEARM DG2(C) + MOVNS B,UDIR(C) + MOVEM B,OUDIR(C) + JRST PIPOS6 + +PIPOS2: HLRZ A,ULDCH(C) + SKIPL ULDCH(C) + SKIPGE UTRAC(A) + JRST PIPOS3 ;CHANNEL LOCKED + SETOM UTLDD(A) ;CHANNEL ACTUALLY LOADED TRANSFER IMMINENT + AOS SMODE + MOVEI A,0 + MOVE B,UMEMAD(C) + SKIPGE URDWR(C) + TROA A,400 ;WRITE + TLZ B,(BLKO-BLKI) + SKIPL UDIR(C) + JRST TAPFOR + TRO A,100000 + ADD B,[DATAI-BLKI 200] + MOVEM B,UTP1 + MOVNI B,200 + MOVEM B,TAPCNT + +TAP4: CONO DTC,300+DCCHN_3+UTCCHN(A) + CONO DTS,770000 + MOVE B,URDWR(C) + MOVEM B,WRITE + MOVE C,TAP3 + MOVE B,TAP2 + MOVE A,TAP1 + JRST 12,@TAPE + +TAPFOR: TRO A,200000 + HRRM B,TAPCNT + HRRI B,TAPCNT + MOVEM B,DCMLOC + MOVE B,[-200,,UTP3] + HRRM B,UTP1 + HLLM B,TAPCNT + JRST TAP4 + UTERR: CONI DTS,E + SKIPL SMODE + JRST UDATER +; SKIPGE UDCC +; SETOM DCFREE +UTER5: SKIPN C,SUNIT + JRST JDB3 + SETOM DG2(C) + SKIPL UFLAPF(C) + JRST UTER6 + CLEARM UFLAPF(C) + CLEARM EUPOS(C) + CLEARM UDIR(C) + CLEARM OUDIR(C) + CONO DTC,400000 ;STOP DRIVE + JRST JDB3 + +UTER6: AOS UTERP(C) + HRLM E,UTERP(C) + TRNN E,20000 + JRST JDB3 ;END ZONE + MOVNS B,UDIR(C) + MOVEI A,0 + SKIPGE B + MOVEI A,1103 + MOVEM A,EUPOS(C) + MOVE A,TIME + MOVEM A,ULCTM(C) + MOVEM A,DRTM(C) + JRST JDB7 + +UDATER: CONO DTS,770001 ;ENABLE ALL INTERUPTS AND STOP FUNCTION + SETOM SMODE + HLRZ D,ULDCH(C) + CLEARM UTLDD(D) + JRST JDB3 + UTCB0: MOVE C,SUNIT + AOSE CUINT ;SKIP IF CLOCK CAUSED INTERUPT + JRST JDBRK ;NOT TIME FLAG +UTCB1: MOVE B,UDIR(C) + AOSN UTHERR ;HANG UP ERROR SENT FOR SLOW CLOCK ROUTINE + JRST UTERR + JRST JDB3 + +JDDT3: MOVE A,EUPOS(C) ;AFTER DATA XFER + SUB A,UGOAL(C) + MOVMS E,A + ADD A,TIME + MOVEM A,DRTM(C) + MOVE C,[-NUNITS,,1] + MOVM B,DRTM(C) + CAMGE B,TIME + JRST JDB3 ;SOMETHING ELSE DUE + AOBJN C,.-3 + MOVE C,SUNIT + SOJLE E,JDB7 ;RELOADING FOR NEXT BLOCK + JRST JDB3 + ILLP: MOVEM D,UGOAL(C) ;LOW PRIORITY POSIT ENTRY + MOVSI A,(SETZ) + IORM A,ULDCH(C) + +UTDC: SKIPGE UGOAL(C) + POPJ P, ;UNIT IDLE + SKIPGE DG2(C) + JRST UTDC3 +UTDC1: MOVE A,EUPOS(C) ;ESTIMATE UNIT TIME AND UPDATE EUPOS + SKIPG DG2(C) ;SKIP ON EXACT POS KNOWN + SKIPN UDIR(C) ;SKIP ON UNIT RUNNING + JRST UTDC4 + MOVE B,TIME + SUBM B,ULCTM(C) + EXCH B,ULCTM(C) + IMUL B,UDIR(C) + ADD A,B ;ACTUAL ESTIMATED POSITION + MOVEM A,EUPOS(C) ;UPDATE EUPOS +UTDC4: SUB A,UGOAL(C) + MOVM B,A + CAIG B,2 + JRST UTDC2 + ADD A,UDIR(C) + MOVMS Aî + CAMLE A,B + SETZB A,B ;GOING WRONG DIR +UTDC2: CAILE B,200. + MOVEI B,200. ;LIMIT LONGEST DEAD RECKON + ADD B,TIME + MOVEM B,DRTM(C) + POPJ P, + +UTDC3: MOVEI B,0 ;NOT KNOWN EXACT POS REQUIRES IMMEDIATE ATTENTION + JRST UTDC2 + +JDBRK: CONSO DTS,2 + JRST POPRET + CONSZ DTS,670300 + JRST UTERR + CONSO DTS,100000 + JRST POPRET + SKIPL SMODE + JRST JDDTA ;DATA MODE +JDB3: +; SKIPGE UDCC +; SETOM DCFREE + HRLOI B,177777 + MOVEM B,UTTM2 + SETOM UTTM3 ;UNIT MOST URGENT + CLEARM UTTM1 ;UNIT COULD START + MOVE C,[-NUNITS,,1] + JDBRK7: SKIPGE B,UFLAPF(C) + JRST JDF1 ;FLAPPING OP +JDF2: SKIPL ULDCH(C) ;SKIP ON LOW PRIOR POSIT + SKIPGE UGOAL(C) + JRST JDB6 ;UNIT FREE +JDS1: SKIPE UDIR(C) + JRST JDBRK4 + SKIPN UTTM1 ;UNIT TO START + HRRZM C,UTTM1 + JRST JDBRK6 +JDBRK4: MOVE B,DRTM(C) + SUB B,TIME + MOVE E,B + SUB E,UTTM2 ;TIME SMOE OTHER UNIT NEEDS ATTN + JUMPL B,JDCV1 ;ALREADY OVERDUE + MOVM D,E + CAIG B,20. ;CONFLICT MORE THAN 20 BLKS AWAY + CAIL D,20. ;THEY ARE SEPARETED BY 20 BLKS + JRST JDCV1 + HRRZS C ;RELIEVE CONFLICT BY STOPPING UNIT DUE LATEST + CAMG B,UTTM2 + HRRZ C,UTTM3 +JDF5: PUSHJ P,JDSTP ;STOP UNIT + JRST JDB3 + +JDCV1: JUMPGE E,ULLP + MOVEM B,UTTM2 ;UNIT DUE SOONEST + HRRZM C,UTTM3 +ULLP: SKIPL ULDCH(C) + JRST JDBRK6 + MOVE B,TIME ;LOW PRIORITY POSIT IN PROGRESS + SUB B,ULCTM(C) + IMUL B,UDIR(C) + SKIPE DG2(C) + MOVEI B,0 + ADD B,EUPOS(C) + SUB B,UGOAL(C) + MOVMS B + CAIGE B,10. + PUSHJ P,ULLP1 ;TERM LOW PRIORITY DIRECTORY POS (COMMIT TO ACTUAL WRITE) + JDBRK6: AOBJN C,JDBRK7 + MOVE C,UTTM3 ;MOST PRESSING RUNNING UNIT + MOVE B,UTTM2 + CAIGE B,30. + JRST JDB7 ;STAY WITH PRESSING UNIT + SKIPE UTTM1 + JRST JDB5 ;START UNIT IF POSSIBLE +JDF6A: CAMG B,[10000000.] + JRST JDB7 + SETOM UIDLE + JRST POPRET + +JDF1: MOVE E,UDIRO(C) + AOJE E,JDF1A + TLNE E,100000 + JRST JDF2 +JDF1A: SKIPGE UGOAL(C) ;FLAPPING OP + SKIPGE ULDCH(C) + JRST JDF2 + SKIPE UDIR(C) + SKIPG DG2(C) + JRST .+2 + JRST JDF3A ;HAVE JUST READ IN TAPE POS + TLNN B,100000 + JRST JDF3 ;UNIT TO START FLAPPING (I.E. READ IN TAPE POS, THEN FLAP) + LDB D,[4000,,B] + TLNN B,100000 + JRST JDBRK6 + TLNN B,200000 ;ABORT FLAPPING + CAMG D,TIME + JRST JDF4 ;UNIT TO STOP FLAPPING + JRST JDBRK6 + +JDDS: CONO DTC,10000 ;DESELECT + CLEARM SUNIT + POPJ P, + +JDSTP: MOVEI A,430000 + SETZM UDIR(C) + SETZM OUDIR(C) +JDCNN: HRRZS C + CAME C,SUNIT ;DIR CONO IN A TO UNIT IN C + SKIPN SUNIT + JRST JDSTP1 + PUSHJ P,JDDS +JDSTP1: DPB C,[110300,,A] + CONO DTC,(A) + MOVEM C,SUNIT + POPJ P, + +JDF3: MOVE A,UDIRO(C) ;WANT TO FLAP + AOJE A,JDF3A1 ;DIR NOT IN + TLNE A,10000 + JRST JDF3A2 ;DIR ON WAY IN + HRRZ A,ULDCH(C) + LDB Q,[IOCH,,IOBFT(A)] + CAIE Q,NUTIC+NUTOC + JRST 4,. + LDB Q,[IOLO,,IOBFT(A)] + CAIE Q,(C) + JRST 4,. + PUSHJ P,IBRTN ;RETURN DIR BUFFER +JDF3A2: SETOM UDIRO(C) + SETZM UTASS(C) +JDF3A1: SETOM UDPWF(C) + SKIPGE DG2(C) + JRST JDF6 +JDF3A: SETOM DG2(C) ;FLAP UNIT INC(KNOWING WHERE IT IS) + MOVE E,EUPOS(C) + IMULI E,50. ;50 MS/BLOCK + IDIVI E,33. ;33 MS/(1/2 SEC) + ADDI E,30. ;15 SECS EXTRA + ADD E,TIME ;NET TIME TO STOP FLAPPING + TLO E,100000 + DPB E,[4200,,UFLAPF(C)] + LSH C,9. + CONO DTC,130000(C) ;GO REVERSE + PUSHJ P,JDDS + JRST JDB3 + +JDF6: HRRZS C + SETOM UDIR(C) + JRST JDB7 + +JDF4: TLNE B,40000 + JRST JDF4A + MOVEI A,230000 ;A SHOT OF FOWARD + PUSHJ P,JDCNN ;REEL WILL STOP + AND B,[700000,,] + ADD B,[40000,,2] + ADD B,TIME + MOVEM B,UFLAPF(C) + JRST JDB3 + +JDF4A: PUSHJ P,JDSTP + CLEARM UFLAPF(C) + CLEARM EUPOS(C) + SETOM DG2(C) + JRST JDF5 + JDB5: HRRZ C,UTTM1 + MOVE E,UGOAL(C) + CAML E,EUPOS(C) + SKIPA B,[1] + MOVNI B,1 + MOVEM B,UDIR(C) +JDB7: SKIPN B,UDIR(C) + JRST 4,. ;NOT TRYING TO GO + MOVEI A,DCCHN_3 + SKIPN SUNIT + JRST DCGB1 + CAME C,SUNIT + JRST DCGB2 + CAMN B,OUDIR(C) + TRO A,40000 ;INHIBIT START DELAY (SAME UNIT, SAME DIRECTION) +DCGB1: MOVEM C,SUNIT + MOVEM B,OUDIR(C) + TRNN A,40000 + TRO A,30000 + DPB C,[110300,,A] + XCT UTST2(B) + CONO DTS,770000 + MOVE C,[JSR TAPE] + MOVEM C,DCMLOC + MOVEM C,DCMLOC+1 + MOVE C,[JRST PIPOS] + MOVEM C,UTP1 + JRST POPRET + +DCGB2: PUSHJ P,JDDS + JRST DCGB1 + + CONO DTC,130200+UTCCHN+(A) +UTST: CONO DTC,430000+UTCCHN+(A) + CONO DTC,230200+UTCCHN+(A) + + CONO DTC,130200+UTCCHN(A) +UTST1: CONO DTC,430000+UTCCHN(A) + CONO DTC,230200+UTCCHN(A) + + CONO DTC,100200+UTCCHN(A) +UTST2: CONO DTC,400000+UTCCHN(A) + CONO DTC,200200+UTCCHN(A) + +  \ No newline at end of file diff --git a/src/mlsys/itsutp.6 b/src/mlsys/itsutp.6 new file mode 100644 index 00000000..3f2dfb97 --- /dev/null +++ b/src/mlsys/itsutp.6 @@ -0,0 +1,413 @@ +; T S UTAPE ROUTINES PI SERV + +TAPE: 0 +UTP1: 0 ;JRST PIPOS OR DATAI DC, OR JRST UTP3 + +BBLK + + SOS .-1 + AOSGE TAPCNT + JRST 12,@TAPE + +UTP3: CONO DTS,770001 + JRST 12,@TAPE + +PIPOS: MOVEM A,TAP1 + MOVEM B,TAP2 + MOVEM C,TAP3 + MOVE C,SUNIT + DATAI DTC,B + TDZE B,[1777#-1] + JRST PIPOS7 + MOVEM B, EUPOS(C) + HRRZM C, DG2(C) + SKIPGE UGOAL(C) + JRST PIPF1 + SUB B,UGOAL(C) + JUMPE B,PIPOS2 + ADD B,UDIR(C) + MOVMM B,UTENB + SKIPGE ULDCH(C) + JRST PIPOS3 + JUMPN B,PIPOS3 +PIPOSL: MOVEI A,40000+DCCHN_3 + DPB C,[110300,,A] ;SET SELECTED UNIT CONO DTC,FOO(A) + MOVE B,UDIR(C) + XCT UTST2(B) +PIPOS5: MOVE C,TAP3 + MOVE B,TAP2 + MOVE A,TAP1 + JRST 12,@TAPE + +PIPOS7: AOS BDBLKC + JRST PIPOSL + +EBLK + +BDBLKC: 0 + BBLK + +PIPOS3: MOVE A,UDIR(C) + LSH A,2 + SUB B,A + XOR B,UDIR(C) + MOVEI A,40000 + DPB C,[110300,,A] + JUMPG B,PIPOS4 ;GOING WRONG DIR +PIPOS6: MOVE B,TIME + MOVEM B,ULCTM(C) + ADD B,UTENB + MOVEM B,DRTM(C) +PIPF2: MOVE B,UDIR(C) + TRNN A,40000 + TRO A,30000 + XCT UTST2(B) +; CLEARM UDCC +; SETOM DCFREE + CONO DTS,770001 ;ENABLE ALL INTERUPTS AND SET FUNCTION STOP + JRST PIPOS5 + +PIPF1: MOVEI A,40000 + DPB C,[110300,,A] + MOVE B,TIME + MOVEM B,ULCTM(C) + JRST PIPF2 + PIPOS4: TRZ A,40000 ;TURN TAPE AROUND + CLEARM DG2(C) + MOVNS B,UDIR(C) + MOVEM B,OUDIR(C) + JRST PIPOS6 + +PIPOS2: HLRZ A,ULDCH(C) + SKIPL ULDCH(C) + SKIPGE UTRAC(A) + JRST PIPOS3 ;CHANNEL LOCKED + SETOM UTLDD(A) ;CHANNEL ACTUALLY LOADED TRANSFER IMMINENT + AOS SMODE + MOVEI A,0 + MOVE B,UMEMAD(C) + SKIPGE URDWR(C) + TROA A,400 ;WRITE + TLZ B,(BLKO-BLKI) + SKIPL UDIR(C) + JRST TAPFOR + TRO A,100000 + ADD B,[DATAI-BLKI 200] + MOVEM B,UTP1 + MOVNI B,200 + MOVEM B,TAPCNT + +TAP4: CONO DTC,300+DCCHN_3+UTCCHN(A) + CONO DTS,770000 + MOVE B,URDWR(C) + MOVEM B,WRITE + MOVE C,TAP3 + MOVE B,TAP2 + MOVE A,TAP1 + JRST 12,@TAPE + +TAPFOR: TRO A,200000 + HRRM B,TAPCNT + HRRI B,TAPCNT + MOVEM B,DCMLOC + MOVE B,[-200,,UTP3] + HRRM B,UTP1 + HLLM B,TAPCNT + JRST TAP4 + UTERR: CONI DTS,E + SKIPL SMODE + JRST UDATER +; SKIPGE UDCC +; SETOM DCFREE +UTER5: SKIPN C,SUNIT + JRST JDB3 + SETOM DG2(C) + SKIPL UFLAPF(C) + JRST UTER6 + CLEARM UFLAPF(C) + CLEARM EUPOS(C) + CLEARM UDIR(C) + CLEARM OUDIR(C) + CONO DTC,400000 ;STOP DRIVE + JRST JDB3 + +UTER6: AOS UTERP(C) + HRLM E,UTERP(C) + TRNN E,20000 + JRST JDB3 ;END ZONE + MOVNS B,UDIR(C) + MOVEI A,0 + SKIPGE B + MOVEI A,1103 + MOVEM A,EUPOS(C) + MOVE A,TIME + MOVEM A,ULCTM(C) + MOVEM A,DRTM(C) + JRST JDB7 + +UDATER: CONO DTS,770001 ;ENABLE ALL INTERUPTS AND STOP FUNCTION + SETOM SMODE + HLRZ D,ULDCH(C) + CLEARM UTLDD(D) + JRST JDB3 + UTCB0: MOVE C,SUNIT + AOSE CUINT ;SKIP IF CLOCK CAUSED INTERUPT + JRST JDBRK ;NOT TIME FLAG +UTCB1: MOVE B,UDIR(C) + AOSN UTHERR ;HANG UP ERROR SENT FOR SLOW CLOCK ROUTINE + JRST UTERR + JRST JDB3 + +JDDT3: MOVE A,EUPOS(C) ;AFTER DATA XFER + SUB A,UGOAL(C) + MOVMS E,A + ADD A,TIME + MOVEM A,DRTM(C) + MOVE C,[-NUNITS,,1] + MOVM B,DRTM(C) + CAMGE B,TIME + JRST JDB3 ;SOMETHING ELSE DUE + AOBJN C,.-3 + MOVE C,SUNIT + SOJLE E,JDB7 ;RELOADING FOR NEXT BLOCK + JRST JDB3 + ILLP: MOVEM D,UGOAL(C) ;LOW PRIORITY POSIT ENTRY + MOVSI A,(SETZ) + IORM A,ULDCH(C) + +UTDC: SKIPGE UGOAL(C) + POPJ P, ;UNIT IDLE + SKIPGE DG2(C) + JRST UTDC3 +UTDC1: MOVE A,EUPOS(C) ;ESTIMATE UNIT TIME AND UPDATE EUPOS + SKIPG DG2(C) ;SKIP ON EXACT POS KNOWN + SKIPN UDIR(C) ;SKIP ON UNIT RUNNING + JRST UTDC4 + MOVE B,TIME + SUBM B,ULCTM(C) + EXCH B,ULCTM(C) + IMUL B,UDIR(C) + ADD A,B ;ACTUAL ESTIMATED POSITION + MOVEM A,EUPOS(C) ;UPDATE EUPOS +UTDC4: SUB A,UGOAL(C) + MOVM B,A + CAIG B,2 + JRST UTDC2 + ADD A,UDIR(C) + MOVMS Aî + CAMLE A,B + SETZB A,B ;GOING WRONG DIR +UTDC2: CAILE B,200. + MOVEI B,200. ;LIMIT LONGEST DEAD RECKON + ADD B,TIME + MOVEM B,DRTM(C) + POPJ P, + +UTDC3: MOVEI B,0 ;NOT KNOWN EXACT POS REQUIRES IMMEDIATE ATTENTION + JRST UTDC2 + +JDBRK: CONSZ DTC,7 + CONSO DTS,2 + JRST POPRET + CONSZ DTS,670300 + JRST UTERR + CONSO DTS,100000 + JRST POPRET + SKIPL SMODE + JRST JDDTA ;DATA MODE +JDB3: +; SKIPGE UDCC +; SETOM DCFREE + HRLOI B,177777 + MOVEM B,UTTM2 + SETZM UTTM4 + SETOM UTTM3 ;UNIT MOST URGENT + CLEARM UTTM1 ;UNIT COULD START + MOVE C,[-NUNITS,,1] + JDBRK7: SKIPGE B,UFLAPF(C) + JRST JDF1 ;FLAPPING OP +JDF2: SKIPL ULDCH(C) ;SKIP ON LOW PRIOR POSIT + SKIPGE UGOAL(C) + JRST JDB6 ;UNIT FREE +JDS1: SKIPE UDIR(C) + JRST JDBRK4 + SKIPN UTTM1 ;UNIT TO START + HRRZM C,UTTM1 + JRST JDBRK6 +JDBRK4: MOVE B,DRTM(C) + SUB B,TIME + MOVE E,B + SUB E,UTTM2 ;TIME SOME OTHER UNIT NEEDS ATTN + JUMPL B,JDCV1 ;ALREADY OVERDUE + MOVM D,E + CAIG B,20. ;CONFLICT MORE THAN 20 BLKS AWAY + CAIL D,20. ;THEY ARE SEPARETED BY 20 BLKS + JRST JDCV1 + HRRZS C ;RELIEVE CONFLICT BY STOPPING UNIT DUE LATEST + CAMG B,UTTM2 + HRRZ C,UTTM3 +JDF5: PUSHJ P,JDSTP ;STOP UNIT + JRST JDB3 + +JDCV1: JUMPGE E,ULLP + MOVEM B,UTTM2 ;UNIT DUE SOONEST + HRRZM C,UTTM3 +ULLP: SKIPL ULDCH(C) + JRST JDBRK6 + MOVE B,TIME ;LOW PRIORITY POSIT IN PROGRESS + SUB B,ULCTM(C) + IMUL B,UDIR(C) + SKIPE DG2(C) + MOVEI B,0 + ADD B,EUPOS(C) + SUB B,UGOAL(C) + MOVMS B + CAIGE B,10. + PUSHJ P,ULLP1 ;TERM LOW PRIORITY DIRECTORY POS (COMMIT TO ACTUAL WRITE) + JDBRK6: AOBJN C,JDBRK7 + MOVE C,UTTM3 ;MOST PRESSING RUNNING UNIT + MOVE B,UTTM2 + CAIGE B,30. + JRST JDB7 ;STAY WITH PRESSING UNIT + SKIPE UTTM1 + JRST JDB5 ;START UNIT IF POSSIBLE +JDF6A: CAMG B,[10000000.] + JRST JDB7 + AOSE UTTM4 ;DON'T IF FLAP OP STILL IN PROGRESS + PUSHJ P,JDDS + SETOM UIDLE + JRST POPRET + +JDF1: MOVE E,UDIRO(C) + AOJE E,JDF1A + TLNE E,100000 + JRST JDF2 +JDF1A: SKIPGE UGOAL(C) ;FLAPPING OP + SKIPGE ULDCH(C) + JRST JDF2 + SKIPE UDIR(C) + SKIPG DG2(C) + JRST .+2 + JRST JDF3A ;HAVE JUST READ IN TAPE POS + TLNN B,100000 + JRST JDF3 ;UNIT TO START FLAPPING (I.E. READ IN TAPE POS, THEN FLAP) + LDB D,[4000,,B] + TLNN B,100000 + JRST JDBRK6 + TLNN B,200000 ;ABORT FLAPPING + CAMG D,TIME + JRST JDF4 ;UNIT TO STOP FLAPPING + SETOM UTTM4 ;INDICATE FLAP OP STILL ACTIVE + JRST JDBRK6 + +JDDS: CONO DTC,10000 ;DESELECT + CLEARM SUNIT + POPJ P, + +JDSTP: MOVEI A,430000 + SETZM UDIR(C) + SETZM OUDIR(C) +JDCNN: HRRZS C + CAME C,SUNIT ;DIR CONO IN A TO UNIT IN C + SKIPN SUNIT + JRST JDSTP1 + PUSHJ P,JDDS +JDSTP1: DPB C,[110300,,A] + CONO DTC,(A) + MOVEM C,SUNIT + POPJ P, + +JDF3: MOVE A,UDIRO(C) ;WANT TO FLAP + AOJE A,JDF3A1 ;DIR NOT IN + TLNE A,10000 + JRST JDF3A2 ;DIR ON WAY IN + HRRZ A,ULDCH(C) + LDB Q,[IOCH,,IOBFT(A)] + CAIE Q,NUTIC+NUTOC + JRST 4,. + LDB Q,[IOLO,,IOBFT(A)] + CAIE Q,(C) + JRST 4,. + PUSHJ P,IBRTN ;RETURN DIR BUFFER +JDF3A2: SETOM UDIRO(C) + SETZM UTASS(C) +JDF3A1: SETOM UDPWF(C) + SKIPGE DG2(C) + JRST JDF6 +JDF3A: SETOM DG2(C) ;FLAP UNIT INC(KNOWING WHERE IT IS) + MOVE E,EUPOS(C) + IMULI E,50. ;50 MS/BLOCK + IDIVI E,33. ;33 MS/(1/2 SEC) + ADDI E,30. ;15 SECS EXTRA + ADD E,TIME ;NET TIME TO STOP FLAPPING + TLO E,100000 + DPB E,[4200,,UFLAPF(C)] + LSH C,9. + CONO DTC,130000(C) ;GO REVERSE + PUSHJ P,JDDS + JRST JDB3 + +JDF6: HRRZS C + SETOM UDIR(C) + JRST JDB7 + +JDF4: TLNE B,40000 + JRST JDF4A + MOVEI A,230000 ;A SHOT OF FOWARD + PUSHJ P,JDCNN ;REEL WILL STOP + AND B,[700000,,] + ADD B,[40000,,2] + ADD B,TIME + MOVEM B,UFLAPF(C) + JRST JDB3 + +JDF4A: PUSHJ P,JDSTP + CLEARM UFLAPF(C) + CLEARM EUPOS(C) + SETOM DG2(C) + JRST JDF5 + JDB5: HRRZ C,UTTM1 + MOVE E,UGOAL(C) + CAML E,EUPOS(C) + SKIPA B,[1] + MOVNI B,1 + MOVEM B,UDIR(C) +JDB7: SKIPN B,UDIR(C) + JRST 4,. ;NOT TRYING TO GO + MOVEI A,DCCHN_3 + SKIPN SUNIT + JRST DCGB1 + CAME C,SUNIT + JRST DCGB2 + CAMN B,OUDIR(C) + TRO A,40000 ;INHIBIT START DELAY (SAME UNIT, SAME DIRECTION) +DCGB1: MOVEM C,SUNIT + MOVEM B,OUDIR(C) + TRNN A,40000 + TRO A,30000 + DPB C,[110300,,A] + XCT UTST2(B) + CONO DTS,770000 + MOVE C,[JSR TAPE] + MOVEM C,DCMLOC + MOVEM C,DCMLOC+1 + MOVE C,[JRST PIPOS] + MOVEM C,UTP1 + JRST POPRET + +DCGB2: PUSHJ P,JDDS + JRST DCGB1 + + CONO DTC,130200+UTCCHN+(A) +UTST: CONO DTC,430000+UTCCHN+(A) + CONO DTC,230200+UTCCHN+(A) + + CONO DTC,130200+UTCCHN(A) +UTST1: CONO DTC,430000+UTCCHN(A) + CONO DTC,230200+UTCCHN(A) + + CONO DTC,100200+UTCCHN(A) +UTST2: CONO DTC,400000+UTCCHN(A) + CONO DTC,200200+UTCCHN(A) + +  \ No newline at end of file diff --git a/src/mlsys/mdsk.0 b/src/mlsys/mdsk.0 new file mode 100644 index 00000000..5eb2f028 --- /dev/null +++ b/src/mlsys/mdsk.0 @@ -0,0 +1,57 @@ +;DISK PHYSICAL PARAMETERS +DSK=250 + +;DISK COMMANDS + +DREADC==000000,, ;READ DATA +DWRITC==100000,, ;WRITE DATA + ;OP CODE 2 UNUSED +DWRITH==300000,, ;WRITE HEADER AND DATA (FORMAT PACK) +DSEEKC==400000,, ;POSITION HEADS +DEASEC==500000,, ;CLEAR ATTENTIONS +DNOOPC==600000,, ;SELECT DRIVE +DRCALC==700000,, ;RECALIBRATE DRIVE + +;BYTE POINTERS FOR ABOVE COMMANDS + +DUNFLD==360300,, ;UNIT FIELD (ALL COMMANDS) +DCYL==261000,, ;CYLINDER FIELD (READ,WRIT,WRITH,SEEK) +DSURF==210500,, ;SURFACE FIELD (READ,WRIT,WRITH) +DSECT==140500,, ;SECTOR FIELD (READ,WRIT,WRITH) + + ;DATAI FIELDS + + +DUNFLI==410300,, ;UNIT FIELD +DCYLI==311000,, ;CYLINDER FIELD + +SKINC==100,, ;SEEK INCOMPLETE +ONCYL==40,, ;ON CYLINDER +ONLINE==10,, ;ON LINE +FUNSAF==4,, ;FILE UNSAFE +NSCHDR==2,, ;NO SUCH DRIVE +RDONLY==2,, ;READ ONLY + +NOWRIH==400000 ;WRITE HEADER LOCKOUT + +SECTI==140500,, + +ALLATT==776 + +;CONO INFORMATION + +DCLEAR==175710 ;CLEAR ALL ERROR CONDITIONS + + +;CONI INFORMATION + +PARER== 4000 +SRCER== 40000 +HRDER==130000 +PROER==402300 +WRTER== 1000 +ALLER==577300 +DONE==10 +BUSY==20 + +  \ No newline at end of file diff --git a/src/mlsys/mdsk.1 b/src/mlsys/mdsk.1 new file mode 100644 index 00000000..577b9674 --- /dev/null +++ b/src/mlsys/mdsk.1 @@ -0,0 +1,57 @@ +;DISK PHYSICAL PARAMETERS +DPC=250 + +;DISK COMMANDS + +DREADC==000000,, ;READ DATA +DWRITC==100000,, ;WRITE DATA + ;OP CODE 2 UNUSED +DWRITH==300000,, ;WRITE HEADER AND DATA (FORMAT PACK) +DSEEKC==400000,, ;POSITION HEADS +DEASEC==500000,, ;CLEAR ATTENTIONS +DNOOPC==600000,, ;SELECT DRIVE +DRCALC==700000,, ;RECALIBRATE DRIVE + +;BYTE POINTERS FOR ABOVE COMMANDS + +DUNFLD==360300,, ;UNIT FIELD (ALL COMMANDS) +DCYL==261000,, ;CYLINDER FIELD (READ,WRIT,WRITH,SEEK) +DSURF==210500,, ;SURFACE FIELD (READ,WRIT,WRITH) +DSECT==140500,, ;SECTOR FIELD (READ,WRIT,WRITH) + + ;DATAI FIELDS + + +DUNFLI==410300,, ;UNIT FIELD +DCYLI==311000,, ;CYLINDER FIELD + +SKINC==100,, ;SEEK INCOMPLETE +ONCYL==40,, ;ON CYLINDER +ONLINE==10,, ;ON LINE +FUNSAF==4,, ;FILE UNSAFE +NSCHDR==2,, ;NO SUCH DRIVE +RDONLY==2,, ;READ ONLY + +NOWRIH==400000 ;WRITE HEADER LOCKOUT + +SECTI==140500,, + +ALLATT==776 + +;CONO INFORMATION + +DCLEAR==175710 ;CLEAR ALL ERROR CONDITIONS + + +;CONI INFORMATION + +PARER== 4000 +SRCER== 40000 +HRDER==130000 +PROER==402300 +WRTER== 1000 +ALLER==577300 +DONE==10 +BUSY==20 + +  \ No newline at end of file diff --git a/src/mlsys/mfsdfs.3 b/src/mlsys/mfsdfs.3 new file mode 100644 index 00000000..c26ee2c3 --- /dev/null +++ b/src/mlsys/mfsdfs.3 @@ -0,0 +1,97 @@ + +;FILE SYSTEM PARAMETERS + +;PHYSICAL CHARACTERISTICS +NCYLS==200. ;# CYLINDERS NORMALLY USED +XCYLS==3 ;# EXTRA CYLINDERS FOR SPARES, HACKS, ETC. +NHEDS==22. ;# TRACKS/CYLINDER (REALLY = (20.*10.)/9) +NSECS==1 ;# SECTORS/TRK +SECBLK==1 ;# SECTORS/BLOCK + +;FORMAT + ;HARDWARE: + ; 20. TRACKS PER CYLINDER + ; 10. SECTORS PER TRACK + ;SOFTWARE + ; 9 SECTORS PER BLOCK OF WHICH FIRST EIGHT SECTORS + ; CONTAINS 2000 WDS OF DATA AND + ; FIRST NXWDS OF LAST SECTOR CONTAIN RETRIEVAL INFO. + +NSSECS==9 ;#HARDWARE SECTORS PER SOFTWARE BLOCK +NHSECS==10. ;#HARDWARE SECTORS PER HARDWARE TRACK +NCBLKS==NHEDS*NSECS/SECBLK ;# BLKS/CYL +NBLKS==NCYLS*NCBLKS ;TOTAL # REG BLKS +XBLKS==XCYLS*NCBLKS ;# XTRA BLKS + +;MFD INFO +MFDBLK==NBLKS/2-1 ;LOC ON DISK + ;RANDOM INFO + MDNUM==0 ;ASCENDING DIR NUM + MDNAMP==1 ;PNTR TO ORG OF NAME AREA + MDYEAR==2 ;CURRENT YEAR + MPDOFF==3 ;DE-CORIOLIS CLOCK OFFSET + MPDWDK==4 ;PREFERED DISK TO WRITE ON (PHYSICAL #) + LMIBLK==5 ;TOTAL STG USED BY HACKS LIKE THIS + ;USER NAME BLKS FROM C(MDNAMP) TO END + LMNBLK==2 ;# WDS/BLK + MNUNAM==0 ;6BIT USER NAME + +;TUT INFO +TUTBLK==MFDBLK-1 ;LOC ON DISK +TUTBYT==4 ;SIZE OF BYTES + TUTBP==440000+TUTBYT_6,, + TUTEPW==36./TUTBYT +TUTLK==1_-1 ;HIGHEST CODE MEANS LOCKED OUT +QTUTP==1777 ;ALLOC PNTR ADV BY CYLS +QPKNUM==1776 ;PACK # +QPKID==1775 ;PACK ID +QSWAPA==1774 ;SWAPPING ALLOCATION +LTIBLK==4 ;STG FOR RANDOM INFO ^ + +;UFD INFO +NUDSL==200. ;# UFDS SPACE RESERVED + ;RANDOM INFO + UDESCP==0 ;FS PNTR TO DESC AREA + UDNAMP==1 ;PNTR TO ORG OF NAME AREA + UDNAME==2 ;USER NAME (FOR CHECKING) + UDDESC==11. ;FIRST LOC AVAIL FOR DESC + ;UFD DESCRIPTORS + UDTKMX==12. ;HIGHEST "TAKE N" CODE + UDWPH==31. ;PLACE HOLDER ON WRITE (OR NULL FILE) + NXLBYT==2 ;# ADDITIONAL BYTES FOR LOAD ADDR + ;NAME AREA DATA + LUNBLK==5 ;WDS/NAME BLK + UNFN1==0 ;FIRST FN + UNFN2==1 ;SECOND FN + UNRNDM==2 ;ALL KINDS OF RANDOM INFO + UNDSCP==1500,, ;PNTR TO DESC + UNPKN==150500,, ;PACK # + UNLINK==1 ;LINK BIT + UNWRIT==4 ;OPEN FOR WRITING + UNMARK==10 ;GC MARK BIT + UNCDEL==20 ;DEL WHEN CLOSED + UNPDEL==40 ;DEL FROM UNMOUNTED PACK + DELBTS==UNCDEL+UNPDEL ;DELETED -- IGNORE + UNIGFL==DELBTS+UNWRIT ;BITS TO IGNORE FILE + UNDBLK==301300,, ;BLK # DESC BLK (0 => NONE) + UNDUMP==400000 ;HAS BEEN DUMPED + UNDATE==3 ;DATE ETC. + UNYMD==1200,, ;COMPACTED TIME OF CREATION + UNREFT==121000,, ;DAYS SINCE CREATION LAST REF +;EXTRA WORDS IN DATA BLOCKS +NXWDS==4 ;# XTRA WDS +BLKSIZ==2000 ;EXTRA WORDS ARE DRAWN OUT OF THE BLOCK + + XWBLK==1700,, ;BP TO PREV BLK # IN FILE FLD + XWAWC==171200,, ;BP TO ACTIVE WD CNT +XWSYSN==1 +XWFN1==2 +XWFN2==3 + +IF1 [ +IFG NUDSL*LMNBLK+LMIBLK-2000,[PRINTX /MFD LOSES +/] +IFG NBLKS/<36./TUTBYT>+LTIBLK-2000,[PRINTX /TUT LOSES +/] +] +  \ No newline at end of file diff --git a/src/mlsys/mfsdfs.4 b/src/mlsys/mfsdfs.4 new file mode 100644 index 00000000..b95931ef --- /dev/null +++ b/src/mlsys/mfsdfs.4 @@ -0,0 +1,98 @@ + +;FILE SYSTEM PARAMETERS + +;PHYSICAL CHARACTERISTICS +NCYLS==200. ;# CYLINDERS NORMALLY USED +XCYLS==3 ;# EXTRA CYLINDERS FOR SPARES, HACKS, ETC. +NHEDS==22. ;# TRACKS/CYLINDER (REALLY = (20.*10.)/9) +NSECS==1 ;# SECTORS/TRK +SECBLK==1 ;# SECTORS/BLOCK + +;FORMAT + ;HARDWARE: + ; 20. TRACKS PER CYLINDER + ; 10. SECTORS PER TRACK + ;SOFTWARE + ; 9 SECTORS PER BLOCK OF WHICH FIRST EIGHT SECTORS + ; CONTAINS 2000 WDS OF DATA AND + ; FIRST NXWDS OF LAST SECTOR CONTAIN RETRIEVAL INFO. + +NSSECS==9 ;#HARDWARE SECTORS PER SOFTWARE BLOCK +NHSECS==10. ;#HARDWARE SECTORS PER HARDWARE TRACK +NCBLKS==NHEDS*NSECS/SECBLK ;# BLKS/CYL +NBLKS==NCYLS*NCBLKS ;TOTAL # REG BLKS +XBLKS==XCYLS*NCBLKS ;# XTRA BLKS + +;MFD INFO +MFDBLK==NBLKS/2-1 ;LOC ON DISK + ;RANDOM INFO + MDNUM==0 ;ASCENDING DIR NUM + MDNAMP==1 ;PNTR TO ORG OF NAME AREA + MDYEAR==2 ;CURRENT YEAR + MPDOFF==3 ;DE-CORIOLIS CLOCK OFFSET + MPDWDK==4 ;PREFERED DISK TO WRITE ON (PHYSICAL #) + MDCHK==5 ;THIS WORD MUST BE M.F.D. (FOR CHECKING) + LMIBLK==6 ;TOTAL STG USED BY HACKS LIKE THIS + ;USER NAME BLKS FROM C(MDNAMP) TO END + LMNBLK==2 ;# WDS/BLK + MNUNAM==0 ;6BIT USER NAME + +;TUT INFO +TUTBLK==MFDBLK-1 ;LOC ON DISK +TUTBYT==4 ;SIZE OF BYTES + TUTBP==440000+TUTBYT_6,, + TUTEPW==36./TUTBYT +TUTLK==1_-1 ;HIGHEST CODE MEANS LOCKED OUT +QTUTP==1777 ;ALLOC PNTR ADV BY CYLS +QPKNUM==1776 ;PACK # +QPKID==1775 ;PACK ID +QSWAPA==1774 ;SWAPPING ALLOCATION +LTIBLK==4 ;STG FOR RANDOM INFO ^ + +;UFD INFO +NUDSL==200. ;# UFDS SPACE RESERVED + ;RANDOM INFO + UDESCP==0 ;FS PNTR TO DESC AREA + UDNAMP==1 ;PNTR TO ORG OF NAME AREA + UDNAME==2 ;USER NAME (FOR CHECKING) + UDDESC==11. ;FIRST LOC AVAIL FOR DESC + ;UFD DESCRIPTORS + UDTKMX==12. ;HIGHEST "TAKE N" CODE + UDWPH==31. ;PLACE HOLDER ON WRITE (OR NULL FILE) + NXLBYT==2 ;# ADDITIONAL BYTES FOR LOAD ADDR + ;NAME AREA DATA + LUNBLK==5 ;WDS/NAME BLK + UNFN1==0 ;FIRST FN + UNFN2==1 ;SECOND FN + UNRNDM==2 ;ALL KINDS OF RANDOM INFO + UNDSCP==1500,, ;PNTR TO DESC + UNPKN==150500,, ;PACK # + UNLINK==1 ;LINK BIT + UNWRIT==4 ;OPEN FOR WRITING + UNMARK==10 ;GC MARK BIT + UNCDEL==20 ;DEL WHEN CLOSED + UNPDEL==40 ;DEL FROM UNMOUNTED PACK + DELBTS==UNCDEL+UNPDEL ;DELETED -- IGNORE + UNIGFL==DELBTS+UNWRIT ;BITS TO IGNORE FILE + UNDBLK==301300,, ;BLK # DESC BLK (0 => NONE) + UNDUMP==400000 ;HAS BEEN DUMPED + UNDATE==3 ;DATE ETC. + UNYMD==1200,, ;COMPACTED TIME OF CREATION + UNREFT==121000,, ;DAYS SINCE CREATION LAST REF +;EXTRA WORDS IN DATA BLOCKS +NXWDS==4 ;# XTRA WDS +BLKSIZ==2000 ;EXTRA WORDS ARE DRAWN OUT OF THE BLOCK + + XWBLK==1700,, ;BP TO PREV BLK # IN FILE FLD + XWAWC==171200,, ;BP TO ACTIVE WD CNT +XWSYSN==1 +XWFN1==2 +XWFN2==3 + +IF1 [ +IFG NUDSL*LMNBLK+LMIBLK-2000,[PRINTX /MFD LOSES +/] +IFG NBLKS/<36./TUTBYT>+LTIBLK-2000,[PRINTX /TUT LOSES +/] +] +  \ No newline at end of file diff --git a/src/mlsys/msalv.14 b/src/mlsys/msalv.14 new file mode 100644 index 00000000..9352bc7e --- /dev/null +++ b/src/mlsys/msalv.14 @@ -0,0 +1,1462 @@ + +TITLE SALVATION + +TS==0 ;NZ RUN IN TS FOR DEBUGGING + +ZR=0 +A=1 +B=2 +C=3 +D=4 +N=5 +I=6 +Q=7 +H=10 +TT=11 +T=12 +W=13 +U=14 +J=15 +K=16 +P=17 + +MEMSIZ=1000000 +SA==100*2000 + +.INSRT MFSDFS > +.INSRT MDSK > +NUNITS==2 + +IFN TS,[ +NUNITS==2 +TYIC==1 +TYOC==2 +LPTC==3 +QIN==4 +] +DEFINE CONC A,B +A!B!TERMIN + +DEFINE STRA C/ + MOVE A,[440600,,[SIXBIT "C!!"]] +TERMIN + +DEFINE TYP B/ + PUSH P,A + STRA B + PUSHJ P,STYP + POP P,A +TERMIN + +DEFINE LPR B/ + PUSH P,A + STRA B + PUSHJ P,SLPT + POP P,A +TERMIN + +ZZ=. +LOC 60 +ICWA: .+2 + 0 + 0 +XICWA: -4,,RXWDS + -174,,0 ;SKIP OVER REST OF SECTOR (OR WRITE GARBAGE ...) + 0 +LOC ZZ + +IFE TS,[ +LOC SA ;SO IT CAN BE LOADED WITH THE SYSTEM + JRST GOGO ;START WITH ALL DEFAULT OPTIONS + +COPY: JSR INIT + PUSHJ P,CRR + TYP COPY BLOCK FROM UNIT # + PUSHJ P,NTYI + JRST COPY + CAIL A,NUNITS + JRST COPY + MOVEM A,FROM + MOVE I,A + PUSHJ P,RESET +CP1: PUSHJ P,CRR + TYP BLOCK # + PUSHJ P,OTYI + CAIL A,NBLKS+XBLKS + JRST CP1 + MOVEM A,FMBLK' +CP2: PUSHJ P,CRR + TYP ONTO UNIT # + PUSHJ P,NTYI + JRST CP2 + CAIL A,NUNITS + JRST CP2 + MOVEM A,TOU + MOVE I,A + PUSHJ P,RESET + PUSHJ P,CRR +CP3: TYP BLOCK # + PUSHJ P,OTYI + CAIL A,NBLKS+XBLKS + JRST CP3 + MOVEM A,TOBLK' + MOVEI A,TUT + MOVE J,FMBLK + MOVE I,FROM + PUSHJ P,READ + JUMPL T,CPERR + JUMPL TT,CPERR + MOVEI A,TUT + MOVE J,TOBLK + PUSHJ P,WRITT + JRST DDT +] +OTYI: CLEARB A,B +OTY1: ADD B,A + LSH B,3 + PUSHJ P,NTYI + JRST .+2 + JRST OTY1 + LSH B,-3 + MOVE A,B + POPJ P, + +CPERR: TYP READ ERROR + PUSHJ P,CRR + JRST DDT + +DUP1: PUSHJ P,CRR + PUSHJ P,STYP + PUSHJ P,NTYI + JRST DUP1 + CAIL A,NUNITS + JRST DUP1 + MOVE I,A + PUSHJ P,RESET +DUP2: MOVEM A,FROM +TO: PUSHJ P,CRR + TYP ONTO DRIVE # + PUSHJ P,NTYI + JRST TO + CAIL A,NUNITS + JRST TO + MOVE I,A + PUSHJ P,RESET + MOVEM A,TOU + PUSHJ P,CRR + POPJ P, +IFE TS,[ +DUP: JSR INIT + STRA DUPLICATE DISK FROM DRIVE # + PUSHJ P,DUP1 + MOVE I,FROM + DPB I,[DUNFLD CYLRIR] + MOVE I,TOU + DPB I,[DUNFLD CYLRIW] + MOVEI J,NCYLS+XCYLS-1 + MOVEI A,CYLBUF +DLUP: MOVE I,FROM + PUSHJ P,READCY + MOVE I,TOU + PUSHJ P,WRITCY + SOJGE J,DLUP + JRST DDT + + READCY: SKIPA T,[CYLRIR] +WRITCY: MOVEI T,CYLRIW + MOVEM T,DGO + DPB I,[DUNFLD (T)] + DPB J,[DCYL (T)] + MOVNI T,NCBLKS*2200 + HRLM T,@ICWA + JRST RW0 +CYLRIR: DREADC+ICWA +CYLRIW: DWRITC+ICWA +] + +IFE TS,[ +UCOP: JSR INIT + STRA COPY DIRS FROM DRIVE # + PUSHJ P,DUP1 + MOVEI A,D0 + MOVEI J,MFDBLK + PUSHJ P,READFN + PUSHJ P,WRITT + MOVEI Q,2000 +UCOPL: SUBI Q,LMNBLK + CAMGE Q,D0+MDNAMP + JRST DDT + SKIPN B,D0(Q) + JRST UCOPL + MOVEI J,2*NUDSL-2000(Q) + LSH J,-1 + MOVEI A,USRD + PUSHJ P,READFN + CAME B,USRD+UDNAME + JRST 4,. + PUSHJ P,WRITT + JRST UCOPL +] + +READFN: SKIPA I,FROM +READT: MOVE I,TO + PUSHJ P,READ + JUMPL TT,[JRST 4,.] + JUMPL T,[JRST 4,.] +CPOPJ: POPJ P, + +ZAP: JSR INIT + PUSHJ P,ZAP1 + TYP INIT PACK ON DRIVE # + PUSHJ P,NTYI + JRST ZAP+1 + CAIL A,NUNITS + JRST ZAP+1 + PUSHJ P,CRR + MOVEM A,TOU + MOVE I,A + PUSHJ P,RESET + MOVE A,[WXWDS-1,,WXWDS] + BLT A,WXWDS+NXWDS-1 + MOVSI J,-NBLKS-XBLKS ;INIT RETRIEVAL ON WHOLE DISK + MOVEI A,MFD +ZAPL: PUSHJ P,WRITE + JUMPL T,ZAPLUZ + AOBJN J,ZAPL + JRST ZAP2 +ZAPLUZ: TYP LOSE + PUSHJ P,CRR + JRST DDT + +ZAP1: MOVE A,[MFD,,MFD+1] + SETZM MFD + BLT A,MFD+1777 + PUSHJ P,TUTINI + PUSHJ P,CRR + POPJ P, + + ZAP2: TYP PACK ID = + PUSHJ P,6TYI + PUSHJ P,CRR + MOVEM B,TUT+QPKID + TYP PACK # = + PUSHJ P,OTYI + MOVEM A,TUT+QPKNUM + PUSHJ P,CRR + TYP SWAPPING ALLOC = + PUSHJ P,OTYI + PUSHJ P,CRR + MOVEM A,TUT+QSWAPA + MOVEI A,2000 + MOVEM A,MFD+MDNAMP + MOVEI A,MFD + MOVEI J,MFDBLK + PUSHJ P,WRITT + MOVEI A,TUTLK + MOVE B,[440000+TUTBYT_6,,TUT] + MOVEI C,NUDSL + IDPB A,B + SOJG C,.-1 + MOVE D,[-LSBTAB,,SBTAB] ;MARK OUT SPECIALLY RESERVED BLOCKS (MFD, TUT) +ZAP3: MOVE B,(D) + IDIVI B,36./TUTBYT + ADD B,QTTBL(C) + DPB A,B + AOBJN D,ZAP3 + MOVE A,TUT+QSWAPA + CAIGE A,NUDSL + MOVEI A,NUDSL + IDIVI A,NCBLKS + IMULI A,NCBLKS + MOVEM A,TUT+QTUTP + MOVEI A,TUT + MOVEI J,TUTBLK + PUSHJ P,WRITT + JRST DDT + 6TYI: MOVE C,[440600,,B] + MOVEI B,0 +6TYL: PUSHJ P,TYI + SUBI A,40 + JUMPLE A,CPOPJ + TLNE C,770000 + IDPB A,C + JRST 6TYL + + +CONSTA + + +IFE TS,[ +GOGO: SETOM GOGOX' + SKIPA +CHKR: SETZM GOGOX + JSR INIT + SETOM PRINTF + PUSHJ P,CRR + TYP SALVATION + MOVE A,[.FNAM2] + PUSHJ P,T6B + PUSHJ P,CRR + MOVEI A,NUNITS-1 +INIUNT: SKIPN GOGOX + CLEARM QACT(A) + SKIPE GOGOX + SETOM QACT(A) + SOJGE A,INIUNT + SKIPE GOGOX + JRST CFIN1 +CFIN11: TYP ACTIVE UNITS ARE: +CFIN2: PUSHJ P,NTYI + JRST CFIN1 + CAIG A,NUNITS + SETOM QACT(A) + JRST CFIN2 + +CFIN1: PUSHJ P,CRR + MOVEI U,NUNITS-1 + SKIPGE QACT(U) + PUSHJ P,DUINIT + SOJGE U,.-2 + SKIPN GOGOX + JRST CFIN3 + MOVEI A,0 + JRST CFIN7 +CFIN3: TYP USE MFD FROM UNIT: + PUSHJ P,NTYI + JRST CFIN8 + CAIG A,NUNITS + SKIPL QACT(A) + JRST CFIN3 + JRST CFIN7 + +CFIN8: MOVEI A,0 + MOVEI U,NUNITS-1 +CFIN5: SKIPL QACT(U) + JRST CFIN4 + MOVE I,QMDRO(U) + MOVE B,MDNUM(I) + CAML A,B + JRST CFIN4 + MOVE C,U + MOVE A,B +CFIN4: SOJGE U,CFIN5 + MOVE A,C + ADDI A,"0 + PUSHJ P,TYO + SKIPA U,C +CFIN7: MOVE U,A + MOVEM U,MDSK + MOVS A,QMDRO(U) + HRRI A,MFD + BLT A,MFD+2000-1 + CLEARM GUDFMD ;GET USER DIRS FROM MASTER DISK + CLEARM PRINTF + CLEARM CKFLSW + SKIPN GOGOX + JRST CFIN10 + SETOM GUDFMD + JRST CFIN9 +CFIN10: SETZM UDPSW + PUSHJ P,CRR + TYP CHECK FILES FOR CLOBBERED BLOCKS? + PUSHJ P,TYI + CAIE A,"Y + JRST CFIN12 + PUSHJ P,CRR + TYP UPDATE POINTERS? + PUSHJ P,TYI + CAIN A,"Y + SETOM UDPSW' + SETOM CKFLSW +CFIN12: PUSHJ P,CRR + TYP GET USR DIRS FROM MASTER DPC? + PUSHJ P,TYI + CAIN A,"Y + SETOM GUDFMD + PUSHJ P,CRR + TYP PRINT ALL DIRS? + PUSHJ P,TYI + CAIN A,"Y + SETOM PRINTF +CFIN9: MOVE A,[440700,,PBUF] + MOVEM A,PBUFP + CLEARM BNDFC ;BLOCK # DFRS CNT + CLEARM LOSTC + SKIPN GOGOX + JRST TUTF + JRST TUTF4 + +DUINIT: TYP UNIT # + MOVE A,U + PUSHJ P,DPT + PUSHJ P,TSPAC + MOVE I,U + PUSHJ P,RESET + MOVE A,QMDRO(U) + MOVE I,U + MOVEI J,MFDBLK + PUSHJ P,READ + JUMPL T,DUINI1 + JUMPL TT,DUINI2 + MOVE A,QTUTO(U) + MOVEI J,TUTBLK + PUSHJ P,READ + JUMPL T,DUINI3 + JUMPL TT,DUINI4 + TYP ID IS + MOVE I,QTUTO(U) + MOVE A,QPKID(I) + PUSHJ P,T6B + PUSHJ P,TSPAC + MOVE A,QPKNUM(I) + TYP DISK # + PUSHJ P,DPT + PUSHJ P,CRR + POPJ P, + +DUINI1: TYP MFD PARITY ERRORS + PUSHJ P,CRR + JRST DDT + +DUINI2: TYP MFD BLK # DFRS + PUSHJ P,CRR + JRST DDT + +DUINI3: TYP TUT PARITY ERRORS + PUSHJ P,CRR + JRST DDT + +DUINI4: TYP TUT BLK # DFRS + PUSHJ P,CRR + JRST DDT + + + +TUTF1: CAIE A,"A + JRST TUTF +TUTF4: SETOM ALLDSK + CLEARB A,DRNO +TUTF3: SKIPGE QACT(A) + JRST TUTF2 + AOS A,DRNO + CAIGE A,NUNITS + JRST TUTF3 + JRST DDT + +TUTF: CLEARM ALLDSK + PUSHJ P,CRR + TYP TUT FOR DRIVE # (A FOR ALL) + PUSHJ P,NTYI + JRST TUTF1 + CAIGE A,NUNITS + SKIPL QACT(A) + JRST TUTF +TUTF2: CLEARM TBLKTD ;TOTAL USER BLOCKS THIS DISK (ALL USERS) + CLEARM TBLKAD ;TOTAL USER BLOCKS ALL DISKS ALL USERS + MOVEM A,TUTU + MOVE A,QTUTO(A) + MOVE A,QPKNUM(A) + MOVEM A,TUTI + PUSHJ P,LFORM + LPR TUT FOR DISK # + ADDI A,"0 + PUSHJ P,LPTR + PUSHJ P,LCRR + PUSHJ P,CRR + PUSHJ P,TUTINI + MOVE Q,MFD+MDNAMP + ADDI Q,MFD + CLEARM USRCNT +MFDLUP: CAIL Q,MFD+2000 + JRST MFDFIN + SKIPE A,MNUNAM(Q) + PUSHJ P,USRLUP + SKIPN LFILES + PUSHJ P,DELUSR + ADDI Q,LMNBLK + JRST MFDLUP +] +TUTINI: CLEARM TUT + MOVE A,[TUT,,TUT+1] + BLT A,TUT+1777 + MOVEI A,TUTLK + MOVEI B,NUDSL + MOVE D,[440000+TUTBYT_6,,TUT] +TUTI1: IDPB A,D ;MARK OUT USER DIR AREA + SOJG B,TUTI1 + MOVSI D,-LSBTAB +TUTI2: MOVE A,SBTAB(D) + IDIVI A,36./TUTBYT + ADD A,QTTBL(B) + MOVEI B,TUTLK + DPB B,A ;MARK OUT BLOCK + AOBJN D,TUTI2 + POPJ P, +IFE TS,[ + +DELUSR: SKIPN MNUNAM(Q) + POPJ P, + SOS USRCNT + CLEARM MNUNAM(Q) + LPR NO FILES, USER DIRECTORY DELETED + JRST LCRR + +USRLUP: MOVE K,[440700,,PBUF] + MOVEM K,PBUFP' + AOS USRCNT + PUSHJ P,LFORM + CLEARM UFDLOS + CLEARM LFILES + CLEARM LBLOCKS + CLEARM TLBLOCKS + PUSH P,Q + LPR USER: + PUSHJ P,LTAB + MOVEM A,USRNAM' + PUSHJ P,SIXLPT + PUSHJ P,LTAB + LPR BLOCK: + PUSHJ P,LTAB + MOVE J,Q + SUBI J,MFD + SUBI J,2000-LMNBLK*NUDSL + IDIVI J,LMNBLK + MOVE A,J + MOVEM A,DBLK ;SAVE DIRECTORY BLOCK + PUSHJ P,LOCT + PUSHJ P,LCRR + PUSHJ P,LCRR + MOVEI A,USRD + MOVE I,TUTU + SKIPGE GUDFMD + MOVE I,MDSK ;USE UFDS FROM MASTER DISK +TCHK4: PUSHJ P,READ + JUMPL T,TCHK2 +TCHK6: JUMPL TT,TCHK3 +TCHK8: MOVE Q,USRD+UDNAME + CAME Q,USRNAM + JRST TCHK5 +TCHK1: MOVE Q,[USRD,,DUSRD] + BLT Q,DUSRD+1777 ;DUPLICATE USER DIRECTORY + MOVEI Q,2000-5+USRD + MOVEI J,USRD + ADD J,UDNAMP(J) + PUSH P,J + +DIRL1: CAMGE Q,J + JRST USRFIN + PUSH P,Q + SKIPE A,UNFN1(Q) + JRST .+3 + SKIPN UNFN2(Q) + JRST DIRLUP + AOS LFILES + PUSHJ P,LTAB + PUSHJ P,SIXLPT + PUSHJ P,LSPAC + MOVE A,UNFN2(Q) + PUSHJ P,SIXLPT + PUSHJ P,LSPAC + LDB C,[UNPKN UNRNDM(Q)] + LPR DIR CHAR ADR: + PUSHJ P,LTAB + LDB A,[UNDSCP UNRNDM(Q)] + PUSHJ P,LOCT + CAML A,USRD + JRST BADA1 + IDIVI A,6 + ADDI A,USRD+UDDESC + HLL A,QBTBLI(B) + TLNE A,400000 + SUB A,[440000,,1] + MOVEI ZR,0 + LDB B,A + JUMPE B,BADA4 + LPR ******* FILE NOT PRECEEDED BY ZERO ****** +BADA4: MOVE N,A + MOVEI J,0 + ILDB B,A + JUMPE B,BADA2 +BADA3: MOVE TT,UNRNDM(Q) + TLNE TT,UNLINK + JRST LINK1 + CAME C,TUTI + JRST OTLUP ;ON OTHER DISK + SETZM LSTBLK' +TRLUP: MOVE TT,N + ADDI TT,DUSRD-USRD + IDPB ZR,TT + ILDB B,N + PUSHJ P,LCRR + PUSHJ P,LTAB + PUSHJ P,LTAB + MOVE A,B + PUSHJ P,LOCT + JUMPE B,LINK + CAIN B,UDWPH + JRST TRLUP + CAIL B,UDWPH + JRST LOAD + CAILE B,UDTKMX + JRST SKIPF + +TLUP: AOS Q +TLUP1: MOVE A,Q + PUSHJ P,LSPAC + PUSHJ P,LOCT + SKIPGE CKFLSW + JRST CKFL1 +CKFL2: MOVEM A,LSTBLK + ILDB C,J + SKIPE C + JRST LOST +LOSTR: CAIGE C,TUTLK-1 + AOS C + DPB C,J + AOS LBLOCKS + SOJG B,TLUP + JRST TRLUP +BADA1: LPR ******* BAD CHR ADR ******* + JRST LINK + +BADA2: LPR ******** POINTS TO 0 ********* + JRST BADA3 + +CKFL1: PUSH P,J + PUSH P,Q + PUSH P,B + PUSH P,ZR + PUSH P,N + MOVE I,TUTU + MOVE J,A + MOVEI A,FDBUF + PUSHJ P,READ + JUMPL T,CHKFL4 +CHKFL5: JUMPGE TT,CKFL3 + LPR *** BLK # DFRS **** + AOS BNDFC + SETOM UFDLOS +CKFL3: MOVE A,RXWDS+XWSYSN + CAME A,USRNAM + JRST CKFL4 +CKFL5: LDB A,[XWBLK RXWDS] + CAME A,LSTBLK + JRST CKFL6 +CKFL7: SKIPL UDPSW + JRST CKFL8 + SETZM WXWDS + LDB A,[XWAWC RXWDS] + DPB A,[XWAWC WXWDS] + MOVE A,LSTBLK + DPB A,[XWBLK WXWDS] + MOVE A,USRNAM + MOVEM A,WXWDS+XWSYSN + MOVE Q,-5(P) ;FILE NAME BLOCK IN UFD + MOVE A,UNFN1(Q) + MOVEM A,WXWDS+XWFN1 + MOVE A,UNFN2(Q) + MOVEM A,WXWDS+XWFN2 + MOVEI A,FDBUF + PUSHJ P,WRITE + MOVE A,[WXWDS-1,,WXWDS] + BLT A,WXWDS+NXWDS-1 +CKFL8: POP P,N + POP P,ZR + POP P,B + POP P,Q + POP P,J + JRST CKFL2 + +CHKFL4: LPR *** BAD BLOCK PARITY *** + JRST CHKFL5 + +CKFL4: LPR *** USER NAME DIFFERS *** + SETOM UFDLOS + JRST CKFL5 + +CKFL6: LPR *** CHAIN POINTER DIFFERS *** + SETOM UFDLOS + JRST CKFL7 + + +TCHK2: PUSH P,TT + TYP USER DIR PARITY ERROR + PUSHJ P,CRR + MOVE A,USRNAM + PUSHJ P,T6B + PUSHJ P,TSPAC + TYP PROCEED? + PUSHJ P,TYI + POP P,TT + CAIN A,"Y + JRST TCHK6 + PUSHJ P,CRR +TCHK7: TYP TRY UFD FROM UNIT # + PUSHJ P,NTYI + JRST DDT + PUSHJ P,CRR + CAIL A,NUNITS + JRST TCHK7 + SKIPL QACT(A) + JRST TCHK7 + MOVE I,A + MOVEI A,USRD + JRST TCHK4 + +TCHK3: TYP USER DIR BLK # DFRS + PUSHJ P,CRR + MOVE A,USRNAM + PUSHJ P,T6B + PUSHJ P,TSPAC + TYP PROCEED? + PUSHJ P,TYI + PUSHJ P,CRR + CAIN A,"Y + JRST TCHK8 + JRST TCHK7 + +TCHK5: TYP USER NAME IN DIR DIFFERS + PUSHJ P,CRR + MOVE A,USRNAM + PUSHJ P,T6B + PUSHJ P,TSPAC + MOVE A,Q + PUSHJ P,T6B + PUSHJ P,CRR + TYP PROCEED? + PUSHJ P,TYI + PUSHJ P,CRR + CAIN A,"Y + JRST TCHK1 + JRST TCHK7 + + +LINK1: PUSHJ P,LSPAC + LPR LINK +;FOLLOWED BY SPACE + MOVE TT,N + ADDI TT,2000 + PUSHJ P,LTYPE + PUSHJ P,LTYPE + PUSHJ P,LTYPE + ILDB B,N + JUMPE B,LINK + LPR *** NOT FOLLOWED BY 0 *** + JRST LINK + +LTYPE: MOVEI C,6 +LTYPE2: IDPB ZR,TT + ILDB A,N + ADDI A,40 + CAIN A,": + JRST LTYPE4 + CAIN A,"; + JRST LTYPE1 +LTYPE3: PUSHJ P,LPTR + SOJG C,LTYPE2 +LTYPE1: JRST LSPAC + +LTYPE4: ILDB A,N + IDPB ZR,TT + JRST LTYPE3 + +LOAD: MOVEI J,-UDWPH-1(B) + MOVEI K,NXLBYT +LOAD1: MOVE TT,N + ADDI TT,DUSRD-USRD + IDPB ZR,TT + ILDB B,N + PUSHJ P,LSPAC + MOVE A,B + PUSHJ P,LOCT + LSH J,6 + ADD J,B + SOJG K,LOAD1 + MOVE Q,J + IDIVI J,36./TUTBYT + ADD J,QTTBLI(K) + MOVEI B,1 + JRST TLUP1 + +OTLUP: ILDB B,N + MOVE TT,N + ADDI TT,DUSRD-USRD + DPB ZR,TT + JUMPE B,LINK + CAIN B,UDWPH + JRST OTLUP + CAILE B,UDTKMX + JRST OTLUP1 + ADDM B,TLBLOCKS + JRST OTLUP +OTLUP1: AOS TLBLOCKS + CAIG B,UDWPH + JRST OTLUP + MOVEI K,NXLBYT +OTLUP2: ILDB B,N + MOVE TT,N + ADDI TT,DUSRD-USRD + DPB ZR,TT + SOJG K,OTLUP2 + JRST OTLUP + +SKIPF: SUBI B,UDTKMX + IBP J + AOS Q + SOJG B,.-2 + MOVEI B,1 + JRST TLUP + +LINK: PUSHJ P,LCRR +DIRLUP: POP P,Q + MOVE J,(P) + SUBI Q,LUNBLK + JRST DIRL1 + +USRFIN: CLEARM GARBF + CLEARB ZR,J + MOVE Q,[440600,,DUSRD+UDDESC] +GARB2: CAML J,USRD + JRST USRFN2 +GARB4: ILDB B,Q + JUMPN B,GARB1 +GARB3: AOJA J,GARB2 + +USRFN2: TLNE Q,770000 + JRST GARB4 + MOVEI Q,-DUSRD+1(Q) +GARB6: CAML Q,DUSRD+1 + JRST GARB5 + SKIPN DUSRD(Q) + AOJA Q,GARB6 + LPR ******** GARBAGE IN FREE AREA ******** + MOVE A,Q + PUSHJ P,LOCT + PUSHJ P,LSPAC + MOVE A,DUSRD(Q) + ANDCAM A,USRD(Q) + PUSHJ P,LOCT + PUSHJ P,LCRR + CLEARM DUSRD(Q) + SETOM GARBF + AOJA Q,GARB6 + +GARB5: SKIPL UFDLOS + JRST URFN2 + LPR ******* THIS DIRECTORY WAS A LOSER ******** +URFN2: SKIPN GARBF + JRST USRFN4 + LPR ******* EXTRA GARBAGE IN UFD ******* + PUSHJ P,LCRR +USRFN4: LPR USER FILES + PUSHJ P,LSPAC + MOVE A,LFILES + PUSHJ P,LOCT + PUSHJ P,LSPAC + LPR USER BLOCKS THIS DISK + PUSHJ P,LSPAC + MOVE A,LBLOCKS + ADDM A,TBLKTD + PUSHJ P,LOCT + PUSHJ P,LSPAC + LPR TOTAL ALL DISKS + PUSHJ P,LSPAC + MOVE A,LBLOCKS + ADD A,TLBLOCKS + ADDM A,TBLKAD + PUSHJ P,LOCT + PUSHJ P,LCRR + SKIPGE UFDLOS + JRST USRFN6 + SKIPN GARBF + JRST USRFN3 +USRFN6: TYP BAD: + MOVE A,USRNAM + PUSHJ P,T6B + PUSHJ P,TSPAC + MOVE A,DBLK + PUSHJ P,DPT + PUSHJ P,CRR + SKIPN PRINTF' + JRST PDIR +USRFN5: TYP DIR REFRESHED + PUSHJ P,CRR + TYP WRITE? + PUSHJ P,TYI + PUSHJ P,CRR + CAIE A,"Y + JRST USRFN3 +USRFN7: MOVEI A,USRD + MOVE I,TUTU + SKIPGE GUDFMD + MOVE I,MDSK ;UFD CAME FROM MDSK + MOVE J,DBLK + PUSHJ P,WRITE ;WRITE BACK UFD +USRFN3: POP P,J + POP P,Q + POPJ P, + +PDIR: MOVE B,[440700,,PBUF] +PDIR1: ILDB A,B + PUSHJ P,LPTR1 + CAMN B,PBUFP + JRST USRFN5 + JRST PDIR1 + +GARB1: SETOM GARBF + LPR CHAR ADR + PUSHJ P,LSPAC + MOVE A,J + PUSHJ P,LOCT + PUSHJ P,LTAB + MOVE A,B + PUSHJ P,LOCT + PUSHJ P,LCRR + MOVE TT,Q + SUBI TT,DUSRD-USRD + DPB ZR,TT + JRST GARB3 + +MFDFIN: MOVNI A,1 + EXCH A,PRINTF + MOVEM A,OPNTF' + PUSHJ P,LFORM + LPR Y FILE COUNT + MOVE A,LOSTC + PUSHJ P,LOCT + PUSHJ P,LTAB + LPR BLK # DFRS COUNT + MOVE A,BNDFC + PUSHJ P,LOCT + PUSHJ P,LTAB + LPR USER COUNT + MOVE A,USRCNT + PUSHJ P,LOCT + PUSHJ P,LCRR + MOVEI TT,0 ;CHECK NEW TUT AGAINST OLD AND PRINT DIFFERENCES + MOVE Q,QTTBLI + MOVE J,Q + SUBI J,TUT + MOVE B,TUTU + ADD J,QTUTO(B) + CLEARM 1T0C +;DROPS THRU + ;DROPS IN +TUTC1: ILDB C,Q + ILDB D,J + CAME C,D + JRST TUTDF1 +TUTC2: CAIGE TT,NBLKS-1 + AOJA TT,TUTC1 + SKIPN 1T0C + JRST TUTC4 + LPR 1_0 COUNT + MOVE A,1T0C + PUSHJ P,LDPT + PUSHJ P,LCRR +TUTC4: LPR TOTAL USER BLOCKS THIS DISK + MOVE A,TBLKTD + PUSHJ P,LDPT + PUSHJ P,LCRR + LPR TOTAL USER BLOCKS ALL DISKS + MOVE A,TBLKAD + PUSHJ P,LDPT + PUSHJ P,LFORM + PUSHJ P,LCRR + PUSHJ P,CRR + TYP DISK REFRESHED + MOVE J,TUTU + MOVE Q,QTUTO(J) +IRP AA,,[QTUTP,QPKNUM,QPKID,QSWAPA] + MOVE A,AA(Q) + MOVEM A,TUT+AA +TERMIN + PUSHJ P,CRR + TYP WRITE? + PUSHJ P,TYI + CAIE A,"Y + JRST TUTC3 + MOVEI A,TUT + MOVEI J,TUTBLK + MOVE I,TUTU + PUSHJ P,WRITE + MOVEI A,MFD + MOVEI J,MFDBLK + PUSHJ P,WRITE +TUTC3: SKIPL ALLDSK + JRST DDT + MOVE A,OPNTF + MOVEM A,PRINTF + AOS A,DRNO + JRST TUTF3 + +LOST: AOS LOSTC + LPR ***** + SETOM UFDLOS + JRST LOSTR + + +TUTDF1: CAIN D,1 + JUMPE C,TUTDF2 ;1_0 + MOVE A,TT + PUSHJ P,LOCT + PUSHJ P,LSPAC + MOVE A,D + PUSHJ P,LOCT + MOVEI A,"_ + PUSHJ P,LPTR + MOVE A,C + PUSHJ P,LOCT + PUSHJ P,LCRR + JRST TUTC2 + +TUTDF2: AOS 1T0C + JRST TUTC2 + +LOCT: PUSH P,A + PUSH P,B + LSHC A,-35. + LSH B,-1 + DIVI A,8 + PUSH P,B + SKIPE A + PUSHJ P,LOCT + POP P,A + ADDI A,"0 + PUSHJ P,LPTR +POPBAJ: POP P,B + POP P,A + POPJ P, +] +INIT: 0 + CONO 675550 + CONO PI,710000 + MOVEI P,PDL +IFN TS,[ + .OPEN TYIC,[SIXBIT / $TTY/] + .VALUE + .OPEN TYOC,[SIXBIT / !TTY/] + .VALUE + SETZM LPTO' + .CORE _-10.+1 + .VALUE +] JRST @INIT + +LDPT: IDIVI A,10. + HRLM B,(P) + SKIPE A + PUSHJ P,LDPT + HLRZ A,(P) + ADDI A,"0 +;DROPS IN +LPTR: SKIPN PRINTF' + JRST STORE +LPTR1: CAIN A,12 + POPJ P, + JRST TYLPT +IFN TS,[ + SKIPE LPTO + JRST LPTR2 + .OPEN LPTC,[SIXBIT / !LPT/] + POPJ P, + SETOM LPTO +LPTR2: .IOT LPTC,A + CAIN A,15 + .IOT LPTC,[12] +] POPJ P, + +TYLPT: CAIN A,14 + POPJ P, + PUSHJ P,TYO + CAIE A,15 + POPJ P, + PUSH P,A + MOVEI A,12 + PUSHJ P,TYO + JRST POPAJ + +STORE: IDPB A,PBUFP' + POPJ P, + +T6B: PUSH P,B + PUSH P,C + MOVE C,A + MOVE B,[440600,,C] +T6B1: ILDB A,B + JUMPE A,T6B2 + ADDI A,40 + PUSHJ P,TYO + TLNE B,770000 + JRST T6B1 +T6B2: MOVE A,C + POP P,C +POPBJ: POP P,B + POPJ P, + +SIXLPT: PUSH P,B + PUSH P,C + MOVE C,A + MOVE B,[440600,,C] +SLX1: ILDB A,B + PUSHJ P,LPTRS + TLNE B,770000 + JRST SLX1 + MOVE A,C + POP P,C + POP P,B + POPJ P, + +LPTRS: ADDI A,40 + JRST LPTR + +STYP: PUSH P,B + MOVE B,A +ST1: ILDB A,B + CAIN A,'! + JRST POPBJ + ADDI A,40 + PUSHJ P,TYO + JRST ST1 + +SLPT: PUSH P,B + MOVE B,A +SL1: ILDB A,B + CAIN A,'! + JRST POPBJ + PUSHJ P,LPTRS + JRST SL1 + +LTAB: PUSH P,A + MOVEI A,11 + JRST LCR1 + +LCRR: SETOM LFRMSW' + PUSH P,A + MOVEI A,15 +LCR1: PUSHJ P,LPTR +POPAJ: POP P,A + POPJ P, + +LSPAC: PUSH P,A + MOVEI A,40 +L1: PUSHJ P,LPTR + POP P,A + POPJ P, + +LFORM: AOSE LFRMSW + POPJ P, + PUSH P,A + MOVEI A,14 + JRST LCR1 +DPT: PUSH P,A + PUSH P,B + IDIVI A,8 + PUSH P,B + SKIPE A + PUSHJ P,DPT + POP P,A + ADDI A,"0 + PUSHJ P,TYO + JRST POPBAJ + +CRR: PUSH P,A + PUSHJ P,CRR1 + POP P,A + POPJ P, + +DDT: TYP DDT +IFE TS, JRST MEMSIZ-4000 +IFN TS, .VALUE 69 + +CRR1: MOVEI A,15 + PUSHJ P,TYO + SKIPA A,[12] +TSPAC: MOVEI A,40 +TYO: IFE TS,[ + PUSH P,B + PUSH P,A + IMULI A,200401 + AND A,[11111111] + MUL A,[11111111] + POP P,A + TLNE B,10 + TRO A,200 + POP P,B + CONSZ TTY,20 + JRST .-1 + DATAO TTY,A + TRZ A,200 + CAIE A,11 + JRST .+4 + CONSZ TTY,20 + JRST .-1 + DATAO TTY,[177] +]IFN TS, .IOT TYOC,A + POPJ P, + +NTYI: PUSHJ P,TYI + CAIL A,"0 + CAILE A,"9 + POPJ P, + SUBI A,"0 +POPJ1: AOS (P) + POPJ P, +IFN TS,[ +TYI: .IOT TYIC,A + JRST TYO + +READ: MOVEM J,63 + SETZB T,TT + POPJ P, + +WRITT: MOVE I,TOU +WRITE: POPJ P, +]IFE TS,[ +TYI: CONSO TTY,40 + JRST .-1 + DATAI TTY,A + ANDI A,177 + CAIN A,32 + JRST CRDDT + CAILE A,140 + SUBI A,40 + JRST TYO + + RESET: CONSZ DPC,BUSY + JRST .-1 + DATAO DPC,[DEASEC 776] ;CLEAR ALL ATTNS + DPB I,[DUNFLD DRST] + DATAO DPC,DRST + DATAI DPC,T + TRNN T,776 + JRST .-2 + DATAO DPC,[DEASEC 776] + POPJ P, + + +DRST: DRCALC + + +SEEK: MOVEI TT,10. + MOVEM TT,SEEKC' +SEEK1: CONSZ DPC,BUSY + JRST .-1 + DATAO DPC,[DEASEC 776] + MOVE TT,@DGO + TLZ TT,700000 + TLO TT,(DSEEKC) + DATAO 4,TT + DATAO DPC,TT + DATAI DPC,TT + TRNN TT,776 + JRST .-2 + DATAO DPC,[DEASEC 776] + TLNE TT,(ONCYL) + POPJ P, + SOSL TT,SEEKC + JRST SEEK2 + POP P,(P) + POPJ P, + +SEEK2: PUSH P,I + PUSH P,T + LDB I,[DUNFLD @DGO] + PUSHJ P,RESET + POP P,T + POP P,I + JRST SEEK1 + +WRITT: MOVE I,TOU +WRITE: SKIPA T,[DWR] +READ: MOVEI T,DRD + HRRM T,DGO + MOVEI TT,RXWDS + CAIE T,DRD + MOVEI TT,WXWDS + HRRM TT,XICWA ;EXTRA WDS + DPB I,[DUNFLD (T)] + MOVNI TT,2000 + HRLM TT,@ICWA + HRRZ TT,J + CAIL TT,NBLKS+XBLKS + JRST 4,. + IDIVI TT,NCBLKS ;FORMS CYL - BLOCK WITHIN CYL + DPB TT,[DCYL @DGO] + MOVE TT,T + IMULI TT,NSSECS + IDIVI TT,NHSECS ;FORMS HEAD - SECTOR + DPB TT,[DSURF @DGO] + DPB T,[DSECT @DGO] +RW0: SUBI A,1 + HRRM A,@ICWA + ADDI A,1 + SETZM ICWA+1 + PUSHJ P,SEEK +RW1: MOVEI T,30. +RW2: CONO DPC,DCLEAR + DATAO PI,@DGO ;FLASH LITES FOR LOSER + DATAO DPC,@DGO + CONSO DPC,DONE + JRST .-1 + CONSO DPC,ALLER + POPJ P, + CONI DPC,TT + TLNE TT,12 + JRST RWPAR + TRNE TT,HRDER + JRST RWHRD + TRNE TT,PROER + JRST RWPRO + TRNE TT,WRTER + JRST RWWRT + TRNE TT,SRCER + SKIPA TT,[-1] + SOJGE T,RW2 + POPJ P, + + +RXWDS: BLOCK NXWDS + + 0 ;FOR BLT TO CLEAR WXWDS +WXWDS: BLOCK NXWDS + DGO: . + +DRD: DREADC+ICWA +DWR: DWRITC+ICWA + +FROM: 0 +TOU: 0 + +SBTAB: MFDBLK ;SPECIAL RESERVED BLKS + TUTBLK +LSBTAB==.-SBTAB +RWHRD: TYP FATAL HARDWARE ERROR + JRST CRDDT + +RWPAR: TYP CHANNEL PARITY ERROR + JRST CRDDT + +RWPRO: TYP DISK ROUTINE ERROR + JRST CRDDT + +RWWRT: TYP DISK WRITE PROTECTED +CRDDT: PUSHJ P,CRR + JRST DDT +] + + +MFDR: MOVEI P,PDL + PUSHJ P,CRR ;RECONSTRUCT MFR BY GETTING NAMES FROM UFD'S + TYP RECONSTRUCT MFD FROM UNIT # + PUSHJ P,NTYI + JRST MFDR + MOVE I,A + PUSHJ P,MFDINN + SETOM IMNFLG + MOVEI J,0 +MFDR1: MOVEI A,TUT + PUSHJ P,READ + JUMPL T,MFDRL + JUMPL TT,MFDRL + MOVE B,TUT ;LOOK LIKE LEGIT UFD? + TLNE B,-1 + JRST MRUFDL ;SHOULD BE F.S. PNTR + CAIL B,<2000.-11.>*6 + JRST MRUFDL + MOVE B,TUT+1 + SKIPE TUT+2 + TLNE B,-1 + JRST MRUFDL ;PNTR TO BEG OF NAME AREA + MOVEI B,(J) + LSH B,1 + ADDI B,2000-LMNBLK*NUDSL + MOVE C,TUT+2 ;USER NAME + MOVEM C,MFD(B) + AOSN IMNFLG + MOVEM B,MFD+1 + JRST MRUFDW + + +MFDRL: JRST 4,.+1 +MRUFDL: JFCL +MRUFDW: CAIGE J,NUDSL-1 + AOJA J,MFDR1 + TYP WRITE? + PUSHJ P,TYI + CAIE A,"Y + JRST DDT +MFDWR: MOVEI A,MFD + MOVEI J,MFDBLK + PUSHJ P,WRITE + JRST DDT + +IMNFLG: 0 + +MFDINN: CLEARM MFD + MOVE A,[MFD,,MFD+1] + BLT A,MFD+1777 + MOVE A,[SIXBIT /M.F.D./] + MOVEM A,MFD+MDCHK + POPJ P, + + +CONSTA +VARIAB + +BNDFC: 0 ;COUNT OF BLOCKS WHOSE #'S DIFFER +CKFLSW: 0 ;-1 VERIFY THAT BLOCKS THAT MAKE UP FILE ARE IN RIGHT PLACE + ;IE XTRAWD HAS RIGHT THING WHEN BLOCK READ + +PDL: BLOCK 200 +POS: BLOCK NUNITS +LOSTC: 0 +TUTU: 0 +TUTI: 0 +QBTBLI: 440600,, +QBTBL: 360600,, + 300600,, + 220600,, + 140600,, + 60600,, + 600,, + +QTTBLI: REPEAT 36./TUTBYT+1, 440000+TUTBYT_6-TUTBYT_12.*.RPCNT,,TUT +QTTBL=QTTBLI+1 + +1T0C: 0 ;COUNT 1_0 +ALLDSK: 0 +DRNO: 0 +GUDFMD: 0 ;-1 GET UFDS FROM MASTER DPC +CLNSSW: 0 +GARBF: 0 +DBLK: 0 +LFILES: 0 ;FILES LOSER HAS +LBLOCKS: 0 ;BLOCKS LOSER USES THIS DISK +TLBLOCKS: 0 ;TOTAL ON ALL DISKS +TBLKTD: 0 ;TOTAL BLOCKS THIS DISK ALL USERS +TBLKAD: 0 ;TOTAL BLOCKS ALL DISKS ALL USERS +UFDLOS: 0 ;-1 IF DIR HAS CLOBBERED BLOCKS +USRCNT: 0 ;COUNT OF DISK USERS +QACT: BLOCK NUNITS +MDSK: 0 + +IRP A,,[MDR,TUT]B,,[D,T] +Q!A!O: REPEAT NUNITS,CONC B,\.RPCNT,î +TERMIN +PAT: +PATCH: BLOCK 100 + +IFE TS,LOC <.+1777>&776000 +CYLBUF: +FDBUF: BLOCK 2000 +USRD: BLOCK 2000 +DUSRD: BLOCK 2000 ;MUST FOLLOW USRD +IRPC A,,DT +REPEAT NUNITS,CONC A,\.RPCNT,: BLOCK 2000 +TERMIN +TUT: BLOCK 2000 +MFD: BLOCK 2000 +PBUF: BLOCK 2000 +IFE TS,IFL .-CYLBUF-NCBLKS*NSSECS*200,LOC CYLBUF+NCBLKS*NSSECS*200 +THEEND:END +  \ No newline at end of file diff --git a/src/mlsys/msalv.bin b/src/mlsys/msalv.bin new file mode 100644 index 0000000000000000000000000000000000000000..db911fa1356187d2d0df199e12107f6cf4f084c9 GIT binary patch literal 13882 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 T%C!`2+Uv+_3r}HFo@e}DPi?3m literal 0 HcmV?d00001 diff --git a/src/mlsys/ntsddt.n77h b/src/mlsys/ntsddt.n77h new file mode 100644 index 00000000..70db6749 --- /dev/null +++ b/src/mlsys/ntsddt.n77h @@ -0,0 +1,2312 @@ + +MOBY==740000 + +MACAC==4 ;ACCUMULATOR MACDMP LEAVES STARTING ADDRESS IN + +LOC 34000+MOBY + +TITLE DDT +î +DDT: + +MEMSIZ=40000+MOBY ;INITIAL $I-2 +NLEVS==7 ;LENGTH OF RING BUFFER OF . + +F=0 ;FLAGS +P=1 ;PUSH DOWN +R=2 ;POINTERS TO TABLES, CORE, ETC. +S=3 +W=4 ;CONTAINS DISPATCH ADDRESS IN WORD ASSEMBLER +T=5 ;TRANSFER DATA +W1=6 +W2=7 +I=10 +A=R +B=S +C=W +D=T + +NBP==10 ;NUMBER OF BREAK POINTS +PRS==4 +LPDL==50 ;MAX LENGTH PUSH DOWN LIST + +TIF=100000 ;TRUNCATE TO 18 BITS - SET BY SPACE OR COMMA +PTF=100 ; +, -, OR * HAS BEEN TYPED +COMF=200000 ;COMMA FLAG +CTF=400 +SF=4 ;SYLLABLE FLAG +QF=1 ;QUANTITY TYPED IN TO WORD ASSEMBLER + +CF=40 ; TYPED +CCF=400000 ; TYPED +MF=2 ;MINUS SIGN TYPED IN +LTF=20 ;LETTER TYPED IN TO CURRENT SYLLABLE +ROF=10 ;REGISTER OPEN FLAG +STF=4000 ;! MODE +FAF=1000 ; < TYPED +SAF=2000 ; > TYPED + +FPF=20000 ; . TYPED IN +FEF=10000 ; E FLAG + +MLF=200 ;*FLAG +DVF=40000 ;DIVIDE FLAG + IF2 LOC LOWCOD-NUMSYM*2-2 + +NUMSYM==0 +IRP A,,[CLEAR,CLEARI,CLEARM +CLEARB,CONSZ,CONSO,DATAI,DATAO,BLKI,BLKO,CONI,CONO] + SQUOZE 4,A + A + NUMSYM==NUMSYM+1 +TERMIN + +DC0==610 +DC1==614 +DPK==604 +IRP A,,[PI,PTP,PTR,TTY,LPT,DIS,DC,UTC,UTS,DC0,DC1,DPK] + SQUOZE 4,A + -BLKI + NUMSYM==NUMSYM+1 + TERMIN + +DEFINE BUST A + SQUOZE 4,$!A!B + B1ADR+A*3-3 + NUMSYM==NUMSYM+1 + TERMIN + + SQUOZE 4,$M + MSK + SQUOZE 4,$I + SAVPI + SQUOZE 0,DDT + 0 + SQUOZE 4,DDT + DDT + +NUMSYM==NUMSYM+4 + +RADIX 10. +REPEAT NBP+1,BUST \.RPCNT +RADIX 8 + +DEFINE INFORM A,B +IF1,[ PRINTX /A = B +/] + TERMIN + +INFORM [INITIAL SYMS]\NUMSYM*2 + LOC DDT-1000 +LOWCOD: INFORM [LOWCODE]\. + NREGS=10. +NUMREG=11. + + ;INITIALIZE DISPLAY (CALLED UNCONDITIONALLY WHEN DDT FIRST STARTED UP) + + +DISINI: PUSH P,R + SKIPN DISON ;SKIP IF DISPLAY ON + SKIPA R,CJLP1 ;JRST LLUP1 + MOVSI R,(TRNA) + MOVEM R,LLUPI1 + JUMPGE R,DISIN1 ;JUMP IF JUST MUNGED INTO LLUPI1 + ;FOLLOWING CIDING SKIPPED IF DISPLAY OFF + HRRZ T,ESTUT + SUBI T,NUMREG*+3 + HRRM T,DISWD + MOVE R,[REPEAT 6,[35]] + MOVEM R,(T) + HRLI R,(T) + HRRI R,1(T) + BLT R,NUMREG*<2*NREGS+1>-1+1(T) + MOVNI R,NREGS+1 + MOVEM R,DISCNT + PUSHJ P,RECYC + MOVEI T,DISBEG + MOVEM T,DISPDL + SETCM T,.-1 + MOVNM T,DISACS+P +DISIN1: POP P,R + POPJ P, + +DISDON: 0 +DISPTR: 0 ;BLKO POINTER FOR DISPLAY +DISCC: 0 +DISPNR: 0 +DISON: -1 ;DISPLAY FEATURE INITIALLY ON +DISWD: -NUMREG*<2*NREGS+1>,, +DTOC: IDIVI T,8 ;CANT CALL TOC OR TOUT. SCREWS DISPLAY. + HRLM W1,(P) + SKIPE T + PUSHJ P,DTOC + HLRZ T,(P) + ADDI T,"0 + +DISAD: PUSH P,T + ANDI T,177 + CAIL T,40 + CAILE T,132 + JRST DISAD2 +DISAD0: IDPB T,DISPNR + AOS DISCC + HRRI T,-10. + SKIPGE T + MOVEM T,DISCC +POPTJ: POP P,T + POPJ P, + + +DISAD2: PUSH P,W1 + CAIL T,40 + CAILE T,140 + JRST DISAD5 + MOVEI W1,36 + IDPB W1,DISPNR + MOVE W1,BLOBS-133(T) + IDPB W1,DISPNR + MOVEI T,35 + POP P,W1 + JRST DISAD0 + +DISAD3: MOVEI T,34 + PUSH P,T + JRST DISAD0 + +DISAD7: PUSHJ P,DISAD3 +DISAD4: MOVNI T,-33 + PUSH P,T + JRST DISAD0 + +DISAD6: MOVEI T,35 + PUSH P,T + JRST DISAD0 + +BLOBS: 53 + 52 + 54 + 46 + 51 + 50 + +DISAD5: PUSHJ P,DIS69 + PUSHJ P,DTOC + PUSHJ P,DIS69 + POP P,W1 + JRST POPTJ + +DIS69: IRP X,,[36,50,35] + MOVEI W1,X + IDPB W1,DISPNR + TERMIN + POPJ P, + DISLP: AOS T,DISCNT + CAILE T,NREGS +DISBEG: MOVNI T,NREGS + MOVEM T,DISCNT + ADDI T,NREGS + IMULI T,NUMREG + ADD T,DISWD + HRLI T,600 + MOVEM T,DISPNR + MOVEM T,DISPN1 + MOVE R,DISCNT + PUSHJ P,DISAD7 + JUMPE R,.+2 + SOJN R,.+2 + PUSHJ P,DISAD4 + MOVE T,DISCNT + ADD T,LLOC + PUSH P,T + PUSHJ P,PAD + XCT "/,CRF + XCT CRF + SKIPG DISCC + JRST .-2 + POP P,R + PUSHJ P,FETCH + JRST DISL1 + PUSHJ P,CONSYM +DISL2: PUSHJ P,DISAD6 + MOVE T,DISPNR + TLNE T,770000 + JRST DISL2 + SUB T,DISPN1 + HRREI T,-NUMREG(T) + JUMPL T,DISL2 + PUSHJ P,CHECK + AOSE DISDON + JRST .-2 + JRST DISLP +DISL1: XCT "-,CRF + JRST DISL2 + DISCFT: SOS (P) + SOS (P) + SKIPN DISON + POPJ P, +SWAP: PUSH P,LLUP1 + MOVEI 17,ACSTG(I) + BLT 17,ACSTG+7(I) + XCT DISSW(I) + TLC T,(CONSO#CONSZ) + MOVEM T,LLUPI1 + XORI I,DIS2-DIS1 + MOVSI 17,ACSTG(I) + BLT 17,7 + POP P,LLUP1 + POPJ P, + +CHECK: CONSO DIS,200 + JRST CHECK1 + BLKO DIS,DISPTR + PUSHJ P,RECYC +CHECK1: XCT LLUPI1 ;JRST LLUP1 (IF OFF) OR TRNA (ALWAYS SKIP, VALUE OF WORD NEGATIVE) + JRST SWAP + POPJ P, +RECYC: MOVEM T,DISPTR + MOVEI T,40 + SOJG T,. + CONO DIS,100 + DATAO DIS,[20157,,261777] + MOVE T,DISWD + EXCH T,DISPTR + SETOM DISDON + POPJ P, + +OVRD: MOVSI B,-5 +OVRD1: MOVE R,MSKTB(B) + AND R,LWT(I) + TDNN T,MSKTB(B) + IOR T,R + AOBJN B,OVRD1 +OVRD2: CLEARM FRASE + TLZ F,TIF + CLEARM WRD + JRST MASK2 + +MSKTB: 777000,, + 0 17,0 + @ + (17) + ,-1 + + +ISTRING: PUSHJ P,SETISB + PUSHJ P,IIN + MOVEM T,TEM2 +ISTR1: PUSHJ P,IIN + CAMN T,TEM2 + JRST ISTR2 + PUSHJ P,SASEM + JRST ISTR1 + +ISTR2: MOVE T,TEM + SETZM WRD2 + JRST MASK2 + +SETISB: TRZN F,Q2F + JRST STISB2 + MOVEI W2,40 + MOVE W1,WRD2 + CAIN W1,6 + HRRM W2,SASEM + CAIN W1,7 + HLLZS SASEM + DPB W1,[300600,,STRB] +STISB2: MOVE W1,STRB + POPJ P, + +SASEM: SUBI T,0 +SASME: IDPB T,W1 + HRRI W1,TEM + POPJ P, + +IIN: PUSHJ P,IN + CAIE T,177 + POPJ P, + JRST ERR + +STRB: 440700,,TEM + + ;ENTRY FROM ALTMODE DOUBLEQUOTE +TEXO2: TRZN F,Q2F ;IF NUMBER NOT TYPED AFTER ALTMODE, + JRST TEXSET ;THEN USE LAST TYPE + SKIPN W1,WRD2 ;IF NUMBER ZERO, + JRST ERR ;THEN ERROR + HRRM W1,TEXO11 ;(RANDOM LSH) + MOVEI W2,40 ;GET READY FOR NEXT INSTRUCTION + CAIN W1,6 ;IF FOR SIXBIT, + MOVEM W2,TEXOF ;THEN SET OFFSET APPROPRIATELY + CAIN W1,7 ;IF FOR SEVEN-BIT, + SETZM TEXOF ;THEN SET OFFSET TO ZERO + ;NOTE THAT $N", N .NE. 6 OR 7 USES OFFSET LEFT OVER FROM PREVIOUS MODE + JRST TEXSET ;GO SET MODE TO TEXT (MUNG DISPATCH TO ITEXO) + +TEXOF: 0 ;TEXT OFFSET (MAINLY (ENTIRELY?) FOR SIXBIT) + +LCT: PUSHJ P,TSPC + PUSHJ P,TSPC +TSPC: MOVEI T,40 ;SPACE + JRST TOUT + +TYOI: 0 + MOVE T,TYOI + LDB T,[270600+T,,-1] + PUSH P,TYOI + JRST TOUT + +LISTEN: SKIPN INSW + PUSHJ P,TYI + POPJ P, + CAIE T,^B + CAIN T,^E + JRST TYO2 + CAIE T,^V + CAIN T,^W + JRST TYO2 + JRST CPOPJ1 + + +IN: SKIPE INSW + JRST @INSW ;SOMEONE HAS PROVIDED ANOTHER IO ROUTINE, USE IT. (IT SHOULD POPJ 1,) + ILDB T,MACCR + JUMPN T,IN2 + SETZM MACCR + CONSO TTY,40 + PUSHJ P,DISCFT + PUSHJ P,TYI + JFCL +IN2: CAIE T,175 + CAIN T,176 + MOVEI T,33 + SKIPE OUTSW(I) + JRST @OUTSW(I) + CAIL T,^I + CAILE T,^M + JRST IN3 + SKIPE TTYFLG + POPJ P, + PUSH P,T + MOVEI T,15 + PUSHJ P,TYO2 + MOVEI T,12 + PUSHJ P,TYO2 + POP P,T + POPJ P, +IN3: PUSHJ P,TYO2 + +LPTR: SKIPN LPTFLG + POPJ P, + CAIE T,15 + JRST .+3 + CONO LPT,10 + POPJ P, + PUSH P,T + CAIN T,12 + MOVEI T,440 + CAIN T,14 + MOVEI T,441 + CAIN T,33 + MOVEI T,"$ + SUBI T,40 + CONSZ LPT,10 + PUSHJ P,DISCFT + DATAO LPT,T + POP P,T + POPJ P, + + +TOUT: SKIPE DISON ;IF DISPLAY ON, + PUSHJ P,CHECK +TOUT2: SKIPE OUTSW(I) + JRST @OUTSW(I) + PUSHJ P,LPTR +TYO: SKIPN TTYFLG + POPJ P, +TYO2: CAIL T," ;SPACE + JRST TYO3 + CAIN T,177 + POPJ P, + CAIL T,^I + CAILE T,^M + CAIN T,^G + JRST TYO3 + PUSH P,T + CAIE T,33 + MOVEI T,"^ + CAIN T,33 + MOVEI T,"$ + PUSHJ P,TYO3 + POP P,T + CAIN T,33 + POPJ P, + TRO T,100 + PUSHJ P,TYO3 + TRZ T,100 + POPJ P, + +TYO3: CONSZ TTY,20 + PUSHJ P,DISCFT + DATAO TTY,T + POPJ P, + +TYI: CONSO TTY,40 + POPJ P, + DATAI TTY,T + ANDI T,177 + CAIE T,^B + JRST .+3 + SETOM LPTFLG + CONO LPT,10 + CAIN T,^E + SETZM LPTFLG + CAIN T,^V + SETOM TTYFLG + CAIN T,^W + SETZM TTYFLG + JRST CPOPJ1 + +RESTORE: SETOM,TEM3 +RESTR1: HRRM T,SAVE + CLEARM,SARS + MOVE T,SAVPI + HLLM T, SAVE + AND T, SAVPI+1 + IORI T, 2000 ;TURN ON CHANNELS + MOVEM T, SAVPI +RES1: HRLZI 17,AC0 + BLT 17,17 + SKIPL,TEM3 +CPUSHP: PUSH,BCOM + CONO PRS,@SAVPI + JRST 2,@SAVE + +CRF: JSR 15,TYOI +LF: MOVEI T,12 ;LINE FEED + JRST TOUT + +;FLOATING POINT OUTPUT + +TFLOT: MOVE A,T + JUMPG A,TFL1 + JUMPE A,FP1A + MOVNS A + XCT "-,CRF + TLZE A,400000 + JRST FP1A + +TFL1: TLNN A,400 + XCT "#,CRF ;NOT NORMALIZED + +FP1: MOVEI B,0 + CAMGE A,FT01 + JRST,FP4 + CAML A,FT8 + AOJA B,FP4 +FP1A: MOVEI C,0 + +FP3: MULI A,400 + ASHC B,-243(A) + MOVE A,B + CLEARM,TEM1(I) + PUSHJ P,FP7 + XCT ".,CRF + MOVNI A,10 + ADD A,TEM1(I) + MOVE W1,C +FP3A: MOVE T,W1 + MULI T,12 + PUSHJ P,FP7B + SKIPE,W1 + AOJL A,FP3A + POPJ P, + +FP4: MOVNI C,6 + MOVEI W2,0 +FP4A: ADDI W2,1(W2) + XCT,FCP(B) + SOSA W2 + FMPR A,@FCP+1(B) +FP4B: AOJN C,FP4A + MOVNI B,-2(B) + PUSH P,B + PUSHJ P,FP3 + MOVEI T,105 + PUSHJ P,TOUT + POP P,T + DPB T,[300200,,.+1] + XCT "+,CRF + MOVE A,W2 + +FP7: JUMPE A,FP7A1 + IDIVI A,12 + AOS,TEM1(I) +FP7A: HRLM B,(P) + JUMPE A,FP7A1 + PUSHJ P,FP7 + +FP7A1: HLRZ T,(P) +FP7B: ADDI T,260 + JRST,TOUT + + 1.0^32. + 1.0^16. +FT8: 1.0^8 + 1.0^4 + 1.0^2 + 1.0^1 +FT: 1.0^0 + 1.0^-32. + 1.0^-16. + 1.0^-8 + 1.0^-4 + 1.0^-2 +FT01: 1.0^-1 +FT0=FT01+1 + +FCP: CAMLE A, FT0(C) + CAMGE A, FT(C) + 0, FT0(C) + +PS: BLOCK LPDL +DISPDL: BLOCK LPDL + + INFORM [END OF LOWCODE]\.-1 + LOC DDT + +;RIGHT HALF FLAGS +1RF=10 +OUTPUT=4 ;OPDECODER FLAGS + +CF1=400 ;OUTPUT 1 REGISTER AS CONSTANT +LF1=2000 ;OUTPUT 1 REGISTER AS FORCED SYMBOLIC OR CONSTANT +Q2F=1 ;NUMBER TYPED AFTER +SBF=20 +NAF=200 ;NEGATIVE ADDRESSES PERMISSABLE +POWF=4000 ;ARGUMENT FOR EXPONENT COMING +SLL=10000 ;STOP LOOKING FOR LOCALS + +GLOBAL=040000 ;GLOBAL SYMBOL +LOCAL=100000 +PNAME=740000 ;PROGRAM NAME +DELI=200000 ;DELETE INPUT +DELO=400000 ;DELETE OUTPUT + +NSYMS=NUMSYM*2 +LOW=LOWCOD-NSYMS-2 +JOBSYM=DDT-1 +MACDMP=37400+MOBY +MACCR=37777+MOBY + + +INFORM DDT,\. + + +DDT: CLEARM INSW ;IF C(INSW) .NE. 0 THEN INPUT ROUTINE JRST'S @INSW + CLEARM OUTSW + ;IN ORDER FOR DDT TO GRAB STARTING ADDRESS,: + AOSN STRTSW ; 1) STRTSW MUST = -1 + TRNN MACAC,-1 ; 2) ADDRESS PART MUST BE NON-ZERO + JRST NOADR + CAML MACAC,[200000,,0] ; 3) WORD MUST BE .GE. 200000,,0 + MOVEM MACAC,STARTA ;INSTRUCTION MEETS THE TESTS, USE AS STARTING INSTRUCTION +NOADR: JSR SAVE ;SAVE PROCESSOR CONDITION + PUSHJ P,BRKRET ;DIDN'T SKIP, PI STATUS AND AC'S WERE SAVED + SKIPGE JOBSYM ;IF SYMTAB MUNGED, + JRST IFIX ;THEN GO FIX IT +DD1A: PUSHJ P,DISINI ;INITIALIZE DISPLAY +DD1: TLZ F,ROF ;INDICATE NO REGISTER OPEN + PUSHJ P,CRF ;TYPE CRLF (AND RUN SCOPE IF ON) + MOVE T,[SCHM,,SCH] + BLT T,ODF +DD2: MOVEI P,PS + CLEARM PRNC ;PARENTHESES COUNT +LIS: MOVE T,ESTU + MOVEM T,ESTUT +LISA: TDZ F,[(,-1-ROF-STF)LF1+CF1+SBF+2] ;LEAVE REGISTER OPENED,TYPEOUT SUPPRESSED +LISB: TDZ F,[(,-1-ROF-STF-FAF-SAF)NAF] + CLEARM,WRD +LIS1: CLEARM,FRASE +LIS2: MOVEI T,1 + MOVEM T,FRASE1 + TLZ F,MLF+DVF +L1: TLZ F,CF+CCF+SF+FPF ;TURN OFF CONTROL, SYL, PERIOD FLAG + CLEARM,SYL +L1RPR: CLEARM,SYM + MOVSI T,(50*50*50*50*50*50) + MOVEM T,TEM(I) ;INIT SYMBOL COUNTER + CLEARM,DEN + CLEARM,WRD2 + +L2: PUSHJ P,IN ;PICK UP CHARACTER + TLNE F,CF ;CONTROL FLAG + JRST,L21 + CAIG T,"Z ;Z + CAIGE T,"A ;A + JRST,.+2 + JRST,LET +L21: MOVE R,T + CAIN T,177 + JRST WRONG + CAILE T,"_ + JRST ERR + IDIVI R,3 + LDB W,BDISP(R+1) + CAIGE W,MULT-DDT ;LOCATIONS BEFORE MULT DON'T HAVE ARG EVALUATED + JRST DDT(W) + +L211: MOVE T,SYL + TLZN F,LTF + JRST POWER +L4A: PUSHJ P,EVAL + JRST,UND1 +L4: TLZE F,MF + MOVN T,T + TLNN F,SF + CAIE W,LPRN-DDT + JRST,.+2 + JRST,LPRN + + EXCH T,FRASE1 + TLNN F,DVF + IMULB T,FRASE1 + TLZE F,DVF + IDIVB T,FRASE1 + CAIGE W,ASSEM-DDT + JRST DDT(W) ;MULTIPLY OR DIVIDE + ADDB T,FRASE + CAIGE W,SPACE-DDT + JRST DDT(W) ; + - @ , + + ADD T,WRD + TLNE F,TIF ;TRUNCATE INDICATOR FLAG + HLL T,WRD ;TRUNCATE + MOVEM T,WRD + TLNN F,QF + MOVE T,LWT(I) + CLEARM,R + MOVE W1,ESTUT + CAMN W1,ESTU + JRST L5 + CAILE W,CARR-DDT + JRST ERR +L5: CAIG W,RPRN-DDT + JRST DDT(W) + PUSH P,KILRET + SKIPN PRNC + JRST DDT(W) + +UNDEF: MOVEI T,"U ;U + JRST WRONG1 +ERR: +WRONG: MOVEI T,"? +WRONG1: MOVEI P,PS + PUSHJ P,TOUT +RET: MOVEI P,PS + PUSHJ P,LCT ;COMMON RETURN FOR TAB;,JRST,LIS + JRST DD2 + UND1: MOVE R,ESTUT ;UNDEFINED SYM ASSEMBLER + PUSHJ P,EVAL2 + CAIN W,ASSEM-DDT + TLNN F,ROF + JRST OPLOOK + LDB T,[(100)PRNC + JUMPN T,UNDEF + CAIE W,ASSEM-DDT + XCT "#,CRF + MOVN R,[(2)2] + ADDB R,ESTUT + PUSHJ P,DISINI + MOVE T,SYM + TLO T,GLOBAL + MOVEM T,(R) + HRRZ T,LLOCO + TLNE F,MF + TLO T,400000 + MOVEM T,1(R) + SETZI T, + JRST L4 + +QUESTN: PUSHJ P,CRF ;LIST UNDEFINED SYMBOLS + MOVE R,ESTU +QUEST1: JUMPGE R,DD1 + MOVE T, (R) + SKIPA W1,ESTU + +QUEST2: ADD W1,[(2)2] + CAME T,(W1) + JRST QUEST2 + +QUEST3: CAME R,W1 + JRST QUEST4 + PUSHJ P,SPT + PUSHJ P,CRF +QUEST4: ADD R,[(2)2] + JRST QUEST1 + +OPLOOK: MOVE T,OPLK1 + MOVEI W1,SYM + MOVE R,[(440700)TXT + PUSHJ P,SPT+1 +OPLK1: IDPB T,R + ;OPDECODER + +OPEVAL: MOVEM P,SAVPDL + TRZA F,OUTPUT +OPTYPE: TRO F,OUTPUT + LSH T,-27. + MOVEM T,INST(I) + MOVE T,[(440700)TXT + MOVEM T,CHP +DEC: TRZ F,1RF + CLEARB R,W1 + MOVE W2,BTAB +OPDC1: ILDB T,W2 + CAILE T,40 + CAIL T,73 + SOJGE R,OPDC1 + JUMPG R,OPDC1 + SUBI T,40 + JUMPE T,DECX + JUMPG T,DC2 + DPB T,[(340500)PNTR] + TRZ T,-4 + AOS T + DPB T,[(300600)PNTR] + TRNN F,OUTPUT + JRST DC6 + LDB R,PNTR + JRST OPDC1 +DC2: HRREI T,-33(T) + JUMPL T,DECT + MOVE W1,T + IDIVI W1,4 + MOVE W2,BTAB(W2) + ADDI W2,(W1) + JRST OPDC1 + +DECT: TRNE F,OUTPUT + JRST O1CZ + ILDB W1,CHP + CAIE W1,133(T) + JRST LOSE + JRST OPDC1 +DECX: TRNE F,OUTPUT + POPJ P, + ILDB W1,CHP + JUMPE W1,DC7 +LOSE: POP P,R + POP P,W2 + POP P,PNTR + POP P,CHP +LOSE1: AOS R + DPB R,PNTR + LDB R,PNTR + JUMPN R,DC6AA + CAME P,SAVPDL + JRST LOSE + MOVSI T,DELO ;LOOK AT ALL LOCALS BEFORE GIVING UP + IORM T,SYM + PUSHJ P,EVAL + JRST UNDEF ;TYPE WARNING + PUSH P,R + PUSHJ P,EVAL1 + XCT "',CRF + CAME R,PRGM + XCT "",CRF + POP P,R +LOSE2: MOVEM R,PRGM + SUB R,[2,,2 + MOVE W1,(R) + TLNE W1,PNAME + JRST LOSE2 + JRST L4A ;SELECT APPROPRIATE PROGRAM +DC6: MOVEI R,0 + DPB R,PNTR +DC6AA: CAMN P,SAVPDL + JRST DC6BB + LDB T,-2(P) + CAME T,(P) + JRST LOSE1 +DC6BB: PUSH P,CHP + PUSH P,PNTR + PUSH P,W2 + PUSH P,R + JRST OPDC1 +DC7: MOVE P,SAVPDL + MOVE T,INST(I) + LSH T,27. + JRST L4 +O1CZ: TRO F,1RF + MOVEI T,133(T) + PUSHJ P,TOUT + JRST OPDC1 + PNTR: INST(I) +CHP: 0 +TXT: BLOCK 2 + +SAVPDL: 0 +BTAB: FOO=44 +REPEAT 4,[(FOO_12.+1100)TBL + FOO=FOO-11 +] + DEFINE BARF A +AWRD=AWRD+_CC +CC=CC-9. +IFL CC,[AWRD +AWRD=0 +CC=27. +] +CLOC=CLOC+1 +TERMIN + +DEFINE HACK A +IRPS B,D,[A] +Z="D +IFE Z-":,Y!B==CLOC +IFE Z-"/,IF1 [BARF 1] IF2 BARF Y!B+73 +IFE Z-"^,BARF _-1+B&7-1 +IFE *,[ +IRPC Q,,B +Z="Q +IFE Z-".,Z=100 +BARF Z-40 +TERMIN +] +TERMIN +TERMIN + + +TBL: AWRD=0 + CLOC=0 + CC=27. +;INITIAL DISPATCH + HACK [63^. FLO/ HAK/ ACCP/ BOOLE/ H HWT/ T ACBM/ . ] + +;BYTE AND FLOATING INST + HACK [FLO: 33^ ... BYTE/ FAD A/ FSB A/ FMP A/ FDV A: + 21^ LMB/ R LMB: 02^ . L:L. M:M. B:B. BYTE: 03^ .. + FS C/ IB P: P. I LD/ LD: LD B/ I DP/ DP: DP B/] + +;FWT, FIXED POINT ARITH, MISC. + HACK [HAK: 33^ MV/ MV: MOV MO/ ML/ DV/ SH/ H1/ JP/ + 21^ ADD IMB/ SU BIMB: B IMB: 02^ . I:I. M/ B/ MO: 22^ + EIMS: E IMS/ S IMS/ N IMS/ M IMS: 02^ . I/ M/ S: S. + ML: 21^ I ML1/ ML1: MUL IMB/ DV: 21^ I DV1/ DV1: + DI DV2: V IMB/ H1: 03^ EXC S3/ BL T: T. AO/ AO: AOBJ + AOB/ JRS T/ JFC L/ XC T/ . AOB: 01^ P/ N/ + JP: 03^ PU/ PU: PUSH PUS/ PO/ PO: POP POP/ JSR. + JS P/ JS PA: A. JR PA/ PUS: 01^ J: J.. POP: + 01^ . J/ SH: 02^ A S2/ ROT S1/ L S2: S S3: H S1/ . + S1: 21^ . C: C. ] + +;ARITH COMP, SKIP, JUMP + HACK [ACCP: 42^ CA CA1/ SJ/ A JS/ S JS: O 31^ + J COMP/ S COMP/ CA1: 31^ I COMP/ M COMP/ + SJ: 31^ JUM PSJ/ SKI PSJ: P COMP: + 03^ . L/ E: E. L E/ PA/ G E/ N: N. G. ] + +;BOOLEAN + HACK [BOOLE: 24^ ST/ AN: AND B2/ AN/ ST/ AN/ ST/ + X OR: OR B2/ I OR/ AN/ EQ DV2/ ST/ OR/ ST/ OR/ OR/ + ST: SET B2: 24^ Z IMB/ IMB/ CA: C TA/ TM: M IMB/ + CM: C TM/ TA: A IMB/ IMB/ IMB/ CB: C BIMB/ IMB/ CA/ + CA/ CM/ CM/ CB/ O IMB/ ] + +;HALF WORDS + HACK [HWT: 51^ HW1/ 21^ R HW2/ L HW2: R HW3/ HW1: + 21^ L HW4/ R HW4: L HW3: 32^ IMS/ Z IMS/ O IMS/ + EIMS/ ] + +;TEST INST + HACK [ACBM: 31^ AC1/ 01^ D AC2/ S AC2/ AC1: 01^ R AC2/ L + AC2: 42^ N EAN/ Z EAN/ C EAN/ O EAN: 12^ . E/ PA/ N/ ] + +IFN AWRD,AWRD + +NUM: ANDI T,17 ;T HOLDS CHARACTER + TLNE F,CF+FPF + JRST NM1 + MOVEI W,10 + IMULM W,SYL + ADDM T,SYL + MOVEI W,10. ;ALSO MAINTAIN DECIMAL WORD + IMULM W,DEN + ADDM T,DEN +LE1: AOJA T,LE1A ;FOR SQUOZE SYM + +DOLLAR: +PERC: MOVEI T,47+101-13-45(T) ;PERCENT SIGN +LET: TLC F,SF+FPF ;EXPONENT IFF LTF'*FEF'*(T=105)*SF*FPF=1 + TLZN F,LTF+FEF+SF+FPF + CAIE T,"E + TLOA F,LTF + TLOA F,FEF + JRST LET1 + TLZN F,MF + SKIPA W1,SYL + MOVN W1,SYL + MOVEM W1,FSV + CLEARM DEN +LET1: SUBI T,101-13 ;FORM RADIX 50 SYMBOL +LE1A: TLO F,SF+QF +LE2: MOVEI W,50 + EXCH W,TEM(I) + IDIVM W,TEM(I) + IMUL T,TEM(I) + ADDM T,SYM + JRST L2 + +NUM1: EXCH T,WRD2 ;FORM NUMBER AFTER DOLLAR SIGN + IMULI T,10. + ADDM T,WRD2 + TRO F,Q2F + JRST,L2 + + NM1: TLNE F,CF + JRST NUM1 + MOVEI W1,6 ;FORM FLOATING POINT NUMBER + AOS NM1A +NM1A: MOVEI W2,0 + MOVSI R,201400 +NM1A1: TRZE W2,1 + FMPR R,FT(W1) + JUMPE W2,NM1B + LSH W2,-1 + SOJG W1,NM1A1 +NM1B: MOVSI W1,211000(T) + FMPL R,W1 + SKIPN FH + JRST NM1C + LDB W2,[(331000)R] + LDB W1,[(331000)FH] + TLZ R,377000 + SUB W2,W1 + ASHC R,(W2) + ADD S,FL + TLZE S,400000 + AOS R + MOVE W2,FH + TLZ W2,377000 + ADD R,W2 + TLNN R,1000 + SOSA W1 + ASHC R,-1 + FSC R,1(W1) +NM1C: MOVEM R,FH + MOVEM S,FL + JUMPE R,NM1D + TLNE S,200000 + AOS R ; ROUND + TLO R,400 ; NORMALIZE +NM1D: MOVEM R,SYL + AOJA T,LE1A + +POWER: TLNN F,FEF + JRST L4 ;NO EXPONENT + CAIE W,PLUS-DDT + CAIN W,MINUS-DDT + TROE F,POWF + TRZA F,POWF + JRST DDT(W) ; E+- + + MOVE W2,DEN + MOVEI W1,FT-1 + TLZE F,MF + MOVEI W1,FT01 + SKIPA T,FSV +POW2: LSH W2,-1 + TRZE W2,1 + FMPR T,(W1) + JUMPE W2,L4 + SOJA W1,POW2 + +PERIOD: MOVE T,LLOC + TLNE F,SF ;SYLLABLE STARTED + MOVE T,DEN + MOVEM T,SYL + TLON F,FPF+SF+QF + MOVEI T,0 + IDIVI T,400 + SKIPE T + TLC T,243000 + TLC W1,233000 + FADL T,W1 + MOVEM T,FH + MOVEM W1,FL + HLLZS NM1A + MOVEI T,45 ;RADIX 50 PERIOD + JRST LE2 + +QUAN: SKIPA T,LWT(I) ;LAST QUANTITY TYPED +PILOC: MOVEI T, SAVPI +QUAN1: MOVEM T,SYL +QUAN2: TLO F,SF+QF ;WRD,SYL STARTED + TLZ F,CF+CCF + JRST,L2 + +CONTROL: TLOE F,CF + TLO F,CCF + JRST,L2 + + +EVAL: MOVE R,PRGM ;LOOK UP SYMBOL +EVAL0: HRLOI W1,37777+DELI + JRST EVAL3 +EVAL1: ADD R,[(2)2] +EVAL2: SKIPL R + MOVE R,@JOBSYM + CAMN R,PRGM + POPJ P, ;NO SYMBOL FOUND +EVAL3: MOVE T,(R) + XOR T,SYM + TLNN T,PNAME + TLOA W1,LOCAL + TDNE T,W1 + JRST EVAL1 + TLNN T,340000 + JRST EVAL1 + MOVE T,1(R) + +CPOPJ1: AOS (P) ;FOUND SYMBOL, SKIP +CPOPJ: POPJ P, + + +;BIT 40 - DELETE OUTPUT +; 20 - DELETE INPUT +; 10 - LOCAL +; 04 -GLOBAL +; NO BITS - PROGRAM NAME + +KILL: TLNN F,LTF ;DELETE SYMBOLS + JRST,KILLA + PUSHJ P,EVAL + JRST KILL1 + MOVEI T,DELO_-16. ;DELETE OUTPUT + TLNE F,CCF + MOVEI T,DELI_-16. ;NO INPUT OR OUTPUT + DPB T,[(420200+R)] +KILRET: JRST,RET + +KILLA: TLNN F,QF + TLNN F,CCF + JRST ERR + MOVE R,KILC + MOVEM R,@JOBSYM ;RESTORE INIT SYMS + HRRZM R,ESTU + MOVEM R,PRGM + HRLZI T,DELO+DELI + ANDCAM T,(R) ;GET RID OF DELETE BITS IN INITIAL TABLE + AOBJN R,.+1 + AOBJN R,.-2 + JRST,DD1 + +KILL1: MOVE R,ESTU ;REMOVE UNDEFINED SYMS + JUMPGE R,UNDEF +KILL2: PUSHJ P,EVAL0 + JRST RET + PUSHJ P,REMUN + JRST KILL2 + +REMUN: MOVE S,[(2)2] ;REMOVE ONE UNDEFINED SYM + ADDB S,ESTU + MOVE W,-2(S) + MOVEM W,(R) + MOVE W,-1(S) + MOVEM W,1(R) + POPJ P, + +DS: MOVE R,DSSAV(I) + MOVEI T,DELO_-16. + DPB T,[(420200+R)] + MOVE T,1(R) + PUSHJ P,LOOK + JRST RET + JRST RET + +TAG: TLNE F,CF ;DEFINE SYMBOL AS OPEN REGISTER + JRST SETNAM + MOVE W,LLOCO + HRRZM W,DEFV + TLOE F,FAF + JRST ERR +DEFIN: TLNE F,FAF + TLNN F,LTF + JRST ERR +ADEFIN: PUSHJ P,EVAL + JRST DEF1 + CAMGE R,KILC + JRST DEF2 ;REDEFINE + MOVEI T,DELI_-16. + DPB T,[(420200+R)] +DEF1: MOVN R,[(2)2] + ADDB R,@JOBSYM + HRRZ T,ESTU + SUBI T,2 + HRL T,ESTU + HRRM T,ESTU + SKIPGE ESTU + BLT T,-1(R) + PUSHJ P,DISINI +DEF2: MOVE T,DEFV + MOVEM T,1(R) + MOVSI T,GLOBAL + IORB T,SYM + MOVEM T,(R) + MOVE R,ESTU + +DEF3: JUMPGE R,RET ;PATCH IN UNDEFINED SYM + MOVE T,SYM + CAME T,(R) + JRST DEF4 + MOVE S,DEFV + SKIPGE 1(R) + MOVNS S + PUSH P,R + MOVE R,1(R) + PUSHJ P,FETCH + JRST ERR + ADD S,T + HRRM S,T + PUSHJ P,DEP + POP P,R + PUSHJ P,REMUN +DEF4: ADD R,[(2)2] + JRST DEF3 + + +SETNAM: MOVE R,@JOBSYM +SET2: JUMPGE R,UNDEF + MOVE T,(R) + ADD R,[(2)2] + CAME T,SYM + JRST SET2 + MOVEM R,PRGM + JRST RET + +MULT: TLOA F,PTF+MLF ;* +DIVD: TLO F,DVF+PTF ;SINGLE QUOTE + JRST L1 + +ASSEM: JRST PLUS ;# +MINUS: TLO F,MF +PLUS: TLO F,PTF + JRST LIS2 + +LPRN: CAML P,[(LPDL-32)] + JRST,ERR + PUSH P,F ;RECURSE FOR OPEN PAREN + PUSH P,WRD + PUSH P,FRASE + PUSH P,FRASE1 + AOS,PRNC + JRST,LISA + +INDIRECT: MOVSI W,(@) + IORB W,WRD + TLO F,QF + JRST,LIS2 + +ACCF: TLNN F,COMF + HRRM T,COMWD ;COMMA + MOVE R,T + HLLZS T + LDB W1,[(410300)WRD] + IDIVI W1,7 + LSH R,27(W1) + ADD T,R + ADD T,WRD + TLOE F,COMF +COMWD: HRLI T,. + MOVEM T,WRD + JRST SPACE+1 + +SPACE: TLNE F,QF + TLO F,TIF +SPAC1: TLZ F,MF+PTF + JRST,LIS1 + +RPRN: MOVS T,WRD ;) + SOSGE,PRNC + JRST,ERR + POP P,FRASE1 + POP P,FRASE + POP P,WRD + POP P,F + TLO F,QF + TLNE F,PTF + TLOE F,SF + JRST,RPRN1 + MOVEM T,SYL + JRST,L1RPR +RPRN1: ADDB T,WRD + JRST,L1RPR-1 + VARRW: SOSA LLOC ;^ +TAB: PUSHJ P,PLOC +LI1B: SOS LLOC + +LINEF: PUSHJ P,DEPRA ;NEXT REGISTER + TLZN F,CF + JRST LI0 +LI1A: MOVE R,PLCR ;MOVE BACK IN RING BUFFER + MOVE T,LOCBF(R) + SOSGE R + MOVEI R,NLEVS-1 + MOVEM R,PLCR + HRRZM T,LLOC + JRST DDT(W) +LI0: PUSHJ P,CRF + AOS T,LLOC +LI1: HRRZM T,LLOC + HRRZM T,LLOCO + PUSHJ P,PAD + MOVEI T,"/ ;SLASH + TLNE F,STF + MOVEI T,"! ;EXCLAMATION MARK + PUSHJ P,TOUT +LI2: TLZ F,ROF + PUSHJ P,LCT + MOVE R,LLOCO + PUSHJ P,FETCH + JRST ERR + TLO F,ROF + TLNE F,STF + JRST DD2 + JRST CONSYM + + +CARR: PUSHJ P,DEPRA + MOVEI W,LI1B-DDT + TLZE F,CF + JRST LI1A + JRST DD1 + + +OCON: TLZE F,CF + JRST ISTRIN + TROA F,LF1+CF1 ;OPEN AS CONSTANT +OSYM2: TRZ F,CF1 ;OPEN SYMBOLICALLY + TROA F,LF1 +SUPTYO: TLOA F,STF ;SUPPRESS TYPEOUT +SLASH: TLZ F,STF ;TYPE OUT REGISTER + TLNE F,QF + PUSHJ P,PLOC ;QUANTITY TYPED +SLAS1: HRRZM T,LLOCO + JRST LI2 + +ICON: TLZE F,CF + JRST IKON + PUSHJ P,DEPRA ;\ + JRST SLAS1 + +PLOC: CAMN T,LLOC + POPJ P, + AOS R,PLCR ;ADVANCE RING POINTER + CAIL R,NLEVS + CLEARB R,PLCR + EXCH T,LLOC + MOVEM T,LOCBF(R) + MOVE T,LLOC + HRRZS LLOC + POPJ P, + +OSYM: TLZN F,CF + JRST OSYM2 + PUSHJ P,SETISB +JSTR1: PUSHJ P,IIN + CAIL T,40 + CAILE T,140 + JRST ISTR2 + PUSHJ P,SASEM + JRST JSTR1 + +ASLASH: TLNN F,QF + JRST QUESTN + PUSH P,T + MOVEI T,"/ + PUSHJ P,TOUT + POP P,T + JRST SLASH + +IKON: MOVEM T,LWT(I) + PUSHJ P,EFFEC0 + JRST ERR + MOVE R,T + PUSHJ P,FETCH + JRST ERR + JRST OVRD2 + +DEPRA: TLNE F,ROF ;IF REGISTER IS BEING CHANGED + TLNN F,QF ;REMOVE ALL PREVIOUS UNDEFINED + JRST DEPRS ;SYMBOL REFERENCES TO IT + MOVE R,ESTU + MOVEM W1,ESTU +DEPRA2: JUMPGE R,DEPRS + HRRZ W,1(R) + CAMN W,LLOCO + PUSHJ P,REMUN + ADD R,[(2)2] + JRST DEPRA2 + +EQUAL: TROA F,LF1+CF1 ;= +PSYM: TRZ F,CF1 ;@ + TRO F,LF1 + JRST CONSYM + +R50PNT: MOVEM T,LWT(I) ;AMPERSANT + LSH T,-36 + TRZ T,3 + PUSHJ P,TOC + PUSHJ P,TSPC + MOVEI W1,LWT(I) + JRST SPT + +HWRDS: MOVEI R,HLFW-TFLOT ;H +SFLOT: ADDI R,TFLOT-SATP ;F +RATP: ADDI R,SATP-ITEXO ;T +TEXSET: ADDI R,ITEXO-PIN ;" +SYMBOL: ADDI R,PIN-FTOC ;S +CON: ADDI R,FTOC ;C + JSP W,SET + +RELA: TLZE F,QF ;R + JRST,BASECH + MOVEI R,PADSO-TOC +ABSA: ADDI R,TOC ;A + JSP W,SET + +BASECH: SOJLE T,ERR ;CHANGE RADIX + MOVEI R,1-10.(T) +SDEC: ADDI R,2 ;D +SOCT: ADDI R,10 ;O + JSP W,SET + +SET: MOVEI W,-RELA(W) + IDIVI W,5 + HRRZM R,SCH(W) + JUMPGE F,LIS1 + HRRZM R,SCHM(W) + JRST RET + +GO: HRLI T,(JRST) + TLC F,QF+CCF + TLCN F,QF+CCF + MOVEM T,STARTA + TLOE F,QF + JRST XEC0 + SKIPE T,STARTA + +XEC: TLNN F,QF ;X + JRST ,ERR +XEC0: MOVEM T,TEM + PUSHJ P,CRF + PUSHJ P,TTYLEV + PUSHJ P,INSRTB + JSP T,RESTORE + XCT TEM +XEC1: JRST DDT ;USED BY BCOM + JSR SAVE + PUSHJ P,BRKRET + PUSHJ P,CRF + JRST DD1 + +TEXO: TLNE F,CF ;IF ALTMODE TYPED, + JRST TEXO2 ;THEN SET TYPEOUT MODE + MOVEM T,LWT(I) ;DOUBLE QUOTE + ;DISPATCH ENTRY FOR IN DOUBLEQUOTE MODE +ITEXO: SETZM TEM2 + MOVE W1,T + TDNE W1,[-200] ;SKIP IF ONLY ONE CHARACTER IN WORD + JRST TEXO1 + SKIPN TEXOF ;IF IN ASCII MODE, + LSH W1,1 ;THEN ASSUME IT'S RIGHT JUSTIFIED +TEXO1: MOVEI T,0 +TEXO10: JUMPE W1,CPOPJ +TEXO11: LSHC T,6 ;SET INITIAL TEXT MODE TO SIXBIT +TEXO12: SKIPN TEM2 + JUMPE T,TEXO1 + SETOM TEM2 + ADD T,TEXOF + PUSHJ P,TOUT + JRST TEXO1 + + ;ALTMODE V + +DISF: SETCMM DISON ;COMPLEMENT STATUS FLAG + JRST DISINI ;INITIALIZE DISPLAY AND RETURN + +BP0: REPEAT NBP+1,[ + 0 + JSA T, BCOM + 0 +] + +BP1=BP0+3 +B1INS=BP1+2 +BPN=.-3 + + ;BREAKPOINT 0 LIKE OTHERS EXCEPT DOESN'T GET CHECKED ON LOC$B OR CLEARED BY $B + +BCOM: 0 + HRRM T,LEAV + MOVEI T,B1SKP-B1INS(T) + HRRM T,BCOM3 ;CONDITIONAL BREAK SETUP + MOVEI T,B1CNT-B1SKP(T) + HRRM T,BCOM2 ;PROCEDE COUNTER SETUP + MOVE T,BP1-B1CNT(T) + HLLM T,LEAV1 ;SAVE FLAGS FOR RESTORING + EXCH T,BCOM ;RESTORE FORMER CONTENTS OF ACCUMULATOR + +BCOM3: SKIPE B1SKP ;ADDRESS MODIFIED, POINTS TO CONDITIONAL BPT INSTRUCTION + XCT @.-1 +BCOM2: SOSG B1CNT ;ADDRESS MODIFIED, POINTS TO COUNT OF CURRENT BPT + JRST BREAK + + MOVEM T,AC0+T + LDB T,[(331100)@LEAV] + CAIL T,264 ;JSR + CAILE T,266 ;JSA,JSP + TRNN T,700 ;UUO + JRST PROC1 + CAIE T,260 ;PUSHJ + CAIN T,256 ;XCT + JRST PROC1 + MOVE T,AC0+T + JRST 2,@LEAV1 ;RESTORE FLAGS AND JUMP TO .+1 + +LEAV: XCT B1INS ;ADDRESS MODIFIED + JRST @BCOM + AOS BCOM + JRST @BCOM + +LEAV1: LEAV + +BREAK: JSR SAVE + PUSHJ P,BRKRET + SOS T,BCOM3 + HRRZS T + PUSHJ P,PADSO + MOVEI T,"> + PUSHJ P,TOUT + SKIPG @BCOM2 + PUSHJ P,TOUT ;TYPE OUT SECOND ">" IF COUNT EXHAUSTED + MOVE T,BCOM + HLLM T, SAVPI + MOVEI T,-1(T) + PUSHJ P,PAD + HRRZ T,@BCOM3 + HRRM T,PROC0 + HLRZ T,@BCOM3 + JUMPE T,BREAK1 + PUSHJ P,LCT + HLRZ T,@BCOM3 + PUSHJ P,PLOC + PUSHJ P,LI1 +BREAK1: HRRZ R,BCOM3 + SUBI R,B1ADR + IDIVI R,3 + MOVEI S,1 + LSH S,1(R) + TDNN S,AUTOPI + JRST RET + PUSHJ P,LISTEN + JRST PROCD1 + JRST RET + +PROCEDE: TLNN F,QF + MOVEI T,1 ;NO COUNT SPECIFIED, USE 1 + MOVEM T,@BCOM2 ;MOVE TO COUNT OF SPECIFIED BPT + HRRZ R,BCOM3 + PUSHJ P,AUTOP +PROCD1: PUSHJ P,CRF + PUSHJ P,TTYLEV +PROC0: HRRZI R,XEC1 ;ADDRESS MODIFIED + PUSHJ P,FETCH + JRST ERR + MOVEM T,WRD + PUSHJ P,INSRTB + MOVE T,WRD + JRST PROC2 + +PROC1: MOVE T,AC0+T + JSR SAVE + MOVE T,@LEAV +PROC2: MOVE R,BCOM + MOVEI W,100 + MOVEM W,TEM1 + JRST IXCT5 + +IXCT4: MOVEM R,40 + MOVEI R,41 +IXCT: SOSL TEM1 + PUSHJ P,FETCH + JRST BPLUP +IXCT5: MOVEM T,TEM + LSH T,-33 + CAIN T,254 + JRST IXCT6 + HRLZI 17,AC0 + BLT 17,17 + MOVEI T,@TEM + DPB T,[(2700)TEM] + LDB W1,[(270400)TEM] + LDB T,[(331100)TEM] + MOVEI P,PS + CAIN T,260 + JRST, IPUSHJ + + CAIN T,264 + JRST,IJSR + CAIN T,265 + JRST,IJSP + CAIN T,266 + JRST,IJSA + MOVE R,TEM + TRNN T,700 + JRST,IXCT4 + CAIN T,256 + JRST,IXCT + +IXCT6: MOVEI T,TEM + HRRM T,LEAV + MOVEI T,LEAV + JRST,RESTORE + +BPLUP: PUSHJ P,BRKRET + JSR SAVE ;ALWAYS SKIPS +INC1: JSR BP0 ;USED AS "CONSTANT" IN SETTING UP FOR INSERTING BREAKPOINTS + JRST ERR + +IPUSHJ: DPB W1,[(270400)CPUSHP] + CLEARM,TEM3 + MOVE T,TEM + JRST,RESTR1 + +IJSA: MOVE T,BCOM + HRL T,TEM + EXCH T,AC0(W1) + JRST,IJSR2 + +IJSR: MOVE T,BCOM + HLL T,SAVPI +IJSR2: MOVE R,TEM + PUSHJ P,DEP + AOS,TEM +IJSR3: MOVE T,TEM + JRST,RESTORE + +IJSP: MOVE W,BCOM + HLL W,SAVPI + MOVEM W,AC0(W1) + JRST,IJSR3 + +;INSERT BREAKPOINTS + +INSRTB: MOVE S,INC1 +INSRT1: SKIPE R,B1ADR-BP1(S) ;GET C(BADR) IN R + PUSHJ P,FETCH ;GET CONTENTS OF LOC ADDRESSED BY R INTO T + JRST INSRT3 ;LOCATION OUTSIDE OF MEMORY OR BREAKPOINT EMPTY + MOVEM T,B1INS-BP1(S) ;PUT CONTENTS IN BINS + MOVE T,S ;JSR BP + PUSHJ P,DEP ;DEPOSIT T IN LOCATION SPECIFIED BY R +INSRT3: ADDI S,3 + CAMG S,[JSR BPN] + JRST INSRT1 + POPJ P, + +;REMOVE BREAKPOINTS + +REMOVB: MOVEI S,BNADR ;POINTER TO BADR +REMOV1: MOVE T,B1INS-B1ADR(S) ;INSTRUCTION AT BREAKPOINT + SKIPE R,(S) ;IF THERE'S REALLY A BREAKPOINT THERE, + PUSHJ P,DEP ;THEN DEPOSIT INSTRUCTION IN USER'S CORE (SPECIFIED BY R) +REMOV3: SUBI S,3 + CAIL S,B0ADR + JRST REMOV1 + POPJ P, + + ;ALTMODE B + +BPS: TLZE F,QF + JRST BPS1 ;LOCATION SPECIFIED + TRZE F,Q2F + JRST BPS2 ;REMOVE SPECIFIED BREAKPOINT + MOVE T,[(B1ADR)B1ADR+1] ;REMOVE ALL BREAKPOINTS + CLEARM B1ADR + BLT T,BNADR+2 + JRST DD1 + + ;LOC$B, LOC$NB + +BPS1: TRZN F,Q2F + JRST,BPS3 ;NUMBER NOT TYPED AFTER ALTMODE + MOVE R,T + TRO F,2 ;USED LATER + + ;GET HERE WHEN NUMBER TYPED AFTER ALTMODE + +BPS2: SKIPL T,WRD2 ;BPT # NOT LEGAL... + CAILE T,10 ;IF NOT BETWEEN 0 AND 8 INCLUSIVE + JRST,ERR + IMULI T,3 ;AMOUNT OF STG PER BREAKPOINT + ADDI T,B1ADR-3 ;MAKE T POINT TO STG AREA OF SPECIFIED BREAKPOINT + TRZN F,2 + JRST MASK2 ;LOCATION NOT SPECIFIED, TREAT AS SYM + EXCH R,T ;R NOW IS POINTER TO BP STG AREA, T SPECIFIED LOCATION + JRST BPS5 + + ;LOC$B + +BPS3: MOVEI R,B1ADR +BPS4: HRRZ W,(R) ;GET BPN LOCATION + CAIE W,(T) ;IF SPECIFIED LOCATION, + SKIPN (R) ;OR IF ZERO, + JRST,BPS5 ;THEN USE IT, + ADDI R,3 ;OTHERWISE INCREMENT R TO POINT TO STG OF NEXT BPT + CAIG R,BNADR ;SKIP IF TOO MANY + JRST,BPS4 ;GO LOOK AT NEXT ONE + JRST,ERR ;ALL FULL + +BPS5: MOVEM T,(R) ;SET BP TO SPECIFIED LOCATION (0 MEANS NOT IN USE) + CLEARM,1(R) + CLEARM,2(R) +AUTOP: SUBI R,B1ADR ;NOW MUNG R, + IDIVI R,3 ;INTO BP NUMBER + MOVEI S,1 + LSH S,1(R) ;C(S):=1_<1+BP#> + ANDCAM S,AUTOPI + TLNE F,CCF + IORM S,AUTOPI ;ALTMODE ALTMODE TYPED MEANS BPT ENCOUNTER => TYPE MESSAGE + ;BUT CONTINUE (UNTIL CHARACTER TYPED AT TTY) + POPJ P, + + + +DEPRS: MOVEM T,LWT(I) +DEPR: MOVE R,LLOCO ;QUAN TYPED IN REGIS EXAM + TLZE F,ROF + TLNN F,QF + POPJ P,0 +DEP: TRNN R,777760 + JRST,DEP1 ;BPT LOCATION IS AN ACCUMULATOR + MOVEM T,0(R) + POPJ P,0 +DEP1: MOVEM T,AC0(R) + POPJ P,0 + +FETCH: MOVE T,HIGH + CAIGE T,(R) + POPJ P, + MOVE T,(R) + TRNN R,777760 + MOVE T,AC0(R) + JRST CPOPJ1 + FIRARG: MOVEM T,DEFV + TLO F,FAF + JRST,ULIM1 +ULIM: TLO F,SAF + HRRZM T,ULIMIT +ULIM1: TLNE F,CF + JRST OVRD + TLNN F,QF + JRST,ERR + JRST,LISB + +LOOK: SETZB W1,S + MOVSI W1,DELI+DELO + MOVE R,PRGM + MOVEM R,PRGM(I) + MOVSI W2,PNAME + SKIPGE T + MOVSI S,400000 + MOVE W,[444400,,ENDT] + MOVEM W,TEM(I) +LEND1A: ILDB W,TEM(I) + MOVEM W,LLUP1 + JRST LLUP1 +ENDT: TDNN W2,(R) + TLO W1,LOCAL + SKIPL R + MOVE R,@JOBSYM + CAMN R,PRGM(I) + TLZA W1,-1 +LLUP: ADD R,[2,,2] +LLUPI1: JRST LLUP1 ;OR TRNA + PUSHJ P,SWAP + CONSZ DIS,200 + JRST LLUPD +LLUP1: 0 + JRST LEND1 + CAML T,1(R) + CAML S,1(R) + JRST LLUP + HLRZ W,W1 + TSNN W,(R) + TDNN W2,(R) + JRST LLUP + HRR W1,R + CAMN T,1(R) + JRST SPT + MOVE S,1(R) + JRST LLUP +LLUPD: BLKO DIS,DISPTR + PUSHJ P,RECYC +CJLP1: JRST LLUP1 +LEND1: AOS W,TEM(I) + XCT (W) + JRST LEND1A +LOOK1: MOVEM T,TEM(I) + TRNE W1,-1 + SUB T,S + JRST CPOPJ1 + +CONSYM: MOVEM T,LWT(I) +CONSM: TRNN F,LF1 +CONS1: JRST @SCH + TRNE F,CF1 + JRST, FTOC + +PIN: TRZ F,NAF + TLC T,700000 + TLCN T,700000 + JRST,INOUT + PUSHJ P,OPTYPE + MOVSI T,777000 + AND T,LWT(I) + JUMPE T,PI3+1 + TRNN F,1RF + PUSHJ P,LOOK +PI3.1: TROA F,NAF + JRST HLFW +PI3: PUSHJ P,TSPC + LDB T,[(270400)LWT(I)] ;AC + JUMPE T,PI4 + PUSHJ P,PAD +PI3A: XCT ",,CRF +PI4: MOVE W1,LWT(I) + MOVEI T,"@ ;AT SIGN + TLNE W1,20 ;CHECK FOR INDIRECT BIT + PUSHJ P,TOUT +PI5: HRRZ T,LWT(I) + LDB W1,[(331100)LWT(I)] + CAIL W1,240 + CAILE W1,247 + PUSHJ P,SPAD + PUSHJ P,PADS3A +PI7: TRZ F,NAF + LDB R,[(220400)LWT(I)] ;INDEX REGISTER CHECK + JUMPE R,PADS1 ;EXIT +PI7.1: XCT "(,CRF + MOVE T,R + PUSHJ P,PAD + MOVEI T,") + JRST,TOUT ;EXIT + + +HLFW: TRO F,NAF + HLRZ T,LWT(I) + PUSHJ P,PAD + XCT ",,CRF + XCT ",,CRF + SKIPA T,LWT(I) +SPAD: AOS (P) +PAD: ANDI T,777777 ;PRINT ADDRESS + JRST @AR ;PADSO OR PAD1 +PADSO: JUMPE T,TOC2+1 + PUSHJ P,LOOK +PADS1: POPJ P,0 + MOVE W2,1(W1) + CAIGE T,100 + CAIGE W2,60 + JRST,PADS3 + MOVEM T,TEM(I) + JUMPE W1,PAD1 + PUSHJ P,SPT + XCT "+,CRF +PADS2: HRRZ T,TEM(I) +PAD1: JRST,TOC ;EXIT + +PADS3: MOVE T,TEM(I) +PADS3A: TRNE F,NAF + CAIGE T,776000 + JRST TOC +PADS3B: MOVNM T,TEM(I) +PADS4: XCT "-,CRF + JRST,PADS2 + +INOUT: TDC T,[(,-1)400000] + TDCN T,[(,-1)400000] + JRST PADS3B + HLRZ R,T + CAILE R,(CONO 774,@) + JRST HLFW + AND T,[(700340)] + PUSHJ P,LOOK + JRST,.+2 + JRST,HLFW + PUSHJ P,TSPC + MOVE T,LWT(I) + AND T,[(77400)] +INOUT1: JUMPE T,PI4 ;USED BY "WORD" + PUSHJ P,LOOK ;LOOK FOR DEVICE NUMBER + JRST,PI3A + MOVE T,TEM(I) + LSH T,-30 + PUSHJ P,TOC + JRST,PI3A + +MASK: TLNE F,QF + JRST,MASK1 + MOVEI T,MSK + ;$NB ENTRY (WHERE N SPECIFIED, LOCATION NOT) +MASK2: MOVEI W,1 + MOVEM W,FRASE1 + JRST QUAN1 +MASK1: MOVEM T,MSK + JRST,RET + +EFFEC: TLO F,LTF + HRRZ T,T +AWORD: SKIPA W,INOUT1 ;JUMPE T, +NWORD: MOVSI W,(JUMPN T,) + HLLM W,SEAR2 + +SEARC: TLZN F,QF + JRST,ERR + SETCAM T,WRD + MOVE T,[EQV T,WRD] + TLNE F,LTF + MOVE T,[JRST SEAR2B] + MOVEM T,SEARMD + MOVSI T,-5 + SETCMM FRASE(T) ;PREVENT TYPEOUT + AOBJN T,.-1 + MOVE T,ULIMIT + TLNE F,SAF + TLO F,QF + PUSHJ P,SETUP1 + PUSHJ P,CRF +SEAR1: TRNN R,777760 + JRST SEAR1A + MOVE T,(R) +SEAR1B: +SEARMD: EQV T,WRD + AND T,MSK +SEAR2: JUMPE T,SEAR3 ;OR JUMPN T +SEAR2A: TRNN R,77 + JRST SEAR2D +SEAR2E: AOBJN R,SEAR1 + TLNE R,-1 + JRST SEAR1 +SEAR2C: SETCMM LWT(I) + JRST,DD1 +SEAR2D: PUSHJ P,LISTEN + JRST SEAR2E + JRST SEAR2C + +SEAR1A: PUSHJ P,FETCH + JRST SEAR2A + JRST SEAR1B +SEAR2B: PUSHJ P,EFFEC0 + JRST SEAR2A + EQV T,WRD + ANDI T,777777 + JRST SEAR2 + SEAR3: PUSHJ P,FETCH + JRST ERR + MOVEM T,LWT(I) + MOVEM R,TEM2 + MOVEM R,T + HRRZM R,LLOCO + PUSHJ P,PLOC + PUSHJ P,PAD + XCT "/,CRF ;SLASH + PUSHJ P,LCT + MOVE T,LWT(I) + PUSHJ P,CONSYM + PUSHJ P,CRF + SETCMM LWT(I) + SETCMM TEM(I) +SEAR4: MOVE R,TEM2 + JRST, SEAR2D + +EFFEC0: MOVEM R,TEM2 ;CALLED BY SEARCH AND $\ + MOVEI W,100 + MOVEM W,TEM(I) +EFFEC1: MOVE W,T + LDB R,[(220400)T] + JUMPE R,EFFEC2 + HRRZ T,AC0(R) + ADD T,W +EFFEC2: HRR R,T + TLNN W,20 ;INDIRECT BIT CHECK + JRST EFFEC3 + SOSE TEM(I) + PUSHJ P,FETCH + JRST EFFEC4 + JRST EFFEC1 +EFFEC3: AOS (P) +EFFEC4: MOVE R,TEM2 + POPJ P, + + +SETUP: TLO F,LTF ;ZERO +SETUP1: MOVEI T,1(T) + TLNN F,QF +SETUP2: HRRZ T,ESTU + HRRM T,ULIMIT + HRRZ R,DEFV + TLNN F,FAF + MOVEI R,0 + CAML R,ULIMIT + JRST ERR + MOVEM R,DEFV + MOVE W,R + SUB W,ULIMIT + HRLM W,R + POPJ P,0 + +ZERO: JUMPGE F,ERR + PUSHJ P,SETUP +ZERO1: TRNE R,777740 + JRST,ZERO2 + TRNN R,20 ;DONT Z 20-37 + CLEARM,AC0(R) + AOBJN R,ZERO1 + TLNE R,-1 + JRST ZERO1 + JRST,DD1A +ZERO2: HRRZ S,T + CAIL S,DDT + MOVEI S,DDT + CAILE S,(R) + JSP W,ZEROR + HRRZ R,R + CAIG R, PS + MOVEI R, PS + HRRZ S,T + CAMLE S, R + JSP W,ZEROR + JRST,DD1A + +ZEROR: HRL R,R + CLEARM,(R) + ADDI R, 1 + BLT R, -1(S) + JRST,(W) + FTOC: +TOC: HRRZ W1,ODF + CAIN W1,12 + JRST, TOC4 +TOCA: LSHC T,-43 + LSH W1,-1 ;W1=T+1 +TOC1: DIVI T,@ODF + HRLM W1,0(P) +TOC3: JUMPE T,TOC2 + PUSHJ P,TOCA +TOC2: HLRZ T,0(P) + ADDI T,"0 +CJTOUT: JRST,TOUT ;DOES POPJ TO TOC2 OR EXIT + +TOC4: MOVM W1,T + JUMPGE T,TOC5 + XCT "-,CRF +TOC5: MOVEI T,0 + PUSHJ P,TOC1 +TPER: MOVEI T,". + JRST TOUT + +SPT: MOVE T,CJTOUT + MOVEM T,SPTS(I) + MOVE T,0(W1) ;SYMBOL PRINT + MOVEM W1,DSSAV(I) + TLZ T,740000 +SPT1: IDIV T,[50*50*50*50*50] + PUSHJ P,SPT2 + MOVE T,W1 + IMULI T,50 + JUMPN T,SPT1 + POPJ P, + +SPT2: ADDI T,260-1 + CAILE T,271 + ADDI T,301-272 + CAILE T,332 + SUBI T,334-244 + CAIN T,243 + MOVEI T,256 + XCT SPTS(I) + POPJ P, +BRKRET: PUSHJ P,REMOVB +TTYRET: CONI DIS,T + DPB T,[600,,DRESET] + CONI LPT,T + DPB T,[300,,LPTRST] + SKIPE LPTFLG + CONO LPT,10 +TTYRT: MOVEI T,10 + MOVSM T,DISDON + CONI TTY,SAVTTY + CONO TTY,400000(T) + PUSHJ P,DISINI + XCT TTYRT +TTY1: MOVEI W2,40000 + CONSZ TTY,120 + SOJG W2,.-1 + CONI TTY,W2 + XOR W2,SAVTTY + ANDI W2,10 + XORM W2,SAVTTY + DATAI TTY,W2 + HRLM W2,SAVTTY + CONO TTY,3400(T) + CONO TTY,400000(T) + POPJ P, +TTYLEV: MOVS T,DISDON + CAIN T,@TTYRT + JRST .+3 +DRESET: CONO DIS,100 + DATAO DIS,[3000] + SKIPE T,LPTRST + CONO LPT,10(T) + MOVE T,SAVTTY + ANDI T,170017 + TRNN T,10 + TRO T,200 + JRST,TTY1 + +KILC: (,-NSYMS)LOW + + +WRD: 0 +WRD2: 0 +PRNC: 0 +FRASE: 0 +SYL: 0 +DEN: 0 +ZLWT: 0 +TEM2: 0 +LPTRST: 0 +LPTFLG: 0 +TTYFLG: -1 +ESTU: 0 +ESTUT: 0 +FSV: 0 +FRACT: 0 +FPWR: 0 +FTERM: 0 +FH: 0 +FL: 0 +SYM: 0 +DEFV: 0 +ULIMIT: 0 +LLOC: 112 ;CURRENT LOCATION +LLOCO: 0 +PLCR: 0 +LOCBF: BLOCK NLEVS + +DIS1: +ACSTG: BLOCK 10 +INST: 0 +LWT: 0 +TEM: 0 +TEM1: 0 +PRGM: 0 +DSSAV: SYM +OUTSW: 0 +SPTS: JRST TOUT +DISSW: MOVE T,@-1(P) +SATPP: .+1 +SATPT: 0 + +DIS2: +DISACS: BLOCK DIS2-DIS1-6 + SYM + DISAD + JRST TOUT + MOVSI T,(TRNA#CONSZ#CONSO) + .+1 + 0 + +STRTSW: -1 ;-1 => WILL SET STARTA FROM MACAC IF RH(MACAC) .NE. 0 + +HIGH: MEMSIZ-1 + +STARTA: 0 ;STARTING ADDRESS +SAVPI: 0 + 1177 +SAVTTY: 0 + +MSK: -1 ;INITIAL MASK FOR WORD SEARCHES +B0ADR: REPEAT 3,0 ;FOR $0B, MUST BE SPECIFIED TO BE USED (NOT SET BY LOC$B, NOT CLEARED BY $B) +B1ADR: 0 +B1SKP: 0 +B1CNT: 0 ;ONE MORE THEN # TIMES TO IGNORE ENCOUNTER OF THIS BPT + +REPEAT NBP*3-3, 0 + +BNADR=.-3 +AUTOPI: 0 ;1_N ON IF LOC$$B TYPED, ON MEANS PRECEED AFTER TYPING BPT MSG, UNTIL CHAR. TYPED AT TTY + +AC0: BLOCK 17 +AC17: 0 + +SCH: 0 +AR: 0 +ODF: 0 +SCHM: PIN ;THESE 3 LOCATIONS BLT'D INTO PRECEDING 3 LOCATIONS DURING SAVE +ARM: PADSO +ODFM: 10 +SARS: 0 ;NON-ZERO IF STUFF SAVED (USED BY SAVE) +FRASE1: +TEM3: 0 +INSW: 0 + +DISCNT: 0 +DISPN1: 0 + +SAVE: 0 + SKIPN SARS ;IF CRUD NOT ALREADY SAVED, + JRST SAV1 ;THEN GO SAVE IT, + AOS SAVE ;OTHERWISE AOS RETURN POINT, + JRST SAV5 ;AND SAVE MINIMALLY +SAV1: CONI PRS,SAVPI + CONO PRS, @SAVPI+1 + MOVEM 17,AC17 + HRRZI 17,AC0 + BLT 17,AC0+16 + MOVE T, SAVE + HLLM T, SAVPI +SAV5: SETOM,SARS ;INDICATE CRUD SAVED + MOVEI P,PS ;INITIALIZE PDL POINTER + MOVE F,[SCHM,,SCH] + BLT F,ODF + CLEARB F,I ;CLEAR FLAGS AND I + JRST,@SAVE + + + ;SEE LOW CODE FOR RESTORE + +TATP: TLZE F,QF + SKIPN T + JRST ERR + MOVEI W,36. + DPB T,[300600,,SATPP] + DPB T,[300600,,SATPP+DIS2-DIS1] + IDIV W,T + MOVEM W,SATPC + JRST RATP + +SATP: MOVEI W,44 + DPB W,[360600,,SATPP(I)] + MOVE W,SATPC + MOVEM T,SATPT(I) +SATPL: ILDB T,SATPP(I) + PUSHJ P,TOC + PUSHJ P,TSPC + SOJG W,SATPL + POPJ P, + +SATPC: 0 + +CTLX: LSH T,16. + HRRZ W1,T +CTLZ2: ADDI T,177777 +CTLY2: TLZN F,QF + JRST ERR + ADD W1,[40,,40] + BLT W1,(T) + POPJ P, + +CTLY: LSH T,16. + HRLZ W1,T + MOVEI T,177777 + JRST CTLY2 + +CTLZ: LSH T,16. + HRLZ W1,T + SKIPN W1 + JRST ERR + SETZM (T) + HRRI W1,1(T) + SUB W1,[40,,40] + JRST CTLZ2 + +BDISP: (301400+R)DISP + (141400+R)DISP + (1400+R)DISP + +DISP: .BYTE 12. +DEFINE ZD A,B,C + A-DDT + B-DDT + -DDT+C +TERMIN + +ZD ERR,ERR,L2 ; +ZD DS,ERR,L2 ;^C,, +ZD ERR,ERR,ERR ;,, +ZD TAB,LINEF,ERR ;TAB,LF, +ZD ERR,CARR,ERR ;FORMF,CR, +ZD ERR,ERR,ERR ;,, +ZD ERR,ERR,ERR ;,, +ZD ERR,L2,L2 ;,, +ZD CTLX,CTLY,CTLZ ;,, +ZD CONTROL,ERR,ERR +ZD ERR,ERR,SPACE +ZD SUPTYO,TEXO,ASSEM +ZD DOLLAR,PERC,R50PNT +ZD DIVD,LPRN,RPRN +ZD MULT,PLUS,ACCF +ZD MINUS,PERIOD,SLASH +ZD NUM,NUM,NUM +ZD NUM,NUM,NUM +ZD NUM,NUM,NUM +ZD NUM,TAG,DEFIN +ZD FIRARG,EQUAL,ULIM +ZD ASLASH,INDIRECT,ABSA ;/,@,A +ZD BPS,CON,SDEC ;B,C,D +ZD EFFEC,SFLOT,GO ;E,F,G +ZD HWRDS,PILOC,ERR ;H,I,J +ZD KILL,ERR,MASK ;K,L,M +ZD NWORD,SOCT,PROCEDE ;N,O,P +ZD QUAN,RELA,SYMBOL ;Q,R,S +ZD TATP,DECDMP,DISF ;T,U,V +ZD AWORD,XEC,ERR ;W,X,Y +ZD ZERO,OCON,ICON ;Z, +ZD OSYM,VARRW,PSYM + + .BYTE + +DECDMP: CONSZ TTY,20 + PUSHJ P,DISCFT + SETOM STRTSW ;RELEASE STARTING ADDRESS SWITCH + JRST MACDMP + +IFIX: SETZM STRTSW ;GRAB STARTING ADDRESS SWITCH, DON'T BOTHER LOOKING AT FORMER CONTENTS + SKIPLE T,JOBSYM ;IF JOBSYM POSITIVE, + JRST DDT ;THEN CONTROL SHOULDN'T HAVE COME TO HERE TO BEGIN WITH + MOVE R,(T) ;GET POINTER TO SYMS + JUMPN T,IFIX1 ;JUMP IF SYMS ADDED + MOVE R,KILC ;INITIAL SYMS POINTER + MOVEM R,DDT-2 ;SET UP SYM POINTER + MOVEI T,DDT-2 +IFIX1: HRRZM T,JOBSYM ;INDICATE LOCATION OF SYMS POINTER + HRRZM R,ESTU + HRRZM R,ESTUT + SUBI T, NSYMS+DDT-LOWCOD + HRRM T, KILC + MOVEM R,PRGM + CONI TTY,T + ANDI T,170000 + IORI T,10 + HRRM T,TTYRT ;CONO TO TTY + JRST DDT + +CONSTANTS + +DDTEND: +INFORM [HIGHEST USED]\.-1 + +END IFIX +  \ No newline at end of file