> Startup & PDP11 Emulator with disassembler $ v0.12 2004 JGH: Some more work (/ v0.13 2005 JGH: *Commands, RTS, EMT, TRAP 2_ v0.14 01-Sep-2005 JGH: More EMTs and TRAPs, mode 7(pc) seems to work, works on PC/Windows "" > A$="":"PDP11 Emulator v"ver$" (C)2001-2006 J.G.Harston" Y A$="":"Memory start: &"h0(mem%,8)" MemSz: &"h0(mz%,6)" MemMsk: &"h0(mm%,6) M A$="":"prog: &"h0(prog%,4)" base: &"h0(base%,4)" err: &"h0(err%,4); 4 A$="":" sys: &";h0(sys%,4)" io: &"h0(io%,4) ^ A$="":"Program space: &"h0(membot%,5)"-&"h0(memtop%,5)" ";(memtop%-membot%);" bytes"  Error:A$=""  A$<>"":A%=_RUN(A$) " run%:Go , quiet%:A%=_QUIT("") 6" "PDP11> "A$:cmd(A$,0):0 @ J: T Init ^Hrunpath$=run$: runpath$,1)="""":runpath$=runpath$,2, runpath$-2) h/ runpath$=runpath$): ".:",runpath$,1)) r6d$=".":s$="/":os%40:d$="/":s$=".":os%32:d$="\" |Ros%=32:mx%=@vdu%!208:my%=@vdu%!212:mw%=@vdu%!216:mh%=@vdu%!220:mc%=@vdu%?73+1 kswap$="PDPswap":mz%=memsize:mm%=mz%-1:memtop%=mz%:membot%=0:run%=:errvec%=0:emt%=0:ind%=0:r7%=0:pc%=0 W ctrl% 31,zp% 127,r%(7),mem% mz%:psw%=0:trace0%=0:trace1%=&FFFF:X%=ctrl%:Y%=X%256 Tprog%=mem(0):base%=mem(&100):base%=mem(0) : Allocate low memory X io%=FNmem(-&100):sys%=FNmem(-&100):err%=FNmem(-&100) :REM Allocate high memory Wio%=0:sys%=0:err%=mem(-&100):mem%?err%=13:escflg%=err%+255 : Allocate high memory Perr0%=err%:mem%!(mz%-9)=&26:EscInit: : Flag at &FFF7='PDP11' : >ݤmemsize:A%=2^((--1024)/2): A%<&10000:=A% =&10000 Qݤmem(A%): A%<0:memtop%=memtop%+A%:=memtop% membot%=membot%+A%:=membot%-A% : Error:X%=ctrl%:Y%=X%256  -1:run%= G run%::Close_All:" at line "+Þ,<128 <>17): -1:RegDump I =25:run%: os%=32:run%=: 23,22,mx%;my%;mw%,mh%,mc%,128:run%=:  IF run%:mem%!err%=ERR:mem%!(err%+4)=&880F:mem%?(err%+6)=ERR:$(mem%+err%+7)=LEFT$("PDPEm: ",ERR<128 AND ERR<>17)+REPORT$+CHR$0:PROCpsw(0,0,TRUE,TRUE,ERR=17,ERR=17):r%(0)=err%+6:IFERR=17:mem%?escflg%=&FF  run%:mem%!err%=:mem%!(err%+4)=&880F:mem%?(err%+6)=:A%=<128 <>17:$(mem%+err%+7)="PDPEm: ",A%)+$+" at line "+Þ,A%)+0:psw(0,0,,,,):r%(0)=err%+6:=17:mem%?escflg%=&FF & r7%:r%(7)=r7% 0 ind%:r%(7)=ind% : errvec%:r%(7)=errvec% D N: XCcmd(A$,link%): A$<>"": A$,1)=" ": A$=A$,2): A$,1)<>" " b A$=""A$,1)="|": l A$,1)="*": A$,2): v A$,1)=".": "."+A$,2): ! A$,1)="/":A$="RUN "+A$,2) 2A%=A$+" "," "):C$=uc(A$,A%-1)):A$=A$,A%+1) OA%=" BASIC CORE DEBUG GO HELP LOAD MDUMP MDIS MEDIT QUIT RUN "," "+C$+" ")  A%:A%=("FN_"+C$+"(A$)"): A%=_run(C$+" "+A$,): : >ݤ_HELP(A$):'"PDP11 Emulator ";ver$: uc(A$)<>"PDP11":=0 b" BASIC"'" CORE "'" DEBUG [ [ ]]"'" GO ()"'" HELP" T" LOAD "'" MDUMP "'" MDIS "'" QUIT"'" RUN " =0 : *ݤ_BASIC(A$):=_RUN(" "+A$) : Dݤ_MDIS(A$): N%,P%,C%: uc(A$,2))="&O":A$=h0(oct(A$,3)),8)  5P%=("&"+A$)::C%=16:o0(P%,6);" ";:A$=dis(P%) 7 A%=0 N%-1 2:o0(mem%!(P%+A%)&FFFF,6);" ";:  A(21-3.5*N%);: A%=0 N%-1:c(mem%?(P%+A%));::(7-N%);A$ *"P%=P%+N%:C%=C%-1:C%=0:=0:=0 4: >Eݤ_MDUMP(A$): N%,P%,C%: uc(A$,2))="&O":A$=h0(oct(A$,3)),8) H/P%=("&"+A$):N%=16::C%=16:h0(P%,4);" "; R- A%=0 N%-1:h0(mem%?(P%+A%),2);" ";: \( A%=0 N%-1:c(mem%?(P%+A%));:: f#P%=P%+N%:C%=C%-1:C%=0:=27:=0 p: zݤ_MEDIT(A$):=0 : !ݤ_QUIT(A$): A$:halt%=:=0 =Close_All: IF os%=32:PRINT"Press SPACE to exit";:A%=GET "QUIT":=0 : ݤ_RUN(A$) = Can't use FNf_info() as name% past bottom 64K of memory Z(os%40)=0:ș"XOS_File",5,A$ ,,A%:A%=A%&FFF00: A%=&FFB00 A%=&1C700:=_BASIC(A$) =_run(A$,) : +ݤ_run(A$,osc%):ȕ A$,1)=" ":A$=A$): A%=A$+" "," "): A$="":=0 : $ When running code within Unix: / r0-r5=0, r6=top of memory, r7=entry point # (sp)=>argn, argv[], envv[], 0 $C Code expects text segment at header+16 to be at address &0000 . Code entered at header!10 8% Not relocatable if header!14<>0 B% Cannot RTS to system, must exit L9 If no header, &0000 pushed onto stack, [&0000]=halt V: `YC$=A$:F$=A$,A%-1):in%=f_openin(F$): in%=0:in%=(F$+s$+"pdp"): in%=0: osc%:C$:=0 j# in%=0:"Can't open '"F$"'":=0 t"gbpb(3,in%,zp%,128,0):#in%=0 ~] zp%!(zp%?7)=&29432800:(zp%?6&2F)=&27:A%=zp%?7:A%=A%+1:zp%?A%=0:A%=A%+5:#in%=zp%!A% Tgbpb(3,in%,zp%,16,#in%):#in%=#in%-16:magic%=!zp% &FFFF : Read file header 4 magic%<&105 magic%>&111:magic%=0 magic%=16 Xgbpb(3,in%,mem%+prog%-base%*(magic%=0),#in%-magic%-#in%,#in%+magic%):#in%:in%=0 X A%=04:r%(A%)=0::r%(5)=&0BBC:r%(6)=memtop%-2:r%(7)=prog%+base%:debug%16:r%(5)=0 x magic%:frame r%(6)=r%(6)-C$-3:$(mem%+r%(6)+2)=C$:r%(1)=r%(6)+2:mem%?0=0:mem%?1=0:mem%?r%(6)=0:mem%?(r%(6)+1)=0 =_GO(h0(r%(7),4)) :  Set up entry from header 0 Create stack frame with command parameters o sp=>argn, ->arg[0], ->arg[1], .., 0, ->env[0], ->env[1], .., 0, arg[0], arg[1], .., env[0], env[1], .., 0 7 eg 2, ->cat, ->file, 0, 0, "cat"+0, "file"+0, 0  Need to: ) scan for file >>file options  frame ]A%=(zp%!6)&FFFF: A%:B%=(zp%!2 &FFFF)+(zp%!4 &FFFF): mem%?B%=0:B%=B%+1:A%=A%-1: A%=0 /r%(7)=prog%+zp%!10 &FFFF:A%=1:B%=1:C%=1: (`C$,A%,1)=" ":C%=C%+1:B%=A%:B%=B%+1:C$,B%,1)<>" ":C$=C$,A%-1)+0+0,(A%1)<>0)+C$,B%) 2?A%=A%+1: A%> C$:B%=(memtop%-C$-3)-2:$(mem%+B%)=C$+0+0 memtop%:B%=(B%+2)-2:A%=A%+2 Z"C%=C%-1: C%<0:mem%!(A%-2)=0: d: n4ݤ_LOAD(A$):A%=A$," "): A%=0:"Bad address":=0 xF$=A$,A%-1):A$=A$,A%+1) - uc(A$,2))="&O":A$=h0(oct(A$,3)),8) 2"Load "+f_name(F$)+" "+~(mem%+("&"+A$)):=0 : ݤ_CORE(A$): Dump core 8A$=f_name(s(A$,A$+" "," ")-1))):A$="":A$="core" $"Save "+A$+" "+~mem%+"+"+~mz% SetType(A$,&FFD) =0 : ܊ݤ_DEBUG(A$):A$="":" 1=Register Dump"'" 3=Single Step"'" 4=EMT/TRAP calls"'" 8=ignore odd word accesses"'"16=r5<>&BBC on startup":=0 7debug%=0:trace0%=0:trace1%=&FFFF: uc(A$)="OFF":=0 ,debug%=(A$):(debug%1): <9: : >8 6A%=A$," "): A%:trace0%=(A$,A%+1)):A$=A$,A%+1) )A%=A$," "): A%:trace1%=(A$,A%+1)) =0 : "ݤ_GO(A$): A$="":=0 ,- uc(A$,2))="&O":A$=h0(oct(A$,3)),8) 63err%=err0%:escflg%=err%+255:errvec%=0:escvec%=0 @r%(7)=("&"+A$):Go:=0 J: TSetType(A$,A%): os%>8: ^"SetType "+A$+" "+~A% h r: |ݤoct(A$): A%: 0 A$>"/" A$<":":A%=A%*8+ A$,1):A$=A$,2)  (A$>"/" A$<":"):=A% : RegDump: N%: : O A%=07:"R";A%;"= "o0(r%(A%)&FFFF,6)": ";c(r%(A%)256);c(r%(A%));" "; - B%=r%(A%)r%(A%)+7: c(mem%?B%);::32 > B%=r%(A%)r%(A%)+7 2: o0(mem%!(B%mm%)&FFFF,6)" ";: $::"PSW="o0(psw%,6);":";(5); 3 ;(psw%&E0)32;":";"T-",((psw%16)<>0)+2,1); 8 "M-",((psw%8)<>0)+2,1);"Z-",((psw%4)<>0)+2,1); J "V-",((psw%2)<>0)+2,1);"C-",((psw%1)<>0)+2,1);1;dis(r%(7));10  : Pݤdis(A%):N%=Dis_Code(11,A%,mem%+(A%mm%)):A$=$(X%+4):A%=A$,"&"):A%=0:=A$ =B%=A%:B%=B%+1:"0123456789ABCDEF",A$,B%,1))=0 B%>A$ @A$=A$,A%)+"o"+o0((A$,A%,B%-A%+1)),(B%-A%-1)*3/2)+A$,B%) &=A$ 0: :3ݤc(A%):A%=A%255: A%<32 A%>126:="." = A% D: N"EscInit:esch%=esch%:esch%: X os%=32 bC P% 36, L% -1:[OPT 8:.escyes:mov byte [edi-1],0:mov eax,-1:ret l8.esch%:mov ecx,256:mov edi,[@vdu%-148]:mov al,27:cld v>repnz scasb:jz escyes:xor eax,eax:ret:.escb%:dw 0:dw 0:]:  = esch% 31: P=0 1:P%=esch%:[OPT P*2:MOV R11,R11,LSL #1 SLDR R12,escb%:STRB R11,[R12]:MOV PC,R14:.escb%:EQUD mem%+escflg%:]::escho%=0: $EscOff:escho%=escho%:escho%: Los%<>32:ș "OS_ChangeEnvironment",9,esch%,0,0 ,escho%,escRo%,escbo%: :"ESC OFF":escho%=: esch%:mem%?escflg%=&FF:  PEscOn:os%<>32:ș "OS_ChangeEnvironment",9,escho%,escRo%,escbo%:escho%=0:  :escho%=0:"ESC ON":  > PDP11 N Not yet done: SXT, ASHC, MARK, SOB, ops 1-7, SPL, M[F|T][PI|PD|PS], FLop $ 08-Nov-2007: ops 1-7, SPL done > 12-Aug-2008: SXT, ASHC, SOB, ops 1-7, SPL, M[F|T]PS done 0 17-Jun-2010: Entering code resets handlers  : 5Go:abort%=:halt%=0:run%=:r7%=0:ind%=0:EscOff  5 err%=err0%:escflg%=err%+255:escvec%=0:errvec%=0 *d:(debug%1): r%(7)>=trace0% r%(7)<=trace1%:x%=:y%=:30:RegDump:31,x%,y%:(debug%2): 48op%=mem%!(r%(7)mm%):pc%=r%(7):r%(7)=(r%(7)+2)&FFFE >@dd%=op%63:ss%=(op%&FC0)64:op%=(op%&F000)&1000:by%=op%8 H@A%=("FN_"+~(op%7)):halt%:EscOn:run%=:abort%:r%(7)=pc% R quiet%: r%(0):abort%= \ quiet% abort%:RegDump f p: z Opcodes are: & 00xxxx various 10xxxx various ) 01xxxx MOV ss,dd 11xxxx MOVB ss,dd ) 02xxxx CMP ss,dd 12xxxx CMPB ss,dd ) 03xxxx BIT ss,dd 13xxxx BITB ss,dd ) 04xxxx BIC ss,dd 14xxxx BICB ss,dd ) 05xxxx BIS ss,dd 15xxxx BISB ss,dd ) 06xxxx ADD ss,dd 16xxxx SUB ss,dd & 07xxxx various 17xxxx various : Dݤsrc(ss%,b%): Fetch source value, sets D% to address of source ( m%,r%,a%:D%=0:a%=&FFFF: b%:a%=&FF Bm%=ss%8:r%=ss%7:b%=2-b%: r%>5: m%<6:b%=2: sp&pc always +2 N m%=0:D%=0:=r%(r%)a% : Rn R m%=1:D%=r%(r%) : (Rn) S m%=2:D%=r%(r%):r%(r%)=r%(r%)+b% : (Rn)+ R m%=3:D%=mem%!(r%(r%)mm%):r%(r%)=r%(r%)+2 : @(Rn)+ $S m%=4:r%(r%)=r%(r%)-b%:D%=r%(r%) : -(Rn) .R m%=5:r%(r%)=r%(r%)-2:D%=mem%!(r%(r%)mm%) : @-(Rn) 8Q m%=6:D%=mem%!(r%(7)mm%):r%(7)=r%(7)+2:D%=(r%(r%)+D%) : X(Rn) BP m%=7:D%=mem%!(r%(7)mm%):r%(7)=r%(7)+2:D%=mem%!((r%(r%)+D%)mm%) : @X(Rn) Lj b%=2:(D%1):(debug%8)=0:"Bus error: word read from odd address (";m%;"/";r%;")":halt%=:abort%= V=mem%!(D%mm%)a% `: jXpre(dd%,b%): Do pre-access register adjustment, sets D% to address of destination tO m%,r%:D%=0:m%=dd%8:r%=dd%7:b%=2-b%: r%>5: m%<6:b%=2: sp&pc always +2 ~E Pre always called, dst sometimes not, so D% must be set up here ? m%=4:r%(r%)=r%(r%)-b% : -(Rn) @ m%=5:r%(r%)=r%(r%)-2 : @-(Rn) J m%=1 m%=2 m%=4:D%=r%(r%) : (Rn), (Rn)+, -(Rn) E m%=3 m%=5:D%=mem%!(r%(r%)mm%) : @(Rn)+, @-(Rn) = m%=6:D%=mem%!(r%(7)mm%):r%(7)=r%(7)+2 : X(Rn) > m%=7:D%=mem%!(r%(7)mm%):r%(7)=r%(7)+2 : @X(Rn)  : +ݤdst(dd%,b%): Fetch destination value 5 m%,r%,a%:m%=dd%8:r%=dd%7:a%=&FFFF: b%:a%=&FF : m%=0:=r%(r%)a% : Rn ; m%=6:=mem%!((r%(r%)+D%)mm%)a% : X(Rn) =mem%!(D%mm%)a% : Bdst(dd%,v%,b%): Store dest value and post-access reg adjust 0 Storing to mode 7 needs to double indirect (D m%,r%:m%=dd%8:r%=dd%7:v%=v%&FFFF:b%=2-b%: r%>5: m%<6:b%=2 2| IF b%=2:IF(D%AND1):IF(debug%AND8)=0:PRINT"Bus error: word write to odd address (";m%;"/";r%;")":halt%=TRUE:abort%=TRUE 0): : Rn FR m%=0:r%(r%)=v%: : Rn Pe m%<6:mem%?(D%mm%)=v%:b%=2:mem%?((D%+1)mm%)=v%256 : (Rn) [@]-(Rn) [@](Rn)+ ZU m%=2:r%(r%)=r%(r%)+b%: : (Rn)+ dV m%=3:r%(r%)=r%(r%)+2: : @(Rn)+ nT m%=6:mem%?((r%(r%)+D%)mm%)=v%: b%=2:mem%?((r%(r%)+D%+1)mm%)=v%256 : X(Rn) xa m%=7:mem%?(mem%!((r%(r%)+D%)mm%)mm%)=v%: b%=2:mem%?(mem%!((r%(r%)+D%)mm%+1)mm%)=v%256  : m IF m%<3 OR m%=4:mem%?(r%(r%)ANDmm%)=v%:IF b%=2:mem%?((r%(r%)+1)ANDmm%)=v%DIV256 :REM (Rn), (Rn)+, -(Rn) r IF m%=3 OR m%=5:mem%?(mem%!r%(r%)ANDmm%)=v%:IF b%=2:mem%?((mem%!r%(r%)+1)ANDmm%)=v%DIV256:REM @(Rn)+, @-(Rn) ` IF m%=2:r%(r%)=r%(r%)+b%:ENDPROC :REM (Rn)+ a IF m%=3:r%(r%)=r%(r%)+2:ENDPROC :REM @(Rn)+ ` IF m%=6:mem%?((r%(r%)+D%)ANDmm%)=v%:IF b%=2:mem%?((r%(r%)+D%+1)ANDmm%)=v%DIV256 :REM X(Rn) o IF m%=7:mem%?(mem%!((r%(r%)+D%)ANDmm%)ANDmm%)=v%:IF b%=2:mem%?(mem%!((r%(r%)+D%)ANDmm%+1)ANDmm%)=v%DIV256 c REM IFm%=7:mem%?((r%(r%)+D%)ANDmm%)=v%:IFb%=2:mem%?((r%(r%)+D%+1)ANDmm%)=v%DIV256 :REM @X(Rn) ENDPROC : Opsw(v%,b%,cv%,nv%,cc%,nc%): value, byte?, changeV?, newV, changeC?, newC ( v%=0:psw%=psw%4 psw%=psw%&FFFB 0 b%=0:psw%=(psw%&FFF7)(((v%&8000)<>0)8) , b%:psw%=(psw%&FFF7)(((v%&80)<>0)8) ( cv%:psw%=(psw%&FFFD)((nv%<>0)2) "( cc%:psw%=(psw%&FFFE)((nc%<>0)1) , 6: @/carry(c%):psw%=(psw%&FFFE)((c%<>0)1): J: T b1xxxx - MOV/MOVB: ^Pݤ_1:V%=src(ss%,by%):pre(dd%,by%):dst(dd%,V%,by%):psw(V%,by%,1,0,0,0):=0 h: r b2xxxx - CMP/CMPB: |3ݤ_2:V%=src(ss%,by%):W%=src(dd%,by%):R%=V%-W% W by%:V%=((V%&80)=(W%&80))((R%&80)<>(W%&80)):psw(R%,0,1,V%,1,R%&FFFFFF00):=0 YV%=((V%&8000)=(W%&8000))((R%&8000)<>(W%&8000)):psw(R%,0,1,V%,1,R%&FFFF0000):=0 :  b3xxxx - BIT/BITB: Eݤ_3:V%=src(ss%,by%):W%=src(dd%,by%):psw(V%W%,by%,1,0,0,0):=0 :  b4xxxx - BIC/BICB: 8ݤ_4:V%=src(ss%,by%):pre(dd%,by%):W%=dst(dd%,by%) 6V%=V%W%:dst(dd%,V%,by%):psw(V%,by%,1,0,0,0):=0 :  b5xxxx - BIS/BISB: 8ݤ_5:V%=src(ss%,by%):pre(dd%,by%):W%=dst(dd%,by%) 5V%=V%W%:dst(dd%,V%,by%):psw(V%,by%,1,0,0,0):=0 :  b6xxxx - ADD/SUB: Rݤ_6:V%=src(ss%,0)&FFFF:pre(dd%,0):W%=dst(dd%,0): by%:R%=W%-V% R%=W%+V% &;V%=(V%&8000)=(W%&8000):V%=V%((R%&8000)<>(W%&8000)) 04dst(dd%,R%,0):psw(R%,0,1,V%,1,R%&FFFF0000):=0 :: D/ b7xxxx - MUL/DIV/ASH/ASHC/XOR/Fop/???/SOB N(ݤ_7: by%:=0 =("FN_7"+~(ss%8)) X: b2 b0xxxx - HALT/etc/Bxx/JSR/CLRetc/RORetc/und: l,ݤ_0:(ss%&20)=0: ss%>3 by%:=branch v ss%8=7:=0  ss%8=4:=_04 =("FN_0"+o0(ss%,2)) : Nݤbranch:dist%=dd%+(ss%3)*64:op%=ss%4+op%: IFINKEY-113:mem%?escflg%=&FF < op%=1 :=rel() : BR D op%=2 :=rel((psw%4)=0) : BNE - Z=0 D op%=3 :=rel((psw%4)<>0) : BEQ - Z=1 G op%=4 :=rel(((psw%8)<>0)((psw%2)<>0)=0) : BGE - N XOR V =0 G op%=5 :=rel(((psw%8)<>0)((psw%2)<>0)<>0) : BLT - N XOR V =1 W op%=6 :=rel(((psw%4)<>0((psw%8)<>0(psw%2)<>0))=0) : BGT - Z OR (N XOR V)=0 W op%=7 :=rel(((psw%4)<>0((psw%8)<>0(psw%2)<>0))<>0): BLE - Z OR (N XOR V)=1 D op%=8 :=rel((psw%8)=0) : BPL - N=0 D op%=9 :=rel((psw%8)<>0) : BMI - N=1 G op%=10:=rel(((psw%1)<>0)((psw%4)<>0)=0) : BHI - C OR Z =0 G op%=11:=rel(((psw%1)<>0)((psw%4)<>0)<>0) : BLOS- C OR V =1 D op%=12:=rel((psw%2)=0) : BVC - V=0 D op%=13:=rel((psw%2)<>0) : BVS - V=1 *D op%=14:=rel((psw%1)=0) : BCC - C=0 4D op%=15:=rel((psw%1)<>0) : BCS - C=1 >=0 H: Rݤrel(A%): A%:=0 \? dist%>127:r%(7)=r%(7)-(256-dist%)*2 r%(7)=r%(7)+dist%*2 f=0 p: z. 0000dd - HALT/WAIT/RTI/BPT/IOT/RESET/RTT ݤ_000 & dd%=0:halt%=:abort%=:=0: HALT dd%=1:=0 : WAIT  dd%=2:=0 : RTI  dd%=3:=0 : BPT  dd%=4:=0 : IOT ! dd%=5:=0 : RESET  dd%=6:=0 : RTT  dd%=7:=0 =0 :  0001dd - JMP: Pݤ_001:(dd%&38)=0 dd%=&17:(debug%8)=0:"JMP fault":halt%=:abort%=:=0 ]A%=src(dd%,0):(D%1):(debug%8)=0:"Bus error: JMP to odd address":halt%=:abort%=:=0 r%(7)=D%&FFFF:=0 : $0 0002xx - RTS/-/-/SPL/Clear flags/Set flags . ݤ_002 8/ dd%>47:psw%=psw%(dd%15):=0 : Sxx B, dd%>23:psw%=psw%(dd%15):=0 : Cxx L2(dd%8)=3:=0 : SPL n V.(dd%8)=2:=0 : - `.(dd%8)=1:=0 : - j;r%=dd%7:r%(7)=r%(r%):W%=mem%?(r%(6)mm%):r%(6)=r%(6)+1 tLW%=mem%?(r%(6)mm%)*256+W%:r%(6)=r%(6)+1:r%(r%)=W%:=0 : RTS r ~:  0003dd - SWAB: Fݤ_003:pre(dd%,0):V%=dst(dd%,0):!zp%=V%:zp%!2=V%:R%=zp%!1 &FFFF (dst(dd%,R%,0):psw(V%,0,1,0,1,0):=0 : $ 0004rdd - JSR Rn,dst/EMT/TRAP: ݤ_04: by%:=_TRAP ;(dd%&38)=0 dd%=&17:"JSR fault":halt%=:abort%=:=0 OA%=src(dd%,0):(D%1):"Bus error: JSR to odd address":halt%=:abort%=:=0 &7F)((V%1)<>0),1,V%1) 6U by%=0:R%=((V%2)&7FFF)(W%*&8000):psw(R%,by%,1,(R%>&7FFF)((V%1)<>0),1,V%1) @dst(dd%,R%,by%):=0 J: T b061dd - ROL: ^3ݤ_061:pre(dd%,by%):V%=dst(dd%,by%):W%=psw%1 hM by%=1:R%=((V%*2)&FE)W%:psw(R%,by%,1,(R%>&7F)((V%&80)<>0),1,V%&80) rU by%=0:R%=((V%*2)&FFFE)W%:psw(R%,by%,1,(R%>&7FFF)((V%&8000)<>0),1,V%&8000) |dst(dd%,R%,by%):=0 :  b062dd - ASR: )ݤ_062:pre(dd%,by%):V%=dst(dd%,by%) S by%=1:W%=V%&80:R%=((V%2)&7F)W%:psw(R%,by%,1,(R%>&7F)((V%1)<>0),1,V%1) Y by%=0:W%=V%&8000:R%=((V%2)&7FFF)W%:psw(R%,by%,1,(R%>&7FFF)((V%1)<>0),1,V%1) dst(dd%,R%,by%):=0 :  b063dd - ASL: )ݤ_063:pre(dd%,by%):V%=dst(dd%,by%) H by%=1:R%=(V%*2)&FE:psw(R%,by%,1,(R%>&7F)((V%&80)<>0),1,V%&80) P by%=0:R%=(V%*2)&FFFE:psw(R%,by%,1,(R%>&7FFF)((V%&8000)<>0),1,V%&8000) dst(dd%,R%,by%):=0 :  b064dd - MARK/MTPS: ;ݤ_064:by%:psw%=src(ss%,0):=0 : MTPS <"#"o0(r%(7)-2,6)":"o0(mem%!(r%(7)-2),6)"#";:=0: MARK &: 0Hݤ_065:"#"o0(r%(7)-2,6)":"o0(mem%!(r%(7)-2),6)"#";:=0: MFPI/MFPD :Hݤ_066:"#"o0(r%(7)-2,6)":"o0(mem%!(r%(7)-2),6)"#";:=0: MTPI/MTPD D: N b067dd - SXT/MFPS: X8ݤ_067:by%:pre(dd%,0):dst(dd%,psw%,0):=0 : MFPS bQpre(dd%,0):V%=((psw%8)<>0)&FFFF:dst(dd%,V%,0):psw(V%,0,1,0,0,0):=0: SXT l: v 070rdd - MUL: 2ݤ_70:V%=src(dd%,0):r%=ss%7:r=V%*r%(r%):W%=0 C r>&7FFFFFFF:r=&7FFFFFFF:W%=1 r<&80000000:r=&80000000:W%=1 ;r%(r%1)=r 65536:r%(r%)=r &FFFF:psw(r,0,1,0,1,W%):=0 :  071rdd - DIV: ?ݤ_71:V%=src(dd%,0):r%=ss%7: r%1:psw%=(psw%&FFFD)2:=0 S!zp%=r%(r%):zp!2=r%(r%1): v%<>0:W%=!zp% V%:R%=!zp% V%:r%(r%1)=R%:r%(r%)=W% /psw(W%,0,V%=0 (r%(r%))>(V%),1,V%=0):=0 :  072rdd - ASH: $ݤ_72:V%=src(dd%,0)63:r%=ss%7 ; V%<32:R%=r%(r%)*2^V%:psw(R%&FFFF,0,1,0,1,R%&10000) = V%>31:R%=r%(r%)2^(63-V%):psw(R%,0,1,0,1,R%1):R%=R%2 r%(r%)=R%&FFFF:=0  :  073rdd - ASHC:  $ݤ_73:V%=src(dd%,0)63:r%=ss%7 *f V%<32:R%=r%(r%)*2^V%:S%=(r%(r%1)*2^V%)(R%65536):psw((R%&FFFF)(S%&FFFF),0,1,0,1,S%&10000) 4 V%>31:R%=(r%(r%)2^(63-V%))(r%(r%1)*2^(V%-47)):S%=(r%(r%1)2^(63-V%)):psw(R%S%,0,1,0,1,R%1):S%=S%256+32768*(R%1):R%=R%2 >(r%(r%)=R%&FFFF:r%(r%1)=S%&FFFF:=0 H: R XOR: \4ݤ_74:pre(dd%,0):V%=dst(dd%,0):R%=V%r%(ss%7) f(dst(dd%,R%,0):psw(R%,0,1,0,0,0):=0 p: z FADD/FSUB/FMUL/FDIV ;ݤ_75:"#"o0(r%(7)-2,6)":"o0(mem%!(r%(7)-2),6)"#";:=0 :  076nnn - unused  ݤ_76:=0 :  077rdd - SOB: Wݤ_77:dist%=dd%-192*(dd%>31):ss%=ss%7:V%=(r%(ss%)-1)&FFFF:r%(ss%)=V%:=rel(V%<>0) :  > EMT  EMT interface to host ; v0.22 27-Sep-2009 OSBYTE 160 translated to host calls : Mݤ_TRAP:dd%=dd%+(ss%7)*64:(debug%4):DbTrap(dd%): &0xx=EMT, &1xx=TRAP ;psw%=psw%-16:dd%<16:A%=r%(0):A%=("FN_EMT"+~dd%):=A% #dd%<256:=("FN_EMT("+dd%+")") Tdd%=dd%&FF:r7%=r%(7):dd%<&40:A%=("FN_TRAP"+~dd%) A%=("FN_TRAP("+dd%+")") $r%(7)=r7%:r7%=0:=A% .: 8FDbTrap(dd%):(dd%>3 dd%<7) (dd%>&102 dd%<&105 r%(0)<3): Bdd%<16:"OS";"QUITCLI BYTEWORDWRCHNEWLRDCHFILEARGSBGETBPUTGBPBFINDSYSTCTRLERR ",dd%*4+1,4);" r0=";~r%(0);" r1=";~r%(1);" r2=";~r%(2):: ;" ";:E. L>A%=r%(7):dd%=&100:A%=mem%!r%(7)&FFFF:dd%=mem%?A%:A%=A%+2 V(dd%&20)=&00: "indir exit fork read write open close wait creat link unlinkexec chdir time mknod chmod chown brk stat lseek getpidmount umountsetuidgetuidstime ptrace[27] fstat pause utime stty ",(dd%31)*6+1,6); `(dd%&20)=&20: "gtty [33] nice ftime sync kill switch[39] [40] dup2 pipe times profiltui setgidgetgidsignal[49] [50] acct phys lock ioctl [55] mpxchn[57] [58] exece umask chroot[62] [63] ",(dd%31)*6+1,6); jb" r0=";h0(r%(0),4);" p1=";h0(mem%!A%,4);" p2=";h0(mem%!(A%+2),4);" p3=";h0(mem%!(A%+4),4) t ~: >ݤ_EMT0:halt%=:=0 : QUIT Dݤ_EMT1:EscOn:cmd($(mem%+r%(0)),):r%(0)=0:EscOff:=0 : OSCLI ?ݤ_EMT2: X%,Y% : OSBYTE Q A%=&82:r%(1)=0:r%(2)=0:=0 : high order address M A%=&83:r%(1)=membot%:r%(2)=membot%256:=0 : bottom of memory J A%=&84:r%(1)=memtop%:r%(2)=memtop%256:=0 : top of memory L A%>123:A%<127:mem%?escflg%=128*(A%1):"FX15" : Clear/Set/Ack Escape F A%=&7F:r%(1)=0 r%(1)=&FFFF:r%(1)=0:=0 : =EOF#0/-1 D A%=&A0:vdu:=0 : =VDU(n) oos%<>32:X%=r%(1):Y%=r%(2):A%=&FFF4:r%(1)=(A%&FFFF00)256:r%(2)=(A%&FF0000)65536:carry(A%&1000000):=0  Windows OSBYTE calls: 4 A%=128:r%(1)=7:ȗ r%(1),A%,A%:r%(2)=A%256:=0 4 A%=128:r%(1)=8:ȗ A%,r%(1),A%:r%(2)=A%256:=0  4 A%=128:r%(1)=9:ȗ A%,A%,r%(1):r%(2)=A%256:=0  Ȏ A%  0:r%(1)=32:=0 ( 127:r%(1)=#r%(1):=0 2> 128:A%=((r%(1)255)+256*r%(2)):r%(1)=A%:r%(2)=A%256:=0  38:ș "GetRgnBox",@vdu%!60,zp%:r%(1)=(zp%!12-@vdu%!12-1)  87,155:r%(1)=@vdu%?70  88,156:r%(1)=@vdu%?71 " 89,153:r%(1)=@vdu%?65 , 90,154:r%(1)=@vdu%?67 64 91,151:r%(1)=3-(@vdu%?64-7)2:r%(1)<0:r%(1)=1 @4 92,152:r%(1)=3-(@vdu%?66-7)2:r%(1)<0:r%(1)=1 J 96,3:r%(1)=@vdu%?73 T ^ r%(1)=0 h rr%(2)=r%(1)256:=0 | =0 ݤvdu:os%=32:=0 r%(1)<16:r%(1)<>3:=0  =0  % ARM and R1>15 or ARM and R1=3 r%(1)=3:r%(1)=96 Ȏ r%(1)  16:A%=138  18:A%=139  20:A%=142  22:A%=143  36:A%=144  38:A%=145  77:A%=148 & 80:A%=149 0 83:A%=150 : 87:A%=155 D 88:A%=156 N 89:A%=153 X 90:A%=154 b 91:A%=151 l 92:A%=152 v 96:A%=3  (A%=r%(1): A%<128:r%(1)=0:r%(1)=0:=  7!zp%=A%:zp%!4=-1:ș "OS_ReadVduVariables",zp%,zp%+8 r%(1)=zp%!8:r%(2)=r%(1)256 = : +ݤ_EMT3: X%,Y% : OSWORD B A%=0:EscOn: ""A$:$(mem%+(mem%!r%(1)&FFFF))=A$:EscOff:=0 7os%<>32 A%=10:X%=mem%+r%(1):Y%=X%256: &FFF1:=0  Ȏ A%  1:mem%!r%(1)=:=0  2:=mem%!r%(1):=0 D 7: mem%!r%(1),mem%!(2+r%(1)),mem%!(4+r%(1)),mem%!(6+r%(1)):=0  8: mem%?r%(1),mem%?(1+r%(1)),mem%?(2+r%(1)),mem%?(3+r%(1)),mem%?(4+r%(1)),mem%?(5+r%(1)),mem%?(6+r%(1)),mem%?(7+r%(1)),mem%?(8+r%(1)),mem%?(9+r%(1)),mem%?(10+r%(1)),mem%?(11+r%(1)),mem%?(12+r%(1)),mem%?(13+r%(1)):=0  14:$(mem%+r%(1))=$:=0   15:$=$(mem%+r%(1)):=0 * 4=0 >-ݤ_EMT4: A%:=0 : OSWRCH H+ݤ_EMT5::r%(0)=13:=0 : OSNEWL R-ݤ_EMT6:r%(0)=:=0 : OSRDCH \/ݤ_EMT7 : OSFILE f+ A%=2 14 4:X%!A%=mem%!(r%(1)+A%): pfn%=mem%+(mem%!r%(1)&FFFF) z@ IF r%(0)=0 OR r%(0)=255:PROCaddr(2):IF r%(0)=0:PROCaddr(6)  r%(0)=255:addr(2) # r%(0)=0 :addr(10):addr(14) s os%<32:ș "OS_File",r%(0),$fn%,X%!2,X%!6,X%!10,X%!14 r%(0),,X%!2,X%!6,X%!10,X%!14 r%(0)=file($fn%,r%(0)) . A%=2 14 4:mem%!(r%(1)+A%)=X%!A%::=0 -addr(A%):X%!A%<&10000:X%!A%=mem%+A%!X%  /ݤ_EMT8 : OSARGS ) os%=32: A%=0: r%(1)=0:r%(0)=29:=0 / A%=0: r%(1)=0: Y%:r%(0)=(&FFDA)&FF:=0  r%(1)=0 r%(1)=&FFFF  Ȏ A% % 0:mem%!r%(2)=0:=0 : =PTR#0/-1 % 1:=0 : PTR#0/-1= % 2:mem%!r%(2)=0:=0 : =EXT#0/-1 % 3:=0 : EXT#0/-1= ' 4:mem%!r%(2)=0:=0 : =Alloc#0/-1 $% 5:mem%!r%(2)=0:=0 : =EOF#0/-1 .' 6:=0 : Alloc#0/-1= 8 B L Ȏ A% V 0:mem%!r%(2)=#r%(1):=0 ` 1:#r%(1)=mem%!r%(2):=0 j 2:mem%!r%(2)=#r%(1):=0 t 3:#r%(1)=mem%!r%(2):=0 ~ 4:mem%!r%(2)=#r%(1):=0  5:mem%!r%(2)=#r%(1):=0  6:#r%(1)=mem%!r%(2):=0  255:os%=32:=0  /mem%!r%(1)=args(r%(0),r%(1),mem%!r%(2)):=0  =0 ,ݤ_EMT9: r%(1)=0:r%(0)=:=0 : OSBGET os%=32:r%(0)=#r%(1):=0 ? Y%:Y%=r%(1):A%=&FFD7:r%(0)=A%&FF:carry(A%&1000000):=0 6ݤ_EMTA:r%(1)=0: A%:=0 #r%(1),A%:=0 : OSBPUT /ݤ_EMTB : OSGBPB ' A%=0 12:X%?A%=mem%?(r%(1)+A%):  &B%=(X%!1<&10000):addr(1):A%=r%(0) 4 ?X%=0:A%=1A%=2:?(X%!1):X%!5=X%!5-1:X%!5<1 5 ?X%=0:A%=3A%=4:?(X%!1)=:X%!5=X%!5-1:X%!5<1 (, ?X%:f_gbpb(r%(0),X%?0,X%!1,X%!5,X%!9) 2 B%:X%!1=X%!1-mem% <' A%=0 12:mem%?(r%(1)+A%)=X%?A%: F=0 P/ݤ_EMTC : OSFIND Z A%=0:#r%(1):=0 d4 (A%&C0)=&40:r%(0)=f_openin($(mem%+r%(1))):=0 n5 (A%&C0)=&80:r%(0)=f_openout($(mem%+r%(1))):=0 x4 (A%&C0)=&C0:r%(0)=f_openup($(mem%+r%(1))):=0 =0 ,ݤ_EMTD : SYS +A%=0:r%(1):=_BASIC($(mem%+r%(1))):=0 "A%=0:r%(1)=0:=_BASIC(""):=0 CA%=1 A%=2:err%=err0%:escflg%=err%+255:!escb%=mem%+escflg%:=0 =0 0ݤ_EMTE:r1%=r%(1):r2%=r%(2) : HANDLER S A%=&FFFE:r%(2)=escflg%:r2%:escflg%=r2%:!escb%=mem%+escflg% : Escape handler R A%=&FFFD:r%(1)=errvec%:r1%:errvec%=r1% : Error handler R A%=&FFFD:r%(2)=err% :r2%:err%=r2% : Error handler =0 .ݤ_EMTF:=0 : ERROR ݤ_EMT(A%):=0 :  > Unix  PDP11 Unix Trap functions "7 v0.15 04-Mar-2006 JGH: Separated out from PDP11Em ,C 17-Mar-2006 JGH: read/write done, added exit,open,close 6( v0.16 20-May-2006 JGH: Added indir @= v0.17 20-Feb-2009 JGH: Added rudimentary SIGINT capture J@ v0.23 17-Jun-2010 JGH: TRAP0 calls TRAPn instead of TRAPnn T> v0.24 02-Jul-2010 JGH: TRAPB and TRAP3B execute commands ^C v0.25 20-Jan-2012 JGH: brk(), pipe() fetch correct parameters h: rCݤ_TRAP0: indir - entry: (pc+0)=>TRAP instruction, parameters |Qr7%=mem%!r%(7)&FFFF : Address of ind'ed TRAP instruction Cdd%=mem%!r7%255:r7%=r7%+2:ind%=r%(7)+2 : Get TRAP instruction ? dd%<&40:A%=("FN_TRAP"+~dd%) A%=("FN_TRAP("+dd%+")") r7%=r%(7)+2:ind%=0:=A% : (ݤ_TRAP1: exit - entry: r0=status  halt%= =0 : ݤ_TRAP2: fork - 3 - exit: r0=new process ID =0 : Fݤ_TRAP3: read - entry: r0=filedes, (pc+0)=buffer, (pc+2)=count / exit: r0=byte count >buffer%=mem%!r7%&FFFF:count%=mem%!(r7%+2)&FFFF:r7%=r7%+4 Jr%(0)<3:"FX126":A%=0count%-1:mem%?(buffer%+A%)=::r%(0)=count%:=0 &:gbpb(4,r%(0),mem%+buffer%,count%,0):r%(0)=count%-X%!5 0=0 :: DFݤ_TRAP4: write - entry: r0=filedes, (pc+0)=buffer, (pc+2)=count N/ exit: r0=byte count X>buffer%=mem%!r7%&FFFF:count%=mem%!(r7%+2)&FFFF:r7%=r7%+4 b@r%(0)<3:A%=0count%-1:mem%?(buffer%+A%)::r%(0)=count%:=0 l:gbpb(2,r%(0),mem%+buffer%,count%,0):r%(0)=count%-X%!5 v=0 : 8ݤ_TRAP5: open - entry: (pc+0)=>name, (pc+2)=mode , exit: r0=filedes Cname%=mem%!r7%&FFFF:mode%=mem%!(r7%+2)&FFFF:r7%=r7%+4:r%(0)=0 /mode%=0:r%(0)=f_openin(str0(mem%+name%)) 0mode%=1:r%(0)=f_openout(str0(mem%+name%)) /mode%=2:r%(0)=f_openup(str0(mem%+name%)) $r%(0)=0:r%(0)=&FFFF:psw%=psw%1 =0 : )ݤ_TRAP6: close - entry: r0=filedes r%(0)>2:#r%(0) =0 :  ݤ_TRAP7: wait - :=0 exit: r0=process ID, r1=status  : *8ݤ_TRAP8: creat - entry: (pc+0)=>name, (pc+2)=mode 4, exit: r0=filedes >;name%=mem%!r7%&FFFF:mode%=mem%!(r7%+2)&FFFF:r7%=r7%+4 Hname1, (pc+2)=>name2 pr7%=r7%+4:r%(0)=&FFFF:=0 z: +ݤ_TRAPA: unlink - entry: (pc+0)=>name *name%=mem%!r7%&FFFF:r7%=r7%+2:r%(0)=0 name, (pc+2)=>argv ;name%=mem%!r7%&FFFF:mode%=mem%!(r7%+2)&FFFF:r7%=r7%+4 ^str0(mem%+(mem%!mode%&FFFF))="sh":cmd(str0(mem%+(mem%!(mode%+4)&FFFF)),):r%(0)=0:=0 =0 : .ݤ_TRAPC: chdir - entry: (pc+0)=>dirname *name%=mem%!r7%&FFFF:r7%=r7%+2:r%(0)=0 Bos%<7:"DIR "+str0(mem%+name%) "chdir "+str0(mem%+name%) =0 : ݤ_TRAPD: time - $7 exit: r0:r1=time since 1970 .3!zp%= 100:r%(1)=!zp%&FFFF:r%(0)=zp%!2 &FFFF 8=0 B: LEݤ_TRAPE: mknod - entry: (pc+0)=>name, (pc+2)=mode, (pc+4)=addr V;name%=mem%!r7%&FFFF:mode%=mem%!(r7%+2)&FFFF:r7%=r7%+6 `9(mode%16384):A%=file(8,f_name(str0(mem%+name%))) j=0 t: ~Fݤ_TRAPF :r7%=r7%+4:=0: chmod - entry: (pc+0)=>name, (pc+2)=mode Uݤ_TRAP10:r7%=r7%+6:=0: chown - entry: (pc+0)=>name, (pc+2)=owner, (pc+4)=group : +ݤ_TRAP11: brk - entry: (pc+0)=addr =r%(6):psw%=psw%1 =0 : 9ݤ_TRAP12: stat - entry: (pc+0)=>name, (pc+2)=>buf Ename%=mem%!r7%&FFFF:buffer%=mem%!(r7%+2)&FFFF:r7%=r7%+4:r%(0)=0 offsethi, (pc+2)=>offsetlo, (pc+4)=whence  ]offset%=(mem%!(r7%+2)&FFFF)(mem%!(r7%-2)&FFFF0000):where%=mem%!(r7%+4)&FFFF:r7%=r7%+6 r%(0)<3:r%(0)=0:r%(1)=0:=0 where%=0:#r%(0)=offset% (%where%=1:#r%(0)=#r%(0)+offset% 2%where%=2:#r%(0)=#r%(0)+offset% <5r%(1)=#r%(0):r%(0)=r%(1)65536:r%(1)=r%(1)&FFFF F=0 P: Z:ݤ_TRAP14:r7%=r7%+0:=0: getpid - exit: r0=process ID dYݤ_TRAP15:r7%=r7%+6:=0: mount - entry: (pc+0)=>special, (pc+2)=>name, (pc+4)=rwflag n<ݤ_TRAP16:r7%=r7%+2:=0: umount - entry: (pc+0)=>special x3ݤ_TRAP17:r7%=r7%+0:=0: setuid - entry: r0=uid Jݤ_TRAP18:r7%=r7%+0:=0: getuid - exit: r0=real uid, r1=effective uid Bݤ_TRAP19:r7%=r7%+0:=0: stime - entry: r0:r1=time since 1970 ]ݤ_TRAP1A:r7%=r7%+6:=0: ptrace - entry: r0=data, (pc+0)=pid, (pc+2)=addr, (pc+4)=request 8 exit: r0=value !ݤ_TRAP1B:r7%=r7%+0:=0: [27] Eݤ_TRAP1C:r7%=r7%+2:=0: fstat - entry: r0=filedes, (pc+0)=>buff "ݤ_TRAP1D:r7%=r7%+0:=0: pause Gݤ_TRAP1E:r7%=r7%+4:=0: utime - entry: (pc+0)=>file, (pc+2)=timep Dݤ_TRAP1F:r7%=r7%+2:=0: stty - entry: r0=filedes, (pc+0)=argp Dݤ_TRAP20:r7%=r7%+2:=0: gtty - entry: r0=filedes, (pc+0)=argp !ݤ_TRAP21:r7%=r7%+0:=0: [33] 8ݤ_TRAP22:r7%=r7%+0:=0: nice - entry: r0=priority :ݤ_TRAP23:r7%=r7%+2:=0: ftime - entry: (pc+0)=bufptr : ݤ_TRAP24: sync A%=&FF:=_EMT8 ": ,?ݤ_TRAP25:r7%=r7%+2:=0: kill - entry: r0=pid, (pc+0)=sig 6Fݤ_TRAP26:r%(0)=&FFFF:=0: switch - exit: r0=front panel switches @!ݤ_TRAP27:r7%=r7%+0:=0: [39] J!ݤ_TRAP28:r7%=r7%+0:=0: [40] TEݤ_TRAP29:r7%=r7%+0:=0: dup2 - entry: r0=filedes1, r1=filedes2 ^> exit: r0=new filedes hNݤ_TRAP2A:r7%=r7%+0:=0: pipe - exit: r0=read filedes, r1=write filedes r:ݤ_TRAP2B:r7%=r7%+2:=0: times - entry: (pc+0)=buffer |eݤ_TRAP2C:r7%=r7%+8:=0: profil - entry: (pc+0)=buff, (pc+2)=bufsize, (pc+4)=offset, (pc+6)=scale ,ݤ_TRAP2D:r7%=r7%+0:=0: tui - [null] 3ݤ_TRAP2E:r7%=r7%+0:=0: setgid - entry: r0=gid Jݤ_TRAP2F:r7%=r7%+0:=0: getgid - exit: r0=real gid, r1=effective gid : 7ݤ_TRAP30: signal - entry: (pc+0)=sig, (pc+2)=func . exit: r0=old func |(mem%!r7%&FFFF)=2:A%=mem%!(r7%+2)&FFFF: A%: mem%!(A%+4)=&FF95F7:escflg%=A%+10+mem%!(A%+8)&FFFF:!escb%=mem%+escflg% r7%=r7%+4:=0 : !ݤ_TRAP31:r7%=r7%+0:=0: [49] !ݤ_TRAP32:r7%=r7%+0:=0: [50] 8ݤ_TRAP33:r7%=r7%+2:=0: acct - entry: (pc+0)=file Wݤ_TRAP34:r7%=r7%+6:=0: phys - entry: (pc+0)=segreg, (pc+2)=size, (pc+4)=physadr 8ݤ_TRAP35:r7%=r7%+2:=0: lock - entry: (pc+0)=flag Xݤ_TRAP36:r7%=r7%+6:=0: ioctl - entry: (pc+0)=filedes, (pc+2)=request, (pc+4)=argp !ݤ_TRAP37:r7%=r7%+0:=0: [55] &Wݤ_TRAP38:r7%=r7%+8:=0: mpxchan- entry: (pc+0)=??, (pc+2)=??, (pc+4)=??, (pc+6)=?? 0!ݤ_TRAP39:r7%=r7%+0:=0: [57] :!ݤ_TRAP3A:r7%=r7%+0:=0: [58] D: NHݤ_TRAP3B: exece - entry: (pc+0)=>name, (pc+2)=>argv, (pc+4)=>envp X;name%=mem%!r7%&FFFF:mode%=mem%!(r7%+2)&FFFF:r7%=r7%+6 b^str0(mem%+(mem%!mode%&FFFF))="sh":cmd(str0(mem%+(mem%!(mode%+4)&FFFF)),):r%(0)=0:=0 l=0 v: =ݤ_TRAP3C:r7%=r7%+2:=0: umask - entry: (pc+0)=complmode <ݤ_TRAP3D:r7%=r7%+2:=0: chroot - entry: (pc+0)=>dirname !ݤ_TRAP3E:r7%=r7%+0:=0: [62] !ݤ_TRAP3F:r7%=r7%+0:=0: [63] ݤ_TRAP(A%):=0 : 1ݤstr0(A%):A$="": ?A%>31:A$=A$+?A%:A%=A%+1 ?A%<32 A$>254:=A$ Aݤstr(A%): B$,B%::B%=!A%&FFFF:B%:B$=B$+" "+str0(mem%+B%) A%=A%+2:B%=0:=B$ : 1 > DisPDP 1.00 - PDP-11 disassembly routines %ݤDis_Name(A%):X%?3=&14:="PDP-11" !5ݤDis_Code(A%,Ptr%,Data%): s%,d%,c%:!X%=0:num%=2 ! ;c%=!Data%:s%=(c%&0FC0)64:d%=c%63:c%=(c%&F000)&1000 ! $(X%+4)=pdp:X%?3=num%:=num% ! : !* ݤpdp !4 x0 50-63 xx: !>q(c%7)=0: s%>39: s%<52:="CLRCOMINCDECNEGADCSBCTSTRORROLASRASL",3*(s%-40)+1,3)+" B",c%8+1,1)+" "+mr(d%) !H) x1, x2, x3, x4, x5 else x0, x6, x7: !Rp((c%-1)&7)<5:="MOVCMPBITBICBIS",(c%7)*3-2,3)+" B",c%8+1,1)+" "+mr(s%)+","+mr(d%) =("FNpdp_"+~c%) !\: !f(ݤpdp_F:="FLOP "+mr(s%)+","+mr(d%) !p: !z(ݤpdp_E:="SUB "+mr(s%)+","+mr(d%) !: !Qݤpdp_8: s%<32:="BPLBMIBHIBLSBVCBVSBCCBCS",3*((s%4))+1,3)+" "+jr(?Data%) !# s%<36:="EMT &"+h0(?Data%,2) !# s%<40:="TRAP &"+h0(?Data%,2) ! s%=52:="MTPS "+mr(d%) ! s%=53:="MFPD "+mr(d%) ! s%=54:="MTPD "+mr(d%) ! s%=55:="MFPS "+mr(d%) !="EQUB &"+h0(!Data%,4) !: ! ݤpdp_7 !> s%<40:="MUL DIV ASH ASHCXOR ",3*(s%8)+1,4)+" "+mr(d%) !A s%=40: d%<32:="FADDFSUBFMULFDIV",3*(d%8)+1,4)+" "+r(d%) "9(s%&38)=&38:="SOB "+r(s%)+","+jr(d%-192*(d%>31)) "="EQUB &"+h0(!Data%,4) ": "$(ݤpdp_6:="ADD "+mr(s%)+","+mr(d%) ".: "8Sݤpdp_0: s%<32: s%>3:="BR BNEBEQBGEBLTBGTBLE",3*(s%4)-2,3)+" "+jr(?Data%) "B^ s%=0: d%<7:="HALTWAITRTIBPTIOTRESETRTT",d%*4+1+(d%>2)+(d%>3)+(d%=5),4+(d%>1)-2*(d%>4)) "L s%=1:="JMP "+mr(d%) "V! s%=2: d%<8:="RTS "+r(d%) "`) s%=2:(d%&38)=&18:="SPL "+(d%7) "j/ s%=2:(d%&30)=&20:="CCC &"+h0(d%&F,2) "t/ s%=2:(d%&30)=&30:="SCC &"+h0(d%&F,2) "~ s%=3:="SWAB "+mr(d%) "/(s%&38)=&20:="JSR "+r(s%7)+","+mr(d%) " s%=52:="MARK &"+h0(d%,2) " s%=53:="MFPI "+mr(d%) " s%=54:="MTPI "+mr(d%) " s%=55:="SXT "+mr(d%) "="EQUB &"+h0(!Data%,4) ": ";ݤr(A%):A%=A%7: A%=7:="PC" A%=6:="SP" ="R"+ A% ".ݤmr(A%): m%:m%=(A%&38)8:(A%7)=7:=pc " m%=0:=r(A%) " m%=1:="("+r(A%)+")" " m%=2:="("+r(A%)+")+" # m%=3:="@("+r(A%)+")+" #  m%=4:="-("+r(A%)+")" # m%=5:="@-("+r(A%)+")" #@ m%=6:num%=num%+2:="&"+h0(Data%!(num%-2),4)+"("+r(A%)+")" #(A m%=7:num%=num%+2:="@&"+h0(Data%!(num%-2),4)+"("+r(A%)+")" #2="" #<ݤpc #F m%=0:="PC" #P m%=1:="(PC)" #Z2 m%=2:num%=num%+2:="#&"+h0(Data%!(num%-2),4) #d3 m%=3:num%=num%+2:="@#&"+h0(Data%!(num%-2),4) #n m%=4:="-(PC)" #x m%=5:="@-(PC)" #8 m%=6:num%=num%+2:="&"+h0(Ptr%+4+Data%!(num%-2),4) #9 m%=7:num%=num%+2:="@&"+h0(Ptr%+4+Data%!(num%-2),4) #: #Kݤjr(A%): A%<128:="&"+h0(Ptr%+A%*2+2,4) ="&"+h0(Ptr%+A%*2+2-512,4) #: #" > BLib.String 1.00 09Aug1998 #: ## String Manipulation Functions ## ============================= #: #7 FNs() - strip spaces from start and end of string #7 ------------------------------------------------- #/ݤs(A$):A$,1)=" ":A$=A$,2):A$,1)<>" " $+A$,1)=" ":A$=A$,A$-1):A$,1)<>" " $=A$ $: $"+ FNuc() - convert string to upper case $,+ ------------------------------------- $6ݤuc(A$): B$:A$="":="" $@5B$=B$+(A$((A$<"@")&DF)):A$=A$,2):A$="":=B$ $J: $T+ FNlc() - convert string to lower case $^+ ------------------------------------- $hݤlc(A$): B$:A$="":="" $r5B$=B$+(A$((A$<"_")&20)):A$=A$,2):A$="":=B$ $|: $" > BLib.Number 1.01 09Aug1988 $( v1.00 09Aug1988 JGH: First version $1 v1.01 12Feb1992 JGH: Added Octal and Binary $? v1.02 15Sep2009 JGH: Octal and Binary works for &8xxxxxxx $: $ Number Output Routines $ ~~~~~~~~~~~~~~~~~~~~~~ $: $# Hexadecimal padded with zeros $$ݤh0(A%,N%):="0000000"+~A%,N%) $: $$ Hexadecimal padded with spaces $#ݤh(A%,N%):=" "+~A%,N%) %: % Decimal padded with zeros %$ݤd0(A%,N%):="00000000"+A%,N%) %&: %0 Decimal padded with spaces %:$ݤd(A%,N%):=" "+A%,N%) %D: %N Octal padded with zeros %X5ݤo0(A%,N%): A$,B%,L%:A%<0:B%=2:A%=A%&7FFFFFFF %b;A$=(A%7)+A$:A%=A%8:L%=L%+3:L%>27:=(A%+B%)+A$,N%) %l: %v Octal padded with spaces %%ݤo(A%,N%): A$:A%<0:=o0(A%,N%) %2A$=(A%7)+A$:A%=A%8:A%=0:=N%," ")+A$,N%) %: % Binary padded with zeros %>ݤb0(A%,N%): A$,B$,L%:B$="0":A%<0:B$="1":A%=A%&7FFFFFFF %5A$=(A%1)+A$:A%=A%2:L%=L%+1:L%>30:=B$+A$,N%) %: % Binary padded with spaces %%ݤb(A%,N%): A$:A%<0:=b0(A%,N%) %2A$=(A%1)+A$:A%=A%2:A%=0:=N%," ")+A$,N%) %: %) Drive character for supplied number % ݤdrv(A%):=(48+A%-7*(A%>9)) &: & ) Drive number for supplied character &#ݤDrv(A$):=A$-48+7*(A$>"9")31 & : &*# > BLib.ProgEnv 1.04 09Jan2007 &4: &># Program Environment Functions &H# ============================= &R: &\? Return command line tail, sets run$ to execution filename &f; Works with BASIC on I/O,T6502,Arc,TZ80BBC,PC,Win,TARM &p; Needs: 270 free bytes above end of heap for temp. w/s &z? --------------------------------------------------------- &@ݤOS_GetEnv:A$,A%,X%,Y%:X%=1:os%=((&FFF4)&FF00)256:X%-1 &Jos%=32:>&FFFF:ș"GetModuleFileName",0,X%,255:A$=$$X%:run$=A$:=@cmd$ &os%=32:A$=$&100 &{A$=0:>&7FFF:run$=$&8100:ș"OS_GetEnv"A$,,A%:ș"OS_WriteEnv","",A%:A$=A$,1+A$+" "," ",1+A$," "))):A$=0:A$=run$ &2A$=0:?(P-3):A$=$&600 A$=0:A$=$(-&300) &7A%=A$+" "," "):run$=A$,A%-1):run$<>"":=A$,A%+1) &bY%=X%256:A%=9:?X%=0:X%!1=X%+16:X%!16=0:&FFD1:A%=X%+16:!A%?A%+A%?2<>8:A%?(A%+1)=13:=$(A%+1) &="" &: &. Run a program, passing it a command line &= If program is *Command, called with OSCLI, else CHAINed &= ------------------------------------------------------- &&os(A$):A$=42:A$ A$<>"":A$ ' ': '( Exit program, setting return value '$( ---------------------------------- '.@exit(A%):"FX1,"+A%:quit$=quit$:A$=quit$:quit$="":os(A$) '8os%=32:Ș A% 'Bos%<6: *Quit 'L 'V: '`* > BLib.Generic.FileIO 1.02 28Apr2007 'j< v1.03 15Feb2008 JGH: Add veneer functions in f_ domain 'tP v1.02 28Apr2007 JGH: Added functions to FNfile on DOS, PROCcdir, FNopenout '~< v1.01 07Sep2006 JGH: FNargs avoid zero page on RISC OS '* v1.00 09Aug1988 JGH: Initial version ': '% General File Interface Routines '% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ': '8 FNfile(), PROCgbpb(), FNfs are callable on Windows '8 -------------------------------------------------- ': ', Returns file type, file info in X%!... ', -------------------------------------- 'ݤf_info(A$)=file(A$,5) 'Nݤfile(A$,A%):(os%32)=0:$name%=A$:?X%=name%:X%?1=name%256:=(&FFDD)&FF (JA$=f_name(A$):A%=255 A%=5:X%!14=(A$):X%!14:X%!10=#X%!14:#X%!14 ( 1A%=255:X%?6=0:"LOAD """+A$+""" "+~X%!2:=1 (A%=5:X%!14:=1 A%=5:=0 (FA%=0:"SAVE """+A$+""" "+~X%!10+" "+~X%!14:X%!10=X%!14-X%!10:=1 ((BA%=7:"SAVE """+A$+""" "+~+"+"+~X%!10:X%!10=X%!14-X%!10:=1 (2 A%=8 (< : :=2 (F"mkdir "+A$:=2 (P (Z=0 (d: (n General OSGBPB call (x ------------------- (4f_gbpb(A%,C%,D%,N%,P%):gbpb(A%,C%,D%,N%,P%): (#gbpb(A%,chn%,addr%,num%,ptr%) (@?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:(os%32)=0:&FFD1: (A%=1A%=3:#?X%=X%!9 (5:A%=1A%=2:#?X%,?X%!1 A%=3A%=4:?X%!1=#?X% (5X%!1=X%!1+1:X%!5=X%!5-1:(#?X% A%>2) X%!5<1: (: (@ Return current disk (5), directory (6) or library (7) name (@ ---------------------------------------------------------- (Bݤgbpb(A%):X%!1=data%:&FFD1:A%=data%+((1+?data%)((A%-2)=6)) (A%?(1+?A%)=13:=$(A%+1) (: (B Returns entry in current directory, or null string if at end )B ------------------------------------------------------------ )ݤf_scan(A%)=gbpb8(A%) )Eݤgbpb8(ptr%):X%!1=data%:X%!5=1:X%!9=ptr%:A%=8:&FFD1:X%!5=1:="" )"#A%=data%:A%?(1+?A%)=13:=$(A%+1) ),: )67 OSARGS call with data. Returns any returned data )@7 ------------------------------------------------- )J&ݤf_args(A%,B%,C%)=args(A%,B%,C%) )T4ݤargs(A%,Y%,ptr%): X%,E%:?(P-3)=0:E%=Y%:Y%=0 )^ )h& !&70:X%=&70:!X%=ptr%:&FFDA:=!X% )r )|#ș"OS_Args",A%,Y%,ptr% ,,ptr% ) :=ptr% ): )' OSARGS call ignoring X, returns A )' --------------------------------- )ݤf_argsA(A%)=argsA(A%) )ݤargsA(A%): )( X%,Y%,E%,!&70:X%=&70:=(&FFDA)&FF ) )ș"OS_Args",A% A% ) :=A% ): )& Get current filing system number )& -------------------------------- *-ݤfs:(os%32)=0: A%,Y%,E%:=(&FFDA)&FF *=29 *: *&1 Create a directory only if it doesn't exist *01 ------------------------------------------- *:+f_cdir(A$):os%40:A%=f_info(8,A$): *D f_info(A$,5)=0:"CDIR "+A$ *N *X: *b. Open an input file ensuring no extension *l. ---------------------------------------- *v!ݤf_openin(A$)=(f_name(A$)) *: */ Open an output file ensuring no extension */ ----------------------------------------- *"ݤf_openout(A$)=(f_name(A$)) *: */ Open an update file ensuring no extension */ ----------------------------------------- *!ݤf_openup(A$)=(f_name(A$)) *: *Vݤf_name(A$):os%32:A%,B%:B%=A%:A%=A$,"\",A%+1):A%=0:A$,".",B%)=0:A$=A$+"." *=A$ *! > BLib.Close 1.00 09Aug1998 *: + Close Handling +  ~~~~~~~~~~~~~~ +: + Close_All +*"in%=in%:in%:A%=in%:in%=0:#A% +4'out%=out%:out%:A%=out%:out%=0:#A% +>