Home » Archimedes archive » Archimedes World » AW Readers Services Special FebMar 92.adf » !ArcWorld/Goodies/ChangeFSI/Library/ChangeFSI
!ArcWorld/Goodies/ChangeFSI/Library/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 » Archimedes World » AW Readers Services Special FebMar 92.adf |
Filename: | !ArcWorld/Goodies/ChangeFSI/Library/ChangeFSI |
Read OK: | ✔ |
File size: | 12643 bytes |
Load address: | FFFFFB42 |
Exec address: | 178A4E3B |
File contents
10REM > %.ChangeFSI 20REM 30REM This program written by Roger Wilson at Acorn Computers April-Dec 1989 40REM - please send bugs back! 50REM Subject to change without notice 60REM 70REM all information is held in 32 bit fixed point with the . at bit 28 80REM this gives an integer range of 0-15 (OR negative numbers!) 90REM 100REM ChangeFSI is written so as to allow use from CLI and from other BASIC 110REM programs such as WIMP front ends 120REM 130SYS"OS_GetEnv" TO A$:REM Read CLI string 140mem=HIMEM:REM Remember memory size 150END=&4000000:REM Grab all the memory 160foo%=0:A%=FNChangeFSI(A$,-1,-1,0,-1,-1,foo%,TRUE):REM Call program 170END=mem:REM Release memory 180END 190REM A$ Command String 200REM spritearea% address or -1 210REM 220REM workspace%<0 and worklimit%=0 - Use BASIC variable space 230REM 240REM workspace%<0 - ChangeFSI's slot handling 250REM worklimit%=current end of wimp slot will be used. 260REM 270REM workspace%>=0 - Use memory at workspace% 280REM worklimit%=end of workspace% 290REM 300REM save% TRUE = save to output file given in command string 310REM output% TRUE = print messages (and histograms if appropriate) 320REM during processing 330REM ram% receives address of sprite area 340REM fast% TRUE = switch to mode 0 for processing 350REM 360REM Returned values 370REM 0 =Image processed as requested 380REM 1 =Information messages printed 390REM 100=Error - image may not be complete 400REM 410DEF FNChangeFSI(A$,spritearea%,workspace%,worklimit%,save%,output%,RETURN ram%,fast%) 420LOCAL A$(),r%(),g%(),b%(),rpal%(),gpal%(),bpal%(),table%(),cl%(),xl%(),xp%() 430LOCAL rm%(),rm1%(),rm2%(),vals%(),nl%(),z2%(),A%(),B%(),new%(),st%() 440WHILELEFT$(A$,1)<>" "ANDLENA$<>0 A$=MID$(A$,2):ENDWHILE 450WHILELEFT$(A$,1)=" " A$=MID$(A$,2):ENDWHILE 460WHILERIGHT$(A$,1)=" " A$=LEFT$(A$):ENDWHILE 470IFFNuc(LEFT$(A$,5))="-QUIT" THEN 480 A$=MID$(A$,7):WHILELEFT$(A$,1)<>" "ANDLENA$<>0 A$=MID$(A$,2):ENDWHILE 490 WHILELEFT$(A$,1)=" " A$=MID$(A$,2):ENDWHILE 500ENDIF 510DIM A$(100):ARG%=0:B%=INSTR(A$," ") 520WHILE B%<>0 530 ARG%+=1:A$(ARG%)=LEFT$(A$,B%-1):A$=MID$(A$,B%+1) 540 WHILE LEFT$(A$,1)=" ":A$=MID$(A$,2):ENDWHILE 550 B%=INSTR(A$," ") 560ENDWHILE 570IFA$<>"" ARG%+=1:A$(ARG%)=A$ 580IFFNuc(A$(1))="-HELP" THEN 590PRINT"Change picture Floyd Steinberg Integer version 0.69 (12 Dec 89): -help"' 600PRINT"Use: ChangeFSI <in file> <out file> <mode>[cdt] [<n>:<n> [<n>:<n>]] [options]" 610PRINT"Changes source multi-colour picture to output sprite 1, 2, 4 or 8 bit per pixel" 620PRINT"in specified mode, with suffix:" 630PRINT" c suffix for 2 or 4 bit colour in 2 or 4 bit per pixel modes" 640PRINT" for clustered pixel output in 1 bit per pixel modes" 650PRINT" d for digital rgb with 4 bit per pixel modes" 660PRINT" t for no tint in 8 bit modes and 16 level grey scale in 4 bit modes" 670PRINT"The pixel size is corrected for and the default is output of the same size as" 680PRINT"the input. Size ratios are output:input or = for scale to output size."' 690PRINT"Mode 'aim' writes an aim format output file."' 700PRINT"The -equal option performs histogram equalisation on monochrome output." 710PRINT"The -hflip option presents the picture left/right reversed." 720PRINT"The -info option gives details of the source image." 730PRINT"The -invert option inverts the colour range of the input image." 740PRINT"The -noscale option disables automatic pixel size correction." 750PRINT"The -range option expands the input's dynamic range to full scale." 760PRINT"The -sharpen option digitally sharpens the picture, -sharpen<n> overrides the" 770PRINT" default of 24: range 8(harsh)-31(soft)." 780PRINT"The -vflip option presents the picture up side down." 790PRINT"Example: changefsi input output 21t 1:2 = -sharpen12 -range"' 800PRINT"ChangeFSI -formats gives details of input formats." 810=1 820ENDIF 830IFFNuc(A$(1))="-FORMATS" THEN 840PRINT"Input formats understood are: Recognised by:"' 850PRINT"RISC OS 1, 2, 4 and 8 bit per pixel sprites [file type FF9]" 860PRINT"Watford digitiser pictures 512x256y64g [file type DFA]" 870PRINT" and triple red, green, blue seperations [directory of r,g,b DFA]" 880PRINT"ProArtisan compressed pictures 640x256y256c [file type DE2]" 890PRINT"TimeStep satellite image 800x800y256g [file type 7A0]" 900PRINT"TimeStep satellite image 128x256y256g [file type 300]" 910PRINT" and triple red, green, blue seperations [directory of r,g,b 300]" 920PRINT"AIM/Wild Vision Hawk V10 files 256x256y256g [file type 004]" 930PRINT"TIFF pictures [II* or MM* in file]" 940PRINT"Electronic Art's IFF ILBM pictures [ILBM in file]" 950PRINT"Sun 1 bit per pixel files [&956AA659 in file]" 960PRINT".PIC 8 bit per pixel files [AV_VO in file]" 970PRINT"MILLIPEDE PRISMA 768x576y 8 bit colour images [MILLIPEDE in file]" 980PRINT"Compuserve's GIF files up to 8 bit per pixel [GIF87a in file]" 990PRINT"ArVis 15 bit HIP.+LOP. sprites [file type FF9, HIP. name]" 1000PRINT"GEM IMG. images [&00010008 in file or name includes img.]" 1010PRINT"PC EGA .DSP images 640x350y16c [name includes dsp.]" 1020PRINT"MTV 24 bit pic. images [name includes pic.]" 1030PRINT"QRT 24 bit .raw images [name ends in .raw]" 1040PRINT"RT 24 bit run length coded image. files [name includes image.]" 1050=1 1060ENDIF 1070invert%=FALSE:range%=FALSE:sharpen%=FALSE:info%=FALSE 1080hist%=FALSE:equal%=FALSE:vflip%=FALSE:hflip%=FALSE:scale%=TRUE 1090IFARG%<3 THEN 1100 PRINT"ChangeFSI interactive input [try 'ChangeFSI -help' for command line]" 1110 INPUT"Source file: "s$,"Destination file: "f$,"Output mode: "m$ 1120 INPUT"(X)Scale (e.g. 2:1): "xs$:INPUT"Y Scale: "ys$ 1130 INPUT"Info on input picture?"a$:IFFNuc(LEFT$(a$,1))="Y" info%=TRUE 1140 INPUT"Invert picture colours?"a$:IFFNuc(LEFT$(a$,1))="Y" invert%=TRUE 1150 INPUT"Compute histogram of input?"a$:IFFNuc(LEFT$(a$,1))="Y" hist%=TRUE 1160 INPUT"Apply histogram equalisation?"a$:IFFNuc(LEFT$(a$,1))="Y" equal%=TRUE 1170 INPUT"Expand input dynamic range?"a$:IFFNuc(LEFT$(a$,1))="Y" range%=TRUE:equal%=FALSE 1180 INPUT"Sharpen picture by (e.g. 12 for harsh, 24 for soft) "a$ 1190 IFa$<>"" sharpen%=VALa$ 1200ELSE 1210 REPEAT A%=ARG% 1220 IFFNuc(A$(ARG%))="-INFO" info%=TRUE:A$(ARG%)="":ARG%-=1 1230 IFFNuc(A$(ARG%))="-HIST" hist%=TRUE:A$(ARG%)="":ARG%-=1 1240 IFFNuc(A$(ARG%))="-EQUAL" equal%=TRUE:range%=FALSE:A$(ARG%)="":ARG%-=1 1250 IFFNuc(A$(ARG%))="-RANGE" range%=TRUE:equal%=FALSE:A$(ARG%)="":ARG%-=1 1260 IFFNuc(A$(ARG%))="-INVERT" invert%=TRUE:A$(ARG%)="":ARG%-=1 1270 IFFNuc(A$(ARG%))="-NOSCALE" scale%=FALSE:A$(ARG%)="":ARG%-=1 1280 IFFNuc(A$(ARG%))="-VFLIP" vflip%=TRUE:A$(ARG%)="":ARG%-=1 1290 IFFNuc(A$(ARG%))="-HFLIP" hflip%=TRUE:A$(ARG%)="":ARG%-=1 1300 IFFNuc(LEFT$(A$(ARG%),8))="-SHARPEN" THEN 1310 sharpen%=TRUE:IFLENA$(ARG%)>8 sharpen%=VALMID$(A$(ARG%),9) 1320 A$(ARG%)="":ARG%-=1 1330 ENDIF 1340 UNTILA%=ARG% 1350 s$=A$(1):f$=A$(2):m$=A$(3):xs$=A$(4):ys$=A$(5) 1360ENDIF 1370IFoutput% ELSEinfo%=FALSE:REM if no output, then no info! 1380IFworkspace%>=0 THEN 1390 flex%=FALSE 1400ELSE 1410 IFworklimit%=0 THEN flex%=FALSE ELSE flex%=TRUE:nextlocation%=worklimit% 1420ENDIF 1430CASE FNuc(m$) OF 1440 WHEN"AIM":m=-1:m$="" 1450 OTHERWISE:m=VALm$:m$=FNuc(RIGHT$(m$,1)):IFINSTR("CDT",m$)=0 m$="" 1460ENDCASE 1470IFxs$="" OR LEFT$(xs$,1)="-" THEN 1480 xmul%=1:xdiv%=1:ymul%=1:ydiv%=1 1490ELSE 1500 IFys$="" ys$=xs$ 1510 xmul%=VALxs$:xdiv%=VALMID$(xs$,INSTR(xs$,":")+1) 1520 ymul%=VALys$:ydiv%=VALMID$(ys$,INSTR(ys$,":")+1) 1530ENDIF 1540flag=-1:SYS8,5,s$ TO r0,,r2:dir=r0=2 1550IFdir THEN 1560 panic=TRUE:SYS8,5,s$+".raw" TO r0,,r2:IFr0=1 s$+=".raw":dir=FALSE:panic=FALSE 1570 IFpanic SYS8,5,s$+".red" TO r0,,r2:IFr0=1 panic=FALSE 1580 IFpanic ERROR 42,"Directory given" 1590ENDIF 1600ftype=r2>>8 AND &FFF:bits=28:F=2^bits:c%=0:cc%=0:ccc%=0 1610IFdir THEN 1620 c%=OPENIN(s$+".red"):IFc%=0 ERROR 42,"Red file "+s$+".red not found" 1630 cc%=OPENIN(s$+".green"):IFcc%=0 ERROR42,"Green file "+s$+".green not found" 1640 ccc%=OPENIN(s$+".blue"):IFccc%=0 ERROR42,"Blue file "+s$+".blue not found" 1650ELSE 1660 c%=OPENINs$:IFc%=0 ERROR 42,"File "+s$+" not found" 1670ENDIF 1680rwt=.30:gwt=.59:bwt=.11:REM CIE Y weightings for R, G, B 1690DIM r%(255):REM monochrome colour map 1700DIM g%(255),b%(255):REM colour maps: in 0-255 out 0-1 fixed point 1710CASE ftype OF 1720WHEN &FF9:flag=0 1730 IFINSTR("."+FNuc(s$),".HIP.")ORINSTR(FNuc(s$),":HIP.") THEN 1740 flag=300:I%=INSTR(FNuc(s$),"HIP.") 1750 MID$(s$,I%)="LOP.":cc%=OPENINs$:IFcc%=0 ERROR42,"Can't find Lop file "+s$ 1760 ENDIF 1770WHEN &DFA:flag=800:IFdir flag=801 1780WHEN &DE2:flag=1000 1790WHEN &7A0:flag=1200 1800WHEN &300:flag=1300:IFdir flag=1301 1810WHEN 4:flag=900:IFdir flag=901 1820OTHERWISE 1830 PTR#c%=0:S$="":FORI%=1TO6:S$+=CHR$BGET#c%:NEXT 1840 IFS$="GIF87a" flag=500 1850 IFflag=-1 IFLEFT$(S$,5)="AV_VO" flag=600 1860 IFflag=-1 IFLEFT$(S$,4)=CHR$&59+CHR$&A6+CHR$&6A+CHR$&95 flag=1100 1870 IFflag=-1 IFLEFT$(S$,4)=CHR$0+CHR$1+CHR$0+CHR$8 flag=1400 1880 IFflag=-1 IFLEFT$(S$,4)="II*"+CHR$0 flag=1500:bigendian=FALSE 1890 IFflag=-1 IFLEFT$(S$,4)="MM"+CHR$0+"*" flag=1500:bigendian=TRUE 1900 IFflag=-1 IFLEFT$(S$,4)="RIX3" flag=2000 1910 IFflag=-1 IFLEFT$(S$,4)="FORM" THEN 1920 PTR#c%=8:S$=CHR$BGET#c%+CHR$BGET#c%+CHR$BGET#c%+CHR$BGET#c% 1930 IFS$="ILBM" flag=1600 1940 ENDIF 1950 IFflag=-1 THEN 1960 PTR#c%=&10:S$="":FORI%=1TO9:S$+=CHR$BGET#c%:NEXT 1970 IFS$="MILLIPEDE" flag=200 1980 ENDIF 1990 IFflag=-1 IFINSTR("."+FNuc(s$),".IMAGE.")ORINSTR(FNuc(s$),":IMAGE.") flag=400 2000 IFflag=-1 IFFNuc(RIGHT$(s$,4))=".RAW" flag=100 2010 IFflag=-1 IFINSTR("."+FNuc(s$),".PIC.")ORINSTR(FNuc(s$),":PIC.") flag=700 2020 IFflag=-1 IFINSTR("."+FNuc(s$),".IMG.")ORINSTR(FNuc(s$),":IMG.") flag=1400 2030 IFflag=-1 IFINSTR("."+FNuc(s$),".DSP.")ORINSTR(FNuc(s$),":DSP.") flag=1700 2040ENDCASE 2050IFflag=-1:ERROR 42,"Sorry: format not recognised - please try again or contact your supplier" 2060IFfast% IFMODE<>0 MODE0 2070input=8:ham=0:planar=0:bigendianbits=FALSE:compression=0:CASE flag OF 2080WHEN 0:REM Archimedes Sprite file 2090 quant%=4:PTR#c%=&2c:st%=FNW+(&38-&2c):PTR#c%=&34:sm=FNW:SYS53,sm,3 TO ,,I% 2100 CASE I% OF 2110 WHEN 1:flag=9:IFst%=&38 PROCdefpal2 ELSE PROCipal(2) 2120 PTR#c%=&1c:sx%=(FNW+1)*32:buff%=FNdim(sx%>>3):input=1 2130 WHEN 3:flag=6:IFst%=&38 PROCdefpal4 ELSE PROCipal(4) 2140 PTR#c%=&1c:sx%=(FNW+1)*16:buff%=FNdim(sx%>>2):input=2 2150 WHEN 15:flag=3:IFst%=&38 PROCdefpal16 ELSE PROCipal(16) 2160 PTR#c%=&1c:sx%=(FNW+1)*8:buff%=FNdim(sx%>>1):input=4 2170 WHEN 63:IFst%=&38 PROCdefpal ELSE PROCipal63 2180 PTR#c%=&1c:sx%=(FNW+1)*4:buff%=FNdim(sx%) 2190 OTHERWISE ERROR42,"Not understood RISC OS sprite" 2200 ENDCASE 2210 sy%=FNW+1:PTR#c%=st% 2220 SYS53,sm,4 TO ,,nx:SYS53,sm,5 TO ,,ny:nx=1<<nx:ny=1<<ny 2230 IFscale% xmul%=xmul%*nx/2:ymul%=ymul%*ny/2 2240 info$="RISC OS sprite, mode "+STR$sm+" "+STR$sx%+" by "+STR$sy%+" pixels, "+STR$input+" bits per pixel" 2250WHEN 100:REM QRT ".raw" image 2260 quant%=8:PTR#c%=0:sx%=FNHW:sy%=FNHW:PROCnopal:input=24:step24=1 2270 buff%=FNdim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+2*sx%:PROCsize 2280 info$="QRT .raw image, "+STR$sx%+" by "+STR$sy%+" pixels, 24 bits per pixel" 2290WHEN 200:REM CadSoft Image 2300 quant%=8:PTR#c%=9:sx%=(FNHW+2)/2:sy%=(FNHW+2)/2:REM round and convert to pixels 2310 PTR#c%=&1a:cadsofttype%=BGET#c%:PTR#c%=&200 2320 FORC%=0TO255:r%(C%)=BGET#c%/255*F:NEXT 2330 FORC%=0TO255:g%(C%)=BGET#c%/255*F:NEXT 2340 FORC%=0TO255:b%(C%)=BGET#c%/255*F:NEXT 2350 PTR#c%=&600:IFcadsofttype%=2 capix%=0:flag=201 2360 buff%=FNdim(sx%):casx%=buff%+sx%:PROCsize 2370 info$="Cadsoft type "+STR$cadsofttype%+" image, "+STR$sx%+" by "+STR$sy%+" pixels, 8 bits per pixel" 2380WHEN 300:REM Arvis Video 2390 quant%=5:PTR#c%=&2c:st%=FNW+(&38-&2c):PTR#cc%=&2c:stcc%=FNW1(cc%)+(&38-&2c) 2400 PTR#c%=&1c:sx%=(FNW+1)*4:sy%=FNW+1:PTR#c%=st%:PTR#cc%=stcc% 2410 DIM rpal%(255),gpal%(255),bpal%(255) 2420 FORC%=0TO255 2430 rpal%(C%)=(C%AND7)/31*F 2440 gpal%(C%)=((C%AND64)>>6)/31*F 2450 bpal%(C%)=(C%>>3AND7)/31*F 2460 r%(C%)=(C%AND16 OR (C%AND4)<<1)/31*F 2470 g%(C%)=((C%AND&60)>>2 OR (C%AND3)<<1)/31*F 2480 b%(C%)=((C%AND128)>>3 OR C%AND8)/31*F 2490 NEXT 2500 buff%=FNdim(sx%*2):ab%=buff%-1:bb%=buff%+sx%-1:IFscale% ymul%=ymul%*2 2510 info$="ArVis image, "+STR$sx%+" by "+STR$sy%+" pixels, 15 bits per pixel" 2520WHEN 400:REM RT "image." 2530 quant%=8:PTR#c%=0:sx%=FNbeHW:sy%=FNbeHW:X%=FNbeHW:PTR#c%=PTR#c%+X% 2540 buff%=FNdim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+2*sx% 2550 PROCnopal:input=24:step24=1:rtpix%=0:PROCsize 2560 info$="RT image. run length encoded image, "+STR$sx%+" by "+STR$sy%+" pixels, 24 bits per pixel" 2570WHEN 500:REM GIF file 2580 compression=5:PTR#c%=6:sx%=FNHW:sy%=FNHW:PROCsize 2590 GIF=BGET#c%:GIFback=BGET#c%:GIFext=BGET#c%:quant%=(GIF AND 7)+1 2600 IFGIF AND &80 THEN 2610 FORC%=0TO(1<<quant%)-1 2620 r%(C%)=BGET#c%/255*F:g%(C%)=BGET#c%/255*F:b%(C%)=BGET#c%/255*F 2630 NEXT 2640 ENDIF 2650 I%=BGET#c%:IFI%<>ASC"," ERROR 42,"GIF file without , in right place" 2660 GIFleft=FNHW:GIFright=FNHW:GIFsx=FNHW:GIFsy=FNHW 2670 IFGIFsx>sx% OR GIFsy>sy% ERROR 42,"GIF file with bigger image inside" 2680 GIF=BGET#c%:IFGIF AND &40 flag=501 2690 setcodes%=BGET#c%:clearcode%=1<<setcodes%:st%=PTR#c% 2700 DIM table%(1<<12,1):stk%=FNdim(1<<13):buf%=FNdim(280):buff%=FNdim(sx%) 2710 table%()=0:FORI%=0TOclearcode%-1:table%(I%,1)=I%:NEXT 2720 info$="GIF file, "+STR$sx%+" by "+STR$sy%+" pixels, "+STR$quant%+" bits per pixel" 2730WHEN 600:REM funny AV_VO stuff 2740 quant%=8:PTR#c%=&5c:FORC%=0TO255 2750 r%(C%)=BGET#c%/255*F:g%(C%)=BGET#c%/255*F:b%(C%)=BGET#c%/255*F 2760 NEXT 2770 PTR#c%=&36e:sy%=FNHW:sx%=FNHW:PROCsize 2780 PTR#c%=&380:buff%=FNdim(sx%) 2790 info$=".PIC image, "+STR$sx%+" by "+STR$sy%+" pixels, 8 bits per pixel" 2800WHEN 700:REM MTV ".pic" image 2810 quant%=8:PTR#c%=0:a$=GET$#c%:sx%=VALa$:sy%=VAL(MID$(a$,INSTR(a$," "))) 2820 PROCsize:PROCnopal:input=24:step24=3 2830 buff%=FNdim(sx%*3):rb%=buff%:gb%=buff%+1:bb%=buff%+2 2840 info$="MTV .pic image, "+STR$sx%+" by "+STR$sy%+" pixels, 24 bits per pixel" 2850WHEN 800:REM Watford picture 2860 sx%=512:sy%=256:IFscale% ymul%=ymul%*2 2870 buff%=FNdim(sx%):wtpix%=0:wt%=0:wtsx%=buff%+sx% 2880 FORC%=0TO255:r%(C%)=(C%AND63)/63*F:NEXT:g%()=r%():b%()=r%():quant%=6 2890 info$="Watford digitiser picture, 512 by 256 pixels, 6 bits per pixel" 2900WHEN 801:REM Triple Watford picture 2910 sx%=512:sy%=256:input=24:step24=1:quant%=6:IFscale% ymul%=ymul%*2 2920 wtpix1%=0:wt1%=0:wtpix2%=0:wt2%=0:wtpix3%=0:wt3%=0 2930 buff%=FNdim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+2*sx% 2940 wtsx1%=buff%+sx%:wtsx2%=buff%+2*sx%:wtsx3%=buff%+3*sx% 2950 FORC%=0TO255:r%(C%)=(C%AND63)/63*F:NEXT:g%()=r%():b%()=r%() 2960 info$="Triple Watford digitiser picture, 512 by 256 pixels, 18 bits per pixel" 2970WHEN 900:REM AIM/Wild Vision 2980 quant%=8:sx%=256:sy%=256:buff%=FNdim(sx%):IFscale% ymul%=ymul%*2:xmul%=xmul%*2 2990 FORC%=0TO255:r%(C%)=C%/255*F:NEXT:g%()=r%():b%()=r%() 3000 info$="AIM .raw image, 256 by 256 pixels, 8 bits per pixel" 3010WHEN 901:REM AIM/Wild Vision: Temporary while V9 gets its act together 3020 quant%=4:sx%=256:sy%=256:IFscale% ymul%=ymul%*2:xmul%=xmul%*2 3030 buff%=FNdim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+sx%*2 3040 FORC%=0TO255:r%(C%)=(C%AND&F0)/&F0*F:NEXT:g%()=r%():b%()=r%() 3050 input=24:step24=1 3060 info$="Hawk V9 Triple image, 256 by 256 pixels, 12 bits per pixel" 3070WHEN 1000:REM ProArtisan 3080 quant%=4:sx%=640:sy%=256:PROCdefpal:st%=FNW:flag+=FNW:IFscale% ymul%=ymul%*2 3090 REM read compression type and add to flag. 0/1 known! 3100 buff%=FNdim(sx%):ctable%=FNdim(st%) 3110 SYS12,4,c%,ctable%,st%:REM read in colour table 3120 pa%=ctable%:papix%=0:papix2%=0:pasx%=buff%+sx% 3130 info$="ProArtisan image, 640 by 256 pixels, 8 bits per pixel" 3140WHEN 1100:REM Monochrome? Images from Sun 3150 quant%=1:PTR#c%=4:sx%=FNbeW:sy%=FNbeW:input=FNbeW 3160 IFinput<>1 ERROR42,"Only know how to deal with 1bpp" 3170 PTR#c%=32:buff%=FNdim(sx%+7>>3):PROCsize 3180 r%(0)=F:g%(0)=F:b%(0)=F:bigendianbits=TRUE 3190 info$="Sun image, "+STR$sx%+" by "+STR$sy%+" pixels, 1 bit per pixel" 3200WHEN 1200:REM unknown TimeStep satellite format 3210 quant%=8:sx%=800:sy%=800:buff%=FNdim(sx%):PTR#c%=1600:vflip%=NOT vflip% 3220 FORC%=0TO255:r%(C%)=C%/255*F:NEXT:g%()=r%():b%()=r%() 3230 info$="TimeStep satellite image, 800 by 800 pixels, 8 bits per pixel" 3240WHEN 1300:REM another unknown TimeStep satellite format 3250 quant%=8:sx%=128:sy%=256:buff%=FNdim(sx%):IFscale% xmul%=xmul%*4:ymul%=ymul%*2 3260 FORC%=0TO255:r%(C%)=C%/255*F:NEXT:g%()=r%():b%()=r%() 3270 info$="satellite image, 128 by 256 pixels, 8 bits per pixel" 3280WHEN 1301:REM "colour" unknown TimeStep satellite format 3290 input=24:step24=1:quant%=8:sx%=128:sy%=256:IFscale% xmul%=xmul%*4:ymul%=ymul%*2 3300 buff%=FNdim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+2*sx% 3310 FORC%=0TO255:r%(C%)=C%/255*F:NEXT:g%()=r%():b%()=r%() 3320 info$="Triple satellite image, 128 by 256 pixels, 24 bits per pixel" 3330WHEN 1400:REM GEM IMG. format 3340 planar=TRUE:PTR#c%=0:Z%=FNHW:IFZ%>255 THEN 3350 st%=FNbeHW*2:quant%=FNbeHW:patlen%=FNbeHW 3360 pw%=FNbeHW:ph%=FNbeHW:sx%=FNbeHW:sy%=FNbeHW 3370 ELSE 3380 st%=FNHW*2:input=FNHW:patlen%=FNHW:pw%=FNHW:ph%=FNHW:sx%=FNHW:sy%=FNHW 3390 ENDIF 3400 IFscale% THEN 3410 xmul%=xmul%*pw%:xdiv%=xdiv%*282 3420 ymul%=ymul%*ph%:ydiv%=ydiv%*282 3430 ENDIF 3440 rsx%=sx%+7>>3:DIM st%(quant%):buff%=FNdim(sx%) 3450 FORX%=1TOquant%:st%(X%)=FNdim(rsx%*sy%):NEXT:PTR#c%=st%:vrep%=0 3460 FORC%=0TO(1<<quant%)-1:r%(C%)=F-C%/((1<<quant%)-1)*F:NEXT:g%()=r%():b%()=r%() 3470 info$="IMG file, "+STR$sx%+" by "+STR$sy%+" pixels, "+STR$quant%+" bits per pixel" 3480WHEN 1500:REM TIFF 3490 PTR#c%=4:dir%=FNtiff(4):PTR#c%=dir% 3500 rgb=FALSE:rowsperstrip=-1:greyunit=100:planar=1:fillorder=1:resunit=2 3510 E%=FNtiff(3):FORZ%=1TOE% 3520 T%=FNtiff(3):D%=FNtiff(3):C%=FNtiff(4) 3530 IFD%=2 PTR#c%=dir%+2+Z%*12 ELSE IFD%<4 V%=FNtiff(D%):PTR#c%=dir%+2+Z%*12 ELSE V%=FNtiff(4) 3540 REM PRINT"Read tag ";T%" datatype "D%" count "C%" value/pointer "V% 3550 CASE T% OF 3560 WHEN 256:sx%=V% 3570 WHEN 257:sy%=V% 3580 WHEN 258:quant%=V%:input=quant%:FORI%=0TO(1<<quant%)-1:r%(I%)=I%/((1<<quant%)-1)*F:NEXT 3590 g%()=r%():b%()=r%() 3600 WHEN 259:compression=V% 3610 WHEN 262:photometric=V% 3620 WHEN 266:fillorder=V% 3630 WHEN 273:stc%=C%:stv%=V% 3640 WHEN 277:input=quant%*V%:rgb=V%=3 3650 WHEN 278:rowsperstrip=V% 3660 WHEN 282:PTR#c%=V%:xnum%=FNtiff(4):xdenom%=FNtiff(4) 3670 PTR#c%=dir%+2+Z%*12 3680 WHEN 283:PTR#c%=V%:ynum%=FNtiff(4):ydenom%=FNtiff(4) 3690 PTR#c%=dir%+2+Z%*12 3700 WHEN 284:planar=V% 3710 WHEN 290:greyunit=10^V% 3720 WHEN 291:PTR#c%=V%:FORI%=0TOC%-1:r%(I%)=FNtiff(D%)/greyunit/2*F:NEXT 3730 g%()=r%():b%()=r%() 3740 PTR#c%=dir%+2+Z%*12 3750 WHEN 296:resunit=V% 3760REM WHEN 320: 3770REM PTR#c%=dir%+2+Z%*12 3780 OTHERWISE 3790 IFinfo% PRINT"Ignoring tag ";T%" datatype "D%" count "C%" value/pointer "V% 3800 ENDCASE 3810 NEXT 3820 DIM st%(stc%):IFstc%>1 THEN 3830 PTR#c%=stv%:FORI%=0TOC%-1:st%(I%)=FNtiff(D%):NEXT 3840 ELSE 3850 st%(0)=stv% 3860 ENDIF 3870 IFcompression<>1 info$="Compressed " ELSE info$="" 3880 info$+="TIFF file, "+STR$sx%+" by "+STR$sy%+" pixels, "+STR$input+" bits per pixel" 3890 IFplanar<>1 OR compression<>1 ERROR42,"Can't do this style of TIFF yet" 3900 bigendianbits=fillorder=1 3910 CASE quant% OF 3920 WHEN 1:nsx%=sx%+7>>3 3930 WHEN 2:nsx%=sx%+3>>2 3940 WHEN 4:nsx%=sx%+1>>1 3950 WHEN 8:nsx%=sx% 3960 OTHERWISE ERROR 42,"Can't do ";quant%" bits per pixel TIFF" 3970 ENDCASE 3980 buff%=FNdim(nsx%):TIFFread%=rowsperstrip:PTR#c%=st%(0):TIFFptr=0 3990 IFscale% THEN 4000 S%=resunit:IFS%=2 S%=90 4010 IFS%=3 S%=35 4020 xdiv%=xdiv%*xnum%:xmul%=xmul%*xdenom%*S% 4030 ydiv%=ydiv%*ynum%:ymul%=ymul%*ydenom%*S% 4040 ENDIF 4050WHEN 1600:REM Electronic Arts ILBM inside IFF 4060 PTR#c%=12:camg=0:planar=TRUE:REPEAT 4070 S$=CHR$BGET#c%+CHR$BGET#c%+CHR$BGET#c%+CHR$BGET#c%:S%=FNbeW 4080 CASE S$ OF 4090 WHEN "BMHD":sx%=FNbeHW:sy%=FNbeHW:S%=FNW:quant%=BGET#c%:masking%=BGET#c%=1 4100 compression=BGET#c%:S%=BGET#c%+FNHW:U%=BGET#c%:V%=BGET#c%:S%=FNW 4110 IFscale% ymul%=ymul%*V%:ydiv%=ydiv%*U% 4120 FORI%=0TO(1<<quant%)-1:r%(I%)=I%/((1<<quant%)-1)*F:NEXT:g%()=r%():b%()=r%() 4130 WHEN "CMAP":S%=PTR#c%+S%:FORI%=0TO(1<<quant%)-1:r%(I%)=(BGET#c%>>4)/15*F 4140 g%(I%)=(BGET#c%>>4)/15*F:b%(I%)=(BGET#c%>>4)/15*F:NEXT 4150 PTR#c%=S%:IFinfo% PRINT"Warning: truncated IFF CMAP information to 4 bits" 4160 WHEN "CAMG":camg=FNbeW:IFinfo% PRINT"Amiga viewport mode ";~camg 4170 WHEN "BODY":st%=PTR#c% 4180 OTHERWISE IF info% PRINT"Ignoring IFF property "S$" size ";S% 4190 PTR#c%=PTR#c%+S% 4200 ENDCASE 4210 UNTILS$="BODY":IFcompression info$="Compressed " ELSE info$="" 4220 info$="IFF file, "+STR$sx%+" by "+STR$sy%+" pixels, "+STR$quant%+" bits per pixel" 4230 ham=(camg AND &800)<>0:IFham info$="HAM "+info$ 4240 IFmasking% info$+=" with mask (unused)" 4250 DIM st%(quant%):rsx%=(sx%+15>>4)<<1:FORI%=1TOquant%:st%(I%)=FNdim(sx%):NEXT 4260 buff%=FNdim(sx%):flag+=compression:PTR#c%=st% 4270WHEN 1700:REM EGA image in DSP.<foo> 4280 sx%=640:rsx%=80:sy%=350:quant%=4:planar=TRUE:DIM st%(4) 4290 FORX%=1TO4:st%(X%)=FNdim(80):NEXT:buff%=FNdim(640):G=F/3:H=F*2/3 4300 r%()=0,0,0,0,F,F,F,H,G,G,G,G,F,F,F,F 4310 g%()=0,0,F,F,0,0,F,H,G,G,F,F,G,G,F,F 4320 b%()=0,F,0,F,0,F,0,H,G,F,G,F,G,F,G,F 4330 masking%=FALSE:flag=1600:st%=16:PTR#c%=16 4340 info$="PC EGA '.dsp' file, 640 by 350 pixels, 4 bits per pixel (fixed palette)" 4350WHEN 2000:REM Unknown "SCF" 4360 st%=&300:PTR#c%=4:sx%=FNHW:sy%=FNHW 4370 PRINTBGET#c% BGET#c% 4380 buff%=FNdim(sx%) 4390ENDCASE 4400IFinfo% PRINTinfo$ 4410SYS"Hourglass_On",1:IFinvert% r%()=F-r%():g%()=F-g%():b%()=F-b%() 4420CASE m OF 4430 WHEN -1:x%=256:y%=256:ncol=255:IFscale% xdiv%=xdiv%*2:ydiv%=ydiv%*2 4440 OTHERWISE 4450 SYS53,m,4 TO ,,nx:SYS53,m,5 TO ,,ny:nx=1<<nx:ny=1<<ny 4460 SYS53,m,11 TO ,,x%:SYS53,m,12 TO ,,y%:x%+=1:y%+=1 4470 SYS53,m,3 TO ,,ncol:IFscale% xdiv%=xdiv%*nx/2:ydiv%=ydiv%*ny/2 4480ENDCASE 4490IFxs$="=" xmul%=x%:xdiv%=sx% 4500IFys$="=" ymul%=y%:ydiv%=sy% 4510IFncol=1 IFm$="C" xdiv%=xdiv%*4:ydiv%=ydiv%*4 4520PROCreduce(xmul%,xdiv%):PROCreduce(ymul%,ydiv%) 4530IFinfo% THEN 4540 PRINT"Size ratios are x ";xmul%":"xdiv%" y "ymul%":"ydiv%; 4550 IFxdiv%>10 ORydiv%>10 ORxmul%>20 ORymul%>20 PRINT" which may take a while..." ELSE PRINT 4560ENDIF 4570x%=sx%*xmul%/xdiv%+.9999:y%=sy%*ymul%/ydiv%+.9999:rows%=sy% 4580order%=x%*y%>sx%*sy%:REM TRUE if scaling up 4590REM test for as many colours as possible 4600CASE m OF 4610 WHEN -1:col=0:REM aim format is monochrome 4620 OTHERWISE 4630 IFm$="D" IFncol<>15 m$="" 4640 col=0:IFncol>15 OR m$="C" OR m$="D" col=2:REM depth of colour arrays 4650ENDCASE 4660IFncol=1 IFm$="C" col=0:x%=x%+1ANDNOT1 4670IFcol=0 IFinput<9 FORC%=0TO255:r%(C%)=r%(C%)*rwt+g%(C%)*gwt+b%(C%)*bwt:NEXT 4680IFcol=0 IFinput=24 rb%-=1:gb%-=1:bb%-=1 4690IFsharpen%=TRUE sharpen%=24 4700DIM cl%(x%+7,col):REM current line additive errors 4710DIM xl%(x%+7,col),xp%(sx%+7,col):REM extra input line for scaling vertically 4720IFsharpen% THEN 4730 IForder% THEN 4740 DIM rm%(sx%+7,col),rm1%(sx%+7,col),rm2%(sx%+7,col) 4750 ELSE 4760 DIM rm%(x%+7,col),rm1%(x%+7,col),rm2%(x%+7,col) 4770 ENDIF 4780ENDIF 4790IFhist%ORequal% DIM vals%(256,col) 4800DIM nl%(x%+7,col):REM next line additive errors 4810totalvals%=x%*(col+1):REM total number of elements in a scaled line 4820totalvals2%=sx%*(col+1):REM total number of elements in an input line 4830IFflag=300 DIM z2%(sx%+7,col):REM extra array for ArVis 4840IFncol=1 AND m$="C" THEN 4850DIM A%(16),B%(16) 4860A%()=0,&00000001,&08000001,&08000101,&08080101,&08080103,&0C080103,&0C080303,&0C0C0303,&0C0E0303,&0C0E0703,&0E0E0703,&0E0E0707,&0E0F0707,&0E0F0F07,&0F0F0F07,&0F0F0F0F 4870B%()=0,&00000008,&01000008,&01000808,&01010808,&0101080C,&0301080C,&03010C0C,&03030C0C,&03070C0C,&03070E0C,&07070E0C,&07070E0E,&070F0E0E,&070F0F0E,&0F0F0F0E,&0F0F0F0F 4880even_gard=FNdim(17*32*4):odd_gard=FNdim(17*32*4) 4890FORI%=0TO16:FORJ%=0TO16:even_gard!(J%*32*4+I%*4)=A%(I%)ORB%(J%)<<4:NEXT:NEXT 4900FORI%=0TO16:FORJ%=0TO16: odd_gard!(J%*32*4+I%*4)=B%(I%)ORA%(J%)<<4:NEXT:NEXT 4910ENDIF 4920code%=FNdim(4096):SP=13 4930FORZ=0TO2STEP2:P%=code% 4940CASE ncol OF 4950WHEN 255: 4960[OPT Z 4970; CALL fs%,current%(),next%(),pixel address%,increment%,count% 4980.fs% 4990 STMFD SP !,{R14} 5000 LDR R10,[R9,#4*8] ;addr current 5010 LDR R11,[R9,#3*8] ;addr next 5020 LDR R12,[R9,#2*8] ;addr pixel address 5030 LDR R12,[R12] ;pixel address 5040 LDR R8,[R9,#8] ;addr step 5050 LDR R8,[R8] ;step 5060 LDR R9,[R9] ;addr count 5070 LDR R9,[R9] ;count 5080 LDR R4,[R10],R8 ;mono value 5090 TEQ R8,#0:MOVPL R1,#1:MVNMI R1,#0 ;+/- 1 for sprite output 5100.fsloop 5110 TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=val<=1 5120 MOV R0,R4,LSR #bits-8 5130 CMP R0,#256:MOVCS R0,#255:STRB R0,[R12],R1 5140 MOV R2,R0,LSL #bits-8 5150 SUB R4,R4,R2 ;subtract converted value 5160 MOVCS R4,#0 5170 ADD R2,R4,R4,LSL #1 ;*3 5180 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 5190 STR R3,[R11,-R8] 5200 ADD R2,R4,R4,LSL #2 ;*5 5210 LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 5220 STR R3,[R11] 5230 MOV R3,R4,ASR #4 ;/16 5240 STR R3,[R11,R8]! ;not seen so far inc nl ptr 5250 RSB R2,R4,R4,LSL #3 ;*7 5260 LDR R4,[R10],R8 ;next light value 5270 ADD R4,R4,R2,ASR #4 ;next value +7/16 of error -> new value 5280 SUBS R9,R9,#1:BNE fsloop 5290 LDMFD SP !,{PC}^ 5300 ] 5310WHEN 63: 5320[OPT Z 5330.slashfifteen EQUD 0 5340 EQUD 4/15*F 5350 EQUD 8/15*F 5360 EQUD 12/15*F 5370.fs% 5380 STMFD SP !,{R14} 5390 LDR R10,[R9,#4*8] ;addr current 5400 LDR R11,[R9,#3*8] ;addr next 5410 LDR R12,[R9,#2*8] ;addr pixel address 5420 LDR R12,[R12] ;pixel address 5430 LDR R8,[R9,#8] ;addr step 5440 LDR R8,[R8] ;step 5450 LDR R9,[R9] ;addr count 5460 LDR R9,[R9] ;count 5470 LDR R4,[R10] ;r 5480 LDR R5,[R10,#4] ;g 5490 LDR R6,[R10,#8] ;b 5500 ADR R7,slashfifteen 5510 TEQ R8,#0:MOVPL R1,#1:MVNMI R1,#0 ;+/- 1 for sprite output 5520.fsloop 5530 ADD R10,R10,R8 ;+step 5540 TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=r<=1 5550 RSB R3,R4,R4,LSL #4 ;*15 5560 MOVS R3,R3,LSR #2+bits ;final int0, 1, 2, 3 5570 LDRNE R2,[R7,R3,LSL #2] ;divide by 15 from table 5580 SUBNE R4,R4,R2 ;subtract converted value 5590 AND R2,R3,#1:MOV R0,R2,LSL #2 ;bit 2 of r 5600 AND R2,R3,#2:ORR R0,R0,R2,LSL #3 ;bit 3 of r 5610 TEQ R5,#0:MOVMI R5,#0:CMP R5,#F:MOVCS R5,#F ;0<=g<=1 5620 RSB R3,R5,R5,LSL #4 ;*15 5630 MOVS R3,R3,LSR #2+bits ;final int0, 1, 2, 3 5640 LDRNE R2,[R7,R3,LSL #2] ;divide by 15 from table 5650 SUBNE R5,R5,R2 ;subtract converted value 5660 ORR R0,R0,R3,LSL #5 ;bits 3 and 2 of g 5670 TEQ R6,#0:MOVMI R6,#0:CMP R6,#F:MOVCS R6,#F ;0<=b<=1 5680 RSB R3,R6,R6,LSL #4 ;*15 5690 MOVS R3,R3,LSR #2+bits ;final int0, 1, 2, 3 5700 LDRNE R2,[R7,R3,LSL #2] ;divide by 15 from table 5710 SUBNE R6,R6,R2 ;subtract converted value 5720 AND R2,R3,#1:ORR R0,R0,R2,LSL #3 ;bit 2 of b 5730 AND R2,R3,#2:ORR R0,R0,R2,LSL #6 ;bit 3 of b 5740 ] 5750IFm$<>"T" THEN 5760[OPT Z 5770 ADD R2,R4,R5:ADD R2,R2,R6 ;r+g+b remainders 5780 ADD R2,R2,R2,LSL #2 ;average *15/3 5790 MOV R2,R2,LSR #bits 5800 CMP R2,#3:MOVCS R2,#3 5810 ORR R0,R0,R2 5820 LDR R2,[R7,R2,LSL #2] ;*1/15 5830 SUB R4,R4,R2,LSR #2 ;subtract t 5840 SUB R5,R5,R2,LSR #2 ;note table 4* too large 5850 SUB R6,R6,R2,LSR #2 5860 ] 5870ENDIF 5880[OPT Z 5890 STRB R0,[R12],R1 5900 ADD R0,R11,#4 ;nl g%(S%) 5910 ADD R2,R4,R4,LSL #1 ;r*3 5920 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 5930 STR R3,[R11,-R8] 5940 ADD R2,R4,R4,LSL #2 ;r*5 5950 LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 5960 STR R3,[R11] 5970 MOV R3,R4,ASR #4 ;r/16 5980 STR R3,[R11,R8]! ;not seen so far inc nl ptr 5990 RSB R2,R4,R4,LSL #3 ;r*7 6000 LDR R4,[R10] ;next r light value 6010 ADD R4,R4,R2,ASR #4 ;next value +7/16 of r error -> new r 6020 ADD R2,R5,R5,LSL #1 ;g*3 6030 LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 6040 STR R3,[R0,-R8] 6050 MOV R3,R5,ASR #4 ;g/16 6060 STR R3,[R0,R8] ;not seen so far 6070 ADD R2,R5,R5,LSL #2 ;g*5 6080 LDR R3,[R0]:ADD R3,R3,R2,ASR #4 ;+5/16 6090 STR R3,[R0],#4 ;computes nl b into the bargain 6100 RSB R2,R5,R5,LSL #3 ;g*7 6110 LDR R5,[R10,#4] ;next g light value 6120 ADD R5,R5,R2,ASR #4 ;next value +7/16 of g error -> new g 6130 ADD R2,R6,R6,LSL #1 ;b*3 6140 LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 6150 STR R3,[R0,-R8] 6160 ADD R2,R6,R6,LSL #2 ;b*5 6170 LDR R3,[R0]:ADD R3,R3,R2,ASR #4 ;+5/16 6180 STR R3,[R0] 6190 MOV R3,R6,ASR #4 ;b/16 6200 STR R3,[R0,R8] ;not seen so far 6210 RSB R2,R6,R6,LSL #3 ;b*7 6220 LDR R6,[R10,#8] ;next b light value 6230 ADD R6,R6,R2,ASR #4 ;next value +7/16 of b error -> new b 6240 SUBS R9,R9,#1:BNE fsloop 6250 LDMFD SP !,{PC}^ 6260 ] 6270WHEN 15: 6280CASE m$ OF 6290WHEN "D":REM No table needed 6300WHEN "C" 6310[OPT Z 6320.divtable EQUD 0 6330 EQUD 1/3*F 6340 EQUD 2/3*F 6350 EQUD F 6360 ] 6370WHEN "T" 6380[OPT Z 6390.divtable EQUD 0 6400 EQUD 1/15*F 6410 EQUD 2/15*F 6420 EQUD 3/15*F 6430 EQUD 4/15*F 6440 EQUD 5/15*F 6450 EQUD 6/15*F 6460 EQUD 7/15*F 6470 EQUD 8/15*F 6480 EQUD 9/15*F 6490 EQUD 10/15*F 6500 EQUD 11/15*F 6510 EQUD 12/15*F 6520 EQUD 13/15*F 6530 EQUD 14/15*F 6540 EQUD F 6550 ] 6560WHEN "" 6570[OPT Z 6580.divtable EQUD 0 6590 EQUD 1/7*F 6600 EQUD 2/7*F 6610 EQUD 3/7*F 6620 EQUD 4/7*F 6630 EQUD 5/7*F 6640 EQUD 6/7*F 6650 EQUD F 6660 ] 6670ENDCASE 6680[OPT Z 6690.fs% 6700 STMFD SP !,{R14} 6710 LDR R10,[R9,#4*8] ;addr current 6720 LDR R11,[R9,#3*8] ;addr next 6730 LDR R12,[R9,#2*8] ;addr pixel address 6740 LDR R12,[R12] ;pixel address 6750 LDR R8,[R9,#8] ;addr step 6760 LDR R8,[R8] ;step 6770 LDR R9,[R9] ;addr count 6780 LDR R9,[R9] ;count 6790 ] 6800IFm$="C" OR m$="D" THEN 6810[OPT Z 6820 LDR R4,[R10] ;r 6830 LDR R5,[R10,#4] ;g 6840 LDR R6,[R10,#8] ;b 6850 ] 6860ELSE 6870[OPT Z 6880 LDR R4,[R10],R8 ;mono value 6890 ] 6900ENDIF 6910IFm$<>"D" THEN 6920[OPT Z 6930 ADR R7,divtable 6940 ] 6950ENDIF 6960[OPT Z 6970 TEQ R8,#0:MOVPL R1,#1:MVNMI R1,#0 ;+/- 1 for sprite output 6980.fsloop 6990 ] 7000CASE m$ OF 7010WHEN "D" 7020[OPT Z 7030 ADD R10,R10,R8 ;+step 7040 MOV R3,#0 7050 TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=r<=1 7060 CMP R4,#F>>1 ;>1/2? 7070 SUBCS R4,R4,#F:ORRCS R3,R3,#1 7080 TEQ R5,#0:MOVMI R5,#0:CMP R5,#F:MOVCS R5,#F ;0<=g<=1 7090 CMP R5,#F>>1 ;>1? 7100 SUBCS R5,R5,#F:ORRCS R3,R3,#2 7110 TEQ R6,#0:MOVMI R6,#0:CMP R6,#F:MOVCS R6,#F ;0<=b<=1 7120 CMP R6,#F>>1 ;>1? 7130 SUBCS R6,R6,#F:ORRCS R3,R3,#4 7140 ] 7150WHEN "C" 7160[OPT Z 7170 ADD R10,R10,R8 ;+step 7180 TEQ R5,#0:MOVMI R5,#0:CMP R5,#F:MOVCS R5,#F ;0<=g<=1 7190 ADD R3,R5,R5,LSL #1 ;*3 7200 ADD R3,R3,#F>>1 ;round up 7210 MOVS R3,R3,LSR #bits ;final int0-3 7220 LDRNE R2,[R7,R3,LSL #2] ;divide by 3 from table 7230 SUBNE R5,R5,R2 ;subtract converted value 7240 TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=r<=1 7250 CMP R4,#F>>1 ;>1/2? 7260 SUBCS R4,R4,#F:ORRCS R3,R3,#4 7270 TEQ R6,#0:MOVMI R6,#0:CMP R6,#F:MOVCS R6,#F ;0<=b<=1 7280 CMP R6,#F>>1 ;>1/2? 7290 SUBCS R6,R6,#F:ORRCS R3,R3,#8 7300 ] 7310WHEN "T" 7320[OPT Z 7330 TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=val<=1 7340 RSB R3,R4,R4,LSL #4 ;*15 7350 ADD R3,R3,#F>>1 ;round up 7360 MOVS R3,R3,LSR #bits ;final int0-15 7370 LDRNE R2,[R7,R3,LSL #2] ;divide by 15 from table 7380 SUBNE R4,R4,R2 ;subtract converted value 7390 ] 7400WHEN "" 7410[OPT Z 7420 TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=val<=1 7430 RSB R3,R4,R4,LSL #3 ;*7 7440 ADD R3,R3,#F>>1 ;round up 7450 MOVS R3,R3,LSR #bits ;final int0-7 7460 LDRNE R2,[R7,R3,LSL #2] ;divide by 7 from table 7470 SUBNE R4,R4,R2 ;subtract converted value 7480 ] 7490ENDCASE 7500[OPT Z 7510 MOV R2,R12,LSR #1 7520 TST R12,#1 7530 LDRB R0,[R2] 7540 ANDEQ R0,R0,#&F0:ORREQ R0,R0,R3 7550 ANDNE R0,R0,#&0F:ORRNE R0,R0,R3,LSL #4 7560 STRB R0,[R2] 7570 ADD R12,R12,R1 7580 ] 7590IFm$="C" OR m$="D" THEN 7600[OPT Z 7610 ADD R0,R11,#4 ;nl g%(S%) 7620 ADD R2,R4,R4,LSL #1 ;r*3 7630 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 7640 STR R3,[R11,-R8] 7650 ADD R2,R4,R4,LSL #2 ;r*5 7660 LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 7670 STR R3,[R11] 7680 MOV R3,R4,ASR #4 ;r/16 7690 STR R3,[R11,R8]! ;not seen so far inc nl ptr 7700 RSB R2,R4,R4,LSL #3 ;r*7 7710 LDR R4,[R10] ;next r light value 7720 ADD R4,R4,R2,ASR #4 ;next value +7/16 of r error -> new r 7730 ADD R2,R5,R5,LSL #1 ;g*3 7740 LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 7750 STR R3,[R0,-R8] 7760 MOV R3,R5,ASR #4 ;g/16 7770 STR R3,[R0,R8] ;not seen so far 7780 ADD R2,R5,R5,LSL #2 ;g*5 7790 LDR R3,[R0]:ADD R3,R3,R2,ASR #4 ;+5/16 7800 STR R3,[R0],#4 ;computes nl b into the bargain 7810 RSB R2,R5,R5,LSL #3 ;g*7 7820 LDR R5,[R10,#4] ;next g light value 7830 ADD R5,R5,R2,ASR #4 ;next value +7/16 of g error -> new g 7840 ADD R2,R6,R6,LSL #1 ;b*3 7850 LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 7860 STR R3,[R0,-R8] 7870 ADD R2,R6,R6,LSL #2 ;b*5 7880 LDR R3,[R0]:ADD R3,R3,R2,ASR #4 ;+5/16 7890 STR R3,[R0] 7900 MOV R3,R6,ASR #4 ;b/16 7910 STR R3,[R0,R8] ;not seen so far 7920 RSB R2,R6,R6,LSL #3 ;b*7 7930 LDR R6,[R10,#8] ;next b light value 7940 ADD R6,R6,R2,ASR #4 ;next value +7/16 of b error -> new b 7950 ] 7960ELSE 7970[OPT Z 7980 ADD R2,R4,R4,LSL #1 ;*3 7990 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 8000 STR R3,[R11,-R8] 8010 ADD R2,R4,R4,LSL #2 ;*5 8020 LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 8030 STR R3,[R11] 8040 MOV R3,R4,ASR #4 ;/16 8050 STR R3,[R11,R8]! ;not seen so far inc nl ptr 8060 RSB R2,R4,R4,LSL #3 ;*7 8070 LDR R4,[R10],R8 ;next light value 8080 ADD R4,R4,R2,ASR #4 ;next value +7/16 of error -> new value 8090 ] 8100ENDIF 8110[OPT Z 8120 SUBS R9,R9,#1:BNE fsloop 8130 LDMFD SP !,{PC}^ 8140 ] 8150WHEN 3: 8160IFm$="" THEN 8170[OPT Z 8180.slashthree EQUD 0 8190 EQUD 1/3*F 8200 EQUD 2/3*F 8210 EQUD F 8220 ] 8230ENDIF 8240[OPT Z 8250.fs% 8260 STMFD SP !,{R14} 8270 LDR R10,[R9,#4*8] ;addr current 8280 LDR R11,[R9,#3*8] ;addr next 8290 LDR R12,[R9,#2*8] ;addr pixel address 8300 LDR R12,[R12] ;pixel address 8310 LDR R8,[R9,#8] ;addr step 8320 LDR R8,[R8] ;step 8330 LDR R9,[R9] ;addr count 8340 LDR R9,[R9] ;count 8350 ] 8360IFm$="C" THEN 8370[OPT Z 8380 LDR R4,[R10] ;r 8390 LDR R5,[R10,#4] ;g 8400 LDR R6,[R10,#8] ;b 8410 ] 8420ELSE 8430[OPT Z 8440 LDR R4,[R10],R8 ;mono value 8450 ADR R7,slashthree 8460 ] 8470ENDIF 8480[OPT Z 8490 TEQ R8,#0:MOVPL R1,#1:MVNMI R1,#0 ;+/- 1 for sprite output 8500.fsloop 8510 ] 8520IFm$="C" THEN 8530[OPT Z 8540 ADD R10,R10,R8 ;+step 8550 TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=r<=1 8560 TEQ R5,#0:MOVMI R5,#0:CMP R5,#F:MOVCS R5,#F ;0<=g<=1 8570 TEQ R6,#0:MOVMI R6,#0:CMP R6,#F:MOVCS R6,#F ;0<=b<=1 8580 MOV R3,#0 ;black octant 8590 CMP R4,#F>>1:ORRCS R3,R3,#1 8600 CMP R5,#F>>1:ORRCS R3,R3,#2 8610 CMP R6,#F>>1:ORRCS R3,R3,#4 8620 CMP R3,#6:MOVEQ R3,#1:BEQ octcyan 8630 BCS octwhite 8640 CMP R3,#4:BEQ octblue 8650 MOVCS R3,#2:BCS octmagenta 8660 CMP R3,#2:BEQ octgreen 8670 BCS octyellow 8680 CMP R3,#0:BEQ octblack 8690.octred 8700 RSB R0,R4,#F ;1-r 8710 CMP R5,R0 ;g>1-r? 8720 BLT octred1 8730 CMP R5,R6 ;yes- g>b? 8740 MOVGE R3,#3 ;if g>b then g is largest 8750 MOVLT R3,#2 ;else b is 8760 B octconvert 8770.octred1 8780 CMP R0,R6 ;no- 1-r>b? 8790 MOVGE R3,#0 ;if 1-r>b then 1-r is largest 8800 MOVLT R3,#2 ;else b is 8810 B octconvert 8820.octgreen 8830 RSB R0,R5,#F ;1-g 8840 CMP R0,R4 ;1-g>r? 8850 BLT octgreen1 8860 CMP R0,R6 ;yes- 1-g>b? 8870 MOVGE R3,#0 ;if 1-g>b then 1-g is largest 8880 MOVLT R3,#1 ;else b is 8890 B octconvert 8900.octgreen1 8910 CMP R4,R6 ;no- r>b? 8920 MOVGE R3,#3 ;if r>b then r is largest 8930 MOVLT R3,#1 ;else b is 8940 B octconvert 8950.octblue 8960 RSB R0,R6,#F ;1-b 8970 CMP R0,R4 ;1-b>r? 8980 BLT octblue1 8990 CMP R0,R5 ;yes- 1-b>g? 9000 MOVGE R3,#0 ;if 1-b>g then 1-b is largest 9010 MOVLT R3,#1 ;else g is 9020 B octconvert 9030.octblue1 9040 CMP R4,R5 ;no- r>g? 9050 MOVGE R3,#2 ;if r>g then r is largest 9060 MOVLT R3,#1 ;else g is 9070 B octconvert 9080.octwhite 9090 CMP R4,R5 ;if r>g 9100 BLT octwhite1 9110 CMP R5,R6 ;yes - g>b? 9120 MOVGE R3,#3 ;if g>b b is smallest 9130 MOVLT R3,#2 ;else g is 9140 B octconvert 9150.octwhite1 9160 CMP R4,R6 ;no - r>b? 9170 MOVGE R3,#3 ;if r>b b is smallest 9180 MOVLT R3,#1 ;else r is 9190.octconvert 9200 CMP R3,#1 ;not red=cyan 9210.octcyan 9220 SUBEQ R5,R5,#F 9230 SUBEQ R6,R6,#F 9240.octmagenta 9250 CMP R3,#2 ;not green=magenta 9260 SUBEQ R4,R4,#F 9270 SUBEQ R6,R6,#F 9280.octyellow 9290 CMP R3,#3 ;not blue=yellow 9300 SUBEQ R4,R4,#F 9310 SUBEQ R5,R5,#F 9320.octblack 9330 MOV R2,R12,LSR #2 9340 AND R7,R12,#3:MOV R7,R7,LSL #1 9350 MOV R14,#3 9360 MOV R14,R14,LSL R7 9370 LDRB R0,[R2]:BIC R0,R0,R14:ORR R0,R0,R3,LSL R7:STRB R0,[R2] 9380 ADD R12,R12,R1 9390 ADD R0,R11,#4 ;nl g%(S%) 9400 ADD R2,R4,R4,LSL #1 ;r*3 9410 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 9420 STR R3,[R11,-R8] 9430 ADD R2,R4,R4,LSL #2 ;r*5 9440 LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 9450 STR R3,[R11] 9460 MOV R3,R4,ASR #4 ;r/16 9470 STR R3,[R11,R8]! ;not seen so far inc nl ptr 9480 RSB R2,R4,R4,LSL #3 ;r*7 9490 LDR R4,[R10] ;next r light value 9500 ADD R4,R4,R2,ASR #4 ;next value +7/16 of r error -> new r 9510 ADD R2,R5,R5,LSL #1 ;g*3 9520 LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 9530 STR R3,[R0,-R8] 9540 MOV R3,R5,ASR #4 ;g/16 9550 STR R3,[R0,R8] ;not seen so far 9560 ADD R2,R5,R5,LSL #2 ;g*5 9570 LDR R3,[R0]:ADD R3,R3,R2,ASR #4 ;+5/16 9580 STR R3,[R0],#4 ;computes nl b into the bargain 9590 RSB R2,R5,R5,LSL #3 ;g*7 9600 LDR R5,[R10,#4] ;next g light value 9610 ADD R5,R5,R2,ASR #4 ;next value +7/16 of g error -> new g 9620 ADD R2,R6,R6,LSL #1 ;b*3 9630 LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 9640 STR R3,[R0,-R8] 9650 ADD R2,R6,R6,LSL #2 ;b*5 9660 LDR R3,[R0]:ADD R3,R3,R2,ASR #4 ;+5/16 9670 STR R3,[R0] 9680 MOV R3,R6,ASR #4 ;b/16 9690 STR R3,[R0,R8] ;not seen so far 9700 RSB R2,R6,R6,LSL #3 ;b*7 9710 LDR R6,[R10,#8] ;next b light value 9720 ADD R6,R6,R2,ASR #4 ;next value +7/16 of b error -> new b 9730 ] 9740ELSE 9750[OPT Z 9760 TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=val<=1 9770 ADD R3,R4,R4,LSL #1 ;*3 9780 ADD R3,R3,#F>>1 ;round up 9790 MOVS R3,R3,LSR #bits ;final int0-3 9800 LDRNE R2,[R7,R3,LSL #2] ;divide by 3 from table 9810 SUBNE R4,R4,R2 ;subtract converted value 9820 MOV R2,R12,LSR #2 9830 AND R5,R12,#3:MOV R5,R5,LSL #1 9840 MOV R6,#3:MOV R6,R6,LSL R5 9850 LDRB R0,[R2]:BIC R0,R0,R6:ORR R0,R0,R3,LSL R5:STRB R0,[R2] 9860 ADD R12,R12,R1 9870 ADD R2,R4,R4,LSL #1 ;*3 9880 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 9890 STR R3,[R11,-R8] 9900 ADD R2,R4,R4,LSL #2 ;*5 9910 LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 9920 STR R3,[R11] 9930 MOV R3,R4,ASR #4 ;/16 9940 STR R3,[R11,R8]! ;not seen so far inc nl ptr 9950 RSB R2,R4,R4,LSL #3 ;*7 9960 LDR R4,[R10],R8 ;next light value 9970 ADD R4,R4,R2,ASR #4 ;next value +7/16 of error -> new value 9980 ] 9990ENDIF 10000[OPT Z 10010 SUBS R9,R9,#1:BNE fsloop 10020 LDMFD SP !,{PC}^ 10030 ] 10040WHEN 1: 10050IFm$="C" THEN 10060[OPT Z 10070.evenrow_gard DCD even_gard 10080.oddrow_gard DCD odd_gard 10090.quarterrowinc DCD 0 10100.fs% 10110 STMFD SP !,{R14} 10120 LDR R10,[R9,#4*8] ;addr current 10130 LDR R11,[R9,#3*8] ;addr next 10140 LDR R12,[R9,#2*8] ;addr pixel address 10150 LDR R12,[R12] ;pixel address 10160 LDR R8,[R9,#8] ;addr step 10170 LDR R8,[R8] ;step 10180 LDR R9,[R9] ;addr count 10190 LDR R9,[R9] ;count 10200 LDR R4,[R10],R8 ;mono value 10210 TEQ R8,#0 10220 MOVPL R1,#2 10230 LDRPL R6,evenrow_gard 10240 MVNMI R1,#1 ;+/- 2 for sprite output 10250 LDRMI R6,oddrow_gard 10260 LDR R7,quarterrowinc 10270.fsloop 10280 TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=val<=1 10290 ADD R5,R4,#F>>5 ;round up 10300 MOVS R5,R5,LSR #bits-4 ;final int 0-16 10310 SUBNE R4,R4,R5,LSL #bits-4 ;subtract converted value 10320 ADD R2,R4,R4,LSL #1 ;*3 10330 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 10340 STR R3,[R11,-R8] 10350 ADD R2,R4,R4,LSL #2 ;*5 10360 LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 10370 STR R3,[R11] 10380 MOV R3,R4,ASR #4 ;/16 10390 STR R3,[R11,R8]! ;not seen so far inc nl ptr 10400 RSB R2,R4,R4,LSL #3 ;*7 10410 LDR R4,[R10],R8 ;next light value 10420 ADDS R4,R4,R2,ASR #4 ;next value +7/16 of error -> new value 10430 MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=val<=1 10440 ADD R3,R4,#F>>5 ;round up 10450 MOVS R3,R3,LSR #bits-4 ;final int 0-16 10460 SUBNE R4,R4,R3,LSL #bits-4 ;subtract converted value 10470 TEQ R1,#0:ORRPL R5,R5,R3,LSL #5:ORRMI R5,R3,R5,LSL #5 10480 LDR R3,[R6,R5,LSL #2] ;get 4 patterns 10490 MOV R2,R12,LSR #1:STRB R3,[R2],R7:MOV R3,R3,LSR #8:STRB R3,[R2],R7 10500 MOV R3,R3,LSR #8:STRB R3,[R2],R7:MOV R3,R3,LSR #8:STRB R3,[R2] 10510 ADD R12,R12,R1 10520 ADD R2,R4,R4,LSL #1 ;*3 10530 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 10540 STR R3,[R11,-R8] 10550 ADD R2,R4,R4,LSL #2 ;*5 10560 LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 10570 STR R3,[R11] 10580 MOV R3,R4,ASR #4 ;/16 10590 STR R3,[R11,R8]! ;not seen so far inc nl ptr 10600 RSB R2,R4,R4,LSL #3 ;*7 10610 LDR R4,[R10],R8 ;next light value 10620 ADD R4,R4,R2,ASR #4 ;next value +7/16 of error -> new value 10630 SUBS R9,R9,#2:BNE fsloop 10640 LDMFD SP !,{PC}^ 10650 ] 10660ELSE 10670[OPT Z 10680.fs% 10690 STMFD SP !,{R14} 10700 LDR R10,[R9,#4*8] ;addr current 10710 LDR R11,[R9,#3*8] ;addr next 10720 LDR R12,[R9,#2*8] ;addr pixel address 10730 LDR R12,[R12] ;pixel address 10740 LDR R8,[R9,#8] ;addr step 10750 LDR R8,[R8] ;step 10760 LDR R9,[R9] ;addr count 10770 LDR R9,[R9] ;count 10780 LDR R4,[R10],R8 ;mono value 10790 TEQ R8,#0:MOVPL R1,#1:MVNMI R1,#0 ;+/- 1 for sprite output 10800.fsloop 10810 TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=val<=1 10820 MOV R3,#0 10830 CMP R4,#F>>1 ;>1/2? 10840 SUBCS R4,R4,#F:MOVCS R3,#1 ;final int 0-1 10850 MOV R2,R12,LSR #3 10860 AND R5,R12,#7:MOV R6,#1:MOV R6,R6,LSL R5 10870 LDRB R0,[R2]:BIC R0,R0,R6:ORR R0,R0,R3,LSL R5 ;invert r3 value in process 10880 STRB R0,[R2] 10890 ADD R12,R12,R1 10900 ADD R2,R4,R4,LSL #1 ;*3 10910 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 10920 STR R3,[R11,-R8] 10930 ADD R2,R4,R4,LSL #2 ;*5 10940 LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 10950 STR R3,[R11] 10960 MOV R3,R4,ASR #4 ;/16 10970 STR R3,[R11,R8]! ;not seen so far inc nl ptr 10980 RSB R2,R4,R4,LSL #3 ;*7 10990 LDR R4,[R10],R8 ;next light value 11000 ADD R4,R4,R2,ASR #4 ;next value +7/16 of error -> new value 11010 SUBS R9,R9,#1:BNE fsloop 11020 LDMFD SP !,{PC}^ 11030 ] 11040ENDIF 11050ENDCASE 11060CASE col OF 11070WHEN 0: 11080[OPT Z 11090.mappix% ; CALL mappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 11100 LDR R0,[R9]:LDR R0,[R0] ;count 11110 LDR R1,[R9,#8]:LDR R1,[R1] ;base of byte array 11120 LDR R2,[R9,#4*8] ;base of r array 11130 LDR R5,[R9,#5*8] ;base of z array 11140.mappixlp 11150 LDRB R6,[R1],#1 11160 ] 11170CASE input OF 11180WHEN 8: 11190[OPT Z 11200 LDR R7,[R2,R6,LSL #2]:STR R7,[R5],#4 11210 SUBS R0,R0,#1:BNE mappixlp 11220 MOVS PC,R14 11230 ] 11240WHEN 4: 11250IFbigendianbits THEN 11260[OPT Z 11270 MOV R10,R6,LSR #4 11280 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 11290 AND R10,R6,#&F 11300 ] 11310ELSE 11320[OPT Z 11330 AND R10,R6,#&F 11340 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 11350 MOV R10,R6,LSR #4 11360 ] 11370ENDIF 11380[OPT Z 11390 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 11400 SUBS R0,R0,#2:BHI mappixlp 11410 MOVS PC,R14 11420 ] 11430WHEN 2: 11440IFbigendianbits THEN 11450[OPT Z 11460 MOV R10,R6,LSR #6 11470 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 11480 AND R10,R6,#&30 11490 LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 11500 AND R10,R6,#&C 11510 LDR R7,[R2,R10]:STR R7,[R5],#4 11520 AND R10,R6,#&3 11530 ] 11540ELSE 11550[OPT Z 11560 AND R10,R6,#&3 11570 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 11580 AND R10,R6,#&C 11590 LDR R7,[R2,R10]:STR R7,[R5],#4 11600 AND R10,R6,#&30 11610 LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 11620 MOV R10,R6,LSR #6 11630 ] 11640ENDIF 11650[OPT Z 11660 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 11670 SUBS R0,R0,#4:BHI mappixlp 11680 MOVS PC,R14 11690 ] 11700WHEN 1: 11710IFbigendianbits THEN 11720[OPT Z 11730 AND R10,R6,#&80 11740 LDR R7,[R2,R10,LSR #5]:STR R7,[R5],#4 11750 AND R10,R6,#&40 11760 LDR R7,[R2,R10,LSR #4]:STR R7,[R5],#4 11770 AND R10,R6,#&20 11780 LDR R7,[R2,R10,LSR #3]:STR R7,[R5],#4 11790 AND R10,R6,#&10 11800 LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 11810 AND R10,R6,#&8 11820 LDR R7,[R2,R10,LSR #1]:STR R7,[R5],#4 11830 AND R10,R6,#&4 11840 LDR R7,[R2,R10]:STR R7,[R5],#4 11850 AND R10,R6,#&2 11860 LDR R7,[R2,R10,LSL #1]:STR R7,[R5],#4 11870 AND R10,R6,#&1 11880 ] 11890ELSE 11900[OPT Z 11910 AND R10,R6,#&1 11920 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 11930 AND R10,R6,#&2 11940 LDR R7,[R2,R10,LSL #1]:STR R7,[R5],#4 11950 AND R10,R6,#&4 11960 LDR R7,[R2,R10]:STR R7,[R5],#4 11970 AND R10,R6,#&8 11980 LDR R7,[R2,R10,LSR #1]:STR R7,[R5],#4 11990 AND R10,R6,#&10 12000 LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 12010 AND R10,R6,#&20 12020 LDR R7,[R2,R10,LSR #3]:STR R7,[R5],#4 12030 AND R10,R6,#&40 12040 LDR R7,[R2,R10,LSR #4]:STR R7,[R5],#4 12050 MOV R10,R6,LSR #7 12060 ] 12070ENDIF 12080[OPT Z 12090 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 12100 SUBS R0,R0,#8:BHI mappixlp 12110 MOVS PC,R14 12120 ] 12130ENDCASE 12140[OPT Z 12150; routine to add two arrays and halve output of fixed point numbers for scaling 12160.addhalf% 12170 LDR R0,[R9]:LDR R0,[R0] 12180 LDR R1,[R9,#8] ;output 12190 LDR R2,[R9,#2*8] ;input 12200.addhalflp 12210 LDR R3,[R1]:LDR R4,[R2],#4:ADD R3,R3,R4:MOV R3,R3,LSR #1:STR R3,[R1],#4 12220 SUBS R0,R0,#1:BPL addhalflp 12230 MOVS PC,R14 12240; change size in x CALLxsample%,xmul%,xdiv%,z%(1,0),xp%(1,0),x% 12250.xsample% 12260 LDR R0,[R9]:LDR R0,[R0] ;x% 12270 LDR R1,[R9,#8] ;xp (in) 12280 LDR R2,[R9,#2*8] ;z 12290 LDR R3,[R9,#3*8]:LDR R3,[R3] ;xdiv% 12300 LDR R4,[R9,#4*8]:LDR R4,[R4] ;xmul% 12310 MOV R11,R4 12320.xsamplelp 12330 LDMIA R1,{R5} 12340 SUBS R11,R11,#1:MOVEQ R11,R4:ADDEQ R1,R1,#4 12350 SUBS R12,R3,#1 ;(in range 1..) 12360 BEQ xdonediv 12370.xdivlp 12380 LDMIA R1,{R8} 12390 SUBS R11,R11,#1:MOVEQ R11,R4:ADDEQ R1,R1,#4 12400 ADD R5,R5,R8:MOV R5,R5,LSR #1 12410 SUBS R12,R12,#1:BNE xdivlp 12420.xdonediv 12430 STMIA R2!,{R5} 12440 SUBS R0,R0,#1:BPL xsamplelp 12450 MOVS PC,R14 12460] 12470WHEN 2:REM when col=2 12480[OPT Z 12490.mappix% ; CALL mappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 12500 LDR R0,[R9]:LDR R0,[R0] ;count 12510 LDR R1,[R9,#8]:LDR R1,[R1] ;base of byte array 12520 LDR R2,[R9,#4*8] ;base of r array 12530 LDR R3,[R9,#3*8] ;base of g array 12540 LDR R4,[R9,#2*8] ;base of b array 12550 LDR R5,[R9,#5*8] ;base of z array 12560.mappixlp 12570 LDRB R6,[R1],#1 12580 ] 12590CASE input OF 12600WHEN 8: 12610IFflag=1600 OR flag=1601 AND ham THEN 12620[OPT Z 12630 ADR R9,ltable 12640 MOVS R7,R6,LSR #4:AND R6,R6,#15 12650 LDREQ R10,[R2,R6,LSL #2]:LDREQ R11,[R3,R6,LSL #2]:LDREQ R12,[R4,R6,LSL #2] 12660 CMP R7,#1:LDREQ R12,[R9,R6,LSL #2] 12670 CMP R7,#2:LDREQ R10,[R9,R6,LSL #2] 12680 CMP R7,#3:LDREQ R11,[R9,R6,LSL #2] 12690 STMIA R5!,{R10,R11,R12} 12700 SUBS R0,R0,#1:BNE mappixlp 12710 MOVS PC,R14 12720.ltable EQUD 0 12730 EQUD 1/15*F 12740 EQUD 2/15*F 12750 EQUD 3/15*F 12760 EQUD 4/15*F 12770 EQUD 5/15*F 12780 EQUD 6/15*F 12790 EQUD 7/15*F 12800 EQUD 8/15*F 12810 EQUD 9/15*F 12820 EQUD 10/15*F 12830 EQUD 11/15*F 12840 EQUD 12/15*F 12850 EQUD 13/15*F 12860 EQUD 14/15*F 12870 EQUD F 12880 ] 12890ELSE 12900[OPT Z 12910 LDR R7,[R2,R6,LSL #2]:STR R7,[R5],#4 12920 LDR R7,[R3,R6,LSL #2]:STR R7,[R5],#4 12930 LDR R7,[R4,R6,LSL #2]:STR R7,[R5],#4 12940 SUBS R0,R0,#1:BNE mappixlp 12950 MOVS PC,R14 12960 ] 12970ENDIF 12980WHEN 4: 12990IFbigendianbits THEN 13000[OPT Z 13010 MOV R10,R6,LSR #4 13020 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 13030 LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 13040 LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 13050 AND R10,R6,#&F 13060 ] 13070ELSE 13080[OPT Z 13090 AND R10,R6,#&F 13100 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 13110 LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 13120 LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 13130 MOV R10,R6,LSR #4 13140 ] 13150ENDIF 13160[OPT Z 13170 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 13180 LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 13190 LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 13200 SUBS R0,R0,#2:BHI mappixlp 13210 MOVS PC,R14 13220 ] 13230WHEN 2: 13240IFbigendianbits THEN 13250[OPT Z 13260 MOV R10,R6,LSR #6 13270 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 13280 LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 13290 LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 13300 AND R10,R6,#&30 13310 LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 13320 LDR R7,[R3,R10,LSR #2]:STR R7,[R5],#4 13330 LDR R7,[R4,R10,LSR #2]:STR R7,[R5],#4 13340 AND R10,R6,#&C 13350 LDR R7,[R2,R10]:STR R7,[R5],#4 13360 LDR R7,[R3,R10]:STR R7,[R5],#4 13370 LDR R7,[R4,R10]:STR R7,[R5],#4 13380 AND R10,R6,#&3 13390 ] 13400ELSE 13410[OPT Z 13420 AND R10,R6,#&3 13430 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 13440 LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 13450 LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 13460 AND R10,R6,#&C 13470 LDR R7,[R2,R10]:STR R7,[R5],#4 13480 LDR R7,[R3,R10]:STR R7,[R5],#4 13490 LDR R7,[R4,R10]:STR R7,[R5],#4 13500 AND R10,R6,#&30 13510 LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 13520 LDR R7,[R3,R10,LSR #2]:STR R7,[R5],#4 13530 LDR R7,[R4,R10,LSR #2]:STR R7,[R5],#4 13540 MOV R10,R6,LSR #6 13550 ] 13560ENDIF 13570[OPT Z 13580 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 13590 LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 13600 LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 13610 SUBS R0,R0,#4:BHI mappixlp 13620 MOVS PC,R14 13630 ] 13640WHEN 1: 13650IFbigendianbits THEN 13660[OPT Z 13670 AND R10,R6,#&80 13680 LDR R7,[R2,R10,LSR #5]:STR R7,[R5],#4 13690 LDR R7,[R3,R10,LSR #5]:STR R7,[R5],#4 13700 LDR R7,[R4,R10,LSR #5]:STR R7,[R5],#4 13710 AND R10,R6,#&40 13720 LDR R7,[R2,R10,LSR #4]:STR R7,[R5],#4 13730 LDR R7,[R3,R10,LSR #4]:STR R7,[R5],#4 13740 LDR R7,[R4,R10,LSR #4]:STR R7,[R5],#4 13750 AND R10,R6,#&20 13760 LDR R7,[R2,R10,LSR #3]:STR R7,[R5],#4 13770 LDR R7,[R3,R10,LSR #3]:STR R7,[R5],#4 13780 LDR R7,[R4,R10,LSR #3]:STR R7,[R5],#4 13790 AND R10,R6,#&10 13800 LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 13810 LDR R7,[R3,R10,LSR #2]:STR R7,[R5],#4 13820 LDR R7,[R4,R10,LSR #2]:STR R7,[R5],#4 13830 AND R10,R6,#&8 13840 LDR R7,[R2,R10,LSR #1]:STR R7,[R5],#4 13850 LDR R7,[R3,R10,LSR #1]:STR R7,[R5],#4 13860 LDR R7,[R4,R10,LSR #1]:STR R7,[R5],#4 13870 AND R10,R6,#&4 13880 LDR R7,[R2,R10]:STR R7,[R5],#4 13890 LDR R7,[R3,R10]:STR R7,[R5],#4 13900 LDR R7,[R4,R10]:STR R7,[R5],#4 13910 AND R10,R6,#&2 13920 LDR R7,[R2,R10,LSL #1]:STR R7,[R5],#4 13930 LDR R7,[R3,R10,LSL #1]:STR R7,[R5],#4 13940 LDR R7,[R4,R10,LSL #1]:STR R7,[R5],#4 13950 AND R10,R6,#&1 13960 ] 13970ELSE 13980[OPT Z 13990 AND R10,R6,#&1 14000 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 14010 LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 14020 LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 14030 AND R10,R6,#&2 14040 LDR R7,[R2,R10,LSL #1]:STR R7,[R5],#4 14050 LDR R7,[R3,R10,LSL #1]:STR R7,[R5],#4 14060 LDR R7,[R4,R10,LSL #1]:STR R7,[R5],#4 14070 AND R10,R6,#&4 14080 LDR R7,[R2,R10]:STR R7,[R5],#4 14090 LDR R7,[R3,R10]:STR R7,[R5],#4 14100 LDR R7,[R4,R10]:STR R7,[R5],#4 14110 AND R10,R6,#&8 14120 LDR R7,[R2,R10,LSR #1]:STR R7,[R5],#4 14130 LDR R7,[R3,R10,LSR #1]:STR R7,[R5],#4 14140 LDR R7,[R4,R10,LSR #1]:STR R7,[R5],#4 14150 AND R10,R6,#&10 14160 LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 14170 LDR R7,[R3,R10,LSR #2]:STR R7,[R5],#4 14180 LDR R7,[R4,R10,LSR #2]:STR R7,[R5],#4 14190 AND R10,R6,#&20 14200 LDR R7,[R2,R10,LSR #3]:STR R7,[R5],#4 14210 LDR R7,[R3,R10,LSR #3]:STR R7,[R5],#4 14220 LDR R7,[R4,R10,LSR #3]:STR R7,[R5],#4 14230 AND R10,R6,#&40 14240 LDR R7,[R2,R10,LSR #4]:STR R7,[R5],#4 14250 LDR R7,[R3,R10,LSR #4]:STR R7,[R5],#4 14260 LDR R7,[R4,R10,LSR #4]:STR R7,[R5],#4 14270 MOV R10,R6,LSR #7 14280 ] 14290ENDIF 14300[OPT Z 14310 LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 14320 LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 14330 LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 14340 SUBS R0,R0,#8:BHI mappixlp 14350 MOVS PC,R14 14360 ] 14370WHEN 24: 14380[OPT Z 14390.mappix% ; CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%,sx% 14400 LDR R0,[R9]:LDR R0,[R0] ;count 14410 LDR R1,[R9,#3*8]:LDR R1,[R1] ;base of r byte array 14420 LDR R2,[R9,#2*8]:LDR R2,[R2] ;base of g byte array 14430 LDR R3,[R9,#8]:LDR R3,[R3] ;base of b byte array 14440 LDR R4,[R9,#6*8] ;base of r array 14450 LDR R5,[R9,#5*8] ;base of g array 14460 LDR R6,[R9,#4*8] ;base of b array 14470 LDR R7,[R9,#7*8] ;base of z array 14480.mappixlp 14490 LDRB R8,[R1],#step24:LDR R8,[R4,R8,LSL #2]:STR R8,[R7],#4 14500 LDRB R8,[R2],#step24:LDR R8,[R5,R8,LSL #2]:STR R8,[R7],#4 14510 LDRB R8,[R3],#step24:LDR R8,[R6,R8,LSL #2]:STR R8,[R7],#4 14520 SUBS R0,R0,#1:BNE mappixlp 14530 MOVS PC,R14 14540 ] 14550ENDCASE 14560 [OPT Z 14570; routine to add two arrays and halve output of fixed point numbers for scaling 14580.addhalf% 14590 LDR R0,[R9]:LDR R0,[R0] 14600 LDR R1,[R9,#8] ;output 14610 LDR R2,[R9,#2*8] ;input 14620.addhalflp 14630 LDR R3,[R1]:LDR R4,[R2],#4:ADD R3,R3,R4:MOV R3,R3,LSR #1:STR R3,[R1],#4 14640 LDR R3,[R1]:LDR R4,[R2],#4:ADD R3,R3,R4:MOV R3,R3,LSR #1:STR R3,[R1],#4 14650 LDR R3,[R1]:LDR R4,[R2],#4:ADD R3,R3,R4:MOV R3,R3,LSR #1:STR R3,[R1],#4 14660 SUBS R0,R0,#1:BPL addhalflp 14670 MOVS PC,R14 14680; change size in x CALLxsample%,xmul%,xdiv%,z%(1,0),xp%(1,0),x% 14690.xsample% 14700 LDR R0,[R9]:LDR R0,[R0] ;x% 14710 LDR R1,[R9,#8] ;xp (in) 14720 LDR R2,[R9,#2*8] ;z 14730 LDR R3,[R9,#3*8]:LDR R3,[R3] ;xdiv% 14740 LDR R4,[R9,#4*8]:LDR R4,[R4] ;xmul% 14750 MOV R11,R4 14760.xsamplelp 14770 LDMIA R1,{R5,R6,R7} 14780 SUBS R11,R11,#1:MOVEQ R11,R4:ADDEQ R1,R1,#12 14790 SUBS R12,R3,#1 ;(in range 1..) 14800 BEQ xdonediv 14810.xdivlp 14820 LDMIA R1,{R8,R9,R10} 14830 SUBS R11,R11,#1:MOVEQ R11,R4:ADDEQ R1,R1,#12 14840 ADD R5,R5,R8:MOV R5,R5,LSR #1 14850 ADD R6,R6,R9:MOV R6,R6,LSR #1 14860 ADD R7,R7,R10:MOV R7,R7,LSR #1 14870 SUBS R12,R12,#1:BNE xdivlp 14880.xdonediv 14890 STMIA R2!,{R5,R6,R7} 14900 SUBS R0,R0,#1:BPL xsamplelp 14910 MOVS PC,R14 14920 ] 14930ENDCASE 14940IFcompression=5 THEN 14950[OPT Z 14960; CALL LZWdecode%,table%(0,0),c%,buff%,sx% 14970.firstcode DCD 0 14980.oldcode DCD 0 14990.codesize DCD setcodes%+1 15000.stack DCD stk% 15010.sp DCD stk% 15020.maxcode DCD clearcode%+2 15030.maxcodesize DCD 2*clearcode% 15040.LZWdecode% 15050 LDR R2,firstcode 15060 LDR R3,oldcode 15070 LDR R4,stack 15080 LDR R5,codesize 15090 LDR R6,sp 15100 LDR R7,maxcode 15110 LDR R8,maxcodesize 15120 LDR R10,[R9] 15130 LDR R10,[R10] ;sx% 15140 LDR R11,[R9,#8] 15150 LDR R11,[R11] ;buff% 15160 LDR R12,[R9,#24] ;table%() 15170 STMFD SP !,{R14} 15180.lzwloop 15190 CMP R6,R4 15200 BHI lzwunstack 15210.lzwengine 15220 BL getcode 15230 CMP R0,#clearcode% 15240 BEQ lzwclear 15250;really ought to check for endcode=clearcode+1, but it only happens once and then you don't need the answer! 15260 MOV R1,R0 ;incode=code 15270 CMP R0,R7 ;if code>=maxcode 15280 STRCSB R2,[R6],#1 ;*sp++=firstcode 15290 MOVCS R0,R3 ;code=oldcode 15300 ADD R2,R12,#4 ;r2(temp)=addr table%(x,1) 15310 CMP R0,#clearcode% 15320 BCC lzwdonepush 15330.lzwpushtable 15340 LDR R14,[R2,R0,LSL #3] ;table%(code%,1) 15350 STRB R14,[R6],#1 ;*sp++= 15360 LDR R0,[R12,R0,LSL #3] ;code=table%(code%,0) 15370 CMP R0,#clearcode% 15380 BCS lzwpushtable 15390.lzwdonepush 15400 LDR R2,[R2,R0,LSL #3] ;firstcode=table%(code%,1) 15410 STRB R2,[R6],#1 ;*sp++=firstcode 15420 MOV R0,R7 ;code=maxcode 15430 CMP R0,#4096 15440 BCS lzwnocode 15450 STR R3,[R12,R0,LSL #3] ;table%(code%,0)=oldcode 15460 ADD R14,R12,#4 15470 STR R2,[R14,R0,LSL #3] ;table%(code%,1)=firstcode 15480 ADD R7,R7,#1 ;maxcode++ 15490 CMP R7,R8 15500 BCC lzwnocode ;if maxcode>=maxcodesize 15510 CMP R8,#4096 ;and maxcodesize<4096 15520 ADDCC R5,R5,#1 ;codesize++ 15530 MOVCC R8,R8,LSL #1 ;double maxcodesize 15540.lzwnocode 15550 MOV R3,R1 ;oldcode=incode 15560 CMP R6,R4 ;until sp>stk 15570 BLS lzwengine 15580.lzwunstack 15590 LDRB R0,[R6,#-1]! ;*--sp 15600.lzwloopend 15610 STRB R0,[R11],#1 15620 SUBS R10,R10,#1 15630 BNE lzwloop 15640 STR R2,firstcode 15650 STR R3,oldcode 15660 STR R5,codesize 15670 STR R6,sp 15680 STR R7,maxcode 15690 STR R8,maxcodesize 15700 LDMFD SP !,{PC}^ 15710.lzwclear 15720 MOV R0,#0:MOV R1,#0 15730 MOV R2,#1<<12 15740 MOV R3,R12 15750.lzwzerotable 15760 STMIA R3 !,{R0,R1} 15770 SUBS R2,R2,#1 15780 BNE lzwzerotable 15790 ADD R3,R12,#4 15800.lzwdefaulttable 15810 STR R0,[R3],#8 15820 ADD R0,R0,#1 15830 CMP R0,#clearcode% 15840 BCC lzwdefaulttable 15850 MOV R5,#setcodes%+1 15860 MOV R7,#clearcode% 15870 MOV R8,R7,LSL #1 ;maxcodesize=clearcode*2 15880 ADD R7,R7,#2 ;maxcode=clearcode+2 15890 BL getcode 15900 MOV R2,R0 ;firstcode 15910 MOV R3,R0 ;oldcode 15920 MOV R6,R4 ;sp=stk 15930 B lzwloopend 15940;enter with codesize in R5. Result in R0. Kills R1 15950.getcode 15960 STMFD SP !,{R6,R7,R8} 15970 ADR R6,curbit 15980 LDMIA R6,{R6,R7,R8} 15990 ADD R1,R5,R6 ;curbit+codesize 16000 CMP R1,R7 16010 BCS needmoredata 16020.simplecode 16030 ADD R7,R8,R6,LSR #3 16040 BIC R7,R7,#3 16050 LDMIA R7,{R0,R7} 16060 ANDS R1,R6,#31:MOVNE R0,R0,LSR R1:RSBNE R1,R1,#32:ORRNE R0,R0,R7,LSL R1 16070 MVN R1,#0:BIC R0,R0,R1,LSL R5 16080 ADD R6,R6,R5 16090 STR R6,curbit 16100 LDMFD SP !,{R6,R7,R8} 16110 MOV PC,R14 16120.needmoredata 16130 STMFD SP !,{R2,R3,R4} 16140 MOV R3,R7,LSR #3 16150 SUB R0,R3,#2 ;lastbyte-2 16160 LDRB R0,[R8,R0] 16170 STRB R0,[R8] 16180 SUB R0,R3,#1 ;lastbyte-1 16190 LDRB R0,[R8,R0] 16200 STRB R0,[R8,#1] 16210 LDR R1,[R9,#16] 16220 LDR R1,[R1] ;c% 16230 SWI "OS_BGet" 16240 MOVS R3,R0 ;count 16250 BEQ simplecode1 16260 SUB R6,R6,R7 ;curbit-lastbit 16270 ADD R6,R6,#16 16280 ADD R0,R0,#2 ;lastbyte=2+count 16290 MOV R7,R0,LSL #3 16300 STR R7,lastbit 16310 MOV R0,#4 16320 ADD R2,R8,#2 ;buf+2 16330 SWI "OS_GBPB" 16340.simplecode1 16350 LDMFD SP !,{R2,R3,R4} 16360 B simplecode 16370.curbit DCD 0 16380.lastbit DCD 0 16390.buf DCD buf% 16400 ] 16410ENDIF 16420IFrange% THEN 16430[OPT Z 16440;CALL maxmin%,a%(1,0),totalvals% 16450.maxmin% 16460 LDR R0,[R9]:LDR R0,[R0] ;totalvals% 16470 LDR R1,[R9,#8] ;a%() 16480 LDR R2,min 16490 LDR R3,max 16500.maxminlp 16510 LDR R4,[R1],#4 16520 CMP R4,R3:MOVCS R3,R4 ;if r4>max max=r4 16530 CMP R4,R2:MOVCC R2,R4 ;if r4<min min=r4 16540 SUBS R0,R0,#1:BNE maxminlp 16550 STR R2,min 16560 STR R3,max 16570 MOVS PC,R14 16580.min DCD F 16590.max DCD 0 16600.fitmulloc DCD 0 16610;CALL ranger%,a%(1,0),totalvals% 16620.ranger% 16630 LDR R0,[R9] 16640 LDR R0,[R0] ;totalvals% 16650 LDR R1,[R9,#8] ;a%() 16660 LDR R2,min 16670 LDR R3,fitmulloc 16680 MOV R4,R3,LSR #16 16690 EOR R3,R3,R4,LSL #16 16700.rangelp 16710 LDR R5,[R1] 16720 SUB R5,R5,R2 16730 MOV R6,R5,LSR #16 16740 EOR R5,R5,R6,LSL #16 16750 MUL R7,R3,R5 16760 MUL R5,R4,R5 16770 MUL R8,R6,R3 16780 MUL R6,R4,R6 16790 ADDS R8,R5,R8 16800 ADDCS R6,R6,#&10000 16810 ADDS R7,R7,R8,LSL #16 16820 ADC R6,R6,R8,LSR #16 16830 MOV R6,R6,LSL #(32-28) 16840 ORRS R6,R6,R7,LSR #28 16850 ADDCS R6,R6,#1 ;carry is shifted out bit 16860 CMP R6,#F 16870 MOVCS R6,#F 16880 STR R6,[R1],#4 16890 SUBS R0,R0,#1 16900 BNE rangelp 16910 MOVS PC,R14 16920 ] 16930ENDIF 16940IFsharpen% THEN 16950sharp=(col+1)*4:IFsharpen%<>8 sharpmul%=F/(sharpen%-8) 16960[OPT Z 16970;CALL sharp%,z%(1,0),rm%(1,0),rm1%(1,0),rm2%(1,0),totalvals% 16980.sharp% 16990 LDR R0,[R9] 17000 LDR R0,[R0] ;sx% 17010 LDR R1,[R9,#8] ;rm2%() 17020 LDR R2,[R9,#16] ;rm1%() 17030 LDR R3,[R9,#24] ;rm%() 17040 LDR R4,[R9,#32] ;z%() 17050 ] 17060CASE sharpen% OF 17070WHEN 8,9,12,16,24 17080OTHERWISE 17090[OPT Z 17100 MOV R8,#sharpmul% AND &FF 17110 ORR R8,R8,#sharpmul% AND &FF00 17120 MOV R9,#(sharpmul% >> 16) AND &FF 17130 ORR R9,R9,#(sharpmul% >> 16) AND &FF00 17140 ] 17150ENDCASE 17160[OPT Z 17170.sharplp 17180 LDR R5,[R1,#-sharp] 17190 LDR R6,[R1,#sharp] 17200 ADD R5,R5,R6 17210 LDR R6,[R1],#4 17220 ADD R5,R5,R6 17230 LDR R6,[R3,#-sharp] 17240 ADD R5,R5,R6 17250 LDR R6,[R3,#sharp] 17260 ADD R5,R5,R6 17270 LDR R6,[R3],#4 17280 ADD R5,R5,R6 17290 LDR R6,[R2,#-sharp] 17300 ADD R5,R5,R6 17310 LDR R6,[R2,#sharp] 17320 ADD R5,R5,R6 ;unsigned total to subtract 17330 LDR R6,[R2],#4 ;centre 17340 MOV R6,R6,LSR #1 17350 MOV R7,#sharpen% 17360 MUL R7,R6,R7 ;avoid duplicate register while keeping Rs small 17370 SUBS R5,R7,R5,LSR #1 17380 MOVCC R5,#0 ;underflow to 0 now! 17390 ] 17400CASE sharpen% OF 17410WHEN 8,9 17420[OPT Z 17430 MOV R6,R5,LSL #1 17440 ] 17450WHEN 10 17460[OPT Z 17470 MOV R6,R5 17480 ] 17490WHEN 12 17500[OPT Z 17510 MOV R6,R5,LSR #1 17520 ] 17530WHEN 16 17540[OPT Z 17550 MOV R6,R5,LSR #2 17560 ] 17570WHEN 24 17580[OPT Z 17590 MOV R6,R5,LSR #3 17600 ] 17610OTHERWISE 17620[OPT Z 17630 MOV R6,R5,LSR #16 17640 EOR R5,R5,R6,LSL #16 17650 MUL R7,R8,R5 17660 MUL R5,R9,R5 17670 MUL R10,R6,R8 17680 MUL R6,R9,R6 17690 ADDS R10,R5,R10 17700 ADDCS R6,R6,#&10000 17710 ADDS R7,R7,R10,LSL #16 17720 ADC R6,R6,R10,LSR #16 17730 MOV R6,R6,LSL #(32-27) 17740 ORRS R6,R6,R7,LSR #27 17750 ADDCS R6,R6,#1 ;carry is shifted out bit 17760 ] 17770ENDCASE 17780[OPT Z 17790 CMP R6,#F 17800 MOVCS R6,#F 17810 STR R6,[R4],#4 17820 SUBS R0,R0,#1 17830 BNE sharplp 17840 MOVS PC,R14 17850 ] 17860ENDIF 17870IFhist%ORequal% THEN 17880[OPT Z 17890;CALLhisto%,z%(1,0),vals%(0,0),sx% 17900.histo% 17910 LDR R0,[R9] 17920 LDR R0,[R0] ;sx% 17930 LDR R1,[R9,#8] ;vals%() 17940 LDR R2,[R9,#16] 17950.histlp 17960 ] 17970IFcol=0 THEN 17980[OPT Z 17990 LDR R3,[R2],#4 18000 CMP R3,#F 18010 MOVCS R3,#F 18020 MOV R3,R3,LSR #bits-8 18030 LDR R4,[R1,R3,LSL #2] 18040 ADD R4,R4,#1 18050 STR R4,[R1,R3,LSL #2] 18060 ] 18070ELSE 18080[OPT Z 18090 LDR R3,[R2],#4 18100 CMP R3,#F 18110 MOVCS R3,#F 18120 MOV R3,R3,LSR #bits-8 18130 ADD R3,R3,R3,LSL #1 18140 LDR R4,[R1,R3,LSL #2] 18150 ADD R4,R4,#1 18160 STR R4,[R1,R3,LSL #2] 18170 LDR R3,[R2],#4 18180 CMP R3,#F 18190 MOVCS R3,#F 18200 MOV R3,R3,LSR #bits-8 18210 ADD R3,R3,R3,LSL #1 18220 ADD R3,R3,#1 18230 LDR R4,[R1,R3,LSL #2] 18240 ADD R4,R4,#1 18250 STR R4,[R1,R3,LSL #2] 18260 LDR R3,[R2],#4 18270 CMP R3,#F 18280 MOVCS R3,#F 18290 MOV R3,R3,LSR #bits-8 18300 ADD R3,R3,R3,LSL #1 18310 ADD R3,R3,#2 18320 LDR R4,[R1,R3,LSL #2] 18330 ADD R4,R4,#1 18340 STR R4,[R1,R3,LSL #2] 18350 ] 18360ENDIF 18370[OPT Z 18380 SUBS R0,R0,#1 18390 BNE histlp 18400 MOVS PC,R14 18410 ] 18420ENDIF 18430IFequal% THEN 18440[OPT Z 18450;CALLhistequal%,z%(1,0),new%(0),sx% 18460.histequal% 18470 LDR R0,[R9] 18480 LDR R0,[R0] ;sx% 18490 LDR R1,[R9,#8] ;new%() 18500 LDR R2,[R9,#16] ;z%() 18510.equallp 18520 ] 18530IFcol=0 THEN 18540[OPT Z 18550 LDR R3,[R2] 18560 CMP R3,#F 18570 MOVCS R3,#F 18580 MOV R3,R3,LSR #bits-8 18590 LDR R4,[R1,R3,LSL #2] 18600 STR R4,[R2],#4 18610 ] 18620ELSE 18630[OPT Z 18640 LDR R3,[R2] 18650 CMP R3,#F 18660 MOVCS R3,#F 18670 MOV R3,R3,LSR #bits-8 18680 ADD R3,R3,R3,LSL #1 18690 LDR R4,[R1,R3,LSL #2] 18700 STR R4,[R2],#4 18710 LDR R3,[R2] 18720 CMP R3,#F 18730 MOVCS R3,#F 18740 MOV R3,R3,LSR #bits-8 18750 ADD R3,R3,R3,LSL #1 18760 ADD R3,R3,#1 18770 LDR R4,[R1,R3,LSL #2] 18780 STR R4,[R2],#4 18790 LDR R3,[R2] 18800 CMP R3,#F 18810 MOVCS R3,#F 18820 MOV R3,R3,LSR #bits-8 18830 ADD R3,R3,R3,LSL #1 18840 ADD R3,R3,#2 18850 LDR R4,[R1,R3,LSL #2] 18860 STR R4,[R2],#4 18870 ] 18880ENDIF 18890[OPT Z 18900 SUBS R0,R0,#1 18910 BNE equallp 18920 MOVS PC,R14 18930 ] 18940ENDIF 18950[OPT Z 18960;CALL rlexpand%,limit%,decr%,colour%,address% 18970;IFdecr%>1 REPEAT?address%++=colour%;decr%--;UNTILdecr%<1 OR address%=limit% 18980.rlexpand% 18990 LDR R0,[R9] ;adr of address% 19000 LDR R1,[R0] ;address% 19010 LDR R2,[R9,#8] 19020 LDR R2,[R2] ;colour% 19030 LDR R3,[R9,#16] ;adr of decr% 19040 LDR R4,[R3] ;decr% 19050 CMP R4,#1 19060 MOVLTS PC,R14 19070 LDR R5,[R9,#24] 19080 LDR R5,[R5] ;limit% 19090.rle STRB R2,[R1],#1 19100 SUB R4,R4,#1 19110 CMP R1,R5 19120 TEQNE R4,#0 19130 BNE rle 19140.rlexit STR R1,[R0] ;update address% 19150 STR R4,[R3] ;update decr% 19160 MOVS PC,R14 19170 ] 19180IFplanar<0 THEN 19190[OPT Z 19200.plancnv% ;CALLplancnv%,st%(1),quant%,buff%,sx% 19210 LDR R0,[R9]:LDR R0,[R0] ;sx% 19220 LDR R1,[R9,#8]:LDR R1,[R1] ;buff% 19230 LDR R2,[R9,#16]:LDR R2,[R2] ;quant% 19240 LDR R3,[R9,#24] ;adr of st%() 19250 MOV R4,#7 19260 MOV R5,#0 19270 MOV R6,#0 19280.planelp 19290 MOV R7,#0 19300 SUB R8,R2,#1 19310.planepixlp 19320 LDR R9,[R3,R8,LSL #2] 19330 LDRB R9,[R9,R5] 19340 MOV R9,R9,LSR R4 19350 AND R9,R9,#1 19360 ORR R7,R7,R9,LSL R8 19370 SUBS R8,R8,#1:BPL planepixlp 19380 STRB R7,[R1],#1 19390 SUBS R4,R4,#1:MOVMI R4,#7:ADDMI R5,R5,#1 19400 SUBS R0,R0,#1:BNE planelp 19410 MOVS PC,R14 19420 ] 19430ENDIF 19440NEXT 19450hour%=&406c4 19460CASE ncol OF 19470WHEN 255:size%=1 19480WHEN 63:size%=1 19490WHEN 15:size%=2 19500WHEN 3:size%=4 19510WHEN 1:size%=8:IFm$="C" size%=2 19520ENDCASE 19530REM fixup images that can't be read in row order 19540CASE flag OF 19550WHEN 501 19560IFinfo% PRINT"Reading interlaced GIF" 19570sz%=sx%*sy%:tbuff%=FNdim(sz%+100):otbuff%=tbuff% 19580FORY%=0TOsy%-1STEP8:X%=tbuff%+Y%*sx%:CALL LZWdecode%,table%(0,0),c%,X%,sx%:NEXT 19590FORY%=4TOsy%-1STEP8:X%=tbuff%+Y%*sx%:CALL LZWdecode%,table%(0,0),c%,X%,sx%:NEXT 19600FORY%=2TOsy%-1STEP4:X%=tbuff%+Y%*sx%:CALL LZWdecode%,table%(0,0),c%,X%,sx%:NEXT 19610FORY%=1TOsy%-1STEP2:X%=tbuff%+Y%*sx%:CALL LZWdecode%,table%(0,0),c%,X%,sx%:NEXT 19620FORY%=0TOsy%-1:SYShour%,Y%*100DIVsy% 19630 IFvrep% THEN 19640 vrep%-=1:FORX%=1TOquant% 19650 F%=st%(X%)+Y%*rsx%:C%=F%-rsx%:FORE%=0TOrsx%-1:F%?E%=C%?E%:NEXT 19660 NEXT 19670 ELSE 19680 FORX%=1TOquant% 19690 F%=st%(X%)+Y%*rsx%:G%=F%+rsx%:REPEAT C%=BGET#c%:IFC%=0 THEN 19700 C%=BGET#c%:IFC%=0 THEN 19710 C%=BGET#c%:vrep%=BGET#c%-1 19720 ELSE 19730 D%=F%:FORE%=0TOpatlen%-1:F%?E%=BGET#c%:NEXT:F%+=patlen% 19740 IFC%>1 FORI%=2TOC%:FORE%=0TOpatlen%-1:F%?E%=D%?E%:NEXT:F%+=patlen%:NEXT 19750 ENDIF 19760 ELSE 19770 IFC%=128 THEN 19780 C%=BGET#c%:FORE%=0TOC%-1:F%?E%=BGET#c%:NEXT:F%+=C% 19790 ELSE 19800 ?F%=(C%AND&80)<>0:FORE%=1TOC%AND&7F:F%?E%=?F%:NEXT:F%+=C%AND&7F 19810 ENDIF 19820 ENDIF 19830 UNTILF%>=G% 19840 NEXT 19850 ENDIF 19860NEXT 19870ENDCASE 19880REM if image processing the input stream to maximise luminance 19890IFrange% THEN 19900 IFinfo% PRINT"Scanning data to compute parameters for '-range'" 19910 IForder% THEN 19920 Y%=0:REPEAT SYShour%,Y%*100DIVsy% 19930 PROCiprow(xp%()):CALLmaxmin%,xp%(1,0),totalvals2%:Y%+=1 19940 UNTILY%=sy% OR !min<255 AND !max+255>=F 19950 ELSE 19960 Y%=0:ysamp%=1:REPEAT SYShour%,Y%*100DIVy% 19970 PROCscaledpixelrow(cl%()):CALLmaxmin%,cl%(1,0),totalvals%:Y%+=1 19980 UNTILY%=y% OR !min<255 AND !max+255>=F 19990 ENDIF 20000 !fitmulloc=F/(!max-!min)*F:PROCrewind 20010 IF!max+255>=F AND!min<255 range%=FALSE:range$="No point in '-range' on this image" 20020 IFrange% range$="Input image maximum "+STR$(!max/F*100)+"% minimum "+STR$(!min/F*100)+"%" 20030 IFinfo% PRINTrange$ 20040ENDIF 20050IFhist%ORequal% THEN 20060 IFequal% IFinfo% PRINT"Scanning data to compute parameters for '-equal'" 20070 IForder% THEN 20080 FORyr%=0TOsy%-1:SYShour%,yr%*100DIVsy% 20090 PROCiprow(xp%()):CALLhisto%,xp%(1,0),vals%(0,0),sx% 20100 NEXT 20110 ELSE 20120 ysamp%=1:FORyr%=0 TO y%-1:SYShour%,yr%*100DIVy% 20130 PROCscaledpixelrow(cl%()):CALLhisto%,cl%(1,0),vals%(0,0),x% 20140 NEXT 20150 ENDIF 20160 IFinfo% PRINT"Done. Now processing the picture" 20170ENDIF 20180IFhist% THEN 20190 M%=0:ZM%=-1:FORC%=0TOcol 20200 FORZ%=0TO256:IFvals%(Z%,C%)>M% M%=vals%(Z%,C%):ZM%=Z% 20210 NEXT:NEXT 20220 IFZM%=-1 OR output%=0 THEN=100 20230 IF col>0 MODE66:ht=500:LINE0,6,2000,6 ELSE MODE18:ht=400:LINE0,6,1024,6 20240 M=M%/(ht*2-8):FORC%=0TOcol:CASE C% OF 20250 WHEN 0:GCOL1 20260 WHEN 1:GCOL2 20270 WHEN 2:GCOL4 20280 ENDCASE 20290 IF col>0 THEN 20300 FORZ%=0TO256:IFvals%(Z%,C%) X%=Z%*3+C%<<1:LINEX%,8,X%,vals%(Z%,C%)/M+8 20310 NEXT 20320 ELSE 20330 FORZ%=0TO256:IFvals%(Z%,C%) X%=Z%<<2:RECTANGLE FILLX%,8,2,vals%(Z%,C%)/M 20340 NEXT 20350 ENDIF 20360 NEXT 20370 IFc% CLOSE#c%:c%=0 20380 IFcc% CLOSE#cc%:cc%=0 20390 IFccc% CLOSE#ccc%:ccc%=0 20400 SYS"Hourglass_Off" 20410 =100 20420ENDIF 20430oname$="pic"+STR$m+"_":IFrange% oname$+="r_" 20440IFequal% oname$+="e_" 20450IFsharpen% oname$+="s"+STR$sharpen%+"_" 20460oname$=LEFT$(oname$) 20470CASE m OF 20480WHEN -1:xwords%=x%:sz%=xwords%*y% 20490 IFspritearea%<0 THEN ram%=FNdim(sz%) ELSE ram%=spritearea% 20500 base%=ram% 20510OTHERWISE:xwords%=x%/size%+3.9999ANDNOT3:sz%=xwords%*y% 20520 IFncol=1 IFm$="C" !quarterrowinc=xwords%:xwords%=xwords%*4:sz%=xwords%*y% 20530 IFspritearea%<0 THEN ram%=FNdim(sz%+1024) ELSE ram%=spritearea% 20540 !ram%=sz%+1024:ram%!4=0:ram%!8=16:ram%!12=16:SYS&2e,&109,ram% 20550 IFncol=1 ANDm$="C" SYS&2e,&10f,ram%,oname$,1,x%*4,y%*4,m ELSE SYS&2e,&10f,ram%,oname$,(ncol<63)AND1,x%,y%,m 20560 base%=ram%+ram%!&30+&10:pal%=ram%+&3c 20570 CASE ncol OF 20580 WHEN 15: 20590 CASE m$ OF 20600 WHEN "D" 20610 FORZ%=0TO7:Y%=0:IFZ%AND1 Y%+=&F0 20620 IFZ%AND2 Y%+=&F000 20630 IFZ%AND4 Y%+=&F00000 20640 PROCcol(Z%,Y%):NEXT 20650 WHEN "C" 20660 FORZ%=0TO15:Y%=0:IFZ%AND4 Y%+=&F0 20670 IFZ%AND3 Y%+=(Z%AND3)*5<<12:IF(Z%AND3)=1 Y%+=&1000:REM Gamma correct g low 20680 IFZ%AND8 Y%+=&F00000 20690 PROCcol(Z%,Y%):NEXT 20700 WHEN "T" 20710 FORZ%=0TO15:Y%=Z%<<4:PROCcol(Z%,Y%ORY%<<8ORY%<<16):NEXT 20720 WHEN "" 20730 FORZ%=0TO15:Y%=(Z%AND7)/7*15+.2<<4:PROCcol(Z%,Y%ORY%<<8ORY%<<16):NEXT 20740 ENDCASE 20750 WHEN 3 20760 IFm$="C" THEN 20770 PROCcol(0,0):PROCcol(1,&F0F000):PROCcol(2,&F000F0):PROCcol(3,&F0F0) 20780 ELSE 20790 FORZ%=0TO3:Y%=Z%*5<<4:PROCcol(Z%,Y%ORY%<<8ORY%<<16):NEXT 20800 ENDIF 20810 WHEN 1:PROCcol(0,0):PROCcol(1,&F0F0F0) 20820 ENDCASE 20830ENDCASE 20840LOCAL ERROR 20850ON ERROR LOCAL:RESTORE ERROR:PROCSave:ERROR ERR,REPORT$+" internal ("+STR$ERL+")":REM Error Return 20860SYS"Hourglass_LEDs",3:ysamp%=1:nl%()=0:step%=12:IFcol=0 step%=4 20870IFsy%=y% AND sx%=x% AND range%=FALSE AND sharpen%=FALSE AND equal%=FALSE THEN 20880FORyr%=0 TO y%-1 20890 SYShour%,yr%*100DIVy%:PROCiprow(cl%()) 20900 cl%()=cl%()+nl%():nl%()=0:B%=x%:A%=(base%+yr%*xwords%)*size% 20910 IFyr%AND1 THEN 20920 I%=step%:CALLfs%,cl%(1,0),nl%(1,0),A%,I%,B% 20930 ELSE 20940 I%=-step%:A%+=x%-1:CALLfs%,cl%(x%,0),nl%(x%,0),A%,I%,B% 20950 ENDIF 20960NEXT 20970ELSE 20980IFequal% THEN 20990 PROCrewind:range%=TRUE:Havg%=SUM(vals%())/256/(col+1):DIM new%(256,col) 21000 FORB%=0TOcol:R%=0:Hint%=0:FORZ%=0TO256:L%=R%:Hint%+=vals%(Z%,B%) 21010 WHILEHint%>Havg%:Hint%-=Havg%:R%+=1:ENDWHILE 21020 new%(Z%,B%)=(L%+R%)/2*F/256 21030 NEXT:NEXT 21040ENDIF 21050IFsharpen% THEN 21060 IForder% THEN 21070 yread%=sy%-1:PROCiprow(rm1%()):IFrange% PROCfit2(rm1%()) 21080 FORB%=0TOcol:rm1%(0,B%)=rm1%(1,B%):rm1%(sx%+1,B%)=rm1%(sx%,B%):NEXT 21090 ELSE 21100 yread%=y%-1:PROCscaledpixelrow(rm1%()):IFrange% PROCfit(rm1%()) 21110 FORB%=0TOcol:rm1%(0,B%)=rm1%(1,B%):rm1%(x%+1,B%)=rm1%(x%,B%):NEXT 21120 ENDIF 21130 rm2%()=rm1%() 21140ENDIF 21150IForder% THEN 21160FORyr%=0 TO y%-1 21170 SYShour%,yr%*100DIVy% 21180 IFsy%=y% THEN 21190 PROCsharppixelrow(cl%()) 21200 ELSE 21210 ysamp%-=1:IFysamp%=0 PROCsharppixelrow(xl%()):ysamp%=ymul% 21220 cl%()=xl%():IFydiv%>1 THEN 21230 FORY%=2TOydiv%:ysamp%-=1:IFysamp%=0 PROCsharppixelrow(xl%()):ysamp%=ymul% 21240 CALLaddhalf%,xl%(0,0),cl%(0,0),x%:NEXT 21250 ENDIF 21260 ENDIF 21270 cl%()=cl%()+nl%():nl%()=0:B%=x%:A%=(base%+yr%*xwords%)*size% 21280 IFyr%AND1 THEN 21290 I%=step%:CALLfs%,cl%(1,0),nl%(1,0),A%,I%,B% 21300 ELSE 21310 I%=-step%:A%+=x%-1:CALLfs%,cl%(x%,0),nl%(x%,0),A%,I%,B% 21320 ENDIF 21330NEXT 21340ELSE 21350FORyr%=0 TO y%-1 21360 SYShour%,yr%*100DIVy% 21370 IFsharpen% THEN 21380 IFyread% yread%-=1:PROCscaledpixelrow(rm%()):IFrange% PROCfit(rm%()) 21390 FORB%=0TOcol:rm%(0,B%)=rm%(1,B%):rm%(x%+1,B%)=rm%(x%,B%):NEXT 21400 CALL sharp%,cl%(1,0),rm%(1,0),rm1%(1,0),rm2%(1,0),totalvals% 21410 SWAP rm2%(),rm1%():rm1%()=rm%() 21420 ELSE 21430 PROCscaledpixelrow(cl%()):IFrange% PROCfit(cl%()) 21440 ENDIF 21450 cl%()=cl%()+nl%():nl%()=0:B%=x%:A%=(base%+yr%*xwords%)*size% 21460 IFyr%AND1 THEN 21470 I%=step%:CALLfs%,cl%(1,0),nl%(1,0),A%,I%,B% 21480 ELSE 21490 I%=-step%:A%+=x%-1:CALLfs%,cl%(x%,0),nl%(x%,0),A%,I%,B% 21500 ENDIF 21510NEXT 21520ENDIF 21530ENDIF 21540PROCSave 21550=0:REM Success! 21560DEF PROCSave 21570IFc% CLOSE#c%:c%=0 21580IFcc% CLOSE#cc%:cc%=0 21590IFccc% CLOSE#ccc%:ccc%=0 21600CASE m OF 21610 WHEN -1:IFspritearea%<0 IFsave% SYS"OS_File",10,f$,&004,,ram%,ram%+sz% 21620 OTHERWISE 21630 IFvflip% SYS&2e,256+33,ram%,oname$ 21640 IFhflip% SYS&2e,256+47,ram%,oname$ 21650 IFspritearea%<0 IFsave% SYS&2e,&10c,ram%,f$ 21660ENDCASE 21670SYS"Hourglass_Off" 21680ENDPROC 21690DEFPROCdefpal 21700FORC%=0TO255 21710 r%(C%)=(C%AND7 OR (C%AND16)>>1)/15*F 21720 g%(C%)=(C%AND3 OR (C%AND&60)>>3)/15*F 21730 b%(C%)=(C%AND3 OR (C%AND8)>>1 OR (C%AND128)>>4)/15*F 21740NEXT 21750ENDPROC 21760DEFPROCdefpal2 21770r%(0)=F:g%(0)=F:b%(0)=F 21780ENDPROC 21790DEFPROCdefpal4 21800r%()=15,10,5,0:FORC%=0TO3:r%(C%)=r%(C%)/15*F:NEXT 21810g%()=r%():b%()=r%() 21820ENDPROC 21830DEFPROCdefpal16 21840r%()=15,13,11,9,7,5,3,0,0,14, 0,13,14,5,15, 0 21850g%()=15,13,11,9,7,5,3,0,4,14,12, 0,14,8,11,10 21860b%()=15,13,11,9,7,5,3,0,9, 0, 0, 0,11,0, 0,15 21870FORC%=0TO15:r%(C%)=r%(C%)/15*F:g%(C%)=g%(C%)/15*F:b%(C%)=b%(C%)/15*F:NEXT 21880ENDPROC 21890DEFPROCipal63 21900PTR#c%=&38:DIM rpal%(15),gpal%(15),bpal%(15) 21910FORC%=0TO15:D%=BGET#c% 21920 rpal%(C%)=BGET#c%>>4 AND 7 21930 gpal%(C%)=BGET#c%>>4 AND 3 21940 bpal%(C%)=BGET#c%>>4 AND 7 21950D%=FNW:NEXT 21960FORC%=0TO255 21970 r%(C%)=(rpal%(C%AND15)OR(C%AND16)>>1)/15*F 21980 g%(C%)=(gpal%(C%AND15)OR(C%AND&60)>>3)/15*F 21990 b%(C%)=(bpal%(C%AND15)OR(C%AND128)>>4)/15*F 22000NEXT 22010ENDPROC 22020DEFPROCipal(D%) 22030PTR#c%=&38 22040FORC%=0TOD%-1:D%=BGET#c% 22050 r%(C%)=(BGET#c%>>4)/15*F 22060 g%(C%)=(BGET#c%>>4)/15*F 22070 b%(C%)=(BGET#c%>>4)/15*F 22080D%=FNW:NEXT 22090ENDPROC 22100DEF PROCnopal 22110FORC%=0TO255:r%(C%)=C%/255*F:NEXT:g%()=r%():b%()=r%() 22120ENDPROC 22130DEF PROCcol(A%,B%) 22140B%=B%<<8ORB%<<4OR&10:pal%!(A%*8)=B%:pal%!(A%*8+4)=B% 22150ENDPROC 22160DEF FNuc(a$) 22170LOCALZ%,z$,b$ 22180FORZ%=1TOLENa$ 22190z$=MID$(a$,Z%,1) 22200IFz$>="a"IFz$<="z" z$=CHR$(ASCz$-32) 22210b$+=z$:NEXT 22220=b$ 22230DEF FNdim(A%) 22240LOCAL B% 22250IFflex% THEN 22260 B%=nextlocation%:A%=A%+3ANDNOT3:nextlocation%+=A%+16 22270 SYS"Wimp_SlotSize",-1,-1 TO currentslot%,nextslot%,freeslot% 22280 IFnextslot%+freeslot%<A% ERROR 42,"Cannot claim enough memory to process image" 22290 currentslot%+=A%:SYS "Wimp_SlotSize",currentslot%,-1 22300ELSE 22310 IFworkspace%<0 THEN 22320 DIM B% A% 22330 ELSE 22340 B%=workspace%:workspace%+=A%+3ANDNOT3:IFworkspace%>worklimit% ERROR42,"Not enough workspace" 22350 ENDIF 22360ENDIF 22370=B% 22380REM read little endian 32 bit word 22390DEF FNW=FNW1(c%) 22400DEF FNW1(c%)=BGET#c% OR BGET#c%<<8 OR BGET#c%<<16 OR BGET#c%<<24 22410REM read little endian 16 bit word 22420DEF FNHW=BGET#c% OR BGET#c%<<8 22430REM read big endian 16 bit word 22440DEF FNbeHW=BGET#c%<<8 OR BGET#c% 22450REM read big endian 32 bit word 22460DEF FNbeW=BGET#c%<<24 OR BGET#c%<<16 OR BGET#c%<<8 OR BGET#c% 22470REM read a TIFF type 22480DEF FNtiff(T%) 22490CASE T% OF 22500WHEN 1:=BGET#c% 22510WHEN 2:LOCALs$,t$:REPEATs$+=t$:t$=CHR$BGET#c%:UNTILt$=CHR$0:=s$ 22520WHEN 3:IFbigendian THEN=BGET#c%<<8 OR BGET#c% ELSE=BGET#c% OR BGET#c%<<8 22530WHEN 4:IFbigendian THEN=FNbeW ELSE=FNW1(c%) 22540ENDCASE 22550ERROR 42,"Silly TIFF tag:"+STR$T% 22560DEF PROCTIFFnextstrip 22570TIFFread%=rowsperstrip 22580TIFFptr+=1:PTR#c%=st%(TIFFptr) 22590ENDPROC 22600DEF PROCiff(A%) 22610I%=0:REPEAT 22620 C%=BGET#c%:IFC%>127 THEN 22630 IFC%>128 A%?I%=BGET#c%:FORJ%=A%+I%+1TOA%+I%+256-C%:?J%=A%?I%:NEXT:I%+=257-C% 22640 ELSE 22650 FORJ%=A%+I%TOA%+I%+C%:?J%=BGET#c%:NEXT:I%+=C%+1 22660 ENDIF 22670UNTILI%>=rsx%-1 22680ENDPROC 22690REM standard size corrector for unknown images 22700DEF PROCsize 22710IFscale% THEN 22720 REM small images get enlarged 22730 IFsx%<=320 IF sy%<=256 xmul%=xmul%*2:ymul%=ymul%*2 22740 REM hopefully a non-square original pixel 22750 IFsy%<=sx%/2 ymul%=ymul%*2 22760ENDIF 22770ENDPROC 22780DEF PROCreduce(RETURN A%,RETURN B%) 22790LOCAL C%,D%:C%=A%:D%=B% 22800REPEAT IFC%<D% SWAP C%,D% 22810 C%=C%MODD% 22820UNTILC%=0 22830A%=A%DIVD%:B%=B%DIVD% 22840ENDPROC 22850DEF PROCreadpixelrow(z%()) 22860IFrows% THEN 22870 rows%-=1:IFsx%=x% THEN 22880 PROCiprow(z%()) 22890 ELSE 22900 PROCiprow(xp%()):CALLxsample%,xmul%,xdiv%,z%(1,0),xp%(1,0),x% 22910 ENDIF 22920ELSE 22930 z%()=0 22940ENDIF 22950ENDPROC 22960DEF PROCsharppixelrow(z%()) 22970IFrows% THEN 22980 rows%-=1:IFsx%=x% THEN 22990 IFsharpen% PROCsharp(z%()) ELSE PROCiprow(z%()):IFrange% PROCfit2(z%()) 23000 ELSE 23010 IFsharpen% PROCsharp(xp%()) ELSE PROCiprow(xp%()):IFrange% PROCfit2(xp%()) 23020 CALLxsample%,xmul%,xdiv%,z%(1,0),xp%(1,0),x% 23030 ENDIF 23040ELSE 23050 z%()=0 23060ENDIF 23070ENDPROC 23080DEF PROCsharp(z%()) 23090yread%-=1:IFyread% PROCiprow(rm%()):IFrange% PROCfit2(rm%()) 23100FORB%=0TOcol:rm%(0,B%)=rm%(1,B%):rm%(sx%+1,B%)=rm%(sx%,B%):NEXT 23110CALL sharp%,z%(1,0),rm%(1,0),rm1%(1,0),rm2%(1,0),totalvals2% 23120SWAP rm2%(),rm1%():rm1%()=rm%() 23130ENDPROC 23140DEF PROCscaledpixelrow(z%()) 23150IFsy%=y% THEN 23160 PROCreadpixelrow(z%()) 23170ELSE 23180 ysamp%-=1:IFysamp%=0 PROCreadpixelrow(xl%()):ysamp%=ymul% 23190 z%()=xl%():IFydiv%>1 THEN 23200 LOCALY%:FORY%=2TOydiv% 23210 ysamp%-=1:IFysamp%=0 PROCreadpixelrow(xl%()):ysamp%=ymul% 23220 CALLaddhalf%,xl%(0,0),z%(0,0),x%:NEXT 23230 ENDIF 23240ENDIF 23250ENDPROC 23260DEF PROCfit(z%()) 23270IFequal% THEN 23280 CALLhistequal%,z%(1,0),new%(0,0),x% 23290ELSE 23300 CALLranger%,z%(1,0),totalvals% 23310ENDIF 23320ENDPROC 23330DEF PROCfit2(z%()) 23340IFequal% THEN 23350 CALLhistequal%,z%(1,0),new%(0,0),sx% 23360ELSE 23370 CALLranger%,z%(1,0),totalvals2% 23380ENDIF 23390ENDPROC 23400DEF PROCiprow(z%()) 23410CASE flag OF 23420WHEN 0:SYS12,4,c%,buff%,sx%:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 23430WHEN 3:SYS12,4,c%,buff%,sx%+1>>1:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 23440WHEN 6:SYS12,4,c%,buff%,sx%+3>>2:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 23450WHEN 9:SYS12,4,c%,buff%,sx%+7>>3:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 23460WHEN 100:l%=BGET#c%+BGET#c%*256:SYS12,4,c%,buff%,sx%*3 23470 IF col=2 THEN 23480 CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%,sx% 23490 ELSE 23500 FORX%=1TOsx%:z%(X%,0)=r%(rb%?X%)*rwt+g%(gb%?X%)*gwt+b%(bb%?X%)*bwt:NEXT 23510 ENDIF 23520WHEN 200:SYS12,4,c%,buff%,sx%:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 23530WHEN 201:X%=buff%:REPEAT 23540 CALLrlexpand%,casx%,capix%,J%,X%:IFcapix%=0 capix%=BGET#c%+1:J%=BGET#c% 23550 UNTILX%=casx%:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 23560WHEN 300:SYS12,4,c%,buff%,sx%:X%=buff%+sx%:SYS12,4,cc%,X%,sx% 23570 IF col=2 THEN 23580 CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 23590 CALLmappix%,z2%(1,0),rpal%(0),gpal%(0),bpal%(0),X%,sx%:z%()=z%()+z2%() 23600 ELSE 23610 FORX%=1TOsx%:z%(X%,0)=(r%(ab%?X%)+rpal%(bb%?X%))*rwt+(g%(ab%?X%)+gpal%(bb%?X%))*gwt+(b%(ab%?X%)+bpal%(bb%?X%))*bwt:NEXT 23620 ENDIF 23630WHEN 400:X%=0:REPEAT 23640 IFrtpix%>0 REPEATX%?rb%=rJ%:X%?gb%=gJ%:X%?bb%=bJ%:X%+=1:rtpix%-=1:UNTILrtpix%=0ORX%=sx% 23650 IFrtpix%=0 rJ%=BGET#c%:gJ%=BGET#c%:bJ%=BGET#c%:rtpix%=BGET#c%+1 23660 UNTILX%=sx% 23670 IF col=2 THEN 23680 CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%,sx% 23690 ELSE 23700 FORX%=1TOsx%:z%(X%,0)=r%(rb%?X%)*rwt+g%(gb%?X%)*gwt+b%(bb%?X%)*bwt:NEXT 23710 ENDIF 23720WHEN 500:CALL LZWdecode%,table%(0,0),c%,buff%,sx%:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 23730WHEN 501:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),tbuff%,sx%:tbuff%+=sx% 23740WHEN 600:SYS12,4,c%,buff%,sx%:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 23750WHEN 700:SYS12,4,c%,buff%,sx%*3 23760 IF col=2 THEN 23770 CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%,sx% 23780 ELSE 23790 FORX%=1TOsx%*3STEP3:z%(X%DIV3,0)=r%(rb%?X%)*rwt+g%(gb%?X%)*gwt+b%(bb%?X%)*bwt:NEXT 23800 ENDIF 23810WHEN 800:X%=buff%:CALLrlexpand%,wtsx%,wtpix%,wt%,X% 23820 REPEAT C%=BGET#c%:CASE C%>>6 OF 23830 WHEN 0:?X%=C%:X%+=1:wt%=C% 23840 WHEN 1:wt%-=1:wtpix%=C%AND63:CALLrlexpand%,wtsx%,wtpix%,wt%,X% 23850 WHEN 2:wtpix%=C%AND63:CALLrlexpand%,wtsx%,wtpix%,wt%,X% 23860 WHEN 3:wt%+=1:wtpix%=C%AND63:CALLrlexpand%,wtsx%,wtpix%,wt%,X% 23870 ENDCASE 23880 UNTILX%=wtsx%:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 23890WHEN 801:X%=buff%:CALLrlexpand%,wtsx1%,wtpix1%,wt1%,X% 23900 REPEAT C%=BGET#c%:CASE C%>>6 OF 23910 WHEN 0:?X%=C%:X%+=1:wt1%=C% 23920 WHEN 1:wt1%-=1:wtpix1%=C%AND63:CALLrlexpand%,wtsx1%,wtpix1%,wt1%,X% 23930 WHEN 2:wtpix1%=C%AND63:CALLrlexpand%,wtsx1%,wtpix1%,wt1%,X% 23940 WHEN 3:wt1%+=1:wtpix1%=C%AND63:CALLrlexpand%,wtsx1%,wtpix1%,wt1%,X% 23950 ENDCASE 23960 UNTILX%=wtsx1% 23970 CALLrlexpand%,wtsx2%,wtpix2%,wt2%,X% 23980 REPEAT C%=BGET#cc%:CASE C%>>6 OF 23990 WHEN 0:?X%=C%:X%+=1:wt2%=C% 24000 WHEN 1:wt2%-=1:wtpix2%=C%AND63:CALLrlexpand%,wtsx2%,wtpix2%,wt2%,X% 24010 WHEN 2:wtpix2%=C%AND63:CALLrlexpand%,wtsx2%,wtpix2%,wt2%,X% 24020 WHEN 3:wt2%+=1:wtpix2%=C%AND63:CALLrlexpand%,wtsx2%,wtpix2%,wt2%,X% 24030 ENDCASE 24040 UNTILX%=wtsx2% 24050 CALLrlexpand%,wtsx3%,wtpix3%,wt3%,X% 24060 REPEAT C%=BGET#ccc%:CASE C%>>6 OF 24070 WHEN 0:?X%=C%:X%+=1:wt3%=C% 24080 WHEN 1:wt3%-=1:wtpix3%=C%AND63:CALLrlexpand%,wtsx3%,wtpix3%,wt3%,X% 24090 WHEN 2:wtpix3%=C%AND63:CALLrlexpand%,wtsx3%,wtpix3%,wt3%,X% 24100 WHEN 3:wt3%+=1:wtpix3%=C%AND63:CALLrlexpand%,wtsx3%,wtpix3%,wt3%,X% 24110 ENDCASE 24120 UNTILX%=wtsx3% 24130 IF col=2 THEN 24140 CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%,sx% 24150 ELSE 24160 FORX%=1TOsx%:z%(X%,0)=r%(rb%?X%)*rwt+g%(gb%?X%)*gwt+b%(bb%?X%)*bwt:NEXT 24170 ENDIF 24180WHEN 900:SYS12,4,c%,buff%,sx%:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 24190WHEN 901:SYS12,4,c%,buff%,sx%:SYS12,4,cc%,buff%+sx%,sx%:SYS12,4,ccc%,buff%+sx%*2,sx% 24200 IF col=2 THEN 24210 CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%,sx% 24220 ELSE 24230 FORX%=1TOsx%:z%(X%,0)=r%(rb%?X%)*rwt+g%(gb%?X%)*gwt+b%(bb%?X%)*bwt:NEXT 24240 ENDIF 24250WHEN 1000:X%=buff%:IFpapix%>0 C%=?pa%:CALLrlexpand%,pasx%,papix%,C%,X%:pa%+=1 24260 IFpapix2%>0 C%=?pa%:CALLrlexpand%,pasx%,papix2%,C%,X%:pa%+=1 24270 REPEAT C%=BGET#c%:IFC%=0 THEN 24280 papix%=BGET#c%:C%=?pa%:CALLrlexpand%,pasx%,papix%,C%,X%:IFpapix%=0 pa%+=1 24290 ELSE 24300 papix2%=C%AND15:papix%=C%>>4:IFpapix%>0 C%=?pa%:CALLrlexpand%,pasx%,papix%,C%,X%:IFpapix%=0 pa%+=1 24310 IFX%<pasx% IFpapix2%>0 C%=?pa%:CALLrlexpand%,pasx%,papix2%,C%,X%:IFpapix2%=0 pa%+=1 24320 ENDIF 24330 UNTILX%=pasx%:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 24340WHEN 1001:X%=buff%:IFpapix%>0 C%=?pa%:CALLrlexpand%,pasx%,papix%,C%,X%:pa%+=1 24350 REPEAT papix%=BGET#c%:C%=?pa%:CALLrlexpand%,pasx%,papix%,C%,X%:IFpapix%=0 pa%+=1 24360 UNTILX%=pasx%:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 24370WHEN 1100:SYS12,4,c%,buff%,sx%+7>>3:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 24380WHEN 1200:SYS12,4,c%,buff%,sx%:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 24390WHEN 1300:SYS12,4,c%,buff%,sx%:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 24400WHEN 1301:SYS12,4,c%,buff%,sx%:SYS12,4,cc%,buff%+sx%,sx%:SYS12,4,ccc%,buff%+sx%+sx%,sx% 24410 IF col=2 THEN 24420 CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%,sx% 24430 ELSE 24440 FORX%=1TOsx%:z%(X%,0)=r%(rb%?X%)*rwt+g%(gb%?X%)*gwt+b%(bb%?X%)*bwt:NEXT 24450 ENDIF 24460WHEN 1400:IFvrep% THEN 24470 vrep%-=1 24480 ELSE 24490 FORX%=1TOquant% 24500 F%=st%(X%):G%=F%+rsx%:REPEAT C%=BGET#c%:IFC%=0 THEN 24510 C%=BGET#c%:IFC%=0 THEN 24520 C%=BGET#c%:vrep%=BGET#c%-1 24530 ELSE 24540 D%=F%:FORE%=0TOpatlen%-1:F%?E%=BGET#c%:NEXT:F%+=patlen% 24550 IFC%>1 FORI%=2TOC%:FORE%=0TOpatlen%-1:F%?E%=D%?E%:NEXT:F%+=patlen%:NEXT 24560 ENDIF 24570 ELSE 24580 IFC%=128 THEN 24590 C%=BGET#c%:FORE%=0TOC%-1:F%?E%=BGET#c%:NEXT:F%+=C% 24600 ELSE 24610 ?F%=(C%AND&80)<>0:FORE%=1TOC%AND&7F:F%?E%=?F%:NEXT:F%+=C%AND&7F 24620 ENDIF 24630 ENDIF 24640 UNTILF%>=G% 24650 NEXT 24660 CALLplancnv%,st%(1),quant%,buff%,sx% 24670 ENDIF 24680 CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 24690WHEN 1500:SYS12,4,c%,buff%,nsx%:CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 24700 TIFFread%-=1:IFTIFFread%=0 PROCTIFFnextstrip 24710WHEN 1600:FORX%=1TOquant%:SYS12,4,c%,st%(X%),rsx%:NEXT:IFmasking% PTR#c%=PTR#c%+rsx% 24720 CALLplancnv%,st%(1),quant%,buff%,sx% 24730 CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 24740WHEN 1601:FORX%=1TOquant%:PROCiff(st%(X%)):NEXT:IFmasking% PROCiff(buff%) 24750 J%=7:K%=0:FORI%=0TOsx%-1:E%=0:FORX%=1TOquant%:E%+=(K%?st%(X%)>>J%AND1)<<X%:NEXT:buff%?I%=E%>>1:J%-=1:IFJ%<0 J%=7:K%+=1 24760 NEXT 24770 CALLmappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 24780ENDCASE 24790ENDPROC 24800DEF PROCrewind 24810rows%=sy%:CASE flag OF 24820WHEN 0,3,6,9:PTR#c%=st% 24830WHEN 100:PTR#c%=0 24840WHEN 200:PTR#c%=&600 24850WHEN 201:PTR#c%=&600:capix%=0 24860WHEN 300:PTR#c%=st%:PTR#cc%=stcc% 24870WHEN 400:PTR#c%=0:rtpix%=0 24880WHEN 500:table%()=0:FORI%=0TOclearcode%-1:table%(I%,1)=I%:NEXT:PTR#c%=st% 24890 !firstcode=0:!oldcode=0:!codesize=setcodes%+1:!stack=stk%:!sp=stk% 24900 !maxcode=clearcode%+2:!maxcodesize=2*clearcode%:!curbit=0:!lastbit=0 24910WHEN 501:tbuff%=otbuff% 24920WHEN 600:PTR#c%=&380 24930WHEN 700:PTR#c%=0:IFGET$#c%="" 24940WHEN 800:PTR#c%=0:wtpix%=0:wt%=0 24950WHEN 801:PTR#c%=0:PTR#cc%=0:PTR#ccc%=0:wtpix1%=0:wt1%=0:wtpix2%=0:wt2%=0:wtpix3%=0:wt3%=0 24960WHEN 900:PTR#c%=0 24970WHEN 901:PTR#c%=0:PTR#cc%=0:PTR#ccc%=0 24980WHEN 1000,1001:PTR#c%=st%:pa%=ctable%:papix%=0:papix2%=0 24990WHEN 1100:PTR#c%=32 25000WHEN 1200:PTR#c%=1600 25010WHEN 1300:PTR#c%=0 25020WHEN 1301:PTR#c%=0:PTR#cc%=0:PTR#ccc%=0 25030WHEN 1400:PTR#c%=st%:vrep%=0 25040WHEN 1500:PTR#c%=st%(0):TIFFread%=rowsperstrip:TIFFptr=0 25050WHEN 1600,1601:PTR#c%=st% 25060ENDCASE 25070ENDPROC
� > %.ChangeFSI � L� This program written by Roger Wilson at Acorn Computers April-Dec 1989 (� - please send bugs back! 2&� Subject to change without notice <� FH� all information is held in 32 bit fixed point with the . at bit 28 P@� this gives an integer range of 0-15 (OR negative numbers!) Z� dK� ChangeFSI is written so as to allow use from CLI and from other BASIC n&� programs such as WIMP front ends x� �(ș"OS_GetEnv" � A$:� Read CLI string � mem=�:� Remember memory size �$�=&4000000:� Grab all the memory �@foo%=0:A%=�ChangeFSI(A$,-1,-1,0,-1,-1,foo%,�):� Call program ��=mem:� Release memory �� �� A$ Command String �� spritearea% address or -1 �� �D� workspace%<0 and worklimit%=0 - Use BASIC variable space �� �E� workspace%<0 - ChangeFSI's slot handling �9� worklimit%=current end of wimp slot will be used. � D� workspace%>=0 - Use memory at workspace% "� worklimit%=end of workspace% "� ,A� save% TRUE = save to output file given in command string 6D� output% TRUE = print messages (and histograms if appropriate) @'� during processing J*� ram% receives address of sprite area T5� fast% TRUE = switch to mode 0 for processing ^� h� Returned values r&� 0 =Image processed as requested |&� 1 =Information messages printed �+� 100=Error - image may not be complete �� �Q� �ChangeFSI(A$,spritearea%,workspace%,worklimit%,save%,output%,� ram%,fast%) �L� A$(),r%(),g%(),b%(),rpal%(),gpal%(),bpal%(),table%(),cl%(),xl%(),xp%() �D� rm%(),rm1%(),rm2%(),vals%(),nl%(),z2%(),A%(),B%(),new%(),st%() �$ȕ�A$,1)<>" "��A$<>0 A$=�A$,2):� �ȕ�A$,1)=" " A$=�A$,2):� �ȕ�A$,1)=" " A$=�A$):� ��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$," ") 0� :�A$<>"" ARG%+=1:A$(ARG%)=A$ D�uc(A$(1))="-HELP" � NO�"Change picture Floyd Steinberg Integer version 0.69 (12 Dec 89): -help"' XT�"Use: ChangeFSI <in file> <out file> <mode>[cdt] [<n>:<n> [<n>:<n>]] [options]" bV�"Changes source multi-colour picture to output sprite 1, 2, 4 or 8 bit per pixel" l&�"in specified mode, with suffix:" vF�" c suffix for 2 or 4 bit colour in 2 or 4 bit per pixel modes" �?�" for clustered pixel output in 1 bit per pixel modes" �6�" d for digital rgb with 4 bit per pixel modes" �M�" t for no tint in 8 bit modes and 16 level grey scale in 4 bit modes" �T�"The pixel size is corrected for and the default is output of the same size as" �N�"the input. Size ratios are output:input or = for scale to output size."' �4�"Mode 'aim' writes an aim format output file."' �N�"The -equal option performs histogram equalisation on monochrome output." �B�"The -hflip option presents the picture left/right reversed." �:�"The -info option gives details of the source image." �F�"The -invert option inverts the colour range of the input image." �D�"The -noscale option disables automatic pixel size correction." �I�"The -range option expands the input's dynamic range to full scale." �T�"The -sharpen option digitally sharpens the picture, -sharpen<n> overrides the" 2�" default of 24: range 8(harsh)-31(soft)." ;�"The -vflip option presents the picture up side down." C�"Example: changefsi input output 21t 1:2 = -sharpen12 -range"' 9�"ChangeFSI -formats gives details of input formats." *=1 4� >�uc(A$(1))="-FORMATS" � HD�"Input formats understood are: Recognised by:"' RD�"RISC OS 1, 2, 4 and 8 bit per pixel sprites [file type FF9]" \D�"Watford digitiser pictures 512x256y64g [file type DFA]" fM�" and triple red, green, blue seperations [directory of r,g,b DFA]" pD�"ProArtisan compressed pictures 640x256y256c [file type DE2]" zD�"TimeStep satellite image 800x800y256g [file type 7A0]" �D�"TimeStep satellite image 128x256y256g [file type 300]" �M�" and triple red, green, blue seperations [directory of r,g,b 300]" �D�"AIM/Wild Vision Hawk V10 files 256x256y256g [file type 004]" �I�"TIFF pictures [II* or MM* in file]" �C�"Electronic Art's IFF ILBM pictures [ILBM in file]" �H�"Sun 1 bit per pixel files [&956AA659 in file]" �D�".PIC 8 bit per pixel files [AV_VO in file]" �H�"MILLIPEDE PRISMA 768x576y 8 bit colour images [MILLIPEDE in file]" �E�"Compuserve's GIF files up to 8 bit per pixel [GIF87a in file]" �O�"ArVis 15 bit HIP.+LOP. sprites [file type FF9, HIP. name]" �O�"GEM IMG. images [&00010008 in file or name includes img.]" �I�"PC EGA .DSP images 640x350y16c [name includes dsp.]" �I�"MTV 24 bit pic. images [name includes pic.]" H�"QRT 24 bit .raw images [name ends in .raw]" K�"RT 24 bit run length coded image. files [name includes image.]" =1 $� .)invert%=�:range%=�:sharpen%=�:info%=� 8/hist%=�:equal%=�:vflip%=�:hflip%=�:scale%=� B �ARG%<3 � LL �"ChangeFSI interactive input [try 'ChangeFSI -help' for command line]" V@ �"Source file: "s$,"Destination file: "f$,"Output mode: "m$ `0 �"(X)Scale (e.g. 2:1): "xs$:�"Y Scale: "ys$ j9 �"Info on input picture?"a$:�uc(�a$,1))="Y" info%=� t< �"Invert picture colours?"a$:�uc(�a$,1))="Y" invert%=� ~> �"Compute histogram of input?"a$:�uc(�a$,1))="Y" hist%=� �A �"Apply histogram equalisation?"a$:�uc(�a$,1))="Y" equal%=� �H �"Expand input dynamic range?"a$:�uc(�a$,1))="Y" range%=�:equal%=� �> �"Sharpen picture by (e.g. 12 for harsh, 24 for soft) "a$ � �a$<>"" sharpen%=�a$ �� � � A%=ARG% �8 �uc(A$(ARG%))="-INFO" info%=�:A$(ARG%)="":ARG%-=1 �8 �uc(A$(ARG%))="-HIST" hist%=�:A$(ARG%)="":ARG%-=1 �C �uc(A$(ARG%))="-EQUAL" equal%=�:range%=�:A$(ARG%)="":ARG%-=1 �C �uc(A$(ARG%))="-RANGE" range%=�:equal%=�:A$(ARG%)="":ARG%-=1 �< �uc(A$(ARG%))="-INVERT" invert%=�:A$(ARG%)="":ARG%-=1 �< �uc(A$(ARG%))="-NOSCALE" scale%=�:A$(ARG%)="":ARG%-=1 : �uc(A$(ARG%))="-VFLIP" vflip%=�:A$(ARG%)="":ARG%-=1 : �uc(A$(ARG%))="-HFLIP" hflip%=�:A$(ARG%)="":ARG%-=1 % �uc(�A$(ARG%),8))="-SHARPEN" � 5 sharpen%=�:�A$(ARG%)>8 sharpen%=��A$(ARG%),9) ( A$(ARG%)="":ARG%-=1 2 � < �A%=ARG% F3 s$=A$(1):f$=A$(2):m$=A$(3):xs$=A$(4):ys$=A$(5) P� Z3�output% �info%=�:� if no output, then no info! d�workspace%>=0 � n flex%=� x� �? �worklimit%=0 � flex%=� � flex%=�:nextlocation%=worklimit% �� �Ȏ �uc(m$) � � �"AIM":m=-1:m$="" �/ :m=�m$:m$=�uc(�m$,1)):�"CDT",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 � D panic=�:ș8,5,s$+".raw" � r0,,r2:�r0=1 s$+=".raw":dir=�:panic=� "2 �panic ș8,5,s$+".red" � r0,,r2:�r0=1 panic=� ," �panic � 42,"Directory given" 6� @9ftype=r2>>8 � &FFF:bits=28:F=2^bits:c%=0:cc%=0:ccc%=0 J �dir � T? c%=�(s$+".red"):�c%=0 � 42,"Red file "+s$+".red not found" ^F cc%=�(s$+".green"):�cc%=0 �42,"Green file "+s$+".green not found" hE ccc%=�(s$+".blue"):�ccc%=0 �42,"Blue file "+s$+".blue not found" r� |. c%=�s$:�c%=0 � 42,"File "+s$+" not found" �� �:rwt=.30:gwt=.59:bwt=.11:� CIE Y weightings for R, G, B �%� r%(255):� monochrome colour map �A� g%(255),b%(255):� colour maps: in 0-255 out 0-1 fixed point �Ȏ ftype � �� &FF9:flag=0 �/ �"."+�uc(s$),".HIP.")���uc(s$),":HIP.") � �" flag=300:I%=��uc(s$),"HIP.") �A �s$,I%)="LOP.":cc%=�s$:�cc%=0 �42,"Can't find Lop file "+s$ � � �!� &DFA:flag=800:�dir flag=801 �� &DE2:flag=1000 �� &7A0:flag=1200 #� &300:flag=1300:�dir flag=1301 � 4:flag=900:�dir flag=901 &% �#c%=0:S$="":�I%=1�6:S$+=��#c%:� 0 �S$="GIF87a" flag=500 :& �flag=-1 �S$,5)="AV_VO" flag=600 D3 �flag=-1 �S$,4)=�&59+�&A6+�&6A+�&95 flag=1100 N+ �flag=-1 �S$,4)=�0+�1+�0+�8 flag=1400 X4 �flag=-1 �S$,4)="II*"+�0 flag=1500:bigendian=� b7 �flag=-1 �S$,4)="MM"+�0+"*" flag=1500:bigendian=� l& �flag=-1 �S$,4)="RIX3" flag=2000 v �flag=-1 �S$,4)="FORM" � �' �#c%=8:S$=��#c%+��#c%+��#c%+��#c% � �S$="ILBM" flag=1600 � � � �flag=-1 � �( �#c%=&10:S$="":�I%=1�9:S$+=��#c%:� � �S$="MILLIPEDE" flag=200 � � �C �flag=-1 �"."+�uc(s$),".IMAGE.")���uc(s$),":IMAGE.") flag=400 �* �flag=-1 �uc(�s$,4))=".RAW" flag=100 �? �flag=-1 �"."+�uc(s$),".PIC.")���uc(s$),":PIC.") flag=700 �@ �flag=-1 �"."+�uc(s$),".IMG.")���uc(s$),":IMG.") flag=1400 �@ �flag=-1 �"."+�uc(s$),".DSP.")���uc(s$),":DSP.") flag=1700 �� \�flag=-1:� 42,"Sorry: format not recognised - please try again or contact your supplier" �fast% ��<>0 �0 Binput=8:ham=0:planar=0:bigendianbits=�:compression=0:Ȏ flag � � 0:� Archimedes Sprite file *G quant%=4:�#c%=&2c:st%=�W+(&38-&2c):�#c%=&34:sm=�W:ș53,sm,3 � ,,I% 4 Ȏ I% � >, � 1:flag=9:�st%=&38 �defpal2 � �ipal(2) H7 �#c%=&1c:sx%=(�W+1)*32:buff%=�dim(sx%>>3):input=1 R, � 3:flag=6:�st%=&38 �defpal4 � �ipal(4) \7 �#c%=&1c:sx%=(�W+1)*16:buff%=�dim(sx%>>2):input=2 f/ � 15:flag=3:�st%=&38 �defpal16 � �ipal(16) p6 �#c%=&1c:sx%=(�W+1)*8:buff%=�dim(sx%>>1):input=4 z$ � 63:�st%=&38 �defpal � �ipal63 �+ �#c%=&1c:sx%=(�W+1)*4:buff%=�dim(sx%) �* �42,"Not understood RISC OS sprite" � � � sy%=�W+1:�#c%=st% �8 ș53,sm,4 � ,,nx:ș53,sm,5 � ,,ny:nx=1<<nx:ny=1<<ny �. �scale% xmul%=xmul%*nx/2:ymul%=ymul%*ny/2 �` info$="RISC OS sprite, mode "+�sm+" "+�sx%+" by "+�sy%+" pixels, "+�input+" bits per pixel" �� 100:� QRT ".raw" image �= quant%=8:�#c%=0:sx%=�HW:sy%=�HW:�nopal:input=24:step24=1 �D buff%=�dim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+2*sx%:�size �K info$="QRT .raw image, "+�sx%+" by "+�sy%+" pixels, 24 bits per pixel" �� 200:� CadSoft Image �N quant%=8:�#c%=9:sx%=(�HW+2)/2:sy%=(�HW+2)/2:� round and convert to pixels ) �#c%=&1a:cadsofttype%=�#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:� .0 �#c%=&600:�cadsofttype%=2 capix%=0:flag=201 8* buff%=�dim(sx%):casx%=buff%+sx%:�size B` info$="Cadsoft type "+�cadsofttype%+" image, "+�sx%+" by "+�sy%+" pixels, 8 bits per pixel" L� 300:� Arvis Video VJ quant%=5:�#c%=&2c:st%=�W+(&38-&2c):�#cc%=&2c:stcc%=�W1(cc%)+(&38-&2c) `8 �#c%=&1c:sx%=(�W+1)*4:sy%=�W+1:�#c%=st%:�#cc%=stcc% j' � rpal%(255),gpal%(255),bpal%(255) t �C%=0�255 ~ rpal%(C%)=(C%�7)/31*F �! gpal%(C%)=((C%�64)>>6)/31*F � bpal%(C%)=(C%>>3�7)/31*F �% r%(C%)=(C%�16 � (C%�4)<<1)/31*F �+ g%(C%)=((C%�&60)>>2 � (C%�3)<<1)/31*F �& b%(C%)=((C%�128)>>3 � C%�8)/31*F � � �H buff%=�dim(sx%*2):ab%=buff%-1:bb%=buff%+sx%-1:�scale% ymul%=ymul%*2 �H info$="ArVis image, "+�sx%+" by "+�sy%+" pixels, 15 bits per pixel" �� 400:� RT "image." �> quant%=8:�#c%=0:sx%=�beHW:sy%=�beHW:X%=�beHW:�#c%=�#c%+X% �> buff%=�dim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+2*sx% �, �nopal:input=24:step24=1:rtpix%=0:�size _ info$="RT image. run length encoded image, "+�sx%+" by "+�sy%+" pixels, 24 bits per pixel" � 500:� GIF file / compression=5:�#c%=6:sx%=�HW:sy%=�HW:�size 9 GIF=�#c%:GIFback=�#c%:GIFext=�#c%:quant%=(GIF � 7)+1 ( �GIF � &80 � 2 �C%=0�(1<<quant%)-1 << r%(C%)=�#c%/255*F:g%(C%)=�#c%/255*F:b%(C%)=�#c%/255*F F � P � Z? I%=�#c%:�I%<>�"," � 42,"GIF file without , in right place" d1 GIFleft=�HW:GIFright=�HW:GIFsx=�HW:GIFsy=�HW nD �GIFsx>sx% � GIFsy>sy% � 42,"GIF file with bigger image inside" x! GIF=�#c%:�GIF � &40 flag=501 �4 setcodes%=�#c%:clearcode%=1<<setcodes%:st%=�#c% �F � table%(1<<12,1):stk%=�dim(1<<13):buf%=�dim(280):buff%=�dim(sx%) �4 table%()=0:�I%=0�clearcode%-1:table%(I%,1)=I%:� �N info$="GIF file, "+�sx%+" by "+�sy%+" pixels, "+�quant%+" bits per pixel" �� 600:� funny AV_VO stuff � quant%=8:�#c%=&5c:�C%=0�255 �; r%(C%)=�#c%/255*F:g%(C%)=�#c%/255*F:b%(C%)=�#c%/255*F � � �$ �#c%=&36e:sy%=�HW:sx%=�HW:�size � �#c%=&380:buff%=�dim(sx%) �F info$=".PIC image, "+�sx%+" by "+�sy%+" pixels, 8 bits per pixel" �� 700:� MTV ".pic" image �9 quant%=8:�#c%=0:a$=�#c%:sx%=�a$:sy%=�(�a$,�a$," "))) # �size:�nopal:input=24:step24=3 8 buff%=�dim(sx%*3):rb%=buff%:gb%=buff%+1:bb%=buff%+2 K info$="MTV .pic image, "+�sx%+" by "+�sy%+" pixels, 24 bits per pixel" "� 800:� Watford picture ,* sx%=512:sy%=256:�scale% ymul%=ymul%*2 63 buff%=�dim(sx%):wtpix%=0:wt%=0:wtsx%=buff%+sx% @A �C%=0�255:r%(C%)=(C%�63)/63*F:�:g%()=r%():b%()=r%():quant%=6 JK info$="Watford digitiser picture, 512 by 256 pixels, 6 bits per pixel" T"� 801:� Triple Watford picture ^E sx%=512:sy%=256:input=24:step24=1:quant%=6:�scale% ymul%=ymul%*2 h7 wtpix1%=0:wt1%=0:wtpix2%=0:wt2%=0:wtpix3%=0:wt3%=0 r> buff%=�dim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+2*sx% |; wtsx1%=buff%+sx%:wtsx2%=buff%+2*sx%:wtsx3%=buff%+3*sx% �8 �C%=0�255:r%(C%)=(C%�63)/63*F:�:g%()=r%():b%()=r%() �S info$="Triple Watford digitiser picture, 512 by 256 pixels, 18 bits per pixel" �� 900:� AIM/Wild Vision �Q quant%=8:sx%=256:sy%=256:buff%=�dim(sx%):�scale% ymul%=ymul%*2:xmul%=xmul%*2 �4 �C%=0�255:r%(C%)=C%/255*F:�:g%()=r%():b%()=r%() �@ info$="AIM .raw image, 256 by 256 pixels, 8 bits per pixel" �E� 901:� AIM/Wild Vision: Temporary while V9 gets its act together �A quant%=4:sx%=256:sy%=256:�scale% ymul%=ymul%*2:xmul%=xmul%*2 �> buff%=�dim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+sx%*2 �: �C%=0�255:r%(C%)=(C%�&F0)/&F0*F:�:g%()=r%():b%()=r%() � input=24:step24=1 �G info$="Hawk V9 Triple image, 256 by 256 pixels, 12 bits per pixel" �� 1000:� ProArtisan K quant%=4:sx%=640:sy%=256:�defpal:st%=�W:flag+=�W:�scale% ymul%=ymul%*2 8 � read compression type and add to flag. 0/1 known! & buff%=�dim(sx%):ctable%=�dim(st%) &1 ș12,4,c%,ctable%,st%:� read in colour table 03 pa%=ctable%:papix%=0:papix2%=0:pasx%=buff%+sx% :B info$="ProArtisan image, 640 by 256 pixels, 8 bits per pixel" D(� 1100:� Monochrome? Images from Sun N1 quant%=1:�#c%=4:sx%=�beW:sy%=�beW:input=�beW X4 �input<>1 �42,"Only know how to deal with 1bpp" b' �#c%=32:buff%=�dim(sx%+7>>3):�size l, r%(0)=F:g%(0)=F:b%(0)=F:bigendianbits=� vD info$="Sun image, "+�sx%+" by "+�sy%+" pixels, 1 bit per pixel" �.� 1200:� unknown TimeStep satellite format �G quant%=8:sx%=800:sy%=800:buff%=�dim(sx%):�#c%=1600:vflip%=� vflip% �4 �C%=0�255:r%(C%)=C%/255*F:�:g%()=r%():b%()=r%() �J info$="TimeStep satellite image, 800 by 800 pixels, 8 bits per pixel" �6� 1300:� another unknown TimeStep satellite format �Q quant%=8:sx%=128:sy%=256:buff%=�dim(sx%):�scale% xmul%=xmul%*4:ymul%=ymul%*2 �4 �C%=0�255:r%(C%)=C%/255*F:�:g%()=r%():b%()=r%() �A info$="satellite image, 128 by 256 pixels, 8 bits per pixel" �7� 1301:� "colour" unknown TimeStep satellite format �S input=24:step24=1:quant%=8:sx%=128:sy%=256:�scale% xmul%=xmul%*4:ymul%=ymul%*2 �> buff%=�dim(sx%*3):rb%=buff%:gb%=buff%+sx%:bb%=buff%+2*sx% �4 �C%=0�255:r%(C%)=C%/255*F:�:g%()=r%():b%()=r%() �I info$="Triple satellite image, 128 by 256 pixels, 24 bits per pixel" � 1400:� GEM IMG. format % planar=�:�#c%=0:Z%=�HW:�Z%>255 � , st%=�beHW*2:quant%=�beHW:patlen%=�beHW - pw%=�beHW:ph%=�beHW:sx%=�beHW:sy%=�beHW * � 4E st%=�HW*2:input=�HW:patlen%=�HW:pw%=�HW:ph%=�HW:sx%=�HW:sy%=�HW > � H �scale% � R% xmul%=xmul%*pw%:xdiv%=xdiv%*282 \% ymul%=ymul%*ph%:ydiv%=ydiv%*282 f � p0 rsx%=sx%+7>>3:� st%(quant%):buff%=�dim(sx%) z; �X%=1�quant%:st%(X%)=�dim(rsx%*sy%):�:�#c%=st%:vrep%=0 �L �C%=0�(1<<quant%)-1:r%(C%)=F-C%/((1<<quant%)-1)*F:�:g%()=r%():b%()=r%() �N info$="IMG file, "+�sx%+" by "+�sy%+" pixels, "+�quant%+" bits per pixel" �� 1500:� TIFF �# �#c%=4:dir%=�tiff(4):�#c%=dir% �F rgb=�:rowsperstrip=-1:greyunit=100:planar=1:fillorder=1:resunit=2 � E%=�tiff(3):�Z%=1�E% �) T%=�tiff(3):D%=�tiff(3):C%=�tiff(4) �R �D%=2 �#c%=dir%+2+Z%*12 � �D%<4 V%=�tiff(D%):�#c%=dir%+2+Z%*12 � V%=�tiff(4) �G � PRINT"Read tag ";T%" datatype "D%" count "C%" value/pointer "V% � Ȏ T% � � � 256:sx%=V% � � 257:sy%=V% �T � 258:quant%=V%:input=quant%:�I%=0�(1<<quant%)-1:r%(I%)=I%/((1<<quant%)-1)*F:� g%()=r%():b%()=r%() � 259:compression=V% � 262:photometric=V% $ � 266:fillorder=V% . � 273:stc%=C%:stv%=V% 8$ � 277:input=quant%*V%:rgb=V%=3 B � 278:rowsperstrip=V% L3 � 282:�#c%=V%:xnum%=�tiff(4):xdenom%=�tiff(4) V �#c%=dir%+2+Z%*12 `3 � 283:�#c%=V%:ynum%=�tiff(4):ydenom%=�tiff(4) j �#c%=dir%+2+Z%*12 t � 284:planar=V% ~ � 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 � � 296:resunit=V% �� WHEN 320: �� PTR#c%=dir%+2+Z%*12 � �L �info% �"Ignoring tag ";T%" datatype "D%" count "C%" value/pointer "V% � � � � � � st%(stc%):�stc%>1 � �. �#c%=stv%:�I%=0�C%-1:st%(I%)=�tiff(D%):� � st%(0)=stv% � 3 �compression<>1 info$="Compressed " � info$="" (O info$+="TIFF file, "+�sx%+" by "+�sy%+" pixels, "+�input+" bits per pixel" 2F �planar<>1 � compression<>1 �42,"Can't do this style of TIFF yet" < bigendianbits=fillorder=1 F Ȏ quant% � P � 1:nsx%=sx%+7>>3 Z � 2:nsx%=sx%+3>>2 d � 4:nsx%=sx%+1>>1 n � 8:nsx%=sx% x4 � 42,"Can't do ";quant%" bits per pixel TIFF" � � �B buff%=�dim(nsx%):TIFFread%=rowsperstrip:�#c%=st%(0):TIFFptr=0 � �scale% � � S%=resunit:�S%=2 S%=90 � �S%=3 S%=35 �. xdiv%=xdiv%*xnum%:xmul%=xmul%*xdenom%*S% �. ydiv%=ydiv%*ynum%:ymul%=ymul%*ydenom%*S% � � �,� 1600:� Electronic Arts ILBM inside IFF � �#c%=12:camg=0:planar=�:� �' S$=��#c%+��#c%+��#c%+��#c%:S%=�beW � Ȏ S$ � �C � "BMHD":sx%=�beHW:sy%=�beHW:S%=�W:quant%=�#c%:masking%=�#c%=1 8 compression=�#c%:S%=�#c%+�HW:U%=�#c%:V%=�#c%:S%=�W + �scale% ymul%=ymul%*V%:ydiv%=ydiv%*U% K �I%=0�(1<<quant%)-1:r%(I%)=I%/((1<<quant%)-1)*F:�:g%()=r%():b%()=r%() "B � "CMAP":S%=�#c%+S%:�I%=0�(1<<quant%)-1:r%(I%)=(�#c%>>4)/15*F ,3 g%(I%)=(�#c%>>4)/15*F:b%(I%)=(�#c%>>4)/15*F:� 6I �#c%=S%:�info% �"Warning: truncated IFF CMAP information to 4 bits" @< � "CAMG":camg=�beW:�info% �"Amiga viewport mode ";~camg J � "BODY":st%=�#c% T5 � info% �"Ignoring IFF property "S$" size ";S% ^ �#c%=�#c%+S% h � r; �S$="BODY":�compression info$="Compressed " � info$="" |N info$="IFF file, "+�sx%+" by "+�sy%+" pixels, "+�quant%+" bits per pixel" �1 ham=(camg � &800)<>0:�ham info$="HAM "+info$ �+ �masking% info$+=" with mask (unused)" �G � st%(quant%):rsx%=(sx%+15>>4)<<1:�I%=1�quant%:st%(I%)=�dim(sx%):� �/ buff%=�dim(sx%):flag+=compression:�#c%=st% �#� 1700:� EGA image in DSP.<foo> �7 sx%=640:rsx%=80:sy%=350:quant%=4:planar=�:� st%(4) �= �X%=1�4:st%(X%)=�dim(80):�:buff%=�dim(640):G=F/3:H=F*2/3 �) r%()=0,0,0,0,F,F,F,H,G,G,G,G,F,F,F,F �) g%()=0,0,F,F,0,0,F,H,G,G,F,F,G,G,F,F �) b%()=0,F,0,F,0,F,0,H,G,F,G,F,G,F,G,F �( masking%=�:flag=1600:st%=16:�#c%=16 �T info$="PC EGA '.dsp' file, 640 by 350 pixels, 4 bits per pixel (fixed palette)" �� 2000:� Unknown "SCF" $ st%=&300:�#c%=4:sx%=�HW:sy%=�HW �#c% �#c% buff%=�dim(sx%) &� 0�info% �info$ :Cș"Hourglass_On",1:�invert% r%()=F-r%():g%()=F-g%():b%()=F-b%() D Ȏ m � ND � -1:x%=256:y%=256:ncol=255:�scale% xdiv%=xdiv%*2:ydiv%=ydiv%*2 X b7 ș53,m,4 � ,,nx:ș53,m,5 � ,,ny:nx=1<<nx:ny=1<<ny l3 ș53,m,11 � ,,x%:ș53,m,12 � ,,y%:x%+=1:y%+=1 vA ș53,m,3 � ,,ncol:�scale% xdiv%=xdiv%*nx/2:ydiv%=ydiv%*ny/2 �� ��xs$="=" xmul%=x%:xdiv%=sx% ��ys$="=" ymul%=y%:ydiv%=sy% �/�ncol=1 �m$="C" xdiv%=xdiv%*4:ydiv%=ydiv%*4 �-�reduce(xmul%,xdiv%):�reduce(ymul%,ydiv%) ��info% � �; �"Size ratios are x ";xmul%":"xdiv%" y "ymul%":"ydiv%; �N �xdiv%>10 �ydiv%>10 �xmul%>20 �ymul%>20 �" which may take a while..." � � �� �?x%=sx%*xmul%/xdiv%+.9999:y%=sy%*ymul%/ydiv%+.9999:rows%=sy% �-order%=x%*y%>sx%*sy%:� TRUE if scaling up �*� test for as many colours as possible � Ȏ m � * � -1:col=0:� aim format is monochrome �m$="D" �ncol<>15 m$="" D col=0:�ncol>15 � m$="C" � m$="D" col=2:� depth of colour arrays *� 4$�ncol=1 �m$="C" col=0:x%=x%+1��1 >G�col=0 �input<9 �C%=0�255:r%(C%)=r%(C%)*rwt+g%(C%)*gwt+b%(C%)*bwt:� H)�col=0 �input=24 rb%-=1:gb%-=1:bb%-=1 R�sharpen%=� sharpen%=24 \2� cl%(x%+7,col):� current line additive errors fL� xl%(x%+7,col),xp%(sx%+7,col):� extra input line for scaling vertically p�sharpen% � z �order% � �6 � rm%(sx%+7,col),rm1%(sx%+7,col),rm2%(sx%+7,col) � � �3 � rm%(x%+7,col),rm1%(x%+7,col),rm2%(x%+7,col) � � �� �"�hist%�equal% � vals%(256,col) �/� nl%(x%+7,col):� next line additive errors �Etotalvals%=x%*(col+1):� total number of elements in a scaled line �Gtotalvals2%=sx%*(col+1):� total number of elements in an input line �6�flag=300 � z2%(sx%+7,col):� extra array for ArVis ��ncol=1 � m$="C" � �� A%(16),B%(16) ��A%()=0,&00000001,&08000001,&08000101,&08080101,&08080103,&0C080103,&0C080303,&0C0C0303,&0C0E0303,&0C0E0703,&0E0E0703,&0E0E0707,&0E0F0707,&0E0F0F07,&0F0F0F07,&0F0F0F0F �B%()=0,&00000008,&01000008,&01000808,&01010808,&0101080C,&0301080C,&03010C0C,&03030C0C,&03070C0C,&03070E0C,&07070E0C,&07070E0E,&070F0E0E,&070F0F0E,&0F0F0F0E,&0F0F0F0F 2even_gard=�dim(17*32*4):odd_gard=�dim(17*32*4) C�I%=0�16:�J%=0�16:even_gard!(J%*32*4+I%*4)=A%(I%)�B%(J%)<<4:�:� $C�I%=0�16:�J%=0�16: odd_gard!(J%*32*4+I%*4)=B%(I%)�A%(J%)<<4:�:� .� 8code%=�dim(4096):SP=13 B�Z=0�2�2:P%=code% L Ȏ ncol � V � 255: ` [OPT Z j?; � fs%,current%(),next%(),pixel address%,increment%,count% t.fs% ~ STMFD SP !,{R14} �$ LDR R10,[R9,#4*8] ;addr current �! LDR R11,[R9,#3*8] ;addr next �* LDR R12,[R9,#2*8] ;addr pixel address �! LDR R12,[R12] ;pixel address � LDR R8,[R9,#8] ;addr step � LDR R8,[R8] ;step � LDR R9,[R9] ;addr count � LDR R9,[R9] ;count � LDR R4,[R10],R8 ;mono value �? TEQ R8,#0:MOVPL R1,#1:MVNMI R1,#0 ;+/- 1 for sprite output �.fsloop �; TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=val<=1 MOV R0,R4,LSR #bits-8 / CMP R0,#256:MOVCS R0,#255:STRB R0,[R12],R1 MOV R2,R0,LSL #bits-8 + SUB R4,R4,R2 ;subtract converted value ( MOVCS R4,#0 2 ADD R2,R4,R4,LSL #1 ;*3 <0 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 F STR R3,[R11,-R8] P ADD R2,R4,R4,LSL #2 ;*5 Z, LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 d STR R3,[R11] n MOV R3,R4,ASR #4 ;/16 x1 STR R3,[R11,R8]! ;not seen so far inc nl ptr � RSB R2,R4,R4,LSL #3 ;*7 �& LDR R4,[R10],R8 ;next light value �@ ADD R4,R4,R2,ASR #4 ;next value +7/16 of error -> new value � SUBS R9,R9,#1:BNE fsloop � LDMFD SP !,{PC}^ � ] � � 63: � [OPT Z �.slashfifteen EQUD 0 � EQUD 4/15*F � EQUD 8/15*F � EQUD 12/15*F �.fs% STMFD SP !,{R14} $ LDR R10,[R9,#4*8] ;addr current ! LDR R11,[R9,#3*8] ;addr next "* LDR R12,[R9,#2*8] ;addr pixel address ,! LDR R12,[R12] ;pixel address 6 LDR R8,[R9,#8] ;addr step @ LDR R8,[R8] ;step J LDR R9,[R9] ;addr count T LDR R9,[R9] ;count ^ LDR R4,[R10] ;r h LDR R5,[R10,#4] ;g r LDR R6,[R10,#8] ;b | ADR R7,slashfifteen �? TEQ R8,#0:MOVPL R1,#1:MVNMI R1,#0 ;+/- 1 for sprite output �.fsloop � ADD R10,R10,R8 ;+step �9 TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=r<=1 � RSB R3,R4,R4,LSL #4 ;*15 �0 MOVS R3,R3,LSR #2+bits ;final int0, 1, 2, 3 �5 LDRNE R2,[R7,R3,LSL #2] ;divide by 15 from table �- SUBNE R4,R4,R2 ;subtract converted value �, � R2,R3,#1:MOV R0,R2,LSL #2 ;bit 2 of r �. � R2,R3,#2:�R R0,R0,R2,LSL #3 ;bit 3 of r �9 TEQ R5,#0:MOVMI R5,#0:CMP R5,#F:MOVCS R5,#F ;0<=g<=1 � RSB R3,R5,R5,LSL #4 ;*15 �0 MOVS R3,R3,LSR #2+bits ;final int0, 1, 2, 3 5 LDRNE R2,[R7,R3,LSL #2] ;divide by 15 from table - SUBNE R5,R5,R2 ;subtract converted value * �R R0,R0,R3,LSL #5 ;bits 3 and 2 of g &9 TEQ R6,#0:MOVMI R6,#0:CMP R6,#F:MOVCS R6,#F ;0<=b<=1 0 RSB R3,R6,R6,LSL #4 ;*15 :0 MOVS R3,R3,LSR #2+bits ;final int0, 1, 2, 3 D5 LDRNE R2,[R7,R3,LSL #2] ;divide by 15 from table N- SUBNE R6,R6,R2 ;subtract converted value X. � R2,R3,#1:�R R0,R0,R2,LSL #3 ;bit 2 of b b. � R2,R3,#2:�R R0,R0,R2,LSL #6 ;bit 3 of b l ] v�m$<>"T" � � [OPT Z �0 ADD R2,R4,R5:ADD R2,R2,R6 ;r+g+b remainders �' ADD R2,R2,R2,LSL #2 ;average *15/3 � MOV R2,R2,LSR #bits � CMP R2,#3:MOVCS R2,#3 � �R R0,R0,R2 �! LDR R2,[R7,R2,LSL #2] ;*1/15 �$ SUB R4,R4,R2,LSR #2 ;subtract t �1 SUB R5,R5,R2,LSR #2 ;note table 4* too large � SUB R6,R6,R2,LSR #2 � ] �� � [OPT Z STRB R0,[R12],R1 ADD R0,R11,#4 ;nl g%(S%) ADD R2,R4,R4,LSL #1 ;r*3 0 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 * STR R3,[R11,-R8] 4 ADD R2,R4,R4,LSL #2 ;r*5 >, LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 H STR R3,[R11] R MOV R3,R4,ASR #4 ;r/16 \1 STR R3,[R11,R8]! ;not seen so far inc nl ptr f RSB R2,R4,R4,LSL #3 ;r*7 p% LDR R4,[R10] ;next r light value z> ADD R4,R4,R2,ASR #4 ;next value +7/16 of r error -> new r � ADD R2,R5,R5,LSL #1 ;g*3 �/ LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 � STR R3,[R0,-R8] � MOV R3,R5,ASR #4 ;g/16 �$ STR R3,[R0,R8] ;not seen so far � ADD R2,R5,R5,LSL #2 ;g*5 �+ LDR R3,[R0]:ADD R3,R3,R2,ASR #4 ;+5/16 �3 STR R3,[R0],#4 ;computes nl b into the bargain � RSB R2,R5,R5,LSL #3 ;g*7 �( LDR R5,[R10,#4] ;next g light value �> ADD R5,R5,R2,ASR #4 ;next value +7/16 of g error -> new g � ADD R2,R6,R6,LSL #1 ;b*3 �/ LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 STR R3,[R0,-R8] ADD R2,R6,R6,LSL #2 ;b*5 + LDR R3,[R0]:ADD R3,R3,R2,ASR #4 ;+5/16 $ STR R3,[R0] . MOV R3,R6,ASR #4 ;b/16 8$ STR R3,[R0,R8] ;not seen so far B RSB R2,R6,R6,LSL #3 ;b*7 L( LDR R6,[R10,#8] ;next b light value V> ADD R6,R6,R2,ASR #4 ;next value +7/16 of b error -> new b ` SUBS R9,R9,#1:BNE fsloop j LDMFD SP !,{PC}^ t ] ~ � 15: �Ȏ m$ � �� "D":� No table needed � � "C" � [OPT Z �.divtable EQUD 0 � EQUD 1/3*F � EQUD 2/3*F � EQUD F � ] � � "T" � [OPT Z �.divtable EQUD 0 EQUD 1/15*F EQUD 2/15*F EQUD 3/15*F EQUD 4/15*F ( EQUD 5/15*F 2 EQUD 6/15*F < EQUD 7/15*F F EQUD 8/15*F P EQUD 9/15*F Z EQUD 10/15*F d EQUD 11/15*F n EQUD 12/15*F x EQUD 13/15*F � EQUD 14/15*F � EQUD F � ] �� "" � [OPT Z �.divtable EQUD 0 � EQUD 1/7*F � EQUD 2/7*F � EQUD 3/7*F � EQUD 4/7*F � EQUD 5/7*F � EQUD 6/7*F � EQUD F ] � [OPT Z ".fs% , STMFD SP !,{R14} 6$ LDR R10,[R9,#4*8] ;addr current @! LDR R11,[R9,#3*8] ;addr next J* LDR R12,[R9,#2*8] ;addr pixel address T! LDR R12,[R12] ;pixel address ^ LDR R8,[R9,#8] ;addr step h LDR R8,[R8] ;step r LDR R9,[R9] ;addr count | LDR R9,[R9] ;count � ] ��m$="C" � m$="D" � � [OPT Z � LDR R4,[R10] ;r � LDR R5,[R10,#4] ;g � LDR R6,[R10,#8] ;b � ] �� � [OPT Z � LDR R4,[R10],R8 ;mono value � ] �� ��m$<>"D" � [OPT Z ADR R7,divtable ] &� 0 [OPT Z :? TEQ R8,#0:MOVPL R1,#1:MVNMI R1,#0 ;+/- 1 for sprite output D.fsloop N ] XȎ m$ � b � "D" l [OPT Z v ADD R10,R10,R8 ;+step � MOV R3,#0 �9 TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=r<=1 � CMP R4,#F>>1 ;>1/2? �! SUBCS R4,R4,#F:�RCS R3,R3,#1 �9 TEQ R5,#0:MOVMI R5,#0:CMP R5,#F:MOVCS R5,#F ;0<=g<=1 � CMP R5,#F>>1 ;>1? �! SUBCS R5,R5,#F:�RCS R3,R3,#2 �9 TEQ R6,#0:MOVMI R6,#0:CMP R6,#F:MOVCS R6,#F ;0<=b<=1 � CMP R6,#F>>1 ;>1? �! SUBCS R6,R6,#F:�RCS R3,R3,#4 � ] � � "C" � [OPT Z ADD R10,R10,R8 ;+step 9 TEQ R5,#0:MOVMI R5,#0:CMP R5,#F:MOVCS R5,#F ;0<=g<=1 ADD R3,R5,R5,LSL #1 ;*3 ADD R3,R3,#F>>1 ;round up *' MOVS R3,R3,LSR #bits ;final int0-3 44 LDRNE R2,[R7,R3,LSL #2] ;divide by 3 from table >- SUBNE R5,R5,R2 ;subtract converted value H9 TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=r<=1 R CMP R4,#F>>1 ;>1/2? \! SUBCS R4,R4,#F:�RCS R3,R3,#4 f9 TEQ R6,#0:MOVMI R6,#0:CMP R6,#F:MOVCS R6,#F ;0<=b<=1 p CMP R6,#F>>1 ;>1/2? z! SUBCS R6,R6,#F:�RCS R3,R3,#8 � ] � � "T" � [OPT Z �; TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=val<=1 � RSB R3,R4,R4,LSL #4 ;*15 � ADD R3,R3,#F>>1 ;round up �( MOVS R3,R3,LSR #bits ;final int0-15 �5 LDRNE R2,[R7,R3,LSL #2] ;divide by 15 from table �- SUBNE R4,R4,R2 ;subtract converted value � ] �� "" � [OPT Z �; TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=val<=1 RSB R3,R4,R4,LSL #3 ;*7 ADD R3,R3,#F>>1 ;round up ' MOVS R3,R3,LSR #bits ;final int0-7 $4 LDRNE R2,[R7,R3,LSL #2] ;divide by 7 from table .- SUBNE R4,R4,R2 ;subtract converted value 8 ] B� L [OPT Z V MOV R2,R12,LSR #1 ` TST R12,#1 j LDRB R0,[R2] t! �EQ R0,R0,#&F0:�REQ R0,R0,R3 ~( �NE R0,R0,#&0F:�RNE R0,R0,R3,LSL #4 � STRB R0,[R2] � ADD R12,R12,R1 � ] ��m$="C" � m$="D" � � [OPT Z � ADD R0,R11,#4 ;nl g%(S%) � ADD R2,R4,R4,LSL #1 ;r*3 �0 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 � STR R3,[R11,-R8] � ADD R2,R4,R4,LSL #2 ;r*5 �, LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 � STR R3,[R11] MOV R3,R4,ASR #4 ;r/16 1 STR R3,[R11,R8]! ;not seen so far inc nl ptr RSB R2,R4,R4,LSL #3 ;r*7 % LDR R4,[R10] ;next r light value (> ADD R4,R4,R2,ASR #4 ;next value +7/16 of r error -> new r 2 ADD R2,R5,R5,LSL #1 ;g*3 </ LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 F STR R3,[R0,-R8] P MOV R3,R5,ASR #4 ;g/16 Z$ STR R3,[R0,R8] ;not seen so far d ADD R2,R5,R5,LSL #2 ;g*5 n+ LDR R3,[R0]:ADD R3,R3,R2,ASR #4 ;+5/16 x3 STR R3,[R0],#4 ;computes nl b into the bargain � RSB R2,R5,R5,LSL #3 ;g*7 �( LDR R5,[R10,#4] ;next g light value �> ADD R5,R5,R2,ASR #4 ;next value +7/16 of g error -> new g � ADD R2,R6,R6,LSL #1 ;b*3 �/ LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 � STR R3,[R0,-R8] � ADD R2,R6,R6,LSL #2 ;b*5 �+ LDR R3,[R0]:ADD R3,R3,R2,ASR #4 ;+5/16 � STR R3,[R0] � MOV R3,R6,ASR #4 ;b/16 �$ STR R3,[R0,R8] ;not seen so far � RSB R2,R6,R6,LSL #3 ;b*7 �( LDR R6,[R10,#8] ;next b light value > ADD R6,R6,R2,ASR #4 ;next value +7/16 of b error -> new b ] � " [OPT Z , ADD R2,R4,R4,LSL #1 ;*3 60 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 @ STR R3,[R11,-R8] J ADD R2,R4,R4,LSL #2 ;*5 T, LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 ^ STR R3,[R11] h MOV R3,R4,ASR #4 ;/16 r1 STR R3,[R11,R8]! ;not seen so far inc nl ptr | RSB R2,R4,R4,LSL #3 ;*7 �& LDR R4,[R10],R8 ;next light value �@ ADD R4,R4,R2,ASR #4 ;next value +7/16 of error -> new value � ] �� � [OPT Z � SUBS R9,R9,#1:BNE fsloop � LDMFD SP !,{PC}^ � ] �� 3: ��m$="" � � [OPT Z �.slashthree EQUD 0 � EQUD 1/3*F EQUD 2/3*F EQUD F ] &� 0 [OPT Z :.fs% D STMFD SP !,{R14} N$ LDR R10,[R9,#4*8] ;addr current X! LDR R11,[R9,#3*8] ;addr next b* LDR R12,[R9,#2*8] ;addr pixel address l! LDR R12,[R12] ;pixel address v LDR R8,[R9,#8] ;addr step � LDR R8,[R8] ;step � LDR R9,[R9] ;addr count � LDR R9,[R9] ;count � ] � �m$="C" � � [OPT Z � LDR R4,[R10] ;r � LDR R5,[R10,#4] ;g � LDR R6,[R10,#8] ;b � ] �� � [OPT Z � LDR R4,[R10],R8 ;mono value ! ADR R7,slashthree ! ] !� ! [OPT Z !*? TEQ R8,#0:MOVPL R1,#1:MVNMI R1,#0 ;+/- 1 for sprite output !4.fsloop !> ] !H �m$="C" � !R [OPT Z !\ ADD R10,R10,R8 ;+step !f9 TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=r<=1 !p9 TEQ R5,#0:MOVMI R5,#0:CMP R5,#F:MOVCS R5,#F ;0<=g<=1 !z9 TEQ R6,#0:MOVMI R6,#0:CMP R6,#F:MOVCS R6,#F ;0<=b<=1 !� MOV R3,#0 ;black octant !� CMP R4,#F>>1:�RCS R3,R3,#1 !� CMP R5,#F>>1:�RCS R3,R3,#2 !� CMP R6,#F>>1:�RCS R3,R3,#4 !�# CMP R3,#6:�Q R3,#1:BEQ octcyan !� BCS octwhite !� CMP R3,#4:BEQ octblue !� MOVCS R3,#2:BCS octmagenta !� CMP R3,#2:BEQ octgreen !� BCS octyellow !� CMP R3,#0:BEQ octblack !�.octred !� RSB R0,R4,#F ;1-r " CMP R5,R0 ;g>1-r? " BLT octred1 " CMP R5,R6 ;yes- g>b? "$* MOVGE R3,#3 ;if g>b then g is largest ". MOVLT R3,#2 ;else b is "8 B octconvert "B.octred1 "L CMP R0,R6 ;no- 1-r>b? "V. MOVGE R3,#0 ;if 1-r>b then 1-r is largest "` MOVLT R3,#2 ;else b is "j B octconvert "t .octgreen "~ RSB R0,R5,#F ;1-g "� CMP R0,R4 ;1-g>r? "� BLT octgreen1 "� CMP R0,R6 ;yes- 1-g>b? "�. MOVGE R3,#0 ;if 1-g>b then 1-g is largest "� MOVLT R3,#1 ;else b is "� B octconvert "�.octgreen1 "� CMP R4,R6 ;no- r>b? "�* MOVGE R3,#3 ;if r>b then r is largest "� MOVLT R3,#1 ;else b is "� B octconvert "�.octblue # RSB R0,R6,#F ;1-b # CMP R0,R4 ;1-b>r? # BLT octblue1 # CMP R0,R5 ;yes- 1-b>g? #(. MOVGE R3,#0 ;if 1-b>g then 1-b is largest #2 MOVLT R3,#1 ;else g is #< B octconvert #F .octblue1 #P CMP R4,R5 ;no- r>g? #Z* MOVGE R3,#2 ;if r>g then r is largest #d MOVLT R3,#1 ;else g is #n B octconvert #x .octwhite #� CMP R4,R5 ;if r>g #� BLT octwhite1 #� CMP R5,R6 ;yes - g>b? #�& MOVGE R3,#3 ;if g>b b is smallest #� MOVLT R3,#2 ;else g is #� B octconvert #�.octwhite1 #� CMP R4,R6 ;no - r>b? #�& MOVGE R3,#3 ;if r>b b is smallest #� MOVLT R3,#1 ;else r is #�.octconvert #� CMP R3,#1 ;not red=cyan #�.octcyan $ SUBEQ R5,R5,#F $ SUBEQ R6,R6,#F $.octmagenta $"! CMP R3,#2 ;not green=magenta $, SUBEQ R4,R4,#F $6 SUBEQ R6,R6,#F $@.octyellow $J CMP R3,#3 ;not blue=yellow $T SUBEQ R4,R4,#F $^ SUBEQ R5,R5,#F $h .octblack $r MOV R2,R12,LSR #2 $|! � R7,R12,#3:MOV R7,R7,LSL #1 $� MOV R14,#3 $� MOV R14,R14,LSL R7 $�? LDRB R0,[R2]:BIC R0,R0,R14:�R R0,R0,R3,LSL R7:STRB R0,[R2] $� ADD R12,R12,R1 $� ADD R0,R11,#4 ;nl g%(S%) $� ADD R2,R4,R4,LSL #1 ;r*3 $�0 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 $� STR R3,[R11,-R8] $� ADD R2,R4,R4,LSL #2 ;r*5 $�, LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 $� STR R3,[R11] $� MOV R3,R4,ASR #4 ;r/16 $�1 STR R3,[R11,R8]! ;not seen so far inc nl ptr % RSB R2,R4,R4,LSL #3 ;r*7 %% LDR R4,[R10] ;next r light value %> ADD R4,R4,R2,ASR #4 ;next value +7/16 of r error -> new r %& ADD R2,R5,R5,LSL #1 ;g*3 %0/ LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 %: STR R3,[R0,-R8] %D MOV R3,R5,ASR #4 ;g/16 %N$ STR R3,[R0,R8] ;not seen so far %X ADD R2,R5,R5,LSL #2 ;g*5 %b+ LDR R3,[R0]:ADD R3,R3,R2,ASR #4 ;+5/16 %l3 STR R3,[R0],#4 ;computes nl b into the bargain %v RSB R2,R5,R5,LSL #3 ;g*7 %�( LDR R5,[R10,#4] ;next g light value %�> ADD R5,R5,R2,ASR #4 ;next value +7/16 of g error -> new g %� ADD R2,R6,R6,LSL #1 ;b*3 %�/ LDR R3,[R0,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 %� STR R3,[R0,-R8] %� ADD R2,R6,R6,LSL #2 ;b*5 %�+ LDR R3,[R0]:ADD R3,R3,R2,ASR #4 ;+5/16 %� STR R3,[R0] %� MOV R3,R6,ASR #4 ;b/16 %�$ STR R3,[R0,R8] ;not seen so far %� RSB R2,R6,R6,LSL #3 ;b*7 %�( LDR R6,[R10,#8] ;next b light value %�> ADD R6,R6,R2,ASR #4 ;next value +7/16 of b error -> new b & ] &� & [OPT Z & ; TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=val<=1 &* ADD R3,R4,R4,LSL #1 ;*3 &4 ADD R3,R3,#F>>1 ;round up &>' MOVS R3,R3,LSR #bits ;final int0-3 &H4 LDRNE R2,[R7,R3,LSL #2] ;divide by 3 from table &R- SUBNE R4,R4,R2 ;subtract converted value &\ MOV R2,R12,LSR #2 &f! � R5,R12,#3:MOV R5,R5,LSL #1 &p MOV R6,#3:MOV R6,R6,LSL R5 &z> LDRB R0,[R2]:BIC R0,R0,R6:�R R0,R0,R3,LSL R5:STRB R0,[R2] &� ADD R12,R12,R1 &� ADD R2,R4,R4,LSL #1 ;*3 &�0 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 &� STR R3,[R11,-R8] &� ADD R2,R4,R4,LSL #2 ;*5 &�, LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 &� STR R3,[R11] &� MOV R3,R4,ASR #4 ;/16 &�1 STR R3,[R11,R8]! ;not seen so far inc nl ptr &� RSB R2,R4,R4,LSL #3 ;*7 &�& LDR R4,[R10],R8 ;next light value &�@ ADD R4,R4,R2,ASR #4 ;next value +7/16 of error -> new value &� ] '� ' [OPT Z ' SUBS R9,R9,#1:BNE fsloop '$ LDMFD SP !,{PC}^ '. ] '8� 1: 'B �m$="C" � 'L [OPT Z 'V.evenrow_gard DCD even_gard '`.oddrow_gard DCD odd_gard 'j.quarterrowinc DCD 0 't.fs% '~ STMFD SP !,{R14} '�$ LDR R10,[R9,#4*8] ;addr current '�! LDR R11,[R9,#3*8] ;addr next '�* LDR R12,[R9,#2*8] ;addr pixel address '�! LDR R12,[R12] ;pixel address '� LDR R8,[R9,#8] ;addr step '� LDR R8,[R8] ;step '� LDR R9,[R9] ;addr count '� LDR R9,[R9] ;count '� LDR R4,[R10],R8 ;mono value '� TEQ R8,#0 '� MOVPL R1,#2 '� LDRPL R6,evenrow_gard ( ) MVNMI R1,#1 ;+/- 2 for sprite output ( LDRMI R6,oddrow_gard ( LDR R7,quarterrowinc (.fsloop ((; TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=val<=1 (2 ADD R5,R4,#F>>5 ;round up (<+ MOVS R5,R5,LSR #bits-4 ;final int 0-16 (F9 SUBNE R4,R4,R5,LSL #bits-4 ;subtract converted value (P ADD R2,R4,R4,LSL #1 ;*3 (Z0 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 (d STR R3,[R11,-R8] (n ADD R2,R4,R4,LSL #2 ;*5 (x, LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 (� STR R3,[R11] (� MOV R3,R4,ASR #4 ;/16 (�1 STR R3,[R11,R8]! ;not seen so far inc nl ptr (� RSB R2,R4,R4,LSL #3 ;*7 (�& LDR R4,[R10],R8 ;next light value (�A ADDS R4,R4,R2,ASR #4 ;next value +7/16 of error -> new value (�1 MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=val<=1 (� ADD R3,R4,#F>>5 ;round up (�+ MOVS R3,R3,LSR #bits-4 ;final int 0-16 (�9 SUBNE R4,R4,R3,LSL #bits-4 ;subtract converted value (�8 TEQ R1,#0:�RPL R5,R5,R3,LSL #5:�RMI R5,R3,R5,LSL #5 (�* LDR R3,[R6,R5,LSL #2] ;get 4 patterns (�G MOV R2,R12,LSR #1:STRB R3,[R2],R7:MOV R3,R3,LSR #8:STRB R3,[R2],R7 )C MOV R3,R3,LSR #8:STRB R3,[R2],R7:MOV R3,R3,LSR #8:STRB R3,[R2] ) ADD R12,R12,R1 ) ADD R2,R4,R4,LSL #1 ;*3 )"0 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 ), STR R3,[R11,-R8] )6 ADD R2,R4,R4,LSL #2 ;*5 )@, LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 )J STR R3,[R11] )T MOV R3,R4,ASR #4 ;/16 )^1 STR R3,[R11,R8]! ;not seen so far inc nl ptr )h RSB R2,R4,R4,LSL #3 ;*7 )r& LDR R4,[R10],R8 ;next light value )|@ ADD R4,R4,R2,ASR #4 ;next value +7/16 of error -> new value )� SUBS R9,R9,#2:BNE fsloop )� LDMFD SP !,{PC}^ )� ] )�� )� [OPT Z )�.fs% )� STMFD SP !,{R14} )�$ LDR R10,[R9,#4*8] ;addr current )�! LDR R11,[R9,#3*8] ;addr next )�* LDR R12,[R9,#2*8] ;addr pixel address )�! LDR R12,[R12] ;pixel address )� LDR R8,[R9,#8] ;addr step )� LDR R8,[R8] ;step * LDR R9,[R9] ;addr count * LDR R9,[R9] ;count * LDR R4,[R10],R8 ;mono value *&? TEQ R8,#0:MOVPL R1,#1:MVNMI R1,#0 ;+/- 1 for sprite output *0.fsloop *:; TEQ R4,#0:MOVMI R4,#0:CMP R4,#F:MOVCS R4,#F ;0<=val<=1 *D MOV R3,#0 *N CMP R4,#F>>1 ;>1/2? *X. SUBCS R4,R4,#F:MOVCS R3,#1 ;final int 0-1 *b MOV R2,R12,LSR #3 *l+ � R5,R12,#7:MOV R6,#1:MOV R6,R6,LSL R5 *vM LDRB R0,[R2]:BIC R0,R0,R6:�R R0,R0,R3,LSL R5 ;invert r3 value in process *� STRB R0,[R2] *� ADD R12,R12,R1 *� ADD R2,R4,R4,LSL #1 ;*3 *�0 LDR R3,[R11,-R8]:ADD R3,R3,R2,ASR #4 ;+3/16 *� STR R3,[R11,-R8] *� ADD R2,R4,R4,LSL #2 ;*5 *�, LDR R3,[R11]:ADD R3,R3,R2,ASR #4 ;+5/16 *� STR R3,[R11] *� MOV R3,R4,ASR #4 ;/16 *�1 STR R3,[R11,R8]! ;not seen so far inc nl ptr *� RSB R2,R4,R4,LSL #3 ;*7 *�& LDR R4,[R10],R8 ;next light value *�@ ADD R4,R4,R2,ASR #4 ;next value +7/16 of error -> new value + SUBS R9,R9,#1:BNE fsloop + LDMFD SP !,{PC}^ + ] + � +*� +4Ȏ col � +>� 0: +H [OPT Z +R<.mappix% ; � mappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% +\# LDR R0,[R9]:LDR R0,[R0] ;count +f3 LDR R1,[R9,#8]:LDR R1,[R1] ;base of byte array +p& LDR R2,[R9,#4*8] ;base of r array +z& LDR R5,[R9,#5*8] ;base of z array +� .mappixlp +� LDRB R6,[R1],#1 +� ] +�Ȏ input � +�� 8: +� [OPT Z +�) LDR R7,[R2,R6,LSL #2]:STR R7,[R5],#4 +� SUBS R0,R0,#1:BNE mappixlp +� MOVS PC,R14 +� ] +�� 4: +��bigendianbits � +� [OPT Z , MOV R10,R6,LSR #4 ,* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 , � R10,R6,#&F ,$ ] ,.� ,8 [OPT Z ,B � R10,R6,#&F ,L* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 ,V MOV R10,R6,LSR #4 ,` ] ,j� ,t [OPT Z ,~* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 ,� SUBS R0,R0,#2:BHI mappixlp ,� MOVS PC,R14 ,� ] ,�� 2: ,��bigendianbits � ,� [OPT Z ,� MOV R10,R6,LSR #6 ,�* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 ,� � R10,R6,#&30 ,�* LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 ,� � R10,R6,#&C ,�# LDR R7,[R2,R10]:STR R7,[R5],#4 - � R10,R6,#&3 - ] -� - [OPT Z -( � R10,R6,#&3 -2* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 -< � R10,R6,#&C -F# LDR R7,[R2,R10]:STR R7,[R5],#4 -P � R10,R6,#&30 -Z* LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 -d MOV R10,R6,LSR #6 -n ] -x� -� [OPT Z -�* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 -� SUBS R0,R0,#4:BHI mappixlp -� MOVS PC,R14 -� ] -�� 1: -��bigendianbits � -� [OPT Z -� � R10,R6,#&80 -�* LDR R7,[R2,R10,LSR #5]:STR R7,[R5],#4 -� � R10,R6,#&40 -�* LDR R7,[R2,R10,LSR #4]:STR R7,[R5],#4 -� � R10,R6,#&20 .* LDR R7,[R2,R10,LSR #3]:STR R7,[R5],#4 . � R10,R6,#&10 .* LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 ." � R10,R6,#&8 .,* LDR R7,[R2,R10,LSR #1]:STR R7,[R5],#4 .6 � R10,R6,#&4 .@# LDR R7,[R2,R10]:STR R7,[R5],#4 .J � R10,R6,#&2 .T* LDR R7,[R2,R10,LSL #1]:STR R7,[R5],#4 .^ � R10,R6,#&1 .h ] .r� .| [OPT Z .� � R10,R6,#&1 .�* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 .� � R10,R6,#&2 .�* LDR R7,[R2,R10,LSL #1]:STR R7,[R5],#4 .� � R10,R6,#&4 .�# LDR R7,[R2,R10]:STR R7,[R5],#4 .� � R10,R6,#&8 .�* LDR R7,[R2,R10,LSR #1]:STR R7,[R5],#4 .� � R10,R6,#&10 .�* LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 .� � R10,R6,#&20 .�* LDR R7,[R2,R10,LSR #3]:STR R7,[R5],#4 .� � R10,R6,#&40 /* LDR R7,[R2,R10,LSR #4]:STR R7,[R5],#4 / MOV R10,R6,LSR #7 / ] /&� /0 [OPT Z /:* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 /D SUBS R0,R0,#8:BHI mappixlp /N MOVS PC,R14 /X ] /b� /l [OPT Z /vS; routine to add two arrays and halve output of fixed point numbers for scaling /� .addhalf% /� LDR R0,[R9]:LDR R0,[R0] /� LDR R1,[R9,#8] ;output /� LDR R2,[R9,#2*8] ;input /�.addhalflp /�L LDR R3,[R1]:LDR R4,[R2],#4:ADD R3,R3,R4:MOV R3,R3,LSR #1:STR R3,[R1],#4 /� SUBS R0,R0,#1:BPL addhalflp /� MOVS PC,R14 /�@; change size in x �xsample%,xmul%,xdiv%,z%(1,0),xp%(1,0),x% /� .xsample% /� LDR R0,[R9]:LDR R0,[R0] ;x% /� LDR R1,[R9,#8] ;xp (in) /� LDR R2,[R9,#2*8] ;z 0( LDR R3,[R9,#3*8]:LDR R3,[R3] ;xdiv% 0( LDR R4,[R9,#4*8]:LDR R4,[R4] ;xmul% 0 MOV R11,R4 0 .xsamplelp 0* LDMIA R1,{R5} 04- SUBS R11,R11,#1:�Q R11,R4:ADDEQ R1,R1,#4 0># SUBS R12,R3,#1 ;(in range 1..) 0H BEQ xdonediv 0R.xdivlp 0\ LDMIA R1,{R8} 0f- SUBS R11,R11,#1:�Q R11,R4:ADDEQ R1,R1,#4 0p" ADD R5,R5,R8:MOV R5,R5,LSR #1 0z SUBS R12,R12,#1:BNE xdivlp 0� .xdonediv 0� STMIA R2!,{R5} 0� SUBS R0,R0,#1:BPL xsamplelp 0� MOVS PC,R14 0�] 0�� 2:� when col=2 0� [OPT Z 0�<.mappix% ; � mappix%,z%(1,0),r%(0),g%(0),b%(0),buff%,sx% 0�# LDR R0,[R9]:LDR R0,[R0] ;count 0�3 LDR R1,[R9,#8]:LDR R1,[R1] ;base of byte array 0�& LDR R2,[R9,#4*8] ;base of r array 0�& LDR R3,[R9,#3*8] ;base of g array 0�& LDR R4,[R9,#2*8] ;base of b array 1& LDR R5,[R9,#5*8] ;base of z array 1 .mappixlp 1 LDRB R6,[R1],#1 1$ ] 1.Ȏ input � 18� 8: 1B"�flag=1600 � flag=1601 � ham � 1L [OPT Z 1V ADR R9,ltable 1`" MOVS R7,R6,LSR #4:� R6,R6,#15 1jO LDREQ R10,[R2,R6,LSL #2]:LDREQ R11,[R3,R6,LSL #2]:LDREQ R12,[R4,R6,LSL #2] 1t' CMP R7,#1:LDREQ R12,[R9,R6,LSL #2] 1~' CMP R7,#2:LDREQ R10,[R9,R6,LSL #2] 1�' CMP R7,#3:LDREQ R11,[R9,R6,LSL #2] 1� STMIA R5!,{R10,R11,R12} 1� SUBS R0,R0,#1:BNE mappixlp 1� MOVS PC,R14 1�.ltable EQUD 0 1� EQUD 1/15*F 1� EQUD 2/15*F 1� EQUD 3/15*F 1� EQUD 4/15*F 1� EQUD 5/15*F 1� EQUD 6/15*F 1� EQUD 7/15*F 2 EQUD 8/15*F 2 EQUD 9/15*F 2 EQUD 10/15*F 2 EQUD 11/15*F 2( EQUD 12/15*F 22 EQUD 13/15*F 2< EQUD 14/15*F 2F EQUD F 2P ] 2Z� 2d [OPT Z 2n) LDR R7,[R2,R6,LSL #2]:STR R7,[R5],#4 2x) LDR R7,[R3,R6,LSL #2]:STR R7,[R5],#4 2�) LDR R7,[R4,R6,LSL #2]:STR R7,[R5],#4 2� SUBS R0,R0,#1:BNE mappixlp 2� MOVS PC,R14 2� ] 2�� 2�� 4: 2��bigendianbits � 2� [OPT Z 2� MOV R10,R6,LSR #4 2�* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 2�* LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 2�* LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 2� � R10,R6,#&F 3 ] 3� 3 [OPT Z 3" � R10,R6,#&F 3,* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 36* LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 3@* LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 3J MOV R10,R6,LSR #4 3T ] 3^� 3h [OPT Z 3r* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 3|* LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 3�* LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 3� SUBS R0,R0,#2:BHI mappixlp 3� MOVS PC,R14 3� ] 3�� 2: 3��bigendianbits � 3� [OPT Z 3� MOV R10,R6,LSR #6 3�* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 3�* LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 3�* LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 3� � R10,R6,#&30 3�* LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 4* LDR R7,[R3,R10,LSR #2]:STR R7,[R5],#4 4* LDR R7,[R4,R10,LSR #2]:STR R7,[R5],#4 4 � R10,R6,#&C 4&# LDR R7,[R2,R10]:STR R7,[R5],#4 40# LDR R7,[R3,R10]:STR R7,[R5],#4 4:# LDR R7,[R4,R10]:STR R7,[R5],#4 4D � R10,R6,#&3 4N ] 4X� 4b [OPT Z 4l � R10,R6,#&3 4v* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 4�* LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 4�* LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 4� � R10,R6,#&C 4�# LDR R7,[R2,R10]:STR R7,[R5],#4 4�# LDR R7,[R3,R10]:STR R7,[R5],#4 4�# LDR R7,[R4,R10]:STR R7,[R5],#4 4� � R10,R6,#&30 4�* LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 4�* LDR R7,[R3,R10,LSR #2]:STR R7,[R5],#4 4�* LDR R7,[R4,R10,LSR #2]:STR R7,[R5],#4 4� MOV R10,R6,LSR #6 4� ] 4�� 5 [OPT Z 5* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 5* LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 5 * LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 5* SUBS R0,R0,#4:BHI mappixlp 54 MOVS PC,R14 5> ] 5H� 1: 5R�bigendianbits � 5\ [OPT Z 5f � R10,R6,#&80 5p* LDR R7,[R2,R10,LSR #5]:STR R7,[R5],#4 5z* LDR R7,[R3,R10,LSR #5]:STR R7,[R5],#4 5�* LDR R7,[R4,R10,LSR #5]:STR R7,[R5],#4 5� � R10,R6,#&40 5�* LDR R7,[R2,R10,LSR #4]:STR R7,[R5],#4 5�* LDR R7,[R3,R10,LSR #4]:STR R7,[R5],#4 5�* LDR R7,[R4,R10,LSR #4]:STR R7,[R5],#4 5� � R10,R6,#&20 5�* LDR R7,[R2,R10,LSR #3]:STR R7,[R5],#4 5�* LDR R7,[R3,R10,LSR #3]:STR R7,[R5],#4 5�* LDR R7,[R4,R10,LSR #3]:STR R7,[R5],#4 5� � R10,R6,#&10 5�* LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 5�* LDR R7,[R3,R10,LSR #2]:STR R7,[R5],#4 5�* LDR R7,[R4,R10,LSR #2]:STR R7,[R5],#4 6 � R10,R6,#&8 6* LDR R7,[R2,R10,LSR #1]:STR R7,[R5],#4 6* LDR R7,[R3,R10,LSR #1]:STR R7,[R5],#4 6$* LDR R7,[R4,R10,LSR #1]:STR R7,[R5],#4 6. � R10,R6,#&4 68# LDR R7,[R2,R10]:STR R7,[R5],#4 6B# LDR R7,[R3,R10]:STR R7,[R5],#4 6L# LDR R7,[R4,R10]:STR R7,[R5],#4 6V � R10,R6,#&2 6`* LDR R7,[R2,R10,LSL #1]:STR R7,[R5],#4 6j* LDR R7,[R3,R10,LSL #1]:STR R7,[R5],#4 6t* LDR R7,[R4,R10,LSL #1]:STR R7,[R5],#4 6~ � R10,R6,#&1 6� ] 6�� 6� [OPT Z 6� � R10,R6,#&1 6�* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 6�* LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 6�* LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 6� � R10,R6,#&2 6�* LDR R7,[R2,R10,LSL #1]:STR R7,[R5],#4 6�* LDR R7,[R3,R10,LSL #1]:STR R7,[R5],#4 6�* LDR R7,[R4,R10,LSL #1]:STR R7,[R5],#4 6� � R10,R6,#&4 7 # LDR R7,[R2,R10]:STR R7,[R5],#4 7 # LDR R7,[R3,R10]:STR R7,[R5],#4 7# LDR R7,[R4,R10]:STR R7,[R5],#4 7 � R10,R6,#&8 7(* LDR R7,[R2,R10,LSR #1]:STR R7,[R5],#4 72* LDR R7,[R3,R10,LSR #1]:STR R7,[R5],#4 7<* LDR R7,[R4,R10,LSR #1]:STR R7,[R5],#4 7F � R10,R6,#&10 7P* LDR R7,[R2,R10,LSR #2]:STR R7,[R5],#4 7Z* LDR R7,[R3,R10,LSR #2]:STR R7,[R5],#4 7d* LDR R7,[R4,R10,LSR #2]:STR R7,[R5],#4 7n � R10,R6,#&20 7x* LDR R7,[R2,R10,LSR #3]:STR R7,[R5],#4 7�* LDR R7,[R3,R10,LSR #3]:STR R7,[R5],#4 7�* LDR R7,[R4,R10,LSR #3]:STR R7,[R5],#4 7� � R10,R6,#&40 7�* LDR R7,[R2,R10,LSR #4]:STR R7,[R5],#4 7�* LDR R7,[R3,R10,LSR #4]:STR R7,[R5],#4 7�* LDR R7,[R4,R10,LSR #4]:STR R7,[R5],#4 7� MOV R10,R6,LSR #7 7� ] 7�� 7� [OPT Z 7�* LDR R7,[R2,R10,LSL #2]:STR R7,[R5],#4 7�* LDR R7,[R3,R10,LSL #2]:STR R7,[R5],#4 7�* LDR R7,[R4,R10,LSL #2]:STR R7,[R5],#4 8 SUBS R0,R0,#8:BHI mappixlp 8 MOVS PC,R14 8 ] 8" � 24: 8, [OPT Z 86A.mappix% ; �mappix%,z%(1,0),r%(0),g%(0),b%(0),rb%,gb%,bb%,sx% 8@# LDR R0,[R9]:LDR R0,[R0] ;count 8J7 LDR R1,[R9,#3*8]:LDR R1,[R1] ;base of r byte array 8T7 LDR R2,[R9,#2*8]:LDR R2,[R2] ;base of g byte array 8^5 LDR R3,[R9,#8]:LDR R3,[R3] ;base of b byte array 8h& LDR R4,[R9,#6*8] ;base of r array 8r& LDR R5,[R9,#5*8] ;base of g array 8|& LDR R6,[R9,#4*8] ;base of b array 8�& LDR R7,[R9,#7*8] ;base of z array 8� .mappixlp 8�> LDRB R8,[R1],#step24:LDR R8,[R4,R8,LSL #2]:STR R8,[R7],#4 8�> LDRB R8,[R2],#step24:LDR R8,[R5,R8,LSL #2]:STR R8,[R7],#4 8�> LDRB R8,[R3],#step24:LDR R8,[R6,R8,LSL #2]:STR R8,[R7],#4 8� SUBS R0,R0,#1:BNE mappixlp 8� MOVS PC,R14 8� ] 8�� 8� [OPT Z 8�S; routine to add two arrays and halve output of fixed point numbers for scaling 8� .addhalf% 8� LDR R0,[R9]:LDR R0,[R0] 9 LDR R1,[R9,#8] ;output 9 LDR R2,[R9,#2*8] ;input 9.addhalflp 9&L LDR R3,[R1]:LDR R4,[R2],#4:ADD R3,R3,R4:MOV R3,R3,LSR #1:STR R3,[R1],#4 90L LDR R3,[R1]:LDR R4,[R2],#4:ADD R3,R3,R4:MOV R3,R3,LSR #1:STR R3,[R1],#4 9:L LDR R3,[R1]:LDR R4,[R2],#4:ADD R3,R3,R4:MOV R3,R3,LSR #1:STR R3,[R1],#4 9D SUBS R0,R0,#1:BPL addhalflp 9N MOVS PC,R14 9X@; change size in x �xsample%,xmul%,xdiv%,z%(1,0),xp%(1,0),x% 9b .xsample% 9l LDR R0,[R9]:LDR R0,[R0] ;x% 9v LDR R1,[R9,#8] ;xp (in) 9� LDR R2,[R9,#2*8] ;z 9�( LDR R3,[R9,#3*8]:LDR R3,[R3] ;xdiv% 9�( LDR R4,[R9,#4*8]:LDR R4,[R4] ;xmul% 9� MOV R11,R4 9�.xsamplelp 9� LDMIA R1,{R5,R6,R7} 9�. SUBS R11,R11,#1:�Q R11,R4:ADDEQ R1,R1,#12 9�# SUBS R12,R3,#1 ;(in range 1..) 9� BEQ xdonediv 9�.xdivlp 9� LDMIA R1,{R8,R9,R10} 9�. SUBS R11,R11,#1:�Q R11,R4:ADDEQ R1,R1,#12 9�" ADD R5,R5,R8:MOV R5,R5,LSR #1 :" ADD R6,R6,R9:MOV R6,R6,LSR #1 :# ADD R7,R7,R10:MOV R7,R7,LSR #1 : SUBS R12,R12,#1:BNE xdivlp : .xdonediv :* STMIA R2!,{R5,R6,R7} :4 SUBS R0,R0,#1:BPL xsamplelp :> MOVS PC,R14 :H ] :R� :\�compression=5 � :f [OPT Z :p+; � LZWdecode%,table%(0,0),c%,buff%,sx% :z.firstcode DCD 0 :�.oldcode DCD 0 :�.codesize DCD setcodes%+1 :�.stack DCD stk% :�.sp DCD stk% :�.maxcode DCD clearcode%+2 :�!.maxcodesize DCD 2*clearcode% :�.LZWdecode% :� LDR R2,firstcode :� LDR R3,oldcode :� LDR R4,stack :� LDR R5,codesize :� LDR R6,sp :� LDR R7,maxcode ; LDR R8,maxcodesize ; LDR R10,[R9] ; LDR R10,[R10] ;sx% ;$ LDR R11,[R9,#8] ;. LDR R11,[R11] ;buff% ;8 LDR R12,[R9,#24] ;table%() ;B STMFD SP !,{R14} ;L.lzwloop ;V CMP R6,R4 ;` BHI lzwunstack ;j.lzwengine ;t BL getcode ;~ CMP R0,#clearcode% ;� BEQ lzwclear ;�p;really ought to check for endcode=clearcode+1, but it only happens once and then you don't need the answer! ;� MOV R1,R0 ;incode=code ;� CMP R0,R7 ;if code>=maxcode ;�' STRCSB R2,[R6],#1 ;*sp++=firstcode ;� MOVCS R0,R3 ;code=oldcode ;�- ADD R2,R12,#4 ;r2(temp)=addr table%(x,1) ;� CMP R0,#clearcode% ;� BCC lzwdonepush ;�.lzwpushtable ;�, LDR R14,[R2,R0,LSL #3] ;table%(code%,1) ;� STRB R14,[R6],#1 ;*sp++= <