> 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 ";: NZA$=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) Wn 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) D,A%=mem%!&FFB7 &FFFF: B%=0 &35:mem%?(B%+&200)=mem%?(A%+B%): /6mem%!&F0=&800:mem%!&F4=&8000:mem%?escflg%=0 @EscInit: J: >Tݤmemsize:A%=2^((--1024)/2): A%<&10000:=A% =&10000 ^: +hError:X%=ctrl%:Y%=X%256: -1:run%= Mr 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" T0" LOAD "'" MDUMP "'" MDIS "'" QUIT"'" RUN " :=0 D: !Nݤ_MDIS(A$): N%,P%,C%:EscOn 5XP%=("&"+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$ %vP%=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$) :"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$,) *ݤ_run(A$,osc%): A$,1)=" ":A$=A$): ]  osc%=0 - called from *RUN, */, must attempt to load file; osc%=TRUE - called from *name 3*A$,1)="""":A%=A$,"""",2)+1 A%=A$+" "," ") 4 A$="":=0 >C$=A$:F$=f_name(A$,A%-1)) URX%!2=0:A%=file(F$,5): A%:A%=X%!2 A%=-1 : A%=load or 0=dos or -1=not found @\(A%&FFFFFF00)=&FFFBBC00:A%=&8000 : ROM image Sf(A%&FFF00000)=&FFF00000:A%=-1 : Attempt to run in I/O memory [pA%=-1: "/",osc%)+C$:=0 : If not found or I/O, pass to OSCLI and return z A%=0 Bin%=(F$):gbpb(4,in%,name%,80,0):#in%:in%=0 : Read header $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 B8in%=(F$):gbpb(4,in%,name%,80,0):#in%:in%=0 : Read header $BA%=name%?7:name%!A%=&29432800 (LA%=A%+1:name%?A%=0:A%=name%!(A%+1) 0V (name%?6 64)=0: 247,"Not a language":=0 /` (name%?6 15)>3: 247,"Not 6502 code":=0 j (name%?6 32)=0:A%=&8000 t ;~ 254,"No file header":=0 : No header   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 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 7Zdebug%=0:trace0%=0:trace1%=&FFFF: uc(A$)="OFF":=0 ,ddebug%=(A$):(debug%1): <9: : >8 6nA%=A$," "): A%:trace0%=(A$,A%+1)):A$=A$,A%+1) )xA%=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 96 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 ^: "hDumpLine(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%: K0os%<>32: "OS_ChangeEnvironment",9,esch%,0,0 ,escho%,escRo%,escbo%: ::"ESC OFF":escho%=: esch%:mem%?escflg%=&FF: D %NEscOn:escho%=escho%:escho%=0: GXos%<>32: "OS_ChangeEnvironment",9,escho%,escRo%,escbo%:escho%=0: b :escho%=0:"ESC ON": l: v > 6502 : (Go:abort%=:halt%=0:run%=:EscOff b:(debug%1): rpc%>=trace0% rpc%<=trace1%:x%=:y%=:30:RegDump:31,x%,y%:(debug%2): |B%=mem%?rpc%:rpc%=rpc%+1: ("FNm"+~(B%&1C)+"+FN_"+~(B%(((B%1)<>1)&E3))):EscOn:run%=: quiet% abort%:RegDump  : : !ݤbr(A%):rpc%=rpc%+1:A%=0:=0 9mem%?(rpc%-1)<128:rpc%=(rpc%+mem%?(rpc%-1))&FFFF:=0 *rpc%=(rpc%+mem%?(rpc%-1)-256)&FFFF:=0 : : @ݤm0 :A%=(mem%!((mem%?rpc%+rx%)&FF))&FFFF:=0 : (zp,X) @ݤm4 :A%=mem%?rpc%:=0 : zp @ ݤm8 :A%=rpc%:=0 : #n ?ݤmC :A%=(mem%!rpc%)&FFFF:rpc%=rpc%+1:=0 : abs B ݤm10:A%=(mem%!(mem%?rpc%)+ry%)&FFFF:=0 : (zp),Y @*ݤm12:A%=(mem%!(mem%?rpc%))&FFFF:=0 : (zp) @4ݤm14:A%=(mem%?rpc%+rx%)&FF:=0 : zp,X ?>ݤm18:A%=(mem%!rpc%+ry%)&FFFF:rpc%=rpc%+(B%1):=0 : abs,Y AHݤm1C:A%=(mem%!rpc%+rx%)&FFFF:rpc%=rpc%+1:=0 : abs,X R: \: Sfݤ_1 :ra%=ra%mem%?A%:rp%=(rp%&7D)(ra%128)((ra%=0)2):rpc%=rpc%+1:=0 : ORA Rpݤ_21:ra%=ra%mem%?A%:rp%=(rp%&7D)(ra%128)((ra%=0)2):rpc%=rpc%+1:=0: AND Rzݤ_41:ra%=ra%mem%?A%:rp%=(rp%&7D)(ra%128)((ra%=0)2):rpc%=rpc%+1:=0: EOR ݤ_61:ra%=ra%+mem%?A%+(rp%1):rp%=(rp%254)+(ra%256):ra%=ra%255:rp%=(rp%&3D)(ra%128)(((ra%128)2)(ra%64))((ra%=0)2):rpc%=rpc%+1:=0 : ADC Wݤ_81:A%=rpc%:=_8A mem%?A%=ra%:rpc%=rpc%+1:=0 : STA Tݤ_A1:ra%=mem%?A%:rp%=(rp%&7D)(ra%128)((ra%=0)2):rpc%=rpc%+1:=0 : LDA ݤ_C1:A%=ra%-mem%?A%:rp%=(rp%254)+(((A%256)256)256):A%=A%255:rp%=(rp%&3D)(A%128)((A%=0)2):rpc%=rpc%+1:=0 : CMP ݤ_E1:ra%=ra%-mem%?A%-(1-(rp%1)):rp%=(rp%254)+(((ra%256)256)256):ra%=ra%255:rp%=(rp%&3D)(ra%128)(((ra%128)2)(ra%64))((ra%=0)2):rpc%=rpc%+1:=0 : SBC : @ݤ_12:=m12+_1 : ORA (zp) @ݤ_32:=m12+_21 : AND (zp) @ݤ_52:=m12+_41 : EOR (zp) @ݤ_72:=m12+_61 : ADC (zp) @ݤ_92:=m12+_81 : STA (zp) @ݤ_B2:=m12+_A1 : LDA (zp) @ݤ_D2:=m12+_C1 : CMP (zp) @ ݤ_F2:=m12+_E1 : SBC (zp)  :  : V$ ݤ_8 :mem%?rs%=rp%:rs%=rs%-1:=0 : PHP V. ݤ_28:rs%=rs%+1:rp%=mem%?rs%:=0 : PLP V8 ݤ_48:mem%?rs%=ra%:rs%=rs%-1:=0 : PHA VB ݤ_5A:mem%?rs%=ry%:rs%=rs%-1:=0 : PHY NL ݤ_68:rs%=rs%+1:ra%=mem%?rs%:rp%=(rp%&7D)(ra%128)((ra%=0)2):=0 : PLA NV ݤ_7A:rs%=rs%+1:ry%=mem%?rs%:rp%=(rp%&7D)(ry%128)((ry%=0)2):=0 : PLY V` ݤ_DA:mem%?rs%=rx%:rs%=rs%-1:=0 : PHX Nj ݤ_FA:rs%=rs%+1:rx%=mem%?rs%:rp%=(rp%&7D)(rx%128)((rx%=0)2):=0 : PLX t : ~ : 8 ݤ_10:=br((rp%128)128) : BPL : ݤ_30:=br(rp%128) : BMI 8 ݤ_50:=br((rp%64)64) : BVC : ݤ_70:=br(rp%64) : BVS < ݤ_80:=br(1) : BRA 8 ݤ_90:=br((rp%1)1) : BCC : ݤ_B0:=br(rp%1) : BCS 8 ݤ_D0:=br((rp%2)2) : BNE : ݤ_F0:=br(rp%2) : BEQ  :  : ; ݤ_18:rp%=rp%&FE:=0 : CLC < ݤ_38:rp%=rp%1:=0 : SEC ; ݤ_58:rp%=rp%&FB:=0 : CLI < ݤ_78:rp%=rp%4:=0 : SEI ; ݤ_B8:rp%=rp%&BF:=0 : CLV ;( ݤ_D8:rp%=rp%&F7:=0 : CLD 82 ݤ_F8:rp%=rp%8:"**BCD not supported***":=0 : SED < : F : P ݤ_0:rpc%=rpc%+1:rs%=rs%-3:mem%?(rs%+1)=rp%&10:mem%?(rs%+2)=rpc%:mem%?(rs%+3)=rpc%256:rpc%=(mem%!&FFFE)&FFFF:rp%=rp%4:=0 : BRK eZ ݤ_20:a%=mem%!rpc%:rpc%=rpc%+1:rs%=rs%-2:mem%?(rs%+1)=rpc%:mem%?(rs%+2)=rpc%256:rpc%=a%&FFFF:=0 d : JSR Tn ݤ_40:rp%=mem%?(rs%+1):rpc%=(mem%!(rs%+2))&FFFF:rs%=rs%+3:rpc%=rpc%+1:=0 : RTI Ix ݤ_4C:rpc%=A%:=0 : JMP abs C ݤ_60:rpc%=(mem%!(rs%+1))&FFFF:rs%=rs%+2:rpc%=rpc%+1:=0 : RTS I ݤ_6C:rpc%=(mem%!A%)&FFFF:=0 : JMP (abs) K ݤ_7C:rpc%=(mem%!A%)&FFFF:=0 : JMP (abs,X) E ݤ_EA:=0 : NOP  :  : K ݤ_8A:ra%=rx%:rp%=(rp%&7D)(ra%128)((ra%=0)2):=0 : TXA K ݤ_98:ra%=ry%:rp%=(rp%&7D)(ra%128)((ra%=0)2):=0 : TYA S ݤ_9A:rs%=rx%+&100:=0 : TXS K ݤ_A8:ry%=ra%:rp%=(rp%&7D)(ry%128)((ry%=0)2):=0 : TAY K ݤ_AA:rx%=ra%:rp%=(rp%&7D)(rx%128)((rx%=0)2):=0 : TAX I ݤ_BA:rx%=rs%&FF:rp%=(rp%&7D)(rx%128)((rx%=0)2):=0 : TSX  :  : I ݤ_1A:ra%=(ra%+1)&FF:rp%=(rp%&7D)(ra%128)((ra%=0)2):=0 : INC A I ݤ_3A:ra%=(ra%-1)&FF:rp%=(rp%&7D)(ra%128)((ra%=0)2):=0 : DEC A G" ݤ_88:ry%=(ry%-1)&FF:rp%=(rp%&7D)(ry%128)((ry%=0)2):=0 : DEY G, ݤ_C8:ry%=(ry%+1)&FF:rp%=(rp%&7D)(ry%128)((ry%=0)2):=0 : INY G6 ݤ_CA:rx%=(rx%-1)&FF:rp%=(rp%&7D)(rx%128)((rx%=0)2):=0 : DEX G@ ݤ_E8:rx%=(rx%+1)&FF:rp%=(rp%&7D)(rx%128)((rx%=0)2):=0 : INX J : T ݤ_C6: : DEC zp ^ ݤ_CE: : DEC abs h ݤ_D6: : DEC zp,X r ݤ_DE: : DEC abs,X X| mem%?A%=(mem%?A%-1)&FF:rp%=(rp%&7D)((mem%?A%)128)((mem%?A%=0)2):rpc%=rpc%+1:=0  :  ݤ_E6: : INC zp  ݤ_EE: : INC abs  ݤ_F6: : INC zp,X  ݤ_FE: : INC abs,X X mem%?A%=(mem%?A%+1)&FF:rp%=(rp%&7D)((mem%?A%)128)((mem%?A%=0)2):rpc%=rpc%+1:=0  :  :  ݤ_A2:A%=rpc% : LDX #n  ݤ_A6: : LDX zp  ݤ_AE: : LDX abs 3 ݤ_B6:A%=(mem%?rpc%+ry%)&FF : zp,X 4 ݤ_BE:A%=(A%-rx%+ry%)&FFFF:rpc%=rpc%+1 : abs,Y B rx%=mem%?A%:rp%=(rp%&7D)(rx%128)((rx%=0)2):rpc%=rpc%+1:=0  :  ݤ_A0:A%=rpc% : LDY #n & ݤ_A4: : LDY zp 0 ݤ_AC: : LDY abs : ݤ_B4: : LDY zp,X D ݤ_BC: : LDY abs,X BN ry%=mem%?A%:rp%=(rp%&7D)(ry%128)((ry%=0)2):rpc%=rpc%+1:=0 X : b : l ݤ_86: : STX zp v ݤ_8E: : STX abs + ݤ_96:A%=(A%-rx%+ry%)&FFFF : STX zp,Y  mem%?A%=rx%:rpc%=rpc%+1:=0  :  ݤ_84: : STY zp  ݤ_8C: : STY abs  ݤ_94: : STY zp,X  mem%?A%=ry%:rpc%=rpc%+1:=0  :  : ' ݤ_64: : CLR zp ) ݤ_74: : CLR zp,X & ݤ_9C:A%=(A%-rx%)&FFFF : CLR abs * ݤ_9E: : CLR abs,X  mem%?A%=0:rpc%=rpc%+1:=0  :  : z ݤ_A :ra%=ra%*2:rp%=(rp%&FE)+ra%256:ra%=ra%&FF:rp%=(rp%&7D)(ra%128)((ra%=0)2):=0: : ASL A * ݤ_6 : : ASL zp 4 ݤ_E : : ASL abs > ݤ_16: : ASL zp,X H ݤ_1E: : ASL abs,X kR a%=mem%?A%*2:rp%=(rp%&FE)+a%256:mem%?A%=a%:rp%=(rp%&7D)(mem%?A%128)((mem%?A%=0)2):rpc%=rpc%+1:=0 \ : xf ݤ_2A:ra%=ra%*2+(rp%1):rp%=(rp%&FE)+ra%256:ra%=ra%&FF:rp%=(rp%&7D)(ra%128)((ra%=0)2):=0 : ROL A p ݤ_26: : ROL zp z ݤ_2E: : ROL abs  ݤ_36: : ROL zp,X  ݤ_3E: : ROL abs,X s a%=mem%?A%*2+(rp%1):rp%=(rp%&FE)+a%256:mem%?A%=a%:rp%=(rp%&7D)(mem%?A%128)((mem%?A%=0)2):rpc%=rpc%+1:=0  : s ݤ_4A:rp%=(rp%&FE)(ra%1):ra%=ra%2:rp%=(rp%&7D)(ra%128)((ra%=0)2):=0 : LSR A  ݤ_46: : LSR zp  ݤ_4E: : LSR abs  ݤ_56: : LSR zp,X  ݤ_5E: : LSR abs,X j rp%=(rp%&FE)(mem%?A%1):mem%?A%=mem%?A%2:rp%=(rp%&7D)(mem%?A%128)((mem%?A%=0)2):rpc%=rpc%+1:=0  : x ݤ_6A:ra%=ra%+256*(rp%1):rp%=(rp%&FE)+(ra%1):ra%=ra%2:rp%=(rp%&7D)(ra%128)((ra%=0)2):=0 : ROR A  ݤ_66: : ROR zp ݤ_6E: : ROR abs ݤ_76: : ROR zp,X ݤ_7E: : ROR abs,X w$a%=mem%?A%+256*(rp%1):rp%=(rp%&FE)+(a%1):mem%?A%=a%2:rp%=(rp%&7D)(mem%?A%128)((mem%?A%=0)2):rpc%=rpc%+1:=0 .: 8: Bݤ_89:A%=rpc% : BIT #n Lݤ_24: : BIT zp Vݤ_2C: : BIT abs `ݤ_34: : BIT zp,X jݤ_3C: : BIT abs,X Dtrp%=(rp%&3D)(mem%?A%&C0)(((mem%?A%ra%)=0)2):rpc%=rpc%+1:=0 ~: : ݤ_C0:A%=rpc% : CPY #n ݤ_C4: : CPY zp ݤ_CC: : CPY abs pA%=ry%-mem%?A%:rp%=(rp%254)+(((A%256)256)256):A%=A%255:rp%=(rp%&3D)(A%128)((A%=0)2):rpc%=rpc%+1:=0 : ݤ_E0:A%=rpc% : CPX #n ݤ_E4: : CPX zp ݤ_EC: : CPX abs pA%=rx%-mem%?A%:rp%=(rp%254)+(((A%256)256)256):A%=A%255:rp%=(rp%&3D)(A%128)((A%=0)2):rpc%=rpc%+1:=0 : ݤ_4 :Z%=m4 : TSB zp ݤ_C :Z%=mC : TSB abs N rp%=(rp%253)+(((mem%?A% ra%)=0)2):mem%?A%=mem%?A% ra%:rpc%=rpc%+1:=0 : ݤ_14:Z%=m4 : TRB zp (ݤ_1C:Z%=mC : TRB abs P2rp%=(rp%253)+(((mem%?A% ra%)=0)2):mem%?A%=mem%?A% ra%:rpc%=rpc%+1:=0 <: F: P MOS Interface #Zݤ_3 : : OSCLI /OSBYTE #dݤ_23: : OSWORD/OSWRCH #nݤ_43: : OSRDCH/OSFILE #xݤ_63: : OSARGS/OSBGET #ݤ_83: : OSBPUT/OSGBPB #ݤ_A3: : OSFIND/OSQUIT ݤ_C3: : OSLANG/ - ݤ_E3: : - / - =mos(mem%?(rpc%-1)) : : ݤ_2 : : --- ݤ_22: : --- ݤ_42: : --- ݤ_44: : --- ݤ_54: : --- ݤ_5C: : --- ݤ_62: : --- ݤ_82: : --- ݤ_C2: : --- "ݤ_D4: : --- ,ݤ_DC: : --- 6ݤ_E2: : --- @ݤ_F4: : --- Jݤ_FC: : --- T=0 ^ > MOS hݤmos(m%): X%,Y% -rA%=ra%:X%=rx%+256*ry%:Y%=ry%:C%=rp%:rp%=0 | m%  &13,&FFF4:=mos_byte  &33,&FFEE: A%:=0  &FFEC: 13:=0  &FFE7: &FFE7:=0  &FFE3: &FFE3:=0 ' &43,&FFE0:ra%=:rp%=(ra%=27)1:=0  &73,&FFD7:=mos_bget  &83,&FFD4:=mos_bput  &A3,&FFCE:=mos_find  &63,&FFDA:=mos_args  &B3:=mos_quit  &C3:=mos_lang  X%=X%+mem%:Y%=X%256  m%  &03,&FFF7:=mos_cli & &23,&FFF1:=mos_word 0 &53,&FFDD:=mos_file : &93,&FFD1:=mos_gbpb D N=0 X: bݤmos_cli:cmd($X%,):=0 l: vݤmos_byte  A%=&82:rx%=0:ry%=&00:=0  A%=&83:rx%=0:ry%=&08:=0 + A%=&84:rx%=prog%255:ry%=prog%256:=0 L A%>123:A%<127:mem%?escflg%=128*(A%1):"FX15" : Clear/Set/Ack Escape i os%<>32:X%=X%255:A%=&FFF4:rx%=(A%&FF00)256:ry%=(A%&FF0000)65536:rp%=(A%&1000000)&1000000:=0 ? A%=128:rx%=7: rx%,A%,A%:ry%=(rx%>>8)255:rx%=rx%255:=0 ? A%=128:rx%=8: A%,rx%,A%:ry%=(rx%>>8)255:rx%=rx%255:=0  A%  0:rx%=32:=0  127:rx%=#rx%:=0 0 128:A%=(rx%+256*ry%):rx%=A%:ry%=A%256:=0 > 129:A%=(rx%+256*ry%):rx%=A%:ry%=A%256:carry(A%=-1):=0  134:rx%=:ry%=:=0  135:rx%=(,):ry%=:=0   160:rx%=@vdu%!(rx%*4):=0   =0 *: 4ݤmos_word Q>A%=0:A%=!X%&FFFF:mem%?255=0:osw0%=:""A$:$(mem%+A%)=A$:osw0%=:ry%=A$:=0 Hos%<>32 A%=10: &FFF1:=0 R A% \ 1:!X%=:=0 f 2:=!X%:=0 p 7: !X%,X%!2,X%!4,X%!6:=0 Uz 8: ?X%,X%?1,X%?2,X%?3,X%?4,X%?5,X%?6,X%?7,X%?8,X%?9,X%?10,X%?11,X%?12,X%?13:=0  14:$X%=$:=0  15:$=$X%:=0  =0 : ݤmos_file 7A%=254:X%?5 =&FF:X%?5=0 A%=254:X%!2=X%!2+mem% 7A%=255:X%?5 =&FF:X%?5=0 A%=255:X%!2=X%!2+mem% QA%=0 :X%?13=&FF:X%?13=0:X%?17=0 A%=0:X%!10=X%!10+mem%:X%!14=X%!14+mem% fn%=mem%+(!X% &FFFF) g os%<32: "OS_File",A%,fn%,X%!2,X%!6,X%!10,X%!14 ra%,,X%!2,X%!6,X%!10,X%!14 ra%=file($fn%,A%) _ SYS "OS_File",A%,mem%+(!X% AND &FFFF),X%!2,X%!6,X%!10,X%!14 TO ra%,,X%!2,X%!6,X%!10,X%!14 =0 5 DEFPROCaddr(A%):IFX%!A%<&10000:X%!A%=mem%+A%!X%  ENDPROC : 6$ݤmos_bget:ra%=(&FFD7):rp%=ra%256:ra%=ra%255:=0 .: 8ݤmos_bput: &FFD7:=0 B: Lݤmos_find:A%=0:#Y%:=0 -V (A%&C0)=&40:ra%=openin($(mem%+X%)):=0 .` (A%&C0)=&80:ra%=openout($(mem%+X%)):=0 -j (A%&C0)=&C0:ra%=openup($(mem%+X%)):=0 t: ~ݤmos_gbpb 2ra%=X%?5 :ra%=&FF:X%?5=0 X%!1=X%!1+mem% 0A%=&FFD1:ra%=&FF:X%?5=&FF X%!1=X%!1-mem% ra%=A%255:rp%=A%256:=0 : ݤmos_args Y%=0:A%=0:ra%=fs:=0 *Y%=0:mem%!X%=args(ra%,Y%,mem%!X%):=0 A%=0:mem%!X%=#Y%:ra%=0:=0 A%=1:#Y%=mem%!X%:ra%=0:=0 A%=2:mem%!X%=#Y%:ra%=0:=0 A%=3:#Y%=mem%!X%:ra%=0:=0 A%=4:mem%!X%=#Y%:ra%=0:=0 mem%!X%=args(A%,Y%,mem%!X%)  =0 : ݤmos_quit:= (ݤmos_lang:=0 2 > Dis65 <ݤDis_Name(cpu%)="65x02" 6FݤDis_Code(cpu%,Ptr%,Data%):op%,ins%,md%,b0%,num% 4)1))+" A" 9(op%&E7)=4:="T"+"SR",1+(md%4),1)+"B "+mde(md%3) 6(op%&D3)=&C0:=bxy(ins%)+" "+mde(((md%3)-1)3) $(op%&E7)=&24:="BIT "+mde(md%) ,(op%&C7)=&84:=bxy(ins%)+" "+mde(md%) ;"(op%&FD)=&A0:="LD"+"YX",1+((op%2)2),1)+" "+mde(2) R,(op%&CF)=&4C:op%<>&5C:X%?2=64:="JMP "+"(",op%>&5F)+mde(md%)+")",op%>&5F) 06op%=&80:num%=2:X%?2=64:="BRA "+jr(Data%?1) !@X%?2=128:="EQUB &"+h0(op%,2) 3Jݤalu(A%)="ORAANDEORADCSTALDACMPSBC",A%*3+1,3) 3Tݤrot(A%)="ASLROLLSRRORSTXLDXDECINC",A%*3+1,3) 3^ݤbxy(A%)="***BIT***STZSTYLDYCPYCPX",A%*3+1,3) /hݤmde(A%):num%=2:A%=2:="#&"+h0(Data%?1,2) >r(A%2):num%=3:="&"+h0(Data%!1,4)+",X",A%=7)+",Y",A%=6) +|(A%1):="&"+h0(Data%?1,2)+",X",A%=5) 4="(&"+h0(Data%!1,2)+",X",A%=0)+")"+",Y",A%=4) Dݤjr(A%):A%<128:="&"+h0(Ptr%+A%+2,4)="&"+h0(Ptr%+A%+2-256,4) ! > BLib.Close 1.00 09Aug1998 :  Close Handling  ~~~~~~~~~~~~~~ : Close_All:*EXEC "in%=in%:in%:A%=in%:in%=0:#A% 'out%=out%:out%:A%=out%:out%=0:#A%  " > BLib.String 1.00 09Aug1998 : # String Manipulation Functions # ============================= : 7& FNs() - strip spaces from start and end of string 70 ------------------------------------------------- /:ݤs(A$):A$,1)=" ":A$=A$,2):A$,1)<>" " +DA$,1)=" ":A$=A$,A$-1):A$,1)<>" " N=A$ X: +b FNuc() - convert string to upper case +l ------------------------------------- vݤuc(A$): B$:A$="":="" 5B$=B$+(A$((A$<"@")&DF)):A$=A$,2):A$="":=B$ : + FNlc() - convert string to lower case + ------------------------------------- ݤlc(A$): B$:A$="":="" 5B$=B$+(A$((A$<"_")&20)):A$=A$,2):A$="":=B$ : " > BLib.Number 1.01 09Aug1988 ( v1.00 09Aug1988 JGH: First version 1 v1.01 xxxxxxxxx JGH: Added Octal and Binary 4 Bug: Octal and Binary don't work for &8xxxxxxx :  Number Output Routines  ~~~~~~~~~~~~~~~~~~~~~~   # Hexadecimal padded with zeros # ݤh0(A%,N%)="0000000"+~A%,N%) *: $4 Hexadecimal padded with spaces ">ݤh(A%,N%)=" "+~A%,N%) H: R Decimal padded with zeros #\ݤd0(A%,N%)="00000000"+A%,N%) f: p Decimal padded with spaces #zݤd(A%,N%)=" "+A%,N%) :  Octal padded with zeros ?ݤo0(A%,N%): A$,B$:A%<0:B$="7":A%=A% &7FFFFFFF B$="0" 7 A$=(A% 7)+A$:A%=A% 8: A%=0:=N%,B$)+A$,N%) :  Octal padded with spaces >ݤo(A%,N%): A$,B$:A%<0:B$="7":A%=A% &7FFFFFFF B$=" " 7 A$=(A% 7)+A$:A%=A% 8: A%=0:=N%,B$)+A$,N%) :  Binary padded with zeros ?ݤb0(A%,N%): A$,B$:A%<0:B$="1":A%=A% &7FFFFFFF B$="0" 6 A$=(A% 1)+A$:A%=A% 2:A%=0:=N%,B$)+A$,N%) :  Binary padded with spaces >ݤb(A%,N%): A$,B$:A%<0:B$="1":A%=A% &7FFFFFFF B$=" " 6 A$=(A% 1)+A$:A%=A% 2:A%=0:=N%,B$)+A$,N%) $: ). Drive character for supplied number 8ݤdrv(A%)=(48+A%-7*(A%>9)) B: )L Drive number for supplied character "VݤDrv(A$)=A$-48+7*(A$>"9")31 #` > BLib.ProgEnv 1.04 09Jan2007 j: #t Program Environment Functions #~ ============================= : ? Return command line tail, sets run$ to execution filename ; Works with BASIC on I/O,T6502,Arc,TZ80BBC,PC,Win,TARM ; Needs: 270 free bytes above end of heap for temp. w/s ? --------------------------------------------------------- :ݤOS_GetEnv:A$,A%:X%=1:os%=((&FFF4)&FF00)256:X%-1 Ios%=32:>&FFFF: "GetModuleFileName",0,X%,255:A$=$$X%:run$=A$:=@cmd$ os%=32:A$=$&100 yA$=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 =( ------------------------------------------------------- &2os(A$):A$=42:A$ A$<>"":A$ < F: (P Exit program, setting return value (Z ---------------------------------- @dexit(A%):"FX1,"+A%:quit$=quit$:A$=quit$:quit$="":os(A$) nos%=32: A% xos%<6: *Quit  : * > BLib.Generic.FileIO 1.02 28Apr2007 P 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%!... , -------------------------------------- Jݤfile(A$,A%):os%<32:$name%=A$:?X%=name%:X%?1=name%256:=(&FFDD)&FF "A$,".")=0:A$=A$+"." ;,A%=255 A%=5:X%!14=(A$):X%!14:X%!10=#X%!14:#X%!14 16A%=255:X%?6=0:"LOAD """+A$+""" "+~X%!2:=1 @A%=5:X%!14:=1 A%=5:=0 FJA%=0:"SAVE """+A$+""" "+~X%!10+" "+~X%!14:X%!10=X%!14-X%!10:=1 BTA%=7:"SAVE """+A$+""" "+~+"+"+~X%!10:X%!10=X%!14-X%!10:=1 ^A%=8 h : :=2 r"MKDIR "+A$:=2 | =0 :  General OSGBPB call  ------------------- #gbpb(A%,chn%,addr%,num%,ptr%) =?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:os%<32: &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& ------------------------------------------------------------ E0ݤ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) D: 7N OSARGS call with data. Returns any returned data 7X ------------------------------------------------- 4bݤargs(A%,Y%,ptr%): X%,E%:?(P-3)=0:E%=Y%:Y%=0 /l<&8000: !&70:X%=&70:!X%=ptr%:&FFDA:=!X% (v "OS_Args",A%,Y%,ptr% ,,ptr%:=ptr% : ' OSARGS call ignoring X, returns A ' --------------------------------- =ݤargsA(A%):<&8000: X%,Y%,E%,!&70:X%=&70:=(&FFDA)&FF  "OS_Args",A% A%:=A% : & Get current filing system number & -------------------------------- )ݤfs:os%<32: A%,Y%,E%:=(&FFDA)&FF =29 : 1 Create a directory only if it doesn't exist 1 ------------------------------------------- 'cdir(A$):os%=32:A%=file(8,A$):  file(5,A$)=0:"CDIR "+A$   : .* Open an input file ensuring no extension .4 ---------------------------------------- >ݤopenin(A$)=(f_name(A$)) H: /R Open an output file ensuring no extension /\ ----------------------------------------- fݤopenout(A$)=(f_name(A$)) p: /z Open an update file ensuring no extension / ----------------------------------------- ݤ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$