home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 2: PC
/
frozenfish_august_1995.bin
/
bbs
/
d02xx
/
d0237.lha
/
ILBMLib
/
ANIMInfo.asm
< prev
next >
Wrap
Assembly Source File
|
1989-08-20
|
16KB
|
630 lines
INCLUDE "FileIO.i"
INCLUDE "IFF.i"
;CAPE Directives
OBJFILE "rad:ANIMInfo.o"
OPTIMON
SMALLOBJ
ADDSYM
SECTION CopyLibCode,CODE
;from SmallStart.o
XREF _DOSBase,_SysBase,_BUFFER
;from functions.o
XREF asprintf,multiply
;from amiga.lib or small.lib
XREF _LVOOpenLibrary,_LVOCloseLibrary,_LVOOpenWindow,_LVOCloseWindow
XREF _LVOAllocMem,_LVOFreeMem
XREF _LVOGetMsg,_LVOReplyMsg,_LVOWait,_LVOWaitPort
XREF _LVOMove,_LVOText,_LVOSetAPen,_LVORectFill
XREF _LVOOpen,_LVORead,_LVOWrite,_LVOClose,_LVODelay
XREF _LVOLock,_LVOUnLock,_LVOExamine
XREF _LVOClearPointer
MODE_OLDFILE equ 1005
MODE_NEWFILE equ 1006
LIB_VERSION equ 33
XDEF print_line
print_line:
movem.l a2/a4,-(sp)
movea.l a0,a4
movea.l RastPort,a2
moveq #5,d0
moveq #26,d1 ;allow for window title bar
lea yPos,a1
add.w (a1),d1 ;get y position to print at
addq.w #8,(a1) ;increment 1 line down for next time
movea.l a2,a1 ;our window's RastPort
movea.l _GfxBase,a6
jsr _LVOMove(a6)
movea.l a4,a0
len move.b (a4)+,d0
bne.s len
subq.l #1,a4
move.l a4,d0
sub.l a0,d0 ;length of string
movea.l a2,a1
movem.l (sp)+,a2/a4
jmp _LVOText(a6)
print_and_delay:
bsr.s print_line
;fall through to delay
delay_msg:
;---Leave the msg displayed for a while
moveq #100,d1
movea.l _DOSBase,a6
jsr _LVODelay(a6)
;---clear msg
moveq #5,d0
moveq #26-8,d1
add.w yPos,d1
movea.l RastPort,a2
movea.l a2,a1
movea.l _GfxBase,a6
jsr _LVOMove(a6)
moveq #36,d0
lea Spaces,a0
movea.l a2,a1
jmp _LVOText(a6)
XDEF clear_window
clear_window:
movem.l d2/d3/a2/a6,-(sp)
movea.l _GfxBase,a6
moveq #0,d0
movea.l RastPort,a1
movea.l a1,a2
jsr _LVOSetAPen(a6)
moveq #4,d0
moveq #15,d1
move.w #636,d2
moveq #80,d3
movea.l a2,a1
jsr _LVORectFill(a6)
moveq #1,d0
movea.l a2,a1
jsr _LVOSetAPen(a6)
movem.l (sp)+,d2/d3/a2/a6
rts
XDEF _main
_main:
;---Open Gfx Library
movea.l _SysBase,a6
moveq #LIB_VERSION,d0
lea GfxName,a1
jsr _LVOOpenLibrary(a6)
move.l d0,_GfxBase
bne.s xxx
rts
;---Open Intuition
xxx moveq #LIB_VERSION,d0
lea IntuitionName,a1
jsr _LVOOpenLibrary(a6)
move.l d0,_IntuitionBase
beq clG
;---Open the main window
lea newWindow,a0
move.l a6,-(sp)
movea.l d0,a6
jsr _LVOOpenWindow(a6)
move.l (sp)+,a6
move.l d0,WindowPtr
beq clI
movea.l d0,a0
move.l 50(a0),RastPort
;---Open the dissidents FileIO (requester) library
moveq #0,d0 ;any version (for now)
lea RequesterName,a1
movea.l _SysBase,a6
jsr _LVOOpenLibrary(a6)
move.l d0,_RequesterBase
bne.s gotRQ
lea CantFindFileIO,a0
bsr print_and_delay
bra clW
;---Get the FileIO Structure
gotRQ movea.l d0,a6
jsr _LVOGetFileIO(a6)
move.l d0,FileIO
bne gotIO
lea IOerR,a0
bsr print_and_delay
bra clF
;---Set up certain options in the FileIO
gotIO movea.l d0,a0
Bset.b #INFO_SUPPRESS,1(a0) ;INFO_SUPPRESS ON
;--Set up the XY co-ordinates of where the requester will open
; If we used DoFileIOWindow(), we wouldn't need to set co-ordinates.
moveq #6,d0
move.w d0,FILEIO_X(a0) ;x position
moveq #11,d0
move.w d0,FILEIO_Y(a0) ;y position
;---Mandatory setup: The drawmodes and buffer
move.l #_BUFFER,FILEIO_BUFFER(a0)
moveq #2,d0
move.b d0,FILEIO_DRAWMODE(a0)
move.b d0,FILEIO_PENA(a0)
;---Open the dissidents ilbm.library
moveq #0,d0 ;any version (for now)
lea ILBMName,a1
movea.l _SysBase,a6
jsr _LVOOpenLibrary(a6)
move.l d0,_ILBMBase
bne.s E3
lea CantFindIlbm,a0
bsr print_and_delay
bra delFile
;********************** ANIMInfo IDCMP LOOP ******************************
;---Create a mask of the Window's UserPort's mp_Sigbit (to wait on)
E3 movea.l WindowPtr,a3
movea.l 86(a3),a0
move.b 15(a0),d0
moveq #0,d7
Bset.l d0,d7
;---Get the next message queued at our UserPort
E4 movea.l 86(a3),a0
movea.l _SysBase,a6
jsr _LVOGetMsg(a6)
move.l d0,d1
bne.s E7
;---If no more msgs, check if we are ready to exit the program
E5 Btst.b #0,Quit
beq clILBM
;---Wait for a message sent to our Window (from Intuition)===
E6 move.l d7,d0
; movea.l _SysBase,a6
jsr _LVOWait(a6)
bra.s E4
;---Copy all the info we want from the IntuiMessage
E7 movea.l d0,a1
lea 20(a1),a0 ;get the address of the first field to copy.
move.l (a0)+,d6 ;Copy the Class field to d6
move.w (a0)+,d5 ;Copy the Code field to d5
move.w (a0)+,d4 ;Copy the qualifier field to d4
movea.l (a0)+,a2 ;Copy the IAddress field to a2
move.w (a0)+,d3 ;Copy MouseX position to d3
move.w (a0)+,d2 ;Copy MouseY position to d2
;---Now reply to the message so Intuition can dispose of it
E8 ;Address of the message is in a1.
jsr _LVOReplyMsg(a6)
;---What type of msg? Handle it.
Bclr.l #3,d6 ;MOUSEBUTTONS
bne.s BUT
Bclr.l #9,d6 ;CLOSEWINDOW
beq.s E4
;=========CLOSEWINDOW============
Bclr.b #0,Quit
bra.s E4
;=========MOUSEBUTTONS===========
;---Make sure that it's an UP select if MOUSEBUTTONS
BUT subi.b #$68,d5
beq.s E4 ;ignore down
clr.w yPos ;reset to top of window
bsr clear_window
;---Allow the user to choose the file, and then examine it
bsr.s show_info
bra.s E4
;*************************** Exit Routine *****************************
;---Close the ilbm lib
clILBM movea.l _ILBMBase,a1
movea.l _SysBase,a6
jsr _LVOCloseLibrary(a6)
;---Release the FileIO
delFile movea.l FileIO,a1
movea.l _RequesterBase,a6
jsr _LVOReleaseFileIO(a6)
;---Close the requester lib
clF movea.l _RequesterBase,a1
movea.l _SysBase,a6
jsr _LVOCloseLibrary(a6)
;---Close the window
clW movea.l WindowPtr,a0
movea.l _IntuitionBase,a6
jsr _LVOCloseWindow(a6)
;---Close the Intuition Lib
clI movea.l _SysBase,a6
movea.l _IntuitionBase,a1
jsr _LVOCloseLibrary(a6)
;---Close the graphics lib
clG movea.l _GfxBase,a1
jmp _LVOCloseLibrary(a6) ;returns to startup code
;==========================================================================
;show_info(window)
; a3
XDEF show_info
show_info:
movem.l d2/d3/d4/d5/a4,-(sp)
;---DoFileIO(FileIO, window)
movea.l a3,a1
movea.l FileIO,a0
movea.l _RequesterBase,a6
jsr _LVODoFileIO(a6)
move.l d0,d1
beq L92 ;Error in Filename selection (shouldn't happen, but...)
addq.l #1,d0
beq L92 ;If -1, user must have selected CANCEL
;Buffer address in d1
;---Check FileSize
movea.l FileIO,a0
move.l FILEIO_FILESIZE(a0),d0
beq L92 ;must be a dir or disk that was chosen
;---Get a lock on the full pathname
moveq #-2,d2
;Buffer address in d1
movea.l _DOSBase,a6
jsr _LVOLock(a6)
move.l d0,d5
beq L92
;---Open the File for Reading
moveq #0,d2
move.w #MODE_OLDFILE,d2
lea _BUFFER,a0
move.l a0,d1
jsr _LVOOpen(a6)
move.l d0,d4
beq L92
;---Set the WAIT mouse pointer
movea.l _RequesterBase,a6
movea.l a3,a0
jsr _LVOSetWaitPointer(a6)
;---Examine the File (ExamineFORM is our installed custom FORMhandler)
;---IFFP = LoadILBM(file, Vectors, ILBMFrame)
lea Vectors,a0
movea.l _ILBMBase,a6
lea ILBMFrame,a1
Bclr.b #ANIMFLAG,iUserFlags(a1)
moveq #-1,d0
move.l d0,NumOfFrames ;initially, -1
move.l d4,d1
jsr _LVOLoadILBM(a6)
;---Did we find an ILBM or ANIM? If so, LoadILBM() returned IFF_DONE
move.l d0,d1
addq.l #2,d1
bne.s erriff
;---Print out the number of frames if an ANIM
lea ItsILBM,a0
Btst.b #ANIMFLAG,ILBMFrame+iUserFlags
beq.s pfnum
move.l NumOfFrames,-(sp)
addq.l #1,(sp)
lea _BUFFER,a0
lea FramePrint,a1
jsr asprintf
addq.l #4,sp
bra.s pfnum
;---Display the returned IFFP code
erriff:
jsr _LVOGetIFFPMsg(a6)
movea.l d0,a0
pfnum bsr print_line
;---Restore mouse pointer
movea.l a3,a0
movea.l _IntuitionBase,a6
jsr _LVOClearPointer(a6)
;---Close File, Free lock
move.l d4,d1
movea.l _DOSBase,a6
jsr _LVOClose(a6)
move.l d5,d1
jsr _LVOUnLock(a6)
L92 movem.l (sp)+,d2/d3/d4/d5/a4
rts
;=========================================================================
;This is the custom FORMhandler we installed in the Vectors Structure
;passed to LoadILBM(). The lib routine LoadILBM() will call this routine
;for every FORM it encounters in the opened file with the following
;registers as follows:
;
; IFFP = ExamineFORM(ID, Context, Vectors, ILBMFrame, PROPList)
; d0 d0 a0 a2 a3 a4
;
; Our routine is going to check for ANIMs or ILBMs, (ignoring all other
; FORMs), and print out info about the ILBM (or first Frame of the ANIM
; and total # of Frames).
XDEF ExamineFORM
ExamineFORM:
movem.l d2/a2/a5/a6,-(sp)
movea.l _ILBMBase,a6
;---Put the Context in a convenient register
movea.l a0,a5
;---if ID = ANIM, set ANIM flag and do anim parse
cmpi.l #ID_ANIM,d0
beq.s animf
;---if ID = ILBM (this will be an ANIM frame if we're inside of an ANIM)
cmpi.l #ID_ILBM,d0
bne.s nonif
;---If an ILBM, increment NumOfFrames
addq.l #1,NumOfFrames
;---If we haven't displayed the info on an ILBM yet, do so. Otherwise,
; just exit.
bne.s Aout ;returning an ID, or IFF_OKAY continues to next group
bra.s ilBm
animf Bset.b #ANIMFLAG,iUserFlags(a3)
;**********Open a non-ILBM FORM and recursively scan it for ILBMs.********
;The initial 'ANIM' header chunk executes here.
;---While IFFP = IFF_OKAY, do GetF1ChunkHdr(Context)
nonif movea.l a5,a0
jsr _LVOGetF1ChunkHdr(a6)
move.l d0,d1
bpl.s nonif
;---If IFFP = END_MARK, then return IFF_OKAY (to continue scanning file)
; unless this was an ANIM. For ANIM, return IFF_DONE instead of IFF_OKAY
; (because we hit END_MARK, so we got to the end of the FORM without error)
addq.l #1,d1
bne.s Aout
Btst.b #ANIMFLAG,iUserFlags(a3)
bne.s aok
moveq #IFF_OKAY,d0
Aout movem.l (sp)+,d2/a2/a5/a6
rts
aok moveq #IFF_DONE,d0
bra.s Aout
;*******************Load a Frame (ILBM)********************************
;---See if there is an ILBM PROP in PROPList
ilBm movea.l a4,a1
;ILBM ID in d0
jsr _LVOSearchPROP(a6)
beq.s nAck
;---copy PROP ILBMFrame to our master ILBMFrame
;data (frame) part of ILBMPropFrame in d0
movea.l a3,a1
jsr _LVOCopyILBMProp(a6)
;---Get the next chunk ID and process it
nAck movea.l a5,a0
jsr _LVOGetFChunkHdr(a6)
move.l d0,d2
bmi L334 ;IFFP error
cmpi.l #'ANHD',d2
beq Anhdh
cmpi.l #'BMHD',d2
beq Bmhdh
cmpi.l #'CAMG',d2
beq Camgh
cmpi.l #'CMAP',d2
beq Cmaph
cmpi.l #'BODY',d2
bne.s nAck
;=========case ID_BODY: (assume this is the last chunk in the ILBM)
; Here we print out all of the info we collected in the ILBMFrame.
;---Print out info in BMHD
Bclr.b #BMHDFLAG,iFlags(a3)
beq CLER ;first frame must have a BMHD
lea iBMHD(a3),a2
moveq #0,d1
moveq #0,d0
move.w BMHD_pageH(a2),d1
move.l d1,-(sp)
;---d2 = pageHeight or h, whichever is larger
move.w BMHD_h(a2),d0
move.l d0,-(sp)
cmp.w d0,d1
bcc.s larh
move.w d0,d1
larh move.w d1,d2
moveq #0,d0
move.b BMHD_nPlanes(a2),d0
move.l d0,-(sp)
mulu.w d0,d2 ;planeS = nPlanes * pageHeight
move.w BMHD_pageW(a2),d1
move.l d1,-(sp)
move.w (a2),d0 ;w
move.l d0,-(sp)
;---d0 = pageWidth or w, whichever is larger
cmp.w d0,d1
bcc.s larw
move.w d0,d1
;---RasterSize = planeS * RowBytes(pageWidth)
larw moveq #15,d0
add.w d1,d0
lsr.w #3,d0
Bclr.l #0,d0
move.l d2,d1
jsr multiply
move.l d0,-(sp)
lea BMHDinfo,a1
lea _BUFFER,a0
jsr asprintf
lea 24(sp),sp
bsr print_line
;---Print out more BMHD info
moveq #0,d0
move.b BMHD_yAspect(a2),d0
move.l d0,-(sp)
move.b BMHD_xAspect(a2),d0
move.l d0,-(sp)
move.b BMHD_compress(a2),d0
move.l d0,-(sp)
move.b BMHD_masking(a2),d0
move.l d0,-(sp)
move.w BMHD_color(a2),d0
move.l d0,-(sp)
move.w BMHD_y(a2),d0
move.l d0,-(sp)
move.w BMHD_x(a2),d0
move.l d0,-(sp)
lea BMHDinfo2,a1
lea _BUFFER,a0
jsr asprintf
lea 28(sp),sp
bsr print_line
;---Print CAMG viewmodes, or "None"
pCamg lea None,a0
lea ViewModePrint,a1
Btst.b #CAMGFLAG,iFlags(a3)
beq.s Ncamg
lea INTERLACE,a0
move.l iViewModes(a3),d1
btst.l #2,d1
bne.s Ncamg
lea HAM,a0
btst.l #7,d1
bne.s Ncamg
lea HIRES,a0
btst.l #15,d0
bne.s Ncamg
lea DUAL,a0
btst.l #10,d0
bne.s Ncamg
lea LORES,a0
Ncamg move.l a0,-(sp)
lea _BUFFER,a0
jsr asprintf
addq.l #4,sp
bsr print_line
;---Print number of colors in table
moveq #0,d0
move.b iNumColors(a3),d0
move.l d0,-(sp)
lea NCPrint,a1
lea _BUFFER,a0
jsr asprintf
addq.l #4,sp
bsr print_line
;---If an ANHD, print out the opmode
Bclr.b #ANHDFLAG,iFlags(a3)
beq.s nopm
moveq #0,d0
move.b ANHDchunk,d0
move.l d0,-(sp)
lea OpMode,a1
lea _BUFFER,a0
jsr asprintf
addq.l #4,sp
bsr print_line
;---IFFP = IFF_OKAY (to continue the load) if an ANIM. If an ILBM outside
; of an ANIM (by itself), then return IFF_DONE.
nopm moveq #IFF_OKAY,d0
Btst.b #ANIMFLAG,iUserFlags(a3)
bne.s L321
moveq #IFF_DONE,d0
bra.s L321
CLER moveq #BAD_FORM,d0
bra.s L321
;===============case ID_BMHD:
;---Set BMHDFLAG, and read chunk
Bmhdh Bset.b #BMHDFLAG,iFlags(a3)
moveq #sizeofBMHD,d0
lea iBMHD(a3),a1
readChunk:
movea.l a5,a0
jsr _LVOIFFReadBytes(a6)
IFfp move.l d0,d2
;---while IFFP >= IFF_OKAY, (loop if valid ID of ignored chunk, or a
; subroutine returned IFF_OKAY (no errors))
L334 move.l d2,d0
bpl nAck
L321 movem.l (sp)+,d2/a2/a5/a6
rts
;=============case ID_ANHD:
;---store data in global ANHD, and set ANHDflag
Anhdh Bset.b #ANHDFLAG,iUserFlags
;---Read in ANHD chunk
lea ANHDchunk,a1
moveq #sizeofANHD,d0
bra.s readChunk
;=============case ID_CAMG:
Camgh jsr _LVOHandleCAMG(a6)
bra.s readChunk
;=================case ID_CMAP:
Cmaph lea iNumColors(a3),a1
moveq #maxColorReg,d0
move.b d0,(a1)
move.l a5,d0
lea iColorTable(a3),a0
;NumColors address in a1
jsr _LVOGetCMAP(a6)
bra IFfp
;SECTION IFFdata,DATA ;some assemblers may need this un-commented
XDEF Vectors ;the initialized Vectors structure with custom FORMhandler
Vectors:
dc.l 0
dc.l ExamineFORM
dc.l 0
dc.l 0
XDEF NumOfFrames
NumOfFrames dc.l 0
XDEF yPos
yPos dc.w 0
XDEF ANHDchunk
ANHDchunk ds.b 40
XDEF ILBMFrame
ILBMFrame ds.b sizeofILBMFrame
XDEF newWindow
newWindow:
dc.w 0,0
dc.w 640,200
dc.b 0,1
;IDCMP = MOUSEBUTTONS|CLOSEWINDOW
dc.l $208
;WindowFlags = WINDOWSIZE|WINDOWDRAG|WINDOWDEPTH|SMART_REFRESH|ACTIVATE
dc.l $100F
dc.l 0
dc.l 0
dc.l WINTITLE
dc.l 0
dc.l 0
dc.w 306,145
dc.w 640,200
dc.w 1
TextAttr: ;Topaz 8 is a ROM font so doesn't need to be opened
dc.l FONTNAME
dc.w 8 ;TOPAZ_EIGHTY
dc.b 0,0
XDEF _GfxBase,_IntuitionBase,_RequesterBase,WindowPtr,RastPort,_ILBMBase
XDEF FileIO,RequesterName,ILBMName
_GfxBase dc.l 0
_IntuitionBase dc.l 0
_RequesterBase dc.l 0
_ILBMBase dc.l 0
WindowPtr dc.l 0
RastPort dc.l 0
FileIO dc.l 0
Spaces dc.b ' ',0
FONTNAME dc.b 'topaz.font',0
IOerR dc.b 'Cannot get a FileIO structure.',0
GfxName dc.b 'graphics.library',0
IntuitionName dc.b 'intuition.library',0
CantFindFileIO dc.b 'Cannot find the '
RequesterName dc.b 'requester.library',0
CantFindIlbm dc.b 'Cannot find the '
ILBMName dc.b 'ilbm.library',0
WINTITLE dc.b 'ANIMInfo « 1989 dissidents',0
Quit dc.b 1
FramePrint dc.b 'Number of Frames = %-11lu',0
ItsILBM dc.b 'This is an ILBM file. ',0
BMHDinfo dc.b 'Raster=%-7lu w=%-4lu pageW=%-4lu Planes=%-2lu h=%-4lu'
dc.b ' pageH=%-4lu',0
BMHDinfo2 dc.b 'XY=(%-5lu,%-5lu) TransColor=%-5lu Masking=%1lu '
dc.b 'Compression=%1lu Aspect=%2lu/%-2lu',0
ViewModePrint dc.b 'ViewModes=%-16s',0
DUAL dc.b 'Dual Playfield',0
HAM dc.b 'Ham',0
INTERLACE dc.b 'InterLace',0
HIRES dc.b 'Hi-Res',0
LORES dc.b 'Lo-Res',0
NCPrint dc.b 'Number of Colors = %-4lu',0
None dc.b 'Not Specified',0
OpMode dc.b 'ANHD opmode = %-3lu',0