10 REM > BMPtoBBC v1.04
   90 DIMctrl% 31,name% 79,zp% 5,palette% 15:X%=ctrl%:Y%=X%DIV256
  100 mem%=0:IFHIMEM-LOMEM>&5400:DIMmem% &4FFF
  120 ONERRORREPORT:PROCClose_All:PRINTLEFT$(" at line "+STR$ERL,ERR<>17ANDERR<128):PROCexit(ERR)
  130 A$=FNOS_GetEnv+" ":quit$=FNcl(" -q",1):d$=".":s$="/":IFos%=32:PROCWin_TextIO:d$="\":s$="."
  140 vb%=FNcl("-v",0):inf%=FNcl("-i",0):mode$=FNcl("-m",1):IFFNcl("-?",0):PROCsyntax:PROCexit(0)
  150 in$=FNcl("",0):out$=FNcl("",0):IFmode$="":mode$=FNcl("",0)
  160 IFin$="":INPUT"Input bitmap file: "in$:INPUT"Output BBC file:   "out$:INPUT"BBC Screen mode:   "mode$
  170 IFin$=""ORout$="":PROCsyntax:PROCexit(220)
  180 mode%=VALmode$AND7:IFmode$="":mode%=-1
  190 IFos%=32:inf%=TRUE:IFINSTR(out$,s$)=0:out$=out$+s$
  200 in%=OPENIN(in$):IFin%=0:PRINT"File '"in$"' not found":PROCexit(214)
  240 BM%=FNrd16(in%):IFBM%<>ASC"B"+ASC"M"*256:PRINT"Not a bitmap file":PROCClose_All:PROCexit(255)
  250 FileSize%=FNrd32(in%)
  260 A%=FNrd32(in%)
  270 DataOffset%=FNrd32(in%)
  310 A%          =FNrd32(in%)
  320 Width%      =FNrd32(in%)
  330 Height%     =FNrd32(in%)
  340 A%          =FNrd16(in%)
  350 BitCount%   =FNrd16(in%)
  360 A%          =FNrd32(in%)
  370 A%          =FNrd32(in%)
  380 A%          =FNrd32(in%)
  390 A%          =FNrd32(in%)
  400 ColoursUsed%=FNrd32(in%)
  410 A%          =FNrd32(in%)
  420 NumColours% =2^BitCount%
  440 IFWidth%>640ORHeight%>512:PRINT"Bitmap too big":PROCClose_All:PROCexit(255)
  450 IFBitCount%>4ORColoursUsed%>16:PRINT"Too many colours":PROCClose_All:PROCexit(255)
  490 FORcolour%=0TONumColours%-1
  500   rgb24%=FNrd32(in%)
  510   rgb3% =       (((rgb24%AND&C00000)<>0)AND1)
  520   rgb3% =rgb3%OR(((rgb24%AND&C000)<>0)AND2)
  530   rgb3% =rgb3%OR(((rgb24%AND&C0)<>0)AND4)
  540   palette%?colour%=rgb3%
  550 NEXT
  590 IFmode%<0:IFColoursUsed%=16:mode%=2
  600 IFmode%<0:IFColoursUsed%=4:mode%=1:IFWidth%=320:mode%=5
  610 IFmode%<0:IFColoursUsed%=2:mode%=0:IFWidth%=320:mode%=4
  630 IFmode%=0:ColoursUsed%=2:cols%=80:xs%=1:zebra%=0:bpr%=640
  640 IFmode%=1:ColoursUsed%=4:cols%=80:xs%=1:zebra%=0:bpr%=640
  650 IFmode%=2:ColoursUsed%=16:cols%=80:xs%=1:zebra%=0:bpr%=640
  660 IFmode%=3:ColoursUsed%=2:cols%=80:xs%=1:zebra%=2:bpr%=640
  670 IFmode%=4:ColoursUsed%=2:cols%=40:xs%=2:zebra%=0:bpr%=320
  680 IFmode%=5:ColoursUsed%=4:cols%=40:xs%=2:zebra%=0:bpr%=320
  690 IFmode%=6:ColoursUsed%=2:cols%=40:xs%=2:zebra%=2:bpr%=320
  700 IFmode%=7:PRINT"MODE 7 not supported":PROCexit(-1)
  720 cols%=Width%DIV(8*xs%)
  730 rows%=(Height%-zebra%*56)DIV16
  740 fsize%=cols%*rows%*8
  780 IFmem%=0:out%=OPENOUT(out$):IFout%=0:PRINT"Can't open '"out$"'":PROCClose_All:PROCexit(192)
  790 PTR#in%=DataOffset%:IFzebra%:PTR#in%=PTR#in%+cols%*12*xs%
  800 FORrow%=rows%*8-1TO0STEP-1:IFvb%:PRINTCHR$13;row%;" ";
  810   IF(row%AND7)=7:IFzebra%:PTR#in%=PTR#in%+cols%*4*xs%
  820   FORsq%=1TO2:FORcol%=0TOcols%-1
  830       ptr%=col%*8+(row%AND7)+(row%DIV8)*cols%*8
  840       IFColoursUsed%=2:B%=FNmode0
  850       IFColoursUsed%=4:B%=FNmode1
  860       IFColoursUsed%=16:B%=FNmode2
  870       IFmem%:mem%?ptr%=B%ELSEPTR#out%=ptr%:BPUT#out%,B%
  880 NEXT:NEXT:NEXT:IFvb%:PRINTCHR$13;" ";CHR$13;
  890 IFmem%:IFmode%=2:FORA%=0TO3:mem%?A%=palette%?(A%*2+8)+16*palette%?(A%*2+9):NEXT
  900 IFmem%:OSCLI"Save "+out$+" "+STR$~mem%+"+"+STR$~fsize%ELSECLOSE#out%:out%=0
  940 A%=FNfile(out$,5)
  950 col%=0:IFColoursUsed%=16:FORA%=7TO4STEP-1:col%=col%*8+palette%?A%:NEXT
  960 IFmode%<3:col%=col%OR&3000
  970 IFmode%=3:col%=4000
  980 IFmode%=4ORmode%=5:col%=&5800
  990 IFmode%=6:col%=&6000
 1000 X%!2=col%:X%!4=-1
 1010 col%=mode%:FORA%=3TO0STEP-1:col%=col%*8+(palette%?A%AND7):NEXT
 1020 X%!6=col%:X%!8=-1:A%=FNfile(out$,1)
 1030 IFinf%:out$=LEFT$(out$,LENout$+(RIGHT$(out$,1)=".")):$name%=out$+STRING$(10," ")
 1040 IFinf%:$(name%+12)=FNh0(X%!2,8)+" "+FNh0(X%!6,8)+" "+FNh0(fsize%,8)
 1050 IFinf%:OSCLI"Save """+out$+s$+"inf"" "+STR$~name%+"+27 FFFF0000 FFFFFF00":IFos%=6:OSCLI"Stamp "+out$+s$+"inf"
 1090 PROCClose_All:PROCexit(0):END
 1110 DEFFNmode0:B%=BGET#in%:IFxs%=1:=B%
 1120 C%=BGET#in%
 1130 B%=(B%AND&80)OR((B%AND&20)*2)OR((B%AND8)*4)OR((B%AND2)*8)
 1140 C%=((C%AND&80)DIV16)OR((C%AND&20)DIV8)OR((C%AND8)DIV4)OR(C%AND1)
 1150 =B%ORC%
 1170 DEFFNmode1
 1180 A%=BGET#in%:IFxs%=2:A%=BGET#in%
 1190 B%=BGET#in%:IFxs%=2:B%=BGET#in%
 1200 C%=BGET#in%:IFxs%=2:C%=BGET#in%
 1210 D%=BGET#in%:IFxs%=2:D%=BGET#in%
 1220 A%=((A%AND2)*64)OR((A%AND1)*8)
 1230 B%=((B%AND2)*32)OR((B%AND1)*4)
 1240 C%=((C%AND2)*16)OR((C%AND1)*2)
 1250 D%=((D%AND2)*8)OR(D%AND1)
 1260 =A%ORB%ORC%ORD%
 1280 DEFFNmode2
 1290 A%=BGET#in%:A%=BGET#in%
 1300 B%=BGET#in%:B%=BGET#in%
 1310 A%=((A%AND8)*16)OR((A%AND4)*8)OR((A%AND2)*4)OR((A%AND1)*2)
 1320 B%=((B%AND8)*8)OR((B%AND4)*4)OR((B%AND2)*2)OR(B%AND1)
 1330 =A%ORB%
 1350 DEFPROCsyntax:PRINT"Syntax: BMPtoBBC <bitmap> <bbcfile> -mode <mode> -inf -verbose":ENDPROC
 1360 DEFFNrd32(I%):FORA%=0TO3:zp%?A%=BGET#I%:NEXT:=!zp%
 1370 DEFFNrd16(I%):=BGET#I%+256*BGET#I%
 1400 DEFFNh0(A%,N%)=RIGHT$("0000000"+STR$~A%,N%)
 1430 DEFPROCClose_All:*EXEC
 1440 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
 1450 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
 1460 ENDPROC
 1490 DEFFNOS_GetEnv:LOCALA$,A%,X%,Y%:X%=1:os%=((USR&FFF4)AND&FF00)DIV256
 1500 IFos%=32:IFPAGE>&FFFF:DIMX%LOCAL256:SYS"GetModuleFileName",0,X%,255:run$=$$X%:=@cmd$
 1510 IFos%=32:A$=$&100
 1520 IFLENA$=0:IFHIMEM>&FFFF:run$=$&8100:SYS16TOA$,,A%:SYS72,"",A%:A$=MID$(A$,1+INSTR(A$+" "," ",1+INSTR(A$," "))):IFLENA$=0:A$=run$
 1530 IFLENA$=0:IF?(TOP-3):A$=$&600ELSEIFLENA$=0:A$=$(PAGE-&300)
 1540 FORY%=-1TO0:A$=" "+A$:REPEATA$=MID$(A$,2):UNTILASCA$<>32
 1550   IFY%:IFASCA$=34:A%=INSTR(A$,"""",2)+1ELSEIFY%:A%=INSTR(A$+" "," ")
 1560   IFY%:run$=LEFT$(A$,A%-1):IFrun$<>"":A$=MID$(A$,A%+1)
 1570 NEXT:=A$
 1580 DEFPROCos(A$):IFASCA$=42:OSCLIA$ELSEIFA$<>"":CHAINA$
 1590 ENDPROC
 1600 DEFPROCexit(A%):OSCLI"FX1,"+STR$(A%AND255):quit$=quit$:A$=quit$:quit$="":PROCos(A$)
 1610 IFos%=32:QUITA%
 1620 IFos%<6:ENDELSE*Quit
 1630 ENDPROC
 1660 DEFFNcl(l$,n%):IFl$="":A$=FNs(A$):IFASCA$=34:A%=INSTR(A$+" "" ",""" ",2):l$=MID$(A$,2,A%-2):A$=FNs(MID$(A$,A%+1)):=l$
 1670 IFl$="":A%=INSTR(A$+" "," "):l$=LEFT$(A$,A%-1):A$=FNs(MID$(A$,A%+1)):=l$
 1680 IFn%=0:IFl$<>"":A%=INSTR(A$,l$):IFA%:A$=FNs(LEFT$(A$,A%-1)+MID$(A$,INSTR(A$," ",A%)+1))+" ":=TRUE
 1690 IFn%=0:IFl$<>"":=FALSE
 1700 A%=INSTR(LEFT$(" ",ASCl$=32)+A$,l$):IFA%=0:=""
 1710 A$=LEFT$(A$,A%-1)+FNs(MID$(A$,INSTR(A$," ",A%)+1))
 1720 IFASCl$=32:l$=MID$(A$,A%):A$=LEFT$(A$,A%-1):=MID$(l$,1-(ASCl$=34),LENl$+2*(ASCl$=34))
 1730 IFASCMID$(A$,A%,1)<>34:l$=MID$(A$,A%,INSTR(A$+" "," ",A%)-A%):A$=LEFT$(A$,A%-1)+MID$(A$,A%+LENl$+1):=l$
 1740 l$=MID$(A$,A%+1,INSTR(A$+""" ",""" ",A%+1)-A%-1):A$=LEFT$(A$,A%-1)+MID$(A$,A%+LENl$+3):=l$
 1750 DEFFNs(A$):IFLEFT$(A$,1)=" ":REPEATA$=MID$(A$,2):UNTILLEFT$(A$,1)<>" "
 1760 IFRIGHT$(A$,1)=" ":REPEATA$=LEFT$(A$,LENA$-1):UNTILRIGHT$(A$,1)<>" "
 1770 =A$
 1800 DEFPROCWin_TextIO
 1810 SYS"GetStdHandle",-10TO@hfile%(1):*INPUT 13
 1820 SYS"GetStdHandle",-11TO@hfile%(2):*OUTPUT 14
 1830 SYS"SetConsoleMode",@hfile%(1),0:ENDPROC
 1860 DEFFNfile(A$,A%):IFos%<32:$name%=A$:?X%=name%:X%?1=name%DIV256:=(USR&FFDD)AND&FF
 1870 IFINSTR(A$,".")=0:A$=A$+"."
 1880 IFA%=255ORA%=5:X%!14=OPENIN(A$):IFX%!14:X%!10=EXT#X%!14:CLOSE#X%!14:X%!14=&33
 1890 IFA%=255:IFX%?6=0:OSCLI"LOAD """+A$+""" "+STR$~X%!2:=1
 1900 IFA%=5:IFX%!14:=1ELSEIFA%=5:=0
 1910 IFA%=0:OSCLI"SAVE """+A$+""" "+STR$~X%!10+" "+STR$~X%!14:X%!10=X%!14-X%!10:=1
 1920 IFA%=7:OSCLI"SAVE """+A$+""" "+STR$~PAGE+"+"+STR$~X%!10:X%!10=X%!14-X%!10:=1
 1930 IFA%=8THEN
 1940   LOCALERROR:ONERRORLOCAL:=2
 1950   OSCLI"mkdir "+A$:=2
 1960 ENDIF
 1970 =0