.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