;Set your editor's TAB width to 3 chars. ;************************************************************************* ;ShowPic.asm ; Reads an ILBM file and displays it as a screen/window until the right ; mouse button is clicked. This program is similiar to Scheppner's Display ; program in that it handles normal and HAM ILBM's. ; ; This program is different than Display in the following ways: ; 1). It is written in assembly code. ; 2). It utilizes the dissidents IFF ILBM library which can be opened and ; used by many different tasks. ; 3). It utilizes the dissidents requester library for filename selection. ; ;This source code was assembled using INNOVATRONICS CAPE assembler. It was ;linked using Blink as follows: ; ; Blink StartUp.o ShowPic.o small.lib NODEBUG to ShowPic ; ; small.lib is from CATS, or Fish Disk #92. ; StartUp.o is my own version of a standard, startup code. SMALLOBJ ;CAPE directive for PC-relative addressing replaces absolute ADDSYM OPTIMON OBJFILE "rad:ShowPic.o" INCLUDE "IFF.i" ;the asm include file for ilbm.library INCLUDE "FileIO.i" ;the asm include file for requester.library ;from StartUp.o XREF _SysBase,_DOSBase,_stdout,_BUFFER ;from small.lib XREF _LVOCloseScreen,_LVOCloseWindow XREF _LVODelay XREF _LVOWait,_LVOWaitPort,_LVOGetMsg,_LVOPutMsg,_LVOReplyMsg,_LVOSignal XREF _LVOOpenLibrary,_LVOCloseLibrary XREF _LVODisplayAlert,_LVOWrite,_LVOInput,_LVOOutput,_LVOCurrentDir XREF _LVOAllocMem,_LVOFreeMem XREF _LVOFindTask LIB_VERSION equ 33 SECTION ShowPicCode,CODE out rts XDEF _main _main: movea.l _SysBase,a6 moveq #LIB_VERSION,d0 lea IntuiName,a1 jsr _LVOOpenLibrary(a6) move.l d0,_IntuitionBase beq out ;======Open dissidents Requester lib======== moveq #0,d0 ;any version (for now) lea RequesterName,a1 jsr _LVOOpenLibrary(a6) move.l d0,d1 beq.s REQe move.l d0,_RequesterBase ;======Open dissidents ILBM library=========== moveq #0,d0 ;any version (for now) lea ILBMName,a1 jsr _LVOOpenLibrary(a6) move.l d0,d1 beq.s IFFe move.l d0,_ILBMBase ;================Do our Display Pic routine================= bsr MAIN2 ;---Free the FileIO if allocated (FileIO lib checks for 0) movea.l a5,a1 movea.l _RequesterBase,a6 jsr _LVOReleaseFileIO(a6) ;---Close requester, ilbm libs movea.l _SysBase,a6 movea.l _RequesterBase,a1 jsr _LVOCloseLibrary(a6) movea.l _ILBMBase,a1 jsr _LVOCloseLibrary(a6) cIntu movea.l _IntuitionBase,a1 jmp _LVOCloseLibrary(a6) ;exit program, return to AmigaDOS ;==========Display An Alert Error Msg========= ;---No ILBM lib IFFe movea.l _RequesterBase,a1 jsr _LVOCloseLibrary(a6) lea IFFErrMsg,a1 bra.s post ;---No Requester lib REQe lea ReqErrMsg,a1 post bsr dsp_alert bra.s cIntu XDEF dsp_alert ;This makes an alert message out of the passed string in a1 ;and displays it as an alert or CLI msg. 79 chars MAX in passed string. dsp_alert: lea _BUFFER+2,a0 ;for WB, skip first WORD of _BUFFER for X pos moveq #20,d0 move.b d0,(a0)+ ;y co-ordinate = 20 move.l a0,d2 ;---copy passed string to BUFFER and get numOfChars movea.l a1,a6 lenS move.b (a6)+,(a0)+ bne.s lenS subq.l #1,a6 suba.l a1,a6 ;numOfChars ;---If the CLI, write the msg there move.l _stdout,d1 beq.s WBalert move.l a6,d3 ;---add new line char addq.l #1,d3 clr.b (a0) moveq #10,d0 move.b d0,-(a0) movea.l _DOSBase,a6 jmp _LVOWrite(a6) ;---If WB, post an alert WBalert: clr.b (a0) ;continuation byte = 0 moveq #80-1,d1 ;80 chars - 1 Dbra sub.l a6,d1 bcc.s aler moveq #1,d1 aler lsr.l #1,d1 lsl.w #3,d1 ;assume Topaz 8 system font movea.l d2,a0 subq.l #3,a0 move.w d1,(a0) ;x co-ordinate = (numOfChars/2) * 8 (WORD) ;---display the alert moveq #50,d1 ;Height moveq #0,d0 ;RECOVERY_ALERT movea.l _IntuitionBase,a6 jmp _LVODisplayAlert(a6) MAIN2: ;===========Get a FileIO structure for the FileIO lib========== movea.l _RequesterBase,a6 jsr _LVOGetFileIO(a6) movea.l d0,a5 move.l d0,d1 bne.s gFIO rts ;---Setup the FileIO fields ;---X pos = 6 gFIO moveq #6,d1 move.w d1,FILEIO_X(a5) ;---Y pos = 11 moveq #11,d1 move.w d1,FILEIO_Y(a5) ;---DrawMode = JAM2 moveq #1,d1 move.b d1,FILEIO_DRAWMODE(a5) ;---PenA = 0 clr.b FILEIO_PENA(a5) ;---PenB = 1 move.b d1,FILEIO_PENB(a5) ;---The pathname buffer lea _BUFFER,a0 move.l a0,FILEIO_BUFFER(a5) ;========Get the address of our ILBMFrame============== lea ILBMFrame,a2 ;========Set pointers initially to 0==================== next suba.l a3,a3 ;screen = 0 suba.l a4,a4 ;window = 0 ;=======Get the filename to display=========== movea.l a5,a0 ;the FileIO suba.l a1,a1 ;open requester on WB screen movea.l _RequesterBase,a6 jsr _LVODoFileIOWindow(a6) move.l d0,d1 ;pathname buffer address beq close_up ;an error in opening the window. Exit addq.l #1,d0 beq close_up ;If -1, user must have selected CANCEL. Exit ;======Load the IFF pic (whose Filename is argv[1]) into the window======== movea.l a2,a1 ;pathname in d1 clr.l iWindow(a1) ;indicate no open window clr.l iScreen(a1) ;no open screen moveq #3,d0 ;blank mouse pointer, no title bar move.b d0,iUserFlags(a1) movea.l _ILBMBase,a6 jsr _LVOLoadIFFToWindow(a6) ;---get opened screen and window addresses movea.l iWindow(a2),a4 movea.l iScreen(a2),a3 ;---check for error (not IFF_OKAY) move.b d0,d1 beq.s dspp ;---ERROR: "Load error" lea BadLoad,a1 move.l a4,d0 beq.s post_msg movea.l d0,a0 move.l a1,d0 movea.l _RequesterBase,a6 jsr _LVOAutoMessage(a6) bra.s nextp post_msg: bsr dsp_alert bra.s nextp ;========Display picture until the user clicks the mouse======= dspp movea.l _SysBase,a6 mmsg movea.l 86(a4),a0 jsr _LVOGetMsg(a6) move.l d0,d1 bne.s wmsg movea.l 86(a4),a0 jsr _LVOWaitPort(a6) bra.s mmsg wmsg movea.l d0,a1 move.l 20(a1),-(sp) ;save CLASS jsr _LVOReplyMsg(a6) move.l (sp)+,d0 Btst.l #3,d0 beq.s mmsg ;---Close window, screen, and then get next picture nextp bsr.s close_up bra next XDEF close_up close_up: ;================drain the IDCMP of the window and close it=============== move.l a4,d0 beq.s nowind movea.l _SysBase,a6 MMSG move.l 86(a4),a0 jsr _LVOGetMsg(a6) move.l d0,d1 beq.s nMSG movea.l d1,a1 jsr _LVOReplyMsg(a6) bra.s MMSG nMSG movea.l _IntuitionBase,a6 movea.l a4,a0 jsr _LVOCloseWindow(a6) ;=============Close the Screen===================== nowind: move.l a3,d0 beq.s noscr movea.l d0,a0 movea.l _IntuitionBase,a6 jsr _LVOCloseScreen(a6) noscr rts ;******************* DATA *********************** XDEF _IntuitionBase _IntuitionBase dc.l 0 ; intuition lib pointer XDEF _RequesterBase,_ILBMBase _RequesterBase dc.l 0 _ILBMBase dc.l 0 XDEF ILBMFrame CNOP 0,2 ;word-align ILBMFrame ds.b sizeofILBMFrame BadLoad dc.b 'Load Error',0 IFFErrMsg dc.b 'Need the dissidents ' ILBMName dc.b 'ilbm.library',0 ReqErrMsg dc.b 'Need the dissidents ' RequesterName dc.b 'requester.library',0 INUSE dc.b 'requester.library already in use',0 IntuiName dc.b 'intuition.library',0