.386p
code32 segment para public use32
assume cs:code32, ds:code32
; define externals
include pmode.inc ; protected mode externals
include xmouse.inc ; xmode mouse externals
include xmode.inc ; xmode externals by matt pritchard
include 3d.inc
include irq.inc
include macros.inc
include equ.inc
include sphere.inc
include gamecolr.inc ; dac palette
include objects.inc ; table of shapes/colours
include stuff.inc ; ending screen stuff
public _main
_main:
sti
push offset defpal
call fadeoffpalette
pushw xmode
pushw xactual
pushw yactual
pushw pages
call set_vga_modex
cmp ax,-1 ; test for error in setting videomode
jne getout
call wipeoffpalette
mov ax,0+0*256
mov background,ax
push ax
call clear_vga_screen
;push offset gamecolr
;pushw 0
;pushw 255
;pushw 1
;call load_dac_registers
call setupbase
call initpages
pushw xactual/2
pushw yactual/2
call show_mouse
comment $
call flip_page ; example of how to draw a single polygon
p1x equ -50
p1y equ -50
p2x equ -90
p2y equ 70
p3x equ 60
p3y equ 80
mov x1,p1x
mov y1,p1y
mov x2,p2x
mov y2,p2y
call fakeline
mov x1,p2x
mov y1,p2y
mov x2,p3x
mov y2,p3y
call fakeline
mov x1,p3x
mov y1,p3y
mov x2,p1x
mov y2,p1y
call fakeline
mov colq,7
mov steel,-1
call poly_fill
call flip_page
$
push o gamecolr
call fadeonpalette
mov si,cameraobject
mov bx,0
mov cx,0
mov bp,0
call set_angle
mov ebx,100000
mov ecx,25000
mov ebp,-385000
call put_object
mov si,0
mov ebx,-26000
mov ecx,65000
mov ebp,0
call put_object
call set_object_on
mov ax,0
call set_shape
mov si,1
mov ebx,130000
mov ecx,0
mov ebp,50000
call put_object
call set_object_on
mov ax,1
call set_shape
mov si,2
mov ebx,50000
mov ecx,70000
mov ebp,20000
call put_object
call set_object_on
mov ax,2
call set_shape
mov si,3
mov ebx,50000
mov ecx,-50000
mov ebp,80000
call put_object
call set_object_on
mov ax,3
call set_shape
mov si,4
mov ebx,-70000
mov ecx,30000
mov ebp,40000
call put_object
call set_object_on
mov ax,4
call set_shape
mov si,5
mov ebx,-50000
mov ecx,-30000
mov ebp,10000
call put_object
call set_object_on
mov ax,5
call set_shape
mov si,6 ; bitmap
mov ebx,-5000
mov ecx,5000
mov ebp,250000
call put_object
call set_object_on
mov ax,0 ; zeroth bitmap
call set_shape
mov vxs[6*2],100 ; bitmap scaling (gets added to bitx and bity)
mov vys[6*2],100 ; bitmap scaling
mov userotate[6],32 ; it's a bitmap (32)
mov vxadds[2*0],80 ; set objects spin velocity
mov vyadds[2*0],320
mov vzadds[2*0],231
mov vxadds[2*1],100
mov vyadds[2*1],230
mov vzadds[2*1],122
mov vxadds[2*2],200
mov vyadds[2*2],590
mov vzadds[2*2],410
mov vxadds[2*3],320
mov vyadds[2*3],290
mov vzadds[2*3],340
mov vxadds[2*4],570
mov vyadds[2*4],320
mov vzadds[2*4],400
mov vxadds[2*5],570
mov vyadds[2*5],320
mov vzadds[2*5],200
mov acount[2*0],9553 ; objects won't move or spin without counter!!
mov acount[2*1],8223 ; if your objects don't move, think! did you
mov acount[2*2],6323 ; set you counter!!, god this is frustrating
mov acount[2*3],4423 ; when debuging. counter is number of frames
mov acount[2*4],3523 ; to move/rotate
mov acount[2*5],5523
mov si,0 ; follow first object
mov di,65 ; 35 frames to get there
call newfollow
mov bitx,15 ; base object scaling
mov bity,15
mov bitbase,o sphere
call set_pmirq ; select irq:use one or the other
; call set_rmirq
call reset_raster_count ; done before any animation loop!!!
call set_makeorder ; reset sort order - done once in 3d1
ieox:
call look_at_it ; make camera look at selected object
call setsincose ; set rotation multipliers for eye
call makeobjs ; plot all objects in sides table
; call set_makeorder ; reset sort order - done always in 3d2
; call sort_list ; sort all sides/points/bitmaps
; call drawvect ; draw vectors/bitmaps/points/lines
call instant_mouse ; plot mouse on screen
call flip_page ; flip video pages
call clear_fill ; clear video memory (last screen)
call resetupd ; reset borders
call updvectors ; move objects around, rotate them
in al,60h ; test keyboard
cmp al,1
jne ieox
ieox2:
in al,60h ; test keyboard
cmp al,1
je ieox2
mov ax,w temp
cmp ax,5
jge ieox4
inc w temp
inc ax
mov si,ax ; ax = object
mov di,65 ; di = time to get there (# of frames)
call newfollow
call reset_raster_count ; done before any animation loop!!!
jmp ieox
ieox4:
call reset_raster_count ; done before any animation loop!!!
ieox3:
mov wherelook,5 ; force to look at sphered cube
call look_at_it
call setsincose
call makeobjs
; call set_makeorder
; call sort_list
; call drawvect
call flip_page
call clear_fill
call resetupd
call updvectors
sub zs[5*4],22000
mov eax,zs[5*4]
cmp eax,-3500000
jg ieox3
getout:
; call reset_rmirq ; use one or the other, could use both if
call reset_pmirq ; needed but delete inc traces_past from pmode
jmp endpage ; jump to stuff.inc for ending
temp dw 0 ; next object to look at, for this demo only
public objbase ; make sure these are here even if you don't
public bitbase ; use them. tlink will fail if not present.
public bitx
public bity
numberofobjects equ 32 ; number of 3d objects available to display
numberofbitmaps equ 32 ; number of 3d bitmaps in data tables
objbase dd numberofobjects*4 dup (0) ; memory locations of shapes
bitbase dd numberofbitmaps*4 dup (0) ; memory locations of bitmaps
bitx dd numberofbitmaps dup (0) ; x size of bitmaps (for 3d)
bity dd numberofbitmaps dup (0) ; y size of bitmaps
code32 ends
end