;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
