Home » Archimedes archive » Acorn User » AU 1995-01.adf » !Squisher_Squish » !Squish/!RunImage
!Squish/!RunImage
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 » Acorn User » AU 1995-01.adf » !Squisher_Squish |
Filename: | !Squish/!RunImage |
Read OK: | ✔ |
File size: | 86E0 bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
10REM > <Squish$Dir>.!RunImage 20PROCinitiate 30ON ERROR PROCerror(REPORT$) 40 50WHILE NOTexit 60PROCpoll(1+dragging%) 70ENDWHILE 80PROCclosedown 90 100DEF PROCinitiate 110PROCwimpinit("Squish","!squish","Squish",3,2000) 120dragging%=FALSE 130x=0:y=1 140tags%=7 150DIM tag(tags%,1),redotag%(tags%),tagon%(tags%),min(1),max(1),s%(1),len%(3) 160tagsize%=12:option%=0 170osprite%=-1:isprite%=-1 180zoom1%=1:zoom2%=1:zoom=1 190DIM quad% 32,magkeys% 3 200?magkeys%=0:magkeys%?1=3:magkeys%?2=-1 210tagon%()=-1 220linear%=TRUE 230PROCmc 240PROCinitheap 250ENDPROC 260 270DEF PROCinitwindows 280DIM spritemenu% 4000 290info%=FNinfowindow("Squish","Sprite Stretcher","Barry Wickett","1.33 (18-Jan-1994)") 300PROCiconbarmenu("Squish,Info>,w%(info%),Quit") 310save%=FNsavebox(sft%,"SpriteFile") 320options%=FNmenu("Update,When told/,End of drag,Whilst dragging") 330magnifier%=FNwindow("magnifier","magnifier",0,0) 340DIM angle% 4 350$angle%="90" 360rotate%=FNmenu("Angle,4!,a0-9,angle%") 370main%=FNwindow("standard","main",FNmenu("Squish,Save>,w%(save%),Select Sprite>,spritemenu%,Linear/,Update>-,options%,Rotate>,rotate%,Zoom>-,w%(magnifier%),Do it"),%110) 380ENDPROC 390 400DEF FNdropmain 410dragging%=FALSE 420IF option%=1 THEN PROCdoit 430=0 440 450DEF PROCnull 460PROCmouseinfo 470IF dragging% THEN 480 nx=(mx%-wx%+mix%)/zoom 490 ny=(my%-wy%+miy%)/zoom 500 IF nx<>tag(dragtag%,x) OR ny<>tag(dragtag%,y) THEN 510 IF option%<2 THEN 520 FOR time%=1 TO 2 530 PROCupdatewindow(w%(main%)) 540 WHILE more% 550 redotag%(dragtag%)=TRUE 560 IF dragtag%>=4 THEN 570 redotag%(dragtag%-4)=TRUE 580 redotag%(FNtag(dragtag%-4,1))=TRUE 590 redotag%(FNtag(dragtag%,1))=TRUE 600 redotag%(FNtag(dragtag%,-1))=TRUE 610 ELSE 620 redotag%(dragtag%+4)=TRUE 630 redotag%(FNtag(dragtag%+4,-1))=TRUE 640 IF linear% THEN 650 opptag%=FNtag(dragtag%,2) 660 redotag%(opptag%)=TRUE 670 redotag%(opptag%+4)=TRUE 680 redotag%(FNtag(opptag%+4,-1))=TRUE 690 ENDIF 700 ENDIF 710 PROCredotags 720 SYS"Wimp_GetRectangle",,blk% TO more% 730 ENDWHILE 740 IF time%=1 THEN PROCnewtagpos 750 NEXT time% 760 ELSE 770 PROCnewtagpos 780 PROCdoit 790 ENDIF 800 ENDIF 810ENDIF 820ENDPROC 830 840DEF FNclickmagnifier 850IF FNincicon(0,2,1,1,999) OR FNincicon(3,6,5,1,999) THEN PROCsetzoom 860=0 870 880DEF FNkeymagnifier 890taken=FNiconkeys(magkeys%) 900IF taken=-2 THEN 910 PROCclosemenu 920 PROCsetzoom 930ENDIF 940=taken 950 960DEF PROCsetzoom 970oldzoom=zoom1%/zoom2% 980zoom1%=FNiconval(w%(magnifier%),0) 990zoom2%=FNiconval(w%(magnifier%),3) 1000zoom=zoom1%/zoom2% 1010IF oldzoom<>zoom THEN 1020 PROCwindowinfo(w%(main%)) 1030 PROCsetwindowsize 1040 blk%!20=(blk%!20+ww%/2)*zoom/oldzoom-ww%/2 1050 blk%!24=(blk%!24-wh%/2)*zoom/oldzoom+wh%/2 1060 PROCopenwindow 1070 PROCforceredraw(w%(main%)) 1080ENDIF 1090ENDPROC 1100 1110DEF PROCsetwindowsize 1120PROCsetwindowextent(w%(main%),-rw%*zoom*2,-rh%*zoom*2,rw%*zoom*2,rh%*zoom*2) 1130ENDPROC 1140 1150DEF PROCnewtagpos 1160IF dragtag%>=4 THEN 1170 tag(dragtag%-4,x)=nx+ix 1180 tag(dragtag%-4,y)=ny+iy 1190 tag(FNtag(dragtag%-4,1),x)=nx-ix 1200 tag(FNtag(dragtag%-4,1),y)=ny-iy 1210ELSE 1220 tag(dragtag%,x)=nx 1230 tag(dragtag%,y)=ny 1240 IF linear% THEN 1250 FOR ord%=x TO y 1260 tag(FNtag(dragtag%,2),ord%)=tag(FNtag(dragtag%,-1),ord%)+tag(FNtag(dragtag%,1),ord%)-tag(dragtag%,ord%) 1270 NEXT ord% 1280 ENDIF 1290ENDIF 1300PROCfindintertags 1310ENDPROC 1320 1330DEF FNredrawmain 1340PROCputsprite(osprite%,sprite$,wx%+spritex*zoom,wy%+spritey*zoom,zoom1%,zoom2%) 1350redotag%()=TRUE 1360PROCredotags 1370=0 1380 1390DEF PROCredotags 1400SYS"Wimp_SetColour",8+3*16 1410FOR tag%=0 TO 3 1420 IF redotag%(tag%) OR redotag%((tag%+1)AND3) THEN 1430 LINE wx%+zoom*tag(tag%,x),wy%+zoom*tag(tag%,y),wx%+zoom*tag((tag%+1)AND3,x),wy%+zoom*tag((tag%+1)AND3,y) 1440 ENDIF 1450NEXT tag% 1460SYS"Wimp_SetColour",11+3*16 1470FOR tag%=0 TO tags% 1480 IF redotag%(tag%) AND tagon%(tag%) THEN 1490 RECTANGLE wx%+zoom*tag(tag%,x)-tagsize%,wy%+zoom*tag(tag%,y)-tagsize%,tagsize%*2,tagsize%*2 1500 redotag%(tag%)=FALSE 1510 ENDIF 1520NEXT tag% 1530ENDPROC 1540 1550DEF FNclickmain 1560PROCwindowinfo(w%(main%)) 1570mx%-=wx%:my%-=wy% 1580tag%=-1 1590FOR t%=0 TO tags% 1600 IF mx%>=zoom*tag(t%,x)-tagsize% AND mx%<=zoom*tag(t%,x)+tagsize% AND my%>=zoom*tag(t%,y)-tagsize% AND my%<=zoom*tag(t%,y)+tagsize% AND tagon%(t%) THEN tag%=t% 1610NEXT t% 1620IF tag%>=0 THEN 1630 PROCstartdragbox(0,7,0,0,0,0,wx%+blk%!44,wy%+blk%!48,wx%+blk%!52,wy%+blk%!56) 1640 dragging%=TRUE 1650 dragid%=main% 1660 dragtag%=tag% 1670 IF dragtag%>=4 THEN 1680 ix=tag(dragtag%-4,x)-tag(dragtag%,x) 1690 iy=tag(dragtag%-4,y)-tag(dragtag%,y) 1700 ENDIF 1710 mix%=zoom*tag(dragtag%,x)-mx% 1720 miy%=zoom*tag(dragtag%,y)-my% 1730ENDIF 1740=0 1750 1760DEF FNclosemain 1770PROCloseblock(isprite%) 1780PROCloseblock(osprite%) 1790=TRUE 1800 1810DEF FNopensave 1820PROCseticontext(w%(save%),2,FNstandardfilename(w%(save%))) 1830=0 1840 1850DEF FNmenumain 1860CASE !blk% OF 1870 WHEN 1 : IF blk%!4>-1 THEN PROCnewsprite(blk%!4+1) 1880 WHEN 2 1890 linear%=NOTlinear% 1900 PROCtickmenu(menu%(main%),2,linear%) 1910 IF linear% THEN 1920 FOR ord%=x TO y 1930 tag(2,ord%)=tag(3,ord%)+tag(1,ord%)-tag(0,ord%) 1940 NEXT ord% 1950 ENDIF 1960 PROCfindintertags 1970 PROCforceredraw(w%(main%)) 1980 WHEN 3 1990 IF blk%!4>-1 THEN 2000 PROCtickmenu(options%,option%,FALSE) 2010 option%=blk%!4 2020 PROCtickmenu(options%,option%,TRUE) 2030 ENDIF 2040 WHEN 4 2050 ang=RAD(VAL($angle%)) 2060 FOR tag%=0 TO tags% 2070 tx=COS(ang)*tag(tag%,x)-SIN(ang)*tag(tag%,y) 2080 tag(tag%,y)=SIN(ang)*tag(tag%,x)+COS(ang)*tag(tag%,y) 2090 tag(tag%,x)=tx 2100 NEXT tag% 2110 PROCforceredraw(w%(main%)) 2120 WHEN 6 : PROCdoit 2130ENDCASE 2140=0 2150 2160DEF FNpremenumain 2170d%=FNopensave 2180PROCseticonval(w%(magnifier%),0,zoom1%) 2190PROCseticonval(w%(magnifier%),3,zoom2%) 2200=0 2210 2220DEF FNmenuiconbar 2230IF !blk%=1 THEN PROCclosedown 2240=0 2250 2260DEF FNclickiconbar 2270IF active%(main%) THEN 2280 PROCopenup(w%(main%)) 2290ELSE 2300 PROCreport("Drag a spritefile here to start application.") 2310ENDIF 2320=0 2330 2340DEF FNprepareFF9 2350savebuff%=osprite%+4 2360filesize%=osprite%!12-4 2370=-1 2380 2390DEF FNtransblockFF9 2400PROCloseblock(osprite%) 2410PROCnewspritearea(isprite%,size%-12) 2420=isprite%+4 2430 2440DEF FNsavedFF9 2450PROCclosemenu 2460=0 2470 2480DEF FNloadFF9(file$) 2490PROCfileinfo(file$) 2500PROCloseblock(osprite%) 2510PROCnewspritearea(isprite%,filesize%-12) 2520IF isprite%=-1 THEN 2530 IF active%(main%) THEN PROCclosewindow(w%(main%)) 2540 PROCreport("Out of room.") 2550ELSE 2560 SYS"OS_SpriteOp",10+256,isprite%,file$ 2570ENDIF 2580=-1 2590 2600DEF FNloadedFF9 2610menuptr%=spritemenu% 2620PROCmenutitle("Sprites",menuptr%) 2630FOR s%=1 TO isprite%!4 2640 sname$=FNspritename(isprite%,s%) 2650 PROCmenuitem(sname$,menuptr%) 2660NEXT s% 2670PROCendmenu(menuptr%) 2680chosen%=1 2690PROCnewsprite(chosen%) 2700=0 2710 2720DEF PROCnewsprite(c%) 2730PROCtickmenu(spritemenu%,chosen%-1,FALSE) 2740chosen%=c% 2750PROCtickmenu(spritemenu%,chosen%-1,TRUE) 2760sprite$=FNspritename(isprite%,chosen%) 2770SYS"OS_SpriteOp",24+256,isprite%,sprite$ TO ,,saddr% 2780IF saddr%!32=44 THEN palette%=0 ELSE palette%=1 2790PROCnewspritearea(osprite%,!saddr%) 2800SYS"OS_SpriteOp",40+256,isprite%,sprite$ TO ,,,sx%,sy%,mask%,spmode% 2810osprite%!4=1 2820osprite%!12+=!saddr% 2830SYS"Wimp_TransferBlock",mytask%,saddr%,mytask%,osprite%+16,!saddr% 2840rw%=sx%<<FNmodevar(spmode%,4) 2850rh%=sy%<<FNmodevar(spmode%,5) 2860tag(0,x)=-rw%/2 2870tag(1,x)=rw%/2 2880tag(0,y)=rh%/2 2890tag(2,y)=-rh%/2 2900tag(2,x)=tag(1,x):tag(3,x)=tag(0,x) 2910tag(1,y)=tag(0,y):tag(3,y)=tag(2,y) 2920spritex=tag(0,x) 2930spritey=tag(2,y) 2940PROCfindintertags 2950PROCsetwindowsize 2960!blk%=w%(main%) 2970IF active%(main%) THEN PROCforceredraw(w%(main%)) 2980PROCopenup(w%(main%)) 2990!blk%=w%(main%) 3000SYS"Wimp_GetWindowState",,blk% 3010blk%!20=-(blk%!12-blk%!4)/2 3020blk%!24=(blk%!16-blk%!8)/2 3030PROCopenwindow 3040ENDPROC 3050 3060DEF PROCfindintertags 3070FOR tag%=0 TO 3 3080 FOR ord=x TO y 3090 tag(tag%+4,ord)=(tag(tag%,ord)+tag((tag%+1)AND3,ord))/2 3100 NEXT ord 3110NEXT tag% 3120ENDPROC 3130 3140DEF FNtag(tag%,inc%) 3150IF tag%<=3 THEN tag%=(tag%+inc%)AND3 ELSE tag%=((tag%-4+inc%)AND3)+4 3160=tag% 3170 3180DEF FNfileokay(filetype%) 3190ok%=TRUE 3200CASE filetype% OF 3210 WHEN sft% : IF message%=5 THEN ok%=FALSE 3220OTHERWISE 3230 ok%=FALSE 3240ENDCASE 3250=ok% 3260 3270DEF PROCdoit 3280SYS"Hourglass_On" 3290FOR ord%=x TO y 3300 min(ord%)=tag(0,ord%) 3310 max(ord%)=tag(0,ord%) 3320 FOR t%=1 TO 3 3330 IF tag(t%,ord%)<min(ord%) THEN min(ord%)=tag(t%,ord%) 3340 IF tag(t%,ord%)>max(ord%) THEN max(ord%)=tag(t%,ord%) 3350 NEXT t% 3360 min(ord%)-=1<<FNmodevar(spmode%,4+ord%) 3370 s%(ord%)=(INT(max(ord%)-min(ord%))>>FNmodevar(spmode%,4+ord%))+1 3380NEXT ord% 3390ssize%=(s%(x)+32)*s%(y)*(1<<FNmodevar(spmode%,9))/4+1000 3400PROCnewspritearea(osprite%,ssize%) 3410IF osprite%=-1 THEN 3420PROCreport("Out of room.") 3430PROCnewsprite(chosen%) 3440ELSE 3450SYS"OS_SpriteOp",15+256,osprite%,sprite$,palette%,s%(x),s%(y),spmode% 3460SYS"OS_SpriteOp",24+256,isprite%,sprite$ TO ,,iaddr% 3470SYS"OS_SpriteOp",24+256,osprite%,sprite$ TO ,,oaddr% 3480IF palette% THEN PROCcopypalette(isprite%,sprite$,osprite%,sprite$) 3490SYS"OS_SpriteOp",29+256,osprite%,sprite$ 3500FOR t%=0 TO 3 3510 FOR ord%=x TO y 3520 !(quad%+((t%*2+ord%)<<2))=(tag(t%,ord%)-min(ord%))*256 3530 NEXT ord% 3540NEXT t% 3550IF linear% THEN 3560quad%!24=quad%!16-(quad%!8-!quad%) 3570quad%!28=quad%!20-(quad%!12-quad%!4) 3580SYS"OS_SpriteOp",60+512,osprite%,oaddr% TO r0%,r1%,r2%,r3% 3590SYS"OS_SpriteOp",56+512,isprite%,iaddr%,1,,,quad% 3600SYS"OS_SpriteOp",r0%,r1%,r2%,r3% 3610SYS"OS_SpriteOp",61+512,osprite%,oaddr% TO r0%,r1%,r2%,r3% 3620GCOL 0,0 TINT 0 3630RECTANGLE FILL 0,0,s%(x)<<FNmodevar(spmode%,4),s%(y)<<FNmodevar(spmode%,5) 3640IF mask% THEN 3650 GCOL 8,128+FNmodevar(spmode%,3) TINT 255 3660 SYS"OS_SpriteOp",55+512,isprite%,iaddr%,1,,,quad% 3670ELSE 3680 GCOL 0,FNmodevar(spmode%,3) TINT 255 3690 MOVE quad%!24>>8,quad%!28>>8 3700 MOVE !quad%>>8,quad%!4>>8 3710 PLOT &75,quad%!8>>8,quad%!12>>8 3720ENDIF 3730SYS"OS_SpriteOp",r0%,r1%,r2%,r3% 3740ELSE 3750SYS"OS_SpriteOp",61+512,osprite%,oaddr% TO r0%,r1%,r2%,r3% 3760GCOL 0,0 TINT 0 3770RECTANGLE FILL 0,0,s%(x)<<FNmodevar(spmode%,4),s%(y)<<FNmodevar(spmode%,5) 3780SYS"OS_SpriteOp",r0%,r1%,r2%,r3% 3790FOR t%=0 TO 3 3800 xdiff%=(!(quad%+(t%<<3))-!(quad%+(((t%+1)AND3)<<3)))>>8 3810 ydiff%=(!(quad%+4+(t%<<3))-!(quad%+4+(((t%+1)AND3)<<3)))>>8 3820 len%(t%)=SQR(xdiff%^2+ydiff%^2) 3830NEXT t% 3840IF len%(0)>len%(2) THEN max1%=len%(0) ELSE max1%=len%(2)*1.1 3850IF len%(1)>len%(3) THEN max2%=len%(1) ELSE max2%=len%(3)*1.1 3860!isprite=isprite% 3870!osprite=osprite% 3880!iaddr=iaddr% 3890!oaddr=oaddr% 3900mv4%=FNmodevar(spmode%,4):mv5%=FNmodevar(spmode%,5) 3910!xd1=(quad%!16-quad%!24)>>(mv4%+8) 3920!xd2=(!quad%-quad%!24)>>mv4% 3930!xd3=(quad%!8-!quad%)>>(mv4%+8) 3940!ox=(quad%!24)<<(8-mv4%) 3950!yd1=(quad%!20-quad%!28)>>(mv5%+8) 3960!yd2=(quad%!4-quad%!28)>>mv5% 3970!yd3=(quad%!12-quad%!4)>>(mv5%+8) 3980!oy=(quad%!28)<<(8-mv5%) 3990!step1=(1<<(16+mv4%))/max1% 4000!step2=(1<<(16+mv4%))/max2% 4010!sx=sx% 4020!sy=sy% 4030CALL code% 4040ENDIF 4050spritex=min(x) 4060spritey=min(y) 4070PROCforceredraw(w%(main%)) 4080ENDIF 4090SYS"Hourglass_Off" 4100ENDPROC 4110 4120DEF PROCmc 4130DIM code% 2000 4140FOR pass=0 TO 2 STEP 2 4150P%=code% 4160one16=1<<16 4170sarea=1:spointer=2:spritex=3:spritey=4:col=5:tint=6:t1=7:t2=8:temp1=9:temp2=10:temp3=11:temp4=12 4180[OPT pass 4190MOV t1,#0 4200.loop1 4210MOV R1,#100 4220MUL R0,t1,R1 4230MOV R0,R0,ASR#16 4240SWI "Hourglass_Percentage" 4250LDR temp1,xd1 4260MUL temp2,t1,temp1 4270STR temp2,xf1 4280LDR temp1,xd3 4290MUL temp3,temp1,t1 4300SUB temp1,temp3,temp2 4310MOV temp1,temp1,ASR#8 4320LDR temp2,xd2 4330ADD temp1,temp1,temp2 4340STR temp1,xf2 4350LDR temp1,yd1 4360MUL temp2,t1,temp1 4370STR temp2,yf1 4380LDR temp1,yd3 4390MUL temp3,temp1,t1 4400SUB temp1,temp3,temp2 4410MOV temp1,temp1,ASR#8 4420LDR temp2,yd2 4430ADD temp1,temp1,temp2 4440STR temp1,yf2 4450LDR temp1,sx 4460MUL temp2,temp1,t1 4470MOV temp2,temp2,ASR#16 4480STR temp2,spx 4490MOV t2,#0 4500.loop2 4510LDR temp1,xf2 4520MOV R0,t2,ASR#4 4530MUL temp2,temp1,R0 4540MOV temp2,temp2,ASR#4 4550LDR temp1,xf1 4560ADD temp2,temp2,temp1 4570LDR temp1,ox 4580ADD temp2,temp2,temp1 4590MOV temp3,temp2,ASR#16 4600LDR temp1,yf2 4610MUL temp2,temp1,R0 4620MOV temp2,temp2,ASR#4 4630LDR temp1,yf1 4640ADD temp2,temp2,temp1 4650LDR temp1,oy 4660ADD temp2,temp2,temp1 4670MOV temp4,temp2,ASR#16 4680LDR temp1,sy 4690MUL temp2,temp1,t2 4700MOV spritey,temp2,ASR#16 4710LDR spritex,spx 4720MOV R0,#512 4730ADD R0,R0,#43 4740LDR sarea,isprite 4750LDR spointer,iaddr 4760SWI "OS_SpriteOp" 4770CMP R5,#0 4780BEQ endloop 4790MOV R0,#512 4800ADD R0,R0,#41 4810SWI "OS_SpriteOp" 4820MOV R0,#512 4830ADD R0,R0,#42 4840LDR sarea,osprite 4850LDR spointer,oaddr 4860MOV spritex,temp3 4870MOV spritey,temp4 4880SWI "OS_SpriteOp" 4890MOV R0,#512 4900ADD R0,R0,#44 4910MOV R5,#1 4920SWI "OS_SpriteOp" 4930.endloop 4940LDR temp2,step2 4950ADD t2,t2,temp2 4960CMP t2,#one16 4970BLT loop2 4980LDR temp1,step1 4990ADD t1,t1,temp1 5000CMP t1,#one16 5010BLT loop1 5020MOV PC,R14 5030.xd1:EQUD 0 5040.xd2:EQUD 0 5050.xd3:EQUD 0 5060.ox:EQUD 0 5070.yd1:EQUD 0 5080.yd2:EQUD 0 5090.yd3:EQUD 0 5100.oy:EQUD 0 5110.step1:EQUD 0 5120.step2:EQUD 0 5130.mask:EQUD 0 5140.xf1:EQUD 0 5150.xf2:EQUD 0 5160.yf1:EQUD 0 5170.yf2:EQUD 0 5180.spx:EQUD 0 5190.spy:EQUD 0 5200.sx:EQUD 0 5210.sy:EQUD 0 5220.isprite:EQUD 0 5230.osprite:EQUD 0 5240.iaddr:EQUD 0 5250.oaddr:EQUD 0 5260] 5270NEXT pass 5280ENDPROC 5290 5300REM ----WIMP Library routines---- 5310 5320DEF PROCnewspritearea(RETURN sprite%,size%) 5330IF sprite%>-1 THEN PROCloseblock(sprite%) 5340sprite%=FNgetblock(size%+16) 5350IF sprite%>-1 THEN 5360!sprite%=size%+16 5370sprite%!4=0 5380sprite%!8=16 5390sprite%!12=16 5400ENDIF 5410ENDPROC 5420 5430REM ==== message routines ==== 5440 5450DEF PROCpoll(pollflags%) 5460SYS"Wimp_Poll",pollflags%,blk% TO reason% 5470CASE reason% OF 5480 WHEN 0:PROCnull 5490 WHEN 1:PROCredraw 5500 WHEN 2:PROCopenwindow 5510 WHEN 3:PROCclosewindow(!blk%) 5520 WHEN 4:REM pointer leaving 5530 WHEN 5:REM pointer entering 5540 WHEN 6:PROCclick(!blk%,blk%!4,blk%!8,blk%!12,blk%!16) 5550 WHEN 7:PROCenddrag 5560 WHEN 8:PROCkey(!blk%,blk%!4,blk%!8,blk%!24) 5570 WHEN 9:PROCmenuselect 5580 WHEN 10:REM scroll request 5590 WHEN 11:mycaret%=FALSE 5600 WHEN 12:mycaret%=TRUE 5610 WHEN 17,18:PROCmessage(blk%!4,blk%!8,blk%!16) 5620ENDCASE 5630ENDPROC 5640 5650DEF PROCmessage(task%,ref%,message%) 5660IF status%>0 AND message%>=1 AND message%<=7 THEN message%=-1 5670CASE message% OF 5680 WHEN 0 : PROCquit 5690 WHEN 1 5700 filetype%=blk%!40 5710 IF FNfileokay(filetype%) THEN 5720 itrans%=0 5730 size%=blk%!36 5740 file$=FNstring(blk%+44) 5750 blk%!20=EVAL("FNtransblock"+STR$~(filetype%)) 5760 blk%!24=size% 5770 PROCreply(18,6) 5780 ENDIF 5790 WHEN 2 5800 PROCsave(dragid%,FNstring(blk%+44),prepared%) 5810 IF saved% THEN PROCtelltoload ELSE PROCreport("Could not save file") 5820 WHEN 3 : PROCload(FNstring(blk%+44),blk%!40) 5830 WHEN 5 : PROCload(FNstring(blk%+44),blk%!40) 5840 WHEN 6 5850 togo%=filesize%-otrans% 5860 IF togo%>blk%!24 THEN togo%=blk%!24 5870 IF togo%+otrans%>filesize% THEN togo%=filesize%-otrans% 5880 SYS"Wimp_TransferBlock",mytask%,savebuff%+otrans%,task%,blk%!20,togo% 5890 blk%!24=togo% 5900 PROCreply(18,7) 5910 otrans%+=togo% 5920 IF otrans%=filesize% THEN d%=EVAL("FNsaved"+STR$~(misc%(id%))) 5930 WHEN 7 5940 itrans%+=blk%!24 5950 IF itrans%>=size%-16 THEN 5960 d%=EVAL("FNloaded"+STR$~(filetype%)) 5970 ELSE 5980 blk%!20+=blk%!24 5990 blk%!24=size%-itrans% 6000 PROCreply(18,6) 6010 ENDIF 6020 WHEN 8 : PROCprequit 6030 WHEN 10: PROCaddtobootfile(blk%!20) 6040 WHEN &400C1 : PROCnewmode 6050ENDCASE 6060ENDPROC 6070 6080DEF PROCreply(type%,blk%!16) 6090blk%!12=ref% 6100SYS"Wimp_SendMessage",type%,blk%,task% 6110ENDPROC 6120 6130DEF PROCnewmode 6140!q%=11:q%!4=12:q%!8=4:q%!12=5:q%!16=3:q%!20=-1 6150SYS"OS_ReadVduVariables",q%,q% 6160scx%=(!q%+1)<<(q%!8) 6170scy%=(q%!4+1)<<(q%!12) 6180pixelw%=1<<q%!8:pixelh%=1<<q%!12 6190cols%=q%!16 6200SYS"Wimp_ReadPalette",,pal% 6210ENDPROC 6220 6230DEF PROCprequit 6240IF changed% THEN 6250 PROCreply(17,8) 6260 PROCclosewindow(w%(main%)) 6270ENDIF 6280ENDPROC 6290 6300DEF PROCaddtobootfile(handle%) 6310BPUT#file,"Run "+dir$ 6320ENDPROC 6330 6340DEF PROCtelltoload 6350PROCmouseinfo 6360blk%!20=wind% 6370blk%!24=icon% 6380blk%!28=mx% 6390blk%!32=my% 6400blk%!36=filesize% 6410blk%!40=filetype% 6420$(blk%+44)=filename$+CHR$0 6430!blk%=(LEN$(blk%+44)+48)ANDNOT3 6440PROCreply(17,3) 6450ENDPROC 6460 6470DEF PROCdropfile(filename$,filetype%,filesize%) 6480PROCmouseinfo 6490blk%!12=0 6500blk%!16=1 6510blk%!20=wind% 6520blk%!24=icon% 6530blk%!28=mx% 6540blk%!32=my% 6550blk%!36=filesize% 6560blk%!40=filetype% 6570$(blk%+44)=FNlastbit(filename$)+CHR$0 6580!blk%=(LEN$(blk%+44)+48)ANDNOT3 6590SYS"Wimp_SendMessage",17,blk%,blk%!20,blk%!24 6600otrans%=0 6610ENDPROC 6620 6630REM - Sprite routines - 6640 6650DEF PROCloadsprites 6660spritefile$=dir$+".Sprites" 6670PROCfileinfo(spritefile$) 6680IF exist%=1 THEN 6690ssize%=filesize%+16 6700DIM sprites% ssize% 6710!sprites%=ssize% 6720sprites%!4=0 6730sprites%!8=16 6740sprites%!12=16 6750SYS"OS_SpriteOp",10+256,sprites%,spritefile$ 6760ELSE 6770sprites%=-1 6780ENDIF 6790ENDPROC 6800DEF PROCputsprite(sprite%,sprite$,x%,y%,z1%,z2%) 6810SYS"OS_SpriteOp",24+256,sprite%,sprite$ TO ,,saddr% 6820SYS"OS_SpriteOp",40+256,sprite%,sprite$ TO ,,,,,,spmode% 6830PROCtables 6840GCOL 8,0 6850SYS"OS_SpriteOp",52+256,sprite%,sprite$,x%,y%,8,scale%,gcol% 6860ENDPROC 6870 6880DEF PROCtables 6890dmode%=MODE 6900dpal%=FNwpal(dmode%) 6910!scale%=(1<<FNmodevar(spmode%,4))*z1% 6920scale%!4=(1<<FNmodevar(spmode%,5))*z1% 6930scale%!8=pixelw%*z2% 6940scale%!12=pixelh%*z2% 6950IF saddr%!32<>44 THEN spal%=FNspritepalette ELSE spal%=FNwpal(spmode%) 6960SYS"ColourTrans_SelectTable",spmode%,spal%,dmode%,dpal%,gcol% 6970ENDPROC 6980 6990DEF FNspritepalette 7000cols%=FNmodevar(spmode%,3) 7010IF cols%>15 THEN cols%=15 7020FOR c%=0 TO cols% 7030sppal%!(c%<<2)=saddr%!(44+(c%<<3)) 7040NEXT c% 7050=sppal% 7060 7070DEF PROCcopypalette(fsprite%,fsprite$,tsprite%,tsprite$) 7080SYS"OS_SpriteOp",24+256,fsprite%,fsprite$ TO ,,faddr% 7090SYS"OS_SpriteOp",24+256,tsprite%,tsprite$ TO ,,taddr% 7100FOR a%=44 TO faddr%!32-4 STEP 4 7110 taddr%!a%=faddr%!a% 7120NEXT a% 7130ENDPROC 7140 7150REM - file handling - 7160 7170DEF PROCfileinfo(file$) 7180SYS"OS_File",5,file$ TO exist%,,,,filesize% 7190ENDPROC 7200 7210DEF FNfilesize(file$) 7220LOCAL exist%,filesize% 7230PROCfileinfo(file$) 7240=filesize% 7250 7260DEF FNfileexist(file$) 7270LOCAL exist%,filesize% 7280PROCfileinfo(file$) 7290=exist% 7300 7310DEF FNloadtemplate(title$) 7320SYS"Wimp_LoadTemplate",,blk%,ind%,indend%,fonttable%,title$ TO ,,ind% 7330IF sprites%<>-1 THEN blk%!64=sprites% 7340SYS"Wimp_CreateWindow",,blk% TO wind% 7350=wind% 7360 7370DEF FNnameok(file$) 7380result%=TRUE 7390IF INSTR(file$,":")+INSTR(file$,".")=0 AND file$<>"<Wimp$Scrap>" THEN 7400PROCreport("To save, drag icon to a directory viewer.") 7410result%=FALSE 7420ENDIF 7430=result% 7440 7450REM - menus - 7460 7470DEF PROCtickmenu(menu%,item%,tick%) 7480p%=menu%+28+item%*24 7490IF tick% THEN !p%=!p% OR1 ELSE !p%=!p% ANDNOT1 7500ENDPROC 7510 7520DEF PROCmenutitle(title$,RETURN menuptr%) 7530oldptr%=menuptr% 7540$menuptr%=title$ 7550max%=LENtitle$ 7560menuptr%!12=&70207 7570menuptr%!20=44 7580menuptr%!24=0 7590menuptr%+=4 7600ENDPROC 7610 7620DEF PROCmenuitem(RETURN text$,RETURN menuptr%) 7630menuptr%+=24 7640!menuptr%=0 7650menuptr%!4=0 7660word$=FNnextword(text$) 7670token$=FNtoken(word$) 7680i1%=-1 7690WHILE token$<>"" 7700CASE token$ OF 7710WHEN ">" : menuptr%!4=EVAL(FNnextword(text$)) 7720WHEN "/" : !menuptr%=!menuptr% OR 1 7730WHEN "-" : !menuptr%=!menuptr% OR 2 7740WHEN "!" 7750 !menuptr%=!menuptr% OR 4 7760 valid$=FNnextword(text$) 7770 IF LENvalid$ THEN 7780 DIM i1% LENvalid$+1 7790 $i1%=valid$ 7800 ENDIF 7810ENDCASE 7820token$=FNtoken(word$) 7830ENDWHILE 7840menuptr%!8=(7<<24) OR %10001 7850IF !menuptr% AND 4 OR token$="#" THEN 7860PROCinditem(EVAL(FNnextword(text$)),i1%,EVAL(word$)) 7870ELSE 7880IF LENword$<=12 THEN 7890$(menuptr%+12)=word$ 7900ELSE 7910DIM i0% LENword$+1 7920$i0%=word$ 7930PROCinditem(i0%,-1,LENword$+1) 7940ENDIF 7950IF LENword$>max% THEN max%=LENword$ 7960ENDIF 7970ENDPROC 7980 7990DEF PROCendmenu(RETURN menuptr%) 8000!menuptr%=!menuptr% OR &80 8010menuptr%+=24 8020oldptr%!16=max%*16+12 8030ENDPROC 8040 8050DEF FNmenu(text$) 8060stext$=text$ 8070items%=0 8080text$+="," 8090title$=FNnextword(text$) 8100PROCmenutitle(title$,menuptr%) 8110WHILE text$<>"" 8120items%+=1 8130PROCmenuitem(text$,menuptr%) 8140ENDWHILE 8150PROCendmenu(menuptr%) 8160=oldptr% 8170 8180DEF PROCinditem(i0%,i1%,i2%) 8190menuptr%!8=menuptr%!8 OR 1<<8 8200menuptr%!12=i0% 8210menuptr%!16=i1% 8220menuptr%!20=i2% 8230IF i2%-1>max% AND (!menuptr% AND 4)=0 THEN max%=i2%-1 8240ENDPROC 8250 8260DEF FNtoken(RETURN word$) 8270token$="" 8280IF INSTR(">/!#-",RIGHT$(word$)) THEN 8290token$=RIGHT$(word$,1) 8300word$=LEFT$(word$,LENword$-1) 8310ENDIF 8320=token$ 8330 8340DEF FNnextword(RETURN text$) 8350LOCAL word$,pos% 8360pos%=INSTR(text$,",") 8370word$=LEFT$(text$,pos%-1) 8380text$=MID$(text$,pos%+1) 8390=word$ 8400 8410DEF PROCclosemenu 8420SYS"Wimp_CreateMenu",,-1 8430ENDPROC 8440 8450REM - icons - 8460 8470DEF PROCshadeicon(!q%,q%!4,shade%) 8480IF shade% THEN q%!8=1<<22 ELSE q%!8=0 8490q%!12=1<<22 8500SYS"Wimp_SetIconState",,q% 8510ENDPROC 8520 8530DEF FNicontext(!q%,q%!4) 8540SYS"Wimp_GetIconState",,q% 8550IF q%!24AND(1<<8) THEN text$=$(q%!28) ELSE text$=$(q%+28) 8560=text$ 8570 8580DEF FNiconval(!q%,q%!4) 8590=VAL(FNicontext(!q%,q%!4)) 8600 8610DEF PROCredoicon(!q%,q%!4) 8620SYS"Wimp_GetIconState",,q% 8630SYS"Wimp_ForceRedraw",!q%,q%!8,q%!12,q%!16,q%!20 8640ENDPROC 8650 8660DEF PROCdeleteicon(!q%,q%!4) 8670SYS"Wimp_DeleteIcon",,q% 8680ENDPROC 8690 8700DEF PROCiconinfo(wind%,icon%) 8710!blk%=wind% 8720blk%!4=icon% 8730SYS"Wimp_GetIconState",,blk% 8740ENDPROC 8750 8760DEF FNselected(!q%,q%!4) 8770SYS"Wimp_GetIconState",,q% 8780=(((q%!24)AND(1<<21))>0) 8790 8800DEF FNcricon(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,$(q%+24)) 8810SYS"Wimp_CreateIcon",,q% TO icon% 8820=icon% 8830 8840DEF FNbuttype(!q%,q%!4) 8850IF q%!4>=0 THEN SYS"Wimp_GetIconState",,q% ELSE q%!24=0 8860=((q%!24)>>12)AND15 8870 8880DEF PROCselecticon(!q%,q%!4,select%) 8890SYS"Wimp_GetIconState",,q% 8900IF select% THEN q%!8=1<<21 ELSE q%!8=0 8910q%!12=1<<21 8920IF (q%!24 AND q%!12)<>q%!8 THEN SYS"Wimp_SetIconState",,q% 8930ENDPROC 8940 8950DEF PROCseticonfc(!q%,q%!4,col%) 8960SYS"Wimp_GetIconState",,q% 8970q%!8=col%<<24 8980q%!12=15<<24 8990IF (q%!24 AND q%!12)<>q%!8 THEN SYS"Wimp_SetIconState",,q% 9000ENDPROC 9010 9020DEF PROCseticonval(!q%,q%!4,val%) 9030PROCseticontext(!q%,q%!4,STR$(val%)) 9040ENDPROC 9050 9060DEF PROCseticontext(!q%,q%!4,text$) 9070SYS"Wimp_GetIconState",,q% 9080text$=LEFT$(text$,q%!36-1) 9090IF $(q%!28)<>text$ THEN 9100$(q%!28)=text$ 9110q%!8=0 9120q%!12=0 9130SYS"Wimp_SetIconState",,q% 9140ENDIF 9150ENDPROC 9160 9170DEF FNicontp(!q%,q%!4) 9180SYS"Wimp_GetIconState",,q% 9190=q%!28 9200 9210DEF PROCstartdrag(id%,icon%) 9220dragid%=id% 9230dragicon%=icon% 9240wind%=w%(dragid%) 9250PROCwindowinfo(wind%) 9260!blk%=wind% 9270blk%!4=icon% 9280SYS"Wimp_GetIconState",,blk% 9290!blk%=0 9300blk%!4=5 9310blk%!8+=wx% 9320blk%!12+=wy% 9330blk%!16+=wx% 9340blk%!20+=wy% 9350blk%!24=0 9360blk%!28=0 9370blk%!32=scx% 9380blk%!36=scy% 9390IF drag% THEN 9400SYS"DragASprite_Start",197,1,FNicontext(wind%,icon%),blk%+8,blk%+24 9410ELSE 9420SYS"Wimp_DragBox",,blk% 9430ENDIF 9440ENDPROC 9450 9460REM - user interogation - 9470 9480DEF FNcheck(message$) 9490SYS"Wimp_DragBox",,0 9500!q%=0 9510$(q%+4)=message$ 9520SYS"Wimp_ReportError",q%,19,"Message from "+program$ TO ,answer% 9530IF answer%=1 THEN =TRUE ELSE =FALSE 9540 9550DEF PROCreport(message$) 9560d%=FNquestion(message$,"OK","","") 9570ENDPROC 9580 9590DEF FNquestion(ans$(0),ans$(1),ans$(2),ans$(3)) 9600LOCAL status% 9610status%=2 9620PROCclosemenu 9630FOR i%=0 TO 3 9640 IF ans$(i%)="" THEN 9650 PROCremoveicon(w%(report%),i%) 9660 ELSE 9670 PROCreiniticon(w%(report%),i%) 9680 PROCseticontext(w%(report%),i%,ans$(i%)) 9690 ENDIF 9700NEXT i% 9710PROClosecaret 9720PROCopenincentre(w%(report%)) 9730IF beep% THEN VDU 7 9740answer%=0 9750REPEAT 9760 SYS"Wimp_Poll",1,blk% TO reason% 9770 CASE reason% OF 9780 WHEN 1:PROCredraw 9790 WHEN 6:IF blk%!12=w%(report%) AND blk%!16>-1 THEN answer%=blk%!16 9800 WHEN 17,18:PROCmessage(blk%!4,blk%!8,blk%!16) 9810 ENDCASE 9820UNTIL answer% 9830PROCclosewindow(w%(report%)) 9840=answer% 9850 9860REM - misc - 9870 9880DEF PROCquit 9890PROCclosedown 9900ENDPROC 9910 9920DEF PROCclosedown 9930PROCresetslot 9940FOR i%=1 TO 255 9950WHILE fonttable%?i% 9960SYS"Font_LoseFont",i% 9970fonttable%?i%-=1 9980ENDWHILE 9990NEXT i% 10000SYS"Wimp_CloseDown",mytask% 10010END 10020ENDPROC 10030 10040DEF FNmodevar(mode%,var%) 10050SYS"OS_ReadModeVariable",mode%,var% TO ,,val% 10060=val% 10070 10080DEF PROCsetfontcolours 10090CASE cols% OF 10100 WHEN 1 : SYS"Font_SetFontColours",,0,1,0 10110 WHEN 3 : SYS"Font_SetFontColours",,0,1,2 10120 WHEN 15 : SYS"Font_SetFontColours",,0,1,6 10130 WHEN 15 : SYS"Font_SetFontColours",,0,1,14,!pal%,pal%!28 10140ENDCASE 10150ENDPROC 10160 10170DEF FNstring(b%) 10180LOCAL s$ 10190s$="" 10200WHILE ?b%>31 10210s$+=CHR$(?b%) 10220b%+=1 10230ENDWHILE 10240=s$ 10250 10260REM - windows - 10270 10280DEF PROCsetwindowextent(wind%,!q%,q%!4,q%!8,q%!12) 10290SYS"Wimp_SetExtent",wind%,q% 10300ENDPROC 10310 10320DEF PROCopenincentre(!blk%) 10330SYS"Wimp_GetWindowState",,blk% 10340m1%=blk%!12-blk%!4 10350m2%=blk%!16-blk%!8 10360blk%!4=(scx%-m1%)>>1 10370blk%!8=(scy%-m2%)>>1 10380blk%!12=(scx%+m1%)>>1 10390blk%!16=(scy%+m2%)>>1 10400blk%!28=-1 10410PROCopenwindow 10420ENDPROC 10430 10440DEF PROCnewtitle(!blk%,title$) 10450SYS"Wimp_GetWindowInfo",,blk% 10460IF $(blk%!76)<>title$ THEN 10470$(blk%!76)=title$ 10480IF active%(FNid(!blk%)) THEN 10490 SYS"Wimp_GetWindowOutline",,blk% 10500 SYS"Wimp_ForceRedraw",-1,blk%!4,blk%!16-44,blk%!12,blk%!16 10510ENDIF 10520ENDIF 10530ENDPROC 10540 10550DEF PROCforceredraw(!blk%) 10560SYS"Wimp_GetWindowInfo",,blk% 10570SYS"Wimp_ForceRedraw",!blk%,blk%!44,blk%!48,blk%!52,blk%!56 10580ENDPROC 10590 10600DEF PROCupdatewindow(!blk%) 10610SYS"Wimp_GetWindowInfo",,blk% 10620blk%!4=blk%!44 10630blk%!8=blk%!48 10640blk%!12=blk%!52 10650blk%!16=blk%!56 10660SYS"Wimp_UpdateWindow",,blk% TO more% 10670ENDPROC 10680 10690DEF PROCopenfully(!blk%,top%) 10700SYS"Wimp_GetWindowInfo",,blk% 10710blk%!12=blk%!4+(blk%!52-blk%!44) 10720blk%!8=blk%!16-(blk%!56-blk%!48) 10730IF top% THEN blk%!28=-1 10740PROCopenwindow 10750ENDPROC 10760 10770DEF PROCclosewindow(wind%) 10780LOCAL cid%,close% 10790cid%=FNid(wind%) 10800IF sysflags%(cid%)AND2 THEN close%=EVAL("FNclose"+id$(cid%)) ELSE close%=TRUE 10810IF close% THEN 10820 active%(cid%)=FALSE 10830 PROCquickclosewindow(w%(cid%)) 10840ENDIF 10850ENDPROC 10860 10870DEF PROCquickclosewindow(!q%) 10880SYS"Wimp_CloseWindow",,q% 10890ENDPROC 10900 10910DEF PROCreopen(!blk%) 10920SYS"Wimp_GetWindowState",,blk% 10930PROCopenwindow 10940PROCforceredraw(!blk%) 10950ENDPROC 10960 10970DEF PROCwindowinfo(wind%) 10980!blk%=wind% 10990SYS"Wimp_GetWindowInfo",,blk% 11000wx%=blk%!4-blk%!20 11010wy%=blk%!16-blk%!24 11020ww%=blk%!12-blk%!4 11030wh%=blk%!16-blk%!8 11040ENDPROC 11050 11060DEF FNsavebox(filetype%,standard$) 11070wind%=FNwindow("save","save",0,0) 11080PROCseticontext(w%(wind%),3,"file_"+RIGHT$("00"+STR$~(filetype%),3)) 11090PROCseticontext(w%(wind%),1,standard$) 11100misc%(wind%)=filetype% 11110=wind% 11120 11130DEF FNlastbit(file$) 11140WHILE INSTR(file$,".") 11150file$=MID$(file$,INSTR(file$,".")+1) 11160ENDWHILE 11170=file$ 11180 11190DEF PROCmouseinfo 11200SYS"Wimp_GetPointerInfo",,q% 11210mx%=!q% 11220my%=q%!4 11230but%=q%!8 11240wind%=q%!12 11250icon%=q%!16 11260ENDPROC 11270 11280DEF PROCsetfiletype(file$,filetype%) 11290SYS"OS_File",&12,file$,filetype% 11300ENDPROC 11310 11320DEF PROCshademenu(menu%,item%,shade%) 11330p%=menu%+36+item%*24 11340!p%=!p% ANDNOT(1<<22) 11350IF shade% THEN !p%=!p% OR(1<<22) 11360ENDPROC 11370 11380DEF PROCgetcaret 11390SYS"Wimp_GetCaretPosition",,q% 11400cwind%=!q% 11410cicon%=q%!4 11420cxoff%=q%!8 11430cyoff%=q%!12 11440cheight%=q%!16 11450cindex%=q%!20 11460ENDPROC 11470 11480DEF PROCputcaret(wind%,icon%,index%) 11490len%=LENFNicontext(wind%,icon%) 11500IF index%>len% THEN index%=len% 11510SYS"Wimp_SetCaretPosition",wind%,icon%,,,-1,index% 11520ENDPROC 11530 11540DEF PROCresetcaret(wind%,icon%) 11550SYS"Wimp_GetCaretPosition",,q% 11560IF (!q%=wind% AND q%!4=icon%) THEN 11570 index%=q%!20 11580 len%=LENFNicontext(wind%,icon%) 11590 IF index%>len% THEN index%=len% 11600 SYS"Wimp_SetCaretPosition",wind%,icon%,,,-1,index% 11610ENDIF 11620IF wind%=0 THEN SYS"Wimp_SetCaretPosition",!q%,q%!4,q%!8,q%!12,q%!16,q%!20 11630ENDPROC 11640 11650DEF PROClosecaret 11660IF mycaret% THEN SYS"Wimp_SetCaretPosition",-1 11670ENDPROC 11680 11690DEF PROCflashicon(!q%,q%!4) 11700FOR f%=1 TO 3 11710WAIT:WAIT 11720PROCselecticon(!q%,q%!4,FALSE) 11730WAIT:WAIT 11740PROCselecticon(!q%,q%!4,TRUE) 11750NEXT f% 11760ENDPROC 11770 11780DEF PROCopeniconmenu(!q%,q%!4,wind%) 11790openmenu%=wind% 11800SYS"Wimp_GetIconState",,q% 11810menux%=q%!16 11820menuy%=q%!20 11830PROCwindowinfo(!q%) 11840menux%+=wx% 11850menuy%+=wy% 11860SYS"Wimp_CreateMenu",,openmenu%,menux%,menuy% 11870ENDPROC 11880 11890DEF FNinfowindow(i1$,i2$,i3$,i4$) 11900wind%=FNwindow("info","",0,0) 11910PROCseticontext(w%(wind%),1,i1$) 11920PROCseticontext(w%(wind%),2,i2$) 11930PROCseticontext(w%(wind%),3,i3$) 11940PROCseticontext(w%(wind%),4,i4$) 11950=wind% 11960 11970DEF PROCwimpinit(name$,sprite$,work$,no%,isize%) 11980changed%=FALSE 11990SYS"OS_GetEnv" TO autoload$ 12000autoload$=MID$(autoload$,INSTR(autoload$,CHR$34,INSTR(autoload$,CHR$34)+1)+2) 12010status%=0 12020mycaret%=FALSE 12030windows%=no%+3 12040program$=name$ 12050DIM blk% 2000,q% 256,ind% isize%,pal% 256 12060indend%=ind%+isize% 12070$blk%="TASK" 12080SYS"Wimp_Initialise",200,!blk%,program$ TO ,mytask% 12090iconbar%=FNcricon(-1,0,0,68,68,&2002,sprite$) 12100$q%=work$+"$Dir" 12110SYS"OS_ReadVarVal",q%,blk%,256,0,3 TO ,,len% 12120blk%?len%=13 12130dir$=$blk% 12140SYS"XOS_SWINumberFromString",,"DragASprite_Start" TO ;drag% 12150drag%=(drag% AND 1)=0 12160SYS"OS_Byte",161,28 TO ,,bit% 12170IF (bit% AND 2)=0 THEN drag%=FALSE 12180SYS"Wimp_SlotSize",-1,-1 TO appsize% 12190PROCloadsprites 12200tft%=&FFF 12210dft%=&AFF 12220sft%=&FF9 12230exit=FALSE 12240DIM gcol% 256,pal% 80,pal2% 80,pal4% 80,sppal% 80,scale% 16 12250FOR i%=0 TO 1 12260 pal2%!(4*(1-i%))=(&F0F0F0*i%)<<8 12270NEXT i% 12280FOR i%=0 TO 3 12290 pal4%!(4*(3-i%))=(&505050*i%)<<8 12300NEXT i% 12310PROCnewmode 12320DIM menubuffer% 2000,fonttable% 256 12330twind%=0 12340DIM w%(windows%),menu%(windows%),id$(windows%),misc%(windows%),active%(windows%),default%(5,windows%),sysflags%(windows%) 12350menuptr%=menubuffer% 12360FOR i%=1 TO 255 12370fonttable%?i%=0 12380NEXT i% 12390w%(0)=-2:id$(0)="iconbar" 12400SYS"Wimp_OpenTemplate",,dir$+".Templates" 12410PROCinitwindows 12420report%=FNwindow("report","report",0,0) 12430SYS"Wimp_CloseTemplate" 12440DIM ans$(3) 12450beep%=TRUE 12460ENDPROC 12470 12480REM ==== memory management ==== 12490 12500DEF FNspace(size%) 12510SYS"XWimp_SlotSize",appsize%+size%,-1 TO new%;noroom% 12520room%=((noroom%AND1)=0) 12530IF new%<appsize%+size% THEN room%=FALSE 12540IF room% THEN appinc%=new%-appsize% 12550=room% 12560 12570DEF PROCinitheap 12580heap%=HIMEM 12590heapsize%=8*1024 12600IF FNspace(heapsize%) THEN 12610 SYS"OS_Heap",0,heap%,,heapsize% 12620ELSE 12630 PROCerror("Out of room.") 12640ENDIF 12650ENDPROC 12660 12670DEF FNlargestblock 12680SYS"OS_Heap",1,heap% TO ,,largest% 12690=largest% 12700 12710DEF FNgetblock(size%) 12720LOCAL ok% 12730ok%=TRUE 12740WHILE ok% AND FNlargestblock<size% 12750 ok%=FNextendheap(8*1024) 12760ENDWHILE 12770IF ok% THEN 12780 SYS"OS_Heap",2,heap%,,size% TO ,,block% 12790ELSE 12800 block%=-1 12810ENDIF 12820=block% 12830 12840DEF PROCloseblock(RETURN block%) 12850IF block%>-1 THEN SYS"OS_Heap",3,heap%,block% 12860block%=-1 12870PROCshrinkheap 12880ENDPROC 12890 12900DEF PROCshrinkheap 12910LOCAL ok%,size% 12920ok%=TRUE 12930size%=-1024 12940WHILE ok% 12950 SYS"XOS_Heap",5,heap%,,size% TO ;ok% 12960 ok%=((ok%AND1)=0) 12970 IF ok% THEN 12980 heapsize%=heap%!12 12990 ok%=FNspace(heapsize%) 13000 ENDIF 13010ENDWHILE 13020ENDPROC 13030 13040DEF FNextendheap(size%) 13050LOCAL ok% 13060ok%=FNspace(heapsize%+size%) 13070IF ok% THEN 13080 SYS"OS_Heap",5,heap%,,size% 13090 heapsize%=heap%!12 13100ENDIF 13110=ok% 13120 13130DEF PROCresetslot 13140SYS"Wimp_SlotSize",appsize%,-1 13150appinc%=0 13160ENDPROC 13170 13180REM ==== filing system routines ==== 13190 13200DEF FNstandardfilename(wind%) 13210=FNicontext(wind%,1) 13220 13230DEF PROCsave(id%,file$,prepared%) 13240filename$=file$ 13250saved%=FALSE 13260IF FNnameok(filename$) THEN 13270IF prepared%=FALSE THEN prepared%=EVAL("FNprepare"+STR$~(misc%(id%))) 13280CASE prepared% OF 13290 WHEN -1 13300 SYS"OS_File",10,filename$,misc%(id%),,savebuff%,savebuff%+filesize% 13310 d%=EVAL("FNsaved"+STR$~(misc%(id%))) 13320 WHEN -2 13330 d%=EVAL("FNsave"+STR$~(misc%(id%))) 13340ENDCASE 13350PROCclosemenu 13360PROCseticontext(w%(id%),2,filename$) 13370saved%=TRUE 13380ENDIF 13390ENDIF 13400ENDPROC 13410 13420REM ==== menu routines ==== 13430 13440DEF PROCopenwindowasmenu(window%) 13450PROCwindowinfo(window%) 13460PROCmouseinfo 13470menux%=mx%-ww%/2 13480menuy%=my%+wh%/2 13490openmenu%=window% 13500id%=FNid(window%) 13510PROCreopenmenu 13520ENDPROC 13530 13540DEF PROCiconbarmenu(text$) 13550menu%(0)=FNmenu(text$) 13560barheight%=items%*44+96 13570ENDPROC 13580 13590DEF PROCmenuselect 13600d%=EVAL("FNmenu"+id$(menuid%)) 13610PROCmouseinfo 13620IF but%=1 THEN PROCreopenmenu 13630ENDPROC 13640 13650DEF PROCreopenmenu 13660IF sysflags%(id%)AND4 THEN d%=EVAL("FNpremenu"+id$(id%)) 13670SYS"Wimp_CreateMenu",,openmenu%,menux%,menuy% 13680ENDPROC 13690 13700DEF PROCopenmenu(id%) 13710IF menu%(id%) THEN 13720menuid%=id% 13730openmenu%=menu%(id%) 13740IF id%=0 THEN menuy%=barheight% ELSE menuy%=my% 13750menux%=mx%-(openmenu%!16)/2-16 13760PROCreopenmenu 13770ENDIF 13780ENDPROC 13790 13800REM ==== window routines ==== 13810 13820DEF FNwindow(wind$,name$,menu%,flags%) 13830twind%+=1 13840w%(twind%)=FNloadtemplate(wind$) 13850PROCwindowinfo(w%(twind%)) 13860FOR d%=0 TO 5 13870default%(d%,twind%)=!(blk%+(d%<<2)+4) 13880NEXT d% 13890id$(twind%)=name$ 13900menu%(twind%)=menu% 13910sysflags%(twind%)=flags% 13920=twind% 13930 13940DEF PROCredraw 13950id%=FNid(!blk%) 13960PROCwindowinfo(!blk%) 13970SYS"Wimp_RedrawWindow",,blk% TO more% 13980WHILE more% 13990x0%=blk%!28-wx% 14000y0%=blk%!32-wy% 14010x1%=blk%!36-wx% 14020y1%=blk%!40-wy% 14030d%=EVAL("FNredraw"+id$(id%)) 14040SYS"Wimp_GetRectangle",,blk% TO more% 14050ENDWHILE 14060ENDPROC 14070 14080DEF FNid(find%) 14090found%=windows% 14100FOR i%=0 TO windows% 14110IF w%(i%)=find% THEN found%=i% 14120NEXT i% 14130=found% 14140 14150DEF PROCopenup(wind%) 14160!blk%=wind% 14170id%=FNid(wind%) 14180IF NOTactive%(id%) THEN 14190FOR d%=0 TO 5 14200!(blk%+(d%<<2)+4)=default%(d%,id%) 14210NEXT d% 14220ELSE 14230SYS"Wimp_GetWindowState",,blk% 14240ENDIF 14250blk%!28=-1 14260PROCopenwindow 14270ENDPROC 14280 14290DEF PROCopenwindow 14300id%=FNid(!blk%) 14310SYS"Wimp_OpenWindow",,blk% 14320active%(id%)=TRUE 14330IF sysflags%(id%)AND1 THEN d%=EVAL("FNopen"+id$(id%)) 14340ENDPROC 14350 14360DEF PROCfrontopenwindow(!blk%) 14370SYS"Wimp_GetWindowState",,blk% 14380blk%!28=-1 14390PROCopenwindow 14400ENDPROC 14410 14420DEF PROCredobox(wind%,x0%,y0%,x1%,y1%) 14430IF x1%<x0% THEN SWAP x0%,x1% 14440IF y1%<y0% THEN SWAP y0%,y1% 14450SYS"Wimp_ForceRedraw",wind%,x0%,y0%,x1%,y1% 14460ENDPROC 14470 14480DEF PROCdeletewindow(RETURN !q%) 14490SYS"Wimp_DeleteWindow",,q% 14500!q%=0 14510ENDPROC 14520 14530REM ==== icon routines ==== 14540 14550DEF PROCclick(mx%,my%,but%,wind%,icon%) 14560IF FNbuttype(wind%,icon%)=9 THEN PROCflashicon(wind%,icon%) 14570id%=FNid(wind%) 14580CASE but% OF 14590WHEN 64 14600 CASE FNbuttype(w%(id%),icon%) OF 14610 WHEN 6,7,8,10,14 : PROCstartdrag(id%,icon%) 14620 ENDCASE 14630WHEN 2 : PROCopenmenu(id%) 14640OTHERWISE 14650d%=EVAL("FNclick"+id$(id%)) 14660ENDCASE 14670ENDPROC 14680 14690DEF PROCenddrag 14700PROCmouseinfo 14710IF drag% THEN SYS"DragASprite_Stop" 14720d%=EVAL("FNdrop"+id$(dragid%)) 14730ENDPROC 14740 14750DEF PROCstartdragbox(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,q%!24,q%!28,q%!32,q%!36) 14760SYS"Wimp_DragBox",,q% 14770ENDPROC 14780 14790DEF PROCkey(wind%,icon%,xpos%,key%) 14800taken=EVAL("FNkey"+id$(FNid(wind%))) 14810IF taken=FALSE THEN SYS"Wimp_ProcessKey",key% 14820ENDPROC 14830 14840DEF FNincicon(iicon%,dec%,inc%,lb%,ub%) 14850change%=FALSE 14860IF icon%=dec% OR icon%=inc% THEN 14870val%=VALFNicontext(wind%,iicon%) 14880val%+=(icon%=dec%)*2+1 14890IF val%>ub% THEN val%=ub% ELSE IF val%<lb% THEN val%=lb% 14900PROCseticontext(wind%,iicon%,STR$(val%)) 14910PROCresetcaret(wind%,iicon%) 14920change%=TRUE 14930ENDIF 14940ENDIF 14950=change% 14960 14970DEF PROCremoveicon(!q%,q%!4) 14980q%!8=(1<<24) 14990q%!12=(1<<2)OR(1<<5)OR(15<<24)OR(15<<12) 15000SYS"Wimp_SetIconState",,q% 15010ENDPROC 15020 15030DEF PROCreiniticon(!q%,q%!4) 15040q%!8=(1<<2)OR(1<<5)OR(7<<24)OR(3<<12) 15050q%!12=(1<<2)OR(1<<5)OR(15<<12)OR(15<<24) 15060SYS"Wimp_SetIconState",,q% 15070ENDPROC 15080 15090DEF FNiconkeys(data%) 15100taken=TRUE 15110icons%=0 15120WHILE data%?icons%<255 15130 icons%+=1 15140ENDWHILE 15150icons%-=1 15160found%=-1 15170FOR p%=0 TO icons% 15180 IF data%?p%=icon% THEN found%=p% 15190NEXT p% 15200newicon%=-1 15210IF found%>=0 THEN 15220 CASE key% OF 15230 WHEN 13 : newicon%=found%+1 15240 WHEN &18E : IF found%<icons% THEN newicon%=found%+1 15250 WHEN &18F : IF found%>0 THEN newicon%=found%-1 15260 WHEN &19E,&1AE,&1BE : newicon%=icons% 15270 WHEN &19F,&1AF,&1BF : newicon%=0 15280 OTHERWISE 15290 taken=FALSE 15300 ENDCASE 15310ENDIF 15320IF newicon%>icons% THEN taken=-2:newicon%=-1 15330IF newicon%>=0 THEN 15340 PROCgetcaret 15350 PROCputcaret(wind%,data%?newicon%,cindex%) 15360ENDIF 15370=taken 15380 15390REM ==== and the rest ==== 15400 15410DEF FNclick=0 15420 15430DEF FNredraw=0 15440 15450DEF FNkey=0 15460 15470DEF FNdrop=0 15480 15490DEF PROCtemp(st$) 15500FOR a%=1 TO LENst$ 15510 PRINTASCMID$(st$,a%,1) 15520NEXT a% 15530ENDPROC 15540 15550DEF PROCerror(error$) 15560SYS"Hourglass_Smash" 15570CASE status% OF 15580 WHEN 1 15590 IF print THEN CLOSE#print 15600 report$="Print error, print cancelled" 15610OTHERWISE 15620 report$="An uncontrolable error has occured ("+error$+STR$(ERL)+"), shall I exit?" 15630ENDCASE 15640exit=FNcheck(report$) 15650status%=0 15660ENDPROC 15670 15680DEF FNwpal(mode%) 15690CASE FNmodevar(mode%,3) OF 15700 WHEN 63:p%=0 15710 WHEN 15:p%=pal% 15720 WHEN 3:p%=pal4% 15730 WHEN 1:p%=pal2% 15740ENDCASE 15750=p% 15760 15770DEF FNdropsave 15780filetype%=misc%(dragid%) 15790prepared%=EVAL("FNprepare"+STR$~(filetype%)) 15800IF prepared% THEN PROCdropfile(FNicontext(w%(dragid%),2),filetype%,filesize%) 15810=0 15820 15830DEF FNclicksave 15840IF icon%=0 THEN PROCsave(id%,FNicontext(wind%,2),FALSE) 15850=0 15860 15870DEF FNkeysave 15880IF key%=13 THEN PROCsave(id%,FNicontext(wind%,2),FALSE):=TRUE 15890=0 15900 15910DEF FNspritename(sprite%,number%) 15920SYS"OS_SpriteOp",13+256,sprite%,q%,256,number% TO ,,,len% 15930q%?len%=13 15940=$q% 15950 15960DEF PROCload(file$,filetype%) 15970ok%=FNfileokay(filetype%) 15980IF ok% THEN ok%=FNfileexist(file$) 15990IF ok% THEN 16000 PROCreply(18,4) 16010 d%=EVAL("FNload"+STR$~(filetype%)+"(file$)") 16020 d%=EVAL("FNloaded"+STR$~(filetype%)) 16030ELSE 16040 IF message%<>5 THEN 16050 PROCreply(18,4) 16060 PROCreport("Cannot load this file.") 16070 ENDIF 16080ENDIF 16090ENDPROC
� > <Squish$Dir>.!RunImage �initiate � � �error(�$) ( 2ȕ �exit <�poll(1+dragging%) F� P�closedown Z d� �initiate n1�wimpinit("Squish","!squish","Squish",3,2000) xdragging%=� �x=0:y=1 �tags%=7 �L� tag(tags%,1),redotag%(tags%),tagon%(tags%),min(1),max(1),s%(1),len%(3) �tagsize%=12:option%=0 �osprite%=-1:isprite%=-1 �zoom1%=1:zoom2%=1:zoom=1 �� quad% 32,magkeys% 3 �*?magkeys%=0:magkeys%?1=3:magkeys%?2=-1 �tagon%()=-1 � linear%=� ��mc � �initheap �� � �initwindows � spritemenu% 4000 "Winfo%=�infowindow("Squish","Sprite Stretcher","Barry Wickett","1.33 (18-Jan-1994)") ,/�iconbarmenu("Squish,Info>,w%(info%),Quit") 6%save%=�savebox(sft%,"SpriteFile") @Coptions%=�menu("Update,When told/,End of drag,Whilst dragging") J3magnifier%=�window("magnifier","magnifier",0,0) T� angle% 4 ^$angle%="90" h)rotate%=�menu("Angle,4!,a0-9,angle%") r�main%=�window("standard","main",�menu("Squish,Save>,w%(save%),Select Sprite>,spritemenu%,Linear/,Update>-,options%,Rotate>,rotate%,Zoom>-,w%(magnifier%),Do it"),%110) |� � �� �dropmain �dragging%=� �� option%=1 � �doit �=0 � �� �null ��mouseinfo �� dragging% � � nx=(mx%-wx%+mix%)/zoom � ny=(my%-wy%+miy%)/zoom �3 � nx<>tag(dragtag%,x) � ny<>tag(dragtag%,y) � � � option%<2 � � time%=1 � 2 $ �updatewindow(w%(main%)) ȕ more% &" redotag%(dragtag%)=� 0 � dragtag%>=4 � :& redotag%(dragtag%-4)=� D. redotag%(�tag(dragtag%-4,1))=� N, redotag%(�tag(dragtag%,1))=� X- redotag%(�tag(dragtag%,-1))=� b � l& redotag%(dragtag%+4)=� v/ redotag%(�tag(dragtag%+4,-1))=� � � linear% � �* opptag%=�tag(dragtag%,2) �% redotag%(opptag%)=� �' redotag%(opptag%+4)=� �0 redotag%(�tag(opptag%+4,-1))=� � � � � � �redotags �1 ș"Wimp_GetRectangle",,blk% � more% � � �" � time%=1 � �newtagpos � � time% � � �newtagpos �doit � � *� 4� > H� �clickmagnifier R>� �incicon(0,2,1,1,999) � �incicon(3,6,5,1,999) � �setzoom \=0 f p� �keymagnifier ztaken=�iconkeys(magkeys%) �� taken=-2 � � �closemenu � �setzoom �� � =taken � �� �setzoom �oldzoom=zoom1%/zoom2% �%zoom1%=�iconval(w%(magnifier%),0) �%zoom2%=�iconval(w%(magnifier%),3) �zoom=zoom1%/zoom2% �� oldzoom<>zoom � � �windowinfo(w%(main%)) �setwindowsize 0 blk%!20=(blk%!20+ww%/2)*zoom/oldzoom-ww%/2 0 blk%!24=(blk%!24-wh%/2)*zoom/oldzoom+wh%/2 $ �openwindow . �forceredraw(w%(main%)) 8� B� L V� �setwindowsize `M�setwindowextent(w%(main%),-rw%*zoom*2,-rh%*zoom*2,rw%*zoom*2,rh%*zoom*2) j� t ~� �newtagpos �� dragtag%>=4 � � tag(dragtag%-4,x)=nx+ix � tag(dragtag%-4,y)=ny+iy �% tag(�tag(dragtag%-4,1),x)=nx-ix �% tag(�tag(dragtag%-4,1),y)=ny-iy �� � tag(dragtag%,x)=nx � tag(dragtag%,y)=ny � � linear% � � � ord%=x � y �n tag(�tag(dragtag%,2),ord%)=tag(�tag(dragtag%,-1),ord%)+tag(�tag(dragtag%,1),ord%)-tag(dragtag%,ord%) � � ord% � � �findintertags � ( 2� �redrawmain <P�putsprite(osprite%,sprite$,wx%+spritex*zoom,wy%+spritey*zoom,zoom1%,zoom2%) Fredotag%()=� P �redotags Z=0 d n� �redotags xș"Wimp_SetColour",8+3*16 �� tag%=0 � 3 �/ � redotag%(tag%) � redotag%((tag%+1)�3) � �i � wx%+zoom*tag(tag%,x),wy%+zoom*tag(tag%,y),wx%+zoom*tag((tag%+1)�3,x),wy%+zoom*tag((tag%+1)�3,y) � � � � tag% �ș"Wimp_SetColour",11+3*16 �� tag%=0 � tags% �' � redotag%(tag%) � tagon%(tag%) � �\ ȓ wx%+zoom*tag(tag%,x)-tagsize%,wy%+zoom*tag(tag%,y)-tagsize%,tagsize%*2,tagsize%*2 � redotag%(tag%)=� � � � � tag% �� � �clickmain �windowinfo(w%(main%)) "mx%-=wx%:my%-=wy% ,tag%=-1 6� t%=0 � tags% @� � mx%>=zoom*tag(t%,x)-tagsize% � mx%<=zoom*tag(t%,x)+tagsize% � my%>=zoom*tag(t%,y)-tagsize% � my%<=zoom*tag(t%,y)+tagsize% � tagon%(t%) � tag%=t% J� t% T� tag%>=0 � ^P �startdragbox(0,7,0,0,0,0,wx%+blk%!44,wy%+blk%!48,wx%+blk%!52,wy%+blk%!56) h dragging%=� r dragid%=main% | dragtag%=tag% � � dragtag%>=4 � �, ix=tag(dragtag%-4,x)-tag(dragtag%,x) �, iy=tag(dragtag%-4,y)-tag(dragtag%,y) � � �# mix%=zoom*tag(dragtag%,x)-mx% �# miy%=zoom*tag(dragtag%,y)-my% �� �=0 � �� �closemain ��loseblock(isprite%) ��loseblock(osprite%) �=� � �opensave :�seticontext(w%(save%),2,�standardfilename(w%(save%))) &=0 0 :� �menumain DȎ !blk% � N. � 1 : � blk%!4>-1 � �newsprite(blk%!4+1) X � 2 b linear%=�linear% l) �tickmenu(menu%(main%),2,linear%) v � linear% � � � ord%=x � y �; tag(2,ord%)=tag(3,ord%)+tag(1,ord%)-tag(0,ord%) � � ord% � � � �findintertags � �forceredraw(w%(main%)) � � 3 � � blk%!4>-1 � �' �tickmenu(options%,option%,�) � option%=blk%!4 �' �tickmenu(options%,option%,�) � � � � 4 ang=�(�($angle%)) � tag%=0 � tags% 2 tx=�(ang)*tag(tag%,x)-�(ang)*tag(tag%,y) ; tag(tag%,y)=�(ang)*tag(tag%,x)+�(ang)*tag(tag%,y) * tag(tag%,x)=tx 4 � tag% > �forceredraw(w%(main%)) H � 6 : �doit R� \=0 f p� �premenumain zd%=�opensave �(�seticonval(w%(magnifier%),0,zoom1%) �(�seticonval(w%(magnifier%),3,zoom2%) �=0 � �� �menuiconbar �� !blk%=1 � �closedown �=0 � �� �clickiconbar �� active%(main%) � � �openup(w%(main%)) �� �= �report("Drag a spritefile here to start application.") � =0 $� �prepareFF9 .savebuff%=osprite%+4 8filesize%=osprite%!12-4 B=-1 L V� �transblockFF9 `�loseblock(osprite%) j%�newspritearea(isprite%,size%-12) t=isprite%+4 ~ �� �savedFF9 ��closemenu �=0 � �� �loadFF9(file$) ��fileinfo(file$) ��loseblock(osprite%) �)�newspritearea(isprite%,filesize%-12) �� isprite%=-1 � �0 � active%(main%) � �closewindow(w%(main%)) � �report("Out of room.") �� + ș"OS_SpriteOp",10+256,isprite%,file$ � =-1 (� �loadedFF9 2menuptr%=spritemenu% <"�menutitle("Sprites",menuptr%) F� s%=1 � isprite%!4 P% sname$=�spritename(isprite%,s%) Z �menuitem(sname$,menuptr%) d� s% n�endmenu(menuptr%) x chosen%=1 ��newsprite(chosen%) �=0 � �� �newsprite(c%) �&�tickmenu(spritemenu%,chosen%-1,�) �chosen%=c% �&�tickmenu(spritemenu%,chosen%-1,�) �)sprite$=�spritename(isprite%,chosen%) �6ș"OS_SpriteOp",24+256,isprite%,sprite$ � ,,saddr% �,� saddr%!32=44 � palette%=0 � palette%=1 �$�newspritearea(osprite%,!saddr%) �Fș"OS_SpriteOp",40+256,isprite%,sprite$ � ,,,sx%,sy%,mask%,spmode% �osprite%!4=1 osprite%!12+=!saddr% Eș"Wimp_TransferBlock",mytask%,saddr%,mytask%,osprite%+16,!saddr% rw%=sx%<<�modevar(spmode%,4) " rh%=sy%<<�modevar(spmode%,5) ,tag(0,x)=-rw%/2 6tag(1,x)=rw%/2 @tag(0,y)=rh%/2 Jtag(2,y)=-rh%/2 T'tag(2,x)=tag(1,x):tag(3,x)=tag(0,x) ^'tag(1,y)=tag(0,y):tag(3,y)=tag(2,y) hspritex=tag(0,x) rspritey=tag(2,y) |�findintertags ��setwindowsize �!blk%=w%(main%) �.� active%(main%) � �forceredraw(w%(main%)) ��openup(w%(main%)) �!blk%=w%(main%) �!ș"Wimp_GetWindowState",,blk% �blk%!20=-(blk%!12-blk%!4)/2 �blk%!24=(blk%!16-blk%!8)/2 ��openwindow �� � �� �findintertags �� tag%=0 � 3 � ord=x � y = tag(tag%+4,ord)=(tag(tag%,ord)+tag((tag%+1)�3,ord))/2 � ord & � tag% 0� : D� �tag(tag%,inc%) N=� tag%<=3 � tag%=(tag%+inc%)�3 � tag%=((tag%-4+inc%)�3)+4 X =tag% b l� �fileokay(filetype%) v ok%=� �Ȏ filetype% � �# � sft% : � message%=5 � ok%=� � � ok%=� �� �=ok% � �� �doit �ș"Hourglass_On" �� ord%=x � y � min(ord%)=tag(0,ord%) � max(ord%)=tag(0,ord%) � � t%=1 � 3 9 � tag(t%,ord%)<min(ord%) � min(ord%)=tag(t%,ord%) 9 � tag(t%,ord%)>max(ord%) � max(ord%)=tag(t%,ord%) � t% , min(ord%)-=1<<�modevar(spmode%,4+ord%) *C s%(ord%)=(�(max(ord%)-min(ord%))>>�modevar(spmode%,4+ord%))+1 4 � ord% >;ssize%=(s%(x)+32)*s%(y)*(1<<�modevar(spmode%,9))/4+1000 H#�newspritearea(osprite%,ssize%) R� osprite%=-1 � \�report("Out of room.") f�newsprite(chosen%) p� zHș"OS_SpriteOp",15+256,osprite%,sprite$,palette%,s%(x),s%(y),spmode% �6ș"OS_SpriteOp",24+256,isprite%,sprite$ � ,,iaddr% �6ș"OS_SpriteOp",24+256,osprite%,sprite$ � ,,oaddr% �@� palette% � �copypalette(isprite%,sprite$,osprite%,sprite$) �+ș"OS_SpriteOp",29+256,osprite%,sprite$ �� t%=0 � 3 � � ord%=x � y �> !(quad%+((t%*2+ord%)<<2))=(tag(t%,ord%)-min(ord%))*256 � � ord% �� t% �� linear% � �&quad%!24=quad%!16-(quad%!8-!quad%) �(quad%!28=quad%!20-(quad%!12-quad%!4) �<ș"OS_SpriteOp",60+512,osprite%,oaddr% � r0%,r1%,r2%,r3% 4ș"OS_SpriteOp",56+512,isprite%,iaddr%,1,,,quad% #ș"OS_SpriteOp",r0%,r1%,r2%,r3% <ș"OS_SpriteOp",61+512,osprite%,oaddr% � r0%,r1%,r2%,r3% $� 0,0 Ȝ 0 .Cȓ Ȑ 0,0,s%(x)<<�modevar(spmode%,4),s%(y)<<�modevar(spmode%,5) 8 � mask% � B( � 8,128+�modevar(spmode%,3) Ȝ 255 L6 ș"OS_SpriteOp",55+512,isprite%,iaddr%,1,,,quad% V� `$ � 0,�modevar(spmode%,3) Ȝ 255 j � quad%!24>>8,quad%!28>>8 t � !quad%>>8,quad%!4>>8 ~" � &75,quad%!8>>8,quad%!12>>8 �� �#ș"OS_SpriteOp",r0%,r1%,r2%,r3% �� �<ș"OS_SpriteOp",61+512,osprite%,oaddr% � r0%,r1%,r2%,r3% �� 0,0 Ȝ 0 �Cȓ Ȑ 0,0,s%(x)<<�modevar(spmode%,4),s%(y)<<�modevar(spmode%,5) �#ș"OS_SpriteOp",r0%,r1%,r2%,r3% �� t%=0 � 3 �; xdiff%=(!(quad%+(t%<<3))-!(quad%+(((t%+1)�3)<<3)))>>8 �? ydiff%=(!(quad%+4+(t%<<3))-!(quad%+4+(((t%+1)�3)<<3)))>>8 �# len%(t%)=�(xdiff%^2+ydiff%^2) �� t% 9� len%(0)>len%(2) � max1%=len%(0) � max1%=len%(2)*1.1 9� len%(1)>len%(3) � max2%=len%(1) � max2%=len%(3)*1.1 !isprite=isprite% !osprite=osprite% (!iaddr=iaddr% 2!oaddr=oaddr% <5mv4%=�modevar(spmode%,4):mv5%=�modevar(spmode%,5) F&!xd1=(quad%!16-quad%!24)>>(mv4%+8) P !xd2=(!quad%-quad%!24)>>mv4% Z#!xd3=(quad%!8-!quad%)>>(mv4%+8) d!ox=(quad%!24)<<(8-mv4%) n&!yd1=(quad%!20-quad%!28)>>(mv5%+8) x!!yd2=(quad%!4-quad%!28)>>mv5% �%!yd3=(quad%!12-quad%!4)>>(mv5%+8) �!oy=(quad%!28)<<(8-mv5%) �!step1=(1<<(16+mv4%))/max1% �!step2=(1<<(16+mv4%))/max2% �!sx=sx% �!sy=sy% �� code% �� �spritex=min(x) �spritey=min(y) ��forceredraw(w%(main%)) �� �ș"Hourglass_Off" � � �mc "� code% 2000 ,� pass=0 � 2 � 2 6P%=code% @one16=1<<16 Jdsarea=1:spointer=2:spritex=3:spritey=4:col=5:tint=6:t1=7:t2=8:temp1=9:temp2=10:temp3=11:temp4=12 T [OPT pass ^ MOV t1,#0 h .loop1 rMOV R1,#100 |MUL R0,t1,R1 �MOV R0,R0,ASR#16 �SWI "Hourglass_Percentage" �LDR temp1,xd1 �MUL temp2,t1,temp1 �STR temp2,xf1 �LDR temp1,xd3 �MUL temp3,temp1,t1 �SUB temp1,temp3,temp2 �MOV temp1,temp1,ASR#8 �LDR temp2,xd2 �ADD temp1,temp1,temp2 �STR temp1,xf2 �LDR temp1,yd1 MUL temp2,t1,temp1 STR temp2,yf1 LDR temp1,yd3 &MUL temp3,temp1,t1 0SUB temp1,temp3,temp2 :MOV temp1,temp1,ASR#8 DLDR temp2,yd2 NADD temp1,temp1,temp2 XSTR temp1,yf2 bLDR temp1,sx lMUL temp2,temp1,t1 vMOV temp2,temp2,ASR#16 �STR temp2,spx � MOV t2,#0 � .loop2 �LDR temp1,xf2 �MOV R0,t2,ASR#4 �MUL temp2,temp1,R0 �MOV temp2,temp2,ASR#4 �LDR temp1,xf1 �ADD temp2,temp2,temp1 �LDR temp1,ox �ADD temp2,temp2,temp1 �MOV temp3,temp2,ASR#16 �LDR temp1,yf2 MUL temp2,temp1,R0 MOV temp2,temp2,ASR#4 LDR temp1,yf1 ADD temp2,temp2,temp1 *LDR temp1,oy 4ADD temp2,temp2,temp1 >MOV temp4,temp2,ASR#16 HLDR temp1,sy RMUL temp2,temp1,t2 \MOV spritey,temp2,ASR#16 fLDR spritex,spx pMOV R0,#512 zADD R0,R0,#43 �LDR sarea,isprite �LDR spointer,iaddr �SWI "OS_SpriteOp" � CMP R5,#0 �BEQ endloop �MOV R0,#512 �ADD R0,R0,#41 �SWI "OS_SpriteOp" �MOV R0,#512 �ADD R0,R0,#42 �LDR sarea,osprite �LDR spointer,oaddr �MOV spritex,temp3 MOV spritey,temp4 SWI "OS_SpriteOp" MOV R0,#512 $ADD R0,R0,#44 . MOV R5,#1 8SWI "OS_SpriteOp" B.endloop LLDR temp2,step2 VADD t2,t2,temp2 `CMP t2,#one16 j BLT loop2 tLDR temp1,step1 ~ADD t1,t1,temp1 �CMP t1,#one16 � BLT loop1 �MOV PC,R14 �.xd1:EQUD 0 �.xd2:EQUD 0 �.xd3:EQUD 0 �.ox:EQUD 0 �.yd1:EQUD 0 �.yd2:EQUD 0 �.yd3:EQUD 0 �.oy:EQUD 0 �.step1:EQUD 0 .step2:EQUD 0 .mask:EQUD 0 .xf1:EQUD 0 .xf2:EQUD 0 (.yf1:EQUD 0 2.yf2:EQUD 0 <.spx:EQUD 0 F.spy:EQUD 0 P.sx:EQUD 0 Z.sy:EQUD 0 d.isprite:EQUD 0 n.osprite:EQUD 0 x.iaddr:EQUD 0 �.oaddr:EQUD 0 �] � � pass �� � �#� ----WIMP Library routines---- � �%� �newspritearea(� sprite%,size%) �&� sprite%>-1 � �loseblock(sprite%) �sprite%=�getblock(size%+16) �� sprite%>-1 � �!sprite%=size%+16 �sprite%!4=0 sprite%!8=16 sprite%!12=16 � "� , 6 � ==== message routines ==== @ J� �poll(pollflags%) T+ș"Wimp_Poll",pollflags%,blk% � reason% ^Ȏ reason% � h � 0:�null r � 1:�redraw | � 2:�openwindow � � 3:�closewindow(!blk%) � � 4:� pointer leaving � � 5:� pointer entering �5 � 6:�click(!blk%,blk%!4,blk%!8,blk%!12,blk%!16) � � 7:�enddrag �+ � 8:�key(!blk%,blk%!4,blk%!8,blk%!24) � � 9:�menuselect � � 10:� scroll request � � 11:mycaret%=� � � 12:mycaret%=� �- � 17,18:�message(blk%!4,blk%!8,blk%!16) �� �� #� �message(task%,ref%,message%) 9� status%>0 � message%>=1 � message%<=7 � message%=-1 &Ȏ message% � 0 � 0 : �quit : � 1 D filetype%=blk%!40 N � �fileokay(filetype%) � X itrans%=0 b size%=blk%!36 l file$=�string(blk%+44) v1 blk%!20=�("FNtransblock"+�~(filetype%)) � blk%!24=size% � �reply(18,6) � � � � 2 �1 �save(dragid%,�string(blk%+44),prepared%) �? � saved% � �telltoload � �report("Could not save file") �+ � 3 : �load(�string(blk%+44),blk%!40) �+ � 5 : �load(�string(blk%+44),blk%!40) � � 6 � togo%=filesize%-otrans% �' � togo%>blk%!24 � togo%=blk%!24 �; � togo%+otrans%>filesize% � togo%=filesize%-otrans% �L ș"Wimp_TransferBlock",mytask%,savebuff%+otrans%,task%,blk%!20,togo% blk%!24=togo% �reply(18,7) otrans%+=togo% < � otrans%=filesize% � d%=�("FNsaved"+�~(misc%(id%))) * � 7 4 itrans%+=blk%!24 > � itrans%>=size%-16 � H( d%=�("FNloaded"+�~(filetype%)) R � \ blk%!20+=blk%!24 f blk%!24=size%-itrans% p �reply(18,6) z � � � 8 : �prequit �# � 10: �addtobootfile(blk%!20) � � &400C1 : �newmode �� �� � �� �reply(type%,blk%!16) �blk%!12=ref% �)ș"Wimp_SendMessage",type%,blk%,task% �� � �� �newmode �2!q%=11:q%!4=12:q%!8=4:q%!12=5:q%!16=3:q%!20=-1 !ș"OS_ReadVduVariables",q%,q% scx%=(!q%+1)<<(q%!8) scy%=(q%!4+1)<<(q%!12) $$pixelw%=1<<q%!8:pixelh%=1<<q%!12 .cols%=q%!16 8ș"Wimp_ReadPalette",,pal% B� L V� �prequit `� changed% � j �reply(17,8) t �closewindow(w%(main%)) ~� �� � �� �addtobootfile(handle%) ��#file,"Run "+dir$ �� � �� �telltoload ��mouseinfo �blk%!20=wind% �blk%!24=icon% �blk%!28=mx% �blk%!32=my% blk%!36=filesize% blk%!40=filetype% $(blk%+44)=filename$+�0 !blk%=(�$(blk%+44)+48)��3 (�reply(17,3) 2� < F.� �dropfile(filename$,filetype%,filesize%) P�mouseinfo Z blk%!12=0 d blk%!16=1 nblk%!20=wind% xblk%!24=icon% �blk%!28=mx% �blk%!32=my% �blk%!36=filesize% �blk%!40=filetype% �%$(blk%+44)=�lastbit(filename$)+�0 �!blk%=(�$(blk%+44)+48)��3 �0ș"Wimp_SendMessage",17,blk%,blk%!20,blk%!24 � otrans%=0 �� � �� - Sprite routines - � �� �loadsprites spritefile$=dir$+".Sprites" �fileinfo(spritefile$) � exist%=1 � "ssize%=filesize%+16 ,� sprites% ssize% 6!sprites%=ssize% @sprites%!4=0 Jsprites%!8=16 Tsprites%!12=16 ^/ș"OS_SpriteOp",10+256,sprites%,spritefile$ h� rsprites%=-1 |� �� �/� �putsprite(sprite%,sprite$,x%,y%,z1%,z2%) �5ș"OS_SpriteOp",24+256,sprite%,sprite$ � ,,saddr% �:ș"OS_SpriteOp",40+256,sprite%,sprite$ � ,,,,,,spmode% ��tables � � 8,0 �?ș"OS_SpriteOp",52+256,sprite%,sprite$,x%,y%,8,scale%,gcol% �� � � � �tables �dmode%=� �dpal%=�wpal(dmode%) �(!scale%=(1<<�modevar(spmode%,4))*z1% )scale%!4=(1<<�modevar(spmode%,5))*z1% scale%!8=pixelw%*z2% scale%!12=pixelh%*z2% &A� saddr%!32<>44 � spal%=�spritepalette � spal%=�wpal(spmode%) 0@ș"ColourTrans_SelectTable",spmode%,spal%,dmode%,dpal%,gcol% :� D N� �spritepalette Xcols%=�modevar(spmode%,3) b� cols%>15 � cols%=15 l� c%=0 � cols% v&sppal%!(c%<<2)=saddr%!(44+(c%<<3)) �� c% �=sppal% � �7� �copypalette(fsprite%,fsprite$,tsprite%,tsprite$) �7ș"OS_SpriteOp",24+256,fsprite%,fsprite$ � ,,faddr% �7ș"OS_SpriteOp",24+256,tsprite%,tsprite$ � ,,taddr% �� a%=44 � faddr%!32-4 � 4 � taddr%!a%=faddr%!a% �� a% �� � �� - file handling - � � �fileinfo(file$) -ș"OS_File",5,file$ � exist%,,,,filesize% � *� �filesize(file$) 4� exist%,filesize% >�fileinfo(file$) H=filesize% R \� �fileexist(file$) f� exist%,filesize% p�fileinfo(file$) z=exist% � �� �loadtemplate(title$) �Gș"Wimp_LoadTemplate",,blk%,ind%,indend%,fonttable%,title$ � ,,ind% �%� sprites%<>-1 � blk%!64=sprites% �'ș"Wimp_CreateWindow",,blk% � wind% � =wind% � �� �nameok(file$) � result%=� �9� �file$,":")+�file$,".")=0 � file$<>"<Wimp$Scrap>" � �8�report("To save, drag icon to a directory viewer.") � result%=� �� =result% � - menus - $ ."� �tickmenu(menu%,item%,tick%) 8p%=menu%+28+item%*24 B&� tick% � !p%=!p% �1 � !p%=!p% ��1 L� V `#� �menutitle(title$,� menuptr%) joldptr%=menuptr% t$menuptr%=title$ ~max%=�title$ �menuptr%!12=&70207 �menuptr%!20=44 �menuptr%!24=0 �menuptr%+=4 �� � �#� �menuitem(� text$,� menuptr%) �menuptr%+=24 �!menuptr%=0 �menuptr%!4=0 �word$=�nextword(text$) �token$=�token(word$) i1%=-1 ȕ token$<>"" Ȏ token$ � *� ">" : menuptr%!4=�(�nextword(text$)) (#� "/" : !menuptr%=!menuptr% � 1 2#� "-" : !menuptr%=!menuptr% � 2 < � "!" F !menuptr%=!menuptr% � 4 P valid$=�nextword(text$) Z � �valid$ � d � i1% �valid$+1 n $i1%=valid$ x � �� �token$=�token(word$) �� �menuptr%!8=(7<<24) � %10001 �"� !menuptr% � 4 � token$="#" � �.�inditem(�(�nextword(text$)),i1%,�(word$)) �� �� �word$<=12 � �$(menuptr%+12)=word$ �� �� i0% �word$+1 �$i0%=word$ ��inditem(i0%,-1,�word$+1) � � �word$>max% � max%=�word$ � "� , 6� �endmenu(� menuptr%) @!menuptr%=!menuptr% � &80 Jmenuptr%+=24 Toldptr%!16=max%*16+12 ^� h r� �menu(text$) |stext$=text$ �items%=0 �text$+="," �title$=�nextword(text$) ��menutitle(title$,menuptr%) �ȕ text$<>"" � items%+=1 ��menuitem(text$,menuptr%) �� ��endmenu(menuptr%) �=oldptr% � �� �inditem(i0%,i1%,i2%) � menuptr%!8=menuptr%!8 � 1<<8 menuptr%!12=i0% menuptr%!16=i1% menuptr%!20=i2% &1� i2%-1>max% � (!menuptr% � 4)=0 � max%=i2%-1 0� : D� �token(� word$) N token$="" X� �">/!#-",�word$)) � btoken$=�word$,1) lword$=�word$,�word$-1) v� �=token$ � �� �nextword(� text$) �� word$,pos% �pos%=�text$,",") �word$=�text$,pos%-1) �text$=�text$,pos%+1) � =word$ � �� �closemenu �ș"Wimp_CreateMenu",,-1 �� � !� - icons - ! !!� �shadeicon(!q%,q%!4,shade%) ! "� shade% � q%!8=1<<22 � q%!8=0 !*q%!12=1<<22 !4ș"Wimp_SetIconState",,q% !>� !H !R� �icontext(!q%,q%!4) !\ș"Wimp_GetIconState",,q% !f4� q%!24�(1<<8) � text$=$(q%!28) � text$=$(q%+28) !p =text$ !z !�� �iconval(!q%,q%!4) !�=�(�icontext(!q%,q%!4)) !� !�� �redoicon(!q%,q%!4) !�ș"Wimp_GetIconState",,q% !�3ș"Wimp_ForceRedraw",!q%,q%!8,q%!12,q%!16,q%!20 !�� !� !�� �deleteicon(!q%,q%!4) !�ș"Wimp_DeleteIcon",,q% !�� !� !�� �iconinfo(wind%,icon%) "!blk%=wind% "blk%!4=icon% "ș"Wimp_GetIconState",,blk% "$� ". "8� �selected(!q%,q%!4) "Bș"Wimp_GetIconState",,q% "L=(((q%!24)�(1<<21))>0) "V "`7� �cricon(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,$(q%+24)) "j#ș"Wimp_CreateIcon",,q% � icon% "t =icon% "~ "�� �buttype(!q%,q%!4) "�3� q%!4>=0 � ș"Wimp_GetIconState",,q% � q%!24=0 "�=((q%!24)>>12)�15 "� "�#� �selecticon(!q%,q%!4,select%) "�ș"Wimp_GetIconState",,q% "�#� select% � q%!8=1<<21 � q%!8=0 "�q%!12=1<<21 "�7� (q%!24 � q%!12)<>q%!8 � ș"Wimp_SetIconState",,q% "�� "� "�� �seticonfc(!q%,q%!4,col%) # ș"Wimp_GetIconState",,q% # q%!8=col%<<24 #q%!12=15<<24 #7� (q%!24 � q%!12)<>q%!8 � ș"Wimp_SetIconState",,q% #(� #2 #< � �seticonval(!q%,q%!4,val%) #F"�seticontext(!q%,q%!4,�(val%)) #P� #Z #d"� �seticontext(!q%,q%!4,text$) #nș"Wimp_GetIconState",,q% #xtext$=�text$,q%!36-1) #�� $(q%!28)<>text$ � #�$(q%!28)=text$ #� q%!8=0 #�q%!12=0 #�ș"Wimp_SetIconState",,q% #�� #�� #� #�� �icontp(!q%,q%!4) #�ș"Wimp_GetIconState",,q% #� =q%!28 #� #�� �startdrag(id%,icon%) $dragid%=id% $dragicon%=icon% $wind%=w%(dragid%) $"�windowinfo(wind%) $,!blk%=wind% $6blk%!4=icon% $@ș"Wimp_GetIconState",,blk% $J!blk%=0 $Tblk%!4=5 $^blk%!8+=wx% $hblk%!12+=wy% $rblk%!16+=wx% $|blk%!20+=wy% $� blk%!24=0 $� blk%!28=0 $�blk%!32=scx% $�blk%!36=scy% $� � drag% � $�Eș"DragASprite_Start",197,1,�icontext(wind%,icon%),blk%+8,blk%+24 $�� $�ș"Wimp_DragBox",,blk% $�� $�� $� $�� - user interogation - $� %� �check(message$) %ș"Wimp_DragBox",,0 % !q%=0 %&$(q%+4)=message$ %0Bș"Wimp_ReportError",q%,19,"Message from "+program$ � ,answer% %:� answer%=1 � =� � =� %D %N� �report(message$) %X%d%=�question(message$,"OK","","") %b� %l %v0� �question(ans$(0),ans$(1),ans$(2),ans$(3)) %� � status% %� status%=2 %��closemenu %�� i%=0 � 3 %� � ans$(i%)="" � %�# �removeicon(w%(report%),i%) %� � %�# �reiniticon(w%(report%),i%) %�- �seticontext(w%(report%),i%,ans$(i%)) %� � %�� i% %��losecaret %��openincentre(w%(report%)) &� beep% � � 7 & answer%=0 &� & $ ș"Wimp_Poll",1,blk% � reason% &* Ȏ reason% � &4 � 1:�redraw &>@ � 6:� blk%!12=w%(report%) � blk%!16>-1 � answer%=blk%!16 &H/ � 17,18:�message(blk%!4,blk%!8,blk%!16) &R � &\ � answer% &f�closewindow(w%(report%)) &p=answer% &z &�� - misc - &� &�� �quit &��closedown &�� &� &�� �closedown &��resetslot &�� i%=1 � 255 &�ȕ fonttable%?i% &�ș"Font_LoseFont",i% &�fonttable%?i%-=1 &�� '� i% 'ș"Wimp_CloseDown",mytask% '� '$� '. '8� �modevar(mode%,var%) 'B/ș"OS_ReadModeVariable",mode%,var% � ,,val% 'L =val% 'V '`� �setfontcolours 'jȎ cols% � 't* � 1 : ș"Font_SetFontColours",,0,1,0 '~* � 3 : ș"Font_SetFontColours",,0,1,2 '�+ � 15 : ș"Font_SetFontColours",,0,1,6 '�: � 15 : ș"Font_SetFontColours",,0,1,14,!pal%,pal%!28 '�� '�� '� '�� �string(b%) '�� s$ '� s$="" '� ȕ ?b%>31 '�s$+=�(?b%) '� b%+=1 '�� ( =s$ ( (� - windows - ( ((1� �setwindowextent(wind%,!q%,q%!4,q%!8,q%!12) (2ș"Wimp_SetExtent",wind%,q% (<� (F (P� �openincentre(!blk%) (Z!ș"Wimp_GetWindowState",,blk% (dm1%=blk%!12-blk%!4 (nm2%=blk%!16-blk%!8 (xblk%!4=(scx%-m1%)>>1 (�blk%!8=(scy%-m2%)>>1 (�blk%!12=(scx%+m1%)>>1 (�blk%!16=(scy%+m2%)>>1 (�blk%!28=-1 (��openwindow (�� (� (�� �newtitle(!blk%,title$) (� ș"Wimp_GetWindowInfo",,blk% (�� $(blk%!76)<>title$ � (�$(blk%!76)=title$ (�� active%(�id(!blk%)) � (�% ș"Wimp_GetWindowOutline",,blk% )? ș"Wimp_ForceRedraw",-1,blk%!4,blk%!16-44,blk%!12,blk%!16 )� )� )"� ), )6� �forceredraw(!blk%) )@ ș"Wimp_GetWindowInfo",,blk% )J>ș"Wimp_ForceRedraw",!blk%,blk%!44,blk%!48,blk%!52,blk%!56 )T� )^ )h� �updatewindow(!blk%) )r ș"Wimp_GetWindowInfo",,blk% )|blk%!4=blk%!44 )�blk%!8=blk%!48 )�blk%!12=blk%!52 )�blk%!16=blk%!56 )�'ș"Wimp_UpdateWindow",,blk% � more% )�� )� )�� �openfully(!blk%,top%) )� ș"Wimp_GetWindowInfo",,blk% )�$blk%!12=blk%!4+(blk%!52-blk%!44) )�$blk%!8=blk%!16-(blk%!56-blk%!48) )�� top% � blk%!28=-1 )��openwindow )�� * *� �closewindow(wind%) *� cid%,close% *&cid%=�id(wind%) *0B� sysflags%(cid%)�2 � close%=�("FNclose"+id$(cid%)) � close%=� *:� close% � *D active%(cid%)=� *N! �quickclosewindow(w%(cid%)) *X� *b� *l *v� �quickclosewindow(!q%) *�ș"Wimp_CloseWindow",,q% *�� *� *�� �reopen(!blk%) *�!ș"Wimp_GetWindowState",,blk% *��openwindow *��forceredraw(!blk%) *�� *� *�� �windowinfo(wind%) *�!blk%=wind% *� ș"Wimp_GetWindowInfo",,blk% *�wx%=blk%!4-blk%!20 +wy%=blk%!16-blk%!24 +ww%=blk%!12-blk%!4 +wh%=blk%!16-blk%!8 + � +* +4#� �savebox(filetype%,standard$) +>$wind%=�window("save","save",0,0) +H<�seticontext(w%(wind%),3,"file_"+�"00"+�~(filetype%),3)) +R'�seticontext(w%(wind%),1,standard$) +\misc%(wind%)=filetype% +f =wind% +p +z� �lastbit(file$) +�ȕ �file$,".") +�file$=�file$,�file$,".")+1) +�� +� =file$ +� +�� �mouseinfo +�ș"Wimp_GetPointerInfo",,q% +�mx%=!q% +�my%=q%!4 +� but%=q%!8 +�wind%=q%!12 +�icon%=q%!16 +�� , ,#� �setfiletype(file$,filetype%) ,#ș"OS_File",&12,file$,filetype% ,$� ,. ,8$� �shademenu(menu%,item%,shade%) ,Bp%=menu%+36+item%*24 ,L!p%=!p% ��(1<<22) ,V� shade% � !p%=!p% �(1<<22) ,`� ,j ,t� �getcaret ,~!ș"Wimp_GetCaretPosition",,q% ,�cwind%=!q% ,�cicon%=q%!4 ,�cxoff%=q%!8 ,�cyoff%=q%!12 ,�cheight%=q%!16 ,�cindex%=q%!20 ,�� ,� ,�#� �putcaret(wind%,icon%,index%) ,� len%=��icontext(wind%,icon%) ,�� index%>len% � index%=len% ,�5ș"Wimp_SetCaretPosition",wind%,icon%,,,-1,index% - � - -� �resetcaret(wind%,icon%) -!ș"Wimp_GetCaretPosition",,q% -( � (!q%=wind% � q%!4=icon%) � -2 index%=q%!20 -<" len%=��icontext(wind%,icon%) -F! � index%>len% � index%=len% -P7 ș"Wimp_SetCaretPosition",wind%,icon%,,,-1,index% -Z� -dI� wind%=0 � ș"Wimp_SetCaretPosition",!q%,q%!4,q%!8,q%!12,q%!16,q%!20 -n� -x -�� �losecaret -�-� mycaret% � ș"Wimp_SetCaretPosition",-1 -�� -� -�� �flashicon(!q%,q%!4) -�� f%=1 � 3 -� Ȗ:Ȗ -��selecticon(!q%,q%!4,�) -� Ȗ:Ȗ -��selecticon(!q%,q%!4,�) -�� f% -�� -� .#� �openiconmenu(!q%,q%!4,wind%) .openmenu%=wind% .ș"Wimp_GetIconState",,q% ."menux%=q%!16 .,menuy%=q%!20 .6�windowinfo(!q%) .@menux%+=wx% .Jmenuy%+=wy% .T0ș"Wimp_CreateMenu",,openmenu%,menux%,menuy% .^� .h .r"� �infowindow(i1$,i2$,i3$,i4$) .| wind%=�window("info","",0,0) .�!�seticontext(w%(wind%),1,i1$) .�!�seticontext(w%(wind%),2,i2$) .�!�seticontext(w%(wind%),3,i3$) .�!�seticontext(w%(wind%),4,i4$) .� =wind% .� .�/� �wimpinit(name$,sprite$,work$,no%,isize%) .�changed%=� .�ș"OS_GetEnv" � autoload$ .�=autoload$=�autoload$,�autoload$,�34,�autoload$,�34)+1)+2) .� status%=0 .�mycaret%=� .�windows%=no%+3 /program$=name$ /+� blk% 2000,q% 256,ind% isize%,pal% 256 /indend%=ind%+isize% /&$blk%="TASK" /05ș"Wimp_Initialise",200,!blk%,program$ � ,mytask% /:0iconbar%=�cricon(-1,0,0,68,68,&2002,sprite$) /D$q%=work$+"$Dir" /N.ș"OS_ReadVarVal",q%,blk%,256,0,3 � ,,len% /Xblk%?len%=13 /bdir$=$blk% /l=ș"XOS_SWINumberFromString",,"DragASprite_Start" � ;drag% /vdrag%=(drag% � 1)=0 /�ș"OS_Byte",161,28 � ,,bit% /�� (bit% � 2)=0 � drag%=� /�&ș"Wimp_SlotSize",-1,-1 � appsize% /��loadsprites /� tft%=&FFF /� dft%=&AFF /� sft%=&FF9 /� exit=� /�=� gcol% 256,pal% 80,pal2% 80,pal4% 80,sppal% 80,scale% 16 /�� i%=0 � 1 /�& pal2%!(4*(1-i%))=(&F0F0F0*i%)<<8 /�� i% /�� i%=0 � 3 0& pal4%!(4*(3-i%))=(&505050*i%)<<8 0� i% 0�newmode 0 %� menubuffer% 2000,fonttable% 256 0*twind%=0 04{� w%(windows%),menu%(windows%),id$(windows%),misc%(windows%),active%(windows%),default%(5,windows%),sysflags%(windows%) 0>menuptr%=menubuffer% 0H� i%=1 � 255 0Rfonttable%?i%=0 0\� i% 0fw%(0)=-2:id$(0)="iconbar" 0p,ș"Wimp_OpenTemplate",,dir$+".Templates" 0z�initwindows 0�*report%=�window("report","report",0,0) 0�ș"Wimp_CloseTemplate" 0� � ans$(3) 0�beep%=� 0�� 0� 0�!� ==== memory management ==== 0� 0�� �space(size%) 0�7ș"XWimp_SlotSize",appsize%+size%,-1 � new%;noroom% 0�room%=((noroom%�1)=0) 0�#� new%<appsize%+size% � room%=� 0�#� room% � appinc%=new%-appsize% 1 =room% 1 1� �initheap 1$heap%=� 1.heapsize%=8*1024 18� �space(heapsize%) � 1B$ ș"OS_Heap",0,heap%,,heapsize% 1L� 1V �error("Out of room.") 1`� 1j� 1t 1~� �largestblock 1�$ș"OS_Heap",1,heap% � ,,largest% 1� =largest% 1� 1�� �getblock(size%) 1� � ok% 1� ok%=� 1� ȕ ok% � �largestblock<size% 1� ok%=�extendheap(8*1024) 1�� 1�� ok% � 1�+ ș"OS_Heap",2,heap%,,size% � ,,block% 1�� 2 block%=-1 2 � 2=block% 2 2(� �loseblock(� block%) 22,� block%>-1 � ș"OS_Heap",3,heap%,block% 2< block%=-1 2F�shrinkheap 2P� 2Z 2d� �shrinkheap 2n� ok%,size% 2x ok%=� 2�size%=-1024 2� ȕ ok% 2�( ș"XOS_Heap",5,heap%,,size% � ;ok% 2� ok%=((ok%�1)=0) 2� � ok% � 2� heapsize%=heap%!12 2� ok%=�space(heapsize%) 2� � 2�� 2�� 2� 2�� �extendheap(size%) 2� � ok% 3ok%=�space(heapsize%+size%) 3� ok% � 3 ș"OS_Heap",5,heap%,,size% 3" heapsize%=heap%!12 3,� 36=ok% 3@ 3J� �resetslot 3T!ș"Wimp_SlotSize",appsize%,-1 3^ appinc%=0 3h� 3r 3|&� ==== filing system routines ==== 3� 3�� �standardfilename(wind%) 3�=�icontext(wind%,1) 3� 3� � �save(id%,file$,prepared%) 3�filename$=file$ 3�saved%=� 3�� �nameok(filename$) � 3�;� prepared%=� � prepared%=�("FNprepare"+�~(misc%(id%))) 3�Ȏ prepared% � 3� � -1 3�J ș"OS_File",10,filename$,misc%(id%),,savebuff%,savebuff%+filesize% 3�& d%=�("FNsaved"+�~(misc%(id%))) 4 � -2 4% d%=�("FNsave"+�~(misc%(id%))) 4� 4&�closemenu 40%�seticontext(w%(id%),2,filename$) 4:saved%=� 4D� 4N� 4X� 4b 4l� ==== menu routines ==== 4v 4� � �openwindowasmenu(window%) 4��windowinfo(window%) 4��mouseinfo 4�menux%=mx%-ww%/2 4�menuy%=my%+wh%/2 4�openmenu%=window% 4�id%=�id(window%) 4��reopenmenu 4�� 4� 4�� �iconbarmenu(text$) 4�menu%(0)=�menu(text$) 4�barheight%=items%*44+96 5� 5 5� �menuselect 5 d%=�("FNmenu"+id$(menuid%)) 5*�mouseinfo 54� but%=1 � �reopenmenu 5>� 5H 5R� �reopenmenu 5\3� sysflags%(id%)�4 � d%=�("FNpremenu"+id$(id%)) 5f0ș"Wimp_CreateMenu",,openmenu%,menux%,menuy% 5p� 5z 5�� �openmenu(id%) 5�� menu%(id%) � 5�menuid%=id% 5�openmenu%=menu%(id%) 5�,� id%=0 � menuy%=barheight% � menuy%=my% 5�"menux%=mx%-(openmenu%!16)/2-16 5��reopenmenu 5�� 5�� 5� 5�� ==== window routines ==== 5� 5�'� �window(wind$,name$,menu%,flags%) 6 twind%+=1 6#w%(twind%)=�loadtemplate(wind$) 6�windowinfo(w%(twind%)) 6$� d%=0 � 5 6.)default%(d%,twind%)=!(blk%+(d%<<2)+4) 68� d% 6Bid$(twind%)=name$ 6Lmenu%(twind%)=menu% 6Vsysflags%(twind%)=flags% 6`=twind% 6j 6t � �redraw 6~id%=�id(!blk%) 6��windowinfo(!blk%) 6�'ș"Wimp_RedrawWindow",,blk% � more% 6�ȕ more% 6�x0%=blk%!28-wx% 6�y0%=blk%!32-wy% 6�x1%=blk%!36-wx% 6�y1%=blk%!40-wy% 6�d%=�("FNredraw"+id$(id%)) 6�'ș"Wimp_GetRectangle",,blk% � more% 6�� 6�� 6� 7 � �id(find%) 7 found%=windows% 7� i%=0 � windows% 7� w%(i%)=find% � found%=i% 7(� i% 72=found% 7< 7F� �openup(wind%) 7P!blk%=wind% 7Zid%=�id(wind%) 7d� �active%(id%) � 7n� d%=0 � 5 7x&!(blk%+(d%<<2)+4)=default%(d%,id%) 7�� d% 7�� 7�!ș"Wimp_GetWindowState",,blk% 7�� 7�blk%!28=-1 7��openwindow 7�� 7� 7�� �openwindow 7�id%=�id(!blk%) 7�ș"Wimp_OpenWindow",,blk% 7�active%(id%)=� 7�0� sysflags%(id%)�1 � d%=�("FNopen"+id$(id%)) 8� 8 8� �frontopenwindow(!blk%) 8"!ș"Wimp_GetWindowState",,blk% 8,blk%!28=-1 86�openwindow 8@� 8J 8T%� �redobox(wind%,x0%,y0%,x1%,y1%) 8^� x1%<x0% � Ȕ x0%,x1% 8h� y1%<y0% � Ȕ y0%,y1% 8r.ș"Wimp_ForceRedraw",wind%,x0%,y0%,x1%,y1% 8|� 8� 8�� �deletewindow(� !q%) 8�ș"Wimp_DeleteWindow",,q% 8� !q%=0 8�� 8� 8�� ==== icon routines ==== 8� 8�&� �click(mx%,my%,but%,wind%,icon%) 8�7� �buttype(wind%,icon%)=9 � �flashicon(wind%,icon%) 8�id%=�id(wind%) 8� Ȏ but% � 8�� 64 9" Ȏ �buttype(w%(id%),icon%) � 9- � 6,7,8,10,14 : �startdrag(id%,icon%) 9 � 9&� 2 : �openmenu(id%) 90 9:d%=�("FNclick"+id$(id%)) 9D� 9N� 9X 9b� �enddrag 9l�mouseinfo 9v"� drag% � ș"DragASprite_Stop" 9�d%=�("FNdrop"+id$(dragid%)) 9�� 9� 9�L� �startdragbox(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,q%!24,q%!28,q%!32,q%!36) 9�ș"Wimp_DragBox",,q% 9�� 9� 9�"� �key(wind%,icon%,xpos%,key%) 9�$taken=�("FNkey"+id$(�id(wind%))) 9�(� taken=� � ș"Wimp_ProcessKey",key% 9�� 9� 9�(� �incicon(iicon%,dec%,inc%,lb%,ub%) : change%=� :� icon%=dec% � icon%=inc% � :!val%=��icontext(wind%,iicon%) : val%+=(icon%=dec%)*2+1 :*1� val%>ub% � val%=ub% � � val%<lb% � val%=lb% :4&�seticontext(wind%,iicon%,�(val%)) :>�resetcaret(wind%,iicon%) :H change%=� :R� :\� :f=change% :p :z� �removeicon(!q%,q%!4) :�q%!8=(1<<24) :�)q%!12=(1<<2)�(1<<5)�(15<<24)�(15<<12) :�ș"Wimp_SetIconState",,q% :�� :� :�� �reiniticon(!q%,q%!4) :�&q%!8=(1<<2)�(1<<5)�(7<<24)�(3<<12) :�)q%!12=(1<<2)�(1<<5)�(15<<12)�(15<<24) :�ș"Wimp_SetIconState",,q% :�� :� :�� �iconkeys(data%) :�taken=� ;icons%=0 ;ȕ data%?icons%<255 ; icons%+=1 ;$� ;. icons%-=1 ;8 found%=-1 ;B� p%=0 � icons% ;L" � data%?p%=icon% � found%=p% ;V� p% ;`newicon%=-1 ;j� found%>=0 � ;t Ȏ key% � ;~ � 13 : newicon%=found%+1 ;�4 � &18E : � found%<icons% � newicon%=found%+1 ;�/ � &18F : � found%>0 � newicon%=found%-1 ;�* � &19E,&1AE,&1BE : newicon%=icons% ;�% � &19F,&1AF,&1BF : newicon%=0 ;� ;� taken=� ;� � ;�� ;�,� newicon%>icons% � taken=-2:newicon%=-1 ;�� newicon%>=0 � ;� �getcaret ;�- �putcaret(wind%,data%?newicon%,cindex%) <