> Startup ) 6502 Tube Emulator written in BASIC , v0.10 Initial program based on PDP11Em (+ v0.11 &x3 opcodes interface with host 2& v0.12 Uses runpath for resources <2 v0.13 Updated with same base code as PDPTube F: P% :Close_All:" at line ";: ZNA$=OS_GetEnv:ver$="0.13":debug%=0:Init:A%=_DEBUG(debug%):quiet%=A$<>"" d A$="":"6502 Emulator v"ver$" (C)2006 J.G.Harston"'"Memory start: &"h0(mem%,8)" MemSz: &"h0(mz%,6)" MemMsk: &"h0(mm%,6) nW A$="":"Program space: &"h0(mbot%,6)"-&"h0(mtop%,6)" ";(mtop%-mbot%);" bytes"' x Error:A$=""  A$<>"":A%=_RUN(A$)  run%:Go  quiet%:A%=_QUIT("") ! "65Em* "A$:cmd(A$,0):0  : Init 5d$=".":s$="/":os%>6:d$="/":s$=".":os%=32:d$="\" Hrunpath$=run$: runpath$,1)="""":runpath$=runpath$,2, runpath$-2) 1 runpath$=runpath$): d$+":",runpath$,1)) Ros%=32:mx%=@vdu%!208:my%=@vdu%!212:mw%=@vdu%!216:mh%=@vdu%!220:mc%=@vdu%?73+1 3mz%=memsize:mm%=mz%-1:mtop%=mz%:mbot%=0:run%= Q ctrl% 31,name% 79,zp% 7,mem% mz%:trace0%=0:trace1%=&FFFF:X%=ctrl%:Y%=X%256 +ra%=0:rx%=0:ry%=0:rp%=0:rs%=&1FF:rpc%=0 -osw0%=:err%=&100:escflg%=&FF:prog%=&F800  Initial state: "="Load """+f_name(runpath$+"TOS64")+""" "+~(mem%+&F800) ,DA%=mem%!&FFB7 &FFFF: B%=0 &35:mem%?(B%+&200)=mem%?(A%+B%): 6/mem%!&F0=&800:mem%!&F4=&8000:mem%?escflg%=0 @EscInit: J: T>ݤmemsize:A%=2^((--1024)/2): A%<&10000:=A% =&10000 ^: h+Error:X%=ctrl%:Y%=X%256: -1:run%= rM run%::Close_All:" ("+~B%+") at "+Þ,<128 <>17): -1:RegDump |I =25:run%: os%=32:run%=: 23,22,mx%;my%;mw%,mh%,mc%,128:run%=: 3 =17:mem%?255=255:rp%=rp%(osw0%1):osw0%=: P run%:mem%!err%=*256:$(mem%+err%+2)=$+0:rpc%=err%:=17:mem%?escflg%=&FF  : Ccmd(A$,link%): A$<>"": A$,1)=" ": A$=A$,2): A$,1)<>" "  A$=""A$,1)="|":  A$,1)="*": A$,2):  A$,1)=".": "."+A$,2): ! A$,1)="/":A$="RUN "+A$,2) 7 uc(A$,2))="FX": A$,3) (A$,3,1)="0"):A$: 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$):'"6502 Emulator ";ver$: uc(A$)<>"6502":=0 &b" BASIC"'" CORE "'" DEBUG [ [ ]]"'" GO ()"'" HELP" 0T" LOAD "'" MDUMP "'" MDIS "'" QUIT"'" RUN " :=0 D: N!ݤ_MDIS(A$): N%,P%,C%:EscOn X5P%=("&"+A$)::C%=16:h0(P%,4);" ";:A$=dis(P%) b- A%=0 N%-1:h0(mem%?(P%+A%),2);" ";: l?(17-3*N%);: A%=0 N%-1:c(mem%?(P%+A%));::(7-N%);A$ v%P%=P%+N%:C%=C%-1:C%=0:C%=:0:=0 : "ݤ_MDUMP(A$): N%,P%,C%:EscOn /P%=("&"+A$):N%=16::C%=16:h0(P%,4);" "; - A%=0 N%-1:h0(mem%?(P%+A%),2);" ";: ( A%=0 N%-1:c(mem%?(P%+A%));:: %P%=P%+N%:C%=C%-1:C%=0:C%=:0:=0 : 0ݤ_BASIC(A$): =FN_RUN("<65Tube$Basic> "+A$) 9"BASIC"':=_RUN(""""+runpath$+f_name("Basic")+"""") : !ݤ_QUIT(A$): A$:halt%=:=0 =Close_All: IF os%=32:PRINT"Press SPACE to exit";:A%=GET "QUIT":=0 :  ݤ_RUN(A$):=_run(A$,) 6ݤ_run(A$,osc%):ȕ A$,1)=" ":A$=A$):: A$="":=0  ] osc%=0 - called from *RUN, */, must attempt to load file; osc%=TRUE - called from *name *3A$,1)="""":A%=A$,"""",2)+1 A%=A$+" "," ") 4C$=A$:F$=f_name(A$,A%-1)) >UX%!2=0:A%=file(F$,5): A%:A%=X%!2 A%=-1 : A%=load or 0=dos or -1=not found H@(A%&FFFFFF00)=&FFFBBC00:A%=&8000 : ROM image RS(A%&FFF00000)=&FFF00000:A%=-1 : Attempt to run in I/O memory \[A%=-1: "/",osc%)+C$:=0 : If not found or I/O, pass to OSCLI and return f A%=0 pBin%=(F$):gbpb(4,in%,name%,80,0):#in%:in%=0 : Read header z$A%=name%?7:name%!A%=&29432800 (A%=A%+1:name%?A%=0:A%=name%!(A%+1) 0 (name%?6 64)=0: 247,"Not a language":=0 / (name%?6 15)>3: 247,"Not 6502 code":=0  (name%?6 32)=0:A%=&8000  ; 254,"No file header":=0 : No header   "Load "+F$+" "+~(mem%+A%) Crpc%=A%:=_go : Enter code : ݤ_LOAD(A$):A%=A$," ") E A%=0:F$=f_name(A$) F$=f_name(A$,A%-1)):A%=("&"+A$,A%+1)) Z A%=0:X%!2=0: file(F$,5):A%=X%!2 A%=0:A%=-1 : A%=load or 0=dos or -1=not found @(A%&FFFFFF00)=&FFFBBC00:A%=&8000 : ROM image  A%=0 $Bin%=(F$):gbpb(4,in%,name%,80,0):#in%:in%=0 : Read header .$A%=name%?7:name%!A%=&29432800 8(A%=A%+1:name%?A%=0:A%=name%!(A%+1) B0 (name%?6 64)=0: 247,"Not a language":=0 L/ (name%?6 15)>3: 247,"Not 6502 code":=0 V (name%?6 32)=0:A%=&8000 ` j; 254,"No file header":=0 : No header t ~ K"Load "+F$+" "+~(mem%+A%):=A% : Return address loaded to : 6ݤ_GO(A$): A$="":rpc%=mem%!&FFFC rpc%=("&"+A$) Yݤ_go:ra%=0:rx%=0:ry%=0:rp%=0 : Initialise registers to enter code *mem%!(rpc%+mem%?(rpc%+7))=&29432800 ?prog%=rpc%:A%=rpc%+8:A%=A%+1 : Code header: Imem%?A%=0:mem%?&FD=A%:mem%?&FE=A%256 : Point to version string Imem%?&EE=prog%:mem%?&EF=prog%256 : Set current program Lmem%?&F4=prog%:mem%?&F5=prog%256 : Set top of user memory Srs%=&1FF:ra%=1 : Clear stack, enter with A=1  Z$(mem%+&236)=A$:mem%?&F2=&36:mem%?&F3=2 : Store command string and pointer FGo:=0 : Start execution  : ݤ_CORE(A$): Dump core 'A$=f_name(s(A$,A$+" "," ")-1))) ($"Save "+A$+" "+~mem%+"+"+~mz% 2SetType(A$,&FFD) <=0 F: P=ݤ_DEBUG(A$):A$="":"1=Register Dump"'"3=Single Step":=0 Z7debug%=0:trace0%=0:trace1%=&FFFF: uc(A$)="OFF":=0 d,debug%=(A$):(debug%1): <9: : >8 n6A%=A$," "): A%:trace0%=(A$,A%+1)):A$=A$,A%+1) x)A%=A$," "): A%:trace1%=(A$,A%+1)) =0 : SetType(A$,A%): os%>8: "SetType "+A$+" "+~A%  : 3ݤc(A%):A%=A%255: A%<32 A%>126:="." = A% 1ݤstr0(A%):A$="": ?A%>31:A$=A$+?A%:A%=A%+1 ?A%<32 A$>254:=A$ : SRegDump:"A=&"h0(ra%,2)" X=&"h0(rx%,2)" Y=&"h0(ry%,2)" P=&"h0(rp%,2);" "; J A%=7 0 -1:"-CZIDB5VN",(((rp%(2^A%))<>0)(A%+1))+1,1);::" " & "XY=&";:DumpLine(rx%+256*ry%):  " S=&";:DumpLine(rs%):  "PC=&";:DumpLine(rpc%) 4A%=Dis_Code(65,rpc%,mem%+rpc%):$(X%+4);(56-) "9 PRINT "2A=&";:PROCDumpLine(mem%!&2A AND&FFFF):PRINT ,9 PRINT "0B=&";:PROCDumpLine(mem%!&0B AND&FFFF):PRINT 69 PRINT "39=&";:PROCDumpLine(mem%!&39 AND&FFFF):PRINT @9 PRINT "19=&";:PROCDumpLine(mem%!&19 AND&FFFF):PRINT J# PRINT "15=&";FNh0(mem%?&15,2) T ^: h"DumpLine(m%): h0(m%,4)" "; r' B%=m% m%+7: c(mem%?B%);::32 |3 B%=m% m%+7: h0(mem%?(B%mm%)&FF,2)" ";:  : 8ݤdis(A%):N%=Dis_Code(65,A%,mem%+(A%mm%)):=$(X%+4) : 3ݤc(A%):A%=A%255: A%<32 A%>126:="." = A% 1ݤstr0(A%):A$="": ?A%>31:A$=A$+?A%:A%=A%+1 ?A%<32 A$>254:=A$ : "EscInit:esch%=esch%:esch%:  os%=32 C P% 36, L% -1:[OPT 8:.escyes:mov byte [edi-1],0:mov eax,-1:ret 8.esch%:mov ecx,256:mov edi,[@vdu%-148]:mov al,27:cld >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%: 0Los%<>32:ș "OS_ChangeEnvironment",9,esch%,0,0 ,escho%,escRo%,escbo%: ::"ESC OFF":escho%=: esch%:mem%?escflg%=&FF: D N%EscOn:escho%=escho%:escho%=0: XHos%<>32:ș "OS_ChangeEnvironment",9,escho%,escRo%,escbo%:escho%=0: b :escho%=0:"ESC ON": l: