home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga ACS 1998 #6
/
amigaacscoverdisc1998-061998.iso
/
games
/
descent
/
source
/
3d
/
setup.asm
< prev
next >
Wrap
Assembly Source File
|
1998-06-08
|
5KB
|
196 lines
;THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
;SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
;END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
;ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
;IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
;SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
;FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
;CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
;AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
;COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
;
; $Source: f:/miner/source/3d/rcs/setup.asm $
; $Revision: 1.13 $
; $Author: matt $
; $Date: 1995/02/09 22:00:53 $
;
; Source for setup,close,start & end frame routines
;
; $Log: setup.asm $
; Revision 1.13 1995/02/09 22:00:53 matt
; Removed dependence on divide overflow handler; we now check for overflow
; before dividing. This fixed problems on some TI chips.
;
; Revision 1.12 1994/11/10 21:29:48 mike
; call init_interface_vars_to_assembler.
;
; Revision 1.11 1994/10/03 12:50:54 matt
; Fixed stupid mistake
;
; Revision 1.10 1994/10/03 12:50:12 matt
; Took out unused routines & data
;
; Revision 1.9 1994/07/25 00:00:05 matt
; Made 3d no longer deal with point numbers, but only with pointers.
;
; Revision 1.8 1994/04/19 18:26:43 matt
; Added g3_draw_sphere() function.
;
; Revision 1.7 1994/03/15 21:21:58 matt
; Put in check for div overflow in blob code
;
; Revision 1.6 1994/02/10 18:00:43 matt
; Changed 'if DEBUG_ON' to 'ifndef NDEBUG'
;
; Revision 1.5 1994/01/28 13:07:50 matt
; Added func, g3_get_view_pos_ptr_, sortof a hack, for the polygon objects.
;
; Revision 1.4 1994/01/14 17:19:50 matt
; Added check for no points in start_frame()
;
; Revision 1.2 1993/11/04 18:49:18 matt
; Added system to only rotate points once per frame
;
; Revision 1.1 1993/10/29 22:20:27 matt
; Initial revision
;
;
;
.386
option oldstructs
.nolist
include types.inc
include psmacros.inc
include gr.inc
include 3d.inc
include div0.inc
.list
assume cs:_TEXT, ds:_DATA
_DATA segment dword public USE32 'DATA'
rcsid db "$Id: setup.asm 1.13 1995/02/09 22:00:53 matt Exp $"
align 4
extd free_point_num
_DATA ends
_TEXT segment dword public USE32 'CODE'
extn init_interface_vars_to_assembler_
extn atexit_ ;C library function
;I don't what these are supposed to do, but here they are.
;sets up divide overflow handler, and sets the global points variables.
;takes eax=points, edx=vecs, ecx=num points
;trashes eax,edx
g3_init:
mov eax,DM_ERROR
call div0_init_
or eax,eax ;check error
jnz dz_ok
int 3
dz_ok:
;;@@;handlers for point projection
;;@@ lea eax,cs:proj_div0
;;@@ lea edx,cs:div_overflow_handler
;;@@ call div0_set_handler_
;;@@
;;@@ lea eax,cs:proj_div1
;;@@ lea edx,cs:div_overflow_handler
;;@@ call div0_set_handler_
;;@@
;;@@;handlers for blob draw
;;@@ lea eax,cs:blob_div0
;;@@ lea edx,cs:blob_overflow_handler
;;@@ call div0_set_handler_
;;@@
;;@@ lea eax,cs:blob_div1
;;@@ lea edx,cs:blob_overflow_handler
;;@@ call div0_set_handler_
;;@@
;;@@;handler for sphere projection
;;@@ lea eax,cs:sphere_proj_div
;;@@ lea edx,cs:sphere_div_overflow_handler
;;@@ call div0_set_handler_
;;@@
lea eax,cs:g3_close
call atexit_
ret
g3_close: ret
;cv_bitmap equ 0
;bm_w equ 4
;bm_h equ 6
;start rendering a frame. sets up window vars
g3_start_frame: pushm eax,edx,esi
mov esi,grd_curcanv
movzx eax,w [esi].cv_bitmap.bm_w
mov Canvas_width,eax ;store width
sal eax,15 ;get fixed-point width/2
mov Canv_w2,eax
movzx eax,w [esi].cv_bitmap.bm_h
mov Canvas_height,eax ;store height
sal eax,15 ;get fixed-point height/2
mov Canv_h2,eax
;compute aspect ratio for this canvas
mov esi,grd_curscreen
mov eax,[esi].sc_aspect ;get pixel ratio
imul Canvas_height ;figure in window size
idiv Canvas_width
cmp eax,f1_0 ; > 1?
jg scale_y
mov Window_scale.x,eax
mov Window_scale.y,f1_0
jmp got_win_scale
scale_y: mov esi,eax
mov eax,f1_0
fixdiv esi
mov Window_scale.y,eax
mov Window_scale.x,f1_0
got_win_scale: mov Window_scale.z,f1_0 ;always 1
call init_interface_vars_to_assembler_
popm eax,edx,esi
ret
;this doesn't do anything, but is here for completeness
g3_end_frame:
ifndef NDEBUG
test free_point_num,-1
;break_if nz,"Error: free_point_num != 0 in g3_end_frame"
;Commented the above line out, so it would compile
endif
ret
;@@ public g3_get_view_pos_ptr_
;@@g3_get_view_pos_ptr_:
;@@ lea eax,View_position
;@@ ret
_TEXT ends
end