Home » Archimedes archive » Apps » Acorn Applications Update (1994)(Acorn Computers).adf » !ChangeFSI/ChangeFSI
!ChangeFSI/ChangeFSI
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
| Tape/disk: | Home » Archimedes archive » Apps » Acorn Applications Update (1994)(Acorn Computers).adf |
| Filename: | !ChangeFSI/ChangeFSI |
| Read OK: | ✔ |
| File size: | 2379F bytes |
| Load address: | FFFFFB45 |
| Exec address: | 296F1210 |
File contents
10REM > ChangeFSI
130DEF FNChangeFSIVersion="0.95 (17th Feb 94)"
140areanumber%=0
150SYS"OS_GetEnv" TO A$
160IFINSTR(A$," -wimp") THEN
170DIM z%(1),p%(2),s%(3),m$(21)
180A%=OPENIN"<ChangeFSI$Dir>.Messages"
190B%=-1:REPEAT B%+=1:m$(B%)=GET$#A%:UNTILEOF#A%:CLOSE#A%
200startfile%=RIGHT$(A$,6)<>"-wimp "
210DIM taskid%4:$taskid%="TASK"
220SYS "Wimp_Initialise",200,!taskid%,m$(20) TO version%
230Wimp = (1<<18) + (3<<6)
240CreateW = Wimp+1:OpenW = Wimp+5
250CloseW = Wimp+6:RedrawW = Wimp+8
260UpdateW = Wimp+9:GetR% = Wimp+10
270GetW = Wimp+11:SetI = Wimp+13
280GetI = Wimp+14:GetP = Wimp+15
290Drag = Wimp+16:CrMenu = Wimp+20
300DcMenu = Wimp+21
310SYS "OS_SWINumberFromString",,"Wimp_PollIdle" TO Poll%
320SYS "OS_SWINumberFromString",,"OS_SpriteOp" TO spop%
330SYS "OS_SWINumberFromString",,"OS_ReadMonotonicTime" TO Time%
340SYS "OS_SWINumberFromString",,"ColourTrans_ReturnColourNumber" TO ctran%
350SYS "XOS_SWINumberFromString",,"DragASprite_Start" TO dstart%;f%:IFf%AND 1 dstart%=0
360SYS "OS_Byte",161,&1C TO ,,f%:IF(f% AND 2)=0 dstart%=0
370nextlocation%=HIMEM
380SYS "Wimp_SlotSize",-1,-1 TO originalslot%
400IF version%>=300 THEN
410DIM q% 255,ifactors% 15,factors% 15,pixtrans% 255,paltemp% 1023,buffer% 255,idata% 1023
420ELSE
430DIM z% 1223,q% 255,ifactors% 15,factors% 15,pixtrans% 255,paltemp% 1023,buffer% 255,idata% 2399
440ENDIF
460scrap%=FALSE
470IF version%<300 sidata%=idata%
480sprite%=FALSE:sar%=FALSE:saved%=TRUE:z$=STRING$(12,CHR$13)
500SYS "OS_Byte",161,&8C TO ,,f%
510IFf% AND 1 THEN
520SYS"Wimp_OpenTemplate",,"<ChangeFSI$Dir>.3dTemplate"
530ELSE
540SYS"Wimp_OpenTemplate",,"<ChangeFSI$Dir>.Templates"
550ENDIF
570LOCAL ERROR
580ON ERROR SYS"Wimp_CloseTemplate":ERROR 0,REPORT$+" (code "+STR$ERL+")"
600IFversion%>=300 THEN
610DIM z% FNlargest_buffer
620indsize%=FNsize_indirect("Info")
630DIM info_wind% indsize%
640SYS"Wimp_LoadTemplate",,z%,info_wind%,info_wind%+indsize%,-1,"Info"+z$,0
650ELSE
660SYS"Wimp_LoadTemplate",,z%,idata%,sidata%+2500,-1,"Info"+z$,0 TO ,,idata%
670ENDIF
680SYS CreateW,,z% TO infow%:$!(z%+88+7*32+20)=FNChangeFSIVersion
700IFversion%>=300 THEN
710indsize%=FNsize_indirect("Processing")
720DIM proc_wind% indsize%
730SYS"Wimp_LoadTemplate",,z%,proc_wind%,proc_wind%+indsize%,-1,"Processing",0
740ELSE
750SYS"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Processing",0 TO ,,idata%
760ENDIF
770SYS CreateW,,z% TO proc%
780p%(0)=!(z%+88+8*32+20):p%(1)=!(z%+88+9*32+20):p%(2)=!(z%+88+10*32+20)
800IFversion%>=300 THEN
810indsize%=FNsize_indirect("Output")
820DIM outp_wind% indsize%
830SYS"Wimp_LoadTemplate",,z%,outp_wind%,outp_wind%+indsize%,-1,"Output"+z$,0
840ELSE
850SYS"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Output"+z$,0 TO ,,idata%
860ENDIF
870SYS CreateW,,z% TO output%:admode%=!(z%+88+17*32+20):adspcl%=!(z%+88+16*32+20)
890IFversion%>=300 THEN
900indsize%=FNsize_indirect("Scaling")
910DIM scal_wind% indsize%
920SYS"Wimp_LoadTemplate",,z%,scal_wind%,scal_wind%+indsize%,-1,"Scaling"+z$,0
930ELSE
940SYS"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Scaling"+z$,0 TO ,,idata%
950ENDIF
960SYS CreateW,,z% TO scalew%:adscale%=!(z%+88+1*32+20)
970s%(0)=!(z%+88+10*32+20):s%(1)=!(z%+88+11*32+20)
980s%(2)=!(z%+88+12*32+20):s%(3)=!(z%+88+13*32+20)
1000IFversion%>=300 THEN
1010indsize%=FNsize_indirect("Save")
1020DIM save_wind% indsize%
1030SYS"Wimp_LoadTemplate",,z%,save_wind%,save_wind%+indsize%,-1,"Save"+z$,0
1040ELSE
1050SYS"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Save"+z$,0 TO ,,idata%
1060ENDIF
1070SYS CreateW,,z% TO save%:adsave%=!(z%+88+1*32+20)
1090IFversion%>=300 THEN
1100indsize%=FNsize_indirect("Sprite")
1110DIM sprt_wind% indsize%
1120SYS"Wimp_LoadTemplate",,z%,sprt_wind%,sprt_wind%+indsize%,-1,"Sprite"+z$,0
1130ELSE
1140SYS"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Sprite"+z$,0 TO ,,idata%
1150ENDIF
1160SYS CreateW,,z% TO sinfo%:adsname%=!(z%+88+5*32+20):adsbytes%=!(z%+88+8*32+20)
1170adsx%=!(z%+88+7*32+20):adsy%=!(z%+88+9*32+20):adsm%=!(z%+88+6*32+20)
1190IFversion%>=300 THEN
1200indsize%=FNsize_indirect("Source")
1210DIM src_wind% indsize%
1220SYS"Wimp_LoadTemplate",,z%,src_wind%,src_wind%+indsize%,-1,"Source"+z$,0
1230ELSE
1240SYS"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Source"+z$,0 TO ,,idata%
1250ENDIF
1260SYS CreateW,,z% TO srcinfo%:adsrc%=!(z%+88+0*32+20)
1280IFversion%>=300 THEN
1290indsize%=FNsize_indirect("Range")
1300DIM range_wind% indsize%
1310SYS"Wimp_LoadTemplate",,z%,range_wind%,range_wind%+indsize%,-1,"Range"+z$,0
1320ELSE
1330SYS"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Range"+z$,0 TO ,,idata%
1340ENDIF
1350SYS CreateW,,z% TO raninfo%:adran%=!(z%+88+0*32+20)
1370IFversion%>=300 THEN
1380indsize%=FNsize_indirect("Zoom")
1390DIM zoom_wind% indsize%
1400SYS"Wimp_LoadTemplate",,z%,zoom_wind%,zoom_wind%+indsize%,-1,"Zoom"+z$,0
1410ELSE
1420SYS"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Zoom"+z$,0 TO ,,idata%
1430ENDIF
1440SYS CreateW,,z% TO zoom%:z%(0)=!(z%+88+4*32+20):z%(1)=!(z%+88+5*32+20)
1460IFversion%>=300 THEN
1470indsize%=FNsize_indirect("Pic")
1480DIM pic_wind% indsize%
1490SYS"Wimp_LoadTemplate",,z%,pic_wind%,pic_wind%+indsize%,-1,"Pic"+z$,0
1500ELSE
1510SYS"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Pic"+z$,0
1520ENDIF
1530SYS CreateW,,z% TO pic%:adtitle%=z%!72
1550RESTORE ERROR
1560SYS"Wimp_CloseTemplate"
1570!q%=-1:q%!4=0:q%!8=0:q%!12=68:q%!16=68:q%!20=%11000000000010
1580$(q%+24)="!"+m$(20):SYS"Wimp_CreateIcon",,q% TO iconbar%
1590A%=OPENIN"<ChangeFSI$Dir>.Choices":IFA%=0 THEN
1600fast%=FALSE:statescale%=%10000000100:stateproc%=0:stateoutput%=&a008
1610$p%(0)="":$p%(1)="2.2":$p%(2)="24":$adspcl%=""
1620$admode%="28":$s%(0)="1":$s%(1)="4":$s%(2)="1":$s%(3)="4"
1630ELSE
1640INPUT#A%,fast%,statescale%,stateproc%,stateoutput%
1650INPUT#A%,$p%(0),$p%(1),$p%(2),$admode%,$adspcl%
1660INPUT#A%,$s%(0),$s%(1),$s%(2),$s%(3)
1670CLOSE#A%
1680ENDIF
1690q%!12=1<<21
1700!q%=scalew%:FORI%=0TO9:IFstatescale%>>I%AND1 q%!8=1<<21 ELSEq%!8=0
1710q%!4=I%:SYS SetI,,q%:NEXT
1720FORI%=10TO13:IFstatescale%>>I%AND1 q%!8=1<<21 ELSEq%!8=0
1730q%!4=I%+6:SYS SetI,,q%:NEXT
1740!q%=proc%:FORI%=0TO7:IFstateproc%>>I%AND1 q%!8=1<<21 ELSEq%!8=0
1750q%!4=I%:SYS SetI,,q%:NEXT
1760!q%=output%:FORI%=0TO15:IFstateoutput%>>I%AND1 q%!8=1<<21 ELSEq%!8=0
1770q%!4=I%:SYS SetI,,q%:NEXT
1780PROCshowscaletofit:$z%(0)="1":$z%(1)="1"
1790SYS "OS_UpdateMEMC" TO oldmemc
1810ON ERROR SYS"OS_UpdateMEMC",oldmemc,&700:PROCerrorbox:SYS CrMenu,,-1
1820SYS Drag,,-1
1830IFNOTsprite% SYS "Wimp_SlotSize",originalslot%,-1
1840F$="":IFstartfile% startfile%=FALSE:F$=MID$(A$,INSTR(A$,"-wimp")+6):PROCcallFSI
1850REPEAT
1860SYS Poll%,1,q% TO A%
1870CASE A% OF
1880WHEN 1 :IFsprite% PROCredraw_window(!q%)
1890WHEN 2 :PROCopen_window(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,q%!24,q%!28)
1900WHEN 3 :SYS &400c3,,q%:nextlocation%=HIMEM:PROCremovearea
1910SYS "Wimp_SlotSize",originalslot%,-1:saved%=TRUE:sprite%=FALSE
1920WHEN 6 :PROCcheckmouse(!q%,q%!4,q%!8,q%!12,q%!16,q%!20)
1930WHEN 7 :SYS GetP,,q%:dw%=q%!12:di%=q%!16:IFdstart% SYS"DragASprite_Stop"
1940q%!12=0:q%!16=1:q%!20=dw%:q%!24=di%:q%!28=!q%:q%!32=q%!4
1950q%!36=!sar%+3:q%!40=&ff9:$adsave%=FNZS(adsave%)
1960foo%=INSTR($adsave%,"."):WHILEfoo%
1970$adsave%=MID$($adsave%,foo%+1):foo%=INSTR($adsave%,".")
1980ENDWHILE
1990$(q%+44)=$adsave%+CHR$0:!q%=44+(LEN$adsave%+1+3ANDNOT3)
2000SYS "Wimp_SendMessage",17,q%,dw%,di%:myref%=q%!8
2010WHEN 8 :PROCkey(!q%,q%!4,q%!24)
2020WHEN 9 :PROCmenuselect(q%)
2030WHEN 17,18:PROCreceive(q%)
2040ENDCASE
2050UNTIL FALSE
2060ELSE
2070Q%=HIMEM
2080END=&4000000
2090ON ERROR ON ERROR OFF:OSCLI"Set ChangeFSI$ReturnCode "+REPORT$+" (code "+STR$ERL+")":PROCremovearea:CLEAR:END=Q%:END
2100foo%=0:A%=FNChangeFSI(A$,-1,-1,0,-1,-1,foo%,TRUE)
2110PROCremovearea:*unset ChangeFSI$ReturnCode
2120CLEAR:END=Q%
2130ENDIF
2140END
2160DEF FNsize_indirect(name$)
2170LOCAL size%
2180SYS "Wimp_LoadTemplate",,0,,,,name$+z$,0 TO ,,size%
2190=size%
2210DEF FNwinsize_indirect(name$)
2220LOCAL size%
2230SYS "Wimp_LoadTemplate",,0,,,,name$+z$,0 TO ,size%
2240=size%
2290DEF FNlargest_buffer
2300LOCAL largest_tem%,size%,here%,name
2310DIM name 12
2320$name="*":here%=0:largest_tem%=0
2330SYS "Wimp_LoadTemplate", ,0,,,,name,0 TO ,size%,,,,,here%
2340WHILE here%
2350IF largest_tem%<size% largest_tem%=size%
2360$name= "*"
2370SYS "Wimp_LoadTemplate", ,0,,,,name,here% TO ,size%,,,,,here%
2380ENDWHILE
2390=largest_tem%
2410DEF PROCreceive(q%)
2420CASE q%!16 OF
2430WHEN 0:PROCcheckandfinish
2440WHEN 1:IFq%!20<>save% THEN
2450!q%=60:q%!12=q%!8:q%!16=2:q%!36=-1:$(q%+44)="<Wimp$Scrap>"+CHR$0
2460SYS"Wimp_SendMessage",17,q%,q%!4:scrap%=q%!8
2470ENDIF
2480WHEN 2:SYSspop%,&10C,sar%,FNZS(q%+44):$adsave%=FNZS(q%+44)
2490q%!12=q%!8:q%!16=3:SYS "Wimp_SendMessage",18,q%,q%!4
2500IF q%!36<>-1 saved%=TRUE
2510SYS CrMenu,,-1
2520WHEN 3:F$=FNZS(q%+44):IFscrap% scrap%=scrap%=q%!12
2530q%!12=q%!8:q%!16=4:SYS"Wimp_SendMessage",17,q%,q%!4
2540PROCcallFSI
2550WHEN 5:CASE q%!40 OF
2560WHEN &ff0,&c85
2570q%!12=q%!8:q%!16=4:SYS"Wimp_SendMessage",17,q%,q%!4
2580F$=FNZS(q%+44):PROCcallFSI
2590ENDCASE
2600WHEN9,&400C1:IFsprite% PROCgetmodeinfo:SYS&400d1,pic%,0,-32767,32767,0
2610PROCshowscaletofit
2620WHEN 10:SYS"XOS_ReadVarVal","ChangeFSI$Dir",paltemp%,256,0,3 TO,,bootlen%
2630paltemp%?bootlen%=13
2640BPUT#q%!20,"Run "+$paltemp%
2650ENDCASE
2660ENDPROC
2680DEF PROCcallFSI
2690A$=FNdeducemode:A%=47
2700IFFNgeticonstate(output%,12) THEN
2710A$+=$adspcl%
2720ELSE
2730IFFNgeticonstate(output%,13) THEN
2740IFFNgeticonstate(output%,2)ORFNgeticonstate(output%,8) A$+="R"
2750ELSE
2760SYS53,VALA$,3 TO,,A%
2770IFA%=63 THEN
2780IFFNgeticonstate(output%,3) A$="27t"
2790IFFNgeticonstate(output%,9) A$="12t"
2800ELSE
2810IFA%=255 A$+="d"
2820ENDIF
2830ENDIF
2840ENDIF
2850A$="garbage "+F$+" <ChangeFSI$Dir>.Foo "+A$
2860IFFNgeticonstate(scalew%,1) A$+=" "+STR$tofitx+": "+STR$tofity+":"
2870IFFNgeticonstate(scalew%,5) A$+=" 1:2"
2880IFFNgeticonstate(scalew%,4) A$+=" 1:2 1:1"
2890IFFNgeticonstate(scalew%,3) A$+=" 1:1 1:2"
2900IFFNgeticonstate(scalew%,9) THEN
2910IFVAL$s%(0) A$+=" "+$s%(0) ELSEA$+=" 1"
2920A$+=":"+$s%(1)
2930IFVAL$s%(2) A$+=" "+$s%(2) ELSEA$+=" 1"
2940A$+=":"+$s%(3)
2950ENDIF
2960IFFNgeticonstate(scalew%,0) A$+=" -nosize"
2970IFFNgeticonstate(scalew%,18) A$+=" -noscale"
2980IFFNgeticonstate(scalew%,19) A$+=" -lock"
2990IFFNgeticonstate(scalew%,6) THEN
3000IFFNgeticonstate(scalew%,16) A$+=" -rotate" ELSEA$+=" -rotate-"
3010ENDIF
3020IFFNgeticonstate(scalew%,7) A$+=" -hflip"
3030IFFNgeticonstate(scalew%,8) A$+=" -vflip"
3040IFFNgeticonstate(proc%,0) A$+=" -range"
3050IFFNgeticonstate(proc%,1) A$+=" -equal"
3060IFFNgeticonstate(proc%,2) A$+=" -nodither"
3070IFFNgeticonstate(proc%,3) A$+=" -invert"
3080IFFNgeticonstate(proc%,4) A$+=" -brighten"
3090IFFNgeticonstate(proc%,5) A$+=" -black"+$p%(0)
3100IFFNgeticonstate(proc%,6) A$+=" -gamma"+$p%(1)
3110IFFNgeticonstate(proc%,7) A$+=" -sharpen"+$p%(2)
3120info$="":range$=m$(19):cputime%=0
3130IFsprite% !q%=pic%:SYS &400c3,,q%:saved%=TRUE:sprite%=FALSE
3140nextlocation%=HIMEM
3150SYS "Wimp_SlotSize",originalslot%,-1:PROCremovearea
3160IFfast% SYS "OS_UpdateMEMC",&300,&700 TO oldmemc
3170A%=FNChangeFSI(A$,-1,-1,nextlocation%,0,0,sar%,0)
3180IFfast% SYS "OS_UpdateMEMC",oldmemc,&700
3190IFscrap% scrap%=FALSE:SYS"OS_File",6,F$
3200IFA%<2 AND sar%<>0 THEN
3210SYS spop%,&10d,sar%,pixtrans%,255,1
3220n$=FNZS(pixtrans%):SYS spop%,&128,sar%,n$ TO,,,x,y,,m
3230$adsx%=STR$x:$adsy%=STR$y:$adsm%=STR$m:$adsname%=n$
3240$adsbytes%=STR$sar%!12:$adran%=range$
3250$adsrc%=info$+m$(0)+STR$(cputime%/100)+m$(1)
3260A%=LENF$:WHILEMID$("."+F$,A%,1)<>".":A%-=1:ENDWHILE
3270$adsave%=MID$("."+F$,A%+1)
3280SYS&35,m,4 TO,,nx:x=x<<nx
3290SYS&35,m,5 TO,,ny:y=y<<ny
3300saved%=FALSE:sprite%=TRUE:PROCgetmodeinfo
3310pic%=FNcreate_window(x,y,F$)
3320PROCpopup(pic%,-1)
3330ENDIF
3340ENDPROC
3360DEF PROCcheckandfinish
3370IFsaved% ORNOTsprite% PROCremovearea:SYS "Wimp_CloseDown":END
3380!buffer%=ERR:$(buffer%+4)=m$(2)+F$+m$(3)+CHR$0
3390SYS "Wimp_ReportError",buffer%,%10111,m$(20) TO ,A%
3400IFA%=1 PROCremovearea:SYS "Wimp_CloseDown":END
3410ENDPROC
3430DEF PROCkey(handle%,icon%,key%)
3440IFkey%=&1b SYS CrMenu,,-1:ENDPROC
3450CASE handle% OF
3460WHEN zoom%:CASE key% OF
3470WHEN 13:PROCdozoom(icon%-4,0):IFicon%=4 SYS &400d2,zoom%,5,,,-1,LEN$z%(0)
3480IFicon%=5 SYS CrMenu,,-1
3490ENDPROC
3500WHEN &18e,&18f:PROCdozoom(icon%-4,0)
3510SYS &400d2,zoom%,icon%EOR1,,,-1,LEN$z%(icon%EOR5):ENDPROC
3520ENDCASE
3530WHEN save%
3540IFkey%=13 PROCsavesprite:ENDPROC
3550WHEN output%
3560PROCshowscaletofit
3570IFkey%=13 SYS CrMenu,,-1:ENDPROC
3580IFkey%=&18e ORkey%=&18f THEN
3590icon%=icon%EOR1:key%=admode%:IFicon%=16 key%=adspcl%
3600SYS &400d2,output%,icon%,,,-1,LEN$key%:ENDPROC
3610ENDIF
3620WHEN proc%:CASE key% OF
3630WHEN &18e,13:icon%+=1:IFicon%>10 icon%=8:IFkey%=13 SYS CrMenu,,-1:ENDPROC
3640SYS &400d2,proc%,icon%,,,-1,LEN$p%(icon%-8):ENDPROC
3650WHEN &18f:icon%-=1:IFicon%<8 icon%=10
3660SYS &400d2,proc%,icon%,,,-1,LEN$p%(icon%-8):ENDPROC
3670ENDCASE
3680WHEN scalew%:CASE key% OF
3690WHEN &18e,13:icon%+=1:IFicon%>13 icon%=10:IFkey%=13 SYS CrMenu,,-1:ENDPROC
3700SYS &400d2,scalew%,icon%,,,-1,LEN$s%(icon%-10):ENDPROC
3710WHEN &18f:icon%-=1:IFicon%<10 icon%=13
3720SYS &400d2,scalew%,icon%,,,-1,LEN$s%(icon%-10):ENDPROC
3730ENDCASE
3740ENDCASE
3750SYS "Wimp_ProcessKey",key%
3760ENDPROC
3780DEF PROCsavesprite
3790SYS spop%,&10C,sar%,$adsave%
3800SYS CrMenu,,-1
3810ENDPROC
3830DEF PROCcheckmouse(mousex%,mousey%,b%,handle%,icon%,ob%)
3840IFb%AND2 THEN
3850CASE handle% OF
3860WHEN pic%:PROCdomenu(pic%,m$(4)+">sinfo%,"+m$(5)+">srcinfo%,"+m$(6)+">raninfo%,"+m$(7)+">zoom%,"+m$(8)+">save%,"+m$(9),m$(20))
3870WHEN -2:PROCdomenu(101,m$(10)+">infow%,"+m$(11)+">scalew%,"+m$(12)+">proc%,"+m$(13)+">output%,"+m$(9)+","+m$(14)+":fast%AND1,"+m$(15)+","+m$(16),m$(20))
3880ENDCASE
3890rmenuhandle%=handle%
3900ENDIF
3910IFb%AND4 THEN
3920CASE handle% OF
3930WHEN zoom%:CASE icon% OF
3940WHEN 0:PROCdozoom(0,1)
3950WHEN 1:PROCdozoom(0,-1)
3960WHEN 2:PROCdozoom(1,1)
3970WHEN 3:PROCdozoom(1,-1)
3980ENDCASE
3990ENDCASE
4000ENDIF
4010IFb%AND1 THEN
4020CASE handle% OF
4030WHEN zoom%:CASE icon% OF
4040WHEN 0:PROCdozoom(0,-1)
4050WHEN 1:PROCdozoom(0,1)
4060WHEN 2:PROCdozoom(1,-1)
4070WHEN 3:PROCdozoom(1,1)
4080ENDCASE
4090ENDCASE
4100ENDIF
4110IFb%AND5 THEN
4120CASE handle% OF
4130WHEN output%:CASE icon% OF
4140WHEN 0,1,2,3:PROCkillcurrent(STR$(25+icon%))
4150WHEN 4:PROCkillcurrent("S16,90,90")
4160WHEN 5:PROCkillcurrent("S32,90,90")
4170WHEN 6:PROCkillcurrent("0")
4180WHEN 7:PROCkillcurrent("8")
4190WHEN 8:PROCkillcurrent("12")
4200WHEN 9:PROCkillcurrent("15")
4210WHEN 10:PROCkillcurrent("S16,90,45")
4220WHEN 11:PROCkillcurrent("S32,90,45")
4230ENDCASE
4240IFFNgeticonstate(output%,15) $admode%=FNdeducemode
4250!q%=output%:q%!4=17:q%!8=0:q%!12=0:SYS SetI,,q%
4260PROCshowscaletofit
4270WHEN save%:CASE icon% OF
4280WHEN 2:PROCsavesprite
4290ENDCASE
4300WHEN -2:IFsprite% PROCgetw(pic%):PROCopen_window(pic%,x0%,y0%,x1%,y1%,scx%,scy%,-1)
4310ENDCASE
4320ENDIF
4330IFb%AND&50 THEN
4340CASE handle% OF
4350WHEN save%:CASE icon% OF
4360WHEN 0:PROCgetw(save%)
4370!q%=save%:q%!4=0:SYS GetI,,q%
4380!q%=save%:q%!4=5
4390q%!8+=bx%:q%!12+=by%:q%!16+=bx%:q%!20+=by%
4400q%!24=0:q%!28=0:q%!32=&7FFFFFFF:q%!36=&7FFFFFFF
4410IFdstart% SYS dstart%,%11000101,1,"file_ff9",q%+8,q%+24 ELSESYS "Wimp_DragBox",,q%
4420ENDCASE
4430ENDCASE
4440ENDIF
4450ENDPROC
4470DEF PROCdozoom(s%,a%)
4480IFs%=0 THEN
4490$z%(0)=STR$(VAL$z%(0)+a%):IF$z%(0)="0" $z%(0)="1"
4500ELSE
4510$z%(1)=STR$(VAL$z%(1)+a%):IF$z%(1)="0" $z%(1)="1"
4520ENDIF
4530!q%=zoom%:q%!4=4+s%:q%!8=0:q%!12=0:SYS SetI,,q%
4540!q%=pic%:SYS GetW,,q%:f%=q%!28:SYS &400c3,,q%
4550pic%=FNcreate_window(x,y,F$)
4560PROCpopup(pic%,f%)
4570ENDPROC
4590DEF PROCdomenu(handle%,menu$,menutitle$)
4600menuhandle%=handle%
4610menuptr%=buffer%:indirect%=idata%
4620i%=0
4630menuptr%!20=44
4640$menuptr%=menutitle$
4650menuptr%?12=7:menuptr%?13=2:menuptr%?14=7:menuptr%?15=0
4660menuptr%!16=200:menuptr%!24=0
4670menuptr%+=28
4680REPEAT i1%=i%+1:i%=INSTR(menu$+",",",",i1%)
4690item$=MID$(menu$,i1%,i%-i1%):PROCmenuitem(item$):UNTIL item$=""
4700menuptr%!-24=(menuptr%!-24)OR&80
4710IFhandle%=101 SYS CrMenu,,buffer%,mousex%-64,96+8*44 ELSESYS CrMenu,,buffer%,mousex%-32,mousey%+16
4720ENDPROC
4740DEF PROCmenuitem(text$)
4750IF text$="" ENDPROC
4760flg%=0:submenu%=-1:I%=INSTR(text$,":"):IFI%THEN
4770flg%=EVALMID$(text$,I%+1):text$=LEFT$(text$,I%-1)
4780ENDIF
4790I%=INSTR(text$,">"):IFI%THEN
4800submenu%=EVALMID$(text$,I%+1):text$=LEFT$(text$,I%-1)
4810ENDIF
4820menuptr%!0=flg%
4830menuptr%!4=submenu%
4840IFtext$=m$(9)ANDF$="" menuptr%!8=&07400021 ELSEmenuptr%!8=&07000021
4850IFLENtext$*16+8>buffer%!16 buffer%!16=LENtext$*16+8
4860IFLENtext$>12 THEN
4870menuptr%!8=menuptr%!8 OR 256:menuptr%!16=LENtext$
4880menuptr%!12=indirect%:$indirect%=text$:indirect%+=LENtext$+1
4890ELSE
4900$(menuptr%+12)=text$
4910ENDIF
4920menuptr%+=24
4930ENDPROC
4950DEF PROCmenuselect(menus%)
4960SYS GetP,,paltemp%:adjust%=paltemp%!8 AND 1
4970SYS DcMenu,,buffer%,menus%,STRING$(200," ")TO,,,a$
4980IF a$="" THENENDPROC
4990CASE menuhandle% OF
5000WHEN pic%
5010CASE a$ OF
5020WHEN m$(9):PROCcallFSI
5030ENDCASE
5040WHEN 101
5050CASE a$ OF
5060WHEN m$(14):fast%=NOTfast%
5070WHEN m$(9):PROCcallFSI
5080WHEN m$(15)
5090statescale%=0:FORI%=0TO9:statescale%+=FNgeticonstate(scalew%,I%)<<I%:NEXT
5100FORI%=10TO13:statescale%+=FNgeticonstate(scalew%,I%+6)<<I%:NEXT
5110stateproc%=0:FORI%=0TO7:stateproc%+=FNgeticonstate(proc%,I%)<<I%:NEXT
5120stateoutput%=0:FORI%=0TO15:stateoutput%+=FNgeticonstate(output%,I%)<<I%:NEXT
5130A%=OPENOUT"<ChangeFSI$Dir>.Choices"
5140PRINT#A%,fast%,statescale%,stateproc%,stateoutput%
5150PRINT#A%,$p%(0),$p%(1),$p%(2),$admode%,$adspcl%
5160PRINT#A%,$s%(0),$s%(1),$s%(2),$s%(3)
5170CLOSE#A%
5180WHEN m$(16):PROCcheckandfinish
5190ENDCASE
5200ENDCASE
5210IFadjust% PROCcheckmouse(0,0,2,rmenuhandle%,0,0)
5220ENDPROC
5240DEF FNcreate_window(x,y,title$)
5250x=x*VAL$z%(0)DIVVAL$z%(1):y=y*VAL$z%(0)DIVVAL$z%(1)
5260!z%=0:z%!4=-y:z%!8=x:z%!12=0
5270z%!40=0:z%!44=-y:z%!48=x:z%!52=0
5280IFx<128 OR y<128 z%?35=0 ELSEz%?35=255
5290$adtitle%="":SYS CreateW,,z% TO handle%
5300$adtitle%=title$
5310=handle%
5330DEF PROCpopup(handle%,f%)
5340SYS "OS_ReadModeVariable",-1,4 TO ,,modexshift%
5350SYS "OS_ReadModeVariable",-1,5 TO ,,modeyshift%
5360SYS "OS_ReadModeVariable",-1,11 TO ,,rightscr%
5370SYS "OS_ReadModeVariable",-1,12 TO ,,topscr%
5380rightscr%=rightscr%<<modexshift%:topscr%=topscr%<<modeyshift%
5390PROCgetw(handle%)
5400xo%=rightscr%/2-(x0%+x1%)/2:yo%=topscr%/2-(y0%+y1%)/2
5410PROCopen_window(handle%,x0%+xo%,y0%+yo%,x1%+xo%,y1%+yo%,scx%,scy%,f%)
5420ENDPROC
5440DEF PROCopen_window(handle%,x0%,y0%,x1%,y1%,scx%,scy%,bhandle%)
5450IFhandle%=-1THENENDPROC
5460q%!0=handle%:q%!28=bhandle%
5470q%!4=x0%:q%!8=y0%:q%!12=x1%:q%!16=y1%
5480q%!20=scx%:q%!24=scy%
5490SYS OpenW,,q%
5500ENDPROC
5520DEF PROCgetw(handle%)
5530!q%=handle%:SYS GetW,,q%
5540PROCinfo(q%+4):bhandle%=q%!28:flags%=q%!32
5550ENDPROC
5570DEF PROCinfo(q%)
5580x0%=!q%:y0%=q%!4:x1%=q%!8:y1%=q%!12:scx%=q%!16:scy%=q%!20
5590bx%=x0%-scx%:by%=y1%-scy%
5600ENDPROC
5620DEF PROCredraw_window(handle%)
5630IF handle%=pic% THEN
5640!factors%=!ifactors%*VAL$z%(0):factors%!4=ifactors%!4*VAL$z%(0)
5650factors%!8=ifactors%!8*VAL$z%(1):factors%!12=ifactors%!12*VAL$z%(1)
5660PROCreduce(!factors%,factors%!8):PROCreduce(factors%!4,factors%!12)
5670!q%=handle%
5680SYS RedrawW,,q% TO more%
5690PROCinfo(q%+4):by%=by%-INT(y*VAL$z%(0)DIVVAL$z%(1))
5700WHILE more%
5710SYS spop%,&134,sar%,n$,bx%,by%,,factors%,spx%
5720SYS GetR%,0,q% TO more%
5730ENDWHILE
5740ENDIF
5750ENDPROC
5770DEF FNgeticonstate(handle%,icon%)
5780!q%=handle%:q%!4=icon%:SYS GetI,,q%
5790=q%!24>>21 AND 1
5810DEF PROCgetmodeinfo
5820SYS"Wimp_ReadPixTrans",&100,sar%,n$,,,,ifactors%,pixtrans%
5830SYS spop%,&118,sar%,n$ TO ,,sptr%
5840IF sptr%!32=44 THEN
5850palptr%=0
5860ELSE
5870FOR grab%=0 TO 2048-8 STEP 8
5880paltemp%!(grab%>>1)=sptr%!(grab%+44)
5890NEXT
5900palptr%=paltemp%
5910ENDIF
5920FORQ%=0TO255:pixtrans%?Q%=Q%:NEXT
5930IFsptr%!32=44+2048 THEN
5940FORQ%=0TO255:SYSctran%,palptr%!(Q%<<2)TOpixtrans%?Q%:NEXT
5950ELSE
5960SYS "ColourTrans_SelectTable",m,palptr%,-1,-1,pixtrans%
5970ENDIF
5980spx%=-1:FORQ%=0TO255:IFpixtrans%?Q%<>Q% spx%=pixtrans%
5990NEXT
6000ENDPROC
6020DEF FNdeducemode
6030LOCAL m,x,y
6040IFFNgeticonstate(output%,15) THEN
6050SYS&35,-1,9 TO,,m:IFm>3 THEN
6060SYS&35,-1,4 TO,,x:SYS&35,-1,5 TO,,y
6070x=180/(2^x):y=180/(2^y)
6080="S"+STR$(2^m)+","+STR$x+","+STR$y
6090ELSE
6100=STR$MODE
6110ENDIF
6120ELSE
6130=$admode%
6140ENDIF
6150=0
6170DEF PROCshowscaletofit
6180LOCAL m,x,y
6190$admode%=FNdeducemode
6200IF?admode%=ASC"S" THEN
6210IFVALMID$($admode%,5)>VALMID$($admode%,8) x=6 ELSEx=0
6220IFVALMID$($admode%,2)>16 x+=5 ELSEx+=4
6230SYS&35,-1,11 TO,,tofitx:SYS&35,-1,12 TO,,tofity
6240ELSE
6250m=VAL$admode%
6260SYS&35,m,11 TO,,tofitx:SYS&35,m,12 TO,,tofity
6270SYS&35,m,4 TO,,x:SYS&35,m,5 TO,,y:IFy>x x=6 ELSEx=0
6280SYS&35,m,9 TO,,y:x+=y
6290ENDIF
6300tofitx+=1:tofity+=1:$adscale%=m$(17)+STR$tofitx+m$(18)+STR$tofity
6310q%!12=1<<21:!q%=output%:FORI%=0TO11:IFI%=x q%!8=1<<21 ELSEq%!8=0
6320q%!4=I%:SYS SetI,,q%:NEXT
6330ENDPROC
6350DEF PROCkillcurrent(m$)
6360q%!12=1<<21:!q%=output%:q%!8=0
6370q%!4=17:SYS SetI,,q%
6380$admode%=m$
6390ENDPROC
6410DEFFNZS(I%)LOCALA$:REPEATA$+=CHR$?I%:I%+=1:UNTIL?I%<14:=A$
6430DEF PROCerrorbox
6440SYS Drag,,-1
6450!buffer%=ERR:$(buffer%+4)=REPORT$+" (code "+STR$ERL+")"+CHR$0
6460SYS "Wimp_ReportError",buffer%,%11,m$(20) TO ,A%
6470IFA%=2 PROCremovearea:SYS "Wimp_CloseDown":END
6480ENDPROC
6710DEF FNChangeFSI(A$,spritearea%,workspace%,worklimit%,oksave%,okinfo%,RETURN ram%,fast%)
6720LOCAL A$(),r%(),g%(),b%(),rpal%(),gpal%(),bpal%(),table%(),cl%(),xl%(),xl2%()
6730LOCAL xp%(),rm%(),rm1%(),rm2%(),vals%(),nl%(),A%(),B%(),new%(),st%()
6740WHILELEFT$(A$,1)<>" "ANDLENA$<>0 A$=MID$(A$,2):ENDWHILE
6750WHILELEFT$(A$,1)=" " A$=MID$(A$,2):ENDWHILE
6760WHILERIGHT$(A$,1)=" " A$=LEFT$(A$):ENDWHILE
6770IFFNuc(LEFT$(A$,5))="-QUIT" THEN
6780A$=MID$(A$,7):WHILELEFT$(A$,1)<>" "ANDLENA$<>0 A$=MID$(A$,2):ENDWHILE
6790WHILELEFT$(A$,1)=" " A$=MID$(A$,2):ENDWHILE
6800ENDIF
6810DIM A$(100):ARG%=0:B%=INSTR(A$," ")
6820WHILE B%<>0
6830ARG%+=1:A$(ARG%)=LEFT$(A$,B%-1):A$=MID$(A$,B%+1)
6840WHILE LEFT$(A$,1)=" ":A$=MID$(A$,2):ENDWHILE
6850B%=INSTR(A$," ")
6860ENDWHILE
6870IFA$<>"" ARG%+=1:A$(ARG%)=A$
6880invert%=FALSE:range%=FALSE:sharpen%=FALSE:info%=FALSE:cache%=FALSE:cacheareanumber%=0:dither%=TRUE:black%=FALSE
6890hist%=FALSE:equal%=FALSE:vflip%=FALSE:hflip%=FALSE:scale%=TRUE:scaleo%=TRUE:scrapf%=FALSE
6900gamma=1:rotate%=FALSE:max%=20000000:bright%=15:lock%=FALSE
6910rwt=.299:gwt=.587:bwt=.114
6920IFARG%<3 THEN
6930PRINT"ChangeFSI interactive input (read FSIinfo for command line details)"
6940INPUT"Source file: "s$,"Destination file: "f$,"Output mode: "m$
6950INPUT"(X)Scale (e.g. 2:1): "xs$:INPUT"Y Scale: "ys$
6960INPUT"Info on input picture?"a$:IFFNuc(LEFT$(a$,1))="Y" info%=TRUE
6970INPUT"Invert picture colours?"a$:IFFNuc(LEFT$(a$,1))="Y" invert%=TRUE
6980INPUT"Compute histogram of input?"a$:IFFNuc(LEFT$(a$,1))="Y" hist%=TRUE
6990INPUT"Apply histogram equalisation?"a$:IFFNuc(LEFT$(a$,1))="Y" equal%=TRUE
7000INPUT"Expand input dynamic range?"a$:IFFNuc(LEFT$(a$,1))="Y" range%=TRUE:equal%=FALSE
7010INPUT"Sharpen picture by (e.g. 12 for harsh, 24 for soft) "a$
7020IFa$<>"" sharpen%=VALa$
7030INPUT"Rotate?"a$:IFFNuc(LEFT$(a$,1))="Y" rotate%=1
7040scale%=FALSE:scaleo%=FALSE:fast%=FALSE
7050ELSE
7060REPEAT A%=ARG%
7070IFFNuc(A$(ARG%))="-INFO" info%=TRUE:A$(ARG%)="":ARG%-=1
7080IFFNuc(A$(ARG%))="-HIST" hist%=TRUE:A$(ARG%)="":ARG%-=1
7090IFFNuc(A$(ARG%))="-LOCK" lock%=TRUE:A$(ARG%)="":ARG%-=1
7100IFFNuc(A$(ARG%))="-EQUAL" equal%=TRUE:range%=FALSE:A$(ARG%)="":ARG%-=1
7110IFFNuc(A$(ARG%))="-RANGE" range%=TRUE:equal%=FALSE:A$(ARG%)="":ARG%-=1
7120IFFNuc(A$(ARG%))="-INVERT" invert%=TRUE:A$(ARG%)="":ARG%-=1
7130IFFNuc(A$(ARG%))="-NOSCALE" scale%=FALSE:scaleo%=FALSE:A$(ARG%)="":ARG%-=1
7140IFFNuc(A$(ARG%))="-NOSIZE" scale%=FALSE:A$(ARG%)="":ARG%-=1
7150IFFNuc(A$(ARG%))="-NODITHER" dither%=FALSE:A$(ARG%)="":ARG%-=1
7160IFFNuc(A$(ARG%))="-BRIGHTEN" bright%=16:A$(ARG%)="":ARG%-=1
7170IFFNuc(A$(ARG%))="-ROTATE" rotate%=1:A$(ARG%)="":ARG%-=1
7180IFFNuc(A$(ARG%))="-ROTATE-" rotate%=-1:A$(ARG%)="":ARG%-=1
7190IFFNuc(A$(ARG%))="-VFLIP" vflip%=TRUE:A$(ARG%)="":ARG%-=1
7200IFFNuc(A$(ARG%))="-HFLIP" hflip%=TRUE:A$(ARG%)="":ARG%-=1
7210IFFNuc(A$(ARG%))="-NOMODE" fast%=FALSE:A$(ARG%)="":ARG%-=1
7220IFFNuc(LEFT$(A$(ARG%),6))="-BLACK" THEN
7230black%=32:IFLENA$(ARG%)>6 black%=VALMID$(A$(ARG%),7):IFblack%>128 black%=128
7240A$(ARG%)="":ARG%-=1
7250ENDIF
7260IFFNuc(LEFT$(A$(ARG%),6))="-GAMMA" THEN
7270gamma=2.2:IFLENA$(ARG%)>6 gamma=VALMID$(A$(ARG%),7)
7280A$(ARG%)="":ARG%-=1
7290ENDIF
7300IFFNuc(LEFT$(A$(ARG%),8))="-SHARPEN" THEN
7310sharpen%=TRUE:IFLENA$(ARG%)>8 sharpen%=VALMID$(A$(ARG%),9)
7320A$(ARG%)="":ARG%-=1
7330ENDIF
7340IFFNuc(LEFT$(A$(ARG%),4))="-RED" rwt=VALMID$(A$(ARG%),5):A$(ARG%)="":ARG%-=1
7350IFFNuc(LEFT$(A$(ARG%),6))="-GREEN" gwt=VALMID$(A$(ARG%),7):A$(ARG%)="":ARG%-=1
7360IFFNuc(LEFT$(A$(ARG%),5))="-BLUE" bwt=VALMID$(A$(ARG%),6):A$(ARG%)="":ARG%-=1
7370IFFNuc(LEFT$(A$(ARG%),4))="-MAX" THEN
7380max%=VALMID$(A$(ARG%),5):IFINSTR(A$(ARG%),"K")ORINSTR(A$(ARG%),"k") max%=max%*1024
7390A$(ARG%)="":ARG%-=1
7400ENDIF
7410UNTILA%=ARG%
7420s$=A$(1):f$=A$(2):m$=A$(3):xs$=A$(4):ys$=A$(5)
7430ENDIF
7440IFokinfo% ELSEinfo%=FALSE
7450IFworkspace%>=0 THEN
7460flex%=FALSE
7470ELSE
7480IFworklimit%=0 THENflex%=FALSE ELSEflex%=TRUE:nextlocation%=worklimit%
7490ENDIF
7500pnm$=FNuc(m$):CASE LEFT$(pnm$+",",3) OF
7510WHEN"AIM":m=-1:m$=""
7520WHEN"P1,","P4,":m=-2:m$="":spm=18
7530WHEN"P2,","P5,":m=-2:m$="T":spm=20
7540WHEN"P3,","P6,":m=-4:pnm$=LEFT$(pnm$,2):p6bits=8:I%=VALMID$(m$,4):m$=""
7550IFI%>0IFI%<8 p6bits=I%
7560WHEN"P15":m=-3:m$=""
7570WHEN"C15":m=-5:m$=""
7580WHEN"IRL":m=-4:m$="":p6bits=8
7590WHEN"S16":m=-6:m$=""
7600WHEN"S24":m=-7:m$="":p6bits=8
7610WHEN"S32":m=-8:m$="":p6bits=8
7620OTHERWISE:m=VALm$:spm=m:m$=FNuc(RIGHT$(m$,1)):IFINSTR("CDRT",m$)=0 m$=""
7630ENDCASE
7640IFxs$="" OR LEFT$(xs$,1)="-" THEN
7650xmul%=1:xdiv%=1:ymul%=1:ydiv%=1
7660ELSE
7670IFys$="" ys$=xs$
7680xmul%=VALxs$:xdiv%=VALMID$(xs$,INSTR(xs$,":")+1)
7690ymul%=VALys$:ydiv%=VALMID$(ys$,INSTR(ys$,":")+1)
7700ENDIF
7710flag=-1:SYS8,5,s$ TO r0,,r2:dir=r0=2
7720IFdir THEN
7730panic=TRUE:SYS8,5,s$+".raw" TO r0,,r2:IFr0=1 s$+=".raw":dir=FALSE:panic=FALSE
7740IFpanic SYS8,5,s$+".red" TO r0,,r2:IFr0=1 panic=FALSE
7750IFpanic ERROR 42,"Directory given"
7760ENDIF
7770ftype=r2>>8 AND &FFF:bits=28:F=2^bits:c%=0:cc%=0:ccc%=0:o%=0
7780IFdir THEN
7790c%=OPENIN(s$+".red"):IFc%=0 ERROR 42,"Red file "+s$+".red not found"
7800cc%=OPENIN(s$+".green"):IFcc%=0 ERROR42,"Green file "+s$+".green not found"
7810ccc%=OPENIN(s$+".blue"):IFccc%=0 ERROR42,"Blue file "+s$+".blue not found"
7820ELSE
7830c%=OPENINs$:IFc%=0 ERROR 42,"File "+s$+" not found"
7840ENDIF
7850LOCAL ERROR
7860ON ERROR LOCAL RESTORE ERROR:PROCclose:ERROR ERR,REPORT$
7870DIM r%(255)
7880DIM g%(255),b%(255)
7890SYS&66f4d TO;pcd%
7900CASE ftype OF
7910WHEN &FF9:flag=0
7920IFINSTR("."+FNuc(s$),".HIP.")ORINSTR(FNuc(s$),":HIP.") THEN
7930flag=300:I%=INSTR(FNuc(s$),"HIP.")
7940MID$(s$,I%)="LOP.":cc%=OPENINs$:IFcc%=0 ERROR42,"Can't find Lop file "+s$
7950ENDIF
7960WHEN &FF0:PTR#c%=0:S$="":FORI%=1TO4:S$+=CHR$BGET#c%:NEXT
7970IFS$="II*"+CHR$0 flag=1500:bigendian=FALSE
7980IFS$="MM"+CHR$0+"*" flag=1500:bigendian=TRUE
7990WHEN &DFA:flag=800:IFdir flag=801
8000WHEN &DE2:flag=1000
8010WHEN &BE8:IF(pcd%AND1)=0 flag=3600
8020WHEN &7A0:flag=1200
8030WHEN &69d:flag=2000
8040WHEN &699:flag=700
8050WHEN &698:flag=100
8060WHEN &697:flag=1900
8070WHEN &691:flag=2600
8080WHEN &690:flag=2500
8090WHEN &666:flag=666
8100WHEN &601:flag=3000
8110WHEN &371:flag=3100
8120WHEN &300:flag=1300:IFdir flag=1301
8130WHEN 4:flag=900:IFdir flag=901
8140WHEN 6:flag=950
8150ENDCASE
8160IFflag=-1 THEN
8170PTR#c%=0:S$="":FORI%=1TO16:S$+=CHR$BGET#c%:NEXT
8180IFLEFT$(S$,7)="FSIfile" flag=2100
8190IFflag=-1 IFLEFT$(S$,8)="SIMPLE " flag=2800
8200IFflag=-1 IFFNuc(LEFT$(S$,8))="MERCSOFT"ORFNuc(LEFT$(S$,8))="SNAPSHOT"flag=902
8210IFflag=-1 IFFNuc(LEFT$(S$,8))="MERCSOF1" flag=903
8220IFflag=-1 IFFNuc(LEFT$(S$,13))="IRLAM YUV 411" flag=2250
8230IFflag=-1 IFLEFT$(S$,5)="Irlam" flag=2200
8240IFflag=-1 IFLEFT$(S$,2)="BM" flag=2400
8250IFflag=-1 IFLEFT$(S$,4)="GIF8" flag=500
8260IFflag=-1 IFLEFT$(S$,5)="AV_VO" flag=600
8270IFflag=-1 IFLEFT$(S$,4)=CHR$&59+CHR$&A6+CHR$&6A+CHR$&95 flag=1100
8280IFflag=-1 IFLEFT$(S$,4)=CHR$0+CHR$1+CHR$0+CHR$8 flag=1400
8290IFflag=-1 IFLEFT$(S$,4)=CHR$0+CHR$1+CHR$0+CHR$1 flag=2900
8300IFflag=-1 IFLEFT$(S$,4)="RIX3" flag=2700
8310IFflag=-1 IFLEFT$(S$,4)="II*"+CHR$0 flag=1500:bigendian=FALSE
8320IFflag=-1 IFLEFT$(S$,4)="MM"+CHR$0+"*" flag=1500:bigendian=TRUE
8330IFflag=-1 IFLEFT$(S$,2)=CHR$&52+CHR$&CC flag=2300
8340IFflag=-1 IFLEFT$(S$,2)="P4"ORLEFT$(S$,2)="P5"ORLEFT$(S$,2)="P6" flag=3300:info$=""
8350IFflag=-1 IFLEFT$(S$,3)="P15" flag=3400
8360IFflag=-1 IFLEFT$(S$,3)="PIC" flag=3500
8370IFflag=-1 IFFNuc(LEFT$(S$,3))="P13" flag=3450
8380IFflag=-1 IFLEFT$(S$,4)="FORM" IFMID$(S$,9,4)="ILBM" flag=1600
8390IFflag=-1 THEN
8400IFMID$(S$,7,4)="JFIF" OR ftype=&C85 THEN
8410jpegblk%=FNdim(20):PROCcachesize(jpegblk%)
8420IFcache%<EXT#c% THEN
8430CLOSE#c%:X%=OPENIN"Run:djpeg"
8440IFX% THEN
8450CLOSE#X%:SYS"Wimp_StartTask","djpeg "+s$+" <Wimp$Scrap>"
8460ELSE
8470SYS"XOS_CLI","djpeg "+s$+" <Wimp$Scrap>" TO ;V
8480IFV AND1 THEN
8490SYS"Wimp_StartTask","<ChangeFSI$Dir>.djpeg "+s$+" <Wimp$Scrap>"
8500ENDIF
8510ENDIF
8520c%=OPENIN"<Wimp$Scrap>":IFc%=0 THEN=100
8530scrapf%=TRUE:flag=3300:info$="JPEG (JFIF) file converted to "
8540ELSE
8550flag=3700
8560ENDIF
8570ENDIF
8580ENDIF
8590IFflag=-1 THEN
8600PTR#c%=&10:S$="":FORI%=1TO9:S$+=CHR$BGET#c%:NEXT
8610IFS$="MILLIPEDE" flag=200
8620ENDIF
8630IFflag=-1 THEN
8640PTR#c%=&41:S$="":FORI%=1TO8:S$+=CHR$BGET#c%:NEXT
8650IFLEFT$(S$,4)="PNTG" flag=1800:st%=&280
8660ENDIF
8670IFflag=-1 THEN
8680PTR#c%=196:S$="":FORI%=1TO8:S$+=CHR$BGET#c%:NEXT
8690IFLEFT$(S$,4)="PNTG" flag=1800:st%=&2e2
8700ENDIF
8710IFflag=-1 THEN
8720PTR#c%=522:S$="":FORI%=1TO8:S$+=CHR$BGET#c%:NEXT
8730IFS$=CHR$0+CHR$&11+CHR$2+CHR$&ff+CHR$&c+CHR$0+CHR$&ff+CHR$&fe flag=1850
8740ENDIF
8750IFflag=-1 THEN
8760PTR#c%=0:IFBGET#c%=10 THEN
8770C%=BGET#c%:IFC%<6 AND C%<>1 ANDBGET#c%=1 flag=1900
8780ENDIF
8790ENDIF
8800IFflag=-1 IFINSTR("."+FNuc(s$),".PCX.")ORINSTR(FNuc(s$),":PCX.")ORRIGHT$(s$,4)="/PCX" flag=1900
8810IFflag=-1 IFINSTR("."+FNuc(s$),".IMAGE.")ORINSTR(FNuc(s$),":IMAGE.") flag=400
8820IFflag=-1 IFFNuc(RIGHT$(s$,4))=".RAW" flag=100
8830IFflag=-1 IFFNuc(RIGHT$(s$,3))="TGA" flag=2000
8840IFflag=-1 IFFNuc(RIGHT$(s$,3))="VDA" flag=2000
8850IFflag=-1 IFINSTR("."+FNuc(s$),".PIC.")ORINSTR(FNuc(s$),":PIC.") flag=700
8860IFflag=-1 IFINSTR("."+FNuc(s$),".IMG.")ORINSTR(FNuc(s$),":IMG.")ORRIGHT$(s$,4)="/IMG" flag=1400
8870IFflag=-1 IFINSTR("."+FNuc(s$),".DSP.")ORINSTR(FNuc(s$),":DSP.")ORRIGHT$(s$,4)="/DSP" flag=1700
8880IFflag=-1 IFFNuc(RIGHT$(s$,4))="/RGB" flag=3200
8890IFflag=-1 AND(FNuc(RIGHT$(s$,4))="/PCD"ORftype=&be8)AND((pcd%AND1)=1) THEN
8900CLOSE#c%:SYS"Wimp_StartTask","<ChangeFSI$Dir>.hpcdtoppm -3 -a "+s$+" <Wimp$Scrap> { > <ChangeFSI$Dir>.pcdtemp }"
8910c%=OPENIN"<Wimp$Scrap>":scrapf%=TRUE:flag=3300:info$="PhotoCD file converted to "
8920ENDIF
8930ENDIF
8940IFflag=-1 PROCclose:ERROR 42,"Sorry: format not recognised - please try again or contact your supplier"
8950step24=1:input=8:ham=0:planar%=0:bigendianbits=FALSE:r$="FN"+STR$flag
8960compression=0:hpredict%=1:striprows%=-1:cachebytes%=FALSE
8970IFxdiv%=0 AND ydiv%=0 scale%=FALSE
8980CASE flag OF
8990WHEN 0
9000quant%=4:PTR#c%=4:F%=FNW+&1C:PTR#c%=F%:st%=FNW+F%-&20:K%=FNW+F%-&20
9010sm=FNW:IFsm<256 THEN
9020SYS53,sm,3 TO ,,I%
9030CASE I% OF
9040WHEN 1:IFst%=F%+12 PROCdefpal2 ELSEPROCipal(2)
9050PTR#c%=F%-16:sx%=(FNW+1)*32:rowbytes%=sx%>>3:input=1
9060sy%=FNW+1:I%=FNW:sx%-=31-FNW
9070WHEN 3:IFst%=F%+12 PROCdefpal4 ELSEPROCipal(4)
9080PTR#c%=F%-16:sx%=(FNW+1)*16:rowbytes%=sx%>>2:input=2
9090sy%=FNW+1:I%=FNW:sx%-=(31-FNW)DIV2
9100WHEN 15:IFst%=F%+12 PROCdefpal16 ELSEPROCipal(16)
9110PTR#c%=F%-16:sx%=(FNW+1)*8:rowbytes%=sx%>>1:input=4
9120sy%=FNW+1:I%=FNW:sx%-=(31-FNW)DIV4
9130WHEN 63,255:IFst%=F%+12 THEN
9140PROCdefpal
9150ELSE
9160IFK%>st% K%=st%
9170IFK%-12-F%=2048 ORI%=255 THEN
9180PTR#c%=&38
9190FORC%=0TO255:D%=BGET#c%
9200r%(C%)=BGET#c%/255*F:g%(C%)=BGET#c%/255*F:b%(C%)=BGET#c%/255*F
9210D%=FNW:NEXT
9220ELSE
9230PROCipal63
9240ENDIF
9250ENDIF
9260PTR#c%=F%-16:sx%=(FNW+1)*4:rowbytes%=sx%:sy%=FNW+1:I%=FNW:sx%-=(31-FNW)DIV8
9270OTHERWISE ERROR42,"Not understood RISC OS sprite"
9280ENDCASE
9290r$="FN8":SYS53,sm,4 TO ,,nx:SYS53,sm,5 TO ,,ny:nx=1<<nx:ny=1<<ny
9300IFscale% xmul%=xmul%*nx/2:ymul%=ymul%*ny/2
9310info$="RISC OS sprite, mode "+STR$sm+" "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(input)
9320ELSE
9330bpp%=sm>>>27:CASEbpp% OF
9340WHEN 1:bpp%=1:r$="FN8":IFst%=F%+12 PROCdefpal2 ELSEPROCnewropal(2)
9350WHEN 2:bpp%=2:r$="FN8":IFst%=F%+12 PROCdefpal4 ELSEPROCnewropal(4)
9360WHEN 3:bpp%=4:r$="FN8":IFst%=F%+12 PROCdefpal16 ELSEPROCnewropal(16)
9370WHEN 4:bpp%=8:r$="FN8":IFst%=F%+12 PROCdefpal ELSEPROCnewropal(256)
9380WHEN 5:bpp%=16:r$="FN16":IFst%=F%+12 ELSE
9390DIM rpal%(255),gpal%(255):step24=2
9400FORC%=0TO255
9410gpal%(C%)=(C%>>5)<<8 OR (C%AND31)
9420rpal%(C%)=((C%>>2)AND31)<<16 OR (C%AND3)<<11
9430NEXT
9440FORC%=0TO31:r%(C%)=C%/31*F:NEXT:g%()=r%():b%()=r%()
9450WHEN 6:bpp%=32:r$="FN24":IFst%=F%+12 PROCnopal ELSE
9460rbo%=0:gbo%=1:bbo%=2:step24=4
9470WHEN 8:bpp%=24:r$="FN24":IFst%=F%+12 PROCnopal ELSE
9480rbo%=0:gbo%=1:bbo%=2
9490OTHERWISE ERROR42,"Not understood new format RISC OS sprite bpp"
9500ENDCASE
9510nx=(sm>>1) AND&1fff:ny=(sm>>14) AND&1fff
9520IFscale% xdiv%=xdiv%*nx:ydiv%=ydiv%*ny:xmul%=xmul%*90:ymul%=ymul%*90
9530PTR#c%=F%-16:rowbytes%=(FNW+1)*4:sy%=FNW+1:I%=FNW:sx%=(rowbytes%*8-(31-FNW))/bpp%:input=bpp%
9540info$="New RISC OS sprite, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(input)
9550IFbpp%=32 input=24
9560ENDIF
9570PTR#c%=st%:cache%=TRUE
9580WHEN 100
9590quant%=8:PTR#c%=0:sx%=FNHW:sy%=FNHW:PROCnopal:input=24:rowbytes%=sx%*3+2
9600rbo%=2:gbo%=2+sx%:bbo%=2+2*sx%:r$="FN24":cache%=TRUE
9610info$="QRT .raw image, "+STR$sx%+" by "+STR$sy%+" pixels, 24 bits per pixel"
9620WHEN 200
9630quant%=8:PTR#c%=5:sx%=FNHW:sy%=FNHW:sx%=(FNHW-sx%+2)/2:sy%=(FNHW-sy%+2)/2
9640PTR#c%=&1a:cadsoft%=BGET#c%:PTR#c%=&200
9650FORC%=0TO255:r%(C%)=BGET#c%/255*F:NEXT
9660FORC%=0TO255:g%(C%)=BGET#c%/255*F:NEXT
9670FORC%=0TO255:b%(C%)=BGET#c%/255*F:NEXT
9680PTR#c%=&600:st%=&600:cache%=TRUE:IFcadsoft%=2 THEN
9690rep%=0:r$="FN1100":plbuff%=FNdim(sx%):plbytes%=sx%:cachebytes%=TRUE
9700ELSE
9710r$="FN8":rowbytes%=sx%
9720ENDIF
9730info$="Cadsoft type "+STR$cadsoft%+" image, "+STR$sx%+" by "+STR$sy%+" pixels, 8 bits per pixel"
9740WHEN 300
9750quant%=5:PTR#c%=&2c:st%=FNW+(&38-&2c):PTR#cc%=&2c:stcc%=FNW1(cc%)+(&38-&2c)
9760PTR#c%=&1c:sx%=(FNW+1)*4:sy%=FNW+1:PTR#c%=st%:PTR#cc%=stcc%
9770DIM rpal%(255),gpal%(255):input=16:cache%=TRUE:rowbytes%=sx%
9780FORC%=0TO255
9790rpal%(C%)=C%AND7 OR (C%AND64)<<2 OR (C%AND&38)<<13
9800gpal%(C%)=(C%AND4)<<1ORC%AND16 OR ((C%AND3)<<1OR(C%AND&60)>>2)<<8 OR (C%AND8OR(C%AND128)>>3)<<16
9810NEXT
9820FORC%=0TO31:r%(C%)=C%/31*F:NEXT:g%()=r%():b%()=r%()
9830pbuff%=FNdim(sx%):IFscale% ymul%=ymul%*2
9840info$="ArVis image, "+STR$sx%+" by "+STR$sy%+" pixels, 15 bits per pixel"
9850WHEN 400
9860quant%=8:PTR#c%=0:sx%=FNbeHW:sy%=FNbeHW:X%=FNbeHW:st%=PTR#c%+X%:PTR#c%=st%
9870plbuff%=FNdim(sx%*3):plbytes%=sx%*3:rb%=plbuff%:gb%=plbuff%+1:bb%=plbuff%+2:rbo%=-1
9880PROCnopal:input=24:rep%=0:cachebytes%=TRUE:cache%=TRUE:step24=3
9890info$="RT image. run length encoded image, "+STR$sx%+" by "+STR$sy%+" pixels, 24 bits per pixel"
9900WHEN 500
9910compression=5:PTR#c%=6:GIFsx=FNHW:GIFsy=FNHW
9920GIF=BGET#c%:GIFback=BGET#c%:GIFext=BGET#c%:quant%=(GIF AND 7)+1
9930IFGIF AND &80 THEN
9940FORC%=0TO(1<<quant%)-1
9950r%(C%)=BGET#c%/255*F:g%(C%)=BGET#c%/255*F:b%(C%)=BGET#c%/255*F
9960NEXT
9970ENDIF
9980I%=BGET#c%:IFI%<>ASC"," ERROR 42,"GIF file without , in right place"
9990GIFleft=FNHW:GIFright=FNHW:sx%=FNHW:sy%=FNHW
10000IFGIFsx<sx% OR GIFsy<sy% THEN
10010IFinfo% THEN
10020PRINT"GIF file with bigger image inside:"
10030PRINT"Screen ";GIFsx"x by "GIFsy"y; image "sx%"x by "sy%"y"
10040INPUT"Continue with monitor's size [Y or y]?"A$
10050IFA$="Y"ORA$="y" sx%=GIFsx:sy%=GIFsy
10060PRINT"Continuing with ";sx%"x by "sy%"y"
10070ENDIF
10080ENDIF
10090GIF=BGET#c%:IFGIF AND &40 flag=501:r$="FN8"
10100setcodes%=BGET#c%:clearcode%=1<<setcodes%:st%=PTR#c%:cache%=TRUE:cachebytes%=TRUE
10110DIM table%(1<<12):stk%=FNdim(1<<13):buf%=FNdim(280):plbuff%=FNdim(sx%)
10120FORI%=0TOclearcode%-1:table%(I%)=I%:NEXT
10130info$="GIF file, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(quant%)
10140WHEN 600
10150quant%=8:PTR#c%=&5c:FORC%=0TO255
10160r%(C%)=BGET#c%/255*F:g%(C%)=BGET#c%/255*F:b%(C%)=BGET#c%/255*F
10170NEXT
10180PTR#c%=&36e:sy%=FNHW:sx%=FNHW
10190st%=&380:PTR#c%=st%:rowbytes%=sx%:r$="FN8":cache%=TRUE
10200info$=".PIC image, "+STR$sx%+" by "+STR$sy%+" pixels, 8 bits per pixel"
10210WHEN 700
10220quant%=8:PTR#c%=0:a$=GET$#c%:st%=PTR#c%
10230sx%=VALa$:sy%=VAL(MID$(a$,INSTR(a$," ")))
10240PROCnopal:input=24:step24=3:rowbytes%=sx%*3:r$="FN24"
10250rbo%=0:gbo%=1:bbo%=2:cache%=TRUE
10260info$="MTV .pic image, "+STR$sx%+" by "+STR$sy%+" pixels, 24 bits per pixel"
10270WHEN 800
10280sx%=512:sy%=256:IFscale% ymul%=ymul%*2
10290plbuff%=FNdim(sx%):rep%=0:wt%=0:wtsx%=plbuff%+sx%
10300cache%=TRUE:cachebytes%=TRUE
10310FORC%=0TO255:r%(C%)=(C%AND63)/63*F:NEXT:g%()=r%():b%()=r%():quant%=6
10320info$="Watford digitiser picture, 512 by 256 pixels, 6 bits per pixel"
10330WHEN 801
10340sx%=512:sy%=256:input=24:quant%=6:IFscale% ymul%=ymul%*2
10350rep1%=0:wt1%=0:rep2%=0:wt2%=0:rep3%=0:wt3%=0
10360buff%=FNdim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+2*sx%
10370wtsx1%=buff%+sx%:wtsx2%=buff%+2*sx%:wtsx3%=buff%+3*sx%
10380FORC%=0TO255:r%(C%)=(C%AND63)/63*F:NEXT:g%()=r%():b%()=r%()
10390info$="Triple Watford digitiser picture, 512 by 256 pixels, 18 bits per pixel"
10400WHEN 900
10410quant%=8:st%=0:PTR#c%=0:IFEXT#c%=65536 THEN
10420sx%=256:sy%=256:IFscale% ymul%=ymul%*2:xmul%=xmul%*2
10430ELSE
10440sx%=512:sy%=512
10450ENDIF
10460FORC%=0TO255:r%(C%)=C%/255*F:NEXT:g%()=r%():b%()=r%():rowbytes%=sx%:r$="FN8":cache%=TRUE
10470info$="AIM .raw image, 256 by 256 pixels, 8 bits per pixel"
10480WHEN 901
10490quant%=4:IFEXT#c%=65536 THEN
10500sx%=256:sy%=256:IFscale% ymul%=ymul%*2:xmul%=xmul%*2
10510ELSE
10520sx%=512:sy%=512
10530ENDIF
10540buff%=FNdim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+sx%*2
10550FORC%=0TO255:r%(C%)=C%/255*F:NEXT:g%()=r%():b%()=r%()
10560input=24:info$="Hawk V9 Triple image, 256 by 256 pixels, 24 bits per pixel"
10570WHEN 902
10580quant%=4:PTR#c%=8:sx%=FNW:rowbytes%=sx%*3/2:sy%=FNW:st%=20:PTR#c%=20
10590IFscale% ymul%=ymul%*2
10600plbuff%=FNdim(sx%*3):rb%=plbuff%:gb%=plbuff%+sx%:bb%=plbuff%+sx%*2:rbo%=-1
10610FORC%=0TO255:r%(C%)=(C%AND&F)/&F*F:NEXT:g%()=r%():b%()=r%():cache%=TRUE
10620input=24:info$="Hawk V9/Snapshot Colour image, "+STR$sx%+" by "+STR$sy%+" pixels, 12 bits per pixel"
10630WHEN 903
10640quant%=5:PTR#c%=8:sx%=FNW:rowbytes%=sx%*2:sy%=FNW:st%=20:PTR#c%=20:cache%=TRUE:r$="FN16":flag=700
10650DIM rpal%(255),gpal%(255):input=16:step24=2
10660FORC%=0TO255
10670gpal%(C%)=(C%>>5)<<8 OR (C%AND31)
10680rpal%(C%)=((C%>>2)AND31)<<16 OR (C%AND3)<<11
10690NEXT
10700FORC%=0TO31:r%(C%)=C%/31*F:NEXT:g%()=r%():b%()=r%()
10710input=16:info$="Hawk V9 mk II Colour image, "+STR$sx%+" by "+STR$sy%+" pixels, 16 bits per pixel"
10720WHEN 950
10730quant%=8:PTR#c%=0:sx%=512:rowbytes%=512:sy%=512:st%=0:flag=900
10740FORC%=0TO255:r%(C%)=C%/255*F:NEXT:g%()=r%():b%()=r%():r$="FN8":cache%=TRUE
10750info$="Wild Vision V12 image, 512 by 512 pixels, 8 bits per pixel"
10760WHEN 1000
10770quant%=4:sx%=640:sy%=256:PROCdefpal:st%=FNW:r$="FN"+STR$(1000+FNW):IFscale% ymul%=ymul%*2
10790buff%=FNdim(sx%):ctable%=FNdim(st%)
10800SYS12,4,c%,ctable%,st%:st%=PTR#c%
10810pa%=ctable%:rep%=0:rep2%=0:pasx%=buff%+sx%
10820info$="ProArtisan image, 640 by 256 pixels, 8 bits per pixel"
10830WHEN 1100
10840quant%=1:PTR#c%=4:sx%=FNbeW:sy%=FNbeW:input=FNbeW:bigendianbits=TRUE
10850S%=FNbeW:S%=FNbeW
10860cache%=TRUE:IFS%=2 cachebytes%=TRUE:info$="Byte Encoded " ELSEinfo$="":r$="FN8"
10870C%=FNbeW
10880D%=FNbeW
10890CASE C% OF
10900WHEN 1,2
10910FORI%=0TOD%/3-1:r%(I%)=BGET#c%/255*F:NEXT
10920FORI%=0TOD%/3-1:g%(I%)=BGET#c%/255*F:NEXT
10930FORI%=0TOD%/3-1:b%(I%)=BGET#c%/255*F:NEXT
10940OTHERWISE
10950CASE input OF
10960WHEN 1:r%(0)=F:g%(0)=F:b%(0)=F
10970WHEN 4,8:PROCnopal
10980WHEN 24:PROCnopal
10990ENDCASE
11000ENDCASE
11010CASE input OF
11020WHEN 1:rowbytes%=(sx%+15>>4)<<1
11030WHEN 4:rowbytes%=(sx%+3>>2)<<1
11040WHEN 8:rowbytes%=(sx%+1>>1)<<1
11050WHEN 24:rowbytes%=(3*sx%+1>>1)<<1:r$="FN24":rbo%=0:gbo%=1:bbo%=2:step24=3
11060IFS%=1 bbo%=0:rbo%=2
11070OTHERWISE:ERROR 42,"Can't do this Sun pixrect"
11080ENDCASE
11090st%=D%+&20:rep%=0:IFcachebytes% plbuff%=FNdim(rowbytes%):plbytes%=rowbytes%
11100info$+="Sun image, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(input)
11110WHEN 1200
11120quant%=8:sx%=800:sy%=800:st%=1600:PTR#c%=st%:vflip%=NOT vflip%
11130PROCnopal:r$="FN8":rowbytes%=sx%:cache%=TRUE
11140info$="TimeStep satellite image, 800 by 800 pixels, 8 bits per pixel"
11150WHEN 1300
11160quant%=8:sx%=128:sy%=256:st%=0:PTR#c%=0:IFscale% xmul%=xmul%*2
11170PROCnopal:r$="FN8":rowbytes%=sx%:cache%=TRUE
11180info$="satellite image, 128 by 256 pixels, 8 bits per pixel"
11190WHEN 1301
11200input=24:quant%=8:sx%=128:sy%=256:IFscale% xmul%=xmul%*2
11210buff%=FNdim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+2*sx%:PROCnopal:r$="FN901"
11220info$="Triple satellite image, 128 by 256 pixels, 24 bits per pixel"
11230WHEN 1400
11240planar%=TRUE:PTR#c%=0:Z%=FNHW:IFZ%>255 THEN
11250st%=FNbeHW*2:planes%=FNbeHW:patlen%=FNbeHW
11260pw%=FNbeHW:ph%=FNbeHW:sx%=FNbeHW:sy%=FNbeHW
11270ELSE
11280st%=FNHW*2:input=FNHW:patlen%=FNHW:pw%=FNHW:ph%=FNHW:sx%=FNHW:sy%=FNHW
11290ENDIF
11300IFscale% THEN
11310xmul%=xmul%*pw%:xdiv%=xdiv%*282
11320ymul%=ymul%*ph%:ydiv%=ydiv%*282
11330ENDIF
11340rowbytes%=sx%+7>>3:pbuff%=FNdim(sx%):plbytes%=rowbytes%*planes%:buff%=FNdim(plbytes%)
11350PTR#c%=st%:vrep%=0
11360FORC%=0TO(1<<planes%)-1:r%(C%)=F-C%/((1<<planes%)-1)*F:NEXT:g%()=r%():b%()=r%()
11370info$="IMG file, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(planes%)
11380WHEN 1500
11390PTR#c%=4:dir%=FNtiff(4):PTR#c%=dir%
11400rgb=FALSE:greyunit=100:planar%=1:fillorder=1:resunit=2
11410xnum%=90:xdenom%=1:ynum%=90:ydenom%=1
11420E%=FNtiff(3):FORZ%=1TOE%
11430T%=FNtiff(3):D%=FNtiff(3):C%=FNtiff(4)
11440IFC%>1 V%=FNtiff(4) ELSEIFD%=2 PTR#c%=dir%+2+Z%*12 ELSEIFD%<4 V%=FNtiff(D%):PTR#c%=dir%+2+Z%*12 ELSEV%=FNtiff(4)
11460CASE T% OF
11470WHEN 256:sx%=V%
11480WHEN 257:sy%=V%
11490WHEN 258:IFC%>1 THEN
11500IFD%*C%>6 THEN
11510PTR#c%=V%:quant%=FNtiff(D%)
11520input=quant%:FORI%=1TOC%-1:V%=FNtiff(D%)
11530IFV%<>quant% ERROR42,"Can't do RGB TIFF with different numbers of bits per pixel"
11540input+=V%
11550NEXT:PROCnopal
11560ELSE
11570quant%=V% AND &FF:input=quant%
11580FORI%=0TO(1<<quant%)-1:r%(I%)=I%/((1<<quant%)-1)*F:NEXT
11590g%()=r%():b%()=r%()
11600ENDIF
11610PTR#c%=dir%+2+Z%*12
11620ELSE
11630quant%=V%:input=quant%
11640FORI%=0TO(1<<quant%)-1:r%(I%)=I%/((1<<quant%)-1)*F:NEXT
11650g%()=r%():b%()=r%()
11660ENDIF
11670WHEN 259:compression=V%
11680WHEN 262:photometric=V%:IFV%=0 invert%=NOTinvert%
11690WHEN 266:fillorder=V%
11700WHEN 273:stc%=C%:stv%=V%:std%=D%
11710WHEN 277:sampperpix%=V%:input=quant%*V%:rgb=V%=3
11720WHEN 278:striprows%=V%
11730WHEN 279:stcbyte%=C%:stvbyte%=V%:stdbyte%=D%
11740WHEN 282:PTR#c%=V%:xnum%=FNtiff(4):xdenom%=FNtiff(4)
11750PTR#c%=dir%+2+Z%*12
11760WHEN 283:PTR#c%=V%:ynum%=FNtiff(4):ydenom%=FNtiff(4)
11770PTR#c%=dir%+2+Z%*12
11780WHEN 284:planar%=V%:IFplanar%=2 input=quant%
11790WHEN 290:greyunit=10^V%
11800WHEN 291:PTR#c%=V%:FORI%=0TOC%-1:r%(I%)=FNtiff(D%)/greyunit/2*F:NEXT
11810g%()=r%():b%()=r%()
11820PTR#c%=dir%+2+Z%*12
11830WHEN 296:resunit=V%
11840WHEN 317:hpredict%=V%
11850WHEN 320:PTR#c%=V%:FORI%=0TOC%/3-1:r%(I%)=FNtiff(3)/65535*F:NEXT
11860FORI%=0TOC%/3-1:g%(I%)=FNtiff(3)/65535*F:NEXT
11870FORI%=0TOC%/3-1:b%(I%)=FNtiff(3)/65535*F:NEXT
11880PTR#c%=dir%+2+Z%*12
11890OTHERWISE
11900IFinfo% PRINT"Ignoring tag ";T%" datatype "D%" count "C%" value/pointer "V%
11910ENDCASE
11920NEXT
11930DIM st%(stc%):IFstc%>1 THEN
11940PTR#c%=stv%:FORI%=0TOstc%-1:st%(I%)=FNtiff(std%):NEXT
11960ELSE
11970st%(0)=stv%
11980ENDIF
11990CASE compression OF
12000WHEN 0,1:info$=""
12010WHEN 2:info$="CCITT Group 3 compressed "
12020WHEN 5:info$="LZW compressed ":r$="FN1505"
12030IFhpredict%=2 THENinfo$+="horizontal differenced " ELSEIFhpredict%>2 info$+=" unknown predictor ("+STR$hpredict%+") "
12040setcodes%=8:clearcode%=1<<setcodes%
12050DIM table%(1<<12):stk%=FNdim(1<<13):buf%=FNdim(280)
12060FORI%=0TOclearcode%-1:table%(I%)=I%:NEXT
12070WHEN 32773:info$="PackBits compressed ":r$="FN1501"
12080WHEN 6:info$="JPEG compressed "
12090OTHERWISE info$="Compress "+STR$compression+" - unknown "
12100ENDCASE
12110info$+="TIFF file, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(input)
12120bigendianbits=fillorder=1:PTR#c%=st%(0):stripptr=0:IFstriprows%>=sy% striprows%=-1
12130CASE input OF
12140WHEN 1:rowbytes%=sx%+7>>3
12150WHEN 2:rowbytes%=sx%+3>>2
12160WHEN 4:rowbytes%=sx%+1>>1
12170WHEN 8:rowbytes%=sx%
12180WHEN 24:rowbytes%=3*sx%
12190OTHERWISE ERROR 42,"Can't do "+FNbits(input)+" TIFF"
12200ENDCASE
12210IFplanar%=2 rowbytes%=rowbytes%*sampperpix%
12220IFplanar%<>1 AND rgb<>0 ERROR42,"Can't do this style of TIFF yet" ELSEplanar%=FALSE
12230IF compression<2 THEN
12240cache%=TRUE:stripptr=-1:r$="FN8":IFinput=24 rbo%=0:gbo%=1:bbo%=2:step24=3:r$="FN24"
12250ELSE
12260IFcompression=5 ORcompression=32773 THEN
12270cache%=TRUE:cachebytes%=rowbytes%*striprows%
12280plbuff%=FNdim(rowbytes%):rowstogo%=striprows%
12290IFinput=24 rb%=plbuff%:gb%=plbuff%+1:bb%=plbuff%+2:r$="FN"+STR$(VALMID$(r$,3)+10):step24=3:rbo%=-1
12300ELSE
12310buff%=FNdim(rowbytes%):rowstogo%=striprows%
12320IFinput=24 rb%=buff%:gb%=buff%+1:bb%=buff%+2:r$="FN"+STR$(VALMID$(r$,3)+10):step24=3
12330ENDIF
12340ENDIF
12350IFscale% THEN
12360S%=resunit:IFS%=2 S%=90
12370IFS%=3 S%=35
12380xdiv%=xdiv%*xnum%:xmul%=xmul%*xdenom%*S%
12390ydiv%=ydiv%*ynum%:ymul%=ymul%*ydenom%*S%
12400ENDIF
12410IFr$="FN1500" r$="FN8"
12420WHEN 1600
12430PTR#c%=12:camg=0:planar%=TRUE:REPEAT
12440S$=CHR$BGET#c%+CHR$BGET#c%+CHR$BGET#c%+CHR$BGET#c%:S%=FNbeW
12450CASE S$ OF
12460WHEN "BMHD":sx%=FNbeHW:sy%=FNbeHW:S%=FNW:planes%=BGET#c%:masking%=BGET#c%=1
12470compression=BGET#c%:S%=BGET#c%+FNHW:U%=BGET#c%:V%=BGET#c%:S%=FNW
12480IFscale% ymul%=ymul%*V%:ydiv%=ydiv%*U%
12490FORI%=0TO(1<<planes%)-1:r%(I%)=I%/((1<<planes%)-1)*F:NEXT:g%()=r%():b%()=r%()
12500WHEN "CMAP":S%=PTR#c%+S%:FORI%=0TO(1<<planes%)-1:r%(I%)=(BGET#c%>>4)/15*F
12510g%(I%)=(BGET#c%>>4)/15*F:b%(I%)=(BGET#c%>>4)/15*F:NEXT
12520PTR#c%=S%:IFinfo% PRINT"Warning: truncated IFF CMAP information to 4 bits"
12530WHEN "CAMG":camg=FNbeW:IFinfo% PRINT"Amiga viewport mode ";~camg
12540WHEN "BODY":st%=PTR#c%
12550OTHERWISE IF info% PRINT"Ignoring IFF property "S$" size ";S%
12560PTR#c%=PTR#c%+S%
12570ENDCASE
12580UNTILS$="BODY":IFcompression info$="Compressed " ELSEinfo$=""
12600ham=(camg AND &800)<>0:IFham info$+="HAM "
12610half=(camg AND &80)<>0:IFhalf info$+="half-bright "
12620IFhalf half%=1<<planes%-1:FORI%=0TOhalf%-1:r%(I%+half%)=r%(I%)/2:g%(I%+half%)=g%(I%)/2:b%(I%+half%)=b%(I%)/2:NEXT
12630info$+="IFF file, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(planes%)
12640IFmasking% info$+=" with mask (ignored)"
12650rowbytes%=(sx%+15>>4)<<1:plbytes%=rowbytes%*planes%
12660pbuff%=FNdim(sx%):r$="FN"+STR$(1600+compression):cache%=TRUE
12670IFcompression THEN
12680cachebytes%=TRUE:plbuff%=FNdim(plbytes%)
12690ELSE
12700realrowbytes%=rowbytes%:rowbytes%=plbytes%:IFmasking% rowbytes%+=realrowbytes%
12710ENDIF
12720PTR#c%=st%
12730WHEN 1700
12740sx%=640:rowbytes%=80:sy%=350:planes%=4:plbytes%=4*80:planar%=TRUE
12750buff%=FNdim(80*4):pbuff%=FNdim(640):G=F/3:H=F*2/3
12760r%()=0,0,0,0,F,F,F,H,G,G,G,G,F,F,F,F
12770g%()=0,0,F,F,0,0,F,H,G,G,F,F,G,G,F,F
12780b%()=0,F,0,F,0,F,0,H,G,F,G,F,G,F,G,F
12790masking%=FALSE:r$="FN1600":st%=16:PTR#c%=16:cache%=TRUE:realrowbytes%=80:rowbytes%=plbytes%
12800info$="PC EGA '.dsp' file, 640 by 350 pixels, 4 bits per pixel (fixed palette)"
12810WHEN 1800
12820sx%=72*8:sy%=720:quant%=1:input=1:PTR#c%=st%:plbuff%=FNdim(72)
12830cache%=TRUE:cachebytes%=TRUE
12840r%(0)=F:g%(0)=F:b%(0)=F:bigendianbits=TRUE:rowbytes%=72:r$="FN1501":rowstogo%=-1
12850IFscale% xmul%=xmul%*90:xdiv%=xdiv%*72:ymul%=ymul%*90:ydiv%=ydiv%*72
12860info$="MacPaint file, 576 by 720 bits, creator id "+RIGHT$(S$,4)
12870WHEN 1850
12880PTR#c%=552
12890code%=FNbeHW:IFcode%=1 PTR#c%=PTR#c%+FNbeHW:code%=FNbeHW
12900CASE code% OF
12910WHEN &98:rowbytes%=FNbeHW:IF(rowbytes% AND&8000)=0 ERROR42,"PICT without Pixmap"
12920sy%=FNbeHW:sx%=FNbeHW:sy%=FNbeHW-sy%:sx%=FNbeHW-sx%
12930junk%=FNHW:packtype%=FNbeHW:junk%=FNW:resx%=FNbeW:resy%=FNbeW
12940IFFNbeHW<>0 CLOSE#c%:ERROR42,"ChangeFSI expected Mac PICT2 pixeltype=Chunky"
12950bpp%=FNbeHW:junk%=FNbeHW:junk%=FNbeHW
12960junk%=FNbeW:junk%=FNbeW:junk%=FNbeW
12970junk%=FNbeW:junk%=FNbeHW
12980C%=FNbeHW:FORI%=0TOC%:J%=FNbeHW:r%(J%)=FNbeHW/65535*F:g%(J%)=FNbeHW/65535*F:b%(J%)=FNbeHW/65535*F:NEXT
12990WHEN &9A:junk%=FNW:rowbytes%=FNbeHW:IF(rowbytes% AND&8000)=0 ERROR42,"PICT without Pixmap"
13000sy%=FNbeHW:sx%=FNbeHW:sy%=FNbeHW-sy%:sx%=FNbeHW-sx%
13010junk%=FNHW:packtype%=FNbeHW:junk%=FNW:resx%=FNbeW:resy%=FNbeW
13020IFFNbeHW<>16 CLOSE#c%:ERROR42,"ChangeFSI expected Mac PICT2 pixeltype=RGBDirect"
13030bpp%=FNbeHW:comps%=FNbeHW:junk%=FNbeHW
13040junk%=FNbeW:junk%=FNbeW
13050junk%=FNbeHW:junk%=FNbeHW
13060IFbpp%>16 PROCnopal ELSEJ%=2^(bpp%DIV3):FORI%=0TOJ%-1:r%(I%)=I%/(J%-1)*F:NEXT:g%()=r%():b%()=r%()
13070IFbpp%=32 AND comps%=3 bpp%=24:rowbytes%=3*sx%
13080OTHERWISE:CLOSE#c%:ERROR42,"ChangeFSI can't understand Mac PICT2 code "+STR$~code%
13090ENDCASE
13100junk%=FNbeHW:junk%=FNbeHW:junk%=FNbeHW:junk%=FNbeHW
13110junk%=FNbeHW:junk%=FNbeHW:junk%=FNbeHW:junk%=FNbeHW
13120junk%=FNbeHW
13130cache%=TRUE:cachebytes%=TRUE:bigendianbits=TRUE:st%=PTR#c%:rowbytes%=rowbytes%ANDNOT&8000
13140IFscale% xmul%=xmul%*90*65536:xdiv%=xdiv%*resx:ymul%=ymul%*90*65536:ydiv%=ydiv%*resy
13150info$="Mac PICT2, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(bpp%)
13160plbuff%=FNdim(rowbytes%):IFbpp%>8 THEN
13170rbo%=-1:rb%=plbuff%+sx%:gb%=plbuff%+sx%*2:bb%=plbuff%+sx%*3:r$="FN1851":input=24
13180IFcomps%=3 rb%=plbuff%:gb%=plbuff%+sx%:bb%=plbuff%+sx%*2
13190ENDIF
13200WHEN 1900
13210PTR#c%=1:C%=BGET#c%
13220E%=BGET#c%:IFE%<>1 ERROR 42,"ZSoft .PCX file with unknown encoding"
13230E%=BGET#c%:sx%=FNHW:sy%=FNHW:sx%=FNHW+1-sx%:sy%=FNHW+1-sy%
13240IFscale% xmul%=xmul%*90:xdiv%=xdiv%*FNHW:ymul%=ymul%*90:ydiv%=ydiv%*FNHW ELSEIFFNW
13250PTR#c%=65:planes%=BGET#c%:planar%=planes%>1:rowbytes%=FNHW:bpp%=E%*planes%
13260pcxpal=16:IFbpp%>4 AND C%=5 THEN
13270PTR#c%=EXT#c%-769:IFBGET#c%=12 pcxpal=EXT#c%-768
13280ENDIF
13290PTR#c%=pcxpal:E%=0:FORC%=0TO(1<<bpp%)*3-1:E%=E%ORBGET#c%:NEXT
13300IFinfo% PRINT".PCX palette mask established at ";~E%
13310IFE%=0 THEN
13320FORC%=0TO(1<<bpp%)-1:r%(C%)=C%/((1<<bpp%)-1)*F:NEXT:g%()=r%():b%()=r%()
13330ELSE
13340PTR#c%=pcxpal:FORC%=0TO(1<<bpp%)-1
13350r%(C%)=(BGET#c%ANDE%)/E%*F:g%(C%)=(BGET#c%ANDE%)/E%*F:b%(C%)=(BGET#c%ANDE%)/E%*F
13360NEXT
13370ENDIF
13380PROCrewind
13390plbytes%=rowbytes%*planes%:plbuff%=FNdim(plbytes%):cache%=TRUE:cachebytes%=TRUE
13400IFplanar% pbuff%=FNdim(sx%) ELSEinput=bpp%:bigendianbits=TRUE:r$="FN1100"
13410info$="ZSoft .PCX file, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(bpp%)
13420WHEN 2000
13430PTR#c%=0:L%=BGET#c%:C%=BGET#c%:I%=BGET#c%:J%=FNHW:K%=FNHW:M%=BGET#c%
13440sx%=FNW:sx%=FNHW:sy%=FNHW:B%=BGET#c%:ID%=BGET#c%:IFID%AND&10 hflip%=NOThflip%
13450IF(ID% AND&20)=0 vflip%=NOTvflip%
13460PTR#c%=PTR#c%+L%:CASE C% OF
13470WHEN 1:IFM%=&18 THEN
13480FORC%=J%TOK%-1
13490b%(C%)=BGET#c%/255*F:g%(C%)=BGET#c%/255*F:r%(C%)=BGET#c%/255*F
13500NEXT
13510ELSE
13520ENDIF
13530OTHERWISE PROCnopal
13540ENDCASE
13550st%=PTR#c%
13560CASE I% OF
13570WHEN 1,2,3:cache%=TRUE:IFB%>8 THEN
13580IFB%>16 THEN
13590input=24:bbo%=0:gbo%=1:rbo%=2:step24=B%DIV8:r$="FN24":rowbytes%=step24*sx%
13600ELSE
13610rowbytes%=sx%*2
13620DIM rpal%(255),gpal%(255):input=16:step24=2:r$="FN16"
13630FORC%=0TO255
13640gpal%(C%)=(C%>>5)<<8 OR (C%AND31)<<16
13650rpal%(C%)=(C%>>2)AND31 OR (C%AND3)<<11
13660NEXT
13670FORC%=0TO31:r%(C%)=C%/31*F:NEXT:g%()=r%():b%()=r%()
13680ENDIF
13690ELSE
13700r$="FN8":rowbytes%=sx%
13710ENDIF
13720info$="Truevision TGA image, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(B%)
13730WHEN 9,10,11:step24=B%DIV8:rowbytes%=step24*sx%:buff%=FNdim(rowbytes%)
13740IFB%>8 THEN
13750IFB%>16 THEN
13760input=24:bb%=buff%:gb%=buff%+1:rb%=buff%+2:r$="FN2002"
13770ELSE
13780DIM rpal%(255),gpal%(255):input=16:step24=2:r$="FN2001"
13790FORC%=0TO255
13800gpal%(C%)=(C%>>5)<<8 OR (C%AND31)<<16
13810rpal%(C%)=(C%>>2)AND31 OR (C%AND3)<<11
13820NEXT
13830FORC%=0TO31:r%(C%)=C%/31*F:NEXT:g%()=r%():b%()=r%()
13840ENDIF
13850ENDIF
13860info$="Truevision TGA RLE image, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(B%)
13870ENDCASE
13880WHEN 2100
13890quant%=6:sx%=512:rowbytes%=2*sx%:sy%=256:cache%=TRUE:r$="FN16"
13900DIM rpal%(255),gpal%(255):input=16:step24=2
13910FORC%=0TO255
13920gpal%(C%)=C%>>3 OR (C%AND7)<<11
13930rpal%(C%)=(C%AND7)<<8 OR (C%>>3)<<16
13940NEXT
13950FORC%=0TO31:r%(C%)=C%/31*F:NEXT:b%()=r%()
13960FORC%=0TO63:g%(C%)=C%/63*F:NEXT
13970IFscale% ymul%=ymul%*2
13980info$="Pineapple image, 512 by 256 pixels, 16 bits per pixel":PTR#c%=7
13990WHEN 2200
14000quant%=8:step24=1:PTR#c%=0:s$=GET$#c%:E%=INSTR(s$,":"):st%=PTR#c%
14010sx%=VALMID$(s$,E%+1):sy%=VALMID$(s$,E%+2+LENSTR$sx%):PROCnopal:input=24
14020rowbytes%=sx%*3:rbo%=0:gbo%=sx%:bbo%=2*sx%:cache%=TRUE:r$="FN24"
14030info$="Irlam image, "+STR$sx%+" by "+STR$sy%+" pixels, 24 bits per pixel"
14040WHEN 2250
14050PTR#c%=16:sx%=FNW:sy%=FNW:DIM rpal%(255),gpal%(255),bpal%(255),table%(255)
14060FORC%=0TO255:D%=C%OR1
14070table%(C%)=(D%-16)/219*F
14080IFD%AND128 D%-=256
14090r%(C%)=INT(D%/160*F):b%(C%)=INT(D%/126*F)
14100g%(C%)=INT(-D%/160*rwt/gwt*F):gpal%(C%)=INT(-D%/126*bwt/gwt*F)
14110NEXT
14120table%()=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
14130st%=32:PTR#c%=32:cache%=TRUE:rowbytes%=2*sx%:input=411
14140info$="Irlam YUV 4:1:1 file "+STR$sx%+" by "+STR$sy%+" pixels"
14150WHEN 2300
14160PTR#c%=6:sx%=FNHW:sy%=FNHW:D%=BGET#c%:ncolors%=BGET#c%:input=24
14170vflip%=NOTvflip%:quant%=BGET#c%:ncmap%=BGET#c%:cmaplen%=1<<BGET#c%
14180PROCnopal:back%=FNdim(4):!back%=0
14190clrfirst%=D%AND1
14200IF(D%AND2)=0 THEN
14210FORI%=0TOncolors%-1:back%?I%=BGET#c%:NEXT
14220IF(ncolors%AND1)=0 IFBGET#c%
14230ENDIF
14240IFD%AND4 alpha%=FNdim(sx%)
14250IFncmap%>0 THEN
14260FORI%=0TOcmaplen%-1:r%(I%)=FNHW/&FF00*F:NEXT
14270FORI%=0TOcmaplen%-1:g%(I%)=FNHW/&FF00*F:NEXT
14280FORI%=0TOcmaplen%-1:b%(I%)=FNHW/&FF00*F:NEXT
14290ENDIF
14300IFD%AND8 THEN
14310PTR#c%=FNHW+PTR#c%:IFPTR#c%AND1 PTR#c%=PTR#c%+1
14320ENDIF
14330st%=PTR#c%:buff%=FNdim(sx%*3):rb%=buff%:gb%=buff%+1*sx%:bb%=buff%+2*sx%
14340PROCrewind
14350info$="Utah rle image, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(ncolors%*quant%)
14360WHEN 2400
14370PTR#c%=&0a:st%=FNW:pal%=FNW:sx%=FNW:sy%=FNW
14380PTR#c%=&1c:input=BGET#c%:bigendianbits=TRUE:vflip%=NOTvflip%
14390CASE input OF
14400WHEN 1:rowbytes%=sx%+7>>3
14410WHEN 4:rowbytes%=sx%+1>>1
14420WHEN 8:rowbytes%=sx%
14430OTHERWISE ERROR 42,".BMP file of unusual depth ("+STR$input+")"
14440ENDCASE
14450rowbytes%=rowbytes%+3ANDNOT3
14460PTR#c%=&36:FORC%=0TO2^input-1
14470b%(C%)=BGET#c%/255*F:g%(C%)=BGET#c%/255*F:r%(C%)=BGET#c%/255*F:IFBGET#c%
14480NEXT
14490r$="FN8":st%=PTR#c%:cache%=TRUE
14500info$="Windows 3.0 .BMP image, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(input)
14510WHEN 2500
14520PTR#c%=0:s$="":C%=BGET#c%:WHILEC%<>0 s$+=CHR$C%:C%=BGET#c%:ENDWHILE
14530s$+=" version "+STR$FNW:sx%=FNW:sy%=FNW:input=FNW:cache%=TRUE
14540info$="!Translator Clear format made by "+s$+", "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(input)
14550IFinput>8 THEN
14560PROCnopal:input=24:step24=3:rowbytes%=3*sx%:rbo%=0:gbo%=1:bbo%=2:r$="FN24"
14570ELSE
14580FORC%=0TO2^input-1
14590r%(C%)=BGET#c%/255*F:g%(C%)=BGET#c%/255*F:b%(C%)=BGET#c%/255*F
14600NEXT
14610input=8:r$="FN8":rowbytes%=sx%
14620ENDIF
14630st%=PTR#c%
14640WHEN 2600
14650PTR#c%=0:C%=BGET#c%
14660D%=BGET#c%:CASE D% OF
14670WHEN 0:sx%=320:sy%=200:planes%=4
14680WHEN 1:sx%=640:sy%=200:planes%=2
14690WHEN 2:sx%=640:sy%=400:planes%=1
14700OTHERWISE ERROR42,"ChangeFSI knows nothing of "+STR$C%+" type Degas files"
14710ENDCASE
14720FORI%=0TO(1<<input)-1:D%=FNbeHW:r%(I%)=(D%>>8AND7)/7*F:g%(I%)=(D%>>4AND7)/7*F:b%(I%)=(D%AND7)/7*F:NEXT
14730cache%=TRUE:planar%=TRUE:masking%=FALSE:st%=34:PTR#c%=34:r$="FN1600"
14740rowbytes%=(sx%+15>>4)<<1:plbytes%=rowbytes%*planes%:pbuff%=FNdim(sx%)
14750IFC%AND128 r$="FN1601":flag=1600:cachebytes%=TRUE:plbuff%=FNdim(plbytes%) ELSErealrowbytes%=2:rowbytes%=plbytes%
14760info$="Degas file "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(planes%)
14770WHEN 2700
14780PTR#c%=4:sx%=FNHW:sy%=FNHW
14790CASE FNHW OF
14800WHEN &AF:rowbytes%=sx%:cache%=TRUE:r$="FN8":st%=&30A
14810OTHERWISE CLOSE#c%:ERROR 42,"Panic in ColoRIX reading - ChangeFSI largely ignorant of format!"
14820ENDCASE
14830FORC%=0TO2^input-1
14840r%(C%)=BGET#c%/63*F:g%(C%)=BGET#c%/63*F:b%(C%)=BGET#c%/63*F
14850NEXT
14860PTR#c%=st%
14870info$="ColoRIX file "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(input)
14880WHEN 2800
14890PTR#c%=0:REPEAT s$=FNfits:CASE LEFT$(s$,8) OF
14900WHEN "SIMPLE ":IFMID$(s$,30,1)<>"T" ERROR42,"ChangeFSI can only read Simple FITS format"
14910WHEN "BITPIX ":input=VALMID$(s$,10)
14920WHEN "NAXIS ":IFVALMID$(s$,10)<>2 ERROR42,"ChangeFSI can only read 2d FITS images"
14930WHEN "NAXIS1 ":sx%=VALMID$(s$,10)
14940WHEN "NAXIS2 ":sy%=VALMID$(s$,10)
14950WHEN "END "
14960OTHERWISE IFinfo% PRINT"Ignoring FITS record "s$
14970ENDCASE
14980UNTILLEFT$(s$,8)="END "
14990st%=(PTR#c%DIV2880 + 1)*2880:cache%=TRUE:PTR#c%=st%
15000CASE input OF
15010WHEN 8:r$="FN8":rowbytes%=sx%:PROCnopal
15020WHEN 16:rowbytes%=2*sx%:DIM rpal%(255),gpal%(255):step24=2:r$="FN16"
15030FORC%=0TO255
15040gpal%(C%)=C%<<8
15050rpal%(C%)=C%
15060NEXT:cheat%=0:IFinvert% cheat%=F
15070FORC%=0TO255:r%(C%)=cheat%+C%/65535*F:g%(C%)=((C%EOR&80)<<8)/65535*F:b%(C%)=cheat%:NEXT:rwt=1:gwt=1:bwt=1
15080OTHERWISE ERROR 42,"ChangeFSI can't read a FITS image with this number of bits per pixel"
15090ENDCASE
15100info$="FITS file "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(input)
15110WHEN 2900
15120PTR#c%=4:sx%=FNbeHW:sy%=FNbeHW:PTR#c%=&42:input=FNbeHW:C%=FNbeHW
15130rowbytes%=FNbeHW:C%=FNbeW:st%=FNbeW:PTR#c%=st%:r$="FN8":PROCnopal
15140DIM rpal%(15),gpal%(15),bpal%(15)
15150rpal%()=&e6,&23,&e6,&7f,&17,&00,&a1,&45,&e6,&4a,&e6,&73,&6e,&47,&8a,0
15160gpal%()=&e6,&78,&00,&23,&a1,&73,&2e,&2e,&c8,&a6,&75,&40,&b8,&78,&55,0
15170bpal%()=&b8,&e6,&00,&a1,&17,&2e,&0c,&2e,&00,&c6,&00,&e6,&00,&00,&00,0
15180FORC%=&80TO&8F:r%(C%)=rpal%(C%-&80)/255*F:g%(C%)=gpal%(C%-&80)/255*F:b%(C%)=bpal%(C%-&80)/255*F:NEXT:cache%=TRUE
15190info$="Apollo GPR file "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(input)
15200WHEN 3000
15210sx%=720:sy%=EXT#c%/1440:DIM rpal%(255),gpal%(255),bpal%(255),table%(255)
15230IFFALSE THEN
15240FORC%=0TO255
15250table%(C%)=(C%-16)/219*F
15260r%(C%)=(C%-128)/186*0.624*F:rpal%(C%)=(C%-128)/160*0.952*F
15270g%(C%)=-(C%-128)/186*0.64*F:gpal%(C%)=-(C%-128)/160*0.277*F
15280b%(C%)=(C%-128)/186*1.73*F:bpal%(C%)=-(C%-128)/160*1.11*F
15290NEXT
15300ELSE
15320FORC%=0TO255
15330table%(C%)=(C%-16)/219*F
15340r%(C%)=INT((C%-128)/160*F):b%(C%)=INT((C%-128)/126*F)
15350g%(C%)=INT(-(C%-128)/160*rwt/gwt*F):gpal%(C%)=INT(-(C%-128)/126*bwt/gwt*F)
15360NEXT
15370ENDIF
15380table%()=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
15390st%=0:PTR#c%=0:cache%=TRUE:rowbytes%=1440:input=422:gamma=1
15400IFscale% ymul%=ymul%*2
15410info$="CCIR601 4:2:2 file "+STR$sx%+" by "+STR$sy%+" pixels"
15420WHEN 3100
15430quant%=8:PTR#c%=0:a$=GET$#c%:st%=PTR#c%
15440sx%=VALa$:sy%=VAL(MID$(a$,INSTR(a$," ")))
15450PROCnopal:input=24:step24=3:rowbytes%=sx%*3
15460rbo%=0:gbo%=1:bbo%=2:cache%=TRUE:flag=700:r$="FN24"
15470info$="!RayShade 'RGB' image, "+STR$sx%+" by "+STR$sy%+" pixels, 24 bits per pixel"
15480WHEN 3200
15490quant%=8:PTR#c%=0:st%=0
15500sx%=VALMID$(s$,INSTR(s$,"_")+1,1)
15510CASE sx% OF
15520WHEN 5:sx%=768:sy%=512
15530WHEN 2:sx%=3072:sy%=2048
15540WHEN 1:sx%=1536:sy%=1024
15550ENDCASE
15560PROCnopal:input=24:step24=3:rowbytes%=sx%*3
15570rbo%=0:gbo%=1:bbo%=2:cache%=TRUE:flag=700:r$="FN24"
15580info$="Kodak /RGB image, "+STR$sx%+" by "+STR$sy%+" pixels, 24 bits per pixel"
15590WHEN 3300
15600PTR#c%=0:input=VALMID$(FNGET,2)
15610s$=FNGET:sx%=VALs$:sy%=VALMID$(s$,INSTR(s$," ")):IFsy%=0 sy%=VALFNGET
15620cache%=TRUE:CASE input OF
15630WHEN 4:input=1:r$="FN8":r%(0)=F:g%()=r%():b%()=r%():bigendianbits=TRUE
15640rowbytes%=(sx%+7)DIV8
15650WHEN 5:input=8:r$="FN8":E%=VALFNGET
15660FORC%=0TOE%:r%(C%)=C%/E%*F:NEXT:g%()=r%():b%()=r%()
15670rowbytes%=sx%
15680WHEN 6:input=24:r$="FN24":E%=VALFNGET:step24=3:rbo%=0:gbo%=1:bbo%=2
15690FORC%=0TOE%:r%(C%)=C%/E%*F:NEXT:g%()=r%():b%()=r%()
15700rowbytes%=sx%*3
15710ENDCASE
15720st%=PTR#c%:flag=700
15730info$+="pbm image, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(input)
15740DEF FNGET REPEATs$=GET$#c%:UNTILLEFT$(s$,1)<>"#":=s$
15750WHEN 3400
15760PTR#c%=0:s$=FNGET:input=16:quant%=5
15770s$=FNGET:sx%=VALs$:sy%=VALMID$(s$,INSTR(s$," ")):s$=FNGET
15780DIM rpal%(255),gpal%(255):input=16:step24=2
15790FORC%=0TO255
15800gpal%(C%)=(C%>>5)<<8 OR (C%AND31)
15810rpal%(C%)=((C%>>2)AND31)<<16 OR (C%AND3)<<11
15820NEXT
15830cache%=TRUE:r$="FN16"
15840FORC%=0TO31:r%(C%)=C%/31*F:NEXT:g%()=r%():b%()=r%()
15850rowbytes%=sx%*2:st%=PTR#c%:flag=700
15860info$="p15 image, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(input)
15870WHEN 3450
15880PTR#c%=0:info$=FNGET
15890ybits%=VALMID$(info$,INSTR(info$," ")):ymax%=(1<<ybits%)-1
15900ubits%=VALMID$(info$,INSTR(info$,"Y ")+1):umax%=(1<<(ubits%-1))-1
15910vbits%=VALMID$(info$,INSTR(info$,"U ")+1):vmax%=(1<<(vbits%-1))-1
15920s$=FNGET:sx%=VALs$:sy%=VALMID$(s$,INSTR(s$," "))
15930DIM rpal%(255),gpal%(255),bpal%(255),table%(255)
15940FORC%=0TOymax%:table%(C%)=C%/ymax%*F:NEXT
15950D%=(1<<ubits%)-1
15960FORC%=0TOD%:d=C%/umax%:IFd>1 d=-(D%-C%)/umax%
15970b%(C%)=INT(d*(1-bwt)*F):gpal%(C%)=INT(-d*(1-bwt)*bwt/gwt*F)
15980NEXT
15990D%=(1<<vbits%)-1
16000FORC%=0TOD%:d=C%/vmax%:IFd>1 d=-(D%-C%)/vmax%
16010r%(C%)=INT(d*(1-rwt)*F):g%(C%)=INT(-d*(1-rwt)*rwt/gwt*F)
16020NEXT
16030rowbytes%=sx%*2:st%=PTR#c%:cache%=TRUE:r$="FN2250":input=555
16040info$+=", "+STR$sx%+" by "+STR$sy%+" pixels"
16050WHEN 3500
16060quant%=1:PTR#c%=6:E%=FNHW:sx%=FNHW:sx%=FNHW:sy%=FNHW:st%=FNHW:st%=FNW
16070input=1:r%(0)=F:g%(0)=F:b%(0)=F:rowbytes%=sx%/8+1ANDNOT1
16080IFE%=1 THEN
16090st%+=PTR#c%:PTR#c%=st%
16100cache%=TRUE:r$="FN8"
16110info$="Pocketbook bitmap, "+STR$sx%+" by "+STR$sy%+" pixels, 1 bit per pixel"
16120ELSE
16130planar%=TRUE:planes%=2
16140ENDIF
16150WHEN 3600
16160pcdblk%=FNdim(40):SYS&20023,"ChangeFSI$PCDindex",pcdblk%,20 TO,,Z
16170IFZ THENpcdblk%?Z=13:pcdindex%=VAL$pcdblk% ELSEpcdindex%=3
16180SYS"PhotoCD_Open",1,c%,1 TO pcdh%:SYS"PhotoCD_GetCount",pcdh% TO,Z
16190IF(Z>>pcdindex%)=0 CLOSE#c%:ERROR42,"Desired resolution unavailable"
16200SYS"PhotoCD_GetRotation",pcdh% TO,,pcdtr%
16210SYS"PhotoCD_GetSize",pcdh%,,pcdindex% TO,,,,sx%,sy%
16220pcdblk%!0=0:pcdblk%!8=sx%:pcdblk%!4=0
16230pcdblk%!16=0:pcdblk%!20=2:pcdblk%!24=1:pcdblk%!28=3
16250CASE pcdtr% OF
16260WHEN 0
16270WHEN &80000000:hflip%=NOThflip%
16280WHEN 90
16290CASE rotate% OF
16300WHEN 0:rotate%=1
16310WHEN -1:rotate%=0
16320WHEN 1:rotate%=0:vflip%=NOTvflip%:hflip%=NOThflip%
16330ENDCASE
16340WHEN &8000005A
16350CASE rotate% OF
16360WHEN 0:rotate%=1:vflip%=NOTvflip%
16370WHEN -1:rotate%=0:vflip%=NOTvflip%
16380WHEN 1:rotate%=0:hflip%=NOThflip%
16390ENDCASE
16400WHEN 180:hflip%=NOThflip%:vflip%=NOTvflip%
16410WHEN &800000B4:vflip%=NOTvflip%
16420WHEN 270
16430CASE rotate% OF
16440WHEN 0:rotate%=-1
16450WHEN 1:rotate%=0
16460WHEN -1:rotate%=0:vflip%=NOTvflip%:hflip%=NOThflip%
16470ENDCASE
16480WHEN &8000010E
16490CASE rotate% OF
16500WHEN 0:rotate%=-1:vflip%=NOTvflip%
16510WHEN 1:rotate%=0:vflip%=NOTvflip%
16520WHEN -1:rotate%=0:hflip%=NOThflip%
16530ENDCASE
16540OTHERWISE PANIC
16550ENDCASE
16570input=24:step24=3:rbo%=0:gbo%=1:bbo%=2:pcdcachesize%=32*1024
16580rowbytes%=sx%*3:PROCnopal:cache%=TRUE:pcdcache%=FNdim(pcdcachesize%)
16590info$="PhotoCD image, "+STR$sx%+" by "+STR$sy%+" pixels, 24 bits per pixel"
16600WHEN 3700
16610A%=OPENIN"<ChangeFSI$Dir>.CFSI-jpeg":jpeg%=FNdim(EXT#A%)
16620SYS12,4,A%,jpeg%,EXT#A%:CLOSE#A%
16630datacache%=FNcachedim(EXT#c%):IFdatacache%=-1 datacache%=FNdim(EXT#c%)
16640PTR#c%=0:SYS12,4,c%,datacache%,EXT#c%
16650A%=datacache%:B%=jpegblk%:C%=jpegblk%+4:D%=jpegblk%+8:E%=jpegblk%+12:CALLjpeg%+8
16660B%=jpegblk%!12:jpegspace%=FNdim(B%)
16670C%=datacache%:A%=jpegspace%:D%=EXT#c%
16680CALLjpeg%:cache%=FALSE:IF!A% ERROR42,"JPEG code error: "+STR$!A%
16690sx%=A%!20:sy%=A%!24:input=8*A%?28:PROCnopal:step24=4
16700info$="JFIF image, "+STR$sx%+" by "+STR$sy%+" pixels, "+FNbits(input)
16710jpegy%=sy%:r$="FN"+STR$INT(3700+input)
16720WHEN 666
16830st%=0:PTR#c%=0:sx%=160:sy%=128:input=8:cache%=TRUE:rowbytes%=sx%
16840FORC%=0TO255:r%(C%)=C%/255*F:NEXT:g%()=r%():b%()=r%():r$="FN8"
16850info$="The number of the beast, 160 by "+STR$sy%+" pixels, 8 bits per pixel"
16860ENDCASE
16870IFinfo% PRINTinfo$
16880SYS"Hourglass_On",1:hour%=&406c4
16890IFinvert% r%()=F-r%():g%()=F-g%():b%()=F-b%()
16900CASE m OF
16910WHEN -1:x%=256:y%=256:ncol=256:IFscaleo% xdiv%=xdiv%*2:ydiv%=ydiv%*2
16920WHEN -2:x%=sx%:y%=sy%:IFspm=18 ncol=1 ELSEncol=15
16930WHEN -3,-5,-6:x%=sx%:y%=sy%:ncol=2^15-1
16940WHEN -4,-7,-8:x%=sx%:y%=sy%:ncol=2^24-1
16950OTHERWISE
16960SYS53,m,4 TO ,,nx:SYS53,m,5 TO ,,ny:nx=1<<nx:ny=1<<ny
16970SYS53,m,11 TO ,,x%:SYS53,m,12 TO ,,y%:x%+=1:y%+=1
16980SYS53,m,3 TO ,,ncol:IFscaleo% THEN
16990IFrotate% THEN
17000xdiv%=xdiv%*ny:ydiv%=ydiv%*nx
17010IFxdiv% ymul%=ymul%*2
17020IFydiv% xmul%=xmul%*2
17030ELSE
17040xdiv%=xdiv%*nx:ydiv%=ydiv%*ny
17050IFxdiv% xmul%=xmul%*2
17060IFydiv% ymul%=ymul%*2
17070ENDIF
17080ENDIF
17090SYS&62A51,m TO r0;V:IF(V AND1)=0 THEN
17110IFr0=1 THEN
17120ncol=255:IFm$<>"D" m$="R"
17130ENDIF
17140ENDIF
17150ENDCASE
17160IFm=-6 OR m=-7 OR m=-8 THEN
17170nx=VALMID$(pnm$,5):ny=VALMID$(pnm$,INSTR(pnm$,",",5)+1)
17180IFscaleo% THEN
17190IFrotate% THEN
17200IFxdiv% ymul%=ymul%*nx
17210IFydiv% xmul%=xmul%*ny
17220ELSE
17230IFxdiv% xmul%=xmul%*nx
17240IFydiv% ymul%=ymul%*ny
17250ENDIF
17260xdiv%=xdiv%*90:ydiv%=ydiv%*90
17270ENDIF
17280ENDIF
17290IFrotate% SWAP x%,y%
17310IFxdiv%=0 xdiv%=sx%
17320IFydiv%=0 ydiv%=sy%
17330IFxs$="=" xmul%=x%:xdiv%=sx%
17340IFys$="=" ymul%=y%:ydiv%=sy%
17350IFlock% THEN
17360IFxmul%/xdiv%>ymul%/ydiv% xmul%=ymul%:xdiv%=ydiv% ELSEymul%=xmul%:ydiv%=xdiv%
17370ENDIF
17380IFncol=1 THEN
17390CASE m$ OF
17400WHEN"C":xdiv%=xdiv%*4:ydiv%=ydiv%*4
17410DIM A%(16),B%(16)
17420A%()=0,&00000001,&08000001,&08000101,&08080101,&08080103,&0C080103,&0C080303,&0C0C0303,&0C0E0303,&0C0E0703,&0E0E0703,&0E0E0707,&0E0F0707,&0E0F0F07,&0F0F0F07,&0F0F0F0F
17430B%()=0,&00000008,&01000008,&01000808,&01010808,&0101080C,&0301080C,&03010C0C,&03030C0C,&03070C0C,&03070E0C,&07070E0C,&07070E0E,&070F0E0E,&070F0F0E,&0F0F0F0E,&0F0F0F0F
17440even_gard=FNdim(17*32*4):odd_gard=FNdim(17*32*4)
17450FORI%=0TO16:FORJ%=0TO16:even_gard!(J%*32*4+I%*4)=A%(I%)ORB%(J%)<<4:NEXT:NEXT
17460FORI%=0TO16:FORJ%=0TO16:odd_gard!(I%*32*4+J%*4)=B%(I%)ORA%(J%)<<4:NEXT:NEXT
17470WHEN"T":xdiv%=xdiv%*3:ydiv%=ydiv%*3
17480DIM A%(9),B%(9)
17490A%()=0,&0001,&4001,&4041,&4043,&40C3,&60C3,&61C3,&71C3,&71C7
17500B%()=0,&0004,&1004,&1104,&1106,&1186,&3186,&31C6,&71C6,&71C7
17510even_gard=FNdim(10*16*4):odd_gard=FNdim(10*16*4)
17520FORI%=0TO9:FORJ%=0TO9:even_gard!(J%*16*4+I%*4)=A%(I%)ORB%(J%)<<3:NEXT:NEXT
17530FORI%=0TO9:FORJ%=0TO9:odd_gard!(I%*16*4+J%*4)=B%(I%)ORA%(J%)<<3:NEXT:NEXT
17540WHEN"D":xdiv%=xdiv%*2:ydiv%=ydiv%*2
17550DIM A%(4),B%(4)
17560A%()=0,&1,&21,&31,&33
17570B%()=0,&2,&12,&32,&33
17580even_gard=FNdim(5*8):odd_gard=FNdim(5*8)
17590FORI%=0TO4:FORJ%=0TO4:even_gard?(J%*8+I%)=A%(I%)ORB%(J%)<<2:NEXT:NEXT
17600FORI%=0TO4:FORJ%=0TO4:odd_gard?(I%*8+J%)=B%(I%)ORA%(J%)<<2:NEXT:NEXT
17610ENDCASE
17620ENDIF
17630PROCreduce(xmul%,xdiv%):PROCreduce(ymul%,ydiv%)
17640IFinfo% PRINT"Size ratios are x ";xmul%":"xdiv%" y "ymul%":"ydiv%
17650x%=sx%*xmul%/xdiv%+.9999:y%=sy%*ymul%/ydiv%+.9999:rows%=sy%
17660order%=x%*y%>sx%*sy%
17670code%=FNdim(8192):SP=13
17680IFcache% THEN
17690PROCcachesize(code%)
17700IFcachebytes% THEN
17710filesize%=EXT#c%-PTR#c%:IFcache%>filesize% cache%=filesize%
17720IFcachebytes%>0 IFcache%>cachebytes% cache%=cachebytes%
17730cacherows%=cache%
17740ELSE
17750filesize%=sy%*rowbytes%:IFcache%<rowbytes% cache%=rowbytes%
17760IFcache%>filesize% cache%=filesize%
17770cacherows%=striprows%:IFcacherows%<1 cacherows%=cache%DIVrowbytes%
17780cache%=cacherows%*rowbytes%
17790ENDIF
17800datacache%=FNcachedim(cache%):IFdatacache%=-1 datacache%=FNdim(cache%)
17810ENDIF
17820IFncol=255 IFm$<>"D" m$="R"
17830IFm$="R" OR(ncol=63 ANDm$="") THEN
17840SYS53,-1,3 TO,,J%:IFncol=255 AND MODE=m J%=ncol
17850IFncol=63 AND(m$=""ORm$="R") J%=ncol
17860IFJ%<>ncol PROCclose:ERROR42,"You must be in a "+STR$(ncol+1)+" colour mode to do this"
17870J%=ncol:IFJ%=63 J%=255
17880palette%=FNdim((J%+1)*4)
17890IFncol=255 THEN
17900SYS"ColourTrans_ReadPalette",-1,-1,palette%,256*4
17910FORI%=0TO255:palette%!(I%<<2)=palette%!(I%<<2)>>>8:NEXT
17920ELSE
17930IFncol=63 THEN
17940FORI%=0TO255
17950palette%!(I%<<2)=(I%AND7 OR (I%AND16)>>1)*17
17960palette%?(I%<<2 OR1)=(I%AND3 OR (I%AND&60)>>3)*17
17970palette%?(I%<<2 OR2)=(I%AND3 OR (I%AND8)>>1 OR (I%AND128)>>4)*17
17980NEXT
17990ELSE
18000FORI%=0TOncol:SYS"OS_ReadPalette",I%,16 TO ,,i%:palette%!(I%<<2)=i%>>>8:NEXT
18010ENDIF
18020ENDIF
18030t%=TRUE:k%=palette%+1:nk%=palette%+2
18040FORI%=0TOncol*4STEP4
18050IFpalette%?I%<>k%?I% OR palette%?I%<>nk%?I% t%=FALSE
18060NEXT
18070IFncol>16 IFt% m$="D"
18080IFncol=15 IFt% m$="T"
18090IFm$="R" THEN
18100IF sx%*xmul%/xdiv%*sy%*ymul%/ydiv%<200000 k%=3 ELSEk%=4
18110nk%=8-k%
18120t%=1<<nk%
18130mask%=t%-1
18140td2%=1<<nk%-1
18150step%=1<<(8-k%)
18160ncol%=ncol+1:IFncol%=64 ncol%=256
18170ict%=FNdim(2^(k%*3)*4-1)
18180IFcache%<8192*6 scratch%=FNdim(8192*6):scratchsz%=8192*6 ELSEscratch%=datacache%:scratchsz%=cache%
18190IFinfo% PRINT"Begin table generation with ";scratchsz%" bytes."
18200FORZ%=0TO2STEP2
18210P%=code%
18220[OPT Z%
18230.make%
18240STMFD r13!,{r14}
18250LDR r4,ict
18260MOV r2,#step%/2
18270.blueloop
18280MOV r1,#step%/2
18290.greenloop
18300MOV r0,#step%/2
18310.redloop
18330MOV r3,r0,LSR #nk%
18340MOV r14,r1,LSR #nk%
18350MOV r5,r2,LSR #nk%
18360ORR r3,r3,r14,LSL #k%
18370ORR r3,r3,r5,LSL #k%*2
18380BL devious
18390ADD r0,r0,#step%*2
18400CMP r0,#256
18410BCC redloop
18420ADD r1,r1,#step%
18430CMP r1,#256
18440BCC greenloop
18450ADD r2,r2,#step%
18460CMP r2,#256
18470BCC blueloop
18480LDMFD r13!,{pc}^
18490.ct DCD palette%
18500.min DCD code%+8192-256*2*4
18510.ict DCD ict%
18520.fsaad DCD scratch%
18530.fsalim DCD scratch%+scratchsz%
18540.devious
18550STMFD r13!,{r0,r1,r2,r3,r4,r8,r14}
18560BIC r0,r0,#(mask%<<1)+1
18570BIC r1,r1,#mask%
18580BIC r2,r2,#mask%
18610MOV r5,#0
18620LDR r6,ct
18630MOV r9,#&ff0000
18640MOV r14,#&ff0000
18650LDR r12,min
18660.devloop
18670LDR r7,[r6,r5,LSL #2]
18680MOV r8,r7,lsr #16
18690BIC r10,r8,#mask%
18700ADD r11,r2,#t%
18710CMP r10,r2
18720BEQ blueequal
18730SUBCC r10,r2,r8
18740SUBCC r11,r11,r8
18750SUBCS r10,r8,r11
18760SUBCS r11,r8,r2
18770MUL r3,r10,r10
18780.doneblue
18790MUL r4,r11,r11
18800MOV r8,r7,lsr #8
18810AND r8,r8,#255
18820BIC r10,r8,#mask%
18830ADD r11,r1,#t%
18840CMP r10,r1
18850BEQ greenequal
18860SUBCC r10,r1,r8
18870SUBCC r11,r11,r8
18880SUBCS r10,r8,r11
18890SUBCS r11,r8,r1
18900MLA r3,r10,r10,r3
18910.donegreen
18920MLA r4,r11,r11,r4
18930AND r8,r7,#255
18950BIC r10,r8,#mask%
18960ADD r11,r0,#t%
18970CMP r10,r0
18980BEQ redequal0
18990SUBCC r10,r0,r8
19000SUBCC r11,r11,r8
19010SUBCS r10,r8,r11
19020SUBCS r11,r8,r0
19030MLA r7,r10,r10,r3
19040STR r7,[r12,r5,LSL #2]
19050.donered0
19060MLA r7,r11,r11,r4
19070CMP r7,r9
19080MOVCC r9,r7
19100ADD r7,r0,#t%
19110BIC r10,r8,#mask%
19120ADD r11,r7,#t%
19130CMP r10,r7
19140BEQ redequal1
19150SUBCC r10,r7,r8
19160SUBCC r11,r11,r8
19170SUBCS r10,r8,r11
19180SUBCS r11,r8,r7
19190MLA r3,r10,r10,r3
19200.donered1
19210ADD r7,r5,#ncol%
19220STR r3,[r12,r7,LSL #2]
19230MLA r7,r11,r11,r4
19240CMP r7,r14
19250MOVCC r14,r7
19260ADD r5,r5,#1
19270CMP r5,#ncol%
19280BCC devloop
19290LDMFD r13!,{r0,r1,r2,r3,r4}
19310LDR r5,fsaad
19320MOV r7,r5
19330MOV r10,#0
19340.calcnum0
19350LDMIA r12!,{r8,r11}
19360CMP r8,r9
19370STRLEB r10,[r7],#1
19380ADD r10,r10,#1
19390CMP r11,r9
19400STRLEB r10,[r7],#1
19410ADD r10,r10,#1
19420LDMIA r12!,{r8,r11}
19430CMP r8,r9
19440STRLEB r10,[r7],#1
19450ADD r10,r10,#1
19460CMP r11,r9
19470STRLEB r10,[r7],#1
19480ADD r10,r10,#1
19490CMP r10,#ncol%
19500BCC calcnum0
19510SUBS r10,r7,r5
19520SWIEQ 256+ASC"A"
19530CMP r10,#4 ;if<4 then
19540MOVCC r7,r5 ;reset list pointer
19550LDRCCB r5,[r7] ;first possible
19560LDRCCB r8,[r7,#1] ;second possible
19570ORRCC r5,r5,r8,lsl #8
19580LDRCCB r8,[r7,#2] ;third possible
19590ORRCC r5,r5,r8,lsl #16
19600ADD r5,r5,r10,lsl #24
19610BIC r10,r3,#1
19620STR r5,[r4,r10,LSL #2]
19630MOV r5,r7
19640MOV r10,#0
19650.calcnum1
19660LDMIA r12!,{r8,r11}
19670CMP r8,r14
19680STRLEB r10,[r7],#1
19690ADD r10,r10,#1
19700CMP r11,r14
19710STRLEB r10,[r7],#1
19720ADD r10,r10,#1
19730LDMIA r12!,{r8,r11}
19740CMP r8,r14
19750STRLEB r10,[r7],#1
19760ADD r10,r10,#1
19770CMP r11,r14
19780STRLEB r10,[r7],#1
19790ADD r10,r10,#1
19800CMP r10,#ncol%
19810BCC calcnum1
19820SUBS r10,r7,r5
19830SWIEQ 256+ASC"B"
19840CMP r10,#4 ;if<4 then
19850MOVCC r7,r5
19860LDRCCB r5,[r7]
19870LDRCCB r8,[r7,#1]
19880ORRCC r5,r5,r8,lsl #8
19890LDRCCB r8,[r7,#2]
19900ORRCC r5,r5,r8,lsl #16
19910ADD r5,r5,r10,lsl #24
19920ORR r10,r3,#1
19930STR r5,[r4,r10,LSL #2]
19940STR r7,fsaad
19950LDR r8,fsalim
19960CMP r7,r8
19970SWICS 256+ASC"!"
19980LDMFD r13!,{r8,pc}^
19990.redequal0
20000STR r3,[r12,r5,LSL #2]
20010TST r8,#td2%
20020SUBNE r11,r8,r0
20030SUBEQ r11,r11,r8
20040B donered0
20050.redequal1
20060TST r8,#td2%
20070SUBNE r11,r8,r7
20080SUBEQ r11,r11,r8
20090B donered1
20100.greenequal
20110TST r8,#td2%
20120SUBNE r11,r8,r1
20130SUBEQ r11,r11,r8
20140B donegreen
20150.blueequal
20160MOV r3,#0
20170TST r8,#td2%
20180SUBNE r11,r8,r2
20190SUBEQ r11,r11,r8
20200B doneblue
20210]
20220NEXT
20230I%=TIME:CALLmake%
20240IFinfo% PRINT"Generated 'r'";k%" tables for ";ncol%" colours using ";!fsaad-scratch%" bytes, taking "TIME-I%" cS"
20250safesubict%=FNdim(!fsaad-scratch%)
20260FORI%=0TO!fsaad-scratch%+4STEP4:safesubict%!I%=scratch%!I%:NEXT
20270FORI%=0TO2^(k%*3)*4-1STEP4:IF(ict%!I%>>>24)>3 ict%!I%=ict%!I%-scratch%+safesubict%
20280NEXT
20290ENDIF
20300ENDIF
20310IFfast% IFMODE<>0 MODE0
20330CASE m OF
20340WHEN -1:col=0
20350WHEN -3,-4,-5,-6,-7,-8:col=2
20360OTHERWISE
20370IFm$="D" IFncol=3 m$=""
20380col=0:IFncol>15 ORm$="C" ORm$="D" ORm$="R" col=2
20390IFncol=63 OR ncol=255 IFm$="D" col=0:ncol=256
20400ENDCASE
20410IFncol=1 THEN
20420CASE m$ OF
20430WHEN"C":col=0:x%=x%+1ANDNOT1
20440WHEN"D":col=0:x%=x%+3ANDNOT3
20450WHEN"T":col=0:x%=x%+1ANDNOT1
20460ENDCASE
20470ENDIF
20480IFsharpen%=TRUE sharpen%=24
20490DIM cl%(x%+7,col)
20500DIM xl%(x%+7,col),xp%(sx%+7,col)
20510DIM xl2%(x%+7,col)
20520IFsharpen% THEN
20530IForder% THEN
20540DIM rm%(sx%+7,col),rm1%(sx%+7,col),rm2%(sx%+7,col)
20550ELSE
20560DIM rm%(x%+7,col),rm1%(x%+7,col),rm2%(x%+7,col)
20570ENDIF
20580ENDIF
20590IFhist%ORequal% DIM vals%(256,col)
20600DIM nl%(x%+7,col)
20610totvals%=x%*(col+1)
20620totvals2%=sx%*(col+1)
20630FORZ=0TO2STEP2:P%=code%
20640CASE ncol OF
20650WHEN 2^24-1
20660[OPT Z
20670.div255
20680]
20690FORI%=0TO2^p6bits-1
20700[OPT Z
20710EQUD I%/(2^p6bits-1)*F
20720]
20730NEXT
20740[OPT Z
20750.fs%
20760STMFD SP !,{R14}
20770LDR R1,[R9,#5*8]:LDR R1,[R1]
20780LDR R10,[R9,#4*8]
20790LDR R11,[R9,#3*8]
20800LDR R12,[R9,#2*8]:LDR R12,[R12]
20810LDR R8,[R9,#8]:LDR R8,[R8]
20820LDR R9,[R9]:LDR R9,[R9]
20830LDR R4,[R10]
20840LDR R5,[R10,#4]
20850LDR R6,[R10,#8]
20860ADR R7,div255
20870.fsloop
20880ADD R10,R10,R8
20890CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
20900SUB R0,R4,R4,LSR #p6bits:ADD R0,R0,#1<<(bits-p6bits-1):MOV R0,R0,LSR #(bits-p6bits)
20910LDR R2,[R7,R0,LSL #2]:SUB R4,R4,R2
20920CMP R5,#F:MOVCS R5,#0:MOVGE R5,#F
20930SUB R3,R5,R5,LSR #p6bits:ADD R3,R3,#1<<(bits-p6bits-1):MOV R3,R3,LSR #(bits-p6bits):ORR R0,R0,R3,LSL #8
20940LDR R2,[R7,R3,LSL #2]:SUB R5,R5,R2
20950CMP R6,#F:MOVCS R6,#0:MOVGE R6,#F
20960SUB R3,R6,R6,LSR #p6bits:ADD R3,R3,#1<<(bits-p6bits-1):MOV R3,R3,LSR #(bits-p6bits):ORR R0,R0,R3,LSL #16
20970LDR R2,[R7,R3,LSL #2]:SUB R6,R6,R2
20980STRB R0,[R12]:MOV R0,R0,LSR #8:STRB R0,[R12,#1]:MOV R0,R0,LSR #8
20990STRB R0,[R12,#2]
21000]
21010IFm=-8 THEN
21020[OPT Z
21030ADD R12,R12,R1,LSL #2
21040]
21050ELSE
21060[OPT Z
21070ADD R12,R12,R1,LSL #1:ADD R12,R12,R1
21080]
21090ENDIF
21100IFdither% THEN
21110[OPT Z
21120ADD R0,R11,#4
21130ADD R2,R4,R4,LSL #1
21140LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
21150STR R3,[R11,-R8]
21160ADD R2,R4,R4,LSL #2
21170LDR R3,[R11]:ADD R3,R3,R2,ASR #4
21180STR R3,[R11]
21190MOV R3,R4,ASR #4
21200STR R3,[R11,R8]!
21210RSB R2,R4,R4,LSL #3
21220LDR R4,[R10]
21230ADD R4,R4,R2,ASR #4
21240ADD R2,R5,R5,LSL #1
21250LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4
21260STR R3,[R0,-R8]
21270MOV R3,R5,ASR #4
21280STR R3,[R0,R8]
21290ADD R2,R5,R5,LSL #2
21300LDR R3,[R0]:ADD R3,R3,R2,ASR #4
21310STR R3,[R0],#4
21320RSB R2,R5,R5,LSL #3
21330LDR R5,[R10,#4]
21340ADD R5,R5,R2,ASR #4
21350ADD R2,R6,R6,LSL #1
21360LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4
21370STR R3,[R0,-R8]
21380ADD R2,R6,R6,LSL #2
21390LDR R3,[R0]:ADD R3,R3,R2,ASR #4
21400STR R3,[R0]
21410MOV R3,R6,ASR #4
21420STR R3,[R0,R8]
21430RSB R2,R6,R6,LSL #3
21440LDR R6,[R10,#8]
21450ADD R6,R6,R2,ASR #4
21460]
21470ELSE
21480[OPT Z
21490LDMIA R10,{R4,R5,R6}
21500]
21510ENDIF
21520[OPT Z
21530SUBS R9,R9,#1:BNE fsloop
21540LDMFD SP !,{PC}^
21550]
21560WHEN 2^15-1
21570[OPT Z
21580.div31
21590]
21600FORI%=0TO31
21610[OPT Z
21620EQUD I%/31*F
21630]
21640NEXT
21650[OPT Z
21660.fs%
21670STMFD SP !,{R14}
21680LDR R1,[R9,#5*8]:LDR R1,[R1]
21690LDR R10,[R9,#4*8]
21700LDR R11,[R9,#3*8]
21710LDR R12,[R9,#2*8]:LDR R12,[R12]
21720LDR R8,[R9,#8]:LDR R8,[R8]
21730LDR R9,[R9]:LDR R9,[R9]
21740LDR R4,[R10]
21750LDR R5,[R10,#4]
21760LDR R6,[R10,#8]
21770ADR R7,div31
21780.fsloop
21790ADD R10,R10,R8
21800CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
21810SUB R0,R4,R4,LSR #5:ADD R0,R0,#1<<(bits-6):MOV R0,R0,LSR #(bits-5)
21820LDR R2,[R7,R0,LSL #2]:SUB R4,R4,R2
21830CMP R5,#F:MOVCS R5,#0:MOVGE R5,#F
21840SUB R3,R5,R5,LSR #5:ADD R3,R3,#1<<(bits-6):MOV R3,R3,LSR #(bits-5):ORR R0,R0,R3,LSL #5
21850LDR R2,[R7,R3,LSL #2]:SUB R5,R5,R2
21860CMP R6,#F:MOVCS R6,#0:MOVGE R6,#F
21870SUB R3,R6,R6,LSR #5:ADD R3,R3,#1<<(bits-6):MOV R3,R3,LSR #(bits-5):ORR R0,R0,R3,LSL #10
21880LDR R2,[R7,R3,LSL #2]:SUB R6,R6,R2
21890STRB R0,[R12]:MOV R0,R0,LSR #8:STRB R0,[R12,#1]:ADD R12,R12,R1,LSL #1
21900]
21910IFdither% THEN
21920[OPT Z
21930ADD R0,R11,#4
21940ADD R2,R4,R4,LSL #1
21950LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
21960STR R3,[R11,-R8]
21970ADD R2,R4,R4,LSL #2
21980LDR R3,[R11]:ADD R3,R3,R2,ASR #4
21990STR R3,[R11]
22000MOV R3,R4,ASR #4
22010STR R3,[R11,R8]!
22020RSB R2,R4,R4,LSL #3
22030LDR R4,[R10]
22040ADD R4,R4,R2,ASR #4
22050ADD R2,R5,R5,LSL #1
22060LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4
22070STR R3,[R0,-R8]
22080MOV R3,R5,ASR #4
22090STR R3,[R0,R8]
22100ADD R2,R5,R5,LSL #2
22110LDR R3,[R0]:ADD R3,R3,R2,ASR #4
22120STR R3,[R0],#4
22130RSB R2,R5,R5,LSL #3
22140LDR R5,[R10,#4]
22150ADD R5,R5,R2,ASR #4
22160ADD R2,R6,R6,LSL #1
22170LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4
22180STR R3,[R0,-R8]
22190ADD R2,R6,R6,LSL #2
22200LDR R3,[R0]:ADD R3,R3,R2,ASR #4
22210STR R3,[R0]
22220MOV R3,R6,ASR #4
22230STR R3,[R0,R8]
22240RSB R2,R6,R6,LSL #3
22250LDR R6,[R10,#8]
22260ADD R6,R6,R2,ASR #4
22270]
22280ELSE
22290[OPT Z
22300LDMIA R10,{R4,R5,R6}
22310]
22320ENDIF
22330[OPT Z
22340SUBS R9,R9,#1:BNE fsloop
22350LDMFD SP !,{PC}^
22360]
22370WHEN 256
22380[OPT Z
22390.div255
22400]
22410FORI%=0TO255
22420[OPT Z
22430EQUD I%/255*F
22440]
22450NEXT
22460[OPT Z
22480.fs%
22490STMFD SP !,{R14}
22500LDR R10,[R9,#4*8]
22510ADR R7,div255
22520LDR R1,[R9,#5*8]:LDR R1,[R1]
22530LDR R11,[R9,#3*8]
22540LDR R12,[R9,#2*8]:LDR R12,[R12]
22550LDR R8,[R9,#8]:LDR R8,[R8]
22560LDR R9,[R9]:LDR R9,[R9]
22570LDR R4,[R10],R8
22580.fsloop
22590CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
22600SUB R0,R4,R4,LSR #8:ADD R0,R0,#1<<(bits-9):MOV R0,R0,LSR #(bits-8):STRB R0,[R12],R1
22610LDR R2,[R7,R0,LSL #2]
22620]
22630IFdither% THEN
22640[OPT Z
22650SUB R4,R4,R2
22660MOVCS R4,#0
22670ADD R2,R4,R4,LSL #1
22680LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
22690STR R3,[R11,-R8]
22700ADD R2,R4,R4,LSL #2
22710LDR R3,[R11]:ADD R3,R3,R2,ASR #4
22720STR R3,[R11]
22730MOV R3,R4,ASR #4
22740STR R3,[R11,R8]!
22750RSB R2,R4,R4,LSL #3
22760LDR R4,[R10],R8
22770ADD R4,R4,R2,ASR #4
22780]
22790ELSE
22800[OPT Z
22810LDR R4,[R10],R8
22820]
22830ENDIF
22840[OPT Z
22850SUBS R9,R9,#1:BNE fsloop
22860LDMFD SP !,{PC}^
22870]
22880WHEN 63,255
22890div15=P%:FORI%=0TO255*4STEP4
22900[OPT Z
22910EQUD (palette%!I%AND&FF)/255*F
22920EQUD (palette%!I%>>8AND&FF)/255*F
22930EQUD (palette%!I%>>16AND&FF)/255*F
22940]
22950NEXT
22960IFm$="R" THEN
22970[OPT Z
22980.ictloc EQUD ict%
22990]
23000ENDIF
23010[OPT Z
23020EQUD div15
23030.fs%
23040STMFD SP !,{R14}
23050LDR R1,[R9,#5*8]:LDR R1,[R1]
23060LDR R10,[R9,#4*8]
23070LDR R11,[R9,#3*8]
23080LDR R12,[R9,#2*8]:LDR R12,[R12]
23090LDR R8,[R9,#8]:LDR R8,[R8]
23100LDR R9,[R9]:LDR R9,[R9]
23110LDR R4,[R10]
23120LDR R5,[R10,#4]
23130LDR R6,[R10,#8]
23140LDR R7,fs%-4
23150.fsloop
23160ADD R10,R10,R8
23170]
23180CASE m$ OF
23190WHEN"T"
23200[OPT Z
23210CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
23220MOV R0,R4,LSR #(bits-4):CMP R0,#15:MOVCS R0,#15
23230CMP R5,#F:MOVCS R5,#0:MOVGE R5,#F
23240MOV R3,R5,LSR #(bits-4):CMP R3,#15:MOVCS R3,#15:ORR R0,R0,R3,LSL #4
23250CMP R6,#F:MOVCS R6,#0:MOVGE R6,#F
23260MOV R3,R6,LSR #(bits-4):CMP R3,#15:MOVCS R3,#15:ORR R0,R0,R3,LSL #8
23270LDR R3,colmatchloc
23280LDRB R0,[R3,R0]
23290ADD R3,R0,R0,LSL #1:ADD R3,R7,R3,LSL #2
23300LDR R2,[R3],#4:SUB R4,R4,R2
23310LDMIA R3,{R2,R3}:SUB R5,R5,R2:SUB R6,R6,R3
23320]
23330WHEN"R"
23340PROCsrchdevlist
23350OTHERWISE
23360[OPT Z
23370CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
23380CMP R5,#F:MOVCS R5,#0:MOVGE R5,#F
23390CMP R6,#F:MOVCS R6,#0:MOVGE R6,#F
23400STMFD SP !,{R7,R8,R9}
23410MVN R2,#0
23420MOV R3,#&30<<23
23430.srch RSB R7,R3,#&20<<23
23440MOV R8,R6,LSR #bits-8
23450SUB R8,R8,R8,LSR #4
23460ADDS R7,R7,R8,LSL #23
23470MOVVSS R7,#&7F000000
23480MOVMI R7,#0
23490AND R7,R7,#&60000000
23500ADD R7,R7,R3
23510ADD R14,R7,R7,LSR #4
23520ADD R7,R14,R14,LSR #8
23530ADD R7,R7,R7,LSR #16
23540SUBS R8,R6,R14,LSR #31-bits
23550RSBLT R8,R8,#0
23560MOV R8,R8,LSR #bits/2
23570MUL R9,R8,R8
23580RSB R7,R3,#&20<<23
23590MOV R8,R5,LSR #bits-8
23600SUB R8,R8,R8,LSR #4
23610ADDS R7,R7,R8,LSL #23
23620MOVVSS R7,#&7F000000
23630MOVMI R7,#0
23640AND R7,R7,#&60000000
23650ADD R7,R3,R7
23660ADD R7,R7,R7,LSR #4
23670ORR R14,R14,R7,LSR #8
23680ADD R7,R7,R7,LSR #8
23690ADD R7,R7,R7,LSR #16
23700SUBS R8,R5,R7,LSR #31-bits
23710RSBLT R8,R8,#0
23720MOV R8,R8,LSR #bits/2
23730MUL R7,R8,R8
23740ADD R7,R7,R7,LSL #2
23750ADD R9,R9,R7,LSL #1
23760RSB R7,R3,#&20<<23
23770MOV R8,R4,LSR #bits-8
23780SUB R8,R8,R8,LSR #4
23790ADDS R7,R7,R8,LSL #23
23800MOVVSS R7,#&7F000000
23810MOVMI R7,#0
23820AND R7,R7,#&60000000
23830ADD R7,R3,R7
23840ADD R7,R7,R7,LSR #4
23850ORR R14,R14,R7,LSR #16
23860ADD R7,R7,R7,LSR #8
23870ADD R7,R7,R7,LSR #16
23880SUBS R8,R4,R7,LSR #31-bits
23890RSBLT R8,R8,#0
23900MOV R8,R8,LSR #bits/2
23910MUL R7,R8,R8
23920ADD R7,R7,R7,LSL #1
23930ADD R9,R9,R7
23940CMP R9,R2
23950MOVLS R2,R9
23960MOVLS R0,R14
23970SUBS R3,R3,#&10<<23
23980BGE srch
23990AND R7,R0,#&40000000
24000MOV R8,R7,LSR #23
24010AND R7,R0,#&600000
24020ORR R8,R8,R7,LSR #16
24030AND R7,R0,#&4000
24040ORR R8,R8,R7,LSR #10
24050AND R7,R0,#&20000000
24060ORR R8,R8,R7,LSR #26
24070AND R7,R0,#&3800
24080ORR R0,R8,R7,LSR #11
24090LDMFD SP !,{R7,R8,R9}
24100ADD R3,R0,R0,LSL #1:ADD R3,R7,R3,LSL #2
24110LDR R2,[R3],#4:SUB R4,R4,R2
24120LDMIA R3,{R2,R3}:SUB R5,R5,R2:SUB R6,R6,R3
24130]
24140ENDCASE
24150[OPT Z
24160STRB R0,[R12],R1
24170]
24180IFdither% THEN
24190[OPT Z
24200ADD R0,R11,#4
24210ADD R2,R4,R4,LSL #1
24220LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
24230STR R3,[R11,-R8]
24240ADD R2,R4,R4,LSL #2
24250LDR R3,[R11]:ADD R3,R3,R2,ASR #4
24260STR R3,[R11]
24270MOV R3,R4,ASR #4
24280STR R3,[R11,R8]!
24290RSB R2,R4,R4,LSL #3
24300LDR R4,[R10]
24310ADD R4,R4,R2,ASR #4
24320ADD R2,R5,R5,LSL #1
24330LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4
24340STR R3,[R0,-R8]
24350MOV R3,R5,ASR #4
24360STR R3,[R0,R8]
24370ADD R2,R5,R5,LSL #2
24380LDR R3,[R0]:ADD R3,R3,R2,ASR #4
24390STR R3,[R0],#4
24400RSB R2,R5,R5,LSL #3
24410LDR R5,[R10,#4]
24420ADD R5,R5,R2,ASR #4
24430ADD R2,R6,R6,LSL #1
24440LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4
24450STR R3,[R0,-R8]
24460ADD R2,R6,R6,LSL #2
24470LDR R3,[R0]:ADD R3,R3,R2,ASR #4
24480STR R3,[R0]
24490MOV R3,R6,ASR #4
24500STR R3,[R0,R8]
24510RSB R2,R6,R6,LSL #3
24520LDR R6,[R10,#8]
24530ADD R6,R6,R2,ASR #4
24540]
24550ELSE
24560[OPT Z
24570LDMIA R10,{R4,R5,R6}
24580]
24590ENDIF
24600[OPT Z
24610SUBS R9,R9,#1:BNE fsloop
24620LDMFD SP !,{PC}^
24630]
24640WHEN 15
24650divtable=P%:CASE m$ OF
24660WHEN "D"
24670WHEN "R"
24680FORI%=0TO15*4STEP4
24690[OPT Z
24700EQUD (palette%!I%>>4AND&F)/bright%*F
24710EQUD (palette%!I%>>12AND&F)/bright%*F
24720EQUD (palette%!I%>>20AND&F)/bright%*F
24730]
24740NEXT
24750[OPT Z
24760.ictloc EQUD ict%
24770]
24780WHEN "T"
24790FORI%=0TO15
24800[OPT Z
24810EQUD I%/bright%*F
24820]
24830NEXT
24840OTHERWISE
24850FORI%=0TO7
24860[OPT Z
24870EQUD I%/(bright%DIV2)*F
24880]
24890NEXT
24900ENDCASE
24910[OPT Z
24920.fs%
24930STMFD SP !,{R14}
24940LDR R1,[R9,#5*8]:LDR R1,[R1]
24950LDR R10,[R9,#4*8]
24960LDR R11,[R9,#3*8]
24970LDR R12,[R9,#2*8]:LDR R12,[R12]
24980LDR R8,[R9,#8]:LDR R8,[R8]
24990LDR R9,[R9]:LDR R9,[R9]
25000]
25010IFm$="D" ORm$="R" THEN
25020[OPT Z
25030LDR R4,[R10]
25040LDR R5,[R10,#4]
25050LDR R6,[R10,#8]
25060]
25070ELSE
25080[OPT Z
25090LDR R4,[R10],R8
25100]
25110ENDIF
25120IFm$<>"D" THEN
25130[OPT Z
25140ADR R7,divtable
25150]
25160ENDIF
25170[OPT Z
25180.fsloop
25190]
25200CASE m$ OF
25210WHEN"R"
25220[OPT Z
25230ADD R10,R10,R8
25240]
25250PROCsrchdevlist
25260[OPT Z
25270MOV r3,r0
25280]
25290WHEN "D"
25300[OPT Z
25310ADD R10,R10,R8
25320MOV R3,#0
25330CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
25340CMP R4,#F>>1
25350SUBCS R4,R4,#F:ORRCS R3,R3,#1
25360CMP R5,#F:MOVCS R5,#0:MOVGE R5,#F
25370CMP R5,#F>>1
25380SUBCS R5,R5,#F:ORRCS R3,R3,#2
25390CMP R6,#F:MOVCS R6,#0:MOVGE R6,#F
25400CMP R6,#F>>1
25410SUBCS R6,R6,#F:ORRCS R3,R3,#4
25420]
25430WHEN "T"
25440[OPT Z
25450CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
25460RSB R3,R4,R4,LSL #4:ADD R3,R3,#F>>1:MOV R3,R3,LSR #bits
25470LDR R2,[R7,R3,LSL #2]
25480SUB R4,R4,R2
25490]
25500OTHERWISE
25510[OPT Z
25520CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
25530RSB R3,R4,R4,LSL #3:ADD R3,R3,#F>>1:MOV R3,R3,LSR #bits
25540LDR R2,[R7,R3,LSL #2]
25550SUB R4,R4,R2
25560]
25570ENDCASE
25580[OPT Z
25590MOV R2,R12,LSR #1
25600TST R12,#1
25610LDRB R0,[R2]
25620ANDEQ R0,R0,#&F0:ORREQ R0,R0,R3
25630ANDNE R0,R0,#&0F:ORRNE R0,R0,R3,LSL #4
25640STRB R0,[R2]
25650ADD R12,R12,R1
25660]
25670IFm$="D" ORm$="R" THEN
25680IFdither% THEN
25690[OPT Z
25700ADD R0,R11,#4
25710ADD R2,R4,R4,LSL #1
25720LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
25730STR R3,[R11,-R8]
25740ADD R2,R4,R4,LSL #2
25750LDR R3,[R11]:ADD R3,R3,R2,ASR #4
25760STR R3,[R11]
25770MOV R3,R4,ASR #4
25780STR R3,[R11,R8]!
25790RSB R2,R4,R4,LSL #3
25800LDR R4,[R10]
25810ADD R4,R4,R2,ASR #4
25820ADD R2,R5,R5,LSL #1
25830LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4
25840STR R3,[R0,-R8]
25850MOV R3,R5,ASR #4
25860STR R3,[R0,R8]
25870ADD R2,R5,R5,LSL #2
25880LDR R3,[R0]:ADD R3,R3,R2,ASR #4
25890STR R3,[R0],#4
25900RSB R2,R5,R5,LSL #3
25910LDR R5,[R10,#4]
25920ADD R5,R5,R2,ASR #4
25930ADD R2,R6,R6,LSL #1
25940LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4
25950STR R3,[R0,-R8]
25960ADD R2,R6,R6,LSL #2
25970LDR R3,[R0]:ADD R3,R3,R2,ASR #4
25980STR R3,[R0]
25990MOV R3,R6,ASR #4
26000STR R3,[R0,R8]
26010RSB R2,R6,R6,LSL #3
26020LDR R6,[R10,#8]
26030ADD R6,R6,R2,ASR #4
26040]
26050ELSE
26060[OPT Z
26070LDMIA R10,{R4,R5,R6}
26080]
26090ENDIF
26100ELSE
26110IFdither% THEN
26120[OPT Z
26130ADD R2,R4,R4,LSL #1
26140LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
26150STR R3,[R11,-R8]
26160ADD R2,R4,R4,LSL #2
26170LDR R3,[R11]:ADD R3,R3,R2,ASR #4
26180STR R3,[R11]
26190MOV R3,R4,ASR #4
26200STR R3,[R11,R8]!
26210RSB R2,R4,R4,LSL #3
26220LDR R4,[R10],R8
26230ADD R4,R4,R2,ASR #4
26240]
26250ELSE
26260[OPT Z
26270LDR R4,[R10],R8
26280]
26290ENDIF
26300ENDIF
26310[OPT Z
26320SUBS R9,R9,#1:BNE fsloop
26330LDMFD SP !,{PC}^
26340]
26350WHEN 3
26360divtable=P%:CASE m$ OF
26370WHEN "C"
26380WHEN "R"
26390FORI%=0TO3*4STEP4
26400[OPT Z
26410EQUD (palette%!I%>>4AND&F)/bright%*F
26420EQUD (palette%!I%>>12AND&F)/bright%*F
26430EQUD (palette%!I%>>20AND&F)/bright%*F
26440]
26450NEXT
26460OTHERWISE
26470[OPT Z
26480EQUD 0
26490EQUD 1/(bright%DIV4)*F
26500EQUD 2/(bright%DIV4)*F
26510EQUD F
26520]
26530ENDCASE
26540[OPT Z
26550.fs%
26560STMFD SP !,{R14}
26570LDR R1,[R9,#5*8]:LDR R1,[R1]
26580LDR R10,[R9,#4*8]
26590LDR R11,[R9,#3*8]
26600LDR R12,[R9,#2*8]
26610LDR R12,[R12]
26620LDR R8,[R9,#8]
26630LDR R8,[R8]
26640LDR R9,[R9]
26650LDR R9,[R9]
26660]
26670IFm$="C" ORm$="R" THEN
26680[OPT Z
26690LDR R4,[R10]
26700LDR R5,[R10,#4]
26710LDR R6,[R10,#8]
26720]
26730ELSE
26740[OPT Z
26750LDR R4,[R10],R8
26760]
26770ENDIF
26780[OPT Z
26790.fsloop
26800]
26810IFm$<>"C"THEN
26820[OPT Z
26830ADR R7,divtable
26840]
26850ENDIF
26860CASE m$ OF
26870WHEN"C"
26880[OPT Z
26890ADD R10,R10,R8
26900CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
26910CMP R5,#F:MOVCS R5,#0:MOVGE R5,#F
26920CMP R6,#F:MOVCS R6,#0:MOVGE R6,#F
26930MOV R3,#0
26940CMP R4,#F>>1:ORRCS R3,R3,#1
26950CMP R5,#F>>1:ORRCS R3,R3,#2
26960CMP R6,#F>>1:ORRCS R3,R3,#4
26970CMP R3,#6:MOVEQ R3,#1:BEQ octcyan
26980BCS octwhite
26990CMP R3,#4:BEQ octblue
27000MOVCS R3,#2:BCS octmagenta
27010CMP R3,#2:BEQ octgreen
27020BCS octyellow
27030CMP R3,#0:BEQ octblack
27040.octred
27050RSB R0,R4,#F
27060CMP R5,R0
27070BLT octred1
27080CMP R5,R6
27090MOVGE R3,#3
27100MOVLT R3,#2
27110B octconvert
27120.octred1
27130CMP R0,R6
27140MOVGE R3,#0
27150MOVLT R3,#2
27160B octconvert
27170.octgreen
27180RSB R0,R5,#F
27190CMP R0,R4
27200BLT octgreen1
27210CMP R0,R6
27220MOVGE R3,#0
27230MOVLT R3,#1
27240B octconvert
27250.octgreen1
27260CMP R4,R6
27270MOVGE R3,#3
27280MOVLT R3,#1
27290B octconvert
27300.octblue
27310RSB R0,R6,#F
27320CMP R0,R4
27330BLT octblue1
27340CMP R0,R5
27350MOVGE R3,#0
27360MOVLT R3,#1
27370B octconvert
27380.octblue1
27390CMP R4,R5
27400MOVGE R3,#2
27410MOVLT R3,#1
27420B octconvert
27430.octwhite
27440CMP R4,R5
27450BLT octwhite1
27460CMP R5,R6
27470MOVGE R3,#3
27480MOVLT R3,#2
27490B octconvert
27500.octwhite1
27510CMP R4,R6
27520MOVGE R3,#3
27530MOVLT R3,#1
27540.octconvert
27550CMP R3,#1
27560.octcyan
27570SUBEQ R5,R5,#F
27580SUBEQ R6,R6,#F
27590.octmagenta
27600CMP R3,#2
27610SUBEQ R4,R4,#F
27620SUBEQ R6,R6,#F
27630.octyellow
27640CMP R3,#3
27650SUBEQ R4,R4,#F
27660SUBEQ R5,R5,#F
27670.octblack
27680MOV R2,R12,LSR #2
27690AND R7,R12,#3:MOV R7,R7,LSL #1
27700MOV R14,#3
27710LDRB R0,[R2]:BIC R0,R0,R14,LSL R7:ORR R0,R0,R3,LSL R7:STRB R0,[R2]
27720ADD R12,R12,R1
27730]
27740WHEN"R"
27750[OPT Z
27760ADD R10,R10,R8
27770CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
27780CMP R5,#F:MOVCS R5,#0:MOVGE R5,#F
27790CMP R6,#F:MOVCS R6,#0:MOVGE R6,#F
27800STMFD SP !,{R8,R9,R10}
27810MVN R2,#0
27820MOV R3,#3
27830.srch ADD R14,R3,R3,LSL #1
27840ADD R14,R7,R14,LSL #2
27850LDMIA R14,{R8,R9,R10}
27860SUBS R8,R4,R8
27870RSBMI R8,R8,#0
27880SUBS R9,R5,R9
27890RSBMI R9,R9,#0
27900SUBS R10,R6,R10
27910RSBMI R10,R10,#0
27920MOV R14,R8,LSR #bits/2
27930MUL R8,R14,R14
27940MOV R14,R9,LSR #bits/2
27950MUL R9,R14,R14
27960MOV R14,R10,LSR #bits/2
27970MUL R10,R14,R14
27980ADD R9,R9,R9,LSL #2
27990ADD R8,R8,R8,LSL #1
28000ADD R14,R8,R9,LSL #1
28010ADD R14,R14,R10
28020CMP R14,R2
28030MOVCC R2,R14
28040MOVCC R0,R3
28050SUBS R3,R3,#1
28060BPL srch
28070LDMFD SP !,{R8,R9,R10}
28080ADD R3,R0,R0,LSL #1:ADD R3,R7,R3,LSL #2
28090LDR R2,[R3],#4:SUB R4,R4,R2
28100LDMIA R3,{R2,R3}:SUB R5,R5,R2:SUB R6,R6,R3
28110MOV R3,R0
28120MOV R2,R12,LSR #2
28130AND R7,R12,#3:MOV R7,R7,LSL #1
28140MOV R14,#3
28150LDRB R0,[R2]:BIC R0,R0,R14,LSL R7:ORR R0,R0,R3,LSL R7:STRB R0,[R2]
28160ADD R12,R12,R1
28170]
28180OTHERWISE
28190[OPT Z
28200CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
28210RSB R3,R4,R4,LSL #2:ADD R3,R3,#F>>1:MOV R3,R3,LSR#bits
28220LDR R2,[R7,R3,LSL #2]
28230SUB R4,R4,R2
28240MOV R2,R12,LSR #2
28250AND R5,R12,#3:MOV R5,R5,LSL #1
28260MOV R6,#3
28270LDRB R0,[R2]:BIC R0,R0,R6,LSL R5:ORR R0,R0,R3,LSL R5:STRB R0,[R2]
28280ADD R12,R12,R1
28290]
28300ENDCASE
28310IFm$="C" ORm$="R" THEN
28320IFdither% THEN
28330[OPT Z
28340ADD R0,R11,#4
28350ADD R2,R4,R4,LSL #1
28360LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
28370STR R3,[R11,-R8]
28380ADD R2,R4,R4,LSL #2
28390LDR R3,[R11]:ADD R3,R3,R2,ASR #4
28400STR R3,[R11]
28410MOV R3,R4,ASR #4
28420STR R3,[R11,R8]!
28430RSB R2,R4,R4,LSL #3
28440LDR R4,[R10]
28450ADD R4,R4,R2,ASR #4
28460ADD R2,R5,R5,LSL #1
28470LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4
28480STR R3,[R0,-R8]
28490MOV R3,R5,ASR #4
28500STR R3,[R0,R8]
28510ADD R2,R5,R5,LSL #2
28520LDR R3,[R0]:ADD R3,R3,R2,ASR #4
28530STR R3,[R0],#4
28540RSB R2,R5,R5,LSL #3
28550LDR R5,[R10,#4]
28560ADD R5,R5,R2,ASR #4
28570ADD R2,R6,R6,LSL #1
28580LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4
28590STR R3,[R0,-R8]
28600ADD R2,R6,R6,LSL #2
28610LDR R3,[R0]:ADD R3,R3,R2,ASR #4
28620STR R3,[R0]
28630MOV R3,R6,ASR #4
28640STR R3,[R0,R8]
28650RSB R2,R6,R6,LSL #3
28660LDR R6,[R10,#8]
28670ADD R6,R6,R2,ASR #4
28680]
28690ELSE
28700[OPT Z
28710LDMIA R10,{R4,R5,R6}
28720]
28730ENDIF
28740ELSE
28750IFdither% THEN
28760[OPT Z
28770ADD R2,R4,R4,LSL #1
28780LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
28790STR R3,[R11,-R8]
28800ADD R2,R4,R4,LSL #2
28810LDR R3,[R11]:ADD R3,R3,R2,ASR #4
28820STR R3,[R11]
28830MOV R3,R4,ASR #4
28840STR R3,[R11,R8]!
28850RSB R2,R4,R4,LSL #3
28860LDR R4,[R10],R8
28870ADD R4,R4,R2,ASR #4
28880]
28890ELSE
28900[OPT Z
28910LDR R4,[R10],R8
28920]
28930ENDIF
28940ENDIF
28950[OPT Z
28960SUBS R9,R9,#1:BNE fsloop
28970LDMFD SP !,{PC}^
28980]
28990WHEN 1
29000CASE m$ OF
29010WHEN"C"
29020[OPT Z
29030.divtable EQUD 0
29040EQUD (1-black%/256*2)/16*F
29050EQUD (2-black%/256*4)/16*F
29060EQUD (3-black%/256*5)/16*F
29070EQUD (4-black%/256*6)/16*F
29080EQUD (5-black%/256*7)/16*F
29090EQUD (6-black%/256*8)/16*F
29100EQUD (7-black%/256*8)/16*F
29110EQUD (8-black%/256*8)/16*F
29120EQUD (9-black%/256*8)/16*F
29130EQUD (10-black%/256*8)/16*F
29140EQUD (11-black%/256*7)/16*F
29150EQUD (12-black%/256*6)/16*F
29160EQUD (13-black%/256*5)/16*F
29170EQUD (14-black%/256*4)/16*F
29180EQUD (15-black%/256*2)/16*F
29190EQUD F
29200.evenrow_gard DCD even_gard
29210.oddrow_gard DCD odd_gard
29220.rowinc DCD 0
29230.fs%
29240STMFD SP !,{R14}
29250LDR R1,[R9,#5*8]:LDR R1,[R1]
29260LDR R10,[R9,#4*8]
29270LDR R11,[R9,#3*8]
29280LDR R12,[R9,#2*8]
29290LDR R12,[R12]
29300LDR R8,[R9,#8]
29310LDR R8,[R8]
29320LDR R9,[R9]
29330LDR R9,[R9]
29340LDR R4,[R10],R8
29350TEQ R8,#0
29360LDRPL R6,evenrow_gard
29370LDRMI R6,oddrow_gard
29380MOV R1,R1,LSL #1
29390LDR R7,rowinc
29400ADR R14,divtable
29410.fsloop
29420CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
29430ADD R5,R4,#F>>5
29440MOVS R5,R5,LSR #bits-4
29450LDRNE R0,[R14,R5,LSL #2]
29460SUBNE R4,R4,R0
29470]
29480IFdither% THEN
29490[OPT Z
29500ADD R2,R4,R4,LSL #1
29510LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
29520STR R3,[R11,-R8]
29530ADD R2,R4,R4,LSL #2
29540LDR R3,[R11]:ADD R3,R3,R2,ASR #4
29550STR R3,[R11]
29560MOV R3,R4,ASR #4
29570STR R3,[R11,R8]!
29580RSB R2,R4,R4,LSL #3
29590LDR R4,[R10],R8
29600ADDS R4,R4,R2,ASR #4
29610]
29620ELSE
29630[OPT Z
29640LDR R4,[R10],R8
29650]
29660ENDIF
29670[OPT Z
29680CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
29690ADD R3,R4,#F>>5
29700MOVS R3,R3,LSR #bits-4
29710LDRNE R0,[R14,R3,LSL #2]
29720SUBNE R4,R4,R0
29730ORR R5,R5,R3,LSL #5:LDR R3,[R6,R5,LSL #2]
29740MOV R2,R12,LSR #1:STRB R3,[R2],R7:MOV R3,R3,LSR #8:STRB R3,[R2],R7
29750MOV R3,R3,LSR #8:STRB R3,[R2],R7:MOV R3,R3,LSR #8:STRB R3,[R2]
29760ADD R12,R12,R1
29770]
29780IFdither% THEN
29790[OPT Z
29800ADD R2,R4,R4,LSL #1
29810LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
29820STR R3,[R11,-R8]
29830ADD R2,R4,R4,LSL #2
29840LDR R3,[R11]:ADD R3,R3,R2,ASR #4
29850STR R3,[R11]
29860MOV R3,R4,ASR #4
29870STR R3,[R11,R8]!
29880RSB R2,R4,R4,LSL #3
29890LDR R4,[R10],R8
29900ADD R4,R4,R2,ASR #4
29910]
29920ELSE
29930[OPT Z
29940LDR R4,[R10],R8
29950]
29960ENDIF
29970[OPT Z
29980SUBS R9,R9,#2:BNE fsloop
29990LDMFD SP !,{PC}^
30000]
30010WHEN"T"
30020[OPT Z
30030.divtable EQUD 0
30040EQUD (1-black%/256*2)/9*F
30050EQUD (2-black%/256*4)/9*F
30060EQUD (3-black%/256*5)/9*F
30070EQUD (4-black%/256*6)/9*F
30080EQUD (5-black%/256*6)/9*F
30090EQUD (6-black%/256*5)/9*F
30100EQUD (7-black%/256*4)/9*F
30110EQUD (8-black%/256*2)/9*F
30120EQUD F
30130.evenrow_gard DCD even_gard
30140.oddrow_gard DCD odd_gard
30150.rowinc DCD 0
30160.fs%
30170STMFD SP !,{R14}
30180LDR R1,[R9,#5*8]:LDR R1,[R1]
30190LDR R10,[R9,#4*8]
30200LDR R11,[R9,#3*8]
30210LDR R12,[R9,#2*8]
30220LDR R12,[R12]
30230LDR R8,[R9,#8]
30240LDR R8,[R8]
30250LDR R9,[R9]
30260LDR R9,[R9]
30270LDR R4,[R10],R8
30280TEQ R8,#0
30290LDRPL R6,evenrow_gard
30300LDRMI R6,oddrow_gard
30310MOV R1,R1,LSL #1
30320LDR R7,rowinc
30330ADR R14,divtable
30340.fsloop
30350CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
30360ADD R5,R4,#F>>4
30370ADD R5,R5,R5,LSL #3
30380MOVS R5,R5,LSR #bits
30390LDRNE R0,[R14,R5,LSL #2]
30400SUBNE R4,R4,R0
30410]
30420IFdither% THEN
30430[OPT Z
30440ADD R2,R4,R4,LSL #1
30450LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
30460STR R3,[R11,-R8]
30470ADD R2,R4,R4,LSL #2
30480LDR R3,[R11]:ADD R3,R3,R2,ASR #4
30490STR R3,[R11]
30500MOV R3,R4,ASR #4
30510STR R3,[R11,R8]!
30520RSB R2,R4,R4,LSL #3
30530LDR R4,[R10],R8
30540ADDS R4,R4,R2,ASR #4
30550]
30560ELSE
30570[OPT Z
30580LDR R4,[R10],R8
30590]
30600ENDIF
30610[OPT Z
30620CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
30630ADD R3,R4,#F>>4
30640ADD R3,R3,R3,LSL #3
30650MOVS R3,R3,LSR #bits
30660LDRNE R0,[R14,R3,LSL #2]
30670SUBNE R4,R4,R0
30680ORR R5,R5,R3,LSL #4:LDR R5,[R6,R5,LSL #2]
30690MOV R2,R12,LSR #1
30700AND R3,R5,#&3F
30710STRB R3,[R2],R7
30720MOV R3,R5,LSR #6:AND R3,R3,#&3F
30730STRB R3,[R2],R7
30740MOV R3,R5,LSR #12:STRB R3,[R2]
30750ADD R12,R12,R1
30760]
30770IFdither% THEN
30780[OPT Z
30790ADD R2,R4,R4,LSL #1
30800LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
30810STR R3,[R11,-R8]
30820ADD R2,R4,R4,LSL #2
30830LDR R3,[R11]:ADD R3,R3,R2,ASR #4
30840STR R3,[R11]
30850MOV R3,R4,ASR #4
30860STR R3,[R11,R8]!
30870RSB R2,R4,R4,LSL #3
30880LDR R4,[R10],R8
30890ADD R4,R4,R2,ASR #4
30900]
30910ELSE
30920[OPT Z
30930LDR R4,[R10],R8
30940]
30950ENDIF
30960[OPT Z
30970SUBS R9,R9,#2:BNE fsloop
30980LDMFD SP !,{PC}^
30990]
31000WHEN"D"
31010[OPT Z
31020.divtable EQUD 0
31030EQUD (1-black%/256*2)/4*F
31040EQUD (2-black%/256*4)/4*F
31050EQUD (3-black%/256*2)/4*F
31060EQUD F
31070.evenrow_gard DCD even_gard
31080.oddrow_gard DCD odd_gard
31090.rowinc DCD 0
31100.fs%
31110STMFD SP !,{R14}
31120LDR R1,[R9,#5*8]:LDR R1,[R1]
31130LDR R10,[R9,#4*8]
31140LDR R11,[R9,#3*8]
31150LDR R12,[R9,#2*8]
31160LDR R12,[R12]
31170LDR R8,[R9,#8]
31180LDR R8,[R8]
31190LDR R9,[R9]
31200LDR R9,[R9]
31210LDR R4,[R10],R8
31220TEQ R8,#0
31230LDRPL R6,evenrow_gard
31240LDRMI R6,oddrow_gard
31250MOV R1,R1,LSL #1
31260LDR R7,rowinc
31270ADR R14,divtable
31280.fsloop
31290CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
31300ADD R5,R4,#F>>3
31310MOVS R5,R5,LSR #bits-2
31320LDRNE R0,[R14,R5,LSL #2]
31330SUBNE R4,R4,R0
31340]
31350IFdither% THEN
31360[OPT Z
31370ADD R2,R4,R4,LSL #1
31380LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
31390STR R3,[R11,-R8]
31400ADD R2,R4,R4,LSL #2
31410LDR R3,[R11]:ADD R3,R3,R2,ASR #4
31420STR R3,[R11]
31430MOV R3,R4,ASR #4
31440STR R3,[R11,R8]!
31450RSB R2,R4,R4,LSL #3
31460LDR R4,[R10],R8
31470ADDS R4,R4,R2,ASR #4
31480]
31490ELSE
31500[OPT Z
31510LDR R4,[R10],R8
31520]
31530ENDIF
31540[OPT Z
31550CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
31560ADD R3,R4,#F>>3
31570MOVS R3,R3,LSR #bits-2
31580LDRNE R0,[R14,R3,LSL #2]
31590SUBNE R4,R4,R0
31600ORR R5,R5,R3,LSL #3:LDRB R5,[R6,R5]
31610MOV R2,R12,LSR #2
31620TST R12,#2
31630AND R3,R5,#&F:LDRB R0,[R2]
31640ANDEQ R0,R0,#&F0:ORREQ R0,R0,R3
31650ANDNE R0,R0,#&0F:ORRNE R0,R0,R3,LSL #4
31660STRB R0,[R2],R7
31670MOV R3,R5,LSR #4:LDRB R0,[R2]
31680ANDEQ R0,R0,#&F0:ORREQ R0,R0,R3
31690ANDNE R0,R0,#&0F:ORRNE R0,R0,R3,LSL #4
31700STRB R0,[R2]
31710ADD R12,R12,R1
31720]
31730IFdither% THEN
31740[OPT Z
31750ADD R2,R4,R4,LSL #1
31760LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
31770STR R3,[R11,-R8]
31780ADD R2,R4,R4,LSL #2
31790LDR R3,[R11]:ADD R3,R3,R2,ASR #4
31800STR R3,[R11]
31810MOV R3,R4,ASR #4
31820STR R3,[R11,R8]!
31830RSB R2,R4,R4,LSL #3
31840LDR R4,[R10],R8
31850ADD R4,R4,R2,ASR #4
31860]
31870ELSE
31880[OPT Z
31890LDR R4,[R10],R8
31900]
31910ENDIF
31920[OPT Z
31930SUBS R9,R9,#2:BNE fsloop
31940LDMFD SP !,{PC}^
31950]
31960OTHERWISE
31970[OPT Z
31980.fs%
31990STMFD SP !,{R14}
32000LDR R1,[R9,#5*8]:LDR R1,[R1]
32010LDR R10,[R9,#4*8]
32020LDR R11,[R9,#3*8]
32030LDR R12,[R9,#2*8]
32040LDR R12,[R12]
32050LDR R8,[R9,#8]
32060LDR R8,[R8]
32070LDR R9,[R9]
32080LDR R9,[R9]
32090LDR R4,[R10],R8
32100MOV R7,#1
32110.fsloop
32120CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
32130]
32140IFblack% THEN
32150[OPT Z
32160MOV R2,R12,LSR #3
32170AND R5,R12,#7:MOV R6,#1
32180LDRB R0,[R2,#-(x%+7>>3)]
32190SUB R3,R4,#F
32200CMP R7,#0
32210ADDNE R4,R4,#black%<<(bits-8)
32220ADDEQ R3,R3,#black%<<(bits-8)
32230TST R0,R6,LSL R5
32240ADDNE R4,R4,#black%<<(bits-8)
32250ADDEQ R3,R3,#black%<<(bits-8)
32260MOVS R0,R3:RSBMI R0,R3,#0
32270CMP R4,R0
32280MOVCC R3,#0
32290MOVCS R4,R3:MOVCS R3,#1
32300MOV R7,R3
32310]
32320ELSE
32330[OPT Z
32340ADD R3,R4,#F>>1:MOV R3,R3,LSR #bits
32350SUB R4,R4,R3,LSL #bits
32360MOV R2,R12,LSR #3
32370AND R5,R12,#7:MOV R6,#1
32380]
32390ENDIF
32400[OPT Z
32410LDRB R0,[R2]:BIC R0,R0,R6,LSL R5:ORR R0,R0,R3,LSL R5
32420STRB R0,[R2]
32430ADD R12,R12,R1
32440]
32450IFdither% THEN
32460[OPT Z
32470ADD R2,R4,R4,LSL #1
32480LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4
32490STR R3,[R11,-R8]
32500ADD R2,R4,R4,LSL #2
32510LDR R3,[R11]:ADD R3,R3,R2,ASR #4
32520STR R3,[R11]
32530MOV R3,R4,ASR #4
32540STR R3,[R11,R8]!
32550RSB R2,R4,R4,LSL #3
32560LDR R4,[R10],R8
32570ADD R4,R4,R2,ASR #4
32580]
32590ELSE
32600[OPT Z
32610LDR R4,[R10],R8
32620]
32630ENDIF
32640[OPT Z
32650SUBS R9,R9,#1:BNE fsloop
32660LDMFD SP !,{PC}^
32670]
32680ENDCASE
32690ENDCASE
32700[OPT Z
32710.sxloc DCD sx%
32720]
32730CASE col OF
32740WHEN 0
32750IFinput<=8 THEN
32760[OPT Z
32770.mappix%
32780LDR R0,sxloc
32790LDR R1,[R9]:LDR R1,[R1]
32800LDR R2,[R9,#3*8]
32810LDR R5,[R9,#4*8]
32820MOV R8,#0
32830.mappixlp
32840LDRB R6,[R1],#step24
32850]
32860ENDIF
32870CASE input OF
32880WHEN 8
32890IFham THEN
32900[OPT Z
32910ADR R9,ltable
32920MOVS R7,R6,LSR #4:AND R6,R6,#15
32930LDREQ R10,[R2,R6,LSL #2]:MOVEQ R11,R10:MOVEQ R12,R10
32940CMP R7,#1:LDREQ R12,[R9,R6,LSL #2]
32950CMP R7,#2:LDREQ R10,[R9,R6,LSL #2]
32960CMP R7,#3:LDREQ R11,[R9,R6,LSL #2]
32970ADD R3,R10,R11
32980ADD R3,R3,R12
32990MOV R3,R3,LSR #2
33000STMIA R5!,{R3}
33010SUBS R0,R0,#1:BNE mappixlp
33020MOVS PC,R14
33030.ltable
33040]
33050FORI%=0TO15
33060[OPT Z
33070EQUD I%/15*F
33080]
33090NEXT
33100ELSE
33110IFhpredict%=2 THEN
33120[OPT Z
33130ADD R6,R6,R8
33140AND R6,R6,#255
33150MOV R8,R6
33160]
33170ENDIF
33180[OPT Z
33190LDR R7,[R2,R6,LSL #2]:STR R7,[R5],#4
33200SUBS R0,R0,#1:BNE mappixlp
33210MOVS PC,R14
33220]
33230ENDIF
33240WHEN 4
33250IFbigendianbits THEN
33260[OPT Z
33270MOV R10,R6,LSR #4
33280LDR R7,[R2,R10,LSL #2]
33290AND R10,R6,#&F
33300]
33310ELSE
33320[OPT Z
33330AND R10,R6,#&F
33340LDR R7,[R2,R10,LSL #2]
33350MOV R10,R6,LSR #4
33360]
33370ENDIF
33380[OPT Z
33390LDR R8,[R2,R10,LSL #2]:STMIA R5!,{R7,R8}
33400SUBS R0,R0,#2:BHI mappixlp
33410MOVS PC,R14
33420]
33430WHEN 2
33440IFbigendianbits THEN
33450[OPT Z
33460MOV R10,R6,LSR #6
33470LDR R7,[R2,R10,LSL #2]
33480AND R10,R6,#&30
33490LDR R8,[R2,R10,LSR #2]
33500AND R10,R6,#&C
33510LDR R9,[R2,R10]
33520AND R10,R6,#&3
33530]
33540ELSE
33550[OPT Z
33560AND R10,R6,#&3
33570LDR R7,[R2,R10,LSL #2]
33580AND R10,R6,#&C
33590LDR R8,[R2,R10]
33600AND R10,R6,#&30
33610LDR R9,[R2,R10,LSR #2]
33620MOV R10,R6,LSR #6
33630]
33640ENDIF
33650[OPT Z
33660LDR R10,[R2,R10,LSL #2]:STMIA R5!,{R7,R8,R9,R10}
33670SUBS R0,R0,#4:BHI mappixlp
33680MOVS PC,R14
33690]
33700WHEN 1
33710IFbigendianbits THEN
33720[OPT Z
33730AND R10,R6,#&80
33740LDR R7,[R2,R10,LSR #5]
33750AND R10,R6,#&40
33760LDR R8,[R2,R10,LSR #4]
33770AND R10,R6,#&20
33780LDR R9,[R2,R10,LSR #3]
33790AND R10,R6,#&10
33800LDR R10,[R2,R10,LSR #2]:STMIA R5!,{R7,R8,R9,R10}
33810AND R10,R6,#&8
33820LDR R7,[R2,R10,LSR #1]
33830AND R10,R6,#&4
33840LDR R8,[R2,R10]
33850AND R10,R6,#&2
33860LDR R9,[R2,R10,LSL #1]
33870AND R10,R6,#&1
33880]
33890ELSE
33900[OPT Z
33910AND R10,R6,#&1
33920LDR R7,[R2,R10,LSL #2]
33930AND R10,R6,#&2
33940LDR R8,[R2,R10,LSL #1]
33950AND R10,R6,#&4
33960LDR R9,[R2,R10]
33970AND R10,R6,#&8
33980LDR R10,[R2,R10,LSR #1]:STMIA R5!,{R7,R8,R9,R10}
33990AND R10,R6,#&10
34000LDR R7,[R2,R10,LSR #2]
34010AND R10,R6,#&20
34020LDR R8,[R2,R10,LSR #3]
34030AND R10,R6,#&40
34040LDR R9,[R2,R10,LSR #4]
34050MOV R10,R6,LSR #7
34060]
34070ENDIF
34080[OPT Z
34090LDR R10,[R2,R10,LSL #2]:STMIA R5!,{R7,R8,R9,R10}
34100SUBS R0,R0,#8:BHI mappixlp
34110MOVS PC,R14
34120]
34130WHEN 16
34140[OPT Z
34150.mappix%
34160LDR R0,sxloc
34170LDR R1,[R9]:LDR R1,[R1]
34180LDR R2,[R9,#8]:LDR R2,[R2]
34190LDR R3,[R9,#4*8]
34200LDR R4,[R9,#3*8]
34210LDR R5,[R9,#2*8]
34220LDR R6,[R9,#5*8]
34230LDR R7,[R9,#6*8]
34240LDR R8,[R9,#7*8]
34250CMP R1,R2
34260ADDEQ R2,R2,#1
34270.mappixlp
34280LDRB R9,[R1],#step24:LDRB R10,[R2],#step24
34290LDR R9,[R6,R9,LSL #2]:LDR R10,[R7,R10,LSL #2]:ORR R9,R9,R10
34300AND R10,R9,#255:LDR R10,[R3,R10,LSL #2]
34310MOV R11,R9,LSR #8:AND R11,R11,#255:LDR R11,[R4,R11,LSL #2]
34320MOV R12,R9,LSR #16:LDR R12,[R5,R12,LSL #2]
34330ADD R10,R10,R11:ADD R10,R10,R12:STMIA R8!,{R10}
34340SUBS R0,R0,#1:BNE mappixlp
34350MOVS PC,R14
34360]
34370WHEN 24
34380[OPT Z
34390.mappix%
34400LDR R0,sxloc
34410LDR R1,[R9,#2*8]:LDR R1,[R1]
34420LDR R2,[R9,#8]:LDR R2,[R2]
34430LDR R3,[R9]:LDR R3,[R3]
34440LDR R4,[R9,#5*8]
34450LDR R5,[R9,#4*8]
34460LDR R6,[R9,#3*8]
34470LDR R7,[R9,#6*8]
34480.mappixlp
34490LDRB R8,[R1],#step24:LDR R8,[R4,R8,LSL #2]
34500LDRB R9,[R2],#step24:LDR R9,[R5,R9,LSL #2]:ADD R8,R8,R9
34510LDRB R9,[R3],#step24:LDR R9,[R6,R9,LSL #2]:ADD R8,R8,R9:STR R8,[R7],#4
34520SUBS R0,R0,#1:BNE mappixlp
34530MOVS PC,R14
34540]
34550WHEN 411
34560[OPT Z
34570.mappix%
34580LDR R0,sxloc
34590LDR R1,[R9]:LDR R1,[R1]
34600LDR R4,[R9,#1*8]
34610LDR R7,[R9,#8*8]
34620.mappixlp
34630LDRB R8,[R1],#2
34640LDR R8,[R4,R8,LSL #2]:CMP R8,#F:MOVCS R8,#F:STR R8,[R7],#4
34650SUBS R0,R0,#1:BNE mappixlp
34660MOVS PC,R14
34670]
34680WHEN 422
34690[OPT Z
34700.mappix%
34710LDR R0,sxloc
34720LDR R1,[R9]:LDR R1,[R1]
34730ADD R1,R1,#1
34740LDR R4,[R9,#1*8]
34750LDR R7,[R9,#8*8]
34760.mappixlp
34770LDRB R8,[R1],#2
34780LDR R8,[R4,R8,LSL #2]:CMP R8,#F:MOVCS R8,#F:STR R8,[R7],#4
34790SUBS R0,R0,#1:BNE mappixlp
34800MOVS PC,R14
34810]
34820WHEN 555
34830[OPT Z
34840.mappix%
34850LDR R0,sxloc
34860LDR R1,[R9]:LDR R1,[R1]
34870ADD R1,R1,#1
34880LDR R4,[R9,#1*8]
34890LDR R7,[R9,#8*8]
34900.mappixlp
34910LDRB R8,[R1],#2
34920AND R8,R8,#ymax%
34930LDR R8,[R4,R8,LSL #2]:CMP R8,#F:MOVCS R8,#F:STR R8,[R7],#4
34940SUBS R0,R0,#1:BNE mappixlp
34950MOVS PC,R14
34960]
34970ENDCASE
34980IFxmul%=2 AND xdiv%=1 THEN
34990[OPT Z
35010.xsample%
35020LDR R0,[R9]:LDR R0,[R0]
35030LDR R1,[R9,#8]
35040LDR R2,[R9,#2*8]
35050.xsamplelp
35060LDMIA R1,{R5,R6}
35070ADD R6,R6,R5
35080MOV R6,R6,LSR #1
35090STMIA R2!,{R5,R6}
35100ADD R1,R1,#4
35110SUBS R0,R0,#2:BPL xsamplelp
35120MOVS PC,R14
35130]
35140ELSE
35150[OPT Z
35170.xsample%
35180LDR R0,[R9]:LDR R0,[R0]
35190LDR R1,[R9,#8]
35200LDR R2,[R9,#2*8]
35210LDR R3,[R9,#3*8]:LDR R3,[R3]
35220LDR R4,[R9,#4*8]:LDR R4,[R4]
35230MOV R11,R4
35240.xsamplelp
35250LDMIA R1,{R5}
35260SUBS R11,R11,#1:MOVEQ R11,R4:ADDEQ R1,R1,#4
35270SUBS R12,R3,#1
35280BEQ xdonediv
35290.xdivlp
35300CMP R12,R11
35310BCC xdivlp2
35320LDMIA R1!,{R8}:MLA R5,R8,R11,R5
35330SUBS R12,R12,R11:MOV R11,R4
35340BNE xdivlp
35350B xdonediv
35360.xdivlp2
35370LDMIA R1,{R8}
35380SUBS R11,R11,#1:MOVEQ R11,R4:ADDEQ R1,R1,#4
35390ADD R5,R5,R8
35400SUBS R12,R12,#1:BNE xdivlp
35410.xdonediv
35420STMIA R2!,{R5}
35430SUBS R0,R0,#1:BPL xsamplelp
35440MOVS PC,R14
35450]
35460ENDIF
35470WHEN 2
35480IFinput<=8 THEN
35490[OPT Z
35500.mappix%
35510LDR R0,sxloc
35520LDR R1,[R9]:LDR R1,[R1]
35530LDR R2,[R9,#3*8]
35540LDR R3,[R9,#2*8]
35550LDR R4,[R9,#8]
35560LDR R5,[R9,#4*8]
35570MOV R10,#0
35580.mappixlp
35590LDRB R6,[R1],#step24
35600]
35610ENDIF
35620CASE input OF
35630WHEN 8
35640IFham THEN
35650[OPT Z
35660ADR R9,ltable
35670MOVS R7,R6,LSR #4:AND R6,R6,#15
35680LDREQ R10,[R2,R6,LSL #2]:LDREQ R11,[R3,R6,LSL #2]:LDREQ R12,[R4,R6,LSL #2]
35690CMP R7,#1:LDREQ R12,[R9,R6,LSL #2]
35700CMP R7,#2:LDREQ R10,[R9,R6,LSL #2]
35710CMP R7,#3:LDREQ R11,[R9,R6,LSL #2]
35720STMIA R5!,{R10,R11,R12}
35730SUBS R0,R0,#1:BNE mappixlp
35740MOVS PC,R14
35750.ltable
35760]
35770FORI%=0TO15
35780[OPT Z
35790EQUD I%/15*F
35800]
35810NEXT
35820ELSE
35830IFhpredict%=2 THEN
35840[OPT Z
35850ADD R6,R6,R10
35860AND R6,R6,#255
35870MOV R10,R6
35880]
35890ENDIF
35900[OPT Z
35910LDR R7,[R2,R6,LSL #2]:LDR R8,[R3,R6,LSL #2]:LDR R9,[R4,R6,LSL #2]
35920STMIA R5!,{R7,R8,R9}
35930SUBS R0,R0,#1:BNE mappixlp
35940MOVS PC,R14
35950]
35960ENDIF
35970WHEN 4
35980IFbigendianbits THEN
35990[OPT Z
36000MOV R10,R6,LSR #4
36010LDR R7,[R2,R10,LSL #2]:LDR R8,[R3,R10,LSL #2]:LDR R9,[R4,R10,LSL #2]
36020STMIA R5!,{R7,R8,R9}
36030AND R10,R6,#&F
36040]
36050ELSE
36060[OPT Z
36070AND R10,R6,#&F
36080LDR R7,[R2,R10,LSL #2]:LDR R8,[R3,R10,LSL #2]:LDR R9,[R4,R10,LSL #2]
36090STMIA R5!,{R7,R8,R9}
36100MOV R10,R6,LSR #4
36110]
36120ENDIF
36130[OPT Z
36140LDR R7,[R2,R10,LSL #2]:LDR R8,[R3,R10,LSL #2]:LDR R9,[R4,R10,LSL #2]
36150STMIA R5!,{R7,R8,R9}
36160SUBS R0,R0,#2:BHI mappixlp
36170MOVS PC,R14
36180]
36190WHEN 2
36200IFbigendianbits THEN
36210[OPT Z
36220MOV R10,R6,LSR #6
36230LDR R7,[R2,R10,LSL #2]:LDR R8,[R3,R10,LSL #2]:LDR R9,[R4,R10,LSL #2]
36240STMIA R5!,{R7,R8,R9}
36250AND R10,R6,#&30
36260LDR R7,[R2,R10,LSR #2]:LDR R8,[R3,R10,LSR #2]:LDR R9,[R4,R10,LSR #2]
36270STMIA R5!,{R7,R8,R9}
36280AND R10,R6,#&C
36290LDR R7,[R2,R10]:LDR R8,[R3,R10]:LDR R9,[R4,R10]
36300STMIA R5!,{R7,R8,R9}
36310AND R10,R6,#&3
36320]
36330ELSE
36340[OPT Z
36350AND R10,R6,#&3
36360LDR R7,[R2,R10,LSL #2]:LDR R8,[R3,R10,LSL #2]:LDR R9,[R4,R10,LSL #2]
36370STMIA R5!,{R7,R8,R9}
36380AND R10,R6,#&C
36390LDR R7,[R2,R10]:LDR R8,[R3,R10]:LDR R9,[R4,R10]
36400STMIA R5!,{R7,R8,R9}
36410AND R10,R6,#&30
36420LDR R7,[R2,R10,LSR #2]:LDR R8,[R3,R10,LSR #2]:LDR R9,[R4,R10,LSR #2]
36430STMIA R5!,{R7,R8,R9}
36440MOV R10,R6,LSR #6
36450]
36460ENDIF
36470[OPT Z
36480LDR R7,[R2,R10,LSL #2]:LDR R8,[R3,R10,LSL #2]:LDR R9,[R4,R10,LSL #2]
36490STMIA R5!,{R7,R8,R9}
36500SUBS R0,R0,#4:BHI mappixlp
36510MOVS PC,R14
36520]
36530WHEN 1
36540IFbigendianbits THEN
36550[OPT Z
36560AND R10,R6,#&80
36570LDR R7,[R2,R10,LSR #5]:LDR R8,[R3,R10,LSR #5]:LDR R9,[R4,R10,LSR #5]
36580STMIA R5!,{R7,R8,R9}
36590AND R10,R6,#&40
36600LDR R7,[R2,R10,LSR #4]:LDR R8,[R3,R10,LSR #4]:LDR R9,[R4,R10,LSR #4]
36610STMIA R5!,{R7,R8,R9}
36620AND R10,R6,#&20
36630LDR R7,[R2,R10,LSR #3]:LDR R8,[R3,R10,LSR #3]:LDR R9,[R4,R10,LSR #3]
36640STMIA R5!,{R7,R8,R9}
36650AND R10,R6,#&10
36660LDR R7,[R2,R10,LSR #2]:LDR R8,[R3,R10,LSR #2]:LDR R9,[R4,R10,LSR #2]
36670STMIA R5!,{R7,R8,R9}
36680AND R10,R6,#&8
36690LDR R7,[R2,R10,LSR #1]:LDR R8,[R3,R10,LSR #1]:LDR R9,[R4,R10,LSR #1]
36700STMIA R5!,{R7,R8,R9}
36710AND R10,R6,#&4
36720LDR R7,[R2,R10]:LDR R8,[R3,R10]:LDR R9,[R4,R10]
36730STMIA R5!,{R7,R8,R9}
36740AND R10,R6,#&2
36750LDR R7,[R2,R10,LSL #1]:LDR R8,[R3,R10,LSL #1]:LDR R9,[R4,R10,LSL #1]
36760STMIA R5!,{R7,R8,R9}
36770AND R10,R6,#&1
36780]
36790ELSE
36800[OPT Z
36810AND R10,R6,#&1
36820LDR R7,[R2,R10,LSL #2]:LDR R8,[R3,R10,LSL #2]:LDR R9,[R4,R10,LSL #2]
36830STMIA R5!,{R7,R8,R9}
36840AND R10,R6,#&2
36850LDR R7,[R2,R10,LSL #1]:LDR R8,[R3,R10,LSL #1]:LDR R9,[R4,R10,LSL #1]
36860STMIA R5!,{R7,R8,R9}
36870AND R10,R6,#&4
36880LDR R7,[R2,R10]:LDR R8,[R3,R10]:LDR R9,[R4,R10]
36890STMIA R5!,{R7,R8,R9}
36900AND R10,R6,#&8
36910LDR R7,[R2,R10,LSR #1]:LDR R8,[R3,R10,LSR #1]:LDR R9,[R4,R10,LSR #1]
36920STMIA R5!,{R7,R8,R9}
36930AND R10,R6,#&10
36940LDR R7,[R2,R10,LSR #2]:LDR R8,[R3,R10,LSR #2]:LDR R9,[R4,R10,LSR #2]
36950STMIA R5!,{R7,R8,R9}
36960AND R10,R6,#&20
36970LDR R7,[R2,R10,LSR #3]:LDR R8,[R3,R10,LSR #3]:LDR R9,[R4,R10,LSR #3]
36980STMIA R5!,{R7,R8,R9}
36990AND R10,R6,#&40
37000LDR R7,[R2,R10,LSR #4]:LDR R8,[R3,R10,LSR #4]:LDR R9,[R4,R10,LSR #4]
37010STMIA R5!,{R7,R8,R9}
37020MOV R10,R6,LSR #7
37030]
37040ENDIF
37050[OPT Z
37060LDR R7,[R2,R10,LSL #2]:LDR R8,[R3,R10,LSL #2]:LDR R9,[R4,R10,LSL #2]
37070STMIA R5!,{R7,R8,R9}
37080SUBS R0,R0,#8:BHI mappixlp
37090MOVS PC,R14
37100]
37110WHEN 16
37120[OPT Z
37130.mappix%
37140LDR R0,sxloc
37150LDR R1,[R9]:LDR R1,[R1]
37160LDR R2,[R9,#8]:LDR R2,[R2]
37170LDR R3,[R9,#4*8]
37180LDR R4,[R9,#3*8]
37190LDR R5,[R9,#2*8]
37200LDR R6,[R9,#5*8]
37210LDR R7,[R9,#6*8]
37220LDR R8,[R9,#7*8]
37230CMP R1,R2
37240ADDEQ R2,R2,#1
37250.mappixlp
37260LDRB R9,[R1],#step24:LDRB R10,[R2],#step24
37270LDR R9,[R6,R9,LSL #2]:LDR R10,[R7,R10,LSL #2]:ORR R9,R9,R10
37280AND R10,R9,#255:LDR R10,[R3,R10,LSL #2]
37290MOV R11,R9,LSR #8:AND R11,R11,#255:LDR R11,[R4,R11,LSL #2]
37300MOV R12,R9,LSR #16:LDR R12,[R5,R12,LSL #2]
37310STMIA R8!,{R10,R11,R12}
37320SUBS R0,R0,#1:BNE mappixlp
37330MOVS PC,R14
37340]
37350WHEN 24
37360[OPT Z
37370.mappix%
37380LDR R0,sxloc
37390LDR R1,[R9,#2*8]:LDR R1,[R1]
37400LDR R2,[R9,#8]:LDR R2,[R2]
37410LDR R3,[R9]:LDR R3,[R3]
37420LDR R4,[R9,#5*8]
37430LDR R5,[R9,#4*8]
37440LDR R6,[R9,#3*8]
37450LDR R7,[R9,#6*8]
37460.mappixlp
37470LDRB R8,[R1],#step24:LDR R9,[R4,R8,LSL #2]
37480LDRB R8,[R2],#step24:LDR R10,[R5,R8,LSL #2]
37490LDRB R8,[R3],#step24:LDR R11,[R6,R8,LSL #2]
37500STMIA R7!,{R9,R10,R11}
37510SUBS R0,R0,#1:BNE mappixlp
37520MOVS PC,R14
37530]
37540WHEN 411
37560[OPT Z
37570.mappix%
37580LDR R0,sxloc
37590LDR R1,[R9]:LDR R1,[R1]
37600LDR R2,[R9,#1*8]
37610LDR R3,[R9,#2*8]
37620LDR R5,[R9,#4*8]
37630LDR R6,[R9,#5*8]
37640LDR R7,[R9,#6*8]
37650LDR R9,[R9,#8*8]
37660STMFD SP !,{R14}
37670.mappixlp
37680LDMIA R1!,{R4,R10}
37690AND R8,R4,#&C000
37700MOV R8,R8,LSR #8
37710AND R14,R4,#&C0000000
37720ORR R8,R8,R14,LSR #16+8+2
37730AND R14,R10,#&C000
37740ORR R8,R8,R14,LSR #8+4
37750ORR R8,R8,R10,LSR #16+8+6
37760AND R11,R4,#&3000
37770MOV R11,R11,LSR #6
37780AND R14,R4,#&30000000
37790ORR R11,R11,R14,LSR #16+6+2
37800AND R14,R10,#&3000
37810ORR R11,R11,R14,LSR #6+4
37820AND R14,R10,#&30000000
37830ORR R11,R11,R14,LSR #16+6+6
37850AND R12,R4,#&FF
37860LDR R12,[R2,R12,LSL #2]
37870LDR R14,[R7,R11,LSL #2]:ADDS R14,R14,R12
37880MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
37890LDR R14,[R6,R8,LSL #2]:ADD R14,R14,R12
37900LDR R12,[R5,R11,LSL #2]:ADDS R14,R14,R12
37910MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
37920AND R12,R4,#&FF
37930LDR R12,[R2,R12,LSL #2]
37940LDR R14,[R3,R8,LSL #2]:ADDS R14,R12,R14
37950MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
37970MOV R4,R4,LSR #16
37980AND R12,R4,#&FF
37990LDR R12,[R2,R12,LSL #2]
38000LDR R14,[R7,R11,LSL #2]:ADDS R14,R14,R12
38010MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38020LDR R14,[R6,R8,LSL #2]:ADD R14,R14,R12
38030LDR R12,[R5,R11,LSL #2]:ADDS R14,R14,R12
38040MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38050AND R12,R4,#&FF
38060LDR R12,[R2,R12,LSL #2]
38070LDR R14,[R3,R8,LSL #2]:ADDS R14,R12,R14
38080MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38100AND R12,R10,#&FF
38110LDR R12,[R2,R12,LSL #2]
38120LDR R14,[R7,R11,LSL #2]:ADDS R14,R14,R12
38130MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38140LDR R14,[R6,R8,LSL #2]:ADD R14,R14,R12
38150LDR R12,[R5,R11,LSL #2]:ADDS R14,R14,R12
38160MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38170AND R12,R10,#&FF
38180LDR R12,[R2,R12,LSL #2]
38190LDR R14,[R3,R8,LSL #2]:ADDS R14,R12,R14
38200MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38220MOV R10,R10,LSR #16
38230AND R12,R10,#&FF
38240LDR R12,[R2,R12,LSL #2]
38250LDR R14,[R7,R11,LSL #2]:ADDS R14,R14,R12
38260MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38270LDR R14,[R6,R8,LSL #2]:ADD R14,R14,R12
38280LDR R12,[R5,R11,LSL #2]:ADDS R14,R14,R12
38290MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38300AND R12,R10,#&FF
38310LDR R12,[R2,R12,LSL #2]
38320LDR R14,[R3,R8,LSL #2]:ADDS R14,R12,R14
38330MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38350SUBS R0,R0,#4:BNE mappixlp
38360LDMFD SP !,{PC}^
38370]
38380WHEN 423
38390[OPT Z
38400.mappix%
38410LDR R0,sxloc
38420LDR R1,[R9]:LDR R1,[R1]
38430LDR R2,[R9,#1*8]
38440LDR R3,[R9,#2*8]
38450LDR R4,[R9,#3*8]
38460LDR R5,[R9,#4*8]
38470LDR R6,[R9,#5*8]
38480LDR R7,[R9,#6*8]
38490LDR R8,[R9,#7*8]
38500LDR R9,[R9,#8*8]
38510STMFD SP !,{R14}
38520.mappixlp
38530LDR R10,[R1],#4
38540AND R11,R10,#&FF00
38550LDR R11,[R2,R11,LSR #6]
38560AND R12,R10,#&FF:LDR R12,[R7,R12,LSL #2]:ADD R14,R12,R11
38570AND R12,R10,#&FF0000:LDR R12,[R8,R12,LSR #14]:ADDS R14,R14,R12
38580MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38590AND R12,R10,#&FF:LDR R12,[R5,R12,LSL #2]:ADD R14,R12,R11
38600AND R12,R10,#&FF0000:LDR R12,[R6,R12,LSR #14]:ADDS R14,R14,R12
38610MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38620AND R12,R10,#&FF:LDR R12,[R3,R12,LSL #2]:ADD R14,R12,R11
38630AND R12,R10,#&FF0000:LDR R12,[R4,R12,LSR #14]:ADDS R14,R14,R12
38640MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38650AND R11,R10,#&FF000000
38660LDR R11,[R2,R11,LSR #22]
38670AND R12,R10,#&FF:LDR R12,[R7,R12,LSL #2]:ADD R14,R12,R11
38680AND R12,R10,#&FF0000:LDR R12,[R8,R12,LSR #14]:ADDS R14,R14,R12
38690MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38700AND R12,R10,#&FF:LDR R12,[R5,R12,LSL #2]:ADD R14,R12,R11
38710AND R12,R10,#&FF0000:LDR R12,[R6,R12,LSR #14]:ADDS R14,R14,R12
38720MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38730AND R12,R10,#&FF:LDR R12,[R3,R12,LSL #2]:ADD R14,R12,R11
38740AND R12,R10,#&FF0000:LDR R12,[R4,R12,LSR #14]:ADDS R14,R14,R12
38750MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38760SUBS R0,R0,#2:BNE mappixlp
38770LDMFD SP !,{PC}^
38780]
38790WHEN 422
38800[OPT Z
38810.mappix%
38820LDR R0,sxloc
38830LDR R1,[R9]:LDR R1,[R1]
38840LDR R2,[R9,#1*8]
38850LDR R3,[R9,#2*8]
38860LDR R5,[R9,#4*8]
38870LDR R6,[R9,#5*8]
38880LDR R7,[R9,#6*8]
38890LDR R9,[R9,#8*8]
38900STMFD SP !,{R14}
38910.mappixlp
38920LDR R10,[R1],#4
38930AND R11,R10,#&FF00
38940LDR R11,[R2,R11,LSR #6]
38950AND R12,R10,#&FF0000:LDR R12,[R7,R12,LSR #14]:ADDS R14,R12,R11
38960MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
38970AND R12,R10,#&FF:LDR R12,[R5,R12,LSL #2]:ADD R14,R12,R11
38980AND R12,R10,#&FF0000:LDR R12,[R6,R12,LSR #14]:ADDS R14,R14,R12
38990MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
39000AND R12,R10,#&FF:LDR R12,[R3,R12,LSL #2]:ADDS R14,R12,R11
39010MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
39020AND R11,R10,#&FF000000
39030LDR R11,[R2,R11,LSR #22]
39040AND R12,R10,#&FF0000:LDR R12,[R7,R12,LSR #14]:ADDS R14,R12,R11
39050MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
39060AND R12,R10,#&FF:LDR R12,[R5,R12,LSL #2]:ADD R14,R12,R11
39070AND R12,R10,#&FF0000:LDR R12,[R6,R12,LSR #14]:ADDS R14,R14,R12
39080MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
39090AND R12,R10,#&FF:LDR R12,[R3,R12,LSL #2]:ADDS R14,R12,R11
39100MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
39110SUBS R0,R0,#2:BNE mappixlp
39120LDMFD SP !,{PC}^
39130]
39140WHEN 555
39160[OPT Z
39170.mappix%
39180LDR R0,sxloc
39190LDR R1,[R9]:LDR R1,[R1]
39200LDR R2,[R9,#1*8]
39210LDR R3,[R9,#2*8]
39220LDR R5,[R9,#4*8]
39230LDR R6,[R9,#5*8]
39240LDR R7,[R9,#6*8]
39250LDR R9,[R9,#8*8]
39260STMFD SP !,{R14}
39270.mappixlp
39280LDR R10,[R1],#2
39290AND R11,R10,#ymax%
39300LDR R11,[R2,R11,LSL #2]
39310AND R8,R10,#((1<<vbits%)-1)<<(ybits%+ubits%)
39320AND R10,R10,#((1<<ubits%)-1)<<ybits%
39340LDR R12,[R7,R8,LSR #ybits%+ubits%-2]:ADDS R14,R12,R11
39350MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
39360LDR R12,[R5,R8,LSR #ybits%+ubits%-2]:ADD R14,R12,R11
39370LDR R12,[R6,R10,LSR #ybits%-2]:ADDS R14,R14,R12
39380MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
39390LDR R12,[R3,R10,LSR #ybits%-2]:ADDS R14,R12,R11
39400MOVMI R14,#0:CMP R14,#F:MOVCS R14,#F:STR R14,[R9],#4
39410SUBS R0,R0,#1:BNE mappixlp
39420LDMFD SP !,{PC}^
39430]
39440ENDCASE
39450IFxmul%=2 AND xdiv%=1 THEN
39460[OPT Z
39480.xsample%
39490LDR R0,[R9]:LDR R0,[R0]
39500LDR R1,[R9,#8]
39510LDR R2,[R9,#2*8]
39520.xsamplelp
39530LDMIA R1,{R5,R6,R7,R8,R9,R10}
39540ADD R8,R8,R5
39550MOV R8,R8,LSR #1
39560ADD R9,R9,R6
39570MOV R9,R9,LSR #1
39580ADD R10,R10,R7
39590MOV R10,R10,LSR #1
39600STMIA R2!,{R5,R6,R7,R8,R9,R10}
39610ADD R1,R1,#12
39620SUBS R0,R0,#2:BPL xsamplelp
39630MOVS PC,R14
39640]
39650ELSE
39660[OPT Z
39680.xsample%
39690LDR R0,[R9]:LDR R0,[R0]
39700LDR R1,[R9,#8]
39710LDR R2,[R9,#2*8]
39720LDR R3,[R9,#3*8]:LDR R3,[R3]
39730LDR R4,[R9,#4*8]:LDR R4,[R4]
39740MOV R11,R4
39750.xsamplelp
39760LDMIA R1,{R5,R6,R7}
39770SUBS R11,R11,#1:MOVEQ R11,R4:ADDEQ R1,R1,#12
39780SUBS R12,R3,#1
39790BEQ xdonediv
39800.xdivlp
39810CMP R12,R11
39820BCC xdivlp2
39830LDMIA R1!,{R8,R9,R10}:MLA R5,R8,R11,R5:MLA R6,R9,R11,R6:MLA R7,R10,R11,R7
39840SUBS R12,R12,R11:MOV R11,R4
39850BNE xdivlp
39860B xdonediv
39870.xdivlp2
39880LDMIA R1,{R8,R9,R10}
39890SUBS R11,R11,#1:MOVEQ R11,R4:ADDEQ R1,R1,#12
39900ADD R5,R5,R8:ADD R6,R6,R9:ADD R7,R7,R10
39910SUBS R12,R12,#1:BNE xdivlp
39920.xdonediv
39930STMIA R2!,{R5,R6,R7}
39940SUBS R0,R0,#1:BPL xsamplelp
39950MOVS PC,R14
39960]
39970ENDIF
39980ENDCASE
39990IFcompression=5 THEN
40000[OPT Z
40020.firstcode DCD 0
40030.oldcode DCD 0
40040.codesize DCD setcodes%+1
40050.stack DCD stk%
40060.sp DCD stk%
40070.maxcode DCD clearcode%+2
40080.maxcodesize DCD 2*clearcode%
40090.LZWdecode%
40100LDR R2,firstcode:LDR R3,oldcode:LDR R4,stack:LDR R5,codesize
40110LDR R6,sp:LDR R7,maxcode:LDR R8,maxcodesize
40120LDR R10,[R9]:LDR R10,[R10]
40130LDR R11,[R9,#8]:LDR R11,[R11]
40140LDR R12,[R9,#24]
40150STMFD SP !,{R14}
40160.lzwloop
40170CMP R6,R4
40180BHI lzwunstack
40190.lzwengine
40200BL getcode
40210CMP R0,#clearcode%
40220BEQ lzwclear
40240MOV R1,R0
40250CMP R0,R7
40260STRCSB R2,[R6],#1
40270MOVCS R0,R3
40280CMP R0,#clearcode%
40290BCC lzwdonepush
40300.lzwpushtable
40310LDR R14,[R12,R0,LSL #2]
40320STRB R14,[R6],#1
40330MOV R0,R14,LSR #16
40340CMP R0,#clearcode%
40350BCS lzwpushtable
40360.lzwdonepush
40370LDR R2,[R12,R0,LSL #2]
40380BIC R2,R2,#&FF0000
40390BIC R2,R2,#&FF000000
40400STRB R2,[R6],#1
40410CMP R7,#4096
40420BCS lzwnocode
40430ORR R0,R2,R3,LSL #16
40440STR R0,[R12,R7,LSL #2]
40450ADD R7,R7,#1
40460CMP R7,R8
40470BCC lzwnocode
40480CMP R8,#4096
40490ADDCC R5,R5,#1
40500MOVCC R8,R8,LSL #1
40510]
40520IFflag=1500 THEN
40530[OPT Z
40540ORRCC R8,R8,#1
40550]
40560ENDIF
40570[OPT Z
40580.lzwnocode
40590MOV R3,R1
40600CMP R6,R4
40610BLS lzwengine
40620.lzwunstack
40630LDRB R0,[R6,#-1]!
40640.lzwloopend
40650STRB R0,[R11],#1
40660SUBS R10,R10,#1
40670BNE lzwloop
40680STR R2,firstcode:STR R3,oldcode:STR R5,codesize
40690STR R6,sp:STR R7,maxcode:STR R8,maxcodesize
40700LDMFD SP !,{PC}^
40710.lzwclear
40720MOV R0,#0
40730MOV R3,R12
40740.lzwdefaulttable
40750STR R0,[R3],#4
40760ADD R0,R0,#1:CMP R0,#clearcode%
40770BCC lzwdefaulttable
40780MOV R5,#setcodes%+1
40790MOV R7,#clearcode%
40800MOV R8,R7,LSL #1
40810]
40820IFflag=1500 THEN
40830[OPT Z
40840SUB R8,R8,#1
40850]
40860ENDIF
40870[OPT Z
40880ADD R7,R7,#2
40890BL getcode
40900MOV R2,R0
40910MOV R3,R0
40920MOV R6,R4
40930B lzwloopend
40950.curbit DCD 0
40960.lastbit DCD 0
40970.buf DCD buf%
40980.getcode
40990STMFD SP !,{R6,R7,R8}
41000ADR R6,curbit
41010LDMIA R6,{R6,R7,R8}
41020ADD R1,R5,R6
41030CMP R1,R7
41040BCS needmoredata
41050.simplecode
41060ADD R7,R8,R6,LSR #3
41070BIC R7,R7,#3
41080LDMIA R7,{R0,R7}
41090]
41100IFflag=1500 THEN
41110[OPT Z
41120EOR R1,R0,R0,ROR #16
41130BIC R1,R1,#&FF0000
41140MOV R0,R0,ROR #8
41150EOR R0,R0,R1,LSR #8
41160EOR R1,R7,R7,ROR #16
41170BIC R1,R1,#&FF0000
41180MOV R7,R7,ROR #8
41190EOR R7,R7,R1,LSR #8
41200ANDS R1,R6,#31:MOVNE R0,R0,LSL R1:RSBNE R1,R1,#32:ORRNE R0,R0,R7,LSR R1
41210RSB R1,R5,#32
41220MOV R0,R0,LSR R1
41230]
41240ELSE
41250[OPT Z
41260ANDS R1,R6,#31:MOVNE R0,R0,LSR R1:RSBNE R1,R1,#32:ORRNE R0,R0,R7,LSL R1
41270MVN R1,#0:BIC R0,R0,R1,LSL R5
41280]
41290ENDIF
41300[OPT Z
41310ADD R6,R6,R5
41320STR R6,curbit
41330LDMFD SP !,{R6,R7,R8}
41340MOV PC,R14
41350.needmoredata
41360STMFD SP !,{R2,R3,R4,R14}
41370MOV R3,R7,LSR #3
41380SUB R0,R3,#2
41390LDRB R0,[R8,R0]
41400STRB R0,[R8]
41410SUB R0,R3,#1
41420LDRB R0,[R8,R0]
41430STRB R0,[R8,#1]
41440LDR R1,[R9,#16]
41450LDR R1,[R1]
41460]
41470IFflag=1500 THEN
41480[OPT Z
41490MOV R0,#256
41500MOV R3,#256
41510]
41520ELSE
41530[OPT Z
41540BL bytefromcache%
41550MOVS R3,R0
41560BEQ simplecode1
41570]
41580ENDIF
41590[OPT Z
41600SUB R6,R6,R7
41610ADD R6,R6,#16
41620ADD R0,R0,#2
41630MOV R7,R0,LSL #3
41640STR R7,lastbit
41650ADD R2,R8,#2
41660BL multibytefromcache%
41670.simplecode1
41680LDMFD SP !,{R2,R3,R4,R14}
41690B simplecode
41700]
41710ENDIF
41720IFrange% THEN
41730[OPT Z
41750.maxmin%
41760LDR R0,[R9]:LDR R0,[R0]
41770LDR R1,[R9,#8]
41780LDR R2,min
41790LDR R3,max
41800.maxminlp
41810LDR R4,[R1],#4
41820CMP R4,R3:MOVCS R3,R4
41830CMP R4,R2:MOVCC R2,R4
41840SUBS R0,R0,#1:BNE maxminlp
41850STR R2,min
41860STR R3,max
41870MOVS PC,R14
41880.min DCD F
41890.max DCD 0
41900]
41910ENDIF
41920IFsharpen% THEN
41930sharp=(col+1)*4:IFsharpen%<>8 sharpmul%=F/(sharpen%-8)
41940[OPT Z
41960.sharp%
41970LDR R0,[R9]:LDR R0,[R0]
41980LDR R1,[R9,#8]
41990LDR R2,[R9,#16]
42000LDR R3,[R9,#24]
42010LDR R4,[R9,#32]
42020]
42030CASE sharpen% OF
42040WHEN 8,9,12,16,24
42050OTHERWISE
42060[OPT Z
42070MOV R8,#sharpmul% AND &FF
42080ORR R8,R8,#sharpmul% AND &FF00
42090MOV R9,#(sharpmul% >> 16) AND &FF
42100ORR R9,R9,#(sharpmul% >> 16) AND &FF00
42110]
42120ENDCASE
42130[OPT Z
42140.sharplp
42150LDR R5,[R1,#-sharp]
42160LDR R6,[R1,#sharp]:ADD R5,R5,R6
42170LDR R6,[R1],#4:ADD R5,R5,R6
42180LDR R6,[R3,#-sharp]:ADD R5,R5,R6
42190LDR R6,[R3,#sharp]:ADD R5,R5,R6
42200LDR R6,[R3],#4:ADD R5,R5,R6
42210LDR R6,[R2,#-sharp]:ADD R5,R5,R6
42220LDR R6,[R2,#sharp]:ADD R5,R5,R6
42230LDR R6,[R2],#4
42240MOV R6,R6,LSR #1
42250MOV R7,#sharpen%
42260MUL R7,R6,R7
42270SUBS R5,R7,R5,LSR #1
42280MOVCC R5,#0
42290]
42300CASE sharpen% OF
42310WHEN 8,9
42320[OPT Z
42330MOV R6,R5,LSL #1
42340]
42350WHEN 10
42360[OPT Z
42370MOV R6,R5
42380]
42390WHEN 12
42400[OPT Z
42410MOV R6,R5,LSR #1
42420]
42430WHEN 16
42440[OPT Z
42450MOV R6,R5,LSR #2
42460]
42470WHEN 24
42480[OPT Z
42490MOV R6,R5,LSR #3
42500]
42510OTHERWISE
42520[OPT Z
42530MOV R6,R5,LSR #16
42540EOR R5,R5,R6,LSL #16
42550MUL R7,R8,R5
42560MUL R5,R9,R5
42570MUL R10,R6,R8
42580MUL R6,R9,R6
42590ADDS R10,R5,R10
42600ADDCS R6,R6,#&10000
42610ADDS R7,R7,R10,LSL #16
42620ADC R6,R6,R10,LSR #16
42630MOV R6,R6,LSL #(32-27)
42640ORRS R6,R6,R7,LSR #27
42650ADDCS R6,R6,#1
42660]
42670ENDCASE
42680[OPT Z
42690CMP R6,#F:MOVCS R6,#F
42700STR R6,[R4],#4
42710SUBS R0,R0,#1
42720BNE sharplp
42730MOVS PC,R14
42740]
42750ENDIF
42760IFhist%ORequal% THEN
42770[OPT Z
42790.histo%
42800LDR R0,[R9]:LDR R0,[R0]
42810LDR R1,[R9,#8]
42820LDR R2,[R9,#16]
42830.histlp
42840LDR R3,[R2],#4:CMP R3,#F:MOVCS R3,#F
42850MOV R3,R3,LSR #bits-8
42860]
42870IFcol=2 THEN
42880[OPT Z
42890ADD R3,R3,R3,LSL #1
42900LDR R4,[R1,R3,LSL #2]:ADD R4,R4,#1:STR R4,[R1,R3,LSL #2]
42910LDR R3,[R2],#4:CMP R3,#F:MOVCS R3,#F
42920MOV R3,R3,LSR #bits-8
42930ADD R3,R3,R3,LSL #1:ADD R3,R3,#1
42940LDR R4,[R1,R3,LSL #2]:ADD R4,R4,#1:STR R4,[R1,R3,LSL #2]
42950LDR R3,[R2],#4:CMP R3,#F:MOVCS R3,#F
42960MOV R3,R3,LSR #bits-8
42970ADD R3,R3,R3,LSL #1:ADD R3,R3,#2
42980]
42990ENDIF
43000[OPT Z
43010LDR R4,[R1,R3,LSL #2]:ADD R4,R4,#1:STR R4,[R1,R3,LSL #2]
43020SUBS R0,R0,#1
43030BNE histlp
43040MOVS PC,R14
43050]
43060ENDIF
43070IFequal% THEN
43080[OPT Z
43100.histequal%
43110LDR R0,[R9]:LDR R0,[R0]
43120LDR R1,[R9,#8]
43130LDR R2,[R9,#16]
43140.equallp
43150LDR R3,[R2]:CMP R3,#F:MOVCS R3,#F
43160MOV R3,R3,LSR #bits-8
43170]
43180IFcol=2 THEN
43190[OPT Z
43200LDR R3,[R2]:CMP R3,#F:MOVCS R3,#F
43210MOV R3,R3,LSR #bits-8
43220ADD R3,R3,R3,LSL #1
43230LDR R4,[R1,R3,LSL #2]:STR R4,[R2],#4
43240LDR R3,[R2]:CMP R3,#F:MOVCS R3,#F
43250MOV R3,R3,LSR #bits-8
43260ADD R3,R3,R3,LSL #1:ADD R3,R3,#1
43270LDR R4,[R1,R3,LSL #2]:STR R4,[R2],#4
43280LDR R3,[R2]:CMP R3,#F:MOVCS R3,#F
43290MOV R3,R3,LSR #bits-8
43300ADD R3,R3,R3,LSL #1:ADD R3,R3,#2
43310]
43320ENDIF
43330[OPT Z
43340LDR R4,[R1,R3,LSL #2]:STR R4,[R2],#4
43350SUBS R0,R0,#1
43360BNE equallp
43370MOVS PC,R14
43380]
43390ENDIF
43400CASE r$ OF
43410WHEN "FN800","FN801","FN1000","FN1001"
43420[OPT Z
43450.rlexpand%
43460LDR R0,[R9]
43470LDR R1,[R0]
43480LDR R2,[R9,#8]:LDR R2,[R2]
43490LDR R3,[R9,#16]
43500LDR R4,[R3]
43510CMP R4,#1:MOVLTS PC,R14
43520LDR R5,[R9,#24]:LDR R5,[R5]
43530.rle
43540STRB R2,[R1],#1
43550SUB R4,R4,#1
43560CMP R1,R5
43570TEQNE R4,#0
43580BNE rle
43590.rlexit
43600STR R1,[R0]
43610STR R4,[R3]
43620MOVS PC,R14
43630]
43640WHEN "FN902"
43650[OPT Z
43660.unpack%
43670LDR R0,[R9]
43680LDR R0,[R0]
43690LDR R1,plbuff
43700ADD R2,R0,#768
43710.unpackloop
43720LDR R3,[R0],#4
43730MOV R5,#0
43740.bitloop
43750MOV R6,R3,LSR R5
43760AND R6,R6,#15
43770ADD R5,R5,#4
43780MOV R7,R3,LSR R5
43790AND R7,R7,#15
43800ADD R5,R5,#4
43810STRB R7,[R1],#1
43820STRB R6,[R1],#1
43830CMP R5,#32
43840BNE bitloop
43850CMP R2,R0
43860BNE unpackloop
43870MOV PC,R14
43880.plbuff EQUD plbuff%
43890]
43900WHEN "FN1601","FN1501","FN1850","FN1851"
43910[OPT Z
43930.readiff%
43940MOV R1,#c%
43950LDR R8,[R9]:LDR R8,[R8]
43960LDR R7,[R9,#8]:LDR R7,[R7]:ADD R7,R7,R8
43970STMFD SP !,{R14}
43980]
43990IFr$="FN1850" OR r$="FN1851" THEN
44000[OPT Z
44010BL bytefromcache%
44020]
44030IFsy%>250 THEN
44040[OPT Z
44050BL bytefromcache%
44060]
44070ENDIF
44080ENDIF
44090[OPT Z
44100.rle
44110BL bytefromcache%
44120CMP R0,#128
44130BCC rle1
44140RSB R2,R0,#256
44150BL bytefromcache%
44160.rle0 STRB R0,[R8],#1
44170SUBS R2,R2,#1
44180BPL rle0
44190B rle2
44200.rle1
44210ADD R3,R0,#1
44220MOV R2,R8
44230ADD R8,R8,R3
44240BL multibytefromcache%
44250.rle2
44260CMP R8,R7
44270BCC rle
44280LDMFD SP !,{R14}
44290MOVS PC,R14
44300]
44310WHEN "FN1900","FN1100","FN400"
44320[OPT Z
44340.readline%
44350LDR R2,[R9]:LDR R2,[R2]
44360LDR R3,[R9,#8]
44370LDR R0,[R3]
44380LDR R4,[R9,#16]
44390LDR R5,[R4]
44400LDR R6,[R9,#24]:LDR R6,[R6]:ADD R6,R6,R2
44410STMFD SP !,{R14}
44420.rle
44430CMP R5,#1
44440BGE rle1
44450BL bytefromcache%
44460MOV R5,#1
44470]
44480IFflag=1900 THEN
44490[OPT Z
44500CMP R0,#192
44510ANDCS R5,R0,#63:BLCS bytefromcache%
44520]
44530ENDIF
44540IFflag=1100 THEN
44550[OPT Z
44560CMP R0,#128
44570BNE rle1
44580BL bytefromcache%
44590TEQ R0,#0
44600MOVEQ R0,#128
44610BEQ rle1
44620ADD R5,R0,#1
44630BL bytefromcache%
44640]
44650ENDIF
44660IFflag=400 THEN
44670[OPT Z
44680MOV R1,R0
44690BL bytefromcache%
44700ORR R1,R1,R0,LSL #8
44710BL bytefromcache%
44720ORR R1,R1,R0,LSL #16
44730BL bytefromcache%
44740ADD R5,R0,#1
44750MOV R0,R1
44760]
44770ENDIF
44780IFflag=200 THEN
44790[OPT Z
44800ADD R5,R0,#1
44810BL bytefromcache%
44820]
44830ENDIF
44840[OPT Z
44850.rle1
44860STRB R0,[R2],#1
44870]
44880IFflag=400 THEN
44890[OPT Z
44900MOV R1,R0,LSR #8
44910STRB R1,[R2],#1
44920MOV R1,R0,LSR #16
44930STRB R1,[R2],#1
44940]
44950ENDIF
44960[OPT Z
44970SUB R5,R5,#1
44980TEQ R2,R6
44990BNE rle
45000.rlexit
45010STR R0,[R3]:STR R5,[R4]
45020LDMFD SP !,{PC}^
45030]
45040ENDCASE
45050IFcachebytes% THEN
45060[OPT Z
45070.bytefromcache%
45080STMFD SP !,{R1,R2}
45090LDR R1,incacheptr
45100LDR R2,numlefttogo
45110LDRB R0,[R1],#1
45120SUBS R2,R2,#1
45130STRNE R1,incacheptr
45140STRNE R2,numlefttogo
45150LDMFD SP !,{R1,R2}
45160MOVNE PC,R14
45170STMFD SP !,{R0,R1,R2,R3,R4}
45180LDR R2,valdatacache
45190STR R2,incacheptr
45200LDR R3,valcache
45210STR R3,numlefttogo
45220MOV R0,#4
45230MOV R1,#c%
45240SWI "OS_GBPB"
45250LDMFD SP !,{R0,R1,R2,R3,R4}
45260MOV PC,R14
45270.valdatacache DCD datacache%
45280.valcache DCD cache%
45290.incacheptr DCD datacache%
45300.numlefttogo DCD cache%
45310.multibytefromcache%
45320CMP R3,#0
45330MOVEQ PC,R14
45340STMFD SP !,{R0,R14}
45350.multibytefromcachel
45360BL bytefromcache%
45370STRB R0,[R2],#1
45380SUBS R3,R3,#1
45390BNE multibytefromcachel
45400LDMFD SP !,{R0,R14}
45410MOV PC,R14
45420]
45430ENDIF
45440IFplanar%<0 THEN
45450C%=7:IFflag=2600 C%=15
45460[OPT Z
45470.plancnv%
45480LDR R0,sxloc
45490LDR R1,[R9]:LDR R1,[R1]
45500LDR R3,[R9,#8]:LDR R3,[R3]
45510LDR R4,[R9,#16]:LDR R4,[R4]
45520MOV R9,#C%
45530.planelp
45540MOV R7,#0
45550MOV R5,R3
45560]
45570FORN%=1TOplanes%
45580[OPT Z
45590LDR R6,[R5],R4
45600]
45610IFflag=2600 THEN
45620[OPT Z
45630MOV R6,R6,LSL #8
45640BIC R6,R6,#&FF000000
45650ORR R6,R6,R6,LSR #16
45660]
45670ENDIF
45680[OPT Z
45690MOV R6,R6,LSR R9
45700AND R6,R6,#1
45710ORR R7,R7,R6,LSL #(N%-1)
45720]
45730NEXT
45740[OPT Z
45750STRB R7,[R1],#1
45760SUBS R9,R9,#1:MOVMI R9,#C%
45770]
45780IFflag=2600 THEN
45790[OPT Z
45800MOVMI R3,R5
45810]
45820ELSE
45830[OPT Z
45840ADDMI R3,R3,#1
45850]
45860ENDIF
45870[OPT Z
45880SUBS R0,R0,#1:BNE planelp
45890MOVS PC,R14
45900]
45910ENDIF
45920NEXT
45930cputime%=TIME
45940IFcache% THEN
45950IFflag=3600 THEN
45960pcdblk%!12=cacherows%:PROCrefillpcd:IFcache%>=filesize% rowstogo%=-1
45970ELSE
45980IFstriprows%>0ANDcompression>1 THEN
46000SYS12,4,c%,datacache%,cache%
46010IFcachebytes% !incacheptr=datacache%:!numlefttogo=cache%
46020ELSE
46030PROCrefill:IFcache%>=filesize% rowstogo%=-1
46040ENDIF
46050ENDIF
46060ENDIF
46070CASE ncol OF
46080WHEN 2^24-1:size%=1
46090WHEN 2^15-1:size%=1
46100WHEN 63,255,256:size%=1
46110WHEN 15:size%=2
46120WHEN 3:size%=4
46130WHEN 1:size%=8:IFm$="C" size%=2
46140IFm$="D" size%=4
46150IFm$="T" size%=2
46160ENDCASE
46180CASE flag OF
46190WHEN 501:IFinfo% PRINT"Reading interlaced GIF"
46200sz%=sx%*sy%:plbuff%=FNdim(sz%+100)
46210FORY%=0TOsy%-1STEP8:X%=plbuff%+Y%*sx%:CALL LZWdecode%,table%(0),c%,X%,sx%:NEXT
46220FORY%=4TOsy%-1STEP8:X%=plbuff%+Y%*sx%:CALL LZWdecode%,table%(0),c%,X%,sx%:NEXT
46230FORY%=2TOsy%-1STEP4:X%=plbuff%+Y%*sx%:CALL LZWdecode%,table%(0),c%,X%,sx%:NEXT
46240FORY%=1TOsy%-1STEP2:X%=plbuff%+Y%*sx%:CALL LZWdecode%,table%(0),c%,X%,sx%:NEXT
46250datacache%=plbuff%:buff%=plbuff%:rowbytes%=sx%:rowstogo%=-1
46260ENDCASE
46270IFgamma<>1 AND gamma<>0 THEN
46280k=1/gamma:FORC%=0TO255
46290IFr%(C%) r%(C%)=((r%(C%)/F)^k)*F
46300IFg%(C%) g%(C%)=((g%(C%)/F)^k)*F
46310IFb%(C%) b%(C%)=((b%(C%)/F)^k)*F
46320NEXT
46330ENDIF
46340rmax=F:gmax=F:bmax=F
46350IFcol=0 THEN
46360IFinput<9 THEN
46370FORC%=0TO255:r%(C%)=r%(C%)*rwt+g%(C%)*gwt+b%(C%)*bwt:NEXT
46380ELSE
46390IFinput<400 THEN
46400rmax=F*rwt:gmax=F*gwt:bmax=F*bwt
46410FORC%=0TO255:r%(C%)=r%(C%)*rwt:g%(C%)=g%(C%)*gwt:b%(C%)=b%(C%)*bwt:NEXT
46420ENDIF
46430ENDIF
46440ENDIF
46450IFNOTorder% PROCadjustpalette(1/ydiv%/xdiv%,0)
46470IFrange% THEN
46480IFinfo% PRINT"Scanning data to compute parameters for '-range'"
46490IForder% THEN
46500Y%=0:REPEAT SYShour%,Y%*100DIVsy%
46510W%=EVAL(r$+"(xp%())"):CALLmaxmin%,xp%(1,0),totvals2%:Y%+=1
46520UNTILY%=sy% OR!min<255 AND!max+255>=F
46530ELSE
46540Y%=0:ysamp%=1:REPEAT SYShour%,Y%*100DIVy%
46550PROCscaledpixelrow(cl%()):CALLmaxmin%,cl%(1,0),totvals%:Y%+=1
46560UNTILY%=y% OR !min<255 AND !max+255>=F
46570ENDIF
46580IF!max+255>=F AND!min<255 range%=FALSE:range$="No point in '-range' on this image"
46590IFrange% PROCadjustpalette(F/(!max-!min),!min/ydiv%/xdiv%):range$="Input image maximum "+STR$(!max/F*100)+"% minimum "+STR$(!min/F*100)+"%"
46600PROCrewind:IFinfo% PRINTrange$
46610ENDIF
46620IFhist% ORequal% THEN
46630IFequal% IFinfo% PRINT"Scanning data to compute parameters for '-equal'"
46640IForder% THEN
46650FORyr%=0TOsy%-1:SYShour%,yr%*100DIVsy%
46660W%=EVAL(r$+"(xp%())"):CALLhisto%,xp%(1,0),vals%(0,0),sx%
46670NEXT
46680ELSE
46690ysamp%=1:FORyr%=0TOy%-1:SYShour%,yr%*100DIVy%
46700PROCscaledpixelrow(cl%()):CALLhisto%,cl%(1,0),vals%(0,0),x%
46710NEXT
46720ENDIF
46730IFinfo% PRINT"Done. Now processing the picture"
46740ENDIF
46750IFinput<400 THEN
46760FORC%=0TO255
46770IFr%(C%)<0 r%(C%)=0
46780IFg%(C%)<0 g%(C%)=0
46790IFb%(C%)<0 b%(C%)=0
46800IFr%(C%)>rmax r%(C%)=rmax
46810IFg%(C%)>gmax g%(C%)=gmax
46820IFb%(C%)>bmax b%(C%)=bmax
46830NEXT
46840ENDIF
46850IFhist% THEN
46860M%=0:ZM%=-1:FORC%=0TOcol
46870FORZ%=0TO256:IFvals%(Z%,C%)>M% M%=vals%(Z%,C%):ZM%=Z%
46880NEXT:NEXT
46890IFZM%=-1 OR okinfo%=0 THEN=100
46900IF col>0 THEN
46910MODE66:ht=500
46920IFMODE<>66 MODE16:ht=400
46930LINE0,6,2000,6
46940ELSE
46950MODE18:ht=400:LINE0,6,1024,6
46960ENDIF
46970M=M%/(ht*2-8):FORC%=0TOcol:CASE C% OF
46980WHEN 0:GCOL1
46990WHEN 1:GCOL2
47000WHEN 2:GCOL4
47010ENDCASE
47020IF col>0 THEN
47030FORZ%=0TO256:IFvals%(Z%,C%) X%=Z%*3+C%<<1:LINEX%,8,X%,vals%(Z%,C%)/M+8
47040NEXT
47050ELSE
47060FORZ%=0TO256:IFvals%(Z%,C%) X%=Z%<<2:RECTANGLE FILLX%,8,2,vals%(Z%,C%)/M
47070NEXT
47080ENDIF
47090NEXT
47100PROCclose:SYS"Hourglass_Off"
47110=100
47120ENDIF
47130IFm>=0 oname$="p"+STR$m+m$ ELSEoname$=m$
47140IFm=-6 ORm=-7 ORm=-8 oname$=pnm$
47150IFrange% oname$+="r"
47160IFequal% oname$+="e"
47170IFsharpen% oname$+="s"+STR$sharpen%
47180IFblack% oname$+="b"+STR$black%
47190IFgamma<>1 A%=@%:@%=&1020100:oname$+="g"+STR$gamma:@%=A%
47200IFbright%=16 oname$+="b"
47210xsp%=x%:ysp%=y%:IFrotate% SWAP xsp%,ysp%
47220CASE m OF
47230WHEN -1:xwords%=xsp%:sz%=xwords%*ysp%:Y%=ysp%
47240PROCgetoutput(sz%,0,xwords%,Y%):base%=ram%
47250WHEN -3,-5:xwords%=xsp%*2:sz%=xwords%*ysp%:Y%=ysp%
47260PROCgetoutput(sz%,0,xwords%,Y%):base%=ram%
47270WHEN -4:xwords%=xsp%*3:sz%=xwords%*ysp%:Y%=ysp%
47280PROCgetoutput(sz%,0,xwords%,Y%):base%=ram%
47290WHEN -6:xwords%=xsp%*2+3ANDNOT3:sz%=xwords%*ysp%:Y%=ysp%
47300A%=Y%:PROCgetoutput(sz%,64,xwords%,Y%)
47310ram%!4=0:ram%!8=16:ram%!12=16:SYS&2e,&109,ram%
47320SYS&2e,&10f,ram%,oname$,0,xsp%*2,Y%,28
47330base%=ram%+ram%!8:base%!(5*4)=A%-1:!base%=!base%-Y%*xwords%+A%*xwords%
47340ram%!12=ram%!12-Y%*xwords%+A%*xwords%
47350base%!(10*4)=5<<27 OR nx<<1 OR ny<<14 OR 1:base%+=base%!(8*4)
47360WHEN -7:xwords%=xsp%*3+3ANDNOT3:sz%=xwords%*ysp%:Y%=ysp%
47370A%=Y%:PROCgetoutput(sz%,64,xwords%,Y%)
47380ram%!4=0:ram%!8=16:ram%!12=16:SYS&2e,&109,ram%
47390SYS&2e,&10f,ram%,oname$,0,xsp%*3,Y%,28
47400base%=ram%+ram%!8:base%!(5*4)=A%-1:!base%=!base%-Y%*xwords%+A%*xwords%
47410ram%!12=ram%!12-Y%*xwords%+A%*xwords%
47420base%!(10*4)=panic<<27 OR nx<<1 OR ny<<14 OR 1:base%+=base%!(8*4)
47430no magic number yet for new format 24bpp sprites
47440WHEN -8:xwords%=xsp%*4:sz%=xwords%*ysp%:Y%=ysp%
47450A%=Y%:PROCgetoutput(sz%,64,xwords%,Y%)
47460ram%!4=0:ram%!8=16:ram%!12=16:SYS&2e,&109,ram%
47470SYS&2e,&10f,ram%,oname$,0,xsp%*4,Y%,28
47480base%=ram%+ram%!8:base%!(5*4)=A%-1:!base%=!base%-Y%*xwords%+A%*xwords%
47490ram%!12=ram%!12-Y%*xwords%+A%*xwords%
47500base%!(10*4)=6<<27 OR nx<<1 OR ny<<14 OR 1:base%+=base%!(8*4)
47510OTHERWISE:xwords%=xsp%/size%+3.9999ANDNOT3:sz%=xwords%*ysp%:X%=xsp%:Y%=ysp%
47520IFncol=1 THEN
47530CASE m$ OF
47540WHEN"C":!rowinc=xwords%:xwords%=xwords%*4:sz%=xwords%*ysp%:X%=xsp%*4:Y%=ysp%*4
47550WHEN"T":!rowinc=xwords%:xwords%=xwords%*3:sz%=xwords%*ysp%:X%=xsp%*4:Y%=ysp%*3
47560WHEN"D":!rowinc=xwords%:xwords%=xwords%*2:sz%=xwords%*ysp%:X%=xsp%*2:Y%=ysp%*2
47570ENDCASE
47580ENDIF
47590A%=Y%:PROCgetoutput(sz%,2048+64,xwords%,Y%)
47600ram%!4=0:ram%!8=16:ram%!12=16:SYS&2e,&109,ram%
47610SYS&2e,&10f,ram%,oname$,(ncol<63)AND1,X%,Y%,spm
47620base%=ram%+ram%!8:base%!(5*4)=A%-1:!base%=!base%-Y%*xwords%+A%*xwords%
47630ram%!12=ram%!12-Y%*xwords%+A%*xwords%
47640pal%=base%+11*4:base%+=base%!(8*4)
47650CASE ncol OF
47660WHEN 256
47670!(pal%-8)+=2048:!(pal%-12)+=2048:base%+=2048:!(ram%+12)+=2048:!(pal%-44)+=2048
47680FORZ%=0TO255:B%=Z%ORZ%<<8ORZ%<<16:B%=B%<<8
47690pal%!(Z%*8)=B%:pal%!(Z%*8+4)=B%:NEXT
47700WHEN 255
47710!(pal%-8)+=2048:!(pal%-12)+=2048:base%+=2048:!(ram%+12)+=2048:!(pal%-44)+=2048
47720FORZ%=0TO255:B%=palette%!(Z%<<2)<<8
47730pal%!(Z%*8)=B%:pal%!(Z%*8+4)=B%:NEXT
47740WHEN 15
47750CASE m$ OF
47760WHEN "R"
47770FORZ%=0TO15:PROCcol(Z%,palette%!(Z%<<2)AND&F0F0F0):NEXT
47780WHEN "D"
47790FORZ%=0TO7:A%=0:IFZ%AND1 A%+=&F0
47800IFZ%AND2 A%+=&F000
47810IFZ%AND4 A%+=&F00000
47820PROCcol(Z%,A%):NEXT
47830WHEN "T"
47840FORZ%=0TO15:A%=Z%<<4:PROCcol(Z%,A%ORA%<<8ORA%<<16):NEXT
47850OTHERWISE
47860FORZ%=0TO15:A%=(Z%AND7)/7*15+.2<<4:PROCcol(Z%,A%ORA%<<8ORA%<<16):NEXT
47870ENDCASE
47880WHEN 3
47890CASEm$ OF
47900WHEN "C"
47910PROCcol(0,0):PROCcol(1,&F0F000):PROCcol(2,&F000F0):PROCcol(3,&F0F0)
47920WHEN "R"
47930FORZ%=0TO3:PROCcol(Z%,palette%!(Z%<<2)AND&F0F0F0):NEXT
47940OTHERWISE
47950FORZ%=0TO3:A%=Z%*5<<4:PROCcol(Z%,A%ORA%<<8ORA%<<16):NEXT
47960ENDCASE
47970WHEN 1:PROCcol(0,0):PROCcol(1,&F0F0F0)
47980ENDCASE
47990ENDCASE
48010IFflex% THEN
48030ELSE
48040IFworkspace%<0 THEN
48050P%=END:[OPT 0:STR r13,P%+16:MOVS Pc,r14:]:CALLEND
48060END=END+32*1024+HIMEM-P%!16
48070ELSE
48090ENDIF
48100ENDIF
48110LOCAL ERROR
48120ON ERROR LOCAL:RESTORE ERROR:PROCSave:ERROR ERR,REPORT$+" internal ("+STR$ERL+")"
48130SYS"Hourglass_LEDs",3
48140ysamp%=1:nl%()=0:step%=4*(col+1)
48150addr%=base%*size%:rowstep%=xwords%*size%:colstep%=1:dist%=xsp%-1
48160IFm=-3ORm=-5ORm=-6 dist%=dist%*2
48170IFm=-4ORm=-7 dist%=dist%*3
48180IFm=-8 dist%=dist%*4
48190IFrotate% THEN
48200odist%=dist%:SWAP colstep%,rowstep%:SWAP hflip%,vflip%
48210IFrotate%=1 THEN
48220addr%+=(ysp%-1)*colstep%:colstep%=-colstep%:dist%=(ysp%-1)*colstep%
48230ELSE
48240addr%+=dist%:rowstep%=-rowstep%:dist%=(ysp%-1)*colstep%
48250ENDIF
48260IFm=-3ORm=-5ORm=-6 colstep%=colstep%/2:rowstep%=rowstep%*2
48270IFm=-4ORm=-7 colstep%=colstep%/3:rowstep%=rowstep%*3
48280IFm=-8 colstep%=colstep%/4:rowstep%=rowstep%*4
48290ENDIF
48300IFhflip% THEN
48310addr%+=dist%:dist%=-dist%:colstep%=-colstep%
48320ENDIF
48330IFvflip% THEN
48340IFrotate% THEN
48350addr%+=odist%*rotate%:rowstep%=-rowstep%
48360ELSE
48370addr%+=(ysp%-1)*rowstep%:rowstep%=-rowstep%
48380ENDIF
48390ENDIF
48400outlim%=(base%+xwords%*Y%)*size%-1:oddcolstep%=-colstep%:oddstep%=-step%
48410IForder% PROCadjustpalette(1/ydiv%/xdiv%,0)
48420IFsy%=y% AND sx%=x% AND range%=FALSE AND sharpen%=FALSE AND equal%=FALSE THEN
48430IFdither% THEN
48440FORyr%=0 TO y%-1:SYShour%,yr%*100DIVy%:IFaddr%>outlim% PROCflushoutput
48450W%=EVAL(r$+"(cl%())"):cl%()=cl%()+nl%():nl%()=0:B%=x%:A%=addr%:addr%+=rowstep%
48460IFyr%AND1 THEN
48470CALLfs%,colstep%,cl%(1,0),nl%(1,0),A%,step%,B%
48480ELSE
48490A%+=dist%:CALLfs%,oddcolstep%,cl%(x%,0),nl%(x%,0),A%,oddstep%,B%
48500ENDIF
48510NEXT
48520ELSE
48530I%=step%:FORyr%=0TOy%-1:SYShour%,yr%*100DIVy%:IFaddr%>outlim% PROCflushoutput
48540W%=EVAL(r$+"(cl%())"):B%=x%:A%=addr%:addr%+=rowstep%:CALLfs%,colstep%,cl%(1,0),I%,A%,I%,B%
48550NEXT
48560ENDIF
48570ELSE
48580IFequal% THEN
48590PROCrewind:Havg%=SUM(vals%())/256/(col+1):DIM new%(256,col)
48600FORB%=0TOcol:R%=0:Hint%=0:FORZ%=0TO256:L%=R%:Hint%+=vals%(Z%,B%)
48610WHILEHint%>Havg%:Hint%-=Havg%:R%+=1:ENDWHILE
48620new%(Z%,B%)=(L%+R%)/2*F/256
48630NEXT:NEXT
48640ENDIF
48650IFsharpen% THEN
48660IForder% THEN
48670yread%=sy%-1:W%=EVAL(r$+"(rm1%())"):IFequal% PROCfit2(rm1%())
48680FORB%=0TOcol:rm1%(0,B%)=rm1%(1,B%):rm1%(sx%+1,B%)=rm1%(sx%,B%):NEXT
48690ELSE
48700yread%=y%-1:PROCscaledpixelrow(rm1%()):IFequal% PROCfit(rm1%())
48710FORB%=0TOcol:rm1%(0,B%)=rm1%(1,B%):rm1%(x%+1,B%)=rm1%(x%,B%):NEXT
48720ENDIF
48730rm2%()=rm1%()
48740ENDIF
48750IForder% THEN
48760FORyr%=0 TO y%-1
48770SYShour%,yr%*100DIVy%:IFaddr%>outlim% PROCflushoutput
48780IFsy%=y% THEN
48790PROCsharppixelrow(cl%())
48800ELSE
48810ysamp%-=1:IFysamp%=0 PROCsharppixelrow(xl%()):ysamp%=ymul%
48820IFydiv%=1 THEN
48830cl%()=xl%()
48840ELSE
48850IFysamp%>=ydiv% THEN
48860ysamp%-=ydiv%:cl%()=xl%()*ydiv%
48870ELSE
48880cl%()=xl%()*ysamp%:Y%=ydiv%-ysamp%:ysamp%=0
48890REPEAT
48900IFysamp%=0 PROCsharppixelrow(xl%()):ysamp%=ymul%
48910IFysamp%>Y% THEN
48920ysamp%-=Y%:xl2%()=xl%()*Y%:cl%()=cl%()+xl2%():Y%=0
48930ELSE
48940Y%-=ysamp%:xl2%()=xl%()*ysamp%:cl%()=cl%()+xl2%():ysamp%=0
48950ENDIF
48960UNTIL Y%=0
48970ENDIF
48980ysamp%+=1
48990ENDIF
49000ENDIF
49010cl%()=cl%()+nl%():nl%()=0:B%=x%:A%=addr%:addr%+=rowstep%
49020IFyr%AND1 THEN
49030CALLfs%,colstep%,cl%(1,0),nl%(1,0),A%,step%,B%
49040ELSE
49050A%+=dist%:CALLfs%,oddcolstep%,cl%(x%,0),nl%(x%,0),A%,oddstep%,B%
49060ENDIF
49070NEXT
49080ELSE
49090FORyr%=0 TO y%-1
49100SYShour%,yr%*100DIVy%:IFaddr%>outlim% PROCflushoutput
49110IFsharpen% THEN
49120IFyread% yread%-=1:PROCscaledpixelrow(rm%()):IFequal% PROCfit(rm%())
49130FORB%=0TOcol:rm%(0,B%)=rm%(1,B%):rm%(x%+1,B%)=rm%(x%,B%):NEXT
49140CALL sharp%,cl%(1,0),rm%(1,0),rm1%(1,0),rm2%(1,0),totvals%
49150SWAP rm2%(),rm1%():rm1%()=rm%()
49160ELSE
49170PROCscaledpixelrow(cl%()):IFequal% PROCfit(cl%())
49180ENDIF
49190cl%()=cl%()+nl%():nl%()=0:B%=x%:A%=addr%:addr%+=rowstep%
49200IFyr%AND1 THEN
49210CALLfs%,colstep%,cl%(1,0),nl%(1,0),A%,step%,B%
49220ELSE
49230A%+=dist%:CALLfs%,oddcolstep%,cl%(x%,0),nl%(x%,0),A%,oddstep%,B%
49240ENDIF
49250NEXT
49260ENDIF
49270ENDIF
49280cputime%=TIME-cputime%
49290PROCSave
49300=0
49310DEF PROCsrchdevlist
49320[OPT Z
49350CMP R4,#F:MOVCS R4,#0:MOVGE R4,#F
49360MOV R0,R4,LSR #(bits-k%):CMP R0,#1<<k%:MOVCS R0,#(1<<k%)-1
49370CMP R5,#F:MOVCS R5,#0:MOVGE R5,#F
49380MOV R3,R5,LSR #(bits-k%):CMP R3,#1<<k%:MOVCS R3,#(1<<k%)-1:ORR R0,R0,R3,LSL #k%
49390CMP R6,#F:MOVCS R6,#0:MOVGE R6,#F
49400MOV R3,R6,LSR #(bits-k%):CMP R3,#1<<k%:MOVCS R3,#(1<<k%)-1:ORR R0,R0,R3,LSL #k%*2
49430STMFD SP !,{R8,R9,R10,R11}
49440LDR r3,ictloc
49450LDR r2,[r3,r0,LSL #2]
49470MOV r14,r2,lsr #24
49480CMP r14,#4
49490ADDCC r2,r3,r0,lsl #2
49500BICCS r2,r2,#&ff000000
49510LDRB r0,[r2],#1
49520SUBS r14,r14,#1
49530BEQ gotit
49550ADD r3,r0,r0,lsl #1
49560ADD r3,r7,r3,lsl #2
49570LDMIA r3,{r8,r9,r10}
49580SUBS r8,r8,r4
49590RSBMI r8,r8,#0
49600MOV r8,r8,lsr #bits/2
49610SUBS r9,r9,r5
49620RSBMI r9,r9,#0
49630MOV r9,r9,lsr #bits/2
49640SUBS r10,r10,r6
49650RSBMI r10,r10,#0
49660MOV r10,r10,lsr #bits/2
49670MUL r3,r8,r8
49680MUL r11,r9,r9
49690ADD r11,r11,r11,LSL #2
49700ADD r3,r3,r3,LSL #1
49710ADD r3,r3,r11,LSL #1
49720MLA r11,r10,r10,r3
49740.srchlist
49750LDRB r3,[r2],#1
49760ADD R8,R3,R3,LSL #1
49770ADD R8,R7,R8,LSL #2
49780LDMIA R8,{R8,R9,R10}
49790SUBS R9,R5,R9
49800RSBMI R9,R9,#0
49810MOV R3,R9,LSR #bits/2
49820MUL R9,R3,R3
49830ADD r9,r9,r9,LSL #2
49840CMP R11,R9,LSL #1
49850BCC srchquick
49860SUBS R8,R4,R8
49870RSBMI R8,R8,#0
49880MOV R3,R8,LSR #bits/2
49890MUL R8,r3,r3
49900ADD r8,r8,r8,LSL #1
49910ADD r8,r8,r9,LSL #1
49920SUBS R10,R6,R10
49930RSBMI R10,R10,#0
49940MOV R3,R10,LSR #bits/2
49950MLA R10,R3,R3,R8
49960CMP R10,R11
49970MOVCC R11,R10
49980LDRCCB R0,[r2,#-1]
49990.srchquick
50000SUBS R14,R14,#1
50010BNE srchlist
50020.gotit
50030ADD R3,R0,R0,LSL #1:ADD R3,R7,R3,LSL #2
50040LDMIA R3,{R8,R9,R10}
50050SUB R4,R4,R8:SUB R5,R5,R9:SUB R6,R6,R10
50060LDMFD r13!,{R8,R9,R10,R11}
50070]
50080ENDPROC
50090DEF PROCgetoutput(A%,E%,B%,RETURN C%)
50100IFA%>max% AND rotate%=FALSE AND vflip%=FALSE THEN
50110C%=max%DIVB%+1:A%=xwords%*C%+E%:first%=TRUE:o%=OPENOUTf$
50120ELSE
50130A%+=E%
50140ENDIF
50150IFspritearea%<0 THEN
50160ram%=FNcreatearea(A%):IFram%=-1 ram%=FNdim(A%)
50170ELSE
50180ram%=spritearea%
50190ENDIF
50200!ram%=A%
50210ENDPROC
50230DEF FNcreatearea(size%)
50240LOCAL ERROR
50250ON ERROR LOCAL:=-1
50260SYS &20066,0,-1,size%,-1,%10000000,size%,0,0,"ChangeFSI sprite" TO ,areanumber%,,areabase%;V%
50270IFV%AND1 THENareanumber%=0:=-1
50330SYS "OS_ReadDynamicArea",areanumber% TO ,areasize%
50340IF areasize%<size% PROCremovearea:ERROR 42,"Couldn't create area"
50350=areabase%
50370DEF PROCremovearea
50380IFareanumber% SYS "OS_DynamicArea",1,areanumber%:areanumber%=0
50390ENDPROC
50410DEF FNcachedim(size%)
50420LOCAL ERROR
50430ON ERROR LOCAL:VDU4,30:PRINTREPORT$:VDU5=-1
50440SYS &20066,0,-1,size%,-1,%10000000,size%,0,0,"ChangeFSI cache" TO ,cacheareanumber%,,cacheareabase%;V%
50450IFV%AND1 THENcacheareanumber%=0:=-1
50460SYS "OS_ReadDynamicArea",cacheareanumber% TO ,cacheareasize%
50470IF cacheareasize%<size% PROCremovecachearea:ERROR 42,"Couldn't create area"
50480=cacheareabase%
50500DEF PROCremovecachearea
50510IFcacheareanumber% SYS "OS_DynamicArea",1,cacheareanumber%:cacheareanumber%=0
50520ENDPROC
50540DEF PROCflushoutput
50550IFspritearea%<0 ANDoksave% THEN
50560A%=base%:IFfirst% A%=ram%+4:first%=FALSE
50570SYS12,2,o%,A%,addr%DIVsize%-A%
50580ENDIF
50590addr%=base%*size%
50600ENDPROC
50610DEF PROCclose
50620IFc% IFflag=3600 SYS"PhotoCD_Close",pcdh%,1
50630IFc% CLOSE#c%:c%=0:IFscrapf% scrapf%=FALSE:OSCLI"Remove <Wimp$Scrap>"
50640IFcc% CLOSE#cc%:cc%=0
50650IFccc% CLOSE#ccc%:ccc%=0
50660PROCremovecachearea
50670ENDPROC
50680DEF PROCSave
50690PROCclose
50700CASE m OF
50710WHEN -1:IFspritearea%<0 ANDoksave% THEN
50720IFo% PROCflushoutput ELSESYS"OS_File",10,f$,&004,,ram%,ram%+sz%
50730ENDIF
50740WHEN -2:o%=OPENOUTf$:BPUT#o%,pnm$
50750CASE pnm$ OF
50760WHEN "P1"
50770BPUT#o%,"# "+f$+".pbm (options "+oname$+")"
50780BPUT#o%,STR$xsp%+" "+STR$ysp%
50790FORY%=0TOysp%-1:B%=base%+Y%*xwords%
50800FORX%=0TOxsp%-1:IFB%?(X%>>3)AND(1<<(X%AND7)) BPUT#o%,"1"; ELSEBPUT#o%,"0";
50810NEXT
50820BPUT#o%,""
50830NEXT
50840WHEN "P4"
50850BPUT#o%,"# "+f$+".pbm (options "+oname$+") binary encoded"
50860BPUT#o%,STR$xsp%+" "+STR$ysp%
50870FORX%=0TO255:code%?X%=X%<<7 OR X%<<5AND&40 OR X%<<3AND&20 OR X%<<1AND&10 OR X%>>1AND8 OR X%>>3AND4 ORX%>>5AND2 ORX%>>7:NEXT
50880FORY%=0TOysp%-1:B%=base%+Y%*xwords%
50890FORX%=0TOxsp%-1STEP8:BPUT#o%,code%?(B%?(X%>>3)):NEXT
50900NEXT
50910WHEN "P2"
50920BPUT#o%,"# "+f$+".pgm (options "+oname$+")"
50930BPUT#o%,STR$xsp%+" "+STR$ysp%
50940BPUT#o%,"15"
50950FORY%=0TOysp%-1:B%=base%+Y%*xwords%
50960FORX%=0TOxsp%-1:C%=B%?(X%>>1):IFX%AND1 C%=C%>>4 ELSEC%=C%AND15
50970BPUT#o%," "+STR$C%;
50980NEXT
50990BPUT#o%,""
51000NEXT
51010WHEN "P5"
51020BPUT#o%,"# "+f$+".pgm (options "+oname$+") binary encoded"
51030BPUT#o%,STR$xsp%+" "+STR$ysp%
51040BPUT#o%,"15"
51050FORY%=0TOysp%-1:B%=base%+Y%*xwords%
51060FORX%=0TOxsp%-1:C%=B%?(X%>>1):IFX%AND1 C%=C%>>4 ELSEC%=C%AND15
51070BPUT#o%,C%
51080NEXT
51090NEXT
51100ENDCASE
51110CLOSE#o%:o%=0
51120IFpnm$="P2"ORpnm$="P1" OSCLI"Settype "+f$+" &FFF"
51130WHEN -3:o%=OPENOUTf$:BPUT#o%,pnm$
51140BPUT#o%,"# "+f$+".pcm (options "+oname$+") binary encoded 15bpp (5bits r,g,b)"
51150BPUT#o%,STR$xsp%+" "+STR$ysp%
51160BPUT#o%,"31"
51170SYS12,2,o%,ram%,xsp%*ysp%*2
51180CLOSE#o%:o%=0
51190WHEN -4:o%=OPENOUTf$:IFpnm$="IRLAM"THEN
51200BPUT#o%,"Irlam 24: "+STR$xsp%+" "+STR$ysp%
51210FORY%=0TOysp%-1:B%=ram%+Y%*xwords%
51220FORX%=0TOxsp%*3-1STEP3:BPUT#o%,B%?X%:NEXT
51230B%+=1:FORX%=0TOxsp%*3-1STEP3:BPUT#o%,B%?X%:NEXT
51240B%+=1:FORX%=0TOxsp%*3-1STEP3:BPUT#o%,B%?X%:NEXT
51250NEXT
51260ELSE
51270BPUT#o%,pnm$
51280IFpnm$="P6" THEN
51290BPUT#o%,"# "+f$+".ppm (options "+oname$+") binary encoded 24bpp r,g,b"
51300ELSE
51310BPUT#o%,"# "+f$+".ppm (options "+oname$+") "+STR$(p6bits*3)+"bpp r,g,b"
51320ENDIF
51330BPUT#o%,STR$xsp%+" "+STR$ysp%
51340BPUT#o%,STR$(2^p6bits-1)
51350IFpnm$="P6" THEN
51360SYS12,2,o%,ram%,xsp%*ysp%*3
51370ELSE
51380FORY%=0TOysp%-1:B%=ram%+Y%*xwords%
51390FORX%=0TOxsp%-1:C%=B%!(X%*3):BPUT#o%," "+STR$(C%AND255)+" "+STR$((C%>>8)AND&FF)+" "+STR$((C%>>16)AND255);
51400NEXT
51410BPUT#o%,""
51420NEXT
51430ENDIF
51440ENDIF
51450CLOSE#o%:o%=0
51460IFpnm$="P3" OSCLI"Settype "+f$+" &FFF"
51470WHEN -5:o%=OPENOUTf$:BPUT#o%,pnm$
51480BPUT#o%,"# "+f$+".pcm (options "+oname$+") binary encoded 15bpp (5bits y,u,v)"
51490BPUT#o%,STR$xsp%+" "+STR$ysp%
51500BPUT#o%,"31 27 21"
51510SYS12,2,o%,ram%,xsp%*ysp%*2
51520CLOSE#o%:o%=0
51530OTHERWISE
51540IFncol=1ANDm$="T" THEN
51550FORX%=(xsp%*4-1)DIV8*8+6TO6STEP-8
51560SYS&2e,&12e,ram%,oname$,X%
51570SYS&2e,&12e,ram%,oname$,X%
51580NEXT
51590ENDIF
51600IFspritearea%<0 ANDoksave% THEN
51610IFo% PROCflushoutput ELSESYS&2e,&10c,ram%,f$
51620ENDIF
51630ENDCASE
51640IFo% CLOSE#o%:o%=0:OSCLI"settype "+f$+" &ff9":PROCremovearea
51650SYS"Hourglass_Off"
51660ENDPROC
51670DEFPROCdefpal
51680FORC%=0TO255
51690r%(C%)=(C%AND7 OR (C%AND16)>>1)/15*F
51700g%(C%)=(C%AND3 OR (C%AND&60)>>3)/15*F
51710b%(C%)=(C%AND3 OR (C%AND8)>>1 OR (C%AND128)>>4)/15*F
51720NEXT
51730ENDPROC
51740DEFPROCdefpal2
51750r%(0)=F:g%(0)=F:b%(0)=F
51760ENDPROC
51770DEFPROCdefpal4
51780r%()=15,10,5,0:FORC%=0TO3:r%(C%)=r%(C%)/15*F:NEXT
51790g%()=r%():b%()=r%()
51800ENDPROC
51810DEFPROCdefpal16
51820r%()=15,13,11,9,7,5,3,0,0,14, 0,13,14,5,15, 0
51830g%()=15,13,11,9,7,5,3,0,4,14,12, 0,14,8,11,10
51840b%()=15,13,11,9,7,5,3,0,9, 0, 0, 0,11,0, 0,15
51850FORC%=0TO15:r%(C%)=r%(C%)/15*F:g%(C%)=g%(C%)/15*F:b%(C%)=b%(C%)/15*F:NEXT
51860ENDPROC
51870DEFPROCipal63
51880PTR#c%=&38:DIM rpal%(15),gpal%(15),bpal%(15)
51890FORC%=0TO15:D%=BGET#c%
51900rpal%(C%)=BGET#c%>>4 AND 7
51910gpal%(C%)=BGET#c%>>4 AND 3
51920bpal%(C%)=BGET#c%>>4 AND 7
51930D%=FNW:NEXT
51940FORC%=0TO255
51950r%(C%)=(rpal%(C%AND15)OR(C%AND16)>>1)/15*F
51960g%(C%)=(gpal%(C%AND15)OR(C%AND&60)>>3)/15*F
51970b%(C%)=(bpal%(C%AND15)OR(C%AND128)>>4)/15*F
51980NEXT
51990ENDPROC
52000DEFPROCipal(D%)
52010PTR#c%=&38
52020FORC%=0TOD%-1:D%=BGET#c%
52030r%(C%)=(BGET#c%>>4)/15*F
52040g%(C%)=(BGET#c%>>4)/15*F
52050b%(C%)=(BGET#c%>>4)/15*F
52060D%=FNW:NEXT
52070ENDPROC
52080DEF PROCnewropal(D%)
52090PTR#c%=&38
52100FORC%=0TOD%-1:D%=FNW
52110r%(C%)=(D%AND255)/255*F
52120g%(C%)=(D%>>8AND255)/255*F
52130b%(C%)=(D%>>16AND255)/255*F
52140D%=FNW:NEXT
52150ENDPROC
52160DEF PROCnopal
52170FORC%=0TO255:r%(C%)=C%/255*F:NEXT:g%()=r%():b%()=r%()
52180ENDPROC
52190DEF PROCcol(A%,B%)
52200B%=B%<<8ORB%<<4OR&10:pal%!(A%*8)=B%:pal%!(A%*8+4)=B%
52210ENDPROC
52220DEF FNbits(A%)
52230IFA%=1 THEN="1 bit per pixel" ELSE=STR$A%+" bits per pixel"
52240DEF FNfits
52250LOCALZ%,s$
52260FORZ%=1TO80:s$+=CHR$BGET#c%:NEXT
52270=s$
52280DEF FNuc(a$)
52290LOCALZ%,z$,b$
52300FORZ%=1TOLENa$
52310z$=MID$(a$,Z%,1)
52320IFz$>="a"IFz$<="z" z$=CHR$(ASCz$-32)
52330b$+=z$:NEXT
52340=b$
52350DEF FNdim(A%)
52360LOCAL B%
52370IFflex% THEN
52380B%=nextlocation%:A%=A%+3ANDNOT3:nextlocation%+=A%
52390SYS"Wimp_SlotSize",-1,-1 TO currentslot%
52400IFcurrentslot%+&8000<nextlocation% THEN
52410SYS "Wimp_SlotSize",nextlocation%-&8000,-1 TO currentslot%
52420IFcurrentslot%+&8000<nextlocation% ERROR 42,"Can't get enough memory to process image"
52430ENDIF
52440ELSE
52450IFworkspace%<0 THEN
52460DIM B% A%
52470ELSE
52480B%=workspace%:workspace%+=A%+3ANDNOT3:IFworkspace%>worklimit% ERROR42,"Not enough workspace"
52490ENDIF
52500ENDIF
52510=B%
52530DEF FNW=FNW1(c%)
52540DEF FNW1(c%)=BGET#c% OR BGET#c%<<8 OR BGET#c%<<16 OR BGET#c%<<24
52560DEF FNHW=BGET#c% OR BGET#c%<<8
52580DEF FNbeHW=BGET#c%<<8 OR BGET#c%
52600DEF FNbeW=BGET#c%<<24 OR BGET#c%<<16 OR BGET#c%<<8 OR BGET#c%
52620DEF FNtiff(T%)
52630CASE T% OF
52640WHEN 1,7:=BGET#c%
52650WHEN 2:LOCALs$,t$:REPEATs$+=t$:t$=CHR$BGET#c%:UNTILt$=CHR$0:=s$
52660WHEN 3:IFbigendian THEN=BGET#c%<<8 OR BGET#c% ELSE=BGET#c% OR BGET#c%<<8
52670WHEN 4,9:IFbigendian THEN=FNbeW ELSE=FNW1(c%)
52680WHEN 6:=(BGET#c%<<24)>>24
52690WHEN 8:=(FNtiff(3)<<16)>>16
52700ENDCASE
52710ERROR 42,"Silly TIFF tag:"+STR$T%
52720DEF PROCnextstrip
52730rowstogo%=striprows%
52740stripptr+=1:PTR#c%=st%(stripptr)
52750IFcompression=5 THEN
52760!firstcode=0:!oldcode=0:!codesize=setcodes%+1:!stack=stk%:!sp=stk%
52770!maxcode=clearcode%+2:!maxcodesize=2*clearcode%:!curbit=0:!lastbit=0
52780ENDIF
52790IFcompression=5 OR compression=32773 THEN
52800!incacheptr=datacache%:!numlefttogo=cache%
52810SYS12,4,c%,datacache%,cache%
52820ENDIF
52830ENDPROC
52840DEF PROCwatford(wtsx%,RETURN rep%,RETURN wt%,X%,c%)
52850CALLrlexpand%,wtsx%,rep%,wt%,X%
52860REPEAT C%=BGET#c%:CASE C%>>6 OF
52870WHEN 0:?X%=C%:X%+=1:wt%=C%
52880WHEN 1:wt%-=1:rep%=C%AND63:CALLrlexpand%,wtsx%,rep%,wt%,X%
52890WHEN 2:rep%=C%AND63:CALLrlexpand%,wtsx%,rep%,wt%,X%
52900WHEN 3:wt%+=1:rep%=C%AND63:CALLrlexpand%,wtsx%,rep%,wt%,X%
52910ENDCASE
52920UNTILX%=wtsx%
52930ENDPROC
52940DEF PROCwatfordcache(wtsx%,RETURN rep%,RETURN wt%,X%)
52950CALLrlexpand%,wtsx%,rep%,wt%,X%
52960REPEAT C%=USRbytefromcache%:CASE C%>>6 OF
52970WHEN 0:?X%=C%:X%+=1:wt%=C%
52980WHEN 1:wt%-=1:rep%=C%AND63:CALLrlexpand%,wtsx%,rep%,wt%,X%
52990WHEN 2:rep%=C%AND63:CALLrlexpand%,wtsx%,rep%,wt%,X%
53000WHEN 3:wt%+=1:rep%=C%AND63:CALLrlexpand%,wtsx%,rep%,wt%,X%
53010ENDCASE
53020UNTILX%=wtsx%
53030ENDPROC
53040DEF PROCreduce(RETURN A%,RETURN B%)
53050LOCAL C%,D%:C%=A%:D%=B%
53060REPEAT IFC%<D% SWAP C%,D%
53070C%=C%MODD%
53080UNTILC%=0
53090A%=A%DIVD%:B%=B%DIVD%
53100ENDPROC
53110DEF PROCreadpixelrow(z%())
53120IFrows% THEN
53130rows%-=1:IFsx%=x% THEN
53140W%=EVAL(r$+"(z%())")
53150ELSE
53160W%=EVAL(r$+"(xp%())"):CALLxsample%,xmul%,xdiv%,z%(1,0),xp%(1,0),x%
53170ENDIF
53180ELSE
53190z%()=0
53200ENDIF
53210ENDPROC
53220DEF PROCsharppixelrow(z%())
53230IFrows% THEN
53240rows%-=1:IFsx%=x% THEN
53250IFsharpen% PROCsharp(z%()) ELSEW%=EVAL(r$+"(z%())"):IFequal% PROCfit2(z%())
53260ELSE
53270IFsharpen% PROCsharp(xp%()) ELSEW%=EVAL(r$+"(xp%())"):IFequal% PROCfit2(xp%())
53280CALLxsample%,xmul%,xdiv%,z%(1,0),xp%(1,0),x%
53290ENDIF
53300ELSE
53310z%()=0
53320ENDIF
53330ENDPROC
53340DEF PROCsharp(z%())
53350yread%-=1:IFyread% W%=EVAL(r$+"(rm%())"):IFequal% PROCfit2(rm%())
53360FORB%=0TOcol:rm%(0,B%)=rm%(1,B%):rm%(sx%+1,B%)=rm%(sx%,B%):NEXT
53370CALL sharp%,z%(1,0),rm%(1,0),rm1%(1,0),rm2%(1,0),totvals2%
53380SWAP rm2%(),rm1%():rm1%()=rm%()
53390ENDPROC
53400DEF PROCscaledpixelrow(z%())
53410IFsy%=y% THEN
53420PROCreadpixelrow(z%())
53430ELSE
53440ysamp%-=1:IFysamp%=0 PROCreadpixelrow(xl%()):ysamp%=ymul%
53450IFydiv%=1 THEN
53460z%()=xl%()
53470ELSE
53480IFysamp%>=ydiv% THEN
53490ysamp%-=ydiv%:z%()=xl%()*ydiv%
53500ELSE
53510LOCALY%:z%()=xl%()*ysamp%:Y%=ydiv%-ysamp%:ysamp%=0
53520REPEAT
53530IFysamp%=0 PROCreadpixelrow(xl%()):ysamp%=ymul%
53540IFysamp%>Y% THEN
53550ysamp%-=Y%:xl2%()=xl%()*Y%:z%()=z%()+xl2%():Y%=0
53560ELSE
53570Y%-=ysamp%:xl2%()=xl%()*ysamp%:z%()=z%()+xl2%():ysamp%=0
53580ENDIF
53590UNTIL Y%=0
53600ENDIF
53610ysamp%+=1
53620ENDIF
53630ENDIF
53640ENDPROC
53650DEF PROCfit(z%())
53660CALLhistequal%,z%(1,0),new%(0,0),x%
53670ENDPROC
53680DEF PROCfit2(z%())
53690CALLhistequal%,z%(1,0),new%(0,0),sx%
53700ENDPROC
53710DEF PROCadjustpalette(mul,sub)
53720IFmul=1 AND sub=0 ENDPROC
53730FORC%=0TO255
53740r%(C%)=(r%(C%)-sub)*mul+1:g%(C%)=(g%(C%)-sub)*mul+1:b%(C%)=(b%(C%)-sub)*mul+1
53750NEXT
53760IFham THEN
53770FORC%=0TO15*4STEP4:ltable!C%=(ltable!C%-sub)*mul+1:NEXT
53780ENDIF
53790IFinput>400 THEN
53800FORC%=0TO255
53810rpal%(C%)=(rpal%(C%)-sub)*mul+1:gpal%(C%)=(gpal%(C%)-sub)*mul+1
53820bpal%(C%)=(bpal%(C%)-sub)*mul+1:table%(C%)=(table%(C%)-sub)*mul+1
53830NEXT
53840ENDIF
53850ENDPROC
53860DEF PROCcachesize(A%)
53870SYS&20023,"ChangeFSI$Cache",A%,-1 TO,,Z
53880IFZ<>0 THEN
53890SYS35,"ChangeFSI$Cache",A%,20 TO,,Z:A%?Z=13:cache%=VAL$A%
53900IFINSTR($A%,"K")ORINSTR($A%,"k") cache%=cache%*1024
53910ELSE
53920cache%=128*1024
53930ENDIF
53940ENDPROC
53950DEF PROCrefill
53960IFstriprows%>0 PROCnextstrip
53970SYS12,4,c%,datacache%,cache%:rowstogo%=cacherows%:buff%=datacache%
53980IFinput=24 IFrbo%>=0 rb%=buff%+rbo%:gb%=buff%+gbo%:bb%=buff%+bbo%
53990ENDPROC
54000DEF PROCrefillpcd
54010IFpcdblk%!4>=sy% ENDPROC
54020IFpcdblk%!12>=sy% pcdblk%!12=sy%
54040SYS"PhotoCD_GetBlock",pcdh%,,pcdblk%,datacache%,pcdindex%,,,pcdcache%,pcdcachesize%
54050rowstogo%=cacherows%:buff%=datacache%:pcdblk%!4+=cacherows%:pcdblk%!12+=cacherows%
54060rb%=buff%+rbo%:gb%=buff%+gbo%:bb%=buff%+bbo%
54070ENDPROC
54090DEF FN8(z%())
54100CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%:buff%+=rowbytes%
54110rowstogo%-=1:IFrowstogo%=0 PROCrefill
54120=TRUE
54140DEF FN16(z%())
54150CALLmappix%,z%(1,0),rpal%(0),gpal%(0),r%(0),g%(0),b%(0),buff%,buff%
54160buff%+=rowbytes%:rowstogo%-=1:IFrowstogo%=0 PROCrefill
54170=TRUE
54190DEF FN24(z%())
54200CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%
54210rb%+=rowbytes%:gb%+=rowbytes%:bb%+=rowbytes%
54220rowstogo%-=1:IFrowstogo%=0 PROCrefill
54230=TRUE
54250DEF FN300(z%())
54260SYS12,4,cc%,pbuff%,sx%:CALLmappix%,z%(1,0),rpal%(0),gpal%(0),r%(0),g%(0),b%(0),pbuff%,buff%
54270buff%+=rowbytes%:rowstogo%-=1:IFrowstogo%=0 PROCrefill
54280=TRUE
54300DEF FN400(z%())
54310CALLreadline%,plbytes%,rep%,pix%,plbuff%
54320CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%
54330=TRUE
54350DEF FN500(z%())
54360CALL LZWdecode%,table%(0),c%,plbuff%,sx%
54370CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),plbuff%
54380=TRUE
54400DEF FN800(z%())
54410PROCwatfordcache(wtsx%,rep%,wt%,plbuff%)
54420CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),plbuff%
54430=TRUE
54450DEF FN801(z%())
54460PROCwatford(wtsx1%,rep1%,wt1%,buff%,c%)
54470PROCwatford(wtsx2%,rep2%,wt2%,wtsx1%,cc%)
54480PROCwatford(wtsx3%,rep3%,wt3%,wtsx2%,ccc%)
54490CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%
54500=TRUE
54520DEF FN901(z%())
54530SYS12,4,c%,rb%,sx%:SYS12,4,cc%,gb%,sx%:SYS12,4,ccc%,bb%,sx%
54540CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%
54550=TRUE
54570DEF FN902(z%())
54580CALLunpack%,buff%:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%
54590buff%+=rowbytes%:rowstogo%-=1:IFrowstogo%=0 PROCrefill
54600=TRUE
54620DEF FN1000(z%())
54630X%=buff%:IFrep%>0 C%=?pa%:CALLrlexpand%,pasx%,rep%,C%,X%:pa%+=1
54640IFrep2%>0 C%=?pa%:CALLrlexpand%,pasx%,rep2%,C%,X%:pa%+=1
54650REPEAT C%=BGET#c%:IFC%=0 THEN
54660rep%=BGET#c%:C%=?pa%:CALLrlexpand%,pasx%,rep%,C%,X%:IFrep%=0 pa%+=1
54670ELSE
54680rep2%=C%AND15:rep%=C%>>4:IFrep% C%=?pa%:CALLrlexpand%,pasx%,rep%,C%,X%:IFrep%=0 pa%+=1
54690IFX%<pasx% IFrep2% C%=?pa%:CALLrlexpand%,pasx%,rep2%,C%,X%:IFrep2%=0 pa%+=1
54700ENDIF
54710UNTILX%=pasx%
54720CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%
54730=TRUE
54750DEF FN1001(z%())
54760X%=buff%:IFrep%>0 C%=?pa%:CALLrlexpand%,pasx%,rep%,C%,X%:pa%+=1
54770REPEAT rep%=BGET#c%:C%=?pa%:CALLrlexpand%,pasx%,rep%,C%,X%:IFrep%=0 pa%+=1
54780UNTILX%=pasx%:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%
54790=TRUE
54810DEF FN1100(z%())
54820CALLreadline%,plbytes%,rep%,pix%,plbuff%
54830CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),plbuff%
54840=TRUE
54860DEF FN1400(z%())
54870IFvrep% THEN
54880vrep%-=1
54890ELSE
54900G%=buff%:FORX%=1TOplanes%:G%+=rowbytes%:F%=G%-rowbytes%
54910REPEAT C%=BGET#c%:IFC%=0 THEN
54920C%=BGET#c%:IFC%=0 THEN
54930C%=BGET#c%:vrep%=BGET#c%-1
54940ELSE
54950D%=F%:SYS12,4,c%,F%,patlen%:F%+=patlen%
54960IFC%>1 FORN%=2TOC%:FORE%=0TOpatlen%-1:F%?E%=D%?E%:NEXT:F%+=patlen%:NEXT
54970ENDIF
54980ELSE
54990IFC%=128 THEN
55000C%=BGET#c%:SYS12,4,c%,F%,C%:F%+=C%
55010ELSE
55020?F%=(C%AND&80)<>0:FORE%=F%+1TOF%+(C%AND&7F):?E%=?F%:NEXT:F%+=C%AND&7F
55030ENDIF
55040ENDIF:UNTILF%>=G%:NEXT
55050CALLplancnv%,rowbytes%,buff%,pbuff%
55060ENDIF
55070CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),pbuff%
55080=TRUE
55100DEF FN1501(z%())
55110CALLreadiff%,rowbytes%,plbuff%:rowstogo%-=1:IFrowstogo%=0 PROCnextstrip
55120CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),plbuff%
55130=TRUE
55150DEF FN1505(z%())
55160CALL LZWdecode%,table%(0),c%,plbuff%,rowbytes%
55170rowstogo%-=1:IFrowstogo%=0 PROCnextstrip
55180CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),plbuff%
55190=TRUE
55210DEF FN1515(z%())
55220CALL LZWdecode%,table%(0),c%,plbuff%,rowbytes%
55230rowstogo%-=1:IFrowstogo%=0 PROCnextstrip
55240CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%
55250=TRUE
55270DEF FN1600(z%())
55280CALLplancnv%,realrowbytes%,buff%,pbuff%:buff%+=rowbytes%
55290CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),pbuff%
55300rowstogo%-=1:IFrowstogo%=0 PROCrefill
55310=TRUE
55330DEF FN1601(z%())
55340FORX%=0TOplanes%-1:F%=plbuff%+X%*rowbytes%:CALLreadiff%,rowbytes%,F%:NEXT
55350IFmasking% CALLreadiff%,rowbytes%,pbuff%
55360CALLplancnv%,rowbytes%,plbuff%,pbuff%
55370CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),pbuff%
55380=TRUE
55400DEF FN1850(z%())
55410CALLreadiff%,rowbytes%,plbuff%
55420CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),plbuff%
55430=TRUE
55450DEF FN1851(z%())
55460CALLreadiff%,rowbytes%,plbuff%
55470CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%
55480=TRUE
55500DEF FN1900(z%())
55510CALLreadline%,plbytes%,rep%,pix%,plbuff%
55520CALLplancnv%,rowbytes%,plbuff%,pbuff%
55530CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),pbuff%
55540=TRUE
55560DEF FN2000(z%())
55570X%=buff%:REPEAT
55580C%=BGET#c%:IFC%<128 THEN
55590C%+=1:SYS12,4,c%,X%,C%:X%+=C%
55600ELSE
55610F%=X%:?F%=BGET#c%:FORC%=C%TO128STEP-1:?X%=?F%:X%+=1:NEXT
55620ENDIF
55630UNTILX%=buff%+rowbytes%
55640CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%
55650=TRUE
55670DEF FN2001(z%())
55680X%=buff%:REPEAT
55690C%=BGET#c%:IFC%<128 THEN
55700C%=(C%+1)*2:SYS12,4,c%,X%,C%:X%+=C%
55710ELSE
55720F%=X%:SYS12,4,c%,X%,2:FORC%=C%TO128STEP-1:!X%=!F%:X%+=2:NEXT
55730ENDIF
55740UNTILX%=buff%+rowbytes%
55750CALLmappix%,z%(1,0),rpal%(0),gpal%(0),r%(0),g%(0),b%(0),buff%,buff%
55760=TRUE
55780DEF FN2002(z%())
55790X%=buff%:REPEAT
55800C%=BGET#c%:IFC%<128 THEN
55810C%=(C%+1)*step24:SYS12,4,c%,X%,C%:X%+=C%
55820ELSE
55830F%=X%:SYS12,4,c%,X%,step24:FORC%=C%TO128STEP-1:!X%=!F%:X%+=step24:NEXT
55840ENDIF
55850UNTILX%=buff%+rowbytes%
55860CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%
55870=TRUE
55890DEF FN2250(z%())
55900CALLmappix%,z%(1,0),rpal%(0),r%(0),gpal%(0),g%(0),bpal%(0),b%(0),table%(0),buff%
55910buff%+=rowbytes%:rowstogo%-=1:IFrowstogo%=0 PROCrefill
55920=TRUE
55940DEF FN2300(z%())
55950IFclrfirst% FORX%=0TOsx%-1:rb%?X%=?back%:gb%?X%=back%?1:bb%?X%=back%?2:NEXT
55960IFvrep% THEN
55970vrep%-=1
55980ELSE
55990LOCAL ERROR
56000ON ERROR LOCAL vrep%=-1:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%:=TRUE
56010E%=FALSE:REPEAT C%=BGET#c%:D%=BGET#c%:IFC%AND&40 D%=FNHW
56020CASE C%AND&3f OF
56030WHEN 1:E%=TRUE:vrep%=D%-1:IFvrep%<0 vrep%=FALSE
56040WHEN 2:ccol%=back%?D%:cbuf%=rb%+sx%*D%:IFD%=255 cbuf%=alpha%
56050WHEN 3:FORX%=0TOD%-1:cbuf%?X%=ccol%:NEXT:cbuf%+=D%
56060WHEN 5:SYS12,4,c%,cbuf%,D%+1:cbuf%+=D%+1:IFD%+1AND1 IFBGET#c%
56070WHEN 6:C%=FNHW:FORX%=0TOD%:cbuf%?X%=C%:NEXT:cbuf%+=D%+1
56080ENDCASE
56090UNTILE%
56100ENDIF
56110CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%
56120=TRUE
56140DEF FN3000(z%())
56150CALLmappix%,z%(1,0),rpal%(0),r%(0),gpal%(0),g%(0),bpal%(0),b%(0),table%(0),buff%
56160buff%+=rowbytes%:rowstogo%-=1:IFrowstogo%=0 PROCrefill
56170=TRUE
56180DEF FN3500(z%())
56190=TRUE
56200DEF FN3600(z%())
56210CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%
56220rb%+=rowbytes%:gb%+=rowbytes%:bb%+=rowbytes%
56230rowstogo%-=1:IFrowstogo%=0 PROCrefillpcd
56240=TRUE
56250DEF FN3708(z%())
56260A%=jpegspace%:jpegy%-=1:B%=jpegy%:rb%=USR(jpeg%+4)
56270CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%
56280=TRUE
56290DEF FN3724(z%())
56300A%=jpegspace%:jpegy%-=1:B%=jpegy%:rb%=USR(jpeg%+4):gb%=rb%+1:bb%=rb%+2
56310CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%
56320=TRUE
56330DEF PROCrewind
56340rows%=sy%:CASE flag OF
56350WHEN 0:PTR#c%=st%
56360WHEN 100:PTR#c%=4
56370WHEN 200:PTR#c%=st%:rep%=0
56380WHEN 300:PTR#c%=st%:PTR#cc%=stcc%
56390WHEN 400:PTR#c%=st%:rep%=0
56400WHEN 500:FORI%=0TOclearcode%-1:table%(I%)=I%:NEXT:PTR#c%=st%
56410!firstcode=0:!oldcode=0:!codesize=setcodes%+1:!stack=stk%:!sp=stk%
56420!maxcode=clearcode%+2:!maxcodesize=2*clearcode%:!curbit=0:!lastbit=0
56430WHEN 501:buff%=datacache%
56440WHEN 600:PTR#c%=&380
56450WHEN 700:PTR#c%=st%
56460WHEN 800:PTR#c%=0:rep%=0:wt%=0
56470WHEN 801:PTR#c%=0:PTR#cc%=0:PTR#ccc%=0:rep1%=0:wt1%=0:rep2%=0:wt2%=0:rep3%=0:wt3%=0
56480WHEN 900:PTR#c%=0
56490WHEN 901:PTR#c%=0:PTR#cc%=0:PTR#ccc%=0
56500WHEN 902:PTR#c%=st%
56510WHEN 1000:PTR#c%=st%:pa%=ctable%:rep%=0:rep2%=0
56520WHEN 1100:PTR#c%=st%:rep%=0
56530WHEN 1200:PTR#c%=1600
56540WHEN 1300:PTR#c%=0
56550WHEN 1301:PTR#c%=0:PTR#cc%=0:PTR#ccc%=0
56560WHEN 1400:PTR#c%=st%:vrep%=0
56570WHEN 1500:PTR#c%=st%(0):rowstogo%=striprows%:stripptr=0
56580IFcompression=5 THEN
56590!firstcode=0:!oldcode=0:!codesize=setcodes%+1:!stack=stk%:!sp=stk%
56600!maxcode=clearcode%+2:!maxcodesize=2*clearcode%:!curbit=0:!lastbit=0
56610ENDIF
56620WHEN 1600:PTR#c%=st%
56630WHEN 1700:PTR#c%=16
56640WHEN 1800,1850:PTR#c%=st%
56650WHEN 1900:PTR#c%=128:rep%=-1
56660WHEN 2000:PTR#c%=st%
56670WHEN 2100:PTR#c%=7
56680WHEN 2200:PTR#c%=st%
56690WHEN 2250:PTR#c%=st%
56700WHEN 2300:PTR#c%=st%:vrep%=0
56710WHEN 2400:PTR#c%=st%
56720WHEN 2500:PTR#c%=st%
56730WHEN 2600:PTR#c%=st%
56740WHEN 2700:PTR#c%=st%
56750WHEN 2800:PTR#c%=st%
56760WHEN 2900:PTR#c%=st%
56770WHEN 3000:PTR#c%=0
56780WHEN 3600:pcdblk%!4=0
56790WHEN 3700:jpegy%=sy%
56800ENDCASE
56810IFcache% THEN
56820IFflag=3600 THEN
56830pcdblk%!4=0:PROCrefillpcd
56840ELSE
56850IFcache%<filesize% SYS12,4,c%,datacache%,cache%:rowstogo%=cacherows%
56860ENDIF
56870buff%=datacache%
56880IFcachebytes% !incacheptr=datacache%:!numlefttogo=cache%
56890IFinput=24 IFrbo%>=0 rb%=buff%+rbo%:gb%=buff%+gbo%:bb%=buff%+bbo%
56900ENDIF
56910IFflag=1500 IFcompression=5 rowstogo%=striprows%
56920ENDPROC
� > ChangeFSI
�,� �ChangeFSIVersion="0.95 (17th Feb 94)"
�areanumber%=0
�ș"OS_GetEnv" � A$
��A$," -wimp") �
�� z%(1),p%(2),s%(3),m$(21)
�"A%=�"<ChangeFSI$Dir>.Messages"
�(B%=-1:� B%+=1:m$(B%)=�#A%:��#A%:�#A%
�startfile%=�A$,6)<>"-wimp "
�� taskid%4:$taskid%="TASK"
�7ș "Wimp_Initialise",200,!taskid%,m$(20) � version%
�Wimp = (1<<18) + (3<<6)
�%CreateW = Wimp+1:OpenW = Wimp+5
�%CloseW = Wimp+6:RedrawW = Wimp+8
&UpdateW = Wimp+9:GetR% = Wimp+10
&GetW = Wimp+11:SetI = Wimp+13
&GetI = Wimp+14:GetP = Wimp+15
"&Drag = Wimp+16:CrMenu = Wimp+20
,DcMenu = Wimp+21
68ș "OS_SWINumberFromString",,"Wimp_PollIdle" � Poll%
@6ș "OS_SWINumberFromString",,"OS_SpriteOp" � spop%
J?ș "OS_SWINumberFromString",,"OS_ReadMonotonicTime" � Time%
TJș "OS_SWINumberFromString",,"ColourTrans_ReturnColourNumber" � ctran%
^Sș "XOS_SWINumberFromString",,"DragASprite_Start" � dstart%;f%:�f%� 1 dstart%=0
h5ș "OS_Byte",161,&1C � ,,f%:�(f% � 2)=0 dstart%=0
rnextlocation%=�
|,ș "Wimp_SlotSize",-1,-1 � originalslot%
�� version%>=300 �
�Y� q% 255,ifactors% 15,factors% 15,pixtrans% 255,paltemp% 1023,buffer% 255,idata% 1023
��
�a� z% 1223,q% 255,ifactors% 15,factors% 15,pixtrans% 255,paltemp% 1023,buffer% 255,idata% 2399
��
�scrap%=�
�!� version%<300 sidata%=idata%
�)sprite%=�:sar%=�:saved%=�:z$=�12,�13)
�ș "OS_Byte",161,&8C � ,,f%
�
�f% � 1 �
7ș"Wimp_OpenTemplate",,"<ChangeFSI$Dir>.3dTemplate"
�
6ș"Wimp_OpenTemplate",,"<ChangeFSI$Dir>.Templates"
&�
:� �
D6� � ș"Wimp_CloseTemplate":� 0,�$+" (code "+Þ+")"
X�version%>=300 �
b� z% �largest_buffer
l#indsize%=�size_indirect("Info")
v� info_wind% indsize%
�Kș"Wimp_LoadTemplate",,z%,info_wind%,info_wind%+indsize%,-1,"Info"+z$,0
��
�Kș"Wimp_LoadTemplate",,z%,idata%,sidata%+2500,-1,"Info"+z$,0 � ,,idata%
��
�?ș CreateW,,z% � infow%:$!(z%+88+7*32+20)=�ChangeFSIVersion
��version%>=300 �
�)indsize%=�size_indirect("Processing")
�� proc_wind% indsize%
�Nș"Wimp_LoadTemplate",,z%,proc_wind%,proc_wind%+indsize%,-1,"Processing",0
��
�Nș"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Processing",0 � ,,idata%
��
ș CreateW,,z% � proc%
Ip%(0)=!(z%+88+8*32+20):p%(1)=!(z%+88+9*32+20):p%(2)=!(z%+88+10*32+20)
�version%>=300 �
*%indsize%=�size_indirect("Output")
4� outp_wind% indsize%
>Mș"Wimp_LoadTemplate",,z%,outp_wind%,outp_wind%+indsize%,-1,"Output"+z$,0
H�
RMș"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Output"+z$,0 � ,,idata%
\�
fPș CreateW,,z% � output%:admode%=!(z%+88+17*32+20):adspcl%=!(z%+88+16*32+20)
z�version%>=300 �
�&indsize%=�size_indirect("Scaling")
�� scal_wind% indsize%
�Nș"Wimp_LoadTemplate",,z%,scal_wind%,scal_wind%+indsize%,-1,"Scaling"+z$,0
��
�Nș"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Scaling"+z$,0 � ,,idata%
��
�6ș CreateW,,z% � scalew%:adscale%=!(z%+88+1*32+20)
�3s%(0)=!(z%+88+10*32+20):s%(1)=!(z%+88+11*32+20)
�3s%(2)=!(z%+88+12*32+20):s%(3)=!(z%+88+13*32+20)
��version%>=300 �
�#indsize%=�size_indirect("Save")
�� save_wind% indsize%
Kș"Wimp_LoadTemplate",,z%,save_wind%,save_wind%+indsize%,-1,"Save"+z$,0
�
Kș"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Save"+z$,0 � ,,idata%
$�
.3ș CreateW,,z% � save%:adsave%=!(z%+88+1*32+20)
B�version%>=300 �
L%indsize%=�size_indirect("Sprite")
V� sprt_wind% indsize%
`Mș"Wimp_LoadTemplate",,z%,sprt_wind%,sprt_wind%+indsize%,-1,"Sprite"+z$,0
j�
tMș"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Sprite"+z$,0 � ,,idata%
~�
�Pș CreateW,,z% � sinfo%:adsname%=!(z%+88+5*32+20):adsbytes%=!(z%+88+8*32+20)
�Hadsx%=!(z%+88+7*32+20):adsy%=!(z%+88+9*32+20):adsm%=!(z%+88+6*32+20)
��version%>=300 �
�%indsize%=�size_indirect("Source")
�� src_wind% indsize%
�Kș"Wimp_LoadTemplate",,z%,src_wind%,src_wind%+indsize%,-1,"Source"+z$,0
��
�Mș"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Source"+z$,0 � ,,idata%
��
�5ș CreateW,,z% � srcinfo%:adsrc%=!(z%+88+0*32+20)
�version%>=300 �
$indsize%=�size_indirect("Range")
� range_wind% indsize%
Nș"Wimp_LoadTemplate",,z%,range_wind%,range_wind%+indsize%,-1,"Range"+z$,0
(�
2Lș"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Range"+z$,0 � ,,idata%
<�
F5ș CreateW,,z% � raninfo%:adran%=!(z%+88+0*32+20)
Z�version%>=300 �
d#indsize%=�size_indirect("Zoom")
n� zoom_wind% indsize%
xKș"Wimp_LoadTemplate",,z%,zoom_wind%,zoom_wind%+indsize%,-1,"Zoom"+z$,0
��
�Kș"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Zoom"+z$,0 � ,,idata%
��
�Hș CreateW,,z% � zoom%:z%(0)=!(z%+88+4*32+20):z%(1)=!(z%+88+5*32+20)
��version%>=300 �
�"indsize%=�size_indirect("Pic")
�� pic_wind% indsize%
�Hș"Wimp_LoadTemplate",,z%,pic_wind%,pic_wind%+indsize%,-1,"Pic"+z$,0
��
�?ș"Wimp_LoadTemplate",,z%,idata%,sidata%+2400,-1,"Pic"+z$,0
��
�(ș CreateW,,z% � pic%:adtitle%=z%!72
� �
ș"Wimp_CloseTemplate"
"@!q%=-1:q%!4=0:q%!8=0:q%!12=68:q%!16=68:q%!20=%11000000000010
,:$(q%+24)="!"+m$(20):ș"Wimp_CreateIcon",,q% � iconbar%
6)A%=�"<ChangeFSI$Dir>.Choices":�A%=0 �
@Dfast%=�:statescale%=%10000000100:stateproc%=0:stateoutput%=&a008
J2$p%(0)="":$p%(1)="2.2":$p%(2)="24":$adspcl%=""
T=$admode%="28":$s%(0)="1":$s%(1)="4":$s%(2)="1":$s%(3)="4"
^�
h2�#A%,fast%,statescale%,stateproc%,stateoutput%
r/�#A%,$p%(0),$p%(1),$p%(2),$admode%,$adspcl%
|$�#A%,$s%(0),$s%(1),$s%(2),$s%(3)
��#A%
��
�q%!12=1<<21
�=!q%=scalew%:�I%=0�9:�statescale%>>I%�1 q%!8=1<<21 �q%!8=0
�q%!4=I%:ș SetI,,q%:�
�3�I%=10�13:�statescale%>>I%�1 q%!8=1<<21 �q%!8=0
�q%!4=I%+6:ș SetI,,q%:�
�:!q%=proc%:�I%=0�7:�stateproc%>>I%�1 q%!8=1<<21 �q%!8=0
�q%!4=I%:ș SetI,,q%:�
�?!q%=output%:�I%=0�15:�stateoutput%>>I%�1 q%!8=1<<21 �q%!8=0
�q%!4=I%:ș SetI,,q%:�
�)�showscaletofit:$z%(0)="1":$z%(1)="1"
� ș "OS_UpdateMEMC" � oldmemc
?� � ș"OS_UpdateMEMC",oldmemc,&700:�errorbox:ș CrMenu,,-1
ș Drag,,-1
&1�sprite% ș "Wimp_SlotSize",originalslot%,-1
0BF$="":�startfile% startfile%=�:F$=�A$,�A$,"-wimp")+6):�callFSI
:�
Dș Poll%,1,q% � A%
NȎ A% �
X%� 1 :�sprite% �redraw_window(!q%)
bB� 2 :�open_window(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,q%!24,q%!28)
l2� 3 :ș &400c3,,q%:nextlocation%=�:�removearea
v:ș "Wimp_SlotSize",originalslot%,-1:saved%=�:sprite%=�
�5� 6 :�checkmouse(!q%,q%!4,q%!8,q%!12,q%!16,q%!20)
�F� 7 :ș GetP,,q%:dw%=q%!12:di%=q%!16:�dstart% ș"DragASprite_Stop"
�<q%!12=0:q%!16=1:q%!20=dw%:q%!24=di%:q%!28=!q%:q%!32=q%!4
�2q%!36=!sar%+3:q%!40=&ff9:$adsave%=�ZS(adsave%)
�foo%=�$adsave%,"."):ȕfoo%
�2$adsave%=�$adsave%,foo%+1):foo%=�$adsave%,".")
��
�2$(q%+44)=$adsave%+�0:!q%=44+(�$adsave%+1+3��3)
�3ș "Wimp_SendMessage",17,q%,dw%,di%:myref%=q%!8
�� 8 :�key(!q%,q%!4,q%!24)
�� 9 :�menuselect(q%)
�� 17,18:�receive(q%)
��
� �
�
Q%=�
�=&4000000
*S� � � � �:�"Set ChangeFSI$ReturnCode "+�$+" (code "+Þ+")":�removearea:�:�=Q%:�
41foo%=0:A%=�ChangeFSI(A$,-1,-1,0,-1,-1,foo%,�)
>+�removearea:*unset ChangeFSI$ReturnCode
H
�:�=Q%
R�
\�
p� �size_indirect(name$)
z� size%
�5ș "Wimp_LoadTemplate",,0,,,,name$+z$,0 � ,,size%
�
=size%
�� �winsize_indirect(name$)
�� size%
�4ș "Wimp_LoadTemplate",,0,,,,name$+z$,0 � ,size%
�
=size%
�� �largest_buffer
�#� largest_tem%,size%,here%,name
� name 12
$$name="*":here%=0:largest_tem%=0
;ș "Wimp_LoadTemplate", ,0,,,,name,0 � ,size%,,,,,here%
$ȕ here%
.+� largest_tem%<size% largest_tem%=size%
8$name= "*"
B?ș "Wimp_LoadTemplate", ,0,,,,name,here% � ,size%,,,,,here%
L�
V=largest_tem%
j� �receive(q%)
tȎ q%!16 �
~� 0:�checkandfinish
�� 1:�q%!20<>save% �
�A!q%=60:q%!12=q%!8:q%!16=2:q%!36=-1:$(q%+44)="<Wimp$Scrap>"+�0
�/ș"Wimp_SendMessage",17,q%,q%!4:scrap%=q%!8
��
�8� 2:șspop%,&10C,sar%,�ZS(q%+44):$adsave%=�ZS(q%+44)
�7q%!12=q%!8:q%!16=3:ș "Wimp_SendMessage",18,q%,q%!4
�� q%!36<>-1 saved%=�
�ș CrMenu,,-1
�1� 3:F$=�ZS(q%+44):�scrap% scrap%=scrap%=q%!12
�6q%!12=q%!8:q%!16=4:ș"Wimp_SendMessage",17,q%,q%!4
��callFSI
�� 5:Ȏ q%!40 �
� &ff0,&c85
6q%!12=q%!8:q%!16=4:ș"Wimp_SendMessage",17,q%,q%!4
F$=�ZS(q%+44):�callFSI
�
(B�9,&400C1:�sprite% �getmodeinfo:ș&400d1,pic%,0,-32767,32767,0
2�showscaletofit
<H� 10:ș"XOS_ReadVarVal","ChangeFSI$Dir",paltemp%,256,0,3 �,,bootlen%
Fpaltemp%?bootlen%=13
P�#q%!20,"Run "+$paltemp%
Z�
d�
x� �callFSI
�A$=�deducemode:A%=47
� �geticonstate(output%,12) �
�A$+=$adspcl%
��
� �geticonstate(output%,13) �
�>�geticonstate(output%,2)��geticonstate(output%,8) A$+="R"
��
�ș53,�A$,3 �,,A%
��A%=63 �
�&�geticonstate(output%,3) A$="27t"
�&�geticonstate(output%,9) A$="12t"
��
��A%=255 A$+="d"
�
�
�
"/A$="garbage "+F$+" <ChangeFSI$Dir>.Foo "+A$
,>�geticonstate(scalew%,1) A$+=" "+�tofitx+": "+�tofity+":"
6(�geticonstate(scalew%,5) A$+=" 1:2"
@,�geticonstate(scalew%,4) A$+=" 1:2 1:1"
J,�geticonstate(scalew%,3) A$+=" 1:1 1:2"
T�geticonstate(scalew%,9) �
^%�$s%(0) A$+=" "+$s%(0) �A$+=" 1"
hA$+=":"+$s%(1)
r%�$s%(2) A$+=" "+$s%(2) �A$+=" 1"
|A$+=":"+$s%(3)
��
�,�geticonstate(scalew%,0) A$+=" -nosize"
�.�geticonstate(scalew%,18) A$+=" -noscale"
�+�geticonstate(scalew%,19) A$+=" -lock"
��geticonstate(scalew%,6) �
�>�geticonstate(scalew%,16) A$+=" -rotate" �A$+=" -rotate-"
��
�+�geticonstate(scalew%,7) A$+=" -hflip"
�+�geticonstate(scalew%,8) A$+=" -vflip"
�)�geticonstate(proc%,0) A$+=" -range"
�)�geticonstate(proc%,1) A$+=" -equal"
�,�geticonstate(proc%,2) A$+=" -nodither"
�*�geticonstate(proc%,3) A$+=" -invert"
,�geticonstate(proc%,4) A$+=" -brighten"
0�geticonstate(proc%,5) A$+=" -black"+$p%(0)
0�geticonstate(proc%,6) A$+=" -gamma"+$p%(1)
&2�geticonstate(proc%,7) A$+=" -sharpen"+$p%(2)
0%info$="":range$=m$(19):cputime%=0
:6�sprite% !q%=pic%:ș &400c3,,q%:saved%=�:sprite%=�
Dnextlocation%=�
N3ș "Wimp_SlotSize",originalslot%,-1:�removearea
X1�fast% ș "OS_UpdateMEMC",&300,&700 � oldmemc
b4A%=�ChangeFSI(A$,-1,-1,nextlocation%,0,0,sar%,0)
l*�fast% ș "OS_UpdateMEMC",oldmemc,&700
v%�scrap% scrap%=�:ș"OS_File",6,F$
��A%<2 � sar%<>0 �
�&ș spop%,&10d,sar%,pixtrans%,255,1
�6n$=�ZS(pixtrans%):ș spop%,&128,sar%,n$ �,,,x,y,,m
�.$adsx%=�x:$adsy%=�y:$adsm%=�m:$adsname%=n$
�&$adsbytes%=�sar%!12:$adran%=range$
�-$adsrc%=info$+m$(0)+�(cputime%/100)+m$(1)
�'A%=�F$:ȕ�"."+F$,A%,1)<>".":A%-=1:�
�$adsave%=�"."+F$,A%+1)
�ș&35,m,4 �,,nx:x=x<<nx
�ș&35,m,5 �,,ny:y=y<<ny
�#saved%=�:sprite%=�:�getmodeinfo
�pic%=�create_window(x,y,F$)
��popup(pic%,-1)
�
�
� �checkandfinish
*7�saved% ��sprite% �removearea:ș "Wimp_CloseDown":�
4-!buffer%=�:$(buffer%+4)=m$(2)+F$+m$(3)+�0
>5ș "Wimp_ReportError",buffer%,%10111,m$(20) � ,A%
H+�A%=1 �removearea:ș "Wimp_CloseDown":�
R�
f� �key(handle%,icon%,key%)
p�key%=&1b ș CrMenu,,-1:�
zȎ handle% �
�� zoom%:Ȏ key% �
�C� 13:�dozoom(icon%-4,0):�icon%=4 ș &400d2,zoom%,5,,,-1,�$z%(0)
��icon%=5 ș CrMenu,,-1
��
�"� &18e,&18f:�dozoom(icon%-4,0)
�0ș &400d2,zoom%,icon%�1,,,-1,�$z%(icon%�5):�
��
�� save%
��key%=13 �savesprite:�
�
� output%
��showscaletofit
��key%=13 ș CrMenu,,-1:�
��key%=&18e �key%=&18f �
5icon%=icon%�1:key%=admode%:�icon%=16 key%=adspcl%
)ș &400d2,output%,icon%,,,-1,�$key%:�
�
$� proc%:Ȏ key% �
.A� &18e,13:icon%+=1:�icon%>10 icon%=8:�key%=13 ș CrMenu,,-1:�
8.ș &400d2,proc%,icon%,,,-1,�$p%(icon%-8):�
B%� &18f:icon%-=1:�icon%<8 icon%=10
L.ș &400d2,proc%,icon%,,,-1,�$p%(icon%-8):�
V�
`� scalew%:Ȏ key% �
jB� &18e,13:icon%+=1:�icon%>13 icon%=10:�key%=13 ș CrMenu,,-1:�
t1ș &400d2,scalew%,icon%,,,-1,�$s%(icon%-10):�
~&� &18f:icon%-=1:�icon%<10 icon%=13
�1ș &400d2,scalew%,icon%,,,-1,�$s%(icon%-10):�
��
��
�ș "Wimp_ProcessKey",key%
��
�� �savesprite
�ș spop%,&10C,sar%,$adsave%
�ș CrMenu,,-1
��
�7� �checkmouse(mousex%,mousey%,b%,handle%,icon%,ob%)
�b%�2 �
Ȏ handle% �
|� pic%:�domenu(pic%,m$(4)+">sinfo%,"+m$(5)+">srcinfo%,"+m$(6)+">raninfo%,"+m$(7)+">zoom%,"+m$(8)+">save%,"+m$(9),m$(20))
�� -2:�domenu(101,m$(10)+">infow%,"+m$(11)+">scalew%,"+m$(12)+">proc%,"+m$(13)+">output%,"+m$(9)+","+m$(14)+":fast%AND1,"+m$(15)+","+m$(16),m$(20))
(�
2rmenuhandle%=handle%
<�
F�b%�4 �
PȎ handle% �
Z� zoom%:Ȏ icon% �
d� 0:�dozoom(0,1)
n� 1:�dozoom(0,-1)
x� 2:�dozoom(1,1)
�� 3:�dozoom(1,-1)
��
��
��
��b%�1 �
�Ȏ handle% �
�� zoom%:Ȏ icon% �
�� 0:�dozoom(0,-1)
�� 1:�dozoom(0,1)
�� 2:�dozoom(1,-1)
�� 3:�dozoom(1,1)
��
��
�
�b%�5 �
Ȏ handle% �
"� output%:Ȏ icon% �
,'� 0,1,2,3:�killcurrent(�(25+icon%))
6!� 4:�killcurrent("S16,90,90")
@!� 5:�killcurrent("S32,90,90")
J� 6:�killcurrent("0")
T� 7:�killcurrent("8")
^� 8:�killcurrent("12")
h� 9:�killcurrent("15")
r"� 10:�killcurrent("S16,90,45")
|"� 11:�killcurrent("S32,90,45")
��
�3�geticonstate(output%,15) $admode%=�deducemode
�2!q%=output%:q%!4=17:q%!8=0:q%!12=0:ș SetI,,q%
��showscaletofit
�� save%:Ȏ icon% �
�� 2:�savesprite
��
�M� -2:�sprite% �getw(pic%):�open_window(pic%,x0%,y0%,x1%,y1%,scx%,scy%,-1)
��
��
�
�b%�&50 �
�Ȏ handle% �
�� save%:Ȏ icon% �
� 0:�getw(save%)
!q%=save%:q%!4=0:ș GetI,,q%
!q%=save%:q%!4=5
&.q%!8+=bx%:q%!12+=by%:q%!16+=bx%:q%!20+=by%
03q%!24=0:q%!28=0:q%!32=&7FFFFFFF:q%!36=&7FFFFFFF
:P�dstart% ș dstart%,%11000101,1,"file_ff9",q%+8,q%+24 �ș "Wimp_DragBox",,q%
D�
N�
X�
b�
v� �dozoom(s%,a%)
��s%=0 �
�/$z%(0)=�(�$z%(0)+a%):�$z%(0)="0" $z%(0)="1"
��
�/$z%(1)=�(�$z%(1)+a%):�$z%(1)="0" $z%(1)="1"
��
�2!q%=zoom%:q%!4=4+s%:q%!8=0:q%!12=0:ș SetI,,q%
�/!q%=pic%:ș GetW,,q%:f%=q%!28:ș &400c3,,q%
�pic%=�create_window(x,y,F$)
��popup(pic%,f%)
��
�'� �domenu(handle%,menu$,menutitle$)
�menuhandle%=handle%
%menuptr%=buffer%:indirect%=idata%
i%=0
menuptr%!20=44
$menuptr%=menutitle$
*;menuptr%?12=7:menuptr%?13=2:menuptr%?14=7:menuptr%?15=0
4!menuptr%!16=200:menuptr%!24=0
>menuptr%+=28
H%� i1%=i%+1:i%=�menu$+",",",",i1%)
R8item$=�menu$,i1%,i%-i1%):�menuitem(item$):� item$=""
\#menuptr%!-24=(menuptr%!-24)�&80
f`�handle%=101 ș CrMenu,,buffer%,mousex%-64,96+8*44 �ș CrMenu,,buffer%,mousex%-32,mousey%+16
p�
�� �menuitem(text$)
�� text$="" �
�*flg%=0:submenu%=-1:I%=�text$,":"):�I%�
�)flg%=��text$,I%+1):text$=�text$,I%-1)
��
�I%=�text$,">"):�I%�
�-submenu%=��text$,I%+1):text$=�text$,I%-1)
��
�menuptr%!0=flg%
�menuptr%!4=submenu%
�A�text$=m$(9)�F$="" menuptr%!8=&07400021 �menuptr%!8=&07000021
�2�text$*16+8>buffer%!16 buffer%!16=�text$*16+8
��text$>12 �
2menuptr%!8=menuptr%!8 � 256:menuptr%!16=�text$
>menuptr%!12=indirect%:$indirect%=text$:indirect%+=�text$+1
�
$$(menuptr%+12)=text$
.�
8menuptr%+=24
B�
V� �menuselect(menus%)
`,ș GetP,,paltemp%:adjust%=paltemp%!8 � 1
j-ș DcMenu,,buffer%,menus%,�200," ")�,,,a$
t� a$="" ��
~Ȏ menuhandle% �
�
� pic%
�Ȏ a$ �
�� m$(9):�callFSI
��
� � 101
�Ȏ a$ �
�� m$(14):fast%=�fast%
�� m$(9):�callFSI
�� m$(15)
�Fstatescale%=0:�I%=0�9:statescale%+=�geticonstate(scalew%,I%)<<I%:�
�<�I%=10�13:statescale%+=�geticonstate(scalew%,I%+6)<<I%:�
�Bstateproc%=0:�I%=0�7:stateproc%+=�geticonstate(proc%,I%)<<I%:�
Istateoutput%=0:�I%=0�15:stateoutput%+=�geticonstate(output%,I%)<<I%:�
!A%=�"<ChangeFSI$Dir>.Choices"
2�#A%,fast%,statescale%,stateproc%,stateoutput%
/�#A%,$p%(0),$p%(1),$p%(2),$admode%,$adspcl%
($�#A%,$s%(0),$s%(1),$s%(2),$s%(3)
2�#A%
<� m$(16):�checkandfinish
F�
P�
Z0�adjust% �checkmouse(0,0,2,rmenuhandle%,0,0)
d�
x � �create_window(x,y,title$)
�+x=x*�$z%(0)��$z%(1):y=y*�$z%(0)��$z%(1)
� !z%=0:z%!4=-y:z%!8=x:z%!12=0
�$z%!40=0:z%!44=-y:z%!48=x:z%!52=0
�%�x<128 � y<128 z%?35=0 �z%?35=255
�)$adtitle%="":ș CreateW,,z% � handle%
�$adtitle%=title$
�=handle%
�� �popup(handle%,f%)
�1ș "OS_ReadModeVariable",-1,4 � ,,modexshift%
�1ș "OS_ReadModeVariable",-1,5 � ,,modeyshift%
�0ș "OS_ReadModeVariable",-1,11 � ,,rightscr%
�.ș "OS_ReadModeVariable",-1,12 � ,,topscr%
Arightscr%=rightscr%<<modexshift%:topscr%=topscr%<<modeyshift%
�getw(handle%)
9xo%=rightscr%/2-(x0%+x1%)/2:yo%=topscr%/2-(y0%+y1%)/2
"F�open_window(handle%,x0%+xo%,y0%+yo%,x1%+xo%,y1%+yo%,scx%,scy%,f%)
,�
@>� �open_window(handle%,x0%,y0%,x1%,y1%,scx%,scy%,bhandle%)
J�handle%=-1��
Tq%!0=handle%:q%!28=bhandle%
^)q%!4=x0%:q%!8=y0%:q%!12=x1%:q%!16=y1%
hq%!20=scx%:q%!24=scy%
rș OpenW,,q%
|�
�� �getw(handle%)
�!q%=handle%:ș GetW,,q%
�+�info(q%+4):bhandle%=q%!28:flags%=q%!32
��
�� �info(q%)
�=x0%=!q%:y0%=q%!4:x1%=q%!8:y1%=q%!12:scx%=q%!16:scy%=q%!20
�bx%=x0%-scx%:by%=y1%-scy%
��
�� �redraw_window(handle%)
�� handle%=pic% �
?!factors%=!ifactors%*�$z%(0):factors%!4=ifactors%!4*�$z%(0)
Cfactors%!8=ifactors%!8*�$z%(1):factors%!12=ifactors%!12*�$z%(1)
A�reduce(!factors%,factors%!8):�reduce(factors%!4,factors%!12)
&!q%=handle%
0ș RedrawW,,q% � more%
:,�info(q%+4):by%=by%-�(y*�$z%(0)��$z%(1))
Dȕ more%
N0ș spop%,&134,sar%,n$,bx%,by%,,factors%,spx%
Xș GetR%,0,q% � more%
b�
l�
v�
�"� �geticonstate(handle%,icon%)
�&!q%=handle%:q%!4=icon%:ș GetI,,q%
�=q%!24>>21 � 1
�� �getmodeinfo
�=ș"Wimp_ReadPixTrans",&100,sar%,n$,,,,ifactors%,pixtrans%
�#ș spop%,&118,sar%,n$ � ,,sptr%
�� sptr%!32=44 �
�
palptr%=0
��
�� grab%=0 � 2048-8 � 8
�(paltemp%!(grab%>>1)=sptr%!(grab%+44)
�
palptr%=paltemp%
�
�Q%=0�255:pixtrans%?Q%=Q%:�
*�sptr%!32=44+2048 �
45�Q%=0�255:șctran%,palptr%!(Q%<<2)�pixtrans%?Q%:�
>�
H:ș "ColourTrans_SelectTable",m,palptr%,-1,-1,pixtrans%
R�
\6spx%=-1:�Q%=0�255:�pixtrans%?Q%<>Q% spx%=pixtrans%
f�
p�
�� �deducemode
�� m,x,y
� �geticonstate(output%,15) �
�ș&35,-1,9 �,,m:�m>3 �
�#ș&35,-1,4 �,,x:ș&35,-1,5 �,,y
�x=180/(2^x):y=180/(2^y)
�="S"+�(2^m)+","+�x+","+�y
��
�=��
��
��
�
=$admode%
��
=0
� �showscaletofit
$� m,x,y
.$admode%=�deducemode
8�?admode%=�"S" �
B)�$admode%,5)>��$admode%,8) x=6 �x=0
L �$admode%,2)>16 x+=5 �x+=4
V/ș&35,-1,11 �,,tofitx:ș&35,-1,12 �,,tofity
`�
jm=�$admode%
t-ș&35,m,11 �,,tofitx:ș&35,m,12 �,,tofity
~/ș&35,m,4 �,,x:ș&35,m,5 �,,y:�y>x x=6 �x=0
�ș&35,m,9 �,,y:x+=y
��
�?tofitx+=1:tofity+=1:$adscale%=m$(17)+�tofitx+m$(18)+�tofity
�=q%!12=1<<21:!q%=output%:�I%=0�11:�I%=x q%!8=1<<21 �q%!8=0
�q%!4=I%:ș SetI,,q%:�
��
�� �killcurrent(m$)
�"q%!12=1<<21:!q%=output%:q%!8=0
�q%!4=17:ș SetI,,q%
�$admode%=m$
��
+ݤZS(I%)�A$:�A$+=�?I%:I%+=1:�?I%<14:=A$
� �errorbox
(ș Drag,,-1
22!buffer%=�:$(buffer%+4)=�$+" (code "+Þ+")"+�0
<2ș "Wimp_ReportError",buffer%,%11,m$(20) � ,A%
F+�A%=2 �removearea:ș "Wimp_CloseDown":�
P�
6S� �ChangeFSI(A$,spritearea%,workspace%,worklimit%,oksave%,okinfo%,� ram%,fast%)
@M� A$(),r%(),g%(),b%(),rpal%(),gpal%(),bpal%(),table%(),cl%(),xl%(),xl2%()
JD� xp%(),rm%(),rm1%(),rm2%(),vals%(),nl%(),A%(),B%(),new%(),st%()
T$ȕ�A$,1)<>" "��A$<>0 A$=�A$,2):�
^ȕ�A$,1)=" " A$=�A$,2):�
hȕ�A$,1)=" " A$=�A$):�
r�uc(�A$,5))="-QUIT" �
|.A$=�A$,7):ȕ�A$,1)<>" "��A$<>0 A$=�A$,2):�
�ȕ�A$,1)=" " A$=�A$,2):�
��
� � A$(100):ARG%=0:B%=�A$," ")
�ȕ B%<>0
�+ARG%+=1:A$(ARG%)=�A$,B%-1):A$=�A$,B%+1)
�ȕ �A$,1)=" ":A$=�A$,2):�
�B%=�A$," ")
��
��A$<>"" ARG%+=1:A$(ARG%)=A$
�Xinvert%=�:range%=�:sharpen%=�:info%=�:cache%=�:cacheareanumber%=0:dither%=�:black%=�
�Chist%=�:equal%=�:vflip%=�:hflip%=�:scale%=�:scaleo%=�:scrapf%=�
�6gamma=1:rotate%=�:max%=20000000:bright%=15:lock%=�
�rwt=.299:gwt=.587:bwt=.114
�ARG%<3 �
J�"ChangeFSI interactive input (read FSIinfo for command line details)"
?�"Source file: "s$,"Destination file: "f$,"Output mode: "m$
&/�"(X)Scale (e.g. 2:1): "xs$:�"Y Scale: "ys$
08�"Info on input picture?"a$:�uc(�a$,1))="Y" info%=�
:;�"Invert picture colours?"a$:�uc(�a$,1))="Y" invert%=�
D=�"Compute histogram of input?"a$:�uc(�a$,1))="Y" hist%=�
N@�"Apply histogram equalisation?"a$:�uc(�a$,1))="Y" equal%=�
XG�"Expand input dynamic range?"a$:�uc(�a$,1))="Y" range%=�:equal%=�
b=�"Sharpen picture by (e.g. 12 for harsh, 24 for soft) "a$
l�a$<>"" sharpen%=�a$
v+�"Rotate?"a$:�uc(�a$,1))="Y" rotate%=1
�scale%=�:scaleo%=�:fast%=�
��
�
� A%=ARG%
�6�uc(A$(ARG%))="-INFO" info%=�:A$(ARG%)="":ARG%-=1
�6�uc(A$(ARG%))="-HIST" hist%=�:A$(ARG%)="":ARG%-=1
�6�uc(A$(ARG%))="-LOCK" lock%=�:A$(ARG%)="":ARG%-=1
�A�uc(A$(ARG%))="-EQUAL" equal%=�:range%=�:A$(ARG%)="":ARG%-=1
�A�uc(A$(ARG%))="-RANGE" range%=�:equal%=�:A$(ARG%)="":ARG%-=1
�:�uc(A$(ARG%))="-INVERT" invert%=�:A$(ARG%)="":ARG%-=1
�D�uc(A$(ARG%))="-NOSCALE" scale%=�:scaleo%=�:A$(ARG%)="":ARG%-=1
�9�uc(A$(ARG%))="-NOSIZE" scale%=�:A$(ARG%)="":ARG%-=1
�<�uc(A$(ARG%))="-NODITHER" dither%=�:A$(ARG%)="":ARG%-=1
�=�uc(A$(ARG%))="-BRIGHTEN" bright%=16:A$(ARG%)="":ARG%-=1
:�uc(A$(ARG%))="-ROTATE" rotate%=1:A$(ARG%)="":ARG%-=1
<�uc(A$(ARG%))="-ROTATE-" rotate%=-1:A$(ARG%)="":ARG%-=1
8�uc(A$(ARG%))="-VFLIP" vflip%=�:A$(ARG%)="":ARG%-=1
8�uc(A$(ARG%))="-HFLIP" hflip%=�:A$(ARG%)="":ARG%-=1
*8�uc(A$(ARG%))="-NOMODE" fast%=�:A$(ARG%)="":ARG%-=1
4!�uc(�A$(ARG%),6))="-BLACK" �
>Fblack%=32:�A$(ARG%)>6 black%=��A$(ARG%),7):�black%>128 black%=128
HA$(ARG%)="":ARG%-=1
R�
\!�uc(�A$(ARG%),6))="-GAMMA" �
f.gamma=2.2:�A$(ARG%)>6 gamma=��A$(ARG%),7)
pA$(ARG%)="":ARG%-=1
z�
�#�uc(�A$(ARG%),8))="-SHARPEN" �
�2sharpen%=�:�A$(ARG%)>8 sharpen%=��A$(ARG%),9)
�A$(ARG%)="":ARG%-=1
��
�C�uc(�A$(ARG%),4))="-RED" rwt=��A$(ARG%),5):A$(ARG%)="":ARG%-=1
�E�uc(�A$(ARG%),6))="-GREEN" gwt=��A$(ARG%),7):A$(ARG%)="":ARG%-=1
�D�uc(�A$(ARG%),5))="-BLUE" bwt=��A$(ARG%),6):A$(ARG%)="":ARG%-=1
��uc(�A$(ARG%),4))="-MAX" �
�Dmax%=��A$(ARG%),5):�A$(ARG%),"K")��A$(ARG%),"k") max%=max%*1024
�A$(ARG%)="":ARG%-=1
��
��A%=ARG%
�2s$=A$(1):f$=A$(2):m$=A$(3):xs$=A$(4):ys$=A$(5)
�
�okinfo% �info%=�
�workspace%>=0 �
$flex%=�
.�
8<�worklimit%=0 �flex%=� �flex%=�:nextlocation%=worklimit%
B�
L"pnm$=�uc(m$):Ȏ �pnm$+",",3) �
V�"AIM":m=-1:m$=""
`"�"P1,","P4,":m=-2:m$="":spm=18
j#�"P2,","P5,":m=-2:m$="T":spm=20
t=�"P3,","P6,":m=-4:pnm$=�pnm$,2):p6bits=8:I%=��m$,4):m$=""
~�I%>0�I%<8 p6bits=I%
��"P15":m=-3:m$=""
��"C15":m=-5:m$=""
��"IRL":m=-4:m$="":p6bits=8
��"S16":m=-6:m$=""
��"S24":m=-7:m$="":p6bits=8
��"S32":m=-8:m$="":p6bits=8
�5:m=�m$:spm=m:m$=�uc(�m$,1)):�"CDRT",m$)=0 m$=""
��
��xs$="" � �xs$,1)="-" �
�#xmul%=1:xdiv%=1:ymul%=1:ydiv%=1
��
��ys$="" ys$=xs$
'xmul%=�xs$:xdiv%=��xs$,�xs$,":")+1)
'ymul%=�ys$:ydiv%=��ys$,�ys$,":")+1)
�
&flag=-1:ș8,5,s$ � r0,,r2:dir=r0=2
(
�dir �
2Cpanic=�:ș8,5,s$+".raw" � r0,,r2:�r0=1 s$+=".raw":dir=�:panic=�
<1�panic ș8,5,s$+".red" � r0,,r2:�r0=1 panic=�
F!�panic � 42,"Directory given"
P�
Z>ftype=r2>>8 � &FFF:bits=28:F=2^bits:c%=0:cc%=0:ccc%=0:o%=0
d
�dir �
n>c%=�(s$+".red"):�c%=0 � 42,"Red file "+s$+".red not found"
xEcc%=�(s$+".green"):�cc%=0 �42,"Green file "+s$+".green not found"
�Dccc%=�(s$+".blue"):�ccc%=0 �42,"Blue file "+s$+".blue not found"
��
�-c%=�s$:�c%=0 � 42,"File "+s$+" not found"
��
�� �
�� � � � �:�close:� �,�$
�
� r%(255)
�� g%(255),b%(255)
�ș&66f4d �;pcd%
�Ȏ ftype �
�� &FF9:flag=0
�.�"."+�uc(s$),".HIP.")���uc(s$),":HIP.") �
� flag=300:I%=��uc(s$),"HIP.")
?�s$,I%)="LOP.":cc%=�s$:�cc%=0 �42,"Can't find Lop file "+s$
�
+� &FF0:�#c%=0:S$="":�I%=1�4:S$+=��#c%:�
"&�S$="II*"+�0 flag=1500:bigendian=�
,)�S$="MM"+�0+"*" flag=1500:bigendian=�
6!� &DFA:flag=800:�dir flag=801
@� &DE2:flag=1000
J � &BE8:�(pcd%�1)=0 flag=3600
T� &7A0:flag=1200
^� &69d:flag=2000
h� &699:flag=700
r� &698:flag=100
|� &697:flag=1900
�� &691:flag=2600
�� &690:flag=2500
�� &666:flag=666
�� &601:flag=3000
�� &371:flag=3100
�#� &300:flag=1300:�dir flag=1301
�� 4:flag=900:�dir flag=901
�� 6:flag=950
��
��flag=-1 �
�%�#c%=0:S$="":�I%=1�16:S$+=��#c%:�
��S$,7)="FSIfile" flag=2100
�)�flag=-1 �S$,8)="SIMPLE " flag=2800
C�flag=-1 �uc(�S$,8))="MERCSOFT"��uc(�S$,8))="SNAPSHOT"flag=902
-�flag=-1 �uc(�S$,8))="MERCSOF1" flag=903
4�flag=-1 �uc(�S$,13))="IRLAM YUV 411" flag=2250
&&�flag=-1 �S$,5)="Irlam" flag=2200
0#�flag=-1 �S$,2)="BM" flag=2400
:$�flag=-1 �S$,4)="GIF8" flag=500
D%�flag=-1 �S$,5)="AV_VO" flag=600
N2�flag=-1 �S$,4)=�&59+�&A6+�&6A+�&95 flag=1100
X*�flag=-1 �S$,4)=�0+�1+�0+�8 flag=1400
b*�flag=-1 �S$,4)=�0+�1+�0+�1 flag=2900
l%�flag=-1 �S$,4)="RIX3" flag=2700
v3�flag=-1 �S$,4)="II*"+�0 flag=1500:bigendian=�
�6�flag=-1 �S$,4)="MM"+�0+"*" flag=1500:bigendian=�
�(�flag=-1 �S$,2)=�&52+�&CC flag=2300
�D�flag=-1 �S$,2)="P4"��S$,2)="P5"��S$,2)="P6" flag=3300:info$=""
�$�flag=-1 �S$,3)="P15" flag=3400
�$�flag=-1 �S$,3)="PIC" flag=3500
�)�flag=-1 �uc(�S$,3))="P13" flag=3450
�6�flag=-1 �S$,4)="FORM" �S$,9,4)="ILBM" flag=1600
��flag=-1 �
�#�S$,7,4)="JFIF" � ftype=&C85 �
�*jpegblk%=�dim(20):�cachesize(jpegblk%)
��cache%<�#c% �
��#c%:X%=�"Run:djpeg"
� �X% �
!7�#X%:ș"Wimp_StartTask","djpeg "+s$+" <Wimp$Scrap>"
!�
!0ș"XOS_CLI","djpeg "+s$+" <Wimp$Scrap>" � ;V
! �V �1 �
!*Bș"Wimp_StartTask","<ChangeFSI$Dir>.djpeg "+s$+" <Wimp$Scrap>"
!4�
!>�
!H"c%=�"<Wimp$Scrap>":�c%=0 �=100
!R>scrapf%=�:flag=3300:info$="JPEG (JFIF) file converted to "
!\�
!f
flag=3700
!p�
!z�
!��
!��flag=-1 �
!�&�#c%=&10:S$="":�I%=1�9:S$+=��#c%:�
!��S$="MILLIPEDE" flag=200
!��
!��flag=-1 �
!�&�#c%=&41:S$="":�I%=1�8:S$+=��#c%:�
!�%�S$,4)="PNTG" flag=1800:st%=&280
!��
!��flag=-1 �
!�&�#c%=196:S$="":�I%=1�8:S$+=��#c%:�
!�%�S$,4)="PNTG" flag=1800:st%=&2e2
!��
"�flag=-1 �
"&�#c%=522:S$="":�I%=1�8:S$+=��#c%:�
"2�S$=�0+�&11+�2+�&ff+�&c+�0+�&ff+�&fe flag=1850
"$�
".�flag=-1 �
"8�#c%=0:�#c%=10 �
"B+C%=�#c%:�C%<6 � C%<>1 ��#c%=1 flag=1900
"L�
"V�
"`M�flag=-1 �"."+�uc(s$),".PCX.")���uc(s$),":PCX.")��s$,4)="/PCX" flag=1900
"jB�flag=-1 �"."+�uc(s$),".IMAGE.")���uc(s$),":IMAGE.") flag=400
"t)�flag=-1 �uc(�s$,4))=".RAW" flag=100
"~)�flag=-1 �uc(�s$,3))="TGA" flag=2000
"�)�flag=-1 �uc(�s$,3))="VDA" flag=2000
"�>�flag=-1 �"."+�uc(s$),".PIC.")���uc(s$),":PIC.") flag=700
"�M�flag=-1 �"."+�uc(s$),".IMG.")���uc(s$),":IMG.")��s$,4)="/IMG" flag=1400
"�M�flag=-1 �"."+�uc(s$),".DSP.")���uc(s$),":DSP.")��s$,4)="/DSP" flag=1700
"�*�flag=-1 �uc(�s$,4))="/RGB" flag=3200
"�<�flag=-1 �(�uc(�s$,4))="/PCD"�ftype=&be8)�((pcd%�1)=1) �
"�o�#c%:ș"Wimp_StartTask","<ChangeFSI$Dir>.hpcdtoppm -3 -a "+s$+" <Wimp$Scrap> { > <ChangeFSI$Dir>.pcdtemp }"
"�Mc%=�"<Wimp$Scrap>":scrapf%=�:flag=3300:info$="PhotoCD file converted to "
"��
"��
"�c�flag=-1 �close:� 42,"Sorry: format not recognised - please try again or contact your supplier"
"�Bstep24=1:input=8:ham=0:planar%=0:bigendianbits=�:r$="FN"+�flag
# 9compression=0:hpredict%=1:striprows%=-1:cachebytes%=�
#
�xdiv%=0 � ydiv%=0 scale%=�
#
Ȏ flag �
#� 0
#(@quant%=4:�#c%=4:F%=�W+&1C:�#c%=F%:st%=�W+F%-&20:K%=�W+F%-&20
#2sm=�W:�sm<256 �
#<ș53,sm,3 � ,,I%
#FȎ I% �
#P%� 1:�st%=F%+12 �defpal2 ��ipal(2)
#Z5�#c%=F%-16:sx%=(�W+1)*32:rowbytes%=sx%>>3:input=1
#dsy%=�W+1:I%=�W:sx%-=31-�W
#n%� 3:�st%=F%+12 �defpal4 ��ipal(4)
#x5�#c%=F%-16:sx%=(�W+1)*16:rowbytes%=sx%>>2:input=2
#�!sy%=�W+1:I%=�W:sx%-=(31-�W)�2
#�(� 15:�st%=F%+12 �defpal16 ��ipal(16)
#�4�#c%=F%-16:sx%=(�W+1)*8:rowbytes%=sx%>>1:input=4
#�!sy%=�W+1:I%=�W:sx%-=(31-�W)�4
#�� 63,255:�st%=F%+12 �
#��defpal
#��
#��K%>st% K%=st%
#��K%-12-F%=2048 �I%=255 �
#��#c%=&38
#��C%=0�255:D%=�#c%
#�9r%(C%)=�#c%/255*F:g%(C%)=�#c%/255*F:b%(C%)=�#c%/255*F
#�D%=�W:�
$�
$�ipal63
$�
$"�
$,G�#c%=F%-16:sx%=(�W+1)*4:rowbytes%=sx%:sy%=�W+1:I%=�W:sx%-=(31-�W)�8
$6) �42,"Not understood RISC OS sprite"
$@�
$J@r$="FN8":ș53,sm,4 � ,,nx:ș53,sm,5 � ,,ny:nx=1<<nx:ny=1<<ny
$T-�scale% xmul%=xmul%*nx/2:ymul%=ymul%*ny/2
$^Sinfo$="RISC OS sprite, mode "+�sm+" "+�sx%+" by "+�sy%+" pixels, "+�bits(input)
$h�
$rbpp%=sm>>>27:Ȏbpp% �
$|9� 1:bpp%=1:r$="FN8":�st%=F%+12 �defpal2 ��newropal(2)
$�9� 2:bpp%=2:r$="FN8":�st%=F%+12 �defpal4 ��newropal(4)
$�;� 3:bpp%=4:r$="FN8":�st%=F%+12 �defpal16 ��newropal(16)
$�:� 4:bpp%=8:r$="FN8":�st%=F%+12 �defpal ��newropal(256)
$�&� 5:bpp%=16:r$="FN16":�st%=F%+12 �
$�$� rpal%(255),gpal%(255):step24=2
$�
�C%=0�255
$�"gpal%(C%)=(C%>>5)<<8 � (C%�31)
$�+rpal%(C%)=((C%>>2)�31)<<16 � (C%�3)<<11
$��
$�1�C%=0�31:r%(C%)=C%/31*F:�:g%()=r%():b%()=r%()
$�-� 6:bpp%=32:r$="FN24":�st%=F%+12 �nopal �
$�!rbo%=0:gbo%=1:bbo%=2:step24=4
$�-� 8:bpp%=24:r$="FN24":�st%=F%+12 �nopal �
%rbo%=0:gbo%=1:bbo%=2
%8 �42,"Not understood new format RISC OS sprite bpp"
%�
%&(nx=(sm>>1) �&1fff:ny=(sm>>14) �&1fff
%0G�scale% xdiv%=xdiv%*nx:ydiv%=ydiv%*ny:xmul%=xmul%*90:ymul%=ymul%*90
%:Z�#c%=F%-16:rowbytes%=(�W+1)*4:sy%=�W+1:I%=�W:sx%=(rowbytes%*8-(31-�W))/bpp%:input=bpp%
%DJinfo$="New RISC OS sprite, "+�sx%+" by "+�sy%+" pixels, "+�bits(input)
%N�bpp%=32 input=24
%X�
%b�#c%=st%:cache%=�
%l � 100
%vEquant%=8:�#c%=0:sx%=�HW:sy%=�HW:�nopal:input=24:rowbytes%=sx%*3+2
%�5rbo%=2:gbo%=2+sx%:bbo%=2+2*sx%:r$="FN24":cache%=�
%�Jinfo$="QRT .raw image, "+�sx%+" by "+�sy%+" pixels, 24 bits per pixel"
%� � 200
%�Gquant%=8:�#c%=5:sx%=�HW:sy%=�HW:sx%=(�HW-sx%+2)/2:sy%=(�HW-sy%+2)/2
%�$�#c%=&1a:cadsoft%=�#c%:�#c%=&200
%�!�C%=0�255:r%(C%)=�#c%/255*F:�
%�!�C%=0�255:g%(C%)=�#c%/255*F:�
%�!�C%=0�255:b%(C%)=�#c%/255*F:�
%�-�#c%=&600:st%=&600:cache%=�:�cadsoft%=2 �
%�Crep%=0:r$="FN1100":plbuff%=�dim(sx%):plbytes%=sx%:cachebytes%=�
%��
%�r$="FN8":rowbytes%=sx%
%��
&[info$="Cadsoft type "+�cadsoft%+" image, "+�sx%+" by "+�sy%+" pixels, 8 bits per pixel"
& � 300
&Iquant%=5:�#c%=&2c:st%=�W+(&38-&2c):�#cc%=&2c:stcc%=�W1(cc%)+(&38-&2c)
& 7�#c%=&1c:sx%=(�W+1)*4:sy%=�W+1:�#c%=st%:�#cc%=stcc%
&*;� rpal%(255),gpal%(255):input=16:cache%=�:rowbytes%=sx%
&4
�C%=0�255
&>.rpal%(C%)=C%�7 � (C%�64)<<2 � (C%�&38)<<13
&HSgpal%(C%)=(C%�4)<<1�C%�16 � ((C%�3)<<1�(C%�&60)>>2)<<8 � (C%�8�(C%�128)>>3)<<16
&R�
&\1�C%=0�31:r%(C%)=C%/31*F:�:g%()=r%():b%()=r%()
&f*pbuff%=�dim(sx%):�scale% ymul%=ymul%*2
&pGinfo$="ArVis image, "+�sx%+" by "+�sy%+" pixels, 15 bits per pixel"
&z � 400
&�Equant%=8:�#c%=0:sx%=�beHW:sy%=�beHW:X%=�beHW:st%=�#c%+X%:�#c%=st%
&�Vplbuff%=�dim(sx%*3):plbytes%=sx%*3:rb%=plbuff%:gb%=plbuff%+1:bb%=plbuff%+2:rbo%=-1
&�:�nopal:input=24:rep%=0:cachebytes%=�:cache%=�:step24=3
&�^info$="RT image. run length encoded image, "+�sx%+" by "+�sy%+" pixels, 24 bits per pixel"
&� � 500
&�,compression=5:�#c%=6:GIFsx=�HW:GIFsy=�HW
&�8GIF=�#c%:GIFback=�#c%:GIFext=�#c%:quant%=(GIF � 7)+1
&��GIF � &80 �
&��C%=0�(1<<quant%)-1
&�9r%(C%)=�#c%/255*F:g%(C%)=�#c%/255*F:b%(C%)=�#c%/255*F
&��
&��
&�>I%=�#c%:�I%<>�"," � 42,"GIF file without , in right place"
',GIFleft=�HW:GIFright=�HW:sx%=�HW:sy%=�HW
'�GIFsx<sx% � GIFsy<sy% �
'�info% �
'$)�"GIF file with bigger image inside:"
'.;�"Screen ";GIFsx"x by "GIFsy"y; image "sx%"x by "sy%"y"
'8/�"Continue with monitor's size [Y or y]?"A$
'B&�A$="Y"�A$="y" sx%=GIFsx:sy%=GIFsy
'L(�"Continuing with ";sx%"x by "sy%"y"
'V�
'`�
'j)GIF=�#c%:�GIF � &40 flag=501:r$="FN8"
'tJsetcodes%=�#c%:clearcode%=1<<setcodes%:st%=�#c%:cache%=�:cachebytes%=�
'~E� table%(1<<12):stk%=�dim(1<<13):buf%=�dim(280):plbuff%=�dim(sx%)
'�&�I%=0�clearcode%-1:table%(I%)=I%:�
'�Ainfo$="GIF file, "+�sx%+" by "+�sy%+" pixels, "+�bits(quant%)
'� � 600
'�quant%=8:�#c%=&5c:�C%=0�255
'�9r%(C%)=�#c%/255*F:g%(C%)=�#c%/255*F:b%(C%)=�#c%/255*F
'��
'��#c%=&36e:sy%=�HW:sx%=�HW
'�5st%=&380:�#c%=st%:rowbytes%=sx%:r$="FN8":cache%=�
'�Einfo$=".PIC image, "+�sx%+" by "+�sy%+" pixels, 8 bits per pixel"
'� � 700
'�$quant%=8:�#c%=0:a$=�#c%:st%=�#c%
'� sx%=�a$:sy%=�(�a$,�a$," ")))
( 6�nopal:input=24:step24=3:rowbytes%=sx%*3:r$="FN24"
(
!rbo%=0:gbo%=1:bbo%=2:cache%=�
(Jinfo$="MTV .pic image, "+�sx%+" by "+�sy%+" pixels, 24 bits per pixel"
( � 800
(()sx%=512:sy%=256:�scale% ymul%=ymul%*2
(24plbuff%=�dim(sx%):rep%=0:wt%=0:wtsx%=plbuff%+sx%
(<cache%=�:cachebytes%=�
(F@�C%=0�255:r%(C%)=(C%�63)/63*F:�:g%()=r%():b%()=r%():quant%=6
(PJinfo$="Watford digitiser picture, 512 by 256 pixels, 6 bits per pixel"
(Z � 801
(d;sx%=512:sy%=256:input=24:quant%=6:�scale% ymul%=ymul%*2
(n0rep1%=0:wt1%=0:rep2%=0:wt2%=0:rep3%=0:wt3%=0
(x=buff%=�dim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+2*sx%
(�:wtsx1%=buff%+sx%:wtsx2%=buff%+2*sx%:wtsx3%=buff%+3*sx%
(�7�C%=0�255:r%(C%)=(C%�63)/63*F:�:g%()=r%():b%()=r%()
(�Rinfo$="Triple Watford digitiser picture, 512 by 256 pixels, 18 bits per pixel"
(� � 900
(�'quant%=8:st%=0:�#c%=0:�#c%=65536 �
(�7sx%=256:sy%=256:�scale% ymul%=ymul%*2:xmul%=xmul%*2
(��
(�sx%=512:sy%=512
(��
(�S�C%=0�255:r%(C%)=C%/255*F:�:g%()=r%():b%()=r%():rowbytes%=sx%:r$="FN8":cache%=�
(�?info$="AIM .raw image, 256 by 256 pixels, 8 bits per pixel"
(� � 901
(�quant%=4:�#c%=65536 �
)7sx%=256:sy%=256:�scale% ymul%=ymul%*2:xmul%=xmul%*2
)�
)sx%=512:sy%=512
)"�
),=buff%=�dim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+sx%*2
)63�C%=0�255:r%(C%)=C%/255*F:�:g%()=r%():b%()=r%()
)@Oinput=24:info$="Hawk V9 Triple image, 256 by 256 pixels, 24 bits per pixel"
)J � 902
)TBquant%=4:�#c%=8:sx%=�W:rowbytes%=sx%*3/2:sy%=�W:st%=20:�#c%=20
)^�scale% ymul%=ymul%*2
)hMplbuff%=�dim(sx%*3):rb%=plbuff%:gb%=plbuff%+sx%:bb%=plbuff%+sx%*2:rbo%=-1
)r@�C%=0�255:r%(C%)=(C%�&F)/&F*F:�:g%()=r%():b%()=r%():cache%=�
)|binput=24:info$="Hawk V9/Snapshot Colour image, "+�sx%+" by "+�sy%+" pixels, 12 bits per pixel"
)� � 903
)�\quant%=5:�#c%=8:sx%=�W:rowbytes%=sx%*2:sy%=�W:st%=20:�#c%=20:cache%=�:r$="FN16":flag=700
)�-� rpal%(255),gpal%(255):input=16:step24=2
)�
�C%=0�255
)�"gpal%(C%)=(C%>>5)<<8 � (C%�31)
)�+rpal%(C%)=((C%>>2)�31)<<16 � (C%�3)<<11
)��
)�1�C%=0�31:r%(C%)=C%/31*F:�:g%()=r%():b%()=r%()
)�_input=16:info$="Hawk V9 mk II Colour image, "+�sx%+" by "+�sy%+" pixels, 16 bits per pixel"
)� � 950
)�@quant%=8:�#c%=0:sx%=512:rowbytes%=512:sy%=512:st%=0:flag=900
)�E�C%=0�255:r%(C%)=C%/255*F:�:g%()=r%():b%()=r%():r$="FN8":cache%=�
)�Finfo$="Wild Vision V12 image, 512 by 512 pixels, 8 bits per pixel"
*
� 1000
*Tquant%=4:sx%=640:sy%=256:�defpal:st%=�W:r$="FN"+�(1000+�W):�scale% ymul%=ymul%*2
*&%buff%=�dim(sx%):ctable%=�dim(st%)
*0"ș12,4,c%,ctable%,st%:st%=�#c%
*:.pa%=ctable%:rep%=0:rep2%=0:pasx%=buff%+sx%
*DAinfo$="ProArtisan image, 640 by 256 pixels, 8 bits per pixel"
*N
� 1100
*X@quant%=1:�#c%=4:sx%=�beW:sy%=�beW:input=�beW:bigendianbits=�
*bS%=�beW:S%=�beW
*lIcache%=�:�S%=2 cachebytes%=�:info$="Byte Encoded " �info$="":r$="FN8"
*vC%=�beW
*�D%=�beW
*�Ȏ C% �
*� � 1,2
*�$�I%=0�D%/3-1:r%(I%)=�#c%/255*F:�
*�$�I%=0�D%/3-1:g%(I%)=�#c%/255*F:�
*�$�I%=0�D%/3-1:b%(I%)=�#c%/255*F:�
*�
*�Ȏ input �
*�� 1:r%(0)=F:g%(0)=F:b%(0)=F
*�� 4,8:�nopal
*�� 24:�nopal
*��
*��
+Ȏ input �
+ � 1:rowbytes%=(sx%+15>>4)<<1
+� 4:rowbytes%=(sx%+3>>2)<<1
+ � 8:rowbytes%=(sx%+1>>1)<<1
+*J� 24:rowbytes%=(3*sx%+1>>1)<<1:r$="FN24":rbo%=0:gbo%=1:bbo%=2:step24=3
+4�S%=1 bbo%=0:rbo%=2
+>&:� 42,"Can't do this Sun pixrect"
+H�
+RMst%=D%+&20:rep%=0:�cachebytes% plbuff%=�dim(rowbytes%):plbytes%=rowbytes%
+\Binfo$+="Sun image, "+�sx%+" by "+�sy%+" pixels, "+�bits(input)
+f
� 1200
+p>quant%=8:sx%=800:sy%=800:st%=1600:�#c%=st%:vflip%=� vflip%
+z*�nopal:r$="FN8":rowbytes%=sx%:cache%=�
+�Iinfo$="TimeStep satellite image, 800 by 800 pixels, 8 bits per pixel"
+�
� 1300
+�?quant%=8:sx%=128:sy%=256:st%=0:�#c%=0:�scale% xmul%=xmul%*2
+�*�nopal:r$="FN8":rowbytes%=sx%:cache%=�
+�@info$="satellite image, 128 by 256 pixels, 8 bits per pixel"
+�
� 1301
+�;input=24:quant%=8:sx%=128:sy%=256:�scale% xmul%=xmul%*2
+�Obuff%=�dim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+2*sx%:�nopal:r$="FN901"
+�Hinfo$="Triple satellite image, 128 by 256 pixels, 24 bits per pixel"
+�
� 1400
+�%planar%=�:�#c%=0:Z%=�HW:�Z%>255 �
+�+st%=�beHW*2:planes%=�beHW:patlen%=�beHW
+�+pw%=�beHW:ph%=�beHW:sx%=�beHW:sy%=�beHW
,�
,Cst%=�HW*2:input=�HW:patlen%=�HW:pw%=�HW:ph%=�HW:sx%=�HW:sy%=�HW
,�
,$
�scale% �
,.#xmul%=xmul%*pw%:xdiv%=xdiv%*282
,8#ymul%=ymul%*ph%:ydiv%=ydiv%*282
,B�
,LWrowbytes%=sx%+7>>3:pbuff%=�dim(sx%):plbytes%=rowbytes%*planes%:buff%=�dim(plbytes%)
,V�#c%=st%:vrep%=0
,`M�C%=0�(1<<planes%)-1:r%(C%)=F-C%/((1<<planes%)-1)*F:�:g%()=r%():b%()=r%()
,jBinfo$="IMG file, "+�sx%+" by "+�sy%+" pixels, "+�bits(planes%)
,t
� 1500
,~"�#c%=4:dir%=�tiff(4):�#c%=dir%
,�6rgb=�:greyunit=100:planar%=1:fillorder=1:resunit=2
,�)xnum%=90:xdenom%=1:ynum%=90:ydenom%=1
,�E%=�tiff(3):�Z%=1�E%
,�'T%=�tiff(3):D%=�tiff(3):C%=�tiff(4)
,�a�C%>1 V%=�tiff(4) ��D%=2 �#c%=dir%+2+Z%*12 ��D%<4 V%=�tiff(D%):�#c%=dir%+2+Z%*12 �V%=�tiff(4)
,�Ȏ T% �
,�� 256:sx%=V%
,�� 257:sy%=V%
,�� 258:�C%>1 �
,��D%*C%>6 �
,��#c%=V%:quant%=�tiff(D%)
- (input=quant%:�I%=1�C%-1:V%=�tiff(D%)
-
P�V%<>quant% �42,"Can't do RGB TIFF with different numbers of bits per pixel"
-
input+=V%
-�:�nopal
-(�
-2 quant%=V% � &FF:input=quant%
-<5�I%=0�(1<<quant%)-1:r%(I%)=I%/((1<<quant%)-1)*F:�
-Fg%()=r%():b%()=r%()
-P�
-Z�#c%=dir%+2+Z%*12
-d�
-nquant%=V%:input=quant%
-x5�I%=0�(1<<quant%)-1:r%(I%)=I%/((1<<quant%)-1)*F:�
-�g%()=r%():b%()=r%()
-��
-�� 259:compression=V%
-�/� 262:photometric=V%:�V%=0 invert%=�invert%
-�� 266:fillorder=V%
-�!� 273:stc%=C%:stv%=V%:std%=D%
-�1� 277:sampperpix%=V%:input=quant%*V%:rgb=V%=3
-�� 278:striprows%=V%
-�-� 279:stcbyte%=C%:stvbyte%=V%:stdbyte%=D%
-�1� 282:�#c%=V%:xnum%=�tiff(4):xdenom%=�tiff(4)
-��#c%=dir%+2+Z%*12
-�1� 283:�#c%=V%:ynum%=�tiff(4):ydenom%=�tiff(4)
-��#c%=dir%+2+Z%*12
.,� 284:planar%=V%:�planar%=2 input=quant%
.� 290:greyunit=10^V%
.<� 291:�#c%=V%:�I%=0�C%-1:r%(I%)=�tiff(D%)/greyunit/2*F:�
."g%()=r%():b%()=r%()
.,�#c%=dir%+2+Z%*12
.6� 296:resunit=V%
.@� 317:hpredict%=V%
.J8� 320:�#c%=V%:�I%=0�C%/3-1:r%(I%)=�tiff(3)/65535*F:�
.T*�I%=0�C%/3-1:g%(I%)=�tiff(3)/65535*F:�
.^*�I%=0�C%/3-1:b%(I%)=�tiff(3)/65535*F:�
.h�#c%=dir%+2+Z%*12
.r
.|J�info% �"Ignoring tag ";T%" datatype "D%" count "C%" value/pointer "V%
.��
.��
.�� st%(stc%):�stc%>1 �
.�0�#c%=stv%:�I%=0�stc%-1:st%(I%)=�tiff(std%):�
.��
.�st%(0)=stv%
.��
.�Ȏ compression �
.�� 0,1:info$=""
.�)� 2:info$="CCITT Group 3 compressed "
.�+� 5:info$="LZW compressed ":r$="FN1505"
.�n�hpredict%=2 �info$+="horizontal differenced " ��hpredict%>2 info$+=" unknown predictor ("+�hpredict%+") "
/'setcodes%=8:clearcode%=1<<setcodes%
/3� table%(1<<12):stk%=�dim(1<<13):buf%=�dim(280)
/&�I%=0�clearcode%-1:table%(I%)=I%:�
/&4� 32773:info$="PackBits compressed ":r$="FN1501"
/0 � 6:info$="JPEG compressed "
/:2 info$="Compress "+�compression+" - unknown "
/D�
/NBinfo$+="TIFF file, "+�sx%+" by "+�sy%+" pixels, "+�bits(input)
/XSbigendianbits=fillorder=1:�#c%=st%(0):stripptr=0:�striprows%>=sy% striprows%=-1
/bȎ input �
/l� 1:rowbytes%=sx%+7>>3
/v� 2:rowbytes%=sx%+3>>2
/�� 4:rowbytes%=sx%+1>>1
/�� 8:rowbytes%=sx%
/�� 24:rowbytes%=3*sx%
/�+ � 42,"Can't do "+�bits(input)+" TIFF"
/��
/�.�planar%=2 rowbytes%=rowbytes%*sampperpix%
/�I�planar%<>1 � rgb<>0 �42,"Can't do this style of TIFF yet" �planar%=�
/�� compression<2 �
/�Scache%=�:stripptr=-1:r$="FN8":�input=24 rbo%=0:gbo%=1:bbo%=2:step24=3:r$="FN24"
/��
/�'�compression=5 �compression=32773 �
/�-cache%=�:cachebytes%=rowbytes%*striprows%
/�0plbuff%=�dim(rowbytes%):rowstogo%=striprows%
0\�input=24 rb%=plbuff%:gb%=plbuff%+1:bb%=plbuff%+2:r$="FN"+�(��r$,3)+10):step24=3:rbo%=-1
0�
0.buff%=�dim(rowbytes%):rowstogo%=striprows%
0 N�input=24 rb%=buff%:gb%=buff%+1:bb%=buff%+2:r$="FN"+�(��r$,3)+10):step24=3
0*�
04�
0>
�scale% �
0HS%=resunit:�S%=2 S%=90
0R�S%=3 S%=35
0\,xdiv%=xdiv%*xnum%:xmul%=xmul%*xdenom%*S%
0f,ydiv%=ydiv%*ynum%:ymul%=ymul%*ydenom%*S%
0p�
0z�r$="FN1500" r$="FN8"
0�
� 1600
0��#c%=12:camg=0:planar%=�:�
0�&S$=��#c%+��#c%+��#c%+��#c%:S%=�beW
0�Ȏ S$ �
0�C� "BMHD":sx%=�beHW:sy%=�beHW:S%=�W:planes%=�#c%:masking%=�#c%=1
0�6compression=�#c%:S%=�#c%+�HW:U%=�#c%:V%=�#c%:S%=�W
0�)�scale% ymul%=ymul%*V%:ydiv%=ydiv%*U%
0�K�I%=0�(1<<planes%)-1:r%(I%)=I%/((1<<planes%)-1)*F:�:g%()=r%():b%()=r%()
0�B� "CMAP":S%=�#c%+S%:�I%=0�(1<<planes%)-1:r%(I%)=(�#c%>>4)/15*F
0�1g%(I%)=(�#c%>>4)/15*F:b%(I%)=(�#c%>>4)/15*F:�
0�G�#c%=S%:�info% �"Warning: truncated IFF CMAP information to 4 bits"
0�;� "CAMG":camg=�beW:�info% �"Amiga viewport mode ";~camg
0�� "BODY":st%=�#c%
14 � info% �"Ignoring IFF property "S$" size ";S%
1�#c%=�#c%+S%
1�
1$9�S$="BODY":�compression info$="Compressed " �info$=""
18+ham=(camg � &800)<>0:�ham info$+="HAM "
1B4half=(camg � &80)<>0:�half info$+="half-bright "
1Ln�half half%=1<<planes%-1:�I%=0�half%-1:r%(I%+half%)=r%(I%)/2:g%(I%+half%)=g%(I%)/2:b%(I%+half%)=b%(I%)/2:�
1VCinfo$+="IFF file, "+�sx%+" by "+�sy%+" pixels, "+�bits(planes%)
1`+�masking% info$+=" with mask (ignored)"
1j7rowbytes%=(sx%+15>>4)<<1:plbytes%=rowbytes%*planes%
1t9pbuff%=�dim(sx%):r$="FN"+�(1600+compression):cache%=�
1~�compression �
1�(cachebytes%=�:plbuff%=�dim(plbytes%)
1��
1�Qrealrowbytes%=rowbytes%:rowbytes%=plbytes%:�masking% rowbytes%+=realrowbytes%
1��
1��#c%=st%
1�
� 1700
1�Bsx%=640:rowbytes%=80:sy%=350:planes%=4:plbytes%=4*80:planar%=�
1�3buff%=�dim(80*4):pbuff%=�dim(640):G=F/3:H=F*2/3
1�(r%()=0,0,0,0,F,F,F,H,G,G,G,G,F,F,F,F
1�(g%()=0,0,F,F,0,0,F,H,G,G,F,F,G,G,F,F
1�(b%()=0,F,0,F,0,F,0,H,G,F,G,F,G,F,G,F
1�Vmasking%=�:r$="FN1600":st%=16:�#c%=16:cache%=�:realrowbytes%=80:rowbytes%=plbytes%
2 Sinfo$="PC EGA '.dsp' file, 640 by 350 pixels, 4 bits per pixel (fixed palette)"
2
� 1800
2?sx%=72*8:sy%=720:quant%=1:input=1:�#c%=st%:plbuff%=�dim(72)
2cache%=�:cachebytes%=�
2(Qr%(0)=F:g%(0)=F:b%(0)=F:bigendianbits=�:rowbytes%=72:r$="FN1501":rowstogo%=-1
22G�scale% xmul%=xmul%*90:xdiv%=xdiv%*72:ymul%=ymul%*90:ydiv%=ydiv%*72
2<>info$="MacPaint file, 576 by 720 bits, creator id "+�S$,4)
2F
� 1850
2P�#c%=552
2Z4code%=�beHW:�code%=1 �#c%=�#c%+�beHW:code%=�beHW
2dȎ code% �
2nI� &98:rowbytes%=�beHW:�(rowbytes% �&8000)=0 �42,"PICT without Pixmap"
2x3sy%=�beHW:sx%=�beHW:sy%=�beHW-sy%:sx%=�beHW-sx%
2�<junk%=�HW:packtype%=�beHW:junk%=�W:resx%=�beW:resy%=�beW
2�F�beHW<>0 �#c%:�42,"ChangeFSI expected Mac PICT2 pixeltype=Chunky"
2�&bpp%=�beHW:junk%=�beHW:junk%=�beHW
2�$junk%=�beW:junk%=�beW:junk%=�beW
2�junk%=�beW:junk%=�beHW
2�_C%=�beHW:�I%=0�C%:J%=�beHW:r%(J%)=�beHW/65535*F:g%(J%)=�beHW/65535*F:b%(J%)=�beHW/65535*F:�
2�R� &9A:junk%=�W:rowbytes%=�beHW:�(rowbytes% �&8000)=0 �42,"PICT without Pixmap"
2�3sy%=�beHW:sx%=�beHW:sy%=�beHW-sy%:sx%=�beHW-sx%
2�<junk%=�HW:packtype%=�beHW:junk%=�W:resx%=�beW:resy%=�beW
2�J�beHW<>16 �#c%:�42,"ChangeFSI expected Mac PICT2 pixeltype=RGBDirect"
2�'bpp%=�beHW:comps%=�beHW:junk%=�beHW
2�junk%=�beW:junk%=�beW
2�junk%=�beHW:junk%=�beHW
3V�bpp%>16 �nopal �J%=2^(bpp%�3):�I%=0�J%-1:r%(I%)=I%/(J%-1)*F:�:g%()=r%():b%()=r%()
3/�bpp%=32 � comps%=3 bpp%=24:rowbytes%=3*sx%
3C:�#c%:�42,"ChangeFSI can't understand Mac PICT2 code "+�~code%
3"�
3,3junk%=�beHW:junk%=�beHW:junk%=�beHW:junk%=�beHW
363junk%=�beHW:junk%=�beHW:junk%=�beHW:junk%=�beHW
3@junk%=�beHW
3JNcache%=�:cachebytes%=�:bigendianbits=�:st%=�#c%:rowbytes%=rowbytes%��&8000
3TW�scale% xmul%=xmul%*90*65536:xdiv%=xdiv%*resx:ymul%=ymul%*90*65536:ydiv%=ydiv%*resy
3^@info$="Mac PICT2, "+�sx%+" by "+�sy%+" pixels, "+�bits(bpp%)
3h%plbuff%=�dim(rowbytes%):�bpp%>8 �
3rTrbo%=-1:rb%=plbuff%+sx%:gb%=plbuff%+sx%*2:bb%=plbuff%+sx%*3:r$="FN1851":input=24
3|;�comps%=3 rb%=plbuff%:gb%=plbuff%+sx%:bb%=plbuff%+sx%*2
3��
3�
� 1900
3��#c%=1:C%=�#c%
3�?E%=�#c%:�E%<>1 � 42,"ZSoft .PCX file with unknown encoding"
3�7E%=�#c%:sx%=�HW:sy%=�HW:sx%=�HW+1-sx%:sy%=�HW+1-sy%
3�N�scale% xmul%=xmul%*90:xdiv%=xdiv%*�HW:ymul%=ymul%*90:ydiv%=ydiv%*�HW ��W
3�H�#c%=65:planes%=�#c%:planar%=planes%>1:rowbytes%=�HW:bpp%=E%*planes%
3�pcxpal=16:�bpp%>4 � C%=5 �
3�*�#c%=�#c%-769:�#c%=12 pcxpal=�#c%-768
3��
3�5�#c%=pcxpal:E%=0:�C%=0�(1<<bpp%)*3-1:E%=E%��#c%:�
3�3�info% �".PCX palette mask established at ";~E%
3��E%=0 �
4E�C%=0�(1<<bpp%)-1:r%(C%)=C%/((1<<bpp%)-1)*F:�:g%()=r%():b%()=r%()
4�
4!�#c%=pcxpal:�C%=0�(1<<bpp%)-1
4&Er%(C%)=(�#c%�E%)/E%*F:g%(C%)=(�#c%�E%)/E%*F:b%(C%)=(�#c%�E%)/E%*F
40�
4:�
4D�rewind
4NLplbytes%=rowbytes%*planes%:plbuff%=�dim(plbytes%):cache%=�:cachebytes%=�
4XE�planar% pbuff%=�dim(sx%) �input=bpp%:bigendianbits=�:r$="FN1100"
4bFinfo$="ZSoft .PCX file, "+�sx%+" by "+�sy%+" pixels, "+�bits(bpp%)
4l
� 2000
4v8�#c%=0:L%=�#c%:C%=�#c%:I%=�#c%:J%=�HW:K%=�HW:M%=�#c%
4�Csx%=�W:sx%=�HW:sy%=�HW:B%=�#c%:ID%=�#c%:�ID%�&10 hflip%=�hflip%
4� �(ID% �&20)=0 vflip%=�vflip%
4��#c%=�#c%+L%:Ȏ C% �
4�� 1:�M%=&18 �
4��C%=J%�K%-1
4�9b%(C%)=�#c%/255*F:g%(C%)=�#c%/255*F:r%(C%)=�#c%/255*F
4��
4��
4��
4� �nopal
4��
4�st%=�#c%
4�Ȏ I% �
5� 1,2,3:cache%=�:�B%>8 �
5�B%>16 �
5Linput=24:bbo%=0:gbo%=1:rbo%=2:step24=B%�8:r$="FN24":rowbytes%=step24*sx%
5 �
5*rowbytes%=sx%*2
547� rpal%(255),gpal%(255):input=16:step24=2:r$="FN16"
5>
�C%=0�255
5H&gpal%(C%)=(C%>>5)<<8 � (C%�31)<<16
5R%rpal%(C%)=(C%>>2)�31 � (C%�3)<<11
5\�
5f1�C%=0�31:r%(C%)=C%/31*F:�:g%()=r%():b%()=r%()
5p�
5z�
5�r$="FN8":rowbytes%=sx%
5��
5�Iinfo$="Truevision TGA image, "+�sx%+" by "+�sy%+" pixels, "+�bits(B%)
5�D� 9,10,11:step24=B%�8:rowbytes%=step24*sx%:buff%=�dim(rowbytes%)
5��B%>8 �
5��B%>16 �
5�:input=24:bb%=buff%:gb%=buff%+1:rb%=buff%+2:r$="FN2002"
5��
5�9� rpal%(255),gpal%(255):input=16:step24=2:r$="FN2001"
5�
�C%=0�255
5�&gpal%(C%)=(C%>>5)<<8 � (C%�31)<<16
5�%rpal%(C%)=(C%>>2)�31 � (C%�3)<<11
5��
61�C%=0�31:r%(C%)=C%/31*F:�:g%()=r%():b%()=r%()
6�
6�
6$Minfo$="Truevision TGA RLE image, "+�sx%+" by "+�sy%+" pixels, "+�bits(B%)
6.�
68
� 2100
6B?quant%=6:sx%=512:rowbytes%=2*sx%:sy%=256:cache%=�:r$="FN16"
6L-� rpal%(255),gpal%(255):input=16:step24=2
6V
�C%=0�255
6` gpal%(C%)=C%>>3 � (C%�7)<<11
6j%rpal%(C%)=(C%�7)<<8 � (C%>>3)<<16
6t�
6~'�C%=0�31:r%(C%)=C%/31*F:�:b%()=r%()
6��C%=0�63:g%(C%)=C%/63*F:�
6��scale% ymul%=ymul%*2
6�Hinfo$="Pineapple image, 512 by 256 pixels, 16 bits per pixel":�#c%=7
6�
� 2200
6�9quant%=8:step24=1:�#c%=0:s$=�#c%:E%=�s$,":"):st%=�#c%
6�7sx%=��s$,E%+1):sy%=��s$,E%+2+��sx%):�nopal:input=24
6�Arowbytes%=sx%*3:rbo%=0:gbo%=sx%:bbo%=2*sx%:cache%=�:r$="FN24"
6�Ginfo$="Irlam image, "+�sx%+" by "+�sy%+" pixels, 24 bits per pixel"
6�
� 2250
6�H�#c%=16:sx%=�W:sy%=�W:� rpal%(255),gpal%(255),bpal%(255),table%(255)
6��C%=0�255:D%=C%�1
6�table%(C%)=(D%-16)/219*F
7 �D%�128 D%-=256
7
)r%(C%)=�(D%/160*F):b%(C%)=�(D%/126*F)
7>g%(C%)=�(-D%/160*rwt/gwt*F):gpal%(C%)=�(-D%/126*bwt/gwt*F)
7�
7(,table%()=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
725st%=32:�#c%=32:cache%=�:rowbytes%=2*sx%:input=411
7<<info$="Irlam YUV 4:1:1 file "+�sx%+" by "+�sy%+" pixels"
7F
� 2300
7P9�#c%=6:sx%=�HW:sy%=�HW:D%=�#c%:ncolors%=�#c%:input=24
7Z;vflip%=�vflip%:quant%=�#c%:ncmap%=�#c%:cmaplen%=1<<�#c%
7d!�nopal:back%=�dim(4):!back%=0
7nclrfirst%=D%�1
7x�(D%�2)=0 �
7�$�I%=0�ncolors%-1:back%?I%=�#c%:�
7��(ncolors%�1)=0 �#c%
7��
7��D%�4 alpha%=�dim(sx%)
7��ncmap%>0 �
7�)�I%=0�cmaplen%-1:r%(I%)=�HW/&FF00*F:�
7�)�I%=0�cmaplen%-1:g%(I%)=�HW/&FF00*F:�
7�)�I%=0�cmaplen%-1:b%(I%)=�HW/&FF00*F:�
7��
7��D%�8 �
7�%�#c%=�HW+�#c%:�#c%�1 �#c%=�#c%+1
7��
7�Hst%=�#c%:buff%=�dim(sx%*3):rb%=buff%:gb%=buff%+1*sx%:bb%=buff%+2*sx%
8�rewind
8Pinfo$="Utah rle image, "+�sx%+" by "+�sy%+" pixels, "+�bits(ncolors%*quant%)
8
� 2400
8")�#c%=&0a:st%=�W:pal%=�W:sx%=�W:sy%=�W
8,6�#c%=&1c:input=�#c%:bigendianbits=�:vflip%=�vflip%
86Ȏ input �
8@� 1:rowbytes%=sx%+7>>3
8J� 4:rowbytes%=sx%+1>>1
8T� 8:rowbytes%=sx%
8^4 � 42,".BMP file of unusual depth ("+�input+")"
8h�
8rrowbytes%=rowbytes%+3��3
8|�#c%=&36:�C%=0�2^input-1
8�?b%(C%)=�#c%/255*F:g%(C%)=�#c%/255*F:r%(C%)=�#c%/255*F:�#c%
8��
8�r$="FN8":st%=�#c%:cache%=�
8�Ninfo$="Windows 3.0 .BMP image, "+�sx%+" by "+�sy%+" pixels, "+�bits(input)
8�
� 2500
8�2�#c%=0:s$="":C%=�#c%:ȕC%<>0 s$+=�C%:C%=�#c%:�
8�7s$+=" version "+äW:sx%=�W:sy%=�W:input=�W:cache%=�
8�_info$="!Translator Clear format made by "+s$+", "+�sx%+" by "+�sy%+" pixels, "+�bits(input)
8��input>8 �
8�K�nopal:input=24:step24=3:rowbytes%=3*sx%:rbo%=0:gbo%=1:bbo%=2:r$="FN24"
8��
8��C%=0�2^input-1
8�9r%(C%)=�#c%/255*F:g%(C%)=�#c%/255*F:b%(C%)=�#c%/255*F
9�
9"input=8:r$="FN8":rowbytes%=sx%
9�
9&st%=�#c%
90
� 2600
9:�#c%=0:C%=�#c%
9DD%=�#c%:Ȏ D% �
9N!� 0:sx%=320:sy%=200:planes%=4
9X!� 1:sx%=640:sy%=200:planes%=2
9b!� 2:sx%=640:sy%=400:planes%=1
9l? �42,"ChangeFSI knows nothing of "+�C%+" type Degas files"
9v�
9�]�I%=0�(1<<input)-1:D%=�beHW:r%(I%)=(D%>>8�7)/7*F:g%(I%)=(D%>>4�7)/7*F:b%(I%)=(D%�7)/7*F:�
9�<cache%=�:planar%=�:masking%=�:st%=34:�#c%=34:r$="FN1600"
9�Hrowbytes%=(sx%+15>>4)<<1:plbytes%=rowbytes%*planes%:pbuff%=�dim(sx%)
9�j�C%�128 r$="FN1601":flag=1600:cachebytes%=�:plbuff%=�dim(plbytes%) �realrowbytes%=2:rowbytes%=plbytes%
9�Cinfo$="Degas file "+�sx%+" by "+�sy%+" pixels, "+�bits(planes%)
9�
� 2700
9��#c%=4:sx%=�HW:sy%=�HW
9�Ȏ �HW �
9�2� &AF:rowbytes%=sx%:cache%=�:r$="FN8":st%=&30A
9�R �#c%:� 42,"Panic in ColoRIX reading - ChangeFSI largely ignorant of format!"
9��
9��C%=0�2^input-1
9�6r%(C%)=�#c%/63*F:g%(C%)=�#c%/63*F:b%(C%)=�#c%/63*F
:�
:�#c%=st%
:Cinfo$="ColoRIX file "+�sx%+" by "+�sy%+" pixels, "+�bits(input)
:
� 2800
:*!�#c%=0:� s$=�fits:Ȏ �s$,8) �
:4Q� "SIMPLE ":�s$,30,1)<>"T" �42,"ChangeFSI can only read Simple FITS format"
:>� "BITPIX ":input=��s$,10)
:HJ� "NAXIS ":�s$,10)<>2 �42,"ChangeFSI can only read 2d FITS images"
:R� "NAXIS1 ":sx%=��s$,10)
:\� "NAXIS2 ":sy%=��s$,10)
:f� "END "
:p' �info% �"Ignoring FITS record "s$
:z�
:���s$,8)="END "
:�.st%=(�#c%�2880 + 1)*2880:cache%=�:�#c%=st%
:�Ȏ input �
:�%� 8:r$="FN8":rowbytes%=sx%:�nopal
:�C� 16:rowbytes%=2*sx%:� rpal%(255),gpal%(255):step24=2:r$="FN16"
:�
�C%=0�255
:�gpal%(C%)=C%<<8
:�rpal%(C%)=C%
:� �:cheat%=0:�invert% cheat%=F
:�e�C%=0�255:r%(C%)=cheat%+C%/65535*F:g%(C%)=((C%�&80)<<8)/65535*F:b%(C%)=cheat%:�:rwt=1:gwt=1:bwt=1
:�Q � 42,"ChangeFSI can't read a FITS image with this number of bits per pixel"
:��
:�@info$="FITS file "+�sx%+" by "+�sy%+" pixels, "+�bits(input)
;
� 2900
;<�#c%=4:sx%=�beHW:sy%=�beHW:�#c%=&42:input=�beHW:C%=�beHW
;=rowbytes%=�beHW:C%=�beW:st%=�beW:�#c%=st%:r$="FN8":�nopal
;$#� rpal%(15),gpal%(15),bpal%(15)
;.Irpal%()=&e6,&23,&e6,&7f,&17,&00,&a1,&45,&e6,&4a,&e6,&73,&6e,&47,&8a,0
;8Igpal%()=&e6,&78,&00,&23,&a1,&73,&2e,&2e,&c8,&a6,&75,&40,&b8,&78,&55,0
;BIbpal%()=&b8,&e6,&00,&a1,&17,&2e,&0c,&2e,&00,&c6,&00,&e6,&00,&00,&00,0
;Lk�C%=&80�&8F:r%(C%)=rpal%(C%-&80)/255*F:g%(C%)=gpal%(C%-&80)/255*F:b%(C%)=bpal%(C%-&80)/255*F:�:cache%=�
;VFinfo$="Apollo GPR file "+�sx%+" by "+�sy%+" pixels, "+�bits(input)
;`
� 3000
;jHsx%=720:sy%=�#c%/1440:� rpal%(255),gpal%(255),bpal%(255),table%(255)
;~� �
;�
�C%=0�255
;�table%(C%)=(C%-16)/219*F
;�>r%(C%)=(C%-128)/186*0.624*F:rpal%(C%)=(C%-128)/160*0.952*F
;�?g%(C%)=-(C%-128)/186*0.64*F:gpal%(C%)=-(C%-128)/160*0.277*F
;�=b%(C%)=(C%-128)/186*1.73*F:bpal%(C%)=-(C%-128)/160*1.11*F
;��
;��
;�
�C%=0�255
;�table%(C%)=(C%-16)/219*F
;�5r%(C%)=�((C%-128)/160*F):b%(C%)=�((C%-128)/126*F)
;�Jg%(C%)=�(-(C%-128)/160*rwt/gwt*F):gpal%(C%)=�(-(C%-128)/126*bwt/gwt*F)
<