nba-hangtime/DOC/DISPLAY.DOC

189 lines
6.0 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

WILLIAMS Z-SYSTEM OBJECT DISPLAY UTILITY
DISPLAY VERSION 1.0 6/26/87 WARREN B. DAVIS
G E N E R A L D E S C R I P T I O N
_____________________________________
The routines comprising DISPLAY.ASM are designed to allow the creation
and maintenance of an object list. Normally, a process would create an
object block giving it a position and velocity and control flags and the
DISPLAY routine would take care of refreshing the image every tick.
The DISPLAY routine would also take care of the tedious computations
involving clipping and flipping. A Z position is included which is used
(along with the Y position) to prioritize objects.
Animation can be controlled by the creating process or can be automatic.
The DISPLAY routine should be called from within the end-of-screen interrupt
routine. Version 1.0 blows out all images on the screen at once with
no beam avoidance or mid-screen interrupts.
D A T A S T R U C T U R E
___________________________
The routine "OINIT" initializes the two object linked lists, active and free.
Initially all object blocks linked onto the free list; the active list is null.
The ram location "OFREE" points to the address of the first object block
on the free list; the ram location "OBJLST" points to the first cell on the
active list (00000000H=null pointer, end of list).
When an object block is added to the list, it is inserted based on its
priority (which is the 32 bit quantity Z:Y).
*
* GLOBAL VARIABLES
*
.BSS OFREE,32 ; pointer to free object block
.BSS OBJLST,32 ; POINTER TO ACTIVE OBJECT LIST
.BSS OBJSTR,NOBJ*OBSIZ ; PROCESS STORE ALLOCATION
*
* DATA STRUCTURE
*
OLINK .SET 0 ; Link to next object block 16 bits
OXVAL .set 20h ; To be used as a 32 bit quantity (XPOS:XFRAC)
OXFRAC .set 20h ; Fractional portion of X position 16 bits
OXPOS .set 30h ; Integer portion of X position 16 bits
OYVAL .set 40h ; 32 bit quantity (YPOS:YFRAC)
OYFRAC .set 40h ; Fractional portion of Y position 16 bits
OYPOS .SET 50h ; Integer portion of Y position 16 bits
OPRIO .set 50h ; Z:Y forms priority
OZPOS .SET 60h ; Z position of object 16 bits
OFLAGS .set 70h ; Flags (bits 0 - 5 mimic DMA CONTROL) 16 bits
OXVEL .set 80h ; X Velocity 32 bits
OYVEL .set 0A0h ; Y Velocity 32 bits
OWSTRT .set 0C0h ; Upper left of object's window 32 bits
OWEND .set 0E0H ; Lower rt of object's window 32 bits
OIMG .set 100h ; Pointer to image data table 32 bits
OCONST .set 120h ; Constant color if flag set 16 bits
OANITIM .set 130h ; Animation Time in Ticks (optional) 8 bits
OANICNT .set 138h ; Animation Counter (optional) 8 bits
OANITAB .set 140h ; Pointer to animation table (optional) 32 bits
OANIOFF .set 160H ; offset from start of anitab 16 bits
OBSIZ .SET 1C0H ; Object Block Size = 16 WORDS
NOBJ .SET 256 ; 256 POSSIBLE OBJECTS TO DISPLAY
Notes:
1) The first few words after the link along with their offsets are...
OXFRAC(20h), OXPOS(30h), OYFRAC(40h), OYPOS(50h) and OZPOS(60h)
These are all 16 bit quantities. If you read 32-bits at a chunk,
use the alternate offset name which is more descriptive of the
long word meaning.
OXVAL(20h), OYVAL(40h) and OPRIO(50h)
2) The OFLAGS word consists of the DMA CONTROL flags plus
the following...
ANIM - if 1, use object block animation
NODISP - if 1, object is maintained in list and its velocity
changed, but is not displayed.
NOMOV - if 1, object's position is not modified regardless of
velocity values
A D D I N G A N E W O B J E C T
_______________________________
There are two ways to add an object. You can ...
1) Get a free block (GETOBJ), stuff the necessary information, then
insert it. (INSOBJ)
OR
2) set up some parameters in registers and call ADDOBJ.
GETOBJ has no input parameters and returns the free block in A0.
If no blocks are available, it returns with the Z flag set.
INSOBJ needs A0 = a ptr to an object block with at least the Z
and Y positions stuffed.
ADDOBJ needs a1 = WEND
a2 = WSTART
a3 = YVEL
a4 = XVEL
a5 = FLAGS : ZPOS
a6 = YPOS : YFRAC
a7 = XPOS : XFRAC
Upon returning, A0 points to the new block. If none are available,
the Z flag is set.
Examples: Method 1
CALLA GETOBJ
movi A_Z_POS,a10,W
move a10,*a0(OZPOS)
movi A_Y_POS,a10,L ; a 32 bit quantity
move a10,*a0(OYVAL),L
CALLA INSOBJ
movi SOME_CONTROL_WORD,a10
move a10,*a0(OFLAGS)
etc.
Method 2
movi SOME_X_POS,a7
movi SOME_Y_POS,a6
movi SOME_CONTROL_WORD,a5
sll 16,a5
addk A_Z_POS,a5
movi SOME_X_VEL,a4
movi SOME_Y_VEL,a3
movi SOME_WINDOW_START,a2
movi SOME_WINDOW_END,a1
callA ADDOBJ
A N I M A T I O N
-----------------
If the ANIM flag is set, you must set up the block for animation.
The parameters are...
OANITIM - number of ticks of each frame in the table
OANITAB - animation table containing pointers to img tables.
( 0 indicates end of table )
OANICNT - counter which is reloaded with ANITIM when it reaches 0
OANIOFF - difference between current location in ANITAB and the
beginning of ANITAB.
Initially, OANITIM and OANITAB must be set to the desired values.
OANICNT is 1 and OANIOFF is 0.
If ANIM is not set, a pointer to the img table for the static image
to be displayed must be placed in OIMG.
O B J E C T B L O C K D E L E T I O N
-----------------------------------------
The routine "DELOBJ" removes an object from the list. The pointer to the
block is assumed to be in a0
P O S S I B I L I T I E S
--------------------------
An object is deleted when it goes offscreen.
An object is deleted when it's velocity is zero.
An object is wrapped around when it goes offscreen.
All objects share the same window for clipping.