Home » Archimedes archive » Micro User » MU 1990-07.adf » Translator/!Translatr/!RunImage
Translator/!Translatr/!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 » Micro User » MU 1990-07.adf |
Filename: | Translator/!Translatr/!RunImage |
Read OK: | ✔ |
File size: | 1036C bytes |
Load address: | FFFFFB42 |
Exec address: | 3F687B0A |
File contents
10REM >!RunImage 20REMLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOG 30REM Converts foreign graphics files to Archimedes (Full RISCOS app) 40REM Version date : Tue,14 Nov 1989.12:23:23 50REM LEN 1989 Zeridajh software 60REM by John Kortink 70REMLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOG 80ON ERROR PRINT'"Error"''"'";REPORT$;"' (code ";ERL;")"'':END 90DIM menu1 2048,submenu 2048 100DIM window1 2048,window2 2048,window3 2048,window4 2048 110DIM poll 256,block 256,filename 256,err 256,palette 256 120DIM MenuData%(40),SubmenuData%(40),Palette%(256) 130DIM arg% 256,colmap% 256,transtab% 256,Code% 30*1024 140Tinysize%=40*1024:DIM Tiny% Tinysize%:REM File/table buffer (fixed size!) 150Progneed%=180*1024:REM Estimated space needed for program+vars (no sprbuf) 160Totalfree%=HIMEM-PAGE:REM Total free for program+vars+sprbuf 170Spritesize%=Totalfree%-Progneed%:REM Free for sprite buffer 180IFSpritesize%<1024 THEN ERROR 1,"No room to start up Translator properly" 190IFTinysize%<40*1024 THEN ERROR 1,"Who screwed around with my program ?" 200DIM Sprite% Spritesize%:REM Sprite buffer 210PROCinitialise:REM Initialise application 220PROCmode_change(-1):REM Reselect current mode to tidy 230ON ERROR PROCerror(ERR,REPORT$+" (code "+STR$ERL+")"):IFFileOpen THEN CLOSE#File:REM Report error, ensure file closed 240IFSpritesize%<80*1024 THEN PROCerror(0,"WARNING ! I have "+STR$(Spritesize%)+" bytes free for image handling. Press OK to continue with this tricky situation or CANCEL to quit (and reserve some more memory !)") 250REPEAT REM Poll and action 260CASE FNpoll(0) OF 270 280 WHEN 0 : REM Nothing to do, perform checks 290 IFAwaitAck THEN 300 AwaitAck=FALSE:SYS "OS_CLI","Remove "+Save$:REM Delete file saved 310 PROCerror(-1,"Bad data transfer, receiver dead"):REM No DataLoadAck 320 ENDIF 330 340 WHEN 1 : REM Redraw window request 350 PROCredraw_window(poll!0,FALSE) 360 370 WHEN 2 : REM Open window request 380 PROCopen_window(0,poll) 390 400 WHEN 3 : REM Close window request 410 win%=poll!0:REM Window handle 420 PROCclose_window(win%):REM Close window 430 IFwin%=win_img% THEN Img=FALSE:PROCset_palette(0):PROCclose_window(win_save%):REM Reset palette, wipe save window if image closed 440 450 WHEN 4 : REM Pointer leaving window 460 470 WHEN 5 : REM Pointer entering window 480 490 WHEN 6 : REM Mouse clicked 500 but%=poll!8:win%=poll!12:ico%=poll!16:REM Buttons/window/icon 510 CASE win% OF 520 WHEN -2 : REM Click on iconbar 530 IFico%=Iiconbar% THEN 540 REM Iconbar icon clicked 550 CASE but% AND 7 OF 560 WHEN 2 : PROCiconbar_menu 570 WHEN 4 : PROCoptions_menu 580 ENDCASE 590 ENDIF 600 WHEN win_img% : REM Click on image window 610 CASE but% AND 7 OF 620 WHEN 2 : PROCoptions_menu:REM Menu button, pop up menu 630 ENDCASE 640 WHEN win_save% : REM Click on save file window 650 IFico%=Isave% THEN 660 CASE but% AND &7F OF 670 WHEN 16,64 : REM Drag,calculate drag box and create it 680 !block=win%:SYS WGetWS%,,block:x%=block!4:y%=block!8 690 block!4=ico%:SYS WGetII%,,block 700 !block=win_save%:block!4=5:block!8+=x%:block!12+=y%:block!16+=x% 710 block!20+=y%:block!24=0:block!28=0:block!32=ScrW%:block!36=ScrH% 720 SYS WDragB%,,block:REM Create drag box 730 ENDCASE 740 ENDIF 750 ENDCASE 760 770 WHEN 7 : REM User has dropped drag box of save file window 780 SYS WGetPI%,,block:REM Get pointer position 790 block!20=block!12:block!24=block!16:block!28=block!0:block!32=block!4 800 block!4=0:block!8=0:block!12=0:block!16=1:block!36=0:block!40=&FF9 810 filename$=FNstring(filename):$(block+44)=filename$+CHR$0 820 !block=(44+LENfilename$+4)ANDNOT3 830 SYS WSendMsg%,17,block:REM Send DataSave message 840 PROCclose_window(win_save%):REM Close save file window 850 860 WHEN 8 : REM Key pressed 870 win%=poll!0:ico%=poll!4:char%=poll!24:REM Window, icon, key pressed 880 IF(win%=win_save%) AND (ico%=Ifilename%) THEN 890 CASE char% OF 900 WHEN 13 : REM Return pressed 910 PROCerror(-1,"Please drag the sprite file icon to a directory viewer") 920 WHEN 27 : REM Escape pressed 930 PROCclose_window(win_save%) 940 ENDCASE 950 ENDIF 960 970 WHEN 9 : REM Menu selection from user 980 selected%=poll!0:selected2%=poll!4:REM Menu/submenu icon indices 990 select$="":select2$="":REM No selections default 1000 IFselected%>=0 THEN select$=FNstring(MenuData%(selected%)) 1010 IFselected2%>=0 THEN select2$=FNstring(SubmenuData%(selected2%)) 1020 CASE LEFT$(select$,4) OF 1030 WHEN "" : REM Do nothing 1040 WHEN "Quit" : REM Quit program 1050 PROCdie:REM Tidy up and exit 1060 WHEN "Zoom","Norm" : REM Zoom in,out or back to normal 1070 OldZoom%=Zoom%:REM Remember old zoom factor 1080 CASE select$ OF 1090 WHEN "Zoom in": Zoom%=Zoom%*2 1100 WHEN "Zoom out": IFZoom%>1 THEN Zoom%=Zoom%DIV2 1110 WHEN "Normal size": Zoom%=1 1120 ENDCASE 1130 REM Set image window extent and title according to current zoom factor 1140 !block=0:block!4=0:block!8=FNsprW*Zoom%:block!12=FNsprH*Zoom% 1150 SYS WSetE%,win_img%,block:REM Set window extent to zoomed size 1160 $title_img%="Image "+File$:IFZoom%>1 THEN $title_img%+=" x"+STR$Zoom% 1170 !block=win_img%:SYS WGetWS%,,block:REM Read window's position 1180 dx%=(block!12-block!4)/2:dy%=(block!16-block!8)/2:REM Half window size 1190 vx%=block!20+dx%:vy%=block!24-dy%:REM Vector from centre to origin 1200 REM Calculate new scroll offsets by scaling vector and re-transpose 1210 block!20=vx%*Zoom%/OldZoom%-dx%:block!24=vy%*Zoom%/OldZoom%+dy% 1220 PROCclose_window(win_img%):PROCopen_window(win_img%,block) 1230 WHEN "Save" : REM Save whole or part of image 1240 Save_kind$=select2$:REM Remember type of save 1250 PROCopen_window(win_save%,0):REM Open save file window 1260 WHEN "Incl" : REM Toggle save-palette on/off 1270 Palonoff=NOTPalonoff:REM Toggle 1280 WHEN "Auto" : REM Toggle auto mode selection on/off 1290 AutoMode=NOTAutoMode:REM Toggle 1300 WHEN "Imag" : REM Set image's palette 1310 PROCset_palette(1):IFPalette=0 THEN PROCerror(-1,"Please select a mode with "+STR$(FNimage_cols)+" colours to display the image correctly.") 1320 WHEN "Desk" : REM Set desktop palette 1330 PROCset_palette(0) 1340 WHEN "Stan" : REM Set standard palette 1350 PROCset_palette(2) 1360 WHEN "GIF " : REM GIF picture number 1370 GIFImage%=VAL(select2$):REM New value 1380 ENDCASE 1390 SYS WGetPI%,,block:REM Get pointer info 1400 IF((block!8)AND1)>0 THEN PROCoptions_menu:REM Adjust click, re-open menu 1410 1420 WHEN 17,18 : REM Message from WIMP 1430 REM Ignore messages originating from myself 1440 IF(poll!4)=TaskHandle% THEN msgnr%=-1 ELSE msgnr%=poll!16 1450 CASE msgnr% OF 1460 WHEN -1 : REM Don't react 1470 WHEN 0 : PROCdie:REM Request to terminate task 1480 WHEN 2 : REM DataSaveAck, save file 1490 Save$=FNstring(poll+44):REM Read full path-name of file to be saved 1500 CASE Save_kind$ OF 1510 WHEN "Full" : REM Full resolution sprite, no edit 1520 WHEN "Whole" : PROCedit_part(FALSE,FALSE) 1530 WHEN "Whole (scaled)" : PROCedit_part(TRUE,FALSE) 1540 WHEN "Part" : PROCedit_part(FALSE,TRUE) 1550 WHEN "Part (scaled)" : PROCedit_part(TRUE,TRUE) 1560 ENDCASE 1570 PROChour_on:REM Hourglass on 1580 IFSave_kind$="Full" THEN 1590 REM Full sprite, save image with palette (optionally) 1600 Out=OPENOUT(Save$):REM Open output file 1610 spr%=Sprite%+Sprite%!8:REM Start of sprite 1620 IFPalonoff AND (Palette%(0)<=16) AND (Palette%(0)>=2) THEN 1630 REM Save with palette included 1640 cols%=Palette%(0):REM Colours in sprite's mode 1650 extra%=cols%*8:REM Extra bytes for palette 1660 SYS "OS_GBPB",1,Out,Sprite%+4,8,0:REM Output part of control block 1670 !arg%=extra%+Sprite%!12:SYS "OS_GBPB",2,Out,arg%,4:REM New offset 1680 !arg%=extra%+!spr%:SYS "OS_GBPB",2,Out,arg%,4:REM New offset 1690 SYS "OS_GBPB",2,Out,spr%+4,28:REM Output part of sprite header 1700 !arg%=extra%+spr%!32:SYS "OS_GBPB",2,Out,arg%,4:REM New offset 1710 !arg%=extra%+spr%!36:SYS "OS_GBPB",2,Out,arg%,4:REM New offset 1720 SYS "OS_GBPB",2,Out,spr%+40,4:REM Output sprite's mode 1730 FOR c%=1 TO cols%:arg%!(c%*8-8)=FNreadpalval(Palette%(c%)):arg%!(c%*8-4)=arg%!(c%*8-8):NEXT:SYS "OS_GBPB",2,Out,arg%,cols%*8:REM Output palette 1740 SYS "OS_GBPB",2,Out,spr%+spr%!32,(spr%!16+1)*(spr%!20+1)*4:REM Data 1750 ELSE REM No palette, output the whole lot 1760 SYS "OS_GBPB",1,Out,Sprite%+4,Sprite%!12-4,0:REM Output all 1770 ENDIF 1780 CLOSE#Out:SYS "OS_CLI","SetType "+Save$+" Sprite":REM Close & type 1790 ELSE REM Edited part in window on screen, save it 1800 PROCinvalidate_screen:REM Screen invalid 1810 IFPalonoff THEN pal%=1 ELSE pal%=0 1820 SYS OSSpop%,2,,Save$,pal%:REM Save screen in window 1830 VDU24,0;0;ScrW%;ScrH%;:REM Reset screen window 1840 ENDIF 1850 PROChour_off:REM Hourglass off 1860 poll!12=poll!8:poll!16=3:REM Amend data block for DataLoad 1870 SYS WSendMsg%,18,poll:REM Send DataLoad message back 1880 AwaitAck=TRUE:REM Await a DataLoadAck 1890 WHEN 3,5 : REM DataLoad/Open, check if sprite file and load if so 1900 type%=poll!40:REM Filetype 1910 IF(type%>=1)AND(type%<=5) THEN 1920 poll!12=poll!8:poll!16=4:SYS WSendMsg%,17,poll:REM Send DataLoadAck 1930 File$=FNstring(poll+44):REM Filename 1940 SYS "OS_File",17,File$ TO ,,,,Flen%:REM File's length 1950 File=OPENIN(File$):REM Open file 1960 IFFile<>0 THEN FileOpen=TRUE:REM Should be open 1970 !fhandle=File:!fptr=0:REM Init chunk loader 1980 PROChour_on:REM Hourglass on 1990 IFImageW THEN PROCclose_window(win_img%):REM Old image discarded 2000 Img=FALSE:REM Image invalid 2010 CASE type% OF 2020 WHEN &001 : Ok=FNpic_PI1 2030 WHEN &002 : Ok=FNpic_PI3 2040 WHEN &003 : Ok=FNpic_IFF 2050 WHEN &004 : Ok=FNpic_MAC 2060 WHEN &005 : Ok=FNpic_GIF 2070 ENDCASE 2080 Img=Ok:REM Image ok if all is well 2090 PROChour_off:REM Hourglass off 2100 IFFileOpen THEN CLOSE#File:FileOpen=FALSE:REM Close file 2110 IFImg THEN 2120 PROCset_palette(1):REM Set image's own palette 2130 PROCnew_image_window:REM Open window on image 2140 ENDIF 2150 ENDIF 2160 WHEN 4 : REM DataLoadAck, check or ignore 2170 IFAwaitAck THEN AwaitAck=FALSE:REM Succesfully received DataLoadAck 2180 WHEN &400C0 : REM Submenu warning 2190 pointer%=poll!20:x%=poll!24:y%=poll!28:REM Get pointer/proposed x/y 2200 main_item$=FNstring(MenuData%(poll!32)):REM Which item's submenu ? 2210 CASE main_item$ OF 2220 WHEN "Save image","GIF image" : PROCsubmenu(main_item$,TRUE) 2230 OTHERWISE SYS WCreateSM%,,pointer%,x%,y%:REM Open submenu/window 2240 ENDCASE 2250 WHEN &400C1 : REM Mode has changed (and it may not have been me) 2260 PROCmode_change(-1):REM Tidy up 2270 ENDCASE 2280ENDCASE 2290UNTIL FALSE 2300 2310DEFFNpic_PI1 2320REM Makes Atari PI1 image 2330mode%=FNmode(320,200,16,error$) 2340IFFNnew_image(mode%,320,200) ELSE =FALSE 2350SYS "OS_GBPB",3,File,Tiny%,32,2:REM Read palette from file 2360Palette%(0)=16:FOR c%=0 TO 15:v%=Tiny%!(c%*2):r%=(v%AND7)*32:g%=((v%>>12)AND7)*32:b%=((v%>>8)AND7)*32:Palette%(16-c%)=(r%<<16)+(g%<<8)+b%:NEXT 2370PROCscreen_info("Atari PI1",320,200,16,mode%,"","",&7D00,&7D00) 2380!fptr=&22:PROCdisplay(unpack_PI1,mode%):REM Unpack to sprite 2390PROCset_mode(mode%):=TRUE 2400 2410DEFFNpic_PI3 2420REM Makes Atari PI3 image 2430mode%=FNmode(640,400,2,error$) 2440IFFNnew_image(mode%,640,400) ELSE =FALSE 2450Palette%(0)=2:Palette%(1)=0:Palette%(2)=&FFFFFF:REM Set palette 2460PROCscreen_info("Atari PI3",640,400,2,mode%,"","",&7D00,&7D00) 2470!fptr=&22:PROCdisplay(unpack_PI3,mode%):REM Unpack to sprite 2480PROCset_mode(mode%):=TRUE 2490 2500DEFFNpic_MAC 2510REM Makes MacIntosh MacPaint image 2520mode%=FNmode(576,512,2,error$) 2530IFFNnew_image(mode%,576,720) ELSE =FALSE 2540Palette%(0)=2:Palette%(1)=0:Palette%(2)=&FFFFFF:REM Set palette 2550PROCscreen_info("MacIntosh MacPaint",576,720,2,mode%,"Repeated byte","",Flen%-640,(576*720)DIV8) 2560!fptr=640:PROCdisplay(unpack_MAC,mode%):REM Unpack to sprite 2570PROCset_mode(mode%):=TRUE 2580 2590DEFFNpic_IFF 2600REM Makes Amiga IFF image 2610bmhd=FALSE:cmap=FALSE:body=FALSE:REM Init flags 2620ham=FALSE:lace=FALSE:hires=FALSE:halfbright=FALSE:REM Init flags 2630wType%=1:REM Set high-to-low type of data 2640REM Check if this is a standard IFF picture file 2650form$=FNistring(4):PROCskip(4):form$+=FNistring(4):IFform$<>"FORMILBM" THEN PROCerror(-1,"This screen file is not an IFF screen file !"):=FALSE 2660REPEAT REM Follow BMHD,CMAP and BODY headers 2670head$=FNistring(4):hlen%=FNw4:startptr%=PTR#File 2680CASE head$ OF 2690 WHEN "BMHD" : bmhd=TRUE:REM Bitmap header 2700 REM Read picture/screen width, height, colours, etc. 2710 width%=FNw2:height%=FNw2:PROCskip(4):planes%=FNw1:PROCskip(1) 2720 compressed=(FNw1=1):PROCskip(5):s_width%=FNw2:s_height%=FNw2 2730 WHEN "CAMG" : flags%=FNw4:REM Get flag bits, set flags from it 2740 ham=((flags%AND&800)>0):lace=((flags%AND&4)>0) 2750 hires=((flags%AND&8000)>0):halfbright=((flags%AND&80)>0) 2760 WHEN "CMAP" : cmap=TRUE:REM Colour map (palette) 2770 paldefs%=hlen%DIV3:REM Number of palette colour definitions 2780 FOR _%=0 TO paldefs%-1:Palette%(_%+1)=FNw3:NEXT 2790 WHEN "BODY" : body=TRUE:REM Screen data 2800 REM Check if all parts are there 2810 IFNOTbmhd THEN PROCerror(-1,"IFF error : I did not find a 'BMHD' block. Cannot proceed !"):UNTIL TRUE:=FALSE ELSE IFNOTcmap THEN PROCerror(-1,"IFF error : I did not find a 'CMAP' block. Cannot proceed !"):UNTIL TRUE:=FALSE 2820 REM Determine suitable Archimedes screen mode 2830 IFham THEN colours%=16:mode%=FNmode(640,s_height%,256,error$) ELSE colours%=2^planes%:mode%=FNmode(s_width%,s_height%,colours%,error$) 2840 IFmode%<0 THEN PROCerror(-1,error$):UNTIL TRUE:=FALSE 2850 compr$="":info$="":scols%=colours% 2860 IFcompressed THEN compr$="Repeated byte" 2870 IFham THEN scols%=4096:info$="Picture mode|Hold And Modify (HAM)" ELSE IFhalfbright THEN info$="Picture mode|Half-bright" 2880 IFham THEN ok=FNnew_image(mode%,width%*2,height%) ELSE ok=FNnew_image(mode%,width%,height%) 2890 IFok ELSE =FALSE 2900 PROCscreen_info("Amiga IFF",width%,height%,scols%,mode%,compr$,info$,Flen%-(PTR#File),(width%*height%*planes%)DIV8) 2910 REM Set second half of halfbright mode's palette 2920 IFhalfbright THEN 2930 half%=colours%DIV2:REM Number of colours in second half 2940 FOR c%=1 TO half% 2950 Palette%(c%+half%)=(Palette%(c%)AND&E0E0E0)>>1:REM Half bright 2960 NEXT 2970 ENDIF 2980 REM Set up palette data for HAM mode and palette entries 2990 IFham THEN FOR c%=0 TO 15:p%=Palette%(c%+1):hamcols!(c%*4)=((p%AND&F00000)>>12)+((p%AND&F000)>>8)+((p%AND&F0)>>4):NEXT:Palette%(0)=-1 ELSE Palette%(0)=colours% 3000 !fptr=PTR#File:!pixbits=planes%:!width=width%:!height=height% 3010 !compr=compressed:IFham THEN !sctype=1 ELSE !sctype=0 3020 PROCdisplay(unpack_IFF,mode%):REM Unpack to sprite 3030 PROCset_mode(mode%) 3040ENDCASE 3050PROCskip(hlen%-((PTR#File)-startptr%)):REM To next header 3060UNTIL body 3070=TRUE 3080 3090DEFFNistring(len%) 3100REM Returns string of length len% 3110LOCAL _%,_$ 3120_$="":FOR _%=1 TO len%:_$+=CHR$(BGET#File):NEXT:=_$ 3130 3140DEFPROCskip(amount%) 3150REM Skips amount% bytes 3160PTR#File=amount%+PTR#File 3170ENDPROC 3180 3190DEFFNw1:=FNw(1) 3200DEFFNw2:=FNw(2) 3210DEFFNw3:=FNw(3) 3220DEFFNw4:=FNw(4) 3230 3240DEFFNw(len%) 3250REM Returns len%-byte value 3260LOCAL _%,_r% 3270_r%=0:FOR _%=1 TO len% 3280CASE wType% OF 3290 WHEN 0 : _r%+=((BGET#File)<<(_%-1)*8) 3300 WHEN 1 : _r%=(_r%<<8)+BGET#File 3310ENDCASE:NEXT 3320=_r% 3330 3340DEFFNpic_GIF 3350REM Makes GIF (Graphics Interchange Format) image 3360LOCAL g_Palette%(),Pic_ptr%(),Pic_len%() 3370DIM g_Palette%(256),Pic_ptr%(256),Pic_len%(256) 3380wType%=0:REM Set low-to_high type of data 3390signature$=FNistring(6):REM Read GIF signature 3400IFLEFT$(signature$,3)<>"GIF" THEN PROCerror(-1,"This screen file is not a GIF screen file !"):=FALSE 3410REM Read data in Screen Descriptor 3420r_width%=FNw2:r_height%=FNw2:flags%=FNw1:backgr%=FNw1:PROCskip(1) 3430global=((flags%AND&80)>0):REM Global colour map following ? 3440g_pixbits%=(flags%AND7)+1:REM Global bits per pixel 3450colbits%=((flags%>>4)AND7)+1:REM Bits of colour resolution 3460IFglobal THEN 3470 REM Read Global Colour Map palette 3480 FOR c%=1 TO 2^g_pixbits%:g_Palette%(c%)=(FNw1<<16)+(FNw1<<8)+FNw1:NEXT 3490 g_Palette%(0)=2^g_pixbits%:REM Palette entries 3500ELSE Palette%(0)=-1:REM No palette found 3510ENDIF 3520REM Scan data for pictures, make a list 3530picture%=0:REPEAT 3540PROCskip_GIF_extension:REM Skip extension blocks preceding Image 3550REM Search for next Image Descriptor 3560REPEAT _%=FNw1:image=(_%=ASC","):end=(_%=ASC";"):UNTIL image OR end OR (EOF#File) 3570IFNOTimage THEN IFpicture%<1 THEN UNTILTRUE:PROCerror(-1,"GIF error : I failed to find the next Image Descriptor !"):=FALSE 3580IFimage THEN 3590 REM Register picture's position 3600 picture%+=1:Pic_ptr%(picture%)=(PTR#File)-1 3610 REM If there's a local colour map, skip it 3620 PROCskip(8):_%=FNw1:IF(_%AND&80)>0 THEN PROCskip(3*((_%AND7)+1)) 3630 REM Determine picture data length, skip data 3640 PROCskip(1):REPEAT c%=FNw1:PROCskip(c%):UNTIL c%=0 3650 Pic_len%(picture%)=(PTR#File)-Pic_ptr%(picture%) 3660ENDIF 3670UNTIL end 3680pictures%=picture%:REM Number of pictures found 3690IFpictures%=1 THEN 3700 picture%=1:REM Only one picture, display it 3710ELSE REM More than one picture, take user-selected one 3720 IF(GIFImage%>0) AND (GIFImage%<=pictures%) THEN picture%=GIFImage% ELSE PROCerror(-1,"GIF error : This file contains "+STR$(pictures%)+" images. Select '1'-'"+STR$(pictures%)+"' in the 'GIF image' submenu !") 3730ENDIF 3740PTR#File=Pic_ptr%(picture%)+1:len%=Pic_len%(picture%):REM Pic's pos & len 3750REM Read Image Descriptor data 3760i_left%=FNw2:i_top%=FNw2:i_width%=FNw2:i_height%=FNw2:flags%=FNw1 3770local=(flags%AND&80)>0:REM Local colour map following ? 3780ibit=(flags%AND&40)>0:REM Image stored in interlaced order ? 3790l_pixbits%=flags%AND7:REM Local bits per pixel 3800IFlocal THEN 3810 pixbits%=l_pixbits%:REM Read and use Local Colour Map palette 3820 FOR c%=1 TO 2^l_pixbits%:Palette%(c%)=(FNw1<<16)+(FNw1<<8)+FNw1:NEXT 3830 Palette%(0)=2^l_pixbits%:REM Palette entries 3840ELSE pixbits%=g_pixbits%:Palette%()=g_Palette%():REM Use Global data 3850ENDIF 3860colours%=2^pixbits%:REM Number of colours 3870REM Determine suitable Archimedes screen mode 3880mode%=FNmode(r_width%,r_height%,colours%,error$):IFmode%<0 THEN PROCerror(-1,error$):=FALSE 3890IFFNnew_image(mode%,i_width%,i_height%) ELSE =FALSE 3900PROCscreen_info(signature$,i_width%,i_height%,colours%,mode%,"LZW","Number of pictures|"+STR$pictures%+" (displaying "+FNtimes(picture%)+")",len%,(i_height%*i_width%*pixbits%)DIV8) 3910REM Set up data for decompression 3920!fptr=PTR#File:!pixbits=pixbits%:!width=i_width%:!height=i_height% 3930IFibit THEN !laced=1 ELSE !laced=0:REM Indicate if laced or not 3940REM Determine best memory allocation for decompression 3950tableneed%=32*1024:REM Space needed for decompression code table 3960buffree%=!himem-!lomem:REM Free space in sprite buffer 3970IFbuffree%>=Tinysize% THEN 3980 !chunk=!lomem:!chsize=buffree%:REM Use free sprite buffer for file 3990 !tabbf=Tiny%:REM Use tiny buffer for decompression tables 4000ELSE IFbuffree%>=tableneed% THEN 4010 !chunk=Tiny%:!chsize=Tinysize%:REM Use tiny buffer for file 4020 !tabbf=!lomem:REM Use free sprite buffer for decompression tables 4030 ELSE !tabbf=Tiny%:REM Use tiny buffer for decompression tables 4040 IFbuffree%<(Tinysize%-tableneed%) THEN !chunk=Tiny%+tableneed%:!chsize=Tinysize%-tableneed% ELSE !chunk=!lomem:!chsize=buffree% 4050 ENDIF 4060ENDIF 4070PROCdisplay(unpack_GIF,mode%):REM Unpack 4080PROCset_mode(mode%):=TRUE 4090 4100DEFPROCskip_GIF_extension 4110REM Skips a GIF Extension Block if present at current pointer 4120LOCAL _% 4130IF(BGET#File)=ASC"!" THEN 4140 PROCskip(1):REM Skip function code 4150 REPEAT _%=FNw1:PROCskip(_%):UNTIL _%=0:REM Skip data byte blocks 4160ELSE PTR#File=(PTR#File)-1 4170ENDIF 4180ENDPROC 4190 4200DEFPROCscreen_info(type$,width%,height%,colours%,mode%,compr$,info$,datalen%,piclen%) 4210REM Sets information about the image 4220INFtype$=type$:INFwidth%=width%:INFheight%=height%:INFcolours%=colours%:INFmode%=mode%:INFcompr$=compr$:INFinfo$=info$:INFdatalen%=datalen%:INFpiclen%=piclen% 4230ENDPROC 4240 4250DEFPROCnew_image_window 4260REM Creates new image window of appropiate size in current mode 4270IFImageW THEN !block=win_img%:SYS WDeleteW%,,block:REM Delete old 4280win_img%=FNcreate_window(window1,0,0,FNsprW,FNsprH,0,FNsprH,-1,&0F,tf%,tb%,wf%,wb%,0,0,FNsprW,FNsprH,&2D,3<<12,&10001,1,"Image "+File$,title_img%) 4290ImageW=TRUE:REM Image window created 4300Zoom%=1:REM Normal size 4310PROCnew_window(win_img%) 4320ENDPROC 4330 4340DEFFNnew_image(mode%,xres%,yres%) 4350REM Creates room for picture sprite of specific resolution/mode 4360REM Sets pointers and data for machinecode 4370REM Returns TRUE if all is well, else FALSE 4380LOCAL sptr%,bits%,words%,end%,size% 4390Sprite%!0=Spritesize%:REM Size of sprite area 4400Sprite%!4=1:Sprite%!8=16:REM One sprite, offset to sprite 4410sptr%=Sprite%+(Sprite%!8):REM Sprite start 4420$(sptr%+4)=Isprname$+STRING$(12,CHR$0):REM Sprite's name 4430bits%=xres%*2^FNmode_var(mode%,9):REM Bits needed per row 4440words%=(bits%+31)DIV32:REM Words needed per row 4450!rowlen=words%*4:REM Set rowlength 4460sptr%!16=words%-1:REM Width in words-1 4470sptr%!20=yres%-1:REM Height in scanlines-1 4480sptr%!24=0:sptr%!28=31-(words%*32-bits%):REM Start/end bits 4490sptr%!40=mode%:REM Mode of sprite 4500sptr%!32=44:sptr%!36=sptr%!32:REM Offset to sprite data/mask 4510end%=sptr%+sptr%!32+words%*yres%*4:REM Address of first free byte 4520!himem=Sprite%+Spritesize%:REM End of free space in sprite buffer 4530!lomem=FNalign(end%+4*1024):REM Start of free space in sprite buffer 4540IFend%>!himem THEN PROCerror(-1,"I cannot handle this image. I need "+STR$((words%*yres%*4+1024)DIV1024)+"K. I was given only "+STR$(Spritesize%DIV1024)+"K !"):=FALSE 4550A%=sptr%+sptr%!32:B%=end%-A%:CALL wipe_mem:REM Clear sprite 4560sptr%!0=end%-sptr%:REM Offset to next sprite 4570Sprite%!12=end%-Sprite%:REM Offset to first free word 4580!screen=sptr%+44:REM Pointer to sprite data 4590SprW%=xres%:SprH%=yres%:REM Remember sprite's resolution in pixels 4600size%=((!himem-!lomem)DIV256)*256:REM Size of free space in sprite buffer 4610IFsize%>=Tinysize% THEN !chunk=!lomem:!chsize=size% ELSE !chunk=Tiny%:!chsize=Tinysize%:REM Choose tiny buffer if absolutely no room left 4620=TRUE 4630 4640DEFPROCsubmenu(name$,create) 4650REM (Re)writes submenu name$, optionally creates it 4660CASE name$ OF 4670 WHEN "Save image" : PROCcreate_menu(x%,y%,"^Save image",300,40,0,"""Full| Whole| Whole (scaled)| Part| Part (scaled)|",create) 4680 WHEN "GIF image" : PROCcreate_menu(x%,y%,"^GIF image",300,40,0,"$"+STR$(GIFImage%)+"&a0-9|",create) 4690ENDCASE 4700ENDPROC 4710 4720DEFPROChour_on 4730REM Turns hourglass on after 1 sec 4740SYS "Hourglass_On" 4750ENDPROC 4760 4770DEFPROChour_off 4780REM Turns hourglass off 4790SYS "Hourglass_Off" 4800ENDPROC 4810 4820DEFPROCedit_part(size,part) 4830REM Edits image size and part (if enabled with flags) 4840REM Returns with (scaled) image in graphics window ready for save 4850LOCAL _%,ox%,oy%,x%,y%,but%,x1%,x2%,y1%,y2%,xs%,ys%,sizex%,sizey% 4860LOCAL sprW%,sprH% 4870VDU24,0;0;ScrW%;ScrH%;:REM Whole screen window for image sprite 4880sprW%=FNsprW:sprH%=FNsprH:REM True OS size of image sprite 4890xs%=2^FNmode_var(MODE,4):REM X coordinate step 4900ys%=2^FNmode_var(MODE,5):REM Y coordinate step 4910!arg%=1:arg%!4=1:arg%!8=1:arg%!12=1:CLG:PROCplot_image(0,0,0,arg%) 4920IFsize THEN 4930 MOUSE RECTANGLE 0,0,ScrW%,ScrH%:REM Restrict pointer to entire screen 4940 ox%=sprW%-xs%:oy%=sprH%-ys%:REM 'Old' coordinates 4950 MOUSE TO ox%,oy%:REM Pointer to upper left corner 4960 REPEAT MOUSE x%,y%,but%:UNTIL but%=0:REM Wait until buttons released 4970 REPEAT REPEAT MOUSE x%,y%,but%:UNTIL (x%<>ox%)OR(y%<>oy%)OR(but%<>0) 4980 IFbut%=0 THEN 4990 IFoy%>y% THEN MOVE 0,y%:PLOT 103,FNmax(x%,ox%),oy%:REM Wipe Y-portion 5000 IFox%>x% THEN MOVE x%,0:PLOT 103,ox%,FNmax(y%,oy%):REM Wipe X-portion 5010 sizex%=x%+xs%:sizey%=y%+ys%:REM True scaled image size 5020 !arg%=sizex%:arg%!4=sizey%:arg%!8=sprW%:arg%!12=sprH% 5030 PROCplot_image(0,0,0,arg%) 5040 ox%=x%:oy%=y%:REM Remember old coordinates 5050 ENDIF 5060 UNTIL but%<>0 5070ELSE sizex%=sprW%:sizey%=sprH%:REM Full sprite size 5080ENDIF 5090IFpart THEN 5100 REPEAT MOUSE _%,_%,but%:UNTIL but%=0:REM Wait until buttons released 5110 MOUSE RECTANGLE 0,0,sizex%-xs%,sizey%-ys%:REM Restrict pointer to image 5120 MOUSE TO 0,sizey%-ys%:REM Mouse to top right of scaled sprite 5130 REPEAT MOUSE x1%,y2%,but%:UNTIL but%<>0:REM Get top left point 5140 REPEAT MOUSE _%,_%,but%:UNTIL but%=0:REM Wait until buttons released 5150 x2%=x1%:y1%=y2%:REM Initial window corner 5160 MOUSE RECTANGLE x1%,0,sizex%-xs%,y2%:REM Trap mouse to move down/right 5170 SYS WSetCol%,(4<<4)+0:REM Invert colour on screen 5180 ox%=x2%:oy%=y1%:RECTANGLE x1%,y1%,x2%-x1%,y2%-y1%:REM First rectangle 5190 REPEAT MOUSE x2%,y1%,but% 5200 IF(x2%<>ox%)OR(y1%<>oy%) THEN 5210 RECTANGLE x1%,oy%,ox%-x1%,y2%-oy%:REM Wipe old rectangle 5220 RECTANGLE x1%,y1%,x2%-x1%,y2%-y1%:REM New rectangle 5230 ox%=x2%:oy%=y1%:REM Old mouse position 5240 ENDIF 5250 UNTIL but%<>0:REM Until second button press 5260 MOUSE RECTANGLE 0,0,ScrW%,ScrH%:REM Reset mouse rectangle to whole screen 5270 RECTANGLE x1%,y1%,x2%-x1%,y2%-y1%:REM Wipe rectangle 5280 MOVE 0,0:PLOT 103,x1%-xs%,1024-ys%:PLOT 103,1280-xs%,y2%+ys%:PLOT 103,x2%+xs%,0:PLOT 103,x1%-xs%,y1%-ys%:REM Wipe surrounding area 5290ELSE x1%=0:y1%=0:x2%=sizex%-xs%:y2%=sizey%-ys%:REM Whole sprite window 5300ENDIF 5310VDU24,x1%;y1%;x2%;y2%;:REM Clip window 5320ENDPROC 5330 5340DEFPROCoptions_menu 5350REM Pops up the options menu at the pointer position 5360LOCAL i$ 5370i$=FNselbits(0,1,0,NOTImg,0)+"Info#"+STR$(win_iminfo%)+"|" 5380i$+=FNselbits(AutoMode,1,0,0,0)+"Auto mode select|" 5390i$+=FNselbits(0,1,0,0,0)+"GIF$3#"+STR$(submenu1%)+"|" 5400i$+=FNselbits((Palette=1),0,0,NOTImg,0)+"Image palette|" 5410i$+=FNselbits((Palette=0),0,0,0,0)+"Desktop palette|" 5420i$+=FNselbits((Palette=2),1,0,0,0)+"Standard palette|" 5430i$+=FNselbits(0,0,0,NOTImg,0)+"Zoom in|" 5440i$+=FNselbits(0,0,0,NOTImg,0)+"Zoom out|" 5450i$+=FNselbits((Zoom%=1),1,0,NOTImg,0)+"Normal size|" 5460i$+=FNselbits(Palonoff,0,0,0,0)+"Include$2|" 5470i$+=FNselbits(0,0,0,NOTImg,0)+"Save$3#"+STR$(submenu1%)+"|" 5480PROCcreate_menu(-1,0,"Translator",342,40,0,i$,TRUE) 5490ENDPROC 5500 5510DEFPROCiconbar_menu 5520REM Pops up menu for iconbar icon 5530PROCcreate_menu(-1,0,"Translator",200,40,0," Info"+"#"+STR$(win_info%)+"| Quit|",TRUE) 5540ENDPROC 5550 5560DEFPROCset_mode(mode%) 5570REM Sets new mode (if enabled) for image display 5580IFAutoMode ELSE ENDPROC 5590PROCmode_change(mode%):REM Select mode 5600ENDPROC 5610 5620DEFPROCmode_change(mode%) 5630REM Mode has changed or select new mode 5640REM If mode%>=0, mode mode% is selected 5650LOCAL _%,xeig%,yeig%,xwind%,ywind%,cols% 5660SYS WReadP%,,palette:REM Read current WIMP palette 5670IFmode%>=0 THEN 5680 SYS WSetM%,mode%:REM Select mode 5690 IFMODE<>mode% THEN PROCerror(-1,"I wanted to select mode "+STR$(mode%)+" but someone won't let me ! Maybe there's too little screenmemory ! I suggest you select another "+STR$(2^(2^FNmode_var(mode%,9)))+" colour mode !") 5700ENDIF 5710cols%=2^(2^FNmode_var(MODE,9)):REM Colours in current mode 5720FOR v%=0 TO 255:transtab%?v%=v%AND(cols%-1):NEXT 5730xeig%=FNmode_var(MODE,4):yeig%=FNmode_var(MODE,5):REM Read X/YEigFactor 5740xwind%=FNmode_var(MODE,11):ywind%=FNmode_var(MODE,12):REM Screen pixels 5750ScrW%=(1<<xeig%)*(xwind%+1):ScrH%=(1<<yeig%)*(ywind%+1):REM Screen size 5760IFNOTImg THEN PROCset_palette(0):ENDPROC 5770PROCnew_image_window:PROCset_palette(Palette) 5780ENDPROC 5790 5800DEFPROCplot_image(x%,y%,act%,scale%) 5810REM Plots image sprite with translation table 5820SYS OSSpop%,52+256,Sprite%,Isprname$,x%,y%,act%,scale%,transtab% 5830ENDPROC 5840 5850DEFPROCdisplay(code,mode%) 5860REM Displays picture, calling routine at 'code' 5870REM Acts as appropiate for SpecialDisplay modes 5880LOCAL _% 5890_%=FNmode_var(mode%,9):!arcbits=2^_%:!arcpixs=8/2^_%:REM Set colour info 5900PROCprep_palette 5910CALL code:REM Unpack to sprite 5920ENDPROC 5930 5940DEFPROCset_palette(palette%) 5950REM Sets a palette according to palette% 5960REM 0 - Desktop palette 5970REM 1 - Image's own palette 5980REM 2 - Standard palette 5990IFpalette%=1 THEN IFFNimage_cols<>2^(2^FNmode_var(MODE,9)) THEN palette%=0 6000CASE palette% OF 6010 WHEN 0 : SYS WSetP%,,palette 6020 WHEN 1 : PROCimage_palette 6030 WHEN 2 : VDU20 6040ENDCASE:Palette=palette% 6050ENDPROC 6060 6070DEFFNimage_cols 6080REM Returns number of colours in image sprite 6090LOCAL _% 6100SYS OSSpop%,40+256,Sprite%,Isprname$ TO ,,,,,,_%:REM Sprite's mode 6110=2^(2^FNmode_var(_%,9)) 6120 6130DEFPROCprep_palette 6140REM Sets up best possible palette/colour map for machinecode 6150REM Palette%(0) contains number of palette entries (entry 1-#cols) 6160REM If -1 then straight mapping is used, else closest approximation map 6170REM Palette entries are &RRGGBB 6180LOCAL c%,p%,r%,g%,b%,_% 6190IFPalette%(0)=-1 THEN FOR c%=0 TO 255:colmap?c%=c%:NEXT:ENDPROC 6200FOR c%=0 TO Palette%(0)-1 6210p%=Palette%(c%+1):r%=(p%>>16)AND&F0:g%=(p%>>8)AND&F0:b%=p%AND&F0 6220IFPalette%(0)<=16 THEN 6230 colmap?c%=c%:REM Straight colmap 6240ELSE REM Closest 8-bit colour value in colourmap 6250 _%=(r%<<4)+g%+(b%>>4):colmap?c%=from_rgbmap?_% 6260ENDIF 6270NEXT 6280ENDPROC 6290 6300DEFPROCimage_palette 6310REM Writes the palette 6320REM Palette%(0) contains number of palette entries (entry 1-#cols) 6330REM If -1 or >16 then palette remains intact 6340REM Palette entries are &RRGGBB 6350LOCAL c%,p%,r%,g%,b% 6360IFNOTImg OR FNc256 THEN ENDPROC 6370IF(Palette%(0)=-1)OR(Palette%(0)>16) THEN ENDPROC:REM No palette set 6380FOR c%=0 TO Palette%(0)-1 6390p%=Palette%(c%+1):r%=(p%>>16)AND&F0:g%=(p%>>8)AND&F0:b%=p%AND&F0 6400VDU19,c%,16,r%,g%,b%:NEXT 6410ENDPROC 6420 6430DEFPROCmode_info(mode%,RETURN width%,RETURN height%,RETURN colours%,RETURN txcol%,RETURN txrow%) 6440REM Returns information about a particular mode 6450LOCAL _% 6460SYS "OS_ReadModeVariable",mode%,9 TO ,,_%:colours%=2^(2^_%) 6470SYS "OS_ReadModeVariable",mode%,11 TO ,,_%:width%=_%+1 6480SYS "OS_ReadModeVariable",mode%,12 TO ,,_%:height%=_%+1 6490SYS "OS_ReadModeVariable",mode%,1 TO ,,_%:txcol%=_%+1 6500SYS "OS_ReadModeVariable",mode%,2 TO ,,_%:txrow%=_%+1 6510ENDPROC 6520 6530DEFPROCinvalidate_screen 6540REM Invalidates entire screen 6550SYS WForce%,-1,0,0,ScrW%,ScrH%:REM Force redraw whole screen 6560ENDPROC 6570 6580DEFPROCnew_window(handle%) 6590REM Closes and re-opens window to do a complete re-draw of it 6600PROCclose_window(handle%) 6610PROCopen_window(handle%,0) 6620ENDPROC 6630 6640DEFPROCredraw_window(handle%,force) 6650REM Redraws window with handle handle% 6660REM If force=TRUE the window's work area is updated with Wimp_UpdateWindow 6670REM and the coordinates of the area to be updated should be at block!4..16 6680LOCAL nx%,ny%,more,ww%,wh%,c%,x%,y%,o%,lo%,z%,_%,k%,_$ 6690LOCAL arcw%,arch%,arcc% 6700!block=handle%:REM Set window's handle 6710IFforce THEN SYS WUpdateW%,,block TO more ELSESYS WRedrawW%,,block TO more 6720nx%=(block!4-block!20):ny%=(block!16-block!24):REM Get sprite origin 6730ww%=block!36-block!28:wh%=block!40-block!32:REM Window width/height 6740!arg%=Zoom%:arg%!4=Zoom%:arg%!8=1:arg%!12=1 6750WHILE more 6760CASE handle% OF 6770 WHEN win_img% : REM Plot image sprite 6780 PROCplot_image(nx%,ny%,0,arg%) 6790 WHEN win_iminfo% : REM Image info 6800 MOVE nx%,ny%+wh%-16:REM Move to top left 6810 PRINTFNline(" Filename",File$) 6820 PRINTFNline(" Screen type",INFtype$) 6830 PRINTFNline(" Screen file size",STR$Flen%+" bytes") 6840 IFINFcompr$<>"" THEN _%=100-INT(100*(INFdatalen%/INFpiclen%)):PRINTFNline(" Compression",INFcompr$+" ("+STR$_%+"%)") 6850 IFINFinfo$<>"" THEN _%=INSTR(INFinfo$,"|"):PRINTFNline(" "+LEFT$(INFinfo$,_%-1),RIGHT$(INFinfo$,LENINFinfo$-_%)) 6860 PRINTFNline(" Width x Height x Colours",STR$INFwidth%+"x"+STR$INFheight%+"x"+STR$INFcolours%) 6870 PROCmode_info(INFmode%,arcw%,arch%,arcc%,_%,_%):PRINTFNline(" Archimedes screen mode",STR$arcw%+"x"+STR$arch%+"x"+STR$arcc%+" (mode "+STR$INFmode%+")") 6880ENDCASE 6890SYS WGetR%,,block TO more:REM Get next rectangle 6900ENDWHILE 6910ENDPROC 6920 6930DEFPROCopen_window(handle%,info) 6940REM Opens window with handle handle% 6950REM If info<>0 then info is ready at info, else get info 6960LOCAL b%,px%,py%,_%,xs%,ys% 6970IFinfo<>0 THEN 6980 FOR b%=0 TO 31 STEP 4:block!b%=info!b%:NEXT 6990ELSE !block=handle%:SYS WGetWS%,,block 7000 IFhandle%<>win_img% THEN PROCmouse(px%,py%,_%):xs%=block!12-block!4:ys%=block!16-block!8:block!4=px%-64:block!8=py%-ys%+16:block!12=block!4+xs%:block!16=block!8+ys%:REM Pop up at mouse if not image window 7010ENDIF 7020SYS WOpenW%,,block 7030ENDPROC 7040 7050DEFPROCclose_window(handle%) 7060REM Closes window with handle handle% 7070!block=handle%:SYS WCloseW%,,block 7080ENDPROC 7090 7100DEFFNpoll(mask%) 7110REM Returns poll reason code, masking with mask%, data at poll 7120LOCAL reasoncode 7130SYS WPoll%,mask%,poll TO reasoncode 7140=reasoncode 7150 7160DEFPROCinitialise 7170REM Initialises program 7180SYS "Wimp_ReadPalette",,palette:REM Read current WIMP palette 7190PROChour_on:PROCmcode:PROChour_off:REM Generate machinecode 7200SYS "OS_CheckModeValid",18 TO _%:MultiSync=(_%=18):REM Monitor type 7210applname$="Translator":REM Name of application 7220SYS "Wimp_Initialise",200,&4B534154,applname$ TO version,TaskHandle% 7230IFversion<200 THEN ERROR 1,"I cannot work with WIMP pre-2.00" 7240W%=FNswi_to_nr("Wimp_Initialise"):REM Base SWI number 7250WCreateW%=W%+1:WCreateI%=W%+2:WDeleteW%=W%+3:WOpenW%=W%+5:WCloseW%=W%+6:WPoll%=W%+7:WRedrawW%=W%+8:WUpdateW%=W%+9:WGetR%=W%+10:WGetWS%=W%+11:WGetWI%=W%+12 7260WGetII%=W%+14:WGetPI%=W%+15:WDragB%=W%+16:WForce%=W%+17:WCreateM%=W%+20:WSetE%=W%+23:WReport%=W%+31:WSetM%=W%+35:WSetP%=W%+36:WReadP%=W%+37 7270WSetCol%=W%+38:WSendMsg%=W%+39:WCreateSM%=W%+40:WSpop%=W%+41 7280OSSpop%=FNswi_to_nr("OS_SpriteOp"):OSReadVV%=FNswi_to_nr("OS_ReadVduVariables"):OSReadMV%=FNswi_to_nr("OS_ReadModeVariable") 7290tf%=7:tb%=2:wf%=7:wb%=0:si%=1:so%=3:REM Window/menu colours 7300!block=-1:block!4=0:block!8=0:block!12=68:block!16=68:block!20=&27003002:$(block+24)="!translatr":SYS WCreateI%,,block TO Iiconbar%:REM Iconbar icon 7310REM Create save file window (+ sprite file and filename icons) 7320win_save%=FNcreate_window(window2,0,0,240,160,0,0,-1,&93,tf%,2,wf%,1,0,0,240,160,&2D,0,0,1,"Save file",_%) 7330$filename="Screen":REM Initial filename 7340!block=win_save%:block!4=86:block!8=64:block!12=150:block!16=128:block!20=&27006002:$(block+24)="file_ff9":SYS WCreateI%,,block TO Isave% 7350block!4=16:block!8=8:block!12=224:block!16=48:block!20=&0700F125:block!24=filename:block!28=-1:block!32=255:SYS WCreateI%,,block TO Ifilename% 7360REM Create program info window (+ info icons) 7370win_info%=FNcreate_window(window3,0,0,900,224,0,0,-1,&93,tf%,2,wf%,1,0,0,900,224,&2D,0,0,1,"About this program",_%) 7380DATA "Version :","4.21 (14 Nov 1989)","Author :","� 1989 Zeridajh by John Kortink","Purpose :","Translation of foreign graphics files","Name :","Translator" 7390RESTORE 7380:dataptr=window3+1024:FOR i%=0 TO 3 7400READ item$,box$:y%=12+i%*52:!block=win_info%:block!4=0:block!8=y%:block!12=160:block!16=y%+48:block!20=&27000201:$(block+24)=item$:SYS WCreateI%,,block 7410block!4=160:block!12=880:block!20=&0700012D:block!24=dataptr:block!28=-1:block!32=LEN(box$):$dataptr=box$:dataptr+=LEN(box$)+1:SYS WCreateI%,,block 7420NEXT 7430REM Create image info window 7440win_iminfo%=FNcreate_window(window4,0,0,1000,260,0,0,-1,&83,tf%,tb%,wf%,wb%,0,0,1000,400,&2D,0,0,1,"Image info",_%) 7450REM Init variables 7460Save_kind$="":Save$="":Img=FALSE:ImageW=FALSE:Palonoff=TRUE:AwaitAck=FALSE:Zoom%=1:submenu1%=submenu:Isprname$="image" 7470INFtype$="":INFwidth%=0:INFheight%=0:INFcolours%=0:INFmode%=0:INFcompr$="":INFinfo$="":INFdatalen%=0:INFpiclen%=0:Flen%=0:File$="" 7480Palette=0:FileOpen=FALSE:SprW%=0:SprH%=0:GIFImage%=1:AutoMode=TRUE 7490IFFNnew_image(MODE,100,100):REM Dummy mode/sprite 7500ENDPROC 7510 7520DEFPROCcreate_menu(x%,y%,title$,width%,height%,gap%,icon$,create) 7530REM Writes menu structure, creates it if create=TRUE 7540REM - If x%<0 then x/y coordinates are (mouseX-64),(mouseY) 7550REM - If title$ starts "^" then this becomes a SUB menu 7560REM - Menu icons in icon$ : ?<icon1>|?<icon2>|..... etc. 7570REM - ? is a character containing select bits : 7580REM bit 0 : icon is ticked 7590REM bit 1 : icon is followed by a dotted line 7600REM bit 2 : icon is writable 7610REM bit 3 : icon is shaded (i.e. not selectable) 7620REM bit 4 : writable icon has 255 characters room 7630REM bit 5 : always 1 7640REM - icons of form '?<str>&<val>' have validation string <val> 7650REM - icons of form '?<str>#<val>' have sub-window with handle <val> 7660REM also, the 'menu warning message' is selected 7670REM - icons of form '?<str>$<val>' get $<val> replaced with string <val> 7680REM $1 = 'Mode ', $2 = ' palette', $3 = ' image' 7690LOCAL i$,ptr,ix%,dataptr,ilen%,p%,it$,type%,data$,menu 7700LOCAL valid$,validptr,sub,call%,tick%,writable% 7710LOCAL butty%,shaded%,dotted%,sub%,subwarn%,db%,_db$ 7720LOCAL Data%():DIM Data%(40) 7730IFx%<0 THEN PROCmouse(x%,y%,_%):x%-=64:REM Get coordinates via mouse 7740IFLEFT$(title$,1)="^" THEN 7750 sub=TRUE:menu=submenu 7760 title$=RIGHT$(title$,LENtitle$-1) 7770ELSE sub=FALSE:menu=menu1 7780ENDIF 7790$menu=title$ 7800menu?12=tf%:menu?13=tb% 7810menu?14=wf%:menu?15=wb% 7820menu!16=width%:menu!20=height% 7830menu!24=gap% 7840REM Define icons 7850i$=icon$:ptr=menu+28:ix%=0:dataptr=menu+1024:validptr=menu+1920 7860WHILE i$<>"" 7870p%=INSTR(i$,"|") 7880IFp%=0 THEN 7890 i$="" 7900ELSE REM Define icon 7910 it$=LEFT$(i$,p%-1):i$=RIGHT$(i$,LENi$-p%) 7920 type%=ASCLEFT$(it$,1):data$=RIGHT$(it$,LENit$-1) 7930 db%=INSTR(data$,"$"):REM Any coded strings ? 7940 IFdb%>0 THEN 7950 CASE VAL(MID$(data$,db%+1,1)) OF 7960 WHEN 1 : db$="Mode " 7970 WHEN 2 : db$=" palette" 7980 WHEN 3 : db$=" image" 7990 ENDCASE 8000 data$=LEFT$(data$,db%-1)+db$+MID$(data$,db%+2):REM Replace 8010 ENDIF 8020 tick%=(type%AND%000001):dotted%=(type%AND%000010)>>1:writeable%=(type%AND%000100)>>2:shaded%=(type%AND%001000)>>3:long%=(type%AND%010000)>>4 8030 IFwritable%=0 THEN butty%=9:ilen%=LENdata$ ELSE butty%=15:IFlong%=0 THEN ilen%=16 ELSE ilen%=255 8040 valid$="":p%=INSTR(data$,"&"):IFp%>0 THEN valid$=MID$(data$,p%+1):data$=LEFT$(data$,p%-1):REM Extract validation string (if any) 8050 sub%=-1:subwarn%=0:p%=INSTR(data$,"#"):IFp%>0 THEN sub%=VAL(MID$(data$,p%+1)):subwarn%=1:data$=LEFT$(data$,p%-1):REM Extract subwindow handle (if any) 8060 ptr!0=(subwarn%<<3)+(writeable%<<2)+(dotted%<<1)+tick%:REM Menu flags 8070 ptr!4=sub%:REM Sub menu/window 8080 ptr!8=(wb%<<28)+(wf%<<24)+(shaded%<<22)+(butty%<<12)+(1<<8)+1:REM Flags 8090 $dataptr=data$:ptr!12=dataptr:ptr!20=ilen% 8100 IFvalid$="" THEN ptr!16=-1 ELSE $validptr=valid$:ptr!16=validptr:validptr+=LEN(valid$)+1 8110 Data%(ix%)=dataptr:dataptr+=ilen%+1:ptr+=24:ix%+=1 8120ENDIF 8130ENDWHILE 8140ptr!-24=(ptr!-24)OR&80:REM Indicate 'last icon' 8150IFNOTcreate THEN ENDPROC 8160IFsub THEN 8170 SYS WCreateSM%,,menu,x%,y%:REM Create the submenu 8180 SubmenuData%()=Data%():REM Remember icon data addresses 8190 Active_submenu$=title$:REM Remember submenu's title 8200ELSE SYS WCreateM%,,menu,x%,y%:REM Create the menu 8210 MenuData%()=Data%():REM Remember icon data addresses 8220ENDIF 8230ENDPROC 8240 8250DEFFNselbits(tick,dotted,write,shaded,room) 8260REM Returns select character for icon attributes 8270=CHR$((1<<5)+((room AND 1)<<4)+((shaded AND 1)<<3)+((write AND 1)<<2)+((dotted AND 1)<<1)+(tick AND 1)) 8280 8290DEFFNcreate_window(window,mix%,miy%,max%,may%,sbx%,sby%,pos%,flags%,tf%,tb%,wf%,wb%,wmix%,wmiy%,wmax%,wmay%,tiflags%,waflags%,minw%,sprc%,title$,RETURN title%) 8300LOCAL ptr,ico,b% 8310REM Creates window without icons, returns window handle 8320REM Returns pointer to indirected window title in title% 8330window!0=mix%:window!4=miy%:window!8=max%:window!12=may% 8340window!16=sbx%:window!20=sby% 8350window!24=pos% 8360window!28=flags% 8370window?32=tf%:window?33=tb% 8380window?34=wf%:window?35=wb% 8390window?36=so%:window?37=si% 8400window?38=tb% 8410window?39=0 8420window!40=wmix%:window!44=wmiy%:window!48=wmax%:window!52=wmay% 8430window!56=tiflags% OR 1<<8 8440window!60=waflags% 8450window!64=sprc% 8460window!68=minw% 8470title%=window+512:window!72=title% 8480window!76=-1 8490window!80=LEN(title$) 8500$(window!72)=title$ 8510window!84=0 8520SYS WCreateW%,,window TO handle%:REM Create the window 8530=handle% 8540 8550DEFFNalign(val%) 8560REM Returns next-up word aligned value of val% 8570=(val%+3)ANDNOT3 8580 8590DEFFNreadpalval(rgb%) 8600REM Returns 'OS_ReadPalette' word from &RGB value 8610=((rgb%AND&FF)<<24)+((rgb%AND&FF00)<<8)+((rgb%AND&FF0000)>>8)+&10 8620 8630DEFFNstring(addr%) 8640REM Returns CTRL-char terminated string at addr% 8650LOCAL _%,_c%,_$ 8660_%=-1:REPEAT _%+=1:UNTIL addr%?_%<32 8670_c%=addr%?_%:addr%?_%=13:_$=$addr%:addr%?_%=_c% 8680=_$ 8690 8700DEFPROCmouse(RETURN x%,RETURN y%,RETURN but%) 8710REM Returns x,y and button state of mouse 8720MOUSE x%,y%,but% 8730ENDPROC 8740 8750DEFFNc256 8760REM Returns TRUE if current mode is 256 colour mode 8770=(FNlog2BPP=3) 8780 8790DEFFNlog2BPP 8800REM Returns Log2BPP for current mode 8810=FNmode_var(MODE,9) 8820 8830DEFFNvdu_var(varnr%) 8840REM Returns VDU variable varnr% 8850!arg%=varnr%:arg%!4=-1:SYS OSReadVV%,arg%,arg%+8:=arg%!8 8860 8870DEFFNmode_var(mode%,varnr%) 8880REM Returns mode mode% variable varnr% 8890LOCAL result% 8900SYS OSReadMV%,mode%,varnr% TO ,,result%:=result% 8910 8920DEFFNOS_var(_$) 8930REM Attempts to return OS-var's string value 8940LOCAL _r$,_l% 8950SYS "XOS_ReadVarVal",_$,STRING$(100," "),100,0,3 TO ,_r$,_l% 8960_r$=LEFT$(_r$,_l%):=_r$ 8970 8980DEFFNswi_to_nr(swi$) 8990REM Returns SWI number of SWI call swi$ 9000LOCAL swinr% 9010SYS "XOS_SWINumberFromString",,swi$ TO swinr% 9020=swinr% 9030 9040DEFPROCerror(errnr,errmsg$) 9050REM Handles errors 9060LOCAL but%,oldpal,opt% 9070IFerrnr=-1 THEN errnr=1:opt%=1 ELSE opt%=3 9080!err=errnr:$(err+4)=errmsg$ 9090oldpal=Palette:PROCset_palette(0):REM Select desktop palette 9100SYS WReport%,err,opt%,applname$ TO ,but% 9110IFbut%<>1 THEN PROCdie 9120PROCset_palette(oldpal):REM Reselect old palette 9130ENDPROC 9140 9150DEFPROCfinish 9160REM Tidies up 9170SYS WSetP%,,palette% 9180SYS "Wimp_CloseDown",TaskHandle%,&4B534154 9190ENDPROC 9200 9210DEFFNsprW 9220REM Returns image sprite's width in OS pixels in current mode 9230=SprW%*2^FNmode_var(MODE,4) 9240 9250DEFFNsprH 9260REM Returns image sprite's height in OS pixels in current mode 9270=SprH%*2^FNmode_var(MODE,5) 9280 9290DEFFNline(fore$,back$) 9300REM Returns 'pretty' line from arguments 9310=fore$+" "+STRING$(27-LENfore$,".")+" "+back$ 9320 9330DEFFNmax(v1%,v2%) 9340REM Returns maximum of v1% and v2% 9350IFv1%>v2% THEN =v1% ELSE =v2% 9360 9370DEFPROCdie 9380REM Tidies up and exits 9390PROCfinish 9400SYS "OS_Exit" 9410ENDPROC 9420 9430DEFFNmode(width%,height%,colours%,RETURN error$) 9440REM Returns, if possible, the screen mode that is most suitable for 9450REM displaying a picture of (width%)x(height%) pixels in colours% colours 9460REM If there is no suitable mode, -1 and an explaining error$ are returned 9470REM If 512 vertical is required on a normal monitor, 256 is selected 9480LOCAL arccols%,arcwidth%,archeight%,mode% 9490REM Range check for colours, width and height 9500IFcolours%>256 THEN error$="I cannot display more than 256 colours !":=-1 9510REM Determine closest colours/width/height 9520IFcolours%>16 THEN arccols%=256 ELSE IFcolours%>4 THEN arccols%=16 ELSE IFcolours%>2 THEN arccols%=4 ELSE arccols%=2 9530IFwidth%>640 THEN arcwidth%=1056 ELSE IFwidth%>320 THEN arcwidth%=640 ELSE arcwidth%=320 9540IFheight%<=256 THEN archeight%=256 ELSE IFNOTMultiSync THEN archeight%=256 ELSE archeight%=512 9550mode%=-1:REM Invalid mode initially 9560CASE arccols% OF 9570 WHEN 2 : CASE arcwidth% OF 9580 WHEN 160 : IFarcheight%=256 THEN mode%=0 ELSE mode%=18 9590 WHEN 320 : IFarcheight%=256 THEN mode%=0 ELSE mode%=18 9600 WHEN 640 : IFarcheight%=256 THEN mode%=0 ELSE mode%=18 9610 WHEN 1056 : IFarcheight%=256 THEN mode%=16 9620 ENDCASE 9630 WHEN 4 : CASE arcwidth% OF 9640 WHEN 160 : IFarcheight%=256 THEN mode%=1 ELSE mode%=19 9650 WHEN 320 : IFarcheight%=256 THEN mode%=1 ELSE mode%=19 9660 WHEN 640 : IFarcheight%=256 THEN mode%=8 ELSE mode%=19 9670 WHEN 1056 : IFarcheight%=256 THEN mode%=16 9680 ENDCASE 9690 WHEN 16 : CASE arcwidth% OF 9700 WHEN 160 : IFarcheight%=256 THEN mode%=9 ELSE mode%=20 9710 WHEN 320 : IFarcheight%=256 THEN mode%=9 ELSE mode%=20 9720 WHEN 640 : IFarcheight%=256 THEN mode%=12 ELSE mode%=20 9730 WHEN 1056 : IFarcheight%=256 THEN mode%=16 9740 ENDCASE 9750 WHEN 256 : CASE arcwidth% OF 9760 WHEN 160 : IFarcheight%=256 THEN mode%=10 ELSE mode%=21 9770 WHEN 320 : IFarcheight%=256 THEN mode%=13 ELSE mode%=21 9780 WHEN 640 : IFarcheight%=256 THEN mode%=15 ELSE mode%=21 9790 WHEN 1056 : IFarcheight%=256 THEN mode%=24 9800 ENDCASE 9810ENDCASE 9820REM Check if mode is ok 9830IFmode%<0 THEN error$="I cannot find a suitable mode to display "+STR$(width%)+"x"+STR$(height%)+"x"+STR$(colours%)+" !":=-1 9840=mode% 9850 9860DEFFNtimes(value%) 9870REM Returns STR$value% with 'plural extension' 9880LOCAL _d% 9890_d%=value%MOD10:REM Last digit determines extension 9900IF(((value%MOD100)DIV10)=1)OR(_d%>3)OR(_d%=0) THEN =STR$_%+"th" 9910CASE _d% OF 9920 WHEN 1 : =STR$value%+"st" 9930 WHEN 2 : =STR$value%+"nd" 9940 WHEN 3 : =STR$value%+"rd" 9950ENDCASE 9960 9970DEFPROCmcode 9980REM Generates machinecode 9990FOR N=0 TO 2 STEP2:P%=Code% 10000[OPTN 10010.screen EQUD 0:\ Picture destination start } General 10020.lomem EQUD 0:\ Start address of free space } '' 10030.himem EQUD 0:\ End address of free space } '' 10040.data EQUD 0:\ Data start } '' 10050.compr EQUD 0:\ Compressed (<>0) or not (0) } Amiga IFF 10060.sctype EQUD 0:\ Normal (0) HAM (1) } '' 10070.rowlen EQUD 0:\ Bytes per image row } Amiga IFF/GIF 10080.arcbits EQUD 0:\ Bits per pixel (screen) } '' 10090.arcpixs EQUD 0:\ Pixels per screen byte } '' 10100.pixbits EQUD 0:\ Bits per pixel (image) } '' 10110.width EQUD 0:\ Image width in pixels } '' 10120.height EQUD 0:\ Image height in pixels } '' 10130.laced EQUD 0:\ Laced row coding flag } GIF 10140.tabbf EQUD 0:\ Decompression table buffer } '' 10150 10160.wipe_mem \ Wipes r1 bytes of memory from r0 onwards 10170 STMFD r13!,{r14}:\ Save link 10180 MOV r2,#0:\ Clear value 10190.wipe_wrd STR r2,[r0],#4:SUBS r1,r1,#4:BGT wipe_wrd:\ Wipe 10200 LDMFD r13!,{pc}:\ Return 10210 10220.fhandle EQUD 0:\ File handle of open data file 10230.fptr EQUD 0:\ Current PTR in file 10240.eof EQUD 0:\ EOF status of file 10250.loaded EQUD 0:\ Bytes loaded 10260.chsize EQUD 0:\ Size of chunks loaded at (chunk) 10270.chunk EQUD 0:\ Address of chunk buffer 10280 10290.get_schunk \ Gets next sequential chunk of data from file 10300 STMFD r13!,{r0,r14}:\ Saver registers and link 10310 MOV r0,#0:BL get_chunk:\ Get sequential chunk 10320 LDMFD r13!,{r0,pc}:\ Return 10330.get_chunk \ Gets chunk of data from file, with re-read if required 10340 \ On entry - r0 is number of bytes to re-read from end of last chunk 10350 \ On exit - EQ if no more bytes, else NE 10360 STMFD r13!,{r0-r4,r14}:\ Save registers and link 10370 LDR r1,fhandle:LDR r2,chunk:LDR r3,chsize:\ File handle and chunk info 10380 LDR r4,fptr:SUB r4,r4,r0:\ Calculate start PTR 10390 MOV r0,#3:SWI "XOS_GBPB":\ Read chunk from file 10400 STR r4,fptr:\ Store new PTR 10410 CMP r3,#0:MOVEQ r0,#0:MVNNE r0,#0:STR r0,eof:\ Store EOF status 10420 LDR r0,chsize:SUB r0,r0,r3:STR r0,loaded:TEQ r0,#0:\ Bytes transferred 10430 LDMFD r13!,{r0-r4,pc}:\ Return 10440 10450.plot_row \ Plots a row of pixels 10460 \ On entry - r0 = address of screenrow 10470 \ - r1 = #pixels 10480 \ On exit - r0 = address of next screenrow 10490 STMFD r13!,{r1-r9,r14}:\ Save registers and link 10500 LDR r3,rowlen:ADD r6,r0,r3:\ Address of next screen row 10510 LDR r4,arcbits:LDR r5,arcpixs:\ Bits per pixel, pixels per screenbyte 10520 LDR r7,a_colmap:LDR r2,a_rowdat:\ Colour map and row pixel data 10530.pl_byte MOV r8,#0:MOV r9,r5:\ Init buildup of screen byte 10540.pl_build SUBS r9,r9,#1:LDRB r3,[r2,r9]:\ Get pixel data 10550 LDRB r3,[r7,r3]:\ Map to logical colour 10560 ORR r8,r3,r8,LSL r4:BNE pl_build:\ 'Plot' pixel in byte 10570 STRB r8,[r0],#1:\ Display screen byte 10580 ADD r2,r2,r5:SUBS r1,r1,r5:BNE pl_byte:\ Next pixel(s) 10590 MOV r0,r6:\ Set address of next screen row 10600 LDMFD r13!,{r1-r9,pc}:\ Return 10610 10620;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 10630 10640.unpack_PI3 \ Atari PI3 picture 10650 STMFD r13!,{r14}:\ Save link 10660 LDR r1,screen:MOV r3,#&7D00:\ Destination, total data length 10670 LDR r4,a_flipmap:\ Inverted and reversed bits map 10680.d1_chunk BL get_schunk:BEQ d1_exit:LDR r2,chunk:LDR r5,loaded:\ Chunk 10690.d1_copy LDRB r0,[r2],#1:LDRB r0,[r4,r0]:\ Get 8 bits data and convert 10700 STRB r0,[r1],#1:SUBS r3,r3,#1:BLE d1_exit:\ Check if all bytes done 10710 SUBS r5,r5,#1:BGT d1_copy:B d1_chunk:\ Next data byte(s) 10720.d1_exit LDMFD r13!,{pc}:\ Return 10730 10740;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 10750 10760.unpack_PI1 \ Atari PI1 picture 10770 STMFD r13!,{r14}:\ Save link 10780 LDR r1,screen:MOV r3,#&7D00:\ Destination, total data length 10790 LDR r12,a_flipmap:\ Inverted and reversed bits map 10800.d2_chunk BL get_schunk:BEQ d2_exit:LDR r2,chunk:LDR r10,loaded:\ Chunk 10810 MOV r7,r10:\ Prepare flip of all loaded bytes 10820.d2_flip SUBS r7,r7,#1:LDRB r6,[r2,r7]:LDRB r6,[r12,r6]:\ Flip data byte 10830 STRB r6,[r2,r7]:BGT d2_flip:\ Flip all loaded bytes 10840.d2_copy LDR r7,[r2],#2:LDR r6,[r2],#2:LDR r5,[r2],#2:LDR r4,[r2],#2 10850 MOV r11,#8:\ 8x2=16 pixels in 32 bits 10860.d2_pixels MOV r8,#0:MOVS r4,r4,LSR#1:ADC r8,r8,r8:MOVS r5,r5,LSR#1 10870 ADC r8,r8,r8:MOVS r6,r6,LSR#1:ADC r8,r8,r8:MOVS r7,r7,LSR#1:ADC r8,r8,r8 10880 MOV r9,#0:MOVS r4,r4,LSR#1:ADC r9,r9,r9:MOVS r5,r5,LSR#1:ADC r9,r9,r9 10890 MOVS r6,r6,LSR#1:ADC r9,r9,r9:MOVS r7,r7,LSR#1:ADC r9,r9,r9 10900 ORR r8,r8,r9,LSL#4:\ Make pair of pixels 10910 STRB r8,[r1],#1:SUBS r11,r11,#1:BNE d2_pixels:\ Display, next 2 pixels 10920 SUBS r3,r3,#8:BLE d2_exit:\ Check if all bytes done 10930 SUBS r10,r10,#8:BGT d2_copy:B d2_chunk:\ Next data byte(s) 10940.d2_exit LDMFD r13!,{pc}:\ Return 10950 10960;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 10970 10980.unpack_MAC \ MacIntosh MacPaint picture 10990 STMFD r13!,{r14}:\ Save link 11000 LDR r1,screen:MOV r5,#&CA00:ADD r5,r5,#&80:\ Destination, total length 11010 LDR r3,a_flipmap:\ Inverted and reversed bits map 11020 BL d4_chunk:\ Load first chunk 11030.d4_block LDRB r0,[r2],#1:\ Get block code byte 11040 SUBS r10,r10,#1:BLLE d4_chunk:\ Next chunk if needed 11050 TST r0,#128:BNE d4_rep:MOV r4,r0:\ Repeated data ? 11060.d4_scopy LDRB r0,[r2],#1:\ Get single byte 11070 SUBS r10,r10,#1:BLLE d4_chunk:\ Next chunk if needed 11080 LDRB r0,[r3,r0]:BL d4_buf:\ Buffer screenbyte 11090 SUBS r4,r4,#1:BPL d4_scopy:B d4_block:\ Finish series and go on 11100.d4_rep RSB r4,r0,#&100:\ Number of repeated data bytes 11110 LDRB r0,[r2],#1:\ Get byte to repeat 11120 SUBS r10,r10,#1:BLLE d4_chunk:\ Next chunk if needed 11130 LDRB r0,[r3,r0]:\ Flip 11140.d4_rcopy BL d4_buf:\ Buffer screenbyte 11150 SUBS r4,r4,#1:BPL d4_rcopy:B d4_block:\ Finish repeat and go on 11160.d4_buf STRB r0,[r1],#1:SUBS r5,r5,#1:MOVNE pc,r14:\ Next screenbyte 11170.d4_exit LDMFD r13!,{pc}:\ Return 11180.d4_chunk MOV r12,r14:\ Remember link 11190 BL get_schunk:BEQ d4_exit:LDR r2,chunk:LDR r10,loaded:\ Chunk 11200 MOV pc,r12:\ Return 11210 11220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 11230 11240.unpack_IFF \ Amiga IFF picture 11250 STMFD r13!,{r14}:\ Save link 11260 LDR r0,height:STR r0,d3_trow:\ Number of pixel rows 11270 LDR r11,width:MOV r11,r11,LSR#3:\ Number of bytes per pixel row 11280 LDR r10,screen:\ Destination 11290 BL d3_chunk:\ Load first chunk 11300 LDR r0,compr:TEQ r0,#0:MOVNE r8,#1<<23:MOVEQ r8,#0:\ Init decompression 11310.d3_row LDR r6,pixbits:MOV r7,#1:\ Number of bit planes, bit mask 11320 MOV r0,r11,LSL#3:LDR r1,a_rowdat:MOV r2,#0:\ Prepare clear 11330.d3_clear STRB r2,[r1],#1:SUBS r0,r0,#1:BNE d3_clear:\ Clear pixel buffer 11340.d3_plane MOV r5,r11:LDR r4,a_rowdat:\ Fill in colour bits for bitplane 11350.d3_byte BL d3_databyte:\ Get next data byte 11360 MOV r0,r0,LSL#24:MOV r3,#8:\ Prepare 11370.d3_pixbit MOVS r0,r0,LSL#1:\ Pixel-bit set ? 11380 LDRCSB r2,[r4]:ORRCS r2,r2,r7:STRCSB r2,[r4],#1:\ If so, shift bit in 11390 ADDCC r4,r4,#1:\ If not so, next pixel data byte 11400 SUBS r3,r3,#1:BNE d3_pixbit:\ Next of eight pixels 11410 SUBS r5,r5,#1:BNE d3_byte:\ Next data byte 11420 MOV r7,r7,LSL#1:SUBS r6,r6,#1:BNE d3_plane:\ Next bitplane 11430 LDR r1,sctype:TST r1,#3:BNE d3_ham:\ HAM pixel row 11440 MOV r0,r10:MOV r1,r11,LSL#3:\ Set up data for row-plot 11450 BL plot_row:\ Plot normal pixel row 11460 MOV r10,r0::B d3_nextrow:\ Set next row address, do next row 11470.d3_ham MOV r2,#0:ADR r7,hamcols:\ Current RGB and 16-col RGB values 11480 MOV r5,r11,LSL#3:LDR r3,a_rowdat:\ Pixels and start of pixel row data bf 11490 MOV r6,r10:\ Remember current screen addr 11500.d3_doham LDRB r0,[r3],#1:\ Get pixel data 11510 MOV r1,r0,LSR#4:AND r0,r0,#15:TEQ r1,#0:\ Split and test upper two bits 11520 LDREQ r2,[r7,r0,LSL#2]:BEQ d3_hamon:\ New RGB value 11530 CMP r1,#2:MOVLT r1,#0:MOVEQ r1,#8:MOVGT r1,#4:\ R, G or B change ? 11540 MOV r4,#15:BIC r2,r2,r4,LSL r1:ORR r2,r2,r0,LSL r1:\ New R or G or B 11550.d3_hamon LDR r0,a_rgb22map:LDR r0,[r0,r2,LSL#1]:\ Get left/right pixel 11560 LDR r1,d3_trow:\ Retrieve row number 11570 EOR r4,r10,r1,LSL#1:TST r4,#%10:\ Every other pair, switched per line 11580 MOVEQ r0,r0,LSL#8:ORREQ r0,r0,r0,LSR#16:\ Swap pixels in pixel pair 11590 STRB r0,[r10],#1:MOV r0,r0,LSR#8:STRB r0,[r10],#1:\ Display pixels 11600 SUBS r5,r5,#1:BNE d3_doham:\ Next pixel(s) 11610 LDR r0,rowlen:ADD r10,r6,r0:\ Address of next screen row 11620.d3_nextrow LDR r0,d3_trow:SUBS r0,r0,#1:STR r0,d3_trow:BGT d3_row:\ Next 11630.d3_exit LDMFD r13!,{pc}:\ Return 11640\ 11650.d3_trow EQUD 0:\ Temp for row counter 11660.d3_chunk MOV r1,r14:\ Remember link 11670 BL get_schunk:BEQ d3_exit:LDR r9,chunk:LDR r12,loaded:\ Chunk 11680 MOV pc,r1:\ Return 11690.d3_databyte \ Returns next data byte in r0 (decompresses if necessary) 11700 STMFD r13!,{r14}:\ Save link 11710 TST r8,#1<<23:BEQ d3_new:\ Not compressed ? 11720 TST r8,#&FF:BEQ d3_newcode:\ No more in repeat or series, next 11730 SUB r8,r8,#1:\ Decrement count 11740 TST r8,#1<<22:MOVEQ r0,r8,LSR#24:LDMEQFD r13!,{pc}^:\ Next byte repeat 11750.d3_new LDRB r0,[r9],#1:SUBS r12,r12,#1:BLLE d3_chunk:\ Next byte is new 11760 LDMFD r13!,{pc}^:\ Return 11770.d3_newcode LDRB r0,[r9],#1:SUBS r12,r12,#1:BLLE d3_chunk:\ Next code 11780 CMP r0,#128:BEQ d3_newcode:BGT d3_newrep:\ Repeat, series or none 11790 ORR r8,r8,r0:ORR r8,r8,#1<<22:\ Set count and series type 11800 LDRB r0,[r9],#1:SUBS r12,r12,#1:BLLE d3_chunk:\ First series byte 11810 LDMFD r13!,{pc}^:\ Return 11820.d3_newrep RSB r0,r0,#&100:\ Determine count 11830 ORR r8,r8,r0:BIC r8,r8,#1<<22:\ Set count and repeat type 11840 LDRB r0,[r9],#1:SUBS r12,r12,#1:BLLE d3_chunk:\ First repeat 11850 BIC r8,r8,#255<<24:ORR r8,r8,r0,LSL#24:\ Unpack 11860 LDMFD r13!,{pc}^:\ Return 11870.hamcols EQUS STRING$(64,CHR$0):ALIGN:\ HAM mode 16-colour RGB values 11880 11890;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 11900 11910.unpack_GIF \ GIF picture 11920 STMFD r13!,{r14}:\ Save link 11930 BL decompress_GIF:\ Decompress image data 11940 BL build_GIF:\ Build sprite 11950 LDMFD r13!,{pc}:\ Return 11960\ 11970.build_GIF \ Builds picture from decompressed GIF data 11980 STMFD r13!,{r14}:\ Save link 11990 LDR r3,screen:\ Decompressed data start 12000 LDR r12,height:LDR r11,pixbits:\ Height and bits per pixel 12010 LDR r2,width:MUL r2,r12,r2:MUL r2,r11,r2:\ Bits of decompressed data 12020 ADD r2,r2,#31:MOV r2,r2,LSR#5:\ Words of decompressed data 12030 LDR r1,himem:SUB r6,r1,r2,LSL#2:\ Temp buffer at end of sprite buffer 12040.d5_tosc SUBS r2,r2,#1:LDR r0,[r3,r2,LSL#2]:STR r0,[r6,r2,LSL#2]:\ Move 12050 BGT d5_tosc:\ Next word 12060 MVN r8,#0:MOV r9,r8,LSL r11:EOR r8,r9,r8:\ Calculate pixel bit mask 12070 MOV r9,#0:MOV r10,#0:\ Bits left in pixel buffer, pixel buffer 12080 LDR r4,laced:TEQ r4,#0:MOVNE r4,#1:MOVEQ r4,#0:\ First pass number 12090 LDR r12,height:LDR r0,screen:\ Current row number, destination start 12100.d5_row LDR r3,width:LDR r7,a_rowdat:\ Pixels per row, pixel buffer 12110.d5_pixs CMP r11,r9:BLE d5_pixl:\ Enough bits loaded for next pixel 12120 LDRB r1,[r6],#1:ORR r10,r10,r1,LSL r9:\ Shift in next few bits 12130 ADD r9,r9,#8:\ Eight more bits in buffer 12140.d5_pixl AND r1,r10,r8:STRB r1,[r7],#1:\ Store pixel value 12150 MOV r10,r10,LSR r11:SUB r9,r9,r11:\ Shift out pixelbits 12160 SUBS r3,r3,#1:BNE d5_pixs:\ Next pixel 12170 LDR r1,width:BL plot_row:\ Plot pixel row 12180 SUBS r12,r12,#1:BGT d5_row:\ Next row 12190 LDR r0,laced:TEQ r0,#0:BEQ d5_exit:\ Not interlaced, ready 12200 \ Image rows are 4-pass interlaced, do a 'sort' of them 12210 MOV r4,#0:LDR r12,rowlen:LDR r11,screen:\ Prepare init of index table 12220 LDR r2,a_table:LDR r3,height:\ Start of indices table, number of rows 12230 MLA r3,r12,r3,r11:\ End of row buffer 12240.d5_pass ADR r0,gif_first:LDRB r0,[r0,r4]:MLA r0,r12,r0,r11:\ Start row 12250 ADR r1,gif_step:LDRB r1,[r1,r4]:MUL r1,r12,r1:\ Offset to next rows 12260.d5_table STR r0,[r2],#4:ADD r0,r0,r1:CMP r0,r3:BLT d5_table:\ End row ? 12270 ADD r4,r4,#1:CMP r4,#4:BLT d5_pass:\ Next pass 12280 \ Initial index table built up, now sort the rows in sequential order 12290 LDR r10,a_table:LDR r9,height:\ Global data 12300 MOV r4,#0:LDR r8,screen:\ Start row number and address 12310.d5_rownr ADD r1,r10,r4,LSL#2:\ Prepare search for current row 12320.d5_rowsc LDR r0,[r1],#4:CMP r0,r8:BNE d5_rowsc:\ Search for row 12330 SUB r1,r1,#4:SUB r0,r1,r10:MOV r0,r0,LSR#2:MLA r7,r0,r12,r11:\ Rowaddr 12340 LDR r0,[r10,r4,LSL#2]:STR r0,[r1]:\ Write new address after exchange 12350 MOV r2,r12:\ Bytes on row 12360.d5_exch SUBS r2,r2,#4:LDR r0,[r7,r2]:LDR r1,[r8,r2]:\ Get words 12370 STR r0,[r8,r2]:STR r1,[r7,r2]:BGT d5_exch:\ Exchange rows 12380 ADD r8,r8,r12:\ Next sequential row address 12390 ADD r4,r4,#1:CMP r4,r9:BLT d5_rownr:\ Next sequential row 12400.d5_exit LDMFD r13!,{pc}:\ Return 12410.gif_step EQUB 8:EQUB 8:EQUB 4:EQUB 2:\ Steps per pass 12420.gif_first EQUB 0:EQUB 4:EQUB 2:EQUB 1:\ First row numbers per pass 12430 ALIGN 12440\ 12450.decompress_GIF \ LZW decompression of GIF raster data to buffer 12460 \ Global registers 12470 \ r12 = input data pointer (points to current input bit) 12480 \ r11 = current decompression code size 12490 \ r10 = table base address (2 words * 2^12 = 32K is needed as table) 12500 \ r9 = current code 12510 \ r8 = old code 12520 \ r7 = current output bitaddress 12530 \ r6 = first free table code 12540 \ r5 = bitaddress of old code's translation 12550 STMFD r13!,{r14}:\ Save link 12560 MOV r0,#0:STR r0,lzw_reload:\ No reload for first chunk 12570 MOV r12,#0:BL lzw_chunk:\ Load first chunk of data 12580 LDRB r0,lzw_root:\ Initial code size 12590 MOV r1,#1:MOV r1,r1,LSL r0:STR r1,lzw_rlim:\ 2^rootsize limit code 12600 LDR r1,arcbits:STR r1,lzw_bits:\ Bits per pixel output 12610 LDR r10,tabbf:\ Decompression string table buffer start 12620 LDR r0,screen:MOV r7,r0,LSL#3:\ Destination for decompressed stream 12630 BL lzw_reset:\ Reset code size and table 12640.lzw_cget \ Get next code from codestream in r9 12650 AND r3,r12,#7:\ Bit address within byte (0-7) 12660 MOV r2,r12,LSR#3:\ Byte address 12670 LDRB r0,[r2],#1:\ Get first eight bits 12680 LDRB r1,[r2],#1:ORR r0,r0,r1,LSL#8:\ Add another eight 12690 LDRB r1,[r2],#1:ORR r0,r0,r1,LSL#16:\ And another eight 12700 MOV r0,r0,LSR r3:MVN r1,#0:BIC r9,r0,r1,LSL r11:\ Mask out required bits 12710 ADD r12,r12,r11:\ Next bit address 12720 LDR r1,lzw_rlim:\ 2^root size limit code 12730 SUBS r1,r9,r1:BEQ lzw_CC:CMP r1,#1:BEQ lzw_EOI:\ Check special codes 12740 CMP r9,r6:BGE lzw_nottable:\ Check if code in table 12750\ 12760.lzw_intable \ Code was in table 12770 LDR r0,lzw_rlim:CMP r9,r0:BGE lzw_cnor:\ Is it non-root ? 12780 STR r9,lzw_dum:ADR r0,lzw_dum:MOV r0,r0,LSL#3:\ Store code at dummy 12790 LDR r2,lzw_bits:B lzw_inco:\ Output root string 12800.lzw_cnor ADD r1,r10,r9,LSL#3:LDR r0,[r1],#4:LDR r2,[r1]:\ Code adr/len 12810.lzw_inco MOV r1,r7:BL lzw_bitcopy:\ Output string for code 12820 CMP r8,#0:BLT lzw_in2:\ No old code yet 12830 LDR r0,lzw_oldlen:LDR r2,lzw_bits:ADD r0,r0,r2:\ Translation's length 12840 ADD r2,r10,r6,LSL#3:ADD r6,r6,#1:STR r5,[r2],#4:STR r0,[r2]:\ New entry 12850.lzw_in2 SUB r0,r1,r7:MOV r5,r7:STR r0,lzw_oldlen:\ New 'old code' info 12860 MOV r7,r1:\ New output bitaddress 12870\ 12880.lzw_nextget MOV r8,r9:\ Old code = code 12890 LDR r0,lzw_limit:CMP r6,r0:BLT lzw_ncget:\ Code size limit ? 12900 ADD r11,r11,#1:CMP r11,#12:MOVGT r11,#12:\ Increase code size (<=12) 12910 MOV r0,#1:MOV r0,r0,LSL r11:STR r0,lzw_limit:\ 2^codesize limit code 12920.lzw_ncget LDR r1,lzw_endbit:ADD r0,r12,r11:\ Bitaddress after next code 12930 CMP r0,r1,LSL#3:BLGT lzw_chunk:\ New chunk if out of inputbits 12940 B lzw_cget:\ Next code 12950\ 12960.lzw_nottable \ Code was not in table 12970 MOV r1,r7:MOV r0,r5:LDR r2,lzw_oldlen:BL lzw_bitcopy:\ Output 'old' 12980 LDR r2,lzw_bits:MOV r0,r5:BL lzw_bitcopy:\ Output first char of 'old' 12990 SUB r0,r1,r7:MOV r5,r7:STR r0,lzw_oldlen:\ New 'old code' info 13000 ADD r2,r10,r6,LSL#3:ADD r6,r6,#1:STR r5,[r2],#4:STR r0,[r2]:\ New entry 13010 MOV r7,r1:\ New output bitaddress 13020 B lzw_nextget:\ Next input code 13030\ 13040.lzw_CC BL lzw_reset:B lzw_cget:\ <CC>, reset and continue 13050.lzw_EOI \ <EOI>, end of decompression 13060.lzw_exit LDMFD r13!,{pc}:\ Return 13070\ 13080.lzw_chunk \ Reads chunk with r0 bytes re-read (if r12=0, first chunk) 13090 MOV r1,r14:\ Remember link 13100 LDR r0,lzw_reload:BL get_chunk:BEQ lzw_exit:\ Chunk (with re-read) 13110 MOV r14,r1:STMFD r13!,{r4,r14}:\ Save registers and link 13120 LDR r14,chunk:MOV r0,r14,LSL#3:\ Start of buffered data (byte/bitaddr) 13130 CMP r12,#0:BNE lzw_chnof:\ First chunk load ? 13140 LDRB r1,[r14],#1:STR r1,lzw_root:\ Initial code size (first chunk) 13150 MOV r4,r0:\ First bit is exact start 13160 MOV r0,#0:B lzw_chfco:\ No offset for cleanup destination 13170.lzw_chnof LDR r3,lzw_endbit:RSB r1,r12,r3,LSL#3:\ Bits left in buffer 13180 RSB r1,r1,#16:ADD r4,r0,r1:\ First bit (reloaded last count + 2 bytes) 13190 ADD r14,r14,#2:\ Account for 2 extra bytes before count byte 13200 MOV r0,#2:\ 2-byte offset for cleanup 13210.lzw_chfco LDR r1,chunk:ADD r0,r1,r0:MOV r12,r14:\ Prepare count byte kill 13220 LDR r3,loaded:ADD r3,r1,r3:\ End address of loaded chunk 13230.lzw_chkil LDRB r1,[r12],#1:\ Current count byte 13240 CMP r1,#0:BEQ lzw_chout:\ Is this the end count byte ? 13250 ADD r14,r12,r1:\ Next count byte's address 13260 CMP r14,r3:BGE lzw_chout:\ Is it buffered ? If so, copy data 13270.lzw_chcop CMP r12,r14:LDRNEB r1,[r12],#1:STRNEB r1,[r0],#1:BNE lzw_chcop 13280 B lzw_chkil:\ Continue until either end count or non-buffered count 13290.lzw_chout SUB r1,r3,r12:ADD r1,r1,#3:STR r1,lzw_reload:\ Reload required 13300 MOV r12,r4:\ Bit address of start of new data 13310 STR r0,lzw_endbit:\ Exact end of 'clean' databits 13320 LDMFD r13!,{r4,pc}:\ Return 13330\ 13340.lzw_dum EQUD 0:\ Dummy word 13350.lzw_oldlen EQUD 0:\ Length of translation for old code 13360.lzw_reload EQUD 0:\ Bytes to reload for clean continuation 13370.lzw_endbit EQUD 0:\ Address of end of loaded data 13380.lzw_root EQUD 0:\ Root code size 13390.lzw_bits EQUD 0:\ Bits per character/pixel 13400.lzw_rlim EQUD 0:\ 2^root size limit code 13410.lzw_limit EQUD 0:\ 2^current codesize limit code 13420\ 13430.lzw_reset \ Resets codesize and tables 13440 LDR r0,lzw_root:ADD r11,r0,#1:\ Initial code size 13450 MOV r0,#1:MOV r0,r0,LSL r11:STR r0,lzw_limit:\ 2^codesize limit code 13460 LDR r0,lzw_rlim:ADD r6,r0,#2:\ First free code = limit code + 2 13470 MVN r8,#0:\ No old code yet 13480 MOVS pc,r14:\ Return 13490\ 13500.lzw_bitcopy \ Copies r2 bits from bit address r0 to bit address r1 13510 \ On exit - r1 is bit address of first bit after bitcopy 13520 STMFD r13!,{r3-r6,r14}:\ Save registers and link 13530 MOV r3,r0,LSR#3:MOV r4,r1,LSR#3 13540 AND r0,r0,#7:AND r5,r1,#7 13550 ADD r1,r1,r2:\ New bit address of output 13560 LDRB r14,[r4]:MVN r6,#0:BIC r6,r14,r6,LSL r5:\ First bits of output #r5 13570 LDRB r14,[r3],#1:MOV r14,r14,LSR r0:\ First bits of input 8-#r0 13580 ORR r6,r6,r14,LSL r5:\ Glue together 13590 ADD r2,r2,r5:\ Total number of bits to copy including old bits 13600 RSB r0,r0,#8:ADD r5,r5,r0:\ Shift factor to add next eight bits 13610.lzw_bito LDRB r14,[r3],#1:ORR r6,r6,r14,LSL r5:\ Construct byte 13620 STRB r6,[r4],#1:MOV r6,r6,LSR#8:\ Write output and adjust accumumator 13630 SUBS r2,r2,#8:BGT lzw_bito:\ Until all bits output 13640 LDMFD r13!,{r3-r6,pc}^:\ Return 13650 13660;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 13670 13680\ Routines to make several maps 13690 13700.a_colmap EQUD 0:\ Map addresses 13710.a_flipmap EQUD 0 13720.a_rgb22map EQUD 0 13730.a_to_rgbmap EQUD 0 13740.a_from_rgbmap EQUD 0 13750.a_rowdat EQUD 0 13760.a_table EQUD 0 13770 13780.make_maps \ Sets up maps and addresses 13790 STMFD r13!,{r14}:\ Save link 13800 BL r_colmap:STR r12,a_colmap 13810 BL r_flipmap:STR r12,a_flipmap 13820 BL r_rgb22map:STR r12,a_rgb22map 13830 BL r_to_rgbmap:STR r12,a_to_rgbmap 13840 BL r_from_rgbmap:STR r12,a_from_rgbmap 13850 BL r_rowdat:STR r12,a_rowdat 13860 BL r_table:STR r12,a_table 13870 BL make_flipmap 13880 BL make_rgbmaps 13890 LDMFD r13!,{pc}^:\ Return 13900 13910.make_rgbmaps \ Sets up 256 colour <---> 4096 &RGB maps 13920 STMFD r13!,{r14}^:\ Save link 13930 BL make_to_rgbmap 13940 BL make_from_rgbmap 13950 BL make_rgb22map 13960 LDMFD r13!,{pc}^:\ Return 13970 13980.make_flipmap \ Makes inverted and reversed bit map (PI1/PI3/MAC) 13990 STMFD r13!,{r0-r4,r14}:\ Save registers and link 14000 MOV r0,#&FF:LDR r4,a_flipmap:\ Current byte value and map base 14010.mf_byte MOV r3,r0:MOV r2,#8:MOV r1,#0 14020.mf_flip MOVS r3,r3,LSR#1:ADC r1,r1,r1:SUBS r2,r2,#1:BNE mf_flip:\ Reverse 14030 EOR r1,r1,#&FF:STRB r1,[r4,r0]:SUBS r0,r0,#1:BPL mf_byte:\ Store and next 14040 LDMFD r13!,{r0-r4,pc}^:\ Return 14050 14060.make_to_rgbmap \ Makes 256x4 entry map from standard 256 logical colours 14070 \ to their &RGB (12-bits) value (0-4095) in the standard palette mapping 14080 STMFD r13!,{r14}:\ Save link 14090 LDR r9,a_to_rgbmap:\ Address of 256-to-4096 map 14100 MOV r0,#0:MOV r1,#16:\ Current logical colour value, read normal colour 14110.mt_readpal \ Determine R,G,B from logical colour number 14120 MOV r2,#0:MOV r3,#0:MOV r4,#0:\ R,G,B components 14130 TST r0,#1<<7:ORRNE r4,r4,#8:\ Top bit BLUE 14140 TST r0,#1<<6:ORRNE r3,r3,#8:\ Top bit GREEN 14150 TST r0,#1<<5:ORRNE r3,r3,#4:\ Second bit GREEN 14160 TST r0,#1<<4:ORRNE r2,r2,#8:\ Top bit RED 14170 TST r0,#1<<3:ORRNE r4,r4,#4:\ Second bit BLUE 14180 TST r0,#1<<2:ORRNE r2,r2,#4:\ Second bit RED 14190 TST r0,#1<<1:ORRNE r2,r2,#2:ORRNE r3,r3,#2:ORRNE r4,r4,#2:\ Top TINT 14200 TST r0,#1<<0:ORRNE r2,r2,#1:ORRNE r3,r3,#1:ORRNE r4,r4,#1:\ Second TINT 14210 ORR r7,r4,r3,LSL#4:ORR r7,r7,r2,LSL#8:\ Build &RGB 14220 STR r7,[r9,r0,LSL#2]:\ Write map entry 14230 ADD r0,r0,#1:CMP r0,#&100:BLT mt_readpal:\ Next logical colour 14240 LDMFD r13!,{pc}^:\ Return 14250 14260.make_from_rgbmap \ Makes 4096x1 entry map from 4096 &RGB (12-bits) value 14270 \ to closest 256-colour mode logical colour representing the RGB value 14280 STMFD r13!,{r14}:\ Save link 14290 LDR r12,a_from_rgbmap:\ Address of 4096-to-256 map 14300 LDR r11,a_to_rgbmap:\ Address of 256-to-4096 map 14310 MOV r0,#0:\ Current &RGB value 14320.mf_closest \ Calculate closest colour value for RGB 14330 MOV r10,r0,LSR#1:AND r10,r10,#&60:TST r0,#1<<3:ORRNE r10,r10,#&80 14340 TST r0,#1<<11:ORRNE r10,r10,#&10:\ Hardware determined top 4 bits 14350 MOV r1,r0,LSR#8:MOV r2,r0,LSR#4:AND r2,r2,#15:AND r3,r0,#15\ Get R,G,B 14360 MOV r7,#0:MOV r8,#0:MOV r9,#1<<30:\ Counter, 'closest' index/value 14370.mf_distance \ Calculate distance of target to palette 14380 ORR r6,r10,r7:LDR r6,[r11,r6,LSL#2]:\ &RGB value of current colour value 14390 MOV r4,r6,LSR#8:MOV r5,r6,LSR#4:AND r5,r5,#15:AND r6,r6,#15:\ Get R,G,B 14400 SUBS r4,r4,r1:RSBCC r4,r4,#0:SUBS r5,r5,r2:RSBCC r5,r5,#0 14410 SUBS r6,r6,r3:RSBCC r6,r6,#0:\ Difference (R-R,G-G,B-B) 14420 MOV r4,r4,LSL#1:ADD r5,r5,r5,LSL#1:\ R*2,G*3,B*1 weights 14430 MUL r14,r4,r4:MLA r14,r5,r5,r14:MLA r14,r6,r6,r14:\ Square and add diffs 14440 CMP r14,r9:MOVLT r9,r14:MOVLT r8,r7:\ If less, then register 14450 ADD r7,r7,#1:CMP r7,#16:BLT mf_distance:\ Next palette entry 14460 ORR r1,r10,r8:STRB r1,[r12],#1:\ Calculate pixel value and store 14470 ADD r0,r0,#1:CMP r0,#&1000:BLT mf_closest:\ Next RGB value 14480 LDMFD r13!,{pc}^:\ Return 14490 14500.make_rgb22map \ Makes 4096 colour RGB value <---> 2-pixel byte value map 14510 \ Per 2 bytes, first is closest approximation, second 'rest' approx 14520 STMFD r13!,{r14}:\ Save link 14530 LDR r10,a_to_rgbmap:LDR r11,a_from_rgbmap:\ 256 <---> 4096 maps 14540 LDR r7,a_rgb22map:MOV r0,#0:\ Base of map and first 12-bit RGB value 14550.mr_rgb22 \ Calculate left and right pixel value approximations 14560 LDRB r8,[r11,r0]:\ First pixel's RGB approximation 14570 LDR r9,[r10,r8,LSL#2]:\ RGB of first pixel's colour 14580 \ Unpack RGB from exact RGB, unpack approximated RGB of first colour 14590 MOV r1,r0,LSR#8:MOV r2,r0,LSR#4:AND r2,r2,#15:AND r3,r0,#15 14600 MOV r4,r9,LSR#8:MOV r5,r9,LSR#4:AND r5,r5,#15:AND r6,r9,#15 14610 \ Calculate (2*targetRGB)-(RGB of first pixel) = RGB of second pixel 14620 RSBS r1,r4,r1,LSL#1:MOVCC r1,#0:CMP r1,#15:MOVGT r1,#15 14630 RSBS r2,r5,r2,LSL#1:MOVCC r2,#0:CMP r2,#15:MOVGT r2,#15 14640 RSBS r3,r6,r3,LSL#1:MOVCC r3,#0:CMP r3,#15:MOVGT r3,#15 14650 MOV r1,r1,LSL#8:ORR r1,r1,r2,LSL#4:ORR r1,r1,r3:\ &RGB value 14660 LDRB r9,[r11,r1]:\ Second pixel's RGB approximation 14670 STRB r8,[r7],#1:\ Store first pixel value 14680 STRB r9,[r7],#1:\ Store second pixel value 14690 ADD r0,r0,#1:CMP r0,#&1000:BLT mr_rgb22:\ Next RGB value 14700 LDMFD r13!,{pc}^:\ Return 14710 14720\ Map space 14730 14740.r_rgb22map ADR r12,rgb22map:MOV pc,r14:\ Return map address 14750.rgb22map ]:P%+=4096*2:[OPTN \ 4096 &RGB to 2 pixel value approximations 14760.r_to_rgbmap ADR r12,to_rgbmap:MOV pc,r14:\ Return map address 14770.to_rgbmap ]:P%+=256*4:[OPTN \ 256 colour value to 4096 &RGB value 14780.r_from_rgbmap ADR r12,from_rgbmap:MOV pc,r14:\ Return map address 14790.from_rgbmap ]:P%+=4096*1:[OPTN \ 4096 &RGB value to 256 colour value 14800.r_flipmap ADR r12,flipmap:MOV pc,r14:\ Return map address 14810.flipmap ]:P%+=256:[OPTN \ Inverted and reversed bits map 14820.r_colmap ADR r12,colmap:MOV pc,r14:\ Return map address 14830.colmap ]:P%+=256:[OPTN \ Logical to logical map normal IFF 14840.r_table ADR r12,table:MOV pc,r14:\ Return map address 14850.table ]:P%+=4096:[OPTN \ Sort indices buffer for GIF interlaced buildup 14860.r_rowdat ADR r12,rowdat:MOV pc,r14:\ Return buffer address 14870.rowdat ]:P%+=2048:[OPTN \ Buffer for row pixel values 14880 14890]NEXT 14900CALL make_maps:REM Calculate maps 14910ENDPROC
� >!RunImage K�������������������������������������������������������������������� K� Converts foreign graphics files to Archimedes (Full RISCOS app) (-� Version date : Tue,14 Nov 1989.12:23:23 2� � 1989 Zeridajh software <� by John Kortink FK�������������������������������������������������������������������� P.� � �'"Error"''"'";�$;"' (code ";�;")"'':� Z� menu1 2048,submenu 2048 d9� window1 2048,window2 2048,window3 2048,window4 2048 n9� poll 256,block 256,filename 256,err 256,palette 256 x2� MenuData%(40),SubmenuData%(40),Palette%(256) �6� arg% 256,colmap% 256,transtab% 256,Code% 30*1024 �ITinysize%=40*1024:� Tiny% Tinysize%:� File/table buffer (fixed size!) �LProgneed%=180*1024:� Estimated space needed for program+vars (no sprbuf) �7Totalfree%=�-�:� Total free for program+vars+sprbuf �=Spritesize%=Totalfree%-Progneed%:� Free for sprite buffer �E�Spritesize%<1024 � � 1,"No room to start up Translator properly" �C�Tinysize%<40*1024 � � 1,"Who screwed around with my program ?" �)� Sprite% Spritesize%:� Sprite buffer �(�initialise:� Initialise application �4�mode_change(-1):� Reselect current mode to tidy �[� � �error(�,�$+" (code "+Þ+")"):�FileOpen � �#File:� Report error, ensure file closed ���Spritesize%<80*1024 � �error(0,"WARNING ! I have "+�(Spritesize%)+" bytes free for image handling. Press OK to continue with this tricky situation or CANCEL to quit (and reserve some more memory !)") �� � Poll and action Ȏ �poll(0) � * � 0 : � Nothing to do, perform checks " �AwaitAck � ,A AwaitAck=�:ș "OS_CLI","Remove "+Save$:� Delete file saved 6E �error(-1,"Bad data transfer, receiver dead"):� No DataLoadAck @ � J T" � 1 : � Redraw window request ^ �redraw_window(poll!0,�) h r � 2 : � Open window request | �open_window(0,poll) � �! � 3 : � Close window request �! win%=poll!0:� Window handle �( �close_window(win%):� Close window �w �win%=win_img% � Img=�:�set_palette(0):�close_window(win_save%):� Reset palette, wipe save window if image closed � �# � 4 : � Pointer leaving window � �$ � 5 : � Pointer entering window � � � 6 : � Mouse clicked �A but%=poll!8:win%=poll!12:ico%=poll!16:� Buttons/window/icon � Ȏ win% � � -2 : � Click on iconbar �ico%=Iiconbar% � � Iconbar icon clicked & Ȏ but% � 7 � 0 � 2 : �iconbar_menu : � 4 : �options_menu D � N � X+ � win_img% : � Click on image window b Ȏ but% � 7 � l7 � 2 : �options_menu:� Menu button, pop up menu v � �0 � win_save% : � Click on save file window � �ico%=Isave% � � Ȏ but% � &7F � �; � 16,64 : � Drag,calculate drag box and create it �> !block=win%:ș WGetWS%,,block:x%=block!4:y%=block!8 �) block!4=ico%:ș WGetII%,,block �K !block=win_save%:block!4=5:block!8+=x%:block!12+=y%:block!16+=x% �K block!20+=y%:block!24=0:block!28=0:block!32=ScrW%:block!36=ScrH% �. ș WDragB%,,block:� Create drag box � � � � � � � : � 7 : � User has dropped drag box of save file window . ș WGetPI%,,block:� Get pointer position K block!20=block!12:block!24=block!16:block!28=block!0:block!32=block!4 H block!4=0:block!8=0:block!12=0:block!16=1:block!36=0:block!40=&FF9 *: filename$=�string(filename):$(block+44)=filename$+�0 4! !block=(44+�filename$+4)��3 >3 ș WSendMsg%,17,block:� Send DataSave message H7 �close_window(win_save%):� Close save file window R \ � 8 : � Key pressed fG win%=poll!0:ico%=poll!4:char%=poll!24:� Window, icon, key pressed p- �(win%=win_save%) � (ico%=Ifilename%) � z Ȏ char% � � � 13 : � Return pressed �K �error(-1,"Please drag the sprite file icon to a directory viewer") � � 27 : � Escape pressed �! �close_window(win_save%) � � � � � �% � 9 : � Menu selection from user �D selected%=poll!0:selected2%=poll!4:� Menu/submenu icon indices �4 select$="":select2$="":� No selections default �; �selected%>=0 � select$=�string(MenuData%(selected%)) �A �selected2%>=0 � select2$=�string(SubmenuData%(selected2%)) � Ȏ �select$,4) � � "" : � Do nothing � "Quit" : � Quit program �die:� Tidy up and exit $8 � "Zoom","Norm" : � Zoom in,out or back to normal .1 OldZoom%=Zoom%:� Remember old zoom factor 8 Ȏ select$ � B# � "Zoom in": Zoom%=Zoom%*2 L/ � "Zoom out": �Zoom%>1 � Zoom%=Zoom%�2 V! � "Normal size": Zoom%=1 ` � jL � Set image window extent and title according to current zoom factor tC !block=0:block!4=0:block!8=�sprW*Zoom%:block!12=�sprH*Zoom% ~C ș WSetE%,win_img%,block:� Set window extent to zoomed size �F $title_img%="Image "+File$:�Zoom%>1 � $title_img%+=" x"+�Zoom% �B !block=win_img%:ș WGetWS%,,block:� Read window's position �L dx%=(block!12-block!4)/2:dy%=(block!16-block!8)/2:� Half window size �H vx%=block!20+dx%:vy%=block!24-dy%:� Vector from centre to origin �I � Calculate new scroll offsets by scaling vector and re-transpose �G block!20=vx%*Zoom%/OldZoom%-dx%:block!24=vy%*Zoom%/OldZoom%+dy% �< �close_window(win_img%):�open_window(win_img%,block) �/ � "Save" : � Save whole or part of image �3 Save_kind$=select2$:� Remember type of save �9 �open_window(win_save%,0):� Open save file window �. � "Incl" : � Toggle save-palette on/off �# Palonoff=�Palonoff:� Toggle 5 � "Auto" : � Toggle auto mode selection on/off # AutoMode=�AutoMode:� Toggle ' � "Imag" : � Set image's palette � �set_palette(1):�Palette=0 � �error(-1,"Please select a mode with "+�(�image_cols)+" colours to display the image correctly.") (' � "Desk" : � Set desktop palette 2 �set_palette(0) <( � "Stan" : � Set standard palette F �set_palette(2) P& � "GIF " : � GIF picture number Z) GIFImage%=�(select2$):� New value d � n* ș WGetPI%,,block:� Get pointer info xC �((block!8)�1)>0 � �options_menu:� Adjust click, re-open menu � �" � 17,18 : � Message from WIMP �/ � Ignore messages originating from myself �8 �(poll!4)=TaskHandle% � msgnr%=-1 � msgnr%=poll!16 � Ȏ msgnr% � � � -1 : � Don't react �- � 0 : �die:� Request to terminate task �% � 2 : � DataSaveAck, save file �H Save$=�string(poll+44):� Read full path-name of file to be saved � Ȏ Save_kind$ � �5 � "Full" : � Full resolution sprite, no edit �$ � "Whole" : �edit_part(�,�) �- � "Whole (scaled)" : �edit_part(�,�) # � "Part" : �edit_part(�,�) , � "Part (scaled)" : �edit_part(�,�) � " �hour_on:� Hourglass on , �Save_kind$="Full" � 6< � Full sprite, save image with palette (optionally) @( Out=�(Save$):� Open output file J1 spr%=Sprite%+Sprite%!8:� Start of sprite T; �Palonoff � (Palette%(0)<=16) � (Palette%(0)>=2) � ^& � Save with palette included h6 cols%=Palette%(0):� Colours in sprite's mode r2 extra%=cols%*8:� Extra bytes for palette |I ș "OS_GBPB",1,Out,Sprite%+4,8,0:� Output part of control block �H !arg%=extra%+Sprite%!12:ș "OS_GBPB",2,Out,arg%,4:� New offset �C !arg%=extra%+!spr%:ș "OS_GBPB",2,Out,arg%,4:� New offset �E ș "OS_GBPB",2,Out,spr%+4,28:� Output part of sprite header �E !arg%=extra%+spr%!32:ș "OS_GBPB",2,Out,arg%,4:� New offset �E !arg%=extra%+spr%!36:ș "OS_GBPB",2,Out,arg%,4:� New offset �= ș "OS_GBPB",2,Out,spr%+40,4:� Output sprite's mode � c%=1 � cols%:arg%!(c%*8-8)=�readpalval(Palette%(c%)):arg%!(c%*8-4)=arg%!(c%*8-8):�:ș "OS_GBPB",2,Out,arg%,cols%*8:� Output palette �J ș "OS_GBPB",2,Out,spr%+spr%!32,(spr%!16+1)*(spr%!20+1)*4:� Data �- � � No palette, output the whole lot �B ș "OS_GBPB",1,Out,Sprite%+4,Sprite%!12-4,0:� Output all � � �D �#Out:ș "OS_CLI","SetType "+Save$+" Sprite":� Close & type �4 � � Edited part in window on screen, save it , �invalidate_screen:� Screen invalid $ �Palonoff � pal%=1 � pal%=0 9 ș OSSpop%,2,,Save$,pal%:� Save screen in window &3 �24,0;0;ScrW%;ScrH%;:� Reset screen window 0 � :! �hour_off:� Hourglass off D@ poll!12=poll!8:poll!16=3:� Amend data block for DataLoad N9 ș WSendMsg%,18,poll:� Send DataLoad message back X( AwaitAck=�:� Await a DataLoadAck bC � 3,5 : � DataLoad/Open, check if sprite file and load if so l type%=poll!40:� Filetype v �(type%>=1)�(type%<=5) � �I poll!12=poll!8:poll!16=4:ș WSendMsg%,17,poll:� Send DataLoadAck �* File$=�string(poll+44):� Filename �: ș "OS_File",17,File$ � ,,,,Flen%:� File's length �" File=�(File$):� Open file �/ �File<>0 � FileOpen=�:� Should be open �2 !fhandle=File:!fptr=0:� Init chunk loader � �hour_on:� Hourglass on �@ �ImageW � �close_window(win_img%):� Old image discarded � Img=�:� Image invalid � Ȏ type% � � � &001 : Ok=�pic_PI1 � � &002 : Ok=�pic_PI3 � � &003 : Ok=�pic_IFF � &004 : Ok=�pic_MAC � &005 : Ok=�pic_GIF � ) Img=Ok:� Image ok if all is well *" �hour_off:� Hourglass off 43 �FileOpen � �#File:FileOpen=�:� Close file > �Img � H3 �set_palette(1):� Set image's own palette R2 �new_image_window:� Open window on image \ � f � p+ � 4 : � DataLoadAck, check or ignore zA �AwaitAck � AwaitAck=�:� Succesfully received DataLoadAck �# � &400C0 : � Submenu warning �I pointer%=poll!20:x%=poll!24:y%=poll!28:� Get pointer/proposed x/y �G main_item$=�string(MenuData%(poll!32)):� Which item's submenu ? � Ȏ main_item$ � �< � "Save image","GIF image" : �submenu(main_item$,�) �> ș WCreateSM%,,pointer%,x%,y%:� Open submenu/window � � �B � &400C1 : � Mode has changed (and it may not have been me) �" �mode_change(-1):� Tidy up � � �� �� � � ݤpic_PI1 � Makes Atari PI1 image "mode%=�mode(320,200,16,error$) $#�new_image(mode%,320,200) � =� .;ș "OS_GBPB",3,File,Tiny%,32,2:� Read palette from file 8�Palette%(0)=16:� c%=0 � 15:v%=Tiny%!(c%*2):r%=(v%�7)*32:g%=((v%>>12)�7)*32:b%=((v%>>8)�7)*32:Palette%(16-c%)=(r%<<16)+(g%<<8)+b%:� B@�screen_info("Atari PI1",320,200,16,mode%,"","",&7D00,&7D00) L;!fptr=&22:�display(unpack_PI1,mode%):� Unpack to sprite V�set_mode(mode%):=� ` j ݤpic_PI3 t� Makes Atari PI3 image ~!mode%=�mode(640,400,2,error$) �#�new_image(mode%,640,400) � =� �APalette%(0)=2:Palette%(1)=0:Palette%(2)=&FFFFFF:� Set palette �?�screen_info("Atari PI3",640,400,2,mode%,"","",&7D00,&7D00) �;!fptr=&22:�display(unpack_PI3,mode%):� Unpack to sprite ��set_mode(mode%):=� � � ݤpic_MAC �$� Makes MacIntosh MacPaint image �!mode%=�mode(576,512,2,error$) �#�new_image(mode%,576,720) � =� �APalette%(0)=2:Palette%(1)=0:Palette%(2)=&FFFFFF:� Set palette �_�screen_info("MacIntosh MacPaint",576,720,2,mode%,"Repeated byte","",Flen%-640,(576*720)�8) ;!fptr=640:�display(unpack_MAC,mode%):� Unpack to sprite �set_mode(mode%):=� ݤpic_IFF (� Makes Amiga IFF image 2%bmhd=�:cmap=�:body=�:� Init flags <2ham=�:lace=�:hires=�:halfbright=�:� Init flags F+wType%=1:� Set high-to-low type of data P2� Check if this is a standard IFF picture file Z�form$=�istring(4):�skip(4):form$+=�istring(4):�form$<>"FORMILBM" � �error(-1,"This screen file is not an IFF screen file !"):=� d)� � Follow BMHD,CMAP and BODY headers n0head$=�istring(4):hlen%=�w4:startptr%=�#File xȎ head$ � �& � "BMHD" : bmhd=�:� Bitmap header �= � Read picture/screen width, height, colours, etc. �? width%=�w2:height%=�w2:�skip(4):planes%=�w1:�skip(1) �A compressed=(�w1=1):�skip(5):s_width%=�w2:s_height%=�w2 �= � "CAMG" : flags%=�w4:� Get flag bits, set flags from it �5 ham=((flags%�&800)>0):lace=((flags%�&4)>0) �? hires=((flags%�&8000)>0):halfbright=((flags%�&80)>0) �- � "CMAP" : cmap=�:� Colour map (palette) �B paldefs%=hlen%�3:� Number of palette colour definitions �3 � _%=0 � paldefs%-1:Palette%(_%+1)=�w3:� �$ � "BODY" : body=�:� Screen data �) � Check if all parts are there �� �bmhd � �error(-1,"IFF error : I did not find a 'BMHD' block. Cannot proceed !"):� �:=� � �cmap � �error(-1,"IFF error : I did not find a 'CMAP' block. Cannot proceed !"):� �:=� 6 � Determine suitable Archimedes screen mode � �ham � colours%=16:mode%=�mode(640,s_height%,256,error$) � colours%=2^planes%:mode%=�mode(s_width%,s_height%,colours%,error$) . �mode%<0 � �error(-1,error$):� �:=� "- compr$="":info$="":scols%=colours% ,/ �compressed � compr$="Repeated byte" 6y �ham � scols%=4096:info$="Picture mode|Hold And Modify (HAM)" � �halfbright � info$="Picture mode|Half-bright" @] �ham � ok=�new_image(mode%,width%*2,height%) � ok=�new_image(mode%,width%,height%) J �ok � =� Tw �screen_info("Amiga IFF",width%,height%,scols%,mode%,compr$,info$,Flen%-(�#File),(width%*height%*planes%)�8) ^9 � Set second half of halfbright mode's palette h �halfbright � r? half%=colours%�2:� Number of colours in second half | � c%=1 � half% �F Palette%(c%+half%)=(Palette%(c%)�&E0E0E0)>>1:� Half bright � � � � �A � Set up palette data for HAM mode and palette entries �� �ham � � c%=0 � 15:p%=Palette%(c%+1):hamcols!(c%*4)=((p%�&F00000)>>12)+((p%�&F000)>>8)+((p%�&F0)>>4):�:Palette%(0)=-1 � Palette%(0)=colours% �F !fptr=�#File:!pixbits=planes%:!width=width%:!height=height% �9 !compr=compressed:�ham � !sctype=1 � !sctype=0 �8 �display(unpack_IFF,mode%):� Unpack to sprite � �set_mode(mode%) �� �6�skip(hlen%-((�#File)-startptr%)):� To next header � � body �=� ݤistring(len%) #� Returns string of length len% &� _%,_$ 0+_$="":� _%=1 � len%:_$+=�(�#File):�:=_$ : D��skip(amount%) N� Skips amount% bytes X�#File=amount%+�#File b� l vݤw1:=�w(1) �ݤw2:=�w(2) �ݤw3:=�w(3) �ݤw4:=�w(4) � � ݤw(len%) �� Returns len%-byte value �� _%,_r% �_r%=0:� _%=1 � len% �Ȏ wType% � �$ � 0 : _r%+=((�#File)<<(_%-1)*8) � � 1 : _r%=(_r%<<8)+�#File ��:� �=_r% ݤpic_GIF 3� Makes GIF (Graphics Interchange Format) image (� g_Palette%(),Pic_ptr%(),Pic_len%() *1� g_Palette%(256),Pic_ptr%(256),Pic_len%(256) 4+wType%=0:� Set low-to_high type of data >/signature$=�istring(6):� Read GIF signature HX�signature$,3)<>"GIF" � �error(-1,"This screen file is not a GIF screen file !"):=� R$� Read data in Screen Descriptor \>r_width%=�w2:r_height%=�w2:flags%=�w1:backgr%=�w1:�skip(1) f;global=((flags%�&80)>0):� Global colour map following ? p3g_pixbits%=(flags%�7)+1:� Global bits per pixel z:colbits%=((flags%>>4)�7)+1:� Bits of colour resolution � �global � �% � Read Global Colour Map palette �B � c%=1 � 2^g_pixbits%:g_Palette%(c%)=(�w1<<16)+(�w1<<8)+�w1:� �1 g_Palette%(0)=2^g_pixbits%:� Palette entries �'� Palette%(0)=-1:� No palette found �� �)� Scan data for pictures, make a list �picture%=0:� �?�skip_GIF_extension:� Skip extension blocks preceding Image �&� Search for next Image Descriptor �C� _%=�w1:image=(_%=�","):end=(_%=�";"):� image � end � (�#File) �g�image � �picture%<1 � ��:�error(-1,"GIF error : I failed to find the next Image Descriptor !"):=� ��image � " � Register picture's position . picture%+=1:Pic_ptr%(picture%)=(�#File)-1 - � If there's a local colour map, skip it $6 �skip(8):_%=�w1:�(_%�&80)>0 � �skip(3*((_%�7)+1)) ./ � Determine picture data length, skip data 8' �skip(1):� c%=�w1:�skip(c%):� c%=0 B3 Pic_len%(picture%)=(�#File)-Pic_ptr%(picture%) L� V � end `1pictures%=picture%:� Number of pictures found j�pictures%=1 � t. picture%=1:� Only one picture, display it ~5� � More than one picture, take user-selected one �� �(GIFImage%>0) � (GIFImage%<=pictures%) � picture%=GIFImage% � �error(-1,"GIF error : This file contains "+�(pictures%)+" images. Select '1'-'"+�(pictures%)+"' in the 'GIF image' submenu !") �� �I�#File=Pic_ptr%(picture%)+1:len%=Pic_len%(picture%):� Pic's pos & len � � Read Image Descriptor data �@i_left%=�w2:i_top%=�w2:i_width%=�w2:i_height%=�w2:flags%=�w1 �7local=(flags%�&80)>0:� Local colour map following ? �<ibit=(flags%�&40)>0:� Image stored in interlaced order ? �.l_pixbits%=flags%�7:� Local bits per pixel ��local � �@ pixbits%=l_pixbits%:� Read and use Local Colour Map palette �@ � c%=1 � 2^l_pixbits%:Palette%(c%)=(�w1<<16)+(�w1<<8)+�w1:� �/ Palette%(0)=2^l_pixbits%:� Palette entries C� pixbits%=g_pixbits%:Palette%()=g_Palette%():� Use Global data � +colours%=2^pixbits%:� Number of colours /� Determine suitable Archimedes screen mode (Smode%=�mode(r_width%,r_height%,colours%,error$):�mode%<0 � �error(-1,error$):=� 2.�new_image(mode%,i_width%,i_height%) � =� <��screen_info(signature$,i_width%,i_height%,colours%,mode%,"LZW","Number of pictures|"+�pictures%+" (displaying "+�times(picture%)+")",len%,(i_height%*i_width%*pixbits%)�8) F#� Set up data for decompression PD!fptr=�#File:!pixbits=pixbits%:!width=i_width%:!height=i_height% Z:�ibit � !laced=1 � !laced=0:� Indicate if laced or not d8� Determine best memory allocation for decompression nBtableneed%=32*1024:� Space needed for decompression code table x8buffree%=!himem-!lomem:� Free space in sprite buffer ��buffree%>=Tinysize% � �E !chunk=!lomem:!chsize=buffree%:� Use free sprite buffer for file �< !tabbf=Tiny%:� Use tiny buffer for decompression tables �� �buffree%>=tableneed% � �C !chunk=Tiny%:!chsize=Tinysize%:� Use tiny buffer for file �I !tabbf=!lomem:� Use free sprite buffer for decompression tables �B � !tabbf=Tiny%:� Use tiny buffer for decompression tables Ȃ �buffree%<(Tinysize%-tableneed%) � !chunk=Tiny%+tableneed%:!chsize=Tinysize%-tableneed% � !chunk=!lomem:!chsize=buffree% � � �� �'�display(unpack_GIF,mode%):� Unpack ��set_mode(mode%):=� � ��skip_GIF_extension ?� Skips a GIF Extension Block if present at current pointer � _% "�(�#File)=�"!" � ," �skip(1):� Skip function code 66 � _%=�w1:�skip(_%):� _%=0:� Skip data byte blocks @� �#File=(�#File)-1 J� T� ^ hT��screen_info(type$,width%,height%,colours%,mode%,compr$,info$,datalen%,piclen%) r&� Sets information about the image |�INFtype$=type$:INFwidth%=width%:INFheight%=height%:INFcolours%=colours%:INFmode%=mode%:INFcompr$=compr$:INFinfo$=info$:INFdatalen%=datalen%:INFpiclen%=piclen% �� � ���new_image_window �A� Creates new image window of appropiate size in current mode �>�ImageW � !block=win_img%:ș WDeleteW%,,block:� Delete old ��win_img%=�create_window(window1,0,0,�sprW,�sprH,0,�sprH,-1,&0F,tf%,tb%,wf%,wb%,0,0,�sprW,�sprH,&2D,3<<12,&10001,1,"Image "+File$,title_img%) �#ImageW=�:� Image window created �Zoom%=1:� Normal size ��new_window(win_img%) �� � �"ݤnew_image(mode%,xres%,yres%) �A� Creates room for picture sprite of specific resolution/mode ,� Sets pointers and data for machinecode -� Returns TRUE if all is well, else FALSE #� sptr%,bits%,words%,end%,size% &/Sprite%!0=Spritesize%:� Size of sprite area 0;Sprite%!4=1:Sprite%!8=16:� One sprite, offset to sprite :,sptr%=Sprite%+(Sprite%!8):� Sprite start D0$(sptr%+4)=Isprname$+�12,�0):� Sprite's name N:bits%=xres%*2^�mode_var(mode%,9):� Bits needed per row X/words%=(bits%+31)�32:� Words needed per row b$!rowlen=words%*4:� Set rowlength l(sptr%!16=words%-1:� Width in words-1 v,sptr%!20=yres%-1:� Height in scanlines-1 �=sptr%!24=0:sptr%!28=31-(words%*32-bits%):� Start/end bits �#sptr%!40=mode%:� Mode of sprite �>sptr%!32=44:sptr%!36=sptr%!32:� Offset to sprite data/mask �Cend%=sptr%+sptr%!32+words%*yres%*4:� Address of first free byte �C!himem=Sprite%+Spritesize%:� End of free space in sprite buffer �E!lomem=�align(end%+4*1024):� Start of free space in sprite buffer ���end%>!himem � �error(-1,"I cannot handle this image. I need "+�((words%*yres%*4+1024)�1024)+"K. I was given only "+�(Spritesize%�1024)+"K !"):=� �:A%=sptr%+sptr%!32:B%=end%-A%:� wipe_mem:� Clear sprite �.sptr%!0=end%-sptr%:� Offset to next sprite �7Sprite%!12=end%-Sprite%:� Offset to first free word �-!screen=sptr%+44:� Pointer to sprite data �DSprW%=xres%:SprH%=yres%:� Remember sprite's resolution in pixels �Isize%=((!himem-!lomem)�256)*256:� Size of free space in sprite buffer ��size%>=Tinysize% � !chunk=!lomem:!chsize=size% � !chunk=Tiny%:!chsize=Tinysize%:� Choose tiny buffer if absolutely no room left =� ��submenu(name$,create) *5� (Re)writes submenu name$, optionally creates it 4Ȏ name$ � >} � "Save image" : �create_menu(x%,y%,"^Save image",300,40,0,"""Full| Whole| Whole (scaled)| Part| Part (scaled)|",create) H_ � "GIF image" : �create_menu(x%,y%,"^GIF image",300,40,0,"$"+�(GIFImage%)+"&a0-9|",create) R� \� f p ��hour_on z$� Turns hourglass on after 1 sec �ș "Hourglass_On" �� � ���hour_off �� Turns hourglass off �ș "Hourglass_Off" �� � ���edit_part(size,part) �7� Edits image size and part (if enabled with flags) �C� Returns with (scaled) image in graphics window ready for save �A� _%,ox%,oy%,x%,y%,but%,x1%,x2%,y1%,y2%,xs%,ys%,sizex%,sizey% �� sprW%,sprH% ?�24,0;0;ScrW%;ScrH%;:� Whole screen window for image sprite :sprW%=�sprW:sprH%=�sprH:� True OS size of image sprite ,xs%=2^�mode_var(�,4):� X coordinate step $,ys%=2^�mode_var(�,5):� Y coordinate step .A!arg%=1:arg%!4=1:arg%!8=1:arg%!12=1:�:�plot_image(0,0,0,arg%) 8�size � B> ȗ ȓ 0,0,ScrW%,ScrH%:� Restrict pointer to entire screen L4 ox%=sprW%-xs%:oy%=sprH%-ys%:� 'Old' coordinates V0 ȗ � ox%,oy%:� Pointer to upper left corner `; � ȗ x%,y%,but%:� but%=0:� Wait until buttons released j6 � � ȗ x%,y%,but%:� (x%<>ox%)�(y%<>oy%)�(but%<>0) t �but%=0 � ~> �oy%>y% � � 0,y%:� 103,�max(x%,ox%),oy%:� Wipe Y-portion �> �ox%>x% � � x%,0:� 103,ox%,�max(y%,oy%):� Wipe X-portion �: sizex%=x%+xs%:sizey%=y%+ys%:� True scaled image size �; !arg%=sizex%:arg%!4=sizey%:arg%!8=sprW%:arg%!12=sprH% � �plot_image(0,0,0,arg%) �. ox%=x%:oy%=y%:� Remember old coordinates � � � � but%<>0 �2� sizex%=sprW%:sizey%=sprH%:� Full sprite size �� ��part � �; � ȗ _%,_%,but%:� but%=0:� Wait until buttons released �@ ȗ ȓ 0,0,sizex%-xs%,sizey%-ys%:� Restrict pointer to image < ȗ � 0,sizey%-ys%:� Mouse to top right of scaled sprite 5 � ȗ x1%,y2%,but%:� but%<>0:� Get top left point ; � ȗ _%,_%,but%:� but%=0:� Wait until buttons released , x2%=x1%:y1%=y2%:� Initial window corner (? ȗ ȓ x1%,0,sizex%-xs%,y2%:� Trap mouse to move down/right 23 ș WSetCol%,(4<<4)+0:� Invert colour on screen <A ox%=x2%:oy%=y1%:ȓ x1%,y1%,x2%-x1%,y2%-y1%:� First rectangle F � ȗ x2%,y1%,but% P �(x2%<>ox%)�(y1%<>oy%) � Z5 ȓ x1%,oy%,ox%-x1%,y2%-oy%:� Wipe old rectangle d0 ȓ x1%,y1%,x2%-x1%,y2%-y1%:� New rectangle n* ox%=x2%:oy%=y1%:� Old mouse position x � �* � but%<>0:� Until second button press �B ȗ ȓ 0,0,ScrW%,ScrH%:� Reset mouse rectangle to whole screen �0 ȓ x1%,y1%,x2%-x1%,y2%-y1%:� Wipe rectangle �v � 0,0:� 103,x1%-xs%,1024-ys%:� 103,1280-xs%,y2%+ys%:� 103,x2%+xs%,0:� 103,x1%-xs%,y1%-ys%:� Wipe surrounding area �E� x1%=0:y1%=0:x2%=sizex%-xs%:y2%=sizey%-ys%:� Whole sprite window �� �&�24,x1%;y1%;x2%;y2%;:� Clip window �� � ���options_menu �6� Pops up the options menu at the pointer position �� i$ �8i$=�selbits(0,1,0,�Img,0)+"Info#"+�(win_iminfo%)+"|" 6i$+=�selbits(AutoMode,1,0,0,0)+"Auto mode select|" 5i$+=�selbits(0,1,0,0,0)+"GIF$3#"+�(submenu1%)+"|" 9i$+=�selbits((Palette=1),0,0,�Img,0)+"Image palette|" "8i$+=�selbits((Palette=0),0,0,0,0)+"Desktop palette|" ,9i$+=�selbits((Palette=2),1,0,0,0)+"Standard palette|" 6)i$+=�selbits(0,0,0,�Img,0)+"Zoom in|" @*i$+=�selbits(0,0,0,�Img,0)+"Zoom out|" J5i$+=�selbits((Zoom%=1),1,0,�Img,0)+"Normal size|" T/i$+=�selbits(Palonoff,0,0,0,0)+"Include$2|" ^9i$+=�selbits(0,0,0,�Img,0)+"Save$3#"+�(submenu1%)+"|" h1�create_menu(-1,0,"Translator",342,40,0,i$,�) r� | ���iconbar_menu �#� Pops up menu for iconbar icon �Q�create_menu(-1,0,"Translator",200,40,0," Info"+"#"+�(win_info%)+"| Quit|",�) �� � ���set_mode(mode%) �2� Sets new mode (if enabled) for image display ��AutoMode � � �%�mode_change(mode%):� Select mode �� � ���mode_change(mode%) �)� Mode has changed or select new mode )� If mode%>=0, mode mode% is selected (� _%,xeig%,yeig%,xwind%,ywind%,cols% 3ș WReadP%,,palette:� Read current WIMP palette &�mode%>=0 � 0" ș WSetM%,mode%:� Select mode :� ��<>mode% � �error(-1,"I wanted to select mode "+�(mode%)+" but someone won't let me ! Maybe there's too little screenmemory ! I suggest you select another "+�(2^(2^�mode_var(mode%,9)))+" colour mode !") D� N8cols%=2^(2^�mode_var(�,9)):� Colours in current mode X,� v%=0 � 255:transtab%?v%=v%�(cols%-1):� bAxeig%=�mode_var(�,4):yeig%=�mode_var(�,5):� Read X/YEigFactor lAxwind%=�mode_var(�,11):ywind%=�mode_var(�,12):� Screen pixels vIScrW%=(1<<xeig%)*(xwind%+1):ScrH%=(1<<yeig%)*(ywind%+1):� Screen size ��Img � �set_palette(0):� �+�new_image_window:�set_palette(Palette) �� � �#��plot_image(x%,y%,act%,scale%) �/� Plots image sprite with translation table �Cș OSSpop%,52+256,Sprite%,Isprname$,x%,y%,act%,scale%,transtab% �� � ���display(code,mode%) �1� Displays picture, calling routine at 'code' �1� Acts as appropiate for SpecialDisplay modes �� _% I_%=�mode_var(mode%,9):!arcbits=2^_%:!arcpixs=8/2^_%:� Set colour info �prep_palette � code:� Unpack to sprite � * 4��set_palette(palette%) >*� Sets a palette according to palette% H� 0 - Desktop palette R� 1 - Image's own palette \� 2 - Standard palette fA�palette%=1 � �image_cols<>2^(2^�mode_var(�,9)) � palette%=0 pȎ palette% � z � 0 : ș WSetP%,,palette � � 1 : �image_palette � � 2 : �20 ��:Palette=palette% �� � �ݤimage_cols �/� Returns number of colours in image sprite �� _% �Bș OSSpop%,40+256,Sprite%,Isprname$ � ,,,,,,_%:� Sprite's mode �=2^(2^�mode_var(_%,9)) � ���prep_palette �>� Sets up best possible palette/colour map for machinecode D� Palette%(0) contains number of palette entries (entry 1-#cols) I� If -1 then straight mapping is used, else closest approximation map !� Palette entries are &RRGGBB $� c%,p%,r%,g%,b%,_% .3�Palette%(0)=-1 � � c%=0 � 255:colmap?c%=c%:�:� 8� c%=0 � Palette%(0)-1 B>p%=Palette%(c%+1):r%=(p%>>16)�&F0:g%=(p%>>8)�&F0:b%=p%�&F0 L�Palette%(0)<=16 � V# colmap?c%=c%:� Straight colmap `/� � Closest 8-bit colour value in colourmap j3 _%=(r%<<4)+g%+(b%>>4):colmap?c%=from_rgbmap?_% t� ~� �� � ���image_palette �� Writes the palette �D� Palette%(0) contains number of palette entries (entry 1-#cols) �.� If -1 or >16 then palette remains intact �!� Palette entries are &RRGGBB �� c%,p%,r%,g%,b% ��Img � �c256 � � �;�(Palette%(0)=-1)�(Palette%(0)>16) � �:� No palette set �� c%=0 � Palette%(0)-1 �>p%=Palette%(c%+1):r%=(p%>>16)�&F0:g%=(p%>>8)�&F0:b%=p%�&F0 �19,c%,16,r%,g%,b%:� � F��mode_info(mode%,� width%,� height%,� colours%,� txcol%,� txrow%) (1� Returns information about a particular mode 2� _% <=ș "OS_ReadModeVariable",mode%,9 � ,,_%:colours%=2^(2^_%) F8ș "OS_ReadModeVariable",mode%,11 � ,,_%:width%=_%+1 P9ș "OS_ReadModeVariable",mode%,12 � ,,_%:height%=_%+1 Z7ș "OS_ReadModeVariable",mode%,1 � ,,_%:txcol%=_%+1 d7ș "OS_ReadModeVariable",mode%,2 � ,,_%:txrow%=_%+1 n� x ���invalidate_screen �� Invalidates entire screen �=ș WForce%,-1,0,0,ScrW%,ScrH%:� Force redraw whole screen �� � ���new_window(handle%) �?� Closes and re-opens window to do a complete re-draw of it ��close_window(handle%) ��open_window(handle%,0) �� � �"��redraw_window(handle%,force) �(� Redraws window with handle handle% L� If force=TRUE the window's work area is updated with Wimp_UpdateWindow L� and the coordinates of the area to be updated should be at block!4..16 6� nx%,ny%,more,ww%,wh%,c%,x%,y%,o%,lo%,z%,_%,k%,_$ "� arcw%,arch%,arcc% ,(!block=handle%:� Set window's handle 6C�force � ș WUpdateW%,,block � more �ș WRedrawW%,,block � more @Fnx%=(block!4-block!20):ny%=(block!16-block!24):� Get sprite origin JEww%=block!36-block!28:wh%=block!40-block!32:� Window width/height T/!arg%=Zoom%:arg%!4=Zoom%:arg%!8=1:arg%!12=1 ^ȕ more hȎ handle% � r% � win_img% : � Plot image sprite |! �plot_image(nx%,ny%,0,arg%) �! � win_iminfo% : � Image info �) � nx%,ny%+wh%-16:� Move to top left � �line(" Filename",File$) �% �line(" Screen type",INFtype$) �1 �line(" Screen file size",�Flen%+" bytes") �l �INFcompr$<>"" � _%=100-�(100*(INFdatalen%/INFpiclen%)):�line(" Compression",INFcompr$+" ("+�_%+"%)") �[ �INFinfo$<>"" � _%=�INFinfo$,"|"):�line(" "+�INFinfo$,_%-1),�INFinfo$,�INFinfo$-_%)) �U �line(" Width x Height x Colours",�INFwidth%+"x"+�INFheight%+"x"+�INFcolours%) ։ �mode_info(INFmode%,arcw%,arch%,arcc%,_%,_%):�line(" Archimedes screen mode",�arcw%+"x"+�arch%+"x"+�arcc%+" (mode "+�INFmode%+")") �� �0ș WGetR%,,block � more:� Get next rectangle �� �� ��open_window(handle%,info) &� Opens window with handle handle% &:� If info<>0 then info is ready at info, else get info 0� b%,px%,py%,_%,xs%,ys% :�info<>0 � D' � b%=0 � 31 � 4:block!b%=info!b%:� N&� !block=handle%:ș WGetWS%,,block X� �handle%<>win_img% � �mouse(px%,py%,_%):xs%=block!12-block!4:ys%=block!16-block!8:block!4=px%-64:block!8=py%-ys%+16:block!12=block!4+xs%:block!16=block!8+ys%:� Pop up at mouse if not image window b� lș WOpenW%,,block v� � ���close_window(handle%) �'� Closes window with handle handle% �%!block=handle%:ș WCloseW%,,block �� � �ݤpoll(mask%) �@� Returns poll reason code, masking with mask%, data at poll �� reasoncode �%ș WPoll%,mask%,poll � reasoncode �=reasoncode � ���initialise � Initialises program >ș "Wimp_ReadPalette",,palette:� Read current WIMP palette 4�hour_on:�mcode:�hour_off:� Generate machinecode Cș "OS_CheckModeValid",18 � _%:MultiSync=(_%=18):� Monitor type *0applname$="Translator":� Name of application 4Fș "Wimp_Initialise",200,&4B534154,applname$ � version,TaskHandle% >9�version<200 � � 1,"I cannot work with WIMP pre-2.00" H6W%=�swi_to_nr("Wimp_Initialise"):� Base SWI number R�WCreateW%=W%+1:WCreateI%=W%+2:WDeleteW%=W%+3:WOpenW%=W%+5:WCloseW%=W%+6:WPoll%=W%+7:WRedrawW%=W%+8:WUpdateW%=W%+9:WGetR%=W%+10:WGetWS%=W%+11:WGetWI%=W%+12 \�WGetII%=W%+14:WGetPI%=W%+15:WDragB%=W%+16:WForce%=W%+17:WCreateM%=W%+20:WSetE%=W%+23:WReport%=W%+31:WSetM%=W%+35:WSetP%=W%+36:WReadP%=W%+37 f@WSetCol%=W%+38:WSendMsg%=W%+39:WCreateSM%=W%+40:WSpop%=W%+41 p}OSSpop%=�swi_to_nr("OS_SpriteOp"):OSReadVV%=�swi_to_nr("OS_ReadVduVariables"):OSReadMV%=�swi_to_nr("OS_ReadModeVariable") z=tf%=7:tb%=2:wf%=7:wb%=0:si%=1:so%=3:� Window/menu colours ��!block=-1:block!4=0:block!8=0:block!12=68:block!16=68:block!20=&27003002:$(block+24)="!translatr":ș WCreateI%,,block � Iiconbar%:� Iconbar icon �@� Create save file window (+ sprite file and filename icons) �mwin_save%=�create_window(window2,0,0,240,160,0,0,-1,&93,tf%,2,wf%,1,0,0,240,160,&2D,0,0,1,"Save file",_%) �)$filename="Screen":� Initial filename ��!block=win_save%:block!4=86:block!8=64:block!12=150:block!16=128:block!20=&27006002:$(block+24)="file_ff9":ș WCreateI%,,block � Isave% ��block!4=16:block!8=8:block!12=224:block!16=48:block!20=&0700F125:block!24=filename:block!28=-1:block!32=255:ș WCreateI%,,block � Ifilename% �/� Create program info window (+ info icons) �vwin_info%=�create_window(window3,0,0,900,224,0,0,-1,&93,tf%,2,wf%,1,0,0,900,224,&2D,0,0,1,"About this program",_%) ԝ� "Version :","4.21 (14 Nov 1989)","Author :","� 1989 Zeridajh by John Kortink","Purpose :","Translation of foreign graphics files","Name :","Translator" �*� �dT\:dataptr=window3+1024:� i%=0 � 3 �� item$,box$:y%=12+i%*52:!block=win_info%:block!4=0:block!8=y%:block!12=160:block!16=y%+48:block!20=&27000201:$(block+24)=item$:ș WCreateI%,,block �block!4=160:block!12=880:block!20=&0700012D:block!24=dataptr:block!28=-1:block!32=�(box$):$dataptr=box$:dataptr+=�(box$)+1:ș WCreateI%,,block �� � Create image info window vwin_iminfo%=�create_window(window4,0,0,1000,260,0,0,-1,&83,tf%,tb%,wf%,wb%,0,0,1000,400,&2D,0,0,1,"Image info",_%) � Init variables $kSave_kind$="":Save$="":Img=�:ImageW=�:Palonoff=�:AwaitAck=�:Zoom%=1:submenu1%=submenu:Isprname$="image" .�INFtype$="":INFwidth%=0:INFheight%=0:INFcolours%=0:INFmode%=0:INFcompr$="":INFinfo$="":INFdatalen%=0:INFpiclen%=0:Flen%=0:File$="" 8?Palette=0:FileOpen=�:SprW%=0:SprH%=0:GIFImage%=1:AutoMode=� B.�new_image(�,100,100):� Dummy mode/sprite L� V `@��create_menu(x%,y%,title$,width%,height%,gap%,icon$,create) j6� Writes menu structure, creates it if create=TRUE t=� - If x%<0 then x/y coordinates are (mouseX-64),(mouseY) ~9� - If title$ starts "^" then this becomes a SUB menu �:� - Menu icons in icon$ : ?<icon1>|?<icon2>|..... etc. �1� - ? is a character containing select bits : �� bit 0 : icon is ticked �1� bit 1 : icon is followed by a dotted line � � bit 2 : icon is writable �4� bit 3 : icon is shaded (i.e. not selectable) �5� bit 4 : writable icon has 255 characters room �� bit 5 : always 1 �A� - icons of form '?<str>&<val>' have validation string <val> �F� - icons of form '?<str>#<val>' have sub-window with handle <val> �4� also, the 'menu warning message' is selected �J� - icons of form '?<str>$<val>' get $<val> replaced with string <val> 4� $1 = 'Mode ', $2 = ' palette', $3 = ' image' 6� i$,ptr,ix%,dataptr,ilen%,p%,it$,type%,data$,menu /� valid$,validptr,sub,call%,tick%,writable% 3� butty%,shaded%,dotted%,sub%,subwarn%,db%,_db$ (� Data%():� Data%(40) 2?�x%<0 � �mouse(x%,y%,_%):x%-=64:� Get coordinates via mouse <�title$,1)="^" � F sub=�:menu=submenu P title$=�title$,�title$-1) Z� sub=�:menu=menu1 d� n$menu=title$ xmenu?12=tf%:menu?13=tb% �menu?14=wf%:menu?15=wb% �"menu!16=width%:menu!20=height% �menu!24=gap% �� Define icons �Ci$=icon$:ptr=menu+28:ix%=0:dataptr=menu+1024:validptr=menu+1920 � ȕ i$<>"" �p%=�i$,"|") ��p%=0 � � i$="" �� � Define icon �! it$=�i$,p%-1):i$=�i$,�i$-p%) �& type%=��it$,1):data$=�it$,�it$-1) �* db%=�data$,"$"):� Any coded strings ? �db%>0 � Ȏ �(�data$,db%+1,1)) � � 1 : db$="Mode " " � 2 : db$=" palette" , � 3 : db$=" image" 6 � @5 data$=�data$,db%-1)+db$+�data$,db%+2):� Replace J � T� tick%=(type%�%000001):dotted%=(type%�%000010)>>1:writeable%=(type%�%000100)>>2:shaded%=(type%�%001000)>>3:long%=(type%�%010000)>>4 ^U �writable%=0 � butty%=9:ilen%=�data$ � butty%=15:�long%=0 � ilen%=16 � ilen%=255 hq valid$="":p%=�data$,"&"):�p%>0 � valid$=�data$,p%+1):data$=�data$,p%-1):� Extract validation string (if any) r� sub%=-1:subwarn%=0:p%=�data$,"#"):�p%>0 � sub%=�(�data$,p%+1)):subwarn%=1:data$=�data$,p%-1):� Extract subwindow handle (if any) |H ptr!0=(subwarn%<<3)+(writeable%<<2)+(dotted%<<1)+tick%:� Menu flags �! ptr!4=sub%:� Sub menu/window �J ptr!8=(wb%<<28)+(wf%<<24)+(shaded%<<22)+(butty%<<12)+(1<<8)+1:� Flags �/ $dataptr=data$:ptr!12=dataptr:ptr!20=ilen% �T �valid$="" � ptr!16=-1 � $validptr=valid$:ptr!16=validptr:validptr+=�(valid$)+1 �7 Data%(ix%)=dataptr:dataptr+=ilen%+1:ptr+=24:ix%+=1 �� �� �0ptr!-24=(ptr!-24)�&80:� Indicate 'last icon' ��create � � � �sub � �3 ș WCreateSM%,,menu,x%,y%:� Create the submenu �: SubmenuData%()=Data%():� Remember icon data addresses �6 Active_submenu$=title$:� Remember submenu's title 0� ș WCreateM%,,menu,x%,y%:� Create the menu 7 MenuData%()=Data%():� Remember icon data addresses � &� 0 :,ݤselbits(tick,dotted,write,shaded,room) D2� Returns select character for icon attributes N^=�((1<<5)+((room � 1)<<4)+((shaded � 1)<<3)+((write � 1)<<2)+((dotted � 1)<<1)+(tick � 1)) X b�ݤcreate_window(window,mix%,miy%,max%,may%,sbx%,sby%,pos%,flags%,tf%,tb%,wf%,wb%,wmix%,wmiy%,wmax%,wmay%,tiflags%,waflags%,minw%,sprc%,title$,� title%) l� ptr,ico,b% v9� Creates window without icons, returns window handle �:� Returns pointer to indirected window title in title% �<window!0=mix%:window!4=miy%:window!8=max%:window!12=may% �!window!16=sbx%:window!20=sby% �window!24=pos% �window!28=flags% �window?32=tf%:window?33=tb% �window?34=wf%:window?35=wb% �window?36=so%:window?37=si% �window?38=tb% �window?39=0 �Cwindow!40=wmix%:window!44=wmiy%:window!48=wmax%:window!52=wmay% �window!56=tiflags% � 1<<8 �window!60=waflags% !window!64=sprc% !window!68=minw% !&title%=window+512:window!72=title% ! window!76=-1 !*window!80=�(title$) !4$(window!72)=title$ !>window!84=0 !H6ș WCreateW%,,window � handle%:� Create the window !R=handle% !\ !fݤalign(val%) !p0� Returns next-up word aligned value of val% !z=(val%+3)��3 !� !�ݤreadpalval(rgb%) !�3� Returns 'OS_ReadPalette' word from &RGB value !�?=((rgb%�&FF)<<24)+((rgb%�&FF00)<<8)+((rgb%�&FF0000)>>8)+&10 !� !�ݤstring(addr%) !�2� Returns CTRL-char terminated string at addr% !�� _%,_c%,_$ !�_%=-1:� _%+=1:� addr%?_%<32 !�3_c%=addr%?_%:addr%?_%=13:_$=$addr%:addr%?_%=_c% !�=_$ !� !���mouse(� x%,� y%,� but%) "+� Returns x,y and button state of mouse "ȗ x%,y%,but% "� "$ ". ݤc256 "85� Returns TRUE if current mode is 256 colour mode "B=(�log2BPP=3) "L "V ݤlog2BPP "`&� Returns Log2BPP for current mode "j=�mode_var(�,9) "t "~ݤvdu_var(varnr%) "�!� Returns VDU variable varnr% "�;!arg%=varnr%:arg%!4=-1:ș OSReadVV%,arg%,arg%+8:=arg%!8 "� "�ݤmode_var(mode%,varnr%) "�(� Returns mode mode% variable varnr% "� � result% "�2ș OSReadMV%,mode%,varnr% � ,,result%:=result% "� "�ݤOS_var(_$) "�.� Attempts to return OS-var's string value "� � _r$,_l% "�7ș "XOS_ReadVarVal",_$,�100," "),100,0,3 � ,_r$,_l% # _r$=�_r$,_l%):=_r$ # #ݤswi_to_nr(swi$) #)� Returns SWI number of SWI call swi$ #(� swinr% #2/ș "XOS_SWINumberFromString",,swi$ � swinr% #<=swinr% #F #P��error(errnr,errmsg$) #Z� Handles errors #d� but%,oldpal,opt% #n'�errnr=-1 � errnr=1:opt%=1 � opt%=3 #x!err=errnr:$(err+4)=errmsg$ #�;oldpal=Palette:�set_palette(0):� Select desktop palette #�*ș WReport%,err,opt%,applname$ � ,but% #��but%<>1 � �die #�/�set_palette(oldpal):� Reselect old palette #�� #� #���finish #�� Tidies up #�ș WSetP%,,palette% #�-ș "Wimp_CloseDown",TaskHandle%,&4B534154 #�� #� #� ݤsprW $?� Returns image sprite's width in OS pixels in current mode $=SprW%*2^�mode_var(�,4) $ $" ݤsprH $,@� Returns image sprite's height in OS pixels in current mode $6=SprH%*2^�mode_var(�,5) $@ $Jݤline(fore$,back$) $T*� Returns 'pretty' line from arguments $^(=fore$+" "+�27-�fore$,".")+" "+back$ $h $rݤmax(v1%,v2%) $|$� Returns maximum of v1% and v2% $��v1%>v2% � =v1% � =v2% $� $� ��die $�� Tidies up and exits $��finish $�ș "OS_Exit" $�� $� $�,ݤmode(width%,height%,colours%,� error$) $�E� Returns, if possible, the screen mode that is most suitable for $�K� displaying a picture of (width%)x(height%) pixels in colours% colours $�L� If there is no suitable mode, -1 and an explaining error$ are returned $�F� If 512 vertical is required on a normal monitor, 256 is selected %)� arccols%,arcwidth%,archeight%,mode% %/� Range check for colours, width and height %I�colours%>256 � error$="I cannot display more than 256 colours !":=-1 %&,� Determine closest colours/width/height %0c�colours%>16 � arccols%=256 � �colours%>4 � arccols%=16 � �colours%>2 � arccols%=4 � arccols%=2 %:N�width%>640 � arcwidth%=1056 � �width%>320 � arcwidth%=640 � arcwidth%=320 %DR�height%<=256 � archeight%=256 � �MultiSync � archeight%=256 � archeight%=512 %N%mode%=-1:� Invalid mode initially %XȎ arccols% � %b � 2 : Ȏ arcwidth% � %l; � 160 : �archeight%=256 � mode%=0 � mode%=18 %v; � 320 : �archeight%=256 � mode%=0 � mode%=18 %�; � 640 : �archeight%=256 � mode%=0 � mode%=18 %�2 � 1056 : �archeight%=256 � mode%=16 %� � %� � 4 : Ȏ arcwidth% � %�; � 160 : �archeight%=256 � mode%=1 � mode%=19 %�; � 320 : �archeight%=256 � mode%=1 � mode%=19 %�; � 640 : �archeight%=256 � mode%=8 � mode%=19 %�2 � 1056 : �archeight%=256 � mode%=16 %� � %� � 16 : Ȏ arcwidth% � %�< � 160 : �archeight%=256 � mode%=9 � mode%=20 %�< � 320 : �archeight%=256 � mode%=9 � mode%=20 %�= � 640 : �archeight%=256 � mode%=12 � mode%=20 &3 � 1056 : �archeight%=256 � mode%=16 & � & � 256 : Ȏ arcwidth% � & > � 160 : �archeight%=256 � mode%=10 � mode%=21 &*> � 320 : �archeight%=256 � mode%=13 � mode%=21 &4> � 640 : �archeight%=256 � mode%=15 � mode%=21 &>4 � 1056 : �archeight%=256 � mode%=24 &H � &R� &\� Check if mode is ok &fs�mode%<0 � error$="I cannot find a suitable mode to display "+�(width%)+"x"+�(height%)+"x"+�(colours%)+" !":=-1 &p =mode% &z &�ݤtimes(value%) &�0� Returns STR$value% with 'plural extension' &� � _d% &�3_d%=value%�10:� Last digit determines extension &�6�(((value%�100)�10)=1)�(_d%>3)�(_d%=0) � =�_%+"th" &�Ȏ _d% � &� � 1 : =�value%+"st" &� � 2 : =�value%+"nd" &� � 3 : =�value%+"rd" &�� &� &���mcode &�� Generates machinecode '� N=0 � 2 �2:P%=Code% ' [OPTN '<.screen EQUD 0:\ Picture destination start } General '$:.lomem EQUD 0:\ Start address of free space } '' '.:.himem EQUD 0:\ End address of free space } '' '8:.data EQUD 0:\ Data start } '' 'B=.compr EQUD 0:\ Compressed (<>0) or not (0) } Amiga �F 'L:.sctype EQUD 0:\ Normal (0) HAM (1) } '' 'VA.rowlen EQUD 0:\ Bytes per image row } Amiga �F/GIF '`:.arcbits EQUD 0:\ Bits per pixel (screen) } '' 'j:.arcpixs EQUD 0:\ Pixels per screen byte } '' 't:.pixbits EQUD 0:\ Bits per pixel (image) } '' '~:.width EQUD 0:\ Image width in pixels } '' '�:.height EQUD 0:\ Image height in pixels } '' '�8.laced EQUD 0:\ Laced row coding flag } GIF '�:.tabbf EQUD 0:\ Decompression table buffer } '' '� '�8.wipe_mem \ Wipes r1 bytes of memory from r0 onwards '�! STMFD r13!,{r14}:\ Save link '� MOV r2,#0:\ Clear value '�>.wipe_wrd STR r2,[r0],#4:SUBS r1,r1,#4:BGT wipe_wrd:\ Wipe '� LDMFD r13!,{pc}:\ Return '� '�3.fhandle EQUD 0:\ File handle of open data file '�'.fptr EQUD 0:\ Current � in file ( &.eof EQUD 0:\ � status of file ( ".loaded EQUD 0:\ Bytes loaded (6.chsize EQUD 0:\ Size of chunks loaded at (chunk) (-.chunk EQUD 0:\ Address of chunk buffer (( (2>.get_schunk \ Gets next sequential chunk of data from file (<3 STMFD r13!,{r0,r14}:\ Saver registers and link (F2 MOV r0,#0:BL get_chunk:\ Get sequential chunk (P LDMFD r13!,{r0,pc}:\ Return (ZG.get_chunk \ Gets chunk of data from file, with re-read if required (dI \ On entry - r0 is number of bytes to re-read from end of last chunk (n. \ On exit - EQ if no more bytes, else NE (x5 STMFD r13!,{r0-r4,r14}:\ Save registers and link (�K LDR r1,fhandle:LDR r2,chunk:LDR r3,chsize:\ File handle and chunk info (�1 LDR r4,fptr:SUB r4,r4,r0:\ Calculate start � (�4 MOV r0,#3:SWI "XOS_GBPB":\ Read chunk from file (� STR r4,fptr:\ Store new � (�? CMP r3,#0:�Q r0,#0:MVNNE r0,#0:STR r0,eof:\ Store � status (�K LDR r0,chsize:SUB r0,r0,r3:STR r0,loaded:TEQ r0,#0:\ Bytes transferred (�# LDMFD r13!,{r0-r4,pc}:\ Return (� (�%.plot_row \ Plots a row of pixels (�+ \ On entry - r0 = address of screenrow (� \ - r1 = #pixels (�0 \ On exit - r0 = address of next screenrow (�5 STMFD r13!,{r1-r9,r14}:\ Save registers and link )< LDR r3,rowlen:ADD r6,r0,r3:\ Address of next screen row )J LDR r4,arcbits:LDR r5,arcpixs:\ Bits per pixel, pixels per screenbyte )D LDR r7,a_colmap:LDR r2,a_rowdat:\ Colour map and row pixel data )">.pl_byte MOV r8,#0:MOV r9,r5:\ Init buildup of screen byte ),<.pl_build SUBS r9,r9,#1:LDRB r3,[r2,r9]:\ Get pixel data )6, LDRB r3,[r7,r3]:\ Map to logical colour )@; �R r8,r3,r8,LSL r4:BNE pl_build:\ 'Plot' pixel in byte )J* STRB r8,[r0],#1:\ Display screen byte )T; ADD r2,r2,r5:SUBS r1,r1,r5:BNE pl_byte:\ Next pixel(s) )^/ MOV r0,r6:\ Set address of next screen row )h# LDMFD r13!,{r1-r9,pc}:\ Return )r )|N;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; )� )�#.unpack_PI3 \ Atari PI3 picture )�! STMFD r13!,{r14}:\ Save link )�A LDR r1,screen:MOV r3,#&7D00:\ Destination, total data length )�6 LDR r4,a_flipmap:\ Inverted and reversed bits map )�J.d1_chunk BL get_schunk:BEQ d1_exit:LDR r2,chunk:LDR r5,loaded:\ Chunk )�J.d1_copy LDRB r0,[r2],#1:LDRB r0,[r4,r0]:\ Get 8 bits data and convert )�H STRB r0,[r1],#1:SUBS r3,r3,#1:BLE d1_exit:\ Check if all bytes done )�= SUBS r5,r5,#1:BGT d1_copy:B d1_chunk:\ Next data byte(s) )�%.d1_exit LDMFD r13!,{pc}:\ Return )� )�N;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; )� *#.unpack_PI1 \ Atari PI1 picture *! STMFD r13!,{r14}:\ Save link *A LDR r1,screen:MOV r3,#&7D00:\ Destination, total data length *&7 LDR r12,a_flipmap:\ Inverted and reversed bits map *0K.d2_chunk BL get_schunk:BEQ d2_exit:LDR r2,chunk:LDR r10,loaded:\ Chunk *:2 MOV r7,r10:\ Prepare flip of all loaded bytes *DL.d2_flip SUBS r7,r7,#1:LDRB r6,[r2,r7]:LDRB r6,[r12,r6]:\ Flip data byte *N8 STRB r6,[r2,r7]:BGT d2_flip:\ Flip all loaded bytes *XH.d2_copy LDR r7,[r2],#2:LDR r6,[r2],#2:LDR r5,[r2],#2:LDR r4,[r2],#2 *b* MOV r11,#8:\ 8x2=16 pixels in 32 bits *lG.d2_pixels MOV r8,#0:MOVS r4,r4,LSR#1:ADC r8,r8,r8:MOVS r5,r5,LSR#1 *vM ADC r8,r8,r8:MOVS r6,r6,LSR#1:ADC r8,r8,r8:MOVS r7,r7,LSR#1:ADC r8,r8,r8 *�J MOV r9,#0:MOVS r4,r4,LSR#1:ADC r9,r9,r9:MOVS r5,r5,LSR#1:ADC r9,r9,r9 *�@ MOVS r6,r6,LSR#1:ADC r9,r9,r9:MOVS r7,r7,LSR#1:ADC r9,r9,r9 *�, �R r8,r8,r9,LSL#4:\ Make pair of pixels *�K STRB r8,[r1],#1:SUBS r11,r11,#1:BNE d2_pixels:\ Display, next 2 pixels *�8 SUBS r3,r3,#8:BLE d2_exit:\ Check if all bytes done *�? SUBS r10,r10,#8:BGT d2_copy:B d2_chunk:\ Next data byte(s) *�%.d2_exit LDMFD r13!,{pc}:\ Return *� *�N;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; *� *�,.unpack_MAC \ MacIntosh MacPaint picture *�! STMFD r13!,{r14}:\ Save link *�K LDR r1,screen:MOV r5,#&CA00:ADD r5,r5,#&80:\ Destination, total length +6 LDR r3,a_flipmap:\ Inverted and reversed bits map +# BL d4_chunk:\ Load first chunk +3.d4_block LDRB r0,[r2],#1:\ Get block code byte + 9 SUBS r10,r10,#1:BLLE d4_chunk:\ Next chunk if needed +*7 TST r0,#128:BNE d4_rep:MOV r4,r0:\ Repeated data ? +4/.d4_scopy LDRB r0,[r2],#1:\ Get single byte +>9 SUBS r10,r10,#1:BLLE d4_chunk:\ Next chunk if needed +H2 LDRB r0,[r3,r0]:BL d4_buf:\ Buffer screenbyte +RD SUBS r4,r4,#1:BPL d4_scopy:B d4_block:\ Finish series and go on +\;.d4_rep RSB r4,r0,#&100:\ Number of repeated data bytes +f) LDRB r0,[r2],#1:\ Get byte to repeat +p9 SUBS r10,r10,#1:BLLE d4_chunk:\ Next chunk if needed +z LDRB r0,[r3,r0]:\ Flip +�+.d4_rcopy BL d4_buf:\ Buffer screenbyte +�D SUBS r4,r4,#1:BPL d4_rcopy:B d4_block:\ Finish repeat and go on +�H.d4_buf STRB r0,[r1],#1:SUBS r5,r5,#1:MOVNE pc,r14:\ Next screenbyte +�%.d4_exit LDMFD r13!,{pc}:\ Return +�).d4_chunk MOV r12,r14:\ Remember link +�B BL get_schunk:BEQ d4_exit:LDR r2,chunk:LDR r10,loaded:\ Chunk +� MOV pc,r12:\ Return +� +�N;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +� +�".unpack_IFF \ Amiga �F picture +�! STMFD r13!,{r14}:\ Save link +�8 LDR r0,height:STR r0,d3_trow:\ Number of pixel rows ,D LDR r11,width:MOV r11,r11,LSR#3:\ Number of bytes per pixel row ,! LDR r10,screen:\ Destination ,# BL d3_chunk:\ Load first chunk ,$I LDR r0,compr:TEQ r0,#0:MOVNE r8,#1<<23:�Q r8,#0:\ Init decompression ,.E.d3_row LDR r6,pixbits:MOV r7,#1:\ Number of bit planes, bit mask ,8? MOV r0,r11,LSL#3:LDR r1,a_rowdat:MOV r2,#0:\ Prepare clear ,BM.d3_clear STRB r2,[r1],#1:SUBS r0,r0,#1:BNE d3_clear:\ Clear pixel buffer ,LK.d3_plane MOV r5,r11:LDR r4,a_rowdat:\ Fill in colour bits for bitplane ,V0.d3_byte BL d3_databyte:\ Get next data byte ,`) MOV r0,r0,LSL#24:MOV r3,#8:\ Prepare ,j1.d3_pixbit MOVS r0,r0,LSL#1:\ Pixel-bit set ? ,tI LDRCSB r2,[r4]:�RCS r2,r2,r7:STRCSB r2,[r4],#1:\ If so, shift bit in ,~5 ADDCC r4,r4,#1:\ If not so, next pixel data byte ,�7 SUBS r3,r3,#1:BNE d3_pixbit:\ Next of eight pixels ,�/ SUBS r5,r5,#1:BNE d3_byte:\ Next data byte ,�? MOV r7,r7,LSL#1:SUBS r6,r6,#1:BNE d3_plane:\ Next bitplane ,�7 LDR r1,sctype:TST r1,#3:BNE d3_ham:\ HAM pixel row ,�; MOV r0,r10:MOV r1,r11,LSL#3:\ Set up data for row-plot ,�( BL plot_row:\ Plot normal pixel row ,�A MOV r10,r0::B d3_nextrow:\ Set next row address, do next row ,�H.d3_ham MOV r2,#0:ADR r7,hamcols:\ Current RGB and 16-col RGB values ,�M MOV r5,r11,LSL#3:LDR r3,a_rowdat:\ Pixels and start of pixel row data bf ,�. MOV r6,r10:\ Remember current screen addr ,�..d3_doham LDRB r0,[r3],#1:\ Get pixel data ,�J MOV r1,r0,LSR#4:� r0,r0,#15:TEQ r1,#0:\ Split and test upper two bits - 8 LDREQ r2,[r7,r0,LSL#2]:BEQ d3_hamon:\ New RGB value - D CMP r1,#2:MOVLT r1,#0:�Q r1,#8:MOVGT r1,#4:\ R, G or B change ? -H MOV r4,#15:BIC r2,r2,r4,LSL r1:�R r2,r2,r0,LSL r1:\ New R or G or B -K.d3_hamon LDR r0,a_rgb22map:LDR r0,[r0,r2,LSL#1]:\ Get left/right pixel -() LDR r1,d3_trow:\ Retrieve row number -2H � r4,r10,r1,LSL#1:TST r4,#%10:\ Every other pair, switched per line -<D �Q r0,r0,LSL#8:�REQ r0,r0,r0,LSR#16:\ Swap pixels in pixel pair -FG STRB r0,[r10],#1:MOV r0,r0,LSR#8:STRB r0,[r10],#1:\ Display pixels -P/ SUBS r5,r5,#1:BNE d3_doham:\ Next pixel(s) -Z= LDR r0,rowlen:ADD r10,r6,r0:\ Address of next screen row -dM.d3_nextrow LDR r0,d3_trow:SUBS r0,r0,#1:STR r0,d3_trow:BGT d3_row:\ Next -n%.d3_exit LDMFD r13!,{pc}:\ Return -x\ -�*.d3_trow EQUD 0:\ Temp for row counter -�(.d3_chunk MOV r1,r14:\ Remember link -�B BL get_schunk:BEQ d3_exit:LDR r9,chunk:LDR r12,loaded:\ Chunk -� MOV pc,r1:\ Return -�K.d3_databyte \ Returns next data byte in r0 (decompresses if necessary) -�! STMFD r13!,{r14}:\ Save link -�0 TST r8,#1<<23:BEQ d3_new:\ Not compressed ? -�C TST r8,#&FF:BEQ d3_newcode:\ No more in repeat or series, next -�# SUB r8,r8,#1:\ Decrement count -�H TST r8,#1<<22:�Q r0,r8,LSR#24:LDMEQFD r13!,{pc}^:\ Next byte repeat -�L.d3_new LDRB r0,[r9],#1:SUBS r12,r12,#1:BLLE d3_chunk:\ Next byte is new -� LDMFD r13!,{pc}^:\ Return -�I.d3_newcode LDRB r0,[r9],#1:SUBS r12,r12,#1:BLLE d3_chunk:\ Next code .F CMP r0,#128:BEQ d3_newcode:BGT d3_newrep:\ Repeat, series or none .< �R r8,r8,r0:�R r8,r8,#1<<22:\ Set count and series type .F LDRB r0,[r9],#1:SUBS r12,r12,#1:BLLE d3_chunk:\ First series byte ." LDMFD r13!,{pc}^:\ Return .,0.d3_newrep RSB r0,r0,#&100:\ Determine count .6= �R r8,r8,r0:BIC r8,r8,#1<<22:\ Set count and repeat type .@A LDRB r0,[r9],#1:SUBS r12,r12,#1:BLLE d3_chunk:\ First repeat .J3 BIC r8,r8,#255<<24:�R r8,r8,r0,LSL#24:\ Unpack .T LDMFD r13!,{pc}^:\ Return .^?.hamcols EQUS �64,�0):ALIGN:\ HAM mode 16-colour RGB values .h .rN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .| .�.unpack_GIF \ GIF picture .�! STMFD r13!,{r14}:\ Save link .�. BL decompress_GIF:\ Decompress image data .� BL build_GIF:\ Build sprite .� LDMFD r13!,{pc}:\ Return .�\ .�:.build_GIF \ Builds picture from decompressed GIF data .�! STMFD r13!,{r14}:\ Save link .�, LDR r3,screen:\ Decompressed data start .�? LDR r12,height:LDR r11,pixbits:\ Height and bits per pixel .�I LDR r2,width:MUL r2,r12,r2:MUL r2,r11,r2:\ Bits of decompressed data .�? ADD r2,r2,#31:MOV r2,r2,LSR#5:\ Words of decompressed data .�J LDR r1,himem:SUB r6,r1,r2,LSL#2:\ Temp buffer at end of sprite buffer /K.d5_tosc SUBS r2,r2,#1:LDR r0,[r3,r2,LSL#2]:STR r0,[r6,r2,LSL#2]:\ Move / BGT d5_tosc:\ Next word /F MVN r8,#0:MOV r9,r8,LSL r11:� r8,r9,r8:\ Calculate pixel bit mask /&C MOV r9,#0:MOV r10,#0:\ Bits left in pixel buffer, pixel buffer /0D LDR r4,laced:TEQ r4,#0:MOVNE r4,#1:�Q r4,#0:\ First pass number /:I LDR r12,height:LDR r0,screen:\ Current row number, destination start /DG.d5_row LDR r3,width:LDR r7,a_rowdat:\ Pixels per row, pixel buffer /NG.d5_pixs CMP r11,r9:BLE d5_pixl:\ Enough bits loaded for next pixel /XB LDRB r1,[r6],#1:�R r10,r10,r1,LSL r9:\ Shift in next few bits /b- ADD r9,r9,#8:\ Eight more bits in buffer /l<.d5_pixl � r1,r10,r8:STRB r1,[r7],#1:\ Store pixel value /v< MOV r10,r10,LSR r11:SUB r9,r9,r11:\ Shift out pixelbits /�+ SUBS r3,r3,#1:BNE d5_pixs:\ Next pixel /�. LDR r1,width:BL plot_row:\ Plot pixel row /�* SUBS r12,r12,#1:BGT d5_row:\ Next row /�? LDR r0,laced:TEQ r0,#0:BEQ d5_exit:\ Not interlaced, ready /�< \ Image rows are 4-pass interlaced, do a 'sort' of them /�J MOV r4,#0:LDR r12,rowlen:LDR r11,screen:\ Prepare init of index table /�J LDR r2,a_table:LDR r3,height:\ Start of indices table, number of rows /�* MLA r3,r12,r3,r11:\ End of row buffer /�K.d5_pass ADR r0,gif_first:LDRB r0,[r0,r4]:MLA r0,r12,r0,r11:\ Start row /�H ADR r1,gif_step:LDRB r1,[r1,r4]:MUL r1,r12,r1:\ Offset to next rows /�L.d5_table STR r0,[r2],#4:ADD r0,r0,r1:CMP r0,r3:BLT d5_table:\ End row ? /�3 ADD r4,r4,#1:CMP r4,#4:BLT d5_pass:\ Next pass /�J \ Initial index table built up, now sort the rows in sequential order 00 LDR r10,a_table:LDR r9,height:\ Global data 0; MOV r4,#0:LDR r8,screen:\ Start row number and address 0B.d5_rownr ADD r1,r10,r4,LSL#2:\ Prepare search for current row 0 D.d5_rowsc LDR r0,[r1],#4:CMP r0,r8:BNE d5_rowsc:\ Search for row 0*K SUB r1,r1,#4:SUB r0,r1,r10:MOV r0,r0,LSR#2:MLA r7,r0,r12,r11:\ Rowaddr 04I LDR r0,[r10,r4,LSL#2]:STR r0,[r1]:\ Write new address after exchange 0> MOV r2,r12:\ Bytes on row 0HD.d5_exch SUBS r2,r2,#4:LDR r0,[r7,r2]:LDR r1,[r8,r2]:\ Get words 0R> STR r0,[r8,r2]:STR r1,[r7,r2]:BGT d5_exch:\ Exchange rows 0\0 ADD r8,r8,r12:\ Next sequential row address 0f> ADD r4,r4,#1:CMP r4,r9:BLT d5_rownr:\ Next sequential row 0p%.d5_exit LDMFD r13!,{pc}:\ Return 0z:.gif_step EQUB 8:EQUB 8:EQUB 4:EQUB 2:\ Steps per pass 0�G.gif_first EQUB 0:EQUB 4:EQUB 2:EQUB 1:\ First row numbers per pass 0� ALIGN 0�\ 0�D.decompress_GIF \ LZW decompression of GIF raster data to buffer 0� \ Global registers 0�= \ r12 = input data pointer (points to current input bit) 0�, \ r11 = current decompression code size 0�I \ r10 = table base address (2 words * 2^12 = 32K is needed as table) 0� \ r9 = current code 0� \ r8 = old code 0�% \ r7 = current output bitaddress 0�! \ r6 = first free table code 0�0 \ r5 = bitaddress of old code's translation 1! STMFD r13!,{r14}:\ Save link 1< MOV r0,#0:STR r0,lzw_reload:\ No reload for first chunk 17 MOV r12,#0:BL lzw_chunk:\ Load first chunk of data 1$) LDRB r0,lzw_root:\ Initial code size 1.G MOV r1,#1:MOV r1,r1,LSL r0:STR r1,lzw_rlim:\ 2^rootsize limit code 18; LDR r1,arcbits:STR r1,lzw_bits:\ Bits per pixel output 1B< LDR r10,tabbf:\ Decompression string table buffer start 1LH LDR r0,screen:MOV r7,r0,LSL#3:\ Destination for decompressed stream 1V- BL lzw_reset:\ Reset code size and table 1`3.lzw_cget \ Get next code from codestream in r9 1j0 � r3,r12,#7:\ Bit address within byte (0-7) 1t$ MOV r2,r12,LSR#3:\ Byte address 1~+ LDRB r0,[r2],#1:\ Get first eight bits 1�: LDRB r1,[r2],#1:�R r0,r0,r1,LSL#8:\ Add another eight 1�; LDRB r1,[r2],#1:�R r0,r0,r1,LSL#16:\ And another eight 1�M MOV r0,r0,LSR r3:MVN r1,#0:BIC r9,r0,r1,LSL r11:\ Mask out required bits 1�' ADD r12,r12,r11:\ Next bit address 1�- LDR r1,lzw_rlim:\ 2^root size limit code 1�I SUBS r1,r9,r1:BEQ lzw_CC:CMP r1,#1:BEQ lzw_EOI:\ Check special codes 1�8 CMP r9,r6:BGE lzw_nottable:\ Check if code in table 1�\ 1�$.lzw_intable \ Code was in table 1�> LDR r0,lzw_rlim:CMP r9,r0:BGE lzw_cnor:\ Is it non-root ? 1�H STR r9,lzw_dum:ADR r0,lzw_dum:MOV r0,r0,LSL#3:\ Store code at dummy 1�4 LDR r2,lzw_bits:B lzw_inco:\ Output root string 2 K.lzw_cnor ADD r1,r10,r9,LSL#3:LDR r0,[r1],#4:LDR r2,[r1]:\ Code adr/len 2 ?.lzw_inco MOV r1,r7:BL lzw_bitcopy:\ Output string for code 2, CMP r8,#0:BLT lzw_in2:\ No old code yet 2J LDR r0,lzw_oldlen:LDR r2,lzw_bits:ADD r0,r0,r2:\ Translation's length 2(L ADD r2,r10,r6,LSL#3:ADD r6,r6,#1:STR r5,[r2],#4:STR r0,[r2]:\ New entry 22K.lzw_in2 SUB r0,r1,r7:MOV r5,r7:STR r0,lzw_oldlen:\ New 'old code' info 2<& MOV r7,r1:\ New output bitaddress 2F\ 2P,.lzw_nextget MOV r8,r9:\ Old code = code 2ZA LDR r0,lzw_limit:CMP r6,r0:BLT lzw_ncget:\ Code size limit ? 2dI ADD r11,r11,#1:CMP r11,#12:MOVGT r11,#12:\ Increase code size (<=12) 2nI MOV r0,#1:MOV r0,r0,LSL r11:STR r0,lzw_limit:\ 2^codesize limit code 2xL.lzw_ncget LDR r1,lzw_endbit:ADD r0,r12,r11:\ Bitaddress after next code 2�C CMP r0,r1,LSL#3:BLGT lzw_chunk:\ New chunk if out of inputbits 2� B lzw_cget:\ Next code 2�\ 2�).lzw_nottable \ Code was not in table 2�H MOV r1,r7:MOV r0,r5:LDR r2,lzw_oldlen:BL lzw_bitcopy:\ Output 'old' 2�J LDR r2,lzw_bits:MOV r0,r5:BL lzw_bitcopy:\ Output first char of 'old' 2�C SUB r0,r1,r7:MOV r5,r7:STR r0,lzw_oldlen:\ New 'old code' info 2�L ADD r2,r10,r6,LSL#3:ADD r6,r6,#1:STR r5,[r2],#4:STR r0,[r2]:\ New entry 2�& MOV r7,r1:\ New output bitaddress 2�$ B lzw_nextget:\ Next input code 2�\ 2�>.lzw_CC BL lzw_reset:B lzw_cget:\ <CC>, reset and continue 2�*.lzw_EOI \ <EOI>, end of decompression 3&.lzw_exit LDMFD r13!,{pc}:\ Return 3\ 3J.lzw_chunk \ Reads chunk with r0 bytes re-read (if r12=0, first chunk) 3" MOV r1,r14:\ Remember link 3,G LDR r0,lzw_reload:BL get_chunk:BEQ lzw_exit:\ Chunk (with re-read) 36= MOV r14,r1:STMFD r13!,{r4,r14}:\ Save registers and link 3@K LDR r14,chunk:MOV r0,r14,LSL#3:\ Start of buffered data (byte/bitaddr) 3J2 CMP r12,#0:BNE lzw_chnof:\ First chunk load ? 3TG LDRB r1,[r14],#1:STR r1,lzw_root:\ Initial code size (first chunk) 3^) MOV r4,r0:\ First bit is exact start 3h> MOV r0,#0:B lzw_chfco:\ No offset for cleanup destination 3rJ.lzw_chnof LDR r3,lzw_endbit:RSB r1,r12,r3,LSL#3:\ Bits left in buffer 3|K RSB r1,r1,#16:ADD r4,r0,r1:\ First bit (reloaded last count + 2 bytes) 3�A ADD r14,r14,#2:\ Account for 2 extra bytes before count byte 3�* MOV r0,#2:\ 2-byte offset for cleanup 3�N.lzw_chfco LDR r1,chunk:ADD r0,r1,r0:MOV r12,r14:\ Prepare count byte kill 3�= LDR r3,loaded:ADD r3,r1,r3:\ End address of loaded chunk 3�4.lzw_chkil LDRB r1,[r12],#1:\ Current count byte 3�; CMP r1,#0:BEQ lzw_chout:\ Is this the end count byte ? 3�/ ADD r14,r12,r1:\ Next count byte's address 3�A CMP r14,r3:BGE lzw_chout:\ Is it buffered ? If so, copy data 3�M.lzw_chcop CMP r12,r14:LDRNEB r1,[r12],#1:STRNEB r1,[r0],#1:BNE lzw_chcop 3�H B lzw_chkil:\ Continue until either end count or non-buffered count 3�M.lzw_chout SUB r1,r3,r12:ADD r1,r1,#3:STR r1,lzw_reload:\ Reload required 3�2 MOV r12,r4:\ Bit address of start of new data 3�6 STR r0,lzw_endbit:\ Exact end of 'clean' databits 4 LDMFD r13!,{r4,pc}:\ Return 4\ 4#.lzw_dum EQUD 0:\ Dummy word 4&;.lzw_oldlen EQUD 0:\ Length of translation for old code 40?.lzw_reload EQUD 0:\ Bytes to reload for clean continuation 4:6.lzw_endbit EQUD 0:\ Address of end of loaded data 4D'.lzw_root EQUD 0:\ Root code size 4N1.lzw_bits EQUD 0:\ Bits per character/pixel 4X/.lzw_rlim EQUD 0:\ 2^root size limit code 4b6.lzw_limit EQUD 0:\ 2^current codesize limit code 4l\ 4v+.lzw_reset \ Resets codesize and tables 4�6 LDR r0,lzw_root:ADD r11,r0,#1:\ Initial code size 4�I MOV r0,#1:MOV r0,r0,LSL r11:STR r0,lzw_limit:\ 2^codesize limit code 4�D LDR r0,lzw_rlim:ADD r6,r0,#2:\ First free code = limit code + 2 4� MVN r8,#0:\ No old code yet 4� MOVS pc,r14:\ Return 4�\ 4�G.lzw_bitcopy \ Copies r2 bits from bit address r0 to bit address r1 4�= \ On exit - r1 is bit address of first bit after bitcopy 4�5 STMFD r13!,{r3-r6,r14}:\ Save registers and link 4�$ MOV r3,r0,LSR#3:MOV r4,r1,LSR#3 4� � r0,r0,#7:� r5,r1,#7 4�- ADD r1,r1,r2:\ New bit address of output 4�L LDRB r14,[r4]:MVN r6,#0:BIC r6,r14,r6,LSL r5:\ First bits of output #r5 5D LDRB r14,[r3],#1:MOV r14,r14,LSR r0:\ First bits of input 8-#r0 5( �R r6,r6,r14,LSL r5:\ Glue together 5C ADD r2,r2,r5:\ Total number of bits to copy including old bits 5 D RSB r0,r0,#8:ADD r5,r5,r0:\ Shift factor to add next eight bits 5*C.lzw_bito LDRB r14,[r3],#1:�R r6,r6,r14,LSL r5:\ Construct byte 54J STRB r6,[r4],#1:MOV r6,r6,LSR#8:\ Write output and adjust accumumator 5>7 SUBS r2,r2,#8:BGT lzw_bito:\ Until all bits output 5H$ LDMFD r13!,{r3-r6,pc}^:\ Return 5R 5\N;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 5f 5p#\ Routines to make several maps 5z 5�).a_colmap EQUD 0:\ Map addresses 5�.a_flipmap EQUD 0 5�.a_rgb22map EQUD 0 5�.a_to_rgbmap EQUD 0 5�.a_from_rgbmap EQUD 0 5�.a_rowdat EQUD 0 5�.a_table EQUD 0 5� 5�+.make_maps \ Sets up maps and addresses 5�! STMFD r13!,{r14}:\ Save link 5�! BL r_colmap:STR r12,a_colmap 5�# BL r_flipmap:STR r12,a_flipmap 5�% BL r_rgb22map:STR r12,a_rgb22map 6' BL r_to_rgbmap:STR r12,a_to_rgbmap 6+ BL r_from_rgbmap:STR r12,a_from_rgbmap 6! BL r_rowdat:STR r12,a_rowdat 6$ BL r_table:STR r12,a_table 6. BL make_flipmap 68 BL make_rgbmaps 6B LDMFD r13!,{pc}^:\ Return 6L 6V;.make_rgbmaps \ Sets up 256 colour <---> 4096 &RGB maps 6`" STMFD r13!,{r14}^:\ Save link 6j BL make_to_rgbmap 6t BL make_from_rgbmap 6~ BL make_rgb22map 6� LDMFD r13!,{pc}^:\ Return 6� 6�E.make_flipmap \ Makes inverted and reversed bit map (PI1/PI3/MAC) 6�5 STMFD r13!,{r0-r4,r14}:\ Save registers and link 6�C MOV r0,#&FF:LDR r4,a_flipmap:\ Current byte value and map base 6�*.mf_byte MOV r3,r0:MOV r2,#8:MOV r1,#0 6�N.mf_flip MOVS r3,r3,LSR#1:ADC r1,r1,r1:SUBS r2,r2,#1:BNE mf_flip:\ Reverse 6�L � r1,r1,#&FF:STRB r1,[r4,r0]:SUBS r0,r0,#1:BPL mf_byte:\ Store and next 6�$ LDMFD r13!,{r0-r4,pc}^:\ Return 6� 6�M.make_to_rgbmap \ Makes 256x4 entry map from standard 256 logical colours 6�M \ to their &RGB (12-bits) value (0-4095) in the standard palette mapping 7 ! STMFD r13!,{r14}:\ Save link 7 4 LDR r9,a_to_rgbmap:\ Address of 256-to-4096 map 7L MOV r0,#0:MOV r1,#16:\ Current logical colour value, read normal colour 7<.mt_readpal \ Determine R,G,B from logical colour number 7(5 MOV r2,#0:MOV r3,#0:MOV r4,#0:\ R,G,B components 72. TST r0,#1<<7:�RNE r4,r4,#8:\ Top bit BLUE 7</ TST r0,#1<<6:�RNE r3,r3,#8:\ Top bit GREEN 7F2 TST r0,#1<<5:�RNE r3,r3,#4:\ Second bit GREEN 7P- TST r0,#1<<4:�RNE r2,r2,#8:\ Top bit RED 7Z1 TST r0,#1<<3:�RNE r4,r4,#4:\ Second bit BLUE 7d0 TST r0,#1<<2:�RNE r2,r2,#4:\ Second bit RED 7nD TST r0,#1<<1:�RNE r2,r2,#2:�RNE r3,r3,#2:�RNE r4,r4,#2:\ Top Ȝ 7xG TST r0,#1<<0:�RNE r2,r2,#1:�RNE r3,r3,#1:�RNE r4,r4,#1:\ Second Ȝ 7�5 �R r7,r4,r3,LSL#4:�R r7,r7,r2,LSL#8:\ Build &RGB 7�+ STR r7,[r9,r0,LSL#2]:\ Write map entry 7�C ADD r0,r0,#1:CMP r0,#&100:BLT mt_readpal:\ Next logical colour 7� LDMFD r13!,{pc}^:\ Return 7� 7�M.make_from_rgbmap \ Makes 4096x1 entry map from 4096 &RGB (12-bits) value 7�K \ to closest 256-colour mode logical colour representing the RGB value 7�! STMFD r13!,{r14}:\ Save link 7�7 LDR r12,a_from_rgbmap:\ Address of 4096-to-256 map 7�5 LDR r11,a_to_rgbmap:\ Address of 256-to-4096 map 7�# MOV r0,#0:\ Current &RGB value 7�8.mf_closest \ Calculate closest colour value for RGB 7�C MOV r10,r0,LSR#1:� r10,r10,#&60:TST r0,#1<<3:�RNE r10,r10,#&80 8E TST r0,#1<<11:�RNE r10,r10,#&10:\ Hardware determined top 4 bits 8G MOV r1,r0,LSR#8:MOV r2,r0,LSR#4:� r2,r2,#15:� r3,r0,#15\ Get R,G,B 8G MOV r7,#0:MOV r8,#0:MOV r9,#1<<30:\ Counter, 'closest' index/value 8":.mf_distance \ Calculate distance of target to palette 8,L �R r6,r10,r7:LDR r6,[r11,r6,LSL#2]:\ &RGB value of current colour value 86H MOV r4,r6,LSR#8:MOV r5,r6,LSR#4:� r5,r5,#15:� r6,r6,#15:\ Get R,G,B 8@> SUBS r4,r4,r1:RSBCC r4,r4,#0:SUBS r5,r5,r2:RSBCC r5,r5,#0 8J< SUBS r6,r6,r3:RSBCC r6,r6,#0:\ Difference (R-R,G-G,B-B) 8T= MOV r4,r4,LSL#1:ADD r5,r5,r5,LSL#1:\ R*2,G*3,B*1 weights 8^M MUL r14,r4,r4:MLA r14,r5,r5,r14:MLA r14,r6,r6,r14:\ Square and add diffs 8hA CMP r14,r9:MOVLT r9,r14:MOVLT r8,r7:\ If less, then register 8rA ADD r7,r7,#1:CMP r7,#16:BLT mf_distance:\ Next palette entry 8|D �R r1,r10,r8:STRB r1,[r12],#1:\ Calculate pixel value and store 8�? ADD r0,r0,#1:CMP r0,#&1000:BLT mf_closest:\ Next RGB value 8� LDMFD r13!,{pc}^:\ Return 8� 8�M.make_rgb22map \ Makes 4096 colour RGB value <---> 2-pixel byte value map 8�H \ Per 2 bytes, first is closest approximation, second 'rest' approx 8�! STMFD r13!,{r14}:\ Save link 8�D LDR r10,a_to_rgbmap:LDR r11,a_from_rgbmap:\ 256 <---> 4096 maps 8�I LDR r7,a_rgb22map:MOV r0,#0:\ Base of map and first 12-bit RGB value 8�C.mr_rgb22 \ Calculate left and right pixel value approximations 8�7 LDRB r8,[r11,r0]:\ First pixel's RGB approximation 8�8 LDR r9,[r10,r8,LSL#2]:\ RGB of first pixel's colour 8�I \ Unpack RGB from exact RGB, unpack approximated RGB of first colour 8�< MOV r1,r0,LSR#8:MOV r2,r0,LSR#4:� r2,r2,#15:� r3,r0,#15 9< MOV r4,r9,LSR#8:MOV r5,r9,LSR#4:� r5,r5,#15:� r6,r9,#15 9I \ Calculate (2*targetRGB)-(RGB of first pixel) = RGB of second pixel 9< RSBS r1,r4,r1,LSL#1:MOVCC r1,#0:CMP r1,#15:MOVGT r1,#15 9&< RSBS r2,r5,r2,LSL#1:MOVCC r2,#0:CMP r2,#15:MOVGT r2,#15 90< RSBS r3,r6,r3,LSL#1:MOVCC r3,#0:CMP r3,#15:MOVGT r3,#15 9:? MOV r1,r1,LSL#8:�R r1,r1,r2,LSL#4:�R r1,r1,r3:\ &RGB value 9D8 LDRB r9,[r11,r1]:\ Second pixel's RGB approximation 9N. STRB r8,[r7],#1:\ Store first pixel value 9X/ STRB r9,[r7],#1:\ Store second pixel value 9b= ADD r0,r0,#1:CMP r0,#&1000:BLT mr_rgb22:\ Next RGB value 9l LDMFD r13!,{pc}^:\ Return 9v 9�\ Map space 9� 9�@.r_rgb22map ADR r12,rgb22map:MOV pc,r14:\ Return map address 9�L.rgb22map ]:P%+=4096*2:[OPTN \ 4096 &RGB to 2 pixel value approximations 9�B.r_to_rgbmap ADR r12,to_rgbmap:MOV pc,r14:\ Return map address 9�F.to_rgbmap ]:P%+=256*4:[OPTN \ 256 colour value to 4096 &RGB value 9�F.r_from_rgbmap ADR r12,from_rgbmap:MOV pc,r14:\ Return map address 9�I.from_rgbmap ]:P%+=4096*1:[OPTN \ 4096 &RGB value to 256 colour value 9�>.r_flipmap ADR r12,flipmap:MOV pc,r14:\ Return map address 9�=.flipmap ]:P%+=256:[OPTN \ Inverted and reversed bits map 9�<.r_colmap ADR r12,colmap:MOV pc,r14:\ Return map address 9�>.colmap ]:P%+=256:[OPTN \ Logical to logical map normal �F 9�:.r_table ADR r12,table:MOV pc,r14:\ Return map address :L.table ]:P%+=4096:[OPTN \ Sort indices buffer for GIF interlaced buildup :?.r_rowdat ADR r12,rowdat:MOV pc,r14:\ Return buffer address ::.rowdat ]:P%+=2048:[OPTN \ Buffer for row pixel values : :*]� :4 � make_maps:� Calculate maps :>� �
00000000 0d 00 0a 10 f4 20 3e 21 52 75 6e 49 6d 61 67 65 |..... >!RunImage| 00000010 0d 00 14 4b f4 ab ab ab ab ab ab ab ab ab ab ab |...K............| 00000020 ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab |................| * 00000050 ab ab ab ab ab ab ab ab ab ab ab 0d 00 1e 4b f4 |..............K.| 00000060 20 43 6f 6e 76 65 72 74 73 20 66 6f 72 65 69 67 | Converts foreig| 00000070 6e 20 67 72 61 70 68 69 63 73 20 66 69 6c 65 73 |n graphics files| 00000080 20 74 6f 20 41 72 63 68 69 6d 65 64 65 73 20 20 | to Archimedes | 00000090 20 20 20 20 20 28 46 75 6c 6c 20 52 49 53 43 4f | (Full RISCO| 000000a0 53 20 61 70 70 29 0d 00 28 2d f4 20 56 65 72 73 |S app)..(-. Vers| 000000b0 69 6f 6e 20 64 61 74 65 20 3a 20 54 75 65 2c 31 |ion date : Tue,1| 000000c0 34 20 4e 6f 76 20 31 39 38 39 2e 31 32 3a 32 33 |4 Nov 1989.12:23| 000000d0 3a 32 33 0d 00 32 1e f4 20 a9 20 31 39 38 39 20 |:23..2.. . 1989 | 000000e0 5a 65 72 69 64 61 6a 68 20 73 6f 66 74 77 61 72 |Zeridajh softwar| 000000f0 65 0d 00 3c 15 f4 20 62 79 20 4a 6f 68 6e 20 4b |e..<.. by John K| 00000100 6f 72 74 69 6e 6b 0d 00 46 4b f4 ab ab ab ab ab |ortink..FK......| 00000110 ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab |................| * 00000150 ab 0d 00 50 2e ee 20 85 20 f1 27 22 45 72 72 6f |...P.. . .'"Erro| 00000160 72 22 27 27 22 27 22 3b f6 24 3b 22 27 20 28 63 |r"''"'";.$;"' (c| 00000170 6f 64 65 20 22 3b 9e 3b 22 29 22 27 27 3a e0 0d |ode ";.;")"'':..| 00000180 00 5a 1d de 20 6d 65 6e 75 31 20 32 30 34 38 2c |.Z.. menu1 2048,| 00000190 73 75 62 6d 65 6e 75 20 32 30 34 38 0d 00 64 39 |submenu 2048..d9| 000001a0 de 20 77 69 6e 64 6f 77 31 20 32 30 34 38 2c 77 |. window1 2048,w| 000001b0 69 6e 64 6f 77 32 20 32 30 34 38 2c 77 69 6e 64 |indow2 2048,wind| 000001c0 6f 77 33 20 32 30 34 38 2c 77 69 6e 64 6f 77 34 |ow3 2048,window4| 000001d0 20 32 30 34 38 0d 00 6e 39 de 20 70 6f 6c 6c 20 | 2048..n9. poll | 000001e0 32 35 36 2c 62 6c 6f 63 6b 20 32 35 36 2c 66 69 |256,block 256,fi| 000001f0 6c 65 6e 61 6d 65 20 32 35 36 2c 65 72 72 20 32 |lename 256,err 2| 00000200 35 36 2c 70 61 6c 65 74 74 65 20 32 35 36 0d 00 |56,palette 256..| 00000210 78 32 de 20 4d 65 6e 75 44 61 74 61 25 28 34 30 |x2. MenuData%(40| 00000220 29 2c 53 75 62 6d 65 6e 75 44 61 74 61 25 28 34 |),SubmenuData%(4| 00000230 30 29 2c 50 61 6c 65 74 74 65 25 28 32 35 36 29 |0),Palette%(256)| 00000240 0d 00 82 36 de 20 61 72 67 25 20 32 35 36 2c 63 |...6. arg% 256,c| 00000250 6f 6c 6d 61 70 25 20 32 35 36 2c 74 72 61 6e 73 |olmap% 256,trans| 00000260 74 61 62 25 20 32 35 36 2c 43 6f 64 65 25 20 33 |tab% 256,Code% 3| 00000270 30 2a 31 30 32 34 0d 00 8c 49 54 69 6e 79 73 69 |0*1024...ITinysi| 00000280 7a 65 25 3d 34 30 2a 31 30 32 34 3a de 20 54 69 |ze%=40*1024:. Ti| 00000290 6e 79 25 20 54 69 6e 79 73 69 7a 65 25 3a f4 20 |ny% Tinysize%:. | 000002a0 46 69 6c 65 2f 74 61 62 6c 65 20 62 75 66 66 65 |File/table buffe| 000002b0 72 20 28 66 69 78 65 64 20 73 69 7a 65 21 29 0d |r (fixed size!).| 000002c0 00 96 4c 50 72 6f 67 6e 65 65 64 25 3d 31 38 30 |..LProgneed%=180| 000002d0 2a 31 30 32 34 3a f4 20 45 73 74 69 6d 61 74 65 |*1024:. Estimate| 000002e0 64 20 73 70 61 63 65 20 6e 65 65 64 65 64 20 66 |d space needed f| 000002f0 6f 72 20 70 72 6f 67 72 61 6d 2b 76 61 72 73 20 |or program+vars | 00000300 28 6e 6f 20 73 70 72 62 75 66 29 0d 00 a0 37 54 |(no sprbuf)...7T| 00000310 6f 74 61 6c 66 72 65 65 25 3d 93 2d 90 3a f4 20 |otalfree%=.-.:. | 00000320 54 6f 74 61 6c 20 66 72 65 65 20 66 6f 72 20 70 |Total free for p| 00000330 72 6f 67 72 61 6d 2b 76 61 72 73 2b 73 70 72 62 |rogram+vars+sprb| 00000340 75 66 0d 00 aa 3d 53 70 72 69 74 65 73 69 7a 65 |uf...=Spritesize| 00000350 25 3d 54 6f 74 61 6c 66 72 65 65 25 2d 50 72 6f |%=Totalfree%-Pro| 00000360 67 6e 65 65 64 25 3a f4 20 46 72 65 65 20 66 6f |gneed%:. Free fo| 00000370 72 20 73 70 72 69 74 65 20 62 75 66 66 65 72 0d |r sprite buffer.| 00000380 00 b4 45 e7 53 70 72 69 74 65 73 69 7a 65 25 3c |..E.Spritesize%<| 00000390 31 30 32 34 20 8c 20 85 20 31 2c 22 4e 6f 20 72 |1024 . . 1,"No r| 000003a0 6f 6f 6d 20 74 6f 20 73 74 61 72 74 20 75 70 20 |oom to start up | 000003b0 54 72 61 6e 73 6c 61 74 6f 72 20 70 72 6f 70 65 |Translator prope| 000003c0 72 6c 79 22 0d 00 be 43 e7 54 69 6e 79 73 69 7a |rly"...C.Tinysiz| 000003d0 65 25 3c 34 30 2a 31 30 32 34 20 8c 20 85 20 31 |e%<40*1024 . . 1| 000003e0 2c 22 57 68 6f 20 73 63 72 65 77 65 64 20 61 72 |,"Who screwed ar| 000003f0 6f 75 6e 64 20 77 69 74 68 20 6d 79 20 70 72 6f |ound with my pro| 00000400 67 72 61 6d 20 3f 22 0d 00 c8 29 de 20 53 70 72 |gram ?"...). Spr| 00000410 69 74 65 25 20 53 70 72 69 74 65 73 69 7a 65 25 |ite% Spritesize%| 00000420 3a f4 20 53 70 72 69 74 65 20 62 75 66 66 65 72 |:. Sprite buffer| 00000430 0d 00 d2 28 f2 69 6e 69 74 69 61 6c 69 73 65 3a |...(.initialise:| 00000440 f4 20 49 6e 69 74 69 61 6c 69 73 65 20 61 70 70 |. Initialise app| 00000450 6c 69 63 61 74 69 6f 6e 0d 00 dc 34 f2 6d 6f 64 |lication...4.mod| 00000460 65 5f 63 68 61 6e 67 65 28 2d 31 29 3a f4 20 52 |e_change(-1):. R| 00000470 65 73 65 6c 65 63 74 20 63 75 72 72 65 6e 74 20 |eselect current | 00000480 6d 6f 64 65 20 74 6f 20 74 69 64 79 0d 00 e6 5b |mode to tidy...[| 00000490 ee 20 85 20 f2 65 72 72 6f 72 28 9f 2c f6 24 2b |. . .error(.,.$+| 000004a0 22 20 28 63 6f 64 65 20 22 2b c3 9e 2b 22 29 22 |" (code "+..+")"| 000004b0 29 3a e7 46 69 6c 65 4f 70 65 6e 20 8c 20 d9 23 |):.FileOpen . .#| 000004c0 46 69 6c 65 3a f4 20 52 65 70 6f 72 74 20 65 72 |File:. Report er| 000004d0 72 6f 72 2c 20 65 6e 73 75 72 65 20 66 69 6c 65 |ror, ensure file| 000004e0 20 63 6c 6f 73 65 64 0d 00 f0 cc e7 53 70 72 69 | closed.....Spri| 000004f0 74 65 73 69 7a 65 25 3c 38 30 2a 31 30 32 34 20 |tesize%<80*1024 | 00000500 8c 20 f2 65 72 72 6f 72 28 30 2c 22 57 41 52 4e |. .error(0,"WARN| 00000510 49 4e 47 20 21 20 49 20 68 61 76 65 20 22 2b c3 |ING ! I have "+.| 00000520 28 53 70 72 69 74 65 73 69 7a 65 25 29 2b 22 20 |(Spritesize%)+" | 00000530 62 79 74 65 73 20 66 72 65 65 20 66 6f 72 20 69 |bytes free for i| 00000540 6d 61 67 65 20 68 61 6e 64 6c 69 6e 67 2e 20 50 |mage handling. P| 00000550 72 65 73 73 20 4f 4b 20 74 6f 20 63 6f 6e 74 69 |ress OK to conti| 00000560 6e 75 65 20 77 69 74 68 20 74 68 69 73 20 74 72 |nue with this tr| 00000570 69 63 6b 79 20 73 69 74 75 61 74 69 6f 6e 20 6f |icky situation o| 00000580 72 20 43 41 4e 43 45 4c 20 74 6f 20 71 75 69 74 |r CANCEL to quit| 00000590 20 28 61 6e 64 20 72 65 73 65 72 76 65 20 73 6f | (and reserve so| 000005a0 6d 65 20 6d 6f 72 65 20 6d 65 6d 6f 72 79 20 21 |me more memory !| 000005b0 29 22 29 0d 00 fa 17 f5 20 f4 20 50 6f 6c 6c 20 |)")..... . Poll | 000005c0 61 6e 64 20 61 63 74 69 6f 6e 0d 01 04 11 c8 8e |and action......| 000005d0 20 a4 70 6f 6c 6c 28 30 29 20 ca 0d 01 0e 05 20 | .poll(0) ..... | 000005e0 0d 01 18 2a 20 c9 20 30 20 3a 20 f4 20 4e 6f 74 |...* . 0 : . Not| 000005f0 68 69 6e 67 20 74 6f 20 64 6f 2c 20 70 65 72 66 |hing to do, perf| 00000600 6f 72 6d 20 63 68 65 63 6b 73 0d 01 22 11 20 20 |orm checks..". | 00000610 e7 41 77 61 69 74 41 63 6b 20 8c 0d 01 2c 41 20 |.AwaitAck ...,A | 00000620 20 20 41 77 61 69 74 41 63 6b 3d a3 3a c8 99 20 | AwaitAck=.:.. | 00000630 22 4f 53 5f 43 4c 49 22 2c 22 52 65 6d 6f 76 65 |"OS_CLI","Remove| 00000640 20 22 2b 53 61 76 65 24 3a f4 20 44 65 6c 65 74 | "+Save$:. Delet| 00000650 65 20 66 69 6c 65 20 73 61 76 65 64 0d 01 36 45 |e file saved..6E| 00000660 20 20 20 f2 65 72 72 6f 72 28 2d 31 2c 22 42 61 | .error(-1,"Ba| 00000670 64 20 64 61 74 61 20 74 72 61 6e 73 66 65 72 2c |d data transfer,| 00000680 20 72 65 63 65 69 76 65 72 20 64 65 61 64 22 29 | receiver dead")| 00000690 3a f4 20 4e 6f 20 44 61 74 61 4c 6f 61 64 41 63 |:. No DataLoadAc| 000006a0 6b 0d 01 40 07 20 20 cd 0d 01 4a 05 20 0d 01 54 |k..@. ...J. ..T| 000006b0 22 20 c9 20 31 20 3a 20 f4 20 52 65 64 72 61 77 |" . 1 : . Redraw| 000006c0 20 77 69 6e 64 6f 77 20 72 65 71 75 65 73 74 0d | window request.| 000006d0 01 5e 1e 20 20 f2 72 65 64 72 61 77 5f 77 69 6e |.^. .redraw_win| 000006e0 64 6f 77 28 70 6f 6c 6c 21 30 2c a3 29 0d 01 68 |dow(poll!0,.)..h| 000006f0 05 20 0d 01 72 20 20 c9 20 32 20 3a 20 f4 20 4f |. ..r . 2 : . O| 00000700 70 65 6e 20 77 69 6e 64 6f 77 20 72 65 71 75 65 |pen window reque| 00000710 73 74 0d 01 7c 1a 20 20 f2 6f 70 65 6e 5f 77 69 |st..|. .open_wi| 00000720 6e 64 6f 77 28 30 2c 70 6f 6c 6c 29 0d 01 86 05 |ndow(0,poll)....| 00000730 20 0d 01 90 21 20 c9 20 33 20 3a 20 f4 20 43 6c | ...! . 3 : . Cl| 00000740 6f 73 65 20 77 69 6e 64 6f 77 20 72 65 71 75 65 |ose window reque| 00000750 73 74 0d 01 9a 21 20 20 77 69 6e 25 3d 70 6f 6c |st...! win%=pol| 00000760 6c 21 30 3a f4 20 57 69 6e 64 6f 77 20 68 61 6e |l!0:. Window han| 00000770 64 6c 65 0d 01 a4 28 20 20 f2 63 6c 6f 73 65 5f |dle...( .close_| 00000780 77 69 6e 64 6f 77 28 77 69 6e 25 29 3a f4 20 43 |window(win%):. C| 00000790 6c 6f 73 65 20 77 69 6e 64 6f 77 0d 01 ae 77 20 |lose window...w | 000007a0 20 e7 77 69 6e 25 3d 77 69 6e 5f 69 6d 67 25 20 | .win%=win_img% | 000007b0 8c 20 49 6d 67 3d a3 3a f2 73 65 74 5f 70 61 6c |. Img=.:.set_pal| 000007c0 65 74 74 65 28 30 29 3a f2 63 6c 6f 73 65 5f 77 |ette(0):.close_w| 000007d0 69 6e 64 6f 77 28 77 69 6e 5f 73 61 76 65 25 29 |indow(win_save%)| 000007e0 3a f4 20 52 65 73 65 74 20 70 61 6c 65 74 74 65 |:. Reset palette| 000007f0 2c 20 77 69 70 65 20 73 61 76 65 20 77 69 6e 64 |, wipe save wind| 00000800 6f 77 20 69 66 20 69 6d 61 67 65 20 63 6c 6f 73 |ow if image clos| 00000810 65 64 0d 01 b8 05 20 0d 01 c2 23 20 c9 20 34 20 |ed.... ...# . 4 | 00000820 3a 20 f4 20 50 6f 69 6e 74 65 72 20 6c 65 61 76 |: . Pointer leav| 00000830 69 6e 67 20 77 69 6e 64 6f 77 0d 01 cc 05 20 0d |ing window.... .| 00000840 01 d6 24 20 c9 20 35 20 3a 20 f4 20 50 6f 69 6e |..$ . 5 : . Poin| 00000850 74 65 72 20 65 6e 74 65 72 69 6e 67 20 77 69 6e |ter entering win| 00000860 64 6f 77 0d 01 e0 05 20 0d 01 ea 1a 20 c9 20 36 |dow.... .... . 6| 00000870 20 3a 20 f4 20 4d 6f 75 73 65 20 63 6c 69 63 6b | : . Mouse click| 00000880 65 64 0d 01 f4 41 20 20 62 75 74 25 3d 70 6f 6c |ed...A but%=pol| 00000890 6c 21 38 3a 77 69 6e 25 3d 70 6f 6c 6c 21 31 32 |l!8:win%=poll!12| 000008a0 3a 69 63 6f 25 3d 70 6f 6c 6c 21 31 36 3a f4 20 |:ico%=poll!16:. | 000008b0 42 75 74 74 6f 6e 73 2f 77 69 6e 64 6f 77 2f 69 |Buttons/window/i| 000008c0 63 6f 6e 0d 01 fe 0f 20 20 c8 8e 20 77 69 6e 25 |con.... .. win%| 000008d0 20 ca 0d 02 08 20 20 20 20 c9 20 2d 32 20 3a 20 | .... . -2 : | 000008e0 f4 20 43 6c 69 63 6b 20 6f 6e 20 69 63 6f 6e 62 |. Click on iconb| 000008f0 61 72 0d 02 12 19 20 20 20 20 e7 69 63 6f 25 3d |ar.... .ico%=| 00000900 49 69 63 6f 6e 62 61 72 25 20 8c 0d 02 1c 1f 20 |Iiconbar% ..... | 00000910 20 20 20 20 f4 20 49 63 6f 6e 62 61 72 20 69 63 | . Iconbar ic| 00000920 6f 6e 20 63 6c 69 63 6b 65 64 0d 02 26 16 20 20 |on clicked..&. | 00000930 20 20 20 c8 8e 20 62 75 74 25 20 80 20 37 20 ca | .. but% . 7 .| 00000940 0d 02 30 1d 20 20 20 20 20 20 c9 20 32 20 3a 20 |..0. . 2 : | 00000950 f2 69 63 6f 6e 62 61 72 5f 6d 65 6e 75 0d 02 3a |.iconbar_menu..:| 00000960 1d 20 20 20 20 20 20 c9 20 34 20 3a 20 f2 6f 70 |. . 4 : .op| 00000970 74 69 6f 6e 73 5f 6d 65 6e 75 0d 02 44 0a 20 20 |tions_menu..D. | 00000980 20 20 20 cb 0d 02 4e 09 20 20 20 20 cd 0d 02 58 | ...N. ...X| 00000990 2b 20 20 20 c9 20 77 69 6e 5f 69 6d 67 25 20 3a |+ . win_img% :| 000009a0 20 f4 20 43 6c 69 63 6b 20 6f 6e 20 69 6d 61 67 | . Click on imag| 000009b0 65 20 77 69 6e 64 6f 77 0d 02 62 15 20 20 20 20 |e window..b. | 000009c0 c8 8e 20 62 75 74 25 20 80 20 37 20 ca 0d 02 6c |.. but% . 7 ...l| 000009d0 37 20 20 20 20 20 c9 20 32 20 3a 20 f2 6f 70 74 |7 . 2 : .opt| 000009e0 69 6f 6e 73 5f 6d 65 6e 75 3a f4 20 4d 65 6e 75 |ions_menu:. Menu| 000009f0 20 62 75 74 74 6f 6e 2c 20 70 6f 70 20 75 70 20 | button, pop up | 00000a00 6d 65 6e 75 0d 02 76 09 20 20 20 20 cb 0d 02 80 |menu..v. ....| 00000a10 30 20 20 20 c9 20 77 69 6e 5f 73 61 76 65 25 20 |0 . win_save% | 00000a20 3a 20 f4 20 43 6c 69 63 6b 20 6f 6e 20 73 61 76 |: . Click on sav| 00000a30 65 20 66 69 6c 65 20 77 69 6e 64 6f 77 0d 02 8a |e file window...| 00000a40 16 20 20 20 20 e7 69 63 6f 25 3d 49 73 61 76 65 |. .ico%=Isave| 00000a50 25 20 8c 0d 02 94 18 20 20 20 20 20 c8 8e 20 62 |% ..... .. b| 00000a60 75 74 25 20 80 20 26 37 46 20 ca 0d 02 9e 3b 20 |ut% . &7F ....; | 00000a70 20 20 20 20 20 c9 20 31 36 2c 36 34 20 3a 20 f4 | . 16,64 : .| 00000a80 20 44 72 61 67 2c 63 61 6c 63 75 6c 61 74 65 20 | Drag,calculate | 00000a90 64 72 61 67 20 62 6f 78 20 61 6e 64 20 63 72 65 |drag box and cre| 00000aa0 61 74 65 20 69 74 0d 02 a8 3e 20 20 20 20 20 20 |ate it...> | 00000ab0 20 21 62 6c 6f 63 6b 3d 77 69 6e 25 3a c8 99 20 | !block=win%:.. | 00000ac0 57 47 65 74 57 53 25 2c 2c 62 6c 6f 63 6b 3a 78 |WGetWS%,,block:x| 00000ad0 25 3d 62 6c 6f 63 6b 21 34 3a 79 25 3d 62 6c 6f |%=block!4:y%=blo| 00000ae0 63 6b 21 38 0d 02 b2 29 20 20 20 20 20 20 20 62 |ck!8...) b| 00000af0 6c 6f 63 6b 21 34 3d 69 63 6f 25 3a c8 99 20 57 |lock!4=ico%:.. W| 00000b00 47 65 74 49 49 25 2c 2c 62 6c 6f 63 6b 0d 02 bc |GetII%,,block...| 00000b10 4b 20 20 20 20 20 20 20 21 62 6c 6f 63 6b 3d 77 |K !block=w| 00000b20 69 6e 5f 73 61 76 65 25 3a 62 6c 6f 63 6b 21 34 |in_save%:block!4| 00000b30 3d 35 3a 62 6c 6f 63 6b 21 38 2b 3d 78 25 3a 62 |=5:block!8+=x%:b| 00000b40 6c 6f 63 6b 21 31 32 2b 3d 79 25 3a 62 6c 6f 63 |lock!12+=y%:bloc| 00000b50 6b 21 31 36 2b 3d 78 25 0d 02 c6 4b 20 20 20 20 |k!16+=x%...K | 00000b60 20 20 20 62 6c 6f 63 6b 21 32 30 2b 3d 79 25 3a | block!20+=y%:| 00000b70 62 6c 6f 63 6b 21 32 34 3d 30 3a 62 6c 6f 63 6b |block!24=0:block| 00000b80 21 32 38 3d 30 3a 62 6c 6f 63 6b 21 33 32 3d 53 |!28=0:block!32=S| 00000b90 63 72 57 25 3a 62 6c 6f 63 6b 21 33 36 3d 53 63 |crW%:block!36=Sc| 00000ba0 72 48 25 0d 02 d0 2e 20 20 20 20 20 20 20 c8 99 |rH%.... ..| 00000bb0 20 57 44 72 61 67 42 25 2c 2c 62 6c 6f 63 6b 3a | WDragB%,,block:| 00000bc0 f4 20 43 72 65 61 74 65 20 64 72 61 67 20 62 6f |. Create drag bo| 00000bd0 78 0d 02 da 0a 20 20 20 20 20 cb 0d 02 e4 09 20 |x.... ..... | 00000be0 20 20 20 cd 0d 02 ee 07 20 20 cb 0d 02 f8 05 20 | ..... ..... | 00000bf0 0d 03 02 3a 20 c9 20 37 20 3a 20 f4 20 55 73 65 |...: . 7 : . Use| 00000c00 72 20 68 61 73 20 64 72 6f 70 70 65 64 20 64 72 |r has dropped dr| 00000c10 61 67 20 62 6f 78 20 6f 66 20 73 61 76 65 20 66 |ag box of save f| 00000c20 69 6c 65 20 77 69 6e 64 6f 77 0d 03 0c 2e 20 20 |ile window.... | 00000c30 c8 99 20 57 47 65 74 50 49 25 2c 2c 62 6c 6f 63 |.. WGetPI%,,bloc| 00000c40 6b 3a f4 20 47 65 74 20 70 6f 69 6e 74 65 72 20 |k:. Get pointer | 00000c50 70 6f 73 69 74 69 6f 6e 0d 03 16 4b 20 20 62 6c |position...K bl| 00000c60 6f 63 6b 21 32 30 3d 62 6c 6f 63 6b 21 31 32 3a |ock!20=block!12:| 00000c70 62 6c 6f 63 6b 21 32 34 3d 62 6c 6f 63 6b 21 31 |block!24=block!1| 00000c80 36 3a 62 6c 6f 63 6b 21 32 38 3d 62 6c 6f 63 6b |6:block!28=block| 00000c90 21 30 3a 62 6c 6f 63 6b 21 33 32 3d 62 6c 6f 63 |!0:block!32=bloc| 00000ca0 6b 21 34 0d 03 20 48 20 20 62 6c 6f 63 6b 21 34 |k!4.. H block!4| 00000cb0 3d 30 3a 62 6c 6f 63 6b 21 38 3d 30 3a 62 6c 6f |=0:block!8=0:blo| 00000cc0 63 6b 21 31 32 3d 30 3a 62 6c 6f 63 6b 21 31 36 |ck!12=0:block!16| 00000cd0 3d 31 3a 62 6c 6f 63 6b 21 33 36 3d 30 3a 62 6c |=1:block!36=0:bl| 00000ce0 6f 63 6b 21 34 30 3d 26 46 46 39 0d 03 2a 3a 20 |ock!40=&FF9..*: | 00000cf0 20 66 69 6c 65 6e 61 6d 65 24 3d a4 73 74 72 69 | filename$=.stri| 00000d00 6e 67 28 66 69 6c 65 6e 61 6d 65 29 3a 24 28 62 |ng(filename):$(b| 00000d10 6c 6f 63 6b 2b 34 34 29 3d 66 69 6c 65 6e 61 6d |lock+44)=filenam| 00000d20 65 24 2b bd 30 0d 03 34 21 20 20 21 62 6c 6f 63 |e$+.0..4! !bloc| 00000d30 6b 3d 28 34 34 2b a9 66 69 6c 65 6e 61 6d 65 24 |k=(44+.filename$| 00000d40 2b 34 29 80 ac 33 0d 03 3e 33 20 20 c8 99 20 57 |+4)..3..>3 .. W| 00000d50 53 65 6e 64 4d 73 67 25 2c 31 37 2c 62 6c 6f 63 |SendMsg%,17,bloc| 00000d60 6b 3a f4 20 53 65 6e 64 20 44 61 74 61 53 61 76 |k:. Send DataSav| 00000d70 65 20 6d 65 73 73 61 67 65 0d 03 48 37 20 20 f2 |e message..H7 .| 00000d80 63 6c 6f 73 65 5f 77 69 6e 64 6f 77 28 77 69 6e |close_window(win| 00000d90 5f 73 61 76 65 25 29 3a f4 20 43 6c 6f 73 65 20 |_save%):. Close | 00000da0 73 61 76 65 20 66 69 6c 65 20 77 69 6e 64 6f 77 |save file window| 00000db0 0d 03 52 05 20 0d 03 5c 18 20 c9 20 38 20 3a 20 |..R. ..\. . 8 : | 00000dc0 f4 20 4b 65 79 20 70 72 65 73 73 65 64 0d 03 66 |. Key pressed..f| 00000dd0 47 20 20 77 69 6e 25 3d 70 6f 6c 6c 21 30 3a 69 |G win%=poll!0:i| 00000de0 63 6f 25 3d 70 6f 6c 6c 21 34 3a 63 68 61 72 25 |co%=poll!4:char%| 00000df0 3d 70 6f 6c 6c 21 32 34 3a f4 20 57 69 6e 64 6f |=poll!24:. Windo| 00000e00 77 2c 20 69 63 6f 6e 2c 20 6b 65 79 20 70 72 65 |w, icon, key pre| 00000e10 73 73 65 64 0d 03 70 2d 20 20 e7 28 77 69 6e 25 |ssed..p- .(win%| 00000e20 3d 77 69 6e 5f 73 61 76 65 25 29 20 80 20 28 69 |=win_save%) . (i| 00000e30 63 6f 25 3d 49 66 69 6c 65 6e 61 6d 65 25 29 20 |co%=Ifilename%) | 00000e40 8c 0d 03 7a 11 20 20 20 c8 8e 20 63 68 61 72 25 |...z. .. char%| 00000e50 20 ca 0d 03 84 1f 20 20 20 20 c9 20 31 33 20 3a | ..... . 13 :| 00000e60 20 f4 20 52 65 74 75 72 6e 20 70 72 65 73 73 65 | . Return presse| 00000e70 64 0d 03 8e 4b 20 20 20 20 f2 65 72 72 6f 72 28 |d...K .error(| 00000e80 2d 31 2c 22 50 6c 65 61 73 65 20 64 72 61 67 20 |-1,"Please drag | 00000e90 74 68 65 20 73 70 72 69 74 65 20 66 69 6c 65 20 |the sprite file | 00000ea0 69 63 6f 6e 20 74 6f 20 61 20 64 69 72 65 63 74 |icon to a direct| 00000eb0 6f 72 79 20 76 69 65 77 65 72 22 29 0d 03 98 1f |ory viewer")....| 00000ec0 20 20 20 20 c9 20 32 37 20 3a 20 f4 20 45 73 63 | . 27 : . Esc| 00000ed0 61 70 65 20 70 72 65 73 73 65 64 0d 03 a2 21 20 |ape pressed...! | 00000ee0 20 20 20 20 f2 63 6c 6f 73 65 5f 77 69 6e 64 6f | .close_windo| 00000ef0 77 28 77 69 6e 5f 73 61 76 65 25 29 0d 03 ac 08 |w(win_save%)....| 00000f00 20 20 20 cb 0d 03 b6 07 20 20 cd 0d 03 c0 05 20 | ..... ..... | 00000f10 0d 03 ca 25 20 c9 20 39 20 3a 20 f4 20 4d 65 6e |...% . 9 : . Men| 00000f20 75 20 73 65 6c 65 63 74 69 6f 6e 20 66 72 6f 6d |u selection from| 00000f30 20 75 73 65 72 0d 03 d4 44 20 20 73 65 6c 65 63 | user...D selec| 00000f40 74 65 64 25 3d 70 6f 6c 6c 21 30 3a 73 65 6c 65 |ted%=poll!0:sele| 00000f50 63 74 65 64 32 25 3d 70 6f 6c 6c 21 34 3a f4 20 |cted2%=poll!4:. | 00000f60 4d 65 6e 75 2f 73 75 62 6d 65 6e 75 20 69 63 6f |Menu/submenu ico| 00000f70 6e 20 69 6e 64 69 63 65 73 0d 03 de 34 20 20 73 |n indices...4 s| 00000f80 65 6c 65 63 74 24 3d 22 22 3a 73 65 6c 65 63 74 |elect$="":select| 00000f90 32 24 3d 22 22 3a f4 20 4e 6f 20 73 65 6c 65 63 |2$="":. No selec| 00000fa0 74 69 6f 6e 73 20 64 65 66 61 75 6c 74 0d 03 e8 |tions default...| 00000fb0 3b 20 20 e7 73 65 6c 65 63 74 65 64 25 3e 3d 30 |; .selected%>=0| 00000fc0 20 8c 20 73 65 6c 65 63 74 24 3d a4 73 74 72 69 | . select$=.stri| 00000fd0 6e 67 28 4d 65 6e 75 44 61 74 61 25 28 73 65 6c |ng(MenuData%(sel| 00000fe0 65 63 74 65 64 25 29 29 0d 03 f2 41 20 20 e7 73 |ected%))...A .s| 00000ff0 65 6c 65 63 74 65 64 32 25 3e 3d 30 20 8c 20 73 |elected2%>=0 . s| 00001000 65 6c 65 63 74 32 24 3d a4 73 74 72 69 6e 67 28 |elect2$=.string(| 00001010 53 75 62 6d 65 6e 75 44 61 74 61 25 28 73 65 6c |SubmenuData%(sel| 00001020 65 63 74 65 64 32 25 29 29 0d 03 fc 16 20 20 c8 |ected2%)).... .| 00001030 8e 20 c0 73 65 6c 65 63 74 24 2c 34 29 20 ca 0d |. .select$,4) ..| 00001040 04 06 1a 20 20 20 c9 20 22 22 20 3a 20 f4 20 44 |... . "" : . D| 00001050 6f 20 6e 6f 74 68 69 6e 67 0d 04 10 20 20 20 20 |o nothing... | 00001060 c9 20 22 51 75 69 74 22 20 3a 20 f4 20 51 75 69 |. "Quit" : . Qui| 00001070 74 20 70 72 6f 67 72 61 6d 0d 04 1a 1f 20 20 20 |t program.... | 00001080 20 f2 64 69 65 3a f4 20 54 69 64 79 20 75 70 20 | .die:. Tidy up | 00001090 61 6e 64 20 65 78 69 74 0d 04 24 38 20 20 20 c9 |and exit..$8 .| 000010a0 20 22 5a 6f 6f 6d 22 2c 22 4e 6f 72 6d 22 20 3a | "Zoom","Norm" :| 000010b0 20 f4 20 5a 6f 6f 6d 20 69 6e 2c 6f 75 74 20 6f | . Zoom in,out o| 000010c0 72 20 62 61 63 6b 20 74 6f 20 6e 6f 72 6d 61 6c |r back to normal| 000010d0 0d 04 2e 31 20 20 20 20 4f 6c 64 5a 6f 6f 6d 25 |...1 OldZoom%| 000010e0 3d 5a 6f 6f 6d 25 3a f4 20 52 65 6d 65 6d 62 65 |=Zoom%:. Remembe| 000010f0 72 20 6f 6c 64 20 7a 6f 6f 6d 20 66 61 63 74 6f |r old zoom facto| 00001100 72 0d 04 38 14 20 20 20 20 c8 8e 20 73 65 6c 65 |r..8. .. sele| 00001110 63 74 24 20 ca 0d 04 42 23 20 20 20 20 20 c9 20 |ct$ ...B# . | 00001120 22 5a 6f 6f 6d 20 69 6e 22 3a 20 5a 6f 6f 6d 25 |"Zoom in": Zoom%| 00001130 3d 5a 6f 6f 6d 25 2a 32 0d 04 4c 2f 20 20 20 20 |=Zoom%*2..L/ | 00001140 20 c9 20 22 5a 6f 6f 6d 20 6f 75 74 22 3a 20 e7 | . "Zoom out": .| 00001150 5a 6f 6f 6d 25 3e 31 20 8c 20 5a 6f 6f 6d 25 3d |Zoom%>1 . Zoom%=| 00001160 5a 6f 6f 6d 25 81 32 0d 04 56 21 20 20 20 20 20 |Zoom%.2..V! | 00001170 c9 20 22 4e 6f 72 6d 61 6c 20 73 69 7a 65 22 3a |. "Normal size":| 00001180 20 5a 6f 6f 6d 25 3d 31 0d 04 60 09 20 20 20 20 | Zoom%=1..`. | 00001190 cb 0d 04 6a 4c 20 20 20 20 f4 20 53 65 74 20 69 |...jL . Set i| 000011a0 6d 61 67 65 20 77 69 6e 64 6f 77 20 65 78 74 65 |mage window exte| 000011b0 6e 74 20 61 6e 64 20 74 69 74 6c 65 20 61 63 63 |nt and title acc| 000011c0 6f 72 64 69 6e 67 20 74 6f 20 63 75 72 72 65 6e |ording to curren| 000011d0 74 20 7a 6f 6f 6d 20 66 61 63 74 6f 72 0d 04 74 |t zoom factor..t| 000011e0 43 20 20 20 20 21 62 6c 6f 63 6b 3d 30 3a 62 6c |C !block=0:bl| 000011f0 6f 63 6b 21 34 3d 30 3a 62 6c 6f 63 6b 21 38 3d |ock!4=0:block!8=| 00001200 a4 73 70 72 57 2a 5a 6f 6f 6d 25 3a 62 6c 6f 63 |.sprW*Zoom%:bloc| 00001210 6b 21 31 32 3d a4 73 70 72 48 2a 5a 6f 6f 6d 25 |k!12=.sprH*Zoom%| 00001220 0d 04 7e 43 20 20 20 20 c8 99 20 57 53 65 74 45 |..~C .. WSetE| 00001230 25 2c 77 69 6e 5f 69 6d 67 25 2c 62 6c 6f 63 6b |%,win_img%,block| 00001240 3a f4 20 53 65 74 20 77 69 6e 64 6f 77 20 65 78 |:. Set window ex| 00001250 74 65 6e 74 20 74 6f 20 7a 6f 6f 6d 65 64 20 73 |tent to zoomed s| 00001260 69 7a 65 0d 04 88 46 20 20 20 20 24 74 69 74 6c |ize...F $titl| 00001270 65 5f 69 6d 67 25 3d 22 49 6d 61 67 65 20 22 2b |e_img%="Image "+| 00001280 46 69 6c 65 24 3a e7 5a 6f 6f 6d 25 3e 31 20 8c |File$:.Zoom%>1 .| 00001290 20 24 74 69 74 6c 65 5f 69 6d 67 25 2b 3d 22 20 | $title_img%+=" | 000012a0 78 22 2b c3 5a 6f 6f 6d 25 0d 04 92 42 20 20 20 |x"+.Zoom%...B | 000012b0 20 21 62 6c 6f 63 6b 3d 77 69 6e 5f 69 6d 67 25 | !block=win_img%| 000012c0 3a c8 99 20 57 47 65 74 57 53 25 2c 2c 62 6c 6f |:.. WGetWS%,,blo| 000012d0 63 6b 3a f4 20 52 65 61 64 20 77 69 6e 64 6f 77 |ck:. Read window| 000012e0 27 73 20 70 6f 73 69 74 69 6f 6e 0d 04 9c 4c 20 |'s position...L | 000012f0 20 20 20 64 78 25 3d 28 62 6c 6f 63 6b 21 31 32 | dx%=(block!12| 00001300 2d 62 6c 6f 63 6b 21 34 29 2f 32 3a 64 79 25 3d |-block!4)/2:dy%=| 00001310 28 62 6c 6f 63 6b 21 31 36 2d 62 6c 6f 63 6b 21 |(block!16-block!| 00001320 38 29 2f 32 3a f4 20 48 61 6c 66 20 77 69 6e 64 |8)/2:. Half wind| 00001330 6f 77 20 73 69 7a 65 0d 04 a6 48 20 20 20 20 76 |ow size...H v| 00001340 78 25 3d 62 6c 6f 63 6b 21 32 30 2b 64 78 25 3a |x%=block!20+dx%:| 00001350 76 79 25 3d 62 6c 6f 63 6b 21 32 34 2d 64 79 25 |vy%=block!24-dy%| 00001360 3a f4 20 56 65 63 74 6f 72 20 66 72 6f 6d 20 63 |:. Vector from c| 00001370 65 6e 74 72 65 20 74 6f 20 6f 72 69 67 69 6e 0d |entre to origin.| 00001380 04 b0 49 20 20 20 20 f4 20 43 61 6c 63 75 6c 61 |..I . Calcula| 00001390 74 65 20 6e 65 77 20 73 63 72 6f 6c 6c 20 6f 66 |te new scroll of| 000013a0 66 73 65 74 73 20 62 79 20 73 63 61 6c 69 6e 67 |fsets by scaling| 000013b0 20 76 65 63 74 6f 72 20 61 6e 64 20 72 65 2d 74 | vector and re-t| 000013c0 72 61 6e 73 70 6f 73 65 0d 04 ba 47 20 20 20 20 |ranspose...G | 000013d0 62 6c 6f 63 6b 21 32 30 3d 76 78 25 2a 5a 6f 6f |block!20=vx%*Zoo| 000013e0 6d 25 2f 4f 6c 64 5a 6f 6f 6d 25 2d 64 78 25 3a |m%/OldZoom%-dx%:| 000013f0 62 6c 6f 63 6b 21 32 34 3d 76 79 25 2a 5a 6f 6f |block!24=vy%*Zoo| 00001400 6d 25 2f 4f 6c 64 5a 6f 6f 6d 25 2b 64 79 25 0d |m%/OldZoom%+dy%.| 00001410 04 c4 3c 20 20 20 20 f2 63 6c 6f 73 65 5f 77 69 |..< .close_wi| 00001420 6e 64 6f 77 28 77 69 6e 5f 69 6d 67 25 29 3a f2 |ndow(win_img%):.| 00001430 6f 70 65 6e 5f 77 69 6e 64 6f 77 28 77 69 6e 5f |open_window(win_| 00001440 69 6d 67 25 2c 62 6c 6f 63 6b 29 0d 04 ce 2f 20 |img%,block).../ | 00001450 20 20 c9 20 22 53 61 76 65 22 20 3a 20 f4 20 53 | . "Save" : . S| 00001460 61 76 65 20 77 68 6f 6c 65 20 6f 72 20 70 61 72 |ave whole or par| 00001470 74 20 6f 66 20 69 6d 61 67 65 0d 04 d8 33 20 20 |t of image...3 | 00001480 20 20 53 61 76 65 5f 6b 69 6e 64 24 3d 73 65 6c | Save_kind$=sel| 00001490 65 63 74 32 24 3a f4 20 52 65 6d 65 6d 62 65 72 |ect2$:. Remember| 000014a0 20 74 79 70 65 20 6f 66 20 73 61 76 65 0d 04 e2 | type of save...| 000014b0 39 20 20 20 20 f2 6f 70 65 6e 5f 77 69 6e 64 6f |9 .open_windo| 000014c0 77 28 77 69 6e 5f 73 61 76 65 25 2c 30 29 3a f4 |w(win_save%,0):.| 000014d0 20 4f 70 65 6e 20 73 61 76 65 20 66 69 6c 65 20 | Open save file | 000014e0 77 69 6e 64 6f 77 0d 04 ec 2e 20 20 20 c9 20 22 |window.... . "| 000014f0 49 6e 63 6c 22 20 3a 20 f4 20 54 6f 67 67 6c 65 |Incl" : . Toggle| 00001500 20 73 61 76 65 2d 70 61 6c 65 74 74 65 20 6f 6e | save-palette on| 00001510 2f 6f 66 66 0d 04 f6 23 20 20 20 20 50 61 6c 6f |/off...# Palo| 00001520 6e 6f 66 66 3d ac 50 61 6c 6f 6e 6f 66 66 3a f4 |noff=.Palonoff:.| 00001530 20 54 6f 67 67 6c 65 0d 05 00 35 20 20 20 c9 20 | Toggle...5 . | 00001540 22 41 75 74 6f 22 20 3a 20 f4 20 54 6f 67 67 6c |"Auto" : . Toggl| 00001550 65 20 61 75 74 6f 20 6d 6f 64 65 20 73 65 6c 65 |e auto mode sele| 00001560 63 74 69 6f 6e 20 6f 6e 2f 6f 66 66 0d 05 0a 23 |ction on/off...#| 00001570 20 20 20 20 41 75 74 6f 4d 6f 64 65 3d ac 41 75 | AutoMode=.Au| 00001580 74 6f 4d 6f 64 65 3a f4 20 54 6f 67 67 6c 65 0d |toMode:. Toggle.| 00001590 05 14 27 20 20 20 c9 20 22 49 6d 61 67 22 20 3a |..' . "Imag" :| 000015a0 20 f4 20 53 65 74 20 69 6d 61 67 65 27 73 20 70 | . Set image's p| 000015b0 61 6c 65 74 74 65 0d 05 1e 86 20 20 20 20 f2 73 |alette.... .s| 000015c0 65 74 5f 70 61 6c 65 74 74 65 28 31 29 3a e7 50 |et_palette(1):.P| 000015d0 61 6c 65 74 74 65 3d 30 20 8c 20 f2 65 72 72 6f |alette=0 . .erro| 000015e0 72 28 2d 31 2c 22 50 6c 65 61 73 65 20 73 65 6c |r(-1,"Please sel| 000015f0 65 63 74 20 61 20 6d 6f 64 65 20 77 69 74 68 20 |ect a mode with | 00001600 22 2b c3 28 a4 69 6d 61 67 65 5f 63 6f 6c 73 29 |"+.(.image_cols)| 00001610 2b 22 20 63 6f 6c 6f 75 72 73 20 74 6f 20 64 69 |+" colours to di| 00001620 73 70 6c 61 79 20 74 68 65 20 69 6d 61 67 65 20 |splay the image | 00001630 63 6f 72 72 65 63 74 6c 79 2e 22 29 0d 05 28 27 |correctly.")..('| 00001640 20 20 20 c9 20 22 44 65 73 6b 22 20 3a 20 f4 20 | . "Desk" : . | 00001650 53 65 74 20 64 65 73 6b 74 6f 70 20 70 61 6c 65 |Set desktop pale| 00001660 74 74 65 0d 05 32 17 20 20 20 20 f2 73 65 74 5f |tte..2. .set_| 00001670 70 61 6c 65 74 74 65 28 30 29 0d 05 3c 28 20 20 |palette(0)..<( | 00001680 20 c9 20 22 53 74 61 6e 22 20 3a 20 f4 20 53 65 | . "Stan" : . Se| 00001690 74 20 73 74 61 6e 64 61 72 64 20 70 61 6c 65 74 |t standard palet| 000016a0 74 65 0d 05 46 17 20 20 20 20 f2 73 65 74 5f 70 |te..F. .set_p| 000016b0 61 6c 65 74 74 65 28 32 29 0d 05 50 26 20 20 20 |alette(2)..P& | 000016c0 c9 20 22 47 49 46 20 22 20 3a 20 f4 20 47 49 46 |. "GIF " : . GIF| 000016d0 20 70 69 63 74 75 72 65 20 6e 75 6d 62 65 72 0d | picture number.| 000016e0 05 5a 29 20 20 20 20 47 49 46 49 6d 61 67 65 25 |.Z) GIFImage%| 000016f0 3d bb 28 73 65 6c 65 63 74 32 24 29 3a f4 20 4e |=.(select2$):. N| 00001700 65 77 20 76 61 6c 75 65 0d 05 64 07 20 20 cb 0d |ew value..d. ..| 00001710 05 6e 2a 20 20 c8 99 20 57 47 65 74 50 49 25 2c |.n* .. WGetPI%,| 00001720 2c 62 6c 6f 63 6b 3a f4 20 47 65 74 20 70 6f 69 |,block:. Get poi| 00001730 6e 74 65 72 20 69 6e 66 6f 0d 05 78 43 20 20 e7 |nter info..xC .| 00001740 28 28 62 6c 6f 63 6b 21 38 29 80 31 29 3e 30 20 |((block!8).1)>0 | 00001750 8c 20 f2 6f 70 74 69 6f 6e 73 5f 6d 65 6e 75 3a |. .options_menu:| 00001760 f4 20 41 64 6a 75 73 74 20 63 6c 69 63 6b 2c 20 |. Adjust click, | 00001770 72 65 2d 6f 70 65 6e 20 6d 65 6e 75 0d 05 82 05 |re-open menu....| 00001780 20 0d 05 8c 22 20 c9 20 31 37 2c 31 38 20 3a 20 | ..." . 17,18 : | 00001790 f4 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 57 |. Message from W| 000017a0 49 4d 50 0d 05 96 2f 20 20 f4 20 49 67 6e 6f 72 |IMP.../ . Ignor| 000017b0 65 20 6d 65 73 73 61 67 65 73 20 6f 72 69 67 69 |e messages origi| 000017c0 6e 61 74 69 6e 67 20 66 72 6f 6d 20 6d 79 73 65 |nating from myse| 000017d0 6c 66 0d 05 a0 38 20 20 e7 28 70 6f 6c 6c 21 34 |lf...8 .(poll!4| 000017e0 29 3d 54 61 73 6b 48 61 6e 64 6c 65 25 20 8c 20 |)=TaskHandle% . | 000017f0 6d 73 67 6e 72 25 3d 2d 31 20 8b 20 6d 73 67 6e |msgnr%=-1 . msgn| 00001800 72 25 3d 70 6f 6c 6c 21 31 36 0d 05 aa 11 20 20 |r%=poll!16.... | 00001810 c8 8e 20 6d 73 67 6e 72 25 20 ca 0d 05 b4 1b 20 |.. msgnr% ..... | 00001820 20 20 c9 20 2d 31 20 3a 20 f4 20 44 6f 6e 27 74 | . -1 : . Don't| 00001830 20 72 65 61 63 74 0d 05 be 2d 20 20 20 c9 20 30 | react...- . 0| 00001840 20 3a 20 f2 64 69 65 3a f4 20 52 65 71 75 65 73 | : .die:. Reques| 00001850 74 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 |t to terminate t| 00001860 61 73 6b 0d 05 c8 25 20 20 20 c9 20 32 20 3a 20 |ask...% . 2 : | 00001870 f4 20 44 61 74 61 53 61 76 65 41 63 6b 2c 20 73 |. DataSaveAck, s| 00001880 61 76 65 20 66 69 6c 65 0d 05 d2 48 20 20 20 20 |ave file...H | 00001890 53 61 76 65 24 3d a4 73 74 72 69 6e 67 28 70 6f |Save$=.string(po| 000018a0 6c 6c 2b 34 34 29 3a f4 20 52 65 61 64 20 66 75 |ll+44):. Read fu| 000018b0 6c 6c 20 70 61 74 68 2d 6e 61 6d 65 20 6f 66 20 |ll path-name of | 000018c0 66 69 6c 65 20 74 6f 20 62 65 20 73 61 76 65 64 |file to be saved| 000018d0 0d 05 dc 17 20 20 20 20 c8 8e 20 53 61 76 65 5f |.... .. Save_| 000018e0 6b 69 6e 64 24 20 ca 0d 05 e6 35 20 20 20 20 20 |kind$ ....5 | 000018f0 c9 20 22 46 75 6c 6c 22 20 3a 20 f4 20 46 75 6c |. "Full" : . Ful| 00001900 6c 20 72 65 73 6f 6c 75 74 69 6f 6e 20 73 70 72 |l resolution spr| 00001910 69 74 65 2c 20 6e 6f 20 65 64 69 74 0d 05 f0 24 |ite, no edit...$| 00001920 20 20 20 20 20 c9 20 22 57 68 6f 6c 65 22 20 3a | . "Whole" :| 00001930 20 f2 65 64 69 74 5f 70 61 72 74 28 a3 2c a3 29 | .edit_part(.,.)| 00001940 0d 05 fa 2d 20 20 20 20 20 c9 20 22 57 68 6f 6c |...- . "Whol| 00001950 65 20 28 73 63 61 6c 65 64 29 22 20 3a 20 f2 65 |e (scaled)" : .e| 00001960 64 69 74 5f 70 61 72 74 28 b9 2c a3 29 0d 06 04 |dit_part(.,.)...| 00001970 23 20 20 20 20 20 c9 20 22 50 61 72 74 22 20 3a |# . "Part" :| 00001980 20 f2 65 64 69 74 5f 70 61 72 74 28 a3 2c b9 29 | .edit_part(.,.)| 00001990 0d 06 0e 2c 20 20 20 20 20 c9 20 22 50 61 72 74 |..., . "Part| 000019a0 20 28 73 63 61 6c 65 64 29 22 20 3a 20 f2 65 64 | (scaled)" : .ed| 000019b0 69 74 5f 70 61 72 74 28 b9 2c b9 29 0d 06 18 09 |it_part(.,.)....| 000019c0 20 20 20 20 cb 0d 06 22 1f 20 20 20 20 f2 68 6f | ...". .ho| 000019d0 75 72 5f 6f 6e 3a f4 20 48 6f 75 72 67 6c 61 73 |ur_on:. Hourglas| 000019e0 73 20 6f 6e 0d 06 2c 1c 20 20 20 20 e7 53 61 76 |s on..,. .Sav| 000019f0 65 5f 6b 69 6e 64 24 3d 22 46 75 6c 6c 22 20 8c |e_kind$="Full" .| 00001a00 0d 06 36 3c 20 20 20 20 20 f4 20 46 75 6c 6c 20 |..6< . Full | 00001a10 73 70 72 69 74 65 2c 20 73 61 76 65 20 69 6d 61 |sprite, save ima| 00001a20 67 65 20 77 69 74 68 20 70 61 6c 65 74 74 65 20 |ge with palette | 00001a30 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 0d 06 40 28 |(optionally)..@(| 00001a40 20 20 20 20 20 4f 75 74 3d ae 28 53 61 76 65 24 | Out=.(Save$| 00001a50 29 3a f4 20 4f 70 65 6e 20 6f 75 74 70 75 74 20 |):. Open output | 00001a60 66 69 6c 65 0d 06 4a 31 20 20 20 20 20 73 70 72 |file..J1 spr| 00001a70 25 3d 53 70 72 69 74 65 25 2b 53 70 72 69 74 65 |%=Sprite%+Sprite| 00001a80 25 21 38 3a f4 20 53 74 61 72 74 20 6f 66 20 73 |%!8:. Start of s| 00001a90 70 72 69 74 65 0d 06 54 3b 20 20 20 20 20 e7 50 |prite..T; .P| 00001aa0 61 6c 6f 6e 6f 66 66 20 80 20 28 50 61 6c 65 74 |alonoff . (Palet| 00001ab0 74 65 25 28 30 29 3c 3d 31 36 29 20 80 20 28 50 |te%(0)<=16) . (P| 00001ac0 61 6c 65 74 74 65 25 28 30 29 3e 3d 32 29 20 8c |alette%(0)>=2) .| 00001ad0 0d 06 5e 26 20 20 20 20 20 20 f4 20 53 61 76 65 |..^& . Save| 00001ae0 20 77 69 74 68 20 70 61 6c 65 74 74 65 20 69 6e | with palette in| 00001af0 63 6c 75 64 65 64 0d 06 68 36 20 20 20 20 20 20 |cluded..h6 | 00001b00 63 6f 6c 73 25 3d 50 61 6c 65 74 74 65 25 28 30 |cols%=Palette%(0| 00001b10 29 3a f4 20 43 6f 6c 6f 75 72 73 20 69 6e 20 73 |):. Colours in s| 00001b20 70 72 69 74 65 27 73 20 6d 6f 64 65 0d 06 72 32 |prite's mode..r2| 00001b30 20 20 20 20 20 20 65 78 74 72 61 25 3d 63 6f 6c | extra%=col| 00001b40 73 25 2a 38 3a f4 20 45 78 74 72 61 20 62 79 74 |s%*8:. Extra byt| 00001b50 65 73 20 66 6f 72 20 70 61 6c 65 74 74 65 0d 06 |es for palette..| 00001b60 7c 49 20 20 20 20 20 20 c8 99 20 22 4f 53 5f 47 ||I .. "OS_G| 00001b70 42 50 42 22 2c 31 2c 4f 75 74 2c 53 70 72 69 74 |BPB",1,Out,Sprit| 00001b80 65 25 2b 34 2c 38 2c 30 3a f4 20 4f 75 74 70 75 |e%+4,8,0:. Outpu| 00001b90 74 20 70 61 72 74 20 6f 66 20 63 6f 6e 74 72 6f |t part of contro| 00001ba0 6c 20 62 6c 6f 63 6b 0d 06 86 48 20 20 20 20 20 |l block...H | 00001bb0 20 21 61 72 67 25 3d 65 78 74 72 61 25 2b 53 70 | !arg%=extra%+Sp| 00001bc0 72 69 74 65 25 21 31 32 3a c8 99 20 22 4f 53 5f |rite%!12:.. "OS_| 00001bd0 47 42 50 42 22 2c 32 2c 4f 75 74 2c 61 72 67 25 |GBPB",2,Out,arg%| 00001be0 2c 34 3a f4 20 4e 65 77 20 6f 66 66 73 65 74 0d |,4:. New offset.| 00001bf0 06 90 43 20 20 20 20 20 20 21 61 72 67 25 3d 65 |..C !arg%=e| 00001c00 78 74 72 61 25 2b 21 73 70 72 25 3a c8 99 20 22 |xtra%+!spr%:.. "| 00001c10 4f 53 5f 47 42 50 42 22 2c 32 2c 4f 75 74 2c 61 |OS_GBPB",2,Out,a| 00001c20 72 67 25 2c 34 3a f4 20 4e 65 77 20 6f 66 66 73 |rg%,4:. New offs| 00001c30 65 74 0d 06 9a 45 20 20 20 20 20 20 c8 99 20 22 |et...E .. "| 00001c40 4f 53 5f 47 42 50 42 22 2c 32 2c 4f 75 74 2c 73 |OS_GBPB",2,Out,s| 00001c50 70 72 25 2b 34 2c 32 38 3a f4 20 4f 75 74 70 75 |pr%+4,28:. Outpu| 00001c60 74 20 70 61 72 74 20 6f 66 20 73 70 72 69 74 65 |t part of sprite| 00001c70 20 68 65 61 64 65 72 0d 06 a4 45 20 20 20 20 20 | header...E | 00001c80 20 21 61 72 67 25 3d 65 78 74 72 61 25 2b 73 70 | !arg%=extra%+sp| 00001c90 72 25 21 33 32 3a c8 99 20 22 4f 53 5f 47 42 50 |r%!32:.. "OS_GBP| 00001ca0 42 22 2c 32 2c 4f 75 74 2c 61 72 67 25 2c 34 3a |B",2,Out,arg%,4:| 00001cb0 f4 20 4e 65 77 20 6f 66 66 73 65 74 0d 06 ae 45 |. New offset...E| 00001cc0 20 20 20 20 20 20 21 61 72 67 25 3d 65 78 74 72 | !arg%=extr| 00001cd0 61 25 2b 73 70 72 25 21 33 36 3a c8 99 20 22 4f |a%+spr%!36:.. "O| 00001ce0 53 5f 47 42 50 42 22 2c 32 2c 4f 75 74 2c 61 72 |S_GBPB",2,Out,ar| 00001cf0 67 25 2c 34 3a f4 20 4e 65 77 20 6f 66 66 73 65 |g%,4:. New offse| 00001d00 74 0d 06 b8 3d 20 20 20 20 20 20 c8 99 20 22 4f |t...= .. "O| 00001d10 53 5f 47 42 50 42 22 2c 32 2c 4f 75 74 2c 73 70 |S_GBPB",2,Out,sp| 00001d20 72 25 2b 34 30 2c 34 3a f4 20 4f 75 74 70 75 74 |r%+40,4:. Output| 00001d30 20 73 70 72 69 74 65 27 73 20 6d 6f 64 65 0d 06 | sprite's mode..| 00001d40 c2 8f 20 20 20 20 20 20 e3 20 63 25 3d 31 20 b8 |.. . c%=1 .| 00001d50 20 63 6f 6c 73 25 3a 61 72 67 25 21 28 63 25 2a | cols%:arg%!(c%*| 00001d60 38 2d 38 29 3d a4 72 65 61 64 70 61 6c 76 61 6c |8-8)=.readpalval| 00001d70 28 50 61 6c 65 74 74 65 25 28 63 25 29 29 3a 61 |(Palette%(c%)):a| 00001d80 72 67 25 21 28 63 25 2a 38 2d 34 29 3d 61 72 67 |rg%!(c%*8-4)=arg| 00001d90 25 21 28 63 25 2a 38 2d 38 29 3a ed 3a c8 99 20 |%!(c%*8-8):.:.. | 00001da0 22 4f 53 5f 47 42 50 42 22 2c 32 2c 4f 75 74 2c |"OS_GBPB",2,Out,| 00001db0 61 72 67 25 2c 63 6f 6c 73 25 2a 38 3a f4 20 4f |arg%,cols%*8:. O| 00001dc0 75 74 70 75 74 20 70 61 6c 65 74 74 65 0d 06 cc |utput palette...| 00001dd0 4a 20 20 20 20 20 20 c8 99 20 22 4f 53 5f 47 42 |J .. "OS_GB| 00001de0 50 42 22 2c 32 2c 4f 75 74 2c 73 70 72 25 2b 73 |PB",2,Out,spr%+s| 00001df0 70 72 25 21 33 32 2c 28 73 70 72 25 21 31 36 2b |pr%!32,(spr%!16+| 00001e00 31 29 2a 28 73 70 72 25 21 32 30 2b 31 29 2a 34 |1)*(spr%!20+1)*4| 00001e10 3a f4 20 44 61 74 61 0d 06 d6 2d 20 20 20 20 20 |:. Data...- | 00001e20 cc 20 f4 20 4e 6f 20 70 61 6c 65 74 74 65 2c 20 |. . No palette, | 00001e30 6f 75 74 70 75 74 20 74 68 65 20 77 68 6f 6c 65 |output the whole| 00001e40 20 6c 6f 74 0d 06 e0 42 20 20 20 20 20 20 c8 99 | lot...B ..| 00001e50 20 22 4f 53 5f 47 42 50 42 22 2c 31 2c 4f 75 74 | "OS_GBPB",1,Out| 00001e60 2c 53 70 72 69 74 65 25 2b 34 2c 53 70 72 69 74 |,Sprite%+4,Sprit| 00001e70 65 25 21 31 32 2d 34 2c 30 3a f4 20 4f 75 74 70 |e%!12-4,0:. Outp| 00001e80 75 74 20 61 6c 6c 0d 06 ea 0a 20 20 20 20 20 cd |ut all.... .| 00001e90 0d 06 f4 44 20 20 20 20 20 d9 23 4f 75 74 3a c8 |...D .#Out:.| 00001ea0 99 20 22 4f 53 5f 43 4c 49 22 2c 22 53 65 74 54 |. "OS_CLI","SetT| 00001eb0 79 70 65 20 22 2b 53 61 76 65 24 2b 22 20 53 70 |ype "+Save$+" Sp| 00001ec0 72 69 74 65 22 3a f4 20 43 6c 6f 73 65 20 26 20 |rite":. Close & | 00001ed0 74 79 70 65 0d 06 fe 34 20 20 20 20 cc 20 f4 20 |type...4 . . | 00001ee0 45 64 69 74 65 64 20 70 61 72 74 20 69 6e 20 77 |Edited part in w| 00001ef0 69 6e 64 6f 77 20 6f 6e 20 73 63 72 65 65 6e 2c |indow on screen,| 00001f00 20 73 61 76 65 20 69 74 0d 07 08 2c 20 20 20 20 | save it..., | 00001f10 20 f2 69 6e 76 61 6c 69 64 61 74 65 5f 73 63 72 | .invalidate_scr| 00001f20 65 65 6e 3a f4 20 53 63 72 65 65 6e 20 69 6e 76 |een:. Screen inv| 00001f30 61 6c 69 64 0d 07 12 24 20 20 20 20 20 e7 50 61 |alid...$ .Pa| 00001f40 6c 6f 6e 6f 66 66 20 8c 20 70 61 6c 25 3d 31 20 |lonoff . pal%=1 | 00001f50 8b 20 70 61 6c 25 3d 30 0d 07 1c 39 20 20 20 20 |. pal%=0...9 | 00001f60 20 c8 99 20 4f 53 53 70 6f 70 25 2c 32 2c 2c 53 | .. OSSpop%,2,,S| 00001f70 61 76 65 24 2c 70 61 6c 25 3a f4 20 53 61 76 65 |ave$,pal%:. Save| 00001f80 20 73 63 72 65 65 6e 20 69 6e 20 77 69 6e 64 6f | screen in windo| 00001f90 77 0d 07 26 33 20 20 20 20 20 ef 32 34 2c 30 3b |w..&3 .24,0;| 00001fa0 30 3b 53 63 72 57 25 3b 53 63 72 48 25 3b 3a f4 |0;ScrW%;ScrH%;:.| 00001fb0 20 52 65 73 65 74 20 73 63 72 65 65 6e 20 77 69 | Reset screen wi| 00001fc0 6e 64 6f 77 0d 07 30 09 20 20 20 20 cd 0d 07 3a |ndow..0. ...:| 00001fd0 21 20 20 20 20 f2 68 6f 75 72 5f 6f 66 66 3a f4 |! .hour_off:.| 00001fe0 20 48 6f 75 72 67 6c 61 73 73 20 6f 66 66 0d 07 | Hourglass off..| 00001ff0 44 40 20 20 20 20 70 6f 6c 6c 21 31 32 3d 70 6f |D@ poll!12=po| 00002000 6c 6c 21 38 3a 70 6f 6c 6c 21 31 36 3d 33 3a f4 |ll!8:poll!16=3:.| 00002010 20 41 6d 65 6e 64 20 64 61 74 61 20 62 6c 6f 63 | Amend data bloc| 00002020 6b 20 66 6f 72 20 44 61 74 61 4c 6f 61 64 0d 07 |k for DataLoad..| 00002030 4e 39 20 20 20 20 c8 99 20 57 53 65 6e 64 4d 73 |N9 .. WSendMs| 00002040 67 25 2c 31 38 2c 70 6f 6c 6c 3a f4 20 53 65 6e |g%,18,poll:. Sen| 00002050 64 20 44 61 74 61 4c 6f 61 64 20 6d 65 73 73 61 |d DataLoad messa| 00002060 67 65 20 62 61 63 6b 0d 07 58 28 20 20 20 20 41 |ge back..X( A| 00002070 77 61 69 74 41 63 6b 3d b9 3a f4 20 41 77 61 69 |waitAck=.:. Awai| 00002080 74 20 61 20 44 61 74 61 4c 6f 61 64 41 63 6b 0d |t a DataLoadAck.| 00002090 07 62 43 20 20 20 c9 20 33 2c 35 20 3a 20 f4 20 |.bC . 3,5 : . | 000020a0 44 61 74 61 4c 6f 61 64 2f 4f 70 65 6e 2c 20 63 |DataLoad/Open, c| 000020b0 68 65 63 6b 20 69 66 20 73 70 72 69 74 65 20 66 |heck if sprite f| 000020c0 69 6c 65 20 61 6e 64 20 6c 6f 61 64 20 69 66 20 |ile and load if | 000020d0 73 6f 0d 07 6c 20 20 20 20 20 74 79 70 65 25 3d |so..l type%=| 000020e0 70 6f 6c 6c 21 34 30 3a f4 20 46 69 6c 65 74 79 |poll!40:. Filety| 000020f0 70 65 0d 07 76 20 20 20 20 20 e7 28 74 79 70 65 |pe..v .(type| 00002100 25 3e 3d 31 29 80 28 74 79 70 65 25 3c 3d 35 29 |%>=1).(type%<=5)| 00002110 20 8c 0d 07 80 49 20 20 20 20 20 70 6f 6c 6c 21 | ....I poll!| 00002120 31 32 3d 70 6f 6c 6c 21 38 3a 70 6f 6c 6c 21 31 |12=poll!8:poll!1| 00002130 36 3d 34 3a c8 99 20 57 53 65 6e 64 4d 73 67 25 |6=4:.. WSendMsg%| 00002140 2c 31 37 2c 70 6f 6c 6c 3a f4 20 53 65 6e 64 20 |,17,poll:. Send | 00002150 44 61 74 61 4c 6f 61 64 41 63 6b 0d 07 8a 2a 20 |DataLoadAck...* | 00002160 20 20 20 20 46 69 6c 65 24 3d a4 73 74 72 69 6e | File$=.strin| 00002170 67 28 70 6f 6c 6c 2b 34 34 29 3a f4 20 46 69 6c |g(poll+44):. Fil| 00002180 65 6e 61 6d 65 0d 07 94 3a 20 20 20 20 20 c8 99 |ename...: ..| 00002190 20 22 4f 53 5f 46 69 6c 65 22 2c 31 37 2c 46 69 | "OS_File",17,Fi| 000021a0 6c 65 24 20 b8 20 2c 2c 2c 2c 46 6c 65 6e 25 3a |le$ . ,,,,Flen%:| 000021b0 f4 20 46 69 6c 65 27 73 20 6c 65 6e 67 74 68 0d |. File's length.| 000021c0 07 9e 22 20 20 20 20 20 46 69 6c 65 3d 8e 28 46 |.." File=.(F| 000021d0 69 6c 65 24 29 3a f4 20 4f 70 65 6e 20 66 69 6c |ile$):. Open fil| 000021e0 65 0d 07 a8 2f 20 20 20 20 20 e7 46 69 6c 65 3c |e.../ .File<| 000021f0 3e 30 20 8c 20 46 69 6c 65 4f 70 65 6e 3d b9 3a |>0 . FileOpen=.:| 00002200 f4 20 53 68 6f 75 6c 64 20 62 65 20 6f 70 65 6e |. Should be open| 00002210 0d 07 b2 32 20 20 20 20 20 21 66 68 61 6e 64 6c |...2 !fhandl| 00002220 65 3d 46 69 6c 65 3a 21 66 70 74 72 3d 30 3a f4 |e=File:!fptr=0:.| 00002230 20 49 6e 69 74 20 63 68 75 6e 6b 20 6c 6f 61 64 | Init chunk load| 00002240 65 72 0d 07 bc 20 20 20 20 20 20 f2 68 6f 75 72 |er... .hour| 00002250 5f 6f 6e 3a f4 20 48 6f 75 72 67 6c 61 73 73 20 |_on:. Hourglass | 00002260 6f 6e 0d 07 c6 40 20 20 20 20 20 e7 49 6d 61 67 |on...@ .Imag| 00002270 65 57 20 8c 20 f2 63 6c 6f 73 65 5f 77 69 6e 64 |eW . .close_wind| 00002280 6f 77 28 77 69 6e 5f 69 6d 67 25 29 3a f4 20 4f |ow(win_img%):. O| 00002290 6c 64 20 69 6d 61 67 65 20 64 69 73 63 61 72 64 |ld image discard| 000022a0 65 64 0d 07 d0 1e 20 20 20 20 20 49 6d 67 3d a3 |ed.... Img=.| 000022b0 3a f4 20 49 6d 61 67 65 20 69 6e 76 61 6c 69 64 |:. Image invalid| 000022c0 0d 07 da 13 20 20 20 20 20 c8 8e 20 74 79 70 65 |.... .. type| 000022d0 25 20 ca 0d 07 e4 1e 20 20 20 20 20 20 c9 20 26 |% ..... . &| 000022e0 30 30 31 20 3a 20 4f 6b 3d a4 70 69 63 5f 50 49 |001 : Ok=.pic_PI| 000022f0 31 0d 07 ee 1e 20 20 20 20 20 20 c9 20 26 30 30 |1.... . &00| 00002300 32 20 3a 20 4f 6b 3d a4 70 69 63 5f 50 49 33 0d |2 : Ok=.pic_PI3.| 00002310 07 f8 1e 20 20 20 20 20 20 c9 20 26 30 30 33 20 |... . &003 | 00002320 3a 20 4f 6b 3d a4 70 69 63 5f 49 46 46 0d 08 02 |: Ok=.pic_IFF...| 00002330 1e 20 20 20 20 20 20 c9 20 26 30 30 34 20 3a 20 |. . &004 : | 00002340 4f 6b 3d a4 70 69 63 5f 4d 41 43 0d 08 0c 1e 20 |Ok=.pic_MAC.... | 00002350 20 20 20 20 20 c9 20 26 30 30 35 20 3a 20 4f 6b | . &005 : Ok| 00002360 3d a4 70 69 63 5f 47 49 46 0d 08 16 0a 20 20 20 |=.pic_GIF.... | 00002370 20 20 cb 0d 08 20 29 20 20 20 20 20 49 6d 67 3d | ... ) Img=| 00002380 4f 6b 3a f4 20 49 6d 61 67 65 20 6f 6b 20 69 66 |Ok:. Image ok if| 00002390 20 61 6c 6c 20 69 73 20 77 65 6c 6c 0d 08 2a 22 | all is well..*"| 000023a0 20 20 20 20 20 f2 68 6f 75 72 5f 6f 66 66 3a f4 | .hour_off:.| 000023b0 20 48 6f 75 72 67 6c 61 73 73 20 6f 66 66 0d 08 | Hourglass off..| 000023c0 34 33 20 20 20 20 20 e7 46 69 6c 65 4f 70 65 6e |43 .FileOpen| 000023d0 20 8c 20 d9 23 46 69 6c 65 3a 46 69 6c 65 4f 70 | . .#File:FileOp| 000023e0 65 6e 3d a3 3a f4 20 43 6c 6f 73 65 20 66 69 6c |en=.:. Close fil| 000023f0 65 0d 08 3e 0f 20 20 20 20 20 e7 49 6d 67 20 8c |e..>. .Img .| 00002400 0d 08 48 33 20 20 20 20 20 20 f2 73 65 74 5f 70 |..H3 .set_p| 00002410 61 6c 65 74 74 65 28 31 29 3a f4 20 53 65 74 20 |alette(1):. Set | 00002420 69 6d 61 67 65 27 73 20 6f 77 6e 20 70 61 6c 65 |image's own pale| 00002430 74 74 65 0d 08 52 32 20 20 20 20 20 20 f2 6e 65 |tte..R2 .ne| 00002440 77 5f 69 6d 61 67 65 5f 77 69 6e 64 6f 77 3a f4 |w_image_window:.| 00002450 20 4f 70 65 6e 20 77 69 6e 64 6f 77 20 6f 6e 20 | Open window on | 00002460 69 6d 61 67 65 0d 08 5c 0a 20 20 20 20 20 cd 0d |image..\. ..| 00002470 08 66 09 20 20 20 20 cd 0d 08 70 2b 20 20 20 c9 |.f. ...p+ .| 00002480 20 34 20 3a 20 f4 20 44 61 74 61 4c 6f 61 64 41 | 4 : . DataLoadA| 00002490 63 6b 2c 20 63 68 65 63 6b 20 6f 72 20 69 67 6e |ck, check or ign| 000024a0 6f 72 65 0d 08 7a 41 20 20 20 20 e7 41 77 61 69 |ore..zA .Awai| 000024b0 74 41 63 6b 20 8c 20 41 77 61 69 74 41 63 6b 3d |tAck . AwaitAck=| 000024c0 a3 3a f4 20 53 75 63 63 65 73 66 75 6c 6c 79 20 |.:. Succesfully | 000024d0 72 65 63 65 69 76 65 64 20 44 61 74 61 4c 6f 61 |received DataLoa| 000024e0 64 41 63 6b 0d 08 84 23 20 20 20 c9 20 26 34 30 |dAck...# . &40| 000024f0 30 43 30 20 3a 20 f4 20 53 75 62 6d 65 6e 75 20 |0C0 : . Submenu | 00002500 77 61 72 6e 69 6e 67 0d 08 8e 49 20 20 20 20 70 |warning...I p| 00002510 6f 69 6e 74 65 72 25 3d 70 6f 6c 6c 21 32 30 3a |ointer%=poll!20:| 00002520 78 25 3d 70 6f 6c 6c 21 32 34 3a 79 25 3d 70 6f |x%=poll!24:y%=po| 00002530 6c 6c 21 32 38 3a f4 20 47 65 74 20 70 6f 69 6e |ll!28:. Get poin| 00002540 74 65 72 2f 70 72 6f 70 6f 73 65 64 20 78 2f 79 |ter/proposed x/y| 00002550 0d 08 98 47 20 20 20 20 6d 61 69 6e 5f 69 74 65 |...G main_ite| 00002560 6d 24 3d a4 73 74 72 69 6e 67 28 4d 65 6e 75 44 |m$=.string(MenuD| 00002570 61 74 61 25 28 70 6f 6c 6c 21 33 32 29 29 3a f4 |ata%(poll!32)):.| 00002580 20 57 68 69 63 68 20 69 74 65 6d 27 73 20 73 75 | Which item's su| 00002590 62 6d 65 6e 75 20 3f 0d 08 a2 17 20 20 20 20 c8 |bmenu ?.... .| 000025a0 8e 20 6d 61 69 6e 5f 69 74 65 6d 24 20 ca 0d 08 |. main_item$ ...| 000025b0 ac 3c 20 20 20 20 20 c9 20 22 53 61 76 65 20 69 |.< . "Save i| 000025c0 6d 61 67 65 22 2c 22 47 49 46 20 69 6d 61 67 65 |mage","GIF image| 000025d0 22 20 3a 20 f2 73 75 62 6d 65 6e 75 28 6d 61 69 |" : .submenu(mai| 000025e0 6e 5f 69 74 65 6d 24 2c b9 29 0d 08 b6 3e 20 20 |n_item$,.)...> | 000025f0 20 20 20 7f 20 c8 99 20 57 43 72 65 61 74 65 53 | . .. WCreateS| 00002600 4d 25 2c 2c 70 6f 69 6e 74 65 72 25 2c 78 25 2c |M%,,pointer%,x%,| 00002610 79 25 3a f4 20 4f 70 65 6e 20 73 75 62 6d 65 6e |y%:. Open submen| 00002620 75 2f 77 69 6e 64 6f 77 0d 08 c0 09 20 20 20 20 |u/window.... | 00002630 cb 0d 08 ca 42 20 20 20 c9 20 26 34 30 30 43 31 |....B . &400C1| 00002640 20 3a 20 f4 20 4d 6f 64 65 20 68 61 73 20 63 68 | : . Mode has ch| 00002650 61 6e 67 65 64 20 28 61 6e 64 20 69 74 20 6d 61 |anged (and it ma| 00002660 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 |y not have been | 00002670 6d 65 29 0d 08 d4 22 20 20 20 20 f2 6d 6f 64 65 |me)..." .mode| 00002680 5f 63 68 61 6e 67 65 28 2d 31 29 3a f4 20 54 69 |_change(-1):. Ti| 00002690 64 79 20 75 70 0d 08 de 07 20 20 cb 0d 08 e8 05 |dy up.... .....| 000026a0 cb 0d 08 f2 07 fd 20 a3 0d 08 fc 05 20 0d 09 06 |...... ..... ...| 000026b0 0d dd a4 70 69 63 5f 50 49 31 0d 09 10 1b f4 20 |...pic_PI1..... | 000026c0 4d 61 6b 65 73 20 41 74 61 72 69 20 50 49 31 20 |Makes Atari PI1 | 000026d0 69 6d 61 67 65 0d 09 1a 22 6d 6f 64 65 25 3d a4 |image..."mode%=.| 000026e0 6d 6f 64 65 28 33 32 30 2c 32 30 30 2c 31 36 2c |mode(320,200,16,| 000026f0 65 72 72 6f 72 24 29 0d 09 24 23 e7 a4 6e 65 77 |error$)..$#..new| 00002700 5f 69 6d 61 67 65 28 6d 6f 64 65 25 2c 33 32 30 |_image(mode%,320| 00002710 2c 32 30 30 29 20 8b 20 3d a3 0d 09 2e 3b c8 99 |,200) . =....;..| 00002720 20 22 4f 53 5f 47 42 50 42 22 2c 33 2c 46 69 6c | "OS_GBPB",3,Fil| 00002730 65 2c 54 69 6e 79 25 2c 33 32 2c 32 3a f4 20 52 |e,Tiny%,32,2:. R| 00002740 65 61 64 20 70 61 6c 65 74 74 65 20 66 72 6f 6d |ead palette from| 00002750 20 66 69 6c 65 0d 09 38 86 50 61 6c 65 74 74 65 | file..8.Palette| 00002760 25 28 30 29 3d 31 36 3a e3 20 63 25 3d 30 20 b8 |%(0)=16:. c%=0 .| 00002770 20 31 35 3a 76 25 3d 54 69 6e 79 25 21 28 63 25 | 15:v%=Tiny%!(c%| 00002780 2a 32 29 3a 72 25 3d 28 76 25 80 37 29 2a 33 32 |*2):r%=(v%.7)*32| 00002790 3a 67 25 3d 28 28 76 25 3e 3e 31 32 29 80 37 29 |:g%=((v%>>12).7)| 000027a0 2a 33 32 3a 62 25 3d 28 28 76 25 3e 3e 38 29 80 |*32:b%=((v%>>8).| 000027b0 37 29 2a 33 32 3a 50 61 6c 65 74 74 65 25 28 31 |7)*32:Palette%(1| 000027c0 36 2d 63 25 29 3d 28 72 25 3c 3c 31 36 29 2b 28 |6-c%)=(r%<<16)+(| 000027d0 67 25 3c 3c 38 29 2b 62 25 3a ed 0d 09 42 40 f2 |g%<<8)+b%:...B@.| 000027e0 73 63 72 65 65 6e 5f 69 6e 66 6f 28 22 41 74 61 |screen_info("Ata| 000027f0 72 69 20 50 49 31 22 2c 33 32 30 2c 32 30 30 2c |ri PI1",320,200,| 00002800 31 36 2c 6d 6f 64 65 25 2c 22 22 2c 22 22 2c 26 |16,mode%,"","",&| 00002810 37 44 30 30 2c 26 37 44 30 30 29 0d 09 4c 3b 21 |7D00,&7D00)..L;!| 00002820 66 70 74 72 3d 26 32 32 3a f2 64 69 73 70 6c 61 |fptr=&22:.displa| 00002830 79 28 75 6e 70 61 63 6b 5f 50 49 31 2c 6d 6f 64 |y(unpack_PI1,mod| 00002840 65 25 29 3a f4 20 55 6e 70 61 63 6b 20 74 6f 20 |e%):. Unpack to | 00002850 73 70 72 69 74 65 0d 09 56 17 f2 73 65 74 5f 6d |sprite..V..set_m| 00002860 6f 64 65 28 6d 6f 64 65 25 29 3a 3d b9 0d 09 60 |ode(mode%):=...`| 00002870 05 20 0d 09 6a 0d dd a4 70 69 63 5f 50 49 33 0d |. ..j...pic_PI3.| 00002880 09 74 1b f4 20 4d 61 6b 65 73 20 41 74 61 72 69 |.t.. Makes Atari| 00002890 20 50 49 33 20 69 6d 61 67 65 0d 09 7e 21 6d 6f | PI3 image..~!mo| 000028a0 64 65 25 3d a4 6d 6f 64 65 28 36 34 30 2c 34 30 |de%=.mode(640,40| 000028b0 30 2c 32 2c 65 72 72 6f 72 24 29 0d 09 88 23 e7 |0,2,error$)...#.| 000028c0 a4 6e 65 77 5f 69 6d 61 67 65 28 6d 6f 64 65 25 |.new_image(mode%| 000028d0 2c 36 34 30 2c 34 30 30 29 20 8b 20 3d a3 0d 09 |,640,400) . =...| 000028e0 92 41 50 61 6c 65 74 74 65 25 28 30 29 3d 32 3a |.APalette%(0)=2:| 000028f0 50 61 6c 65 74 74 65 25 28 31 29 3d 30 3a 50 61 |Palette%(1)=0:Pa| 00002900 6c 65 74 74 65 25 28 32 29 3d 26 46 46 46 46 46 |lette%(2)=&FFFFF| 00002910 46 3a f4 20 53 65 74 20 70 61 6c 65 74 74 65 0d |F:. Set palette.| 00002920 09 9c 3f f2 73 63 72 65 65 6e 5f 69 6e 66 6f 28 |..?.screen_info(| 00002930 22 41 74 61 72 69 20 50 49 33 22 2c 36 34 30 2c |"Atari PI3",640,| 00002940 34 30 30 2c 32 2c 6d 6f 64 65 25 2c 22 22 2c 22 |400,2,mode%,"","| 00002950 22 2c 26 37 44 30 30 2c 26 37 44 30 30 29 0d 09 |",&7D00,&7D00)..| 00002960 a6 3b 21 66 70 74 72 3d 26 32 32 3a f2 64 69 73 |.;!fptr=&22:.dis| 00002970 70 6c 61 79 28 75 6e 70 61 63 6b 5f 50 49 33 2c |play(unpack_PI3,| 00002980 6d 6f 64 65 25 29 3a f4 20 55 6e 70 61 63 6b 20 |mode%):. Unpack | 00002990 74 6f 20 73 70 72 69 74 65 0d 09 b0 17 f2 73 65 |to sprite.....se| 000029a0 74 5f 6d 6f 64 65 28 6d 6f 64 65 25 29 3a 3d b9 |t_mode(mode%):=.| 000029b0 0d 09 ba 05 20 0d 09 c4 0d dd a4 70 69 63 5f 4d |.... ......pic_M| 000029c0 41 43 0d 09 ce 24 f4 20 4d 61 6b 65 73 20 4d 61 |AC...$. Makes Ma| 000029d0 63 49 6e 74 6f 73 68 20 4d 61 63 50 61 69 6e 74 |cIntosh MacPaint| 000029e0 20 69 6d 61 67 65 0d 09 d8 21 6d 6f 64 65 25 3d | image...!mode%=| 000029f0 a4 6d 6f 64 65 28 35 37 36 2c 35 31 32 2c 32 2c |.mode(576,512,2,| 00002a00 65 72 72 6f 72 24 29 0d 09 e2 23 e7 a4 6e 65 77 |error$)...#..new| 00002a10 5f 69 6d 61 67 65 28 6d 6f 64 65 25 2c 35 37 36 |_image(mode%,576| 00002a20 2c 37 32 30 29 20 8b 20 3d a3 0d 09 ec 41 50 61 |,720) . =....APa| 00002a30 6c 65 74 74 65 25 28 30 29 3d 32 3a 50 61 6c 65 |lette%(0)=2:Pale| 00002a40 74 74 65 25 28 31 29 3d 30 3a 50 61 6c 65 74 74 |tte%(1)=0:Palett| 00002a50 65 25 28 32 29 3d 26 46 46 46 46 46 46 3a f4 20 |e%(2)=&FFFFFF:. | 00002a60 53 65 74 20 70 61 6c 65 74 74 65 0d 09 f6 5f f2 |Set palette..._.| 00002a70 73 63 72 65 65 6e 5f 69 6e 66 6f 28 22 4d 61 63 |screen_info("Mac| 00002a80 49 6e 74 6f 73 68 20 4d 61 63 50 61 69 6e 74 22 |Intosh MacPaint"| 00002a90 2c 35 37 36 2c 37 32 30 2c 32 2c 6d 6f 64 65 25 |,576,720,2,mode%| 00002aa0 2c 22 52 65 70 65 61 74 65 64 20 62 79 74 65 22 |,"Repeated byte"| 00002ab0 2c 22 22 2c 46 6c 65 6e 25 2d 36 34 30 2c 28 35 |,"",Flen%-640,(5| 00002ac0 37 36 2a 37 32 30 29 81 38 29 0d 0a 00 3b 21 66 |76*720).8)...;!f| 00002ad0 70 74 72 3d 36 34 30 3a f2 64 69 73 70 6c 61 79 |ptr=640:.display| 00002ae0 28 75 6e 70 61 63 6b 5f 4d 41 43 2c 6d 6f 64 65 |(unpack_MAC,mode| 00002af0 25 29 3a f4 20 55 6e 70 61 63 6b 20 74 6f 20 73 |%):. Unpack to s| 00002b00 70 72 69 74 65 0d 0a 0a 17 f2 73 65 74 5f 6d 6f |prite.....set_mo| 00002b10 64 65 28 6d 6f 64 65 25 29 3a 3d b9 0d 0a 14 05 |de(mode%):=.....| 00002b20 20 0d 0a 1e 0d dd a4 70 69 63 5f 49 46 46 0d 0a | ......pic_IFF..| 00002b30 28 1b f4 20 4d 61 6b 65 73 20 41 6d 69 67 61 20 |(.. Makes Amiga | 00002b40 49 46 46 20 69 6d 61 67 65 0d 0a 32 25 62 6d 68 |IFF image..2%bmh| 00002b50 64 3d a3 3a 63 6d 61 70 3d a3 3a 62 6f 64 79 3d |d=.:cmap=.:body=| 00002b60 a3 3a f4 20 49 6e 69 74 20 66 6c 61 67 73 0d 0a |.:. Init flags..| 00002b70 3c 32 68 61 6d 3d a3 3a 6c 61 63 65 3d a3 3a 68 |<2ham=.:lace=.:h| 00002b80 69 72 65 73 3d a3 3a 68 61 6c 66 62 72 69 67 68 |ires=.:halfbrigh| 00002b90 74 3d a3 3a f4 20 49 6e 69 74 20 66 6c 61 67 73 |t=.:. Init flags| 00002ba0 0d 0a 46 2b 77 54 79 70 65 25 3d 31 3a f4 20 53 |..F+wType%=1:. S| 00002bb0 65 74 20 68 69 67 68 2d 74 6f 2d 6c 6f 77 20 74 |et high-to-low t| 00002bc0 79 70 65 20 6f 66 20 64 61 74 61 0d 0a 50 32 f4 |ype of data..P2.| 00002bd0 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 | Check if this i| 00002be0 73 20 61 20 73 74 61 6e 64 61 72 64 20 49 46 46 |s a standard IFF| 00002bf0 20 70 69 63 74 75 72 65 20 66 69 6c 65 0d 0a 5a | picture file..Z| 00002c00 83 66 6f 72 6d 24 3d a4 69 73 74 72 69 6e 67 28 |.form$=.istring(| 00002c10 34 29 3a f2 73 6b 69 70 28 34 29 3a 66 6f 72 6d |4):.skip(4):form| 00002c20 24 2b 3d a4 69 73 74 72 69 6e 67 28 34 29 3a e7 |$+=.istring(4):.| 00002c30 66 6f 72 6d 24 3c 3e 22 46 4f 52 4d 49 4c 42 4d |form$<>"FORMILBM| 00002c40 22 20 8c 20 f2 65 72 72 6f 72 28 2d 31 2c 22 54 |" . .error(-1,"T| 00002c50 68 69 73 20 73 63 72 65 65 6e 20 66 69 6c 65 20 |his screen file | 00002c60 69 73 20 6e 6f 74 20 61 6e 20 49 46 46 20 73 63 |is not an IFF sc| 00002c70 72 65 65 6e 20 66 69 6c 65 20 21 22 29 3a 3d a3 |reen file !"):=.| 00002c80 0d 0a 64 29 f5 20 f4 20 46 6f 6c 6c 6f 77 20 42 |..d). . Follow B| 00002c90 4d 48 44 2c 43 4d 41 50 20 61 6e 64 20 42 4f 44 |MHD,CMAP and BOD| 00002ca0 59 20 68 65 61 64 65 72 73 0d 0a 6e 30 68 65 61 |Y headers..n0hea| 00002cb0 64 24 3d a4 69 73 74 72 69 6e 67 28 34 29 3a 68 |d$=.istring(4):h| 00002cc0 6c 65 6e 25 3d a4 77 34 3a 73 74 61 72 74 70 74 |len%=.w4:startpt| 00002cd0 72 25 3d 8f 23 46 69 6c 65 0d 0a 78 0e c8 8e 20 |r%=.#File..x... | 00002ce0 68 65 61 64 24 20 ca 0d 0a 82 26 20 c9 20 22 42 |head$ ....& . "B| 00002cf0 4d 48 44 22 20 3a 20 62 6d 68 64 3d b9 3a f4 20 |MHD" : bmhd=.:. | 00002d00 42 69 74 6d 61 70 20 68 65 61 64 65 72 0d 0a 8c |Bitmap header...| 00002d10 3d 20 20 20 20 20 20 20 f4 20 52 65 61 64 20 70 |= . Read p| 00002d20 69 63 74 75 72 65 2f 73 63 72 65 65 6e 20 77 69 |icture/screen wi| 00002d30 64 74 68 2c 20 68 65 69 67 68 74 2c 20 63 6f 6c |dth, height, col| 00002d40 6f 75 72 73 2c 20 65 74 63 2e 0d 0a 96 3f 20 20 |ours, etc....? | 00002d50 20 20 20 20 20 77 69 64 74 68 25 3d a4 77 32 3a | width%=.w2:| 00002d60 68 65 69 67 68 74 25 3d a4 77 32 3a f2 73 6b 69 |height%=.w2:.ski| 00002d70 70 28 34 29 3a 70 6c 61 6e 65 73 25 3d a4 77 31 |p(4):planes%=.w1| 00002d80 3a f2 73 6b 69 70 28 31 29 0d 0a a0 41 20 20 20 |:.skip(1)...A | 00002d90 20 20 20 20 63 6f 6d 70 72 65 73 73 65 64 3d 28 | compressed=(| 00002da0 a4 77 31 3d 31 29 3a f2 73 6b 69 70 28 35 29 3a |.w1=1):.skip(5):| 00002db0 73 5f 77 69 64 74 68 25 3d a4 77 32 3a 73 5f 68 |s_width%=.w2:s_h| 00002dc0 65 69 67 68 74 25 3d a4 77 32 0d 0a aa 3d 20 c9 |eight%=.w2...= .| 00002dd0 20 22 43 41 4d 47 22 20 3a 20 66 6c 61 67 73 25 | "CAMG" : flags%| 00002de0 3d a4 77 34 3a f4 20 47 65 74 20 66 6c 61 67 20 |=.w4:. Get flag | 00002df0 62 69 74 73 2c 20 73 65 74 20 66 6c 61 67 73 20 |bits, set flags | 00002e00 66 72 6f 6d 20 69 74 0d 0a b4 35 20 20 20 20 20 |from it...5 | 00002e10 20 20 68 61 6d 3d 28 28 66 6c 61 67 73 25 80 26 | ham=((flags%.&| 00002e20 38 30 30 29 3e 30 29 3a 6c 61 63 65 3d 28 28 66 |800)>0):lace=((f| 00002e30 6c 61 67 73 25 80 26 34 29 3e 30 29 0d 0a be 3f |lags%.&4)>0)...?| 00002e40 20 20 20 20 20 20 20 68 69 72 65 73 3d 28 28 66 | hires=((f| 00002e50 6c 61 67 73 25 80 26 38 30 30 30 29 3e 30 29 3a |lags%.&8000)>0):| 00002e60 68 61 6c 66 62 72 69 67 68 74 3d 28 28 66 6c 61 |halfbright=((fla| 00002e70 67 73 25 80 26 38 30 29 3e 30 29 0d 0a c8 2d 20 |gs%.&80)>0)...- | 00002e80 c9 20 22 43 4d 41 50 22 20 3a 20 63 6d 61 70 3d |. "CMAP" : cmap=| 00002e90 b9 3a f4 20 43 6f 6c 6f 75 72 20 6d 61 70 20 28 |.:. Colour map (| 00002ea0 70 61 6c 65 74 74 65 29 0d 0a d2 42 20 20 20 20 |palette)...B | 00002eb0 20 20 20 70 61 6c 64 65 66 73 25 3d 68 6c 65 6e | paldefs%=hlen| 00002ec0 25 81 33 3a f4 20 4e 75 6d 62 65 72 20 6f 66 20 |%.3:. Number of | 00002ed0 70 61 6c 65 74 74 65 20 63 6f 6c 6f 75 72 20 64 |palette colour d| 00002ee0 65 66 69 6e 69 74 69 6f 6e 73 0d 0a dc 33 20 20 |efinitions...3 | 00002ef0 20 20 20 20 20 e3 20 5f 25 3d 30 20 b8 20 70 61 | . _%=0 . pa| 00002f00 6c 64 65 66 73 25 2d 31 3a 50 61 6c 65 74 74 65 |ldefs%-1:Palette| 00002f10 25 28 5f 25 2b 31 29 3d a4 77 33 3a ed 0d 0a e6 |%(_%+1)=.w3:....| 00002f20 24 20 c9 20 22 42 4f 44 59 22 20 3a 20 62 6f 64 |$ . "BODY" : bod| 00002f30 79 3d b9 3a f4 20 53 63 72 65 65 6e 20 64 61 74 |y=.:. Screen dat| 00002f40 61 0d 0a f0 29 20 20 20 20 20 20 20 f4 20 43 68 |a...) . Ch| 00002f50 65 63 6b 20 69 66 20 61 6c 6c 20 70 61 72 74 73 |eck if all parts| 00002f60 20 61 72 65 20 74 68 65 72 65 0d 0a fa be 20 20 | are there.... | 00002f70 20 20 20 20 20 e7 ac 62 6d 68 64 20 8c 20 f2 65 | ..bmhd . .e| 00002f80 72 72 6f 72 28 2d 31 2c 22 49 46 46 20 65 72 72 |rror(-1,"IFF err| 00002f90 6f 72 20 3a 20 49 20 64 69 64 20 6e 6f 74 20 66 |or : I did not f| 00002fa0 69 6e 64 20 61 20 27 42 4d 48 44 27 20 62 6c 6f |ind a 'BMHD' blo| 00002fb0 63 6b 2e 20 43 61 6e 6e 6f 74 20 70 72 6f 63 65 |ck. Cannot proce| 00002fc0 65 64 20 21 22 29 3a fd 20 b9 3a 3d a3 20 8b 20 |ed !"):. .:=. . | 00002fd0 e7 ac 63 6d 61 70 20 8c 20 f2 65 72 72 6f 72 28 |..cmap . .error(| 00002fe0 2d 31 2c 22 49 46 46 20 65 72 72 6f 72 20 3a 20 |-1,"IFF error : | 00002ff0 49 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 |I did not find a| 00003000 20 27 43 4d 41 50 27 20 62 6c 6f 63 6b 2e 20 43 | 'CMAP' block. C| 00003010 61 6e 6e 6f 74 20 70 72 6f 63 65 65 64 20 21 22 |annot proceed !"| 00003020 29 3a fd 20 b9 3a 3d a3 0d 0b 04 36 20 20 20 20 |):. .:=....6 | 00003030 20 20 20 f4 20 44 65 74 65 72 6d 69 6e 65 20 73 | . Determine s| 00003040 75 69 74 61 62 6c 65 20 41 72 63 68 69 6d 65 64 |uitable Archimed| 00003050 65 73 20 73 63 72 65 65 6e 20 6d 6f 64 65 0d 0b |es screen mode..| 00003060 0e 88 20 20 20 20 20 20 20 e7 68 61 6d 20 8c 20 |.. .ham . | 00003070 63 6f 6c 6f 75 72 73 25 3d 31 36 3a 6d 6f 64 65 |colours%=16:mode| 00003080 25 3d a4 6d 6f 64 65 28 36 34 30 2c 73 5f 68 65 |%=.mode(640,s_he| 00003090 69 67 68 74 25 2c 32 35 36 2c 65 72 72 6f 72 24 |ight%,256,error$| 000030a0 29 20 8b 20 63 6f 6c 6f 75 72 73 25 3d 32 5e 70 |) . colours%=2^p| 000030b0 6c 61 6e 65 73 25 3a 6d 6f 64 65 25 3d a4 6d 6f |lanes%:mode%=.mo| 000030c0 64 65 28 73 5f 77 69 64 74 68 25 2c 73 5f 68 65 |de(s_width%,s_he| 000030d0 69 67 68 74 25 2c 63 6f 6c 6f 75 72 73 25 2c 65 |ight%,colours%,e| 000030e0 72 72 6f 72 24 29 0d 0b 18 2e 20 20 20 20 20 20 |rror$).... | 000030f0 20 e7 6d 6f 64 65 25 3c 30 20 8c 20 f2 65 72 72 | .mode%<0 . .err| 00003100 6f 72 28 2d 31 2c 65 72 72 6f 72 24 29 3a fd 20 |or(-1,error$):. | 00003110 b9 3a 3d a3 0d 0b 22 2d 20 20 20 20 20 20 20 63 |.:=..."- c| 00003120 6f 6d 70 72 24 3d 22 22 3a 69 6e 66 6f 24 3d 22 |ompr$="":info$="| 00003130 22 3a 73 63 6f 6c 73 25 3d 63 6f 6c 6f 75 72 73 |":scols%=colours| 00003140 25 0d 0b 2c 2f 20 20 20 20 20 20 20 e7 63 6f 6d |%..,/ .com| 00003150 70 72 65 73 73 65 64 20 8c 20 63 6f 6d 70 72 24 |pressed . compr$| 00003160 3d 22 52 65 70 65 61 74 65 64 20 62 79 74 65 22 |="Repeated byte"| 00003170 0d 0b 36 79 20 20 20 20 20 20 20 e7 68 61 6d 20 |..6y .ham | 00003180 8c 20 73 63 6f 6c 73 25 3d 34 30 39 36 3a 69 6e |. scols%=4096:in| 00003190 66 6f 24 3d 22 50 69 63 74 75 72 65 20 6d 6f 64 |fo$="Picture mod| 000031a0 65 7c 48 6f 6c 64 20 41 6e 64 20 4d 6f 64 69 66 |e|Hold And Modif| 000031b0 79 20 28 48 41 4d 29 22 20 8b 20 e7 68 61 6c 66 |y (HAM)" . .half| 000031c0 62 72 69 67 68 74 20 8c 20 69 6e 66 6f 24 3d 22 |bright . info$="| 000031d0 50 69 63 74 75 72 65 20 6d 6f 64 65 7c 48 61 6c |Picture mode|Hal| 000031e0 66 2d 62 72 69 67 68 74 22 0d 0b 40 5d 20 20 20 |f-bright"..@] | 000031f0 20 20 20 20 e7 68 61 6d 20 8c 20 6f 6b 3d a4 6e | .ham . ok=.n| 00003200 65 77 5f 69 6d 61 67 65 28 6d 6f 64 65 25 2c 77 |ew_image(mode%,w| 00003210 69 64 74 68 25 2a 32 2c 68 65 69 67 68 74 25 29 |idth%*2,height%)| 00003220 20 8b 20 6f 6b 3d a4 6e 65 77 5f 69 6d 61 67 65 | . ok=.new_image| 00003230 28 6d 6f 64 65 25 2c 77 69 64 74 68 25 2c 68 65 |(mode%,width%,he| 00003240 69 67 68 74 25 29 0d 0b 4a 13 20 20 20 20 20 20 |ight%)..J. | 00003250 20 e7 6f 6b 20 8b 20 3d a3 0d 0b 54 77 20 20 20 | .ok . =...Tw | 00003260 20 20 20 20 f2 73 63 72 65 65 6e 5f 69 6e 66 6f | .screen_info| 00003270 28 22 41 6d 69 67 61 20 49 46 46 22 2c 77 69 64 |("Amiga IFF",wid| 00003280 74 68 25 2c 68 65 69 67 68 74 25 2c 73 63 6f 6c |th%,height%,scol| 00003290 73 25 2c 6d 6f 64 65 25 2c 63 6f 6d 70 72 24 2c |s%,mode%,compr$,| 000032a0 69 6e 66 6f 24 2c 46 6c 65 6e 25 2d 28 8f 23 46 |info$,Flen%-(.#F| 000032b0 69 6c 65 29 2c 28 77 69 64 74 68 25 2a 68 65 69 |ile),(width%*hei| 000032c0 67 68 74 25 2a 70 6c 61 6e 65 73 25 29 81 38 29 |ght%*planes%).8)| 000032d0 0d 0b 5e 39 20 20 20 20 20 20 20 f4 20 53 65 74 |..^9 . Set| 000032e0 20 73 65 63 6f 6e 64 20 68 61 6c 66 20 6f 66 20 | second half of | 000032f0 68 61 6c 66 62 72 69 67 68 74 20 6d 6f 64 65 27 |halfbright mode'| 00003300 73 20 70 61 6c 65 74 74 65 0d 0b 68 18 20 20 20 |s palette..h. | 00003310 20 20 20 20 e7 68 61 6c 66 62 72 69 67 68 74 20 | .halfbright | 00003320 8c 0d 0b 72 3f 20 20 20 20 20 20 20 20 68 61 6c |...r? hal| 00003330 66 25 3d 63 6f 6c 6f 75 72 73 25 81 32 3a f4 20 |f%=colours%.2:. | 00003340 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 6f 75 72 |Number of colour| 00003350 73 20 69 6e 20 73 65 63 6f 6e 64 20 68 61 6c 66 |s in second half| 00003360 0d 0b 7c 1a 20 20 20 20 20 20 20 20 e3 20 63 25 |..|. . c%| 00003370 3d 31 20 b8 20 68 61 6c 66 25 0d 0b 86 46 20 20 |=1 . half%...F | 00003380 20 20 20 20 20 20 50 61 6c 65 74 74 65 25 28 63 | Palette%(c| 00003390 25 2b 68 61 6c 66 25 29 3d 28 50 61 6c 65 74 74 |%+half%)=(Palett| 000033a0 65 25 28 63 25 29 80 26 45 30 45 30 45 30 29 3e |e%(c%).&E0E0E0)>| 000033b0 3e 31 3a f4 20 48 61 6c 66 20 62 72 69 67 68 74 |>1:. Half bright| 000033c0 0d 0b 90 0d 20 20 20 20 20 20 20 20 ed 0d 0b 9a |.... ....| 000033d0 0c 20 20 20 20 20 20 20 cd 0d 0b a4 41 20 20 20 |. ....A | 000033e0 20 20 20 20 f4 20 53 65 74 20 75 70 20 70 61 6c | . Set up pal| 000033f0 65 74 74 65 20 64 61 74 61 20 66 6f 72 20 48 41 |ette data for HA| 00003400 4d 20 6d 6f 64 65 20 61 6e 64 20 70 61 6c 65 74 |M mode and palet| 00003410 74 65 20 65 6e 74 72 69 65 73 0d 0b ae 97 20 20 |te entries.... | 00003420 20 20 20 20 20 e7 68 61 6d 20 8c 20 e3 20 63 25 | .ham . . c%| 00003430 3d 30 20 b8 20 31 35 3a 70 25 3d 50 61 6c 65 74 |=0 . 15:p%=Palet| 00003440 74 65 25 28 63 25 2b 31 29 3a 68 61 6d 63 6f 6c |te%(c%+1):hamcol| 00003450 73 21 28 63 25 2a 34 29 3d 28 28 70 25 80 26 46 |s!(c%*4)=((p%.&F| 00003460 30 30 30 30 30 29 3e 3e 31 32 29 2b 28 28 70 25 |00000)>>12)+((p%| 00003470 80 26 46 30 30 30 29 3e 3e 38 29 2b 28 28 70 25 |.&F000)>>8)+((p%| 00003480 80 26 46 30 29 3e 3e 34 29 3a ed 3a 50 61 6c 65 |.&F0)>>4):.:Pale| 00003490 74 74 65 25 28 30 29 3d 2d 31 20 8b 20 50 61 6c |tte%(0)=-1 . Pal| 000034a0 65 74 74 65 25 28 30 29 3d 63 6f 6c 6f 75 72 73 |ette%(0)=colours| 000034b0 25 0d 0b b8 46 20 20 20 20 20 20 20 21 66 70 74 |%...F !fpt| 000034c0 72 3d 8f 23 46 69 6c 65 3a 21 70 69 78 62 69 74 |r=.#File:!pixbit| 000034d0 73 3d 70 6c 61 6e 65 73 25 3a 21 77 69 64 74 68 |s=planes%:!width| 000034e0 3d 77 69 64 74 68 25 3a 21 68 65 69 67 68 74 3d |=width%:!height=| 000034f0 68 65 69 67 68 74 25 0d 0b c2 39 20 20 20 20 20 |height%...9 | 00003500 20 20 21 63 6f 6d 70 72 3d 63 6f 6d 70 72 65 73 | !compr=compres| 00003510 73 65 64 3a e7 68 61 6d 20 8c 20 21 73 63 74 79 |sed:.ham . !scty| 00003520 70 65 3d 31 20 8b 20 21 73 63 74 79 70 65 3d 30 |pe=1 . !sctype=0| 00003530 0d 0b cc 38 20 20 20 20 20 20 20 f2 64 69 73 70 |...8 .disp| 00003540 6c 61 79 28 75 6e 70 61 63 6b 5f 49 46 46 2c 6d |lay(unpack_IFF,m| 00003550 6f 64 65 25 29 3a f4 20 55 6e 70 61 63 6b 20 74 |ode%):. Unpack t| 00003560 6f 20 73 70 72 69 74 65 0d 0b d6 1b 20 20 20 20 |o sprite.... | 00003570 20 20 20 f2 73 65 74 5f 6d 6f 64 65 28 6d 6f 64 | .set_mode(mod| 00003580 65 25 29 0d 0b e0 05 cb 0d 0b ea 36 f2 73 6b 69 |e%)........6.ski| 00003590 70 28 68 6c 65 6e 25 2d 28 28 8f 23 46 69 6c 65 |p(hlen%-((.#File| 000035a0 29 2d 73 74 61 72 74 70 74 72 25 29 29 3a f4 20 |)-startptr%)):. | 000035b0 54 6f 20 6e 65 78 74 20 68 65 61 64 65 72 0d 0b |To next header..| 000035c0 f4 0a fd 20 62 6f 64 79 0d 0b fe 06 3d b9 0d 0c |... body....=...| 000035d0 08 05 20 0d 0c 12 13 dd a4 69 73 74 72 69 6e 67 |.. ......istring| 000035e0 28 6c 65 6e 25 29 0d 0c 1c 23 f4 20 52 65 74 75 |(len%)...#. Retu| 000035f0 72 6e 73 20 73 74 72 69 6e 67 20 6f 66 20 6c 65 |rns string of le| 00003600 6e 67 74 68 20 6c 65 6e 25 0d 0c 26 0b ea 20 5f |ngth len%..&.. _| 00003610 25 2c 5f 24 0d 0c 30 2b 5f 24 3d 22 22 3a e3 20 |%,_$..0+_$="":. | 00003620 5f 25 3d 31 20 b8 20 6c 65 6e 25 3a 5f 24 2b 3d |_%=1 . len%:_$+=| 00003630 bd 28 9a 23 46 69 6c 65 29 3a ed 3a 3d 5f 24 0d |.(.#File):.:=_$.| 00003640 0c 3a 05 20 0d 0c 44 13 dd f2 73 6b 69 70 28 61 |.:. ..D...skip(a| 00003650 6d 6f 75 6e 74 25 29 0d 0c 4e 19 f4 20 53 6b 69 |mount%)..N.. Ski| 00003660 70 73 20 61 6d 6f 75 6e 74 25 20 62 79 74 65 73 |ps amount% bytes| 00003670 0d 0c 58 19 cf 23 46 69 6c 65 3d 61 6d 6f 75 6e |..X..#File=amoun| 00003680 74 25 2b 8f 23 46 69 6c 65 0d 0c 62 05 e1 0d 0c |t%+.#File..b....| 00003690 6c 05 20 0d 0c 76 0f dd a4 77 31 3a 3d a4 77 28 |l. ..v...w1:=.w(| 000036a0 31 29 0d 0c 80 0f dd a4 77 32 3a 3d a4 77 28 32 |1)......w2:=.w(2| 000036b0 29 0d 0c 8a 0f dd a4 77 33 3a 3d a4 77 28 33 29 |)......w3:=.w(3)| 000036c0 0d 0c 94 0f dd a4 77 34 3a 3d a4 77 28 34 29 0d |......w4:=.w(4).| 000036d0 0c 9e 05 20 0d 0c a8 0d dd a4 77 28 6c 65 6e 25 |... ......w(len%| 000036e0 29 0d 0c b2 1d f4 20 52 65 74 75 72 6e 73 20 6c |)..... Returns l| 000036f0 65 6e 25 2d 62 79 74 65 20 76 61 6c 75 65 0d 0c |en%-byte value..| 00003700 bc 0c ea 20 5f 25 2c 5f 72 25 0d 0c c6 17 5f 72 |... _%,_r%...._r| 00003710 25 3d 30 3a e3 20 5f 25 3d 31 20 b8 20 6c 65 6e |%=0:. _%=1 . len| 00003720 25 0d 0c d0 0f c8 8e 20 77 54 79 70 65 25 20 ca |%...... wType% .| 00003730 0d 0c da 24 20 c9 20 30 20 3a 20 5f 72 25 2b 3d |...$ . 0 : _r%+=| 00003740 28 28 9a 23 46 69 6c 65 29 3c 3c 28 5f 25 2d 31 |((.#File)<<(_%-1| 00003750 29 2a 38 29 0d 0c e4 1e 20 c9 20 31 20 3a 20 5f |)*8).... . 1 : _| 00003760 72 25 3d 28 5f 72 25 3c 3c 38 29 2b 9a 23 46 69 |r%=(_r%<<8)+.#Fi| 00003770 6c 65 0d 0c ee 07 cb 3a ed 0d 0c f8 08 3d 5f 72 |le.....:.....=_r| 00003780 25 0d 0d 02 05 20 0d 0d 0c 0d dd a4 70 69 63 5f |%.... ......pic_| 00003790 47 49 46 0d 0d 16 33 f4 20 4d 61 6b 65 73 20 47 |GIF...3. Makes G| 000037a0 49 46 20 28 47 72 61 70 68 69 63 73 20 49 6e 74 |IF (Graphics Int| 000037b0 65 72 63 68 61 6e 67 65 20 46 6f 72 6d 61 74 29 |erchange Format)| 000037c0 20 69 6d 61 67 65 0d 0d 20 28 ea 20 67 5f 50 61 | image.. (. g_Pa| 000037d0 6c 65 74 74 65 25 28 29 2c 50 69 63 5f 70 74 72 |lette%(),Pic_ptr| 000037e0 25 28 29 2c 50 69 63 5f 6c 65 6e 25 28 29 0d 0d |%(),Pic_len%()..| 000037f0 2a 31 de 20 67 5f 50 61 6c 65 74 74 65 25 28 32 |*1. g_Palette%(2| 00003800 35 36 29 2c 50 69 63 5f 70 74 72 25 28 32 35 36 |56),Pic_ptr%(256| 00003810 29 2c 50 69 63 5f 6c 65 6e 25 28 32 35 36 29 0d |),Pic_len%(256).| 00003820 0d 34 2b 77 54 79 70 65 25 3d 30 3a f4 20 53 65 |.4+wType%=0:. Se| 00003830 74 20 6c 6f 77 2d 74 6f 5f 68 69 67 68 20 74 79 |t low-to_high ty| 00003840 70 65 20 6f 66 20 64 61 74 61 0d 0d 3e 2f 73 69 |pe of data..>/si| 00003850 67 6e 61 74 75 72 65 24 3d a4 69 73 74 72 69 6e |gnature$=.istrin| 00003860 67 28 36 29 3a f4 20 52 65 61 64 20 47 49 46 20 |g(6):. Read GIF | 00003870 73 69 67 6e 61 74 75 72 65 0d 0d 48 58 e7 c0 73 |signature..HX..s| 00003880 69 67 6e 61 74 75 72 65 24 2c 33 29 3c 3e 22 47 |ignature$,3)<>"G| 00003890 49 46 22 20 8c 20 f2 65 72 72 6f 72 28 2d 31 2c |IF" . .error(-1,| 000038a0 22 54 68 69 73 20 73 63 72 65 65 6e 20 66 69 6c |"This screen fil| 000038b0 65 20 69 73 20 6e 6f 74 20 61 20 47 49 46 20 73 |e is not a GIF s| 000038c0 63 72 65 65 6e 20 66 69 6c 65 20 21 22 29 3a 3d |creen file !"):=| 000038d0 a3 0d 0d 52 24 f4 20 52 65 61 64 20 64 61 74 61 |...R$. Read data| 000038e0 20 69 6e 20 53 63 72 65 65 6e 20 44 65 73 63 72 | in Screen Descr| 000038f0 69 70 74 6f 72 0d 0d 5c 3e 72 5f 77 69 64 74 68 |iptor..\>r_width| 00003900 25 3d a4 77 32 3a 72 5f 68 65 69 67 68 74 25 3d |%=.w2:r_height%=| 00003910 a4 77 32 3a 66 6c 61 67 73 25 3d a4 77 31 3a 62 |.w2:flags%=.w1:b| 00003920 61 63 6b 67 72 25 3d a4 77 31 3a f2 73 6b 69 70 |ackgr%=.w1:.skip| 00003930 28 31 29 0d 0d 66 3b 67 6c 6f 62 61 6c 3d 28 28 |(1)..f;global=((| 00003940 66 6c 61 67 73 25 80 26 38 30 29 3e 30 29 3a f4 |flags%.&80)>0):.| 00003950 20 47 6c 6f 62 61 6c 20 63 6f 6c 6f 75 72 20 6d | Global colour m| 00003960 61 70 20 66 6f 6c 6c 6f 77 69 6e 67 20 3f 0d 0d |ap following ?..| 00003970 70 33 67 5f 70 69 78 62 69 74 73 25 3d 28 66 6c |p3g_pixbits%=(fl| 00003980 61 67 73 25 80 37 29 2b 31 3a f4 20 47 6c 6f 62 |ags%.7)+1:. Glob| 00003990 61 6c 20 62 69 74 73 20 70 65 72 20 70 69 78 65 |al bits per pixe| 000039a0 6c 0d 0d 7a 3a 63 6f 6c 62 69 74 73 25 3d 28 28 |l..z:colbits%=((| 000039b0 66 6c 61 67 73 25 3e 3e 34 29 80 37 29 2b 31 3a |flags%>>4).7)+1:| 000039c0 f4 20 42 69 74 73 20 6f 66 20 63 6f 6c 6f 75 72 |. Bits of colour| 000039d0 20 72 65 73 6f 6c 75 74 69 6f 6e 0d 0d 84 0d e7 | resolution.....| 000039e0 67 6c 6f 62 61 6c 20 8c 0d 0d 8e 25 20 f4 20 52 |global ....% . R| 000039f0 65 61 64 20 47 6c 6f 62 61 6c 20 43 6f 6c 6f 75 |ead Global Colou| 00003a00 72 20 4d 61 70 20 70 61 6c 65 74 74 65 0d 0d 98 |r Map palette...| 00003a10 42 20 e3 20 63 25 3d 31 20 b8 20 32 5e 67 5f 70 |B . c%=1 . 2^g_p| 00003a20 69 78 62 69 74 73 25 3a 67 5f 50 61 6c 65 74 74 |ixbits%:g_Palett| 00003a30 65 25 28 63 25 29 3d 28 a4 77 31 3c 3c 31 36 29 |e%(c%)=(.w1<<16)| 00003a40 2b 28 a4 77 31 3c 3c 38 29 2b a4 77 31 3a ed 0d |+(.w1<<8)+.w1:..| 00003a50 0d a2 31 20 67 5f 50 61 6c 65 74 74 65 25 28 30 |..1 g_Palette%(0| 00003a60 29 3d 32 5e 67 5f 70 69 78 62 69 74 73 25 3a f4 |)=2^g_pixbits%:.| 00003a70 20 50 61 6c 65 74 74 65 20 65 6e 74 72 69 65 73 | Palette entries| 00003a80 0d 0d ac 27 cc 20 50 61 6c 65 74 74 65 25 28 30 |...'. Palette%(0| 00003a90 29 3d 2d 31 3a f4 20 4e 6f 20 70 61 6c 65 74 74 |)=-1:. No palett| 00003aa0 65 20 66 6f 75 6e 64 0d 0d b6 05 cd 0d 0d c0 29 |e found........)| 00003ab0 f4 20 53 63 61 6e 20 64 61 74 61 20 66 6f 72 20 |. Scan data for | 00003ac0 70 69 63 74 75 72 65 73 2c 20 6d 61 6b 65 20 61 |pictures, make a| 00003ad0 20 6c 69 73 74 0d 0d ca 10 70 69 63 74 75 72 65 | list....picture| 00003ae0 25 3d 30 3a f5 0d 0d d4 3f f2 73 6b 69 70 5f 47 |%=0:....?.skip_G| 00003af0 49 46 5f 65 78 74 65 6e 73 69 6f 6e 3a f4 20 53 |IF_extension:. S| 00003b00 6b 69 70 20 65 78 74 65 6e 73 69 6f 6e 20 62 6c |kip extension bl| 00003b10 6f 63 6b 73 20 70 72 65 63 65 64 69 6e 67 20 49 |ocks preceding I| 00003b20 6d 61 67 65 0d 0d de 26 f4 20 53 65 61 72 63 68 |mage...&. Search| 00003b30 20 66 6f 72 20 6e 65 78 74 20 49 6d 61 67 65 20 | for next Image | 00003b40 44 65 73 63 72 69 70 74 6f 72 0d 0d e8 43 f5 20 |Descriptor...C. | 00003b50 5f 25 3d a4 77 31 3a 69 6d 61 67 65 3d 28 5f 25 |_%=.w1:image=(_%| 00003b60 3d 97 22 2c 22 29 3a 65 6e 64 3d 28 5f 25 3d 97 |=.","):end=(_%=.| 00003b70 22 3b 22 29 3a fd 20 69 6d 61 67 65 20 84 20 65 |";"):. image . e| 00003b80 6e 64 20 84 20 28 c5 23 46 69 6c 65 29 0d 0d f2 |nd . (.#File)...| 00003b90 67 e7 ac 69 6d 61 67 65 20 8c 20 e7 70 69 63 74 |g..image . .pict| 00003ba0 75 72 65 25 3c 31 20 8c 20 fd b9 3a f2 65 72 72 |ure%<1 . ..:.err| 00003bb0 6f 72 28 2d 31 2c 22 47 49 46 20 65 72 72 6f 72 |or(-1,"GIF error| 00003bc0 20 3a 20 49 20 66 61 69 6c 65 64 20 74 6f 20 66 | : I failed to f| 00003bd0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 49 6d 61 |ind the next Ima| 00003be0 67 65 20 44 65 73 63 72 69 70 74 6f 72 20 21 22 |ge Descriptor !"| 00003bf0 29 3a 3d a3 0d 0d fc 0c e7 69 6d 61 67 65 20 8c |):=......image .| 00003c00 0d 0e 06 22 20 f4 20 52 65 67 69 73 74 65 72 20 |..." . Register | 00003c10 70 69 63 74 75 72 65 27 73 20 70 6f 73 69 74 69 |picture's positi| 00003c20 6f 6e 0d 0e 10 2e 20 70 69 63 74 75 72 65 25 2b |on.... picture%+| 00003c30 3d 31 3a 50 69 63 5f 70 74 72 25 28 70 69 63 74 |=1:Pic_ptr%(pict| 00003c40 75 72 65 25 29 3d 28 8f 23 46 69 6c 65 29 2d 31 |ure%)=(.#File)-1| 00003c50 0d 0e 1a 2d 20 f4 20 49 66 20 74 68 65 72 65 27 |...- . If there'| 00003c60 73 20 61 20 6c 6f 63 61 6c 20 63 6f 6c 6f 75 72 |s a local colour| 00003c70 20 6d 61 70 2c 20 73 6b 69 70 20 69 74 0d 0e 24 | map, skip it..$| 00003c80 36 20 f2 73 6b 69 70 28 38 29 3a 5f 25 3d a4 77 |6 .skip(8):_%=.w| 00003c90 31 3a e7 28 5f 25 80 26 38 30 29 3e 30 20 8c 20 |1:.(_%.&80)>0 . | 00003ca0 f2 73 6b 69 70 28 33 2a 28 28 5f 25 80 37 29 2b |.skip(3*((_%.7)+| 00003cb0 31 29 29 0d 0e 2e 2f 20 f4 20 44 65 74 65 72 6d |1)).../ . Determ| 00003cc0 69 6e 65 20 70 69 63 74 75 72 65 20 64 61 74 61 |ine picture data| 00003cd0 20 6c 65 6e 67 74 68 2c 20 73 6b 69 70 20 64 61 | length, skip da| 00003ce0 74 61 0d 0e 38 27 20 f2 73 6b 69 70 28 31 29 3a |ta..8' .skip(1):| 00003cf0 f5 20 63 25 3d a4 77 31 3a f2 73 6b 69 70 28 63 |. c%=.w1:.skip(c| 00003d00 25 29 3a fd 20 63 25 3d 30 0d 0e 42 33 20 50 69 |%):. c%=0..B3 Pi| 00003d10 63 5f 6c 65 6e 25 28 70 69 63 74 75 72 65 25 29 |c_len%(picture%)| 00003d20 3d 28 8f 23 46 69 6c 65 29 2d 50 69 63 5f 70 74 |=(.#File)-Pic_pt| 00003d30 72 25 28 70 69 63 74 75 72 65 25 29 0d 0e 4c 05 |r%(picture%)..L.| 00003d40 cd 0d 0e 56 09 fd 20 65 6e 64 0d 0e 60 31 70 69 |...V.. end..`1pi| 00003d50 63 74 75 72 65 73 25 3d 70 69 63 74 75 72 65 25 |ctures%=picture%| 00003d60 3a f4 20 4e 75 6d 62 65 72 20 6f 66 20 70 69 63 |:. Number of pic| 00003d70 74 75 72 65 73 20 66 6f 75 6e 64 0d 0e 6a 12 e7 |tures found..j..| 00003d80 70 69 63 74 75 72 65 73 25 3d 31 20 8c 0d 0e 74 |pictures%=1 ...t| 00003d90 2e 20 70 69 63 74 75 72 65 25 3d 31 3a f4 20 4f |. picture%=1:. O| 00003da0 6e 6c 79 20 6f 6e 65 20 70 69 63 74 75 72 65 2c |nly one picture,| 00003db0 20 64 69 73 70 6c 61 79 20 69 74 0d 0e 7e 35 cc | display it..~5.| 00003dc0 20 f4 20 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 | . More than one| 00003dd0 20 70 69 63 74 75 72 65 2c 20 74 61 6b 65 20 75 | picture, take u| 00003de0 73 65 72 2d 73 65 6c 65 63 74 65 64 20 6f 6e 65 |ser-selected one| 00003df0 0d 0e 88 c3 20 e7 28 47 49 46 49 6d 61 67 65 25 |.... .(GIFImage%| 00003e00 3e 30 29 20 80 20 28 47 49 46 49 6d 61 67 65 25 |>0) . (GIFImage%| 00003e10 3c 3d 70 69 63 74 75 72 65 73 25 29 20 8c 20 70 |<=pictures%) . p| 00003e20 69 63 74 75 72 65 25 3d 47 49 46 49 6d 61 67 65 |icture%=GIFImage| 00003e30 25 20 8b 20 f2 65 72 72 6f 72 28 2d 31 2c 22 47 |% . .error(-1,"G| 00003e40 49 46 20 65 72 72 6f 72 20 3a 20 54 68 69 73 20 |IF error : This | 00003e50 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 22 2b |file contains "+| 00003e60 c3 28 70 69 63 74 75 72 65 73 25 29 2b 22 20 69 |.(pictures%)+" i| 00003e70 6d 61 67 65 73 2e 20 53 65 6c 65 63 74 20 27 31 |mages. Select '1| 00003e80 27 2d 27 22 2b c3 28 70 69 63 74 75 72 65 73 25 |'-'"+.(pictures%| 00003e90 29 2b 22 27 20 69 6e 20 74 68 65 20 27 47 49 46 |)+"' in the 'GIF| 00003ea0 20 69 6d 61 67 65 27 20 73 75 62 6d 65 6e 75 20 | image' submenu | 00003eb0 21 22 29 0d 0e 92 05 cd 0d 0e 9c 49 cf 23 46 69 |!")........I.#Fi| 00003ec0 6c 65 3d 50 69 63 5f 70 74 72 25 28 70 69 63 74 |le=Pic_ptr%(pict| 00003ed0 75 72 65 25 29 2b 31 3a 6c 65 6e 25 3d 50 69 63 |ure%)+1:len%=Pic| 00003ee0 5f 6c 65 6e 25 28 70 69 63 74 75 72 65 25 29 3a |_len%(picture%):| 00003ef0 f4 20 50 69 63 27 73 20 70 6f 73 20 26 20 6c 65 |. Pic's pos & le| 00003f00 6e 0d 0e a6 20 f4 20 52 65 61 64 20 49 6d 61 67 |n... . Read Imag| 00003f10 65 20 44 65 73 63 72 69 70 74 6f 72 20 64 61 74 |e Descriptor dat| 00003f20 61 0d 0e b0 40 69 5f 6c 65 66 74 25 3d a4 77 32 |a...@i_left%=.w2| 00003f30 3a 69 5f 74 6f 70 25 3d a4 77 32 3a 69 5f 77 69 |:i_top%=.w2:i_wi| 00003f40 64 74 68 25 3d a4 77 32 3a 69 5f 68 65 69 67 68 |dth%=.w2:i_heigh| 00003f50 74 25 3d a4 77 32 3a 66 6c 61 67 73 25 3d a4 77 |t%=.w2:flags%=.w| 00003f60 31 0d 0e ba 37 6c 6f 63 61 6c 3d 28 66 6c 61 67 |1...7local=(flag| 00003f70 73 25 80 26 38 30 29 3e 30 3a f4 20 4c 6f 63 61 |s%.&80)>0:. Loca| 00003f80 6c 20 63 6f 6c 6f 75 72 20 6d 61 70 20 66 6f 6c |l colour map fol| 00003f90 6c 6f 77 69 6e 67 20 3f 0d 0e c4 3c 69 62 69 74 |lowing ?...<ibit| 00003fa0 3d 28 66 6c 61 67 73 25 80 26 34 30 29 3e 30 3a |=(flags%.&40)>0:| 00003fb0 f4 20 49 6d 61 67 65 20 73 74 6f 72 65 64 20 69 |. Image stored i| 00003fc0 6e 20 69 6e 74 65 72 6c 61 63 65 64 20 6f 72 64 |n interlaced ord| 00003fd0 65 72 20 3f 0d 0e ce 2e 6c 5f 70 69 78 62 69 74 |er ?....l_pixbit| 00003fe0 73 25 3d 66 6c 61 67 73 25 80 37 3a f4 20 4c 6f |s%=flags%.7:. Lo| 00003ff0 63 61 6c 20 62 69 74 73 20 70 65 72 20 70 69 78 |cal bits per pix| 00004000 65 6c 0d 0e d8 0c e7 6c 6f 63 61 6c 20 8c 0d 0e |el.....local ...| 00004010 e2 40 20 70 69 78 62 69 74 73 25 3d 6c 5f 70 69 |.@ pixbits%=l_pi| 00004020 78 62 69 74 73 25 3a f4 20 52 65 61 64 20 61 6e |xbits%:. Read an| 00004030 64 20 75 73 65 20 4c 6f 63 61 6c 20 43 6f 6c 6f |d use Local Colo| 00004040 75 72 20 4d 61 70 20 70 61 6c 65 74 74 65 0d 0e |ur Map palette..| 00004050 ec 40 20 e3 20 63 25 3d 31 20 b8 20 32 5e 6c 5f |.@ . c%=1 . 2^l_| 00004060 70 69 78 62 69 74 73 25 3a 50 61 6c 65 74 74 65 |pixbits%:Palette| 00004070 25 28 63 25 29 3d 28 a4 77 31 3c 3c 31 36 29 2b |%(c%)=(.w1<<16)+| 00004080 28 a4 77 31 3c 3c 38 29 2b a4 77 31 3a ed 0d 0e |(.w1<<8)+.w1:...| 00004090 f6 2f 20 50 61 6c 65 74 74 65 25 28 30 29 3d 32 |./ Palette%(0)=2| 000040a0 5e 6c 5f 70 69 78 62 69 74 73 25 3a f4 20 50 61 |^l_pixbits%:. Pa| 000040b0 6c 65 74 74 65 20 65 6e 74 72 69 65 73 0d 0f 00 |lette entries...| 000040c0 43 cc 20 70 69 78 62 69 74 73 25 3d 67 5f 70 69 |C. pixbits%=g_pi| 000040d0 78 62 69 74 73 25 3a 50 61 6c 65 74 74 65 25 28 |xbits%:Palette%(| 000040e0 29 3d 67 5f 50 61 6c 65 74 74 65 25 28 29 3a f4 |)=g_Palette%():.| 000040f0 20 55 73 65 20 47 6c 6f 62 61 6c 20 64 61 74 61 | Use Global data| 00004100 0d 0f 0a 05 cd 0d 0f 14 2b 63 6f 6c 6f 75 72 73 |........+colours| 00004110 25 3d 32 5e 70 69 78 62 69 74 73 25 3a f4 20 4e |%=2^pixbits%:. N| 00004120 75 6d 62 65 72 20 6f 66 20 63 6f 6c 6f 75 72 73 |umber of colours| 00004130 0d 0f 1e 2f f4 20 44 65 74 65 72 6d 69 6e 65 20 |.../. Determine | 00004140 73 75 69 74 61 62 6c 65 20 41 72 63 68 69 6d 65 |suitable Archime| 00004150 64 65 73 20 73 63 72 65 65 6e 20 6d 6f 64 65 0d |des screen mode.| 00004160 0f 28 53 6d 6f 64 65 25 3d a4 6d 6f 64 65 28 72 |.(Smode%=.mode(r| 00004170 5f 77 69 64 74 68 25 2c 72 5f 68 65 69 67 68 74 |_width%,r_height| 00004180 25 2c 63 6f 6c 6f 75 72 73 25 2c 65 72 72 6f 72 |%,colours%,error| 00004190 24 29 3a e7 6d 6f 64 65 25 3c 30 20 8c 20 f2 65 |$):.mode%<0 . .e| 000041a0 72 72 6f 72 28 2d 31 2c 65 72 72 6f 72 24 29 3a |rror(-1,error$):| 000041b0 3d a3 0d 0f 32 2e e7 a4 6e 65 77 5f 69 6d 61 67 |=...2...new_imag| 000041c0 65 28 6d 6f 64 65 25 2c 69 5f 77 69 64 74 68 25 |e(mode%,i_width%| 000041d0 2c 69 5f 68 65 69 67 68 74 25 29 20 8b 20 3d a3 |,i_height%) . =.| 000041e0 0d 0f 3c af f2 73 63 72 65 65 6e 5f 69 6e 66 6f |..<..screen_info| 000041f0 28 73 69 67 6e 61 74 75 72 65 24 2c 69 5f 77 69 |(signature$,i_wi| 00004200 64 74 68 25 2c 69 5f 68 65 69 67 68 74 25 2c 63 |dth%,i_height%,c| 00004210 6f 6c 6f 75 72 73 25 2c 6d 6f 64 65 25 2c 22 4c |olours%,mode%,"L| 00004220 5a 57 22 2c 22 4e 75 6d 62 65 72 20 6f 66 20 70 |ZW","Number of p| 00004230 69 63 74 75 72 65 73 7c 22 2b c3 70 69 63 74 75 |ictures|"+.pictu| 00004240 72 65 73 25 2b 22 20 28 64 69 73 70 6c 61 79 69 |res%+" (displayi| 00004250 6e 67 20 22 2b a4 74 69 6d 65 73 28 70 69 63 74 |ng "+.times(pict| 00004260 75 72 65 25 29 2b 22 29 22 2c 6c 65 6e 25 2c 28 |ure%)+")",len%,(| 00004270 69 5f 68 65 69 67 68 74 25 2a 69 5f 77 69 64 74 |i_height%*i_widt| 00004280 68 25 2a 70 69 78 62 69 74 73 25 29 81 38 29 0d |h%*pixbits%).8).| 00004290 0f 46 23 f4 20 53 65 74 20 75 70 20 64 61 74 61 |.F#. Set up data| 000042a0 20 66 6f 72 20 64 65 63 6f 6d 70 72 65 73 73 69 | for decompressi| 000042b0 6f 6e 0d 0f 50 44 21 66 70 74 72 3d 8f 23 46 69 |on..PD!fptr=.#Fi| 000042c0 6c 65 3a 21 70 69 78 62 69 74 73 3d 70 69 78 62 |le:!pixbits=pixb| 000042d0 69 74 73 25 3a 21 77 69 64 74 68 3d 69 5f 77 69 |its%:!width=i_wi| 000042e0 64 74 68 25 3a 21 68 65 69 67 68 74 3d 69 5f 68 |dth%:!height=i_h| 000042f0 65 69 67 68 74 25 0d 0f 5a 3a e7 69 62 69 74 20 |eight%..Z:.ibit | 00004300 8c 20 21 6c 61 63 65 64 3d 31 20 8b 20 21 6c 61 |. !laced=1 . !la| 00004310 63 65 64 3d 30 3a f4 20 49 6e 64 69 63 61 74 65 |ced=0:. Indicate| 00004320 20 69 66 20 6c 61 63 65 64 20 6f 72 20 6e 6f 74 | if laced or not| 00004330 0d 0f 64 38 f4 20 44 65 74 65 72 6d 69 6e 65 20 |..d8. Determine | 00004340 62 65 73 74 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f |best memory allo| 00004350 63 61 74 69 6f 6e 20 66 6f 72 20 64 65 63 6f 6d |cation for decom| 00004360 70 72 65 73 73 69 6f 6e 0d 0f 6e 42 74 61 62 6c |pression..nBtabl| 00004370 65 6e 65 65 64 25 3d 33 32 2a 31 30 32 34 3a f4 |eneed%=32*1024:.| 00004380 20 53 70 61 63 65 20 6e 65 65 64 65 64 20 66 6f | Space needed fo| 00004390 72 20 64 65 63 6f 6d 70 72 65 73 73 69 6f 6e 20 |r decompression | 000043a0 63 6f 64 65 20 74 61 62 6c 65 0d 0f 78 38 62 75 |code table..x8bu| 000043b0 66 66 72 65 65 25 3d 21 68 69 6d 65 6d 2d 21 6c |ffree%=!himem-!l| 000043c0 6f 6d 65 6d 3a f4 20 46 72 65 65 20 73 70 61 63 |omem:. Free spac| 000043d0 65 20 69 6e 20 73 70 72 69 74 65 20 62 75 66 66 |e in sprite buff| 000043e0 65 72 0d 0f 82 1a e7 62 75 66 66 72 65 65 25 3e |er.....buffree%>| 000043f0 3d 54 69 6e 79 73 69 7a 65 25 20 8c 0d 0f 8c 45 |=Tinysize% ....E| 00004400 20 21 63 68 75 6e 6b 3d 21 6c 6f 6d 65 6d 3a 21 | !chunk=!lomem:!| 00004410 63 68 73 69 7a 65 3d 62 75 66 66 72 65 65 25 3a |chsize=buffree%:| 00004420 f4 20 55 73 65 20 66 72 65 65 20 73 70 72 69 74 |. Use free sprit| 00004430 65 20 62 75 66 66 65 72 20 66 6f 72 20 66 69 6c |e buffer for fil| 00004440 65 0d 0f 96 3c 20 21 74 61 62 62 66 3d 54 69 6e |e...< !tabbf=Tin| 00004450 79 25 3a f4 20 55 73 65 20 74 69 6e 79 20 62 75 |y%:. Use tiny bu| 00004460 66 66 65 72 20 66 6f 72 20 64 65 63 6f 6d 70 72 |ffer for decompr| 00004470 65 73 73 69 6f 6e 20 74 61 62 6c 65 73 0d 0f a0 |ession tables...| 00004480 1d cc 20 e7 62 75 66 66 72 65 65 25 3e 3d 74 61 |.. .buffree%>=ta| 00004490 62 6c 65 6e 65 65 64 25 20 8c 0d 0f aa 43 20 20 |bleneed% ....C | 000044a0 20 20 20 20 21 63 68 75 6e 6b 3d 54 69 6e 79 25 | !chunk=Tiny%| 000044b0 3a 21 63 68 73 69 7a 65 3d 54 69 6e 79 73 69 7a |:!chsize=Tinysiz| 000044c0 65 25 3a f4 20 55 73 65 20 74 69 6e 79 20 62 75 |e%:. Use tiny bu| 000044d0 66 66 65 72 20 66 6f 72 20 66 69 6c 65 0d 0f b4 |ffer for file...| 000044e0 49 20 20 20 20 20 20 21 74 61 62 62 66 3d 21 6c |I !tabbf=!l| 000044f0 6f 6d 65 6d 3a f4 20 55 73 65 20 66 72 65 65 20 |omem:. Use free | 00004500 73 70 72 69 74 65 20 62 75 66 66 65 72 20 66 6f |sprite buffer fo| 00004510 72 20 64 65 63 6f 6d 70 72 65 73 73 69 6f 6e 20 |r decompression | 00004520 74 61 62 6c 65 73 0d 0f be 42 20 20 20 20 20 cc |tables...B .| 00004530 20 21 74 61 62 62 66 3d 54 69 6e 79 25 3a f4 20 | !tabbf=Tiny%:. | 00004540 55 73 65 20 74 69 6e 79 20 62 75 66 66 65 72 20 |Use tiny buffer | 00004550 66 6f 72 20 64 65 63 6f 6d 70 72 65 73 73 69 6f |for decompressio| 00004560 6e 20 74 61 62 6c 65 73 0d 0f c8 82 20 20 20 20 |n tables.... | 00004570 20 20 e7 62 75 66 66 72 65 65 25 3c 28 54 69 6e | .buffree%<(Tin| 00004580 79 73 69 7a 65 25 2d 74 61 62 6c 65 6e 65 65 64 |ysize%-tableneed| 00004590 25 29 20 8c 20 21 63 68 75 6e 6b 3d 54 69 6e 79 |%) . !chunk=Tiny| 000045a0 25 2b 74 61 62 6c 65 6e 65 65 64 25 3a 21 63 68 |%+tableneed%:!ch| 000045b0 73 69 7a 65 3d 54 69 6e 79 73 69 7a 65 25 2d 74 |size=Tinysize%-t| 000045c0 61 62 6c 65 6e 65 65 64 25 20 8b 20 21 63 68 75 |ableneed% . !chu| 000045d0 6e 6b 3d 21 6c 6f 6d 65 6d 3a 21 63 68 73 69 7a |nk=!lomem:!chsiz| 000045e0 65 3d 62 75 66 66 72 65 65 25 0d 0f d2 0a 20 20 |e=buffree%.... | 000045f0 20 20 20 cd 0d 0f dc 05 cd 0d 0f e6 27 f2 64 69 | .........'.di| 00004600 73 70 6c 61 79 28 75 6e 70 61 63 6b 5f 47 49 46 |splay(unpack_GIF| 00004610 2c 6d 6f 64 65 25 29 3a f4 20 55 6e 70 61 63 6b |,mode%):. Unpack| 00004620 0d 0f f0 17 f2 73 65 74 5f 6d 6f 64 65 28 6d 6f |.....set_mode(mo| 00004630 64 65 25 29 3a 3d b9 0d 0f fa 05 20 0d 10 04 18 |de%):=..... ....| 00004640 dd f2 73 6b 69 70 5f 47 49 46 5f 65 78 74 65 6e |..skip_GIF_exten| 00004650 73 69 6f 6e 0d 10 0e 3f f4 20 53 6b 69 70 73 20 |sion...?. Skips | 00004660 61 20 47 49 46 20 45 78 74 65 6e 73 69 6f 6e 20 |a GIF Extension | 00004670 42 6c 6f 63 6b 20 69 66 20 70 72 65 73 65 6e 74 |Block if present| 00004680 20 61 74 20 63 75 72 72 65 6e 74 20 70 6f 69 6e | at current poin| 00004690 74 65 72 0d 10 18 08 ea 20 5f 25 0d 10 22 14 e7 |ter..... _%.."..| 000046a0 28 9a 23 46 69 6c 65 29 3d 97 22 21 22 20 8c 0d |(.#File)=."!" ..| 000046b0 10 2c 22 20 f2 73 6b 69 70 28 31 29 3a f4 20 53 |.," .skip(1):. S| 000046c0 6b 69 70 20 66 75 6e 63 74 69 6f 6e 20 63 6f 64 |kip function cod| 000046d0 65 0d 10 36 36 20 f5 20 5f 25 3d a4 77 31 3a f2 |e..66 . _%=.w1:.| 000046e0 73 6b 69 70 28 5f 25 29 3a fd 20 5f 25 3d 30 3a |skip(_%):. _%=0:| 000046f0 f4 20 53 6b 69 70 20 64 61 74 61 20 62 79 74 65 |. Skip data byte| 00004700 20 62 6c 6f 63 6b 73 0d 10 40 17 cc 20 cf 23 46 | blocks..@.. .#F| 00004710 69 6c 65 3d 28 8f 23 46 69 6c 65 29 2d 31 0d 10 |ile=(.#File)-1..| 00004720 4a 05 cd 0d 10 54 05 e1 0d 10 5e 05 20 0d 10 68 |J....T....^. ..h| 00004730 54 dd f2 73 63 72 65 65 6e 5f 69 6e 66 6f 28 74 |T..screen_info(t| 00004740 79 70 65 24 2c 77 69 64 74 68 25 2c 68 65 69 67 |ype$,width%,heig| 00004750 68 74 25 2c 63 6f 6c 6f 75 72 73 25 2c 6d 6f 64 |ht%,colours%,mod| 00004760 65 25 2c 63 6f 6d 70 72 24 2c 69 6e 66 6f 24 2c |e%,compr$,info$,| 00004770 64 61 74 61 6c 65 6e 25 2c 70 69 63 6c 65 6e 25 |datalen%,piclen%| 00004780 29 0d 10 72 26 f4 20 53 65 74 73 20 69 6e 66 6f |)..r&. Sets info| 00004790 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 |rmation about th| 000047a0 65 20 69 6d 61 67 65 0d 10 7c a2 49 4e 46 74 79 |e image..|.INFty| 000047b0 70 65 24 3d 74 79 70 65 24 3a 49 4e 46 77 69 64 |pe$=type$:INFwid| 000047c0 74 68 25 3d 77 69 64 74 68 25 3a 49 4e 46 68 65 |th%=width%:INFhe| 000047d0 69 67 68 74 25 3d 68 65 69 67 68 74 25 3a 49 4e |ight%=height%:IN| 000047e0 46 63 6f 6c 6f 75 72 73 25 3d 63 6f 6c 6f 75 72 |Fcolours%=colour| 000047f0 73 25 3a 49 4e 46 6d 6f 64 65 25 3d 6d 6f 64 65 |s%:INFmode%=mode| 00004800 25 3a 49 4e 46 63 6f 6d 70 72 24 3d 63 6f 6d 70 |%:INFcompr$=comp| 00004810 72 24 3a 49 4e 46 69 6e 66 6f 24 3d 69 6e 66 6f |r$:INFinfo$=info| 00004820 24 3a 49 4e 46 64 61 74 61 6c 65 6e 25 3d 64 61 |$:INFdatalen%=da| 00004830 74 61 6c 65 6e 25 3a 49 4e 46 70 69 63 6c 65 6e |talen%:INFpiclen| 00004840 25 3d 70 69 63 6c 65 6e 25 0d 10 86 05 e1 0d 10 |%=piclen%.......| 00004850 90 05 20 0d 10 9a 16 dd f2 6e 65 77 5f 69 6d 61 |.. ......new_ima| 00004860 67 65 5f 77 69 6e 64 6f 77 0d 10 a4 41 f4 20 43 |ge_window...A. C| 00004870 72 65 61 74 65 73 20 6e 65 77 20 69 6d 61 67 65 |reates new image| 00004880 20 77 69 6e 64 6f 77 20 6f 66 20 61 70 70 72 6f | window of appro| 00004890 70 69 61 74 65 20 73 69 7a 65 20 69 6e 20 63 75 |piate size in cu| 000048a0 72 72 65 6e 74 20 6d 6f 64 65 0d 10 ae 3e e7 49 |rrent mode...>.I| 000048b0 6d 61 67 65 57 20 8c 20 21 62 6c 6f 63 6b 3d 77 |mageW . !block=w| 000048c0 69 6e 5f 69 6d 67 25 3a c8 99 20 57 44 65 6c 65 |in_img%:.. WDele| 000048d0 74 65 57 25 2c 2c 62 6c 6f 63 6b 3a f4 20 44 65 |teW%,,block:. De| 000048e0 6c 65 74 65 20 6f 6c 64 0d 10 b8 90 77 69 6e 5f |lete old....win_| 000048f0 69 6d 67 25 3d a4 63 72 65 61 74 65 5f 77 69 6e |img%=.create_win| 00004900 64 6f 77 28 77 69 6e 64 6f 77 31 2c 30 2c 30 2c |dow(window1,0,0,| 00004910 a4 73 70 72 57 2c a4 73 70 72 48 2c 30 2c a4 73 |.sprW,.sprH,0,.s| 00004920 70 72 48 2c 2d 31 2c 26 30 46 2c 74 66 25 2c 74 |prH,-1,&0F,tf%,t| 00004930 62 25 2c 77 66 25 2c 77 62 25 2c 30 2c 30 2c a4 |b%,wf%,wb%,0,0,.| 00004940 73 70 72 57 2c a4 73 70 72 48 2c 26 32 44 2c 33 |sprW,.sprH,&2D,3| 00004950 3c 3c 31 32 2c 26 31 30 30 30 31 2c 31 2c 22 49 |<<12,&10001,1,"I| 00004960 6d 61 67 65 20 22 2b 46 69 6c 65 24 2c 74 69 74 |mage "+File$,tit| 00004970 6c 65 5f 69 6d 67 25 29 0d 10 c2 23 49 6d 61 67 |le_img%)...#Imag| 00004980 65 57 3d b9 3a f4 20 49 6d 61 67 65 20 77 69 6e |eW=.:. Image win| 00004990 64 6f 77 20 63 72 65 61 74 65 64 0d 10 cc 19 5a |dow created....Z| 000049a0 6f 6f 6d 25 3d 31 3a f4 20 4e 6f 72 6d 61 6c 20 |oom%=1:. Normal | 000049b0 73 69 7a 65 0d 10 d6 19 f2 6e 65 77 5f 77 69 6e |size.....new_win| 000049c0 64 6f 77 28 77 69 6e 5f 69 6d 67 25 29 0d 10 e0 |dow(win_img%)...| 000049d0 05 e1 0d 10 ea 05 20 0d 10 f4 22 dd a4 6e 65 77 |...... ..."..new| 000049e0 5f 69 6d 61 67 65 28 6d 6f 64 65 25 2c 78 72 65 |_image(mode%,xre| 000049f0 73 25 2c 79 72 65 73 25 29 0d 10 fe 41 f4 20 43 |s%,yres%)...A. C| 00004a00 72 65 61 74 65 73 20 72 6f 6f 6d 20 66 6f 72 20 |reates room for | 00004a10 70 69 63 74 75 72 65 20 73 70 72 69 74 65 20 6f |picture sprite o| 00004a20 66 20 73 70 65 63 69 66 69 63 20 72 65 73 6f 6c |f specific resol| 00004a30 75 74 69 6f 6e 2f 6d 6f 64 65 0d 11 08 2c f4 20 |ution/mode...,. | 00004a40 53 65 74 73 20 70 6f 69 6e 74 65 72 73 20 61 6e |Sets pointers an| 00004a50 64 20 64 61 74 61 20 66 6f 72 20 6d 61 63 68 69 |d data for machi| 00004a60 6e 65 63 6f 64 65 0d 11 12 2d f4 20 52 65 74 75 |necode...-. Retu| 00004a70 72 6e 73 20 54 52 55 45 20 69 66 20 61 6c 6c 20 |rns TRUE if all | 00004a80 69 73 20 77 65 6c 6c 2c 20 65 6c 73 65 20 46 41 |is well, else FA| 00004a90 4c 53 45 0d 11 1c 23 ea 20 73 70 74 72 25 2c 62 |LSE...#. sptr%,b| 00004aa0 69 74 73 25 2c 77 6f 72 64 73 25 2c 65 6e 64 25 |its%,words%,end%| 00004ab0 2c 73 69 7a 65 25 0d 11 26 2f 53 70 72 69 74 65 |,size%..&/Sprite| 00004ac0 25 21 30 3d 53 70 72 69 74 65 73 69 7a 65 25 3a |%!0=Spritesize%:| 00004ad0 f4 20 53 69 7a 65 20 6f 66 20 73 70 72 69 74 65 |. Size of sprite| 00004ae0 20 61 72 65 61 0d 11 30 3b 53 70 72 69 74 65 25 | area..0;Sprite%| 00004af0 21 34 3d 31 3a 53 70 72 69 74 65 25 21 38 3d 31 |!4=1:Sprite%!8=1| 00004b00 36 3a f4 20 4f 6e 65 20 73 70 72 69 74 65 2c 20 |6:. One sprite, | 00004b10 6f 66 66 73 65 74 20 74 6f 20 73 70 72 69 74 65 |offset to sprite| 00004b20 0d 11 3a 2c 73 70 74 72 25 3d 53 70 72 69 74 65 |..:,sptr%=Sprite| 00004b30 25 2b 28 53 70 72 69 74 65 25 21 38 29 3a f4 20 |%+(Sprite%!8):. | 00004b40 53 70 72 69 74 65 20 73 74 61 72 74 0d 11 44 30 |Sprite start..D0| 00004b50 24 28 73 70 74 72 25 2b 34 29 3d 49 73 70 72 6e |$(sptr%+4)=Isprn| 00004b60 61 6d 65 24 2b c4 31 32 2c bd 30 29 3a f4 20 53 |ame$+.12,.0):. S| 00004b70 70 72 69 74 65 27 73 20 6e 61 6d 65 0d 11 4e 3a |prite's name..N:| 00004b80 62 69 74 73 25 3d 78 72 65 73 25 2a 32 5e a4 6d |bits%=xres%*2^.m| 00004b90 6f 64 65 5f 76 61 72 28 6d 6f 64 65 25 2c 39 29 |ode_var(mode%,9)| 00004ba0 3a f4 20 42 69 74 73 20 6e 65 65 64 65 64 20 70 |:. Bits needed p| 00004bb0 65 72 20 72 6f 77 0d 11 58 2f 77 6f 72 64 73 25 |er row..X/words%| 00004bc0 3d 28 62 69 74 73 25 2b 33 31 29 81 33 32 3a f4 |=(bits%+31).32:.| 00004bd0 20 57 6f 72 64 73 20 6e 65 65 64 65 64 20 70 65 | Words needed pe| 00004be0 72 20 72 6f 77 0d 11 62 24 21 72 6f 77 6c 65 6e |r row..b$!rowlen| 00004bf0 3d 77 6f 72 64 73 25 2a 34 3a f4 20 53 65 74 20 |=words%*4:. Set | 00004c00 72 6f 77 6c 65 6e 67 74 68 0d 11 6c 28 73 70 74 |rowlength..l(spt| 00004c10 72 25 21 31 36 3d 77 6f 72 64 73 25 2d 31 3a f4 |r%!16=words%-1:.| 00004c20 20 57 69 64 74 68 20 69 6e 20 77 6f 72 64 73 2d | Width in words-| 00004c30 31 0d 11 76 2c 73 70 74 72 25 21 32 30 3d 79 72 |1..v,sptr%!20=yr| 00004c40 65 73 25 2d 31 3a f4 20 48 65 69 67 68 74 20 69 |es%-1:. Height i| 00004c50 6e 20 73 63 61 6e 6c 69 6e 65 73 2d 31 0d 11 80 |n scanlines-1...| 00004c60 3d 73 70 74 72 25 21 32 34 3d 30 3a 73 70 74 72 |=sptr%!24=0:sptr| 00004c70 25 21 32 38 3d 33 31 2d 28 77 6f 72 64 73 25 2a |%!28=31-(words%*| 00004c80 33 32 2d 62 69 74 73 25 29 3a f4 20 53 74 61 72 |32-bits%):. Star| 00004c90 74 2f 65 6e 64 20 62 69 74 73 0d 11 8a 23 73 70 |t/end bits...#sp| 00004ca0 74 72 25 21 34 30 3d 6d 6f 64 65 25 3a f4 20 4d |tr%!40=mode%:. M| 00004cb0 6f 64 65 20 6f 66 20 73 70 72 69 74 65 0d 11 94 |ode of sprite...| 00004cc0 3e 73 70 74 72 25 21 33 32 3d 34 34 3a 73 70 74 |>sptr%!32=44:spt| 00004cd0 72 25 21 33 36 3d 73 70 74 72 25 21 33 32 3a f4 |r%!36=sptr%!32:.| 00004ce0 20 4f 66 66 73 65 74 20 74 6f 20 73 70 72 69 74 | Offset to sprit| 00004cf0 65 20 64 61 74 61 2f 6d 61 73 6b 0d 11 9e 43 65 |e data/mask...Ce| 00004d00 6e 64 25 3d 73 70 74 72 25 2b 73 70 74 72 25 21 |nd%=sptr%+sptr%!| 00004d10 33 32 2b 77 6f 72 64 73 25 2a 79 72 65 73 25 2a |32+words%*yres%*| 00004d20 34 3a f4 20 41 64 64 72 65 73 73 20 6f 66 20 66 |4:. Address of f| 00004d30 69 72 73 74 20 66 72 65 65 20 62 79 74 65 0d 11 |irst free byte..| 00004d40 a8 43 21 68 69 6d 65 6d 3d 53 70 72 69 74 65 25 |.C!himem=Sprite%| 00004d50 2b 53 70 72 69 74 65 73 69 7a 65 25 3a f4 20 45 |+Spritesize%:. E| 00004d60 6e 64 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 |nd of free space| 00004d70 20 69 6e 20 73 70 72 69 74 65 20 62 75 66 66 65 | in sprite buffe| 00004d80 72 0d 11 b2 45 21 6c 6f 6d 65 6d 3d a4 61 6c 69 |r...E!lomem=.ali| 00004d90 67 6e 28 65 6e 64 25 2b 34 2a 31 30 32 34 29 3a |gn(end%+4*1024):| 00004da0 f4 20 53 74 61 72 74 20 6f 66 20 66 72 65 65 20 |. Start of free | 00004db0 73 70 61 63 65 20 69 6e 20 73 70 72 69 74 65 20 |space in sprite | 00004dc0 62 75 66 66 65 72 0d 11 bc 95 e7 65 6e 64 25 3e |buffer.....end%>| 00004dd0 21 68 69 6d 65 6d 20 8c 20 f2 65 72 72 6f 72 28 |!himem . .error(| 00004de0 2d 31 2c 22 49 20 63 61 6e 6e 6f 74 20 68 61 6e |-1,"I cannot han| 00004df0 64 6c 65 20 74 68 69 73 20 69 6d 61 67 65 2e 20 |dle this image. | 00004e00 49 20 6e 65 65 64 20 22 2b c3 28 28 77 6f 72 64 |I need "+.((word| 00004e10 73 25 2a 79 72 65 73 25 2a 34 2b 31 30 32 34 29 |s%*yres%*4+1024)| 00004e20 81 31 30 32 34 29 2b 22 4b 2e 20 49 20 77 61 73 |.1024)+"K. I was| 00004e30 20 67 69 76 65 6e 20 6f 6e 6c 79 20 22 2b c3 28 | given only "+.(| 00004e40 53 70 72 69 74 65 73 69 7a 65 25 81 31 30 32 34 |Spritesize%.1024| 00004e50 29 2b 22 4b 20 21 22 29 3a 3d a3 0d 11 c6 3a 41 |)+"K !"):=....:A| 00004e60 25 3d 73 70 74 72 25 2b 73 70 74 72 25 21 33 32 |%=sptr%+sptr%!32| 00004e70 3a 42 25 3d 65 6e 64 25 2d 41 25 3a d6 20 77 69 |:B%=end%-A%:. wi| 00004e80 70 65 5f 6d 65 6d 3a f4 20 43 6c 65 61 72 20 73 |pe_mem:. Clear s| 00004e90 70 72 69 74 65 0d 11 d0 2e 73 70 74 72 25 21 30 |prite....sptr%!0| 00004ea0 3d 65 6e 64 25 2d 73 70 74 72 25 3a f4 20 4f 66 |=end%-sptr%:. Of| 00004eb0 66 73 65 74 20 74 6f 20 6e 65 78 74 20 73 70 72 |fset to next spr| 00004ec0 69 74 65 0d 11 da 37 53 70 72 69 74 65 25 21 31 |ite...7Sprite%!1| 00004ed0 32 3d 65 6e 64 25 2d 53 70 72 69 74 65 25 3a f4 |2=end%-Sprite%:.| 00004ee0 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 | Offset to first| 00004ef0 20 66 72 65 65 20 77 6f 72 64 0d 11 e4 2d 21 73 | free word...-!s| 00004f00 63 72 65 65 6e 3d 73 70 74 72 25 2b 34 34 3a f4 |creen=sptr%+44:.| 00004f10 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 70 72 69 | Pointer to spri| 00004f20 74 65 20 64 61 74 61 0d 11 ee 44 53 70 72 57 25 |te data...DSprW%| 00004f30 3d 78 72 65 73 25 3a 53 70 72 48 25 3d 79 72 65 |=xres%:SprH%=yre| 00004f40 73 25 3a f4 20 52 65 6d 65 6d 62 65 72 20 73 70 |s%:. Remember sp| 00004f50 72 69 74 65 27 73 20 72 65 73 6f 6c 75 74 69 6f |rite's resolutio| 00004f60 6e 20 69 6e 20 70 69 78 65 6c 73 0d 11 f8 49 73 |n in pixels...Is| 00004f70 69 7a 65 25 3d 28 28 21 68 69 6d 65 6d 2d 21 6c |ize%=((!himem-!l| 00004f80 6f 6d 65 6d 29 81 32 35 36 29 2a 32 35 36 3a f4 |omem).256)*256:.| 00004f90 20 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73 70 | Size of free sp| 00004fa0 61 63 65 20 69 6e 20 73 70 72 69 74 65 20 62 75 |ace in sprite bu| 00004fb0 66 66 65 72 0d 12 02 84 e7 73 69 7a 65 25 3e 3d |ffer.....size%>=| 00004fc0 54 69 6e 79 73 69 7a 65 25 20 8c 20 21 63 68 75 |Tinysize% . !chu| 00004fd0 6e 6b 3d 21 6c 6f 6d 65 6d 3a 21 63 68 73 69 7a |nk=!lomem:!chsiz| 00004fe0 65 3d 73 69 7a 65 25 20 8b 20 21 63 68 75 6e 6b |e=size% . !chunk| 00004ff0 3d 54 69 6e 79 25 3a 21 63 68 73 69 7a 65 3d 54 |=Tiny%:!chsize=T| 00005000 69 6e 79 73 69 7a 65 25 3a f4 20 43 68 6f 6f 73 |inysize%:. Choos| 00005010 65 20 74 69 6e 79 20 62 75 66 66 65 72 20 69 66 |e tiny buffer if| 00005020 20 61 62 73 6f 6c 75 74 65 6c 79 20 6e 6f 20 72 | absolutely no r| 00005030 6f 6f 6d 20 6c 65 66 74 0d 12 0c 06 3d b9 0d 12 |oom left....=...| 00005040 16 05 20 0d 12 20 1b dd f2 73 75 62 6d 65 6e 75 |.. .. ...submenu| 00005050 28 6e 61 6d 65 24 2c 63 72 65 61 74 65 29 0d 12 |(name$,create)..| 00005060 2a 35 f4 20 28 52 65 29 77 72 69 74 65 73 20 73 |*5. (Re)writes s| 00005070 75 62 6d 65 6e 75 20 6e 61 6d 65 24 2c 20 6f 70 |ubmenu name$, op| 00005080 74 69 6f 6e 61 6c 6c 79 20 63 72 65 61 74 65 73 |tionally creates| 00005090 20 69 74 0d 12 34 0e c8 8e 20 6e 61 6d 65 24 20 | it..4... name$ | 000050a0 ca 0d 12 3e 7d 20 c9 20 22 53 61 76 65 20 69 6d |...>} . "Save im| 000050b0 61 67 65 22 20 3a 20 f2 63 72 65 61 74 65 5f 6d |age" : .create_m| 000050c0 65 6e 75 28 78 25 2c 79 25 2c 22 5e 53 61 76 65 |enu(x%,y%,"^Save| 000050d0 20 69 6d 61 67 65 22 2c 33 30 30 2c 34 30 2c 30 | image",300,40,0| 000050e0 2c 22 22 22 46 75 6c 6c 7c 20 57 68 6f 6c 65 7c |,"""Full| Whole|| 000050f0 20 57 68 6f 6c 65 20 28 73 63 61 6c 65 64 29 7c | Whole (scaled)|| 00005100 20 50 61 72 74 7c 20 50 61 72 74 20 28 73 63 61 | Part| Part (sca| 00005110 6c 65 64 29 7c 22 2c 63 72 65 61 74 65 29 0d 12 |led)|",create)..| 00005120 48 5f 20 c9 20 22 47 49 46 20 69 6d 61 67 65 22 |H_ . "GIF image"| 00005130 20 3a 20 f2 63 72 65 61 74 65 5f 6d 65 6e 75 28 | : .create_menu(| 00005140 78 25 2c 79 25 2c 22 5e 47 49 46 20 69 6d 61 67 |x%,y%,"^GIF imag| 00005150 65 22 2c 33 30 30 2c 34 30 2c 30 2c 22 24 22 2b |e",300,40,0,"$"+| 00005160 c3 28 47 49 46 49 6d 61 67 65 25 29 2b 22 26 61 |.(GIFImage%)+"&a| 00005170 30 2d 39 7c 22 2c 63 72 65 61 74 65 29 0d 12 52 |0-9|",create)..R| 00005180 05 cb 0d 12 5c 05 e1 0d 12 66 05 20 0d 12 70 0d |....\....f. ..p.| 00005190 dd f2 68 6f 75 72 5f 6f 6e 0d 12 7a 24 f4 20 54 |..hour_on..z$. T| 000051a0 75 72 6e 73 20 68 6f 75 72 67 6c 61 73 73 20 6f |urns hourglass o| 000051b0 6e 20 61 66 74 65 72 20 31 20 73 65 63 0d 12 84 |n after 1 sec...| 000051c0 15 c8 99 20 22 48 6f 75 72 67 6c 61 73 73 5f 4f |... "Hourglass_O| 000051d0 6e 22 0d 12 8e 05 e1 0d 12 98 05 20 0d 12 a2 0e |n"......... ....| 000051e0 dd f2 68 6f 75 72 5f 6f 66 66 0d 12 ac 19 f4 20 |..hour_off..... | 000051f0 54 75 72 6e 73 20 68 6f 75 72 67 6c 61 73 73 20 |Turns hourglass | 00005200 6f 66 66 0d 12 b6 16 c8 99 20 22 48 6f 75 72 67 |off...... "Hourg| 00005210 6c 61 73 73 5f 4f 66 66 22 0d 12 c0 05 e1 0d 12 |lass_Off".......| 00005220 ca 05 20 0d 12 d4 1a dd f2 65 64 69 74 5f 70 61 |.. ......edit_pa| 00005230 72 74 28 73 69 7a 65 2c 70 61 72 74 29 0d 12 de |rt(size,part)...| 00005240 37 f4 20 45 64 69 74 73 20 69 6d 61 67 65 20 73 |7. Edits image s| 00005250 69 7a 65 20 61 6e 64 20 70 61 72 74 20 28 69 66 |ize and part (if| 00005260 20 65 6e 61 62 6c 65 64 20 77 69 74 68 20 66 6c | enabled with fl| 00005270 61 67 73 29 0d 12 e8 43 f4 20 52 65 74 75 72 6e |ags)...C. Return| 00005280 73 20 77 69 74 68 20 28 73 63 61 6c 65 64 29 20 |s with (scaled) | 00005290 69 6d 61 67 65 20 69 6e 20 67 72 61 70 68 69 63 |image in graphic| 000052a0 73 20 77 69 6e 64 6f 77 20 72 65 61 64 79 20 66 |s window ready f| 000052b0 6f 72 20 73 61 76 65 0d 12 f2 41 ea 20 5f 25 2c |or save...A. _%,| 000052c0 6f 78 25 2c 6f 79 25 2c 78 25 2c 79 25 2c 62 75 |ox%,oy%,x%,y%,bu| 000052d0 74 25 2c 78 31 25 2c 78 32 25 2c 79 31 25 2c 79 |t%,x1%,x2%,y1%,y| 000052e0 32 25 2c 78 73 25 2c 79 73 25 2c 73 69 7a 65 78 |2%,xs%,ys%,sizex| 000052f0 25 2c 73 69 7a 65 79 25 0d 12 fc 11 ea 20 73 70 |%,sizey%..... sp| 00005300 72 57 25 2c 73 70 72 48 25 0d 13 06 3f ef 32 34 |rW%,sprH%...?.24| 00005310 2c 30 3b 30 3b 53 63 72 57 25 3b 53 63 72 48 25 |,0;0;ScrW%;ScrH%| 00005320 3b 3a f4 20 57 68 6f 6c 65 20 73 63 72 65 65 6e |;:. Whole screen| 00005330 20 77 69 6e 64 6f 77 20 66 6f 72 20 69 6d 61 67 | window for imag| 00005340 65 20 73 70 72 69 74 65 0d 13 10 3a 73 70 72 57 |e sprite...:sprW| 00005350 25 3d a4 73 70 72 57 3a 73 70 72 48 25 3d a4 73 |%=.sprW:sprH%=.s| 00005360 70 72 48 3a f4 20 54 72 75 65 20 4f 53 20 73 69 |prH:. True OS si| 00005370 7a 65 20 6f 66 20 69 6d 61 67 65 20 73 70 72 69 |ze of image spri| 00005380 74 65 0d 13 1a 2c 78 73 25 3d 32 5e a4 6d 6f 64 |te...,xs%=2^.mod| 00005390 65 5f 76 61 72 28 eb 2c 34 29 3a f4 20 58 20 63 |e_var(.,4):. X c| 000053a0 6f 6f 72 64 69 6e 61 74 65 20 73 74 65 70 0d 13 |oordinate step..| 000053b0 24 2c 79 73 25 3d 32 5e a4 6d 6f 64 65 5f 76 61 |$,ys%=2^.mode_va| 000053c0 72 28 eb 2c 35 29 3a f4 20 59 20 63 6f 6f 72 64 |r(.,5):. Y coord| 000053d0 69 6e 61 74 65 20 73 74 65 70 0d 13 2e 41 21 61 |inate step...A!a| 000053e0 72 67 25 3d 31 3a 61 72 67 25 21 34 3d 31 3a 61 |rg%=1:arg%!4=1:a| 000053f0 72 67 25 21 38 3d 31 3a 61 72 67 25 21 31 32 3d |rg%!8=1:arg%!12=| 00005400 31 3a da 3a f2 70 6c 6f 74 5f 69 6d 61 67 65 28 |1:.:.plot_image(| 00005410 30 2c 30 2c 30 2c 61 72 67 25 29 0d 13 38 0b e7 |0,0,0,arg%)..8..| 00005420 73 69 7a 65 20 8c 0d 13 42 3e 20 c8 97 20 c8 93 |size ...B> .. ..| 00005430 20 30 2c 30 2c 53 63 72 57 25 2c 53 63 72 48 25 | 0,0,ScrW%,ScrH%| 00005440 3a f4 20 52 65 73 74 72 69 63 74 20 70 6f 69 6e |:. Restrict poin| 00005450 74 65 72 20 74 6f 20 65 6e 74 69 72 65 20 73 63 |ter to entire sc| 00005460 72 65 65 6e 0d 13 4c 34 20 6f 78 25 3d 73 70 72 |reen..L4 ox%=spr| 00005470 57 25 2d 78 73 25 3a 6f 79 25 3d 73 70 72 48 25 |W%-xs%:oy%=sprH%| 00005480 2d 79 73 25 3a f4 20 27 4f 6c 64 27 20 63 6f 6f |-ys%:. 'Old' coo| 00005490 72 64 69 6e 61 74 65 73 0d 13 56 30 20 c8 97 20 |rdinates..V0 .. | 000054a0 b8 20 6f 78 25 2c 6f 79 25 3a f4 20 50 6f 69 6e |. ox%,oy%:. Poin| 000054b0 74 65 72 20 74 6f 20 75 70 70 65 72 20 6c 65 66 |ter to upper lef| 000054c0 74 20 63 6f 72 6e 65 72 0d 13 60 3b 20 f5 20 c8 |t corner..`; . .| 000054d0 97 20 78 25 2c 79 25 2c 62 75 74 25 3a fd 20 62 |. x%,y%,but%:. b| 000054e0 75 74 25 3d 30 3a f4 20 57 61 69 74 20 75 6e 74 |ut%=0:. Wait unt| 000054f0 69 6c 20 62 75 74 74 6f 6e 73 20 72 65 6c 65 61 |il buttons relea| 00005500 73 65 64 0d 13 6a 36 20 f5 20 f5 20 c8 97 20 78 |sed..j6 . . .. x| 00005510 25 2c 79 25 2c 62 75 74 25 3a fd 20 28 78 25 3c |%,y%,but%:. (x%<| 00005520 3e 6f 78 25 29 84 28 79 25 3c 3e 6f 79 25 29 84 |>ox%).(y%<>oy%).| 00005530 28 62 75 74 25 3c 3e 30 29 0d 13 74 0e 20 e7 62 |(but%<>0)..t. .b| 00005540 75 74 25 3d 30 20 8c 0d 13 7e 3e 20 20 e7 6f 79 |ut%=0 ...~> .oy| 00005550 25 3e 79 25 20 8c 20 ec 20 30 2c 79 25 3a f0 20 |%>y% . . 0,y%:. | 00005560 31 30 33 2c a4 6d 61 78 28 78 25 2c 6f 78 25 29 |103,.max(x%,ox%)| 00005570 2c 6f 79 25 3a f4 20 57 69 70 65 20 59 2d 70 6f |,oy%:. Wipe Y-po| 00005580 72 74 69 6f 6e 0d 13 88 3e 20 20 e7 6f 78 25 3e |rtion...> .ox%>| 00005590 78 25 20 8c 20 ec 20 78 25 2c 30 3a f0 20 31 30 |x% . . x%,0:. 10| 000055a0 33 2c 6f 78 25 2c a4 6d 61 78 28 79 25 2c 6f 79 |3,ox%,.max(y%,oy| 000055b0 25 29 3a f4 20 57 69 70 65 20 58 2d 70 6f 72 74 |%):. Wipe X-port| 000055c0 69 6f 6e 0d 13 92 3a 20 20 73 69 7a 65 78 25 3d |ion...: sizex%=| 000055d0 78 25 2b 78 73 25 3a 73 69 7a 65 79 25 3d 79 25 |x%+xs%:sizey%=y%| 000055e0 2b 79 73 25 3a f4 20 54 72 75 65 20 73 63 61 6c |+ys%:. True scal| 000055f0 65 64 20 69 6d 61 67 65 20 73 69 7a 65 0d 13 9c |ed image size...| 00005600 3b 20 20 21 61 72 67 25 3d 73 69 7a 65 78 25 3a |; !arg%=sizex%:| 00005610 61 72 67 25 21 34 3d 73 69 7a 65 79 25 3a 61 72 |arg%!4=sizey%:ar| 00005620 67 25 21 38 3d 73 70 72 57 25 3a 61 72 67 25 21 |g%!8=sprW%:arg%!| 00005630 31 32 3d 73 70 72 48 25 0d 13 a6 1d 20 20 f2 70 |12=sprH%.... .p| 00005640 6c 6f 74 5f 69 6d 61 67 65 28 30 2c 30 2c 30 2c |lot_image(0,0,0,| 00005650 61 72 67 25 29 0d 13 b0 2e 20 20 6f 78 25 3d 78 |arg%).... ox%=x| 00005660 25 3a 6f 79 25 3d 79 25 3a f4 20 52 65 6d 65 6d |%:oy%=y%:. Remem| 00005670 62 65 72 20 6f 6c 64 20 63 6f 6f 72 64 69 6e 61 |ber old coordina| 00005680 74 65 73 0d 13 ba 06 20 cd 0d 13 c4 0e 20 fd 20 |tes.... ..... . | 00005690 62 75 74 25 3c 3e 30 0d 13 ce 32 cc 20 73 69 7a |but%<>0...2. siz| 000056a0 65 78 25 3d 73 70 72 57 25 3a 73 69 7a 65 79 25 |ex%=sprW%:sizey%| 000056b0 3d 73 70 72 48 25 3a f4 20 46 75 6c 6c 20 73 70 |=sprH%:. Full sp| 000056c0 72 69 74 65 20 73 69 7a 65 0d 13 d8 05 cd 0d 13 |rite size.......| 000056d0 e2 0b e7 70 61 72 74 20 8c 0d 13 ec 3b 20 f5 20 |...part ....; . | 000056e0 c8 97 20 5f 25 2c 5f 25 2c 62 75 74 25 3a fd 20 |.. _%,_%,but%:. | 000056f0 62 75 74 25 3d 30 3a f4 20 57 61 69 74 20 75 6e |but%=0:. Wait un| 00005700 74 69 6c 20 62 75 74 74 6f 6e 73 20 72 65 6c 65 |til buttons rele| 00005710 61 73 65 64 0d 13 f6 40 20 c8 97 20 c8 93 20 30 |ased...@ .. .. 0| 00005720 2c 30 2c 73 69 7a 65 78 25 2d 78 73 25 2c 73 69 |,0,sizex%-xs%,si| 00005730 7a 65 79 25 2d 79 73 25 3a f4 20 52 65 73 74 72 |zey%-ys%:. Restr| 00005740 69 63 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 |ict pointer to i| 00005750 6d 61 67 65 0d 14 00 3c 20 c8 97 20 b8 20 30 2c |mage...< .. . 0,| 00005760 73 69 7a 65 79 25 2d 79 73 25 3a f4 20 4d 6f 75 |sizey%-ys%:. Mou| 00005770 73 65 20 74 6f 20 74 6f 70 20 72 69 67 68 74 20 |se to top right | 00005780 6f 66 20 73 63 61 6c 65 64 20 73 70 72 69 74 65 |of scaled sprite| 00005790 0d 14 0a 35 20 f5 20 c8 97 20 78 31 25 2c 79 32 |...5 . .. x1%,y2| 000057a0 25 2c 62 75 74 25 3a fd 20 62 75 74 25 3c 3e 30 |%,but%:. but%<>0| 000057b0 3a f4 20 47 65 74 20 74 6f 70 20 6c 65 66 74 20 |:. Get top left | 000057c0 70 6f 69 6e 74 0d 14 14 3b 20 f5 20 c8 97 20 5f |point...; . .. _| 000057d0 25 2c 5f 25 2c 62 75 74 25 3a fd 20 62 75 74 25 |%,_%,but%:. but%| 000057e0 3d 30 3a f4 20 57 61 69 74 20 75 6e 74 69 6c 20 |=0:. Wait until | 000057f0 62 75 74 74 6f 6e 73 20 72 65 6c 65 61 73 65 64 |buttons released| 00005800 0d 14 1e 2c 20 78 32 25 3d 78 31 25 3a 79 31 25 |..., x2%=x1%:y1%| 00005810 3d 79 32 25 3a f4 20 49 6e 69 74 69 61 6c 20 77 |=y2%:. Initial w| 00005820 69 6e 64 6f 77 20 63 6f 72 6e 65 72 0d 14 28 3f |indow corner..(?| 00005830 20 c8 97 20 c8 93 20 78 31 25 2c 30 2c 73 69 7a | .. .. x1%,0,siz| 00005840 65 78 25 2d 78 73 25 2c 79 32 25 3a f4 20 54 72 |ex%-xs%,y2%:. Tr| 00005850 61 70 20 6d 6f 75 73 65 20 74 6f 20 6d 6f 76 65 |ap mouse to move| 00005860 20 64 6f 77 6e 2f 72 69 67 68 74 0d 14 32 33 20 | down/right..23 | 00005870 c8 99 20 57 53 65 74 43 6f 6c 25 2c 28 34 3c 3c |.. WSetCol%,(4<<| 00005880 34 29 2b 30 3a f4 20 49 6e 76 65 72 74 20 63 6f |4)+0:. Invert co| 00005890 6c 6f 75 72 20 6f 6e 20 73 63 72 65 65 6e 0d 14 |lour on screen..| 000058a0 3c 41 20 6f 78 25 3d 78 32 25 3a 6f 79 25 3d 79 |<A ox%=x2%:oy%=y| 000058b0 31 25 3a c8 93 20 78 31 25 2c 79 31 25 2c 78 32 |1%:.. x1%,y1%,x2| 000058c0 25 2d 78 31 25 2c 79 32 25 2d 79 31 25 3a f4 20 |%-x1%,y2%-y1%:. | 000058d0 46 69 72 73 74 20 72 65 63 74 61 6e 67 6c 65 0d |First rectangle.| 000058e0 14 46 16 20 f5 20 c8 97 20 78 32 25 2c 79 31 25 |.F. . .. x2%,y1%| 000058f0 2c 62 75 74 25 0d 14 50 1d 20 e7 28 78 32 25 3c |,but%..P. .(x2%<| 00005900 3e 6f 78 25 29 84 28 79 31 25 3c 3e 6f 79 25 29 |>ox%).(y1%<>oy%)| 00005910 20 8c 0d 14 5a 35 20 20 c8 93 20 78 31 25 2c 6f | ...Z5 .. x1%,o| 00005920 79 25 2c 6f 78 25 2d 78 31 25 2c 79 32 25 2d 6f |y%,ox%-x1%,y2%-o| 00005930 79 25 3a f4 20 57 69 70 65 20 6f 6c 64 20 72 65 |y%:. Wipe old re| 00005940 63 74 61 6e 67 6c 65 0d 14 64 30 20 20 c8 93 20 |ctangle..d0 .. | 00005950 78 31 25 2c 79 31 25 2c 78 32 25 2d 78 31 25 2c |x1%,y1%,x2%-x1%,| 00005960 79 32 25 2d 79 31 25 3a f4 20 4e 65 77 20 72 65 |y2%-y1%:. New re| 00005970 63 74 61 6e 67 6c 65 0d 14 6e 2a 20 20 6f 78 25 |ctangle..n* ox%| 00005980 3d 78 32 25 3a 6f 79 25 3d 79 31 25 3a f4 20 4f |=x2%:oy%=y1%:. O| 00005990 6c 64 20 6d 6f 75 73 65 20 70 6f 73 69 74 69 6f |ld mouse positio| 000059a0 6e 0d 14 78 06 20 cd 0d 14 82 2a 20 fd 20 62 75 |n..x. ....* . bu| 000059b0 74 25 3c 3e 30 3a f4 20 55 6e 74 69 6c 20 73 65 |t%<>0:. Until se| 000059c0 63 6f 6e 64 20 62 75 74 74 6f 6e 20 70 72 65 73 |cond button pres| 000059d0 73 0d 14 8c 42 20 c8 97 20 c8 93 20 30 2c 30 2c |s...B .. .. 0,0,| 000059e0 53 63 72 57 25 2c 53 63 72 48 25 3a f4 20 52 65 |ScrW%,ScrH%:. Re| 000059f0 73 65 74 20 6d 6f 75 73 65 20 72 65 63 74 61 6e |set mouse rectan| 00005a00 67 6c 65 20 74 6f 20 77 68 6f 6c 65 20 73 63 72 |gle to whole scr| 00005a10 65 65 6e 0d 14 96 30 20 c8 93 20 78 31 25 2c 79 |een...0 .. x1%,y| 00005a20 31 25 2c 78 32 25 2d 78 31 25 2c 79 32 25 2d 79 |1%,x2%-x1%,y2%-y| 00005a30 31 25 3a f4 20 57 69 70 65 20 72 65 63 74 61 6e |1%:. Wipe rectan| 00005a40 67 6c 65 0d 14 a0 76 20 ec 20 30 2c 30 3a f0 20 |gle...v . 0,0:. | 00005a50 31 30 33 2c 78 31 25 2d 78 73 25 2c 31 30 32 34 |103,x1%-xs%,1024| 00005a60 2d 79 73 25 3a f0 20 31 30 33 2c 31 32 38 30 2d |-ys%:. 103,1280-| 00005a70 78 73 25 2c 79 32 25 2b 79 73 25 3a f0 20 31 30 |xs%,y2%+ys%:. 10| 00005a80 33 2c 78 32 25 2b 78 73 25 2c 30 3a f0 20 31 30 |3,x2%+xs%,0:. 10| 00005a90 33 2c 78 31 25 2d 78 73 25 2c 79 31 25 2d 79 73 |3,x1%-xs%,y1%-ys| 00005aa0 25 3a f4 20 57 69 70 65 20 73 75 72 72 6f 75 6e |%:. Wipe surroun| 00005ab0 64 69 6e 67 20 61 72 65 61 0d 14 aa 45 cc 20 78 |ding area...E. x| 00005ac0 31 25 3d 30 3a 79 31 25 3d 30 3a 78 32 25 3d 73 |1%=0:y1%=0:x2%=s| 00005ad0 69 7a 65 78 25 2d 78 73 25 3a 79 32 25 3d 73 69 |izex%-xs%:y2%=si| 00005ae0 7a 65 79 25 2d 79 73 25 3a f4 20 57 68 6f 6c 65 |zey%-ys%:. Whole| 00005af0 20 73 70 72 69 74 65 20 77 69 6e 64 6f 77 0d 14 | sprite window..| 00005b00 b4 05 cd 0d 14 be 26 ef 32 34 2c 78 31 25 3b 79 |......&.24,x1%;y| 00005b10 31 25 3b 78 32 25 3b 79 32 25 3b 3a f4 20 43 6c |1%;x2%;y2%;:. Cl| 00005b20 69 70 20 77 69 6e 64 6f 77 0d 14 c8 05 e1 0d 14 |ip window.......| 00005b30 d2 05 20 0d 14 dc 12 dd f2 6f 70 74 69 6f 6e 73 |.. ......options| 00005b40 5f 6d 65 6e 75 0d 14 e6 36 f4 20 50 6f 70 73 20 |_menu...6. Pops | 00005b50 75 70 20 74 68 65 20 6f 70 74 69 6f 6e 73 20 6d |up the options m| 00005b60 65 6e 75 20 61 74 20 74 68 65 20 70 6f 69 6e 74 |enu at the point| 00005b70 65 72 20 70 6f 73 69 74 69 6f 6e 0d 14 f0 08 ea |er position.....| 00005b80 20 69 24 0d 14 fa 38 69 24 3d a4 73 65 6c 62 69 | i$...8i$=.selbi| 00005b90 74 73 28 30 2c 31 2c 30 2c ac 49 6d 67 2c 30 29 |ts(0,1,0,.Img,0)| 00005ba0 2b 22 49 6e 66 6f 23 22 2b c3 28 77 69 6e 5f 69 |+"Info#"+.(win_i| 00005bb0 6d 69 6e 66 6f 25 29 2b 22 7c 22 0d 15 04 36 69 |minfo%)+"|"...6i| 00005bc0 24 2b 3d a4 73 65 6c 62 69 74 73 28 41 75 74 6f |$+=.selbits(Auto| 00005bd0 4d 6f 64 65 2c 31 2c 30 2c 30 2c 30 29 2b 22 41 |Mode,1,0,0,0)+"A| 00005be0 75 74 6f 20 6d 6f 64 65 20 73 65 6c 65 63 74 7c |uto mode select|| 00005bf0 22 0d 15 0e 35 69 24 2b 3d a4 73 65 6c 62 69 74 |"...5i$+=.selbit| 00005c00 73 28 30 2c 31 2c 30 2c 30 2c 30 29 2b 22 47 49 |s(0,1,0,0,0)+"GI| 00005c10 46 24 33 23 22 2b c3 28 73 75 62 6d 65 6e 75 31 |F$3#"+.(submenu1| 00005c20 25 29 2b 22 7c 22 0d 15 18 39 69 24 2b 3d a4 73 |%)+"|"...9i$+=.s| 00005c30 65 6c 62 69 74 73 28 28 50 61 6c 65 74 74 65 3d |elbits((Palette=| 00005c40 31 29 2c 30 2c 30 2c ac 49 6d 67 2c 30 29 2b 22 |1),0,0,.Img,0)+"| 00005c50 49 6d 61 67 65 20 70 61 6c 65 74 74 65 7c 22 0d |Image palette|".| 00005c60 15 22 38 69 24 2b 3d a4 73 65 6c 62 69 74 73 28 |."8i$+=.selbits(| 00005c70 28 50 61 6c 65 74 74 65 3d 30 29 2c 30 2c 30 2c |(Palette=0),0,0,| 00005c80 30 2c 30 29 2b 22 44 65 73 6b 74 6f 70 20 70 61 |0,0)+"Desktop pa| 00005c90 6c 65 74 74 65 7c 22 0d 15 2c 39 69 24 2b 3d a4 |lette|"..,9i$+=.| 00005ca0 73 65 6c 62 69 74 73 28 28 50 61 6c 65 74 74 65 |selbits((Palette| 00005cb0 3d 32 29 2c 31 2c 30 2c 30 2c 30 29 2b 22 53 74 |=2),1,0,0,0)+"St| 00005cc0 61 6e 64 61 72 64 20 70 61 6c 65 74 74 65 7c 22 |andard palette|"| 00005cd0 0d 15 36 29 69 24 2b 3d a4 73 65 6c 62 69 74 73 |..6)i$+=.selbits| 00005ce0 28 30 2c 30 2c 30 2c ac 49 6d 67 2c 30 29 2b 22 |(0,0,0,.Img,0)+"| 00005cf0 5a 6f 6f 6d 20 69 6e 7c 22 0d 15 40 2a 69 24 2b |Zoom in|"..@*i$+| 00005d00 3d a4 73 65 6c 62 69 74 73 28 30 2c 30 2c 30 2c |=.selbits(0,0,0,| 00005d10 ac 49 6d 67 2c 30 29 2b 22 5a 6f 6f 6d 20 6f 75 |.Img,0)+"Zoom ou| 00005d20 74 7c 22 0d 15 4a 35 69 24 2b 3d a4 73 65 6c 62 |t|"..J5i$+=.selb| 00005d30 69 74 73 28 28 5a 6f 6f 6d 25 3d 31 29 2c 31 2c |its((Zoom%=1),1,| 00005d40 30 2c ac 49 6d 67 2c 30 29 2b 22 4e 6f 72 6d 61 |0,.Img,0)+"Norma| 00005d50 6c 20 73 69 7a 65 7c 22 0d 15 54 2f 69 24 2b 3d |l size|"..T/i$+=| 00005d60 a4 73 65 6c 62 69 74 73 28 50 61 6c 6f 6e 6f 66 |.selbits(Palonof| 00005d70 66 2c 30 2c 30 2c 30 2c 30 29 2b 22 49 6e 63 6c |f,0,0,0,0)+"Incl| 00005d80 75 64 65 24 32 7c 22 0d 15 5e 39 69 24 2b 3d a4 |ude$2|"..^9i$+=.| 00005d90 73 65 6c 62 69 74 73 28 30 2c 30 2c 30 2c ac 49 |selbits(0,0,0,.I| 00005da0 6d 67 2c 30 29 2b 22 53 61 76 65 24 33 23 22 2b |mg,0)+"Save$3#"+| 00005db0 c3 28 73 75 62 6d 65 6e 75 31 25 29 2b 22 7c 22 |.(submenu1%)+"|"| 00005dc0 0d 15 68 31 f2 63 72 65 61 74 65 5f 6d 65 6e 75 |..h1.create_menu| 00005dd0 28 2d 31 2c 30 2c 22 54 72 61 6e 73 6c 61 74 6f |(-1,0,"Translato| 00005de0 72 22 2c 33 34 32 2c 34 30 2c 30 2c 69 24 2c b9 |r",342,40,0,i$,.| 00005df0 29 0d 15 72 05 e1 0d 15 7c 05 20 0d 15 86 12 dd |)..r....|. .....| 00005e00 f2 69 63 6f 6e 62 61 72 5f 6d 65 6e 75 0d 15 90 |.iconbar_menu...| 00005e10 23 f4 20 50 6f 70 73 20 75 70 20 6d 65 6e 75 20 |#. Pops up menu | 00005e20 66 6f 72 20 69 63 6f 6e 62 61 72 20 69 63 6f 6e |for iconbar icon| 00005e30 0d 15 9a 51 f2 63 72 65 61 74 65 5f 6d 65 6e 75 |...Q.create_menu| 00005e40 28 2d 31 2c 30 2c 22 54 72 61 6e 73 6c 61 74 6f |(-1,0,"Translato| 00005e50 72 22 2c 32 30 30 2c 34 30 2c 30 2c 22 20 49 6e |r",200,40,0," In| 00005e60 66 6f 22 2b 22 23 22 2b c3 28 77 69 6e 5f 69 6e |fo"+"#"+.(win_in| 00005e70 66 6f 25 29 2b 22 7c 20 51 75 69 74 7c 22 2c b9 |fo%)+"| Quit|",.| 00005e80 29 0d 15 a4 05 e1 0d 15 ae 05 20 0d 15 b8 15 dd |)......... .....| 00005e90 f2 73 65 74 5f 6d 6f 64 65 28 6d 6f 64 65 25 29 |.set_mode(mode%)| 00005ea0 0d 15 c2 32 f4 20 53 65 74 73 20 6e 65 77 20 6d |...2. Sets new m| 00005eb0 6f 64 65 20 28 69 66 20 65 6e 61 62 6c 65 64 29 |ode (if enabled)| 00005ec0 20 66 6f 72 20 69 6d 61 67 65 20 64 69 73 70 6c | for image displ| 00005ed0 61 79 0d 15 cc 11 e7 41 75 74 6f 4d 6f 64 65 20 |ay.....AutoMode | 00005ee0 8b 20 e1 0d 15 d6 25 f2 6d 6f 64 65 5f 63 68 61 |. ....%.mode_cha| 00005ef0 6e 67 65 28 6d 6f 64 65 25 29 3a f4 20 53 65 6c |nge(mode%):. Sel| 00005f00 65 63 74 20 6d 6f 64 65 0d 15 e0 05 e1 0d 15 ea |ect mode........| 00005f10 05 20 0d 15 f4 18 dd f2 6d 6f 64 65 5f 63 68 61 |. ......mode_cha| 00005f20 6e 67 65 28 6d 6f 64 65 25 29 0d 15 fe 29 f4 20 |nge(mode%)...). | 00005f30 4d 6f 64 65 20 68 61 73 20 63 68 61 6e 67 65 64 |Mode has changed| 00005f40 20 6f 72 20 73 65 6c 65 63 74 20 6e 65 77 20 6d | or select new m| 00005f50 6f 64 65 0d 16 08 29 f4 20 49 66 20 6d 6f 64 65 |ode...). If mode| 00005f60 25 3e 3d 30 2c 20 6d 6f 64 65 20 6d 6f 64 65 25 |%>=0, mode mode%| 00005f70 20 69 73 20 73 65 6c 65 63 74 65 64 0d 16 12 28 | is selected...(| 00005f80 ea 20 5f 25 2c 78 65 69 67 25 2c 79 65 69 67 25 |. _%,xeig%,yeig%| 00005f90 2c 78 77 69 6e 64 25 2c 79 77 69 6e 64 25 2c 63 |,xwind%,ywind%,c| 00005fa0 6f 6c 73 25 0d 16 1c 33 c8 99 20 57 52 65 61 64 |ols%...3.. WRead| 00005fb0 50 25 2c 2c 70 61 6c 65 74 74 65 3a f4 20 52 65 |P%,,palette:. Re| 00005fc0 61 64 20 63 75 72 72 65 6e 74 20 57 49 4d 50 20 |ad current WIMP | 00005fd0 70 61 6c 65 74 74 65 0d 16 26 0f e7 6d 6f 64 65 |palette..&..mode| 00005fe0 25 3e 3d 30 20 8c 0d 16 30 22 20 c8 99 20 57 53 |%>=0 ...0" .. WS| 00005ff0 65 74 4d 25 2c 6d 6f 64 65 25 3a f4 20 53 65 6c |etM%,mode%:. Sel| 00006000 65 63 74 20 6d 6f 64 65 0d 16 3a d0 20 e7 eb 3c |ect mode..:. ..<| 00006010 3e 6d 6f 64 65 25 20 8c 20 f2 65 72 72 6f 72 28 |>mode% . .error(| 00006020 2d 31 2c 22 49 20 77 61 6e 74 65 64 20 74 6f 20 |-1,"I wanted to | 00006030 73 65 6c 65 63 74 20 6d 6f 64 65 20 22 2b c3 28 |select mode "+.(| 00006040 6d 6f 64 65 25 29 2b 22 20 62 75 74 20 73 6f 6d |mode%)+" but som| 00006050 65 6f 6e 65 20 77 6f 6e 27 74 20 6c 65 74 20 6d |eone won't let m| 00006060 65 20 21 20 4d 61 79 62 65 20 74 68 65 72 65 27 |e ! Maybe there'| 00006070 73 20 74 6f 6f 20 6c 69 74 74 6c 65 20 73 63 72 |s too little scr| 00006080 65 65 6e 6d 65 6d 6f 72 79 20 21 20 49 20 73 75 |eenmemory ! I su| 00006090 67 67 65 73 74 20 79 6f 75 20 73 65 6c 65 63 74 |ggest you select| 000060a0 20 61 6e 6f 74 68 65 72 20 22 2b c3 28 32 5e 28 | another "+.(2^(| 000060b0 32 5e a4 6d 6f 64 65 5f 76 61 72 28 6d 6f 64 65 |2^.mode_var(mode| 000060c0 25 2c 39 29 29 29 2b 22 20 63 6f 6c 6f 75 72 20 |%,9)))+" colour | 000060d0 6d 6f 64 65 20 21 22 29 0d 16 44 05 cd 0d 16 4e |mode !")..D....N| 000060e0 38 63 6f 6c 73 25 3d 32 5e 28 32 5e a4 6d 6f 64 |8cols%=2^(2^.mod| 000060f0 65 5f 76 61 72 28 eb 2c 39 29 29 3a f4 20 43 6f |e_var(.,9)):. Co| 00006100 6c 6f 75 72 73 20 69 6e 20 63 75 72 72 65 6e 74 |lours in current| 00006110 20 6d 6f 64 65 0d 16 58 2c e3 20 76 25 3d 30 20 | mode..X,. v%=0 | 00006120 b8 20 32 35 35 3a 74 72 61 6e 73 74 61 62 25 3f |. 255:transtab%?| 00006130 76 25 3d 76 25 80 28 63 6f 6c 73 25 2d 31 29 3a |v%=v%.(cols%-1):| 00006140 ed 0d 16 62 41 78 65 69 67 25 3d a4 6d 6f 64 65 |...bAxeig%=.mode| 00006150 5f 76 61 72 28 eb 2c 34 29 3a 79 65 69 67 25 3d |_var(.,4):yeig%=| 00006160 a4 6d 6f 64 65 5f 76 61 72 28 eb 2c 35 29 3a f4 |.mode_var(.,5):.| 00006170 20 52 65 61 64 20 58 2f 59 45 69 67 46 61 63 74 | Read X/YEigFact| 00006180 6f 72 0d 16 6c 41 78 77 69 6e 64 25 3d a4 6d 6f |or..lAxwind%=.mo| 00006190 64 65 5f 76 61 72 28 eb 2c 31 31 29 3a 79 77 69 |de_var(.,11):ywi| 000061a0 6e 64 25 3d a4 6d 6f 64 65 5f 76 61 72 28 eb 2c |nd%=.mode_var(.,| 000061b0 31 32 29 3a f4 20 53 63 72 65 65 6e 20 70 69 78 |12):. Screen pix| 000061c0 65 6c 73 0d 16 76 49 53 63 72 57 25 3d 28 31 3c |els..vIScrW%=(1<| 000061d0 3c 78 65 69 67 25 29 2a 28 78 77 69 6e 64 25 2b |<xeig%)*(xwind%+| 000061e0 31 29 3a 53 63 72 48 25 3d 28 31 3c 3c 79 65 69 |1):ScrH%=(1<<yei| 000061f0 67 25 29 2a 28 79 77 69 6e 64 25 2b 31 29 3a f4 |g%)*(ywind%+1):.| 00006200 20 53 63 72 65 65 6e 20 73 69 7a 65 0d 16 80 1d | Screen size....| 00006210 e7 ac 49 6d 67 20 8c 20 f2 73 65 74 5f 70 61 6c |..Img . .set_pal| 00006220 65 74 74 65 28 30 29 3a e1 0d 16 8a 2b f2 6e 65 |ette(0):....+.ne| 00006230 77 5f 69 6d 61 67 65 5f 77 69 6e 64 6f 77 3a f2 |w_image_window:.| 00006240 73 65 74 5f 70 61 6c 65 74 74 65 28 50 61 6c 65 |set_palette(Pale| 00006250 74 74 65 29 0d 16 94 05 e1 0d 16 9e 05 20 0d 16 |tte)......... ..| 00006260 a8 23 dd f2 70 6c 6f 74 5f 69 6d 61 67 65 28 78 |.#..plot_image(x| 00006270 25 2c 79 25 2c 61 63 74 25 2c 73 63 61 6c 65 25 |%,y%,act%,scale%| 00006280 29 0d 16 b2 2f f4 20 50 6c 6f 74 73 20 69 6d 61 |).../. Plots ima| 00006290 67 65 20 73 70 72 69 74 65 20 77 69 74 68 20 74 |ge sprite with t| 000062a0 72 61 6e 73 6c 61 74 69 6f 6e 20 74 61 62 6c 65 |ranslation table| 000062b0 0d 16 bc 43 c8 99 20 4f 53 53 70 6f 70 25 2c 35 |...C.. OSSpop%,5| 000062c0 32 2b 32 35 36 2c 53 70 72 69 74 65 25 2c 49 73 |2+256,Sprite%,Is| 000062d0 70 72 6e 61 6d 65 24 2c 78 25 2c 79 25 2c 61 63 |prname$,x%,y%,ac| 000062e0 74 25 2c 73 63 61 6c 65 25 2c 74 72 61 6e 73 74 |t%,scale%,transt| 000062f0 61 62 25 0d 16 c6 05 e1 0d 16 d0 05 20 0d 16 da |ab%......... ...| 00006300 19 dd f2 64 69 73 70 6c 61 79 28 63 6f 64 65 2c |...display(code,| 00006310 6d 6f 64 65 25 29 0d 16 e4 31 f4 20 44 69 73 70 |mode%)...1. Disp| 00006320 6c 61 79 73 20 70 69 63 74 75 72 65 2c 20 63 61 |lays picture, ca| 00006330 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 61 74 |lling routine at| 00006340 20 27 63 6f 64 65 27 0d 16 ee 31 f4 20 41 63 74 | 'code'...1. Act| 00006350 73 20 61 73 20 61 70 70 72 6f 70 69 61 74 65 20 |s as appropiate | 00006360 66 6f 72 20 53 70 65 63 69 61 6c 44 69 73 70 6c |for SpecialDispl| 00006370 61 79 20 6d 6f 64 65 73 0d 16 f8 08 ea 20 5f 25 |ay modes..... _%| 00006380 0d 17 02 49 5f 25 3d a4 6d 6f 64 65 5f 76 61 72 |...I_%=.mode_var| 00006390 28 6d 6f 64 65 25 2c 39 29 3a 21 61 72 63 62 69 |(mode%,9):!arcbi| 000063a0 74 73 3d 32 5e 5f 25 3a 21 61 72 63 70 69 78 73 |ts=2^_%:!arcpixs| 000063b0 3d 38 2f 32 5e 5f 25 3a f4 20 53 65 74 20 63 6f |=8/2^_%:. Set co| 000063c0 6c 6f 75 72 20 69 6e 66 6f 0d 17 0c 11 f2 70 72 |lour info.....pr| 000063d0 65 70 5f 70 61 6c 65 74 74 65 0d 17 16 1d d6 20 |ep_palette..... | 000063e0 63 6f 64 65 3a f4 20 55 6e 70 61 63 6b 20 74 6f |code:. Unpack to| 000063f0 20 73 70 72 69 74 65 0d 17 20 05 e1 0d 17 2a 05 | sprite.. ....*.| 00006400 20 0d 17 34 1b dd f2 73 65 74 5f 70 61 6c 65 74 | ..4...set_palet| 00006410 74 65 28 70 61 6c 65 74 74 65 25 29 0d 17 3e 2a |te(palette%)..>*| 00006420 f4 20 53 65 74 73 20 61 20 70 61 6c 65 74 74 65 |. Sets a palette| 00006430 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 61 | according to pa| 00006440 6c 65 74 74 65 25 0d 17 48 1a f4 20 20 30 20 2d |lette%..H.. 0 -| 00006450 20 44 65 73 6b 74 6f 70 20 70 61 6c 65 74 74 65 | Desktop palette| 00006460 0d 17 52 1e f4 20 20 31 20 2d 20 49 6d 61 67 65 |..R.. 1 - Image| 00006470 27 73 20 6f 77 6e 20 70 61 6c 65 74 74 65 0d 17 |'s own palette..| 00006480 5c 1b f4 20 20 32 20 2d 20 53 74 61 6e 64 61 72 |\.. 2 - Standar| 00006490 64 20 70 61 6c 65 74 74 65 0d 17 66 41 e7 70 61 |d palette..fA.pa| 000064a0 6c 65 74 74 65 25 3d 31 20 8c 20 e7 a4 69 6d 61 |lette%=1 . ..ima| 000064b0 67 65 5f 63 6f 6c 73 3c 3e 32 5e 28 32 5e a4 6d |ge_cols<>2^(2^.m| 000064c0 6f 64 65 5f 76 61 72 28 eb 2c 39 29 29 20 8c 20 |ode_var(.,9)) . | 000064d0 70 61 6c 65 74 74 65 25 3d 30 0d 17 70 11 c8 8e |palette%=0..p...| 000064e0 20 70 61 6c 65 74 74 65 25 20 ca 0d 17 7a 1d 20 | palette% ...z. | 000064f0 c9 20 30 20 3a 20 c8 99 20 57 53 65 74 50 25 2c |. 0 : .. WSetP%,| 00006500 2c 70 61 6c 65 74 74 65 0d 17 84 19 20 c9 20 31 |,palette.... . 1| 00006510 20 3a 20 f2 69 6d 61 67 65 5f 70 61 6c 65 74 74 | : .image_palett| 00006520 65 0d 17 8e 0e 20 c9 20 32 20 3a 20 ef 32 30 0d |e.... . 2 : .20.| 00006530 17 98 16 cb 3a 50 61 6c 65 74 74 65 3d 70 61 6c |....:Palette=pal| 00006540 65 74 74 65 25 0d 17 a2 05 e1 0d 17 ac 05 20 0d |ette%......... .| 00006550 17 b6 10 dd a4 69 6d 61 67 65 5f 63 6f 6c 73 0d |.....image_cols.| 00006560 17 c0 2f f4 20 52 65 74 75 72 6e 73 20 6e 75 6d |../. Returns num| 00006570 62 65 72 20 6f 66 20 63 6f 6c 6f 75 72 73 20 69 |ber of colours i| 00006580 6e 20 69 6d 61 67 65 20 73 70 72 69 74 65 0d 17 |n image sprite..| 00006590 ca 08 ea 20 5f 25 0d 17 d4 42 c8 99 20 4f 53 53 |... _%...B.. OSS| 000065a0 70 6f 70 25 2c 34 30 2b 32 35 36 2c 53 70 72 69 |pop%,40+256,Spri| 000065b0 74 65 25 2c 49 73 70 72 6e 61 6d 65 24 20 b8 20 |te%,Isprname$ . | 000065c0 2c 2c 2c 2c 2c 2c 5f 25 3a f4 20 53 70 72 69 74 |,,,,,,_%:. Sprit| 000065d0 65 27 73 20 6d 6f 64 65 0d 17 de 1a 3d 32 5e 28 |e's mode....=2^(| 000065e0 32 5e a4 6d 6f 64 65 5f 76 61 72 28 5f 25 2c 39 |2^.mode_var(_%,9| 000065f0 29 29 0d 17 e8 05 20 0d 17 f2 12 dd f2 70 72 65 |)).... ......pre| 00006600 70 5f 70 61 6c 65 74 74 65 0d 17 fc 3e f4 20 53 |p_palette...>. S| 00006610 65 74 73 20 75 70 20 62 65 73 74 20 70 6f 73 73 |ets up best poss| 00006620 69 62 6c 65 20 70 61 6c 65 74 74 65 2f 63 6f 6c |ible palette/col| 00006630 6f 75 72 20 6d 61 70 20 66 6f 72 20 6d 61 63 68 |our map for mach| 00006640 69 6e 65 63 6f 64 65 0d 18 06 44 f4 20 50 61 6c |inecode...D. Pal| 00006650 65 74 74 65 25 28 30 29 20 63 6f 6e 74 61 69 6e |ette%(0) contain| 00006660 73 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 6c 65 |s number of pale| 00006670 74 74 65 20 65 6e 74 72 69 65 73 20 28 65 6e 74 |tte entries (ent| 00006680 72 79 20 31 2d 23 63 6f 6c 73 29 0d 18 10 49 f4 |ry 1-#cols)...I.| 00006690 20 49 66 20 2d 31 20 74 68 65 6e 20 73 74 72 61 | If -1 then stra| 000066a0 69 67 68 74 20 6d 61 70 70 69 6e 67 20 69 73 20 |ight mapping is | 000066b0 75 73 65 64 2c 20 65 6c 73 65 20 63 6c 6f 73 65 |used, else close| 000066c0 73 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e |st approximation| 000066d0 20 6d 61 70 0d 18 1a 21 f4 20 50 61 6c 65 74 74 | map...!. Palett| 000066e0 65 20 65 6e 74 72 69 65 73 20 61 72 65 20 26 52 |e entries are &R| 000066f0 52 47 47 42 42 0d 18 24 17 ea 20 63 25 2c 70 25 |RGGBB..$.. c%,p%| 00006700 2c 72 25 2c 67 25 2c 62 25 2c 5f 25 0d 18 2e 33 |,r%,g%,b%,_%...3| 00006710 e7 50 61 6c 65 74 74 65 25 28 30 29 3d 2d 31 20 |.Palette%(0)=-1 | 00006720 8c 20 e3 20 63 25 3d 30 20 b8 20 32 35 35 3a 63 |. . c%=0 . 255:c| 00006730 6f 6c 6d 61 70 3f 63 25 3d 63 25 3a ed 3a e1 0d |olmap?c%=c%:.:..| 00006740 18 38 1a e3 20 63 25 3d 30 20 b8 20 50 61 6c 65 |.8.. c%=0 . Pale| 00006750 74 74 65 25 28 30 29 2d 31 0d 18 42 3e 70 25 3d |tte%(0)-1..B>p%=| 00006760 50 61 6c 65 74 74 65 25 28 63 25 2b 31 29 3a 72 |Palette%(c%+1):r| 00006770 25 3d 28 70 25 3e 3e 31 36 29 80 26 46 30 3a 67 |%=(p%>>16).&F0:g| 00006780 25 3d 28 70 25 3e 3e 38 29 80 26 46 30 3a 62 25 |%=(p%>>8).&F0:b%| 00006790 3d 70 25 80 26 46 30 0d 18 4c 16 e7 50 61 6c 65 |=p%.&F0..L..Pale| 000067a0 74 74 65 25 28 30 29 3c 3d 31 36 20 8c 0d 18 56 |tte%(0)<=16 ...V| 000067b0 23 20 63 6f 6c 6d 61 70 3f 63 25 3d 63 25 3a f4 |# colmap?c%=c%:.| 000067c0 20 53 74 72 61 69 67 68 74 20 63 6f 6c 6d 61 70 | Straight colmap| 000067d0 0d 18 60 2f cc 20 f4 20 43 6c 6f 73 65 73 74 20 |..`/. . Closest | 000067e0 38 2d 62 69 74 20 63 6f 6c 6f 75 72 20 76 61 6c |8-bit colour val| 000067f0 75 65 20 69 6e 20 63 6f 6c 6f 75 72 6d 61 70 0d |ue in colourmap.| 00006800 18 6a 33 20 5f 25 3d 28 72 25 3c 3c 34 29 2b 67 |.j3 _%=(r%<<4)+g| 00006810 25 2b 28 62 25 3e 3e 34 29 3a 63 6f 6c 6d 61 70 |%+(b%>>4):colmap| 00006820 3f 63 25 3d 66 72 6f 6d 5f 72 67 62 6d 61 70 3f |?c%=from_rgbmap?| 00006830 5f 25 0d 18 74 05 cd 0d 18 7e 05 ed 0d 18 88 05 |_%..t....~......| 00006840 e1 0d 18 92 05 20 0d 18 9c 13 dd f2 69 6d 61 67 |..... ......imag| 00006850 65 5f 70 61 6c 65 74 74 65 0d 18 a6 18 f4 20 57 |e_palette..... W| 00006860 72 69 74 65 73 20 74 68 65 20 70 61 6c 65 74 74 |rites the palett| 00006870 65 0d 18 b0 44 f4 20 50 61 6c 65 74 74 65 25 28 |e...D. Palette%(| 00006880 30 29 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6d 62 |0) contains numb| 00006890 65 72 20 6f 66 20 70 61 6c 65 74 74 65 20 65 6e |er of palette en| 000068a0 74 72 69 65 73 20 28 65 6e 74 72 79 20 31 2d 23 |tries (entry 1-#| 000068b0 63 6f 6c 73 29 0d 18 ba 2e f4 20 49 66 20 2d 31 |cols)..... If -1| 000068c0 20 6f 72 20 3e 31 36 20 74 68 65 6e 20 70 61 6c | or >16 then pal| 000068d0 65 74 74 65 20 72 65 6d 61 69 6e 73 20 69 6e 74 |ette remains int| 000068e0 61 63 74 0d 18 c4 21 f4 20 50 61 6c 65 74 74 65 |act...!. Palette| 000068f0 20 65 6e 74 72 69 65 73 20 61 72 65 20 26 52 52 | entries are &RR| 00006900 47 47 42 42 0d 18 ce 14 ea 20 63 25 2c 70 25 2c |GGBB..... c%,p%,| 00006910 72 25 2c 67 25 2c 62 25 0d 18 d8 15 e7 ac 49 6d |r%,g%,b%......Im| 00006920 67 20 84 20 a4 63 32 35 36 20 8c 20 e1 0d 18 e2 |g . .c256 . ....| 00006930 3b e7 28 50 61 6c 65 74 74 65 25 28 30 29 3d 2d |;.(Palette%(0)=-| 00006940 31 29 84 28 50 61 6c 65 74 74 65 25 28 30 29 3e |1).(Palette%(0)>| 00006950 31 36 29 20 8c 20 e1 3a f4 20 4e 6f 20 70 61 6c |16) . .:. No pal| 00006960 65 74 74 65 20 73 65 74 0d 18 ec 1a e3 20 63 25 |ette set..... c%| 00006970 3d 30 20 b8 20 50 61 6c 65 74 74 65 25 28 30 29 |=0 . Palette%(0)| 00006980 2d 31 0d 18 f6 3e 70 25 3d 50 61 6c 65 74 74 65 |-1...>p%=Palette| 00006990 25 28 63 25 2b 31 29 3a 72 25 3d 28 70 25 3e 3e |%(c%+1):r%=(p%>>| 000069a0 31 36 29 80 26 46 30 3a 67 25 3d 28 70 25 3e 3e |16).&F0:g%=(p%>>| 000069b0 38 29 80 26 46 30 3a 62 25 3d 70 25 80 26 46 30 |8).&F0:b%=p%.&F0| 000069c0 0d 19 00 18 ef 31 39 2c 63 25 2c 31 36 2c 72 25 |.....19,c%,16,r%| 000069d0 2c 67 25 2c 62 25 3a ed 0d 19 0a 05 e1 0d 19 14 |,g%,b%:.........| 000069e0 05 20 0d 19 1e 46 dd f2 6d 6f 64 65 5f 69 6e 66 |. ...F..mode_inf| 000069f0 6f 28 6d 6f 64 65 25 2c f8 20 77 69 64 74 68 25 |o(mode%,. width%| 00006a00 2c f8 20 68 65 69 67 68 74 25 2c f8 20 63 6f 6c |,. height%,. col| 00006a10 6f 75 72 73 25 2c f8 20 74 78 63 6f 6c 25 2c f8 |ours%,. txcol%,.| 00006a20 20 74 78 72 6f 77 25 29 0d 19 28 31 f4 20 52 65 | txrow%)..(1. Re| 00006a30 74 75 72 6e 73 20 69 6e 66 6f 72 6d 61 74 69 6f |turns informatio| 00006a40 6e 20 61 62 6f 75 74 20 61 20 70 61 72 74 69 63 |n about a partic| 00006a50 75 6c 61 72 20 6d 6f 64 65 0d 19 32 08 ea 20 5f |ular mode..2.. _| 00006a60 25 0d 19 3c 3d c8 99 20 22 4f 53 5f 52 65 61 64 |%..<=.. "OS_Read| 00006a70 4d 6f 64 65 56 61 72 69 61 62 6c 65 22 2c 6d 6f |ModeVariable",mo| 00006a80 64 65 25 2c 39 20 b8 20 2c 2c 5f 25 3a 63 6f 6c |de%,9 . ,,_%:col| 00006a90 6f 75 72 73 25 3d 32 5e 28 32 5e 5f 25 29 0d 19 |ours%=2^(2^_%)..| 00006aa0 46 38 c8 99 20 22 4f 53 5f 52 65 61 64 4d 6f 64 |F8.. "OS_ReadMod| 00006ab0 65 56 61 72 69 61 62 6c 65 22 2c 6d 6f 64 65 25 |eVariable",mode%| 00006ac0 2c 31 31 20 b8 20 2c 2c 5f 25 3a 77 69 64 74 68 |,11 . ,,_%:width| 00006ad0 25 3d 5f 25 2b 31 0d 19 50 39 c8 99 20 22 4f 53 |%=_%+1..P9.. "OS| 00006ae0 5f 52 65 61 64 4d 6f 64 65 56 61 72 69 61 62 6c |_ReadModeVariabl| 00006af0 65 22 2c 6d 6f 64 65 25 2c 31 32 20 b8 20 2c 2c |e",mode%,12 . ,,| 00006b00 5f 25 3a 68 65 69 67 68 74 25 3d 5f 25 2b 31 0d |_%:height%=_%+1.| 00006b10 19 5a 37 c8 99 20 22 4f 53 5f 52 65 61 64 4d 6f |.Z7.. "OS_ReadMo| 00006b20 64 65 56 61 72 69 61 62 6c 65 22 2c 6d 6f 64 65 |deVariable",mode| 00006b30 25 2c 31 20 b8 20 2c 2c 5f 25 3a 74 78 63 6f 6c |%,1 . ,,_%:txcol| 00006b40 25 3d 5f 25 2b 31 0d 19 64 37 c8 99 20 22 4f 53 |%=_%+1..d7.. "OS| 00006b50 5f 52 65 61 64 4d 6f 64 65 56 61 72 69 61 62 6c |_ReadModeVariabl| 00006b60 65 22 2c 6d 6f 64 65 25 2c 32 20 b8 20 2c 2c 5f |e",mode%,2 . ,,_| 00006b70 25 3a 74 78 72 6f 77 25 3d 5f 25 2b 31 0d 19 6e |%:txrow%=_%+1..n| 00006b80 05 e1 0d 19 78 05 20 0d 19 82 17 dd f2 69 6e 76 |....x. ......inv| 00006b90 61 6c 69 64 61 74 65 5f 73 63 72 65 65 6e 0d 19 |alidate_screen..| 00006ba0 8c 1f f4 20 49 6e 76 61 6c 69 64 61 74 65 73 20 |... Invalidates | 00006bb0 65 6e 74 69 72 65 20 73 63 72 65 65 6e 0d 19 96 |entire screen...| 00006bc0 3d c8 99 20 57 46 6f 72 63 65 25 2c 2d 31 2c 30 |=.. WForce%,-1,0| 00006bd0 2c 30 2c 53 63 72 57 25 2c 53 63 72 48 25 3a f4 |,0,ScrW%,ScrH%:.| 00006be0 20 46 6f 72 63 65 20 72 65 64 72 61 77 20 77 68 | Force redraw wh| 00006bf0 6f 6c 65 20 73 63 72 65 65 6e 0d 19 a0 05 e1 0d |ole screen......| 00006c00 19 aa 05 20 0d 19 b4 19 dd f2 6e 65 77 5f 77 69 |... ......new_wi| 00006c10 6e 64 6f 77 28 68 61 6e 64 6c 65 25 29 0d 19 be |ndow(handle%)...| 00006c20 3f f4 20 43 6c 6f 73 65 73 20 61 6e 64 20 72 65 |?. Closes and re| 00006c30 2d 6f 70 65 6e 73 20 77 69 6e 64 6f 77 20 74 6f |-opens window to| 00006c40 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 20 72 | do a complete r| 00006c50 65 2d 64 72 61 77 20 6f 66 20 69 74 0d 19 c8 1a |e-draw of it....| 00006c60 f2 63 6c 6f 73 65 5f 77 69 6e 64 6f 77 28 68 61 |.close_window(ha| 00006c70 6e 64 6c 65 25 29 0d 19 d2 1b f2 6f 70 65 6e 5f |ndle%).....open_| 00006c80 77 69 6e 64 6f 77 28 68 61 6e 64 6c 65 25 2c 30 |window(handle%,0| 00006c90 29 0d 19 dc 05 e1 0d 19 e6 05 20 0d 19 f0 22 dd |)......... ...".| 00006ca0 f2 72 65 64 72 61 77 5f 77 69 6e 64 6f 77 28 68 |.redraw_window(h| 00006cb0 61 6e 64 6c 65 25 2c 66 6f 72 63 65 29 0d 19 fa |andle%,force)...| 00006cc0 28 f4 20 52 65 64 72 61 77 73 20 77 69 6e 64 6f |(. Redraws windo| 00006cd0 77 20 77 69 74 68 20 68 61 6e 64 6c 65 20 68 61 |w with handle ha| 00006ce0 6e 64 6c 65 25 0d 1a 04 4c f4 20 49 66 20 66 6f |ndle%...L. If fo| 00006cf0 72 63 65 3d 54 52 55 45 20 74 68 65 20 77 69 6e |rce=TRUE the win| 00006d00 64 6f 77 27 73 20 77 6f 72 6b 20 61 72 65 61 20 |dow's work area | 00006d10 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20 |is updated with | 00006d20 57 69 6d 70 5f 55 70 64 61 74 65 57 69 6e 64 6f |Wimp_UpdateWindo| 00006d30 77 0d 1a 0e 4c f4 20 61 6e 64 20 74 68 65 20 63 |w...L. and the c| 00006d40 6f 6f 72 64 69 6e 61 74 65 73 20 6f 66 20 74 68 |oordinates of th| 00006d50 65 20 61 72 65 61 20 74 6f 20 62 65 20 75 70 64 |e area to be upd| 00006d60 61 74 65 64 20 73 68 6f 75 6c 64 20 62 65 20 61 |ated should be a| 00006d70 74 20 62 6c 6f 63 6b 21 34 2e 2e 31 36 0d 1a 18 |t block!4..16...| 00006d80 36 ea 20 6e 78 25 2c 6e 79 25 2c 6d 6f 72 65 2c |6. nx%,ny%,more,| 00006d90 77 77 25 2c 77 68 25 2c 63 25 2c 78 25 2c 79 25 |ww%,wh%,c%,x%,y%| 00006da0 2c 6f 25 2c 6c 6f 25 2c 7a 25 2c 5f 25 2c 6b 25 |,o%,lo%,z%,_%,k%| 00006db0 2c 5f 24 0d 1a 22 17 ea 20 61 72 63 77 25 2c 61 |,_$..".. arcw%,a| 00006dc0 72 63 68 25 2c 61 72 63 63 25 0d 1a 2c 28 21 62 |rch%,arcc%..,(!b| 00006dd0 6c 6f 63 6b 3d 68 61 6e 64 6c 65 25 3a f4 20 53 |lock=handle%:. S| 00006de0 65 74 20 77 69 6e 64 6f 77 27 73 20 68 61 6e 64 |et window's hand| 00006df0 6c 65 0d 1a 36 43 e7 66 6f 72 63 65 20 8c 20 c8 |le..6C.force . .| 00006e00 99 20 57 55 70 64 61 74 65 57 25 2c 2c 62 6c 6f |. WUpdateW%,,blo| 00006e10 63 6b 20 b8 20 6d 6f 72 65 20 8b c8 99 20 57 52 |ck . more ... WR| 00006e20 65 64 72 61 77 57 25 2c 2c 62 6c 6f 63 6b 20 b8 |edrawW%,,block .| 00006e30 20 6d 6f 72 65 0d 1a 40 46 6e 78 25 3d 28 62 6c | more..@Fnx%=(bl| 00006e40 6f 63 6b 21 34 2d 62 6c 6f 63 6b 21 32 30 29 3a |ock!4-block!20):| 00006e50 6e 79 25 3d 28 62 6c 6f 63 6b 21 31 36 2d 62 6c |ny%=(block!16-bl| 00006e60 6f 63 6b 21 32 34 29 3a f4 20 47 65 74 20 73 70 |ock!24):. Get sp| 00006e70 72 69 74 65 20 6f 72 69 67 69 6e 0d 1a 4a 45 77 |rite origin..JEw| 00006e80 77 25 3d 62 6c 6f 63 6b 21 33 36 2d 62 6c 6f 63 |w%=block!36-bloc| 00006e90 6b 21 32 38 3a 77 68 25 3d 62 6c 6f 63 6b 21 34 |k!28:wh%=block!4| 00006ea0 30 2d 62 6c 6f 63 6b 21 33 32 3a f4 20 57 69 6e |0-block!32:. Win| 00006eb0 64 6f 77 20 77 69 64 74 68 2f 68 65 69 67 68 74 |dow width/height| 00006ec0 0d 1a 54 2f 21 61 72 67 25 3d 5a 6f 6f 6d 25 3a |..T/!arg%=Zoom%:| 00006ed0 61 72 67 25 21 34 3d 5a 6f 6f 6d 25 3a 61 72 67 |arg%!4=Zoom%:arg| 00006ee0 25 21 38 3d 31 3a 61 72 67 25 21 31 32 3d 31 0d |%!8=1:arg%!12=1.| 00006ef0 1a 5e 0b c8 95 20 6d 6f 72 65 0d 1a 68 10 c8 8e |.^... more..h...| 00006f00 20 68 61 6e 64 6c 65 25 20 ca 0d 1a 72 25 20 c9 | handle% ...r% .| 00006f10 20 77 69 6e 5f 69 6d 67 25 20 3a 20 f4 20 50 6c | win_img% : . Pl| 00006f20 6f 74 20 69 6d 61 67 65 20 73 70 72 69 74 65 0d |ot image sprite.| 00006f30 1a 7c 21 20 20 f2 70 6c 6f 74 5f 69 6d 61 67 65 |.|! .plot_image| 00006f40 28 6e 78 25 2c 6e 79 25 2c 30 2c 61 72 67 25 29 |(nx%,ny%,0,arg%)| 00006f50 0d 1a 86 21 20 c9 20 77 69 6e 5f 69 6d 69 6e 66 |...! . win_iminf| 00006f60 6f 25 20 3a 20 f4 20 49 6d 61 67 65 20 69 6e 66 |o% : . Image inf| 00006f70 6f 0d 1a 90 29 20 20 ec 20 6e 78 25 2c 6e 79 25 |o...) . nx%,ny%| 00006f80 2b 77 68 25 2d 31 36 3a f4 20 4d 6f 76 65 20 74 |+wh%-16:. Move t| 00006f90 6f 20 74 6f 70 20 6c 65 66 74 0d 1a 9a 1f 20 20 |o top left.... | 00006fa0 f1 a4 6c 69 6e 65 28 22 20 46 69 6c 65 6e 61 6d |..line(" Filenam| 00006fb0 65 22 2c 46 69 6c 65 24 29 0d 1a a4 25 20 20 f1 |e",File$)...% .| 00006fc0 a4 6c 69 6e 65 28 22 20 53 63 72 65 65 6e 20 74 |.line(" Screen t| 00006fd0 79 70 65 22 2c 49 4e 46 74 79 70 65 24 29 0d 1a |ype",INFtype$)..| 00006fe0 ae 31 20 20 f1 a4 6c 69 6e 65 28 22 20 53 63 72 |.1 ..line(" Scr| 00006ff0 65 65 6e 20 66 69 6c 65 20 73 69 7a 65 22 2c c3 |een file size",.| 00007000 46 6c 65 6e 25 2b 22 20 62 79 74 65 73 22 29 0d |Flen%+" bytes").| 00007010 1a b8 6c 20 20 e7 49 4e 46 63 6f 6d 70 72 24 3c |..l .INFcompr$<| 00007020 3e 22 22 20 8c 20 5f 25 3d 31 30 30 2d a8 28 31 |>"" . _%=100-.(1| 00007030 30 30 2a 28 49 4e 46 64 61 74 61 6c 65 6e 25 2f |00*(INFdatalen%/| 00007040 49 4e 46 70 69 63 6c 65 6e 25 29 29 3a f1 a4 6c |INFpiclen%)):..l| 00007050 69 6e 65 28 22 20 43 6f 6d 70 72 65 73 73 69 6f |ine(" Compressio| 00007060 6e 22 2c 49 4e 46 63 6f 6d 70 72 24 2b 22 20 28 |n",INFcompr$+" (| 00007070 22 2b c3 5f 25 2b 22 25 29 22 29 0d 1a c2 5b 20 |"+._%+"%)")...[ | 00007080 20 e7 49 4e 46 69 6e 66 6f 24 3c 3e 22 22 20 8c | .INFinfo$<>"" .| 00007090 20 5f 25 3d a7 49 4e 46 69 6e 66 6f 24 2c 22 7c | _%=.INFinfo$,"|| 000070a0 22 29 3a f1 a4 6c 69 6e 65 28 22 20 22 2b c0 49 |"):..line(" "+.I| 000070b0 4e 46 69 6e 66 6f 24 2c 5f 25 2d 31 29 2c c2 49 |NFinfo$,_%-1),.I| 000070c0 4e 46 69 6e 66 6f 24 2c a9 49 4e 46 69 6e 66 6f |NFinfo$,.INFinfo| 000070d0 24 2d 5f 25 29 29 0d 1a cc 55 20 20 f1 a4 6c 69 |$-_%))...U ..li| 000070e0 6e 65 28 22 20 57 69 64 74 68 20 78 20 48 65 69 |ne(" Width x Hei| 000070f0 67 68 74 20 78 20 43 6f 6c 6f 75 72 73 22 2c c3 |ght x Colours",.| 00007100 49 4e 46 77 69 64 74 68 25 2b 22 78 22 2b c3 49 |INFwidth%+"x"+.I| 00007110 4e 46 68 65 69 67 68 74 25 2b 22 78 22 2b c3 49 |NFheight%+"x"+.I| 00007120 4e 46 63 6f 6c 6f 75 72 73 25 29 0d 1a d6 89 20 |NFcolours%).... | 00007130 20 f2 6d 6f 64 65 5f 69 6e 66 6f 28 49 4e 46 6d | .mode_info(INFm| 00007140 6f 64 65 25 2c 61 72 63 77 25 2c 61 72 63 68 25 |ode%,arcw%,arch%| 00007150 2c 61 72 63 63 25 2c 5f 25 2c 5f 25 29 3a f1 a4 |,arcc%,_%,_%):..| 00007160 6c 69 6e 65 28 22 20 41 72 63 68 69 6d 65 64 65 |line(" Archimede| 00007170 73 20 73 63 72 65 65 6e 20 6d 6f 64 65 22 2c c3 |s screen mode",.| 00007180 61 72 63 77 25 2b 22 78 22 2b c3 61 72 63 68 25 |arcw%+"x"+.arch%| 00007190 2b 22 78 22 2b c3 61 72 63 63 25 2b 22 20 28 6d |+"x"+.arcc%+" (m| 000071a0 6f 64 65 20 22 2b c3 49 4e 46 6d 6f 64 65 25 2b |ode "+.INFmode%+| 000071b0 22 29 22 29 0d 1a e0 05 cb 0d 1a ea 30 c8 99 20 |")")........0.. | 000071c0 57 47 65 74 52 25 2c 2c 62 6c 6f 63 6b 20 b8 20 |WGetR%,,block . | 000071d0 6d 6f 72 65 3a f4 20 47 65 74 20 6e 65 78 74 20 |more:. Get next | 000071e0 72 65 63 74 61 6e 67 6c 65 0d 1a f4 05 ce 0d 1a |rectangle.......| 000071f0 fe 05 e1 0d 1b 08 05 20 0d 1b 12 1f dd f2 6f 70 |....... ......op| 00007200 65 6e 5f 77 69 6e 64 6f 77 28 68 61 6e 64 6c 65 |en_window(handle| 00007210 25 2c 69 6e 66 6f 29 0d 1b 1c 26 f4 20 4f 70 65 |%,info)...&. Ope| 00007220 6e 73 20 77 69 6e 64 6f 77 20 77 69 74 68 20 68 |ns window with h| 00007230 61 6e 64 6c 65 20 68 61 6e 64 6c 65 25 0d 1b 26 |andle handle%..&| 00007240 3a f4 20 49 66 20 69 6e 66 6f 3c 3e 30 20 74 68 |:. If info<>0 th| 00007250 65 6e 20 69 6e 66 6f 20 69 73 20 72 65 61 64 79 |en info is ready| 00007260 20 61 74 20 69 6e 66 6f 2c 20 65 6c 73 65 20 67 | at info, else g| 00007270 65 74 20 69 6e 66 6f 0d 1b 30 1b ea 20 62 25 2c |et info..0.. b%,| 00007280 70 78 25 2c 70 79 25 2c 5f 25 2c 78 73 25 2c 79 |px%,py%,_%,xs%,y| 00007290 73 25 0d 1b 3a 0e e7 69 6e 66 6f 3c 3e 30 20 8c |s%..:..info<>0 .| 000072a0 0d 1b 44 27 20 e3 20 62 25 3d 30 20 b8 20 33 31 |..D' . b%=0 . 31| 000072b0 20 88 20 34 3a 62 6c 6f 63 6b 21 62 25 3d 69 6e | . 4:block!b%=in| 000072c0 66 6f 21 62 25 3a ed 0d 1b 4e 26 cc 20 21 62 6c |fo!b%:...N&. !bl| 000072d0 6f 63 6b 3d 68 61 6e 64 6c 65 25 3a c8 99 20 57 |ock=handle%:.. W| 000072e0 47 65 74 57 53 25 2c 2c 62 6c 6f 63 6b 0d 1b 58 |GetWS%,,block..X| 000072f0 c8 20 e7 68 61 6e 64 6c 65 25 3c 3e 77 69 6e 5f |. .handle%<>win_| 00007300 69 6d 67 25 20 8c 20 f2 6d 6f 75 73 65 28 70 78 |img% . .mouse(px| 00007310 25 2c 70 79 25 2c 5f 25 29 3a 78 73 25 3d 62 6c |%,py%,_%):xs%=bl| 00007320 6f 63 6b 21 31 32 2d 62 6c 6f 63 6b 21 34 3a 79 |ock!12-block!4:y| 00007330 73 25 3d 62 6c 6f 63 6b 21 31 36 2d 62 6c 6f 63 |s%=block!16-bloc| 00007340 6b 21 38 3a 62 6c 6f 63 6b 21 34 3d 70 78 25 2d |k!8:block!4=px%-| 00007350 36 34 3a 62 6c 6f 63 6b 21 38 3d 70 79 25 2d 79 |64:block!8=py%-y| 00007360 73 25 2b 31 36 3a 62 6c 6f 63 6b 21 31 32 3d 62 |s%+16:block!12=b| 00007370 6c 6f 63 6b 21 34 2b 78 73 25 3a 62 6c 6f 63 6b |lock!4+xs%:block| 00007380 21 31 36 3d 62 6c 6f 63 6b 21 38 2b 79 73 25 3a |!16=block!8+ys%:| 00007390 f4 20 50 6f 70 20 75 70 20 61 74 20 6d 6f 75 73 |. Pop up at mous| 000073a0 65 20 69 66 20 6e 6f 74 20 69 6d 61 67 65 20 77 |e if not image w| 000073b0 69 6e 64 6f 77 0d 1b 62 05 cd 0d 1b 6c 15 c8 99 |indow..b....l...| 000073c0 20 57 4f 70 65 6e 57 25 2c 2c 62 6c 6f 63 6b 0d | WOpenW%,,block.| 000073d0 1b 76 05 e1 0d 1b 80 05 20 0d 1b 8a 1b dd f2 63 |.v...... ......c| 000073e0 6c 6f 73 65 5f 77 69 6e 64 6f 77 28 68 61 6e 64 |lose_window(hand| 000073f0 6c 65 25 29 0d 1b 94 27 f4 20 43 6c 6f 73 65 73 |le%)...'. Closes| 00007400 20 77 69 6e 64 6f 77 20 77 69 74 68 20 68 61 6e | window with han| 00007410 64 6c 65 20 68 61 6e 64 6c 65 25 0d 1b 9e 25 21 |dle handle%...%!| 00007420 62 6c 6f 63 6b 3d 68 61 6e 64 6c 65 25 3a c8 99 |block=handle%:..| 00007430 20 57 43 6c 6f 73 65 57 25 2c 2c 62 6c 6f 63 6b | WCloseW%,,block| 00007440 0d 1b a8 05 e1 0d 1b b2 05 20 0d 1b bc 11 dd a4 |......... ......| 00007450 70 6f 6c 6c 28 6d 61 73 6b 25 29 0d 1b c6 40 f4 |poll(mask%)...@.| 00007460 20 52 65 74 75 72 6e 73 20 70 6f 6c 6c 20 72 65 | Returns poll re| 00007470 61 73 6f 6e 20 63 6f 64 65 2c 20 6d 61 73 6b 69 |ason code, maski| 00007480 6e 67 20 77 69 74 68 20 6d 61 73 6b 25 2c 20 64 |ng with mask%, d| 00007490 61 74 61 20 61 74 20 70 6f 6c 6c 0d 1b d0 10 ea |ata at poll.....| 000074a0 20 72 65 61 73 6f 6e 63 6f 64 65 0d 1b da 25 c8 | reasoncode...%.| 000074b0 99 20 57 50 6f 6c 6c 25 2c 6d 61 73 6b 25 2c 70 |. WPoll%,mask%,p| 000074c0 6f 6c 6c 20 b8 20 72 65 61 73 6f 6e 63 6f 64 65 |oll . reasoncode| 000074d0 0d 1b e4 0f 3d 72 65 61 73 6f 6e 63 6f 64 65 0d |....=reasoncode.| 000074e0 1b ee 05 20 0d 1b f8 10 dd f2 69 6e 69 74 69 61 |... ......initia| 000074f0 6c 69 73 65 0d 1c 02 19 f4 20 49 6e 69 74 69 61 |lise..... Initia| 00007500 6c 69 73 65 73 20 70 72 6f 67 72 61 6d 0d 1c 0c |lises program...| 00007510 3e c8 99 20 22 57 69 6d 70 5f 52 65 61 64 50 61 |>.. "Wimp_ReadPa| 00007520 6c 65 74 74 65 22 2c 2c 70 61 6c 65 74 74 65 3a |lette",,palette:| 00007530 f4 20 52 65 61 64 20 63 75 72 72 65 6e 74 20 57 |. Read current W| 00007540 49 4d 50 20 70 61 6c 65 74 74 65 0d 1c 16 34 f2 |IMP palette...4.| 00007550 68 6f 75 72 5f 6f 6e 3a f2 6d 63 6f 64 65 3a f2 |hour_on:.mcode:.| 00007560 68 6f 75 72 5f 6f 66 66 3a f4 20 47 65 6e 65 72 |hour_off:. Gener| 00007570 61 74 65 20 6d 61 63 68 69 6e 65 63 6f 64 65 0d |ate machinecode.| 00007580 1c 20 43 c8 99 20 22 4f 53 5f 43 68 65 63 6b 4d |. C.. "OS_CheckM| 00007590 6f 64 65 56 61 6c 69 64 22 2c 31 38 20 b8 20 5f |odeValid",18 . _| 000075a0 25 3a 4d 75 6c 74 69 53 79 6e 63 3d 28 5f 25 3d |%:MultiSync=(_%=| 000075b0 31 38 29 3a f4 20 4d 6f 6e 69 74 6f 72 20 74 79 |18):. Monitor ty| 000075c0 70 65 0d 1c 2a 30 61 70 70 6c 6e 61 6d 65 24 3d |pe..*0applname$=| 000075d0 22 54 72 61 6e 73 6c 61 74 6f 72 22 3a f4 20 4e |"Translator":. N| 000075e0 61 6d 65 20 6f 66 20 61 70 70 6c 69 63 61 74 69 |ame of applicati| 000075f0 6f 6e 0d 1c 34 46 c8 99 20 22 57 69 6d 70 5f 49 |on..4F.. "Wimp_I| 00007600 6e 69 74 69 61 6c 69 73 65 22 2c 32 30 30 2c 26 |nitialise",200,&| 00007610 34 42 35 33 34 31 35 34 2c 61 70 70 6c 6e 61 6d |4B534154,applnam| 00007620 65 24 20 b8 20 76 65 72 73 69 6f 6e 2c 54 61 73 |e$ . version,Tas| 00007630 6b 48 61 6e 64 6c 65 25 0d 1c 3e 39 e7 76 65 72 |kHandle%..>9.ver| 00007640 73 69 6f 6e 3c 32 30 30 20 8c 20 85 20 31 2c 22 |sion<200 . . 1,"| 00007650 49 20 63 61 6e 6e 6f 74 20 77 6f 72 6b 20 77 69 |I cannot work wi| 00007660 74 68 20 57 49 4d 50 20 70 72 65 2d 32 2e 30 30 |th WIMP pre-2.00| 00007670 22 0d 1c 48 36 57 25 3d a4 73 77 69 5f 74 6f 5f |"..H6W%=.swi_to_| 00007680 6e 72 28 22 57 69 6d 70 5f 49 6e 69 74 69 61 6c |nr("Wimp_Initial| 00007690 69 73 65 22 29 3a f4 20 42 61 73 65 20 53 57 49 |ise"):. Base SWI| 000076a0 20 6e 75 6d 62 65 72 0d 1c 52 9e 57 43 72 65 61 | number..R.WCrea| 000076b0 74 65 57 25 3d 57 25 2b 31 3a 57 43 72 65 61 74 |teW%=W%+1:WCreat| 000076c0 65 49 25 3d 57 25 2b 32 3a 57 44 65 6c 65 74 65 |eI%=W%+2:WDelete| 000076d0 57 25 3d 57 25 2b 33 3a 57 4f 70 65 6e 57 25 3d |W%=W%+3:WOpenW%=| 000076e0 57 25 2b 35 3a 57 43 6c 6f 73 65 57 25 3d 57 25 |W%+5:WCloseW%=W%| 000076f0 2b 36 3a 57 50 6f 6c 6c 25 3d 57 25 2b 37 3a 57 |+6:WPoll%=W%+7:W| 00007700 52 65 64 72 61 77 57 25 3d 57 25 2b 38 3a 57 55 |RedrawW%=W%+8:WU| 00007710 70 64 61 74 65 57 25 3d 57 25 2b 39 3a 57 47 65 |pdateW%=W%+9:WGe| 00007720 74 52 25 3d 57 25 2b 31 30 3a 57 47 65 74 57 53 |tR%=W%+10:WGetWS| 00007730 25 3d 57 25 2b 31 31 3a 57 47 65 74 57 49 25 3d |%=W%+11:WGetWI%=| 00007740 57 25 2b 31 32 0d 1c 5c 8f 57 47 65 74 49 49 25 |W%+12..\.WGetII%| 00007750 3d 57 25 2b 31 34 3a 57 47 65 74 50 49 25 3d 57 |=W%+14:WGetPI%=W| 00007760 25 2b 31 35 3a 57 44 72 61 67 42 25 3d 57 25 2b |%+15:WDragB%=W%+| 00007770 31 36 3a 57 46 6f 72 63 65 25 3d 57 25 2b 31 37 |16:WForce%=W%+17| 00007780 3a 57 43 72 65 61 74 65 4d 25 3d 57 25 2b 32 30 |:WCreateM%=W%+20| 00007790 3a 57 53 65 74 45 25 3d 57 25 2b 32 33 3a 57 52 |:WSetE%=W%+23:WR| 000077a0 65 70 6f 72 74 25 3d 57 25 2b 33 31 3a 57 53 65 |eport%=W%+31:WSe| 000077b0 74 4d 25 3d 57 25 2b 33 35 3a 57 53 65 74 50 25 |tM%=W%+35:WSetP%| 000077c0 3d 57 25 2b 33 36 3a 57 52 65 61 64 50 25 3d 57 |=W%+36:WReadP%=W| 000077d0 25 2b 33 37 0d 1c 66 40 57 53 65 74 43 6f 6c 25 |%+37..f@WSetCol%| 000077e0 3d 57 25 2b 33 38 3a 57 53 65 6e 64 4d 73 67 25 |=W%+38:WSendMsg%| 000077f0 3d 57 25 2b 33 39 3a 57 43 72 65 61 74 65 53 4d |=W%+39:WCreateSM| 00007800 25 3d 57 25 2b 34 30 3a 57 53 70 6f 70 25 3d 57 |%=W%+40:WSpop%=W| 00007810 25 2b 34 31 0d 1c 70 7d 4f 53 53 70 6f 70 25 3d |%+41..p}OSSpop%=| 00007820 a4 73 77 69 5f 74 6f 5f 6e 72 28 22 4f 53 5f 53 |.swi_to_nr("OS_S| 00007830 70 72 69 74 65 4f 70 22 29 3a 4f 53 52 65 61 64 |priteOp"):OSRead| 00007840 56 56 25 3d a4 73 77 69 5f 74 6f 5f 6e 72 28 22 |VV%=.swi_to_nr("| 00007850 4f 53 5f 52 65 61 64 56 64 75 56 61 72 69 61 62 |OS_ReadVduVariab| 00007860 6c 65 73 22 29 3a 4f 53 52 65 61 64 4d 56 25 3d |les"):OSReadMV%=| 00007870 a4 73 77 69 5f 74 6f 5f 6e 72 28 22 4f 53 5f 52 |.swi_to_nr("OS_R| 00007880 65 61 64 4d 6f 64 65 56 61 72 69 61 62 6c 65 22 |eadModeVariable"| 00007890 29 0d 1c 7a 3d 74 66 25 3d 37 3a 74 62 25 3d 32 |)..z=tf%=7:tb%=2| 000078a0 3a 77 66 25 3d 37 3a 77 62 25 3d 30 3a 73 69 25 |:wf%=7:wb%=0:si%| 000078b0 3d 31 3a 73 6f 25 3d 33 3a f4 20 57 69 6e 64 6f |=1:so%=3:. Windo| 000078c0 77 2f 6d 65 6e 75 20 63 6f 6c 6f 75 72 73 0d 1c |w/menu colours..| 000078d0 84 94 21 62 6c 6f 63 6b 3d 2d 31 3a 62 6c 6f 63 |..!block=-1:bloc| 000078e0 6b 21 34 3d 30 3a 62 6c 6f 63 6b 21 38 3d 30 3a |k!4=0:block!8=0:| 000078f0 62 6c 6f 63 6b 21 31 32 3d 36 38 3a 62 6c 6f 63 |block!12=68:bloc| 00007900 6b 21 31 36 3d 36 38 3a 62 6c 6f 63 6b 21 32 30 |k!16=68:block!20| 00007910 3d 26 32 37 30 30 33 30 30 32 3a 24 28 62 6c 6f |=&27003002:$(blo| 00007920 63 6b 2b 32 34 29 3d 22 21 74 72 61 6e 73 6c 61 |ck+24)="!transla| 00007930 74 72 22 3a c8 99 20 57 43 72 65 61 74 65 49 25 |tr":.. WCreateI%| 00007940 2c 2c 62 6c 6f 63 6b 20 b8 20 49 69 63 6f 6e 62 |,,block . Iiconb| 00007950 61 72 25 3a f4 20 49 63 6f 6e 62 61 72 20 69 63 |ar%:. Iconbar ic| 00007960 6f 6e 0d 1c 8e 40 f4 20 43 72 65 61 74 65 20 73 |on...@. Create s| 00007970 61 76 65 20 66 69 6c 65 20 77 69 6e 64 6f 77 20 |ave file window | 00007980 28 2b 20 73 70 72 69 74 65 20 66 69 6c 65 20 61 |(+ sprite file a| 00007990 6e 64 20 66 69 6c 65 6e 61 6d 65 20 69 63 6f 6e |nd filename icon| 000079a0 73 29 0d 1c 98 6d 77 69 6e 5f 73 61 76 65 25 3d |s)...mwin_save%=| 000079b0 a4 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 28 77 |.create_window(w| 000079c0 69 6e 64 6f 77 32 2c 30 2c 30 2c 32 34 30 2c 31 |indow2,0,0,240,1| 000079d0 36 30 2c 30 2c 30 2c 2d 31 2c 26 39 33 2c 74 66 |60,0,0,-1,&93,tf| 000079e0 25 2c 32 2c 77 66 25 2c 31 2c 30 2c 30 2c 32 34 |%,2,wf%,1,0,0,24| 000079f0 30 2c 31 36 30 2c 26 32 44 2c 30 2c 30 2c 31 2c |0,160,&2D,0,0,1,| 00007a00 22 53 61 76 65 20 66 69 6c 65 22 2c 5f 25 29 0d |"Save file",_%).| 00007a10 1c a2 29 24 66 69 6c 65 6e 61 6d 65 3d 22 53 63 |..)$filename="Sc| 00007a20 72 65 65 6e 22 3a f4 20 49 6e 69 74 69 61 6c 20 |reen":. Initial | 00007a30 66 69 6c 65 6e 61 6d 65 0d 1c ac 8b 21 62 6c 6f |filename....!blo| 00007a40 63 6b 3d 77 69 6e 5f 73 61 76 65 25 3a 62 6c 6f |ck=win_save%:blo| 00007a50 63 6b 21 34 3d 38 36 3a 62 6c 6f 63 6b 21 38 3d |ck!4=86:block!8=| 00007a60 36 34 3a 62 6c 6f 63 6b 21 31 32 3d 31 35 30 3a |64:block!12=150:| 00007a70 62 6c 6f 63 6b 21 31 36 3d 31 32 38 3a 62 6c 6f |block!16=128:blo| 00007a80 63 6b 21 32 30 3d 26 32 37 30 30 36 30 30 32 3a |ck!20=&27006002:| 00007a90 24 28 62 6c 6f 63 6b 2b 32 34 29 3d 22 66 69 6c |$(block+24)="fil| 00007aa0 65 5f 66 66 39 22 3a c8 99 20 57 43 72 65 61 74 |e_ff9":.. WCreat| 00007ab0 65 49 25 2c 2c 62 6c 6f 63 6b 20 b8 20 49 73 61 |eI%,,block . Isa| 00007ac0 76 65 25 0d 1c b6 90 62 6c 6f 63 6b 21 34 3d 31 |ve%....block!4=1| 00007ad0 36 3a 62 6c 6f 63 6b 21 38 3d 38 3a 62 6c 6f 63 |6:block!8=8:bloc| 00007ae0 6b 21 31 32 3d 32 32 34 3a 62 6c 6f 63 6b 21 31 |k!12=224:block!1| 00007af0 36 3d 34 38 3a 62 6c 6f 63 6b 21 32 30 3d 26 30 |6=48:block!20=&0| 00007b00 37 30 30 46 31 32 35 3a 62 6c 6f 63 6b 21 32 34 |700F125:block!24| 00007b10 3d 66 69 6c 65 6e 61 6d 65 3a 62 6c 6f 63 6b 21 |=filename:block!| 00007b20 32 38 3d 2d 31 3a 62 6c 6f 63 6b 21 33 32 3d 32 |28=-1:block!32=2| 00007b30 35 35 3a c8 99 20 57 43 72 65 61 74 65 49 25 2c |55:.. WCreateI%,| 00007b40 2c 62 6c 6f 63 6b 20 b8 20 49 66 69 6c 65 6e 61 |,block . Ifilena| 00007b50 6d 65 25 0d 1c c0 2f f4 20 43 72 65 61 74 65 20 |me%.../. Create | 00007b60 70 72 6f 67 72 61 6d 20 69 6e 66 6f 20 77 69 6e |program info win| 00007b70 64 6f 77 20 28 2b 20 69 6e 66 6f 20 69 63 6f 6e |dow (+ info icon| 00007b80 73 29 0d 1c ca 76 77 69 6e 5f 69 6e 66 6f 25 3d |s)...vwin_info%=| 00007b90 a4 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 28 77 |.create_window(w| 00007ba0 69 6e 64 6f 77 33 2c 30 2c 30 2c 39 30 30 2c 32 |indow3,0,0,900,2| 00007bb0 32 34 2c 30 2c 30 2c 2d 31 2c 26 39 33 2c 74 66 |24,0,0,-1,&93,tf| 00007bc0 25 2c 32 2c 77 66 25 2c 31 2c 30 2c 30 2c 39 30 |%,2,wf%,1,0,0,90| 00007bd0 30 2c 32 32 34 2c 26 32 44 2c 30 2c 30 2c 31 2c |0,224,&2D,0,0,1,| 00007be0 22 41 62 6f 75 74 20 74 68 69 73 20 70 72 6f 67 |"About this prog| 00007bf0 72 61 6d 22 2c 5f 25 29 0d 1c d4 9d dc 20 22 56 |ram",_%)..... "V| 00007c00 65 72 73 69 6f 6e 20 3a 22 2c 22 34 2e 32 31 20 |ersion :","4.21 | 00007c10 28 31 34 20 4e 6f 76 20 31 39 38 39 29 22 2c 22 |(14 Nov 1989)","| 00007c20 41 75 74 68 6f 72 20 3a 22 2c 22 a9 20 31 39 38 |Author :",". 198| 00007c30 39 20 5a 65 72 69 64 61 6a 68 20 62 79 20 4a 6f |9 Zeridajh by Jo| 00007c40 68 6e 20 4b 6f 72 74 69 6e 6b 22 2c 22 50 75 72 |hn Kortink","Pur| 00007c50 70 6f 73 65 20 3a 22 2c 22 54 72 61 6e 73 6c 61 |pose :","Transla| 00007c60 74 69 6f 6e 20 6f 66 20 66 6f 72 65 69 67 6e 20 |tion of foreign | 00007c70 67 72 61 70 68 69 63 73 20 66 69 6c 65 73 22 2c |graphics files",| 00007c80 22 4e 61 6d 65 20 3a 22 2c 22 54 72 61 6e 73 6c |"Name :","Transl| 00007c90 61 74 6f 72 22 0d 1c de 2a f7 20 8d 64 54 5c 3a |ator"...*. .dT\:| 00007ca0 64 61 74 61 70 74 72 3d 77 69 6e 64 6f 77 33 2b |dataptr=window3+| 00007cb0 31 30 32 34 3a e3 20 69 25 3d 30 20 b8 20 33 0d |1024:. i%=0 . 3.| 00007cc0 1c e8 97 f3 20 69 74 65 6d 24 2c 62 6f 78 24 3a |.... item$,box$:| 00007cd0 79 25 3d 31 32 2b 69 25 2a 35 32 3a 21 62 6c 6f |y%=12+i%*52:!blo| 00007ce0 63 6b 3d 77 69 6e 5f 69 6e 66 6f 25 3a 62 6c 6f |ck=win_info%:blo| 00007cf0 63 6b 21 34 3d 30 3a 62 6c 6f 63 6b 21 38 3d 79 |ck!4=0:block!8=y| 00007d00 25 3a 62 6c 6f 63 6b 21 31 32 3d 31 36 30 3a 62 |%:block!12=160:b| 00007d10 6c 6f 63 6b 21 31 36 3d 79 25 2b 34 38 3a 62 6c |lock!16=y%+48:bl| 00007d20 6f 63 6b 21 32 30 3d 26 32 37 30 30 30 32 30 31 |ock!20=&27000201| 00007d30 3a 24 28 62 6c 6f 63 6b 2b 32 34 29 3d 69 74 65 |:$(block+24)=ite| 00007d40 6d 24 3a c8 99 20 57 43 72 65 61 74 65 49 25 2c |m$:.. WCreateI%,| 00007d50 2c 62 6c 6f 63 6b 0d 1c f2 92 62 6c 6f 63 6b 21 |,block....block!| 00007d60 34 3d 31 36 30 3a 62 6c 6f 63 6b 21 31 32 3d 38 |4=160:block!12=8| 00007d70 38 30 3a 62 6c 6f 63 6b 21 32 30 3d 26 30 37 30 |80:block!20=&070| 00007d80 30 30 31 32 44 3a 62 6c 6f 63 6b 21 32 34 3d 64 |0012D:block!24=d| 00007d90 61 74 61 70 74 72 3a 62 6c 6f 63 6b 21 32 38 3d |ataptr:block!28=| 00007da0 2d 31 3a 62 6c 6f 63 6b 21 33 32 3d a9 28 62 6f |-1:block!32=.(bo| 00007db0 78 24 29 3a 24 64 61 74 61 70 74 72 3d 62 6f 78 |x$):$dataptr=box| 00007dc0 24 3a 64 61 74 61 70 74 72 2b 3d a9 28 62 6f 78 |$:dataptr+=.(box| 00007dd0 24 29 2b 31 3a c8 99 20 57 43 72 65 61 74 65 49 |$)+1:.. WCreateI| 00007de0 25 2c 2c 62 6c 6f 63 6b 0d 1c fc 05 ed 0d 1d 06 |%,,block........| 00007df0 1e f4 20 43 72 65 61 74 65 20 69 6d 61 67 65 20 |.. Create image | 00007e00 69 6e 66 6f 20 77 69 6e 64 6f 77 0d 1d 10 76 77 |info window...vw| 00007e10 69 6e 5f 69 6d 69 6e 66 6f 25 3d a4 63 72 65 61 |in_iminfo%=.crea| 00007e20 74 65 5f 77 69 6e 64 6f 77 28 77 69 6e 64 6f 77 |te_window(window| 00007e30 34 2c 30 2c 30 2c 31 30 30 30 2c 32 36 30 2c 30 |4,0,0,1000,260,0| 00007e40 2c 30 2c 2d 31 2c 26 38 33 2c 74 66 25 2c 74 62 |,0,-1,&83,tf%,tb| 00007e50 25 2c 77 66 25 2c 77 62 25 2c 30 2c 30 2c 31 30 |%,wf%,wb%,0,0,10| 00007e60 30 30 2c 34 30 30 2c 26 32 44 2c 30 2c 30 2c 31 |00,400,&2D,0,0,1| 00007e70 2c 22 49 6d 61 67 65 20 69 6e 66 6f 22 2c 5f 25 |,"Image info",_%| 00007e80 29 0d 1d 1a 14 f4 20 49 6e 69 74 20 76 61 72 69 |)..... Init vari| 00007e90 61 62 6c 65 73 0d 1d 24 6b 53 61 76 65 5f 6b 69 |ables..$kSave_ki| 00007ea0 6e 64 24 3d 22 22 3a 53 61 76 65 24 3d 22 22 3a |nd$="":Save$="":| 00007eb0 49 6d 67 3d a3 3a 49 6d 61 67 65 57 3d a3 3a 50 |Img=.:ImageW=.:P| 00007ec0 61 6c 6f 6e 6f 66 66 3d b9 3a 41 77 61 69 74 41 |alonoff=.:AwaitA| 00007ed0 63 6b 3d a3 3a 5a 6f 6f 6d 25 3d 31 3a 73 75 62 |ck=.:Zoom%=1:sub| 00007ee0 6d 65 6e 75 31 25 3d 73 75 62 6d 65 6e 75 3a 49 |menu1%=submenu:I| 00007ef0 73 70 72 6e 61 6d 65 24 3d 22 69 6d 61 67 65 22 |sprname$="image"| 00007f00 0d 1d 2e 86 49 4e 46 74 79 70 65 24 3d 22 22 3a |....INFtype$="":| 00007f10 49 4e 46 77 69 64 74 68 25 3d 30 3a 49 4e 46 68 |INFwidth%=0:INFh| 00007f20 65 69 67 68 74 25 3d 30 3a 49 4e 46 63 6f 6c 6f |eight%=0:INFcolo| 00007f30 75 72 73 25 3d 30 3a 49 4e 46 6d 6f 64 65 25 3d |urs%=0:INFmode%=| 00007f40 30 3a 49 4e 46 63 6f 6d 70 72 24 3d 22 22 3a 49 |0:INFcompr$="":I| 00007f50 4e 46 69 6e 66 6f 24 3d 22 22 3a 49 4e 46 64 61 |NFinfo$="":INFda| 00007f60 74 61 6c 65 6e 25 3d 30 3a 49 4e 46 70 69 63 6c |talen%=0:INFpicl| 00007f70 65 6e 25 3d 30 3a 46 6c 65 6e 25 3d 30 3a 46 69 |en%=0:Flen%=0:Fi| 00007f80 6c 65 24 3d 22 22 0d 1d 38 3f 50 61 6c 65 74 74 |le$=""..8?Palett| 00007f90 65 3d 30 3a 46 69 6c 65 4f 70 65 6e 3d a3 3a 53 |e=0:FileOpen=.:S| 00007fa0 70 72 57 25 3d 30 3a 53 70 72 48 25 3d 30 3a 47 |prW%=0:SprH%=0:G| 00007fb0 49 46 49 6d 61 67 65 25 3d 31 3a 41 75 74 6f 4d |IFImage%=1:AutoM| 00007fc0 6f 64 65 3d b9 0d 1d 42 2e e7 a4 6e 65 77 5f 69 |ode=...B...new_i| 00007fd0 6d 61 67 65 28 eb 2c 31 30 30 2c 31 30 30 29 3a |mage(.,100,100):| 00007fe0 f4 20 44 75 6d 6d 79 20 6d 6f 64 65 2f 73 70 72 |. Dummy mode/spr| 00007ff0 69 74 65 0d 1d 4c 05 e1 0d 1d 56 05 20 0d 1d 60 |ite..L....V. ..`| 00008000 40 dd f2 63 72 65 61 74 65 5f 6d 65 6e 75 28 78 |@..create_menu(x| 00008010 25 2c 79 25 2c 74 69 74 6c 65 24 2c 77 69 64 74 |%,y%,title$,widt| 00008020 68 25 2c 68 65 69 67 68 74 25 2c 67 61 70 25 2c |h%,height%,gap%,| 00008030 69 63 6f 6e 24 2c 63 72 65 61 74 65 29 0d 1d 6a |icon$,create)..j| 00008040 36 f4 20 57 72 69 74 65 73 20 6d 65 6e 75 20 73 |6. Writes menu s| 00008050 74 72 75 63 74 75 72 65 2c 20 63 72 65 61 74 65 |tructure, create| 00008060 73 20 69 74 20 69 66 20 63 72 65 61 74 65 3d 54 |s it if create=T| 00008070 52 55 45 0d 1d 74 3d f4 20 2d 20 49 66 20 78 25 |RUE..t=. - If x%| 00008080 3c 30 20 74 68 65 6e 20 78 2f 79 20 63 6f 6f 72 |<0 then x/y coor| 00008090 64 69 6e 61 74 65 73 20 61 72 65 20 28 6d 6f 75 |dinates are (mou| 000080a0 73 65 58 2d 36 34 29 2c 28 6d 6f 75 73 65 59 29 |seX-64),(mouseY)| 000080b0 0d 1d 7e 39 f4 20 2d 20 49 66 20 74 69 74 6c 65 |..~9. - If title| 000080c0 24 20 73 74 61 72 74 73 20 22 5e 22 20 74 68 65 |$ starts "^" the| 000080d0 6e 20 74 68 69 73 20 62 65 63 6f 6d 65 73 20 61 |n this becomes a| 000080e0 20 53 55 42 20 6d 65 6e 75 0d 1d 88 3a f4 20 2d | SUB menu...:. -| 000080f0 20 4d 65 6e 75 20 69 63 6f 6e 73 20 69 6e 20 69 | Menu icons in i| 00008100 63 6f 6e 24 20 3a 20 3f 3c 69 63 6f 6e 31 3e 7c |con$ : ?<icon1>|| 00008110 3f 3c 69 63 6f 6e 32 3e 7c 2e 2e 2e 2e 2e 20 65 |?<icon2>|..... e| 00008120 74 63 2e 0d 1d 92 31 f4 20 2d 20 3f 20 69 73 20 |tc....1. - ? is | 00008130 61 20 63 68 61 72 61 63 74 65 72 20 63 6f 6e 74 |a character cont| 00008140 61 69 6e 69 6e 67 20 73 65 6c 65 63 74 20 62 69 |aining select bi| 00008150 74 73 20 3a 0d 1d 9c 1e f4 20 20 20 62 69 74 20 |ts :..... bit | 00008160 30 20 3a 20 69 63 6f 6e 20 69 73 20 74 69 63 6b |0 : icon is tick| 00008170 65 64 0d 1d a6 31 f4 20 20 20 62 69 74 20 31 20 |ed...1. bit 1 | 00008180 3a 20 69 63 6f 6e 20 69 73 20 66 6f 6c 6c 6f 77 |: icon is follow| 00008190 65 64 20 62 79 20 61 20 64 6f 74 74 65 64 20 6c |ed by a dotted l| 000081a0 69 6e 65 0d 1d b0 20 f4 20 20 20 62 69 74 20 32 |ine... . bit 2| 000081b0 20 3a 20 69 63 6f 6e 20 69 73 20 77 72 69 74 61 | : icon is writa| 000081c0 62 6c 65 0d 1d ba 34 f4 20 20 20 62 69 74 20 33 |ble...4. bit 3| 000081d0 20 3a 20 69 63 6f 6e 20 69 73 20 73 68 61 64 65 | : icon is shade| 000081e0 64 20 28 69 2e 65 2e 20 6e 6f 74 20 73 65 6c 65 |d (i.e. not sele| 000081f0 63 74 61 62 6c 65 29 0d 1d c4 35 f4 20 20 20 62 |ctable)...5. b| 00008200 69 74 20 34 20 3a 20 77 72 69 74 61 62 6c 65 20 |it 4 : writable | 00008210 69 63 6f 6e 20 68 61 73 20 32 35 35 20 63 68 61 |icon has 255 cha| 00008220 72 61 63 74 65 72 73 20 72 6f 6f 6d 0d 1d ce 18 |racters room....| 00008230 f4 20 20 20 62 69 74 20 35 20 3a 20 61 6c 77 61 |. bit 5 : alwa| 00008240 79 73 20 31 0d 1d d8 41 f4 20 2d 20 69 63 6f 6e |ys 1...A. - icon| 00008250 73 20 6f 66 20 66 6f 72 6d 20 27 3f 3c 73 74 72 |s of form '?<str| 00008260 3e 26 3c 76 61 6c 3e 27 20 68 61 76 65 20 76 61 |>&<val>' have va| 00008270 6c 69 64 61 74 69 6f 6e 20 73 74 72 69 6e 67 20 |lidation string | 00008280 3c 76 61 6c 3e 0d 1d e2 46 f4 20 2d 20 69 63 6f |<val>...F. - ico| 00008290 6e 73 20 6f 66 20 66 6f 72 6d 20 27 3f 3c 73 74 |ns of form '?<st| 000082a0 72 3e 23 3c 76 61 6c 3e 27 20 68 61 76 65 20 73 |r>#<val>' have s| 000082b0 75 62 2d 77 69 6e 64 6f 77 20 77 69 74 68 20 68 |ub-window with h| 000082c0 61 6e 64 6c 65 20 3c 76 61 6c 3e 0d 1d ec 34 f4 |andle <val>...4.| 000082d0 20 20 20 61 6c 73 6f 2c 20 74 68 65 20 27 6d 65 | also, the 'me| 000082e0 6e 75 20 77 61 72 6e 69 6e 67 20 6d 65 73 73 61 |nu warning messa| 000082f0 67 65 27 20 69 73 20 73 65 6c 65 63 74 65 64 0d |ge' is selected.| 00008300 1d f6 4a f4 20 2d 20 69 63 6f 6e 73 20 6f 66 20 |..J. - icons of | 00008310 66 6f 72 6d 20 27 3f 3c 73 74 72 3e 24 3c 76 61 |form '?<str>$<va| 00008320 6c 3e 27 20 67 65 74 20 24 3c 76 61 6c 3e 20 72 |l>' get $<val> r| 00008330 65 70 6c 61 63 65 64 20 77 69 74 68 20 73 74 72 |eplaced with str| 00008340 69 6e 67 20 3c 76 61 6c 3e 0d 1e 00 34 f4 20 20 |ing <val>...4. | 00008350 20 24 31 20 3d 20 27 4d 6f 64 65 20 27 2c 20 24 | $1 = 'Mode ', $| 00008360 32 20 3d 20 27 20 70 61 6c 65 74 74 65 27 2c 20 |2 = ' palette', | 00008370 24 33 20 3d 20 27 20 69 6d 61 67 65 27 0d 1e 0a |$3 = ' image'...| 00008380 36 ea 20 69 24 2c 70 74 72 2c 69 78 25 2c 64 61 |6. i$,ptr,ix%,da| 00008390 74 61 70 74 72 2c 69 6c 65 6e 25 2c 70 25 2c 69 |taptr,ilen%,p%,i| 000083a0 74 24 2c 74 79 70 65 25 2c 64 61 74 61 24 2c 6d |t$,type%,data$,m| 000083b0 65 6e 75 0d 1e 14 2f ea 20 76 61 6c 69 64 24 2c |enu.../. valid$,| 000083c0 76 61 6c 69 64 70 74 72 2c 73 75 62 2c 63 61 6c |validptr,sub,cal| 000083d0 6c 25 2c 74 69 63 6b 25 2c 77 72 69 74 61 62 6c |l%,tick%,writabl| 000083e0 65 25 0d 1e 1e 33 ea 20 62 75 74 74 79 25 2c 73 |e%...3. butty%,s| 000083f0 68 61 64 65 64 25 2c 64 6f 74 74 65 64 25 2c 73 |haded%,dotted%,s| 00008400 75 62 25 2c 73 75 62 77 61 72 6e 25 2c 64 62 25 |ub%,subwarn%,db%| 00008410 2c 5f 64 62 24 0d 1e 28 19 ea 20 44 61 74 61 25 |,_db$..(.. Data%| 00008420 28 29 3a de 20 44 61 74 61 25 28 34 30 29 0d 1e |():. Data%(40)..| 00008430 32 3f e7 78 25 3c 30 20 8c 20 f2 6d 6f 75 73 65 |2?.x%<0 . .mouse| 00008440 28 78 25 2c 79 25 2c 5f 25 29 3a 78 25 2d 3d 36 |(x%,y%,_%):x%-=6| 00008450 34 3a f4 20 47 65 74 20 63 6f 6f 72 64 69 6e 61 |4:. Get coordina| 00008460 74 65 73 20 76 69 61 20 6d 6f 75 73 65 0d 1e 3c |tes via mouse..<| 00008470 15 e7 c0 74 69 74 6c 65 24 2c 31 29 3d 22 5e 22 |...title$,1)="^"| 00008480 20 8c 0d 1e 46 17 20 73 75 62 3d b9 3a 6d 65 6e | ...F. sub=.:men| 00008490 75 3d 73 75 62 6d 65 6e 75 0d 1e 50 1e 20 74 69 |u=submenu..P. ti| 000084a0 74 6c 65 24 3d c2 74 69 74 6c 65 24 2c a9 74 69 |tle$=.title$,.ti| 000084b0 74 6c 65 24 2d 31 29 0d 1e 5a 16 cc 20 73 75 62 |tle$-1)..Z.. sub| 000084c0 3d a3 3a 6d 65 6e 75 3d 6d 65 6e 75 31 0d 1e 64 |=.:menu=menu1..d| 000084d0 05 cd 0d 1e 6e 10 24 6d 65 6e 75 3d 74 69 74 6c |....n.$menu=titl| 000084e0 65 24 0d 1e 78 1b 6d 65 6e 75 3f 31 32 3d 74 66 |e$..x.menu?12=tf| 000084f0 25 3a 6d 65 6e 75 3f 31 33 3d 74 62 25 0d 1e 82 |%:menu?13=tb%...| 00008500 1b 6d 65 6e 75 3f 31 34 3d 77 66 25 3a 6d 65 6e |.menu?14=wf%:men| 00008510 75 3f 31 35 3d 77 62 25 0d 1e 8c 22 6d 65 6e 75 |u?15=wb%..."menu| 00008520 21 31 36 3d 77 69 64 74 68 25 3a 6d 65 6e 75 21 |!16=width%:menu!| 00008530 32 30 3d 68 65 69 67 68 74 25 0d 1e 96 10 6d 65 |20=height%....me| 00008540 6e 75 21 32 34 3d 67 61 70 25 0d 1e a0 12 f4 20 |nu!24=gap%..... | 00008550 44 65 66 69 6e 65 20 69 63 6f 6e 73 0d 1e aa 43 |Define icons...C| 00008560 69 24 3d 69 63 6f 6e 24 3a 70 74 72 3d 6d 65 6e |i$=icon$:ptr=men| 00008570 75 2b 32 38 3a 69 78 25 3d 30 3a 64 61 74 61 70 |u+28:ix%=0:datap| 00008580 74 72 3d 6d 65 6e 75 2b 31 30 32 34 3a 76 61 6c |tr=menu+1024:val| 00008590 69 64 70 74 72 3d 6d 65 6e 75 2b 31 39 32 30 0d |idptr=menu+1920.| 000085a0 1e b4 0d c8 95 20 69 24 3c 3e 22 22 0d 1e be 0f |..... i$<>""....| 000085b0 70 25 3d a7 69 24 2c 22 7c 22 29 0d 1e c8 0b e7 |p%=.i$,"|").....| 000085c0 70 25 3d 30 20 8c 0d 1e d2 0a 20 69 24 3d 22 22 |p%=0 ..... i$=""| 000085d0 0d 1e dc 13 cc 20 f4 20 44 65 66 69 6e 65 20 69 |..... . Define i| 000085e0 63 6f 6e 0d 1e e6 21 20 69 74 24 3d c0 69 24 2c |con...! it$=.i$,| 000085f0 70 25 2d 31 29 3a 69 24 3d c2 69 24 2c a9 69 24 |p%-1):i$=.i$,.i$| 00008600 2d 70 25 29 0d 1e f0 26 20 74 79 70 65 25 3d 97 |-p%)...& type%=.| 00008610 c0 69 74 24 2c 31 29 3a 64 61 74 61 24 3d c2 69 |.it$,1):data$=.i| 00008620 74 24 2c a9 69 74 24 2d 31 29 0d 1e fa 2a 20 64 |t$,.it$-1)...* d| 00008630 62 25 3d a7 64 61 74 61 24 2c 22 24 22 29 3a f4 |b%=.data$,"$"):.| 00008640 20 41 6e 79 20 63 6f 64 65 64 20 73 74 72 69 6e | Any coded strin| 00008650 67 73 20 3f 0d 1f 04 0d 20 e7 64 62 25 3e 30 20 |gs ?.... .db%>0 | 00008660 8c 0d 1f 0e 1d 20 20 c8 8e 20 bb 28 c1 64 61 74 |..... .. .(.dat| 00008670 61 24 2c 64 62 25 2b 31 2c 31 29 29 20 ca 0d 1f |a$,db%+1,1)) ...| 00008680 18 18 20 20 20 c9 20 31 20 3a 20 64 62 24 3d 22 |.. . 1 : db$="| 00008690 4d 6f 64 65 20 22 0d 1f 22 1b 20 20 20 c9 20 32 |Mode "..". . 2| 000086a0 20 3a 20 64 62 24 3d 22 20 70 61 6c 65 74 74 65 | : db$=" palette| 000086b0 22 0d 1f 2c 19 20 20 20 c9 20 33 20 3a 20 64 62 |"..,. . 3 : db| 000086c0 24 3d 22 20 69 6d 61 67 65 22 0d 1f 36 07 20 20 |$=" image"..6. | 000086d0 cb 0d 1f 40 35 20 20 64 61 74 61 24 3d c0 64 61 |...@5 data$=.da| 000086e0 74 61 24 2c 64 62 25 2d 31 29 2b 64 62 24 2b c1 |ta$,db%-1)+db$+.| 000086f0 64 61 74 61 24 2c 64 62 25 2b 32 29 3a f4 20 52 |data$,db%+2):. R| 00008700 65 70 6c 61 63 65 0d 1f 4a 06 20 cd 0d 1f 54 87 |eplace..J. ...T.| 00008710 20 74 69 63 6b 25 3d 28 74 79 70 65 25 80 25 30 | tick%=(type%.%0| 00008720 30 30 30 30 31 29 3a 64 6f 74 74 65 64 25 3d 28 |00001):dotted%=(| 00008730 74 79 70 65 25 80 25 30 30 30 30 31 30 29 3e 3e |type%.%000010)>>| 00008740 31 3a 77 72 69 74 65 61 62 6c 65 25 3d 28 74 79 |1:writeable%=(ty| 00008750 70 65 25 80 25 30 30 30 31 30 30 29 3e 3e 32 3a |pe%.%000100)>>2:| 00008760 73 68 61 64 65 64 25 3d 28 74 79 70 65 25 80 25 |shaded%=(type%.%| 00008770 30 30 31 30 30 30 29 3e 3e 33 3a 6c 6f 6e 67 25 |001000)>>3:long%| 00008780 3d 28 74 79 70 65 25 80 25 30 31 30 30 30 30 29 |=(type%.%010000)| 00008790 3e 3e 34 0d 1f 5e 55 20 e7 77 72 69 74 61 62 6c |>>4..^U .writabl| 000087a0 65 25 3d 30 20 8c 20 62 75 74 74 79 25 3d 39 3a |e%=0 . butty%=9:| 000087b0 69 6c 65 6e 25 3d a9 64 61 74 61 24 20 8b 20 62 |ilen%=.data$ . b| 000087c0 75 74 74 79 25 3d 31 35 3a e7 6c 6f 6e 67 25 3d |utty%=15:.long%=| 000087d0 30 20 8c 20 69 6c 65 6e 25 3d 31 36 20 8b 20 69 |0 . ilen%=16 . i| 000087e0 6c 65 6e 25 3d 32 35 35 0d 1f 68 71 20 76 61 6c |len%=255..hq val| 000087f0 69 64 24 3d 22 22 3a 70 25 3d a7 64 61 74 61 24 |id$="":p%=.data$| 00008800 2c 22 26 22 29 3a e7 70 25 3e 30 20 8c 20 76 61 |,"&"):.p%>0 . va| 00008810 6c 69 64 24 3d c1 64 61 74 61 24 2c 70 25 2b 31 |lid$=.data$,p%+1| 00008820 29 3a 64 61 74 61 24 3d c0 64 61 74 61 24 2c 70 |):data$=.data$,p| 00008830 25 2d 31 29 3a f4 20 45 78 74 72 61 63 74 20 76 |%-1):. Extract v| 00008840 61 6c 69 64 61 74 69 6f 6e 20 73 74 72 69 6e 67 |alidation string| 00008850 20 28 69 66 20 61 6e 79 29 0d 1f 72 85 20 73 75 | (if any)..r. su| 00008860 62 25 3d 2d 31 3a 73 75 62 77 61 72 6e 25 3d 30 |b%=-1:subwarn%=0| 00008870 3a 70 25 3d a7 64 61 74 61 24 2c 22 23 22 29 3a |:p%=.data$,"#"):| 00008880 e7 70 25 3e 30 20 8c 20 73 75 62 25 3d bb 28 c1 |.p%>0 . sub%=.(.| 00008890 64 61 74 61 24 2c 70 25 2b 31 29 29 3a 73 75 62 |data$,p%+1)):sub| 000088a0 77 61 72 6e 25 3d 31 3a 64 61 74 61 24 3d c0 64 |warn%=1:data$=.d| 000088b0 61 74 61 24 2c 70 25 2d 31 29 3a f4 20 45 78 74 |ata$,p%-1):. Ext| 000088c0 72 61 63 74 20 73 75 62 77 69 6e 64 6f 77 20 68 |ract subwindow h| 000088d0 61 6e 64 6c 65 20 28 69 66 20 61 6e 79 29 0d 1f |andle (if any)..| 000088e0 7c 48 20 70 74 72 21 30 3d 28 73 75 62 77 61 72 ||H ptr!0=(subwar| 000088f0 6e 25 3c 3c 33 29 2b 28 77 72 69 74 65 61 62 6c |n%<<3)+(writeabl| 00008900 65 25 3c 3c 32 29 2b 28 64 6f 74 74 65 64 25 3c |e%<<2)+(dotted%<| 00008910 3c 31 29 2b 74 69 63 6b 25 3a f4 20 4d 65 6e 75 |<1)+tick%:. Menu| 00008920 20 66 6c 61 67 73 0d 1f 86 21 20 70 74 72 21 34 | flags...! ptr!4| 00008930 3d 73 75 62 25 3a f4 20 53 75 62 20 6d 65 6e 75 |=sub%:. Sub menu| 00008940 2f 77 69 6e 64 6f 77 0d 1f 90 4a 20 70 74 72 21 |/window...J ptr!| 00008950 38 3d 28 77 62 25 3c 3c 32 38 29 2b 28 77 66 25 |8=(wb%<<28)+(wf%| 00008960 3c 3c 32 34 29 2b 28 73 68 61 64 65 64 25 3c 3c |<<24)+(shaded%<<| 00008970 32 32 29 2b 28 62 75 74 74 79 25 3c 3c 31 32 29 |22)+(butty%<<12)| 00008980 2b 28 31 3c 3c 38 29 2b 31 3a f4 20 46 6c 61 67 |+(1<<8)+1:. Flag| 00008990 73 0d 1f 9a 2f 20 24 64 61 74 61 70 74 72 3d 64 |s.../ $dataptr=d| 000089a0 61 74 61 24 3a 70 74 72 21 31 32 3d 64 61 74 61 |ata$:ptr!12=data| 000089b0 70 74 72 3a 70 74 72 21 32 30 3d 69 6c 65 6e 25 |ptr:ptr!20=ilen%| 000089c0 0d 1f a4 54 20 e7 76 61 6c 69 64 24 3d 22 22 20 |...T .valid$="" | 000089d0 8c 20 70 74 72 21 31 36 3d 2d 31 20 8b 20 24 76 |. ptr!16=-1 . $v| 000089e0 61 6c 69 64 70 74 72 3d 76 61 6c 69 64 24 3a 70 |alidptr=valid$:p| 000089f0 74 72 21 31 36 3d 76 61 6c 69 64 70 74 72 3a 76 |tr!16=validptr:v| 00008a00 61 6c 69 64 70 74 72 2b 3d a9 28 76 61 6c 69 64 |alidptr+=.(valid| 00008a10 24 29 2b 31 0d 1f ae 37 20 44 61 74 61 25 28 69 |$)+1...7 Data%(i| 00008a20 78 25 29 3d 64 61 74 61 70 74 72 3a 64 61 74 61 |x%)=dataptr:data| 00008a30 70 74 72 2b 3d 69 6c 65 6e 25 2b 31 3a 70 74 72 |ptr+=ilen%+1:ptr| 00008a40 2b 3d 32 34 3a 69 78 25 2b 3d 31 0d 1f b8 05 cd |+=24:ix%+=1.....| 00008a50 0d 1f c2 05 ce 0d 1f cc 30 70 74 72 21 2d 32 34 |........0ptr!-24| 00008a60 3d 28 70 74 72 21 2d 32 34 29 84 26 38 30 3a f4 |=(ptr!-24).&80:.| 00008a70 20 49 6e 64 69 63 61 74 65 20 27 6c 61 73 74 20 | Indicate 'last | 00008a80 69 63 6f 6e 27 0d 1f d6 10 e7 ac 63 72 65 61 74 |icon'......creat| 00008a90 65 20 8c 20 e1 0d 1f e0 0a e7 73 75 62 20 8c 0d |e . ......sub ..| 00008aa0 1f ea 33 20 c8 99 20 57 43 72 65 61 74 65 53 4d |..3 .. WCreateSM| 00008ab0 25 2c 2c 6d 65 6e 75 2c 78 25 2c 79 25 3a f4 20 |%,,menu,x%,y%:. | 00008ac0 43 72 65 61 74 65 20 74 68 65 20 73 75 62 6d 65 |Create the subme| 00008ad0 6e 75 0d 1f f4 3a 20 53 75 62 6d 65 6e 75 44 61 |nu...: SubmenuDa| 00008ae0 74 61 25 28 29 3d 44 61 74 61 25 28 29 3a f4 20 |ta%()=Data%():. | 00008af0 52 65 6d 65 6d 62 65 72 20 69 63 6f 6e 20 64 61 |Remember icon da| 00008b00 74 61 20 61 64 64 72 65 73 73 65 73 0d 1f fe 36 |ta addresses...6| 00008b10 20 41 63 74 69 76 65 5f 73 75 62 6d 65 6e 75 24 | Active_submenu$| 00008b20 3d 74 69 74 6c 65 24 3a f4 20 52 65 6d 65 6d 62 |=title$:. Rememb| 00008b30 65 72 20 73 75 62 6d 65 6e 75 27 73 20 74 69 74 |er submenu's tit| 00008b40 6c 65 0d 20 08 30 cc 20 c8 99 20 57 43 72 65 61 |le. .0. .. WCrea| 00008b50 74 65 4d 25 2c 2c 6d 65 6e 75 2c 78 25 2c 79 25 |teM%,,menu,x%,y%| 00008b60 3a f4 20 43 72 65 61 74 65 20 74 68 65 20 6d 65 |:. Create the me| 00008b70 6e 75 0d 20 12 37 20 4d 65 6e 75 44 61 74 61 25 |nu. .7 MenuData%| 00008b80 28 29 3d 44 61 74 61 25 28 29 3a f4 20 52 65 6d |()=Data%():. Rem| 00008b90 65 6d 62 65 72 20 69 63 6f 6e 20 64 61 74 61 20 |ember icon data | 00008ba0 61 64 64 72 65 73 73 65 73 0d 20 1c 05 cd 0d 20 |addresses. .... | 00008bb0 26 05 e1 0d 20 30 05 20 0d 20 3a 2c dd a4 73 65 |&... 0. . :,..se| 00008bc0 6c 62 69 74 73 28 74 69 63 6b 2c 64 6f 74 74 65 |lbits(tick,dotte| 00008bd0 64 2c 77 72 69 74 65 2c 73 68 61 64 65 64 2c 72 |d,write,shaded,r| 00008be0 6f 6f 6d 29 0d 20 44 32 f4 20 52 65 74 75 72 6e |oom). D2. Return| 00008bf0 73 20 73 65 6c 65 63 74 20 63 68 61 72 61 63 74 |s select charact| 00008c00 65 72 20 66 6f 72 20 69 63 6f 6e 20 61 74 74 72 |er for icon attr| 00008c10 69 62 75 74 65 73 0d 20 4e 5e 3d bd 28 28 31 3c |ibutes. N^=.((1<| 00008c20 3c 35 29 2b 28 28 72 6f 6f 6d 20 80 20 31 29 3c |<5)+((room . 1)<| 00008c30 3c 34 29 2b 28 28 73 68 61 64 65 64 20 80 20 31 |<4)+((shaded . 1| 00008c40 29 3c 3c 33 29 2b 28 28 77 72 69 74 65 20 80 20 |)<<3)+((write . | 00008c50 31 29 3c 3c 32 29 2b 28 28 64 6f 74 74 65 64 20 |1)<<2)+((dotted | 00008c60 80 20 31 29 3c 3c 31 29 2b 28 74 69 63 6b 20 80 |. 1)<<1)+(tick .| 00008c70 20 31 29 29 0d 20 58 05 20 0d 20 62 9b dd a4 63 | 1)). X. . b...c| 00008c80 72 65 61 74 65 5f 77 69 6e 64 6f 77 28 77 69 6e |reate_window(win| 00008c90 64 6f 77 2c 6d 69 78 25 2c 6d 69 79 25 2c 6d 61 |dow,mix%,miy%,ma| 00008ca0 78 25 2c 6d 61 79 25 2c 73 62 78 25 2c 73 62 79 |x%,may%,sbx%,sby| 00008cb0 25 2c 70 6f 73 25 2c 66 6c 61 67 73 25 2c 74 66 |%,pos%,flags%,tf| 00008cc0 25 2c 74 62 25 2c 77 66 25 2c 77 62 25 2c 77 6d |%,tb%,wf%,wb%,wm| 00008cd0 69 78 25 2c 77 6d 69 79 25 2c 77 6d 61 78 25 2c |ix%,wmiy%,wmax%,| 00008ce0 77 6d 61 79 25 2c 74 69 66 6c 61 67 73 25 2c 77 |wmay%,tiflags%,w| 00008cf0 61 66 6c 61 67 73 25 2c 6d 69 6e 77 25 2c 73 70 |aflags%,minw%,sp| 00008d00 72 63 25 2c 74 69 74 6c 65 24 2c f8 20 74 69 74 |rc%,title$,. tit| 00008d10 6c 65 25 29 0d 20 6c 10 ea 20 70 74 72 2c 69 63 |le%). l.. ptr,ic| 00008d20 6f 2c 62 25 0d 20 76 39 f4 20 43 72 65 61 74 65 |o,b%. v9. Create| 00008d30 73 20 77 69 6e 64 6f 77 20 77 69 74 68 6f 75 74 |s window without| 00008d40 20 69 63 6f 6e 73 2c 20 72 65 74 75 72 6e 73 20 | icons, returns | 00008d50 77 69 6e 64 6f 77 20 68 61 6e 64 6c 65 0d 20 80 |window handle. .| 00008d60 3a f4 20 52 65 74 75 72 6e 73 20 70 6f 69 6e 74 |:. Returns point| 00008d70 65 72 20 74 6f 20 69 6e 64 69 72 65 63 74 65 64 |er to indirected| 00008d80 20 77 69 6e 64 6f 77 20 74 69 74 6c 65 20 69 6e | window title in| 00008d90 20 74 69 74 6c 65 25 0d 20 8a 3c 77 69 6e 64 6f | title%. .<windo| 00008da0 77 21 30 3d 6d 69 78 25 3a 77 69 6e 64 6f 77 21 |w!0=mix%:window!| 00008db0 34 3d 6d 69 79 25 3a 77 69 6e 64 6f 77 21 38 3d |4=miy%:window!8=| 00008dc0 6d 61 78 25 3a 77 69 6e 64 6f 77 21 31 32 3d 6d |max%:window!12=m| 00008dd0 61 79 25 0d 20 94 21 77 69 6e 64 6f 77 21 31 36 |ay%. .!window!16| 00008de0 3d 73 62 78 25 3a 77 69 6e 64 6f 77 21 32 30 3d |=sbx%:window!20=| 00008df0 73 62 79 25 0d 20 9e 12 77 69 6e 64 6f 77 21 32 |sby%. ..window!2| 00008e00 34 3d 70 6f 73 25 0d 20 a8 14 77 69 6e 64 6f 77 |4=pos%. ..window| 00008e10 21 32 38 3d 66 6c 61 67 73 25 0d 20 b2 1f 77 69 |!28=flags%. ..wi| 00008e20 6e 64 6f 77 3f 33 32 3d 74 66 25 3a 77 69 6e 64 |ndow?32=tf%:wind| 00008e30 6f 77 3f 33 33 3d 74 62 25 0d 20 bc 1f 77 69 6e |ow?33=tb%. ..win| 00008e40 64 6f 77 3f 33 34 3d 77 66 25 3a 77 69 6e 64 6f |dow?34=wf%:windo| 00008e50 77 3f 33 35 3d 77 62 25 0d 20 c6 1f 77 69 6e 64 |w?35=wb%. ..wind| 00008e60 6f 77 3f 33 36 3d 73 6f 25 3a 77 69 6e 64 6f 77 |ow?36=so%:window| 00008e70 3f 33 37 3d 73 69 25 0d 20 d0 11 77 69 6e 64 6f |?37=si%. ..windo| 00008e80 77 3f 33 38 3d 74 62 25 0d 20 da 0f 77 69 6e 64 |w?38=tb%. ..wind| 00008e90 6f 77 3f 33 39 3d 30 0d 20 e4 43 77 69 6e 64 6f |ow?39=0. .Cwindo| 00008ea0 77 21 34 30 3d 77 6d 69 78 25 3a 77 69 6e 64 6f |w!40=wmix%:windo| 00008eb0 77 21 34 34 3d 77 6d 69 79 25 3a 77 69 6e 64 6f |w!44=wmiy%:windo| 00008ec0 77 21 34 38 3d 77 6d 61 78 25 3a 77 69 6e 64 6f |w!48=wmax%:windo| 00008ed0 77 21 35 32 3d 77 6d 61 79 25 0d 20 ee 1d 77 69 |w!52=wmay%. ..wi| 00008ee0 6e 64 6f 77 21 35 36 3d 74 69 66 6c 61 67 73 25 |ndow!56=tiflags%| 00008ef0 20 84 20 31 3c 3c 38 0d 20 f8 16 77 69 6e 64 6f | . 1<<8. ..windo| 00008f00 77 21 36 30 3d 77 61 66 6c 61 67 73 25 0d 21 02 |w!60=waflags%.!.| 00008f10 13 77 69 6e 64 6f 77 21 36 34 3d 73 70 72 63 25 |.window!64=sprc%| 00008f20 0d 21 0c 13 77 69 6e 64 6f 77 21 36 38 3d 6d 69 |.!..window!68=mi| 00008f30 6e 77 25 0d 21 16 26 74 69 74 6c 65 25 3d 77 69 |nw%.!.&title%=wi| 00008f40 6e 64 6f 77 2b 35 31 32 3a 77 69 6e 64 6f 77 21 |ndow+512:window!| 00008f50 37 32 3d 74 69 74 6c 65 25 0d 21 20 10 77 69 6e |72=title%.! .win| 00008f60 64 6f 77 21 37 36 3d 2d 31 0d 21 2a 17 77 69 6e |dow!76=-1.!*.win| 00008f70 64 6f 77 21 38 30 3d a9 28 74 69 74 6c 65 24 29 |dow!80=.(title$)| 00008f80 0d 21 34 17 24 28 77 69 6e 64 6f 77 21 37 32 29 |.!4.$(window!72)| 00008f90 3d 74 69 74 6c 65 24 0d 21 3e 0f 77 69 6e 64 6f |=title$.!>.windo| 00008fa0 77 21 38 34 3d 30 0d 21 48 36 c8 99 20 57 43 72 |w!84=0.!H6.. WCr| 00008fb0 65 61 74 65 57 25 2c 2c 77 69 6e 64 6f 77 20 b8 |eateW%,,window .| 00008fc0 20 68 61 6e 64 6c 65 25 3a f4 20 43 72 65 61 74 | handle%:. Creat| 00008fd0 65 20 74 68 65 20 77 69 6e 64 6f 77 0d 21 52 0c |e the window.!R.| 00008fe0 3d 68 61 6e 64 6c 65 25 0d 21 5c 05 20 0d 21 66 |=handle%.!\. .!f| 00008ff0 11 dd a4 61 6c 69 67 6e 28 76 61 6c 25 29 0d 21 |...align(val%).!| 00009000 70 30 f4 20 52 65 74 75 72 6e 73 20 6e 65 78 74 |p0. Returns next| 00009010 2d 75 70 20 77 6f 72 64 20 61 6c 69 67 6e 65 64 |-up word aligned| 00009020 20 76 61 6c 75 65 20 6f 66 20 76 61 6c 25 0d 21 | value of val%.!| 00009030 7a 10 3d 28 76 61 6c 25 2b 33 29 80 ac 33 0d 21 |z.=(val%+3)..3.!| 00009040 84 05 20 0d 21 8e 16 dd a4 72 65 61 64 70 61 6c |.. .!....readpal| 00009050 76 61 6c 28 72 67 62 25 29 0d 21 98 33 f4 20 52 |val(rgb%).!.3. R| 00009060 65 74 75 72 6e 73 20 27 4f 53 5f 52 65 61 64 50 |eturns 'OS_ReadP| 00009070 61 6c 65 74 74 65 27 20 77 6f 72 64 20 66 72 6f |alette' word fro| 00009080 6d 20 26 52 47 42 20 76 61 6c 75 65 0d 21 a2 3f |m &RGB value.!.?| 00009090 3d 28 28 72 67 62 25 80 26 46 46 29 3c 3c 32 34 |=((rgb%.&FF)<<24| 000090a0 29 2b 28 28 72 67 62 25 80 26 46 46 30 30 29 3c |)+((rgb%.&FF00)<| 000090b0 3c 38 29 2b 28 28 72 67 62 25 80 26 46 46 30 30 |<8)+((rgb%.&FF00| 000090c0 30 30 29 3e 3e 38 29 2b 26 31 30 0d 21 ac 05 20 |00)>>8)+&10.!.. | 000090d0 0d 21 b6 13 dd a4 73 74 72 69 6e 67 28 61 64 64 |.!....string(add| 000090e0 72 25 29 0d 21 c0 32 f4 20 52 65 74 75 72 6e 73 |r%).!.2. Returns| 000090f0 20 43 54 52 4c 2d 63 68 61 72 20 74 65 72 6d 69 | CTRL-char termi| 00009100 6e 61 74 65 64 20 73 74 72 69 6e 67 20 61 74 20 |nated string at | 00009110 61 64 64 72 25 0d 21 ca 0f ea 20 5f 25 2c 5f 63 |addr%.!... _%,_c| 00009120 25 2c 5f 24 0d 21 d4 1f 5f 25 3d 2d 31 3a f5 20 |%,_$.!.._%=-1:. | 00009130 5f 25 2b 3d 31 3a fd 20 61 64 64 72 25 3f 5f 25 |_%+=1:. addr%?_%| 00009140 3c 33 32 0d 21 de 33 5f 63 25 3d 61 64 64 72 25 |<32.!.3_c%=addr%| 00009150 3f 5f 25 3a 61 64 64 72 25 3f 5f 25 3d 31 33 3a |?_%:addr%?_%=13:| 00009160 5f 24 3d 24 61 64 64 72 25 3a 61 64 64 72 25 3f |_$=$addr%:addr%?| 00009170 5f 25 3d 5f 63 25 0d 21 e8 07 3d 5f 24 0d 21 f2 |_%=_c%.!..=_$.!.| 00009180 05 20 0d 21 fc 1d dd f2 6d 6f 75 73 65 28 f8 20 |. .!....mouse(. | 00009190 78 25 2c f8 20 79 25 2c f8 20 62 75 74 25 29 0d |x%,. y%,. but%).| 000091a0 22 06 2b f4 20 52 65 74 75 72 6e 73 20 78 2c 79 |".+. Returns x,y| 000091b0 20 61 6e 64 20 62 75 74 74 6f 6e 20 73 74 61 74 | and button stat| 000091c0 65 20 6f 66 20 6d 6f 75 73 65 0d 22 10 11 c8 97 |e of mouse."....| 000091d0 20 78 25 2c 79 25 2c 62 75 74 25 0d 22 1a 05 e1 | x%,y%,but%."...| 000091e0 0d 22 24 05 20 0d 22 2e 0a dd a4 63 32 35 36 0d |."$. ."....c256.| 000091f0 22 38 35 f4 20 52 65 74 75 72 6e 73 20 54 52 55 |"85. Returns TRU| 00009200 45 20 69 66 20 63 75 72 72 65 6e 74 20 6d 6f 64 |E if current mod| 00009210 65 20 69 73 20 32 35 36 20 63 6f 6c 6f 75 72 20 |e is 256 colour | 00009220 6d 6f 64 65 0d 22 42 11 3d 28 a4 6c 6f 67 32 42 |mode."B.=(.log2B| 00009230 50 50 3d 33 29 0d 22 4c 05 20 0d 22 56 0d dd a4 |PP=3)."L. ."V...| 00009240 6c 6f 67 32 42 50 50 0d 22 60 26 f4 20 52 65 74 |log2BPP."`&. Ret| 00009250 75 72 6e 73 20 4c 6f 67 32 42 50 50 20 66 6f 72 |urns Log2BPP for| 00009260 20 63 75 72 72 65 6e 74 20 6d 6f 64 65 0d 22 6a | current mode."j| 00009270 13 3d a4 6d 6f 64 65 5f 76 61 72 28 eb 2c 39 29 |.=.mode_var(.,9)| 00009280 0d 22 74 05 20 0d 22 7e 15 dd a4 76 64 75 5f 76 |."t. ."~...vdu_v| 00009290 61 72 28 76 61 72 6e 72 25 29 0d 22 88 21 f4 20 |ar(varnr%).".!. | 000092a0 52 65 74 75 72 6e 73 20 56 44 55 20 76 61 72 69 |Returns VDU vari| 000092b0 61 62 6c 65 20 76 61 72 6e 72 25 0d 22 92 3b 21 |able varnr%.".;!| 000092c0 61 72 67 25 3d 76 61 72 6e 72 25 3a 61 72 67 25 |arg%=varnr%:arg%| 000092d0 21 34 3d 2d 31 3a c8 99 20 4f 53 52 65 61 64 56 |!4=-1:.. OSReadV| 000092e0 56 25 2c 61 72 67 25 2c 61 72 67 25 2b 38 3a 3d |V%,arg%,arg%+8:=| 000092f0 61 72 67 25 21 38 0d 22 9c 05 20 0d 22 a6 1c dd |arg%!8.".. ."...| 00009300 a4 6d 6f 64 65 5f 76 61 72 28 6d 6f 64 65 25 2c |.mode_var(mode%,| 00009310 76 61 72 6e 72 25 29 0d 22 b0 28 f4 20 52 65 74 |varnr%).".(. Ret| 00009320 75 72 6e 73 20 6d 6f 64 65 20 6d 6f 64 65 25 20 |urns mode mode% | 00009330 76 61 72 69 61 62 6c 65 20 76 61 72 6e 72 25 0d |variable varnr%.| 00009340 22 ba 0d ea 20 72 65 73 75 6c 74 25 0d 22 c4 32 |"... result%.".2| 00009350 c8 99 20 4f 53 52 65 61 64 4d 56 25 2c 6d 6f 64 |.. OSReadMV%,mod| 00009360 65 25 2c 76 61 72 6e 72 25 20 b8 20 2c 2c 72 65 |e%,varnr% . ,,re| 00009370 73 75 6c 74 25 3a 3d 72 65 73 75 6c 74 25 0d 22 |sult%:=result%."| 00009380 ce 05 20 0d 22 d8 10 dd a4 4f 53 5f 76 61 72 28 |.. ."....OS_var(| 00009390 5f 24 29 0d 22 e2 2e f4 20 41 74 74 65 6d 70 74 |_$)."... Attempt| 000093a0 73 20 74 6f 20 72 65 74 75 72 6e 20 4f 53 2d 76 |s to return OS-v| 000093b0 61 72 27 73 20 73 74 72 69 6e 67 20 76 61 6c 75 |ar's string valu| 000093c0 65 0d 22 ec 0d ea 20 5f 72 24 2c 5f 6c 25 0d 22 |e."... _r$,_l%."| 000093d0 f6 37 c8 99 20 22 58 4f 53 5f 52 65 61 64 56 61 |.7.. "XOS_ReadVa| 000093e0 72 56 61 6c 22 2c 5f 24 2c c4 31 30 30 2c 22 20 |rVal",_$,.100," | 000093f0 22 29 2c 31 30 30 2c 30 2c 33 20 b8 20 2c 5f 72 |"),100,0,3 . ,_r| 00009400 24 2c 5f 6c 25 0d 23 00 16 5f 72 24 3d c0 5f 72 |$,_l%.#.._r$=._r| 00009410 24 2c 5f 6c 25 29 3a 3d 5f 72 24 0d 23 0a 05 20 |$,_l%):=_r$.#.. | 00009420 0d 23 14 15 dd a4 73 77 69 5f 74 6f 5f 6e 72 28 |.#....swi_to_nr(| 00009430 73 77 69 24 29 0d 23 1e 29 f4 20 52 65 74 75 72 |swi$).#.). Retur| 00009440 6e 73 20 53 57 49 20 6e 75 6d 62 65 72 20 6f 66 |ns SWI number of| 00009450 20 53 57 49 20 63 61 6c 6c 20 73 77 69 24 0d 23 | SWI call swi$.#| 00009460 28 0c ea 20 73 77 69 6e 72 25 0d 23 32 2f c8 99 |(.. swinr%.#2/..| 00009470 20 22 58 4f 53 5f 53 57 49 4e 75 6d 62 65 72 46 | "XOS_SWINumberF| 00009480 72 6f 6d 53 74 72 69 6e 67 22 2c 2c 73 77 69 24 |romString",,swi$| 00009490 20 b8 20 73 77 69 6e 72 25 0d 23 3c 0b 3d 73 77 | . swinr%.#<.=sw| 000094a0 69 6e 72 25 0d 23 46 05 20 0d 23 50 1a dd f2 65 |inr%.#F. .#P...e| 000094b0 72 72 6f 72 28 65 72 72 6e 72 2c 65 72 72 6d 73 |rror(errnr,errms| 000094c0 67 24 29 0d 23 5a 14 f4 20 48 61 6e 64 6c 65 73 |g$).#Z.. Handles| 000094d0 20 65 72 72 6f 72 73 0d 23 64 16 ea 20 62 75 74 | errors.#d.. but| 000094e0 25 2c 6f 6c 64 70 61 6c 2c 6f 70 74 25 0d 23 6e |%,oldpal,opt%.#n| 000094f0 27 e7 65 72 72 6e 72 3d 2d 31 20 8c 20 65 72 72 |'.errnr=-1 . err| 00009500 6e 72 3d 31 3a 6f 70 74 25 3d 31 20 8b 20 6f 70 |nr=1:opt%=1 . op| 00009510 74 25 3d 33 0d 23 78 1f 21 65 72 72 3d 65 72 72 |t%=3.#x.!err=err| 00009520 6e 72 3a 24 28 65 72 72 2b 34 29 3d 65 72 72 6d |nr:$(err+4)=errm| 00009530 73 67 24 0d 23 82 3b 6f 6c 64 70 61 6c 3d 50 61 |sg$.#.;oldpal=Pa| 00009540 6c 65 74 74 65 3a f2 73 65 74 5f 70 61 6c 65 74 |lette:.set_palet| 00009550 74 65 28 30 29 3a f4 20 53 65 6c 65 63 74 20 64 |te(0):. Select d| 00009560 65 73 6b 74 6f 70 20 70 61 6c 65 74 74 65 0d 23 |esktop palette.#| 00009570 8c 2a c8 99 20 57 52 65 70 6f 72 74 25 2c 65 72 |.*.. WReport%,er| 00009580 72 2c 6f 70 74 25 2c 61 70 70 6c 6e 61 6d 65 24 |r,opt%,applname$| 00009590 20 b8 20 2c 62 75 74 25 0d 23 96 13 e7 62 75 74 | . ,but%.#...but| 000095a0 25 3c 3e 31 20 8c 20 f2 64 69 65 0d 23 a0 2f f2 |%<>1 . .die.#./.| 000095b0 73 65 74 5f 70 61 6c 65 74 74 65 28 6f 6c 64 70 |set_palette(oldp| 000095c0 61 6c 29 3a f4 20 52 65 73 65 6c 65 63 74 20 6f |al):. Reselect o| 000095d0 6c 64 20 70 61 6c 65 74 74 65 0d 23 aa 05 e1 0d |ld palette.#....| 000095e0 23 b4 05 20 0d 23 be 0c dd f2 66 69 6e 69 73 68 |#.. .#....finish| 000095f0 0d 23 c8 0f f4 20 54 69 64 69 65 73 20 75 70 0d |.#... Tidies up.| 00009600 23 d2 17 c8 99 20 57 53 65 74 50 25 2c 2c 70 61 |#.... WSetP%,,pa| 00009610 6c 65 74 74 65 25 0d 23 dc 2d c8 99 20 22 57 69 |lette%.#.-.. "Wi| 00009620 6d 70 5f 43 6c 6f 73 65 44 6f 77 6e 22 2c 54 61 |mp_CloseDown",Ta| 00009630 73 6b 48 61 6e 64 6c 65 25 2c 26 34 42 35 33 34 |skHandle%,&4B534| 00009640 31 35 34 0d 23 e6 05 e1 0d 23 f0 05 20 0d 23 fa |154.#....#.. .#.| 00009650 0a dd a4 73 70 72 57 0d 24 04 3f f4 20 52 65 74 |...sprW.$.?. Ret| 00009660 75 72 6e 73 20 69 6d 61 67 65 20 73 70 72 69 74 |urns image sprit| 00009670 65 27 73 20 77 69 64 74 68 20 69 6e 20 4f 53 20 |e's width in OS | 00009680 70 69 78 65 6c 73 20 69 6e 20 63 75 72 72 65 6e |pixels in curren| 00009690 74 20 6d 6f 64 65 0d 24 0e 1b 3d 53 70 72 57 25 |t mode.$..=SprW%| 000096a0 2a 32 5e a4 6d 6f 64 65 5f 76 61 72 28 eb 2c 34 |*2^.mode_var(.,4| 000096b0 29 0d 24 18 05 20 0d 24 22 0a dd a4 73 70 72 48 |).$.. .$"...sprH| 000096c0 0d 24 2c 40 f4 20 52 65 74 75 72 6e 73 20 69 6d |.$,@. Returns im| 000096d0 61 67 65 20 73 70 72 69 74 65 27 73 20 68 65 69 |age sprite's hei| 000096e0 67 68 74 20 69 6e 20 4f 53 20 70 69 78 65 6c 73 |ght in OS pixels| 000096f0 20 69 6e 20 63 75 72 72 65 6e 74 20 6d 6f 64 65 | in current mode| 00009700 0d 24 36 1b 3d 53 70 72 48 25 2a 32 5e a4 6d 6f |.$6.=SprH%*2^.mo| 00009710 64 65 5f 76 61 72 28 eb 2c 35 29 0d 24 40 05 20 |de_var(.,5).$@. | 00009720 0d 24 4a 17 dd a4 6c 69 6e 65 28 66 6f 72 65 24 |.$J...line(fore$| 00009730 2c 62 61 63 6b 24 29 0d 24 54 2a f4 20 52 65 74 |,back$).$T*. Ret| 00009740 75 72 6e 73 20 27 70 72 65 74 74 79 27 20 6c 69 |urns 'pretty' li| 00009750 6e 65 20 66 72 6f 6d 20 61 72 67 75 6d 65 6e 74 |ne from argument| 00009760 73 0d 24 5e 28 3d 66 6f 72 65 24 2b 22 20 22 2b |s.$^(=fore$+" "+| 00009770 c4 32 37 2d a9 66 6f 72 65 24 2c 22 2e 22 29 2b |.27-.fore$,".")+| 00009780 22 20 22 2b 62 61 63 6b 24 0d 24 68 05 20 0d 24 |" "+back$.$h. .$| 00009790 72 12 dd a4 6d 61 78 28 76 31 25 2c 76 32 25 29 |r...max(v1%,v2%)| 000097a0 0d 24 7c 24 f4 20 52 65 74 75 72 6e 73 20 6d 61 |.$|$. Returns ma| 000097b0 78 69 6d 75 6d 20 6f 66 20 76 31 25 20 61 6e 64 |ximum of v1% and| 000097c0 20 76 32 25 0d 24 86 1a e7 76 31 25 3e 76 32 25 | v2%.$...v1%>v2%| 000097d0 20 8c 20 3d 76 31 25 20 8b 20 3d 76 32 25 0d 24 | . =v1% . =v2%.$| 000097e0 90 05 20 0d 24 9a 09 dd f2 64 69 65 0d 24 a4 19 |.. .$....die.$..| 000097f0 f4 20 54 69 64 69 65 73 20 75 70 20 61 6e 64 20 |. Tidies up and | 00009800 65 78 69 74 73 0d 24 ae 0b f2 66 69 6e 69 73 68 |exits.$...finish| 00009810 0d 24 b8 10 c8 99 20 22 4f 53 5f 45 78 69 74 22 |.$.... "OS_Exit"| 00009820 0d 24 c2 05 e1 0d 24 cc 05 20 0d 24 d6 2c dd a4 |.$....$.. .$.,..| 00009830 6d 6f 64 65 28 77 69 64 74 68 25 2c 68 65 69 67 |mode(width%,heig| 00009840 68 74 25 2c 63 6f 6c 6f 75 72 73 25 2c f8 20 65 |ht%,colours%,. e| 00009850 72 72 6f 72 24 29 0d 24 e0 45 f4 20 52 65 74 75 |rror$).$.E. Retu| 00009860 72 6e 73 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 |rns, if possible| 00009870 2c 20 74 68 65 20 73 63 72 65 65 6e 20 6d 6f 64 |, the screen mod| 00009880 65 20 74 68 61 74 20 69 73 20 6d 6f 73 74 20 73 |e that is most s| 00009890 75 69 74 61 62 6c 65 20 66 6f 72 0d 24 ea 4b f4 |uitable for.$.K.| 000098a0 20 64 69 73 70 6c 61 79 69 6e 67 20 61 20 70 69 | displaying a pi| 000098b0 63 74 75 72 65 20 6f 66 20 28 77 69 64 74 68 25 |cture of (width%| 000098c0 29 78 28 68 65 69 67 68 74 25 29 20 70 69 78 65 |)x(height%) pixe| 000098d0 6c 73 20 69 6e 20 63 6f 6c 6f 75 72 73 25 20 63 |ls in colours% c| 000098e0 6f 6c 6f 75 72 73 0d 24 f4 4c f4 20 49 66 20 74 |olours.$.L. If t| 000098f0 68 65 72 65 20 69 73 20 6e 6f 20 73 75 69 74 61 |here is no suita| 00009900 62 6c 65 20 6d 6f 64 65 2c 20 2d 31 20 61 6e 64 |ble mode, -1 and| 00009910 20 61 6e 20 65 78 70 6c 61 69 6e 69 6e 67 20 65 | an explaining e| 00009920 72 72 6f 72 24 20 61 72 65 20 72 65 74 75 72 6e |rror$ are return| 00009930 65 64 0d 24 fe 46 f4 20 49 66 20 35 31 32 20 76 |ed.$.F. If 512 v| 00009940 65 72 74 69 63 61 6c 20 69 73 20 72 65 71 75 69 |ertical is requi| 00009950 72 65 64 20 6f 6e 20 61 20 6e 6f 72 6d 61 6c 20 |red on a normal | 00009960 6d 6f 6e 69 74 6f 72 2c 20 32 35 36 20 69 73 20 |monitor, 256 is | 00009970 73 65 6c 65 63 74 65 64 0d 25 08 29 ea 20 61 72 |selected.%.). ar| 00009980 63 63 6f 6c 73 25 2c 61 72 63 77 69 64 74 68 25 |ccols%,arcwidth%| 00009990 2c 61 72 63 68 65 69 67 68 74 25 2c 6d 6f 64 65 |,archeight%,mode| 000099a0 25 0d 25 12 2f f4 20 52 61 6e 67 65 20 63 68 65 |%.%./. Range che| 000099b0 63 6b 20 66 6f 72 20 63 6f 6c 6f 75 72 73 2c 20 |ck for colours, | 000099c0 77 69 64 74 68 20 61 6e 64 20 68 65 69 67 68 74 |width and height| 000099d0 0d 25 1c 49 e7 63 6f 6c 6f 75 72 73 25 3e 32 35 |.%.I.colours%>25| 000099e0 36 20 8c 20 65 72 72 6f 72 24 3d 22 49 20 63 61 |6 . error$="I ca| 000099f0 6e 6e 6f 74 20 64 69 73 70 6c 61 79 20 6d 6f 72 |nnot display mor| 00009a00 65 20 74 68 61 6e 20 32 35 36 20 63 6f 6c 6f 75 |e than 256 colou| 00009a10 72 73 20 21 22 3a 3d 2d 31 0d 25 26 2c f4 20 44 |rs !":=-1.%&,. D| 00009a20 65 74 65 72 6d 69 6e 65 20 63 6c 6f 73 65 73 74 |etermine closest| 00009a30 20 63 6f 6c 6f 75 72 73 2f 77 69 64 74 68 2f 68 | colours/width/h| 00009a40 65 69 67 68 74 0d 25 30 63 e7 63 6f 6c 6f 75 72 |eight.%0c.colour| 00009a50 73 25 3e 31 36 20 8c 20 61 72 63 63 6f 6c 73 25 |s%>16 . arccols%| 00009a60 3d 32 35 36 20 8b 20 e7 63 6f 6c 6f 75 72 73 25 |=256 . .colours%| 00009a70 3e 34 20 8c 20 61 72 63 63 6f 6c 73 25 3d 31 36 |>4 . arccols%=16| 00009a80 20 8b 20 e7 63 6f 6c 6f 75 72 73 25 3e 32 20 8c | . .colours%>2 .| 00009a90 20 61 72 63 63 6f 6c 73 25 3d 34 20 8b 20 61 72 | arccols%=4 . ar| 00009aa0 63 63 6f 6c 73 25 3d 32 0d 25 3a 4e e7 77 69 64 |ccols%=2.%:N.wid| 00009ab0 74 68 25 3e 36 34 30 20 8c 20 61 72 63 77 69 64 |th%>640 . arcwid| 00009ac0 74 68 25 3d 31 30 35 36 20 8b 20 e7 77 69 64 74 |th%=1056 . .widt| 00009ad0 68 25 3e 33 32 30 20 8c 20 61 72 63 77 69 64 74 |h%>320 . arcwidt| 00009ae0 68 25 3d 36 34 30 20 8b 20 61 72 63 77 69 64 74 |h%=640 . arcwidt| 00009af0 68 25 3d 33 32 30 0d 25 44 52 e7 68 65 69 67 68 |h%=320.%DR.heigh| 00009b00 74 25 3c 3d 32 35 36 20 8c 20 61 72 63 68 65 69 |t%<=256 . archei| 00009b10 67 68 74 25 3d 32 35 36 20 8b 20 e7 ac 4d 75 6c |ght%=256 . ..Mul| 00009b20 74 69 53 79 6e 63 20 8c 20 61 72 63 68 65 69 67 |tiSync . archeig| 00009b30 68 74 25 3d 32 35 36 20 8b 20 61 72 63 68 65 69 |ht%=256 . archei| 00009b40 67 68 74 25 3d 35 31 32 0d 25 4e 25 6d 6f 64 65 |ght%=512.%N%mode| 00009b50 25 3d 2d 31 3a f4 20 49 6e 76 61 6c 69 64 20 6d |%=-1:. Invalid m| 00009b60 6f 64 65 20 69 6e 69 74 69 61 6c 6c 79 0d 25 58 |ode initially.%X| 00009b70 11 c8 8e 20 61 72 63 63 6f 6c 73 25 20 ca 0d 25 |... arccols% ..%| 00009b80 62 19 20 c9 20 32 20 3a 20 c8 8e 20 61 72 63 77 |b. . 2 : .. arcw| 00009b90 69 64 74 68 25 20 ca 0d 25 6c 3b 20 20 20 20 20 |idth% ..%l; | 00009ba0 20 20 20 20 20 20 c9 20 31 36 30 20 3a 20 e7 61 | . 160 : .a| 00009bb0 72 63 68 65 69 67 68 74 25 3d 32 35 36 20 8c 20 |rcheight%=256 . | 00009bc0 6d 6f 64 65 25 3d 30 20 8b 20 6d 6f 64 65 25 3d |mode%=0 . mode%=| 00009bd0 31 38 0d 25 76 3b 20 20 20 20 20 20 20 20 20 20 |18.%v; | 00009be0 20 c9 20 33 32 30 20 3a 20 e7 61 72 63 68 65 69 | . 320 : .archei| 00009bf0 67 68 74 25 3d 32 35 36 20 8c 20 6d 6f 64 65 25 |ght%=256 . mode%| 00009c00 3d 30 20 8b 20 6d 6f 64 65 25 3d 31 38 0d 25 80 |=0 . mode%=18.%.| 00009c10 3b 20 20 20 20 20 20 20 20 20 20 20 c9 20 36 34 |; . 64| 00009c20 30 20 3a 20 e7 61 72 63 68 65 69 67 68 74 25 3d |0 : .archeight%=| 00009c30 32 35 36 20 8c 20 6d 6f 64 65 25 3d 30 20 8b 20 |256 . mode%=0 . | 00009c40 6d 6f 64 65 25 3d 31 38 0d 25 8a 32 20 20 20 20 |mode%=18.%.2 | 00009c50 20 20 20 20 20 20 20 c9 20 31 30 35 36 20 3a 20 | . 1056 : | 00009c60 e7 61 72 63 68 65 69 67 68 74 25 3d 32 35 36 20 |.archeight%=256 | 00009c70 8c 20 6d 6f 64 65 25 3d 31 36 0d 25 94 0f 20 20 |. mode%=16.%.. | 00009c80 20 20 20 20 20 20 20 20 cb 0d 25 9e 19 20 c9 20 | ..%.. . | 00009c90 34 20 3a 20 c8 8e 20 61 72 63 77 69 64 74 68 25 |4 : .. arcwidth%| 00009ca0 20 ca 0d 25 a8 3b 20 20 20 20 20 20 20 20 20 20 | ..%.; | 00009cb0 20 c9 20 31 36 30 20 3a 20 e7 61 72 63 68 65 69 | . 160 : .archei| 00009cc0 67 68 74 25 3d 32 35 36 20 8c 20 6d 6f 64 65 25 |ght%=256 . mode%| 00009cd0 3d 31 20 8b 20 6d 6f 64 65 25 3d 31 39 0d 25 b2 |=1 . mode%=19.%.| 00009ce0 3b 20 20 20 20 20 20 20 20 20 20 20 c9 20 33 32 |; . 32| 00009cf0 30 20 3a 20 e7 61 72 63 68 65 69 67 68 74 25 3d |0 : .archeight%=| 00009d00 32 35 36 20 8c 20 6d 6f 64 65 25 3d 31 20 8b 20 |256 . mode%=1 . | 00009d10 6d 6f 64 65 25 3d 31 39 0d 25 bc 3b 20 20 20 20 |mode%=19.%.; | 00009d20 20 20 20 20 20 20 20 c9 20 36 34 30 20 3a 20 e7 | . 640 : .| 00009d30 61 72 63 68 65 69 67 68 74 25 3d 32 35 36 20 8c |archeight%=256 .| 00009d40 20 6d 6f 64 65 25 3d 38 20 8b 20 6d 6f 64 65 25 | mode%=8 . mode%| 00009d50 3d 31 39 0d 25 c6 32 20 20 20 20 20 20 20 20 20 |=19.%.2 | 00009d60 20 20 c9 20 31 30 35 36 20 3a 20 e7 61 72 63 68 | . 1056 : .arch| 00009d70 65 69 67 68 74 25 3d 32 35 36 20 8c 20 6d 6f 64 |eight%=256 . mod| 00009d80 65 25 3d 31 36 0d 25 d0 0f 20 20 20 20 20 20 20 |e%=16.%.. | 00009d90 20 20 20 cb 0d 25 da 1a 20 c9 20 31 36 20 3a 20 | ..%.. . 16 : | 00009da0 c8 8e 20 61 72 63 77 69 64 74 68 25 20 ca 0d 25 |.. arcwidth% ..%| 00009db0 e4 3c 20 20 20 20 20 20 20 20 20 20 20 20 c9 20 |.< . | 00009dc0 31 36 30 20 3a 20 e7 61 72 63 68 65 69 67 68 74 |160 : .archeight| 00009dd0 25 3d 32 35 36 20 8c 20 6d 6f 64 65 25 3d 39 20 |%=256 . mode%=9 | 00009de0 8b 20 6d 6f 64 65 25 3d 32 30 0d 25 ee 3c 20 20 |. mode%=20.%.< | 00009df0 20 20 20 20 20 20 20 20 20 20 c9 20 33 32 30 20 | . 320 | 00009e00 3a 20 e7 61 72 63 68 65 69 67 68 74 25 3d 32 35 |: .archeight%=25| 00009e10 36 20 8c 20 6d 6f 64 65 25 3d 39 20 8b 20 6d 6f |6 . mode%=9 . mo| 00009e20 64 65 25 3d 32 30 0d 25 f8 3d 20 20 20 20 20 20 |de%=20.%.= | 00009e30 20 20 20 20 20 20 c9 20 36 34 30 20 3a 20 e7 61 | . 640 : .a| 00009e40 72 63 68 65 69 67 68 74 25 3d 32 35 36 20 8c 20 |rcheight%=256 . | 00009e50 6d 6f 64 65 25 3d 31 32 20 8b 20 6d 6f 64 65 25 |mode%=12 . mode%| 00009e60 3d 32 30 0d 26 02 33 20 20 20 20 20 20 20 20 20 |=20.&.3 | 00009e70 20 20 20 c9 20 31 30 35 36 20 3a 20 e7 61 72 63 | . 1056 : .arc| 00009e80 68 65 69 67 68 74 25 3d 32 35 36 20 8c 20 6d 6f |height%=256 . mo| 00009e90 64 65 25 3d 31 36 0d 26 0c 10 20 20 20 20 20 20 |de%=16.&.. | 00009ea0 20 20 20 20 20 cb 0d 26 16 1b 20 c9 20 32 35 36 | ..&.. . 256| 00009eb0 20 3a 20 c8 8e 20 61 72 63 77 69 64 74 68 25 20 | : .. arcwidth% | 00009ec0 ca 0d 26 20 3e 20 20 20 20 20 20 20 20 20 20 20 |..& > | 00009ed0 20 20 c9 20 31 36 30 20 3a 20 e7 61 72 63 68 65 | . 160 : .arche| 00009ee0 69 67 68 74 25 3d 32 35 36 20 8c 20 6d 6f 64 65 |ight%=256 . mode| 00009ef0 25 3d 31 30 20 8b 20 6d 6f 64 65 25 3d 32 31 0d |%=10 . mode%=21.| 00009f00 26 2a 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 |&*> | 00009f10 c9 20 33 32 30 20 3a 20 e7 61 72 63 68 65 69 67 |. 320 : .archeig| 00009f20 68 74 25 3d 32 35 36 20 8c 20 6d 6f 64 65 25 3d |ht%=256 . mode%=| 00009f30 31 33 20 8b 20 6d 6f 64 65 25 3d 32 31 0d 26 34 |13 . mode%=21.&4| 00009f40 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 c9 20 |> . | 00009f50 36 34 30 20 3a 20 e7 61 72 63 68 65 69 67 68 74 |640 : .archeight| 00009f60 25 3d 32 35 36 20 8c 20 6d 6f 64 65 25 3d 31 35 |%=256 . mode%=15| 00009f70 20 8b 20 6d 6f 64 65 25 3d 32 31 0d 26 3e 34 20 | . mode%=21.&>4 | 00009f80 20 20 20 20 20 20 20 20 20 20 20 20 c9 20 31 30 | . 10| 00009f90 35 36 20 3a 20 e7 61 72 63 68 65 69 67 68 74 25 |56 : .archeight%| 00009fa0 3d 32 35 36 20 8c 20 6d 6f 64 65 25 3d 32 34 0d |=256 . mode%=24.| 00009fb0 26 48 11 20 20 20 20 20 20 20 20 20 20 20 20 cb |&H. .| 00009fc0 0d 26 52 05 cb 0d 26 5c 19 f4 20 43 68 65 63 6b |.&R...&\.. Check| 00009fd0 20 69 66 20 6d 6f 64 65 20 69 73 20 6f 6b 0d 26 | if mode is ok.&| 00009fe0 66 73 e7 6d 6f 64 65 25 3c 30 20 8c 20 65 72 72 |fs.mode%<0 . err| 00009ff0 6f 72 24 3d 22 49 20 63 61 6e 6e 6f 74 20 66 69 |or$="I cannot fi| 0000a000 6e 64 20 61 20 73 75 69 74 61 62 6c 65 20 6d 6f |nd a suitable mo| 0000a010 64 65 20 74 6f 20 64 69 73 70 6c 61 79 20 22 2b |de to display "+| 0000a020 c3 28 77 69 64 74 68 25 29 2b 22 78 22 2b c3 28 |.(width%)+"x"+.(| 0000a030 68 65 69 67 68 74 25 29 2b 22 78 22 2b c3 28 63 |height%)+"x"+.(c| 0000a040 6f 6c 6f 75 72 73 25 29 2b 22 20 21 22 3a 3d 2d |olours%)+" !":=-| 0000a050 31 0d 26 70 0a 3d 6d 6f 64 65 25 0d 26 7a 05 20 |1.&p.=mode%.&z. | 0000a060 0d 26 84 13 dd a4 74 69 6d 65 73 28 76 61 6c 75 |.&....times(valu| 0000a070 65 25 29 0d 26 8e 30 f4 20 52 65 74 75 72 6e 73 |e%).&.0. Returns| 0000a080 20 53 54 52 24 76 61 6c 75 65 25 20 77 69 74 68 | STR$value% with| 0000a090 20 27 70 6c 75 72 61 6c 20 65 78 74 65 6e 73 69 | 'plural extensi| 0000a0a0 6f 6e 27 0d 26 98 09 ea 20 5f 64 25 0d 26 a2 33 |on'.&... _d%.&.3| 0000a0b0 5f 64 25 3d 76 61 6c 75 65 25 83 31 30 3a f4 20 |_d%=value%.10:. | 0000a0c0 4c 61 73 74 20 64 69 67 69 74 20 64 65 74 65 72 |Last digit deter| 0000a0d0 6d 69 6e 65 73 20 65 78 74 65 6e 73 69 6f 6e 0d |mines extension.| 0000a0e0 26 ac 36 e7 28 28 28 76 61 6c 75 65 25 83 31 30 |&.6.(((value%.10| 0000a0f0 30 29 81 31 30 29 3d 31 29 84 28 5f 64 25 3e 33 |0).10)=1).(_d%>3| 0000a100 29 84 28 5f 64 25 3d 30 29 20 8c 20 3d c3 5f 25 |).(_d%=0) . =._%| 0000a110 2b 22 74 68 22 0d 26 b6 0c c8 8e 20 5f 64 25 20 |+"th".&.... _d% | 0000a120 ca 0d 26 c0 18 20 c9 20 31 20 3a 20 3d c3 76 61 |..&.. . 1 : =.va| 0000a130 6c 75 65 25 2b 22 73 74 22 0d 26 ca 18 20 c9 20 |lue%+"st".&.. . | 0000a140 32 20 3a 20 3d c3 76 61 6c 75 65 25 2b 22 6e 64 |2 : =.value%+"nd| 0000a150 22 0d 26 d4 18 20 c9 20 33 20 3a 20 3d c3 76 61 |".&.. . 3 : =.va| 0000a160 6c 75 65 25 2b 22 72 64 22 0d 26 de 05 cb 0d 26 |lue%+"rd".&....&| 0000a170 e8 05 20 0d 26 f2 0b dd f2 6d 63 6f 64 65 0d 26 |.. .&....mcode.&| 0000a180 fc 1b f4 20 47 65 6e 65 72 61 74 65 73 20 6d 61 |... Generates ma| 0000a190 63 68 69 6e 65 63 6f 64 65 0d 27 06 19 e3 20 4e |chinecode.'... N| 0000a1a0 3d 30 20 b8 20 32 20 88 32 3a 50 25 3d 43 6f 64 |=0 . 2 .2:P%=Cod| 0000a1b0 65 25 0d 27 10 09 5b 4f 50 54 4e 0d 27 1a 3c 2e |e%.'..[OPTN.'.<.| 0000a1c0 73 63 72 65 65 6e 20 20 45 51 55 44 20 30 3a 5c |screen EQUD 0:\| 0000a1d0 20 50 69 63 74 75 72 65 20 64 65 73 74 69 6e 61 | Picture destina| 0000a1e0 74 69 6f 6e 20 73 74 61 72 74 20 20 20 20 7d 20 |tion start } | 0000a1f0 47 65 6e 65 72 61 6c 0d 27 24 3a 2e 6c 6f 6d 65 |General.'$:.lome| 0000a200 6d 20 20 20 45 51 55 44 20 30 3a 5c 20 53 74 61 |m EQUD 0:\ Sta| 0000a210 72 74 20 61 64 64 72 65 73 73 20 6f 66 20 66 72 |rt address of fr| 0000a220 65 65 20 73 70 61 63 65 20 20 7d 20 20 20 20 27 |ee space } '| 0000a230 27 0d 27 2e 3a 2e 68 69 6d 65 6d 20 20 20 45 51 |'.'.:.himem EQ| 0000a240 55 44 20 30 3a 5c 20 45 6e 64 20 61 64 64 72 65 |UD 0:\ End addre| 0000a250 73 73 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 |ss of free space| 0000a260 20 20 20 20 7d 20 20 20 20 27 27 0d 27 38 3a 2e | } ''.'8:.| 0000a270 64 61 74 61 20 20 20 20 45 51 55 44 20 30 3a 5c |data EQUD 0:\| 0000a280 20 44 61 74 61 20 73 74 61 72 74 20 20 20 20 20 | Data start | 0000a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 | } | 0000a2a0 20 20 20 27 27 0d 27 42 3d 2e 63 6f 6d 70 72 20 | ''.'B=.compr | 0000a2b0 20 20 45 51 55 44 20 30 3a 5c 20 43 6f 6d 70 72 | EQUD 0:\ Compr| 0000a2c0 65 73 73 65 64 20 28 3c 3e 30 29 20 6f 72 20 6e |essed (<>0) or n| 0000a2d0 6f 74 20 28 30 29 20 20 7d 20 41 6d 69 67 61 20 |ot (0) } Amiga | 0000a2e0 e7 46 0d 27 4c 3a 2e 73 63 74 79 70 65 20 20 45 |.F.'L:.sctype E| 0000a2f0 51 55 44 20 30 3a 5c 20 4e 6f 72 6d 61 6c 20 28 |QUD 0:\ Normal (| 0000a300 30 29 20 48 41 4d 20 28 31 29 20 20 20 20 20 20 |0) HAM (1) | 0000a310 20 20 20 20 20 7d 20 20 20 20 27 27 0d 27 56 41 | } ''.'VA| 0000a320 2e 72 6f 77 6c 65 6e 20 20 45 51 55 44 20 30 3a |.rowlen EQUD 0:| 0000a330 5c 20 42 79 74 65 73 20 70 65 72 20 69 6d 61 67 |\ Bytes per imag| 0000a340 65 20 72 6f 77 20 20 20 20 20 20 20 20 20 20 7d |e row }| 0000a350 20 41 6d 69 67 61 20 e7 46 2f 47 49 46 0d 27 60 | Amiga .F/GIF.'`| 0000a360 3a 2e 61 72 63 62 69 74 73 20 45 51 55 44 20 30 |:.arcbits EQUD 0| 0000a370 3a 5c 20 42 69 74 73 20 70 65 72 20 70 69 78 65 |:\ Bits per pixe| 0000a380 6c 20 28 73 63 72 65 65 6e 29 20 20 20 20 20 20 |l (screen) | 0000a390 7d 20 20 20 20 27 27 0d 27 6a 3a 2e 61 72 63 70 |} ''.'j:.arcp| 0000a3a0 69 78 73 20 45 51 55 44 20 30 3a 5c 20 50 69 78 |ixs EQUD 0:\ Pix| 0000a3b0 65 6c 73 20 70 65 72 20 73 63 72 65 65 6e 20 62 |els per screen b| 0000a3c0 79 74 65 20 20 20 20 20 20 20 7d 20 20 20 20 27 |yte } '| 0000a3d0 27 0d 27 74 3a 2e 70 69 78 62 69 74 73 20 45 51 |'.'t:.pixbits EQ| 0000a3e0 55 44 20 30 3a 5c 20 42 69 74 73 20 70 65 72 20 |UD 0:\ Bits per | 0000a3f0 70 69 78 65 6c 20 28 69 6d 61 67 65 29 20 20 20 |pixel (image) | 0000a400 20 20 20 20 7d 20 20 20 20 27 27 0d 27 7e 3a 2e | } ''.'~:.| 0000a410 77 69 64 74 68 20 20 20 45 51 55 44 20 30 3a 5c |width EQUD 0:\| 0000a420 20 49 6d 61 67 65 20 77 69 64 74 68 20 69 6e 20 | Image width in | 0000a430 70 69 78 65 6c 73 20 20 20 20 20 20 20 20 7d 20 |pixels } | 0000a440 20 20 20 27 27 0d 27 88 3a 2e 68 65 69 67 68 74 | ''.'.:.height| 0000a450 20 20 45 51 55 44 20 30 3a 5c 20 49 6d 61 67 65 | EQUD 0:\ Image| 0000a460 20 68 65 69 67 68 74 20 69 6e 20 70 69 78 65 6c | height in pixel| 0000a470 73 20 20 20 20 20 20 20 7d 20 20 20 20 27 27 0d |s } ''.| 0000a480 27 92 38 2e 6c 61 63 65 64 20 20 20 45 51 55 44 |'.8.laced EQUD| 0000a490 20 30 3a 5c 20 4c 61 63 65 64 20 72 6f 77 20 63 | 0:\ Laced row c| 0000a4a0 6f 64 69 6e 67 20 66 6c 61 67 20 20 20 20 20 20 |oding flag | 0000a4b0 20 20 7d 20 47 49 46 0d 27 9c 3a 2e 74 61 62 62 | } GIF.'.:.tabb| 0000a4c0 66 20 20 20 45 51 55 44 20 30 3a 5c 20 44 65 63 |f EQUD 0:\ Dec| 0000a4d0 6f 6d 70 72 65 73 73 69 6f 6e 20 74 61 62 6c 65 |ompression table| 0000a4e0 20 62 75 66 66 65 72 20 20 20 7d 20 20 20 20 27 | buffer } '| 0000a4f0 27 0d 27 a6 05 20 0d 27 b0 38 2e 77 69 70 65 5f |'.'.. .'.8.wipe_| 0000a500 6d 65 6d 20 5c 20 57 69 70 65 73 20 72 31 20 62 |mem \ Wipes r1 b| 0000a510 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 66 |ytes of memory f| 0000a520 72 6f 6d 20 72 30 20 6f 6e 77 61 72 64 73 0d 27 |rom r0 onwards.'| 0000a530 ba 21 20 53 54 4d 46 44 20 72 31 33 21 2c 7b 72 |.! STMFD r13!,{r| 0000a540 31 34 7d 3a 5c 20 53 61 76 65 20 6c 69 6e 6b 0d |14}:\ Save link.| 0000a550 27 c4 1c 20 4d 4f 56 20 72 32 2c 23 30 3a 5c 20 |'.. MOV r2,#0:\ | 0000a560 43 6c 65 61 72 20 76 61 6c 75 65 0d 27 ce 3e 2e |Clear value.'.>.| 0000a570 77 69 70 65 5f 77 72 64 20 53 54 52 20 72 32 2c |wipe_wrd STR r2,| 0000a580 5b 72 30 5d 2c 23 34 3a 53 55 42 53 20 72 31 2c |[r0],#4:SUBS r1,| 0000a590 72 31 2c 23 34 3a 42 47 54 20 77 69 70 65 5f 77 |r1,#4:BGT wipe_w| 0000a5a0 72 64 3a 5c 20 57 69 70 65 0d 27 d8 1d 20 4c 44 |rd:\ Wipe.'.. LD| 0000a5b0 4d 46 44 20 72 31 33 21 2c 7b 70 63 7d 3a 5c 20 |MFD r13!,{pc}:\ | 0000a5c0 52 65 74 75 72 6e 0d 27 e2 05 20 0d 27 ec 33 2e |Return.'.. .'.3.| 0000a5d0 66 68 61 6e 64 6c 65 20 45 51 55 44 20 30 3a 5c |fhandle EQUD 0:\| 0000a5e0 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 66 20 | File handle of | 0000a5f0 6f 70 65 6e 20 64 61 74 61 20 66 69 6c 65 0d 27 |open data file.'| 0000a600 f6 27 2e 66 70 74 72 20 20 20 20 45 51 55 44 20 |.'.fptr EQUD | 0000a610 30 3a 5c 20 43 75 72 72 65 6e 74 20 8f 20 69 6e |0:\ Current . in| 0000a620 20 66 69 6c 65 0d 28 00 26 2e 65 6f 66 20 20 20 | file.(.&.eof | 0000a630 20 20 45 51 55 44 20 30 3a 5c 20 c5 20 73 74 61 | EQUD 0:\ . sta| 0000a640 74 75 73 20 6f 66 20 66 69 6c 65 0d 28 0a 22 2e |tus of file.(.".| 0000a650 6c 6f 61 64 65 64 20 20 45 51 55 44 20 30 3a 5c |loaded EQUD 0:\| 0000a660 20 42 79 74 65 73 20 6c 6f 61 64 65 64 0d 28 14 | Bytes loaded.(.| 0000a670 36 2e 63 68 73 69 7a 65 20 20 45 51 55 44 20 30 |6.chsize EQUD 0| 0000a680 3a 5c 20 53 69 7a 65 20 6f 66 20 63 68 75 6e 6b |:\ Size of chunk| 0000a690 73 20 6c 6f 61 64 65 64 20 61 74 20 28 63 68 75 |s loaded at (chu| 0000a6a0 6e 6b 29 0d 28 1e 2d 2e 63 68 75 6e 6b 20 20 20 |nk).(.-.chunk | 0000a6b0 45 51 55 44 20 30 3a 5c 20 41 64 64 72 65 73 73 |EQUD 0:\ Address| 0000a6c0 20 6f 66 20 63 68 75 6e 6b 20 62 75 66 66 65 72 | of chunk buffer| 0000a6d0 0d 28 28 05 20 0d 28 32 3e 2e 67 65 74 5f 73 63 |.((. .(2>.get_sc| 0000a6e0 68 75 6e 6b 20 5c 20 47 65 74 73 20 6e 65 78 74 |hunk \ Gets next| 0000a6f0 20 73 65 71 75 65 6e 74 69 61 6c 20 63 68 75 6e | sequential chun| 0000a700 6b 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 20 66 |k of data from f| 0000a710 69 6c 65 0d 28 3c 33 20 53 54 4d 46 44 20 72 31 |ile.(<3 STMFD r1| 0000a720 33 21 2c 7b 72 30 2c 72 31 34 7d 3a 5c 20 53 61 |3!,{r0,r14}:\ Sa| 0000a730 76 65 72 20 72 65 67 69 73 74 65 72 73 20 61 6e |ver registers an| 0000a740 64 20 6c 69 6e 6b 0d 28 46 32 20 4d 4f 56 20 72 |d link.(F2 MOV r| 0000a750 30 2c 23 30 3a 42 4c 20 67 65 74 5f 63 68 75 6e |0,#0:BL get_chun| 0000a760 6b 3a 5c 20 47 65 74 20 73 65 71 75 65 6e 74 69 |k:\ Get sequenti| 0000a770 61 6c 20 63 68 75 6e 6b 0d 28 50 20 20 4c 44 4d |al chunk.(P LDM| 0000a780 46 44 20 72 31 33 21 2c 7b 72 30 2c 70 63 7d 3a |FD r13!,{r0,pc}:| 0000a790 5c 20 52 65 74 75 72 6e 0d 28 5a 47 2e 67 65 74 |\ Return.(ZG.get| 0000a7a0 5f 63 68 75 6e 6b 20 5c 20 47 65 74 73 20 63 68 |_chunk \ Gets ch| 0000a7b0 75 6e 6b 20 6f 66 20 64 61 74 61 20 66 72 6f 6d |unk of data from| 0000a7c0 20 66 69 6c 65 2c 20 77 69 74 68 20 72 65 2d 72 | file, with re-r| 0000a7d0 65 61 64 20 69 66 20 72 65 71 75 69 72 65 64 0d |ead if required.| 0000a7e0 28 64 49 20 5c 20 4f 6e 20 65 6e 74 72 79 20 2d |(dI \ On entry -| 0000a7f0 20 72 30 20 69 73 20 6e 75 6d 62 65 72 20 6f 66 | r0 is number of| 0000a800 20 62 79 74 65 73 20 74 6f 20 72 65 2d 72 65 61 | bytes to re-rea| 0000a810 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 6c 61 |d from end of la| 0000a820 73 74 20 63 68 75 6e 6b 0d 28 6e 2e 20 5c 20 4f |st chunk.(n. \ O| 0000a830 6e 20 65 78 69 74 20 20 2d 20 45 51 20 69 66 20 |n exit - EQ if | 0000a840 6e 6f 20 6d 6f 72 65 20 62 79 74 65 73 2c 20 65 |no more bytes, e| 0000a850 6c 73 65 20 4e 45 0d 28 78 35 20 53 54 4d 46 44 |lse NE.(x5 STMFD| 0000a860 20 72 31 33 21 2c 7b 72 30 2d 72 34 2c 72 31 34 | r13!,{r0-r4,r14| 0000a870 7d 3a 5c 20 53 61 76 65 20 72 65 67 69 73 74 65 |}:\ Save registe| 0000a880 72 73 20 61 6e 64 20 6c 69 6e 6b 0d 28 82 4b 20 |rs and link.(.K | 0000a890 4c 44 52 20 72 31 2c 66 68 61 6e 64 6c 65 3a 4c |LDR r1,fhandle:L| 0000a8a0 44 52 20 72 32 2c 63 68 75 6e 6b 3a 4c 44 52 20 |DR r2,chunk:LDR | 0000a8b0 72 33 2c 63 68 73 69 7a 65 3a 5c 20 46 69 6c 65 |r3,chsize:\ File| 0000a8c0 20 68 61 6e 64 6c 65 20 61 6e 64 20 63 68 75 6e | handle and chun| 0000a8d0 6b 20 69 6e 66 6f 0d 28 8c 31 20 4c 44 52 20 72 |k info.(.1 LDR r| 0000a8e0 34 2c 66 70 74 72 3a 53 55 42 20 72 34 2c 72 34 |4,fptr:SUB r4,r4| 0000a8f0 2c 72 30 3a 5c 20 43 61 6c 63 75 6c 61 74 65 20 |,r0:\ Calculate | 0000a900 73 74 61 72 74 20 8f 0d 28 96 34 20 4d 4f 56 20 |start ..(.4 MOV | 0000a910 72 30 2c 23 33 3a 53 57 49 20 22 58 4f 53 5f 47 |r0,#3:SWI "XOS_G| 0000a920 42 50 42 22 3a 5c 20 52 65 61 64 20 63 68 75 6e |BPB":\ Read chun| 0000a930 6b 20 66 72 6f 6d 20 66 69 6c 65 0d 28 a0 1e 20 |k from file.(.. | 0000a940 53 54 52 20 72 34 2c 66 70 74 72 3a 5c 20 53 74 |STR r4,fptr:\ St| 0000a950 6f 72 65 20 6e 65 77 20 8f 0d 28 aa 3f 20 43 4d |ore new ..(.? CM| 0000a960 50 20 72 33 2c 23 30 3a ec 51 20 72 30 2c 23 30 |P r3,#0:.Q r0,#0| 0000a970 3a 4d 56 4e 4e 45 20 72 30 2c 23 30 3a 53 54 52 |:MVNNE r0,#0:STR| 0000a980 20 72 30 2c 65 6f 66 3a 5c 20 53 74 6f 72 65 20 | r0,eof:\ Store | 0000a990 c5 20 73 74 61 74 75 73 0d 28 b4 4b 20 4c 44 52 |. status.(.K LDR| 0000a9a0 20 72 30 2c 63 68 73 69 7a 65 3a 53 55 42 20 72 | r0,chsize:SUB r| 0000a9b0 30 2c 72 30 2c 72 33 3a 53 54 52 20 72 30 2c 6c |0,r0,r3:STR r0,l| 0000a9c0 6f 61 64 65 64 3a 54 45 51 20 72 30 2c 23 30 3a |oaded:TEQ r0,#0:| 0000a9d0 5c 20 42 79 74 65 73 20 74 72 61 6e 73 66 65 72 |\ Bytes transfer| 0000a9e0 72 65 64 0d 28 be 23 20 4c 44 4d 46 44 20 72 31 |red.(.# LDMFD r1| 0000a9f0 33 21 2c 7b 72 30 2d 72 34 2c 70 63 7d 3a 5c 20 |3!,{r0-r4,pc}:\ | 0000aa00 52 65 74 75 72 6e 0d 28 c8 05 20 0d 28 d2 25 2e |Return.(.. .(.%.| 0000aa10 70 6c 6f 74 5f 72 6f 77 20 5c 20 50 6c 6f 74 73 |plot_row \ Plots| 0000aa20 20 61 20 72 6f 77 20 6f 66 20 70 69 78 65 6c 73 | a row of pixels| 0000aa30 0d 28 dc 2b 20 5c 20 4f 6e 20 65 6e 74 72 79 20 |.(.+ \ On entry | 0000aa40 2d 20 72 30 20 3d 20 61 64 64 72 65 73 73 20 6f |- r0 = address o| 0000aa50 66 20 73 63 72 65 65 6e 72 6f 77 0d 28 e6 1e 20 |f screenrow.(.. | 0000aa60 5c 20 20 20 20 20 20 20 20 20 20 2d 20 72 31 20 |\ - r1 | 0000aa70 3d 20 23 70 69 78 65 6c 73 0d 28 f0 30 20 5c 20 |= #pixels.(.0 \ | 0000aa80 4f 6e 20 65 78 69 74 20 20 2d 20 72 30 20 3d 20 |On exit - r0 = | 0000aa90 61 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 |address of next | 0000aaa0 73 63 72 65 65 6e 72 6f 77 0d 28 fa 35 20 53 54 |screenrow.(.5 ST| 0000aab0 4d 46 44 20 72 31 33 21 2c 7b 72 31 2d 72 39 2c |MFD r13!,{r1-r9,| 0000aac0 72 31 34 7d 3a 5c 20 53 61 76 65 20 72 65 67 69 |r14}:\ Save regi| 0000aad0 73 74 65 72 73 20 61 6e 64 20 6c 69 6e 6b 0d 29 |sters and link.)| 0000aae0 04 3c 20 4c 44 52 20 72 33 2c 72 6f 77 6c 65 6e |.< LDR r3,rowlen| 0000aaf0 3a 41 44 44 20 72 36 2c 72 30 2c 72 33 3a 5c 20 |:ADD r6,r0,r3:\ | 0000ab00 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 |Address of next | 0000ab10 73 63 72 65 65 6e 20 72 6f 77 0d 29 0e 4a 20 4c |screen row.).J L| 0000ab20 44 52 20 72 34 2c 61 72 63 62 69 74 73 3a 4c 44 |DR r4,arcbits:LD| 0000ab30 52 20 72 35 2c 61 72 63 70 69 78 73 3a 5c 20 42 |R r5,arcpixs:\ B| 0000ab40 69 74 73 20 70 65 72 20 70 69 78 65 6c 2c 20 70 |its per pixel, p| 0000ab50 69 78 65 6c 73 20 70 65 72 20 73 63 72 65 65 6e |ixels per screen| 0000ab60 62 79 74 65 0d 29 18 44 20 4c 44 52 20 72 37 2c |byte.).D LDR r7,| 0000ab70 61 5f 63 6f 6c 6d 61 70 3a 4c 44 52 20 72 32 2c |a_colmap:LDR r2,| 0000ab80 61 5f 72 6f 77 64 61 74 3a 5c 20 43 6f 6c 6f 75 |a_rowdat:\ Colou| 0000ab90 72 20 6d 61 70 20 61 6e 64 20 72 6f 77 20 70 69 |r map and row pi| 0000aba0 78 65 6c 20 64 61 74 61 0d 29 22 3e 2e 70 6c 5f |xel data.)">.pl_| 0000abb0 62 79 74 65 20 4d 4f 56 20 72 38 2c 23 30 3a 4d |byte MOV r8,#0:M| 0000abc0 4f 56 20 72 39 2c 72 35 3a 5c 20 49 6e 69 74 20 |OV r9,r5:\ Init | 0000abd0 62 75 69 6c 64 75 70 20 6f 66 20 73 63 72 65 65 |buildup of scree| 0000abe0 6e 20 62 79 74 65 0d 29 2c 3c 2e 70 6c 5f 62 75 |n byte.),<.pl_bu| 0000abf0 69 6c 64 20 53 55 42 53 20 72 39 2c 72 39 2c 23 |ild SUBS r9,r9,#| 0000ac00 31 3a 4c 44 52 42 20 72 33 2c 5b 72 32 2c 72 39 |1:LDRB r3,[r2,r9| 0000ac10 5d 3a 5c 20 47 65 74 20 70 69 78 65 6c 20 64 61 |]:\ Get pixel da| 0000ac20 74 61 0d 29 36 2c 20 4c 44 52 42 20 72 33 2c 5b |ta.)6, LDRB r3,[| 0000ac30 72 37 2c 72 33 5d 3a 5c 20 4d 61 70 20 74 6f 20 |r7,r3]:\ Map to | 0000ac40 6c 6f 67 69 63 61 6c 20 63 6f 6c 6f 75 72 0d 29 |logical colour.)| 0000ac50 40 3b 20 84 52 20 72 38 2c 72 33 2c 72 38 2c 4c |@; .R r8,r3,r8,L| 0000ac60 53 4c 20 72 34 3a 42 4e 45 20 70 6c 5f 62 75 69 |SL r4:BNE pl_bui| 0000ac70 6c 64 3a 5c 20 27 50 6c 6f 74 27 20 70 69 78 65 |ld:\ 'Plot' pixe| 0000ac80 6c 20 69 6e 20 62 79 74 65 0d 29 4a 2a 20 53 54 |l in byte.)J* ST| 0000ac90 52 42 20 72 38 2c 5b 72 30 5d 2c 23 31 3a 5c 20 |RB r8,[r0],#1:\ | 0000aca0 44 69 73 70 6c 61 79 20 73 63 72 65 65 6e 20 62 |Display screen b| 0000acb0 79 74 65 0d 29 54 3b 20 41 44 44 20 72 32 2c 72 |yte.)T; ADD r2,r| 0000acc0 32 2c 72 35 3a 53 55 42 53 20 72 31 2c 72 31 2c |2,r5:SUBS r1,r1,| 0000acd0 72 35 3a 42 4e 45 20 70 6c 5f 62 79 74 65 3a 5c |r5:BNE pl_byte:\| 0000ace0 20 4e 65 78 74 20 70 69 78 65 6c 28 73 29 0d 29 | Next pixel(s).)| 0000acf0 5e 2f 20 4d 4f 56 20 72 30 2c 72 36 3a 5c 20 53 |^/ MOV r0,r6:\ S| 0000ad00 65 74 20 61 64 64 72 65 73 73 20 6f 66 20 6e 65 |et address of ne| 0000ad10 78 74 20 73 63 72 65 65 6e 20 72 6f 77 0d 29 68 |xt screen row.)h| 0000ad20 23 20 4c 44 4d 46 44 20 72 31 33 21 2c 7b 72 31 |# LDMFD r13!,{r1| 0000ad30 2d 72 39 2c 70 63 7d 3a 5c 20 52 65 74 75 72 6e |-r9,pc}:\ Return| 0000ad40 0d 29 72 05 20 0d 29 7c 4e 3b 3b 3b 3b 3b 3b 3b |.)r. .)|N;;;;;;;| 0000ad50 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b |;;;;;;;;;;;;;;;;| * 0000ad90 3b 3b 3b 0d 29 86 05 20 0d 29 90 23 2e 75 6e 70 |;;;.).. .).#.unp| 0000ada0 61 63 6b 5f 50 49 33 20 5c 20 41 74 61 72 69 20 |ack_PI3 \ Atari | 0000adb0 50 49 33 20 70 69 63 74 75 72 65 0d 29 9a 21 20 |PI3 picture.).! | 0000adc0 53 54 4d 46 44 20 72 31 33 21 2c 7b 72 31 34 7d |STMFD r13!,{r14}| 0000add0 3a 5c 20 53 61 76 65 20 6c 69 6e 6b 0d 29 a4 41 |:\ Save link.).A| 0000ade0 20 4c 44 52 20 72 31 2c 73 63 72 65 65 6e 3a 4d | LDR r1,screen:M| 0000adf0 4f 56 20 72 33 2c 23 26 37 44 30 30 3a 5c 20 44 |OV r3,#&7D00:\ D| 0000ae00 65 73 74 69 6e 61 74 69 6f 6e 2c 20 74 6f 74 61 |estination, tota| 0000ae10 6c 20 64 61 74 61 20 6c 65 6e 67 74 68 0d 29 ae |l data length.).| 0000ae20 36 20 4c 44 52 20 72 34 2c 61 5f 66 6c 69 70 6d |6 LDR r4,a_flipm| 0000ae30 61 70 3a 5c 20 49 6e 76 65 72 74 65 64 20 61 6e |ap:\ Inverted an| 0000ae40 64 20 72 65 76 65 72 73 65 64 20 62 69 74 73 20 |d reversed bits | 0000ae50 6d 61 70 0d 29 b8 4a 2e 64 31 5f 63 68 75 6e 6b |map.).J.d1_chunk| 0000ae60 20 42 4c 20 67 65 74 5f 73 63 68 75 6e 6b 3a 42 | BL get_schunk:B| 0000ae70 45 51 20 64 31 5f 65 78 69 74 3a 4c 44 52 20 72 |EQ d1_exit:LDR r| 0000ae80 32 2c 63 68 75 6e 6b 3a 4c 44 52 20 72 35 2c 6c |2,chunk:LDR r5,l| 0000ae90 6f 61 64 65 64 3a 5c 20 43 68 75 6e 6b 0d 29 c2 |oaded:\ Chunk.).| 0000aea0 4a 2e 64 31 5f 63 6f 70 79 20 4c 44 52 42 20 72 |J.d1_copy LDRB r| 0000aeb0 30 2c 5b 72 32 5d 2c 23 31 3a 4c 44 52 42 20 72 |0,[r2],#1:LDRB r| 0000aec0 30 2c 5b 72 34 2c 72 30 5d 3a 5c 20 47 65 74 20 |0,[r4,r0]:\ Get | 0000aed0 38 20 62 69 74 73 20 64 61 74 61 20 61 6e 64 20 |8 bits data and | 0000aee0 63 6f 6e 76 65 72 74 0d 29 cc 48 20 53 54 52 42 |convert.).H STRB| 0000aef0 20 72 30 2c 5b 72 31 5d 2c 23 31 3a 53 55 42 53 | r0,[r1],#1:SUBS| 0000af00 20 72 33 2c 72 33 2c 23 31 3a 42 4c 45 20 64 31 | r3,r3,#1:BLE d1| 0000af10 5f 65 78 69 74 3a 5c 20 43 68 65 63 6b 20 69 66 |_exit:\ Check if| 0000af20 20 61 6c 6c 20 62 79 74 65 73 20 64 6f 6e 65 0d | all bytes done.| 0000af30 29 d6 3d 20 53 55 42 53 20 72 35 2c 72 35 2c 23 |).= SUBS r5,r5,#| 0000af40 31 3a 42 47 54 20 64 31 5f 63 6f 70 79 3a 42 20 |1:BGT d1_copy:B | 0000af50 64 31 5f 63 68 75 6e 6b 3a 5c 20 4e 65 78 74 20 |d1_chunk:\ Next | 0000af60 64 61 74 61 20 62 79 74 65 28 73 29 0d 29 e0 25 |data byte(s).).%| 0000af70 2e 64 31 5f 65 78 69 74 20 4c 44 4d 46 44 20 72 |.d1_exit LDMFD r| 0000af80 31 33 21 2c 7b 70 63 7d 3a 5c 20 52 65 74 75 72 |13!,{pc}:\ Retur| 0000af90 6e 0d 29 ea 05 20 0d 29 f4 4e 3b 3b 3b 3b 3b 3b |n.).. .).N;;;;;;| 0000afa0 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b |;;;;;;;;;;;;;;;;| * 0000afe0 3b 3b 3b 3b 0d 29 fe 05 20 0d 2a 08 23 2e 75 6e |;;;;.).. .*.#.un| 0000aff0 70 61 63 6b 5f 50 49 31 20 5c 20 41 74 61 72 69 |pack_PI1 \ Atari| 0000b000 20 50 49 31 20 70 69 63 74 75 72 65 0d 2a 12 21 | PI1 picture.*.!| 0000b010 20 53 54 4d 46 44 20 72 31 33 21 2c 7b 72 31 34 | STMFD r13!,{r14| 0000b020 7d 3a 5c 20 53 61 76 65 20 6c 69 6e 6b 0d 2a 1c |}:\ Save link.*.| 0000b030 41 20 4c 44 52 20 72 31 2c 73 63 72 65 65 6e 3a |A LDR r1,screen:| 0000b040 4d 4f 56 20 72 33 2c 23 26 37 44 30 30 3a 5c 20 |MOV r3,#&7D00:\ | 0000b050 44 65 73 74 69 6e 61 74 69 6f 6e 2c 20 74 6f 74 |Destination, tot| 0000b060 61 6c 20 64 61 74 61 20 6c 65 6e 67 74 68 0d 2a |al data length.*| 0000b070 26 37 20 4c 44 52 20 72 31 32 2c 61 5f 66 6c 69 |&7 LDR r12,a_fli| 0000b080 70 6d 61 70 3a 5c 20 49 6e 76 65 72 74 65 64 20 |pmap:\ Inverted | 0000b090 61 6e 64 20 72 65 76 65 72 73 65 64 20 62 69 74 |and reversed bit| 0000b0a0 73 20 6d 61 70 0d 2a 30 4b 2e 64 32 5f 63 68 75 |s map.*0K.d2_chu| 0000b0b0 6e 6b 20 42 4c 20 67 65 74 5f 73 63 68 75 6e 6b |nk BL get_schunk| 0000b0c0 3a 42 45 51 20 64 32 5f 65 78 69 74 3a 4c 44 52 |:BEQ d2_exit:LDR| 0000b0d0 20 72 32 2c 63 68 75 6e 6b 3a 4c 44 52 20 72 31 | r2,chunk:LDR r1| 0000b0e0 30 2c 6c 6f 61 64 65 64 3a 5c 20 43 68 75 6e 6b |0,loaded:\ Chunk| 0000b0f0 0d 2a 3a 32 20 4d 4f 56 20 72 37 2c 72 31 30 3a |.*:2 MOV r7,r10:| 0000b100 5c 20 50 72 65 70 61 72 65 20 66 6c 69 70 20 6f |\ Prepare flip o| 0000b110 66 20 61 6c 6c 20 6c 6f 61 64 65 64 20 62 79 74 |f all loaded byt| 0000b120 65 73 0d 2a 44 4c 2e 64 32 5f 66 6c 69 70 20 53 |es.*DL.d2_flip S| 0000b130 55 42 53 20 72 37 2c 72 37 2c 23 31 3a 4c 44 52 |UBS r7,r7,#1:LDR| 0000b140 42 20 72 36 2c 5b 72 32 2c 72 37 5d 3a 4c 44 52 |B r6,[r2,r7]:LDR| 0000b150 42 20 72 36 2c 5b 72 31 32 2c 72 36 5d 3a 5c 20 |B r6,[r12,r6]:\ | 0000b160 46 6c 69 70 20 64 61 74 61 20 62 79 74 65 0d 2a |Flip data byte.*| 0000b170 4e 38 20 53 54 52 42 20 72 36 2c 5b 72 32 2c 72 |N8 STRB r6,[r2,r| 0000b180 37 5d 3a 42 47 54 20 64 32 5f 66 6c 69 70 3a 5c |7]:BGT d2_flip:\| 0000b190 20 46 6c 69 70 20 61 6c 6c 20 6c 6f 61 64 65 64 | Flip all loaded| 0000b1a0 20 62 79 74 65 73 0d 2a 58 48 2e 64 32 5f 63 6f | bytes.*XH.d2_co| 0000b1b0 70 79 20 4c 44 52 20 72 37 2c 5b 72 32 5d 2c 23 |py LDR r7,[r2],#| 0000b1c0 32 3a 4c 44 52 20 72 36 2c 5b 72 32 5d 2c 23 32 |2:LDR r6,[r2],#2| 0000b1d0 3a 4c 44 52 20 72 35 2c 5b 72 32 5d 2c 23 32 3a |:LDR r5,[r2],#2:| 0000b1e0 4c 44 52 20 72 34 2c 5b 72 32 5d 2c 23 32 0d 2a |LDR r4,[r2],#2.*| 0000b1f0 62 2a 20 4d 4f 56 20 72 31 31 2c 23 38 3a 5c 20 |b* MOV r11,#8:\ | 0000b200 38 78 32 3d 31 36 20 70 69 78 65 6c 73 20 69 6e |8x2=16 pixels in| 0000b210 20 33 32 20 62 69 74 73 0d 2a 6c 47 2e 64 32 5f | 32 bits.*lG.d2_| 0000b220 70 69 78 65 6c 73 20 4d 4f 56 20 72 38 2c 23 30 |pixels MOV r8,#0| 0000b230 3a 4d 4f 56 53 20 72 34 2c 72 34 2c 4c 53 52 23 |:MOVS r4,r4,LSR#| 0000b240 31 3a 41 44 43 20 72 38 2c 72 38 2c 72 38 3a 4d |1:ADC r8,r8,r8:M| 0000b250 4f 56 53 20 72 35 2c 72 35 2c 4c 53 52 23 31 0d |OVS r5,r5,LSR#1.| 0000b260 2a 76 4d 20 41 44 43 20 72 38 2c 72 38 2c 72 38 |*vM ADC r8,r8,r8| 0000b270 3a 4d 4f 56 53 20 72 36 2c 72 36 2c 4c 53 52 23 |:MOVS r6,r6,LSR#| 0000b280 31 3a 41 44 43 20 72 38 2c 72 38 2c 72 38 3a 4d |1:ADC r8,r8,r8:M| 0000b290 4f 56 53 20 72 37 2c 72 37 2c 4c 53 52 23 31 3a |OVS r7,r7,LSR#1:| 0000b2a0 41 44 43 20 72 38 2c 72 38 2c 72 38 0d 2a 80 4a |ADC r8,r8,r8.*.J| 0000b2b0 20 4d 4f 56 20 72 39 2c 23 30 3a 4d 4f 56 53 20 | MOV r9,#0:MOVS | 0000b2c0 72 34 2c 72 34 2c 4c 53 52 23 31 3a 41 44 43 20 |r4,r4,LSR#1:ADC | 0000b2d0 72 39 2c 72 39 2c 72 39 3a 4d 4f 56 53 20 72 35 |r9,r9,r9:MOVS r5| 0000b2e0 2c 72 35 2c 4c 53 52 23 31 3a 41 44 43 20 72 39 |,r5,LSR#1:ADC r9| 0000b2f0 2c 72 39 2c 72 39 0d 2a 8a 40 20 4d 4f 56 53 20 |,r9,r9.*.@ MOVS | 0000b300 72 36 2c 72 36 2c 4c 53 52 23 31 3a 41 44 43 20 |r6,r6,LSR#1:ADC | 0000b310 72 39 2c 72 39 2c 72 39 3a 4d 4f 56 53 20 72 37 |r9,r9,r9:MOVS r7| 0000b320 2c 72 37 2c 4c 53 52 23 31 3a 41 44 43 20 72 39 |,r7,LSR#1:ADC r9| 0000b330 2c 72 39 2c 72 39 0d 2a 94 2c 20 84 52 20 72 38 |,r9,r9.*., .R r8| 0000b340 2c 72 38 2c 72 39 2c 4c 53 4c 23 34 3a 5c 20 4d |,r8,r9,LSL#4:\ M| 0000b350 61 6b 65 20 70 61 69 72 20 6f 66 20 70 69 78 65 |ake pair of pixe| 0000b360 6c 73 0d 2a 9e 4b 20 53 54 52 42 20 72 38 2c 5b |ls.*.K STRB r8,[| 0000b370 72 31 5d 2c 23 31 3a 53 55 42 53 20 72 31 31 2c |r1],#1:SUBS r11,| 0000b380 72 31 31 2c 23 31 3a 42 4e 45 20 64 32 5f 70 69 |r11,#1:BNE d2_pi| 0000b390 78 65 6c 73 3a 5c 20 44 69 73 70 6c 61 79 2c 20 |xels:\ Display, | 0000b3a0 6e 65 78 74 20 32 20 70 69 78 65 6c 73 0d 2a a8 |next 2 pixels.*.| 0000b3b0 38 20 53 55 42 53 20 72 33 2c 72 33 2c 23 38 3a |8 SUBS r3,r3,#8:| 0000b3c0 42 4c 45 20 64 32 5f 65 78 69 74 3a 5c 20 43 68 |BLE d2_exit:\ Ch| 0000b3d0 65 63 6b 20 69 66 20 61 6c 6c 20 62 79 74 65 73 |eck if all bytes| 0000b3e0 20 64 6f 6e 65 0d 2a b2 3f 20 53 55 42 53 20 72 | done.*.? SUBS r| 0000b3f0 31 30 2c 72 31 30 2c 23 38 3a 42 47 54 20 64 32 |10,r10,#8:BGT d2| 0000b400 5f 63 6f 70 79 3a 42 20 64 32 5f 63 68 75 6e 6b |_copy:B d2_chunk| 0000b410 3a 5c 20 4e 65 78 74 20 64 61 74 61 20 62 79 74 |:\ Next data byt| 0000b420 65 28 73 29 0d 2a bc 25 2e 64 32 5f 65 78 69 74 |e(s).*.%.d2_exit| 0000b430 20 4c 44 4d 46 44 20 72 31 33 21 2c 7b 70 63 7d | LDMFD r13!,{pc}| 0000b440 3a 5c 20 52 65 74 75 72 6e 0d 2a c6 05 20 0d 2a |:\ Return.*.. .*| 0000b450 d0 4e 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b |.N;;;;;;;;;;;;;;| 0000b460 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b |;;;;;;;;;;;;;;;;| * 0000b490 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 0d 2a da 05 |;;;;;;;;;;;;.*..| 0000b4a0 20 0d 2a e4 2c 2e 75 6e 70 61 63 6b 5f 4d 41 43 | .*.,.unpack_MAC| 0000b4b0 20 5c 20 4d 61 63 49 6e 74 6f 73 68 20 4d 61 63 | \ MacIntosh Mac| 0000b4c0 50 61 69 6e 74 20 70 69 63 74 75 72 65 0d 2a ee |Paint picture.*.| 0000b4d0 21 20 53 54 4d 46 44 20 72 31 33 21 2c 7b 72 31 |! STMFD r13!,{r1| 0000b4e0 34 7d 3a 5c 20 53 61 76 65 20 6c 69 6e 6b 0d 2a |4}:\ Save link.*| 0000b4f0 f8 4b 20 4c 44 52 20 72 31 2c 73 63 72 65 65 6e |.K LDR r1,screen| 0000b500 3a 4d 4f 56 20 72 35 2c 23 26 43 41 30 30 3a 41 |:MOV r5,#&CA00:A| 0000b510 44 44 20 72 35 2c 72 35 2c 23 26 38 30 3a 5c 20 |DD r5,r5,#&80:\ | 0000b520 44 65 73 74 69 6e 61 74 69 6f 6e 2c 20 74 6f 74 |Destination, tot| 0000b530 61 6c 20 6c 65 6e 67 74 68 0d 2b 02 36 20 4c 44 |al length.+.6 LD| 0000b540 52 20 72 33 2c 61 5f 66 6c 69 70 6d 61 70 3a 5c |R r3,a_flipmap:\| 0000b550 20 49 6e 76 65 72 74 65 64 20 61 6e 64 20 72 65 | Inverted and re| 0000b560 76 65 72 73 65 64 20 62 69 74 73 20 6d 61 70 0d |versed bits map.| 0000b570 2b 0c 23 20 42 4c 20 64 34 5f 63 68 75 6e 6b 3a |+.# BL d4_chunk:| 0000b580 5c 20 4c 6f 61 64 20 66 69 72 73 74 20 63 68 75 |\ Load first chu| 0000b590 6e 6b 0d 2b 16 33 2e 64 34 5f 62 6c 6f 63 6b 20 |nk.+.3.d4_block | 0000b5a0 4c 44 52 42 20 72 30 2c 5b 72 32 5d 2c 23 31 3a |LDRB r0,[r2],#1:| 0000b5b0 5c 20 47 65 74 20 62 6c 6f 63 6b 20 63 6f 64 65 |\ Get block code| 0000b5c0 20 62 79 74 65 0d 2b 20 39 20 53 55 42 53 20 72 | byte.+ 9 SUBS r| 0000b5d0 31 30 2c 72 31 30 2c 23 31 3a 42 4c 4c 45 20 64 |10,r10,#1:BLLE d| 0000b5e0 34 5f 63 68 75 6e 6b 3a 5c 20 4e 65 78 74 20 63 |4_chunk:\ Next c| 0000b5f0 68 75 6e 6b 20 69 66 20 6e 65 65 64 65 64 0d 2b |hunk if needed.+| 0000b600 2a 37 20 54 53 54 20 72 30 2c 23 31 32 38 3a 42 |*7 TST r0,#128:B| 0000b610 4e 45 20 64 34 5f 72 65 70 3a 4d 4f 56 20 72 34 |NE d4_rep:MOV r4| 0000b620 2c 72 30 3a 5c 20 52 65 70 65 61 74 65 64 20 64 |,r0:\ Repeated d| 0000b630 61 74 61 20 3f 0d 2b 34 2f 2e 64 34 5f 73 63 6f |ata ?.+4/.d4_sco| 0000b640 70 79 20 4c 44 52 42 20 72 30 2c 5b 72 32 5d 2c |py LDRB r0,[r2],| 0000b650 23 31 3a 5c 20 47 65 74 20 73 69 6e 67 6c 65 20 |#1:\ Get single | 0000b660 62 79 74 65 0d 2b 3e 39 20 53 55 42 53 20 72 31 |byte.+>9 SUBS r1| 0000b670 30 2c 72 31 30 2c 23 31 3a 42 4c 4c 45 20 64 34 |0,r10,#1:BLLE d4| 0000b680 5f 63 68 75 6e 6b 3a 5c 20 4e 65 78 74 20 63 68 |_chunk:\ Next ch| 0000b690 75 6e 6b 20 69 66 20 6e 65 65 64 65 64 0d 2b 48 |unk if needed.+H| 0000b6a0 32 20 4c 44 52 42 20 72 30 2c 5b 72 33 2c 72 30 |2 LDRB r0,[r3,r0| 0000b6b0 5d 3a 42 4c 20 64 34 5f 62 75 66 3a 5c 20 42 75 |]:BL d4_buf:\ Bu| 0000b6c0 66 66 65 72 20 73 63 72 65 65 6e 62 79 74 65 0d |ffer screenbyte.| 0000b6d0 2b 52 44 20 53 55 42 53 20 72 34 2c 72 34 2c 23 |+RD SUBS r4,r4,#| 0000b6e0 31 3a 42 50 4c 20 64 34 5f 73 63 6f 70 79 3a 42 |1:BPL d4_scopy:B| 0000b6f0 20 64 34 5f 62 6c 6f 63 6b 3a 5c 20 46 69 6e 69 | d4_block:\ Fini| 0000b700 73 68 20 73 65 72 69 65 73 20 61 6e 64 20 67 6f |sh series and go| 0000b710 20 6f 6e 0d 2b 5c 3b 2e 64 34 5f 72 65 70 20 52 | on.+\;.d4_rep R| 0000b720 53 42 20 72 34 2c 72 30 2c 23 26 31 30 30 3a 5c |SB r4,r0,#&100:\| 0000b730 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 | Number of repea| 0000b740 74 65 64 20 64 61 74 61 20 62 79 74 65 73 0d 2b |ted data bytes.+| 0000b750 66 29 20 4c 44 52 42 20 72 30 2c 5b 72 32 5d 2c |f) LDRB r0,[r2],| 0000b760 23 31 3a 5c 20 47 65 74 20 62 79 74 65 20 74 6f |#1:\ Get byte to| 0000b770 20 72 65 70 65 61 74 0d 2b 70 39 20 53 55 42 53 | repeat.+p9 SUBS| 0000b780 20 72 31 30 2c 72 31 30 2c 23 31 3a 42 4c 4c 45 | r10,r10,#1:BLLE| 0000b790 20 64 34 5f 63 68 75 6e 6b 3a 5c 20 4e 65 78 74 | d4_chunk:\ Next| 0000b7a0 20 63 68 75 6e 6b 20 69 66 20 6e 65 65 64 65 64 | chunk if needed| 0000b7b0 0d 2b 7a 1b 20 4c 44 52 42 20 72 30 2c 5b 72 33 |.+z. LDRB r0,[r3| 0000b7c0 2c 72 30 5d 3a 5c 20 46 6c 69 70 0d 2b 84 2b 2e |,r0]:\ Flip.+.+.| 0000b7d0 64 34 5f 72 63 6f 70 79 20 42 4c 20 64 34 5f 62 |d4_rcopy BL d4_b| 0000b7e0 75 66 3a 5c 20 42 75 66 66 65 72 20 73 63 72 65 |uf:\ Buffer scre| 0000b7f0 65 6e 62 79 74 65 0d 2b 8e 44 20 53 55 42 53 20 |enbyte.+.D SUBS | 0000b800 72 34 2c 72 34 2c 23 31 3a 42 50 4c 20 64 34 5f |r4,r4,#1:BPL d4_| 0000b810 72 63 6f 70 79 3a 42 20 64 34 5f 62 6c 6f 63 6b |rcopy:B d4_block| 0000b820 3a 5c 20 46 69 6e 69 73 68 20 72 65 70 65 61 74 |:\ Finish repeat| 0000b830 20 61 6e 64 20 67 6f 20 6f 6e 0d 2b 98 48 2e 64 | and go on.+.H.d| 0000b840 34 5f 62 75 66 20 53 54 52 42 20 72 30 2c 5b 72 |4_buf STRB r0,[r| 0000b850 31 5d 2c 23 31 3a 53 55 42 53 20 72 35 2c 72 35 |1],#1:SUBS r5,r5| 0000b860 2c 23 31 3a 4d 4f 56 4e 45 20 70 63 2c 72 31 34 |,#1:MOVNE pc,r14| 0000b870 3a 5c 20 4e 65 78 74 20 73 63 72 65 65 6e 62 79 |:\ Next screenby| 0000b880 74 65 0d 2b a2 25 2e 64 34 5f 65 78 69 74 20 4c |te.+.%.d4_exit L| 0000b890 44 4d 46 44 20 72 31 33 21 2c 7b 70 63 7d 3a 5c |DMFD r13!,{pc}:\| 0000b8a0 20 52 65 74 75 72 6e 0d 2b ac 29 2e 64 34 5f 63 | Return.+.).d4_c| 0000b8b0 68 75 6e 6b 20 4d 4f 56 20 72 31 32 2c 72 31 34 |hunk MOV r12,r14| 0000b8c0 3a 5c 20 52 65 6d 65 6d 62 65 72 20 6c 69 6e 6b |:\ Remember link| 0000b8d0 0d 2b b6 42 20 42 4c 20 67 65 74 5f 73 63 68 75 |.+.B BL get_schu| 0000b8e0 6e 6b 3a 42 45 51 20 64 34 5f 65 78 69 74 3a 4c |nk:BEQ d4_exit:L| 0000b8f0 44 52 20 72 32 2c 63 68 75 6e 6b 3a 4c 44 52 20 |DR r2,chunk:LDR | 0000b900 72 31 30 2c 6c 6f 61 64 65 64 3a 5c 20 43 68 75 |r10,loaded:\ Chu| 0000b910 6e 6b 0d 2b c0 18 20 4d 4f 56 20 70 63 2c 72 31 |nk.+.. MOV pc,r1| 0000b920 32 3a 5c 20 52 65 74 75 72 6e 0d 2b ca 05 20 0d |2:\ Return.+.. .| 0000b930 2b d4 4e 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b |+.N;;;;;;;;;;;;;| 0000b940 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b |;;;;;;;;;;;;;;;;| * 0000b970 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 0d 2b de |;;;;;;;;;;;;;.+.| 0000b980 05 20 0d 2b e8 22 2e 75 6e 70 61 63 6b 5f 49 46 |. .+.".unpack_IF| 0000b990 46 20 5c 20 41 6d 69 67 61 20 e7 46 20 70 69 63 |F \ Amiga .F pic| 0000b9a0 74 75 72 65 0d 2b f2 21 20 53 54 4d 46 44 20 72 |ture.+.! STMFD r| 0000b9b0 31 33 21 2c 7b 72 31 34 7d 3a 5c 20 53 61 76 65 |13!,{r14}:\ Save| 0000b9c0 20 6c 69 6e 6b 0d 2b fc 38 20 4c 44 52 20 72 30 | link.+.8 LDR r0| 0000b9d0 2c 68 65 69 67 68 74 3a 53 54 52 20 72 30 2c 64 |,height:STR r0,d| 0000b9e0 33 5f 74 72 6f 77 3a 5c 20 4e 75 6d 62 65 72 20 |3_trow:\ Number | 0000b9f0 6f 66 20 70 69 78 65 6c 20 72 6f 77 73 0d 2c 06 |of pixel rows.,.| 0000ba00 44 20 4c 44 52 20 72 31 31 2c 77 69 64 74 68 3a |D LDR r11,width:| 0000ba10 4d 4f 56 20 72 31 31 2c 72 31 31 2c 4c 53 52 23 |MOV r11,r11,LSR#| 0000ba20 33 3a 5c 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 |3:\ Number of by| 0000ba30 74 65 73 20 70 65 72 20 70 69 78 65 6c 20 72 6f |tes per pixel ro| 0000ba40 77 0d 2c 10 21 20 4c 44 52 20 72 31 30 2c 73 63 |w.,.! LDR r10,sc| 0000ba50 72 65 65 6e 3a 5c 20 44 65 73 74 69 6e 61 74 69 |reen:\ Destinati| 0000ba60 6f 6e 0d 2c 1a 23 20 42 4c 20 64 33 5f 63 68 75 |on.,.# BL d3_chu| 0000ba70 6e 6b 3a 5c 20 4c 6f 61 64 20 66 69 72 73 74 20 |nk:\ Load first | 0000ba80 63 68 75 6e 6b 0d 2c 24 49 20 4c 44 52 20 72 30 |chunk.,$I LDR r0| 0000ba90 2c 63 6f 6d 70 72 3a 54 45 51 20 72 30 2c 23 30 |,compr:TEQ r0,#0| 0000baa0 3a 4d 4f 56 4e 45 20 72 38 2c 23 31 3c 3c 32 33 |:MOVNE r8,#1<<23| 0000bab0 3a ec 51 20 72 38 2c 23 30 3a 5c 20 49 6e 69 74 |:.Q r8,#0:\ Init| 0000bac0 20 64 65 63 6f 6d 70 72 65 73 73 69 6f 6e 0d 2c | decompression.,| 0000bad0 2e 45 2e 64 33 5f 72 6f 77 20 4c 44 52 20 72 36 |.E.d3_row LDR r6| 0000bae0 2c 70 69 78 62 69 74 73 3a 4d 4f 56 20 72 37 2c |,pixbits:MOV r7,| 0000baf0 23 31 3a 5c 20 4e 75 6d 62 65 72 20 6f 66 20 62 |#1:\ Number of b| 0000bb00 69 74 20 70 6c 61 6e 65 73 2c 20 62 69 74 20 6d |it planes, bit m| 0000bb10 61 73 6b 0d 2c 38 3f 20 4d 4f 56 20 72 30 2c 72 |ask.,8? MOV r0,r| 0000bb20 31 31 2c 4c 53 4c 23 33 3a 4c 44 52 20 72 31 2c |11,LSL#3:LDR r1,| 0000bb30 61 5f 72 6f 77 64 61 74 3a 4d 4f 56 20 72 32 2c |a_rowdat:MOV r2,| 0000bb40 23 30 3a 5c 20 50 72 65 70 61 72 65 20 63 6c 65 |#0:\ Prepare cle| 0000bb50 61 72 0d 2c 42 4d 2e 64 33 5f 63 6c 65 61 72 20 |ar.,BM.d3_clear | 0000bb60 53 54 52 42 20 72 32 2c 5b 72 31 5d 2c 23 31 3a |STRB r2,[r1],#1:| 0000bb70 53 55 42 53 20 72 30 2c 72 30 2c 23 31 3a 42 4e |SUBS r0,r0,#1:BN| 0000bb80 45 20 64 33 5f 63 6c 65 61 72 3a 5c 20 43 6c 65 |E d3_clear:\ Cle| 0000bb90 61 72 20 70 69 78 65 6c 20 62 75 66 66 65 72 0d |ar pixel buffer.| 0000bba0 2c 4c 4b 2e 64 33 5f 70 6c 61 6e 65 20 4d 4f 56 |,LK.d3_plane MOV| 0000bbb0 20 72 35 2c 72 31 31 3a 4c 44 52 20 72 34 2c 61 | r5,r11:LDR r4,a| 0000bbc0 5f 72 6f 77 64 61 74 3a 5c 20 46 69 6c 6c 20 69 |_rowdat:\ Fill i| 0000bbd0 6e 20 63 6f 6c 6f 75 72 20 62 69 74 73 20 66 6f |n colour bits fo| 0000bbe0 72 20 62 69 74 70 6c 61 6e 65 0d 2c 56 30 2e 64 |r bitplane.,V0.d| 0000bbf0 33 5f 62 79 74 65 20 42 4c 20 64 33 5f 64 61 74 |3_byte BL d3_dat| 0000bc00 61 62 79 74 65 3a 5c 20 47 65 74 20 6e 65 78 74 |abyte:\ Get next| 0000bc10 20 64 61 74 61 20 62 79 74 65 0d 2c 60 29 20 4d | data byte.,`) M| 0000bc20 4f 56 20 72 30 2c 72 30 2c 4c 53 4c 23 32 34 3a |OV r0,r0,LSL#24:| 0000bc30 4d 4f 56 20 72 33 2c 23 38 3a 5c 20 50 72 65 70 |MOV r3,#8:\ Prep| 0000bc40 61 72 65 0d 2c 6a 31 2e 64 33 5f 70 69 78 62 69 |are.,j1.d3_pixbi| 0000bc50 74 20 4d 4f 56 53 20 72 30 2c 72 30 2c 4c 53 4c |t MOVS r0,r0,LSL| 0000bc60 23 31 3a 5c 20 50 69 78 65 6c 2d 62 69 74 20 73 |#1:\ Pixel-bit s| 0000bc70 65 74 20 3f 0d 2c 74 49 20 4c 44 52 43 53 42 20 |et ?.,tI LDRCSB | 0000bc80 72 32 2c 5b 72 34 5d 3a 84 52 43 53 20 72 32 2c |r2,[r4]:.RCS r2,| 0000bc90 72 32 2c 72 37 3a 53 54 52 43 53 42 20 72 32 2c |r2,r7:STRCSB r2,| 0000bca0 5b 72 34 5d 2c 23 31 3a 5c 20 49 66 20 73 6f 2c |[r4],#1:\ If so,| 0000bcb0 20 73 68 69 66 74 20 62 69 74 20 69 6e 0d 2c 7e | shift bit in.,~| 0000bcc0 35 20 41 44 44 43 43 20 72 34 2c 72 34 2c 23 31 |5 ADDCC r4,r4,#1| 0000bcd0 3a 5c 20 49 66 20 6e 6f 74 20 73 6f 2c 20 6e 65 |:\ If not so, ne| 0000bce0 78 74 20 70 69 78 65 6c 20 64 61 74 61 20 62 79 |xt pixel data by| 0000bcf0 74 65 0d 2c 88 37 20 53 55 42 53 20 72 33 2c 72 |te.,.7 SUBS r3,r| 0000bd00 33 2c 23 31 3a 42 4e 45 20 64 33 5f 70 69 78 62 |3,#1:BNE d3_pixb| 0000bd10 69 74 3a 5c 20 4e 65 78 74 20 6f 66 20 65 69 67 |it:\ Next of eig| 0000bd20 68 74 20 70 69 78 65 6c 73 0d 2c 92 2f 20 53 55 |ht pixels.,./ SU| 0000bd30 42 53 20 72 35 2c 72 35 2c 23 31 3a 42 4e 45 20 |BS r5,r5,#1:BNE | 0000bd40 64 33 5f 62 79 74 65 3a 5c 20 4e 65 78 74 20 64 |d3_byte:\ Next d| 0000bd50 61 74 61 20 62 79 74 65 0d 2c 9c 3f 20 4d 4f 56 |ata byte.,.? MOV| 0000bd60 20 72 37 2c 72 37 2c 4c 53 4c 23 31 3a 53 55 42 | r7,r7,LSL#1:SUB| 0000bd70 53 20 72 36 2c 72 36 2c 23 31 3a 42 4e 45 20 64 |S r6,r6,#1:BNE d| 0000bd80 33 5f 70 6c 61 6e 65 3a 5c 20 4e 65 78 74 20 62 |3_plane:\ Next b| 0000bd90 69 74 70 6c 61 6e 65 0d 2c a6 37 20 4c 44 52 20 |itplane.,.7 LDR | 0000bda0 72 31 2c 73 63 74 79 70 65 3a 54 53 54 20 72 31 |r1,sctype:TST r1| 0000bdb0 2c 23 33 3a 42 4e 45 20 64 33 5f 68 61 6d 3a 5c |,#3:BNE d3_ham:\| 0000bdc0 20 48 41 4d 20 70 69 78 65 6c 20 72 6f 77 0d 2c | HAM pixel row.,| 0000bdd0 b0 3b 20 4d 4f 56 20 72 30 2c 72 31 30 3a 4d 4f |.; MOV r0,r10:MO| 0000bde0 56 20 72 31 2c 72 31 31 2c 4c 53 4c 23 33 3a 5c |V r1,r11,LSL#3:\| 0000bdf0 20 53 65 74 20 75 70 20 64 61 74 61 20 66 6f 72 | Set up data for| 0000be00 20 72 6f 77 2d 70 6c 6f 74 0d 2c ba 28 20 42 4c | row-plot.,.( BL| 0000be10 20 70 6c 6f 74 5f 72 6f 77 3a 5c 20 50 6c 6f 74 | plot_row:\ Plot| 0000be20 20 6e 6f 72 6d 61 6c 20 70 69 78 65 6c 20 72 6f | normal pixel ro| 0000be30 77 0d 2c c4 41 20 4d 4f 56 20 72 31 30 2c 72 30 |w.,.A MOV r10,r0| 0000be40 3a 3a 42 20 64 33 5f 6e 65 78 74 72 6f 77 3a 5c |::B d3_nextrow:\| 0000be50 20 53 65 74 20 6e 65 78 74 20 72 6f 77 20 61 64 | Set next row ad| 0000be60 64 72 65 73 73 2c 20 64 6f 20 6e 65 78 74 20 72 |dress, do next r| 0000be70 6f 77 0d 2c ce 48 2e 64 33 5f 68 61 6d 20 4d 4f |ow.,.H.d3_ham MO| 0000be80 56 20 72 32 2c 23 30 3a 41 44 52 20 72 37 2c 68 |V r2,#0:ADR r7,h| 0000be90 61 6d 63 6f 6c 73 3a 5c 20 43 75 72 72 65 6e 74 |amcols:\ Current| 0000bea0 20 52 47 42 20 61 6e 64 20 31 36 2d 63 6f 6c 20 | RGB and 16-col | 0000beb0 52 47 42 20 76 61 6c 75 65 73 0d 2c d8 4d 20 4d |RGB values.,.M M| 0000bec0 4f 56 20 72 35 2c 72 31 31 2c 4c 53 4c 23 33 3a |OV r5,r11,LSL#3:| 0000bed0 4c 44 52 20 72 33 2c 61 5f 72 6f 77 64 61 74 3a |LDR r3,a_rowdat:| 0000bee0 5c 20 50 69 78 65 6c 73 20 61 6e 64 20 73 74 61 |\ Pixels and sta| 0000bef0 72 74 20 6f 66 20 70 69 78 65 6c 20 72 6f 77 20 |rt of pixel row | 0000bf00 64 61 74 61 20 62 66 0d 2c e2 2e 20 4d 4f 56 20 |data bf.,.. MOV | 0000bf10 72 36 2c 72 31 30 3a 5c 20 52 65 6d 65 6d 62 65 |r6,r10:\ Remembe| 0000bf20 72 20 63 75 72 72 65 6e 74 20 73 63 72 65 65 6e |r current screen| 0000bf30 20 61 64 64 72 0d 2c ec 2e 2e 64 33 5f 64 6f 68 | addr.,...d3_doh| 0000bf40 61 6d 20 4c 44 52 42 20 72 30 2c 5b 72 33 5d 2c |am LDRB r0,[r3],| 0000bf50 23 31 3a 5c 20 47 65 74 20 70 69 78 65 6c 20 64 |#1:\ Get pixel d| 0000bf60 61 74 61 0d 2c f6 4a 20 4d 4f 56 20 72 31 2c 72 |ata.,.J MOV r1,r| 0000bf70 30 2c 4c 53 52 23 34 3a 80 20 72 30 2c 72 30 2c |0,LSR#4:. r0,r0,| 0000bf80 23 31 35 3a 54 45 51 20 72 31 2c 23 30 3a 5c 20 |#15:TEQ r1,#0:\ | 0000bf90 53 70 6c 69 74 20 61 6e 64 20 74 65 73 74 20 75 |Split and test u| 0000bfa0 70 70 65 72 20 74 77 6f 20 62 69 74 73 0d 2d 00 |pper two bits.-.| 0000bfb0 38 20 4c 44 52 45 51 20 72 32 2c 5b 72 37 2c 72 |8 LDREQ r2,[r7,r| 0000bfc0 30 2c 4c 53 4c 23 32 5d 3a 42 45 51 20 64 33 5f |0,LSL#2]:BEQ d3_| 0000bfd0 68 61 6d 6f 6e 3a 5c 20 4e 65 77 20 52 47 42 20 |hamon:\ New RGB | 0000bfe0 76 61 6c 75 65 0d 2d 0a 44 20 43 4d 50 20 72 31 |value.-.D CMP r1| 0000bff0 2c 23 32 3a 4d 4f 56 4c 54 20 72 31 2c 23 30 3a |,#2:MOVLT r1,#0:| 0000c000 ec 51 20 72 31 2c 23 38 3a 4d 4f 56 47 54 20 72 |.Q r1,#8:MOVGT r| 0000c010 31 2c 23 34 3a 5c 20 52 2c 20 47 20 6f 72 20 42 |1,#4:\ R, G or B| 0000c020 20 63 68 61 6e 67 65 20 3f 0d 2d 14 48 20 4d 4f | change ?.-.H MO| 0000c030 56 20 72 34 2c 23 31 35 3a 42 49 43 20 72 32 2c |V r4,#15:BIC r2,| 0000c040 72 32 2c 72 34 2c 4c 53 4c 20 72 31 3a 84 52 20 |r2,r4,LSL r1:.R | 0000c050 72 32 2c 72 32 2c 72 30 2c 4c 53 4c 20 72 31 3a |r2,r2,r0,LSL r1:| 0000c060 5c 20 4e 65 77 20 52 20 6f 72 20 47 20 6f 72 20 |\ New R or G or | 0000c070 42 0d 2d 1e 4b 2e 64 33 5f 68 61 6d 6f 6e 20 4c |B.-.K.d3_hamon L| 0000c080 44 52 20 72 30 2c 61 5f 72 67 62 32 32 6d 61 70 |DR r0,a_rgb22map| 0000c090 3a 4c 44 52 20 72 30 2c 5b 72 30 2c 72 32 2c 4c |:LDR r0,[r0,r2,L| 0000c0a0 53 4c 23 31 5d 3a 5c 20 47 65 74 20 6c 65 66 74 |SL#1]:\ Get left| 0000c0b0 2f 72 69 67 68 74 20 70 69 78 65 6c 0d 2d 28 29 |/right pixel.-()| 0000c0c0 20 4c 44 52 20 72 31 2c 64 33 5f 74 72 6f 77 3a | LDR r1,d3_trow:| 0000c0d0 5c 20 52 65 74 72 69 65 76 65 20 72 6f 77 20 6e |\ Retrieve row n| 0000c0e0 75 6d 62 65 72 0d 2d 32 48 20 82 20 72 34 2c 72 |umber.-2H . r4,r| 0000c0f0 31 30 2c 72 31 2c 4c 53 4c 23 31 3a 54 53 54 20 |10,r1,LSL#1:TST | 0000c100 72 34 2c 23 25 31 30 3a 5c 20 45 76 65 72 79 20 |r4,#%10:\ Every | 0000c110 6f 74 68 65 72 20 70 61 69 72 2c 20 73 77 69 74 |other pair, swit| 0000c120 63 68 65 64 20 70 65 72 20 6c 69 6e 65 0d 2d 3c |ched per line.-<| 0000c130 44 20 ec 51 20 72 30 2c 72 30 2c 4c 53 4c 23 38 |D .Q r0,r0,LSL#8| 0000c140 3a 84 52 45 51 20 72 30 2c 72 30 2c 72 30 2c 4c |:.REQ r0,r0,r0,L| 0000c150 53 52 23 31 36 3a 5c 20 53 77 61 70 20 70 69 78 |SR#16:\ Swap pix| 0000c160 65 6c 73 20 69 6e 20 70 69 78 65 6c 20 70 61 69 |els in pixel pai| 0000c170 72 0d 2d 46 47 20 53 54 52 42 20 72 30 2c 5b 72 |r.-FG STRB r0,[r| 0000c180 31 30 5d 2c 23 31 3a 4d 4f 56 20 72 30 2c 72 30 |10],#1:MOV r0,r0| 0000c190 2c 4c 53 52 23 38 3a 53 54 52 42 20 72 30 2c 5b |,LSR#8:STRB r0,[| 0000c1a0 72 31 30 5d 2c 23 31 3a 5c 20 44 69 73 70 6c 61 |r10],#1:\ Displa| 0000c1b0 79 20 70 69 78 65 6c 73 0d 2d 50 2f 20 53 55 42 |y pixels.-P/ SUB| 0000c1c0 53 20 72 35 2c 72 35 2c 23 31 3a 42 4e 45 20 64 |S r5,r5,#1:BNE d| 0000c1d0 33 5f 64 6f 68 61 6d 3a 5c 20 4e 65 78 74 20 70 |3_doham:\ Next p| 0000c1e0 69 78 65 6c 28 73 29 0d 2d 5a 3d 20 4c 44 52 20 |ixel(s).-Z= LDR | 0000c1f0 72 30 2c 72 6f 77 6c 65 6e 3a 41 44 44 20 72 31 |r0,rowlen:ADD r1| 0000c200 30 2c 72 36 2c 72 30 3a 5c 20 41 64 64 72 65 73 |0,r6,r0:\ Addres| 0000c210 73 20 6f 66 20 6e 65 78 74 20 73 63 72 65 65 6e |s of next screen| 0000c220 20 72 6f 77 0d 2d 64 4d 2e 64 33 5f 6e 65 78 74 | row.-dM.d3_next| 0000c230 72 6f 77 20 4c 44 52 20 72 30 2c 64 33 5f 74 72 |row LDR r0,d3_tr| 0000c240 6f 77 3a 53 55 42 53 20 72 30 2c 72 30 2c 23 31 |ow:SUBS r0,r0,#1| 0000c250 3a 53 54 52 20 72 30 2c 64 33 5f 74 72 6f 77 3a |:STR r0,d3_trow:| 0000c260 42 47 54 20 64 33 5f 72 6f 77 3a 5c 20 4e 65 78 |BGT d3_row:\ Nex| 0000c270 74 0d 2d 6e 25 2e 64 33 5f 65 78 69 74 20 4c 44 |t.-n%.d3_exit LD| 0000c280 4d 46 44 20 72 31 33 21 2c 7b 70 63 7d 3a 5c 20 |MFD r13!,{pc}:\ | 0000c290 52 65 74 75 72 6e 0d 2d 78 05 5c 0d 2d 82 2a 2e |Return.-x.\.-.*.| 0000c2a0 64 33 5f 74 72 6f 77 20 45 51 55 44 20 30 3a 5c |d3_trow EQUD 0:\| 0000c2b0 20 54 65 6d 70 20 66 6f 72 20 72 6f 77 20 63 6f | Temp for row co| 0000c2c0 75 6e 74 65 72 0d 2d 8c 28 2e 64 33 5f 63 68 75 |unter.-.(.d3_chu| 0000c2d0 6e 6b 20 4d 4f 56 20 72 31 2c 72 31 34 3a 5c 20 |nk MOV r1,r14:\ | 0000c2e0 52 65 6d 65 6d 62 65 72 20 6c 69 6e 6b 0d 2d 96 |Remember link.-.| 0000c2f0 42 20 42 4c 20 67 65 74 5f 73 63 68 75 6e 6b 3a |B BL get_schunk:| 0000c300 42 45 51 20 64 33 5f 65 78 69 74 3a 4c 44 52 20 |BEQ d3_exit:LDR | 0000c310 72 39 2c 63 68 75 6e 6b 3a 4c 44 52 20 72 31 32 |r9,chunk:LDR r12| 0000c320 2c 6c 6f 61 64 65 64 3a 5c 20 43 68 75 6e 6b 0d |,loaded:\ Chunk.| 0000c330 2d a0 17 20 4d 4f 56 20 70 63 2c 72 31 3a 5c 20 |-.. MOV pc,r1:\ | 0000c340 52 65 74 75 72 6e 0d 2d aa 4b 2e 64 33 5f 64 61 |Return.-.K.d3_da| 0000c350 74 61 62 79 74 65 20 5c 20 52 65 74 75 72 6e 73 |tabyte \ Returns| 0000c360 20 6e 65 78 74 20 64 61 74 61 20 62 79 74 65 20 | next data byte | 0000c370 69 6e 20 72 30 20 28 64 65 63 6f 6d 70 72 65 73 |in r0 (decompres| 0000c380 73 65 73 20 69 66 20 6e 65 63 65 73 73 61 72 79 |ses if necessary| 0000c390 29 0d 2d b4 21 20 53 54 4d 46 44 20 72 31 33 21 |).-.! STMFD r13!| 0000c3a0 2c 7b 72 31 34 7d 3a 5c 20 53 61 76 65 20 6c 69 |,{r14}:\ Save li| 0000c3b0 6e 6b 0d 2d be 30 20 54 53 54 20 72 38 2c 23 31 |nk.-.0 TST r8,#1| 0000c3c0 3c 3c 32 33 3a 42 45 51 20 64 33 5f 6e 65 77 3a |<<23:BEQ d3_new:| 0000c3d0 5c 20 4e 6f 74 20 63 6f 6d 70 72 65 73 73 65 64 |\ Not compressed| 0000c3e0 20 3f 0d 2d c8 43 20 54 53 54 20 72 38 2c 23 26 | ?.-.C TST r8,#&| 0000c3f0 46 46 3a 42 45 51 20 64 33 5f 6e 65 77 63 6f 64 |FF:BEQ d3_newcod| 0000c400 65 3a 5c 20 4e 6f 20 6d 6f 72 65 20 69 6e 20 72 |e:\ No more in r| 0000c410 65 70 65 61 74 20 6f 72 20 73 65 72 69 65 73 2c |epeat or series,| 0000c420 20 6e 65 78 74 0d 2d d2 23 20 53 55 42 20 72 38 | next.-.# SUB r8| 0000c430 2c 72 38 2c 23 31 3a 5c 20 44 65 63 72 65 6d 65 |,r8,#1:\ Decreme| 0000c440 6e 74 20 63 6f 75 6e 74 0d 2d dc 48 20 54 53 54 |nt count.-.H TST| 0000c450 20 72 38 2c 23 31 3c 3c 32 32 3a ec 51 20 72 30 | r8,#1<<22:.Q r0| 0000c460 2c 72 38 2c 4c 53 52 23 32 34 3a 4c 44 4d 45 51 |,r8,LSR#24:LDMEQ| 0000c470 46 44 20 72 31 33 21 2c 7b 70 63 7d 5e 3a 5c 20 |FD r13!,{pc}^:\ | 0000c480 4e 65 78 74 20 62 79 74 65 20 72 65 70 65 61 74 |Next byte repeat| 0000c490 0d 2d e6 4c 2e 64 33 5f 6e 65 77 20 4c 44 52 42 |.-.L.d3_new LDRB| 0000c4a0 20 72 30 2c 5b 72 39 5d 2c 23 31 3a 53 55 42 53 | r0,[r9],#1:SUBS| 0000c4b0 20 72 31 32 2c 72 31 32 2c 23 31 3a 42 4c 4c 45 | r12,r12,#1:BLLE| 0000c4c0 20 64 33 5f 63 68 75 6e 6b 3a 5c 20 4e 65 78 74 | d3_chunk:\ Next| 0000c4d0 20 62 79 74 65 20 69 73 20 6e 65 77 0d 2d f0 1e | byte is new.-..| 0000c4e0 20 4c 44 4d 46 44 20 72 31 33 21 2c 7b 70 63 7d | LDMFD r13!,{pc}| 0000c4f0 5e 3a 5c 20 52 65 74 75 72 6e 0d 2d fa 49 2e 64 |^:\ Return.-.I.d| 0000c500 33 5f 6e 65 77 63 6f 64 65 20 4c 44 52 42 20 72 |3_newcode LDRB r| 0000c510 30 2c 5b 72 39 5d 2c 23 31 3a 53 55 42 53 20 72 |0,[r9],#1:SUBS r| 0000c520 31 32 2c 72 31 32 2c 23 31 3a 42 4c 4c 45 20 64 |12,r12,#1:BLLE d| 0000c530 33 5f 63 68 75 6e 6b 3a 5c 20 4e 65 78 74 20 63 |3_chunk:\ Next c| 0000c540 6f 64 65 0d 2e 04 46 20 43 4d 50 20 72 30 2c 23 |ode...F CMP r0,#| 0000c550 31 32 38 3a 42 45 51 20 64 33 5f 6e 65 77 63 6f |128:BEQ d3_newco| 0000c560 64 65 3a 42 47 54 20 64 33 5f 6e 65 77 72 65 70 |de:BGT d3_newrep| 0000c570 3a 5c 20 52 65 70 65 61 74 2c 20 73 65 72 69 65 |:\ Repeat, serie| 0000c580 73 20 6f 72 20 6e 6f 6e 65 0d 2e 0e 3c 20 84 52 |s or none...< .R| 0000c590 20 72 38 2c 72 38 2c 72 30 3a 84 52 20 72 38 2c | r8,r8,r0:.R r8,| 0000c5a0 72 38 2c 23 31 3c 3c 32 32 3a 5c 20 53 65 74 20 |r8,#1<<22:\ Set | 0000c5b0 63 6f 75 6e 74 20 61 6e 64 20 73 65 72 69 65 73 |count and series| 0000c5c0 20 74 79 70 65 0d 2e 18 46 20 4c 44 52 42 20 72 | type...F LDRB r| 0000c5d0 30 2c 5b 72 39 5d 2c 23 31 3a 53 55 42 53 20 72 |0,[r9],#1:SUBS r| 0000c5e0 31 32 2c 72 31 32 2c 23 31 3a 42 4c 4c 45 20 64 |12,r12,#1:BLLE d| 0000c5f0 33 5f 63 68 75 6e 6b 3a 5c 20 46 69 72 73 74 20 |3_chunk:\ First | 0000c600 73 65 72 69 65 73 20 62 79 74 65 0d 2e 22 1e 20 |series byte..". | 0000c610 4c 44 4d 46 44 20 72 31 33 21 2c 7b 70 63 7d 5e |LDMFD r13!,{pc}^| 0000c620 3a 5c 20 52 65 74 75 72 6e 0d 2e 2c 30 2e 64 33 |:\ Return..,0.d3| 0000c630 5f 6e 65 77 72 65 70 20 52 53 42 20 72 30 2c 72 |_newrep RSB r0,r| 0000c640 30 2c 23 26 31 30 30 3a 5c 20 44 65 74 65 72 6d |0,#&100:\ Determ| 0000c650 69 6e 65 20 63 6f 75 6e 74 0d 2e 36 3d 20 84 52 |ine count..6= .R| 0000c660 20 72 38 2c 72 38 2c 72 30 3a 42 49 43 20 72 38 | r8,r8,r0:BIC r8| 0000c670 2c 72 38 2c 23 31 3c 3c 32 32 3a 5c 20 53 65 74 |,r8,#1<<22:\ Set| 0000c680 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 70 65 61 | count and repea| 0000c690 74 20 74 79 70 65 0d 2e 40 41 20 4c 44 52 42 20 |t type..@A LDRB | 0000c6a0 72 30 2c 5b 72 39 5d 2c 23 31 3a 53 55 42 53 20 |r0,[r9],#1:SUBS | 0000c6b0 72 31 32 2c 72 31 32 2c 23 31 3a 42 4c 4c 45 20 |r12,r12,#1:BLLE | 0000c6c0 64 33 5f 63 68 75 6e 6b 3a 5c 20 46 69 72 73 74 |d3_chunk:\ First| 0000c6d0 20 72 65 70 65 61 74 0d 2e 4a 33 20 42 49 43 20 | repeat..J3 BIC | 0000c6e0 72 38 2c 72 38 2c 23 32 35 35 3c 3c 32 34 3a 84 |r8,r8,#255<<24:.| 0000c6f0 52 20 72 38 2c 72 38 2c 72 30 2c 4c 53 4c 23 32 |R r8,r8,r0,LSL#2| 0000c700 34 3a 5c 20 55 6e 70 61 63 6b 0d 2e 54 1e 20 4c |4:\ Unpack..T. L| 0000c710 44 4d 46 44 20 72 31 33 21 2c 7b 70 63 7d 5e 3a |DMFD r13!,{pc}^:| 0000c720 5c 20 52 65 74 75 72 6e 0d 2e 5e 3f 2e 68 61 6d |\ Return..^?.ham| 0000c730 63 6f 6c 73 20 45 51 55 53 20 c4 36 34 2c bd 30 |cols EQUS .64,.0| 0000c740 29 3a 41 4c 49 47 4e 3a 5c 20 48 41 4d 20 6d 6f |):ALIGN:\ HAM mo| 0000c750 64 65 20 31 36 2d 63 6f 6c 6f 75 72 20 52 47 42 |de 16-colour RGB| 0000c760 20 76 61 6c 75 65 73 0d 2e 68 05 20 0d 2e 72 4e | values..h. ..rN| 0000c770 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b |;;;;;;;;;;;;;;;;| * 0000c7b0 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 0d 2e 7c 05 20 0d |;;;;;;;;;;..|. .| 0000c7c0 2e 86 1d 2e 75 6e 70 61 63 6b 5f 47 49 46 20 5c |....unpack_GIF \| 0000c7d0 20 47 49 46 20 70 69 63 74 75 72 65 0d 2e 90 21 | GIF picture...!| 0000c7e0 20 53 54 4d 46 44 20 72 31 33 21 2c 7b 72 31 34 | STMFD r13!,{r14| 0000c7f0 7d 3a 5c 20 53 61 76 65 20 6c 69 6e 6b 0d 2e 9a |}:\ Save link...| 0000c800 2e 20 42 4c 20 64 65 63 6f 6d 70 72 65 73 73 5f |. BL decompress_| 0000c810 47 49 46 3a 5c 20 44 65 63 6f 6d 70 72 65 73 73 |GIF:\ Decompress| 0000c820 20 69 6d 61 67 65 20 64 61 74 61 0d 2e a4 20 20 | image data... | 0000c830 42 4c 20 62 75 69 6c 64 5f 47 49 46 3a 5c 20 42 |BL build_GIF:\ B| 0000c840 75 69 6c 64 20 73 70 72 69 74 65 0d 2e ae 1d 20 |uild sprite.... | 0000c850 4c 44 4d 46 44 20 72 31 33 21 2c 7b 70 63 7d 3a |LDMFD r13!,{pc}:| 0000c860 5c 20 52 65 74 75 72 6e 0d 2e b8 05 5c 0d 2e c2 |\ Return....\...| 0000c870 3a 2e 62 75 69 6c 64 5f 47 49 46 20 5c 20 42 75 |:.build_GIF \ Bu| 0000c880 69 6c 64 73 20 70 69 63 74 75 72 65 20 66 72 6f |ilds picture fro| 0000c890 6d 20 64 65 63 6f 6d 70 72 65 73 73 65 64 20 47 |m decompressed G| 0000c8a0 49 46 20 64 61 74 61 0d 2e cc 21 20 53 54 4d 46 |IF data...! STMF| 0000c8b0 44 20 72 31 33 21 2c 7b 72 31 34 7d 3a 5c 20 53 |D r13!,{r14}:\ S| 0000c8c0 61 76 65 20 6c 69 6e 6b 0d 2e d6 2c 20 4c 44 52 |ave link..., LDR| 0000c8d0 20 72 33 2c 73 63 72 65 65 6e 3a 5c 20 44 65 63 | r3,screen:\ Dec| 0000c8e0 6f 6d 70 72 65 73 73 65 64 20 64 61 74 61 20 73 |ompressed data s| 0000c8f0 74 61 72 74 0d 2e e0 3f 20 4c 44 52 20 72 31 32 |tart...? LDR r12| 0000c900 2c 68 65 69 67 68 74 3a 4c 44 52 20 72 31 31 2c |,height:LDR r11,| 0000c910 70 69 78 62 69 74 73 3a 5c 20 48 65 69 67 68 74 |pixbits:\ Height| 0000c920 20 61 6e 64 20 62 69 74 73 20 70 65 72 20 70 69 | and bits per pi| 0000c930 78 65 6c 0d 2e ea 49 20 4c 44 52 20 72 32 2c 77 |xel...I LDR r2,w| 0000c940 69 64 74 68 3a 4d 55 4c 20 72 32 2c 72 31 32 2c |idth:MUL r2,r12,| 0000c950 72 32 3a 4d 55 4c 20 72 32 2c 72 31 31 2c 72 32 |r2:MUL r2,r11,r2| 0000c960 3a 5c 20 42 69 74 73 20 6f 66 20 64 65 63 6f 6d |:\ Bits of decom| 0000c970 70 72 65 73 73 65 64 20 64 61 74 61 0d 2e f4 3f |pressed data...?| 0000c980 20 41 44 44 20 72 32 2c 72 32 2c 23 33 31 3a 4d | ADD r2,r2,#31:M| 0000c990 4f 56 20 72 32 2c 72 32 2c 4c 53 52 23 35 3a 5c |OV r2,r2,LSR#5:\| 0000c9a0 20 57 6f 72 64 73 20 6f 66 20 64 65 63 6f 6d 70 | Words of decomp| 0000c9b0 72 65 73 73 65 64 20 64 61 74 61 0d 2e fe 4a 20 |ressed data...J | 0000c9c0 4c 44 52 20 72 31 2c 68 69 6d 65 6d 3a 53 55 42 |LDR r1,himem:SUB| 0000c9d0 20 72 36 2c 72 31 2c 72 32 2c 4c 53 4c 23 32 3a | r6,r1,r2,LSL#2:| 0000c9e0 5c 20 54 65 6d 70 20 62 75 66 66 65 72 20 61 74 |\ Temp buffer at| 0000c9f0 20 65 6e 64 20 6f 66 20 73 70 72 69 74 65 20 62 | end of sprite b| 0000ca00 75 66 66 65 72 0d 2f 08 4b 2e 64 35 5f 74 6f 73 |uffer./.K.d5_tos| 0000ca10 63 20 53 55 42 53 20 72 32 2c 72 32 2c 23 31 3a |c SUBS r2,r2,#1:| 0000ca20 4c 44 52 20 72 30 2c 5b 72 33 2c 72 32 2c 4c 53 |LDR r0,[r3,r2,LS| 0000ca30 4c 23 32 5d 3a 53 54 52 20 72 30 2c 5b 72 36 2c |L#2]:STR r0,[r6,| 0000ca40 72 32 2c 4c 53 4c 23 32 5d 3a 5c 20 4d 6f 76 65 |r2,LSL#2]:\ Move| 0000ca50 0d 2f 12 1c 20 42 47 54 20 64 35 5f 74 6f 73 63 |./.. BGT d5_tosc| 0000ca60 3a 5c 20 4e 65 78 74 20 77 6f 72 64 0d 2f 1c 46 |:\ Next word./.F| 0000ca70 20 4d 56 4e 20 72 38 2c 23 30 3a 4d 4f 56 20 72 | MVN r8,#0:MOV r| 0000ca80 39 2c 72 38 2c 4c 53 4c 20 72 31 31 3a 82 20 72 |9,r8,LSL r11:. r| 0000ca90 38 2c 72 39 2c 72 38 3a 5c 20 43 61 6c 63 75 6c |8,r9,r8:\ Calcul| 0000caa0 61 74 65 20 70 69 78 65 6c 20 62 69 74 20 6d 61 |ate pixel bit ma| 0000cab0 73 6b 0d 2f 26 43 20 4d 4f 56 20 72 39 2c 23 30 |sk./&C MOV r9,#0| 0000cac0 3a 4d 4f 56 20 72 31 30 2c 23 30 3a 5c 20 42 69 |:MOV r10,#0:\ Bi| 0000cad0 74 73 20 6c 65 66 74 20 69 6e 20 70 69 78 65 6c |ts left in pixel| 0000cae0 20 62 75 66 66 65 72 2c 20 70 69 78 65 6c 20 62 | buffer, pixel b| 0000caf0 75 66 66 65 72 0d 2f 30 44 20 4c 44 52 20 72 34 |uffer./0D LDR r4| 0000cb00 2c 6c 61 63 65 64 3a 54 45 51 20 72 34 2c 23 30 |,laced:TEQ r4,#0| 0000cb10 3a 4d 4f 56 4e 45 20 72 34 2c 23 31 3a ec 51 20 |:MOVNE r4,#1:.Q | 0000cb20 72 34 2c 23 30 3a 5c 20 46 69 72 73 74 20 70 61 |r4,#0:\ First pa| 0000cb30 73 73 20 6e 75 6d 62 65 72 0d 2f 3a 49 20 4c 44 |ss number./:I LD| 0000cb40 52 20 72 31 32 2c 68 65 69 67 68 74 3a 4c 44 52 |R r12,height:LDR| 0000cb50 20 72 30 2c 73 63 72 65 65 6e 3a 5c 20 43 75 72 | r0,screen:\ Cur| 0000cb60 72 65 6e 74 20 72 6f 77 20 6e 75 6d 62 65 72 2c |rent row number,| 0000cb70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 73 74 61 | destination sta| 0000cb80 72 74 0d 2f 44 47 2e 64 35 5f 72 6f 77 20 4c 44 |rt./DG.d5_row LD| 0000cb90 52 20 72 33 2c 77 69 64 74 68 3a 4c 44 52 20 72 |R r3,width:LDR r| 0000cba0 37 2c 61 5f 72 6f 77 64 61 74 3a 5c 20 50 69 78 |7,a_rowdat:\ Pix| 0000cbb0 65 6c 73 20 70 65 72 20 72 6f 77 2c 20 70 69 78 |els per row, pix| 0000cbc0 65 6c 20 62 75 66 66 65 72 0d 2f 4e 47 2e 64 35 |el buffer./NG.d5| 0000cbd0 5f 70 69 78 73 20 43 4d 50 20 72 31 31 2c 72 39 |_pixs CMP r11,r9| 0000cbe0 3a 42 4c 45 20 64 35 5f 70 69 78 6c 3a 5c 20 45 |:BLE d5_pixl:\ E| 0000cbf0 6e 6f 75 67 68 20 62 69 74 73 20 6c 6f 61 64 65 |nough bits loade| 0000cc00 64 20 66 6f 72 20 6e 65 78 74 20 70 69 78 65 6c |d for next pixel| 0000cc10 0d 2f 58 42 20 4c 44 52 42 20 72 31 2c 5b 72 36 |./XB LDRB r1,[r6| 0000cc20 5d 2c 23 31 3a 84 52 20 72 31 30 2c 72 31 30 2c |],#1:.R r10,r10,| 0000cc30 72 31 2c 4c 53 4c 20 72 39 3a 5c 20 53 68 69 66 |r1,LSL r9:\ Shif| 0000cc40 74 20 69 6e 20 6e 65 78 74 20 66 65 77 20 62 69 |t in next few bi| 0000cc50 74 73 0d 2f 62 2d 20 41 44 44 20 72 39 2c 72 39 |ts./b- ADD r9,r9| 0000cc60 2c 23 38 3a 5c 20 45 69 67 68 74 20 6d 6f 72 65 |,#8:\ Eight more| 0000cc70 20 62 69 74 73 20 69 6e 20 62 75 66 66 65 72 0d | bits in buffer.| 0000cc80 2f 6c 3c 2e 64 35 5f 70 69 78 6c 20 80 20 72 31 |/l<.d5_pixl . r1| 0000cc90 2c 72 31 30 2c 72 38 3a 53 54 52 42 20 72 31 2c |,r10,r8:STRB r1,| 0000cca0 5b 72 37 5d 2c 23 31 3a 5c 20 53 74 6f 72 65 20 |[r7],#1:\ Store | 0000ccb0 70 69 78 65 6c 20 76 61 6c 75 65 0d 2f 76 3c 20 |pixel value./v< | 0000ccc0 4d 4f 56 20 72 31 30 2c 72 31 30 2c 4c 53 52 20 |MOV r10,r10,LSR | 0000ccd0 72 31 31 3a 53 55 42 20 72 39 2c 72 39 2c 72 31 |r11:SUB r9,r9,r1| 0000cce0 31 3a 5c 20 53 68 69 66 74 20 6f 75 74 20 70 69 |1:\ Shift out pi| 0000ccf0 78 65 6c 62 69 74 73 0d 2f 80 2b 20 53 55 42 53 |xelbits./.+ SUBS| 0000cd00 20 72 33 2c 72 33 2c 23 31 3a 42 4e 45 20 64 35 | r3,r3,#1:BNE d5| 0000cd10 5f 70 69 78 73 3a 5c 20 4e 65 78 74 20 70 69 78 |_pixs:\ Next pix| 0000cd20 65 6c 0d 2f 8a 2e 20 4c 44 52 20 72 31 2c 77 69 |el./.. LDR r1,wi| 0000cd30 64 74 68 3a 42 4c 20 70 6c 6f 74 5f 72 6f 77 3a |dth:BL plot_row:| 0000cd40 5c 20 50 6c 6f 74 20 70 69 78 65 6c 20 72 6f 77 |\ Plot pixel row| 0000cd50 0d 2f 94 2a 20 53 55 42 53 20 72 31 32 2c 72 31 |./.* SUBS r12,r1| 0000cd60 32 2c 23 31 3a 42 47 54 20 64 35 5f 72 6f 77 3a |2,#1:BGT d5_row:| 0000cd70 5c 20 4e 65 78 74 20 72 6f 77 0d 2f 9e 3f 20 4c |\ Next row./.? L| 0000cd80 44 52 20 72 30 2c 6c 61 63 65 64 3a 54 45 51 20 |DR r0,laced:TEQ | 0000cd90 72 30 2c 23 30 3a 42 45 51 20 64 35 5f 65 78 69 |r0,#0:BEQ d5_exi| 0000cda0 74 3a 5c 20 4e 6f 74 20 69 6e 74 65 72 6c 61 63 |t:\ Not interlac| 0000cdb0 65 64 2c 20 72 65 61 64 79 0d 2f a8 3c 20 5c 20 |ed, ready./.< \ | 0000cdc0 49 6d 61 67 65 20 72 6f 77 73 20 61 72 65 20 34 |Image rows are 4| 0000cdd0 2d 70 61 73 73 20 69 6e 74 65 72 6c 61 63 65 64 |-pass interlaced| 0000cde0 2c 20 64 6f 20 61 20 27 73 6f 72 74 27 20 6f 66 |, do a 'sort' of| 0000cdf0 20 74 68 65 6d 0d 2f b2 4a 20 4d 4f 56 20 72 34 | them./.J MOV r4| 0000ce00 2c 23 30 3a 4c 44 52 20 72 31 32 2c 72 6f 77 6c |,#0:LDR r12,rowl| 0000ce10 65 6e 3a 4c 44 52 20 72 31 31 2c 73 63 72 65 65 |en:LDR r11,scree| 0000ce20 6e 3a 5c 20 50 72 65 70 61 72 65 20 69 6e 69 74 |n:\ Prepare init| 0000ce30 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 0d | of index table.| 0000ce40 2f bc 4a 20 4c 44 52 20 72 32 2c 61 5f 74 61 62 |/.J LDR r2,a_tab| 0000ce50 6c 65 3a 4c 44 52 20 72 33 2c 68 65 69 67 68 74 |le:LDR r3,height| 0000ce60 3a 5c 20 53 74 61 72 74 20 6f 66 20 69 6e 64 69 |:\ Start of indi| 0000ce70 63 65 73 20 74 61 62 6c 65 2c 20 6e 75 6d 62 65 |ces table, numbe| 0000ce80 72 20 6f 66 20 72 6f 77 73 0d 2f c6 2a 20 4d 4c |r of rows./.* ML| 0000ce90 41 20 72 33 2c 72 31 32 2c 72 33 2c 72 31 31 3a |A r3,r12,r3,r11:| 0000cea0 5c 20 45 6e 64 20 6f 66 20 72 6f 77 20 62 75 66 |\ End of row buf| 0000ceb0 66 65 72 0d 2f d0 4b 2e 64 35 5f 70 61 73 73 20 |fer./.K.d5_pass | 0000cec0 41 44 52 20 72 30 2c 67 69 66 5f 66 69 72 73 74 |ADR r0,gif_first| 0000ced0 3a 4c 44 52 42 20 72 30 2c 5b 72 30 2c 72 34 5d |:LDRB r0,[r0,r4]| 0000cee0 3a 4d 4c 41 20 72 30 2c 72 31 32 2c 72 30 2c 72 |:MLA r0,r12,r0,r| 0000cef0 31 31 3a 5c 20 53 74 61 72 74 20 72 6f 77 0d 2f |11:\ Start row./| 0000cf00 da 48 20 41 44 52 20 72 31 2c 67 69 66 5f 73 74 |.H ADR r1,gif_st| 0000cf10 65 70 3a 4c 44 52 42 20 72 31 2c 5b 72 31 2c 72 |ep:LDRB r1,[r1,r| 0000cf20 34 5d 3a 4d 55 4c 20 72 31 2c 72 31 32 2c 72 31 |4]:MUL r1,r12,r1| 0000cf30 3a 5c 20 4f 66 66 73 65 74 20 74 6f 20 6e 65 78 |:\ Offset to nex| 0000cf40 74 20 72 6f 77 73 0d 2f e4 4c 2e 64 35 5f 74 61 |t rows./.L.d5_ta| 0000cf50 62 6c 65 20 53 54 52 20 72 30 2c 5b 72 32 5d 2c |ble STR r0,[r2],| 0000cf60 23 34 3a 41 44 44 20 72 30 2c 72 30 2c 72 31 3a |#4:ADD r0,r0,r1:| 0000cf70 43 4d 50 20 72 30 2c 72 33 3a 42 4c 54 20 64 35 |CMP r0,r3:BLT d5| 0000cf80 5f 74 61 62 6c 65 3a 5c 20 45 6e 64 20 72 6f 77 |_table:\ End row| 0000cf90 20 3f 0d 2f ee 33 20 41 44 44 20 72 34 2c 72 34 | ?./.3 ADD r4,r4| 0000cfa0 2c 23 31 3a 43 4d 50 20 72 34 2c 23 34 3a 42 4c |,#1:CMP r4,#4:BL| 0000cfb0 54 20 64 35 5f 70 61 73 73 3a 5c 20 4e 65 78 74 |T d5_pass:\ Next| 0000cfc0 20 70 61 73 73 0d 2f f8 4a 20 5c 20 49 6e 69 74 | pass./.J \ Init| 0000cfd0 69 61 6c 20 69 6e 64 65 78 20 74 61 62 6c 65 20 |ial index table | 0000cfe0 62 75 69 6c 74 20 75 70 2c 20 6e 6f 77 20 73 6f |built up, now so| 0000cff0 72 74 20 74 68 65 20 72 6f 77 73 20 69 6e 20 73 |rt the rows in s| 0000d000 65 71 75 65 6e 74 69 61 6c 20 6f 72 64 65 72 0d |equential order.| 0000d010 30 02 30 20 4c 44 52 20 72 31 30 2c 61 5f 74 61 |0.0 LDR r10,a_ta| 0000d020 62 6c 65 3a 4c 44 52 20 72 39 2c 68 65 69 67 68 |ble:LDR r9,heigh| 0000d030 74 3a 5c 20 47 6c 6f 62 61 6c 20 64 61 74 61 0d |t:\ Global data.| 0000d040 30 0c 3b 20 4d 4f 56 20 72 34 2c 23 30 3a 4c 44 |0.; MOV r4,#0:LD| 0000d050 52 20 72 38 2c 73 63 72 65 65 6e 3a 5c 20 53 74 |R r8,screen:\ St| 0000d060 61 72 74 20 72 6f 77 20 6e 75 6d 62 65 72 20 61 |art row number a| 0000d070 6e 64 20 61 64 64 72 65 73 73 0d 30 16 42 2e 64 |nd address.0.B.d| 0000d080 35 5f 72 6f 77 6e 72 20 41 44 44 20 72 31 2c 72 |5_rownr ADD r1,r| 0000d090 31 30 2c 72 34 2c 4c 53 4c 23 32 3a 5c 20 50 72 |10,r4,LSL#2:\ Pr| 0000d0a0 65 70 61 72 65 20 73 65 61 72 63 68 20 66 6f 72 |epare search for| 0000d0b0 20 63 75 72 72 65 6e 74 20 72 6f 77 0d 30 20 44 | current row.0 D| 0000d0c0 2e 64 35 5f 72 6f 77 73 63 20 4c 44 52 20 72 30 |.d5_rowsc LDR r0| 0000d0d0 2c 5b 72 31 5d 2c 23 34 3a 43 4d 50 20 72 30 2c |,[r1],#4:CMP r0,| 0000d0e0 72 38 3a 42 4e 45 20 64 35 5f 72 6f 77 73 63 3a |r8:BNE d5_rowsc:| 0000d0f0 5c 20 53 65 61 72 63 68 20 66 6f 72 20 72 6f 77 |\ Search for row| 0000d100 0d 30 2a 4b 20 53 55 42 20 72 31 2c 72 31 2c 23 |.0*K SUB r1,r1,#| 0000d110 34 3a 53 55 42 20 72 30 2c 72 31 2c 72 31 30 3a |4:SUB r0,r1,r10:| 0000d120 4d 4f 56 20 72 30 2c 72 30 2c 4c 53 52 23 32 3a |MOV r0,r0,LSR#2:| 0000d130 4d 4c 41 20 72 37 2c 72 30 2c 72 31 32 2c 72 31 |MLA r7,r0,r12,r1| 0000d140 31 3a 5c 20 52 6f 77 61 64 64 72 0d 30 34 49 20 |1:\ Rowaddr.04I | 0000d150 4c 44 52 20 72 30 2c 5b 72 31 30 2c 72 34 2c 4c |LDR r0,[r10,r4,L| 0000d160 53 4c 23 32 5d 3a 53 54 52 20 72 30 2c 5b 72 31 |SL#2]:STR r0,[r1| 0000d170 5d 3a 5c 20 57 72 69 74 65 20 6e 65 77 20 61 64 |]:\ Write new ad| 0000d180 64 72 65 73 73 20 61 66 74 65 72 20 65 78 63 68 |dress after exch| 0000d190 61 6e 67 65 0d 30 3e 1e 20 4d 4f 56 20 72 32 2c |ange.0>. MOV r2,| 0000d1a0 72 31 32 3a 5c 20 42 79 74 65 73 20 6f 6e 20 72 |r12:\ Bytes on r| 0000d1b0 6f 77 0d 30 48 44 2e 64 35 5f 65 78 63 68 20 53 |ow.0HD.d5_exch S| 0000d1c0 55 42 53 20 72 32 2c 72 32 2c 23 34 3a 4c 44 52 |UBS r2,r2,#4:LDR| 0000d1d0 20 72 30 2c 5b 72 37 2c 72 32 5d 3a 4c 44 52 20 | r0,[r7,r2]:LDR | 0000d1e0 72 31 2c 5b 72 38 2c 72 32 5d 3a 5c 20 47 65 74 |r1,[r8,r2]:\ Get| 0000d1f0 20 77 6f 72 64 73 0d 30 52 3e 20 53 54 52 20 72 | words.0R> STR r| 0000d200 30 2c 5b 72 38 2c 72 32 5d 3a 53 54 52 20 72 31 |0,[r8,r2]:STR r1| 0000d210 2c 5b 72 37 2c 72 32 5d 3a 42 47 54 20 64 35 5f |,[r7,r2]:BGT d5_| 0000d220 65 78 63 68 3a 5c 20 45 78 63 68 61 6e 67 65 20 |exch:\ Exchange | 0000d230 72 6f 77 73 0d 30 5c 30 20 41 44 44 20 72 38 2c |rows.0\0 ADD r8,| 0000d240 72 38 2c 72 31 32 3a 5c 20 4e 65 78 74 20 73 65 |r8,r12:\ Next se| 0000d250 71 75 65 6e 74 69 61 6c 20 72 6f 77 20 61 64 64 |quential row add| 0000d260 72 65 73 73 0d 30 66 3e 20 41 44 44 20 72 34 2c |ress.0f> ADD r4,| 0000d270 72 34 2c 23 31 3a 43 4d 50 20 72 34 2c 72 39 3a |r4,#1:CMP r4,r9:| 0000d280 42 4c 54 20 64 35 5f 72 6f 77 6e 72 3a 5c 20 4e |BLT d5_rownr:\ N| 0000d290 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 20 72 |ext sequential r| 0000d2a0 6f 77 0d 30 70 25 2e 64 35 5f 65 78 69 74 20 4c |ow.0p%.d5_exit L| 0000d2b0 44 4d 46 44 20 72 31 33 21 2c 7b 70 63 7d 3a 5c |DMFD r13!,{pc}:\| 0000d2c0 20 52 65 74 75 72 6e 0d 30 7a 3a 2e 67 69 66 5f | Return.0z:.gif_| 0000d2d0 73 74 65 70 20 45 51 55 42 20 38 3a 45 51 55 42 |step EQUB 8:EQUB| 0000d2e0 20 38 3a 45 51 55 42 20 34 3a 45 51 55 42 20 32 | 8:EQUB 4:EQUB 2| 0000d2f0 3a 5c 20 53 74 65 70 73 20 70 65 72 20 70 61 73 |:\ Steps per pas| 0000d300 73 0d 30 84 47 2e 67 69 66 5f 66 69 72 73 74 20 |s.0.G.gif_first | 0000d310 45 51 55 42 20 30 3a 45 51 55 42 20 34 3a 45 51 |EQUB 0:EQUB 4:EQ| 0000d320 55 42 20 32 3a 45 51 55 42 20 31 3a 5c 20 46 69 |UB 2:EQUB 1:\ Fi| 0000d330 72 73 74 20 72 6f 77 20 6e 75 6d 62 65 72 73 20 |rst row numbers | 0000d340 70 65 72 20 70 61 73 73 0d 30 8e 0a 20 41 4c 49 |per pass.0.. ALI| 0000d350 47 4e 0d 30 98 05 5c 0d 30 a2 44 2e 64 65 63 6f |GN.0..\.0.D.deco| 0000d360 6d 70 72 65 73 73 5f 47 49 46 20 5c 20 4c 5a 57 |mpress_GIF \ LZW| 0000d370 20 64 65 63 6f 6d 70 72 65 73 73 69 6f 6e 20 6f | decompression o| 0000d380 66 20 47 49 46 20 72 61 73 74 65 72 20 64 61 74 |f GIF raster dat| 0000d390 61 20 74 6f 20 62 75 66 66 65 72 0d 30 ac 17 20 |a to buffer.0.. | 0000d3a0 5c 20 47 6c 6f 62 61 6c 20 72 65 67 69 73 74 65 |\ Global registe| 0000d3b0 72 73 0d 30 b6 3d 20 5c 20 72 31 32 20 3d 20 69 |rs.0.= \ r12 = i| 0000d3c0 6e 70 75 74 20 64 61 74 61 20 70 6f 69 6e 74 65 |nput data pointe| 0000d3d0 72 20 28 70 6f 69 6e 74 73 20 74 6f 20 63 75 72 |r (points to cur| 0000d3e0 72 65 6e 74 20 69 6e 70 75 74 20 62 69 74 29 0d |rent input bit).| 0000d3f0 30 c0 2c 20 5c 20 72 31 31 20 3d 20 63 75 72 72 |0., \ r11 = curr| 0000d400 65 6e 74 20 64 65 63 6f 6d 70 72 65 73 73 69 6f |ent decompressio| 0000d410 6e 20 63 6f 64 65 20 73 69 7a 65 0d 30 ca 49 20 |n code size.0.I | 0000d420 5c 20 72 31 30 20 3d 20 74 61 62 6c 65 20 62 61 |\ r10 = table ba| 0000d430 73 65 20 61 64 64 72 65 73 73 20 28 32 20 77 6f |se address (2 wo| 0000d440 72 64 73 20 2a 20 32 5e 31 32 20 3d 20 33 32 4b |rds * 2^12 = 32K| 0000d450 20 69 73 20 6e 65 65 64 65 64 20 61 73 20 74 61 | is needed as ta| 0000d460 62 6c 65 29 0d 30 d4 18 20 5c 20 72 39 20 3d 20 |ble).0.. \ r9 = | 0000d470 63 75 72 72 65 6e 74 20 63 6f 64 65 0d 30 de 14 |current code.0..| 0000d480 20 5c 20 72 38 20 3d 20 6f 6c 64 20 63 6f 64 65 | \ r8 = old code| 0000d490 0d 30 e8 25 20 5c 20 72 37 20 3d 20 63 75 72 72 |.0.% \ r7 = curr| 0000d4a0 65 6e 74 20 6f 75 74 70 75 74 20 62 69 74 61 64 |ent output bitad| 0000d4b0 64 72 65 73 73 0d 30 f2 21 20 5c 20 72 36 20 3d |dress.0.! \ r6 =| 0000d4c0 20 66 69 72 73 74 20 66 72 65 65 20 74 61 62 6c | first free tabl| 0000d4d0 65 20 63 6f 64 65 0d 30 fc 30 20 5c 20 72 35 20 |e code.0.0 \ r5 | 0000d4e0 3d 20 62 69 74 61 64 64 72 65 73 73 20 6f 66 20 |= bitaddress of | 0000d4f0 6f 6c 64 20 63 6f 64 65 27 73 20 74 72 61 6e 73 |old code's trans| 0000d500 6c 61 74 69 6f 6e 0d 31 06 21 20 53 54 4d 46 44 |lation.1.! STMFD| 0000d510 20 72 31 33 21 2c 7b 72 31 34 7d 3a 5c 20 53 61 | r13!,{r14}:\ Sa| 0000d520 76 65 20 6c 69 6e 6b 0d 31 10 3c 20 4d 4f 56 20 |ve link.1.< MOV | 0000d530 72 30 2c 23 30 3a 53 54 52 20 72 30 2c 6c 7a 77 |r0,#0:STR r0,lzw| 0000d540 5f 72 65 6c 6f 61 64 3a 5c 20 4e 6f 20 72 65 6c |_reload:\ No rel| 0000d550 6f 61 64 20 66 6f 72 20 66 69 72 73 74 20 63 68 |oad for first ch| 0000d560 75 6e 6b 0d 31 1a 37 20 4d 4f 56 20 72 31 32 2c |unk.1.7 MOV r12,| 0000d570 23 30 3a 42 4c 20 6c 7a 77 5f 63 68 75 6e 6b 3a |#0:BL lzw_chunk:| 0000d580 5c 20 4c 6f 61 64 20 66 69 72 73 74 20 63 68 75 |\ Load first chu| 0000d590 6e 6b 20 6f 66 20 64 61 74 61 0d 31 24 29 20 4c |nk of data.1$) L| 0000d5a0 44 52 42 20 72 30 2c 6c 7a 77 5f 72 6f 6f 74 3a |DRB r0,lzw_root:| 0000d5b0 5c 20 49 6e 69 74 69 61 6c 20 63 6f 64 65 20 73 |\ Initial code s| 0000d5c0 69 7a 65 0d 31 2e 47 20 4d 4f 56 20 72 31 2c 23 |ize.1.G MOV r1,#| 0000d5d0 31 3a 4d 4f 56 20 72 31 2c 72 31 2c 4c 53 4c 20 |1:MOV r1,r1,LSL | 0000d5e0 72 30 3a 53 54 52 20 72 31 2c 6c 7a 77 5f 72 6c |r0:STR r1,lzw_rl| 0000d5f0 69 6d 3a 5c 20 32 5e 72 6f 6f 74 73 69 7a 65 20 |im:\ 2^rootsize | 0000d600 6c 69 6d 69 74 20 63 6f 64 65 0d 31 38 3b 20 4c |limit code.18; L| 0000d610 44 52 20 72 31 2c 61 72 63 62 69 74 73 3a 53 54 |DR r1,arcbits:ST| 0000d620 52 20 72 31 2c 6c 7a 77 5f 62 69 74 73 3a 5c 20 |R r1,lzw_bits:\ | 0000d630 42 69 74 73 20 70 65 72 20 70 69 78 65 6c 20 6f |Bits per pixel o| 0000d640 75 74 70 75 74 0d 31 42 3c 20 4c 44 52 20 72 31 |utput.1B< LDR r1| 0000d650 30 2c 74 61 62 62 66 3a 5c 20 44 65 63 6f 6d 70 |0,tabbf:\ Decomp| 0000d660 72 65 73 73 69 6f 6e 20 73 74 72 69 6e 67 20 74 |ression string t| 0000d670 61 62 6c 65 20 62 75 66 66 65 72 20 73 74 61 72 |able buffer star| 0000d680 74 0d 31 4c 48 20 4c 44 52 20 72 30 2c 73 63 72 |t.1LH LDR r0,scr| 0000d690 65 65 6e 3a 4d 4f 56 20 72 37 2c 72 30 2c 4c 53 |een:MOV r7,r0,LS| 0000d6a0 4c 23 33 3a 5c 20 44 65 73 74 69 6e 61 74 69 6f |L#3:\ Destinatio| 0000d6b0 6e 20 66 6f 72 20 64 65 63 6f 6d 70 72 65 73 73 |n for decompress| 0000d6c0 65 64 20 73 74 72 65 61 6d 0d 31 56 2d 20 42 4c |ed stream.1V- BL| 0000d6d0 20 6c 7a 77 5f 72 65 73 65 74 3a 5c 20 52 65 73 | lzw_reset:\ Res| 0000d6e0 65 74 20 63 6f 64 65 20 73 69 7a 65 20 61 6e 64 |et code size and| 0000d6f0 20 74 61 62 6c 65 0d 31 60 33 2e 6c 7a 77 5f 63 | table.1`3.lzw_c| 0000d700 67 65 74 20 5c 20 47 65 74 20 6e 65 78 74 20 63 |get \ Get next c| 0000d710 6f 64 65 20 66 72 6f 6d 20 63 6f 64 65 73 74 72 |ode from codestr| 0000d720 65 61 6d 20 69 6e 20 72 39 0d 31 6a 30 20 80 20 |eam in r9.1j0 . | 0000d730 72 33 2c 72 31 32 2c 23 37 3a 5c 20 42 69 74 20 |r3,r12,#7:\ Bit | 0000d740 61 64 64 72 65 73 73 20 77 69 74 68 69 6e 20 62 |address within b| 0000d750 79 74 65 20 28 30 2d 37 29 0d 31 74 24 20 4d 4f |yte (0-7).1t$ MO| 0000d760 56 20 72 32 2c 72 31 32 2c 4c 53 52 23 33 3a 5c |V r2,r12,LSR#3:\| 0000d770 20 42 79 74 65 20 61 64 64 72 65 73 73 0d 31 7e | Byte address.1~| 0000d780 2b 20 4c 44 52 42 20 72 30 2c 5b 72 32 5d 2c 23 |+ LDRB r0,[r2],#| 0000d790 31 3a 5c 20 47 65 74 20 66 69 72 73 74 20 65 69 |1:\ Get first ei| 0000d7a0 67 68 74 20 62 69 74 73 0d 31 88 3a 20 4c 44 52 |ght bits.1.: LDR| 0000d7b0 42 20 72 31 2c 5b 72 32 5d 2c 23 31 3a 84 52 20 |B r1,[r2],#1:.R | 0000d7c0 72 30 2c 72 30 2c 72 31 2c 4c 53 4c 23 38 3a 5c |r0,r0,r1,LSL#8:\| 0000d7d0 20 41 64 64 20 61 6e 6f 74 68 65 72 20 65 69 67 | Add another eig| 0000d7e0 68 74 0d 31 92 3b 20 4c 44 52 42 20 72 31 2c 5b |ht.1.; LDRB r1,[| 0000d7f0 72 32 5d 2c 23 31 3a 84 52 20 72 30 2c 72 30 2c |r2],#1:.R r0,r0,| 0000d800 72 31 2c 4c 53 4c 23 31 36 3a 5c 20 41 6e 64 20 |r1,LSL#16:\ And | 0000d810 61 6e 6f 74 68 65 72 20 65 69 67 68 74 0d 31 9c |another eight.1.| 0000d820 4d 20 4d 4f 56 20 72 30 2c 72 30 2c 4c 53 52 20 |M MOV r0,r0,LSR | 0000d830 72 33 3a 4d 56 4e 20 72 31 2c 23 30 3a 42 49 43 |r3:MVN r1,#0:BIC| 0000d840 20 72 39 2c 72 30 2c 72 31 2c 4c 53 4c 20 72 31 | r9,r0,r1,LSL r1| 0000d850 31 3a 5c 20 4d 61 73 6b 20 6f 75 74 20 72 65 71 |1:\ Mask out req| 0000d860 75 69 72 65 64 20 62 69 74 73 0d 31 a6 27 20 41 |uired bits.1.' A| 0000d870 44 44 20 72 31 32 2c 72 31 32 2c 72 31 31 3a 5c |DD r12,r12,r11:\| 0000d880 20 4e 65 78 74 20 62 69 74 20 61 64 64 72 65 73 | Next bit addres| 0000d890 73 0d 31 b0 2d 20 4c 44 52 20 72 31 2c 6c 7a 77 |s.1.- LDR r1,lzw| 0000d8a0 5f 72 6c 69 6d 3a 5c 20 32 5e 72 6f 6f 74 20 73 |_rlim:\ 2^root s| 0000d8b0 69 7a 65 20 6c 69 6d 69 74 20 63 6f 64 65 0d 31 |ize limit code.1| 0000d8c0 ba 49 20 53 55 42 53 20 72 31 2c 72 39 2c 72 31 |.I SUBS r1,r9,r1| 0000d8d0 3a 42 45 51 20 6c 7a 77 5f 43 43 3a 43 4d 50 20 |:BEQ lzw_CC:CMP | 0000d8e0 72 31 2c 23 31 3a 42 45 51 20 6c 7a 77 5f 45 4f |r1,#1:BEQ lzw_EO| 0000d8f0 49 3a 5c 20 43 68 65 63 6b 20 73 70 65 63 69 61 |I:\ Check specia| 0000d900 6c 20 63 6f 64 65 73 0d 31 c4 38 20 43 4d 50 20 |l codes.1.8 CMP | 0000d910 72 39 2c 72 36 3a 42 47 45 20 6c 7a 77 5f 6e 6f |r9,r6:BGE lzw_no| 0000d920 74 74 61 62 6c 65 3a 5c 20 43 68 65 63 6b 20 69 |ttable:\ Check i| 0000d930 66 20 63 6f 64 65 20 69 6e 20 74 61 62 6c 65 0d |f code in table.| 0000d940 31 ce 05 5c 0d 31 d8 24 2e 6c 7a 77 5f 69 6e 74 |1..\.1.$.lzw_int| 0000d950 61 62 6c 65 20 5c 20 43 6f 64 65 20 77 61 73 20 |able \ Code was | 0000d960 69 6e 20 74 61 62 6c 65 0d 31 e2 3e 20 4c 44 52 |in table.1.> LDR| 0000d970 20 72 30 2c 6c 7a 77 5f 72 6c 69 6d 3a 43 4d 50 | r0,lzw_rlim:CMP| 0000d980 20 72 39 2c 72 30 3a 42 47 45 20 6c 7a 77 5f 63 | r9,r0:BGE lzw_c| 0000d990 6e 6f 72 3a 5c 20 49 73 20 69 74 20 6e 6f 6e 2d |nor:\ Is it non-| 0000d9a0 72 6f 6f 74 20 3f 0d 31 ec 48 20 53 54 52 20 72 |root ?.1.H STR r| 0000d9b0 39 2c 6c 7a 77 5f 64 75 6d 3a 41 44 52 20 72 30 |9,lzw_dum:ADR r0| 0000d9c0 2c 6c 7a 77 5f 64 75 6d 3a 4d 4f 56 20 72 30 2c |,lzw_dum:MOV r0,| 0000d9d0 72 30 2c 4c 53 4c 23 33 3a 5c 20 53 74 6f 72 65 |r0,LSL#3:\ Store| 0000d9e0 20 63 6f 64 65 20 61 74 20 64 75 6d 6d 79 0d 31 | code at dummy.1| 0000d9f0 f6 34 20 4c 44 52 20 72 32 2c 6c 7a 77 5f 62 69 |.4 LDR r2,lzw_bi| 0000da00 74 73 3a 42 20 6c 7a 77 5f 69 6e 63 6f 3a 5c 20 |ts:B lzw_inco:\ | 0000da10 4f 75 74 70 75 74 20 72 6f 6f 74 20 73 74 72 69 |Output root stri| 0000da20 6e 67 0d 32 00 4b 2e 6c 7a 77 5f 63 6e 6f 72 20 |ng.2.K.lzw_cnor | 0000da30 41 44 44 20 72 31 2c 72 31 30 2c 72 39 2c 4c 53 |ADD r1,r10,r9,LS| 0000da40 4c 23 33 3a 4c 44 52 20 72 30 2c 5b 72 31 5d 2c |L#3:LDR r0,[r1],| 0000da50 23 34 3a 4c 44 52 20 72 32 2c 5b 72 31 5d 3a 5c |#4:LDR r2,[r1]:\| 0000da60 20 43 6f 64 65 20 61 64 72 2f 6c 65 6e 0d 32 0a | Code adr/len.2.| 0000da70 3f 2e 6c 7a 77 5f 69 6e 63 6f 20 4d 4f 56 20 72 |?.lzw_inco MOV r| 0000da80 31 2c 72 37 3a 42 4c 20 6c 7a 77 5f 62 69 74 63 |1,r7:BL lzw_bitc| 0000da90 6f 70 79 3a 5c 20 4f 75 74 70 75 74 20 73 74 72 |opy:\ Output str| 0000daa0 69 6e 67 20 66 6f 72 20 63 6f 64 65 0d 32 14 2c |ing for code.2.,| 0000dab0 20 43 4d 50 20 72 38 2c 23 30 3a 42 4c 54 20 6c | CMP r8,#0:BLT l| 0000dac0 7a 77 5f 69 6e 32 3a 5c 20 4e 6f 20 6f 6c 64 20 |zw_in2:\ No old | 0000dad0 63 6f 64 65 20 79 65 74 0d 32 1e 4a 20 4c 44 52 |code yet.2.J LDR| 0000dae0 20 72 30 2c 6c 7a 77 5f 6f 6c 64 6c 65 6e 3a 4c | r0,lzw_oldlen:L| 0000daf0 44 52 20 72 32 2c 6c 7a 77 5f 62 69 74 73 3a 41 |DR r2,lzw_bits:A| 0000db00 44 44 20 72 30 2c 72 30 2c 72 32 3a 5c 20 54 72 |DD r0,r0,r2:\ Tr| 0000db10 61 6e 73 6c 61 74 69 6f 6e 27 73 20 6c 65 6e 67 |anslation's leng| 0000db20 74 68 0d 32 28 4c 20 41 44 44 20 72 32 2c 72 31 |th.2(L ADD r2,r1| 0000db30 30 2c 72 36 2c 4c 53 4c 23 33 3a 41 44 44 20 72 |0,r6,LSL#3:ADD r| 0000db40 36 2c 72 36 2c 23 31 3a 53 54 52 20 72 35 2c 5b |6,r6,#1:STR r5,[| 0000db50 72 32 5d 2c 23 34 3a 53 54 52 20 72 30 2c 5b 72 |r2],#4:STR r0,[r| 0000db60 32 5d 3a 5c 20 4e 65 77 20 65 6e 74 72 79 0d 32 |2]:\ New entry.2| 0000db70 32 4b 2e 6c 7a 77 5f 69 6e 32 20 53 55 42 20 72 |2K.lzw_in2 SUB r| 0000db80 30 2c 72 31 2c 72 37 3a 4d 4f 56 20 72 35 2c 72 |0,r1,r7:MOV r5,r| 0000db90 37 3a 53 54 52 20 72 30 2c 6c 7a 77 5f 6f 6c 64 |7:STR r0,lzw_old| 0000dba0 6c 65 6e 3a 5c 20 4e 65 77 20 27 6f 6c 64 20 63 |len:\ New 'old c| 0000dbb0 6f 64 65 27 20 69 6e 66 6f 0d 32 3c 26 20 4d 4f |ode' info.2<& MO| 0000dbc0 56 20 72 37 2c 72 31 3a 5c 20 4e 65 77 20 6f 75 |V r7,r1:\ New ou| 0000dbd0 74 70 75 74 20 62 69 74 61 64 64 72 65 73 73 0d |tput bitaddress.| 0000dbe0 32 46 05 5c 0d 32 50 2c 2e 6c 7a 77 5f 6e 65 78 |2F.\.2P,.lzw_nex| 0000dbf0 74 67 65 74 20 4d 4f 56 20 72 38 2c 72 39 3a 5c |tget MOV r8,r9:\| 0000dc00 20 4f 6c 64 20 63 6f 64 65 20 3d 20 63 6f 64 65 | Old code = code| 0000dc10 0d 32 5a 41 20 4c 44 52 20 72 30 2c 6c 7a 77 5f |.2ZA LDR r0,lzw_| 0000dc20 6c 69 6d 69 74 3a 43 4d 50 20 72 36 2c 72 30 3a |limit:CMP r6,r0:| 0000dc30 42 4c 54 20 6c 7a 77 5f 6e 63 67 65 74 3a 5c 20 |BLT lzw_ncget:\ | 0000dc40 43 6f 64 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 |Code size limit | 0000dc50 3f 0d 32 64 49 20 41 44 44 20 72 31 31 2c 72 31 |?.2dI ADD r11,r1| 0000dc60 31 2c 23 31 3a 43 4d 50 20 72 31 31 2c 23 31 32 |1,#1:CMP r11,#12| 0000dc70 3a 4d 4f 56 47 54 20 72 31 31 2c 23 31 32 3a 5c |:MOVGT r11,#12:\| 0000dc80 20 49 6e 63 72 65 61 73 65 20 63 6f 64 65 20 73 | Increase code s| 0000dc90 69 7a 65 20 28 3c 3d 31 32 29 0d 32 6e 49 20 4d |ize (<=12).2nI M| 0000dca0 4f 56 20 72 30 2c 23 31 3a 4d 4f 56 20 72 30 2c |OV r0,#1:MOV r0,| 0000dcb0 72 30 2c 4c 53 4c 20 72 31 31 3a 53 54 52 20 72 |r0,LSL r11:STR r| 0000dcc0 30 2c 6c 7a 77 5f 6c 69 6d 69 74 3a 5c 20 32 5e |0,lzw_limit:\ 2^| 0000dcd0 63 6f 64 65 73 69 7a 65 20 6c 69 6d 69 74 20 63 |codesize limit c| 0000dce0 6f 64 65 0d 32 78 4c 2e 6c 7a 77 5f 6e 63 67 65 |ode.2xL.lzw_ncge| 0000dcf0 74 20 4c 44 52 20 72 31 2c 6c 7a 77 5f 65 6e 64 |t LDR r1,lzw_end| 0000dd00 62 69 74 3a 41 44 44 20 72 30 2c 72 31 32 2c 72 |bit:ADD r0,r12,r| 0000dd10 31 31 3a 5c 20 42 69 74 61 64 64 72 65 73 73 20 |11:\ Bitaddress | 0000dd20 61 66 74 65 72 20 6e 65 78 74 20 63 6f 64 65 0d |after next code.| 0000dd30 32 82 43 20 43 4d 50 20 72 30 2c 72 31 2c 4c 53 |2.C CMP r0,r1,LS| 0000dd40 4c 23 33 3a 42 4c 47 54 20 6c 7a 77 5f 63 68 75 |L#3:BLGT lzw_chu| 0000dd50 6e 6b 3a 5c 20 4e 65 77 20 63 68 75 6e 6b 20 69 |nk:\ New chunk i| 0000dd60 66 20 6f 75 74 20 6f 66 20 69 6e 70 75 74 62 69 |f out of inputbi| 0000dd70 74 73 0d 32 8c 1b 20 42 20 6c 7a 77 5f 63 67 65 |ts.2.. B lzw_cge| 0000dd80 74 3a 5c 20 4e 65 78 74 20 63 6f 64 65 0d 32 96 |t:\ Next code.2.| 0000dd90 05 5c 0d 32 a0 29 2e 6c 7a 77 5f 6e 6f 74 74 61 |.\.2.).lzw_notta| 0000dda0 62 6c 65 20 5c 20 43 6f 64 65 20 77 61 73 20 6e |ble \ Code was n| 0000ddb0 6f 74 20 69 6e 20 74 61 62 6c 65 0d 32 aa 48 20 |ot in table.2.H | 0000ddc0 4d 4f 56 20 72 31 2c 72 37 3a 4d 4f 56 20 72 30 |MOV r1,r7:MOV r0| 0000ddd0 2c 72 35 3a 4c 44 52 20 72 32 2c 6c 7a 77 5f 6f |,r5:LDR r2,lzw_o| 0000dde0 6c 64 6c 65 6e 3a 42 4c 20 6c 7a 77 5f 62 69 74 |ldlen:BL lzw_bit| 0000ddf0 63 6f 70 79 3a 5c 20 4f 75 74 70 75 74 20 27 6f |copy:\ Output 'o| 0000de00 6c 64 27 0d 32 b4 4a 20 4c 44 52 20 72 32 2c 6c |ld'.2.J LDR r2,l| 0000de10 7a 77 5f 62 69 74 73 3a 4d 4f 56 20 72 30 2c 72 |zw_bits:MOV r0,r| 0000de20 35 3a 42 4c 20 6c 7a 77 5f 62 69 74 63 6f 70 79 |5:BL lzw_bitcopy| 0000de30 3a 5c 20 4f 75 74 70 75 74 20 66 69 72 73 74 20 |:\ Output first | 0000de40 63 68 61 72 20 6f 66 20 27 6f 6c 64 27 0d 32 be |char of 'old'.2.| 0000de50 43 20 53 55 42 20 72 30 2c 72 31 2c 72 37 3a 4d |C SUB r0,r1,r7:M| 0000de60 4f 56 20 72 35 2c 72 37 3a 53 54 52 20 72 30 2c |OV r5,r7:STR r0,| 0000de70 6c 7a 77 5f 6f 6c 64 6c 65 6e 3a 5c 20 4e 65 77 |lzw_oldlen:\ New| 0000de80 20 27 6f 6c 64 20 63 6f 64 65 27 20 69 6e 66 6f | 'old code' info| 0000de90 0d 32 c8 4c 20 41 44 44 20 72 32 2c 72 31 30 2c |.2.L ADD r2,r10,| 0000dea0 72 36 2c 4c 53 4c 23 33 3a 41 44 44 20 72 36 2c |r6,LSL#3:ADD r6,| 0000deb0 72 36 2c 23 31 3a 53 54 52 20 72 35 2c 5b 72 32 |r6,#1:STR r5,[r2| 0000dec0 5d 2c 23 34 3a 53 54 52 20 72 30 2c 5b 72 32 5d |],#4:STR r0,[r2]| 0000ded0 3a 5c 20 4e 65 77 20 65 6e 74 72 79 0d 32 d2 26 |:\ New entry.2.&| 0000dee0 20 4d 4f 56 20 72 37 2c 72 31 3a 5c 20 4e 65 77 | MOV r7,r1:\ New| 0000def0 20 6f 75 74 70 75 74 20 62 69 74 61 64 64 72 65 | output bitaddre| 0000df00 73 73 0d 32 dc 24 20 42 20 6c 7a 77 5f 6e 65 78 |ss.2.$ B lzw_nex| 0000df10 74 67 65 74 3a 5c 20 4e 65 78 74 20 69 6e 70 75 |tget:\ Next inpu| 0000df20 74 20 63 6f 64 65 0d 32 e6 05 5c 0d 32 f0 3e 2e |t code.2..\.2.>.| 0000df30 6c 7a 77 5f 43 43 20 42 4c 20 6c 7a 77 5f 72 65 |lzw_CC BL lzw_re| 0000df40 73 65 74 3a 42 20 6c 7a 77 5f 63 67 65 74 3a 5c |set:B lzw_cget:\| 0000df50 20 3c 43 43 3e 2c 20 72 65 73 65 74 20 61 6e 64 | <CC>, reset and| 0000df60 20 63 6f 6e 74 69 6e 75 65 0d 32 fa 2a 2e 6c 7a | continue.2.*.lz| 0000df70 77 5f 45 4f 49 20 5c 20 3c 45 4f 49 3e 2c 20 65 |w_EOI \ <EOI>, e| 0000df80 6e 64 20 6f 66 20 64 65 63 6f 6d 70 72 65 73 73 |nd of decompress| 0000df90 69 6f 6e 0d 33 04 26 2e 6c 7a 77 5f 65 78 69 74 |ion.3.&.lzw_exit| 0000dfa0 20 4c 44 4d 46 44 20 72 31 33 21 2c 7b 70 63 7d | LDMFD r13!,{pc}| 0000dfb0 3a 5c 20 52 65 74 75 72 6e 0d 33 0e 05 5c 0d 33 |:\ Return.3..\.3| 0000dfc0 18 4a 2e 6c 7a 77 5f 63 68 75 6e 6b 20 5c 20 52 |.J.lzw_chunk \ R| 0000dfd0 65 61 64 73 20 63 68 75 6e 6b 20 77 69 74 68 20 |eads chunk with | 0000dfe0 72 30 20 62 79 74 65 73 20 72 65 2d 72 65 61 64 |r0 bytes re-read| 0000dff0 20 28 69 66 20 72 31 32 3d 30 2c 20 66 69 72 73 | (if r12=0, firs| 0000e000 74 20 63 68 75 6e 6b 29 0d 33 22 1f 20 4d 4f 56 |t chunk).3". MOV| 0000e010 20 72 31 2c 72 31 34 3a 5c 20 52 65 6d 65 6d 62 | r1,r14:\ Rememb| 0000e020 65 72 20 6c 69 6e 6b 0d 33 2c 47 20 4c 44 52 20 |er link.3,G LDR | 0000e030 72 30 2c 6c 7a 77 5f 72 65 6c 6f 61 64 3a 42 4c |r0,lzw_reload:BL| 0000e040 20 67 65 74 5f 63 68 75 6e 6b 3a 42 45 51 20 6c | get_chunk:BEQ l| 0000e050 7a 77 5f 65 78 69 74 3a 5c 20 43 68 75 6e 6b 20 |zw_exit:\ Chunk | 0000e060 28 77 69 74 68 20 72 65 2d 72 65 61 64 29 0d 33 |(with re-read).3| 0000e070 36 3d 20 4d 4f 56 20 72 31 34 2c 72 31 3a 53 54 |6= MOV r14,r1:ST| 0000e080 4d 46 44 20 72 31 33 21 2c 7b 72 34 2c 72 31 34 |MFD r13!,{r4,r14| 0000e090 7d 3a 5c 20 53 61 76 65 20 72 65 67 69 73 74 65 |}:\ Save registe| 0000e0a0 72 73 20 61 6e 64 20 6c 69 6e 6b 0d 33 40 4b 20 |rs and link.3@K | 0000e0b0 4c 44 52 20 72 31 34 2c 63 68 75 6e 6b 3a 4d 4f |LDR r14,chunk:MO| 0000e0c0 56 20 72 30 2c 72 31 34 2c 4c 53 4c 23 33 3a 5c |V r0,r14,LSL#3:\| 0000e0d0 20 53 74 61 72 74 20 6f 66 20 62 75 66 66 65 72 | Start of buffer| 0000e0e0 65 64 20 64 61 74 61 20 28 62 79 74 65 2f 62 69 |ed data (byte/bi| 0000e0f0 74 61 64 64 72 29 0d 33 4a 32 20 43 4d 50 20 72 |taddr).3J2 CMP r| 0000e100 31 32 2c 23 30 3a 42 4e 45 20 6c 7a 77 5f 63 68 |12,#0:BNE lzw_ch| 0000e110 6e 6f 66 3a 5c 20 46 69 72 73 74 20 63 68 75 6e |nof:\ First chun| 0000e120 6b 20 6c 6f 61 64 20 3f 0d 33 54 47 20 4c 44 52 |k load ?.3TG LDR| 0000e130 42 20 72 31 2c 5b 72 31 34 5d 2c 23 31 3a 53 54 |B r1,[r14],#1:ST| 0000e140 52 20 72 31 2c 6c 7a 77 5f 72 6f 6f 74 3a 5c 20 |R r1,lzw_root:\ | 0000e150 49 6e 69 74 69 61 6c 20 63 6f 64 65 20 73 69 7a |Initial code siz| 0000e160 65 20 28 66 69 72 73 74 20 63 68 75 6e 6b 29 0d |e (first chunk).| 0000e170 33 5e 29 20 4d 4f 56 20 72 34 2c 72 30 3a 5c 20 |3^) MOV r4,r0:\ | 0000e180 46 69 72 73 74 20 62 69 74 20 69 73 20 65 78 61 |First bit is exa| 0000e190 63 74 20 73 74 61 72 74 0d 33 68 3e 20 4d 4f 56 |ct start.3h> MOV| 0000e1a0 20 72 30 2c 23 30 3a 42 20 6c 7a 77 5f 63 68 66 | r0,#0:B lzw_chf| 0000e1b0 63 6f 3a 5c 20 4e 6f 20 6f 66 66 73 65 74 20 66 |co:\ No offset f| 0000e1c0 6f 72 20 63 6c 65 61 6e 75 70 20 64 65 73 74 69 |or cleanup desti| 0000e1d0 6e 61 74 69 6f 6e 0d 33 72 4a 2e 6c 7a 77 5f 63 |nation.3rJ.lzw_c| 0000e1e0 68 6e 6f 66 20 4c 44 52 20 72 33 2c 6c 7a 77 5f |hnof LDR r3,lzw_| 0000e1f0 65 6e 64 62 69 74 3a 52 53 42 20 72 31 2c 72 31 |endbit:RSB r1,r1| 0000e200 32 2c 72 33 2c 4c 53 4c 23 33 3a 5c 20 42 69 74 |2,r3,LSL#3:\ Bit| 0000e210 73 20 6c 65 66 74 20 69 6e 20 62 75 66 66 65 72 |s left in buffer| 0000e220 0d 33 7c 4b 20 52 53 42 20 72 31 2c 72 31 2c 23 |.3|K RSB r1,r1,#| 0000e230 31 36 3a 41 44 44 20 72 34 2c 72 30 2c 72 31 3a |16:ADD r4,r0,r1:| 0000e240 5c 20 46 69 72 73 74 20 62 69 74 20 28 72 65 6c |\ First bit (rel| 0000e250 6f 61 64 65 64 20 6c 61 73 74 20 63 6f 75 6e 74 |oaded last count| 0000e260 20 2b 20 32 20 62 79 74 65 73 29 0d 33 86 41 20 | + 2 bytes).3.A | 0000e270 41 44 44 20 72 31 34 2c 72 31 34 2c 23 32 3a 5c |ADD r14,r14,#2:\| 0000e280 20 41 63 63 6f 75 6e 74 20 66 6f 72 20 32 20 65 | Account for 2 e| 0000e290 78 74 72 61 20 62 79 74 65 73 20 62 65 66 6f 72 |xtra bytes befor| 0000e2a0 65 20 63 6f 75 6e 74 20 62 79 74 65 0d 33 90 2a |e count byte.3.*| 0000e2b0 20 4d 4f 56 20 72 30 2c 23 32 3a 5c 20 32 2d 62 | MOV r0,#2:\ 2-b| 0000e2c0 79 74 65 20 6f 66 66 73 65 74 20 66 6f 72 20 63 |yte offset for c| 0000e2d0 6c 65 61 6e 75 70 0d 33 9a 4e 2e 6c 7a 77 5f 63 |leanup.3.N.lzw_c| 0000e2e0 68 66 63 6f 20 4c 44 52 20 72 31 2c 63 68 75 6e |hfco LDR r1,chun| 0000e2f0 6b 3a 41 44 44 20 72 30 2c 72 31 2c 72 30 3a 4d |k:ADD r0,r1,r0:M| 0000e300 4f 56 20 72 31 32 2c 72 31 34 3a 5c 20 50 72 65 |OV r12,r14:\ Pre| 0000e310 70 61 72 65 20 63 6f 75 6e 74 20 62 79 74 65 20 |pare count byte | 0000e320 6b 69 6c 6c 0d 33 a4 3d 20 4c 44 52 20 72 33 2c |kill.3.= LDR r3,| 0000e330 6c 6f 61 64 65 64 3a 41 44 44 20 72 33 2c 72 31 |loaded:ADD r3,r1| 0000e340 2c 72 33 3a 5c 20 45 6e 64 20 61 64 64 72 65 73 |,r3:\ End addres| 0000e350 73 20 6f 66 20 6c 6f 61 64 65 64 20 63 68 75 6e |s of loaded chun| 0000e360 6b 0d 33 ae 34 2e 6c 7a 77 5f 63 68 6b 69 6c 20 |k.3.4.lzw_chkil | 0000e370 4c 44 52 42 20 72 31 2c 5b 72 31 32 5d 2c 23 31 |LDRB r1,[r12],#1| 0000e380 3a 5c 20 43 75 72 72 65 6e 74 20 63 6f 75 6e 74 |:\ Current count| 0000e390 20 62 79 74 65 0d 33 b8 3b 20 43 4d 50 20 72 31 | byte.3.; CMP r1| 0000e3a0 2c 23 30 3a 42 45 51 20 6c 7a 77 5f 63 68 6f 75 |,#0:BEQ lzw_chou| 0000e3b0 74 3a 5c 20 49 73 20 74 68 69 73 20 74 68 65 20 |t:\ Is this the | 0000e3c0 65 6e 64 20 63 6f 75 6e 74 20 62 79 74 65 20 3f |end count byte ?| 0000e3d0 0d 33 c2 2f 20 41 44 44 20 72 31 34 2c 72 31 32 |.3./ ADD r14,r12| 0000e3e0 2c 72 31 3a 5c 20 4e 65 78 74 20 63 6f 75 6e 74 |,r1:\ Next count| 0000e3f0 20 62 79 74 65 27 73 20 61 64 64 72 65 73 73 0d | byte's address.| 0000e400 33 cc 41 20 43 4d 50 20 72 31 34 2c 72 33 3a 42 |3.A CMP r14,r3:B| 0000e410 47 45 20 6c 7a 77 5f 63 68 6f 75 74 3a 5c 20 49 |GE lzw_chout:\ I| 0000e420 73 20 69 74 20 62 75 66 66 65 72 65 64 20 3f 20 |s it buffered ? | 0000e430 49 66 20 73 6f 2c 20 63 6f 70 79 20 64 61 74 61 |If so, copy data| 0000e440 0d 33 d6 4d 2e 6c 7a 77 5f 63 68 63 6f 70 20 43 |.3.M.lzw_chcop C| 0000e450 4d 50 20 72 31 32 2c 72 31 34 3a 4c 44 52 4e 45 |MP r12,r14:LDRNE| 0000e460 42 20 72 31 2c 5b 72 31 32 5d 2c 23 31 3a 53 54 |B r1,[r12],#1:ST| 0000e470 52 4e 45 42 20 72 31 2c 5b 72 30 5d 2c 23 31 3a |RNEB r1,[r0],#1:| 0000e480 42 4e 45 20 6c 7a 77 5f 63 68 63 6f 70 0d 33 e0 |BNE lzw_chcop.3.| 0000e490 48 20 42 20 6c 7a 77 5f 63 68 6b 69 6c 3a 5c 20 |H B lzw_chkil:\ | 0000e4a0 43 6f 6e 74 69 6e 75 65 20 75 6e 74 69 6c 20 65 |Continue until e| 0000e4b0 69 74 68 65 72 20 65 6e 64 20 63 6f 75 6e 74 20 |ither end count | 0000e4c0 6f 72 20 6e 6f 6e 2d 62 75 66 66 65 72 65 64 20 |or non-buffered | 0000e4d0 63 6f 75 6e 74 0d 33 ea 4d 2e 6c 7a 77 5f 63 68 |count.3.M.lzw_ch| 0000e4e0 6f 75 74 20 53 55 42 20 72 31 2c 72 33 2c 72 31 |out SUB r1,r3,r1| 0000e4f0 32 3a 41 44 44 20 72 31 2c 72 31 2c 23 33 3a 53 |2:ADD r1,r1,#3:S| 0000e500 54 52 20 72 31 2c 6c 7a 77 5f 72 65 6c 6f 61 64 |TR r1,lzw_reload| 0000e510 3a 5c 20 52 65 6c 6f 61 64 20 72 65 71 75 69 72 |:\ Reload requir| 0000e520 65 64 0d 33 f4 32 20 4d 4f 56 20 72 31 32 2c 72 |ed.3.2 MOV r12,r| 0000e530 34 3a 5c 20 42 69 74 20 61 64 64 72 65 73 73 20 |4:\ Bit address | 0000e540 6f 66 20 73 74 61 72 74 20 6f 66 20 6e 65 77 20 |of start of new | 0000e550 64 61 74 61 0d 33 fe 36 20 53 54 52 20 72 30 2c |data.3.6 STR r0,| 0000e560 6c 7a 77 5f 65 6e 64 62 69 74 3a 5c 20 45 78 61 |lzw_endbit:\ Exa| 0000e570 63 74 20 65 6e 64 20 6f 66 20 27 63 6c 65 61 6e |ct end of 'clean| 0000e580 27 20 64 61 74 61 62 69 74 73 0d 34 08 20 20 4c |' databits.4. L| 0000e590 44 4d 46 44 20 72 31 33 21 2c 7b 72 34 2c 70 63 |DMFD r13!,{r4,pc| 0000e5a0 7d 3a 5c 20 52 65 74 75 72 6e 0d 34 12 05 5c 0d |}:\ Return.4..\.| 0000e5b0 34 1c 23 2e 6c 7a 77 5f 64 75 6d 20 20 20 20 45 |4.#.lzw_dum E| 0000e5c0 51 55 44 20 30 3a 5c 20 44 75 6d 6d 79 20 77 6f |QUD 0:\ Dummy wo| 0000e5d0 72 64 0d 34 26 3b 2e 6c 7a 77 5f 6f 6c 64 6c 65 |rd.4&;.lzw_oldle| 0000e5e0 6e 20 45 51 55 44 20 30 3a 5c 20 4c 65 6e 67 74 |n EQUD 0:\ Lengt| 0000e5f0 68 20 6f 66 20 74 72 61 6e 73 6c 61 74 69 6f 6e |h of translation| 0000e600 20 66 6f 72 20 6f 6c 64 20 63 6f 64 65 0d 34 30 | for old code.40| 0000e610 3f 2e 6c 7a 77 5f 72 65 6c 6f 61 64 20 45 51 55 |?.lzw_reload EQU| 0000e620 44 20 30 3a 5c 20 42 79 74 65 73 20 74 6f 20 72 |D 0:\ Bytes to r| 0000e630 65 6c 6f 61 64 20 66 6f 72 20 63 6c 65 61 6e 20 |eload for clean | 0000e640 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 0d 34 3a 36 |continuation.4:6| 0000e650 2e 6c 7a 77 5f 65 6e 64 62 69 74 20 45 51 55 44 |.lzw_endbit EQUD| 0000e660 20 30 3a 5c 20 41 64 64 72 65 73 73 20 6f 66 20 | 0:\ Address of | 0000e670 65 6e 64 20 6f 66 20 6c 6f 61 64 65 64 20 64 61 |end of loaded da| 0000e680 74 61 0d 34 44 27 2e 6c 7a 77 5f 72 6f 6f 74 20 |ta.4D'.lzw_root | 0000e690 20 20 45 51 55 44 20 30 3a 5c 20 52 6f 6f 74 20 | EQUD 0:\ Root | 0000e6a0 63 6f 64 65 20 73 69 7a 65 0d 34 4e 31 2e 6c 7a |code size.4N1.lz| 0000e6b0 77 5f 62 69 74 73 20 20 20 45 51 55 44 20 30 3a |w_bits EQUD 0:| 0000e6c0 5c 20 42 69 74 73 20 70 65 72 20 63 68 61 72 61 |\ Bits per chara| 0000e6d0 63 74 65 72 2f 70 69 78 65 6c 0d 34 58 2f 2e 6c |cter/pixel.4X/.l| 0000e6e0 7a 77 5f 72 6c 69 6d 20 20 20 45 51 55 44 20 30 |zw_rlim EQUD 0| 0000e6f0 3a 5c 20 32 5e 72 6f 6f 74 20 73 69 7a 65 20 6c |:\ 2^root size l| 0000e700 69 6d 69 74 20 63 6f 64 65 0d 34 62 36 2e 6c 7a |imit code.4b6.lz| 0000e710 77 5f 6c 69 6d 69 74 20 20 45 51 55 44 20 30 3a |w_limit EQUD 0:| 0000e720 5c 20 32 5e 63 75 72 72 65 6e 74 20 63 6f 64 65 |\ 2^current code| 0000e730 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 64 65 0d |size limit code.| 0000e740 34 6c 05 5c 0d 34 76 2b 2e 6c 7a 77 5f 72 65 73 |4l.\.4v+.lzw_res| 0000e750 65 74 20 5c 20 52 65 73 65 74 73 20 63 6f 64 65 |et \ Resets code| 0000e760 73 69 7a 65 20 61 6e 64 20 74 61 62 6c 65 73 0d |size and tables.| 0000e770 34 80 36 20 4c 44 52 20 72 30 2c 6c 7a 77 5f 72 |4.6 LDR r0,lzw_r| 0000e780 6f 6f 74 3a 41 44 44 20 72 31 31 2c 72 30 2c 23 |oot:ADD r11,r0,#| 0000e790 31 3a 5c 20 49 6e 69 74 69 61 6c 20 63 6f 64 65 |1:\ Initial code| 0000e7a0 20 73 69 7a 65 0d 34 8a 49 20 4d 4f 56 20 72 30 | size.4.I MOV r0| 0000e7b0 2c 23 31 3a 4d 4f 56 20 72 30 2c 72 30 2c 4c 53 |,#1:MOV r0,r0,LS| 0000e7c0 4c 20 72 31 31 3a 53 54 52 20 72 30 2c 6c 7a 77 |L r11:STR r0,lzw| 0000e7d0 5f 6c 69 6d 69 74 3a 5c 20 32 5e 63 6f 64 65 73 |_limit:\ 2^codes| 0000e7e0 69 7a 65 20 6c 69 6d 69 74 20 63 6f 64 65 0d 34 |ize limit code.4| 0000e7f0 94 44 20 4c 44 52 20 72 30 2c 6c 7a 77 5f 72 6c |.D LDR r0,lzw_rl| 0000e800 69 6d 3a 41 44 44 20 72 36 2c 72 30 2c 23 32 3a |im:ADD r6,r0,#2:| 0000e810 5c 20 46 69 72 73 74 20 66 72 65 65 20 63 6f 64 |\ First free cod| 0000e820 65 20 3d 20 6c 69 6d 69 74 20 63 6f 64 65 20 2b |e = limit code +| 0000e830 20 32 0d 34 9e 20 20 4d 56 4e 20 72 38 2c 23 30 | 2.4. MVN r8,#0| 0000e840 3a 5c 20 4e 6f 20 6f 6c 64 20 63 6f 64 65 20 79 |:\ No old code y| 0000e850 65 74 0d 34 a8 19 20 4d 4f 56 53 20 70 63 2c 72 |et.4.. MOVS pc,r| 0000e860 31 34 3a 5c 20 52 65 74 75 72 6e 0d 34 b2 05 5c |14:\ Return.4..\| 0000e870 0d 34 bc 47 2e 6c 7a 77 5f 62 69 74 63 6f 70 79 |.4.G.lzw_bitcopy| 0000e880 20 5c 20 43 6f 70 69 65 73 20 72 32 20 62 69 74 | \ Copies r2 bit| 0000e890 73 20 66 72 6f 6d 20 62 69 74 20 61 64 64 72 65 |s from bit addre| 0000e8a0 73 73 20 72 30 20 74 6f 20 62 69 74 20 61 64 64 |ss r0 to bit add| 0000e8b0 72 65 73 73 20 72 31 0d 34 c6 3d 20 5c 20 4f 6e |ress r1.4.= \ On| 0000e8c0 20 65 78 69 74 20 2d 20 72 31 20 69 73 20 62 69 | exit - r1 is bi| 0000e8d0 74 20 61 64 64 72 65 73 73 20 6f 66 20 66 69 72 |t address of fir| 0000e8e0 73 74 20 62 69 74 20 61 66 74 65 72 20 62 69 74 |st bit after bit| 0000e8f0 63 6f 70 79 0d 34 d0 35 20 53 54 4d 46 44 20 72 |copy.4.5 STMFD r| 0000e900 31 33 21 2c 7b 72 33 2d 72 36 2c 72 31 34 7d 3a |13!,{r3-r6,r14}:| 0000e910 5c 20 53 61 76 65 20 72 65 67 69 73 74 65 72 73 |\ Save registers| 0000e920 20 61 6e 64 20 6c 69 6e 6b 0d 34 da 24 20 4d 4f | and link.4.$ MO| 0000e930 56 20 72 33 2c 72 30 2c 4c 53 52 23 33 3a 4d 4f |V r3,r0,LSR#3:MO| 0000e940 56 20 72 34 2c 72 31 2c 4c 53 52 23 33 0d 34 e4 |V r4,r1,LSR#3.4.| 0000e950 1a 20 80 20 72 30 2c 72 30 2c 23 37 3a 80 20 72 |. . r0,r0,#7:. r| 0000e960 35 2c 72 31 2c 23 37 0d 34 ee 2d 20 41 44 44 20 |5,r1,#7.4.- ADD | 0000e970 72 31 2c 72 31 2c 72 32 3a 5c 20 4e 65 77 20 62 |r1,r1,r2:\ New b| 0000e980 69 74 20 61 64 64 72 65 73 73 20 6f 66 20 6f 75 |it address of ou| 0000e990 74 70 75 74 0d 34 f8 4c 20 4c 44 52 42 20 72 31 |tput.4.L LDRB r1| 0000e9a0 34 2c 5b 72 34 5d 3a 4d 56 4e 20 72 36 2c 23 30 |4,[r4]:MVN r6,#0| 0000e9b0 3a 42 49 43 20 72 36 2c 72 31 34 2c 72 36 2c 4c |:BIC r6,r14,r6,L| 0000e9c0 53 4c 20 72 35 3a 5c 20 46 69 72 73 74 20 62 69 |SL r5:\ First bi| 0000e9d0 74 73 20 6f 66 20 6f 75 74 70 75 74 20 23 72 35 |ts of output #r5| 0000e9e0 0d 35 02 44 20 4c 44 52 42 20 72 31 34 2c 5b 72 |.5.D LDRB r14,[r| 0000e9f0 33 5d 2c 23 31 3a 4d 4f 56 20 72 31 34 2c 72 31 |3],#1:MOV r14,r1| 0000ea00 34 2c 4c 53 52 20 72 30 3a 5c 20 46 69 72 73 74 |4,LSR r0:\ First| 0000ea10 20 62 69 74 73 20 6f 66 20 69 6e 70 75 74 20 38 | bits of input 8| 0000ea20 2d 23 72 30 0d 35 0c 28 20 84 52 20 72 36 2c 72 |-#r0.5.( .R r6,r| 0000ea30 36 2c 72 31 34 2c 4c 53 4c 20 72 35 3a 5c 20 47 |6,r14,LSL r5:\ G| 0000ea40 6c 75 65 20 74 6f 67 65 74 68 65 72 0d 35 16 43 |lue together.5.C| 0000ea50 20 41 44 44 20 72 32 2c 72 32 2c 72 35 3a 5c 20 | ADD r2,r2,r5:\ | 0000ea60 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 |Total number of | 0000ea70 62 69 74 73 20 74 6f 20 63 6f 70 79 20 69 6e 63 |bits to copy inc| 0000ea80 6c 75 64 69 6e 67 20 6f 6c 64 20 62 69 74 73 0d |luding old bits.| 0000ea90 35 20 44 20 52 53 42 20 72 30 2c 72 30 2c 23 38 |5 D RSB r0,r0,#8| 0000eaa0 3a 41 44 44 20 72 35 2c 72 35 2c 72 30 3a 5c 20 |:ADD r5,r5,r0:\ | 0000eab0 53 68 69 66 74 20 66 61 63 74 6f 72 20 74 6f 20 |Shift factor to | 0000eac0 61 64 64 20 6e 65 78 74 20 65 69 67 68 74 20 62 |add next eight b| 0000ead0 69 74 73 0d 35 2a 43 2e 6c 7a 77 5f 62 69 74 6f |its.5*C.lzw_bito| 0000eae0 20 4c 44 52 42 20 72 31 34 2c 5b 72 33 5d 2c 23 | LDRB r14,[r3],#| 0000eaf0 31 3a 84 52 20 72 36 2c 72 36 2c 72 31 34 2c 4c |1:.R r6,r6,r14,L| 0000eb00 53 4c 20 72 35 3a 5c 20 43 6f 6e 73 74 72 75 63 |SL r5:\ Construc| 0000eb10 74 20 62 79 74 65 0d 35 34 4a 20 53 54 52 42 20 |t byte.54J STRB | 0000eb20 72 36 2c 5b 72 34 5d 2c 23 31 3a 4d 4f 56 20 72 |r6,[r4],#1:MOV r| 0000eb30 36 2c 72 36 2c 4c 53 52 23 38 3a 5c 20 57 72 69 |6,r6,LSR#8:\ Wri| 0000eb40 74 65 20 6f 75 74 70 75 74 20 61 6e 64 20 61 64 |te output and ad| 0000eb50 6a 75 73 74 20 61 63 63 75 6d 75 6d 61 74 6f 72 |just accumumator| 0000eb60 0d 35 3e 37 20 53 55 42 53 20 72 32 2c 72 32 2c |.5>7 SUBS r2,r2,| 0000eb70 23 38 3a 42 47 54 20 6c 7a 77 5f 62 69 74 6f 3a |#8:BGT lzw_bito:| 0000eb80 5c 20 55 6e 74 69 6c 20 61 6c 6c 20 62 69 74 73 |\ Until all bits| 0000eb90 20 6f 75 74 70 75 74 0d 35 48 24 20 4c 44 4d 46 | output.5H$ LDMF| 0000eba0 44 20 72 31 33 21 2c 7b 72 33 2d 72 36 2c 70 63 |D r13!,{r3-r6,pc| 0000ebb0 7d 5e 3a 5c 20 52 65 74 75 72 6e 0d 35 52 05 20 |}^:\ Return.5R. | 0000ebc0 0d 35 5c 4e 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b |.5\N;;;;;;;;;;;;| 0000ebd0 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b |;;;;;;;;;;;;;;;;| * 0000ec00 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 0d 35 |;;;;;;;;;;;;;;.5| 0000ec10 66 05 20 0d 35 70 23 5c 20 52 6f 75 74 69 6e 65 |f. .5p#\ Routine| 0000ec20 73 20 74 6f 20 6d 61 6b 65 20 73 65 76 65 72 61 |s to make severa| 0000ec30 6c 20 6d 61 70 73 0d 35 7a 05 20 0d 35 84 29 2e |l maps.5z. .5.).| 0000ec40 61 5f 63 6f 6c 6d 61 70 20 20 20 20 20 20 45 51 |a_colmap EQ| 0000ec50 55 44 20 30 3a 5c 20 4d 61 70 20 61 64 64 72 65 |UD 0:\ Map addre| 0000ec60 73 73 65 73 0d 35 8e 19 2e 61 5f 66 6c 69 70 6d |sses.5...a_flipm| 0000ec70 61 70 20 20 20 20 20 45 51 55 44 20 30 0d 35 98 |ap EQUD 0.5.| 0000ec80 19 2e 61 5f 72 67 62 32 32 6d 61 70 20 20 20 20 |..a_rgb22map | 0000ec90 45 51 55 44 20 30 0d 35 a2 19 2e 61 5f 74 6f 5f |EQUD 0.5...a_to_| 0000eca0 72 67 62 6d 61 70 20 20 20 45 51 55 44 20 30 0d |rgbmap EQUD 0.| 0000ecb0 35 ac 19 2e 61 5f 66 72 6f 6d 5f 72 67 62 6d 61 |5...a_from_rgbma| 0000ecc0 70 20 45 51 55 44 20 30 0d 35 b6 19 2e 61 5f 72 |p EQUD 0.5...a_r| 0000ecd0 6f 77 64 61 74 20 20 20 20 20 20 45 51 55 44 20 |owdat EQUD | 0000ece0 30 0d 35 c0 19 2e 61 5f 74 61 62 6c 65 20 20 20 |0.5...a_table | 0000ecf0 20 20 20 20 45 51 55 44 20 30 0d 35 ca 05 20 0d | EQUD 0.5.. .| 0000ed00 35 d4 2b 2e 6d 61 6b 65 5f 6d 61 70 73 20 5c 20 |5.+.make_maps \ | 0000ed10 53 65 74 73 20 75 70 20 6d 61 70 73 20 61 6e 64 |Sets up maps and| 0000ed20 20 61 64 64 72 65 73 73 65 73 0d 35 de 21 20 53 | addresses.5.! S| 0000ed30 54 4d 46 44 20 72 31 33 21 2c 7b 72 31 34 7d 3a |TMFD r13!,{r14}:| 0000ed40 5c 20 53 61 76 65 20 6c 69 6e 6b 0d 35 e8 21 20 |\ Save link.5.! | 0000ed50 42 4c 20 72 5f 63 6f 6c 6d 61 70 3a 53 54 52 20 |BL r_colmap:STR | 0000ed60 72 31 32 2c 61 5f 63 6f 6c 6d 61 70 0d 35 f2 23 |r12,a_colmap.5.#| 0000ed70 20 42 4c 20 72 5f 66 6c 69 70 6d 61 70 3a 53 54 | BL r_flipmap:ST| 0000ed80 52 20 72 31 32 2c 61 5f 66 6c 69 70 6d 61 70 0d |R r12,a_flipmap.| 0000ed90 35 fc 25 20 42 4c 20 72 5f 72 67 62 32 32 6d 61 |5.% BL r_rgb22ma| 0000eda0 70 3a 53 54 52 20 72 31 32 2c 61 5f 72 67 62 32 |p:STR r12,a_rgb2| 0000edb0 32 6d 61 70 0d 36 06 27 20 42 4c 20 72 5f 74 6f |2map.6.' BL r_to| 0000edc0 5f 72 67 62 6d 61 70 3a 53 54 52 20 72 31 32 2c |_rgbmap:STR r12,| 0000edd0 61 5f 74 6f 5f 72 67 62 6d 61 70 0d 36 10 2b 20 |a_to_rgbmap.6.+ | 0000ede0 42 4c 20 72 5f 66 72 6f 6d 5f 72 67 62 6d 61 70 |BL r_from_rgbmap| 0000edf0 3a 53 54 52 20 72 31 32 2c 61 5f 66 72 6f 6d 5f |:STR r12,a_from_| 0000ee00 72 67 62 6d 61 70 0d 36 1a 21 20 42 4c 20 72 5f |rgbmap.6.! BL r_| 0000ee10 72 6f 77 64 61 74 3a 53 54 52 20 72 31 32 2c 61 |rowdat:STR r12,a| 0000ee20 5f 72 6f 77 64 61 74 0d 36 24 1f 20 42 4c 20 72 |_rowdat.6$. BL r| 0000ee30 5f 74 61 62 6c 65 3a 53 54 52 20 72 31 32 2c 61 |_table:STR r12,a| 0000ee40 5f 74 61 62 6c 65 0d 36 2e 14 20 42 4c 20 6d 61 |_table.6.. BL ma| 0000ee50 6b 65 5f 66 6c 69 70 6d 61 70 0d 36 38 14 20 42 |ke_flipmap.68. B| 0000ee60 4c 20 6d 61 6b 65 5f 72 67 62 6d 61 70 73 0d 36 |L make_rgbmaps.6| 0000ee70 42 1e 20 4c 44 4d 46 44 20 72 31 33 21 2c 7b 70 |B. LDMFD r13!,{p| 0000ee80 63 7d 5e 3a 5c 20 52 65 74 75 72 6e 0d 36 4c 05 |c}^:\ Return.6L.| 0000ee90 20 0d 36 56 3b 2e 6d 61 6b 65 5f 72 67 62 6d 61 | .6V;.make_rgbma| 0000eea0 70 73 20 5c 20 53 65 74 73 20 75 70 20 32 35 36 |ps \ Sets up 256| 0000eeb0 20 63 6f 6c 6f 75 72 20 3c 2d 2d 2d 3e 20 34 30 | colour <---> 40| 0000eec0 39 36 20 26 52 47 42 20 6d 61 70 73 0d 36 60 22 |96 &RGB maps.6`"| 0000eed0 20 53 54 4d 46 44 20 72 31 33 21 2c 7b 72 31 34 | STMFD r13!,{r14| 0000eee0 7d 5e 3a 5c 20 53 61 76 65 20 6c 69 6e 6b 0d 36 |}^:\ Save link.6| 0000eef0 6a 16 20 42 4c 20 6d 61 6b 65 5f 74 6f 5f 72 67 |j. BL make_to_rg| 0000ef00 62 6d 61 70 0d 36 74 18 20 42 4c 20 6d 61 6b 65 |bmap.6t. BL make| 0000ef10 5f 66 72 6f 6d 5f 72 67 62 6d 61 70 0d 36 7e 15 |_from_rgbmap.6~.| 0000ef20 20 42 4c 20 6d 61 6b 65 5f 72 67 62 32 32 6d 61 | BL make_rgb22ma| 0000ef30 70 0d 36 88 1e 20 4c 44 4d 46 44 20 72 31 33 21 |p.6.. LDMFD r13!| 0000ef40 2c 7b 70 63 7d 5e 3a 5c 20 52 65 74 75 72 6e 0d |,{pc}^:\ Return.| 0000ef50 36 92 05 20 0d 36 9c 45 2e 6d 61 6b 65 5f 66 6c |6.. .6.E.make_fl| 0000ef60 69 70 6d 61 70 20 5c 20 4d 61 6b 65 73 20 69 6e |ipmap \ Makes in| 0000ef70 76 65 72 74 65 64 20 61 6e 64 20 72 65 76 65 72 |verted and rever| 0000ef80 73 65 64 20 62 69 74 20 6d 61 70 20 28 50 49 31 |sed bit map (PI1| 0000ef90 2f 50 49 33 2f 4d 41 43 29 0d 36 a6 35 20 53 54 |/PI3/MAC).6.5 ST| 0000efa0 4d 46 44 20 72 31 33 21 2c 7b 72 30 2d 72 34 2c |MFD r13!,{r0-r4,| 0000efb0 72 31 34 7d 3a 5c 20 53 61 76 65 20 72 65 67 69 |r14}:\ Save regi| 0000efc0 73 74 65 72 73 20 61 6e 64 20 6c 69 6e 6b 0d 36 |sters and link.6| 0000efd0 b0 43 20 4d 4f 56 20 72 30 2c 23 26 46 46 3a 4c |.C MOV r0,#&FF:L| 0000efe0 44 52 20 72 34 2c 61 5f 66 6c 69 70 6d 61 70 3a |DR r4,a_flipmap:| 0000eff0 5c 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 76 |\ Current byte v| 0000f000 61 6c 75 65 20 61 6e 64 20 6d 61 70 20 62 61 73 |alue and map bas| 0000f010 65 0d 36 ba 2a 2e 6d 66 5f 62 79 74 65 20 4d 4f |e.6.*.mf_byte MO| 0000f020 56 20 72 33 2c 72 30 3a 4d 4f 56 20 72 32 2c 23 |V r3,r0:MOV r2,#| 0000f030 38 3a 4d 4f 56 20 72 31 2c 23 30 0d 36 c4 4e 2e |8:MOV r1,#0.6.N.| 0000f040 6d 66 5f 66 6c 69 70 20 4d 4f 56 53 20 72 33 2c |mf_flip MOVS r3,| 0000f050 72 33 2c 4c 53 52 23 31 3a 41 44 43 20 72 31 2c |r3,LSR#1:ADC r1,| 0000f060 72 31 2c 72 31 3a 53 55 42 53 20 72 32 2c 72 32 |r1,r1:SUBS r2,r2| 0000f070 2c 23 31 3a 42 4e 45 20 6d 66 5f 66 6c 69 70 3a |,#1:BNE mf_flip:| 0000f080 5c 20 52 65 76 65 72 73 65 0d 36 ce 4c 20 82 20 |\ Reverse.6.L . | 0000f090 72 31 2c 72 31 2c 23 26 46 46 3a 53 54 52 42 20 |r1,r1,#&FF:STRB | 0000f0a0 72 31 2c 5b 72 34 2c 72 30 5d 3a 53 55 42 53 20 |r1,[r4,r0]:SUBS | 0000f0b0 72 30 2c 72 30 2c 23 31 3a 42 50 4c 20 6d 66 5f |r0,r0,#1:BPL mf_| 0000f0c0 62 79 74 65 3a 5c 20 53 74 6f 72 65 20 61 6e 64 |byte:\ Store and| 0000f0d0 20 6e 65 78 74 0d 36 d8 24 20 4c 44 4d 46 44 20 | next.6.$ LDMFD | 0000f0e0 72 31 33 21 2c 7b 72 30 2d 72 34 2c 70 63 7d 5e |r13!,{r0-r4,pc}^| 0000f0f0 3a 5c 20 52 65 74 75 72 6e 0d 36 e2 05 20 0d 36 |:\ Return.6.. .6| 0000f100 ec 4d 2e 6d 61 6b 65 5f 74 6f 5f 72 67 62 6d 61 |.M.make_to_rgbma| 0000f110 70 20 5c 20 4d 61 6b 65 73 20 32 35 36 78 34 20 |p \ Makes 256x4 | 0000f120 65 6e 74 72 79 20 6d 61 70 20 66 72 6f 6d 20 73 |entry map from s| 0000f130 74 61 6e 64 61 72 64 20 32 35 36 20 6c 6f 67 69 |tandard 256 logi| 0000f140 63 61 6c 20 63 6f 6c 6f 75 72 73 0d 36 f6 4d 20 |cal colours.6.M | 0000f150 5c 20 74 6f 20 74 68 65 69 72 20 26 52 47 42 20 |\ to their &RGB | 0000f160 28 31 32 2d 62 69 74 73 29 20 76 61 6c 75 65 20 |(12-bits) value | 0000f170 28 30 2d 34 30 39 35 29 20 69 6e 20 74 68 65 20 |(0-4095) in the | 0000f180 73 74 61 6e 64 61 72 64 20 70 61 6c 65 74 74 65 |standard palette| 0000f190 20 6d 61 70 70 69 6e 67 0d 37 00 21 20 53 54 4d | mapping.7.! STM| 0000f1a0 46 44 20 72 31 33 21 2c 7b 72 31 34 7d 3a 5c 20 |FD r13!,{r14}:\ | 0000f1b0 53 61 76 65 20 6c 69 6e 6b 0d 37 0a 34 20 4c 44 |Save link.7.4 LD| 0000f1c0 52 20 72 39 2c 61 5f 74 6f 5f 72 67 62 6d 61 70 |R r9,a_to_rgbmap| 0000f1d0 3a 5c 20 41 64 64 72 65 73 73 20 6f 66 20 32 35 |:\ Address of 25| 0000f1e0 36 2d 74 6f 2d 34 30 39 36 20 6d 61 70 0d 37 14 |6-to-4096 map.7.| 0000f1f0 4c 20 4d 4f 56 20 72 30 2c 23 30 3a 4d 4f 56 20 |L MOV r0,#0:MOV | 0000f200 72 31 2c 23 31 36 3a 5c 20 43 75 72 72 65 6e 74 |r1,#16:\ Current| 0000f210 20 6c 6f 67 69 63 61 6c 20 63 6f 6c 6f 75 72 20 | logical colour | 0000f220 76 61 6c 75 65 2c 20 72 65 61 64 20 6e 6f 72 6d |value, read norm| 0000f230 61 6c 20 63 6f 6c 6f 75 72 0d 37 1e 3c 2e 6d 74 |al colour.7.<.mt| 0000f240 5f 72 65 61 64 70 61 6c 20 5c 20 44 65 74 65 72 |_readpal \ Deter| 0000f250 6d 69 6e 65 20 52 2c 47 2c 42 20 66 72 6f 6d 20 |mine R,G,B from | 0000f260 6c 6f 67 69 63 61 6c 20 63 6f 6c 6f 75 72 20 6e |logical colour n| 0000f270 75 6d 62 65 72 0d 37 28 35 20 4d 4f 56 20 72 32 |umber.7(5 MOV r2| 0000f280 2c 23 30 3a 4d 4f 56 20 72 33 2c 23 30 3a 4d 4f |,#0:MOV r3,#0:MO| 0000f290 56 20 72 34 2c 23 30 3a 5c 20 52 2c 47 2c 42 20 |V r4,#0:\ R,G,B | 0000f2a0 63 6f 6d 70 6f 6e 65 6e 74 73 0d 37 32 2e 20 54 |components.72. T| 0000f2b0 53 54 20 72 30 2c 23 31 3c 3c 37 3a 84 52 4e 45 |ST r0,#1<<7:.RNE| 0000f2c0 20 72 34 2c 72 34 2c 23 38 3a 5c 20 54 6f 70 20 | r4,r4,#8:\ Top | 0000f2d0 62 69 74 20 42 4c 55 45 0d 37 3c 2f 20 54 53 54 |bit BLUE.7</ TST| 0000f2e0 20 72 30 2c 23 31 3c 3c 36 3a 84 52 4e 45 20 72 | r0,#1<<6:.RNE r| 0000f2f0 33 2c 72 33 2c 23 38 3a 5c 20 54 6f 70 20 62 69 |3,r3,#8:\ Top bi| 0000f300 74 20 47 52 45 45 4e 0d 37 46 32 20 54 53 54 20 |t GREEN.7F2 TST | 0000f310 72 30 2c 23 31 3c 3c 35 3a 84 52 4e 45 20 72 33 |r0,#1<<5:.RNE r3| 0000f320 2c 72 33 2c 23 34 3a 5c 20 53 65 63 6f 6e 64 20 |,r3,#4:\ Second | 0000f330 62 69 74 20 47 52 45 45 4e 0d 37 50 2d 20 54 53 |bit GREEN.7P- TS| 0000f340 54 20 72 30 2c 23 31 3c 3c 34 3a 84 52 4e 45 20 |T r0,#1<<4:.RNE | 0000f350 72 32 2c 72 32 2c 23 38 3a 5c 20 54 6f 70 20 62 |r2,r2,#8:\ Top b| 0000f360 69 74 20 52 45 44 0d 37 5a 31 20 54 53 54 20 72 |it RED.7Z1 TST r| 0000f370 30 2c 23 31 3c 3c 33 3a 84 52 4e 45 20 72 34 2c |0,#1<<3:.RNE r4,| 0000f380 72 34 2c 23 34 3a 5c 20 53 65 63 6f 6e 64 20 62 |r4,#4:\ Second b| 0000f390 69 74 20 42 4c 55 45 0d 37 64 30 20 54 53 54 20 |it BLUE.7d0 TST | 0000f3a0 72 30 2c 23 31 3c 3c 32 3a 84 52 4e 45 20 72 32 |r0,#1<<2:.RNE r2| 0000f3b0 2c 72 32 2c 23 34 3a 5c 20 53 65 63 6f 6e 64 20 |,r2,#4:\ Second | 0000f3c0 62 69 74 20 52 45 44 0d 37 6e 44 20 54 53 54 20 |bit RED.7nD TST | 0000f3d0 72 30 2c 23 31 3c 3c 31 3a 84 52 4e 45 20 72 32 |r0,#1<<1:.RNE r2| 0000f3e0 2c 72 32 2c 23 32 3a 84 52 4e 45 20 72 33 2c 72 |,r2,#2:.RNE r3,r| 0000f3f0 33 2c 23 32 3a 84 52 4e 45 20 72 34 2c 72 34 2c |3,#2:.RNE r4,r4,| 0000f400 23 32 3a 5c 20 54 6f 70 20 c8 9c 0d 37 78 47 20 |#2:\ Top ...7xG | 0000f410 54 53 54 20 72 30 2c 23 31 3c 3c 30 3a 84 52 4e |TST r0,#1<<0:.RN| 0000f420 45 20 72 32 2c 72 32 2c 23 31 3a 84 52 4e 45 20 |E r2,r2,#1:.RNE | 0000f430 72 33 2c 72 33 2c 23 31 3a 84 52 4e 45 20 72 34 |r3,r3,#1:.RNE r4| 0000f440 2c 72 34 2c 23 31 3a 5c 20 53 65 63 6f 6e 64 20 |,r4,#1:\ Second | 0000f450 c8 9c 0d 37 82 35 20 84 52 20 72 37 2c 72 34 2c |...7.5 .R r7,r4,| 0000f460 72 33 2c 4c 53 4c 23 34 3a 84 52 20 72 37 2c 72 |r3,LSL#4:.R r7,r| 0000f470 37 2c 72 32 2c 4c 53 4c 23 38 3a 5c 20 42 75 69 |7,r2,LSL#8:\ Bui| 0000f480 6c 64 20 26 52 47 42 0d 37 8c 2b 20 53 54 52 20 |ld &RGB.7.+ STR | 0000f490 72 37 2c 5b 72 39 2c 72 30 2c 4c 53 4c 23 32 5d |r7,[r9,r0,LSL#2]| 0000f4a0 3a 5c 20 57 72 69 74 65 20 6d 61 70 20 65 6e 74 |:\ Write map ent| 0000f4b0 72 79 0d 37 96 43 20 41 44 44 20 72 30 2c 72 30 |ry.7.C ADD r0,r0| 0000f4c0 2c 23 31 3a 43 4d 50 20 72 30 2c 23 26 31 30 30 |,#1:CMP r0,#&100| 0000f4d0 3a 42 4c 54 20 6d 74 5f 72 65 61 64 70 61 6c 3a |:BLT mt_readpal:| 0000f4e0 5c 20 4e 65 78 74 20 6c 6f 67 69 63 61 6c 20 63 |\ Next logical c| 0000f4f0 6f 6c 6f 75 72 0d 37 a0 1e 20 4c 44 4d 46 44 20 |olour.7.. LDMFD | 0000f500 72 31 33 21 2c 7b 70 63 7d 5e 3a 5c 20 52 65 74 |r13!,{pc}^:\ Ret| 0000f510 75 72 6e 0d 37 aa 05 20 0d 37 b4 4d 2e 6d 61 6b |urn.7.. .7.M.mak| 0000f520 65 5f 66 72 6f 6d 5f 72 67 62 6d 61 70 20 5c 20 |e_from_rgbmap \ | 0000f530 4d 61 6b 65 73 20 34 30 39 36 78 31 20 65 6e 74 |Makes 4096x1 ent| 0000f540 72 79 20 6d 61 70 20 66 72 6f 6d 20 34 30 39 36 |ry map from 4096| 0000f550 20 26 52 47 42 20 28 31 32 2d 62 69 74 73 29 20 | &RGB (12-bits) | 0000f560 76 61 6c 75 65 0d 37 be 4b 20 5c 20 74 6f 20 63 |value.7.K \ to c| 0000f570 6c 6f 73 65 73 74 20 32 35 36 2d 63 6f 6c 6f 75 |losest 256-colou| 0000f580 72 20 6d 6f 64 65 20 6c 6f 67 69 63 61 6c 20 63 |r mode logical c| 0000f590 6f 6c 6f 75 72 20 72 65 70 72 65 73 65 6e 74 69 |olour representi| 0000f5a0 6e 67 20 74 68 65 20 52 47 42 20 76 61 6c 75 65 |ng the RGB value| 0000f5b0 0d 37 c8 21 20 53 54 4d 46 44 20 72 31 33 21 2c |.7.! STMFD r13!,| 0000f5c0 7b 72 31 34 7d 3a 5c 20 53 61 76 65 20 6c 69 6e |{r14}:\ Save lin| 0000f5d0 6b 0d 37 d2 37 20 4c 44 52 20 72 31 32 2c 61 5f |k.7.7 LDR r12,a_| 0000f5e0 66 72 6f 6d 5f 72 67 62 6d 61 70 3a 5c 20 41 64 |from_rgbmap:\ Ad| 0000f5f0 64 72 65 73 73 20 6f 66 20 34 30 39 36 2d 74 6f |dress of 4096-to| 0000f600 2d 32 35 36 20 6d 61 70 0d 37 dc 35 20 4c 44 52 |-256 map.7.5 LDR| 0000f610 20 72 31 31 2c 61 5f 74 6f 5f 72 67 62 6d 61 70 | r11,a_to_rgbmap| 0000f620 3a 5c 20 41 64 64 72 65 73 73 20 6f 66 20 32 35 |:\ Address of 25| 0000f630 36 2d 74 6f 2d 34 30 39 36 20 6d 61 70 0d 37 e6 |6-to-4096 map.7.| 0000f640 23 20 4d 4f 56 20 72 30 2c 23 30 3a 5c 20 43 75 |# MOV r0,#0:\ Cu| 0000f650 72 72 65 6e 74 20 26 52 47 42 20 76 61 6c 75 65 |rrent &RGB value| 0000f660 0d 37 f0 38 2e 6d 66 5f 63 6c 6f 73 65 73 74 20 |.7.8.mf_closest | 0000f670 5c 20 43 61 6c 63 75 6c 61 74 65 20 63 6c 6f 73 |\ Calculate clos| 0000f680 65 73 74 20 63 6f 6c 6f 75 72 20 76 61 6c 75 65 |est colour value| 0000f690 20 66 6f 72 20 52 47 42 0d 37 fa 43 20 4d 4f 56 | for RGB.7.C MOV| 0000f6a0 20 72 31 30 2c 72 30 2c 4c 53 52 23 31 3a 80 20 | r10,r0,LSR#1:. | 0000f6b0 72 31 30 2c 72 31 30 2c 23 26 36 30 3a 54 53 54 |r10,r10,#&60:TST| 0000f6c0 20 72 30 2c 23 31 3c 3c 33 3a 84 52 4e 45 20 72 | r0,#1<<3:.RNE r| 0000f6d0 31 30 2c 72 31 30 2c 23 26 38 30 0d 38 04 45 20 |10,r10,#&80.8.E | 0000f6e0 54 53 54 20 72 30 2c 23 31 3c 3c 31 31 3a 84 52 |TST r0,#1<<11:.R| 0000f6f0 4e 45 20 72 31 30 2c 72 31 30 2c 23 26 31 30 3a |NE r10,r10,#&10:| 0000f700 5c 20 48 61 72 64 77 61 72 65 20 64 65 74 65 72 |\ Hardware deter| 0000f710 6d 69 6e 65 64 20 74 6f 70 20 34 20 62 69 74 73 |mined top 4 bits| 0000f720 0d 38 0e 47 20 4d 4f 56 20 72 31 2c 72 30 2c 4c |.8.G MOV r1,r0,L| 0000f730 53 52 23 38 3a 4d 4f 56 20 72 32 2c 72 30 2c 4c |SR#8:MOV r2,r0,L| 0000f740 53 52 23 34 3a 80 20 72 32 2c 72 32 2c 23 31 35 |SR#4:. r2,r2,#15| 0000f750 3a 80 20 72 33 2c 72 30 2c 23 31 35 5c 20 47 65 |:. r3,r0,#15\ Ge| 0000f760 74 20 52 2c 47 2c 42 0d 38 18 47 20 4d 4f 56 20 |t R,G,B.8.G MOV | 0000f770 72 37 2c 23 30 3a 4d 4f 56 20 72 38 2c 23 30 3a |r7,#0:MOV r8,#0:| 0000f780 4d 4f 56 20 72 39 2c 23 31 3c 3c 33 30 3a 5c 20 |MOV r9,#1<<30:\ | 0000f790 43 6f 75 6e 74 65 72 2c 20 27 63 6c 6f 73 65 73 |Counter, 'closes| 0000f7a0 74 27 20 69 6e 64 65 78 2f 76 61 6c 75 65 0d 38 |t' index/value.8| 0000f7b0 22 3a 2e 6d 66 5f 64 69 73 74 61 6e 63 65 20 5c |":.mf_distance \| 0000f7c0 20 43 61 6c 63 75 6c 61 74 65 20 64 69 73 74 61 | Calculate dista| 0000f7d0 6e 63 65 20 6f 66 20 74 61 72 67 65 74 20 74 6f |nce of target to| 0000f7e0 20 70 61 6c 65 74 74 65 0d 38 2c 4c 20 84 52 20 | palette.8,L .R | 0000f7f0 72 36 2c 72 31 30 2c 72 37 3a 4c 44 52 20 72 36 |r6,r10,r7:LDR r6| 0000f800 2c 5b 72 31 31 2c 72 36 2c 4c 53 4c 23 32 5d 3a |,[r11,r6,LSL#2]:| 0000f810 5c 20 26 52 47 42 20 76 61 6c 75 65 20 6f 66 20 |\ &RGB value of | 0000f820 63 75 72 72 65 6e 74 20 63 6f 6c 6f 75 72 20 76 |current colour v| 0000f830 61 6c 75 65 0d 38 36 48 20 4d 4f 56 20 72 34 2c |alue.86H MOV r4,| 0000f840 72 36 2c 4c 53 52 23 38 3a 4d 4f 56 20 72 35 2c |r6,LSR#8:MOV r5,| 0000f850 72 36 2c 4c 53 52 23 34 3a 80 20 72 35 2c 72 35 |r6,LSR#4:. r5,r5| 0000f860 2c 23 31 35 3a 80 20 72 36 2c 72 36 2c 23 31 35 |,#15:. r6,r6,#15| 0000f870 3a 5c 20 47 65 74 20 52 2c 47 2c 42 0d 38 40 3e |:\ Get R,G,B.8@>| 0000f880 20 53 55 42 53 20 72 34 2c 72 34 2c 72 31 3a 52 | SUBS r4,r4,r1:R| 0000f890 53 42 43 43 20 72 34 2c 72 34 2c 23 30 3a 53 55 |SBCC r4,r4,#0:SU| 0000f8a0 42 53 20 72 35 2c 72 35 2c 72 32 3a 52 53 42 43 |BS r5,r5,r2:RSBC| 0000f8b0 43 20 72 35 2c 72 35 2c 23 30 0d 38 4a 3c 20 53 |C r5,r5,#0.8J< S| 0000f8c0 55 42 53 20 72 36 2c 72 36 2c 72 33 3a 52 53 42 |UBS r6,r6,r3:RSB| 0000f8d0 43 43 20 72 36 2c 72 36 2c 23 30 3a 5c 20 44 69 |CC r6,r6,#0:\ Di| 0000f8e0 66 66 65 72 65 6e 63 65 20 28 52 2d 52 2c 47 2d |fference (R-R,G-| 0000f8f0 47 2c 42 2d 42 29 0d 38 54 3d 20 4d 4f 56 20 72 |G,B-B).8T= MOV r| 0000f900 34 2c 72 34 2c 4c 53 4c 23 31 3a 41 44 44 20 72 |4,r4,LSL#1:ADD r| 0000f910 35 2c 72 35 2c 72 35 2c 4c 53 4c 23 31 3a 5c 20 |5,r5,r5,LSL#1:\ | 0000f920 52 2a 32 2c 47 2a 33 2c 42 2a 31 20 77 65 69 67 |R*2,G*3,B*1 weig| 0000f930 68 74 73 0d 38 5e 4d 20 4d 55 4c 20 72 31 34 2c |hts.8^M MUL r14,| 0000f940 72 34 2c 72 34 3a 4d 4c 41 20 72 31 34 2c 72 35 |r4,r4:MLA r14,r5| 0000f950 2c 72 35 2c 72 31 34 3a 4d 4c 41 20 72 31 34 2c |,r5,r14:MLA r14,| 0000f960 72 36 2c 72 36 2c 72 31 34 3a 5c 20 53 71 75 61 |r6,r6,r14:\ Squa| 0000f970 72 65 20 61 6e 64 20 61 64 64 20 64 69 66 66 73 |re and add diffs| 0000f980 0d 38 68 41 20 43 4d 50 20 72 31 34 2c 72 39 3a |.8hA CMP r14,r9:| 0000f990 4d 4f 56 4c 54 20 72 39 2c 72 31 34 3a 4d 4f 56 |MOVLT r9,r14:MOV| 0000f9a0 4c 54 20 72 38 2c 72 37 3a 5c 20 49 66 20 6c 65 |LT r8,r7:\ If le| 0000f9b0 73 73 2c 20 74 68 65 6e 20 72 65 67 69 73 74 65 |ss, then registe| 0000f9c0 72 0d 38 72 41 20 41 44 44 20 72 37 2c 72 37 2c |r.8rA ADD r7,r7,| 0000f9d0 23 31 3a 43 4d 50 20 72 37 2c 23 31 36 3a 42 4c |#1:CMP r7,#16:BL| 0000f9e0 54 20 6d 66 5f 64 69 73 74 61 6e 63 65 3a 5c 20 |T mf_distance:\ | 0000f9f0 4e 65 78 74 20 70 61 6c 65 74 74 65 20 65 6e 74 |Next palette ent| 0000fa00 72 79 0d 38 7c 44 20 84 52 20 72 31 2c 72 31 30 |ry.8|D .R r1,r10| 0000fa10 2c 72 38 3a 53 54 52 42 20 72 31 2c 5b 72 31 32 |,r8:STRB r1,[r12| 0000fa20 5d 2c 23 31 3a 5c 20 43 61 6c 63 75 6c 61 74 65 |],#1:\ Calculate| 0000fa30 20 70 69 78 65 6c 20 76 61 6c 75 65 20 61 6e 64 | pixel value and| 0000fa40 20 73 74 6f 72 65 0d 38 86 3f 20 41 44 44 20 72 | store.8.? ADD r| 0000fa50 30 2c 72 30 2c 23 31 3a 43 4d 50 20 72 30 2c 23 |0,r0,#1:CMP r0,#| 0000fa60 26 31 30 30 30 3a 42 4c 54 20 6d 66 5f 63 6c 6f |&1000:BLT mf_clo| 0000fa70 73 65 73 74 3a 5c 20 4e 65 78 74 20 52 47 42 20 |sest:\ Next RGB | 0000fa80 76 61 6c 75 65 0d 38 90 1e 20 4c 44 4d 46 44 20 |value.8.. LDMFD | 0000fa90 72 31 33 21 2c 7b 70 63 7d 5e 3a 5c 20 52 65 74 |r13!,{pc}^:\ Ret| 0000faa0 75 72 6e 0d 38 9a 05 20 0d 38 a4 4d 2e 6d 61 6b |urn.8.. .8.M.mak| 0000fab0 65 5f 72 67 62 32 32 6d 61 70 20 5c 20 4d 61 6b |e_rgb22map \ Mak| 0000fac0 65 73 20 34 30 39 36 20 63 6f 6c 6f 75 72 20 52 |es 4096 colour R| 0000fad0 47 42 20 76 61 6c 75 65 20 3c 2d 2d 2d 3e 20 32 |GB value <---> 2| 0000fae0 2d 70 69 78 65 6c 20 62 79 74 65 20 76 61 6c 75 |-pixel byte valu| 0000faf0 65 20 6d 61 70 0d 38 ae 48 20 5c 20 50 65 72 20 |e map.8.H \ Per | 0000fb00 32 20 62 79 74 65 73 2c 20 66 69 72 73 74 20 69 |2 bytes, first i| 0000fb10 73 20 63 6c 6f 73 65 73 74 20 61 70 70 72 6f 78 |s closest approx| 0000fb20 69 6d 61 74 69 6f 6e 2c 20 73 65 63 6f 6e 64 20 |imation, second | 0000fb30 27 72 65 73 74 27 20 61 70 70 72 6f 78 0d 38 b8 |'rest' approx.8.| 0000fb40 21 20 53 54 4d 46 44 20 72 31 33 21 2c 7b 72 31 |! STMFD r13!,{r1| 0000fb50 34 7d 3a 5c 20 53 61 76 65 20 6c 69 6e 6b 0d 38 |4}:\ Save link.8| 0000fb60 c2 44 20 4c 44 52 20 72 31 30 2c 61 5f 74 6f 5f |.D LDR r10,a_to_| 0000fb70 72 67 62 6d 61 70 3a 4c 44 52 20 72 31 31 2c 61 |rgbmap:LDR r11,a| 0000fb80 5f 66 72 6f 6d 5f 72 67 62 6d 61 70 3a 5c 20 32 |_from_rgbmap:\ 2| 0000fb90 35 36 20 3c 2d 2d 2d 3e 20 34 30 39 36 20 6d 61 |56 <---> 4096 ma| 0000fba0 70 73 0d 38 cc 49 20 4c 44 52 20 72 37 2c 61 5f |ps.8.I LDR r7,a_| 0000fbb0 72 67 62 32 32 6d 61 70 3a 4d 4f 56 20 72 30 2c |rgb22map:MOV r0,| 0000fbc0 23 30 3a 5c 20 42 61 73 65 20 6f 66 20 6d 61 70 |#0:\ Base of map| 0000fbd0 20 61 6e 64 20 66 69 72 73 74 20 31 32 2d 62 69 | and first 12-bi| 0000fbe0 74 20 52 47 42 20 76 61 6c 75 65 0d 38 d6 43 2e |t RGB value.8.C.| 0000fbf0 6d 72 5f 72 67 62 32 32 20 5c 20 43 61 6c 63 75 |mr_rgb22 \ Calcu| 0000fc00 6c 61 74 65 20 6c 65 66 74 20 61 6e 64 20 72 69 |late left and ri| 0000fc10 67 68 74 20 70 69 78 65 6c 20 76 61 6c 75 65 20 |ght pixel value | 0000fc20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 73 0d 38 |approximations.8| 0000fc30 e0 37 20 4c 44 52 42 20 72 38 2c 5b 72 31 31 2c |.7 LDRB r8,[r11,| 0000fc40 72 30 5d 3a 5c 20 46 69 72 73 74 20 70 69 78 65 |r0]:\ First pixe| 0000fc50 6c 27 73 20 52 47 42 20 61 70 70 72 6f 78 69 6d |l's RGB approxim| 0000fc60 61 74 69 6f 6e 0d 38 ea 38 20 4c 44 52 20 72 39 |ation.8.8 LDR r9| 0000fc70 2c 5b 72 31 30 2c 72 38 2c 4c 53 4c 23 32 5d 3a |,[r10,r8,LSL#2]:| 0000fc80 5c 20 52 47 42 20 6f 66 20 66 69 72 73 74 20 70 |\ RGB of first p| 0000fc90 69 78 65 6c 27 73 20 63 6f 6c 6f 75 72 0d 38 f4 |ixel's colour.8.| 0000fca0 49 20 5c 20 55 6e 70 61 63 6b 20 52 47 42 20 66 |I \ Unpack RGB f| 0000fcb0 72 6f 6d 20 65 78 61 63 74 20 52 47 42 2c 20 75 |rom exact RGB, u| 0000fcc0 6e 70 61 63 6b 20 61 70 70 72 6f 78 69 6d 61 74 |npack approximat| 0000fcd0 65 64 20 52 47 42 20 6f 66 20 66 69 72 73 74 20 |ed RGB of first | 0000fce0 63 6f 6c 6f 75 72 0d 38 fe 3c 20 4d 4f 56 20 72 |colour.8.< MOV r| 0000fcf0 31 2c 72 30 2c 4c 53 52 23 38 3a 4d 4f 56 20 72 |1,r0,LSR#8:MOV r| 0000fd00 32 2c 72 30 2c 4c 53 52 23 34 3a 80 20 72 32 2c |2,r0,LSR#4:. r2,| 0000fd10 72 32 2c 23 31 35 3a 80 20 72 33 2c 72 30 2c 23 |r2,#15:. r3,r0,#| 0000fd20 31 35 0d 39 08 3c 20 4d 4f 56 20 72 34 2c 72 39 |15.9.< MOV r4,r9| 0000fd30 2c 4c 53 52 23 38 3a 4d 4f 56 20 72 35 2c 72 39 |,LSR#8:MOV r5,r9| 0000fd40 2c 4c 53 52 23 34 3a 80 20 72 35 2c 72 35 2c 23 |,LSR#4:. r5,r5,#| 0000fd50 31 35 3a 80 20 72 36 2c 72 39 2c 23 31 35 0d 39 |15:. r6,r9,#15.9| 0000fd60 12 49 20 5c 20 43 61 6c 63 75 6c 61 74 65 20 28 |.I \ Calculate (| 0000fd70 32 2a 74 61 72 67 65 74 52 47 42 29 2d 28 52 47 |2*targetRGB)-(RG| 0000fd80 42 20 6f 66 20 66 69 72 73 74 20 70 69 78 65 6c |B of first pixel| 0000fd90 29 20 3d 20 52 47 42 20 6f 66 20 73 65 63 6f 6e |) = RGB of secon| 0000fda0 64 20 70 69 78 65 6c 0d 39 1c 3c 20 52 53 42 53 |d pixel.9.< RSBS| 0000fdb0 20 72 31 2c 72 34 2c 72 31 2c 4c 53 4c 23 31 3a | r1,r4,r1,LSL#1:| 0000fdc0 4d 4f 56 43 43 20 72 31 2c 23 30 3a 43 4d 50 20 |MOVCC r1,#0:CMP | 0000fdd0 72 31 2c 23 31 35 3a 4d 4f 56 47 54 20 72 31 2c |r1,#15:MOVGT r1,| 0000fde0 23 31 35 0d 39 26 3c 20 52 53 42 53 20 72 32 2c |#15.9&< RSBS r2,| 0000fdf0 72 35 2c 72 32 2c 4c 53 4c 23 31 3a 4d 4f 56 43 |r5,r2,LSL#1:MOVC| 0000fe00 43 20 72 32 2c 23 30 3a 43 4d 50 20 72 32 2c 23 |C r2,#0:CMP r2,#| 0000fe10 31 35 3a 4d 4f 56 47 54 20 72 32 2c 23 31 35 0d |15:MOVGT r2,#15.| 0000fe20 39 30 3c 20 52 53 42 53 20 72 33 2c 72 36 2c 72 |90< RSBS r3,r6,r| 0000fe30 33 2c 4c 53 4c 23 31 3a 4d 4f 56 43 43 20 72 33 |3,LSL#1:MOVCC r3| 0000fe40 2c 23 30 3a 43 4d 50 20 72 33 2c 23 31 35 3a 4d |,#0:CMP r3,#15:M| 0000fe50 4f 56 47 54 20 72 33 2c 23 31 35 0d 39 3a 3f 20 |OVGT r3,#15.9:? | 0000fe60 4d 4f 56 20 72 31 2c 72 31 2c 4c 53 4c 23 38 3a |MOV r1,r1,LSL#8:| 0000fe70 84 52 20 72 31 2c 72 31 2c 72 32 2c 4c 53 4c 23 |.R r1,r1,r2,LSL#| 0000fe80 34 3a 84 52 20 72 31 2c 72 31 2c 72 33 3a 5c 20 |4:.R r1,r1,r3:\ | 0000fe90 26 52 47 42 20 76 61 6c 75 65 0d 39 44 38 20 4c |&RGB value.9D8 L| 0000fea0 44 52 42 20 72 39 2c 5b 72 31 31 2c 72 31 5d 3a |DRB r9,[r11,r1]:| 0000feb0 5c 20 53 65 63 6f 6e 64 20 70 69 78 65 6c 27 73 |\ Second pixel's| 0000fec0 20 52 47 42 20 61 70 70 72 6f 78 69 6d 61 74 69 | RGB approximati| 0000fed0 6f 6e 0d 39 4e 2e 20 53 54 52 42 20 72 38 2c 5b |on.9N. STRB r8,[| 0000fee0 72 37 5d 2c 23 31 3a 5c 20 53 74 6f 72 65 20 66 |r7],#1:\ Store f| 0000fef0 69 72 73 74 20 70 69 78 65 6c 20 76 61 6c 75 65 |irst pixel value| 0000ff00 0d 39 58 2f 20 53 54 52 42 20 72 39 2c 5b 72 37 |.9X/ STRB r9,[r7| 0000ff10 5d 2c 23 31 3a 5c 20 53 74 6f 72 65 20 73 65 63 |],#1:\ Store sec| 0000ff20 6f 6e 64 20 70 69 78 65 6c 20 76 61 6c 75 65 0d |ond pixel value.| 0000ff30 39 62 3d 20 41 44 44 20 72 30 2c 72 30 2c 23 31 |9b= ADD r0,r0,#1| 0000ff40 3a 43 4d 50 20 72 30 2c 23 26 31 30 30 30 3a 42 |:CMP r0,#&1000:B| 0000ff50 4c 54 20 6d 72 5f 72 67 62 32 32 3a 5c 20 4e 65 |LT mr_rgb22:\ Ne| 0000ff60 78 74 20 52 47 42 20 76 61 6c 75 65 0d 39 6c 1e |xt RGB value.9l.| 0000ff70 20 4c 44 4d 46 44 20 72 31 33 21 2c 7b 70 63 7d | LDMFD r13!,{pc}| 0000ff80 5e 3a 5c 20 52 65 74 75 72 6e 0d 39 76 05 20 0d |^:\ Return.9v. .| 0000ff90 39 80 0f 5c 20 4d 61 70 20 73 70 61 63 65 0d 39 |9..\ Map space.9| 0000ffa0 8a 05 20 0d 39 94 40 2e 72 5f 72 67 62 32 32 6d |.. .9.@.r_rgb22m| 0000ffb0 61 70 20 41 44 52 20 72 31 32 2c 72 67 62 32 32 |ap ADR r12,rgb22| 0000ffc0 6d 61 70 3a 4d 4f 56 20 70 63 2c 72 31 34 3a 5c |map:MOV pc,r14:\| 0000ffd0 20 52 65 74 75 72 6e 20 6d 61 70 20 61 64 64 72 | Return map addr| 0000ffe0 65 73 73 0d 39 9e 4c 2e 72 67 62 32 32 6d 61 70 |ess.9.L.rgb22map| 0000fff0 20 5d 3a 50 25 2b 3d 34 30 39 36 2a 32 3a 5b 4f | ]:P%+=4096*2:[O| 00010000 50 54 4e 20 5c 20 34 30 39 36 20 26 52 47 42 20 |PTN \ 4096 &RGB | 00010010 74 6f 20 32 20 70 69 78 65 6c 20 76 61 6c 75 65 |to 2 pixel value| 00010020 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 73 0d | approximations.| 00010030 39 a8 42 2e 72 5f 74 6f 5f 72 67 62 6d 61 70 20 |9.B.r_to_rgbmap | 00010040 41 44 52 20 72 31 32 2c 74 6f 5f 72 67 62 6d 61 |ADR r12,to_rgbma| 00010050 70 3a 4d 4f 56 20 70 63 2c 72 31 34 3a 5c 20 52 |p:MOV pc,r14:\ R| 00010060 65 74 75 72 6e 20 6d 61 70 20 61 64 64 72 65 73 |eturn map addres| 00010070 73 0d 39 b2 46 2e 74 6f 5f 72 67 62 6d 61 70 20 |s.9.F.to_rgbmap | 00010080 5d 3a 50 25 2b 3d 32 35 36 2a 34 3a 5b 4f 50 54 |]:P%+=256*4:[OPT| 00010090 4e 20 5c 20 32 35 36 20 63 6f 6c 6f 75 72 20 76 |N \ 256 colour v| 000100a0 61 6c 75 65 20 74 6f 20 34 30 39 36 20 26 52 47 |alue to 4096 &RG| 000100b0 42 20 76 61 6c 75 65 0d 39 bc 46 2e 72 5f 66 72 |B value.9.F.r_fr| 000100c0 6f 6d 5f 72 67 62 6d 61 70 20 41 44 52 20 72 31 |om_rgbmap ADR r1| 000100d0 32 2c 66 72 6f 6d 5f 72 67 62 6d 61 70 3a 4d 4f |2,from_rgbmap:MO| 000100e0 56 20 70 63 2c 72 31 34 3a 5c 20 52 65 74 75 72 |V pc,r14:\ Retur| 000100f0 6e 20 6d 61 70 20 61 64 64 72 65 73 73 0d 39 c6 |n map address.9.| 00010100 49 2e 66 72 6f 6d 5f 72 67 62 6d 61 70 20 5d 3a |I.from_rgbmap ]:| 00010110 50 25 2b 3d 34 30 39 36 2a 31 3a 5b 4f 50 54 4e |P%+=4096*1:[OPTN| 00010120 20 5c 20 34 30 39 36 20 26 52 47 42 20 76 61 6c | \ 4096 &RGB val| 00010130 75 65 20 74 6f 20 32 35 36 20 63 6f 6c 6f 75 72 |ue to 256 colour| 00010140 20 76 61 6c 75 65 0d 39 d0 3e 2e 72 5f 66 6c 69 | value.9.>.r_fli| 00010150 70 6d 61 70 20 41 44 52 20 72 31 32 2c 66 6c 69 |pmap ADR r12,fli| 00010160 70 6d 61 70 3a 4d 4f 56 20 70 63 2c 72 31 34 3a |pmap:MOV pc,r14:| 00010170 5c 20 52 65 74 75 72 6e 20 6d 61 70 20 61 64 64 |\ Return map add| 00010180 72 65 73 73 0d 39 da 3d 2e 66 6c 69 70 6d 61 70 |ress.9.=.flipmap| 00010190 20 5d 3a 50 25 2b 3d 32 35 36 3a 5b 4f 50 54 4e | ]:P%+=256:[OPTN| 000101a0 20 5c 20 49 6e 76 65 72 74 65 64 20 61 6e 64 20 | \ Inverted and | 000101b0 72 65 76 65 72 73 65 64 20 62 69 74 73 20 6d 61 |reversed bits ma| 000101c0 70 0d 39 e4 3c 2e 72 5f 63 6f 6c 6d 61 70 20 41 |p.9.<.r_colmap A| 000101d0 44 52 20 72 31 32 2c 63 6f 6c 6d 61 70 3a 4d 4f |DR r12,colmap:MO| 000101e0 56 20 70 63 2c 72 31 34 3a 5c 20 52 65 74 75 72 |V pc,r14:\ Retur| 000101f0 6e 20 6d 61 70 20 61 64 64 72 65 73 73 0d 39 ee |n map address.9.| 00010200 3e 2e 63 6f 6c 6d 61 70 20 5d 3a 50 25 2b 3d 32 |>.colmap ]:P%+=2| 00010210 35 36 3a 5b 4f 50 54 4e 20 5c 20 4c 6f 67 69 63 |56:[OPTN \ Logic| 00010220 61 6c 20 74 6f 20 6c 6f 67 69 63 61 6c 20 6d 61 |al to logical ma| 00010230 70 20 6e 6f 72 6d 61 6c 20 e7 46 0d 39 f8 3a 2e |p normal .F.9.:.| 00010240 72 5f 74 61 62 6c 65 20 41 44 52 20 72 31 32 2c |r_table ADR r12,| 00010250 74 61 62 6c 65 3a 4d 4f 56 20 70 63 2c 72 31 34 |table:MOV pc,r14| 00010260 3a 5c 20 52 65 74 75 72 6e 20 6d 61 70 20 61 64 |:\ Return map ad| 00010270 64 72 65 73 73 0d 3a 02 4c 2e 74 61 62 6c 65 20 |dress.:.L.table | 00010280 5d 3a 50 25 2b 3d 34 30 39 36 3a 5b 4f 50 54 4e |]:P%+=4096:[OPTN| 00010290 20 5c 20 53 6f 72 74 20 69 6e 64 69 63 65 73 20 | \ Sort indices | 000102a0 62 75 66 66 65 72 20 66 6f 72 20 47 49 46 20 69 |buffer for GIF i| 000102b0 6e 74 65 72 6c 61 63 65 64 20 62 75 69 6c 64 75 |nterlaced buildu| 000102c0 70 0d 3a 0c 3f 2e 72 5f 72 6f 77 64 61 74 20 41 |p.:.?.r_rowdat A| 000102d0 44 52 20 72 31 32 2c 72 6f 77 64 61 74 3a 4d 4f |DR r12,rowdat:MO| 000102e0 56 20 70 63 2c 72 31 34 3a 5c 20 52 65 74 75 72 |V pc,r14:\ Retur| 000102f0 6e 20 62 75 66 66 65 72 20 61 64 64 72 65 73 73 |n buffer address| 00010300 0d 3a 16 3a 2e 72 6f 77 64 61 74 20 5d 3a 50 25 |.:.:.rowdat ]:P%| 00010310 2b 3d 32 30 34 38 3a 5b 4f 50 54 4e 20 5c 20 42 |+=2048:[OPTN \ B| 00010320 75 66 66 65 72 20 66 6f 72 20 72 6f 77 20 70 69 |uffer for row pi| 00010330 78 65 6c 20 76 61 6c 75 65 73 0d 3a 20 05 20 0d |xel values.: . .| 00010340 3a 2a 06 5d ed 0d 3a 34 20 d6 20 6d 61 6b 65 5f |:*.]..:4 . make_| 00010350 6d 61 70 73 3a f4 20 43 61 6c 63 75 6c 61 74 65 |maps:. Calculate| 00010360 20 6d 61 70 73 0d 3a 3e 05 e1 0d ff | maps.:>....| 0001036c