home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Vectronix 2
/
VECTRONIX2.iso
/
FILES_03
/
SOURCE_J.LZH
/
3DDEMO
/
OBJLIST.S
< prev
next >
Wrap
Text File
|
1994-09-08
|
7KB
|
244 lines
;*======================================================================*
;* TITLE: OBJLIST.S *
;* Function: Object List Driver *
;* *
;* Project #: JAGUAR *
;* Programmer: Eric Ginner *
;* Andrew J Burgess *
;* *
;* COPYRIGHT 1993 Atari Computer Corporation *
;* UNATHORIZED REPRODUCTION, ADAPTATION, DISTRIBUTION, *
;* PERFORMANCE OR DISPLAY OF THIS COMPUTER PROGRAM OR *
;* THE ASSOCIATED AUDIOVISUAL WORK IS STRICTLY PROHIBITED. *
;* ALL RIGHTS RESERVED. *
;* *
;*======================================================================*
;*======================================================================*
include "jaguar.inc"
include "3ddemo.inc"
;*======================================================================*
;* EXTERNAL SYMBOLS
;*======================================================================*
.extern a_vdb
.extern a_vde
.extern height
.extern width
.extern DISPBUF0
;*======================================================================*
;* EXTERNAL ROUTINES
;*======================================================================*
;*======================================================================*
;* PUBLIC SYMBOLS
;*======================================================================*
.globl bmp_data
.globl objlist
;*======================================================================*
;* PUBLIC ROUTINES
;*======================================================================*
.globl InitLister
.globl UpdateList
;*======================================================================*
;* PROGRAM SEGMENT
;*======================================================================*
.text
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; InitLister: Initialize Object List Processor List
;
; Returns: Pre-word-swapped address of current object list in d0.l
;
; Registers: d1.l/d0.l - Phrase being built
; d2.l - Address of STOP object in destination buffer
; d3.l - Calculation register
; d4.l - Width of image in phrases
; d5.l - Height of image in scanlines
; a0.l - Roving object list pointer
InitLister:
movem.l d1-d5/a0,-(sp) ; Save registers
lea objlist,a0
move.l a0,d2 ; Copy
add.l #(LISTSIZE-1)*8,d2 ; Address of STOP object
; Write first BRANCH object (branch if YPOS > a_vde )
clr.l d1
move.l #(BRANCHOBJ|O_BRLT),d0 ; $4000 = VC < YPOS
jsr format_link ; Stuff in our LINK address
move.w a_vde,d3 ; for YPOS
lsl.w #3,d3 ; Make it bits 13-3
or.w d3,d0
move.l d1,(a0)+
move.l d0,(a0)+ ; First OBJ is done.
; Write second branch object (branch if YPOS < a_vdb)
; Note: LINK address is the same so preserve it
andi.l #$FF000007,d0 ; Mask off CC and YPOS
ori.l #O_BRGT,d0 ; $8000 = VC > YPOS
move.w a_vdb,d3 ; for YPOS
lsl.w #3,d3 ; Make it bits 13-3
or.w d3,d0
move.l d1,(a0)+ ; Second OBJ is done
move.l d0,(a0)+
; Write a standard BITMAP object
clr.l d1
clr.l d0 ; Type = BITOBJ
jsr format_link
move.l #BMP_HEIGHT,d5 ; Height of image
move.w d5,bmp_height ; Store for later update
lsl.l #8,d5 ; HEIGHT
lsl.l #6,d5
or.l d5,d0
move.w height,d3 ; Center bitmap vertically
sub.w #BMP_HEIGHT,d3
add.w a_vdb,d3
andi.w #$FFFE,d3 ; Must be even
lsl.w #3,d3
or.w d3,d0 ; Stuff YPOS in low phrase
move.l #DISPBUF0,d3
andi.l #$FFFFF0,d3
lsl.l #8,d3 ; Shift bitmap_addr into position
or.l d3,d1
move.l #DISPBUF0,bmp_data ; Initialize
move.l d1,(a0)+
move.l d1,bmp_highl
move.l d0,(a0)+
move.l d0,bmp_lowl
clr.l d1
move.l #O_TRANS,d1 ; Now for PHRASE 2 of BITOBJ
move.l #O_DEPTH16|O_1GAP,d0 ; Bit Depth = 16-bit
clr.l d3 ; Determine screen width
move.w width,d3
divu #3,d3
; lsr.w #2,d3 ; /4 Pixel Divisor
sub.w #BMP_WIDTH,d3
lsr.w #1,d3
or.w d3,d0
move.l #BMP_PHRASES,d4
move.l #BMP_CLIP,d3
lsl.l #8,d4 ; DWIDTH
lsl.l #8,d4
lsl.l #2,d4
or.l d4,d0
lsl.l #8,d4 ; IWIDTH Bits 28-31
lsl.l #2,d4
or.l d4,d0
lsr.l #4,d3 ; IWIDTH Bits 37-32
or.l d3,d1
move.l d1,(a0)+ ; Write second PHRASE of BITOBJ
move.l d0,(a0)+
; Write a STOP object at end of list
clr.l d1
move.l #(STOPOBJ|O_STOPINTS),d0
move.l d1,(a0)+
move.l d0,(a0)+
movem.l (sp)+,d1-d5/a0
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Procedure: format_link
;
; Inputs: d1.l/d0.l is a 64-bit phrase
; d2.l contains the LINK address to put into bits 42-24 of phrase
;
; Returns: Updated phrase in d1.l/d0.l
format_link:
movem.l d2-d3,-(sp)
andi.l #$3FFFF8,d2 ; Ensure alignment/valid address
move.l d2,d3 ; Make a copy
swap d2 ; Put bits 10-3 in bits 31-24
clr.w d2
lsl.l #5,d2
or.l d2,d0
lsr.l #8,d3 ; Put bits 21-11 in bits 42-32
lsr.l #3,d3
or.l d3,d1
movem.l (sp)+,d2-d3 ; Restore regs
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; UpdateList: Update list fields destroyed by the object processor.
;
; Registers: a0.l - General Purpose Pointer
UpdateList:
movem.l a0/d0-d1,-(sp)
move.l #objlist+BITMAP_OFF,a0
move.l bmp_highl,d1
andi.l #$7FF,d1 ; Mask off old DATA
move.l bmp_data,d0 ; Get current picture data
lsl.l #8,d0 ; Format ptr and store
or.l d0,d1
move.l d1,(a0)
move.l bmp_lowl,4(a0)
movem.l (sp)+,a0/d0-d1
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; Storage space for our object lists
.bss
.dphrase
objlist:
.ds.l (2*LISTSIZE)
bmp_height:
.ds.w 1
bmp_highl:
.ds.l 1
bmp_lowl:
.ds.l 1
bmp_data:
.ds.l 1
.end
;*======================================================================*
;* EOF
;*======================================================================*