> ConvBasic 1.03  Convert ZX and BBC Basics ' So programs can be edited on Beeb (I Embedded numbers larger than 16bit intergers not converted properly 2: <Init::err:end: F8 mem% 8:in%=0:out%=0:copy%=: Convert (C)->CHR$127 P0"(B)BC to Spectrum or (S)pectrum to BBC? "; ZA%= &DF:"BS",A%):A% dA%=66:BtoS StoB n end: x: =Init: token%(90),token$(90),ctrl% 20,data% 80:_=0:_%=0 (n%=0 90: token%(n%),token$(n%): X%=ctrl%:Y%=X%256: Q &B3,RND,&BF,INKEY$,&AF,PI,&A4,FN,&2800B0,POINT(,0,SCREEN$,0,ATTR,0,AT,0,TAB ^ &24BB,VAL$,0,CODE,&BB,VAL,&A9,LEN,&B5,SIN,&9B,COS,&B7,TAN,&98,ASN,&95,ACS,&99,ATN,&AA,LN [ &A1,EXP,&A8,INT,&B6,SQR,&B4,SGN,&94,ABS,0,PEEK,0,IN,&BA,USR,&C3,STR$,&BD,CHR$,&AC,NOT W 0,BIN,&84,OR,&80,AND,0,<=,0,>=,0,<>,&86,LINE,&8C,THEN,&B8,TO,&88,STEP,&A4DD,DEFFN I 0,CAT,0,FORMAT,0,MOVE,0,ERASE,0,OPEN#,&23D9,CLOSE#,0,MERGE,0,VERIFY E 0,BEEP,0,CIRCLE,0,INK,0,PAPER,0,FLASH,0,BRIGHT,0,INVERSE,0,OVER S 0,OUT,&F14C,LPRINT,&C94C,LLIST,&FA,STOP,&F3,READ,&DC,DATA,&F7,RESTORE,&CA,NEW W 0,BORDER,0,CONTINUE,&DE,DIM,&F4,REM,&E3,FOR,&E5,GOTO,&E4,GOSUB,&E8,INPUT,&C8,LOAD R &C9,LIST,&E9,LET,0,PAUSE,&ED,NEXT,0,POKE,&F1,PRINT,&F0,PLOT,&F9,RUN,&CD,SAVE E 0,RANDOMIZE,&E7,IF,&DB,CLS,&DF,DRAW,&D8,CLEAR,&F8,RETURN,0,COPY : ݤerr:::= : " end:in%:A%=in%:in%=0:#A% ,out%:A%=out%:out%=0:#A% 6 @: J'StoB:"Source Spectrum file: "in$ T!"Destination BBC file: "out$ ^,in%=(in$):in%=0:"'"in$"' not found": hGout$<>"":out%=(out$):out%=0:"Can't open '"out$"'":#in%:in%=0: rout%:#out%,13 |&Line$="":Last$="":line%=256*#in% ~line%<&4000:line%=line%+#in%:" "+line%,5);:num%=#in%+256*#in%:n%=1 num%:A%=#in%:SpecByte:Last$=A%:::Out 7#in% line%>&3FFF:out%:#out%,&FF:#out%:out%=0 *#in%:in%=0:SetAddr(out$,&FFFFFB00,0)  : SpecByte GA%=13 (A%>31 A%<127) (A%>127 A%<165):A%:Line$=Line$+A%: )A%=14:m%=1 5:B%=#in%::n%=n%+5: A%<32:"[";A%;"]";: A%=127:Line$=Line$+"(C)": =Here$=token$(A%-165):A%>195 Last$<165:Here$=" "+Here$ Here$;" "; 0A%=&EC A%=&ED:SpecLine:: GOTO or GOSUB ! ^ should also check RESTORE )token%(A%-165)=0:Line$=Line$+Here$: ULine$=Line$+token%(A%-165):token%(A%-165)>255:Line$=Line$+(token%(A%-165)256) & 0: :.SpecLine:Line$=" "+Line$+(&E5-(A%-&EC)) DCdest%=0:B%=#in%:n%=n%+1:B%<48 B%>57:#in%=#in%-1:n%=n%-1: NGdest%=dest%*10+B%-48::B%=#in%:n%=n%+1:B%>32:dest%=dest%*10+B%-48 X0B%=14:m%=1 5:B%=#in%::n%=n%+5:;dest%; bzLine$=Line$+141+(((dest%&C0)&40)4+((dest%&C000)&4000)&1000)+((dest%&3F)&40)+(((dest%&3F00)&4000)&100): l: vOut:out%=0: !#out%,line%256:#out%,line% 7#out%,3+Line$:m%=1 Line$:#out%,Line$,m%,1) :  : "BtoS:"Source BBC file: "in$ &"Destination Spectrum file: "out$ ,in%=(in$):in%=0:"'"in$"' not found": Gout$<>"":out%=(out$):out%=0:"Can't open '"out$"'":#in%:in%=0: A%=#in%: Read CR Line$="":line%=256*#in% oline%<&FF00:line%=line%+#in%:" "+line%,5);:num%=#in%:n%=1 num%-3:Line$=Line$+#in%::BeebLine R#in% line%>&FEFF:out%:len%=#out%:#out%:out%=0:SetAddr(out$,&8000,len%) #in%:in%=0:  : BeebLine:Qt%=0:Len%=0  0#out%,line%256:#out%,line%:lenptr%=#out% *3#out%,0:#out%,0: Dummy length, fill in later 4. n%=1 Line$:A%=Line$,n%,1):BeebByte >QOut$<>"": m%=1 Out$:#out%,Out$,m%,1):Len%=Len%+1::Out$=206:DefFn H Rptr%=#out%:#out%=lenptr% \#out%,Len%:#out%,Len%256 f#out%=ptr%: p z: DefFn:Line$,"(")=0: A:n%=n%+1:A%=Line$,n%,1):#out%,A%:A%:Len%=Len%+1:A%="(" :n%=n%+1:A%=Line$,n%,1) YA%="," A%=")":#out%,14:#out%,0:#out%,0:#out%,0:#out%,0:#out%,0:Len%=Len%+6 &#out%,A%:A%:Len%=Len%+1:A%=")"  : BeebByte Out$=A%:A%=34:Qt%=Qt%1 :copy%:Line$,n%,3)="(C)":n%=n%+2:Out$=127:"(C)";: 8Qt%=0 (A%="." (A%>="0" A%<="9")):Number:  <>, <=, >= @ A%=13 (A%>31 A%<60) (A%>90 A%<127) (Qt%2):A%: A%<32:"[";A%;"]";: A%=141:GotoGosub:  $A%>127:Token(176,255): .A%>127:Token(165,176): 88Line$,n%+1,1)<"<" Line$,n%+1,1)>"Z" Qt%:A%: BTokenStr(205,255): LTokenStr(165,205): V A%: `: j-Number:_=Line$,n%):_%=_:;_;:Out$="" t+Out$=Out$+A%:n%=n%+1:A%=Line$,n%,1) ~+A%<>"." (A%<"0" A%>"9"):n%=n%-1 1Out$=Out$+14+_%?0+_%?1+_%?2+_%?3+_%?4: : /ݤ_: Find address of value of variable '_'  _=_:!mem%=0:mem%!2=_:=mem% '?&FFF7=&6C:=3+(!&4BE)&FFFF: 6502 >&8000:|mem%=_:=mem% "DEFFN_":=0 : ? Twin tokens not done properly, eg VAL,$ -> VAL,$ not VAL$ S That could be handled by calling in appropriate ranges, eg 'VAL$', then 'VAL' :  ݤTokenStr(St%,En%):t%=St%: Line$,n%,token$(t%-165))=token$(t%-165):Out$=t%:n%=n%+token$(t%-165)-1:token$(t%-165);" ",Line$,n%+1,1)=" ");:n%=n%-(Line$,n%+1,1)=" ")  t%=t%+1:t%>En% Out$<>A% Out$,1)=&EA:Qt%=Qt%2 =Out$<>A% (: 2L Need to cope with BasicV double tokens, eg SAVE -> ARCATN or something <: FݤToken(St%,En%) PEn% Out$<>A% Out$,1)=&EA:Qt%=Qt%2 6Out$<>A%:(T%&FF00)256=Line$,n%+1,1):n%=n%+1 6Out$<>A%:T%=(T%&FF0000)65536:T%:Out$=Out$+T% Out$<>A%:= Out$=A%:A%:= : QGotoGosub:dest%=Line$,n%+1)+256*Line$,n%+2)+65536*Line$,n%+3):n%=n%+3 ^dest%=((dest%&FF00)&100)((dest%&30)*4)((dest%&FF0000)&100)((dest%&3)*&4000)&4000 &;dest%;:Out$=dest%:_=dest%:_%=_ 0Out$=Out$+14+?_%+_%?1+_%?2+_%?3+_%?4: : KSetAddr(A$,ld%,ex%):X%!2=ld%:A%=file(A$,2):X%!6=ex%:A%=file(A$,3): Bݤfile(A$,A%):$data%=A$:?X%=data%:X%?1=data%256:=(&FFDD)&FF