Home » Archimedes archive » Archimedes World » AW-1992-10.adf » AWOct92 » !AWOct92/Goodies/JigWord/!JigWord/!RunImage
!AWOct92/Goodies/JigWord/!JigWord/!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 » Archimedes World » AW-1992-10.adf » AWOct92 |
| Filename: | !AWOct92/Goodies/JigWord/!JigWord/!RunImage |
| Read OK: | ✔ |
| File size: | 9D8C bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM >!RunImage
20REM Remember to test if CreateMenu reports an error abt indirected data
30REM Remember to do PROCDeleteMStruct for all those difficult windows
40ON ERROR MODE 0:SYS "Wimp_CloseDown":PRINT REPORT$;" at line ";ERL:END
50:
60SYS "Wimp_Initialise",200,&4B534154,"JigWord" TO ,task%
70:
80PROCInitialise
90A%=hilitecol%:CALL ChangeHiCol
100PROCCreateIcon(0)
110:
120PROCCreateWindow(1)
130:
140quit%=FALSE:menus%=-1:menuw%=-1:mask%=1
150REPEAT
160 ON ERROR LOCAL PROCError1st
170 SYS "Wimp_Poll",mask%,b% TO p%
180 CASE p% OF
190 WHEN 0:REMPROCCycle
200 WHEN 1:PROCP_1(b%)
210 WHEN 2:SYS "Wimp_OpenWindow",,b%
220 WHEN 3:PROCP_3(b%)
230 WHEN 6:PROCP_6(b%)
240 WHEN 8:PROCP_8(b%)
250 WHEN 9:PROCP_9(b%)
260 WHEN 17,18:PROCReceive(b%)
270 ENDCASE
280UNTIL quit%
290SYS "Wimp_CloseDown",task%,&4B534154
300END
310:
320 "Oh no! An error, this can't be!"
330 'Sorry, but it's worse than that.'
340 "Worse? It, it, it's not a fatal error, is it?"
350 'That just about sums it up. Sorry'
360 "Arghhhh!"
370:
380DEF PROCError1st
390!error%=ERR
400$(error%+4)=REPORT$+" at line "+STR$(ERL)
410SYS "Wimp_ReportError",error%,,"JigWord"
420SYS "Wimp_CloseDown"
430END
440ENDPROC
450:
460 "Stop messing with my mind you little horrors!"
470
480 'But it's our job. Don't think of us as an error,
490 more as messages from RISCOS - postcards from
500 ROM.'
510
520 "ROM, ROM? Isn't that where the volcano appeared and
530 wiped out hundreds of innocent programmers? I saw that
540 video last night."
550
560 'You really do have problems. I don't think your
570 sliced loaf goes right to the crust.'
580
590 "And your disc drive head doesn't go to the last track."
600
610 'Touchy touchy, aren't we. Well, onto the next
620 procedure.'
630:
640DEF PROCError2nd(err%)
650!error%=err%
660$(error%+4)=error$(err%)
670SYS "Wimp_ReportError",error%,,"JigWord"
680ENDPROC
690:
700 "Noooooooo!"
710 'Don't worry about it. Relax.'
720 "Arghhhhhh!"
730 'It's only another type of fatal internal error.'
740
750 'And stop dribbling!'
760:
770DEF PROCError3rd
780!error%=0
790$(error%+4)=err$
800SYS "Wimp_ReportError",error%,,"JigWord"
810SYS "Wimp_CloseDown"
820END
830ENDPROC
840:
850 "?"
860
870 'That's it, take him away lads. Into the
880 land of eternal internal error.'
890
900 "?"
910
920 'Take him to room 101.'
930
940 "What, what's in room 101?"
950
960 'You know what is in room 101. Everyone
970 knows what is in room 101'
980
990 "Arghhhhh!"
1000:
1010DEF PROCErrorPrint1st
1020!error%=ERR
1030$(error%+4)=REPORT$+" at line "+STR$(ERL)
1040SYS "Wimp_ReportError",error%,,"JigWord"
1050REM 'Snigger snigger.'
1060ENDPROC
1070:
1080DEF PROCInitialise
1090hilitecol%=9
1100print$="printer:"
1110pwidth%=80
1120:
1130DIM b% 256
1140DIM b2% 256
1150DIM code% 4096
1160:
1170DIM creates% 7*1024
1180cjiglen%=8192:cscratlen%=512
1190DIM cjigst% cjiglen%,cscratst% cscratlen%
1200:
1210SYS "OS_ReadVarVal","JigWord$Dir",b%,255,0,0 TO ,,l%
1220b%?l%=&0D
1230path$=$b%
1240h%=OPENIN(path$+".Words")
1250wordlen%=(BGET#h%)+((BGET#h%)<<8)+((BGET#h%)<<16)+((BGET#h%)<<24)
1260CLOSE#h%
1270DIM wordst% wordlen%
1280OSCLI "Load "+path$+".Words 10_"+STR$(wordst%)
1290:
1300OSCLI "Load "+path$+".CreateO 10_"+STR$(creates%)
1310result%=creates%
1320changejig%=creates%+creates%!4
1330cwordst%=creates%+creates%!8
1340csize%=creates%+creates%!12
1350changecscrat%=creates%+creates%!16
1360cpuzzarea%=creates%+creates%!20
1370cinitvar%=creates%+creates%!24
1380createjig%=creates%+creates%!28
1390crand%=creates%+creates%!32
1400A%=RND(-TIME):A%=RND:CALL crand%
1410A%=cjigst%:B%=cjiglen%:CALL changejig%
1420A%=wordst%:CALL cwordst%
1430A%=cscratst%:B%=cscratlen%:CALL changecscrat%
1440:
1450DIM dispjigst% 6144
1460OSCLI "Load "+path$+".JigDispO 10_"+STR$(dispjigst%)
1470ChangeHiCol=dispjigst%+dispjigst%!00
1480puzzshuffle=dispjigst%+dispjigst%!04
1490puzzselect=dispjigst%+dispjigst%!08
1500HFit=dispjigst%+dispjigst%!12
1510VFit=dispjigst%+dispjigst%!16
1520ChangeJig=dispjigst%+dispjigst%!20
1530ChangeSel=dispjigst%+dispjigst%!24
1540CreateHeap=dispjigst%+dispjigst%!28
1550Gridsetc=dispjigst%+dispjigst%!32
1560Word=dispjigst%+dispjigst%!36
1570puzzshflags1=dispjigst%+dispjigst%!40
1580nextpuzzst=dispjigst%+dispjigst%!44
1590selh=dispjigst%+dispjigst%!48
1600selv=dispjigst%+dispjigst%!52
1610fit=dispjigst%+dispjigst%!56
1620hlen=dispjigst%+dispjigst%!60
1630vlen=dispjigst%+dispjigst%!64
1640ChangeBckGndCol=dispjigst%+dispjigst%!68
1650:
1660err%=FALSE:err$=""
1670DIM error$(10),error% 256
1680FOR a%=0 TO 8
1690 READ error$(a%)
1700NEXT
1710:
1720maxpuzz%=10
1730DIM puzzst% 32*1024,puzzin%(maxpuzz%),pinfo%(maxpuzz%,10)
1740DIM puzzim% 1024
1750puzzend%=puzzst%+32*1024
1760nxtpuzzst%=puzzst%
1770DIM pfree%(maxpuzz%)
1780:
1790DIM scratch% 4096
1800:
1810maxpword%=10
1820DIM pword%(maxpword%,5),pwuse%(maxpword%)
1830:
1840DIM create%(10)
1850:
1860DIM sprarea%(4):REM sprite area addresses, 0 is Wimp area
1870sprarea%(0)=1
1880:
1890numicon%=75:nexticon%=0
1900DIM icon%(numicon%,9),icon$(numicon%,1)
1910DIM iconst% 64
1920PROCReadIconData
1930pwordiconst%=nexticon%
1940nexticon%+=(maxpword%+1)*3
1950:
1960nummenu%=10:nextmenu%=0:maxitem%=9
1970DIM item%(nummenu%,maxitem%,4),item$(nummenu%,maxitem%,1)
1980DIM menu%(nummenu%,1),menu$(nummenu%)
1990DIM menust% 1024,menuin%(nummenu%)
2000nxtmenust%=menust%:menuend%=menust%+1024:nextmenu%=0
2010PROCReadMenuData
2020:
2030numms%=10:REM number menu structures
2040DIM mstructst% 1023,mstructin%(numms%)
2050nxtmstruct%=mstructst%:mstructend%=mstructst%+1024
2060PROCReadMStructData
2070:
2080numdat%=200
2090DIM indata% 1024,data%(numdat%,3)
2100dataend%=indata%+1024
2110nextdat%=0:nextdatst%=indata%
2120REM indirected data
2130REM data%(item num,[data start,length,validation{-1},length{-1}]
2140:
2150nextwpos%=0:REM incremented to allow windows to open at offsets
2160numwind%=15
2170DIM wind%(numwind%,20),wind$(numwind%),wuse%(numwind%)
2180DIM wbuff% 512
2190PROCReadWindowData
2200ENDPROC
2210:
2220 Anyone wanting to know how the puzzles are
2230 created, tough! It's all in machine code. And so
2240 is the display code.
2250:
2260DEF PROCInitialiseDispFile(p%)
2270pinfo%(p%,0)=nxtpuzzst%!4
2280pinfo%(p%,1)=nxtpuzzst%!8
2290pinfo%(p%,2)=FNPNumOfWords(nxtpuzzst%)
2300pinfo%(p%,3)=0
2310pinfo%(p%,4)=0
2320pinfo%(p%,5)=-1
2330pinfo%(p%,6)=-1
2340pinfo%(p%,7)=-1
2350pinfo%(p%,8)=0
2360pinfo%(p%,9)=0
2370pinfo%(p%,10)=0
2380pfree%(p%)=-1
2390puzzin%(p%)=nxtpuzzst%
2400nxtpuzzst%+=!nxtpuzzst%
2410ENDPROC
2420:
2430DEF PROCReadIconData
2440LOCAL a%,b%,n%
2450RESTORE 4140
2460READ n%
2470FOR a%=0 TO n%-1
2480 FOR b%=0 TO 9
2490 READ icon%(a%,b%)
2500 IF icon%(a%,6)=4 THEN icon%(a%,6)=1
2510 NEXT
2520 READ icon$(a%,0),icon$(a%,1)
2530 PROCCheckIconData(a%,icon%(a%,8),icon$(a%,0),icon$(a%,1),icon%(a%,4))
2540 IF err% THEN PROCError3rd
2550NEXT
2560nexticon%=n%
2570ENDPROC
2580DEF PROCCheckIconData(i%,l%,a$,b$,f%)
2590CASE icon%(a%,6) OF
2600 WHEN 0:
2610 IF LEN(a$)>12 OR (f% AND %1)<>%1 OR (f% AND 256)=256 THEN
2620 err%=TRUE:err$="Icon "+STR$(i%)+" is invalid (0)"
2630 ENDPROC
2640 ENDIF
2650 WHEN 1:
2660 IF LEN(a$)+1>l% OR (f% AND %1)<>%1 OR (f% AND 256)=0 THEN
2670 err%=TRUE:err$="Icon "+STR$(i%)+" is invalid (1)"
2680 ENDPROC
2690 ENDIF
2700 WHEN 2:
2710 IF LEN(a$)>12 OR (f% AND %10)<>%10 OR (f% AND 256)=256 THEN
2720 err%=TRUE:err$="Icon "+STR$(i%)+" is invalid (2)"
2730 ENDPROC
2740 ENDIF
2750 WHEN 3:
2760 IF LEN(a$)+1>l% OR b$="" OR (f% AND %10)=0 OR (f% AND 256)=0 THEN
2770 err%=TRUE:err$="Icon "+STR$(i%)+" is invalid (3)"
2780 ENDPROC
2790 ENDIF
2800 WHEN 4:
2810 err%=TRUE:err$="Icon "+STR$(i%)+" has type 4, please use type 1"
2820 OTHERWISE
2830 err%=TRUE:err$="Icon "+STR$(i%)+" has an unknown type"
2840 ENDPROC
2850ENDCASE
2860ENDPROC
2870:
2880DEF PROCReadMenuData
2890LOCAL a%,n%,b%
2900RESTORE 3950
2910READ n%
2920FOR a%=0 TO n%-1
2930 READ menu$(a%)
2940 READ menu%(a%,0),menu%(a%,1)
2950 FOR b%=0 TO menu%(a%,1)-1
2960 READ item%(a%,b%,0),item%(a%,b%,1),item%(a%,b%,2),item%(a%,b%,3)
2970 READ item%(a%,b%,4)
2980 READ item$(a%,b%,0),item$(a%,b%,1)
2990 NEXT
3000 PROCCheckMenuData(a%)
3010 IF err% THEN PROCError3rd
3020NEXT
3030ENDPROC
3040DEF PROCCheckMenuData(m%)
3050LOCAL b%,f%
3060IF LEN(menu$(m%))>12 THEN
3070 err$="Menu "+STR$(a%)+" title too long"
3080 err%=TRUE
3090 ENDPROC
3100ENDIF
3110FOR b%=0 TO menu%(m%,1)-1
3120 f%=item%(m%,b%,3)
3130 IF (f% AND %100001)<>%10001 AND f%<>0 THEN
3140 err$="Menu "+STR$(m%)+" item "+STR$(b%)+" icon flags should be %100001"
3150 err%=TRUE
3160 ENDPROC
3170 ENDIF
3180 IF LEN(item$(m%,b%,0))>12 AND (f% AND 256)=0 THEN
3190 err$="Menu "+STR$(m%)+" item "+STR$(b%)+" should be indirected"
3200 err%=TRUE
3210 ENDPROC
3220 ENDIF
3230 IF (f% AND 256)=256 AND LEN(item$(m%,b%,0))+1<item%(m%,b%,4) THEN
3240 err$="Menu "+STR$(m%)+" item "+STR$(b%)+" should is a mess"
3250 err%=TRUE
3260 ENDPROC
3270 ENDIF
3280NEXT
3290ENDPROC
3300:
3310DEF PROCReadMStructData
3320LOCAL a%,n%,o%,addr%,d%
3330RESTORE 4750
3340READ n%
3350addr%=nxtmstruct%
3360FOR a%=0 TO n%-1
3370 mstructin%(a%)=addr%
3380 REPEAT
3390 READ d%
3400 !addr%=d%
3410 addr%+=4
3420 UNTIL d%=-1
3430NEXT
3440nstmstruct%=addr%
3450ENDPROC
3460:
3470DEF PROCReadWindowData
3480LOCAL a%,n%,b%
3490RESTORE 3720
3500READ n%
3510FOR a%=0 TO n%-1
3520 READ wind$(a%)
3530 FOR b%=0 TO 20
3540 READ wind%(a%,b%)
3550 NEXT
3560 wuse%(a%)=-1
3570NEXT
3580ENDPROC
3590:
3600REM If you get the first message, congratulations! It took me forever.
3610:
3620DATA "Not enough indirected data workspace, tell a competent programmer"
3630DATA "Minimum width is 30"
3640DATA "Minimum height is 15"
3650DATA "Too many puzzles"
3660DATA "Not enough room for puzzle"
3670DATA "Not enough workspace to open window"
3680DATA "Only 5 views of a puzzle allowed"
3690DATA "Maximum width is 99"
3700DATA "Maximum height is 99"
3710REM Actually 255*255 is the biggest size. But also impossible
3720:
3730REM Windows
3740DATA 3
3750DATA About this program
3760DATA -1,-1, 0,0,604,212, 0,0
3770DATA 0,-212,604,0, 0,0
3780DATA %10010+(132<<24)
3790DATA 1
3800DATA 1,8,-1,0,0
3810
3820DATA "JigWord Creation"
3830DATA -1,-1, 200,200,456,800, 0,0
3840DATA 0,-256,0,0, 0,200
3850DATA %10010+(135<<24)+(1<<12)
3860DATA 1,9,6,-1,3,0
3870
3880DATA "About this Puzzle"
3890DATA -1,-1,0,0,332,160, 0,0
3900DATA 0,-160,332,0, 0,0
3910DATA %10010+(132<<24)
3920DATA 1
3930DATA 15,6,-1,0,0
3940:
3950:
3960REM Menus
3970DATA 3
3980DATA JigWord,72,2
3990DATA -1,%0000,0,0,0,Info,
4000DATA -1,%10000000,-1,0,0,Quit,
4010
4020DATA JigWord,136,5
4030DATA -1,%0000,2,0,0,Info,
4040DATA -1,%0000,-1,0,0,Cheat,
4050DATA -1,%0000,-1,0,0,Words,
4060DATA -1,%0000,-1,0,0,New View,
4070DATA -1,%10000000,-1,0,0,Print,
4080:
4090DATA Words,136,2
4100DATA -1,%0000,-1,0,0,New View,
4110DATA -1,%10000000,-1,0,0,Print,
4120:
4130:
4140:
4150REM Icons
4160DATA 21
4170DATA 0,0,68,68,(3<<12)+%10
4180DATA -1,2,-1,9,-1
4190DATA "!jigword",
4200
4210DATA 20,-48,156,-8,%1000010001+(7<<24)+(2<<28)
4220DATA 0,0,-1,8,-1,"Name:",
4230DATA 20,-100,156,-60,%1000010001+(7<<24)+(2<<28)
4240DATA 0,0,-1,8,-1,"Purpose:",
4250DATA 20,-152,156,-112,%1000010001+(7<<24)+(2<<28)
4260DATA 0,0,-1,8,-1,"Author:",
4270DATA 20,-204,156,-164,%1000010001+(7<<24)+(2<<28)
4280DATA 0,0,-1,8,-1,"Version:",
4290REMDATA 160,-48,598,-8,%1000111101+(7<<24)+(0<<28)
4300DATA 160,-52,598,-4,%1000111101+(7<<24)+(0<<28)
4310DATA 0,0,-1,9,-1,"!JigWord",
4320REMDATA 160,-100,598,-60,%1000111101+(7<<24)+(0<<28)
4330DATA 160,-104,598,-56,%1000111101+(7<<24)+(0<<28)
4340DATA 0,0,-1,8,-1,"Puzzlement!",
4350REMDATA 160,-152,598,-112,%1100111101+(7<<24)+(0<<28)
4360DATA 160,-156,598,-108,%1100111101+(7<<24)+(0<<28)
4370DATA 0,1,-1,16,-1,"P.Bentley, 1991",
4380REMDATA 160,-204,598,-164,%1100111101+(7<<24)+(0<<28)
4390DATA 160,-208,598,-160,%1100111101+(7<<24)+(0<<28)
4400DATA 0,1,-1,20,-1,"1.62 (05, Apr 1992)",
4410
4420DATA 20,-48,236,-4,%1000010001+(7<<24)
4430DATA 0,0,-1,8,-1,"Width:",
4440DATA 20,-100,236,-56,%1000010001+(7<<24)
4450DATA 0,0,-1,8,-1,"Height:",
4460REMDATA 20,-152,236,-112,%1100010001+(7<<24)
4470REMDATA 0,1,-1,14,-1,"Word density:",
4480DATA 240,-48,304,-4,%0100111101+(7<<24)+(0<<28)+(15<<12)
4490DATA 0,1,-1,3,-1,"30","A0-9"
4500DATA 240,-100,304,-56,%0100111101+(7<<24)+(0<<28)+(15<<12)
4510DATA 0,1,-1,3,-1,"15","A0-9"
4520REMDATA 240,-152,304,-112,%0100111101+(7<<24)+(0<<28)+(15<<12)
4530REMDATA 0,1,-1,3,-1,,"A0-9"
4540DATA 48,-168,284,-120,%1100010011+(7<<24)+(1<<28)+(11<<12)
4550DATA 0,1,-1,12,-1,"Start Word:","Soptoff,opton"
4560REMDATA 144,-224,284,-180,%1100010011+(7<<24)+(1<<28)+(11<<12)
4570REMDATA 0,1,-1,6,-1,"Grid:","Soptoff,opton"
4580DATA 120,-232,224,-188,%111101+(7<<24)+(12<<28)+(9<<12)+(1<<16)
4590DATA 0,0,-1,7,-1,"Create",
4600
4610DATA 20,-48,236,-8,%1000010001+(7<<24)
4620DATA 0,0,-1,6,-1,"Width:",
4630DATA 20,-100,236,-60,%1000010001+(7<<24)
4640DATA 0,0,-1,7,-1,"Height:",
4650DATA 20,-152,236,-112,%1100010001+(7<<24)
4660DATA 0,1,-1,14,-1,"No. of words:",
4670REMDATA 240,-48,312,-8,%0000111101+(7<<24)+(0<<28)
4680DATA 240,-52,312,-4,%0000111101+(7<<24)+(0<<28)
4690DATA 0,0,-1,14,-1,"",
4700DATA 240,-104,312,-56,%0000111101+(7<<24)+(0<<28)
4710DATA 0,0,-1,14,-1,"",
4720DATA 240,-156,312,-108,%0000111101+(7<<24)+(0<<28)
4730DATA 0,0,-1,14,-1,"",
4740:
4750:
4760REM menu structures
4770DATA 3
4780DATA 0,&8000,-1
4790DATA 2,&8001,-1
4800DATA &8002,-1
4810:
4820DEF FNSIcon(s$,but%,h%,x1%,y1%,x2%,y2%)
4830b%!0=h%
4840b%!4=x1%
4850b%!8=y1%
4860b%!12=x2%
4870b%!16=y2%
4880b%!20=%10+(but%<<12)
4890$(b%+24)=s$
4900SYS "Wimp_CreateIcon",,b% TO h%
4910=h%
4920:
4930DEF PROCCreateWindow(w%)
4940LOCAL addr%,offset%,h%,a%
4950addr%=wbuff%
4960addr%!0=wind%(w%,2):addr%!4=wind%(w%,3)
4970addr%!8=wind%(w%,4):addr%!12=wind%(w%,5)
4980addr%!16=wind%(w%,6):addr%!20=wind%(w%,7)
4990addr%!24=-1
5000addr%!28=wind%(w%,14)
5010CASE wind%(w%,15) OF
5020 WHEN 1:
5030 addr%?32=7:addr%?33=2
5040 addr%?34=7:addr%?35=1
5050 addr%?36=3:addr%?37=1
5060 addr%?38=12:addr%?39=0
5070 OTHERWISE :
5080ENDCASE
5090addr%!40=wind%(w%,8):addr%!44=wind%(w%,9)
5100addr%!48=wind%(w%,10):addr%!52=wind%(w%,11)
5110IF LEN(wind$(w%))>12 THEN
5120 addr%!56=%100011001
5130ELSE
5140 addr%!56=%11001
5150ENDIF
5160addr%!60=wind%(w%,19)<<12:REM buttons
5170addr%!64=1:REM sprite area pointer
5180addr%?68=wind%(w%,12) MOD 256:addr%?69=wind%(w%,12) DIV 256
5190addr%?70=wind%(w%,13) MOD 256:addr%?71=wind%(w%,13) DIV 256
5200IF LEN(wind$(w%))<=12 THEN
5210 $(addr%+72)=wind$(w%)
5220ELSE
5230 IF wind%(w%,18)<>-1 THEN
5240 addr%!72=data%(wind%(w%,18),0)
5250 addr%!76=-1
5260 addr%!80=data%(wind%(w%,18),1)
5270 $data%(wind%(w%,18),0)=wind$(w%)
5280 ELSE
5290 IF (nextdatst%+LEN(wind$(w%))+1)>=dataend% THEN
5300 PROCError2nd(0)
5310 ENDPROC
5320 ENDIF
5330 wind%(w%,18)=nextdat%:nextdat%+=1
5340 data%(wind%(w%,18),0)=nextdatst%:nextdatst%+=LEN(wind$(w%))+1
5350 data%(wind%(w%,18),1)=LEN(wind$(w%))+1
5360 data%(wind%(w%,18),2)=-1
5370 data%(wind%(w%,18),3)=-1
5380 addr%!72=data%(wind%(w%,18),0)
5390 addr%!76=-1
5400 addr%!80=data%(wind%(w%,18),1)
5410 $data%(wind%(w%,18),0)=wind$(w%)
5420 ENDIF
5430ENDIF
5440addr%!84=wind%(w%,17)
5450offset%=88
5460IF wind%(w%,17)>0 THEN
5470 h%=0
5480 FOR a%=wind%(w%,16) TO wind%(w%,16)+wind%(w%,17)-1
5490 icon%(a%,9)=h%
5500 PROCCreateIData(a%,addr%+offset%)
5510 offset%+=32
5520 h%+=1
5530 NEXT
5540ENDIF
5550SYS "Wimp_CreateWindow",,addr% TO wind%(w%,0)
5560FOR a%=wind%(w%,16) TO wind%(w%,16)+wind%(w%,17)-1
5570 icon%(a%,5)=wind%(w%,0)
5580NEXT
5590ENDPROC
5600:
5610DEF PROCCreateMenu(m%)
5620LOCAL a%,addr%,a$,b$,f%,id%
5630menuin%(m%)=nxtmenust%:addr%=nxtmenust%
5640$addr%=menu$(m%)
5650addr%?12=7:addr%?13=2
5660addr%?14=7:addr%?15=0
5670addr%!16=menu%(m%,0)
5680addr%!20=44:addr%!24=0
5690addr%+=28
5700FOR a%=0 TO menu%(m%,1)-1
5710 addr%!0=item%(m%,a%,1)
5720 IF item%(m%,a%,2)<>-1 THEN
5730 IF item%(m%,a%,2)<&8000 THEN
5740 addr%!4=wind%(item%(m%,a%,2),0)
5750 ELSE
5760 addr%!4=menuin%(item%(m%,a%,2)-&8000)
5770 ENDIF
5780 ELSE
5790 addr%!4=-1
5800 ENDIF
5810 f%=item%(m%,a%,3)
5820 IF f%=0 THEN
5830 addr%!8=(1<<5)+(7<<24)+1
5840 ELSE
5850 addr%!8=f%
5860 ENDIF
5870 a$=item$(m%,a%,0)
5880 b$=item$(m%,a%,1)
5890 IF LEN(a$)>12 OR b$<>"" OR (f% AND 256)=256 OR item%(m%,a%,4)>12 THEN
5900 IF item%(m%,a%,0)=-1 THEN
5910 IF (nextdatst%+LEN(a$)+LEN(b$)+2)>=dataend% THEN
5920 PROCError2nd(0)
5930 ENDPROC
5940 ENDIF
5950 id%=nextdat%:item%(m%,a%,0)=id%:nextdat%+=1
5960 data%(id%,0)=nextdatst%:nextdatst%+=item%(m%,a%,4)
5970 data%(id%,1)=item%(m%,a%,4)
5980 IF b$<>"" THEN
5990 data%(id%,2)=nextdatst%:nextdatst%+=LEN(b$)+1
6000 data%(id%,3)=LEN(b$)+1
6010 ELSE
6020 data%(id%,2)=-1:data%(id%,3)=-1
6030 ENDIF
6040 ELSE
6050 id%=item%(m%,a%,0)
6060 ENDIF
6070 $data%(id%,0)=a$
6080 IF b$<>"" THEN
6090 $(data%(id%,0)+item%(m%,a%,4))=b$
6100 ENDIF
6110 addr%!12=data%(id%,0)
6120 addr%!16=data%(id%,2)
6130 addr%!20=data%(id%,1)
6140 addr%!8=addr%!8 OR (1<<8)
6150 ELSE
6160 $(addr%+12)=item$(m%,a%,0)
6170 ENDIF
6180 addr%+=24
6190NEXT
6200nxtmenust%=addr%
6210ENDPROC
6220:
6230DEF PROCCreateIcon(i%)
6240iconst%!0=icon%(i%,5)
6250PROCCreateIData(i%,iconst%+4)
6260SYS "Wimp_CreateIcon",,iconst% TO icon%(i%,9)
6270ENDPROC
6280:
6290DEF PROCCreateIData(i%,addr%)
6300LOCAL t%,a$,b$
6310a$=icon$(i%,0):b$=icon$(i%,1)
6320addr%!0=icon%(i%,0)
6330addr%!4=icon%(i%,1)
6340addr%!8=icon%(i%,2)
6350addr%!12=icon%(i%,3)
6360addr%!16=icon%(i%,4)
6370t%=icon%(i%,6)
6380CASE t% OF
6390 WHEN 0:$(addr%+20)=icon$(i%,0)
6400 WHEN 1,4:
6410 PROCIndirectText(addr%+20,a$,b$,icon%(i%,7),icon%(i%,8),icon%(i%,7))
6420 WHEN 2:$(addr%+20)=icon$(i%,0)
6430 WHEN 3:
6440 PROCIndirectText(addr%+20,a$,"",icon%(i%,7),icon%(i%,8),icon%(i%,7))
6450 addr%!24=sprarea%(VAL(icon$(i%,1)))
6460 WHEN 4:
6470 WHEN 5:addr%!20=0:addr%!24=0:addr%!28=0
6480ENDCASE
6490ENDPROC
6500:
6510DEF PROCCreateMStruct(s%,x%,y%)
6520LOCAL a%,addr%,d%,e%
6530nxtmenust%=menust%
6540addr%=mstructin%(s%)
6550REPEAT
6560 e%=d%
6570 d%=!addr%
6580 addr%+=4
6590 IF d%<>-1 THEN
6600 IF d%<&8000 THEN PROCCreateWindow(d%) ELSE PROCCreateMenu(d%-&8000)
6610 ENDIF
6620UNTIL d%=-1
6630SYS "Wimp_CreateMenu",,menuin%(e%-&8000),x%,y%
6640menus%=s%
6650ENDPROC
6660:
6670DEF PROCIndirectText(a%,a$,b$,p%,l%,RETURN p%)
6680IF p%=-1 THEN
6690 IF (nextdatst%+l%+LEN(b$)+1)>=dataend% THEN
6700 PROCError2nd(0)
6710 ENDPROC
6720 ENDIF
6730 p%=nextdat%:nextdat%+=1
6740 data%(p%,0)=nextdatst%:nextdatst%+=l%
6750 data%(p%,1)=l%
6760 IF b$<>"" THEN
6770 data%(p%,2)=nextdatst%:nextdatst%+=LEN(b$)+1
6780 data%(p%,3)=LEN(b$)+1
6790 ELSE
6800 data%(p%,2)=-1:data%(p%,3)-=1
6810 ENDIF
6820ENDIF
6830$data%(p%,0)=a$
6840IF b$<>"" THEN $(data%(p%,2))=b$
6850a%!0=data%(p%,0)
6860a%!4=data%(p%,2)
6870a%!8=data%(p%,1)
6880ENDPROC
6890:
6900DEF PROCDeleteWindow(w%)
6910!wbuff%=wind%(w%,0):SYS "Wimp_DeleteWindow",,wbuff%
6920wind%(w%,0)=-1
6930ENDPROC
6940:
6950DEF PROCDestroyWindow(w%)
6960LOCAL a%
6970!wbuff%=wind%(w%,0):SYS "Wimp_DeleteWindow",,wbuff%
6980wind%(w%,0)=-1
6990wuse%(w%)=0
7000IF wind%(w%,17)>0 THEN
7010 FOR a%=wind%(w%,16) TO wind%(w%,16)+wind%(w%,17)-1
7020 icon%(a%,5)=0
7030 NEXT
7040ENDIF
7050ENDPROC
7060:
7070DEF PROCDeleteMStruct(s%)
7080LOCAL addr%,d%
7090addr%=mstructin%(s%)
7100REPEAT
7110 d%=!addr%
7120 addr%+=4
7130 IF d%<>-1 AND d%<&8000 THEN PROCDeleteWindow(d%)
7140UNTIL d%=-1
7150menus%=-1
7160menuw%=-1
7170ENDPROC
7180:
7190REM Redraw_Window_Request
7200DEF PROCP_1(a%)
7210LOCAL more%,w%
7220w%=FNWNum(a%!0)
7230SYS "Wimp_RedrawWindow",,a% TO more%
7240WHILE more%
7250 PROCWindRect(w%,a%)
7260 SYS "Wimp_GetRectangle",,a% TO more%
7270ENDWHILE
7280ENDPROC
7290:
7300REM Close_Window_Request
7310DEF PROCP_3(a%)
7320LOCAL w%,c%,p%,ret%
7330w%=FNWNum(!a%)
7340p%=wind%(w%,1)
7350IF p%=-1 THEN SYS "Wimp_CloseWindow",,a%:ENDPROC
7360IF p%>maxpuzz% THEN
7370 p%-=maxpuzz%+1
7380 PROCDestroyWindow(w%):pinfo%(p%,8)-=1
7390 IF pinfo%(p%,8)=0 THEN pinfo%(p%,4)=pinfo%(p%,4) AND NOT(%11)
7400 pwuse%(wind%(w%,20))=0
7410 ENDPROC
7420ENDIF
7430IF pinfo%(p%,3)=1 THEN
7440 b2%!0=0:$(b2%+4)="Are you sure you want to lose this puzzle?"+CHR$(0)
7450 SYS "Wimp_ReportError",b2%,%10111,"!JigWord" TO ,ret%
7460 IF ret%=0 OR ret%=2 THEN ENDPROC
7470ENDIF
7480PROCDestroyWindow(w%)
7490pinfo%(p%,3)-=1
7500IF pinfo%(p%,3)=0 THEN PROCDestroyPuzzle(p%):ENDPROC
7510IF pinfo%(p%,3)=1 THEN
7520 $data%(pinfo%(p%,5),0)="JigWord "+STR$(p%)
7530ELSE
7540 $data%(pinfo%(p%,5),0)="JigWord "+STR$(p%)+" "+STR$(pinfo%(p%,3))
7550ENDIF
7560FOR c%=0 TO numwind%
7570 IF wuse%(c%)<>0 AND wind%(c%,1)=p% THEN
7580 !b%=wind%(c%,0)
7590 SYS "Wimp_GetWindowState",,b%
7600 SYS "Wimp_ForceRedraw",-1,b%!4,b%!16,b%!12,b%!16+44
7610 ENDIF
7620NEXT
7630ENDPROC
7640:
7650REM Mouse_Click
7660DEF PROCP_6(a%)
7670LOCAL w%,c%
7680IF a%!12=-2 PROCIconBarClick(a%!0,a%!4,a%!8)
7690w%=FNWNum(a%!12)
7700IF w%<0 OR w%>numwind% THEN ENDPROC
7710c%=FNINum(w%,a%!16)
7720IF w%=1 AND c%=14 AND (a%!8 AND 2)<>2 THEN PROCInitCreateJig:ENDPROC
7730IF wind%(w%,1)<>-1 AND wind%(w%,1)<=maxpuzz% THEN PROCPuzzleClick(w%,a%)
7740IF wind%(w%,1)<>-1 AND wind%(w%,1)>maxpuzz% THEN PROCWordClick(w%,c%,a%)
7750ENDPROC
7760:
7770REM Key_Pressed
7780DEF PROCP_8(a%)
7790LOCAL w%,c%
7800w%=FNWNum(a%!0)
7810CASE w% OF
7820 WHEN -1:
7830 SYS "Wimp_ProcessKey",a%!24
7840 WHEN 1:PROCKeyWind1(a%)
7850 OTHERWISE:
7860 SYS "Wimp_ProcessKey",a%!24
7870ENDCASE
7880ENDPROC
7890:
7900REM Menu_Selection
7910DEF PROCP_9(a%)
7920SYS &400CF,,b2%:z%=b2%!8
7930CASE menus% OF
7940 WHEN 0:IF a%!0=1 THEN quit%=TRUE
7950 WHEN 1:
7960 CASE a%!0 OF
7970 WHEN 1:PROCToggleCheat(menuw%)
7980 WHEN 2:PROCToggleWordWind(wind%(menuw%,1))
7990 WHEN 3:PROCCreatePuzzWind(wind%(menuw%,1))
8000 WHEN 4:PROCPrintPuzzGrid(menuw%,wind%(menuw%,1))
8010 ENDCASE
8020 WHEN 2:
8030 CASE a%!0 OF
8040 WHEN 0:PROCCreateWordWind(wind%(menuw%,1)-maxpuzz%-1)
8050 WHEN 1:PROCPrintWordList(wind%(menuw%,1)-maxpuzz%-1)
8060 ENDCASE
8070ENDCASE
8080IF (z% AND 1)=1 THEN
8090 PROCCreateMStruct(menus%,0,0)
8100ELSE
8110 PROCDeleteMStruct(menus%)
8120ENDIF
8130ENDPROC
8140:
8150REM Poll 17 and 18
8160DEF PROCReceive(a%)
8170CASE a%!16 OF
8180 WHEN 0:quit%=TRUE
8190 WHEN &40300:PROCChangeHiLiteCol(a%)
8200ENDCASE
8210ENDPROC
8220:
8230REM Don't know if this works.
8240DEF PROCChangeHiLiteCol(a%)
8250LOCAL d%,s%,A%,B%,C%,D%,E%,F%,G%,H%
8260IF a%!20=&452295 THEN
8270 hilitecol%=a%!24
8280 A%=hilitecol%:CALL ChangeHiCol
8290 ENDPROC
8300ENDIF
8310IF a%!20=4522295 THEN
8320 s%=a%!24
8330 d%=a%+28
8340 A%=EVAL($d%)
8350 PROCNextPar(d%,d%)
8360 B%=EVAL($d%)
8370 PROCNextPar(d%,d%)
8380 C%=EVAL($d%)
8390 PROCNextPar(d%,d%)
8400 D%=EVAL($d%)
8410 PROCNextPar(d%,d%)
8420 E%=EVAL($d%)
8430 PROCNextPar(d%,d%)
8440 F%=EVAL($d%)
8450 PROCNextPar(d%,d%)
8460 G%=EVAL($d%)
8470 PROCNextPar(d%,d%)
8480 H%=EVAL($d%)
8490 SYS s%,A%,B%,C%,D%,E%,F%,G%,H%
8500 ENDPROC
8510ENDIF
8520IF a%!20=5922254 THEN
8530 d%=a%+24
8540 s%=EVAL($d%)
8550 PROCNextPar(d%,d%)
8560 A%=EVAL($d%)
8570 PROCNextPar(d%,d%)
8580 B%=EVAL($d%)
8590 PROCNextPar(d%,d%)
8600 C%=EVAL($d%)
8610 PROCNextPar(d%,d%)
8620 D%=EVAL($d%)
8630 PROCNextPar(d%,d%)
8640 E%=EVAL($d%)
8650 PROCNextPar(d%,d%)
8660 F%=EVAL($d%)
8670 PROCNextPar(d%,d%)
8680 G%=EVAL($d%)
8690 PROCNextPar(d%,d%)
8700 H%=EVAL($d%)
8710 CALL s%
8720 ENDPROC
8730ENDIF
8740IF a%!20=&1234DEBA THEN
8750 CALL (a%!24)
8760 ENDPROC
8770ENDIF
8780ENDPROC
8790:
8800DEF PROCNextPar(d%,RETURN d%)
8810d%+=1
8820WHILE ?d%<>13
8830 d%+=1
8840ENDWHILE
8850d%+=1
8860ENDPROC
8870:
8880REM 10.9.8.7.6.5.4.3.2.1...We have destruction.
8890DEF PROCDestroyPuzzle(p%)
8900LOCAL a%,addr1%,addr2%
8910FOR a%=0 TO maxpword%
8920IF pword%(a%,1)=p% AND pwuse%(a%) THEN
8930 pwuse%(a%)=0:PROCDestroyWindow(pword%(a%,0))
8940ENDIF
8950NEXT
8960:
8970addr1%=puzzin%(p%)
8980addr2%=puzzshflags1
8990FOR a%=0 TO maxpuzz%
9000 IF pfree%(a%) THEN !addr2%=puzzin%(a%) ELSE !addr2%=0
9010 addr2%+=4
9020NEXT
9030A%=p%:CALL puzzshuffle
9040addr1%=puzzshflags1
9050FOR a%=0 TO maxpuzz%
9060 IF !addr1%<>0 THEN puzzin%(a%)=!addr1%
9070 addr1%+=4
9080NEXT
9090pfree%(p%)=0
9100nxtpuzzst%=!nextpuzzst
9110ENDPROC
9120:
9130REM Does anyone know that little known song
9140REM 'Stop tap-dancing on my icon bar' ?
9150DEF PROCIconBarClick(x%,y%,z%)
9160IF z%=1 THEN REM Adjust
9170IF z%=4 THEN PROCOpenWindow(1,-1)
9180IF z%=2 THEN
9190 IF menus%<>-1 THEN PROCDeleteMStruct(menus%)
9200 PROCCreateMStruct(0,x%-64,184)
9210 menuw%=-1
9220 ENDPROC
9230ENDIF
9240ENDPROC
9250:
9260REM A confused click?
9270DEF PROCPuzzleClick(w%,addr%)
9280LOCAL p%
9290p%=wind%(w%,1)
9300IF (addr%!8 AND 2)=2 THEN
9310 icon$(18,0)=STR$(pinfo%(p%,0))
9320 icon$(19,0)=STR$(pinfo%(p%,1))
9330 icon$(20,0)=STR$(pinfo%(p%,2))
9340 IF (wind%(w%,20) AND %1)=%1 THEN
9350 item%(1,1,1)=item%(1,1,1) OR %1
9360 ELSE
9370 item%(1,1,1)=item%(1,1,1) AND NOT(%1)
9380 ENDIF
9390 IF (pinfo%(p%,4) AND %1)=%1 THEN
9400 item%(1,2,1)=item%(1,1,1) OR %1
9410 ELSE
9420 item%(1,2,1)=item%(1,1,1) AND NOT(%1)
9430 ENDIF
9440 IF menus%<>-1 THEN PROCDeleteMStruct(menus%)
9450 PROCCreateMStruct(1,addr%!0-64,addr%!4)
9460 menuw%=w%
9470 ENDPROC
9480ENDIF
9490IF (addr%!8 AND %100)=%100 THEN
9500 PROCPuzzSelect(p%,addr%!12,addr%!0,addr%!4)
9510 ENDPROC
9520ENDIF
9530IF (addr%!8 AND %001)=%001 THEN
9540 PROCDeHiLight(p%,2)
9550 pinfo%(p%,6)=0
9560 pinfo%(p%,7)=0
9570 pinfo%(p%,9)=0
9580 pinfo%(p%,10)=0
9590 ENDPROC
9600ENDIF
9610ENDPROC
9620:
9630REM Anyone who used this option to complete
9640REM a puzzle hasn't got the brains to understand
9650REM this program. So why are you reading it?
9660DEF PROCToggleCheat(w%)
9670wind%(w%,20)=wind%(w%,20) EOR %1
9680item%(1,1,1)=item%(1,1,1) EOR %1
9690b%!0=wind%(w%,0)
9700b%!4=wind%(w%,8)
9710b%!8=wind%(w%,9)
9720b%!12=wind%(w%,10)
9730b%!16=wind%(w%,11)
9740SYS "Wimp_UpdateWindow",,b% TO more%
9750WHILE more%
9760 PROCWindRect(w%,b%)
9770 SYS "Wimp_GetRectangle",,b% TO more%
9780ENDWHILE
9790ENDPROC
9800:
9810DEF PROCToggleWordWind(p%)
9820IF (pinfo%(p%,4) AND %10)=%00 THEN
9830 PROCCreateWordWind(p%)
9840 IF pinfo%(p%,8)=-1 THEN ENDPROC
9850 pinfo%(p%,4)=pinfo%(p%,4) OR %11
9860 item%(1,2,1)=item%(1,2,1) OR %1
9870 ENDPROC
9880ENDIF
9890ENDPROC
9900:
9910DEF PROCPuzzSelect(p%,w%,x%,y%)
9920LOCAL a%,addr1%,addr2%,v%,h%,n%,x1%,y1%,l%
9930!b%=w%:SYS &400CB,,b%
9940x%=x%-(b%!4-b%!20)
9950y%=y%-(b%!16-b%!24)
9960x%=(x%-22) DIV 20:y%=((y%+8) DIV 40)*-1
9970A%=x%:B%=y%:C%=puzzin%(p%):CALL puzzselect
9980h%=!selh:v%=!selv
9990IF h%<>0 THEN pinfo%(p%,9)=!hlen
10000IF v%<>0 THEN pinfo%(p%,10)=!vlen
10010:
10020IF h%=0 AND v%=0 THEN ENDPROC
10030IF h%=pinfo%(p%,6) AND v%=pinfo%(p%,7) THEN ENDPROC
10040IF h%>0 AND v%>0 THEN
10050 IF h%=pinfo%(p%,6) THEN
10060 PROCDeHiLight(p%,1):pinfo%(p%,10)=0
10070 ENDPROC
10080 ENDIF
10090 IF v%=pinfo%(p%,7) THEN
10100 PROCDeHiLight(p%,0):pinfo%(p%,9)=0
10110 ENDPROC
10120 ENDIF
10130 PROCDeHiLight(p%,2)
10140 pinfo%(p%,6)=h%:pinfo%(p%,7)=v%
10150 PROCHiLight(p%,0)
10160 PROCHiLight(p%,1)
10170 ENDPROC
10180ENDIF
10190IF h%>0 THEN
10200 IF pinfo%(p%,7)>0 THEN PROCDeHiLight(p%,1):pinfo%(p%,10)=0
10210 IF pinfo%(p%,6)<>h% THEN
10220 PROCDeHiLight(p%,0)
10230 pinfo%(p%,6)=h%
10240 PROCHiLight(p%,0)
10250 ENDIF
10260ELSE
10270 IF pinfo%(p%,6)>0 THEN PROCDeHiLight(p%,0):pinfo%(p%,9)=0
10280 IF pinfo%(p%,7)<>v% THEN
10290 PROCDeHiLight(p%,1)
10300 pinfo%(p%,7)=v%
10310 PROCHiLight(p%,1)
10320 ENDIF
10330ENDIF
10340ENDPROC
10350:
10360DEF PROCDeHiLight(p%,a%)
10370LOCAL c%
10380CASE a% OF
10390 WHEN 0:c%=pinfo%(p%,6):pinfo%(p%,6)=0:PROCUpdateSpace(p%,c%,0)
10400 WHEN 1:c%=pinfo%(p%,7):pinfo%(p%,7)=0:PROCUpdateSpace(p%,c%,1)
10410 WHEN 2:c%=pinfo%(p%,6):pinfo%(p%,6)=0:PROCUpdateSpace(p%,c%,0)
10420 c%=pinfo%(p%,7):pinfo%(p%,7)=0:PROCUpdateSpace(p%,c%,1)
10430ENDCASE
10440ENDPROC
10450:
10460DEF PROCHiLight(p%,a%)
10470CASE a% OF
10480 WHEN 0:PROCUpdateSpace(p%,pinfo%(p%,6),0)
10490 WHEN 1:PROCUpdateSpace(p%,pinfo%(p%,7),1)
10500 WHEN 2:PROCUpdateSpace(p%,pinfo%(p%,6),0)
10510 PROCUpdateSpace(p%,pinfo%(p%,7),1)
10520ENDCASE
10530ENDPROC
10540:
10550DEF PROCUpdateSpace(p%,s%,d%)
10560IF s%=0 THEN ENDPROC
10570LOCAL x%,y%,l%,wd%,a%,x1%,y1%,x2%,y2%,more%
10580PROCSpaceInfo(p%,s%,d%)
10590x1%=x%*20+20:y1%=y%*-40-4
10600CASE d% OF
10610 WHEN 0:x2%=x1%+l%*20+2:y2%=y1%-44
10620 WHEN 1:x2%=x1%+22:y2%=y1%-l%*40-4
10630ENDCASE
10640FOR a%=0 TO numwind%
10650 IF wind%(a%,1)=p% AND wuse%(a%) THEN
10660 b%!0=wind%(a%,0)
10670 b%!4=x1%
10680 b%!8=y2%
10690 b%!12=x2%
10700 b%!16=y1%
10710 SYS &400C9,,b% TO more%
10720 WHILE more%
10730 PROCWindRect(a%,b%)
10740 SYS &400CA,,b% TO more%
10750 ENDWHILE
10760 ENDIF
10770NEXT
10780ENDPROC
10790:
10800DEF PROCSpaceInfo(p%,space%,dir%)
10810LOCAL addr%
10820addr%=puzzin%(p%)
10830CASE dir% OF
10840 WHEN 0:addr%=addr%+addr%!24
10850 WHEN 1:addr%=addr%+addr%!28
10860ENDCASE
10870addr%+=4
10880addr%=addr%+space%*8-8
10890x%=addr%?0:y%=addr%?1:l%=addr%?2:wd%=addr%!4
10900ENDPROC
10910:
10920DEF PROCWordClick(w%,c%,addr%)
10930LOCAL pw%,p%,addr1%,addr2%,x%,y%,addr3%,a%,n%,f%
10940pw%=wind%(w%,20):p%=pword%(pw%,1)
10950IF (addr%!8 AND 2)=2 THEN
10960 PROCCreateMStruct(2,addr%!0-64,addr%!4)
10970 menuw%=w%
10980 ENDPROC
10990ENDIF
11000IF c%=pwordiconst%+pw%*3 THEN PROCChWordLen(-1,pw%,w%):ENDPROC
11010IF c%=pwordiconst%+pw%*3+1 THEN PROCChWordLen(1,pw%,w%):ENDPROC
11020x%=addr%!0:y%=addr%!4
11030!b2%=wind%(w%,0):SYS &400CB,,b2%
11040x%=x%-(b2%!4-b2%!20)
11050y%=y%-(b2%!16-b2%!24):y%=((y%+36) DIV 40)*-1-1
11060IF x%<pword%(pw%,3) OR x%>pword%(pw%,4) THEN ENDPROC
11070IF y%<0 THEN ENDPROC
11080IF y%>pword%(pw%,5) THEN ENDPROC
11090IF (addr%!8 AND 1)=1 THEN
11100 addr1%=FNWordAddr(pword%(pw%,2),y%,puzzin%(p%))
11110 IF (?addr1% AND 128)=0 THEN ENDPROC
11120 ?addr1%=?addr1% EOR 128
11130 PROCUpdateWWind(w%,pw%,y%)
11140 addr1%=puzzin%(p%)
11150 addr2%=addr1%+addr1%!24
11160 n%=addr2%!0:addr2%+=4:f%=0:a%=0
11170 WHILE a%<n% AND NOT(f%)
11180 a%+=1
11190 IF (addr2%!4>>>16)=y% AND addr2%?2=pword%(pw%,2) THEN
11200 f%=TRUE
11210 addr2%?6=&FF:addr2%?7=&FF
11220 PROCUpdateSpace(p%,a%,0)
11230 ENDIF
11240 addr2%+=8
11250 ENDWHILE
11260 addr2%=addr1%+addr1%!28
11270 n%=addr2%!0:addr2%+=4:f%=0:a%=0
11280 WHILE a%<n% AND NOT(f%)
11290 a%+=1
11300 IF (addr2%!4>>>16)=y% AND addr2%?2=pword%(pw%,2) THEN
11310 f%=TRUE
11320 addr2%?6=&FF:addr2%?7=&FF
11330 PROCUpdateSpace(p%,a%,1)
11340 ENDIF
11350 addr2%+=8
11360 ENDWHILE
11370 ENDPROC
11380ENDIF
11390IF pinfo%(p%,9)=pinfo%(p%,10) THEN ENDPROC
11400addr1%=FNWordAddr(pword%(pw%,2),y%,puzzin%(p%))
11410IF (?addr1% AND 128) THEN ENDPROC
11420IF pinfo%(p%,9)=pword%(pw%,2) THEN
11430 addr2%=FNClueAddr(pinfo%(p%,6),0,puzzin%(p%))
11440 A%=puzzin%(p%):CALL ChangeJig
11450 A%=addr2%?0:B%=addr2%?1:C%=addr2%?2:D%=addr1%:CALL HFit
11460 IF !fit=0 THEN VDU 7:ENDPROC
11470 IF (addr2%!4>>>16)<>&FFFF THEN
11480 addr3%=FNWordAddr(pword%(pw%,2),addr2%?6+addr2%?7*256,puzzin%(p%))
11490 ?addr3%=?addr3% EOR 128
11500 PROCUpdateWWind(w%,pw%,addr2%?6+addr2%?7*256)
11510 ENDIF
11520 addr2%?6=y% MOD 256
11530 addr2%?7=y% DIV 256
11540 ?addr1%=?addr1% EOR 128
11550 PROCUpdateSpace(p%,pinfo%(p%,6),0)
11560 PROCUpdateWWind(w%,pw%,y%)
11570ELSE
11580 IF pinfo%(p%,10)=pword%(pw%,2) THEN
11590 addr2%=FNClueAddr(pinfo%(p%,7),1,puzzin%(p%))
11600 A%=puzzin%(p%):CALL ChangeJig
11610 A%=addr2%?0:B%=addr2%?1:C%=addr2%?2:D%=addr1%:CALL VFit
11620 IF !fit=0 THEN VDU 7:ENDPROC
11630 IF (addr2%!4>>>16)<>&FFFF THEN
11640 addr3%=FNWordAddr(pword%(pw%,2),addr2%?6+addr2%?7*256,puzzin%(p%))
11650 ?addr3%=?addr3% EOR 128
11660 PROCUpdateWWind(w%,pw%,addr2%?6+addr2%?7*256)
11670 ENDIF
11680 addr2%?6=y% MOD 256
11690 addr2%?7=y% DIV 256
11700 ?addr1%=?addr1% EOR 128
11710 PROCUpdateSpace(p%,pinfo%(p%,7),1)
11720 PROCUpdateWWind(w%,pw%,y%)
11730 ENDIF
11740ENDIF
11750ENDPROC
11760ELSE
11770 ELSE
11780 ENDPROC
11790 ENDIF
11800ENDIF
11810ENDPROC
11820:
11830REM A procedure with a stutter
11840DEF PROCUpdateWWind(w%,pw%,a%)
11850LOCAL c%,p%,more%
11860p%=pword%(pw%,1)
11870FOR c%=0 TO numwind%
11880 IF wind%(c%,1)=p%+1+maxpuzz% AND wuse%(c%) THEN
11890 b%!0=wind%(c%,0)
11900 b%!4=pword%(pw%,3):b%!8=(a%+2)*-40-32:b%!12=pword%(pw%,4):b%!16=b%!8+40
11910 SYS &400C9,,b% TO more%
11920 WHILE more%
11930 PROCWindRect(c%,b%)
11940 SYS &400CA,,b% TO more%
11950 ENDWHILE
11960 ENDIF
11970NEXT
11980ENDPROC
11990ENDPROC
12000:
12010DEF PROCChWordLen(d%,pw%,w%)
12020LOCAL addr1%,addr2%,icst%,f%,n%,l%,mh%,wf%,p%
12030icst%=pwordiconst%+pw%*3
12040p%=wind%(w%,1)-maxpuzz%-1
12050addr1%=puzzin%(p%):addr2%=addr1%+addr1%!16
12060n%=addr2%!0:l%=pword%(pw%,2)
12070REPEAT
12080 l%+=d%
12090 IF l%=1 THEN l%=n%
12100 IF l%>n% THEN l%=2
12110 IF addr2%!(l%*4-4)>0 THEN f%=TRUE
12120UNTIL f%
12130pword%(pw%,2)=l%
12140icon$(icst%+2,0)=STR$(l%)+" Letters"
12150$data%(icon%(icst%+2,7),0)=icon$(icst%+2,0)
12160mh%=!(addr1%+addr2%!(l%*4-4))+2
12170wind%(w%,9)=-(mh%*40+16)
12180b%!0=wind%(w%,0):SYS "Wimp_GetWindowState",,b%
12190wf%=b%!28
12200wind%(w%,2)=b%!4:wind%(w%,4)=b%!12:wind%(w%,5)=b%!16
12210wind%(w%,3)=wind%(w%,5)+wind%(w%,9)
12220wind%(w%,6)=0:wind%(w%,7)=0
12230b%!0=wind%(w%,8):b%!4=wind%(w%,9)
12240b%!8=wind%(w%,10):b%!12=wind%(w%,11)
12250SYS "Wimp_SetExtent",wind%(w%,0),b%
12260PROCOpenWindow(w%,wf%)
12270pword%(pw%,3)=wind%(w%,10)/2-pword%(pw%,2)*8
12280pword%(pw%,4)=pword%(pw%,3)+pword%(pw%,2)*16
12290pword%(pw%,5)=mh%-3
12300SYS "Wimp_ForceRedraw",wind%(w%,0),0,wind%(w%,9),wind%(w%,10),0
12310ENDPROC
12320:
12330DEF PROCKeyWind1(a%)
12340LOCAL c%,nh%,lh%,h%,l%,f%,i%
12350c%=FNINum(1,a%!4)
12360CASE c% OF
12370 WHEN 11:nh%=icon%(12,9):lh%=icon%(12,9)
12380 WHEN 12:nh%=icon%(11,9):lh%=icon%(11,9)
12390 OTHERWISE:SYS "Wimp_ProcessKey",a%!24:ENDPROC
12400ENDCASE
12410CASE a%!24 OF
12420 WHEN &0D:
12430 h%=nh%
12440 i%=FNIFlags(1,14)
12450 IF c%=12 AND (i% AND (1<<22))=0 THEN
12460 a%!4=icon%(14,9)
12470 a%!8=1<<21
12480 a%!12=1<<21
12490 SYS "Wimp_SetIconState",,a%
12500 PROCInitCreateJig
12510 ENDPROC
12520 ELSE
12530 IF c%=12 THEN ENDPROC
12540 ENDIF
12550 WHEN &18E:h%=nh%
12560 WHEN &18F:h%=lh%
12570 OTHERWISE:SYS "Wimp_ProcessKey",a%!24:ENDPROC
12580ENDCASE
12590l%=LEN($(data%(icon%(FNINum(w%,h%),7),0)))
12600SYS "Wimp_SetCaretPosition",wind%(1,0),h%,0,0,-1,l%
12610ENDPROC
12620:
12630REM It's a bit hot in here.
12640DEF PROCOpenWindow(w%,f%)
12650b%!0=wind%(w%,0)
12660b%!4=wind%(w%,2):b%!8=wind%(w%,3)
12670b%!12=wind%(w%,4):b%!16=wind%(w%,5)
12680b%!20=wind%(w%,6):b%!24=wind%(w%,7)
12690b%!28=f%
12700SYS "Wimp_OpenWindow",,b%
12710ENDPROC
12720:
12730DEF PROCWindRect(w%,a%)
12740LOCAL wx1%,wy1%,wx2%,wy2%
12750wx1%=a%!20+(a%!28-a%!4):wy1%=a%!24+(a%!40-a%!16)
12760wx2%=wx1%+(a%!36-a%!28):wy2%=wy1%+(a%!32-a%!40)
12770ORIGIN a%!4-a%!20,a%!16-a%!24
12780IF wind%(w%,1)<>-1 AND wind%(w%,1)<=maxpuzz% THEN
12790 PROCPuzzRect(w%,wx1%,wy1%,wx2%,wy2%)
12800ENDIF
12810IF wind%(w%,1)<>-1 AND wind%(w%,1)>maxpuzz% THEN
12820 PROCWordRect(w%,wx1%,wy1%,wx2%,wy2%)
12830ENDIF
12840ORIGIN 0,0
12850ENDPROC
12860:
12870DEF PROCPuzzRect(w%,x1%,y1%,x2%,y2%)
12880LOCAL p%
12890p%=wind%(w%,1)
12900x1%=(x1%-22) DIV 20:x2%=(x2%-22) DIV 20
12910y1%=(y1%+8) DIV -40:y2%=(y2%+8) DIV -40
12920IF x1%<0 THEN x1%=0
12930IF x1%>=pinfo%(p%,0) THEN x1%=pinfo%(p%,0)-1
12940IF x2%>=pinfo%(p%,0) THEN x2%=pinfo%(p%,0)-1
12950A%=pinfo%(p%,6):B%=pinfo%(p%,7):CALL ChangeSel
12960A%=puzzin%(p%):B%=wind%(w%,20) AND %1:C%=scratch%
12970D%=x1%:E%=y1%:F%=x2%:G%=y2%:CALL CreateHeap
12980CALL Gridsetc
12990ENDPROC
13000:
13010DEF PROCWordRect(w%,x1%,y1%,x2%,y2%)
13020LOCAL p%,addr1%,addr2%,a%,b%,n%,pw%
13030pw%=wind%(w%,20)
13040x1%=(x1%-22) DIV 16:x2%=((x2%-22) DIV 16)+1
13050y1%=((y1%+36) DIV 40)*-1:y2%=(((y2%+36) DIV 40)-1)*-1
13060p%=wind%(w%,1)-maxpuzz%-1:l%=pword%(pw%,2)
13070addr1%=puzzin%(p%):addr2%=addr1%+addr1%!16
13080addr2%=addr1%+addr2%!(l%*4-4)
13090n%=addr2%!0:addr2%+=4
13100FOR a%=1 TO n%
13110 IF a%>=y1% AND a%<=y2% THEN
13120 MOVE pword%(pw%,3),-(a%*40+36)
13130 IF ?addr2% AND 128 THEN
13140 SYS "Wimp_SetColour",3:SYS "OS_WriteC",?addr2% EOR 128
13150 ELSE
13160 SYS "Wimp_SetColour",7:SYS "OS_WriteC",?addr2%
13170 ENDIF
13180 SYS "OS_WriteN",addr2%+1,l%-1
13190 addr2%+=l%
13200 ELSE
13210 addr2%+=l%
13220 ENDIF
13230NEXT
13240ENDPROC
13250:
13260DEF FNWord(n%,addr%)
13270A%=n%:B%=addr%:C%=b2%:CALL Word
13280=$b2%
13290LOCAL off%,a%,l%,c%,a$,b%
13300IF n%=&FFFF THEN =""
13310a%=addr%+addr%!16
13320b%=addr%+addr%!12
13330l%=0:c%=2
13340REPEAT
13350 IF n%<(!(b%+c%*4)) AND n%>=(!(b%+c%*4-4)) THEN l%=c%
13360 c%+=1
13370UNTIL l%<>0
13380a%=addr%+a%!(l%*4-4)
13390a%=a%+(n%-!(b%+l%*4-4))*l%+4
13400a$=""
13410FOR c%=0 TO l%-1
13420a$+=CHR$(a%?c%)
13430NEXT
13440=a$
13450:
13460DEF FNWNum(hand%)
13470LOCAL a%,f%
13480f%=-1
13490FOR a%=0 TO numwind%
13500 IF wind%(a%,0)=hand% THEN f%=a%
13510NEXT
13520=f%
13530:
13540DEF FNINum(w%,hand%)
13550LOCAL a%,f%,h%
13560f%=-1
13570h%=wind%(w%,0)
13580FOR a%=0 TO numicon%
13590 IF icon%(a%,9)=hand% AND icon%(a%,5)=h% THEN f%=a%
13600NEXT
13610=f%
13620:
13630DEF FNIFlags(w%,i%)
13640iconst%!0=wind%(w%,0)
13650iconst%!4=icon%(i%,9)
13660SYS "Wimp_GetIconState",,iconst%
13670=iconst%!24
13680:
13690REM Just about the only time I've ever
13700REM passed an array to a procedure.
13710REM (and got away with both my eyebrows!!!) (never mind)
13720DEF FN1stFree(array%(),maxdim%)
13730LOCAL a%,f%
13740a%=-1:f%=-1
13750REPEAT
13760 a%+=1
13770 IF array%(a%)=0 THEN f%=a%
13780UNTIL f%<>-1 OR a%=maxdim%
13790=f%
13800:
13810DEF FNPNumOfWords(addr%)
13820=!(!(addr%+addr%!12)*4+addr%+addr%!12)
13830:
13840DEF FNWordAddr(l%,w%,addr%)
13850LOCAL addr1%
13860addr1%=addr%+addr%!16:addr1%=addr%+addr1%!(l%*4-4)
13870=addr1%+4+l%*w%
13880:
13890DEF FNClueAddr(c%,d%,addr%)
13900LOCAL addr1%
13910IF d%=0 addr1%=addr%+addr%!24 ELSE addr1%=addr%+addr%!28
13920=addr1%+c%*8-4
13930:
13940DEF PROCInitCreateJig
13950LOCAL p%,addr1%,addr2%,n%,l%
13960b%!0=wind%(1,0):b%!4=icon%(14,9)
13970b%!8=0:b%!12=1<<21
13980SYS "Wimp_SetIconState",,b%
13990p%=FN1stFree(pfree%(),maxpuzz%)
14000IF p%=-1 THEN PROCError2nd(3):ENDPROC
14010create%(0)=VAL($data%(icon%(11,7),0))
14020create%(1)=VAL($data%(icon%(12,7),0))
14030create%(2)=(FNIFlags(1,13)>>21) AND %1
14040IF create%(0)<30 THEN PROCError2nd(1):ENDPROC
14050IF create%(1)<15 THEN PROCError2nd(2):ENDPROC
14060IF create%(0)>99 THEN PROCError2nd(7):ENDPROC
14070IF create%(1)>99 THEN PROCError2nd(8):ENDPROC
14080IF nxtpuzzst%+32>=puzzend% THEN
14090 PROCError2nd(4)
14100 ENDPROC
14110ENDIF
14120b%!0=wind%(1,0):b%!4=icon%(14,9)
14130b%!8=1<<22:b%!12=1<<22
14140SYS "Wimp_SetIconState",,b%
14150create%(3)=%00:create%(4)=0:create%(5)=p%
14160create%(6)=nxtpuzzst%:create%(7)=puzzend%-nxtpuzzst%
14170b%!0=wind%(1,0):b%!4=icon%(14,9)
14180b%!8=1<<22:b%!12=1<<22
14190SYS "Wimp_SetIconState",,b%
14200SYS "Hourglass_On"
14210A%=create%(0)-1:B%=create%(1)-1:CALL csize%
14220A%=create%(6):B%=create%(7):CALL cpuzzarea%
14230CALL cinitvar%
14240CALL createjig%
14250SYS "Hourglass_Off"
14260b%!0=wind%(1,0):b%!4=icon%(14,9)
14270b%!8=1<<22:b%!12=0<<22
14280SYS "Wimp_SetIconState",,b%
14290IF !result%=-1 THEN
14300 b2%!0=0
14310 $(b2%+4)=error$(4)+CHR$(0)
14320 SYS "Wimp_ReportError",b2%,%10101,"!JigWord"
14330 ENDPROC
14340ENDIF
14350IF create%(2)=1 THEN
14360 addr1%=create%(6)
14370 IF RND(2)=1 THEN addr2%=addr1%+addr1%!24 ELSE addr2%=addr1%+addr1%!28
14380 n%=addr2%!0:addr2%+=4
14390 addr2%+=(RND(n%)-1)*8
14400 addr2%?6=addr2%?4:addr2%?7=addr2%?5
14410 n%=addr2%!4 AND &FFFF:l%=addr2%?2
14420 addr2%=addr1%+addr1%!16
14430 addr2%+=l%*4-4
14440 addr2%=addr1%+!addr2%:addr2%+=4:addr2%+=l%*n%
14450 ?addr2%=?addr2% OR 128
14460ENDIF
14470PROCInitialiseDispFile(create%(5))
14480PROCCreatePuzzWind(create%(5))
14490mask%=0
14500ENDPROC
14510:
14520REM a little used procedure
14530DEF PROCCycle
14540b%!0=wind%(1,0):b%!4=icon%(14,9)
14550b%!8=0<<22:b%!12=1<<22
14560SYS "Wimp_SetIconState",,b%
14570mask%=1
14580CALL createinbckgnd
14590ENDPROC
14600:
14610REM A weather vain?
14620DEF PROCNextWindPos(w%)
14630IF nextwpos%=4 THEN nextwpos%=0
14640wind%(w%,2)=100:wind%(w%,5)=800-48*nextwpos%
14650nextwpos%+=1
14660ENDPROC
14670:
14680DEF PROCCreatePuzzWind(p%)
14690LOCAL w%,vx%,vy%,ht%,wid%,addr%,a%,more%
14700IF pinfo%(p%,3)=5 THEN PROCError2nd(6):ENDPROC
14710w%=FN1stFree(wuse%(),numwind%)
14720IF w%=-1 THEN
14730 PROCError2nd(5)
14740 ENDPROC
14750ENDIF
14760wuse%(w%)=-1
14770pinfo%(p%,3)+=1
14780addr%=puzzin%(p%)
14790wid%=addr%!4*20+40:ht%=addr%!8*40+12
14800wind%(w%,1)=p%
14810PROCNextWindPos(w%)
14820IF wid%>=640 THEN
14830 wind%(w%,4)=wind%(w%,2)+640
14840ELSE
14850 wind%(w%,4)=wind%(w%,2)+wid%
14860ENDIF
14870IF ht%>=612 THEN
14880 wind%(w%,3)=wind%(w%,5)-612
14890ELSE
14900 wind%(w%,3)=wind%(w%,5)-ht%
14910ENDIF
14920wind%(w%,6)=0:wind%(w%,7)=0
14930wind%(w%,8)=0:wind%(w%,9)=-ht%
14940wind%(w%,10)=wid%:wind%(w%,11)=0
14950wind%(w%,12)=0:wind%(w%,13)=0
14960wind%(w%,14)=%00010+(255<<24)
14970wind%(w%,15)=1
14980wind%(w%,16)=0:wind%(w%,17)=0
14990wind%(w%,18)=pinfo%(p%,5)
15000wind%(w%,19)=3
15010wind%(w%,20)=%0
15020wind$(w%)="0123456789ABCD"
15030PROCCreateWindow(w%)
15040pinfo%(p%,5)=wind%(w%,18)
15050IF pinfo%(p%,3)=1 THEN
15060 $data%(wind%(w%,18),0)="JigWord "+STR$(p%)
15070ELSE
15080 $data%(wind%(w%,18),0)="JigWord "+STR$(p%)+" "+STR$(pinfo%(p%,3))
15090ENDIF
15100FOR a%=0 TO numwind%
15110 IF wuse%(a%)<>0 AND wind%(a%,1)=p% THEN
15120 IF a%<>w% THEN
15130 !b%=wind%(a%,0)
15140 SYS "Wimp_GetWindowState",,b%:wf%=b%!28
15150 SYS "Wimp_ForceRedraw",-1,b%!4,b%!16,b%!12,b%!16+44
15160 ELSE
15170 PROCOpenWindow(a%,-1)
15180 ENDIF
15190 ENDIF
15200NEXT
15210ENDPROC
15220:
15230DEF PROCCreateWordWind(p%)
15240LOCAL w%,a%,mw%,mh,addr1%,addr2%,icst%,f%,ww%
15250w%=FN1stFree(wuse%(),numwind%)
15260IF w%=-1 THEN PROCError2nd(5):ENDPROC
15270ww%=FN1stFree(pwuse%(),maxpword%)
15280IF ww%=-1 THEN PROCError2nd(5):ENDPROC
15290wuse%(w%)=-1
15300pwuse%(ww%)=-1
15310addr1%=puzzin%(p%):addr2%=addr1%+addr1%!12
15320mw%=!addr2%:addr2%+=8
15330IF mw%<LEN(" � Letters � ") THEN mw%=17
15340mh%=0
15350FOR a%=2 TO addr2%!-8
15360IF (!addr2%-addr2%!-4)>mh% THEN mh%=!addr2%-addr2%!-4:pword%(ww%,2)=a%:f%=-1
15370addr2%+=4
15380NEXT
15390mh%+=2
15400wind%(w%,1)=p%+maxpuzz%+1
15410wind%(w%,8)=0:wind%(w%,11)=0
15420wind%(w%,9)=-(mh%*40+16)
15430wind%(w%,10)=mw%*16+40
15440PROCNextWindPos(w%)
15450wind%(w%,4)=100+wind%(w%,10)
15460IF wind%(w%,9)<-600 THEN
15470 wind%(w%,3)=200
15480ELSE
15490 wind%(w%,3)=wind%(w%,5)+wind%(w%,9)
15500ENDIF
15510wind%(w%,6)=0:wind%(w%,7)=0
15520wind%(w%,12)=0:wind%(w%,13)=0
15530wind%(w%,14)=%10+(255<<24)
15540wind%(w%,15)=1
15550icst%=pwordiconst%+ww%*3
15560wind%(w%,16)=icst%
15570wind%(w%,17)=3
15580wind%(w%,18)=-1
15590wind%(w%,19)=3
15600wind%(w%,20)=ww%
15610wind$(w%)="JigWord "+STR$(p%)
15620icon%(icst%,0)=wind%(w%,10)/2-120:icon%(icst%,1)=-48
15630icon%(icst%,2)=icon%(icst%,0)+18:icon%(icst%,3)=-8
15640icon%(icst%,4)=%11001+(2<<12)+(7<<24)
15650icon%(icst%,5)=-1:icon%(icst%,6)=0
15660icon%(icst%,7)=-1:icon%(icst%,8)=1:icon$(icst%,0)=CHR$136
15670icst%+=1
15680icon%(icst%,0)=wind%(w%,10)/2+104:icon%(icst%,1)=-48
15690icon%(icst%,2)=icon%(icst%,0)+18:icon%(icst%,3)=-8
15700icon%(icst%,4)=%11001+(2<<12)+(7<<24)
15710icon%(icst%,5)=-1:icon%(icst%,6)=0
15720icon%(icst%,7)=-1:icon%(icst%,8)=1:icon$(icst%,0)=CHR$137
15730icst%+=1
15740icon%(icst%,0)=wind%(w%,10)/2-84:icon%(icst%,1)=-48
15750icon%(icst%,2)=icon%(icst%,0)+168:icon%(icst%,3)=-8
15760icon%(icst%,4)=%100011001+(7<<24)
15770icon%(icst%,5)=0:icon%(icst%,6)=1
15780icon%(icst%,7)=-1:icon%(icst%,8)=11
15790icon$(icst%,0)=STR$(pword%(ww%,2))+" Letters"
15800icon$(icst%,1)=""
15810PROCCreateWindow(w%)
15820pinfo%(p%,8)+=1
15830pinfo%(p%,4)=pinfo%(p%,4) OR %10
15840pword%(ww%,0)=w%
15850pword%(ww%,1)=p%
15860pword%(ww%,3)=wind%(w%,10)/2-pword%(ww%,2)*8
15870pword%(ww%,4)=pword%(ww%,3)+pword%(ww%,2)*16
15880pword%(ww%,5)=mh%-3
15890PROCOpenWindow(w%,-1)
15900ENDPROC
15910:
15920REM IF error trapping enhanced here, remember the grid backgnd col.
15930REM This little horror took me forever. You can change the print ratio
15940REM here if you want a bigger JigWord printed
15950DEF PROCPrintPuzzGrid(w%,p%)
15960LOCAL H%,O%,plx%,prx%,pby%,pty%
15970LOCAL f1%,f2%,x1%,y1%,x2%,y2%
15980H%=OPENOUT(print$)
15990LOCAL ERROR
16000ON ERROR LOCAL RESTORE ERROR:CLOSE#H%:PROCErrorPrint1st:ENDPROC
16010SYS &80145,H%,"JigWord" TO O%
16020LOCAL ERROR
16030ON ERROR LOCAL RESTORE ERROR:SYS&80149,H%:SYS&80145,O%:CLOSE#H%:PROCError1st
16040:
16050SYS &80143 TO,,,plx%,pby%,prx%,pty%
16060b%!0=0:b%!4=-(pinfo%(p%,1)*40+12):b%!8=pinfo%(p%,0)*20+40:b%!12=0
16070b%!16=65536:b%!20=0:b%!24=0:b%!28=65536
16080b%!32=plx%:b%!36=pby%
16090SYS "PDriver_GiveRectangle",%101,b%,b%+16,b%+32,&FFFFFF00
16100:
16110SYS "PDriver_DrawPage",1,b2% TO f1%,,f2%
16120a%=0
16130A%=0:CALL ChangeBckGndCol
16140WHILE f1%
16150 ORIGIN 0,0
16160 REMPROCPuzzRect(w%,b2%!0,b2%!4,b2%!8,b2%!12)
16170 x1%=(b2%!0-22) DIV 20:x2%=(b2%!8-22) DIV 20
16180 y1%=(b2%!4+8) DIV -40:y2%=(b2%!12+8) DIV -40
16190 IF y1%>y2% THEN SWAP y1%,y2%
16200 IF x1%<0 THEN x1%=0
16210 IF x1%>=pinfo%(p%,0) THEN x1%=pinfo%(p%,0)-1
16220 IF x2%>=pinfo%(p%,0) THEN x2%=pinfo%(p%,0)-1
16230 A%=0:B%=0:CALL ChangeSel
16240 A%=puzzin%(p%):B%=wind%(w%,20) AND %1:C%=scratch%
16250 D%=x1%:E%=y1%:F%=x2%:G%=y2%:CALL CreateHeap
16260 CALL Gridsetc
16270 a%+=1
16280 OSCLI "SET A1"+CHR$(64+a%)+" "+STR$(x1%)
16290 OSCLI "SET A2"+CHR$(64+a%)+" "+STR$(y1%)
16300 OSCLI "SET A3"+CHR$(64+a%)+" "+STR$(x2%)
16310 OSCLI "SET A4"+CHR$(64+a%)+" "+STR$(y2%)
16320 SYS "PDriver_GetRectangle",,b2% TO f1%,,f2%
16330ENDWHILE
16340A%=3:CALL ChangeBckGndCol
16350:
16360SYS "PDriver_EndJob",H%
16370RESTORE ERROR
16380SYS "PDriver_SelectJob",O%
16390RESTORE ERROR
16400CLOSE#H%
16410ENDPROC
16420:
16430DEF PROCPrintWordList(p%)
16440LOCAL addr1%,addr2%,n%,o%,nw%,c%,t$,d%,m%
16450addr1%=puzzin%(p%)
16460addr2%=addr1%+addr1%!16
16470o%=addr2%!0
16480*FX 3 10
16490PRINT STRING$(pwidth%/2-8," ");"JigWord word list"
16500PRINT STRING$(pwidth%/2-8," ");"-----------------"
16510PRINT:PRINT:PRINT
16520FOR n%=2 TO o%
16530 addr2%+=4
16540 IF !addr2%<>0 THEN
16550 addr3%=addr1%+!addr2%
16560 nw%=!addr3%:addr3%+=4
16570 t$=STR$(n%)+" letter word"
16580 IF nw%>1 THEN t$+="s"
16590 PRINT t$'STRING$(LEN(t$),"-"):PRINT
16600 m%=pwidth% DIV (n%+1):d%=0
16610 FOR c%=1 TO nw%
16620 d%+=1
16630 SYS "OS_WriteN",addr3%,n%:PRINT " ";
16640 IF d%=m% THEN SYS "OS_NewLine":d%=0
16650 addr3%+=n%
16660 NEXT
16670 PRINT:PRINT:PRINT
16680 ENDIF
16690NEXT
16700*FX 3 0
16710ENDPROC
16720:
16730REM If you think the comments are bad in this program
16740REM you should have seen the machine-code source code.
16750REM I apologise if there are some silly words in the
16760REM dictionary.
16770REM Anyone who doesn't get the room 101 bit, go and read
16780REM '1984' by George Orwell. It's a lot more interesting
16790REM that this. And a lot easier to understand.
16800:
16810REM I think we should do a survey. I'm programming at the
16820REM moment on ARMBE, with red text on black. What colour
16830REM schemes does everyone else use?
16840:
16850:
16860:
16870Don't you just luuurve it!
16880
16890********
� >!RunImage
I� Remember to test if CreateMenu reports an error abt indirected data
F� Remember to do PROCDeleteMStruct for all those difficult windows
(4� � � 0:ș "Wimp_CloseDown":� �$;" at line ";�:�
2:
<9ș "Wimp_Initialise",200,&4B534154,"JigWord" � ,task%
F:
P�Initialise
ZA%=hilitecol%:� ChangeHiCol
d�CreateIcon(0)
n:
x�CreateWindow(1)
�:
�'quit%=�:menus%=-1:menuw%=-1:mask%=1
��
� � � � �Error1st
�! ș "Wimp_Poll",mask%,b% � p%
� Ȏ p% �
� � 0:�PROCCycle
� � 1:�P_1(b%)
�" � 2:ș "Wimp_OpenWindow",,b%
� � 3:�P_3(b%)
� � 6:�P_6(b%)
� � 8:�P_8(b%)
� � 9:�P_9(b%)
� 17,18:�Receive(b%)
�
� quit%
"'ș "Wimp_CloseDown",task%,&4B534154
,�
6:
@& "Oh no! An error, this can't be!"
J) 'Sorry, but it's worse than that.'
T4 "Worse? It, it, it's not a fatal error, is it?"
^* 'That just about sums it up. Sorry'
h "Arghhhh!"
r:
|� �Error1st
�
!error%=�
�#$(error%+4)=�$+" at line "+�(�)
�+ș "Wimp_ReportError",error%,,"JigWord"
�ș "Wimp_CloseDown"
��
��
�:
�4 "Stop messing with my mind you little horrors!"
�
�8 'But it's our job. Don't think of us as an error,
�4 more as messages from RISCOS - postcards from
� ROM.'
�
9 "ROM, ROM? Isn't that where the volcano appeared and
; wiped out hundreds of innocent programmers? I saw that
video last night."
&
07 'You really do have problems. I don't think your
:, sliced loaf goes right to the crust.'
D
N= "And your disc drive head doesn't go to the last track."
X
b5 'Touchy touchy, aren't we. Well, onto the next
l procedure.'
v:
�� �Error2nd(err%)
�!error%=err%
�$(error%+4)=error$(err%)
�+ș "Wimp_ReportError",error%,,"JigWord"
��
�:
� "Noooooooo!"
�% 'Don't worry about it. Relax.'
� "Arghhhhhh!"
�8 'It's only another type of fatal internal error.'
�
� 'And stop dribbling!'
�:
� �Error3rd
!error%=0
$(error%+4)=err$
+ș "Wimp_ReportError",error%,,"JigWord"
*ș "Wimp_CloseDown"
4�
>�
H:
R "?"
\
f/ 'That's it, take him away lads. Into the
p' land of eternal internal error.'
z
� "?"
�
� 'Take him to room 101.'
�
� "What, what's in room 101?"
�
�. 'You know what is in room 101. Everyone
�! knows what is in room 101'
�
� "Arghhhhh!"
�:
�� �ErrorPrint1st
�
!error%=�
#$(error%+4)=�$+" at line "+�(�)
+ș "Wimp_ReportError",error%,,"JigWord"
� 'Snigger snigger.'
$�
.:
8� �Initialise
Bhilitecol%=9
Lprint$="printer:"
Vpwidth%=80
`:
j� b% 256
t
� b2% 256
~� code% 4096
�:
�� creates% 7*1024
� cjiglen%=8192:cscratlen%=512
�+� cjigst% cjiglen%,cscratst% cscratlen%
�:
�6ș "OS_ReadVarVal","JigWord$Dir",b%,255,0,0 � ,,l%
�
b%?l%=&0D
�
path$=$b%
�h%=�(path$+".Words")
�9wordlen%=(�#h%)+((�#h%)<<8)+((�#h%)<<16)+((�#h%)<<24)
��#h%
�� wordst% wordlen%
+� "Load "+path$+".Words 10_"+�(wordst%)
:
.� "Load "+path$+".CreateO 10_"+�(creates%)
result%=creates%
("changejig%=creates%+creates%!4
2 cwordst%=creates%+creates%!8
<csize%=creates%+creates%!12
F&changecscrat%=creates%+creates%!16
P#cpuzzarea%=creates%+creates%!20
Z"cinitvar%=creates%+creates%!24
d#createjig%=creates%+creates%!28
ncrand%=creates%+creates%!32
xA%=�(-�):A%=�:� crand%
�'A%=cjigst%:B%=cjiglen%:� changejig%
�A%=wordst%:� cwordst%
�.A%=cscratst%:B%=cscratlen%:� changecscrat%
�:
�� dispjigst% 6144
�1� "Load "+path$+".JigDispO 10_"+�(dispjigst%)
�(ChangeHiCol=dispjigst%+dispjigst%!00
�(puzzshuffle=dispjigst%+dispjigst%!04
�'puzzselect=dispjigst%+dispjigst%!08
�!HFit=dispjigst%+dispjigst%!12
�!VFit=dispjigst%+dispjigst%!16
�&ChangeJig=dispjigst%+dispjigst%!20
�&ChangeSel=dispjigst%+dispjigst%!24
'CreateHeap=dispjigst%+dispjigst%!28
%Gridsetc=dispjigst%+dispjigst%!32
!Word=dispjigst%+dispjigst%!36
")puzzshflags1=dispjigst%+dispjigst%!40
,'nextpuzzst=dispjigst%+dispjigst%!44
6!selh=dispjigst%+dispjigst%!48
@!selv=dispjigst%+dispjigst%!52
J fit=dispjigst%+dispjigst%!56
T!hlen=dispjigst%+dispjigst%!60
^!vlen=dispjigst%+dispjigst%!64
h,ChangeBckGndCol=dispjigst%+dispjigst%!68
r:
|err%=�:err$=""
�� error$(10),error% 256
�� a%=0 � 8
� � error$(a%)
��
�:
�maxpuzz%=10
�;� puzzst% 32*1024,puzzin%(maxpuzz%),pinfo%(maxpuzz%,10)
�� puzzim% 1024
�puzzend%=puzzst%+32*1024
�nxtpuzzst%=puzzst%
�� pfree%(maxpuzz%)
�:
�� scratch% 4096
:
maxpword%=10
+� pword%(maxpword%,5),pwuse%(maxpword%)
&:
0� create%(10)
::
D9� sprarea%(4):� sprite area addresses, 0 is Wimp area
Nsprarea%(0)=1
X:
bnumicon%=75:nexticon%=0
l)� icon%(numicon%,9),icon$(numicon%,1)
v� iconst% 64
��ReadIconData
�pwordiconst%=nexticon%
�nexticon%+=(maxpword%+1)*3
�:
�&nummenu%=10:nextmenu%=0:maxitem%=9
�;� item%(nummenu%,maxitem%,4),item$(nummenu%,maxitem%,1)
�'� menu%(nummenu%,1),menu$(nummenu%)
�$� menust% 1024,menuin%(nummenu%)
�8nxtmenust%=menust%:menuend%=menust%+1024:nextmenu%=0
��ReadMenuData
�:
�&numms%=10:� number menu structures
�(� mstructst% 1023,mstructin%(numms%)
6nxtmstruct%=mstructst%:mstructend%=mstructst%+1024
�ReadMStructData
:
numdat%=200
*#� indata% 1024,data%(numdat%,3)
4dataend%=indata%+1024
>!nextdat%=0:nextdatst%=indata%
H� indirected data
RB� data%(item num,[data start,length,validation{-1},length{-1}]
\:
fAnextwpos%=0:� incremented to allow windows to open at offsets
pnumwind%=15
z8� wind%(numwind%,20),wind$(numwind%),wuse%(numwind%)
�� wbuff% 512
��ReadWindowData
��
�:
�0 Anyone wanting to know how the puzzles are
�6 created, tough! It's all in machine code. And so
� is the display code.
�:
�� �InitialiseDispFile(p%)
�pinfo%(p%,0)=nxtpuzzst%!4
�pinfo%(p%,1)=nxtpuzzst%!8
�)pinfo%(p%,2)=�PNumOfWords(nxtpuzzst%)
�pinfo%(p%,3)=0
pinfo%(p%,4)=0
pinfo%(p%,5)=-1
pinfo%(p%,6)=-1
$pinfo%(p%,7)=-1
.pinfo%(p%,8)=0
8pinfo%(p%,9)=0
Bpinfo%(p%,10)=0
Lpfree%(p%)=-1
Vpuzzin%(p%)=nxtpuzzst%
`nxtpuzzst%+=!nxtpuzzst%
j�
t:
~� �ReadIconData
�� a%,b%,n%
�
� �TlP
�� n%
�� a%=0 � n%-1
� � b%=0 � 9
� � icon%(a%,b%)
�% � icon%(a%,6)=4 � icon%(a%,6)=1
� �
� � icon$(a%,0),icon$(a%,1)
�G �CheckIconData(a%,icon%(a%,8),icon$(a%,0),icon$(a%,1),icon%(a%,4))
� � err% � �Error3rd
��
nexticon%=n%
�
$� �CheckIconData(i%,l%,a$,b$,f%)
Ȏ icon%(a%,6) �
( � 0:
23 � �(a$)>12 � (f% � %1)<>%1 � (f% � 256)=256 �
<2 err%=�:err$="Icon "+�(i%)+" is invalid (0)"
F �
P �
Z � 1:
d3 � �(a$)+1>l% � (f% � %1)<>%1 � (f% � 256)=0 �
n2 err%=�:err$="Icon "+�(i%)+" is invalid (1)"
x �
� �
� � 2:
�5 � �(a$)>12 � (f% � %10)<>%10 � (f% � 256)=256 �
�2 err%=�:err$="Icon "+�(i%)+" is invalid (2)"
� �
� �
� � 3:
�: � �(a$)+1>l% � b$="" � (f% � %10)=0 � (f% � 256)=0 �
�2 err%=�:err$="Icon "+�(i%)+" is invalid (3)"
� �
� �
� � 4:
�@ err%=�:err$="Icon "+�(i%)+" has type 4, please use type 1"
6 err%=�:err$="Icon "+�(i%)+" has an unknown type"
�
"�
,�
6:
@� �ReadMenuData
J� a%,n%,b%
T
� �DnO
^� n%
h� a%=0 � n%-1
r � menu$(a%)
| � menu%(a%,0),menu%(a%,1)
� � b%=0 � menu%(a%,1)-1
�C � item%(a%,b%,0),item%(a%,b%,1),item%(a%,b%,2),item%(a%,b%,3)
� � item%(a%,b%,4)
�% � item$(a%,b%,0),item$(a%,b%,1)
� �
� �CheckMenuData(a%)
� � err% � �Error3rd
��
��
�� �CheckMenuData(m%)
�� b%,f%
�� �(menu$(m%))>12 �
�) err$="Menu "+�(a%)+" title too long"
err%=�
�
�
&� b%=0 � menu%(m%,1)-1
0 f%=item%(m%,b%,3)
:' � (f% � %100001)<>%10001 � f%<>0 �
DG err$="Menu "+�(m%)+" item "+�(b%)+" icon flags should be %100001"
N err%=�
X �
b �
l, � �(item$(m%,b%,0))>12 � (f% � 256)=0 �
v? err$="Menu "+�(m%)+" item "+�(b%)+" should be indirected"
� err%=�
� �
� �
�< � (f% � 256)=256 � �(item$(m%,b%,0))+1<item%(m%,b%,4) �
�; err$="Menu "+�(m%)+" item "+�(b%)+" should is a mess"
� err%=�
� �
� �
��
��
�:
�� �ReadMStructData
�� a%,n%,o%,addr%,d%
� �tNR
� n%
addr%=nxtmstruct%
� a%=0 � n%-1
* mstructin%(a%)=addr%
4 �
>
� d%
H !addr%=d%
R addr%+=4
\ � d%=-1
f�
pnstmstruct%=addr%
z�
�:
�� �ReadWindowData
�� a%,n%,b%
�
� �tHN
�� n%
�� a%=0 � n%-1
� � wind$(a%)
� � b%=0 � 20
� � wind%(a%,b%)
� �
� wuse%(a%)=-1
��
��
:
I� If you get the first message, congratulations! It took me forever.
:
$I� "Not enough indirected data workspace, tell a competent programmer"
.� "Minimum width is 30"
8� "Minimum height is 15"
B� "Too many puzzles"
L"� "Not enough room for puzzle"
V+� "Not enough workspace to open window"
`(� "Only 5 views of a puzzle allowed"
j� "Maximum width is 99"
t� "Maximum height is 99"
~?� Actually 255*255 is the biggest size. But also impossible
�:
�
� Windows
�� 3
�� About this program
�� -1,-1, 0,0,604,212, 0,0
�� 0,-212,604,0, 0,0
�� %10010+(132<<24)
�� 1
�� 1,8,-1,0,0
�
�� "JigWord Creation"
�!� -1,-1, 200,200,456,800, 0,0
� 0,-256,0,0, 0,200
� %10010+(135<<24)+(1<<12)
� 1,9,6,-1,3,0
(� "About this Puzzle"
2� -1,-1,0,0,332,160, 0,0
<� 0,-160,332,0, 0,0
F� %10010+(132<<24)
P� 1
Z� 15,6,-1,0,0
d:
n:
x� Menus
�� 3
�� JigWord,72,2
�� -1,%0000,0,0,0,Info,
�� -1,%10000000,-1,0,0,Quit,
�
�� JigWord,136,5
�� -1,%0000,2,0,0,Info,
�� -1,%0000,-1,0,0,Cheat,
�� -1,%0000,-1,0,0,Words,
�� -1,%0000,-1,0,0,New View,
� � -1,%10000000,-1,0,0,Print,
�:
�� Words,136,2
� -1,%0000,-1,0,0,New View,
� -1,%10000000,-1,0,0,Print,
:
":
,:
6� Icons
@� 21
J� 0,0,68,68,(3<<12)+%10
T� -1,2,-1,9,-1
^� "!jigword",
h
r/� 20,-48,156,-8,%1000010001+(7<<24)+(2<<28)
|� 0,0,-1,8,-1,"Name:",
�1� 20,-100,156,-60,%1000010001+(7<<24)+(2<<28)
�� 0,0,-1,8,-1,"Purpose:",
�2� 20,-152,156,-112,%1000010001+(7<<24)+(2<<28)
�� 0,0,-1,8,-1,"Author:",
�2� 20,-204,156,-164,%1000010001+(7<<24)+(2<<28)
�� 0,0,-1,8,-1,"Version:",
�4�DATA 160,-48,598,-8,%1000111101+(7<<24)+(0<<28)
�0� 160,-52,598,-4,%1000111101+(7<<24)+(0<<28)
�� 0,0,-1,9,-1,"!JigWord",
�6�DATA 160,-100,598,-60,%1000111101+(7<<24)+(0<<28)
�2� 160,-104,598,-56,%1000111101+(7<<24)+(0<<28)
� � 0,0,-1,8,-1,"Puzzlement!",
�7�DATA 160,-152,598,-112,%1100111101+(7<<24)+(0<<28)
3� 160,-156,598,-108,%1100111101+(7<<24)+(0<<28)
%� 0,1,-1,16,-1,"P.Bentley, 1991",
7�DATA 160,-204,598,-164,%1100111101+(7<<24)+(0<<28)
&3� 160,-208,598,-160,%1100111101+(7<<24)+(0<<28)
0)� 0,1,-1,20,-1,"1.62 (05, Apr 1992)",
:
D'� 20,-48,236,-4,%1000010001+(7<<24)
N� 0,0,-1,8,-1,"Width:",
X)� 20,-100,236,-56,%1000010001+(7<<24)
b� 0,0,-1,8,-1,"Height:",
l.�DATA 20,-152,236,-112,%1100010001+(7<<24)
v'�DATA 0,1,-1,14,-1,"Word density:",
�9� 240,-48,304,-4,%0100111101+(7<<24)+(0<<28)+(15<<12)
�� 0,1,-1,3,-1,"30","A0-9"
�;� 240,-100,304,-56,%0100111101+(7<<24)+(0<<28)+(15<<12)
�� 0,1,-1,3,-1,"15","A0-9"
�@�DATA 240,-152,304,-112,%0100111101+(7<<24)+(0<<28)+(15<<12)
��DATA 0,1,-1,3,-1,,"A0-9"
�;� 48,-168,284,-120,%1100010011+(7<<24)+(1<<28)+(11<<12)
�0� 0,1,-1,12,-1,"Start Word:","Soptoff,opton"
�@�DATA 144,-224,284,-180,%1100010011+(7<<24)+(1<<28)+(11<<12)
�-�DATA 0,1,-1,6,-1,"Grid:","Soptoff,opton"
�@� 120,-232,224,-188,%111101+(7<<24)+(12<<28)+(9<<12)+(1<<16)
�� 0,0,-1,7,-1,"Create",
�
'� 20,-48,236,-8,%1000010001+(7<<24)
� 0,0,-1,6,-1,"Width:",
)� 20,-100,236,-60,%1000010001+(7<<24)
� 0,0,-1,7,-1,"Height:",
**� 20,-152,236,-112,%1100010001+(7<<24)
4#� 0,1,-1,14,-1,"No. of words:",
>4�DATA 240,-48,312,-8,%0000111101+(7<<24)+(0<<28)
H0� 240,-52,312,-4,%0000111101+(7<<24)+(0<<28)
R� 0,0,-1,14,-1,"",
\2� 240,-104,312,-56,%0000111101+(7<<24)+(0<<28)
f� 0,0,-1,14,-1,"",
p3� 240,-156,312,-108,%0000111101+(7<<24)+(0<<28)
z� 0,0,-1,14,-1,"",
�:
�:
�� menu structures
�� 3
�� 0,&8000,-1
�� 2,&8001,-1
�� &8002,-1
�:
�(� �SIcon(s$,but%,h%,x1%,y1%,x2%,y2%)
�b%!0=h%
�b%!4=x1%
�b%!8=y1%
�
b%!12=x2%
b%!16=y2%
b%!20=%10+(but%<<12)
$(b%+24)=s$
$!ș "Wimp_CreateIcon",,b% � h%
.=h%
8:
B� �CreateWindow(w%)
L� addr%,offset%,h%,a%
Vaddr%=wbuff%
`+addr%!0=wind%(w%,2):addr%!4=wind%(w%,3)
j,addr%!8=wind%(w%,4):addr%!12=wind%(w%,5)
t-addr%!16=wind%(w%,6):addr%!20=wind%(w%,7)
~addr%!24=-1
�addr%!28=wind%(w%,14)
�Ȏ wind%(w%,15) �
� � 1:
� addr%?32=7:addr%?33=2
� addr%?34=7:addr%?35=1
� addr%?36=3:addr%?37=1
� addr%?38=12:addr%?39=0
� :
��
�-addr%!40=wind%(w%,8):addr%!44=wind%(w%,9)
�/addr%!48=wind%(w%,10):addr%!52=wind%(w%,11)
�� �(wind$(w%))>12 �
addr%!56=%100011001
�
addr%!56=%11001
�
('addr%!60=wind%(w%,19)<<12:� buttons
2$addr%!64=1:� sprite area pointer
<;addr%?68=wind%(w%,12) � 256:addr%?69=wind%(w%,12) � 256
F;addr%?70=wind%(w%,13) � 256:addr%?71=wind%(w%,13) � 256
P� �(wind$(w%))<=12 �
Z $(addr%+72)=wind$(w%)
d�
n � wind%(w%,18)<>-1 �
x$ addr%!72=data%(wind%(w%,18),0)
� addr%!76=-1
�$ addr%!80=data%(wind%(w%,18),1)
�& $data%(wind%(w%,18),0)=wind$(w%)
� �
�/ � (nextdatst%+�(wind$(w%))+1)>=dataend% �
� �Error2nd(0)
� �
� �
�' wind%(w%,18)=nextdat%:nextdat%+=1
�A data%(wind%(w%,18),0)=nextdatst%:nextdatst%+=�(wind$(w%))+1
�* data%(wind%(w%,18),1)=�(wind$(w%))+1
� data%(wind%(w%,18),2)=-1
� data%(wind%(w%,18),3)=-1
$ addr%!72=data%(wind%(w%,18),0)
addr%!76=-1
$ addr%!80=data%(wind%(w%,18),1)
"& $data%(wind%(w%,18),0)=wind$(w%)
, �
6�
@addr%!84=wind%(w%,17)
Joffset%=88
T� wind%(w%,17)>0 �
^ h%=0
h4 � a%=wind%(w%,16) � wind%(w%,16)+wind%(w%,17)-1
r icon%(a%,9)=h%
|# �CreateIData(a%,addr%+offset%)
� offset%+=32
�
h%+=1
� �
��
�/ș "Wimp_CreateWindow",,addr% � wind%(w%,0)
�3� a%=wind%(w%,16) � wind%(w%,16)+wind%(w%,17)-1
� icon%(a%,5)=wind%(w%,0)
��
��
�:
�� �CreateMenu(m%)
�� a%,addr%,a$,b$,f%,id%
�+menuin%(m%)=nxtmenust%:addr%=nxtmenust%
$addr%=menu$(m%)
addr%?12=7:addr%?13=2
addr%?14=7:addr%?15=0
&addr%!16=menu%(m%,0)
0addr%!20=44:addr%!24=0
:
addr%+=28
D� a%=0 � menu%(m%,1)-1
N addr%!0=item%(m%,a%,1)
X � item%(m%,a%,2)<>-1 �
b � item%(m%,a%,2)<&8000 �
l& addr%!4=wind%(item%(m%,a%,2),0)
v �
�, addr%!4=menuin%(item%(m%,a%,2)-&8000)
� �
� �
� addr%!4=-1
� �
� f%=item%(m%,a%,3)
�
� f%=0 �
� addr%!8=(1<<5)+(7<<24)+1
� �
� addr%!8=f%
� �
� a$=item$(m%,a%,0)
� b$=item$(m%,a%,1)
? � �(a$)>12 � b$<>"" � (f% � 256)=256 � item%(m%,a%,4)>12 �
� item%(m%,a%,0)=-1 �
/ � (nextdatst%+�(a$)+�(b$)+2)>=dataend% �
�Error2nd(0)
* �
4 �
>2 id%=nextdat%:item%(m%,a%,0)=id%:nextdat%+=1
H9 data%(id%,0)=nextdatst%:nextdatst%+=item%(m%,a%,4)
R" data%(id%,1)=item%(m%,a%,4)
\ � b$<>"" �
f3 data%(id%,2)=nextdatst%:nextdatst%+=�(b$)+1
p data%(id%,3)=�(b$)+1
z �
�' data%(id%,2)=-1:data%(id%,3)=-1
� �
� �
� id%=item%(m%,a%,0)
� �
� $data%(id%,0)=a$
� � b$<>"" �
�( $(data%(id%,0)+item%(m%,a%,4))=b$
� �
� addr%!12=data%(id%,0)
� addr%!16=data%(id%,2)
� addr%!20=data%(id%,1)
� addr%!8=addr%!8 � (1<<8)
�
$(addr%+12)=item$(m%,a%,0)
�
$ addr%+=24
.�
8nxtmenust%=addr%
B�
L:
V� �CreateIcon(i%)
`iconst%!0=icon%(i%,5)
j�CreateIData(i%,iconst%+4)
t/ș "Wimp_CreateIcon",,iconst% � icon%(i%,9)
~�
�:
�� �CreateIData(i%,addr%)
�� t%,a$,b$
�!a$=icon$(i%,0):b$=icon$(i%,1)
�addr%!0=icon%(i%,0)
�addr%!4=icon%(i%,1)
�addr%!8=icon%(i%,2)
�addr%!12=icon%(i%,3)
�addr%!16=icon%(i%,4)
�t%=icon%(i%,6)
�Ȏ t% �
� � 0:$(addr%+20)=icon$(i%,0)
� 1,4:
G �IndirectText(addr%+20,a$,b$,icon%(i%,7),icon%(i%,8),icon%(i%,7))
� 2:$(addr%+20)=icon$(i%,0)
� 3:
(G �IndirectText(addr%+20,a$,"",icon%(i%,7),icon%(i%,8),icon%(i%,7))
2' addr%!24=sprarea%(�(icon$(i%,1)))
< � 4:
F) � 5:addr%!20=0:addr%!24=0:addr%!28=0
P�
Z�
d:
n� �CreateMStruct(s%,x%,y%)
x� a%,addr%,d%,e%
�nxtmenust%=menust%
�addr%=mstructin%(s%)
��
�
e%=d%
� d%=!addr%
�
addr%+=4
� � d%<>-1 �
�< � d%<&8000 � �CreateWindow(d%) � �CreateMenu(d%-&8000)
� �
�� d%=-1
�1ș "Wimp_CreateMenu",,menuin%(e%-&8000),x%,y%
�
menus%=s%
��
:
(� �IndirectText(a%,a$,b$,p%,l%,� p%)
� p%=-1 �
"* � (nextdatst%+l%+�(b$)+1)>=dataend% �
, �Error2nd(0)
6 �
@ �
J p%=nextdat%:nextdat%+=1
T* data%(p%,0)=nextdatst%:nextdatst%+=l%
^ data%(p%,1)=l%
h � b$<>"" �
r0 data%(p%,2)=nextdatst%:nextdatst%+=�(b$)+1
| data%(p%,3)=�(b$)+1
� �
�# data%(p%,2)=-1:data%(p%,3)-=1
� �
��
�$data%(p%,0)=a$
� � b$<>"" � $(data%(p%,2))=b$
�a%!0=data%(p%,0)
�a%!4=data%(p%,2)
�a%!8=data%(p%,1)
��
�:
�� �DeleteWindow(w%)
�6!wbuff%=wind%(w%,0):ș "Wimp_DeleteWindow",,wbuff%
wind%(w%,0)=-1
�
:
&� �DestroyWindow(w%)
0� a%
:6!wbuff%=wind%(w%,0):ș "Wimp_DeleteWindow",,wbuff%
Dwind%(w%,0)=-1
Nwuse%(w%)=0
X� wind%(w%,17)>0 �
b4 � a%=wind%(w%,16) � wind%(w%,16)+wind%(w%,17)-1
l icon%(a%,5)=0
v �
��
��
�:
�� �DeleteMStruct(s%)
�� addr%,d%
�addr%=mstructin%(s%)
��
� d%=!addr%
�
addr%+=4
�, � d%<>-1 � d%<&8000 � �DeleteWindow(d%)
�� d%=-1
�
menus%=-1
�
menuw%=-1
�
:
� Redraw_Window_Request
� �P_1(a%)
*� more%,w%
4w%=�WNum(a%!0)
>&ș "Wimp_RedrawWindow",,a% � more%
Hȕ more%
R �WindRect(w%,a%)
\' ș "Wimp_GetRectangle",,a% � more%
f�
p�
z:
�� Close_Window_Request
�� �P_3(a%)
�� w%,c%,p%,ret%
�w%=�WNum(!a%)
�p%=wind%(w%,1)
�)� p%=-1 � ș "Wimp_CloseWindow",,a%:�
�� p%>maxpuzz% �
� p%-=maxpuzz%+1
�' �DestroyWindow(w%):pinfo%(p%,8)-=1
�: � pinfo%(p%,8)=0 � pinfo%(p%,4)=pinfo%(p%,4) � �(%11)
� pwuse%(wind%(w%,20))=0
� �
��
� pinfo%(p%,3)=1 �
G b2%!0=0:$(b2%+4)="Are you sure you want to lose this puzzle?"+�(0)
8 ș "Wimp_ReportError",b2%,%10111,"!JigWord" � ,ret%
$ � ret%=0 � ret%=2 � �
.�
8�DestroyWindow(w%)
Bpinfo%(p%,3)-=1
L+� pinfo%(p%,3)=0 � �DestroyPuzzle(p%):�
V� pinfo%(p%,3)=1 �
`, $data%(pinfo%(p%,5),0)="JigWord "+�(p%)
j�
t@ $data%(pinfo%(p%,5),0)="JigWord "+�(p%)+" "+�(pinfo%(p%,3))
~�
�� c%=0 � numwind%
�& � wuse%(c%)<>0 � wind%(c%,1)=p% �
� !b%=wind%(c%,0)
�" ș "Wimp_GetWindowState",,b%
�8 ș "Wimp_ForceRedraw",-1,b%!4,b%!16,b%!12,b%!16+44
� �
��
��
�:
�� Mouse_Click
�� �P_6(a%)
�� w%,c%
,� a%!12=-2 �IconBarClick(a%!0,a%!4,a%!8)
w%=�WNum(a%!12)
� w%<0 � w%>numwind% � �
c%=�INum(w%,a%!16)
(5� w%=1 � c%=14 � (a%!8 � 2)<>2 � �InitCreateJig:�
2C� wind%(w%,1)<>-1 � wind%(w%,1)<=maxpuzz% � �PuzzleClick(w%,a%)
<C� wind%(w%,1)<>-1 � wind%(w%,1)>maxpuzz% � �WordClick(w%,c%,a%)
F�
P:
Z� Key_Pressed
d� �P_8(a%)
n� w%,c%
xw%=�WNum(a%!0)
�Ȏ w% �
�
� -1:
� ș "Wimp_ProcessKey",a%!24
� � 1:�KeyWind1(a%)
� :
� ș "Wimp_ProcessKey",a%!24
��
��
�:
�� Menu_Selection
�� �P_9(a%)
�ș &400CF,,b2%:z%=b2%!8
�Ȏ menus% �
� 0:� a%!0=1 � quit%=�
� 1:
Ȏ a%!0 �
" � 1:�ToggleCheat(menuw%)
,+ � 2:�ToggleWordWind(wind%(menuw%,1))
6+ � 3:�CreatePuzzWind(wind%(menuw%,1))
@1 � 4:�PrintPuzzGrid(menuw%,wind%(menuw%,1))
J �
T � 2:
^ Ȏ a%!0 �
h6 � 0:�CreateWordWind(wind%(menuw%,1)-maxpuzz%-1)
r5 � 1:�PrintWordList(wind%(menuw%,1)-maxpuzz%-1)
| �
��
�� (z% � 1)=1 �
� �CreateMStruct(menus%,0,0)
��
� �DeleteMStruct(menus%)
��
��
�:
�� Poll 17 and 18
�� �Receive(a%)
�Ȏ a%!16 �
� � 0:quit%=�
�" � &40300:�ChangeHiLiteCol(a%)
�
�
:
&� Don't know if this works.
0� �ChangeHiLiteCol(a%)
:#� d%,s%,A%,B%,C%,D%,E%,F%,G%,H%
D� a%!20=&452295 �
N hilitecol%=a%!24
X A%=hilitecol%:� ChangeHiCol
b �
l�
v� a%!20=4522295 �
�
s%=a%!24
�
d%=a%+28
� A%=�($d%)
� �NextPar(d%,d%)
� B%=�($d%)
� �NextPar(d%,d%)
� C%=�($d%)
� �NextPar(d%,d%)
� D%=�($d%)
� �NextPar(d%,d%)
� E%=�($d%)
� �NextPar(d%,d%)
� F%=�($d%)
! �NextPar(d%,d%)
! G%=�($d%)
! �NextPar(d%,d%)
! H%=�($d%)
!*" ș s%,A%,B%,C%,D%,E%,F%,G%,H%
!4 �
!>�
!H� a%!20=5922254 �
!R
d%=a%+24
!\ s%=�($d%)
!f �NextPar(d%,d%)
!p A%=�($d%)
!z �NextPar(d%,d%)
!� B%=�($d%)
!� �NextPar(d%,d%)
!� C%=�($d%)
!� �NextPar(d%,d%)
!� D%=�($d%)
!� �NextPar(d%,d%)
!� E%=�($d%)
!� �NextPar(d%,d%)
!� F%=�($d%)
!� �NextPar(d%,d%)
!� G%=�($d%)
!� �NextPar(d%,d%)
!� H%=�($d%)
" � s%
" �
"�
"$� a%!20=&1234DEBA �
". � (a%!24)
"8 �
"B�
"L�
"V:
"`� �NextPar(d%,� d%)
"j d%+=1
"tȕ ?d%<>13
"~
d%+=1
"��
"� d%+=1
"��
"�:
"�1� 10.9.8.7.6.5.4.3.2.1...We have destruction.
"�� �DestroyPuzzle(p%)
"�� a%,addr1%,addr2%
"�� a%=0 � maxpword%
"�$� pword%(a%,1)=p% � pwuse%(a%) �
"�. pwuse%(a%)=0:�DestroyWindow(pword%(a%,0))
"��
"��
# :
#
addr1%=puzzin%(p%)
#addr2%=puzzshflags1
#� a%=0 � maxpuzz%
#(3 � pfree%(a%) � !addr2%=puzzin%(a%) � !addr2%=0
#2 addr2%+=4
#<�
#FA%=p%:� puzzshuffle
#Paddr1%=puzzshflags1
#Z� a%=0 � maxpuzz%
#d' � !addr1%<>0 � puzzin%(a%)=!addr1%
#n addr1%+=4
#x�
#�pfree%(p%)=0
#�nxtpuzzst%=!nextpuzzst
#��
#�:
#�-� Does anyone know that little known song
#�)� 'Stop tap-dancing on my icon bar' ?
#�� �IconBarClick(x%,y%,z%)
#�� z%=1 � � Adjust
#�� z%=4 � �OpenWindow(1,-1)
#�� z%=2 �
#�* � menus%<>-1 � �DeleteMStruct(menus%)
#� �CreateMStruct(0,x%-64,184)
#� menuw%=-1
$ �
$�
$�
$":
$,� A confused click?
$6� �PuzzleClick(w%,addr%)
$@� p%
$Jp%=wind%(w%,1)
$T� (addr%!8 � 2)=2 �
$^ icon$(18,0)=�(pinfo%(p%,0))
$h icon$(19,0)=�(pinfo%(p%,1))
$r icon$(20,0)=�(pinfo%(p%,2))
$| � (wind%(w%,20) � %1)=%1 �
$�$ item%(1,1,1)=item%(1,1,1) � %1
$� �
$�' item%(1,1,1)=item%(1,1,1) � �(%1)
$� �
$� � (pinfo%(p%,4) � %1)=%1 �
$�$ item%(1,2,1)=item%(1,1,1) � %1
$� �
$�' item%(1,2,1)=item%(1,1,1) � �(%1)
$� �
$�* � menus%<>-1 � �DeleteMStruct(menus%)
$�) �CreateMStruct(1,addr%!0-64,addr%!4)
$� menuw%=w%
$� �
%�
%� (addr%!8 � %100)=%100 �
%- �PuzzSelect(p%,addr%!12,addr%!0,addr%!4)
%& �
%0�
%:� (addr%!8 � %001)=%001 �
%D �DeHiLight(p%,2)
%N pinfo%(p%,6)=0
%X pinfo%(p%,7)=0
%b pinfo%(p%,9)=0
%l pinfo%(p%,10)=0
%v �
%��
%��
%�:
%�-� Anyone who used this option to complete
%�2� a puzzle hasn't got the brains to understand
%�.� this program. So why are you reading it?
%�� �ToggleCheat(w%)
%�"wind%(w%,20)=wind%(w%,20) � %1
%�"item%(1,1,1)=item%(1,1,1) � %1
%�b%!0=wind%(w%,0)
%�b%!4=wind%(w%,8)
%�b%!8=wind%(w%,9)
%�b%!12=wind%(w%,10)
&b%!16=wind%(w%,11)
&&ș "Wimp_UpdateWindow",,b% � more%
&ȕ more%
& �WindRect(w%,b%)
&*' ș "Wimp_GetRectangle",,b% � more%
&4�
&>�
&H:
&R� �ToggleWordWind(p%)
&\ � (pinfo%(p%,4) � %10)=%00 �
&f �CreateWordWind(p%)
&p � pinfo%(p%,8)=-1 � �
&z$ pinfo%(p%,4)=pinfo%(p%,4) � %11
&�# item%(1,2,1)=item%(1,2,1) � %1
&� �
&��
&��
&�:
&�� �PuzzSelect(p%,w%,x%,y%)
&�*� a%,addr1%,addr2%,v%,h%,n%,x1%,y1%,l%
&�!b%=w%:ș &400CB,,b%
&�x%=x%-(b%!4-b%!20)
&�y%=y%-(b%!16-b%!24)
&�'x%=(x%-22) � 20:y%=((y%+8) � 40)*-1
&�+A%=x%:B%=y%:C%=puzzin%(p%):� puzzselect
&�h%=!selh:v%=!selv
' � h%<>0 � pinfo%(p%,9)=!hlen
'!� v%<>0 � pinfo%(p%,10)=!vlen
':
'$� h%=0 � v%=0 � �
'.+� h%=pinfo%(p%,6) � v%=pinfo%(p%,7) � �
'8� h%>0 � v%>0 �
'B � h%=pinfo%(p%,6) �
'L& �DeHiLight(p%,1):pinfo%(p%,10)=0
'V �
'` �
'j � v%=pinfo%(p%,7) �
't% �DeHiLight(p%,0):pinfo%(p%,9)=0
'~ �
'� �
'� �DeHiLight(p%,2)
'�$ pinfo%(p%,6)=h%:pinfo%(p%,7)=v%
'� �HiLight(p%,0)
'� �HiLight(p%,1)
'� �
'��
'�� h%>0 �
'�8 � pinfo%(p%,7)>0 � �DeHiLight(p%,1):pinfo%(p%,10)=0
'� � pinfo%(p%,6)<>h% �
'� �DeHiLight(p%,0)
'� pinfo%(p%,6)=h%
( �HiLight(p%,0)
(
�
(�
(7 � pinfo%(p%,6)>0 � �DeHiLight(p%,0):pinfo%(p%,9)=0
(( � pinfo%(p%,7)<>v% �
(2 �DeHiLight(p%,1)
(< pinfo%(p%,7)=v%
(F �HiLight(p%,1)
(P �
(Z�
(d�
(n:
(x� �DeHiLight(p%,a%)
(�� c%
(�Ȏ a% �
(�= � 0:c%=pinfo%(p%,6):pinfo%(p%,6)=0:�UpdateSpace(p%,c%,0)
(�= � 1:c%=pinfo%(p%,7):pinfo%(p%,7)=0:�UpdateSpace(p%,c%,1)
(�= � 2:c%=pinfo%(p%,6):pinfo%(p%,6)=0:�UpdateSpace(p%,c%,0)
(�@ c%=pinfo%(p%,7):pinfo%(p%,7)=0:�UpdateSpace(p%,c%,1)
(��
(��
(�:
(�� �HiLight(p%,a%)
(�Ȏ a% �
(�( � 0:�UpdateSpace(p%,pinfo%(p%,6),0)
(�( � 1:�UpdateSpace(p%,pinfo%(p%,7),1)
)( � 2:�UpdateSpace(p%,pinfo%(p%,6),0)
)+ �UpdateSpace(p%,pinfo%(p%,7),1)
)�
)"�
),:
)6� �UpdateSpace(p%,s%,d%)
)@� s%=0 � �
)J+� x%,y%,l%,wd%,a%,x1%,y1%,x2%,y2%,more%
)T�SpaceInfo(p%,s%,d%)
)^x1%=x%*20+20:y1%=y%*-40-4
)hȎ d% �
)r# � 0:x2%=x1%+l%*20+2:y2%=y1%-44
)|# � 1:x2%=x1%+22:y2%=y1%-l%*40-4
)��
)�� a%=0 � numwind%
)�# � wind%(a%,1)=p% � wuse%(a%) �
)� b%!0=wind%(a%,0)
)� b%!4=x1%
)� b%!8=y2%
)� b%!12=x2%
)� b%!16=y1%
)� ș &400C9,,b% � more%
)� ȕ more%
)� �WindRect(a%,b%)
)� ș &400CA,,b% � more%
)� �
* �
*�
*�
*&:
*0 � �SpaceInfo(p%,space%,dir%)
*:� addr%
*Daddr%=puzzin%(p%)
*N
Ȏ dir% �
*X � 0:addr%=addr%+addr%!24
*b � 1:addr%=addr%+addr%!28
*l�
*vaddr%+=4
*�addr%=addr%+space%*8-8
*�0x%=addr%?0:y%=addr%?1:l%=addr%?2:wd%=addr%!4
*��
*�:
*�� �WordClick(w%,c%,addr%)
*�0� pw%,p%,addr1%,addr2%,x%,y%,addr3%,a%,n%,f%
*�%pw%=wind%(w%,20):p%=pword%(pw%,1)
*�� (addr%!8 � 2)=2 �
*�) �CreateMStruct(2,addr%!0-64,addr%!4)
*� menuw%=w%
*� �
*��
*�5� c%=pwordiconst%+pw%*3 � �ChWordLen(-1,pw%,w%):�
+6� c%=pwordiconst%+pw%*3+1 � �ChWordLen(1,pw%,w%):�
+x%=addr%!0:y%=addr%!4
+#!b2%=wind%(w%,0):ș &400CB,,b2%
+ x%=x%-(b2%!4-b2%!20)
+*0y%=y%-(b2%!16-b2%!24):y%=((y%+36) � 40)*-1-1
+4-� x%<pword%(pw%,3) � x%>pword%(pw%,4) � �
+>� y%<0 � �
+H� y%>pword%(pw%,5) � �
+R� (addr%!8 � 1)=1 �
+\3 addr1%=�WordAddr(pword%(pw%,2),y%,puzzin%(p%))
+f � (?addr1% � 128)=0 � �
+p ?addr1%=?addr1% � 128
+z �UpdateWWind(w%,pw%,y%)
+� addr1%=puzzin%(p%)
+� addr2%=addr1%+addr1%!24
+�$ n%=addr2%!0:addr2%+=4:f%=0:a%=0
+� ȕ a%<n% � �(f%)
+� a%+=1
+�5 � (addr2%!4>>>16)=y% � addr2%?2=pword%(pw%,2) �
+� f%=�
+� addr2%?6=&FF:addr2%?7=&FF
+� �UpdateSpace(p%,a%,0)
+� �
+� addr2%+=8
+� �
+� addr2%=addr1%+addr1%!28
,$ n%=addr2%!0:addr2%+=4:f%=0:a%=0
, ȕ a%<n% � �(f%)
, a%+=1
,$5 � (addr2%!4>>>16)=y% � addr2%?2=pword%(pw%,2) �
,. f%=�
,8 addr2%?6=&FF:addr2%?7=&FF
,B �UpdateSpace(p%,a%,1)
,L �
,V addr2%+=8
,` �
,j �
,t�
,~$� pinfo%(p%,9)=pinfo%(p%,10) � �
,�2addr1%=�WordAddr(pword%(pw%,2),y%,puzzin%(p%))
,�� (?addr1% � 128) � �
,�"� pinfo%(p%,9)=pword%(pw%,2) �
,�1 addr2%=�ClueAddr(pinfo%(p%,6),0,puzzin%(p%))
,� A%=puzzin%(p%):� ChangeJig
,�9 A%=addr2%?0:B%=addr2%?1:C%=addr2%?2:D%=addr1%:� HFit
,� � !fit=0 � � 7:�
,� � (addr2%!4>>>16)<>&FFFF �
,�G addr3%=�WordAddr(pword%(pw%,2),addr2%?6+addr2%?7*256,puzzin%(p%))
,� ?addr3%=?addr3% � 128
,�0 �UpdateWWind(w%,pw%,addr2%?6+addr2%?7*256)
,� �
- addr2%?6=y% � 256
-
addr2%?7=y% � 256
- ?addr1%=?addr1% � 128
-$ �UpdateSpace(p%,pinfo%(p%,6),0)
-( �UpdateWWind(w%,pw%,y%)
-2�
-<$ � pinfo%(p%,10)=pword%(pw%,2) �
-F2 addr2%=�ClueAddr(pinfo%(p%,7),1,puzzin%(p%))
-P A%=puzzin%(p%):� ChangeJig
-Z: A%=addr2%?0:B%=addr2%?1:C%=addr2%?2:D%=addr1%:� VFit
-d � !fit=0 � � 7:�
-n � (addr2%!4>>>16)<>&FFFF �
-xH addr3%=�WordAddr(pword%(pw%,2),addr2%?6+addr2%?7*256,puzzin%(p%))
-� ?addr3%=?addr3% � 128
-�1 �UpdateWWind(w%,pw%,addr2%?6+addr2%?7*256)
-� �
-� addr2%?6=y% � 256
-� addr2%?7=y% � 256
-� ?addr1%=?addr1% � 128
-�% �UpdateSpace(p%,pinfo%(p%,7),1)
-� �UpdateWWind(w%,pw%,y%)
-� �
-��
-��
-��
-� �
. �
. �
.�
."�
.,:
.6 � A procedure with a stutter
.@� �UpdateWWind(w%,pw%,a%)
.J� c%,p%,more%
.Tp%=pword%(pw%,1)
.^� c%=0 � numwind%
.h. � wind%(c%,1)=p%+1+maxpuzz% � wuse%(c%) �
.r b%!0=wind%(c%,0)
.|M b%!4=pword%(pw%,3):b%!8=(a%+2)*-40-32:b%!12=pword%(pw%,4):b%!16=b%!8+40
.� ș &400C9,,b% � more%
.� ȕ more%
.� �WindRect(c%,b%)
.� ș &400CA,,b% � more%
.� �
.� �
.��
.��
.��
.�:
.�� �ChWordLen(d%,pw%,w%)
.�-� addr1%,addr2%,icst%,f%,n%,l%,mh%,wf%,p%
.�icst%=pwordiconst%+pw%*3
/p%=wind%(w%,1)-maxpuzz%-1
/.addr1%=puzzin%(p%):addr2%=addr1%+addr1%!16
/ n%=addr2%!0:l%=pword%(pw%,2)
/&�
/0 l%+=d%
/: � l%=1 � l%=n%
/D � l%>n% � l%=2
/N � addr2%!(l%*4-4)>0 � f%=�
/X� f%
/bpword%(pw%,2)=l%
/l%icon$(icst%+2,0)=�(l%)+" Letters"
/v/$data%(icon%(icst%+2,7),0)=icon$(icst%+2,0)
/�#mh%=!(addr1%+addr2%!(l%*4-4))+2
/�wind%(w%,9)=-(mh%*40+16)
/�1b%!0=wind%(w%,0):ș "Wimp_GetWindowState",,b%
/�
wf%=b%!28
/�8wind%(w%,2)=b%!4:wind%(w%,4)=b%!12:wind%(w%,5)=b%!16
/�'wind%(w%,3)=wind%(w%,5)+wind%(w%,9)
/�wind%(w%,6)=0:wind%(w%,7)=0
/�%b%!0=wind%(w%,8):b%!4=wind%(w%,9)
/�(b%!8=wind%(w%,10):b%!12=wind%(w%,11)
/�&ș "Wimp_SetExtent",wind%(w%,0),b%
/��OpenWindow(w%,wf%)
/�0pword%(pw%,3)=wind%(w%,10)/2-pword%(pw%,2)*8
/�0pword%(pw%,4)=pword%(pw%,3)+pword%(pw%,2)*16
0pword%(pw%,5)=mh%-3
0Bș "Wimp_ForceRedraw",wind%(w%,0),0,wind%(w%,9),wind%(w%,10),0
0�
0 :
0*� �KeyWind1(a%)
04� c%,nh%,lh%,h%,l%,f%,i%
0>c%=�INum(1,a%!4)
0HȎ c% �
0R) � 11:nh%=icon%(12,9):lh%=icon%(12,9)
0\) � 12:nh%=icon%(11,9):lh%=icon%(11,9)
0f# :ș "Wimp_ProcessKey",a%!24:�
0p�
0zȎ a%!24 �
0� � &0D:
0� h%=nh%
0� i%=�IFlags(1,14)
0�" � c%=12 � (i% � (1<<22))=0 �
0� a%!4=icon%(14,9)
0� a%!8=1<<21
0� a%!12=1<<21
0�! ș "Wimp_SetIconState",,a%
0� �InitCreateJig
0� �
0� �
0� � c%=12 � �
0� �
1 � &18E:h%=nh%
1 � &18F:h%=lh%
1# :ș "Wimp_ProcessKey",a%!24:�
1$�
1.+l%=�($(data%(icon%(�INum(w%,h%),7),0)))
186ș "Wimp_SetCaretPosition",wind%(1,0),h%,0,0,-1,l%
1B�
1L:
1V� It's a bit hot in here.
1`� �OpenWindow(w%,f%)
1jb%!0=wind%(w%,0)
1t%b%!4=wind%(w%,2):b%!8=wind%(w%,3)
1~'b%!12=wind%(w%,4):b%!16=wind%(w%,5)
1�'b%!20=wind%(w%,6):b%!24=wind%(w%,7)
1�b%!28=f%
1�ș "Wimp_OpenWindow",,b%
1��
1�:
1�� �WindRect(w%,a%)
1�� wx1%,wy1%,wx2%,wy2%
1�4wx1%=a%!20+(a%!28-a%!4):wy1%=a%!24+(a%!40-a%!16)
1�3wx2%=wx1%+(a%!36-a%!28):wy2%=wy1%+(a%!32-a%!40)
1�ȑ a%!4-a%!20,a%!16-a%!24
1�/� wind%(w%,1)<>-1 � wind%(w%,1)<=maxpuzz% �
1�& �PuzzRect(w%,wx1%,wy1%,wx2%,wy2%)
2 �
2
.� wind%(w%,1)<>-1 � wind%(w%,1)>maxpuzz% �
2& �WordRect(w%,wx1%,wy1%,wx2%,wy2%)
2�
2(
ȑ 0,0
22�
2<:
2F#� �PuzzRect(w%,x1%,y1%,x2%,y2%)
2P� p%
2Zp%=wind%(w%,1)
2d'x1%=(x1%-22) � 20:x2%=(x2%-22) � 20
2n'y1%=(y1%+8) � -40:y2%=(y2%+8) � -40
2x� x1%<0 � x1%=0
2�,� x1%>=pinfo%(p%,0) � x1%=pinfo%(p%,0)-1
2�,� x2%>=pinfo%(p%,0) � x2%=pinfo%(p%,0)-1
2�/A%=pinfo%(p%,6):B%=pinfo%(p%,7):� ChangeSel
2�3A%=puzzin%(p%):B%=wind%(w%,20) � %1:C%=scratch%
2�,D%=x1%:E%=y1%:F%=x2%:G%=y2%:� CreateHeap
2�� Gridsetc
2��
2�:
2�#� �WordRect(w%,x1%,y1%,x2%,y2%)
2�#� p%,addr1%,addr2%,a%,b%,n%,pw%
2�pw%=wind%(w%,20)
2�+x1%=(x1%-22) � 16:x2%=((x2%-22) � 16)+1
2�5y1%=((y1%+36) � 40)*-1:y2%=(((y2%+36) � 40)-1)*-1
3.p%=wind%(w%,1)-maxpuzz%-1:l%=pword%(pw%,2)
3.addr1%=puzzin%(p%):addr2%=addr1%+addr1%!16
3!addr2%=addr1%+addr2%!(l%*4-4)
3"n%=addr2%!0:addr2%+=4
3,� a%=1 � n%
36 � a%>=y1% � a%<=y2% �
3@! � pword%(pw%,3),-(a%*40+36)
3J � ?addr2% � 128 �
3T9 ș "Wimp_SetColour",3:ș "OS_WriteC",?addr2% � 128
3^ �
3h3 ș "Wimp_SetColour",7:ș "OS_WriteC",?addr2%
3r �
3|" ș "OS_WriteN",addr2%+1,l%-1
3� addr2%+=l%
3� �
3� addr2%+=l%
3� �
3��
3��
3�:
3�� �Word(n%,addr%)
3� A%=n%:B%=addr%:C%=b2%:� Word
3� =$b2%
3�� off%,a%,l%,c%,a$,b%
3�� n%=&FFFF � =""
3�a%=addr%+addr%!16
4b%=addr%+addr%!12
4
l%=0:c%=2
4�
4&3 � n%<(!(b%+c%*4)) � n%>=(!(b%+c%*4-4)) � l%=c%
40
c%+=1
4:� l%<>0
4Da%=addr%+a%!(l%*4-4)
4N a%=a%+(n%-!(b%+l%*4-4))*l%+4
4X a$=""
4b� c%=0 � l%-1
4la$+=�(a%?c%)
4v�
4�=a$
4�:
4�� �WNum(hand%)
4�� a%,f%
4� f%=-1
4�� a%=0 � numwind%
4� � wind%(a%,0)=hand% � f%=a%
4��
4�=f%
4�:
4�� �INum(w%,hand%)
4�� a%,f%,h%
4� f%=-1
5h%=wind%(w%,0)
5� a%=0 � numicon%
51 � icon%(a%,9)=hand% � icon%(a%,5)=h% � f%=a%
5 �
5*=f%
54:
5>� �IFlags(w%,i%)
5Hiconst%!0=wind%(w%,0)
5Riconst%!4=icon%(i%,9)
5\#ș "Wimp_GetIconState",,iconst%
5f=iconst%!24
5p:
5z(� Just about the only time I've ever
5�%� passed an array to a procedure.
5�:� (and got away with both my eyebrows!!!) (never mind)
5� � �1stFree(array%(),maxdim%)
5�� a%,f%
5�a%=-1:f%=-1
5��
5�
a%+=1
5� � array%(a%)=0 � f%=a%
5�� f%<>-1 � a%=maxdim%
5�=f%
5�:
5�� �PNumOfWords(addr%)
5�*=!(!(addr%+addr%!12)*4+addr%+addr%!12)
6:
6� �WordAddr(l%,w%,addr%)
6� addr1%
6$6addr1%=addr%+addr%!16:addr1%=addr%+addr1%!(l%*4-4)
6.=addr1%+4+l%*w%
68:
6B� �ClueAddr(c%,d%,addr%)
6L� addr1%
6V8� d%=0 addr1%=addr%+addr%!24 � addr1%=addr%+addr%!28
6`=addr1%+c%*8-4
6j:
6t� �InitCreateJig
6~� p%,addr1%,addr2%,n%,l%
6�$b%!0=wind%(1,0):b%!4=icon%(14,9)
6�b%!8=0:b%!12=1<<21
6�ș "Wimp_SetIconState",,b%
6�"p%=�1stFree(pfree%(),maxpuzz%)
6�� p%=-1 � �Error2nd(3):�
6�'create%(0)=�($data%(icon%(11,7),0))
6�'create%(1)=�($data%(icon%(12,7),0))
6�'create%(2)=(�IFlags(1,13)>>21) � %1
6�$� create%(0)<30 � �Error2nd(1):�
6�$� create%(1)<15 � �Error2nd(2):�
6�$� create%(0)>99 � �Error2nd(7):�
6�$� create%(1)>99 � �Error2nd(8):�
7 � nxtpuzzst%+32>=puzzend% �
7
�Error2nd(4)
7 �
7�
7($b%!0=wind%(1,0):b%!4=icon%(14,9)
72b%!8=1<<22:b%!12=1<<22
7<ș "Wimp_SetIconState",,b%
7F-create%(3)=%00:create%(4)=0:create%(5)=p%
7P8create%(6)=nxtpuzzst%:create%(7)=puzzend%-nxtpuzzst%
7Z$b%!0=wind%(1,0):b%!4=icon%(14,9)
7db%!8=1<<22:b%!12=1<<22
7nș "Wimp_SetIconState",,b%
7xș "Hourglass_On"
7�,A%=create%(0)-1:B%=create%(1)-1:� csize%
7�,A%=create%(6):B%=create%(7):� cpuzzarea%
7�� cinitvar%
7�� createjig%
7�ș "Hourglass_Off"
7�$b%!0=wind%(1,0):b%!4=icon%(14,9)
7�b%!8=1<<22:b%!12=0<<22
7�ș "Wimp_SetIconState",,b%
7�� !result%=-1 �
7� b2%!0=0
7� $(b2%+4)=error$(4)+�(0)
7�0 ș "Wimp_ReportError",b2%,%10101,"!JigWord"
7� �
8�
8� create%(2)=1 �
8 addr1%=create%(6)
8"A � �(2)=1 � addr2%=addr1%+addr1%!24 � addr2%=addr1%+addr1%!28
8, n%=addr2%!0:addr2%+=4
86 addr2%+=(�(n%)-1)*8
8@( addr2%?6=addr2%?4:addr2%?7=addr2%?5
8J$ n%=addr2%!4 � &FFFF:l%=addr2%?2
8T addr2%=addr1%+addr1%!16
8^ addr2%+=l%*4-4
8h2 addr2%=addr1%+!addr2%:addr2%+=4:addr2%+=l%*n%
8r ?addr2%=?addr2% � 128
8|�
8�#�InitialiseDispFile(create%(5))
8��CreatePuzzWind(create%(5))
8�mask%=0
8��
8�:
8�� a little used procedure
8�� �Cycle
8�$b%!0=wind%(1,0):b%!4=icon%(14,9)
8�b%!8=0<<22:b%!12=1<<22
8�ș "Wimp_SetIconState",,b%
8�mask%=1
8�� createinbckgnd
8��
9:
9� A weather vain?
9� �NextWindPos(w%)
9&� nextwpos%=4 � nextwpos%=0
900wind%(w%,2)=100:wind%(w%,5)=800-48*nextwpos%
9:nextwpos%+=1
9D�
9N:
9X� �CreatePuzzWind(p%)
9b(� w%,vx%,vy%,ht%,wid%,addr%,a%,more%
9l%� pinfo%(p%,3)=5 � �Error2nd(6):�
9v!w%=�1stFree(wuse%(),numwind%)
9�
� w%=-1 �
9� �Error2nd(5)
9� �
9��
9�wuse%(w%)=-1
9�pinfo%(p%,3)+=1
9�addr%=puzzin%(p%)
9�(wid%=addr%!4*20+40:ht%=addr%!8*40+12
9�wind%(w%,1)=p%
9��NextWindPos(w%)
9�� wid%>=640 �
9� wind%(w%,4)=wind%(w%,2)+640
9��
:! wind%(w%,4)=wind%(w%,2)+wid%
:�
:� ht%>=612 �
: wind%(w%,3)=wind%(w%,5)-612
:*�
:4 wind%(w%,3)=wind%(w%,5)-ht%
:>�
:Hwind%(w%,6)=0:wind%(w%,7)=0
:R"wind%(w%,8)=0:wind%(w%,9)=-ht%
:\$wind%(w%,10)=wid%:wind%(w%,11)=0
:f!wind%(w%,12)=0:wind%(w%,13)=0
:p!wind%(w%,14)=%00010+(255<<24)
:zwind%(w%,15)=1
:�!wind%(w%,16)=0:wind%(w%,17)=0
:�wind%(w%,18)=pinfo%(p%,5)
:�wind%(w%,19)=3
:�wind%(w%,20)=%0
:�wind$(w%)="0123456789ABCD"
:��CreateWindow(w%)
:�pinfo%(p%,5)=wind%(w%,18)
:�� pinfo%(p%,3)=1 �
:�, $data%(wind%(w%,18),0)="JigWord "+�(p%)
:��
:�@ $data%(wind%(w%,18),0)="JigWord "+�(p%)+" "+�(pinfo%(p%,3))
:��
:�� a%=0 � numwind%
;& � wuse%(a%)<>0 � wind%(a%,1)=p% �
; � a%<>w% �
; !b%=wind%(a%,0)
;$- ș "Wimp_GetWindowState",,b%:wf%=b%!28
;.9 ș "Wimp_ForceRedraw",-1,b%!4,b%!16,b%!12,b%!16+44
;8 �
;B �OpenWindow(a%,-1)
;L �
;V �
;`�
;j�
;t:
;~� �CreateWordWind(p%)
;�-� w%,a%,mw%,mh,addr1%,addr2%,icst%,f%,ww%
;�!w%=�1stFree(wuse%(),numwind%)
;�� w%=-1 � �Error2nd(5):�
;�$ww%=�1stFree(pwuse%(),maxpword%)
;�� ww%=-1 � �Error2nd(5):�
;�wuse%(w%)=-1
;�pwuse%(ww%)=-1
;�.addr1%=puzzin%(p%):addr2%=addr1%+addr1%!12
;�mw%=!addr2%:addr2%+=8
;�)� mw%<�(" � Letters � ") � mw%=17
;� mh%=0
;�� a%=2 � addr2%!-8
<