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
2K.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