home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
fish
/
libraries
/
ilbm
/
asm
/
showpic.asm
< prev
Wrap
Assembly Source File
|
1991-02-15
|
7KB
|
276 lines
;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.
;
; If using an asm other than CAPE, delete the next 4 lines and also uncomment
; the section directive toward the end.
SMALLOBJ ;CAPE directive for PC-relative addressing replaces absolute
ADDSYM
OPTIMON
OBJFILE "rad:ShowPic.o"
SECTION ShowPicCode,CODE
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
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 #$13,d0 ;blank pointer, no title bar, adjust view
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
; SECTION view,DATA ;If not using CAPE, uncomment this line
;******************* 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
END