10
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