home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
disks
/
disk393.lzh
/
PrintSpool
/
Asm_Example
/
PrintPic.asm
< prev
next >
Wrap
Assembly Source File
|
1990-10-28
|
9KB
|
335 lines
;Set your editor's TAB width to 3 chars.
;*************************************************************************
;PrintPic.asm
; Reads an ILBM file and displays it as a screen/window until the right
; mouse button is clicked. It also (spool) prints the picture if the LEFT
; mouse button is pressed. 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.
; 4). It utilizes the dissidents prtspool.library for printing.
;
;This source code was assembled using INNOVATRONICS CAPE assembler. It was
;linked using Blink as follows:
;
; Blink StartUp.o PrintPic.o small.lib NODEBUG to PrintPic
;
; 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 "PrintPic.o"
SECTION ShowPicCode,CODE
INCLUDE "rad:IFF.i" ;the asm include file for ilbm.library
INCLUDE "rad:FileIO.i" ;the asm include file for requester.library
;for prtspool.library
_LVOPrintText equ -30
_LVOPrintNullText equ -36
_LVOPrintWindow equ -42
_LVOPrintFullWindow equ -48
_LVOAbortPrint equ -54
_LVOPrintRawText equ -60
_LVOPrintRawNullText equ -66
;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.s 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 into a window that the lib opens========
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=======
; NOTE: The window that the lib opened for us has an IDCMP of MOUSEBUTTONS.
; If we needed something else, we would ModifyIDCMP() here.
dspp bset.b #0,25(a4) ;RMBTRAP
mmsg2 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
move.w 24(a1),-(sp) ;save CODE
jsr _LVOReplyMsg(a6)
move.w (sp)+,d1
move.l (sp)+,d0
Btst.l #3,d0
beq.s mmsg
;---If MENU BUTTON, dump the picture
subi.b #$68,d1 ;Right mouse down?
beq.s nextp
subq.b #1,d1 ;Left mouse down?
bne.s mmsg
bsr PrintPic
bra.s mmsg2
;---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
;***************************************************
; This routine is all that is needed to print out any window's rastport.
;
; PrintPic(window)
; a4
XDEF PrintPic
PrintPic:
;======== Open prtspool.library =======
lea PrtSpoolName,a1
moveq #0,d0
movea.l _SysBase,a6
jsr _LVOOpenLibrary(a6)
lea PrtErrMsg,a1
move.l d0,d1
beq dsp_alert
;======= Print out the entire rastport ========
; NOTE: User should have set up Preferences via WorkBench. If the printing
; was spooled, we should return immediately. We could even exit this program
; by pressing the right mouse button while the printing was is progress. If
; no spool, this call doesn't return until the printing is complete, or
; aborted.
movea.l a4,a0
movea.l d0,a6
moveq #1,d0
swap d0 ;change colors to BW when posting "Remap to White" req (bit #16 set)
;low byte of d1 = 0 (i.e. 1 copy only)
jsr _LVOPrintFullWindow(a6)
;======= Close prtspool.library =========
movea.l a6,a1
movea.l _SysBase,a6
jmp _LVOCloseLibrary(a6)
; 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
PrtErrMsg dc.b 'Need the dissidents '
PrtSpoolName dc.b 'prtspool.library',0
END