Home » Archimedes archive » Micro User » MU 1991-02.adf » PD-Stuff » Pictures/!Translatr/!RunImage
Pictures/!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 1991-02.adf » PD-Stuff |
Filename: | Pictures/!Translatr/!RunImage |
Read OK: | ✔ |
File size: | 113F5 bytes |
Load address: | 0000 |
Exec address: | 0000 |
Duplicates
There is 1 duplicate copy of this file in the archive:
- Archimedes archive » Micro User » MU 1990-11.adf » PD-Stuff » Graphics/!Translatr/!RunImage
- Archimedes archive » Micro User » MU 1991-02.adf » PD-Stuff » Pictures/!Translatr/!RunImage
File contents
� >!RunImage K�������������������������������������������������������������������� K� Converts foreign graphics files to Archimedes (RISCWARE) (-� Version date : Sat,07 Jul 1990.11:59:46 2� � 1990 Zeridajh software <� by John Kortink FK�������������������������������������������������������������������� P1� � �0:�'"Error"''"'";�$;"' (code ";�;")"'':� Z:� menu1 &400,submenu1 &400,submenu2 &400,submenu3 &400 d,� window1 &100,window2 &100,window3 &200 n,� window4 &400,window5 &600,window6 &200 x/� iconsprites 2048,icondata 4096,icondend 0 �D� poll 256,block 256,err 256,wimppal 256,pointer 512,stroff 4096 �E� InPal%(256),ImgPal%(256),ShowPal%(256),UserModeSet%(4),File(10) �'� arg% 1024,dum% 1024,transtab% 256 �5� palrgb% 1024,hambas% 64,freq% 1024,outpal% 1024 �LProgneed%=120*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" �)� Sprite% Spritesize%:� Sprite buffer �(�initialise:� Initialise application �4�mode_change(-1):� Reselect current mode to tidy �-� � �error(�,�$+" (code "+Þ+")"):�iclose ���Spritesize%<80*1024 � �error(0,"WARNING ! I have only "+�(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 D�DataLoadRef% � pollmask%=48 � pollmask%=49:� No nulls if wasted Ȏ �poll(pollmask%) � "0 � 0 : �null:� Nothing to do, perform checks ,* � 1 : �redraw:� Redraw window request 6& � 2 : �open:� Open window request @( � 3 : �close:� Close window request J& � 6 : �mouseclick:� Mouse clicked T? � 7 : �dragdrop:� User has dropped drag box of file window ^ � 8 : �key:� Key pressed h1 � 9 : �menuselect:� Menu selection from user r+ � 17,18 : �message:� Message from WIMP |� �� � � ���menuselect �?ș WDecodeM%,,menu1,poll,�100," ") � ,,,select$:� Selection �-� Decode main/sub/subsub selection string �*menupath$=select$:� Remember menu path �Pselect2=�:select3=�:select4=�:select2$="":select3$="":select4$="":� Defaults ̽p%=�select$,"."):�p%>0 � select2=�:select2$=�select$,p%+1):select$=�select$,p%-1):p%=�select2$,"."):�p%>0 � select3=�:select3$=�select2$,p%+1):select2$=�select2$,p%-1):p%=�select3$,".") �G�p%>0 � select4=�:select4$=�select3$,p%+1):select3$=�select3$,p%-1) �4� Filter clicks on roots of entries with submenu �Ȏ menupath$ � �s � "Image info","Pop up","Processing","Zoom image","Mirror image","Save image","Status" : �select2 � select$="" �� � "Processing.Output mode","Processing.Output palette","Processing.Image number","Pop up.Mode set","Zoom.In","Zoom.Out","Processing.Scaling" : �select3 � select$="" L � "Processing.Scaling.x","Processing.Scaling.y" : �select4 � select$="" � Ȏ select$ � & � "" : � Do nothing 0 � "Quit" : � Quit program : �die:� Tidy up and exit D" � "Pop up" : � Pop up options N Ȏ select2$ � X: � "Auto mode" : � Toggle auto mode selection on/off b# AutoMode=�AutoMode:� Toggle l@ � "Auto palette" : � Toggle auto palette selection on/off v! AutoPal=�AutoPal:� Toggle �+ � "Mode set" : � Select new mode set � Ȏ �select3$,4) � �) � "Root" : � No selection (root) �+ � "None" : ModeSet=0:� No mode set �7 � "Norm" : ModeSet=1:� Normal monitor mode set �: � "Mult" : ModeSet=2:� Multisync monitor mode set �5 : � User mode set, check and if ok, change Ƙ s$=select3$:p%=�s$,","):�p%>0 � m1%=�s$:s$=�s$,p%+1):p%=�s$,","):�p%>0 � m2%=�s$:s$=�s$,p%+1):p%=�s$,","):�p%>0 � m3%=�s$:s$=�s$,p%+1):m4%=�s$ �� �p%>0 � UserModeSet%(1)=m1%:UserModeSet%(2)=m2%:UserModeSet%(3)=m3%:UserModeSet%(4)=m4%:ModeSet=3 � �error(-1,"Bad user mode set. Please use '<2colmode>,<4colmode>,<16colmode>,<256colmode>', e.g. '1,2,3,4'.") � � �% �submenu("Pop up.Mode set",�) �) � "Auto zoom" : � Toggle auto zoom �# AutoZoom=�AutoZoom:� Toggle � �submenu("Pop up",�) * � "Processing" : � Processing options Ȏ select2$ � *1 � "Clear output" : � Clear output file off 4: �ClearFile � ș "OS_File",6,ClearSave$:ClearFile=� >7 � "Output mode" : � Change output mode selection H0 �select3$="Auto" � OutMode=1 � OutMode=2 R, �submenu("Processing.Output mode",�) \= � "Output palette" : � Change output palette selection fR �select3$="Current" � OutPal=1 � �select3$="Default" � OutPal=2 � OutPal=3 p/ �submenu("Processing.Output palette",�) z+ � "Scaling" : � Change scale factors � Ȏ select3$ � �2 � "1:1" : XMul%=1:YMul%=1:XDiv%=1:YDiv%=1 �u � "x","y" : mul%=-1:div%=-1:s$=select4$:p%=�s$,":"):�p%>0 � mul%=�s$:s$=�s$,p%+1):div%=�s$:� Get new factors �, �(mul%<=0)�(div%<=0)�(mul%>div%) � �W �error(-1,"Please enter <mul>:<div>, where <mul> is not greater than <div>") �b � �select3$="x" � XMul%=mul%:XDiv%=div% � YMul%=mul%:YDiv%=div%:� Update scaling factors � � � � �( �submenu("Processing.Scaling",�) �< � "Error spreading" : � Toggle error spreading on/off �% ErrSpread=�ErrSpread:� Toggle �5 � "Black and white" : � Toggle black and white � BlackWhite=�BlackWhite % � "Zig zag" : � Toggle zig zag ZigZag=�ZigZag 5 � "Screen blanking" : � Toggle screen blanking $ Blanking=�Blanking .. � "Invert RGB" : � Toggle RGB inverting 8 InvertRGB=�InvertRGB B' � "GIF scan" : � Toggle GIF scan L GIFScan=�GIFScan V( � "Image number" : � Image number `9 ImageNr%=�(select3$):� New value for image number j- �submenu("Processing.Image number",�) t � ~ �submenu("Processing",�) �1 � "Zoom image" : � Zoom in, out, normal size �? OldZoomX=ZoomX:OldZoomY=ZoomY:� Remember old zoom factors � Ȏ select2$ � �} � "In": �select3$="Both" � ZoomX=ZoomX*2:ZoomY=ZoomY*2 � �select3$="x" � ZoomX=ZoomX*2 � �select3$="y" � ZoomY=ZoomY*2 �~ � "Out": �select3$="Both" � ZoomX=ZoomX/2:ZoomY=ZoomY/2 � �select3$="x" � ZoomX=ZoomX/2 � �select3$="y" � ZoomY=ZoomY/2 � � "1:1": ZoomX=1:ZoomY=1 � � �J � Set image window extent and title according to current zoom factor �A !block=0:block!4=0:block!8=�sprW*ZoomX:block!12=�sprH*ZoomY �A ș WSetE%,win_img%,block:� Set window extent to zoomed size �& $IMWtt%=�image_title:� New title �@ !block=win_img%:ș WGetWS%,,block:� Read window's position J dx%=(block!12-block!4)/2:dy%=(block!16-block!8)/2:� Half window size F vx%=block!20+dx%:vy%=block!24-dy%:� Vector from centre to origin G � Calculate new scroll offsets by scaling vector and re-transpose E block!20=vx%*ZoomX/OldZoomX-dx%:block!24=vy%*ZoomY/OldZoomY+dy% (: �close_window(win_img%):�open_window(win_img%,block) 2 �submenu("Zoom image",�) <3 � "Save image" : � Save whole or part of image F0 SaveKind$=select2$:� Remember type of save PF $SAVfn%=SaveSpr$:$SAVsn%="file_ff9":� Set file window for sprite Z2 �open_window(win_file%,0):� Open file window d7 � "Include palette" : � Toggle save-palette on/off n! Palonoff=�Palonoff:� Toggle x/ � "Image palette" : � Select image palette � �set_palette(1) �' � "Rotate image" : � Rotate sprite � �hour_on:� Hourglass on �4 ș "Translator_Rotate",SprPtr%:� Rotate sprite � �hour_off:� Hourglass off �> �sprite_header(1):Ȕ SprH%,SprW%:� Set sprite info right �@ �new_image_window:�new_window(win_img%):� New image window �& � "Mirror image" : � Mirror image �9 �var("widt",SprW%):�var("heig",SprH%):� Module info � �hour_on:� Hourglass on �g �select2$="x" � ș "Translator_MirrorX",SprPtr% � ș "Translator_MirrorY",SprPtr%:� Mirror sprite � �hour_off:� Hourglass off �2 �new_window(win_img%):� Freshen image window ' � "Status" : � Manipulate defaults Ȏ select2$ � � � "Save" : Status=�("<Translator$Dir>.Status"):�#Status,AutoMode,AutoPal,ModeSet,ErrSpread,Palonoff,UserModeSet%(1),UserModeSet%(2),UserModeSet%(3),UserModeSet%(4),AutoZoom,BlackWhite,GIFScan,Blanking,InvertRGB " �#Status,ZigZag:�#Status ,b � "Load" : �load_status � �error(-1,"I cannot find my status file ! Have you saved one ?") 6: � "Kill" : ș "OS_File",6,"<Translator$Dir>.Status" @ � J� T(ș WGetPI%,,block:� Get pointer info ^;�((block!8)�1)>0 � �options_menu(�):� Adjust -> re-open h� r |��close �win%=poll!0:� Window handle �&�close_window(win%):� Close window �O�win%=win_img% � �invalidate_image:�set_palette(0):�close_window(win_file%) �� � � ��open ��open_window(0,poll) �� � ���redraw ��redraw_window(poll!0,�) �� � ��null �DataLoadRef% � D DataLoadRef%=�:ș "OS_File",6,Save$:� Delete file saved/created &C �error(-1,"Bad data transfer, receiver dead"):� No DataLoadAck 0� :� D N ��key XEwin%=poll!0:ico%=poll!4:char%=poll!24:� Window, icon, key pressed b"�(win%=win_file%) � (ico%=1) � l Ȏ char% � v � 13 : � Return pressed �J �error(-1,"Please drag the sprite file icon to a directory viewer") � � 27 : � Escape pressed � �close_window(win_file%) � � �� �� � � ��message �-� Ignore messages originating from myself �6�(poll!4)=TaskHandle% � msgnr%=-1 � msgnr%=poll!16 �Ȏ msgnr% � � � -1 : � Don't react �+ � 0 : �die:� Request to terminate task . � 1 : � DataSave, transfer via scrap file 7 scrap$=�OSvar("Wimp$Scrap"):� Read scrap filename � �scrap$<>"" � poll!12=poll!8:poll!16=2:poll!36=-1:$(poll+44)=scrap$+�0:poll!0=44+(�scrap$+1+3)��3:ș WSendMsg%,18,poll,poll!4 � �error(-1,"Wimp$Scrap not defined"):� Send DataSaveAck if scrap file defined # � 2 : � DataSaveAck, save file * �poll!12=DataSaveRef% � 4I Save$=�string(poll+44):� Full pathname of file to be saved/created >. � Save sprite file or 'open' Clear file H� �$SAVsn%="file_ff9" � SprSave$=Save$:�save_sprite(SprSave$) � ClearSave$=Save$:ș "OS_File",11,ClearSave$,&690,0,0:ClearFile=� R? poll!12=poll!8:poll!16=3:� Amend data block for DataLoad \2 ș WSendMsg%,18,poll,poll!4:� Send DataLoad f@ DataLoadRef%=poll!8:� Await a DataLoadAck, remember myref p � z. � 3,5 : � DataLoad/Open : attempt to load � type%=poll!40:� Filetype �' name$=�string(poll+44):� Filename � Ȏ type% � �O � &690,&691,&692,&693,&694,&695,&696,&697,&698,&FF0 : �load(type%,name$) �B � &FF9,&DE2,&DFA,&D58,&004 : �msgnr%=3 � �load(type%,name$) �@ : � Filetype not recognized, look at contents if dragged � �msgnr%=3 � �S Head=�(name$):id$="":� i%=1 � 12:id$+=�(�#Head):�:�#Head:� Get head of file �) type%=-1:� No recognized type yet �Z �id$,6)="GIF87a" � type%=&695 � �(�id$,4)="FORM") � (�id$,4)="ILBM") � type%=&693 �m �type%=-1 � �id$,4)=�&59+�&A6+�&6A+�&95 � type%=&696 � �(�id$,2)="II") � (�id$,2)="MM") � type%=&FF0 � �type%>0 � ș "OS_CLI","SetType "+name$+" "+�~(type%):�load(type%,name$) � �error(-1,"I don't recognize this file. Please filetype it appropiately."):� Filetype and load or complain � � � ) � 4 : � DataLoadAck, check or ignore < �DataLoadRef% � �poll!12=DataLoadRef% � DataLoadRef%=� $! � &400C0 : � Submenu warning .G pointer%=poll!20:x%=poll!24:y%=poll!28:� Get pointer/proposed x/y 8A ș WDecodeM%,,menu1,poll+32,�100," ") � ,,,path$:� Get path B Ȏ path$ � L� � "Processing.Clear output" : $SAVfn%=SaveClear$:$SAVsn%="file_690":ș WCreateSM%,,pointer%,x%,y%:� Open file window for Clear file Vd � "Image info","Info","Filetypes","Processing.RGB resolution" : ș WCreateSM%,,pointer%,x%,y% ` : �submenu(path$,�) j � t@ � &400C1 : � Mode has changed (and it may not have been me) ~ �mode_change(-1):� Tidy up �6 � &CCE00 : � Other Translator asks to kill module �> poll!12=poll!8:ș WSendMsg%,19,poll,poll!4:� Hands off ! �� �� � ���mouseclick �?but%=poll!8:win%=poll!12:ico%=poll!16:� Buttons/window/icon � Ȏ win% � � � -2 : � Click on iconbar � �ico%=Iiconbar% � � � Iconbar icon clicked � Ȏ but% � 7 � � � 2 : �create_menu(-1,0,"Translator",10*16,40,0," Info"+"#"+�(win_info%)+"| Filetypes"+"#"+�(win_filet%)+"| Quit|","",�) � 1,4 : �options_menu(�) � � () � win_img% : � Click on image window 2 Ȏ but% � 7 � <8 � 2 : �options_menu(�):� Menu button, pop up menu F � P) � win_file% : � Click on file window Z �ico%=0 � d Ȏ but% � &7F � n9 � 16,64 : � Drag,calculate drag box and create it x� !block=win%:ș WGetWS%,,block:x%=block!4:y%=block!8:block!4=ico%:ș WGetIS%,,block:!block=win%:block!4=5:block!8+=x%:block!12+=y%:block!16=block!8+68:block!20=block!12+68:block!24=0:block!28=0:block!32=ScrW%:block!36=ScrH% �, ș WDragB%,,block:� Create drag box � � � � �/ � win_rgbbits% : � RGB slider manipulation �� !block=win%:ș WGetWS%,,block:x%=block!4:y%=block!8:block!4=ico%:ș WGetIS%,,block:x%+=block!8+2:y%+=block!12+8:� Position in slider icon �F mx%=!poll:dx%=mx%-x%-8:val%=dx% � 16:�val%>8 � val%=8:� Position �� �ico%=3 � col%=11:sn$="R":bit%=16 � �ico%=4 � col%=10:sn$="G":bit%=8 � col%=8:sn$="B":bit%=0:� Slider colours, names, bitoffsets �$ � Plot slider in slider sprite �~ ș OSSpop%,60+256,iconsprites,"slider"+sn$,0 � r0,r1,r2,r3:�0,0:ȓ Ȑ 2,8,8*16,16:�0,col%:�val%>0 � ȓ Ȑ 2,8,val%*16,16 �2 ș OSSpop%,r0,r1,r2,r3:� Restore VDU context � RGBbits%=(RGBbits% � � (255<<bit%)) � (val%<<bit%):!block=win%:block!4=ico%:block!8=0:block!12=0:ș WSetIS%,,block:� Update code and icon �� �� ��dragdrop !ș WCreateM%,,-1:� Close menu ",ș WGetPI%,,block:� Get pointer position ,Gdropwin%=block!12:dropico%=block!16:� Window/icon where box dropped 6(save$=�string(SAVfn%):� Get leafname @o�$SAVsn%="file_ff9" � SaveSpr$=save$:ft%=&FF9 � SaveClear$=save$:ft%=&690:� Remember leafname, set filetype J�block!20=block!12:block!24=block!16:block!28=block!0:block!32=block!4:block!12=0:block!16=1:block!36=0:block!40=ft%:$(block+44)=save$+�0:!block=(44+�save$+4)��3 T;ș WSendMsg%,17,block,dropwin%,dropico%:� Send DataSave ^6DataSaveRef%=block!8:� Remember myref for DataSave h0�close_window(win_file%):� Close file window r� | ���load(type%,name$) �� Loads image file �Kpoll!12=poll!8:poll!16=4:ș WSendMsg%,17,poll,poll!4:� Send DataLoadAck �Load$=name$:� Filename �{pos%=�Load$:� pos%-=1:period=(�Load$,pos%,1)="."):� (pos%=1) � period:�period � Leaf$=�Load$,�Load$-pos%) � Leaf$=Load$ �5ș "OS_File",17,Load$ � ,,,,Flen%:� File's length � File(1)=�(Load$):� Open file �9�var("fhan",File(1)):�var("fptr",0):� REM Module info �'iType%=0:� Default input byte order ��hour_on:� Hourglass on �?�win_img%>0 � �close_window(win_img%):� Old image discarded �?�invalidate_image:� New image to come, invalidate old image �Ȏ type% � � � &FF9 : p%=�"."+�upstring(name$),".HIP."):�p%>0 � loppath$=name$:�loppath$,p%,3)="LOP":File(2)=�(loppath$):�File(2)=0 � �error(-1,"I cannot find the ArVis LOP file !"):� b �p%=0 � Ok=�pic_ARC � �var("fha2",File(2)):�var("fpt2",0):Ok=�pic_ARVIS:� What's this then ? � &DE2 : Ok=�pic_PROART & � &DFA : Ok=�pic_WATFORD 0 � &D58 : Ok=�pic_RENDER : � &004 : Ok=�pic_AIM D � &690 : Ok=�pic_CLEAR N � &691 : Ok=�pic_DEGAS X � &692 : Ok=�pic_IMG b � &693 : Ok=�pic_IFF l � &694 : Ok=�pic_MAC v � &695 : Ok=�pic_GIF � � &696 : Ok=�pic_SUN � � &697 : Ok=�pic_PCX � � &698 : Ok=�pic_QRT � � &FF0 : Ok=�pic_TIFF �� �$Img=Ok:� Image ok if all is well ��hour_off:� Hourglass off ��iclose:� Close input files � �Img � �, �set_mode(ImgMode%):� Select image mode �) ZoomX=1:ZoomY=1:� Reset zoom factors �A �AutoPal � �set_palette(1):� Select image palette if enabled �- �new_image_window:� Open window on image � � ��save_sprite(out$) *� Saves image as spritefile 4Ȏ SaveKind$ � >1 � "Full" : � Full resolution sprite, no edit H � "Whole" : �edit_part(�,�) R) � "Whole (scaled)" : �edit_part(�,�) \ � "Part" : �edit_part(�,�) f( � "Part (scaled)" : �edit_part(�,�) p� z�hour_on:� Hourglass on ��SaveKind$="Full" � �8 � Full sprite, save image with palette (optionally) �# Out=�(out$):� Open output file �- spr%=Sprite%+Sprite%!8:� Start of sprite �, cols%=2^SprColbits%:� Colours in sprite � �Palonoff � (cols%<>256) � �" � Save with palette included �. extra%=cols%*8:� Extra bytes for palette �E ș "OS_GBPB",1,Out,Sprite%+4,8,0:� Output part of control block �D !arg%=extra%+Sprite%!12:ș "OS_GBPB",2,Out,arg%,4:� New offset �? !arg%=extra%+!spr%:ș "OS_GBPB",2,Out,arg%,4:� New offset �A ș "OS_GBPB",2,Out,spr%+4,28:� Output part of sprite header �A !arg%=extra%+spr%!32:ș "OS_GBPB",2,Out,arg%,4:� New offset A !arg%=extra%+spr%!36:ș "OS_GBPB",2,Out,arg%,4:� New offset 9 ș "OS_GBPB",2,Out,spr%+40,4:� Output sprite's mode � � c%=1 � cols%:arg%!(c%*8-8)=�readpalval(ImgPal%(c%)):arg%!(c%*8-4)=arg%!(c%*8-8):�:ș "OS_GBPB",2,Out,arg%,cols%*8:� Output palette $F ș "OS_GBPB",2,Out,spr%+spr%!32,(spr%!16+1)*(spr%!20+1)*4:� Data .) � � No palette, output the whole lot 8> ș "OS_GBPB",1,Out,Sprite%+4,Sprite%!12-4,0:� Output all B � L? �#Out:ș "OS_CLI","SetType "+out$+" Sprite":� Close & type V0� � Edited part in window on screen, save it `( �invalidate_screen:� Screen invalid j �Palonoff � pal%=1 � pal%=0 t4 ș OSSpop%,2,,out$,pal%:� Save screen in window ~/ �24,0;0;ScrW%;ScrH%;:� Reset screen window �� ��hour_off:� Hourglass off �� � �ݤpic_DEGAS �/� Makes Atari Degas image (PI1/2/3,PC1/2/3) �+iType%=0:� Set low-to-high type of data �9compr%=�i1(1):res%=�i1(1):� Flags, resolution (1/2/3) �7compressed=((compr%�%10000000)>0):� Compressed flag �#total%=32000:� Total data bytes � Ȏ res% � �) � 0 : xres%=320:yres%=200:colbits%=4 ) � 1 : xres%=640:yres%=200:colbits%=2 ) � 2 : xres%=640:yres%=400:colbits%=1 � +colours%=2^colbits%:� Number of colours (6mode%=�mode(xres%,yres%,colours%):� Determine mode 2)�new_image(mode%,xres%,yres%,0) � =� <-�iget(1,dum%,32):� Read palette from file F�InPal%(0)=colbits%:� c%=0 � colours%-1:v%=dum%!(c%*2):r%=(v%�7)*32:g%=((v%>>12)�7)*32:b%=((v%>>8)�7)*32:InPal%(colours%-c%)=(r%<<16)+(g%<<8)+b%:� P[�compressed � compr$="Run length":type$="PC"+�(res%+1) � compr$="":type$="PI"+�(res%+1) Z\�image_info("Atari Degas "+type$,xres%,yres%,0,colbits%,mode%,compr$,"",Flen%-34,total%) du�var("comp",compressed):�var("rest",res%):�var("widt",xres%):�var("heig",yres%):�var("fptr",&22):�unpack("DEGAS") nImgMode%=mode%:=� x � ݤpic_IMG �� Makes Atari IMG image �+iType%=1:� Set high-to-low type of data �Qversion%=�i2(1):headlen%=�i2(1):nplanes%=�i2(1):� Version, headlength, planes �Qpatlen%=�i2(1):pw%=�i2(1):ph%=�i2(1):� Pattern length, pixel width and height �=width%=�i2(1):height%=�i2(1):� Width and height in pixels �+colours%=2^nplanes%:� Number of colours ��colours%<>2 � patlen%<>2 � �error(-1,"I cannot display Atari IMG images with more than 2 colours or patternlength<>2 !"):� �9mode%=�mode(width%,height%,colours%):� Determine mode �,�new_image(mode%,width%,height%,0) � =� �BInPal%(0)=nplanes%:InPal%(1)=0:InPal%(2)=&FFFFFF:� Set palette �{�image_info("Atari IMG",width%,height%,0,nplanes%,mode%,"Several ways","",Flen%-headlen%*2,(width%*height%*nplanes%)�8) �S�var("widt",width%):�var("heig",height%):�var("fptr",headlen%*2):�unpack("IMG") ImgMode%=mode%:=� ݤpic_MAC "$� Makes MacIntosh MacPaint image ,2width%=576:height%=720:colbits%=1:� Resolution 6;mode%=�mode(width%,height%,2^colbits%):� Determine mode @,�new_image(mode%,width%,height%,0) � =� JBInPal%(0)=colbits%:InPal%(1)=0:InPal%(2)=&FFFFFF:� Set palette Tk�image_info("MacIntosh MacPaint",width%,height%,0,colbits%,mode%,"Run length","",Flen%-640,(576*720)�8) ^L�var("widt",width%):�var("heig",height%):�var("fptr",640):�unpack("MAC") hImgMode%=mode%:=� r | ݤpic_IFF �� Makes Amiga IFF image �%bmhd=�:cmap=�:body=�:� Init flags �2ham=�:lace=�:hires=�:halfbright=�:� Init flags �+iType%=1:� Set high-to-low type of data �2� Check if this is a standard IFF picture file ��form$=�istring(1,4):�iskip(1,4):form$+=�istring(1,4):�form$<>"FORMILBM" � �error(-1,"This screen file is not an IFF screen file !"):=� �)� � Follow BMHD,CMAP and BODY headers �7head$=�istring(1,4):hlen%=�i4(1):startptr%=�iptr(1) �Ȏ head$ � �& � "BMHD" : bmhd=�:� Bitmap header �= � Read picture/screen width, height, colours, etc. �N width%=�i2(1):height%=�i2(1):�iskip(1,4):planes%=�i1(1):�iskip(1,1) �M compressed=(�i1(1)=1):�iskip(1,5):s_width%=�i2(1):s_height%=�i2(1) @ � "CAMG" : flags%=�i4(1):� 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) 0B paldefs%=hlen%�3:� Number of palette colour definitions :4 � _%=0 � paldefs%-1:InPal%(_%+1)=�i3(1):� D$ � "BODY" : body=�:� Screen data N) � Check if all parts are there X� �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 !"):� �:=� b6 � Determine suitable Archimedes screen mode l �ham � v� mode%=�mode(320,s_height%,256):colbits%=12:info$="HAM (Hold And Modify)":InPal%(0)=colbits%:� c%=0 � 15:hambas%!(c%<<2)=InPal%(c%+1):�:�var("hamb",hambas%) �t � colours%=2^planes%:mode%=�mode(s_width%,s_height%,colours%):colbits%=planes%:InPal%(0)=planes%:info$="" �x �halfbright � info$="Half-bright":half%=colours%�2:� c%=1 � half%:InPal%(c%+half%)=(InPal%(c%)�&E0E0E0)>>1:� � � �3 �new_image(mode%,width%,height%,0) � =� �8 �compressed � compr$="Run length" � compr$="" �& �colbits%>8 � ci%=2 � ci%=0 �| �image_info("Amiga IFF",width%,height%,ci%,colbits%,mode%,compr$,info$,Flen%-�iptr(1),(width%*height%*planes%)�8) �1 �ham � �var("scty",1) � �var("scty",0) Ѕ �var("fptr",�iptr(1)):�var("plan",planes%):�var("widt",width%):�var("heig",height%):�var("comp",compressed):�unpack("IFF") � ImgMode%=mode% �� �9�iskip(1,hlen%-(�iptr(1)-startptr%)):� To next header � � body =� ݤpic_GIF 3� Makes GIF (Graphics Interchange Format) image *&� g_InPal%(),Pic_ptr%(),Pic_len%() 4/� g_InPal%(256),Pic_ptr%(256),Pic_len%(256) >+iType%=0:� Set low-to-high type of data H1signature$=�istring(1,6):� Read GIF signature RX�signature$,3)<>"GIF" � �error(-1,"This screen file is not a GIF screen file !"):=� \$� Read data in Screen Descriptor f2r_width%=�i2(1):r_height%=�i2(1):� Raster size pDflags%=�i1(1):backgr%=�i1(1):�iskip(1,1):� Flags and back colour z;global=((flags%�&80)>0):� Global colour map following ? �3g_pixbits%=(flags%�7)+1:� Global bits per pixel �:colbits%=((flags%>>4)�7)+1:� Bits of colour resolution � �global � �j � c%=1 � 2^g_pixbits%:g_InPal%(c%)=(�i1(1)<<16)+(�i1(1)<<8)+�i1(1):�:� Read Global Colour Map palette �- g_InPal%(0)=g_pixbits%:� Palette entries �%� InPal%(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 �F� _%=�i1(1):image=(_%=�","):end=(_%=�";"):� image � end � �ieof(1) �~�image � �end � �error(-1,"Warning ! GIF file is not properly terminated !"):end=�:�hour_off:�hour_on:� Read beyond file �image � " � Register picture's position . picture%+=1:Pic_ptr%(picture%)=�iptr(1)-1 $j �iskip(1,8):_%=�i1(1):�(_%�&80)>0 � �iskip(1,3*2^((_%�7)+1)):� If there's a local colour map, skip it . �GIFScan � 80 � Determine picture data length, skip data B1 �iskip(1,1):� c%=�i1(1):�iskip(1,c%):� c%=0 L4 Pic_len%(picture%)=�iptr(1)-Pic_ptr%(picture%) V; � Pic_len%(picture%)=�ilen(1)-Pic_ptr%(picture%):end=� ` � j� t � end ~1pictures%=picture%:� Number of pictures found �N�pictures%>0 � �error(-1,"I cannot find any images in this GIF file !"):=� ��GIFScan � �� �(ImageNr%>0) � (ImageNr%<=pictures%) � picture%=ImageNr% � �error(-1,"This file contains "+�(pictures%)+" images. Select '1'-'"+�(pictures%)+"' in the 'Image number' submenu !"):=� �� picture%=1 �� �I�iptr(1,Pic_ptr%(picture%)+1):len%=Pic_len%(picture%):� Pic pos & len � � Read Image Descriptor data �4i_left%=�i2(1):i_top%=�i2(1):� Position in frame �Ci_width%=�i2(1):i_height%=�i2(1):flags%=�i1(1):� Size and flags �7local=(flags%�&80)>0:� Local colour map following ? �<ibit=(flags%�&40)>0:� Image stored in interlaced order ? �2l_pixbits%=(flags%�7)+1:� Local bits per pixel �local � @ pixbits%=l_pixbits%:� Read and use Local Colour Map palette V � c%=1 � 2^l_pixbits%:InPal%(c%)=(�i1(1)<<16)+(�i1(1)<<8)+�i1(1):�:� Read palette + InPal%(0)=l_pixbits%:� Palette entries (?� pixbits%=g_pixbits%:InPal%()=g_InPal%():� Use Global data 2� <N�InPal%(0)=-1 � �error(-1,"I cannot find a palette in this GIF file !"):=� F+colours%=2^pixbits%:� Number of colours P/� Determine suitable Archimedes screen mode Z=mode%=�mode(r_width%,r_height%,colours%):� Determine mode d;� Room needed for decompression data and de-interlacing nd�pixbits%<=2 � rbits%=pixbits% � �pixbits%<=4 � rbits%=4 � rbits%=8:� Round up bpp to sprite bpp xEroom%=(((i_width%*rbits%+31)>>5)<<2)*i_height%+1024:� Room needed �4�new_image(mode%,i_width%,i_height%,room%) � =� �'�GIFScan � np$=�pictures% � np$="?" ���image_info(signature$,i_width%,i_height%,0,pixbits%,mode%,"LZW",np$+" pics (this is "+�times(picture%)+")",len%,(i_height%*i_width%*pixbits%)�8) �+�ibit � �var("lace",1) � �var("lace",0) �U�var("fptr",�iptr(1)):�var("widt",i_width%):�var("heig",i_height%):�unpack("GIF") �ImgMode%=mode%:=� � ���skip_GIF_extension �?� Skips a GIF Extension Block if present at current pointer �� _% ��(�i1(1))=�"!" � �% �iskip(1,1):� Skip function code �< � _%=�i1(1):�iskip(1,_%):� _%=0:� Skip data byte blocks � �iskip(1,-1) � � " , ݤpic_ARC 6#� Loads Archimedes sprite image @+iType%=0:� Set low-to-high type of data JHpictures%=�i4(1):ofirst%=�i4(1):� Number of sprites, offset to first T��(ImageNr%>0) � (ImageNr%<=pictures%) � picture%=ImageNr% � �error(-1,"This file contains "+�(pictures%)+" images. Select '1'-'"+�(pictures%)+"' in the 'Image number' submenu !"):=� ^1�iskip(1,ofirst%-8-4):� Start of first sprite hEskip%=pictures%-picture%:ȕ skip%>0:�iskip(1,�i4(1)-4):skip%-=1:� rGstart%=�iptr(1):�iskip(1,16):� Remember start, skip offset and name |Fwords%=�i4(1)+1:height%=�i4(1)+1:� Width in words, height in lines �7bfirst%=�i4(1):blast%=�i4(1):� First/last bits used �Foimage%=�i4(1):�iskip(1,4):sprmode%=�i4(1):� Offset to image, mode �Bcolbits%=2^�mode_var(sprmode%,9):colours%=2^colbits%:� Colours �#�(oimage%<=44)�(colours%=256) � �> � No palette or 256-colour palette : set standard palette �) �standard_palette(InPal%(),colbits%) � InPal%(0)=colbits%:� c%=1 � colours%:p%=�i4(1):InPal%(c%)=((p%�&FF00)<<8)+((p%�&FF0000)>>8)+(p%>>>24):�iskip(1,4):�:� Read palette �� �Bxres%=(words%*32-bfirst%-(31-blast%)) � colbits%:yres%=height% ��available_mode(sprmode%) � mode%=sprmode% � mode%=�mode(xres%,yres%,colours%):� Determine other mode if sprite's mode won't do �)�new_image(mode%,xres%,yres%,0) � =� �}�image_info("Archimedes sprite",xres%,yres%,0,colbits%,mode%,"",�pictures%+" sprites (this is "+�times(picture%)+")",1,1) ��var("fptr",start%+oimage%):�var("widt",xres%):�var("heig",height%):�var("wrds",words%):�var("bfir",bfirst%):�unpack("ARC") ImgMode%=mode%:=� ݤpic_PROART &� Makes ProArtisan image 0+width%=640:height%=256:� Set resolution :4mode%=�mode(width%,height%,256):� Determine mode DCroom%=(width%*height%+3)��3:� Room needed for unpack (coltable) N0�new_image(mode%,width%,height%,room%) � =� X+iType%=0:� Set low-to-high type of data bGcollen%=�i4(1):comflag%=�i4(1):� Length of colour table/compression l5coltable%=Lomem%-collen%:� Space for colour table v2�iget(1,coltable%,collen%):� Read colour table �?�standard_palette(InPal%(),8):� Standard 256 colour palette �]�image_info("ProArtisan",width%,height%,0,8,mode%,"Run length","",Flen%-8,width%*height%) ���var("fptr",�iptr(1)):�var("prot",coltable%):�var("comp",comflag%):�var("widt",width%):�var("heig",height%):�unpack("PROART") �ImgMode%=mode%:=� � �ݤpic_WATFORD �#� Makes Watford digitiser image �+width%=512:height%=256:� Set resolution �4mode%=�mode(width%,height%,256):� Determine mode �,�new_image(mode%,width%,height%,0) � =� �>InPal%()=0:InPal%(0)=8:� Palette is 64 greys, linear scale �8� c%=0 � 63:InPal%(c%+1)=(c%<<18)+(c%<<10)+(c%<<2):� �h�image_info("Watford digitiser",width%,height%,1,6,mode%,"Run length","",Flen%,(width%*height%*6)�8) N�var("widt",width%):�var("heig",height%):�var("fptr",0):�unpack("WATFORD") ImgMode%=mode%:=� ݤpic_RENDER *� Makes Render Bender image 4iType%=0:� >$mode%=�i1(1):� Read image's mode H��mode_var(mode%,9)<>3 � �error(-1,"This Render Bender image was not defined in a 256 colour mode !") � width%=�mode_var(mode%,11)+1:height%=�mode_var(mode%,12)+1 R4mode%=�mode(width%,height%,256):� Determine mode \,�new_image(mode%,width%,height%,0) � =� f?�standard_palette(InPal%(),8):� Standard 256 colour palette p`�image_info("Render Bender",width%,height%,0,8,mode%,"Run length","",Flen%-1,width%*height%) zM�var("fptr",1):�var("widt",width%):�var("heig",height%):�unpack("RENDER") �ImgMode%=mode%:=� � � ݤpic_AIM �� Makes AIM image �+width%=256:height%=256:� Set resolution �4mode%=�mode(width%,height%,256):� Determine mode �,�new_image(mode%,width%,height%,0) � =� �4InPal%(0)=8:� Palette is 256 greys, linear scale �3� c%=0 � 255:InPal%(c%+1)=(c%<<16)+(c%<<8)+c%:� �C�image_info("AIM",width%,height%,1,8,mode%,"","",Flen%,256*256) �J�var("widt",width%):�var("heig",height%):�var("fptr",0):�unpack("AIM") �ImgMode%=mode%:=� � ݤpic_SUN � Makes SUN image +iType%=1:� Set high-to-low type of data $\magic%=�i4(1):�magic%<>&59A66A95 � �error(-1,"This is no standard SUN raster file !"):=� .Bwidth%=�i4(1):height%=�height%=�h1):colbits%=�i4(1):� Read resolution 8Nlength%=�i4(1):type%=�i4(1):maptype%=�i4(1):maplength%=�i4(1):� Extra info BH�type%>1 � �error(-1,"I can only read uncompressed Sun images !"):=� L+colours%=2^colbits%:� Number of colours VȎ colbits% � `, � 1,8 : �(maptype%<>1)�(maplength%=0) � jm �colbits%>1 � �error(-1,"This SUN image file contains no palette ! I will use a greyscale.") t* �grey_palette(colbits%,1) ~v � InPal%()=0:� i%=1 � 3:� c%=1 � maplength%�3:InPal%(c%)=(InPal%(c%)<<8)+�i1(1):�:�:InPal%(0)=colbits% � � �L : �error(-1,"I can only read 1- and 8-bit per pixel Sun images !"):=� �� �9mode%=�mode(width%,height%,colours%):� Determine mode �,�new_image(mode%,width%,height%,0) � =� �H�image_info("SUN",width%,height%,0,colbits%,mode%,"","",Flen%,Flen%) �V�var("fptr",32+maplength%):�var("widt",width%):�var("heig",height%):�unpack("SUN") �ImgMode%=mode%:=� � � ݤpic_PCX �� Makes PCX image �+iType%=0:� Set low-to-high type of data 1man%=�i1(1):� Manufacture code (should be 10) >�man%<>10 � �error(-1,"This is no standard PCX file !"):=� ,version%=�i1(1):� Version code (0/2/3/5) Y�version%<5 � �error(-1,"I cannot handle old PCX files (only version 5 and up) !"):=� (Gencoding%=�i1(1):� Encoding code (0-none, 1-PCX runlength encoding) 23bits%=�i1(1):� Bits per 'pixel' (1-EGA, 8-MCGA) <Pwxmin%=�i2(1):wymin%=�i2(1):wxmax%=�i2(1):wymax%=�i2(1):� Window coordinates FIwidth%=wxmax%-wxmin%+1:height%=wymax%-wymin%+1:� Resolution in pixels P �iskip(1,4):� Skip Hres/Vres ZInPal%()=0:� Clear palette dl� i%=1 � 16:rgb%=�i3(1):InPal%(i%)=((rgb%�&FF)<<16)+(rgb%�&FF00)+(rgb%>>16):�:� Read colourmap in header n$�iskip(1,1):� Skip reserved byte x!planes%=�i1(1):� Colourplanes �$linelen%=�i2(1):� Bytes per line ��roundlen%=((width%*bits%+7)�8):�roundlen%<>linelen% � width%=linelen%*8/bits%:� Correct width if window and linelength data conflict �+pixbits%=bits%*planes%:� Bits per pixel ���(pixbits%=1) � (pixbits%=2) � (pixbits%=4) � (pixbits%=8) � �error(-1,"I cannot handle "+�(2^pixbits%)+" colour EGA PCX files !"):=� �+colours%=2^pixbits%:� Number of colours �~�var("fptr",128):�var("totl",linelen%*planes%*height%):�var("comp",encoding%):�unpack_phase("PCX",2):� Get (packed) length �Alen%=�var("pakl"):�iptr(1,128+len%):� Go to end of image data �?code%=�i1(1):� Get code (12 indicates palette info follows) �t�code%=12 � � i%=1 � colours%:rgb%=�i3(1):InPal%(i%)=((rgb%�&FF)<<16)+(rgb%�&FF00)+(rgb%>>16):�:� Read colourmap �.grey=�:� Flag to indicate forced greyscale ��bits%=8 � �code%<>12 � �error(-1,"I cannot find the palette in this 256-colour PCX image ! I will use a greyscale."):grey=� �}�grey � �Ǝ(InPal%())=0 � �error(-1,"I cannot find a decent palette in this PCX image ! I will use a greyscale."):grey=� �:�grey � �grey_palette(pixbits%,1) � InPal%(0)=pixbits% 9mode%=�mode(width%,height%,colours%):� Determine mode ,�new_image(mode%,width%,height%,0) � =� 2�encoding%=1 � compr$="Run length" � compr$="" "f�image_info("PCX",width%,height%,0,pixbits%,mode%,compr$,"",Flen%-128,(width%*height%*pixbits%)�8) ,c�var("fptr",128):�var("widt",width%):�var("heig",height%):�var("comp",encoding%):�unpack("PCX") 6ImgMode%=mode%:=� @ Jݤpic_TIFF T� Makes TIFF image ^+id$=�istring(1,2):� TIFF identification hȎ id$ � r5 � "II" : iType%=0:� Set low-to-high type of data |5 � "MM" : iType%=1:� Set high-to-low type of data �2 : �error(-1,"This is not a TIFF file !"):=� �� �+version%=�tiff(3):� TIFF version number �G�version%<>42 � �error(-1,"I cannot handle this TIFF version !"):=� �+offFIFD%=�tiff(4):� Offset to first IFD �'�iptr(1,offFIFD%):� Go to first IFD �-entries%=�tiff(3):� Number of IFD entries �InPal%()=0:� No palette yet �1ok=�:� Flag indicating if TIFF can be handled �rrowsperstrip%=-1:bits%=1:colours%=2:compression%=1:planar%=1:fillorder%=1:greyunit%=3:pixsamples%=1:� Defaults �� e%=1 � entries% �@tag%=�tiff(3):type%=�tiff(3):length%=�tiff(4):� Tag and info �r�type%=1 � value%=�tiff(1):�iskip(1,3) � �type%=3 � value%=�tiff(3):�iskip(1,2) � value%=�tiff(4):� Read value 6cptr%=�iptr(1):� Remember current position in file Ȏ tag% � � 256 : width%=value% & � 257 : height%=value% 0* � 258 : bits%=value%:colours%=2^bits% : � 259 : compression%=value% D � 262 : photometric%=value% N � 266 : fillorder%=value% X� � 273 : !stroff=length%:�length%=1 � stroff!4=value% � �iptr(1,value%):p%=stroff+4:� s%=1 � length%:!p%=�tiff(type%):p%+=4:�:�iptr(1,cptr%) b � 277 : pixsamples%=value% l! � 278 : rowsperstrip%=value% v � 284 : planar%=value% � � 290 : greyunit%=value% �� � 291 : �iptr(1,value%):div%=2*10^greyunit%:� g%=1 � length%:c%=�tiff(type%)*255:i%=c%/div%:InPal%(g%)=i%+(i%<<8)+(i%<<16):�:InPal%(0)=bits%:�iptr(1,cptr%) �� � 320 : �iptr(1,value%):InPal%()=0:� p%=1 � 3:� c%=1 � length%�3:v%=�tiff(type%):InPal%(c%)=(InPal%(c%)<<8)+(v%>>8):�:�:InPal%(0)=bits%:�iptr(1,cptr%) �� �� �-�rowsperstrip%=-1 � rowsperstrip%=height% �O�compression%<>1 � �error(-1,"I cannot handle compressed TIFF images !"):=� �}�(bits%=1)�(bits%=2)�(bits%=4)�(bits%=8) � �error(-1,"I can only handle TIFF images with 1,2,4 or 8 bits per pixel !"):=� �T�planar%<>1 � �error(-1,"I cannot handle TIFF images with multiple planes !"):=� �g�pixsamples%<>1 � �error(-1,"I cannot handle TIFF images with more than one sample per pixel !"):=� �V�InPal%(0)<>0 � �photometric%=0 � �grey_palette(bits%,-1) � �grey_palette(bits%,1) �9mode%=�mode(width%,height%,colours%):� Determine mode �,�new_image(mode%,width%,height%,0) � =� 8�photometric%=3 � code%=0 � code%=1:� Colour or grey J�image_info("TIFF",width%,height%,code%,bits%,mode%,"","",Flen%,Flen%) ��var("fptr",0):�var("widt",width%):�var("heig",height%):�var("map1",stroff):�var("rops",rowsperstrip%):�var("bito",fillorder%):�unpack("TIFF") ImgMode%=mode%:=� * 4ݤtiff(type%) >� Returns tiff data type H� i$,b% RȎ type% � \ � 1 : =�i1(1) f; � 2 : i$="":b%=�i1(1):ȕ b%<>0:i$+=�b%:b%=�i1(1):�:=i$ p � 3 : =�i2(1) z � 4 : =�i4(1) � � 5 : =0 �� �=0 � � ݤpic_QRT �� Makes QRT image �+iType%=0:� Set low-to-high type of data �2width%=�i2(1):height%=�i2(1):� Read resolution �4mode%=�mode(width%,height%,256):� Determine mode �,�new_image(mode%,width%,height%,0) � =� �.InPal%(0)=24:� No palette, pure 24-bit RGB �F�image_info("QRT RAW",width%,height%,2,24,mode%,"","",Flen%,Flen%) �J�var("fptr",4):�var("widt",width%):�var("heig",height%):�unpack("QRT") ImgMode%=mode%:=� ݤpic_ARVIS $� Makes ArVis image .+iType%=0:� Set low-to-high type of data 8g�iptr(1,4):�iptr(1,�,�,1)-4):�iskip(1,16):width%=�i4(1)*4+4:height%=�height%=�h1)+1:� Get width and height Bu�iskip(1,8):�iskip(1,�,�,1)-36):�iptr(2,4):�iptr(2,�,�,2)-4):�iskip(2,32):�iskip(2,�,�,2)-36):� Go to sprite data L-colbits%=15:colours%=2^colbits%:� Colours V4mode%=�mode(width%,height%,256):� Determine mode `,�new_image(mode%,width%,height%,0) � =� j.InPal%(0)=15:� No palette, pure 15-bit RGB tD�image_info("ArVis",width%,height%,2,15,mode%,"","",Flen%,Flen%) ~i�var("fptr",�iptr(1)):�var("fpt2",�iptr(2)):�var("widt",width%):�var("heig",height%):�unpack("ARVIS") �ImgMode%=mode%:=� � �ݤpic_CLEAR �� Makes Clear image �+iType%=0:� Set low-to-high type of data �?maker$=�istring(1,-1):version%=�i4(1):� Creator information �Bwidth%=�i4(1):height%=�height%=�h1):bits%=�i4(1):� Width, height, bpp �~�bits%<=8 � colbits%=bits%:� c%=1 � 2^bits%:rgb%=�i3(1):InPal%(c%)=(rgb%�&FF00)+(rgb%>>16)+((rgb%�&FF)<<16):� � colbits%=8 �$InPal%(0)=bits%:� Bits per pixel �;mode%=�mode(width%,height%,2^colbits%):� Determine mode �,�new_image(mode%,width%,height%,0) � =� ���image_info("Clear",width%,height%,code%,bits%,mode%,"","by "+maker$+" "+�(version%�100)+"."+�"0"+�(version%�100),2),Flen%,Flen%) S�var("fptr",�iptr(1)):�var("widt",width%):�var("heig",height%):�unpack("CLEAR") ImgMode%=mode%:=� Y��image_info(type$,width%,height%,code%,colbits%,mode%,compr$,info$,datalen%,piclen%) (&� Sets information about the image 2� factor%,w%,h%,c%,i%,id$ <FImgW%=width%:ImgH%=height%:ImgBits%=colbits%:� Register resolution F$IMIfn%=Leaf$:$IMIit%=type$ P+�info$="" � $IMIin%="-" � $IMIin%=info$ Z$IMIif%=�Flen%+" bytes" dn�compr$="" � $IMIco%="None (0%)" � factor%=100-�(100*(datalen%/piclen%)):$IMIco%=compr$+" ("+�factor%+"%)" n,$IMIwh%=�width%+" x "+�height%+" pixels" x]�(width%>SprW%)�(height%>SprH%) � $IMIsc%="to "+�SprW%+" x "+�SprH% � $IMIsc%="Full size" �C$IMIbp%=�(colbits%)+"-bit "+�"colour grey RGB",1+code%*8,8) �J�mode_info(mode%,w%,h%,c%):$IMIsm%=�mode%+" ("+�w%+"x"+�h%+"x"+�c%+")" �� � ���new_image_window �A� Creates new image window of appropiate size in current mode �� w% �$�autozoom:� Auto zoom if enabled �?!block=win_img%:ș WDeleteW%,,block:� Delete old definition ܑw%=window1:!w%=0:w%!4=0:w%!8=�sprW:w%!12=�sprH:w%!20=�sprH:w%!40=0:w%!44=0:w%!48=�sprW*ZoomX:w%!52=�sprH*ZoomY:$IMWtt%=�image_title:� Rewrite �8ș WCreateW%,,window1 � win_img%:� Create new window �#�Img � �open_window(win_img%,0) �� ݤimage_title :� Returns image window title depending on zoom factors "� title$ ,title$="Image":� Base 6K�ZoomX<1 � title$+=" x/"+�(1/ZoomX) � �ZoomX>1 � title$+=" x*"+�(ZoomX) @K�ZoomY<1 � title$+=" y/"+�(1/ZoomY) � �ZoomY>1 � title$+=" y*"+�(ZoomY) J=title$+" "+Load$ T ^(ݤnew_image(mode%,xres%,yres%,room%) hA� Creates room for picture sprite of specific resolution/mode rG� and partitions memory (at least room% from sprite start to lomem) |-� Returns TRUE if all is well, else FALSE �8� bits%,words%,end%,size%,colbits%,sprdoff%,sprfoff% �:yres%=yres%*(YMul%/YDiv%):� Apply scaling factor for Y �:xres%=xres%*(XMul%/XDiv%):� Apply scaling factor for X �`�(yres%<=0)�(xres%<=0) � �error(-1,"There are no pixels left with the current scaling !"):=� �2colbits%=2^�mode_var(mode%,9):� Bits per pixel �?bits%=xres%*colbits%:bitsrot%=yres%*colbits%:� Bits per row �Cwords%=(bits%+31)>>5:wordsrot%=(bitsrot%+31)>>5:� Words per row �,sprdoff%=44:sprfoff%=Sprite%!8:� Offsets �)sptr%=Sprite%+sprfoff%:� Sprite start �Fsizeup%=words%*yres%<<2:sizerot%=wordsrot%*xres%<<2:� Sprite sizes �Kdatasize%=�max(sizeup%,sizerot%):� Maximum sprite size (normal/rotated) �8datasize%=�max(datasize%,room%):� More room needed ? �Fend%=sptr%+sprdoff%+datasize%:� Address of first byte after sprite ��(end%+1024)>Himem% � �error(-1,"I cannot handle this image. I need about "+�((end%+1024-Himem%+1023)�1024)+"K more memory."):=� 4sptr%!0=sprdoff%+sizeup%:� Offset to next sprite ,�sprite_header(1):� Update sprite header &0$(sptr%+4)=ImageSpr$+�12,�0):� Sprite's name 0(sptr%!16=words%-1:� Width in words-1 :,sptr%!20=yres%-1:� Height in scanlines-1 D=sptr%!24=0:sptr%!28=31-(words%*32-bits%):� Start/end bits NDsptr%!32=sprdoff%:sptr%!36=sptr%!32:� Offset to sprite data/mask X#sptr%!40=mode%:� Mode of sprite bHș "Translator_WriteWords",sptr%+sprdoff%,0,sizeup%>>2:� Wipe sprite l4Lomem%=end%:� End of sprite, start of free space v9�var("lome",Lomem%):�var("hime",Himem%):� Module info �(�var("rowl",words%<<2):� Module info �'�var("outb",colbits%):� Module info �-�var("spri",sptr%+sptr%!32):� Module info �JSprColbits%=colbits%:SprPtr%=sptr%:SprMode%=mode%:� Global sprite info �DSprW%=xres%:SprH%=yres%:� Remember sprite's resolution in pixels �Isize%=((Himem%-Lomem%)�256)*256:� Size of free space in sprite buffer �=� � ���sprite_header(code%) �H� Initialises (0) or updates (1) sprite area header (sprite changed) �Ȏ code% � �6 � 0 : Sprite%!0=Spritesize%:� Size of sprite area �D Sprite%!4=0:Sprite%!8=16:Sprite%!12=16:� No sprite yet !? Himem%=Sprite%+Spritesize%:� End of sprite buffer !@ � 1 : Sprite%!4=1:Sprite%!12=Sprite%!8+!(Sprite%+Sprite%!8) !� ! � !* !4 ��hour_on !>� Turns hourglass on !Hș "Hourglass_Start",4 !R� !\ !f��hour_off !p� Turns hourglass off !zș "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%,ptr$,r0,r1,r2,r3 !ʓ!pointer=512:pointer!4=0:pointer!8=16:pointer!12=16:ptr$="ptr":ș "OS_SpriteOp",15+256,pointer,ptr$,0,32,32,11:� Initialise pointer sprite area !Եș OSSpop%,60+256,pointer,ptr$,0 � r0,r1,r2,r3:� 0,124:�0,3:�1,0,-32:�0,0,32:�1,40,0:�0,-40,0:�1,60,-30:�0,-60,26:�1,60,-30:ș OSSpop%,r0,r1,r2,r3:� Plot arrow in pointer sprite !�?�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 ">�ScrW%>sprW% � sizex%=sprW% � sizex%=ScrW%:� Initial width "?�ScrH%>sprH% � sizey%=sprH% � sizey%=ScrH%:� Initial height "K!arg%=sizex%:arg%!4=sizey%:arg%!8=sprW%:arg%!12=sprH%:� Initial scaling "$/�:�plot_image(0,0,0,arg%):� Initial display ".�size � "8? ȗ ȓ 0,0,ScrW%-xs%,ScrH%-ys%:� Restrict pointer to screen "B6 ox%=sizex%-xs%:oy%=sizey%-ys%:� 'Old' coordinates "L0 ȗ � ox%,oy%:� Pointer to upper left corner "V? � �rmouse(_%,_%,but%):� but%=0:� Wait for buttons released "`( � �value_ptr(sizex%�xs%,sizey%�ys%) "j: � �rmouse(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 "�6 ș "OS_CLI","Pointer 1":� Restore default pointer "�� "��part � "�> � �mouse(_%,_%,but%):� but%=0:� Wait for buttons released "�@ ȗ ȓ 0,0,sizex%-xs%,sizey%-ys%:� Restrict pointer to image # < ȗ � 0,sizey%-ys%:� Mouse to top right of scaled sprite # 8 � �rmouse(x1%,y2%,but%):�value_ptr(x1%�xs%,y2%�ys%) ## � but%<>0:� Get top left point #> � �mouse(_%,_%,but%):� but%=0:� Wait for buttons released #(, x2%=x1%:y1%=y2%:� Initial window corner #2> ȗ ȓ x1%,0,sizex%-xs%-x1%,y2%:� Trap mouse to down/right #<3 ș WSetCol%,(4<<4)+0:� Invert colour on screen #FA ox%=x2%:oy%=y1%:ȓ x1%,y1%,x2%-x1%,y2%-y1%:� First rectangle #P � �rmouse(x2%,y1%,but%) #Z0 �value_ptr((x2%-x1%)�xs%+1,(y2%-y1%)�ys%+1) #d �(x2%<>ox%)�(y1%<>oy%) � #n5 ȓ x1%,oy%,ox%-x1%,y2%-oy%:� Wipe old rectangle #x0 ȓ x1%,y1%,x2%-x1%,y2%-y1%:� New rectangle #�* ox%=x2%:oy%=y1%:� Old mouse position #� � #�* � 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 #�" � 0,0:� Wipe surrounding area #�: _%=x1%-xs%:�_%>=0 � � 103,_%,1024-ys% � � _%,1024-ys% #�= _%=y2%+ys%:�_%<ScrH% � � 103,1280-xs%,_% � � 1280-xs%,_% #�/ _%=x2%+xs%:�_%<ScrW% � � 103,_%,0 � � _%,0 #�8 _%=y1%-ys%:�_%>=0 � � 103,x1%-xs%,_% � � x1%-xs%,_% #�6 ș "OS_CLI","Pointer 1":� Restore default pointer #�E� x1%=0:y1%=0:x2%=sizex%-xs%:y2%=sizey%-ys%:� Whole sprite window #�� $&�24,x1%;y1%;x2%;y2%;:� Clip window $� $ $"��rmouse(� x%,� y%,� but%) $,J� Returns mouse coordinates and buttons, rounded to exact pixel coords $6$�mouse(x%,y%,but%):� Mouse state $@*x%-=x% � xs%:y%-=y% � ys%:� Round down $J� $T $^��value_ptr(val1%,val2%) $h� Puts values in pointer $rEș OSSpop%,60+256,pointer,ptr$,0 � r0,r1,r2,r3:� Output to sprite $|w�129:�2:�0,2);�" "+�val1%,4)'�" "+�val2%,4);:ș OSSpop%,36+256,pointer,ptr$,%0000010:� Print values and define $�5ș OSSpop%,r0,r1,r2,r3:� Restore output to screen $�� $� $���options_menu(create) $�4� (Re)writes options menu, optionally creates it $� � i1$,i2$ $�9i1$=�sel(0,1,0,�Img,0)+"Image info#"+�win_iminfo%+"|" $�-i1$+=�sel(0,1,0,0,0)+"Pop up#"+�sub1%+"|" $�1i1$+=�sel(0,1,0,0,0)+"Processing#"+�sub1%+"|" $�,i1$+=�sel(0,0,0,�Img,0)+"Image palette|" $�4i2$+=�sel(0,0,0,�Img,0)+"Zoom image#"+�sub1%+"|" $�+i2$+=�sel(0,0,0,�Img,0)+"Rotate image|" $�6i2$+=�sel(0,1,0,�Img,0)+"Mirror image#"+�sub1%+"|" %2i2$+=�sel(Palonoff,0,0,0,0)+"Include palette|" %4i2$+=�sel(0,1,0,�Img,0)+"Save image#"+�sub1%+"|" %i2$+=" Status#"+�sub1%+"|" %&;�create_menu(-1,0,"Translator",260,40,0,i1$,i2$,create) %0� %: %D��submenu(path$,create) %N5� (Re)writes submenu path$, optionally creates it %X� i$,i2$ %b2CurrSub$=path$:� Remember current submenu path %lȎ path$ � %v� � "Pop up" : i$=�sel(AutoMode,0,0,0,0)+"Auto mode|"+�sel(AutoPal,0,0,0,0)+"Auto palette|"+�sel(AutoZoom,0,0,0,0)+"Auto zoom|"+�sel((ModeSet>0),0,0,�AutoMode,0)+"Mode set#"+�sub2%+"|" %�@ �create_menu(x%,y%,"^1Pop up",13*16,40,0,i$,"",create) %�� � "Pop up.Mode set" : i$=�sel((ModeSet=0),0,0,0,0)+"None|"+�sel((ModeSet=1),0,0,0,0)+"Normal|"+�sel((ModeSet=2),0,0,�MultiSync,0)+"Multisync|"+�sel((ModeSet=3),0,1,0,0)+�ums+"&a0-9,|" %�B �create_menu(x%,y%,"^2Mode set",10*16,40,0,i$,"",create) %�� � "Processing" : i$=�sel(ClearFile,0,0,0,0)+"Clear output#"+�win_file%+"| Output mode#"+�sub2%+"|"+�sel(0,0,0,(OutMode=1),0)+"Output palette#"+�sub2%+"|" %�� i$+=�sel(((XMul%<>XDiv%)�(YMul%<>YDiv%)),0,0,0,0)+"Scaling#"+�sub2%+"|"+�sel(ErrSpread,0,0,0,0)+"Error spreading|"+�sel(BlackWhite,0,0,0,0)+"Black and white|" %�� i2$=�sel(ZigZag,0,0,0,0)+"Zig zag|"+" RGB resolution#"+�win_rgbbits%+"|"+�sel(InvertRGB,1,0,0,0)+"Invert RGB|"+�sel(Blanking,0,0,0,0)+"Screen blanking|"+�sel(GIFScan,0,0,0,0)+"GIF scan| Image number#"+�sub2%+"|" %�E �create_menu(x%,y%,"^1Processing",16*16,40,0,i$,i2$,create) %ƙ � "Processing.Output mode" : �create_menu(x%,y%,"^2Mode",8*16,40,0,�sel((OutMode=1),0,0,0,0)+"Auto|"+�sel((OutMode=2),0,0,0,0)+"Current|","",create) %�� � "Processing.Output palette" : �create_menu(x%,y%,"^2Palette",10*16,40,0,�sel((OutPal=1),0,0,0,0)+"Current|"+�sel((OutPal=2),0,0,0,0)+"Default|"+�sel((OutPal=3),0,0,0,0)+"Greyscale|","",create) %ڰ � "Processing.Scaling" : �create_menu(x%,y%,"^2Scaling",5*16,40,0,�sel((XMul%<>XDiv%),0,0,0,0)+"x#"+�sub3%+"|"+�sel((YMul%<>YDiv%),0,0,0,0)+"y#"+�sub3%+"| 1:1|","",create) %�r � "Processing.Scaling.x" : �create_menu(x%,y%,"^3X",10*16,40,0,"$"+�(XMul%)+":"+�(XDiv%)+"&a0-9:|","",create) %�r � "Processing.Scaling.y" : �create_menu(x%,y%,"^3Y",10*16,40,0,"$"+�(YMul%)+":"+�(YDiv%)+"&a0-9:|","",create) %�n � "Processing.Image number" : �create_menu(x%,y%,"^2Number",6*16,40,0,"$"+�(ImageNr%)+"&a0-9|","",create) &� � "Zoom image" : �create_menu(x%,y%,"^1Zoom",4*16,40,0," In#"+�sub2%+"| Out#"+�sub2%+"|"+�sel(((ZoomX=1)�(ZoomY=1)),0,0,0,0)+"1:1|","",create) &p � "Zoom image.In","Zoom image.Out" : �create_menu(x%,y%,"^2"+�path$,12),5*16,40,0," Both| x| y|","",create) &S � "Mirror image" : �create_menu(x%,y%,"^1Mirror",6*16,40,0," x| y|","",create) & Y � "Status" : �create_menu(x%,y%,"^1Status",5*16,40,0," Save| Load| Kill|","",create) &*� � "Save image" : �create_menu(x%,y%,"^1Save image",15*16,40,0," Full| Whole| Whole (scaled)| Part| Part (scaled)|","",create) &4 : CurrSub$="" &>� &H� &R &\��set_mode(mode%) &f2� Sets new mode (if enabled) for image display &p� log2bpp% &z>�AutoMode � �set_trans:�:� Auto mode selection not enabled &�)log2bpp%=�mode_var(mode%,9):� Log2BPP &�Ȏ ModeSet � &�4 � 0 : � No mode set : no change of display mode &�: � 1 : mode%=��" 0 81215",log2bpp%*2+1,2):� Normal set &�= � 2 : mode%=��"18192021",log2bpp%*2+1,2):� Multisync set &�4 � 3 : mode%=UserModeSet%(log2bpp%+1):� User set &�� &�}�MultiSync � �(mode%>=18)�(mode%<=28) � mode%=�(�"0008121515002400081215",(mode%-18)*2+1,2)):� Map to non-multisync mode &�%�mode_change(mode%):� Select mode &�� &� &���mode_change(mode%) &�)� Mode has changed or select new mode ')� If mode%>=0, mode mode% is selected 'J� _%,xwind%,ywind%,othermode,colours%,pos%,altmode$,modecols%,sprcols% '3ș WReadP%,,wimppal:� Read current WIMP palette '$�(mode%>=0) � (mode%<>�) � '." ș WSetM%,mode%:� Change mode '8 �mode%<>� � 'BG � 1,-10,180,1:� Alert user that 'ideal' mode couldn't be selected 'L: colours%=2^(2^�mode_var(mode%,9)):� Colours required 'V� �colours%=2 � altmode$="|1800" � �colours%=4 � altmode$="|1908|0801" � �colours%=16 � altmode$="|2012|1612|1209" � �colours%=256 � altmode$="|2115|2415|1513|1310" '` � 'j� ��=mode% � pos%=�altmode$,"|"+�"0"+�mode%,2)):�pos%>0 � mode%=�(�altmode$,pos%+3)) � �error(-1,"I failed to select the ideal mode, nor any alternative mode ! Now you try it !"):mode%=-1 't# ș WSetM%,mode%:� Change mode '~ � (�=mode%) � (mode%<0) '� � '�� '�@othermode=(�<>CurrMode%):CurrMode%=�:� Mode other than old ? '�AXeig%=�mode_var(�,4):Yeig%=�mode_var(�,5):� Read X/YEigFactor '�Bxwind%=�mode_var(�,11)+1:ywind%=�mode_var(�,12)+1:� Resolution '�AScrW%=(1<<Xeig%)*xwind%:ScrH%=(1<<Yeig%)*ywind%:� Screen size '� �Img � '�+ �set_trans:� Re-set sprite translation '�A �AutoPal � �set_palette(1):� Select image palette if enabled '�# �othermode � �new_image_window '�� '�� ( ( ��set_trans (C� Sets translation factors (transtab & palette) for sprite plot (!� mc%,sc%,v%,c%,gv%,gi%,i%,p% ((<mc%=2^(2^�log2BPP):sc%=2^SprColbits%:� Colours available (2GShowPal%()=ImgPal%():ShowPal%(0)=2^ShowPal%(0):� Copy image palette (<%�mc%=sc% � TransTabId=�:�:� Ideal (F%TransTabId=�:� Always translation (P�mc%>sc% � (Z: �mc%<=16 � � c%=0 � sc%-1:transtab%?c%=c%�(mc%-1):�:� (d; ș "Translator_Palette",8,dum%,1:� Get current palette (n_ � c%=0 � sc%-1:ș "Translator_ClosestToRGB",ShowPal%(c%+1),256,dum% � v%:transtab%?c%=v%:� (x1� � Less colours than required, so compromise (�� �FreqCalc � �hour_on:ș "Translator_PixelFreq",SprPtr%,freq%:�hour_off:FreqCalc=�:� Calculate pixel frequencies in image sprite (� �hour_on:� Hourglass on (�C p%=dum%:� c%=1 � sc%:!p%=ImgPal%(c%):p%+=4:�:� Image's palette (�: � Calculate translation table and palette for display (�K ș "Translator_CalcTrans",sc%,freq%,dum%,mc%,transtab%,arg% � ,,,used% (�C p%=arg%:� c%=1 � used%:ShowPal%(c%)=!p%:p%+=4:�:� Read palette (�8 ShowPal%(0)=used%:� Colours used in display palette (� �hour_off:� Hourglass off (�� (�� (� (���autozoom (�3� Adjust zoom factor for auto zoom (if enabled) )� _% )�AutoZoom � )7 _%=�sprW*ZoomX:ȕ _%>ScrW%:ZoomX=ZoomX/2:_%=_%/2:� )"6 �ZoomX<1 � ȕ _%*2<=ScrW%:ZoomX=ZoomX*2:_%=_%*2:� ),7 _%=�sprH*ZoomY:ȕ _%>ScrH%:ZoomY=ZoomY/2:_%=_%/2:� )66 �ZoomY<1 � ȕ _%*2<=ScrH%:ZoomY=ZoomY*2:_%=_%*2:� )@� )J� )T )^#��plot_image(x%,y%,act%,scale%) )h/� Plots image sprite with translation table )r�TransTabId � ș OSSpop%,564,Sprite%,SprPtr%,x%,y%,act%,scale% � ș OSSpop%,564,Sprite%,SprPtr%,x%,y%,act%,scale%,transtab% )|� )� )���unpack(type$) )�+� Unpacks image (final unpacking phase) )�� c%,bpp%,pc% )�)bpp%=InPal%(0):� Bits per pixel input )�4�var("inbi",bpp%):� Input (image) bits per pixel )�&�var("bwhi",BlackWhite):� B/w flag )�1�var("espr",ErrSpread):� Error spreading flag )�&�var("zigz",ZigZag):� Zig zag flag )�,�var("invt",InvertRGB):� Invert RGB flag )�*�var("phas",1):� Final unpacking phase )�&�var("rgbb",RGBbits%):� R/G/B bits )�=�var("ymul",YMul%):�var("ydiv",YDiv%):� Scaling factors Y *=�var("xmul",XMul%):�var("xdiv",XDiv%):� Scaling factors X *8� Set palette (if relevant, i.e. not pure RGB input) *?�bpp%<=8 � � c%=0 � 2^bpp%-1:palrgb%!(c%<<2)=InPal%(c%+1):� *&9�OutMode=1 � pc%=0 � pc%=OutPal:� Select palette code *0�ClearFile � *:9 Out=�(ClearSave$):�var("capt",Out):� Open Clear file *Du �ostring(Out,"Translator"):�o(Out,0,1):�o(Out,600,4):�o(Out,SprW%,4):�o(Out,SprH%,4):�o(Out,ImgBits%,4):� Header *Nk �ImgBits%<=8 � � c%=1 � 2^ImgBits%:rgb%=InPal%(c%):�#Out,rgb%>>16:�#Out,rgb%>>8:�#Out,rgb%:�:� Palette *X� *b:ș "Translator_UnpackPre",palrgb%,pc%:� Init unpacking *lhImgPal%(0)=SprColbits%:� c%=0 � 2^SprColbits%-1:ImgPal%(c%+1)=palrgb%!(c%<<2):�:� Read image palette *v7�unpack_phase(type$,1):� Execute final unpack phase *��ClearFile � *�� ClearFile=�:�#Out:�var("capt")=0 � ș "OS_File",6,ClearSave$:�error(-1,"Error during output to Clear file : "+�string(�var("erro")+4)):� Remove Clear file if error *�� *�� *� *� ��unpack_phase(type$,phase%) *�5� Executes unpack phase, blanks screen if enabled *�-�var("phas",phase%):� Set unpacking phase *�+$dum%=�type$+" ",4):� Type to unpack *�=�Blanking � ș "Translator_VideoDMA",0:� Blank if enabled *�7ș "Translator_Unpack",!dum%:� Execute unpack phase *�A�Blanking � ș "Translator_VideoDMA",1:� Re-enable if blanked *�� + +��set_palette(palette%) +*� Sets a palette according to palette% + � 0 - Desktop palette +*I� 1 - Image's own palette (when possible, else desktop palette used) +4� c% +>Ȏ palette% � +H � 0 : ș WSetP%,,wimppal +Rt � 1 : �c256 � � c%=0 � ShowPal%(0)-1:dum%!(c%<<2)=ShowPal%(c%+1):�:ș "Translator_SetPalette",ShowPal%(0),dum% +\� +f� +p +z%��standard_palette(� Pal%(),bpp%) +�H� Sets a palette to standard Archimedes 2,4,16 or 256 colour palette +�� c%,p% +�Dș "Translator_Palette",bpp%,dum%,2:� Calculate standard palette +�=p%=dum%:� c%=1 � 2^bpp%:Pal%(c%)=!p%:p%+=4:�:Pal%(0)=bpp% +�� +� +���grey_palette(bpp%,dir%) +�=� Sets input palette to greyscale for bpp% bits per pixel +�?� dir%=1 gives black to white, dir%=-1 gives white to black +�� code%,c%,p% +��dir%=1 � code%=3 � code%=4 +�Aș "Translator_Palette",bpp%,dum%,code%:� Calculate greyscale +�Ap%=dum%:� c%=1 � 2^bpp%:InPal%(c%)=!p%:p%+=4:�:InPal%(0)=bpp% ,� , ,4��mode_info(mode%,� width%,� height%,� colours%) ,$1� Returns information about a particular mode ,.ncolours%=2^(2^�mode_var(mode%,9)):width%=1+�mode_var(mode%,11):height%=1+�mode_var(mode%,12):� Return info ,8� ,B ,L��invalidate_screen ,V� Invalidates entire screen ,`=ș WForce%,-1,0,0,ScrW%,ScrH%:� Force redraw whole screen ,j� ,t ,~��invalidate_image ,�� Invalidates image ,�Img=�:FreqCalc=�: ,�� ,� ,���new_window(handle%) ,� � Redraws entire window area ,��redraw_window(handle%,�) ,�� ,� ,�"��redraw_window(handle%,force) ,�(� Redraws window with handle handle% ,�<� If force=TRUE the window's entire work area is updated - +� more%,nx%,ny%,vw%,vh%,small%,x%,y%,s% - (!block=handle%:� Set window's handle -x�force � block!4=0:block!8=0:block!12=&7FFF:block!16=&7FFF:ș WUpdateW%,,block � more% � ș WRedrawW%,,block � more% -Fnx%=(block!4-block!20):ny%=(block!16-block!24):� Get sprite origin -(Avw%=block!12-block!4:vh%=block!16-block!8:� Visible area size -2Ȏ handle% � -<' � win_img% : � Redraw image window -F? �ZoomX>=1 � !arg%=ZoomX:arg%!8=1 � !arg%=1:arg%!8=1/ZoomX -PC �ZoomY>=1 � arg%!4=ZoomY:arg%!12=1 � arg%!4=1:arg%!12=1/ZoomY -Z@ small%=((vw%<=160)�(vh%<=160)):� Window possibly too small -dD �small% � x%=block!4:y%=block!8:s%=�max(vw%,vh%):ș WSetCol%,0 -n* ȕ more%:�small% � ȓ Ȑ x%,y%,s%,s% -x8 �plot_image(nx%,ny%,0,arg%):� Display image sprite -�5 ș 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 -�� b%,px%,py%,_%,xs%,ys% -��info<>0 � -�' � b%=0 � 31 � 4:block!b%=info!b%:� -�&� !block=handle%:ș WGetWS%,,block -�� �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 -�� .ș WOpenW%,,block .� . ."��close_window(handle%) .,'� Closes window with handle handle% .6%!block=handle%:ș WCloseW%,,block .@� .J .Tݤpoll(mask%) .^@� Returns poll reason code, masking with mask%, data at poll .h� reasoncode .r%ș WPoll%,mask%,poll � reasoncode .|=reasoncode .� .���initialise .�� Initialises program .�>ș "Wimp_ReadPalette",,wimppal:� Read current WIMP palette .�7�hour_on:�init_module:�hour_off:� Initialise module .�Dș "OS_CheckModeValid",18 � _%:MultiSync=(_%<>-1):� Monitor type .�0applname$="Translator":� Name of application .�Fș "Wimp_Initialise",200,&4B534154,applname$ � version,TaskHandle% .�9�version<200 � � 1,"I cannot work with WIMP pre-2.00" .�6W%=�swi_to_nr("Wimp_Initialise"):� Base SWI number .�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:WSetIS%=W%+13 .�WGetIS%=W%+14:WGetPI%=W%+15:WDragB%=W%+16:WForce%=W%+17:WCreateM%=W%+20:WDecodeM%=W%+21:WSetE%=W%+23:WLoadT%=W%+27:WReport%=W%+31:WSetM%=W%+35 .�NWSetP%=W%+36:WReadP%=W%+37:WSetCol%=W%+38:WSendMsg%=W%+39:WCreateSM%=W%+40 /}OSSpop%=�swi_to_nr("OS_SpriteOp"):OSReadVV%=�swi_to_nr("OS_ReadVduVariables"):OSReadMV%=�swi_to_nr("OS_ReadModeVariable") /3ș WReadP%,,wimppal:� Read current WIMP palette /=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 /0� Load sprites for icons /:H!iconsprites=2048:iconsprites!4=0:iconsprites!8=16:iconsprites!12=16 /D<ș OSSpop%,10+256,iconsprites,"<Translator$Dir>.Sprites" /N� Load templates /X8ș "Wimp_OpenTemplate",,"<Translator$Dir>.Templates" /b<ic=icondata:ie=icondend:� Indirected icon data workspace /l;$dum%="save":ș WLoadT%,,window2,ic,ie,-1,dum%,0 � ,,ic /v$window2!(88+24)=1:� WIMP areaptr /�%ș WCreateW%,,window2 � win_file% /�?SAVsn%=�iconaddr(win_file%,0):SAVfn%=�iconaddr(win_file%,1) /�;$dum%="info":ș WLoadT%,,window3,ic,ie,-1,dum%,0 � ,,ic /�%ș WCreateW%,,window3 � win_info% /�@$dum%="filetypes":ș WLoadT%,,window5,ic,ie,-1,dum%,0 � ,,ic /�&ș WCreateW%,,window5 � win_filet% /�@$dum%="imageinfo":ș WLoadT%,,window4,ic,ie,-1,dum%,0 � ,,ic /�'ș WCreateW%,,window4 � win_iminfo% /Љw%=win_iminfo%:IMIfn%=�iconaddr(w%,9):IMIit%=�iconaddr(w%,10):IMIin%=�iconaddr(w%,11):IMIif%=�iconaddr(w%,12):IMIco%=�iconaddr(w%,13) /�cIMIwh%=�iconaddr(w%,14):IMIsc%=�iconaddr(w%,15):IMIbp%=�iconaddr(w%,16):IMIsm%=�iconaddr(w%,17) /�>$dum%="rgbbits":ș WLoadT%,,window6,ic,ie,-1,dum%,0 � ,,ic /�D� i%=3 � 5:ap%=window6+88+i%*32+24:!ap%=iconsprites:�:� Areaptrs /�(ș WCreateW%,,window6 � win_rgbbits% 0F$dum%="image":IMWtt%=ic:ș WLoadT%,,window1,ic,ie,-1,dum%,0 � ,,ic 0+window1?35=&FF:� Transparent background 0$ș WCreateW%,,window1 � win_img% 0 ș "Wimp_CloseTemplate" 0*� Init variables 04�SaveKind$="":Img=�:Palonoff=�:ZoomX=1:ZoomY=1:sub1%=submenu1:sub2%=submenu2:sub3%=submenu3:ImageSpr$="image":CurrSub$="":Flen%=0:Load$="" 0>�DataSaveRef%=-1:DataLoadRef%=�:YMul%=1:YDiv%=1:XMul%=1:XDiv%=1:ClearFile=�:SaveSpr$="Image":SaveClear$="Clear":SprSave$="":ClearSave$="" 0H�File()=0:SprW%=0:SprH%=0:ImageNr%=1:AutoMode=�:AutoPal=�:CurrMode%=-1:ErrSpread=�:ModeSet=0:UserModeSet%()=0,0,8,12,15:AutoZoom=� 0R�BlackWhite=�:TransTabId=�:ImgMode%=0:GIFScan=�:RGBbits%=&080808:Blanking=�:ZigZag=�:InvertRGB=�:FreqCalc=�:OutMode=1:OutPal=1 0\0�load_status:� Load default status (if any) 0f.�sprite_header(0):� Initialise sprite area 0p� 0z 0�ݤiconaddr(win%,ico%) 0�,� Returns indirected icon's data address 0�>!block=win%:block!4=ico%:ș WGetIS%,,block:� Get icon info 0� =block!28 0� 0�ݤload_status 0�#� Loads default status (if any) 0�H� Returns TRUE if succesful, else FALSE (i.e. status file not found) 0�6Status=�("<Translator$Dir>.Status"):�Status=0 � =� 0�8�#Status,AutoMode,AutoPal,ModeSet,ErrSpread,Palonoff 0���#Status � �#Status,UserModeSet%(1),UserModeSet%(2),UserModeSet%(3),UserModeSet%(4):��#Status � �#Status,AutoZoom:��#Status � �#Status,BlackWhite 0�}��#Status � �#Status,GIFScan:��#Status � �#Status,Blanking:��#Status � �#Status,InvertRGB:��#Status � �#Status,ZigZag 0��#Status:=� 1 1H��create_menu(x%,y%,title$,width%,height%,gap%,icon1$,icon2$,create) 16� Writes menu structure, creates it if create=TRUE 1$=� - If x%<0 then x/y coordinates are (mouseX-64),(mouseY) 1.J� - If title$ starts "^<nr>" then this becomes a <nr>'th submenu (1/2) 18A� - Menu icons in icon strings : ?<icon1>|?<icon2>|..... etc. 1B1� - ? is a character containing select bits : 1L� bit 0 : icon is ticked 1V1� bit 1 : icon is followed by a dotted line 1` � bit 2 : icon is writable 1j4� bit 3 : icon is shaded (i.e. not selectable) 1t>� bit 4 : writable icon has 40 characters room (else 16) 1~� bit 5 : always 1 1�A� - icons of form '?<str>&<val>' have validation string <val> 1�F� - icons of form '?<str>#<val>' have sub-window with handle <val> 1�4� also, the 'menu warning message' is selected 1�9� i$,ptr%,ix%,dataptr%,ilen%,p%,it$,type%,data$,menu% 1�"� valid$,sub,call%,tick%,writ% 1�4� butty%,shaded%,dotted%,sub%,subwarn%,icon%,nr% 1�?�x%<0 � �mouse(x%,y%,_%):x%-=64:� Get coordinates via mouse 1��title$,1)="^" � 1� sub=�:nr%=�(�title$,2,1)) 1�G �nr%=1 � menu%=submenu1 � �nr%=2 � menu%=submenu2 � menu%=submenu3 1� title$=�title$,3) 1�� sub=�:menu%=menu1 2 � 2 t$menu%=title$:menu%?12=tf%:menu%?13=tb%:menu%?14=wf%:menu%?15=wb%:menu%!16=width%:menu%!20=height%:menu%!24=gap% 2� Define icons 2)i$=icon1$:icon%=1:� First icon string 2(5ptr%=menu%+28:ix%=0:dataptr%=menu%+512:� Pointers 22ȕ i$<>"":p%=�i$,"|") 2<�p%=0 � 2F i$="" 2P� � Define icon 2Z! it$=�i$,p%-1):i$=�i$,�i$-p%) 2d& type%=��it$,1):data$=�it$,�it$-1) 2n� tick%=(type%�%000001):dotted%=(type%�%000010)>>1:writ%=(type%�%000100)>>2:shaded%=(type%�%001000)>>3:long%=(type%�%010000)>>4 2xq valid$="":p%=�data$,"&"):�p%>0 � valid$=�data$,p%+1):data$=�data$,p%-1):� Extract validation string (if any) 2�� sub%=-1:subwarn%=0:p%=�data$,"#"):�p%>0 � sub%=�(�data$,p%+1)):subwarn%=1:data$=�data$,p%-1):� Extract subwindow handle (if any) 2�> �writ%=0 � ilen%=�data$+1 ��long%=0 � ilen%=16 � ilen%=40 2�C !ptr%=(subwarn%<<3)+(writ%<<2)+(dotted%<<1)+tick%:� Menu flags 2�" ptr%!4=sub%:� Sub menu/window 2�> ptr%!8=(wb%<<28)+(wf%<<24)+(shaded%<<22)+(1<<8)+1:� Flags 2�E $dataptr%=data$:ptr%!12=dataptr%:ptr%!20=ilen%:dataptr%+=ilen%+1 2�T �valid$="" � ptr%!16=-1 � $dataptr%=valid$:ptr%!16=dataptr%:dataptr%+=�valid$+1 2� ptr%+=24:ix%+=1 2�� 2�*�i$="" � �icon%=1 � i$=icon2$:icon%+=1 2�� 2�2ptr%!-24=(ptr%!-24)�&80:� Indicate 'last icon' 2��create � � 3A�sub � ș WCreateSM%,,menu%,x%,y% � ș WCreateM%,,menu%,x%,y% 3� 3 3"ݤsel(t%,d%,w%,s%,r%) 3,2� Returns select character for icon attributes 36E=�((1<<5)+((r%�1)<<4)+((s%�1)<<3)+((w%�1)<<2)+((d%�1)<<1)+(t%�1)) 3@ 3J ݤums 3T7� Returns string representing current user mode set 3^\=�(UserModeSet%(1))+","+�(UserModeSet%(2))+","+�(UserModeSet%(3))+","+�(UserModeSet%(4)) 3h 3rݤavailable_mode(mode%) 3|C� Checks if mode% is a valid WIMP mode and available on monitor 3�0�mode%=3 � mode%=6 � mode%=7 � mode%=23 � =� 3��mode%<0 � mode%>28 � =� 3�*�mode%=24 � mode%<18 � =� � =MultiSync 3� 3�ݤalign(val%) 3�0� Returns next-up word aligned value of val% 3�=(val%+3)��3 3� 3�ݤreadpalval(rgb%) 3�3� Returns 'OS_ReadPalette' word from &RGB value 3�?=((rgb%�&FF)<<24)+((rgb%�&FF00)<<8)+((rgb%�&FF0000)>>8)+&10 3� 3�ݤstring(addr%) 42� Returns CTRL-char terminated string at addr% 4� _%,_c%,_$ 4_%=-1:� _%+=1:� addr%?_%<32 4&3_c%=addr%?_%:addr%?_%=13:_$=$addr%:addr%?_%=_c% 40=_$ 4: 4Dݤupstring(m$) 4N� Returns upper case m$ 4X� c%,v%,u$ 4bRu$=m$:� c%=1 � � m$:v%=��m$,c%,1):�(v%<=�"z")�(v%>=�"a") � �u$,c%,1)=�(v%�&5F) 4l �:=u$ 4v 4���mouse(� x%,� y%,� but%) 4�+� Returns x,y and button state of mouse 4�ȗ x%,y%,but% 4�� 4� 4� ݤc256 4�5� Returns TRUE if current mode is 256 colour mode 4�=(�log2BPP=3) 4� 4� ݤlog2BPP 4�&� Returns Log2BPP for current mode 4�=�mode_var(�,9) 4� 5ݤvdu_var(varnr%) 5!� Returns VDU variable varnr% 5;!arg%=varnr%:arg%!4=-1:ș OSReadVV%,arg%,arg%+8:=arg%!8 5 5*ݤmode_var(mode%,varnr%) 54(� Returns mode mode% variable varnr% 5> � result% 5H2ș OSReadMV%,mode%,varnr% � ,,result%:=result% 5R 5\ݤOS_var(_$) 5f.� Attempts to return OS-var's string value 5p � _r$,_l% 5z7ș "XOS_ReadVarVal",_$,�100," "),100,0,3 � ,_r$,_l% 5�_r$=�_r$,_l%):=_r$ 5� 5�ݤswi_to_nr(swi$) 5�)� Returns SWI number of SWI call swi$ 5�� swinr% 5�/ș "XOS_SWINumberFromString",,swi$ � swinr% 5�=swinr% 5� 5���error(errnr,errmsg$) 5�� Handles errors 5�� but%,oldpal,opt% 5�9ș "Translator_VideoDMA",1:� Ensure video DMA enabled 5�'�errnr=-1 � errnr=1:opt%=1 � opt%=3 6!err=errnr:$(err+4)=errmsg$ 6Dș "Translator_Palette",2^�log2BPP,dum%,1:� Read current palette 6)�set_palette(0):� Select WIMP palette 6$*ș WReport%,err,opt%,applname$ � ,but% 6.�but%<>1 � �die 68Bș "Translator_SetPalette",2^(2^�log2BPP),dum%:� Reset palette 6B� 6L 6V ݤsprW 6`?� Returns image sprite's width in OS pixels in current mode 6j=SprW%*2^�mode_var(�,4) 6t 6~ ݤsprH 6�@� Returns image sprite's height in OS pixels in current mode 6�=SprH%*2^�mode_var(�,5) 6� 6�ݤmax(v1%,v2%) 6�$� Returns maximum of v1% and v2% 6��v1%>v2% � =v1% � =v2% 6� 6� ��die 6�� Tidies up and exits 6��finish:� Tidy up 6�ș "OS_Exit" 6�� 7 7 ��finish 7� Tidies up 71� Send message to ask if module can be killed 7(�!block=20:block!12=0:block!16=&CCE00:ș WSendMsg%,18,block,0:kill=�:� listen%=�poll(0):kill=kill � ((listen%=19)�(poll!16=&CCE00)�(poll!12=0)):� listen%=0:�kill � ș "OS_Module",4,"Translator" 72&ș WSetP%,,wimppal:� Reset palette 7<-ș "Wimp_CloseDown",TaskHandle%,&4B534154 7F� 7P 7Z#ݤmode(width%,height%,colours%) 7dL� Returns, if possible, a standard screen mode that is most suitable for 7nK� displaying a picture of (width%)x(height%) pixels in colours% colours 7x6� Returns -1 if number of colours greater than 256 7�)� arccols%,arcwidth%,archeight%,mode% 7��OutMode=2 � =� 7�/� Range check for colours, width and height 7�&�colours%>256 � =-1:� Impossible ! 7�,� Determine closest colours/width/height 7�c�colours%>16 � arccols%=256 � �colours%>4 � arccols%=16 � �colours%>2 � arccols%=4 � arccols%=2 7�N�width%>640 � arcwidth%=1056 � �width%>320 � arcwidth%=640 � arcwidth%=320 7�3�height%<=256 � archeight%=256 � archeight%=512 7�Ȏ arccols% � 7�/ � 2 : �archeight%=512 � mode%=18 � mode%=0 7�K � 4 : �archeight%=512 � mode%=19 � �arcwidth%<=320 � mode%=1 � mode%=8 7�i � 16 : �archeight%=512 � mode%=20 � �arcwidth%<=320 � mode%=9 � �arcwidth%=640 � mode%=12 � mode%=16 7�� � 256 : �archeight%=512 � mode%=21 � �arcwidth%=160 � mode%=10 � �arcwidth%=320 � mode%=13 � �arcwidth%=640 � mode%=15 � mode%=24 8� 8 =mode% 8 8"ݤtimes(value%) 8,0� Returns STR$value% with 'plural extension' 86 � _d% 8@3_d%=value%�10:� Last digit determines extension 8J:�(((value%�100)�10)=1)�(_d%>3)�(_d%=0) � =�value%+"th" 8TȎ _d% � 8^ � 1 : =�value%+"st" 8h � 2 : =�value%+"nd" 8r � 3 : =�value%+"rd" 8|� 8� 8�ݤistring(fn%,len%) 8�!� Returns string of from file 8�0� If len%>0 the number of characters is len% 8�8� If len%=-1 the string is CTRL-character terminated 8�� _%,r$,c% 8�l_$="":�len%>0 � � _%=1 � len%:r$+=��i1(fn%):� � �len%=-1 � c%=�i1(fn%):ȕ c%>=�" ":r$+=�c%:c%=�i1(fn%):� 8�=r$ 8� 8���iskip(fn%,amount%) 8�!� Skips amount% bytes in file 8�#�#File(fn%)=amount%+�#File(fn%) 8�� 9 9��iptr(fn%,newptr%) 9� Sets new offset in file 9&�#File(fn%)=newptr% 90� 9: 9Dݤiptr(fn%) 9N$� Returns current offset in file 9X=�#File(fn%) 9b 9lݤilen(fn%) 9v� Returns length of file 9�=�#File(fn%) 9� 9�ݤieof(fn%) 9�(� Returns end-of-file status of file 9�=�#File(fn%) 9� 9���iclose 9�� Closes all input files 9�� f% 9�3� f%=1 � 10:�File(f%)>0 � �#File(f%):File(f%)=0 9�� 9�� 9� :��iget(fn%,adr%,amount%) :-� Returns amount% bytes at adr% from file :)ș "OS_GBPB",4,File(fn%),adr%,amount% : � :* :4ݤi1(fn%):=�i(fn%,1) :>ݤi2(fn%):=�i(fn%,2) :Hݤi3(fn%):=�i(fn%,3) :Rݤi4(fn%):=�i(fn%,4) :\ :fݤi(fn%,len%) :p'� Returns len%-byte value from file :z� _%,_r% :�_r%=0:� _%=1 � len% :�Ȏ iType% � :�# � 1 : _r%=(_r%<<8)+�#File(fn%) :�( : _r%+=((�#File(fn%))<<(_%-1)*8) :��:� :�=_r% :� :���o(fh%,val%,bytes%) :�+� Outputs value of bytes% bytes to file :�� i% :�-� i%=1 � bytes%:�#fh%,val%:val%=val%>>8:� :�� :� ;��ostring(fh%,v$) ;� Outputs string to file ;� i% ;$#� i%=1 � �v$:�#fh%,��v$,i%,1):� ;.� ;8 ;B��init_module ;L� Initialises module ;V.ș "Translator_MakeMaps":� Initialise maps ;`� ;j ;t��var(varname$,value%) ;~� Writes module variable ;�;$dum%=varname$:ș "Translator_SetVariable",!dum%,value% ;�� ;� ;�ݤvar(varname$) ;�� Reads module variable ;�� value% ;�>$dum%=varname$:ș "Translator_ReadVariable",!dum% � value% ;�=value% ;� ;�ݤOSvar(name$) ;�.� Attempts to return OS-var's string value ;� � _r$,_l% <