10 REM > MkSrcPDP - Make a PDP-11 source file
   20 A%=0:X%=1:os%=((USR&FFF4)AND&FF00)DIV256
   30 DIMctrl% 79,name% 127:X%=ctrl%:Y%=X%DIV256:cpu%=0
   40 eol$=CHR$(10-3*(os%<6)):IFos%AND32:eol$=CHR$13+CHR$10
   50 ONERRORREPORT:PROCClose_All:PRINT:END
   60 INPUTLINE"Input object file:       "in$
   70 IFFNfile(in$,5)<>1:PRINT"File '"in$"' not found":END
   80 len%=X%!10:IFHIMEM-TOP-2000<len%:PRINT"File '"in$"' too long":END
   90 load%=X%!2:exec%=X%!6:DIMmem% len%:OSCLI"LOAD """+in$+""" "+STR$~mem%
  100 INPUTLINE"Output source file:      "out$:out%=0:IFout$<>"":out%=OPENOUT(out$)
  110 A%=load%AND&FFFFFF00
  120 IFA%=&FFF70000:load%=&0000:exec%=&0000
  130 IFA%=&FFFBBC00:load%=&8000:exec%=&8000:IFmem%!0=0:IFmem%!4=0:load%=&C000:exec%=&C000
  140 IFA%=&FFFFF800:load%=&8000:exec%=&8000
  150 IFA%=&FFFFFA00:load%=&0000:exec%=&0000
  160 IFA%=&FFFFFC00:load%=&0000:exec%=&0000
  170 PRINT"Disassembly address:     (&";~load%;:INPUT") &"A$:IFA$<>"":load%=EVAL("&"+A$):exec%=load%
  180 REPEAT:X%!0=0:A$=FNDis_Name(cpu%):IFA$="":INPUT"CPU number:"SPC11;""cpu%
  190 UNTILA$<>"":dat%=X%?3AND12:wth%=(X%?3AND3)*2+4:mask%=EVAL("&"+STRING$(wth%,"F"))
  200 IFdat%=0:dat%=wth%+12ELSEIFdat%=12:dat%=21ELSEdat%=9
  210 INPUT"(B)asic or (T)ext output?        "A$:text%=(LEFT$(A$,1)="T"ORLEFT$(A$,1)="t")
  220 INPUT"Output byte dump in comments?    "A$:cmmt%=(LEFT$(A$,1)="Y"ORLEFT$(A$,1)="y")
  230 INPUT"Output byte dump in disassembly? "A$:dump%=(LEFT$(A$,1)="Y"ORLEFT$(A$,1)="y")
  240 cmmt%=cmmt%ORdump%
  250 FORB%=0TO1:addr%=load%:lbmax%=0
  260   IFB%:PRINT"Creating labels";STRING$(7+wth%,".");ELSEPRINT"Scanning for labels";STRING$(3+wth%,".");
  270   REPEAT:PRINTSTRING$(wth%,CHR$8);FNh0(addr%,wth%);:L$=FNline:A%=INSTR(L$,"&")
  280     IFA%:IFMID$(L$,A%+1,1)>="0":L%=EVALMID$(L$,A%):IFL%>&FF:IFL%>=(load%ANDmask%)ANDL%<(load%ANDmask%)+len%:lbmax%=lbmax%+4:IFB%:!lb%=L%:lb%=lb%+4
  290   addr%=addr%+num%:UNTILaddr%>load%+len%:IFB%=0:DIMlabel% lbmax%:lb%=label%
  300 PRINT:NEXTB%
  310 PRINT"Outputting source.....";FNh0(load%,wth%);
  320 PROCout("REM",CHR$&F4+" > "+out$)
  330 PROCout("REM",CHR$&F4+" Source for "+in$)
  340 PROCout(""," ")
  350 PROCout("","OS_CLI=&FFF7:OSBYTE=&FFF4:OSWORD=&FFF1:OSWRCH=&FFEE")
  360 PROCout("","OSWRCR=&FFEC:OSNEWL=&FFE7:OSASCI=&FFE3:OSRDCH=&FFE0")
  370 PROCout("","OSFILE=&FFDD:OSARGS=&FFDA:OSBGET=&FFD7:OSBPUT=&FFD4")
  380 PROCout("","OSGBPB=&FFD1:OSFIND=&FFCE")
  390 PROCout(""," ")
  400 PROCout("","load%=&"+STR$~load%)
  410 PROCout("DIM",CHR$&DE+" mcode% &"+STR$~(len%+20))
  420 IFtext%:PROCout("","FOR P=0 TO 1")ELSEPROCout("",CHR$&E3+" P=0 "+CHR$&B8+" 1")
  430 PROCout("","P%=load%:O%=mcode%")
  440 PROCout("","[OPT P*3+4")
  450 addr%=load%:REPEAT:PRINTSTRING$(wth%,CHR$8);FNh0(addr%,wth%);:L$=FNline:IFaddr%=exec%:PROCout("",".exec%")
  460   lb%=label%-4:REPEATlb%=lb%+4:UNTILlb%>label%+lbmax%OR!lb%=(addr%ANDmask%):IF!lb%=(addr%ANDmask%):PROCout("",".L"+FNh0(addr%ANDmask%,wth%))
  470   A$="":A%=INSTR(L$,"&"):IFA%:IFMID$(L$,A%+1,1)>="0":L%=EVALMID$(L$,A%):IFL%>=(load%ANDmask%)ANDL%<(load%ANDmask%)+len%:L$=LEFT$(L$,A%-1)+"L"+MID$(L$,A%+1)
  480   IFcmmt%:A$=FNh0(addr%,wth%):B$="":FORA%=0TOnum%-1:B%=?(addr%-load%+mem%+A%):A$=A$+" "+FNh0(B%,2):B$=B$+FNch(B%):NEXT:A$=A$+STRING$((dat%-LENA$)AND(LENA$<dat%)," ")+" "+B$
  490   IFdump%:IFLENA$<dat%+5:A$=A$+STRING$(dat%+5-LENA$," ")
  500   IFcmmt%:IFdump%=0:PROCout("",L$+STRING$((20-LENL$)AND(LENL$<20)," ")+" :\ "+A$)
  510   IFcmmt%:IFdump%:PROCout("",A$+" : "+L$)
  520   IFcmmt%=0:PROCout("",L$)
  530   IF(flg%AND64):PROCout(""," ")
  540 addr%=addr%+num%:UNTILaddr%>load%+len%
  550 IFtext%:PROCout("","]NEXT")ELSEPROCout("","]"+CHR$&ED)
  560 PROCout("PRINT",CHR$&F1+" ""*SAVE <file> "";~mcode%;"" "";~O%;"" "";~exec%;"" "";~load%")
  570 IFout%:IFNOTtext%:BPUT#out%,13:BPUT#out%,255
  580 IFout%:CLOSE#out%:out%=0:X%!2=&FFFFFB00-1024*text%:A%=FNfile(out$,2)
  590 PRINT:END
  600 DEFFNline:num%=FNDis_Code(cpu%,addr%,addr%-load%+mem%):L$=$(X%+4)
  610 num%=X%?3:flg%=X%?2:A%=INSTR(L$,"&FF"):IFA%=0:=L$
  620 L%=EVAL(MID$(L$,A%,5))-&FFCE:IFL%<0ORL%>43:=L$
  630 IF((L%MOD3-(L%>27))MOD3-3*(L%=24)+(L%>24ANDL%<28)-3*(L%=27)-(L%=28)):=L$
  640 =LEFT$(L$,A%-1)+"OS"+MID$("FINDGBPBBPUTBGETARGSFILERDCHASCINEWLWRCRWRCHWORDBYTE_CLI",(L%DIV3)*4+1,4)+MID$(L$,A%+5)
  650 DEFPROCout(T$,A$):IFout%=0:ENDPROC
  660 IFtext%:A$=T$+MID$(A$,(T$="")+2)+eol$:$name%=A$:PROCgbpb(2,out%,name%,LENA$,0):ENDPROC
  670 line%=line%+1:?name%=13:name%?1=line%DIV256:name%?2=line%
  680 name%?3=LENA$+4:$(name%+4)=A$:PROCgbpb(2,out%,name%,LENA$+4,0):ENDPROC
  690 DEFPROCClose_All:out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
  700 ENDPROC
  710 DEFFNch(A%):A%=A%AND127:IFA%<32ORA%=127:="."ELSE=CHR$A%
  720 DEFFNh0(A%,N%)=RIGHT$("0000000"+STR$~A%,N%)
  730 DEFPROCgbpb(A%,chn%,addr%,num%,ptr%)
  740 ?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:IF(os%AND32)=0:CALL&FFD1:ENDPROC
  750 IFA%=1ORA%=3:PTR#?X%=X%!9
  760 REPEAT:IFA%=1ORA%=2:BPUT#?X%,?X%!1ELSEIFA%=3ORA%=4:?X%!1=BGET#?X%
  770 X%!1=X%!1+1:X%!5=X%!5-1:UNTIL(EOF#?X%ANDA%>2)ORX%!5<1:ENDPROC
  780 DEFFNfile(A$,A%):IF(os%AND32)=0:$name%=A$:?X%=name%:X%?1=name%DIV256:=(USR&FFDD)AND&FF
  790 IFA%=5:X%!14=OPENIN(A$):IFX%!14:X%!10=EXT#X%!14:CLOSE#X%!14:X%!2=0:X%!6=0:X%!14=&33:=1
  800 =0
  810 DEFFNDis_Name(A%):X%?3=&14:="PDP11"
  820 DEFFNDis_Code(A%,Ptr%,Data%):LOCALs%,d%,c%:!X%=0:num%=2
  830 c%=!Data%:s%=(c%AND&0FC0)DIV64:d%=c%AND63:c%=(c%AND&F000)DIV&1000
  840 $(X%+4)=FNpdp:X%?3=num%:=num%
  850 DEFFNpdp
  860 IF(c%AND7)=0:IFs%>39:IFs%<52:=MID$("CLRCOMINCDECNEGADCSBCTSTRORROLASRASL",3*(s%-40)+1,3)+MID$(" B",c%DIV8+1,1)+" "+FNmr(d%)
  870 IF((c%-1)AND7)<5:=MID$("MOVCMPBITBICBIS",(c%AND7)*3-2,3)+MID$(" B",c%DIV8+1,1)+" "+FNmr(s%)+","+FNmr(d%)ELSE=EVAL("FNpdp_"+STR$~c%)
  880 DEFFNpdp_F:="FLOP "+FNmr(s%)+","+FNmr(d%)
  890 DEFFNpdp_E:="SUB  "+FNmr(s%)+","+FNmr(d%)
  900 DEFFNpdp_8:IFs%<32:=MID$("BPLBMIBHIBLSBVCBVSBCCBCS",3*((s%DIV4))+1,3)+"  "+FNjr(?Data%)
  910 IFs%<40:=MID$("EMT TRAP",(s%AND&FC)-31,4)+" &"+FNh0(?Data%,2)
  920 IF(s%AND&FC)=&34:=MID$("MTPSMFPDMTPDMFPS",4*s%-207,3)+" "+FNmr(d%)
  930 X%?2=128:="EQUW &"+FNh0(!Data%,4)
  940 DEFFNpdp_7
  950 IFs%<32:=MID$("MUL DIV ASH ASHC",4*(s%DIV8)+1,4)+" "+FNmr(d%)+","+FNr(s%)
  960 IFs%<40:="XOR  "+FNr(s%)+","+FNmr(d%)
  970 IFs%=40:IFd%<32:=MID$("FADDFSUBFMULFDIV",4*(d%DIV8)+1,4)+" "+FNr(d%)
  980 IF(s%AND&38)=&38:="SOB  "+FNr(s%)+","+FNjr(d%-192*(d%>31))
  990 X%?2=128:="EQUW &"+FNh0(!Data%,4)
 1000 DEFFNpdp_6:="ADD  "+FNmr(s%)+","+FNmr(d%)
 1010 DEFFNpdp_0:IFs%<32:IFs%>3:X%?2=(s%<8)AND64:=MID$("BR BNEBEQBGEBLTBGTBLE",3*(s%DIV4)-2,3)+"  "+FNjr(?Data%)
 1020 IFs%=0:IFd%<7:=MID$("HALTWAITRTIBPTIOTRESETRTT",d%*4+1+(d%>2)+(d%>3)+(d%=5),4+(d%>1)-2*(d%>4))
 1030 IFs%=1:X%?2=64:="JMP  "+FNmr(d%)
 1040 IFs%=2:IFd%<8:X%?2=64:="RTS  "+FNr(d%)
 1050 IFs%=2:IF(d%AND&38)=&18:="SPL  "+STR$(d%AND7)
 1060 IFs%=2:IF(d%AND&30)=&20:="CCC  &"+FNh0(d%AND&F,2)
 1070 IFs%=2:IF(d%AND&30)=&30:="SCC  &"+FNh0(d%AND&F,2)
 1080 IFs%=3:="SWAB "+FNmr(d%)
 1090 IF(s%AND&38)=&20:="JSR  "+FNr(s%AND7)+","+FNmr(d%)
 1100 IFs%=52:="MARK &"+FNh0(d%,2)
 1110 IF(s%AND&FC)=&34:=MID$("MFPIMTPISXT ",4*s%-211,3)+" "+FNmr(d%)
 1120 X%?2=128:="EQUW &"+FNh0(!Data%,4)
 1130 DEFFNr(A%):A%=A%AND7:IFA%=7:="PC"ELSEIFA%=6:="SP"ELSE="R"+STR$A%
 1140 DEFFNmr(A%):LOCALm%:m%=(A%AND&38)DIV8:IF(A%AND7)=7:=FNpc
 1150 IFm%<2:=MID$("("+FNr(A%)+")",2-m%,2*m%+2)
 1160 IFm%<6:=LEFT$("@",m%AND1)+LEFT$("-",m%DIV4)+"("+FNr(A%)+")"+LEFT$("+",m%<4)
 1170 num%=num%+2:=LEFT$("@",m%=7)+FNh0(Data%!(num%-2),4)+"("+FNr(A%)+")"
 1180 DEFFNpc
 1190 IFm%<2:=MID$("(PC)",2-m%,2*m%+2)
 1200 IFm%<5:num%=num%+2:=LEFT$("@",m%=3)+"#&"+FNh0(Data%!(num%-2),4)
 1210 IFm%<6:=MID$("@-(PC)",6-m%)
 1220 num%=num%+2:=LEFT$("@",m%=7)+"&"+FNh0(Ptr%+num%+Data%!(num%-2),4)
 1230 DEFFNjr(A%):IFA%<128:="&"+FNh0(Ptr%+A%*2+2,4)ELSE="&"+FNh0(Ptr%+A%*2+2-512,4)