> BBCtoBMP v1.09 0 Convert BBC screen image to Windows Bitmap ( v1.00 18-Jun-1999 Initial version. (B v1.01 12-Jul-1999 Read ScrSave compressed files and palettes 2, v1.02 11-Jul-2009 Made Windows binary. &5500: mem% &4FFF blk% &27F : = :Close_All:" at line "+Þ,<>17 <128):exit() AA$=OS_GetEnv:d$=".":s$="/":os%=32:Win_TextIO:d$="\":s$="." XA$="":"BBC Screen image: "in$:"BBC Screen mode: "mode$:"Output bitmap: "out$ KA$="":"Options: "opt$:A$=in$+" "+out$+" "+mode$+" "+opt$+" " fquit$=cl(" -q",1):sm%=cl("-s",0):rle%=cl("-u",0)cl("-c",0):vb%=cl("-v",0):mode$=cl("-m",1) Ucpr%=(cl("-r",0)cl("-l",0)):brd%=cl("-b",0)1:cl("-?",0):syntax:exit(0) :in$=cl("",0):out$=cl("",0):mode$="":mode$=cl("",0) (in$="" out$="":syntax:exit(220) %mode%=mode$7:mode$="":mode%=-1 $os%=32:in$,".")=0:in$=in$+"." : ) Examine file to work out image type ") ----------------------------------- ,GX%!2=0:X%!6=0:file(in$,5)<>1:"File '"in$"' not found":exit(214) 6.scr%=0:fsize%=X%!10:X%!2=0:X%!6=0:rdInf @>cpr%=0:scr%=(X%?5=&FF X%!2<>X%!6 (X%?9=0 X%?9=&FF)) JBscr%:cpr%=(X%?5=&FF X%?9=0)(X%?8+1):mode%<0:mode%=X%?716 T: ^ Load source file h ---------------- rCload:cpr%:mem%=0:"No memory for decompression":exit(128-2) |*mode%-8:"Unknown MODE":exit(128-1) : C Set mode parameters, note only usable BMP BitCount% is 1 or 4 C ------------------------------------------------------------- Rmode%=0:ColoursUsed%=2 :BitCount%=1:sz%=8:px%=8:xs%=1:ys%=2:zebra%=0:cols%=80 cmode%=1:ColoursUsed%=4 :BitCount%=4:sz%=2:px%=4:xs%=2:ys%=2:zebra%=0:cols%=80:sm%:xs%=1:ys%=1 cmode%=2:ColoursUsed%=16:BitCount%=4:sz%=2:px%=2:xs%=4:ys%=2:zebra%=0:cols%=80:sm%:xs%=2:ys%=1 Rmode%=3:ColoursUsed%=2 :BitCount%=1:sz%=8:px%=8:xs%=1:ys%=2:zebra%=2:cols%=80 cmode%=4:ColoursUsed%=2 :BitCount%=1:sz%=8:px%=8:xs%=2:ys%=2:zebra%=0:cols%=40:sm%:xs%=1:ys%=1 cmode%=5:ColoursUsed%=4 :BitCount%=4:sz%=2:px%=4:xs%=4:ys%=2:zebra%=0:cols%=40:sm%:xs%=2:ys%=1 cmode%=6:ColoursUsed%=2 :BitCount%=1:sz%=8:px%=8:xs%=2:ys%=2:zebra%=2:cols%=40:sm%:xs%=1:ys%=1 Xmode%=7:ColoursUsed%=8 :BitCount%=4:"MODE 7 not supported":Close_All:exit(128-1) : 3 Read palette entries from load/exec addresses 3 --------------------------------------------- 3scr%cpr%=0:A%=015:palette%(A%)=rgb(A%7): \scr%cpr%=0:ColoursUsed%=4:palette%(1)=rgb(1):palette%(2)=rgb(3):palette%(3)=rgb(7) &4scr%cpr%=0:ColoursUsed%=2:palette%(1)=rgb(7) 0Jscr%:col%=X%!6 &FFF:A%=03:palette%(A%)=rgb(col%7):col%=col%8: :Jscr%:col%=X%!2 &FFF:A%=47:palette%(A%)=rgb(col%7):col%=col%8: Dvscr%:mode%=2:mem%:A%=03:palette%(A%*2+8)=rgb((mem%?A%)7):palette%(A%*2+9)=rgb((mem%?A%)16)::!mem%=mem%!4 N: X Calculate variables b ------------------- lxsz%=cols%40 vrows%=(fsize%cols%)-8 'Width% =(cols%+2*xsz%*brd%)*xs%*px% -Height%=(rows%+16*brd%)*ys%+zebra%*ys%*28 :   Open output file  ---------------- Eout%=(out$):out%=0:"Can't open '"out$"'":Close_All:exit(192) :  File header  ----------- ZBits%=BitCount%: ColoursUsed%<4:rle%:BitCount%=4: Need more colours for compression NumColours%=2^BitCount% #DataOffset%=14+40+4*NumColours% .FileSize%=DataOffset%+(Width%*Height%)/sz%  : wr16(out%,"B"+"M"*256)  wr32(out%,FileSize%) *wr32(out%,0) 4wr32(out%,DataOffset%) >: H Info header R ----------- \wr32(out%,40) fwr32(out%,Width%) pwr32(out%,Height%) z/wr16(out%,1) : Number of planes wr16(out%,BitCount%) -wr32(out%,0) : No compression -wr32(out%,0) : No compression 1wr32(out%,0) : X pixels per metre 1wr32(out%,0) : Y pixels per metre +wr32(out%,ColoursUsed%): Colours used 6wr32(out%,0) : Colours important 0=all :  Colour table  ------------  colour%=0 NumColours%-1 !wr32(out%,palette%(colour%))  colour% :  Raster data  ----------- $cnt%=0:last%=-1 .B brd%:blank(8) : Bottom border 8< zebra%:blank(6) : Stripes B/ row%=rows%-1 0 -1:vb%:13;row%;" "; L6 (row%7)=7:line: zebra%:blank(2) : Stripes V sq%=1 ys% `: brd%: N%=1 xsz%:byte(0): : Left border j col%=0 cols%-1 tFptr%=blk%+col%*8+(row%7): blk%=0:ptr%=mem%+ptr%+(row%8)*cols%*8 ~G mem%+blk%:byte(?ptr%) #in%=ptr%+(row%8)*cols%*8:byte(#in%)  col% ; brd%: N%=1 xsz%:byte(0): : Right border eol  sq%  row% ? brd%:blank(8) : Top border h rle%: #out%>FileSize%:#out%:out%=0:BitCount%=Bits%:rle%=: Couldn't compress, try uncompressed  out%<>0 - rle%:#out%,0:#out%,1:FileSize%=#out% c rle%:#out%=2:wr32(out%,FileSize%):#out%=30:wr32(out%,2):wr32(out%,FileSize%-DataOffset%) vb%:13;" ";13; :  Finished   -------- Close_All: exit(0) 2os%<32:"SetType "+out$+" 69C":"Stamp "+out$ (exit(0): 2: <4ݤrgb(A%)=(A%1)*&FF0000+(A%2)*&7F80+(A%4)*&FF F: Pblank(N%):N%=N%*ys% Z d2 col%=1 (cols%+2*xsz%*brd%):byte(0)::eol nN%=N%-1:N%<1 x :  eol * rle%:out(-1):wr16(out%,0):cnt%=0: : rle%=0:B%=(Width%px%)4: B%: B%=B% 3:byte(0):  : byte(B%)  ColoursUsed%=2 :mode0:  ColoursUsed%=4 :mode1:  ColoursUsed%=16:mode2:  :  mode0 PBitCount%=1:xs%=1:#out%,B%: BitCount%=1:#out%,l(B%):#out%,r(B%): +A0%=B%15:B%=B%16:mode1:B%=A0%:mode1  "hݤl(A%)=(A%&80)((A%2)&40)((A%2)&20)((A%4)&10)((A%4)8)((A%8)4)((A%8)2)((A%16)1) ,`ݤr(A%)=((A%8)*16)((A%8)*8)((A%4)*8)((A%4)*4)((A%2)*4)((A%2)*2)((A%1)*2)(A%1) 6: @ mode1 JVA1%=((B%&80)4)((B%&08)*2) :xs%>1:out(A1%(A1%16)):xs%=4:out(A1%(A1%16)) TkA2%=((B%&40)2)((B%&04)*4) :xs%=1:out(A1%(A2%16)) out(A2%(A2%16)):xs%=4:out(A2%(A2%16)) ^XA3%= (B%&20)((B%&02)*8) :xs%>1:out(A3%(A3%16)):xs%=4:out(A3%(A3%16)) hmA4%= ((B%&10)*2)((B%&01)*16):xs%=1:out(A3%(A4%16)) out(A4%(A4%16)):xs%=4:out(A4%(A4%16)) r |:  mode2 7A1%=(B%&80)((B%&20)*2)((B%&08)*4)((B%&02)*8) ,xs%=4:A%=A1%(A1%16):out(A%):out(A%) &4FFF:(ptr%3)<>cpr%-1:ptr%=ptr%-&4FFF N%=0:#in%:#in%:in%=0 fsize%=ptr%+1-cpr%: :  Read LDPIC screen image  -----------------------  ldpic  mem%=0:  'bits%=0:dw%=get(8):mode%=get(8)7 *9 colour%=15 0 -1:ctrl%?colour%=get(4): colour% 4stp%=get(8):cw%=get(8) >6fsize%=256*("&"+"5050504028282004",mode%*2+1,2)) Hoff%=stp%-1:addr%=mem%+off% R \"cnt%=1:get(1):cnt%=get(cw%) fbyt%=get(dw%) p. A%=1 cnt%:?addr%=byt%:addr%=addr%+stp% z4 addr%>=mem%+fsize%:off%=off%-1:addr%=mem%+off%   off%<0 #in%:bits%=0 " addr%>mem%:fsize%=addr%-mem% K #in%+24>#in%:A%=015:palette%(A%)=rgb(ctrl%?A%):A%:#in%:in%=0:  colour%=15 0 -1 name%?(colour%*4+3)=0 %name%?(colour%*4+2)=get(4): red 'name%?(colour%*4+1)=get(4): green &name%?(colour%*4+0)=get(4): blue  colour%  Need to read control flags  colour%=15 0 -1 num%=ctrl%?colour% :palette%(colour%)=name%!(num%*4) (name%!(num%*4)*16)  colour% #in%:in%=0 $ .: 8&ݤbit:bits%=0:byte%=#in%:bits%=8 B*byte%=byte%*2:bits%=bits%-1:=byte%256 L.ݤget(N%):A%,B%:B%=1N%:A%=(A%2)bit: VA%=A%2:N%=N%+1:N%>8:=A% `: j Read in .inf file t ----------------- ~3rdInf:in%=(fn_noext(in$)+s$+"inf"):in%=0: A%=0:B%=#in%:B%=10:B%=13 Fname%?A%=B%:A%=A%+1:#in% A%>78 B%=13:name%?A%=13:#in%:in%=0 IA$=$name%:X%!2=cl("",0):X%!2=("&"+cl("",0)):X%!6=("&"+cl("",0))  : ssyntax:"Syntax: BBCtoBMP -mode -border -ldpic -raw -scr -small -uncomp -verbose": 1wr32(O%,A%):!zp%=A%:A%=03:#O%,zp%?A%:: 1wr16(O%,A%):!zp%=A%:A%=01:#O%,zp%?A%:: wr(A%): : !ݤfn_noext(A$):A$,s$)=0:=A$ 1 A%:A%=A$+1:A%=A%-1:":"+s$+d$,A$,A%,1)) "A$,A%,1)=s$:=A$,A%-1) =A$ : ! > BLib.Close 1.00 09Aug1998 Close_All:*EXEC ("in%=in%:in%:A%=in%:in%=0:#A% 2'out%=out%:out%:A%=out%:out%=0:#A% < F: P#gbpb(A%,chn%,addr%,num%,ptr%) Z>?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:<&FFFFF:&FFD1: dA%=1A%=3:#?X%=X%!9 n5:A%=1A%=2:#?X%,?X%!1 A%=3A%=4:?X%!1=#?X% x5X%!1=X%!1+1:X%!5=X%!5-1:(#?X% A%>2) X%!5<1: : # > BLib.ProgEnv 1.06 20Apr2020 :ݤOS_GetEnv:A$,A%,X%,Y%:X%=1:os%=((&FFF4)&FF00)256 Mos%>31:>&FFFFF:X%256:ș"GetModuleFileName",0,X%,255:run$=$$X%:=@cmd$ CA%=&600-&7B00*(>&8000)-&3F00*(>&C000):!(-&100)=@%:A%=-&300 ;?(P-3)=0:A%=&100:<&FFFF:A%=-&300:!(+512)=@%:A%= cA$=$A%:=&8F00:run$=A$:ș16A$,,A%:ș72,"",A%:A$=A$,1+A$+" "," ",1+A$," "))):A$=0:A$=run$ UY%=-10:A$=" "+A$:A$=A$,2):A$<>32:A$=34:A%=A$,"""",2)+1 A%=A$+" "," ") 9Y%:run$=A$,1-(A$=34),A%-1+2*(A$=34)):A$=A$,A%+1) :=A$ #os(A$):A$=42:A$ A$:A$  Fexit(A%):"FX1,"+(A%255):quit$=quit$:A$=quit$:quit$="":os(A$) >&FFFFF: A%  : "# > BLib.CmdLine 1.11 27Jul2009 ,cݤcl(l$,n%):l$="":A$=s(A$):A$=34:A%=A$+" "" ",""" ",2):l$=A$,2,A%-2):A$=s(A$,A%+1)):=l$ 6"":A%=A$,l$):A%:A$=s(A$,A%-1)+A$,A$," ",A%)+1))+" ":= Jn%=0:l$<>"":= T%A%=" ",l$=32)+A$,l$):A%=0:="" ^'A$=A$,A%-1)+s(A$,A$," ",A%)+1)) hCl$=32:l$=A$,A%):A$=A$,A%-1):=l$,1-(l$=34),l$+2*(l$=34)) rPA$,A%,1)<>34:l$=A$,A%,A$+" "," ",A%)-A%):A$=A$,A%-1)+A$,A%+l$+1):=l$ |Hl$=A$,A%+1,A$+" ",""" ",A%+1)-A%-1):A$=A$,A%-1)+A$,A%+l$+3):=l$ /ݤs(A$):A$,1)=" ":A$=A$,2):A$,1)<>" " +A$,1)=" ":A$=A$,A$-1):A$,1)<>" " =A$ :  > BLib.Win.TextIO Win_TextIO /ș"GetStdHandle",-10 @hfile%(1):*INPUT 13 0ș"GetStdHandle",-11 @hfile%(2):*OUTPUT 14 %ș"SetConsoleMode",@hfile%(1),0: :  > BLib.Generic.FileIO Kݤfile(A$,A%):<&FFFF:$name%=A$:?X%=name%:X%?1=name%256:=(&FFDD)&FF A$,".")=0:A$=A$+"." EA%=255 A%=5:X%!14=(A$):X%!14:X%!10=#X%!14:#X%!14:X%!14=&33 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 0BA%=7:"SAVE """+A$+""" "+~+"+"+~X%!10:X%!10=X%!14-X%!10:=1 : A%=8 D : :=2 N"mkdir "+A$:=2 X b=0