From e52a5805323f76521c8e876bf48d3530142409b7 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Wed, 13 Jun 2018 10:16:59 +0200 Subject: [PATCH] STUFF - load PDP-11 through 10-11. --- build/misc.tcl | 4 + doc/programs.md | 1 + src/sysen2/stuff.92 | 695 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 700 insertions(+) create mode 100755 src/sysen2/stuff.92 diff --git a/build/misc.tcl b/build/misc.tcl index 395b7718..b0c70541 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -984,3 +984,7 @@ expect ":KILL" respond "*" ":cwd .\r" respond "*" "11boot\033\013" expect ":KILL" + +# STUFF +respond "*" ":midas sys1;ts stuff_sysen2;stuff\r" +expect ":KILL" diff --git a/doc/programs.md b/doc/programs.md index 6c5740fe..d010a2b1 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -189,6 +189,7 @@ - STINKR, new linker (binary only). - STTY, set terminal parameters. - STONE, the old African game of stones. +- STUFF, load code into PDP-11 through 10-11 interface. - STY, pseudo-terminal for multiple sessions. - STYLOG, convert PTY output file into ascii file. - SUPDUP, Supdup client. diff --git a/src/sysen2/stuff.92 b/src/sysen2/stuff.92 new file mode 100755 index 00000000..ea67bcf6 --- /dev/null +++ b/src/sysen2/stuff.92 @@ -0,0 +1,695 @@ + +IF1, TITLE STUFF A PDP-11 +IF2,[PRINTX /UP YOUR /] + DEFINE PACK A,B,C,D,E + A_29.+B_22.+C_15.+D_8.+E_1 + TERMIN + + FLAGS=0 + PNTR=1 + A=2 + B=3 + C=4 + D=5 + E=6 + F=7 + S=10 + SPNTR=10 + BCOUNT=11 + CKSM=12 + CMPTR=13 + 11WORD=14 + ST11AD=15 + CHK=16 + P=17 + + TF1==1 + ;PDP11 INSTRUCTIONS + BR.==777 ;BR . + BR.M2==776 ;BR .-2 + WAIT==1 + RESET==5 + JMP==137 ;JMP @#... + CLR==5037 ;CLR @(PC)+ + CLRPC==5007 ;CLR PC + +LKS==177546 +LKBRKV==100 +TPS==177564 +TPB==177566 +TPBRKV==64 + ;5/29/73 PROGRAMMING THE PDP-10 TO PDP-11 INTERFACE + +;THE INTERFACE LETS THE PDP-10 PROGRAMMER DIRECTLY ACCESS THE MEMORIES +;OF UP TO EIGHT PDP-11'S. PDP-10 PAGES ARE MAPPED INTO SEGMENTS OF +;VARIABLE SIZE IN THE PDP-11'S MEMORY. THE PDP-10 PAGE MAP IS ALSO +;DIRECTLY ADDRESSABLE IN MEMORY (IT CURRENTLY LIVES IN LOCATIONS +;776000-776777)**. THERE IS ONE ENTRY IN THE MAP FOR EACH PDP-10 PAGE. +;** SEE ALSO BELOW + +;PAGE TABLE ENTRY: +; 4.9 VALID +; 4.8 WRITE ENABLE +; 4.3-4.7 (5 BITS) NOT USED (0) +; 3.9-4.2 (3 BITS) PDP-11 NUMBER +; 2.2-3.8 (16 BITS) RELOCATION +; ORIGIN OF SEGMENT OF IN PDP-11 ADDRESS SPACE +; PDP-11 ADDRESS=4*RELOCATION +; 1.1-2.1 (10 BITS) PROTECTION (PDP-11 PROTECTION=4*PROTECTION +; IF PROTECTION=0 THEN ONLY ONE 16 BIT WORD IS ACCESSIBLE) + +;WRITE REFERENCE FORMAT +; 3.3-4.9 (16 BITS) WORD 0, LOW ORDER WORD +; 1.5-3.2 (16 BITS) WORD 1, HIGH ORDER WORD +; 1.4 DON'T WRITE WORD 0 +; 1.3 DON'T WRITE WORD 1 +; 1.1-1.2 (2 BITS) NOT USED + +;READ REFERENCE FORMAT +; 3.3-4.9 (16 BITS) WORD 0, LOW ORDER WORD +; 1.5-3.2 (16 BITS) WORD 1, HIGH ORDER WORD +; 1.1-1.4 (4 BITS) 0 + +;NOTE -- SPLIT CYCLES WILL DO THE RIGHT THING; HENCE, ILDB AND IDPB WORK. + +;CAUTION -- WHEN USING BYTE INSTRUCTIONS, A 16 BIT BYTE SIZE IS +;RECCOMMENDED. SUCCESSIVE INCREMENTS OF BYTE POINTERS WITH AN 8 BIT BYTE +;SIZE DO NOT ADDRESS CONSECUTIVE BYTES IN THE PDP-11! + +;ITS SYSTEM CALL TO PUT 11 MAP ENTRY IN YOUR 10 MAP + +; .CALL [SETZ +; SIXBIT /T11MP/ +; 10PGNO ;PTR TO 10 PG NO +; SETZ PGENT] ;PTR TO ENTRY (FORMAT ABOVE) +;10PGNO: 3 +;PGENT: 3_34.+2000_10.+1777 +; FOR ABOVE 10 ADDRESSES 6000-7777 ARE MAPPED INTO +; 11 ADDRESSES 10000-17776. BOTH READ AND WRITE ARE ENABLED. + +RCH: MOVE PNTR,[10700,,BUFF-1] ;INITL BYTE PNTR TO BUFF + MOVEM PNTR,CMPTR +GCHR: PUSHJ P,TYI ;GET CHAR + CAIN A,177 ;RUBOUT? + JRST RUBOT + IDPB A,PNTR + CAIE A,15 ;CR? + JRST GCHR + MOVEI A,0 ;IT WAS CR + IDPB A,PNTR ;MARK END OF STRNG +CPOPJ: POPJ P, + +RUBOT: CAMN PNTR,[10700,,BUFF-1] ;RUBOUT AT BEG OF BUFFER? + JRST BRUB + LDB A,PNTR ;GET LAST CHAR TYPED + PUSHJ P,TYO ;ECHO IT + ADD PNTR,[70000,,] ;DECREMENT POINTER + JUMPGE PNTR,GCHR ;JUMP IF VALID + SUB PNTR,[430000,,1] ;WAS 440700,,SOMETHING, BACK IT UP + JRST GCHR + +BRUB: PUSHJ P,CRR ;TYPE CR LF + JRST GCHR +TYI: .IOT TTI,A + CAIL A,"a + CAILE A,"z + CAIA + SUBI A,40 + JUMPE A,TYI + CAIE A,15 + POPJ P, + PUSHJ P,CRR ;ECHO CR + MOVEI A,15 + POPJ P, +TYO: .IOT TTO,A + POPJ P, + +SCRS: SKIPE B ;IF B NOT = 0, TYPE MESG IT POINTS TO + JRST TYPE +CRS: MOVEI A,"* + PUSHJ P,TYO +CRR: MOVEI A,15 + PUSHJ P,TYO + MOVEI A,12 + JRST TYO +TYPE: HRLI B,350700 ;TYPE ASCIZ STRING WHOSE ADDR IS IN B + LDB A,B + PUSHJ P,TYO + ILDB A,B + JUMPN A,.-2 + POPJ P, + +BUFF: BLOCK 10. + TYPENL: TROA FLAGS,TF1 ;SAME AS TYPEN EXCEPT W/ LEADING ZEROS + +TYPEN: ;TYPE NUMBER IN B IN OCTAL W/O LEADING ZEROS + TRZ FLAGS,TF1 ;CLEAR TYPE ZERO FLAG + PUSH P,A + PUSH P,B + SETZM A + LSHC A,3 ;SHIFT 1ST CHAR FROM B TO A + ADDI B,7 ;PUT END MARKER IN B +TYPEN2: TRNN FLAGS,TF1 ;SEEN ANY NON-ZERO DIGITS YET? + JUMPE A,TYPEN1 ;NO, IS THIS ONE? +TYPEN3: ADDI A,60 + TRO FLAGS,TF1 + PUSHJ P,TYO + SETZM A +TYPEN1: LSHC A,3 + JUMPN B,TYPEN2 + SETZM A + TRNN FLAGS,TF1 ;TYPE AT LEAST 1 ZERO + JRST TYPEN3 + POP P,B + POP P,A + POPJ P, + +CRLF: PUSH P,A + MOVEI A,15 + PUSHJ P,TYO + MOVEI A,12 + PUSHJ P,TYO + POP P,A + POPJ P, + +MAX11S=10 + +DESC: ;DESCRIBES PDP11'S CONNECTED TO 10/11 INTERFACE + ;1ST DIGIT IS # 2K WORD PAGES OF 11 CORE + [ 6 + ASCIZ \ TV 11/10 \ + -1] ;HAS TTY AND LINE CLOCK. + [ 14 + ASCIZ \ XGP 11/20 \ + -1] + [ 4 + ASCIZ \ LISP MACHINE \ + 1] ;CLOCK BUT NO TTY + [ 0 + ASCIZ \ CHESS MACHINE \ + 0] + [ 16 + ASCIZ \ LOGO 11/45 \ + -1] + [ 16 + ASCIZ \ MICRO AUTOMATION 11/45 \ + -1] + [ 14 + ASCIZ \ VISION 11/40 \ + -1 ] + [ 4 + ASCIZ \ CHAOS-11 \ + -1 ] + +11NTAB: ASCII /TVî/ + ASCII /XGPî/ + ASCII /LISPî/ + ASCII /CHESS/ + ASCII /LOGOî/ +; ASCII /ROBOT/ + -1 +; ASCII /VISIO/ + -1 + ASCII /CHAOS/ +11NTLN==.-11NTAB + +11FTAB: [SIXBIT/./ ? SIXBIT/TV/ ? SIXBIT/BIN/] + [SIXBIT/SYSBIN/ ? SIXBIT/VXGP/ ? SIXBIT/BIN/] + [SIXBIT/CONS/ ? SIXBIT/CCONS/ ? SIXBIT/BIN/] + 0 + [SIXBIT/RUG/ ? SIXBIT/AR/ ? SIXBIT /BIN/] + 0 + 0 + [SIXBIT/./ ? SIXBIT/IOELEV/ ? SIXBIT/BIN/] +IFN .-11FTAB-11NTLN,.ERR + + TTO==1 + TTI==2 + DSK==3 + ERRC==4 + + +START: MOVE P,[-100,,PLD] + .OPEN TTO,STTO + .LOSE 1000 + .OPEN TTI,STTI + .LOSE 1000 + .SUSET [.ROPTIO,,A] + TLNN A,OPTCMD + JRST BCMD + SETZM A + SETOM B + .BREAK 12,[5,,A] ;IF HAVE JCL, READ 1ST WORD OF IT INTO A. + JUMPE A,BCMD ;WAS THERE ANY JCL? + TRZ A,1 ;GODDAMN DDT LIKES TO SET LOW BIT + MOVE B,[440700,,A] + MOVEI D,5 +UPCASE: ILDB C,B ;IF WE HAVE JCL, CONVERT IT TO UPPER CASE + CAIL C,140 + SUBI C,40 + DPB C,B + SOJG D,UPCASE + MOVSI B,-11NTLN ;IF WE HAVE JCL, COMPARE AGAINST ASCII/TV^M/, ETC. + CAME A,11NTAB(B) + AOBJN B,.-1 + JUMPGE B,BADJCL ;NOT NAME OF AN 11 => LOSE. + SETOM JCLP + MOVE A,11FTAB(B) ;ELSE B HAS NUMBER OF 11. GET THE FILENAMES + JUMPE A,BAD11 + MOVE F,(A) ;1ST WORD IS SNAME + MOVEM F,SNR + .SUSET [.SSNAM,,F] + HRLI A,1(A) ;THEN COME FN1 AND FN2 + HRRI A,ADR+1 ;TO USE FOR THAT 11. + BLT A,ADR+2 + .OPEN DSK,ADR + .LOSE 1000 + MOVE A,DESC(B) + MOVE A,(A) + MOVEM A,NOPG + HRRZ F,B + JRST 11INIT + +BADJCL: MOVEI B,[ASCIZ /JCL is not the name of a PDP11. +/] + PUSHJ P,TYPE + JRST OK + +BAD11: MOVEI B,[ASCIZ /No default file for specified PDP11. +/] + PUSHJ P,TYPE + JRST OK + +STTO: 1,,(SIXBIT /TTY/) +STTI: (SIXBIT /TTY/) + +PLD: BLOCK 100 + +JCLP: 0 ;-1 => WE GOT JCL +DEBUG: 0 ;-1 => DEBUGGING. + BCMD: MOVEI B,[ASCIZ /Load from: /] + PUSHJ P,SCRS + PUSHJ P,RCH ;GET TYPED IN COMMANND + MOVE PNTR,IP + SETZB F,S +COMND: ILDB A,CMPTR + CAIN A,^Q + JRST CMDQ + CAIN A,15 + JRST CMDE + CAIN A,^G + JRST BCMD + CAIN A,": + JRST CMDCOL + CAIN A,"; + JRST CMDSC + CAIG A,40 + JRST CMDS +SXBT: SUBI A,40 + TLNE PNTR,770000 ;STOP AFTER POSITIN=0 + IDPB A,PNTR + JRST COMND +CMDS: MOVE F,S +CMD1: MOVE PNTR,IP + MOVEI S,0 + JRST COMND +CMDSC: MOVEM S,SNR + JRST CMD1 +CMDCOL: JRST CMD1 ;FOR NOW IGNORE IT +CMDE: .SUSET [.SSNAM,,SNR] + JUMPE F,FZ + JUMPN S,SNZ +FZ: LSHC F,36. ;MOVE S TO F AND ZERO S +SZ: JUMPE F,BCMD ;TAKE IN NEW NAME + MOVE S,BIN +SNZ: MOVEM F,ADR+1 + MOVEM S,ADR+2 + .OPEN DSK,ADR + .LOSE 1000 + JRST RDCN +SNR: 0 +ADR: 2,,(SIXBIT /DSK/) + 0 + 0 +BIN: SIXBIT /BIN / + CMDQ: ILDB A,CMPTR + JRST SXBT + +IP: 440600,,S + ;NOW GET COMPUTER NUMBER OF 11 TO BE STUFFED + +RDCN: MOVEI B,[ASCIZ /To PDP11 # :/] + PUSHJ P,SCRS + PUSHJ P,RCH + SETZB F,S +RDNXT: ILDB A,CMPTR + CAIN A,^G ;START OVER + JRST RDCN + CAIN A,15 ;END OF LINE + JRST DONEN + CAIN A,". + JRST PRD ;INPUT IS DECIMAL + CAIN A,40 ;DONE IF B > 0 + JRST SPACE + SUBI A,60 ;SHOULD BE DIGIT + SKIPL A + CAIL A,10. + JRST NOTD ;NOT A DIGIT + MULI S,10. ;DECIMAL + ADD S,A + ASH F,3 ;OCTAL + ADD F,A + AOJA B,RDNXT +PRD: MOVE S,F ;USE DECIMAL VERSION + JRST DONEN +NOTD: ;NOT A DIGIT - TREAT AS SPACE +SPACE: JUMPE B,RDNXT ;IGNORE LEADING SPACES AND OTHER NON-DIGITS +DONEN: JUMPL F,RDCN + CAILE F,MAX11S + JRST RDCN + SKIPN DESC(F) + JRST [ MOVEI B,[ASCIZ /Bad PDP11 number. +/] + PUSHJ P,TYPE + JRST OK] + MOVE B,F + PUSHJ P,TYPEN + MOVEI B,[ASCIZ / selected. /] + PUSHJ P,TYPE + MOVE B,DESC(F) + MOVE A,(B) ;GET # OF PAGES IN THIS GUY + MOVEM A,NOPG + AOS B + PUSHJ P,TYPE + MOVEI B,[ASCIZ / OK?/] + PUSHJ P,TYPE + PUSHJ P,TYI + PUSHJ P,CRLF + CAIE A,"Y + JRST RDCN + JRST 11INIT + 11INIT: MOVEM F,11NUM + MOVE E,F + LSH E,26. + MOVE A,NOPG ;GET NO. OF 2K 11 PGS + SOS A + MOVEI B,11LO_-10. ;WHERE 11 MEM STARTS IN 10 + ADD B,A ;POINT TO LAST PAGE +11IN1: MOVE C,11MAP(A) + ADD C,E ;ADD IN 11# + .CALL [SETZ + SIXBIT /T11MP/ + B + SETZ C] + .VALUE + SOS B + SOJGE A,11IN1 + MOVE C,11MAP+62. ;FIRST I/O PAGE + ADD C,E + .CALL [SETZ + SIXBIT /T11MP/ + [11LO_-10.+14.] + SETZ C] + .VALUE + MOVE C,11MAP+63. + ADD C,E + .CALL [SETZ + SIXBIT /T11MP/ + [11LO_-10.+15.] + SETZ C] + .VALUE +;ABOVE MAPS I/O REGS INTO MAP +11IN2: MOVE A,[JMP_20.+10] ;MAKE 0 BE A 1-INSN LOOP. + MOVEM A,11LO + MOVE A,[JMP_20.] ;STORE 2 BEFORE 0 IN CASE 11 IS DOING BR . IN 0 + MOVEM A,11LO + MOVE A,11LO + CAME A,[JMP_20.] ;IS THE PDP11 RUNNING? + JRST MEMLUZ + SETZM 11LO+1 ;ZERO IN 4,6 IN CASE 11 GETS A NXM. + SETZM 11LO+2 ;ALSO IN RESERVED INSN TRAP VECTOR + SETZM 11LO+3 ;AND BPT TRAP VECTOR. + SETZM 11LO+ ;POINT TTYO BREAK VECTOR TO 0 + MOVE A,[JMP_20.] ;JMP @#0 + MOVEM A,11LO+<404/4> ;WRITE A CLOCK INTERRUPT ROUTINE: + MOVE A,[CLR_20.+LKS_4] ;CLR @#LKS ? JMP @#0 + MOVEM A,11LO+<400/4> + MOVE A,[400_20.] ;SET UP BREAK VECTOR TO POINT AT IT. + MOVEM A,11LO+ ;THUS NEXT CLOCK INT WILL TURN OFF CLOCK INTS. + MOVE C,11NUM + MOVE C,DESC(C) ;GET DESC VECTOR ADDR FOR THIS 11 + MOVE C,3(C) ;TO SEE IF WE KNOW IT HAS A CLOCK. + MOVE A,[300_20.+4] + TRNE C,1 ;IF SO, CAUSE 1 CLOCK INT IN CASE WAS IN A WAIT INSN. + MOVEM A,11LO+ + MOVEI B,10 + .SLEEP B, ;WAIT FOR INTS TO HAPPEN AND DO RIGHT THINGS. + MOVE B,NOPG + ASH B,10. + SUBI B,4 + MOVE A,[CLRPC_20.+CLRPC_4] +11IN4: MOVEM A,11LO+3(B) ;FILL ALL OF MEMORY BUT 1ST 8 WORDS WITH CLR PC +REPEAT 2,JFCL + CAME A,11LO+3(B) + JRST MEMLUZ ;SO WHATEVER 11 WAS DOING IT WILL FALL INTO LOOP IN 0 + SOJG B,11IN4 + MOVE A,[RESET_20.+CLR_4] + MOVEM A,11LO+<400/4> ;400/ RESET + MOVE A,[400_20.+BR._4] ;402/ CLR 400 (TO DISTINGUISH RUNNING 11 FROM WAITING) + MOVEM A,11LO+<404/4> ;404/ BR . + MOVE A,[400_4+10] ;0/ JMP 400 SO RESET GETS DONE AND 0 IS SAFE TO MUNG. + MOVEM A,11LO + MOVEI A,10 ;GIVE IT TIME TO WORK. + .SLEEP A, + MOVE A,[JMP_20.] ;MAKE A LOOP IN 0,2 SUCH THAT WE CAN CLOBBR 2 WITH START + MOVEM A,11LO ;ADDRESS AFTER LOADING THE FILE. + MOVE A,11LO+<400/4> + LSH A,-20. ;DID THE CLR 400 GET DONE? IF 400 NONZERO, + MOVEM A,WAITFL ;THE 11 MUST BE WAITING (SINCE NOT RUNNING, NOT HALTED). + MOVE A,[CLRPC_20.+CLRPC_4] + MOVEM A,11LO+<404/4> ;406/ CLR PC TO JUMP TO 0 SO WE CAN ZERO 400, ETC. + SETZM 11LO+1 ;POINT NXM VECTOR TO 0 + MOVE B,NOPG ;ZERO ALL REST OF MEMORY. + ASH B,10. + SUBI B,1 +11IN5: SETZM 11LO(B) + JFCL + SOJG B,11IN5 +11IN3: SKIPN 11LO ;DID 11 HALT DURING ALL THIS? + JRST MEMLUZ + SETZB PNTR,ST11AD + SETOM 11WORD + JRST STLOAD +11MAP: + REPEAT 64.,3_34.+1777+<.RPCNT*2000>_10. +NOPG: 0 ;NUMBER OF 2K 11-PAGES +11NUM: 0 ;11 BEING STUFFED + +;PDP-11 MEMORY NOT WORKING. SEE IF MACHINE IS HALTED, 10-11 IS BROKEN, +;OR MEMORY IS BROKEN. +MEMLUZ: SETZM B ;B ANY BITS THAT WORK ANYWHERE + MOVN C,NOPG + LSH C,10.+18. +MEMLZ1: IOR B,11LO(C) + AOBJN C,MEMLZ1 + JUMPE B,11HALT ;IF ALL LOCATIONS 0, PDP11 IS JUST HALTED +;MAYBE SOME MEMORY LOCATIONS DON'T WORK, AND SOME DO + MOVEI B,[ASCIZ/PDP11 memory seems to have problems. +/] + PUSHJ P,TYPE + MOVN C,NOPG + LSH C,10.+18. + AOBJN C,.+1 ;DON'T CLOBBER LOCATION 0, PDP11 WILL HALT +MEMLZ3: SETZM 11LO(C) +REPEAT 4,JFCL + SKIPE 11LO(C) + JRST MEMLZ4 + MOVNI A,20 + MOVEM A,11LO(C) +REPEAT 4,JFCL + CAME A,11LO(C) + JRST MEMLZ4 + AOBJN C,MEMLZ3 + JRST MEMLZ7 + +MEMLZ4: MOVEI B,[ASCIZ/Locations /] + PUSHJ P,TYPE + HRRZ B,C + LSH B,2 + PUSHJ P,TYPEN +MEMLZ5: SETZM 11LO(C) +REPEAT 4,JFCL + MOVE 11WORD,11LO(C) + MOVNI A,20 + MOVEM A,11LO(C) +REPEAT 4,JFCL + CAMN A,11LO(C) + SKIPE 11WORD + AOBJN C,MEMLZ5 +MEMLZ6: MOVEI B,[ASCIZ/ through /] + PUSHJ P,TYPE + MOVEI B,-1(C) + LSH B,2 + PUSHJ P,TYPEN + MOVEI B,[ASCIZ/ do not work. +/] + PUSHJ P,TYPE + JUMPL C,MEMLZ3 +MEMLZ7: MOVEI B,[ASCIZ/This could be the 10-11 interface or the PDP11. Try resetting +both the PDP11 and its 11-10 interface. Type a character to try again./] + PUSHJ P,TYPE + PUSHJ P,TYI + JRST 11IN2 + +11HALT: MOVEI B,[ASCIZ /PDP11 not running. Put 777 (BR .) in 0, start at 0, +then type a character to retry stuffing. If that doesn't work, try resetting +PDP11 and its 11-10 interface. +/] + PUSHJ P,TYPE + PUSHJ P,TYI + JRST 11IN2 + +STLD4: TRNE CHK,377 + .VALUE +SUMCHK: JFCL +STLOAD: SETZM CHK +STLD2: PUSHJ P,GETDSK + JUMPL A,EOFDSK + JUMPE A,STLD2 ;IGNORE ZERO WORDS; THEY DON'T START BLOCKS. + CAIE A,1 ;LOOKING FOR START OF BLOCK + JRST EOFDSK ;FOUND ANYTHING BUT A 1 => ERROR. + PUSHJ P,GETDSK ;2ND HALF OF BEGIN-BLOCK-FLAG + MOVEI BCOUNT,20 ;TO FAKE OUT GETWRD + PUSHJ P,GETWRD ;GET BYTE COUNT FOR BLOCK + SUBI B,3 + MOVEM B,BCOUNT + PUSHJ P,GETWRD ;GET ADDRESS FOR BLOCK + MOVEM B,ST11AD + SKIPL BCOUNT + CAIG BCOUNT,1 ;JUMP BLOCK + JRST STUFED + MOVEI A,(B) + ADD A,BCOUNT ;WHAT IS 1ST ADDRESS THIS BLOCK WON'T REACH TO? + LSH A,-12. ;WHAT PAGE IS 1ST PAGE WE WON'T STORE IN? + CAMLE A,NOPG ;DETECT TRYING TO WRITE IN NON-EX PDP11 MEMORY. + JRST 11MPV +STLOP1: CAIGE B,4 + JRST LOWLOD +STLOOP: PUSHJ P,GETDSK + JUMPL A,EOFDSK + SOJLE BCOUNT,STLD4 + JSP B,STBYTE + AOJA ST11AD,STLOOP +STUFED: TRNE ST11AD,1 + JRST NOSTAR + LSH ST11AD,4 + TRO ST11AD,10 ;DONT STORE WORD 0 + MOVEM ST11AD,11LO ;STORE START ADDR IN 2 + SKIPE JCLP + JRST OK + PUSHJ P,CRLF + MOVEI B,[ASCIZ /File loaded and started at /] + SKIPE WAITFL ;IF PDP11 WAS IN A WAIT INSN DURING STUFFING, IT HASN'T STARTED. + MOVEI B,[ASCIZ /File loaded, but PDP11 is in a WAIT instruction. +Start at /] + PUSHJ P,TYPE + LSH ST11AD,-4 + MOVE B,ST11AD + PUSHJ P,TYPEN + PUSHJ P,CRLF + JRST OK + +WAITFL: 0 ;-1 IF WE DETECTED THAT PDP11 IS WAITING AND CAN'T BE STARTED. + +NOSTAR: MOVEI B,[ASCIZ /File loaded; no start address. +/] + SKIPN JCLP +LOSE: PUSHJ P,TYPE +OK: SKIPE DEBUG + .VALUE + .LOGOUT + .BREAK 16,160000 + +11MPV: SKIPA B,[[ASCIZ /File needs more core than this PDP11 has. +/]] +EOFDSK: MOVEI B,[ASCIZ /File is not in PDP11 absolute loader format. +/] + JRST LOSE + +LOWLOD: MOVEI B,[ASCIZ /File attempts to load into word 0 or 2. +/] + JRST LOSE + ;GET NEXT WORD FROM DISK INTO A. -1 == EOF + +;PNTR HAS MINUS # LEFT SO ADRS(PNTR) GIVES NEXT WORD +;WHEN IT EQUALS 0, GET NEW BLOCK. IF RETURN WITH NEG +;POINTER, WRITE NEG 1 AS EOF CHAR + +GETDSK: JUMPE PNTR,RELOD ;NEED NEW BLOCK + MOVE A,ADRS(PNTR) + ADD CHK,A + AOJA PNTR,CPOPJ ;ADD ONE AND RET URN +RELOD: MOVE PNTR,DBUFP + .IOT DSK,PNTR + JUMPL PNTR,ENFIL +NPNTR: HLRE PNTR,DBUFP ;GET MIN WRD COUNT IN PNTR + JRST GETDSK +ENFIL: HRRZS PNTR ;ZERO LEFT HALF TO GET NEXT ADRESS + SETOM (PNTR) ;WRITE EOF CHAR + JRST NPNTR + +DBUFP: -50,,BUFR +BUFR: BLOCK 50 + ADRS=. + + ; GET NEXT TWO 8-BIT BYTES AND COMBINE INTO + ;16 BITS IN RT END OF BOTH A AND B + +GETWRD: PUSHJ P,GETDSK + ANDI A,377 + LSHC A,-36. ;MOVE A TO B AND ZERO A + SOSLE BCOUNT ;IF CHECKSUM DON'T GET EXTRA BLOCK YET + PUSHJ P,GETDSK + SOS BCOUNT + AOSE A ;WAS IT A NEG 1? + SOS A ;IF NOT RESTORE, ELSE SEND ZERO + LSH A,8. + ADDB A,B + POPJ P, +ST11WD: ;STORE WORD IN B IN 11 AT CU11AD. + MOVE C,CU11AD + LSHC C,-2 + CAME C,ST11AD + JRST [MOVEM 11WORD,11LO(ST11AD) + SETOM 11WORD + JRST .+1] + MOVEM C,ST11AD + JUMPL D,ST11W1 + DPB B,[242000,,11WORD] + TRZ 11WORD,10 + JRST ST11W2 +ST11W1: DPB B,[042000,,11WORD] + TRZ 11WORD,4 +ST11W2: AOS CU11AD + AOS CU11AD + POPJ P, + +CU11AD: 0 ;WHERE THE STUFER WANTS WORDS PUT + ;STORE BYTE IN A IN 11 AT ST11AD +STBYTE: MOVEI D,0 + MOVE C,ST11AD + CIRC C,-2 + DPB A,DPBT(D) + JRST (B) +DPBT: 241000,,11LO(C) + 041000,,11LO(C) + 341000,,11LO(C) + 141000,,11LO(C) + CONSTANTS +PATCH: BLOCK 200 + LOC <.+1777>&<-2000> + 11LO=. +IF2,[PRINTX /NOSE +/] + END START +