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