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 00000000..43a9c775 Binary files /dev/null and b/src/mlsys/decdsk.bin differ 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 00000000..d02dada4 Binary files /dev/null and b/src/mlsys/its.bin differ 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 00000000..db911fa1 Binary files /dev/null and b/src/mlsys/msalv.bin differ 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