SP EQU 1 SPM EQU 1 BS EQU 1 BP EQU 1 SH EQU 1 PH EQU 1 MB EQU 0 ScreenWidth EQU 320 LARGESCREEN equ 0 * the 'Hello World' program in 68000 Assembler * the C version can be found in the Intuition manual * this source code (C) HiSoft 1992 All Rights Reserved * for Devpac Amiga Version 2 the following symbols were changed * to avoid clashes with the new include files: * Screen->MyScreen, NewScreen->MyNewScreen * Window->MyWindow, NewWindow->MyNewWindow opt c+,d+ include workbench:utilities/devpac/system use pre-assembled header include exec/exec_lib.i include intuition/intuition.i include intuition/intuition_lib.i include graphics/graphics_lib.i include graphics/text.i INTUITION_REV equ 31 v1.1 GRAPHICS_REV equ 31 v1.1 * Open the intuition library moveq #100,d4 default error return code moveq #INTUITION_REV,d0 version lea int_name(pc),a1 CALLEXEC OpenLibrary tst.l d0 beq exit_false if failed then quit move.l d0,_IntuitionBase else save the pointer moveq #GRAPHICS_REV,d0 lea graf_name(pc),a1 CALLEXEC OpenLibrary tst.l d0 ; beq exit_closeint if failed then close Int, exit move.l d0,_GfxBase lea MyNewScreen(pc),a0 CALLINT OpenScreen open a screen tst.l d0 ; beq exit_closeall if failed the close both, exit move.l d0,MyScreen move.l MyScreen,a0 lea sc_BitMap(a0),a0 lea bm_Planes(a0),a0 move.l #RAWSCRN,(a0) move.l #RAWSCRN+10240,4(a0) move.l #RAWSCRN+10240*2,8(a0) move.l #RAWSCRN+10240*3,12(a0) move.l #RAWSCRN+10240*4,16(a0) move.l #RAWSCRN+10240*5,20(a0) move.l #RAWSCRN+10240*6,24(a0) move.l #RAWSCRN+10240*7,28(a0) * now initialise a NewWindow structure. This is normally easier to * do with dc.w/dc.l statement etc, but for comparison with the C * version we do it like this lea MyNewWindow(pc),a0 good place to start move.w #20,nw_LeftEdge(a0) move.w #20,nw_TopEdge(a0) move.w #300,nw_Width(a0) move.w #100,nw_Height(a0) move.b #0,nw_DetailPen(a0) move.b #1,nw_BlockPen(a0) move.l #window_title,nw_Title(a0) _temp set WINDOWCLOSE!SMART_REFRESH!ACTIVATE!WINDOWSIZING move.l #_temp!WINDOWDRAG!WINDOWDEPTH,nw_Flags(a0) move.l #CLOSEWINDOW,nw_IDCMPFlags(a0) move.w #CUSTOMSCREEN,nw_Type(a0) clr.l nw_FirstGadget(a0) clr.l nw_CheckMark(a0) move.l MyScreen(pc),nw_Screen(a0) clr.l nw_BitMap(a0) move.w #100,nw_MinWidth(a0) move.w #25,nw_MinHeight(a0) move.w #640,nw_MaxWidth(a0) move.w #200,nw_MaxHeight(a0) * thats it set up, now open the window (a0=NewWindow already) ; CALLINT OpenWindow ; tst.l d0 ; beq exit_closescr if failed ; move.l d0,MyWindow save it ; ; move.l d0,a1 window ; move.l wd_RPort(a1),a1 rastport ; moveq #20,d0 X ; moveq #20,d1 Y ; CALLGRAF Move move the cursor ; ; move.l MyWindow(pc),a0 ; move.l wd_RPort(a0),a1 rastport ; lea hello_message(pc),a0 ; moveq #11,d0 ; CALLGRAF Text print something ; ; move.l MyWindow(pc),a0 ; move.l wd_UserPort(a0),a0 ; move.b MP_SIGBIT(a0),d1 (misprint in manual) ; moveq #0,d0 ; bset d1,d0 do a shift ; CALLEXEC Wait ; moveq #0,d4 return code * various exit routines that do tidying up, given a return code in d4 ; move.l MyWindow(pc),a0 ; CALLINT CloseWindow ;exit_closescr ; move.l MyScreen(pc),a0 ; CALLINT CloseScreen ;exit_closeall ; move.l _GfxBase(pc),a1 ; CALLEXEC CloseLibrary ;exit_closeint ; move.l _IntuitionBase(pc),a1 ; CALLEXEC CloseLibrary ;done: ; bra done SPECULAR EQU SP SPECMAP EQU SPM BUMPSPEC EQU BS BUMPPHONG EQU BP SHADOWMAP EQU SH SHADING EQU PH MOTIONBLUR EQU MB move.l #PALETTEBIT,a0 move.l #COPIEDPAL+4,a1 move.w #255,d0 copydown: move.b 1(a0),(a1) move.b 3(a0),4(a1) move.b 5(a0),8(a1) add.w #6,a0 add.w #12,a1 dbra d0,copydown move.w #256,COPIEDPAL move.w #0,COPIEDPAL+2 LOOKFORME: move.l MyScreen,a0 lea sc_ViewPort(a0),a0 move.l #COPIEDPAL,a1 move.l _GfxBase,a6 jsr -$372(a6) move.l MyScreen,a4 move.w sc_MouseX(a4),d0 move.w sc_MouseY(a4),d1 move.w d0,OLDXM move.w d1,OLDYM move.l 4.w,a6 move.l #doslibname,a1 moveq #0,d0 jsr -552(a6) move.l d0,doslib move.l doslib,a6 move.l #OBJNAME,d1 move.l #1005,d2 jsr -30(a6) move.l d0,ROTATEDPTS move.l doslib,a6 move.l d0,d1 move.l #POLYGONDATA,d2 move.l #30000,d3 jsr -42(a6) move.l doslib,a6 move.l ROTATEDPTS,d1 jsr -36(a6) loop: move.w #0,temp move.l #POLYGONDATA,a3 move.w (a3)+,SORTIT move.l a3,START_OF_OBJECT move.w (a3)+,num_points move.w (a3)+,d6 move.w d6,num_frames move.l a3,POINTER_TO_POINTERS lea (a3,d6.w*4),a3 move.l a3,LinesPtr moveq #0,d5 moveq #0,d2 move.l POINTER_TO_POINTERS,a4 move.w (a4,d5.w*4),d2 add.l START_OF_OBJECT,d2 move.l d2,PtsPtr move.w 2(a4,d5.w*4),d5 add.l START_OF_OBJECT,d5 move.l d5,PolyAngPtr move.l d2,a3 move.w num_points,d5 move.l (a3)+,OBJONOFF move.l a3,PointAngPtr add.w d5,d5 move.w d5,d2 add.w d5,d5 add.w d5,d2 add.w d2,a3 move.l a3,PtsPtr move.l MyScreen,a4 move.w sc_MouseX(a4),d0 move.w sc_MouseY(a4),d1 sub.w OLDXM,d0 sub.w OLDYM,d1 add.w d0,OLDXM add.w d1,OLDYM btst #6,$bfe001 beq.s .SHIFTABOUT muls #8190,d0 divs #320,d0 add.w d0,YANG and.w #8190,YANG muls #8190,d1 divs #320,d1 and.w #8190,d1 add.w d1,XANG and.w #8190,XANG ; add.w #40,AANG ; add.w #70,BANG ; and.w #8191,AANG ; and.w #8191,BANG ; add.w #60,CANG ; add.w #90,DANG ; and.w #8191,CANG ; and.w #8191,DANG bra .ROTABOUT .SHIFTABOUT muls #8190,d0 divs #320,d0 add.w d0,BANG and.w #8190,BANG muls #8190,d1 divs #320,d1 and.w #8190,d1 add.w d1,AANG and.w #8190,AANG .ROTABOUT move.w AANG,d1 move.w BANG,d3 ; cmp.w #2,d6 ; bne.s .notsecrot ; move.w CANG,d1 ; move.w DANG,d3 ;.notsecrot move.l #SINETABLE,a1 move.w (a1,d1.w),XSIN ;xsin move.w (a1,d3.w),YSIN ;ysin add.w #2048,a1 move.w (a1,d1.w),XCOS ;xcos move.w (a1,d3.w),YCOS ;ycos move.w XANG,d1 move.w YANG,d3 ; cmp.w #2,d6 ; bne.s .notsecrot ; move.w CANG,d1 ; move.w DANG,d3 ;.notsecrot move.l #SINETABLE,a1 move.w (a1,d1.w),XSIN2 ;xsin move.w (a1,d3.w),YSIN2 ;ysin add.w #2048,a1 move.w (a1,d1.w),XCOS2 ;xcos move.w (a1,d3.w),YCOS2 ;ycos ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ *SHADOW BUFFER CALCULATION ; First, calculate the normal brightnesses ; for points. NB: -1,-1,-1 = this point not used ; in gouraud shading. move.l #NORMBRIGHTS,a2 move.l PointAngPtr,a0 move.w num_points,d7 move.l #NORMVECTS,a5 subq #1,d7 CALCNORMBRIGHTS: move.w (a0)+,d0 move.w (a0)+,d1 move.w (a0)+,d2 move.w #0,d6 cmp.w #-1,d0 bne.s .notnot cmp.w #-1,d1 bne.s .notnot cmp.w #-1,d2 bne.s .notnot move.w #-1,x1 move.w #-1,y1 move.w #-1,z1 bra .dontbother .notnot: neg.w d1 move.w d0,d3 move.w d2,d5 muls YCOS,d0 muls YSIN,d2 sub.l d2,d0 add.l d0,d0 swap d0 ; asr.l #6,d0 ; new x*512 muls YSIN,d3 muls YCOS,d5 add.l d5,d3 add.l d3,d3 swap d3 move.w d3,d2 ; new z move.w d1,d4 move.w d2,d5 muls XCOS,d1 muls XSIN,d2 sub.l d2,d1 add.l d1,d1 swap d1 muls XSIN,d4 muls XCOS,d5 add.l d5,d4 add.l d4,d4 swap d4 move.w d4,d2 ; new z move.w d0,d3 move.w d2,d5 muls YCOS2,d0 muls YSIN2,d2 sub.l d2,d0 add.l d0,d0 swap d0 muls YSIN2,d3 muls YCOS2,d5 add.l d5,d3 add.l d3,d3 swap d3 move.w d3,d2 ; new z move.w d1,d4 move.w d2,d5 muls XCOS2,d1 muls XSIN2,d2 sub.l d2,d1 add.l d1,d1 swap d1 muls XSIN2,d4 muls XCOS2,d5 add.l d5,d4 add.l d4,d4 swap d4 move.w d0,x1 move.w d1,y1 move.w d4,z1 tst.w y1 blt.s .okpos move.w x1,d1 ; 0-1024 asr.w #4,d1 ; 0-64 move.w z1,d2 ; 0-1024 asr.w #4,d2 ; 0-64 muls d1,d1 muls d2,d2 add.l d1,d2 jsr CALCSQROOT tst.w d2 beq.s .okpos move.w d2,d3 ; 0-64 neg.w d3 add.w #127,d3 ; 64-127 move.w z1,d4 muls d3,d4 divs d2,d4 move.w x1,d0 muls d3,d0 divs d2,d0 ; asr.w #1,d4 ; asr.w #1,d0 ; neg.w y3 .okpos asr.w #4,d4 add.w #128,d4 move.b d4,d6 lsl.w #8,d6 asr.w #4,d0 add.w #128,d0 move.b d0,d6 ; move.w d1,d6 ; new y ; ; asr.w #4,d6 ; add.w #20,d6 ; ; ble.s .okokok ; ; moveq #0,d6 ; ;.okokok: ; add.w #$1c,d6 ; cmp.w #1,d6 ; bge.s .okokokok ; moveq #1,d6 ;.okokokok: ; add.w #64,d6 ; ; cmp.w #28,d6 ; blt.s .okbig ; move.w #28,d6 ;.okbig .dontbother: move.w x1,(a5)+ move.w y1,(a5)+ move.w z1,(a5)+ move.w d6,(a2)+ dbra d7,CALCNORMBRIGHTS ; Next, calculate the point coords for ; the shadow buffer. move.l #SHADOWPTS,a2 move.l PtsPtr,a0 move.w num_points,d7 subq #1,d7 ROTPTLOPSHAD: move.w (a0)+,d0 move.w d0,d3 move.w (a0)+,d1 move.w (a0)+,d2 move.w d2,d5 muls YCOS,d0 muls YSIN,d2 sub.l d2,d0 add.l d0,d0 swap d0 ; asr.l #6,d0 ; new x*512 muls YSIN,d3 muls YCOS,d5 add.l d5,d3 add.l d3,d3 swap d3 move.w d3,d2 ; new z move.w d1,d4 move.w d2,d5 muls XCOS,d1 muls XSIN,d2 sub.l d2,d1 add.l d1,d1 swap d1 muls XSIN,d4 muls XCOS,d5 add.l d5,d4 add.l d4,d4 swap d4 move.w d4,d2 ; new z move.w d0,d3 move.w d2,d5 muls YCOS2,d0 muls YSIN2,d2 sub.l d2,d0 asr.l #6,d0 ; new x*512 muls YSIN2,d3 muls YCOS2,d5 add.l d5,d3 add.l d3,d3 swap d3 move.w d3,d2 ; new z move.w d1,d4 move.w d2,d5 muls XCOS2,d1 muls XSIN2,d2 sub.l d2,d1 asr.l #6,d1 ; new y*512 muls XSIN2,d4 muls XCOS2,d5 add.l d5,d4 add.l d4,d4 swap d4 move.w d4,d2 ; new z ext.l d2 move.w XOFF,d5 ext.l d5 asl.l #8,d5 add.l d5,d5 add.l d5,d0 move.l d0,(a2)+ move.l d1,(a2)+ move.w d2,(a2)+ dbra d7,ROTPTLOPSHAD *************************************** * Calculate viewer position for specularity.. move.w #0,d0 move.w #0,d1 move.w #-1024,d2 ; move.w d0,d3 ; move.w d2,d5 ; ; muls YCOS,d0 ; muls YSIN,d2 ; sub.l d2,d0 ; add.l d0,d0 ; swap d0 ; asr.l #6,d0 ; new x*512 ; ; muls YSIN,d3 ; muls YCOS,d5 ; add.l d5,d3 ; add.l d3,d3 ; swap d3 ; move.w d3,d2 ; new z ; ; move.w d1,d4 ; move.w d2,d5 ; muls XCOS,d1 ; muls XSIN,d2 ; sub.l d2,d1 ; add.l d1,d1 ; swap d1 ; ; muls XSIN,d4 ; muls XCOS,d5 ; add.l d5,d4 ; add.l d4,d4 ; swap d4 ; move.w d4,d2 ; new z move.w d0,d3 move.w d2,d5 muls YCOS2,d0 muls YSIN2,d2 sub.l d2,d0 add.l d0,d0 swap d0 muls YSIN2,d3 muls YCOS2,d5 add.l d5,d3 add.l d3,d3 swap d3 move.w d3,d2 ; new z move.w d1,d4 move.w d2,d5 muls XCOS2,d1 muls XSIN2,d2 sub.l d2,d1 add.l d1,d1 swap d1 ; asr.l #6,d1 ; new y*512 muls XSIN2,d4 muls XCOS2,d5 add.l d5,d4 add.l d4,d4 swap d4 move.w d0,x2b move.w d1,y2b move.w d4,z2b ; Now the specular highlight efforts.... move.l #SPECBRIGHTS,a2 move.l #NORMVECTS,a1 move.l #SHADOWPTS,a5 move.w num_points,d7 subq #1,d7 CALCSPECBRIGHTS: move.w (a1)+,x1 move.w (a1)+,y1 move.w (a1)+,z1 move.w x2b,d0 move.l (a5)+,d1 asr.l #8,d1 asr.l #1,d1 sub.w d1,d0 move.w d0,x2 move.w y2b,d0 move.l (a5)+,d1 asr.l #8,d1 asr.l #1,d1 sub.w d1,d0 move.w d0,y2 move.w z2b,d0 sub.w (a5)+,d0 move.w d0,z2 move.w #0,d6 cmp.w #-1,x1 bne.s .notnot cmp.w #-1,y1 bne.s .notnot cmp.w #-1,z1 beq .dontbother .notnot: move.w x2,d2 muls d2,d2 move.w y2,d1 muls d1,d1 add.l d1,d2 move.w z2,d1 muls d1,d1 add.l d1,d2 jsr CALCSQROOT move.w d2,l2 move.w y1,d0 muls z2,d0 move.w y2,d1 muls z1,d1 sub.l d1,d0 ; x4 move.w z1,d1 muls x2,d1 move.w z2,d2 muls x1,d2 sub.l d2,d1 ; y4 move.w x1,d2 muls y2,d2 move.w x2,d3 muls y1,d3 sub.l d3,d2 ; z4 asr.l #8,d0 asr.l #8,d1 asr.l #8,d2 asr.l #2,d0 asr.l #2,d1 asr.l #2,d2 move.w x1,d3 muls d1,d3 move.w y1,d4 muls d0,d4 sub.l d4,d3 asr.l #8,d3 asr.l #1,d3 add.w z2,d3 muls #1024,d3 divs l2,d3 move.w d3,z3 move.w y1,d3 muls d2,d3 move.w z1,d4 muls d1,d4 sub.l d4,d3 asr.l #8,d3 asr.l #1,d3 add.w x2,d3 muls #1024,d3 divs l2,d3 move.w d3,x3 move.w z1,d3 muls d0,d3 move.w x1,d4 muls d2,d4 sub.l d4,d3 asr.l #8,d3 asr.l #1,d3 add.w y2,d3 muls #1024,d3 divs l2,d3 move.w d3,y3 move.w z3,d3 asr.w #4,d3 add.w #128,d3 move.b d3,d6 lsl.w #8,d6 move.w x3,d3 asr.w #4,d3 add.w #128,d3 move.b d3,d6 tst.w y3 blt.s .okpos move.w x3,d1 asr.w #4,d1 move.w z3,d2 asr.w #4,d2 muls d1,d1 muls d2,d2 add.l d1,d2 jsr CALCSQROOT tst.w d2 beq.s .okpos move.w d2,d3 neg.w d3 add.w #127,d3 move.w z3,d4 muls d3,d4 divs d2,d4 asr.w #4,d4 add.w #128,d4 move.b d4,d6 lsl.w #8,d6 move.w x3,d4 muls d3,d4 divs d2,d4 asr.w #4,d4 add.w #128,d4 move.b d4,d6 ; neg.w y3 .okpos ; add.w y2,d3 ; ; move.w d3,d6 ; ; asr.w #4,d6 ; ; add.w #30,d6 ; ; ble.s .okokok ; ; moveq #0,d6 ; ;.okokok: ; add.w #$1c,d6 ; ; cmp.w #1,d6 ; bge.s .okokokok ; moveq #1,d6 ;.okokokok: ; ; cmp.w #28,d6 ; blt.s .okbig ; move.w #28,d6 ;.okbig .dontbother: move.w d6,(a2)+ move.w y3,(a2)+ dbra d7,CALCSPECBRIGHTS * NOW THE POINTS FOR ON-SCREENNESS move.l #ROTATEDPTS,a2 move.l PtsPtr,a0 move.w num_points,d7 subq #1,d7 ROTPTLOP: move.w (a0)+,d0 move.w d0,d3 move.w (a0)+,d1 move.w (a0)+,d2 move.w d2,d5 muls YCOS,d0 muls YSIN,d2 sub.l d2,d0 asr.l #6,d0 ; new x*512 muls YSIN,d3 muls YCOS,d5 add.l d5,d3 add.l d3,d3 swap d3 move.w d3,d2 ; new z move.w d1,d4 move.w d2,d5 muls XCOS,d1 muls XSIN,d2 sub.l d2,d1 asr.l #6,d1 ; new y*512 muls XSIN,d4 muls XCOS,d5 add.l d5,d4 add.l d4,d4 swap d4 move.w d4,d2 ; new z ext.l d2 move.w XOFF,d5 ext.l d5 asl.l #8,d5 add.l d5,d5 add.l d5,d0 move.l d0,(a2)+ move.l d1,(a2)+ move.w d2,(a2)+ dbra d7,ROTPTLOP ; Now convert the rotated points to the screen: move.l #ROTATEDPTS,a0 move.l #ONSCREENPTS,a2 move.w num_points,d7 subq #1,d7 CONVERTTOSCREEN: move.l (a0)+,d0 move.l (a0)+,d1 move.w (a0)+,d2 ; asr.w #1,d2 add.w ZOFF,d2 ext.l d2 move.l d0,d3 asr.l #1,d3 add.l d3,d0 move.l d1,d3 asr.l #1,d3 add.l d3,d1 divs d2,d0 divs d2,d1 add.w #160*4,d0 add.w #128*4,d1 move.w d0,(a2)+ move.w d1,(a2)+ dbra d7,CONVERTTOSCREEN move.w #254,HIGHPOLY move.l LinesPtr,a1 move.l #PartBuffer,a0 move.l a0,a2 move.w #15,d0 clrpartbuffSHAD: move.l #$80000001,(a2)+ move.l #$80000001,(a2)+ move.l #$80000001,(a2)+ move.l #$80000001,(a2)+ dbra d0,clrpartbuffSHAD move.l #SHADOWPTS,a2 move.l OBJONOFF,d5 move.w #0,d4 tst.w SORTIT bne.s PutInPartsSHAD putinunsortedSHAD: move.w (a1)+,d7 blt doneallpartsSHAD lsr.l #1,d5 bcs.s .yeson addq #2,a1 bra putinunsortedSHAD .yeson: move.w (a1)+,d6 move.l #0,(a0)+ move.w d7,(a0)+ move.w d4,(a0)+ addq #1,d4 bra putinunsortedSHAD PutInPartsSHAD move.w (a1)+,d7 blt doneallpartsSHAD lsr.l #1,d5 bcs.s .yeson addq #2,a1 bra PutInPartsSHAD .yeson: move.w (a1)+,d6 move.l 4(a2,d6.w),d0 add.l #200000,d0 move.l #PartBuffer-8,a0 stillfrontSHAD addq #8,a0 cmp.l (a0),d0 blt stillfrontSHAD move.l #endparttab-8,a5 domoreshiftSHAD: move.l -8(a5),(a5) move.l -4(a5),4(a5) subq #8,a5 cmp.l a0,a5 bgt.s domoreshiftSHAD move.l d0,(a0) move.w d7,4(a0) move.w d4,6(a0) addq #1,d4 bra PutInPartsSHAD doneallpartsSHAD: move.l #PartBuffer,a0 ifne SHADOWMAP PartLoopSHAD move.l (a0)+,d7 blt nomorepartsSHAD move.l #SAVEHIGHS,a2 move.w 2(a0),d0 move.w HIGHPOLY,(a2,d0.w*2) moveq #0,d0 move.w (a0),d0 addq #4,a0 add.l START_OF_OBJECT,d0 move.l d0,a1 polylooSHAD: tst.w (a1) blt.s nomorepolysSHAD movem.l a0/a1/d7,-(a7) bsr doaSHADEpoly movem.l (a7)+,a0/a1/d7 move.w (a1),d0 lea 18(a1,d0.w*4),a1 bra.s polylooSHAD nomorepolysSHAD: sub.w #1,HIGHPOLY bra PartLoopSHAD nomorepartsSHAD: endc ******************************************* * Now the on-screen bit... ******************************************* move.l LinesPtr,a1 move.l #PartBuffer,a0 move.l a0,a2 move.w #15,d0 clrpartbuff: move.l #$80000001,(a2)+ move.l #$80000001,(a2)+ move.l #$80000001,(a2)+ move.l #$80000001,(a2)+ dbra d0,clrpartbuff move.l #ROTATEDPTS,a2 move.l OBJONOFF,d5 moveq #0,d4 tst.w SORTIT bne.s PutInParts putinunsorted: move.w (a1)+,d7 blt doneallparts lsr.l #1,d5 bcs.s .yeson addq #2,a1 bra putinunsorted .yeson: move.w (a1)+,d6 move.l #0,(a0)+ move.w d7,(a0)+ move.w d4,(a0)+ addq #1,d4 bra putinunsorted PutInParts move.w (a1)+,d7 blt doneallparts lsr.l #1,d5 bcs.s .yeson addq #2,a1 bra PutInParts .yeson: move.w (a1)+,d6 move.l (a2,d6.w),d0 asr.l #8,d0 asr.l #2,d0 muls d0,d0 move.l 4(a2,d6.w),d2 asr.l #8,d2 asr.l #2,d2 muls d2,d2 add.l d2,d0 move.w 8(a2,d6.w),d2 add.w #1024,d2 muls d2,d2 add.l d2,d0 move.l #PartBuffer-8,a0 stillfront addq #8,a0 cmp.l (a0),d0 blt stillfront move.l #endparttab-8,a5 domoreshift: move.l -8(a5),(a5) move.l -4(a5),4(a5) subq #8,a5 cmp.l a0,a5 bgt.s domoreshift move.l d0,(a0) move.w d7,4(a0) move.w d4,6(a0) addq #1,d4 bra PutInParts doneallparts: move.l #PartBuffer,a0 PartLoop move.l (a0)+,d7 blt nomoreparts move.l #SAVEHIGHS,a2 move.w 2(a0),d0 move.w (a2,d0.w*2),HIGHPOLY moveq #0,d0 move.w (a0),d0 addq #4,a0 add.l START_OF_OBJECT,d0 move.l d0,a1 polyloo: tst.w (a1) blt.s nomorepolys movem.l a0/a1/d7,-(a7) bsr doapoly movem.l (a7)+,a0/a1/d7 move.w (a1),d0 lea 18(a1,d0.w*4),a1 bra.s polyloo nomorepolys: sub.w #1,HIGHPOLY bra PartLoop nomoreparts: NOPOLYS: ; btst #6,$bfe001 ; beq.s .SHOWSHADOW ifne MOTIONBLUR move.l FASTBUFFER,d0 cmp.l #fasty,d0 bne .SHOWNSCRN move.l #fasty,a0 move.l #fasty2,a1 add.l #40*320+64,a0 add.l #40*320+64,a1 move.l #BLUR,a2 move.w #175,d0 moveq #0,d6 .blurchunk: move.w #(192/4)-1,d1 .blurline: move.l (a0),d2 move.l d2,d4 swap d4 move.l (a1)+,d3 move.l d3,d5 swap d5 lsr.w #8,d5 move.b d5,d4 move.w d4,d6 move.b (a2,d6.l),d7 lsl.l #8,d7 lsl.l #8,d2 lsl.l #8,d3 move.l d2,d4 move.l d3,d5 swap d4 swap d5 lsr.w #8,d5 move.b d5,d4 move.w d4,d6 move.b (a2,d6.l),d7 lsl.l #8,d7 lsl.l #8,d2 lsl.l #8,d3 move.l d2,d4 move.l d3,d5 swap d4 swap d5 lsr.l #8,d5 move.b d5,d4 move.w d4,d6 move.b (a2,d6.l),d7 lsl.l #8,d7 lsl.l #8,d2 lsl.l #8,d3 move.l d2,d4 move.l d3,d5 swap d4 swap d5 lsr.l #8,d5 move.b d5,d4 move.w d4,d6 move.b (a2,d6.l),d7 move.l d7,(a0)+ dbra d1,.blurline add.w #(320-192),a1 add.w #(320-192),a0 dbra d0,.blurchunk endc ifeq LARGESCREEN move.l FASTBUFFER,a0 add.l #40*320+64,a0 move.l #RAWSCRN,a1 add.l #40*40+8,a1 move.l #(24)-1,d0 move.l #175,d1 move.w #128,d2 move.w #16,d3 moveq #0,d4 moveq #0,d5 jsr CHUNKYTOPLANAR endc ifne LARGESCREEN move.l FASTBUFFER,a0 move.l #RAWSCRN,a1 move.l #39,d0 move.l #255,d1 move.w #0,d2 move.w #0,d3 moveq #0,d4 moveq #0,d5 jsr CHUNKYTOPLANAR endc bra .SHOWNSCRN .SHOWSHADOW move.l #SHADOWBUFFER,a0 add.l #40*256,a0 move.l #RAWSCRN,a1 add.l #40*40,a1 move.l #(256/8)-1,d0 move.l #175,d1 move.w #0,d2 move.w #8,d3 moveq #0,d4 moveq #0,d5 jsr CHUNKYTOPLANAR .SHOWNSCRN: ifne MOTIONBLUR move.l #fasty2,d1 move.l FASTBUFFER,d0 cmp.l #fasty,d0 beq.s .ok2 move.l #fasty,d1 .ok2: move.l d1,FASTBUFFER endc move.l FASTBUFFER,a0 move.l #NEBBIE,a1 ifeq LARGESCREEN add.l #40*320+64,a0 endc move.l #BLUR,a2 ifeq LARGESCREEN moveq #0,d6 move.w #175,d0 endc ifne LARGESCREEN move.l #$e5e5e5e5,d6 move.w #511,d0 endc clrchunk: ifeq LARGESCREEN REPT 192/4 move.l (a1)+,(a0)+ endr add.w #(320-192),a0 endc ifne LARGESCREEN REPT 160/4 move.l d6,(a0)+ endr endc dbra d0,clrchunk move.l #SHADOWBUFFER,a0 move.l #-1,d1 move.l #-1,d2 move.w #15,d0 ;clrshad: ; move.w #15,d5 ;innner ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d2,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; move.l d1,(a0)+ ; dbra d5,innner ; exg d1,d2 ; ; dbra d0,clrshad btst #7,$bfe001 beq.s exit_closescr add.l #$8000,lmxoff cmp.l #40*65536,lmxoff blt.s .oksm sub.l #40*65536,lmxoff .oksm bra loop lmxoff: dc.l 0 exit_closescr move.l MyScreen(pc),a0 CALLINT CloseScreen exit_closeall move.l _GfxBase(pc),a1 CALLEXEC CloseLibrary exit_closeint move.l _IntuitionBase(pc),a1 CALLEXEC CloseLibrary exit_false move.l #0,d0 return code rts TESTTAB: ds.w 30 ************************************************ * SUBROUTINES HERE. **************************** ************************************************ ********************************************************** * the definition of the screen - note that in assembler you * MUST get the sizes of these fields correct, by consulting either * the RKM or the header files MyNewScreen dc.w 0,0 left, top dc.w 320,256 width, height dc.w 8 depth dc.b 0,1 pens dc.w 0 viewmodes dc.w CUSTOMSCREEN type dc.l MyFont font dc.l screen_title title dc.l 0 gadgets dc.l 0 bitmap * my font definition MyFont dc.l font_name dc.w TOPAZ_SIXTY dc.b FS_NORMAL dc.b FPF_ROMFONT * the variables _IntuitionBase dc.l 0 Intuition lib pointer _GfxBase dc.l 0 graphics lib pointer MyScreen dc.l 0 MyWindow dc.l 0 MyNewWindow ds.b nw_SIZE a buffer * some strings int_name INTNAME graf_name GRAFNAME hello_message dc.b 'Hello World' * these are C strings, so have to be null terminated screen_title dc.b 'My Own Screen',0 font_name dc.b 'topaz.font',0 window_title dc.b 'A Simple Window',0 even doaSHADEpoly: move.w (a1)+,d7 ; sides to draw addq #2,a1 ; avoid holes move.l #SHADOWPTS,a3 move.w (a1),d0 move.w 4(a1),d1 move.w 8(a1),d2 muls #10,d0 muls #10,d1 muls #10,d2 move.w 8(a3,d0.w),d3 move.w 8(a3,d1.w),d4 move.w 8(a3,d2.w),d5 move.l (a3,d0.w),d0 move.l (a3,d1.w),d1 move.l (a3,d2.w),d2 asr.l #8,d0 asr.l #8,d1 asr.l #8,d2 asr.l #1,d0 asr.l #1,d1 asr.l #1,d2 sub.w d1,d0 sub.w d1,d2 sub.w d4,d3 sub.w d4,d5 muls d3,d2 muls d5,d0 sub.l d0,d2 bge SHADpolybehind move.w #20000,d4 ; top move.w #-20000,d5 ; bottom move.l #UVCOORDS,a4 putinlinesSHAD: move.w (a1),d0 move.w 4(a1),d1 moveq #0,d2 move.b 2(a1),d2 ; one end U move.w d2,2(a4,d0.w*4) move.b 3(a1),d2 ; one end V move.w d2,(a4,d0.w*4) move.b 6(a1),d2 ; two end U move.w d2,2(a4,d1.w*4) move.b 7(a1),d2 ; two end V move.w d2,(a4,d1.w*4) move.w d0,d2 muls #10,d2 move.w 8(a3,d2.w),d2 ; Z cmp.w d2,d4 ble.s .oktop move.w d2,d4 .oktop cmp.w d2,d5 bge.s .okbot move.w d2,d5 .okbot movem.l d4/d5/d7/a1/a3/a4,-(a7) bsr SIMPLESHADLINE movem.l (a7)+,d4/d5/d7/a1/a3/a4 addq #4,a1 dbra d7,putinlinesSHAD addq #4,a1 move.w (a1)+,TEXTUREADD asr.w #2,d4 asr.w #2,d5 add.w #128,d4 add.w #128,d5 move.w d4,TOPLINE move.w d5,BOTLINE * Now draw the shadow polygon.... move.l #SHADOWBUFFER,a2 move.l #LEFTUVS,a0 move.w TOPLINE,d0 move.w BOTLINE,d1 sub.w d0,d1 asl.w #3,d0 add.w d0,a0 muls #(512/8),d0 add.l d0,a2 ; pointer to screen line. subq #1,d1 blt NOPOLYGONSHAD DOAHORLINESHAD: swap d1 move.w RIGHTUVS-LEFTUVS(a0),d0 move.w (a0)+,d7 sub.w d7,d0 blt NOPOLYGONSHAD move.l a2,-(a7) ; asr.w #2,d0 ; asr.w #2,d7 lea (a2,d7.w*2),a2 ext.l d0 addq #1,d0 move.w RIGHTUVS-LEFTUVS(a0),d7 move.w (a0)+,d4 swap d7 clr.w d7 swap d4 clr.w d4 sub.l d4,d7 divs.l d0,d7 move.l d7,a5 move.w RIGHTUVS-LEFTUVS(a0),d7 swap d7 clr.w d7 move.w (a0)+,d5 swap d5 clr.w d5 sub.l d5,d7 divs.l d0,d7 move.l d7,a6 move.w RIGHTUVS-LEFTUVS(a0),d7 swap d7 clr.w d7 move.w (a0)+,d6 swap d6 clr.w d6 sub.l d6,d7 divs.l d0,d7 move.l d7,a3 move.l a0,-(a7) move.l d1,-(a7) move.l #TEXTURES,a0 move.w TEXTUREADD,d7 bge.s .okaddtes3 and.w #$7fff,d7 add.l #65536*4,a0 .okaddtes3: ext.l d7 ; add.l d7,d7 asl.l #8,d7 add.l d7,a0 move.w #0,d7 subq #1,d0 ; d0=xdist ; d4=U a5=DU ; d5=V a6=DV ; d6=Y a3=DY moveq #0,d1 swap d6 PLOTADOT: .across ; swap d4 ; swap d5 ; move.w d4,d2 ; lsl.w #8,d2 ; swap d4 ; move.b d5,d2 ; add.l a5,d4 ; swap d5 ; add.l a6,d5 ; swap d6 ; move.b (a2)+,d1 ; tst.b 1(a0,d2.w*8) ; beq.s .noplottt move.b d6,(a2) addq #2,a2 dbra d0,.across bra.s .plaster .noplottt: addq #1,a2 dbra d0,.across .plaster: move.l (a7)+,d1 move.l (a7)+,a0 move.l (a7)+,a2 .noline: add.w #512,a2 swap d1 dbra d1,DOAHORLINESHAD NOPOLYGONSHAD: SHADpolybehind: rts ************************************************ LU: dc.w 0 LV: dc.w 0 RU: dc.w 0 RV: dc.w 0 SIMPLESHADLINE: move.l #SHADOWPTS,a1 move.l #UVCOORDS,a2 move.w (a2,d0.w*4),LU move.w 2(a2,d0.w*4),LV move.w (a2,d1.w*4),RU move.w 2(a2,d1.w*4),RV muls #10,d0 muls #10,d1 move.w 8(a1,d0.w),d2 ;fz move.w 8(a1,d1.w),d7 ;sz ext.l d2 ext.l d7 move.l #LEFTUVS,a3 asr.l #2,d2 asr.l #2,d7 cmp.l d2,d7 beq .noline bgt.s .lineonright .lineonleft: move.l #RIGHTUVS,a3 exg d0,d1 exg d2,d7 move.l LU,d5 move.l RU,LU move.l d5,RU .lineonright: sub.w d2,d7 add.w #128,d2 lea (a3,d2.w*8),a3 move.w d7,YDIFF move.l (a1,d0.w),d3 ;fx move.l (a1,d1.w),d7 ;sx asl.l #5,d3 asl.l #5,d7 sub.l d3,d7 divs.l YDIFF-2,d7 move.l d7,a0 ; dx move.l #ROTATEDPTS,a1 move.w LU,d4 move.w LV,d5 move.w RU,d6 move.w RV,d7 sub.w d4,d6 sub.w d5,d7 swap d4 swap d5 clr.w d4 clr.w d5 swap d6 swap d7 clr.w d6 clr.w d7 divs.l YDIFF-2,d6 divs.l YDIFF-2,d7 move.l d6,a4 move.l d7,a5 ; asl.w #4,d0 ; asl.w #4,d1 move.l 4(a1,d0.w),d6 move.l 4(a1,d1.w),d7 asl.l #5,d6 asl.l #5,d7 sub.l d6,d7 divs.l YDIFF-2,d7 exg d7,a6 exg d7,d6 move.l YDIFF-2,d1 subq #1,d1 ; d3=x a0=dx ; d4=u a4=du ; d5=v a5=dv ; d7=y a6=dy ; d1=dz move.w HIGHPOLY,d7 add.l #128*65536,d3 ; add.l #128*65536,d7 .PUTINLINE: swap d3 move.w d3,(a3)+ swap d3 add.l a0,d3 swap d4 move.w d4,(a3)+ swap d4 swap d5 add.l a4,d4 move.w d5,(a3)+ swap d5 add.l a5,d5 ; swap d7 move.w d7,(a3)+ ; swap d7 ; add.l a6,d7 dbra d1,.PUTINLINE .noline: rts BCOS: dc.w 0 BSIN: dc.w 0 ACOS: dc.w 0 ASIN: dc.w 0 CCOS: dc.w 0 CSIN: dc.w 0 DCOS: dc.w 0 DSIN: dc.w 0 ECOS: dc.w 0 ESIN: dc.w 0 FSX: dc.w 0 FSY: dc.w 0 SSX: dc.w 0 SSY: dc.w 0 ************************************************** doapoly: move.w (a1)+,d7 ; sides to draw addq #2,a1 ; avoid holes move.w 12(a1,d7.w*4),pregour move.l #ONSCREENPTS,a3 move.w (a1),d0 move.w 4(a1),d1 move.w 8(a1),d2 move.w 2(a3,d0.w*4),d3 move.w 2(a3,d1.w*4),d4 move.w 2(a3,d2.w*4),d5 move.w (a3,d0.w*4),d0 move.w (a3,d1.w*4),d1 move.w (a3,d2.w*4),d2 sub.w d1,d0 sub.w d1,d2 sub.w d4,d3 sub.w d4,d5 muls d3,d2 muls d5,d0 sub.l d0,d2 ble polybehind ; Now we must rotate the polygons coordinates in ; the specular map so that the texturemap is vertical ; relative to the specular map and so that bump- ; mapping can take place unerroneously! ; movem.l d0-d7/a0-a6,-(a7) move.w #0,BCOS move.w #128*128,ACOS move.w #0,BSIN move.w #0,ASIN moveq #0,d3 move.b 2(a1),d3 moveq #0,d4 move.b 3(a1),d4 moveq #0,d5 move.b 2+4(a1),d5 moveq #0,d6 move.b 3+4(a1),d6 sub.w d3,d5 sub.w d4,d6 move.w d5,d1 move.w d6,d2 muls d1,d1 muls d2,d2 add.l d1,d2 jsr CALCSQROOT tst.w d2 beq .NOROT ext.l d5 ext.l d6 asl.l #7,d5 asl.l #7,d6 divs d2,d5 divs d2,d6 move.w d5,ECOS move.w d6,ESIN move.w ECOS,d0 asl.w #7,d0 move.w d0,ACOS move.w ESIN,d0 asl.w #7,d0 move.w d0,ASIN move.l #SPECBRIGHTS,a3 move.w (a1),d0 moveq #0,d5 moveq #0,d6 move.b (a3,d0.w*4),d5 move.b 1(a3,d0.w*4),d6 move.w 4(a1),d0 moveq #0,d3 moveq #0,d4 move.b (a3,d0.w*4),d3 move.b 1(a3,d0.w*4),d4 sub.w d5,d3 sub.w d6,d4 move.w d3,d1 move.w d4,d2 muls d1,d1 muls d2,d2 add.l d1,d2 jsr CALCSQROOT tst.w d2 beq .NOROT1 ext.l d3 asl.l #7,d3 ext.l d4 asl.l #7,d4 divs d2,d3 divs d2,d4 move.w d3,BCOS neg.w d4 move.w d4,BSIN move.w ECOS,d4 move.w ESIN,d5 move.w d4,d2 move.w d5,d3 muls BCOS,d2 muls BSIN,d3 sub.l d3,d2 muls BSIN,d4 muls BCOS,d5 add.l d5,d4 move.w d2,ACOS move.w d4,ASIN .NOROT1 move.w #0,DCOS move.w #0,DSIN move.w ECOS,d0 asl.w #7,d0 move.w d0,CCOS move.w ESIN,d0 asl.w #7,d0 move.w d0,CSIN ; bra .NOROT ; First calculate angle B move.l #NORMBRIGHTS,a3 movem.l d7/a1,-(a7) .findnonzer: move.w (a1),d0 moveq #0,d5 moveq #0,d6 move.b (a3,d0.w*2),d5 move.b 1(a3,d0.w*2),d6 move.w 4(a1),d0 moveq #0,d3 moveq #0,d4 move.b (a3,d0.w*2),d3 move.b 1(a3,d0.w*2),d4 sub.w d5,d3 sub.w d6,d4 bne.s .okok tst.w d3 bne.s .okok addq #4,a1 dbra d7,.findnonzer movem.l (a7)+,d7/a1 bra .NOROT .okok: moveq #0,d3 move.b 2(a1),d3 moveq #0,d4 move.b 3(a1),d4 moveq #0,d5 move.b 2+4(a1),d5 moveq #0,d6 move.b 3+4(a1),d6 sub.w d3,d5 sub.w d4,d6 move.w d5,d1 move.w d6,d2 muls d1,d1 muls d2,d2 add.l d1,d2 jsr CALCSQROOT tst.w d2 beq .NOROT8 ext.l d5 ext.l d6 asl.l #7,d5 asl.l #7,d6 divs d2,d5 divs d2,d6 move.w d5,ECOS neg.w d6 move.w d6,ESIN move.w ECOS,d0 asl.w #7,d0 move.w d0,CCOS move.w ESIN,d0 asl.w #7,d0 neg.w d0 move.w d0,CSIN .NOROT8: movem.l (a7)+,d7/a1 move.w d3,d1 move.w d4,d2 muls d1,d1 muls d2,d2 add.l d1,d2 jsr CALCSQROOT tst.w d2 beq .NOROT ext.l d3 asl.l #7,d3 ext.l d4 asl.l #7,d4 divs d2,d3 divs d2,d4 move.w d3,DCOS neg.w d4 move.w d4,DSIN move.w ECOS,d4 move.w ESIN,d5 move.w d4,d2 move.w d5,d3 muls DCOS,d2 muls DSIN,d3 sub.l d3,d2 muls DSIN,d4 muls DCOS,d5 add.l d5,d4 move.w d2,CCOS move.w d4,CSIN .NOROT: ; movem.l (a7)+,d0-d7/a0-a6 move.l #ONSCREENPTS,a3 move.w #20000,d4 ; top move.w #-20000,d5 ; bottom move.l #UVCOORDS,a4 move.l a1,a0 putinlines: move.w (a1),d0 move.w 4(a1),d1 moveq #0,d2 move.b 2(a1),d2 ; one end U move.w d2,2(a4,d0.w*4) move.b 3(a1),d2 ; one end V move.w d2,(a4,d0.w*4) move.b 6(a1),d2 ; two end U move.w d2,2(a4,d1.w*4) move.b 7(a1),d2 ; two end V move.w d2,(a4,d1.w*4) move.w 2(a3,d0.w*4),d2 ; Z cmp.w d2,d4 ble.s .oktop move.w d2,d4 .oktop cmp.w d2,d5 bge.s .okbot move.w d2,d5 .okbot movem.l a0/d4/d5/d7/a1/a3/a4,-(a7) jsr SIMPLECALCLINE movem.l (a7)+,a0/d4/d5/d7/a1/a3/a4 addq #4,a1 dbra d7,putinlines addq #4,a1 move.w (a1)+,TEXTUREADD asr.w #2,d4 asr.w #2,d5 ; add.w #128,d4 ; add.w #128,d5 move.w d4,TOPLINE move.w d5,BOTLINE move.l #SHADOWPTS,a1 move.w (a0),d0 move.w 4(a0),d1 move.w 8(a0),d2 CHECKVALS: muls #10,d0 muls #10,d1 muls #10,d2 lea (a1,d0.w),a0 lea (a1,d2.w),a2 lea (a1,d1.w),a1 move.l (a0),d3 sub.l (a1),d3 asr.l #8,d3 asr.l #1,d3 move.l 4(a0),d4 sub.l 4(a1),d4 asr.l #8,d4 asr.l #1,d4 move.w 8(a0),d5 sub.w 8(a1),d5 move.w d3,d6 muls d6,d6 move.w d4,d7 muls d7,d7 add.l d7,d6 move.w d5,d7 muls d7,d7 add.l d7,d6 move.l d6,d2 jsr CALCSQROOT move.w d2,LEN1 move.l (a2),d0 sub.l (a1),d0 asr.l #8,d0 asr.l #1,d0 move.l 4(a2),d1 sub.l 4(a1),d1 asr.l #8,d1 asr.l #1,d1 move.w 8(a2),d2 sub.w 8(a1),d2 muls d2,d3 muls d0,d5 sub.l d3,d5 ; length muls.l #$4c,d5 muls d0,d0 muls d1,d1 muls d2,d2 add.l d0,d1 add.l d1,d2 jsr CALCSQROOT muls LEN1,d2 bgt.s .ok moveq #1,d2 .ok divs.l d2,d5 add.l #16,d5 tst.l d5 ble.s .okbr moveq #0,d5 .okbr: add.w #$5c,d5 bge.s .okbr2 moveq #0,d5 .okbr2: move.w d5,d0 asl.w #8,d5 move.w d5,BRIGHTNESS+2 sub.w #$5c,d0 asr.w #1,d0 add.w #$5c,d0 asl.w #8,d0 move.w d0,BRIGHTNESS *********************************************** * Draw the polygon (shadowed). move.l FASTBUFFER,a2 move.l #LEFTUVS,a0 move.w TOPLINE,d0 move.w BOTLINE,d1 sub.w d0,d1 move.w d0,d2 muls #20,d2 add.l d2,a0 muls #320,d0 add.l d0,a2 ; pointer to screen line. subq #1,d1 blt NOPOLYGON tst.b Gouraud bne GOURPOLY DOAHORLINE: swap d1 move.w RIGHTUVS-LEFTUVS(a0),d0 move.w (a0)+,d7 asr.w #2,d0 asr.w #2,d7 sub.w d7,d0 bge.s .okflibble add.w #14,a0 add.w #320,a2 swap d1 dbra d1,DOAHORLINE bra NOPOLYGON .okflibble: move.l a2,-(a7) add.w d7,a2 ext.l d0 addq #1,d0 move.l RIGHTUVS-LEFTUVS(a0),d7 move.l (a0)+,d2 sub.l d2,d7 divs.l d0,d7 move.l d7,a1 move.l RIGHTUVS-LEFTUVS(a0),d7 move.l (a0)+,d3 sub.l d3,d7 divs.l d0,d7 move.l d7,a4 move.w RIGHTUVS-LEFTUVS(a0),d7 move.w (a0)+,d4 swap d7 clr.w d7 swap d4 clr.w d4 sub.l d4,d7 divs.l d0,d7 move.l d7,a5 move.w RIGHTUVS-LEFTUVS(a0),d7 swap d7 clr.w d7 move.w (a0)+,d5 swap d5 clr.w d5 sub.l d5,d7 divs.l d0,d7 move.l d7,a6 move.w RIGHTUVS-LEFTUVS(a0),d7 swap d7 clr.w d7 move.w (a0)+,d6 swap d6 clr.w d6 sub.l d6,d7 divs.l d0,d7 move.l d7,a3 move.l a0,-(a7) move.l d1,-(a7) move.l #TEXTURES,a0 move.w TEXTUREADD,d7 bge.s .okaddtes3 and.w #$7fff,d7 add.l #65536*4,a0 .okaddtes3: ext.l d7 ; add.l d7,d7 asl.l #8,d7 add.l d7,a0 move.w #0,d7 move.l BRIGHTNESS,a6 move.l a7,SAVESTACK move.l #SHADOWBUFFER,a7 subq #1,d0 ; d0=xdist ; d2=U a1=DU ; d3=V a4=DV ; d4=X a5=DX ; d5=Y a6=DY ; d6=Z a3=DZ move.w HIGHPOLY,d5 moveq #0,d1 swap d6 move.w d6,d1 lsl.w #8,d1 swap d4 move.b d4,d1 swap d4 swap d6 moveq #0,d7 move.b (a7,d1.l),d7 cmp.w d7,d5 ble INTHELIGHT bra.s INTHEDARK PENUMBRA: moveq #0,d1 swap d6 move.w d6,d1 lsl.w #8,d1 swap d4 move.b d4,d1 swap d4 swap d6 add.l a5,d4 add.l a3,d6 moveq #0,d7 move.b (a7,d1.l),d7 cmp.w d7,d5 ble INTOLIGHT bra.s INTODARK INTHEDARK: moveq #0,d1 swap d6 move.w d6,d1 lsl.w #8,d1 swap d4 move.b d4,d1 swap d4 swap d6 add.l a5,d4 add.l a3,d6 moveq #0,d7 move.b (a7,d1.l),d7 cmp.w d7,d5 ble.s INTOPENUM INTODARK: move.w #$5c00,d7 swap d2 move.w d2,d1 asl.w #8,d1 swap d3 move.b d3,d1 swap d2 swap d3 add.l a1,d2 add.l a4,d3 ; move.b (a0,d1.w*4),d7 ; beq.s .noplottt move.b TEXTUREPAL-256(pc,d7.w),(a2)+ dbra d0,INTHEDARK bra.s PASTAC .noplottt addq #1,a2 dbra d0,INTHEDARK bra.s PASTAC INTOPENUM: move.l a6,d7 swap d7 swap d2 move.w d2,d1 asl.w #8,d1 swap d3 move.b d3,d1 swap d2 swap d3 add.l a1,d2 add.l a4,d3 ; move.b (a0,d1.w*4),d7 ; beq.s .noplottt move.b TEXTUREPAL(pc,d7.w),(a2)+ dbra d0,PENUMBRA bra.s PASTAC .noplottt addq #1,a2 dbra d0,PENUMBRA bra.s PASTAC INTHELIGHT: moveq #0,d1 swap d6 move.w d6,d1 lsl.w #8,d1 swap d4 move.b d4,d1 swap d4 swap d6 add.l a5,d4 add.l a3,d6 moveq #0,d7 move.b (a7,d1.l),d7 cmp.w d7,d5 bgt.s INTOPENUM INTOLIGHT: move.w a6,d7 swap d2 move.w d2,d1 asl.w #8,d1 swap d3 move.b d3,d1 swap d2 swap d3 add.l a1,d2 add.l a4,d3 ; move.b (a0,d1.w*4),d7 ; beq.s .noplottt move.b TEXTUREPAL(pc,d7.w),(a2)+ dbra d0,INTHELIGHT bra.s PASTAC .noplottt: addq #1,a2 dbra d0,INTHELIGHT PASTAC move.l SAVESTACK,a7 move.l (a7)+,d1 move.l (a7)+,a0 move.l (a7)+,a2 .noline: add.w #320,a2 swap d1 dbra d1,DOAHORLINE NOPOLYGON: polybehind: rts TEXTUREPAL: SAVESTACK: dc.l 0 HIGHPOLY: dc.w 0 LEN1: dc.w 0 BRIGHTNESS: dc.l 0 TRANSTEXT: dc.w 0 AANG: dc.w 0 BANG: dc.w 0 CANG: dc.w 0 DANG: dc.w 0 include "ab3:print.s" temp: dc.w 0 GOURPOLY: DOAHORLINEGOUR: swap d1 ifeq SHADING move.w #128,16(a0) move.w #128,16+RIGHTUVS-LEFTUVS(a0) move.w #128,4+RIGHTUVS-LEFTUVS(a0) move.w #128,4(a0) endc move.w RIGHTUVS-LEFTUVS(a0),d0 move.w (a0)+,d7 asr.w #2,d0 asr.w #2,d7 sub.w d7,d0 bge.s .okflibble add.w #18,a0 add.w #320,a2 swap d1 dbra d1,DOAHORLINEGOUR bra NOPOLYGON .okflibble: move.l a2,-(a7) add.w d7,a2 ext.l d0 addq #1,d0 move.b RIGHTUVS-LEFTUVS(a0),d3 move.b (a0),d2 ext.w d3 ext.w d2 tst.w d2 blt .bothtowards ; bgt .firstaway tst.w d3 blt .bothtowards bra .bothaway .firsttowards: tst.w d3 ble .bothtowards ; First is towards and second away... move.w d0,d7 ; total length move.w d0,d6 neg.w d2 add.w d2,d3 muls d2,d6 divs d3,d6 ; length of first bit sub.w d6,d7 ; length of second bit move.w d6,FIRSTLEN move.w d7,LASTLEN tst.w FIRSTLEN beq .bothaway tst.w LASTLEN beq .bothtowards moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 move.b 6(a0),d2 move.b 7(a0),d3 move.w d2,FIRSTU move.w d3,FIRSTV move.w d2,d4 move.w d3,d5 sub.w #128,d2 sub.w #128,d3 muls d2,d2 muls d3,d3 add.l d3,d2 jsr CALCSQROOT tst.w d2 beq.s .nochng sub.w #128,d4 sub.w #128,d5 muls #127,d4 muls #127,d5 divs d2,d4 divs d2,d5 add.w #128,d4 add.w #128,d5 .nochng: move.w d4,MIDU move.w d5,MIDV move.b 6+RIGHTUVS-LEFTUVS(a0),d4 move.b 7+RIGHTUVS-LEFTUVS(a0),d5 move.w d4,SECU move.w d5,SECV move.w d4,d2 move.w d5,d3 sub.w #128,d2 sub.w #128,d3 muls d2,d2 muls d3,d3 add.l d3,d2 jsr CALCSQROOT tst.w d2 beq.s .nochng2 sub.w #128,d4 sub.w #128,d5 muls #127,d4 muls #127,d5 divs d2,d4 divs d2,d5 add.w #128,d4 add.w #128,d5 .nochng2: add.w MIDU,d4 add.w MIDV,d5 asr.w #1,d4 asr.w #1,d5 move.w d4,MIDU move.w d5,MIDV move.l RIGHTUVS-LEFTUVS(a0),d7 move.l (a0)+,d2 and.l #$ffffff,d2 and.l #$ffffff,d7 moveq #0,d3 moveq #0,d5 move.w d2,d3 ; bge.s .okp1 ; moveq #0,d3 ;.okp1 move.w d7,d5 ; bge.s .okp2 ; moveq #0,d5 ;.okp2 swap d3 swap d5 sub.l d3,d5 divs.l d0,d5 asr.l #8,d5 move.w d5,RIGHTBRIGHT asr.l #8,d3 move.w d3,LEFTBRIGHT clr.w d2 clr.w d7 sub.l d2,d7 asl.l #8,d2 divs.l d0,d7 asl.l #8,d7 move.l RIGHTUVS-LEFTUVS(a0),d6 move.l (a0)+,d3 moveq #0,d4 moveq #0,d5 ; move.w d6,d5 ; move.w d3,d4 ; move.b #0,d4 ; move.b #0,d5 move.w FIRSTU,d4 move.w MIDU,d5 lsl.l #8,d4 lsl.l #8,d5 sub.l d4,d5 divs.l FIRSTLEN-2,d5 move.w d4,d2 move.w d5,d7 move.l d7,a1 moveq #0,d4 moveq #0,d5 ; move.b d6,d5 ; move.b d3,d4 ; swap d5 ; swap d4 move.w FIRSTV,d4 move.w MIDV,d5 swap d4 swap d5 sub.l d4,d5 divs.l FIRSTLEN-2,d5 move.l d5,a3 move.l d4,d5 clr.w d3 clr.w d6 sub.l d3,d6 divs.l d0,d6 move.l d6,a4 move.w RIGHTUVS-LEFTUVS(a0),d7 move.w (a0)+,d4 swap d7 clr.w d7 swap d4 clr.w d4 sub.l d4,d7 divs.l d0,d7 move.l d7,a5 ; move.w RIGHTUVS-LEFTUVS(a0),d7 ; swap d7 ; clr.w d7 move.w (a0)+,d7 ; swap d5 ; clr.w d5 ; sub.l d5,d7 ; divs.l d0,d7 ; move.l d7,a6 move.w RIGHTUVS-LEFTUVS(a0),d7 swap d7 clr.w d7 move.w (a0)+,d6 swap d6 clr.w d6 sub.l d6,d7 divs.l d0,d7 lsl.l #8,d6 lsl.l #8,d7 move.w RIGHTBRIGHT,d7 move.l d7,a6 move.l a0,-(a7) move.l d1,-(a7) move.l #TEXTURES,a0 move.w TEXTUREADD,d7 bge.s .okaddtes3 and.w #$7fff,d7 add.l #65536*4,a0 .okaddtes3: ext.l d7 ; add.l d7,d7 asl.l #8,d7 add.l d7,a0 move.w #0,d7 move.w LEFTBRIGHT,d6 subq #1,d0 swap d0 move.w HIGHPOLY,d0 swap d0 ; d0=xdist ; d2=U a1=DU ; d3=V a4=DV ; d4=X a5=DX ; d5=Y a6=DY ; d6=Z a3=DZ ; d0= polynum : polynum : counter : counter ; d1= scratch : scratch : scratch : scratch ; d2= u : uacc : sv : svacc ; d3= v : v : vacc : vacc ; d4= x : x : xacc : xacc ; d5= su : su : suacc : suacc ; d6= z : zacc : bright : brightacc ; d7= scratch : scratch : scratch : scratch ; a0= textures ; a1= uspeed : uspeed : suspeed : suspeed ; a2= screen pointer ; a3= svspeed : svspeed : svspeed : svspeed ; a4= vspeed : vspeed : vspeed : vspeed ; a5= xspeed : xspeed : xspeed : xspeed ; a6= zspeed : zspeed :brightspeed : brightspeed ; a7= shadowmap pointer move.w FIRSTLEN,d0 sub.w #1,d0 bsr STARTLINE move.l #0,d5 move.w #0,d2 move.l #0,a3 move.w LASTLEN,d0 sub.w #1,d0 bsr STARTLINE move.l (a7)+,d1 move.l (a7)+,a0 move.l (a7)+,a2 bra .noline .firstaway: tst.w d3 bge .bothaway ; first is away and second is towards... ; this really isn't going to work... move.w d0,d7 ; total length move.w d0,d6 neg.w d3 add.w d2,d3 muls d2,d6 divs d3,d6 ; length of first bit sub.w d6,d7 ; length of second bit move.w d6,FIRSTLEN move.w d7,LASTLEN tst.w FIRSTLEN beq .bothaway tst.w LASTLEN beq .bothtowards moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 move.b 6(a0),d2 move.b 7(a0),d3 move.w d2,FIRSTU move.w d3,FIRSTV move.w d2,d4 move.w d3,d5 sub.w #128,d2 sub.w #128,d3 muls d2,d2 muls d3,d3 add.l d3,d2 jsr CALCSQROOT tst.w d2 beq.s .nochng22 sub.w #128,d4 sub.w #128,d5 muls #127,d4 muls #127,d5 divs d2,d4 divs d2,d5 add.w #128,d4 add.w #128,d5 .nochng22: move.w d4,MIDU move.w d5,MIDV moveq #0,d4 moveq #0,d5 move.b 6+RIGHTUVS-LEFTUVS(a0),d4 move.b 7+RIGHTUVS-LEFTUVS(a0),d5 move.w d4,SECU move.w d5,SECV move.w d4,d2 move.w d5,d3 sub.w #128,d2 sub.w #128,d3 muls d2,d2 muls d3,d3 add.l d3,d2 jsr CALCSQROOT tst.w d2 beq.s .nochng222 sub.w #128,d4 sub.w #128,d5 muls #127,d4 muls #127,d5 divs d2,d4 divs d2,d5 add.w #128,d4 add.w #128,d5 .nochng222: add.w MIDU,d4 add.w MIDV,d5 asr.w #1,d4 asr.w #1,d5 move.w d4,MIDU move.w d5,MIDV move.l RIGHTUVS-LEFTUVS(a0),d7 move.l (a0)+,d2 and.l #$ffffff,d2 and.l #$ffffff,d7 moveq #0,d3 moveq #0,d5 move.w d2,d3 move.w d7,d5 swap d3 swap d5 sub.l d3,d5 divs.l d0,d5 asr.l #8,d5 move.w d5,RIGHTBRIGHT asr.l #8,d3 move.w d3,LEFTBRIGHT clr.w d2 clr.w d7 sub.l d2,d7 asl.l #8,d2 divs.l d0,d7 asl.l #8,d7 move.l RIGHTUVS-LEFTUVS(a0),d6 move.l (a0)+,d3 moveq #0,d4 moveq #0,d5 move.w MIDU,d4 move.w SECU,d5 lsl.w #8,d4 lsl.w #8,d5 ; move.w d6,d5 ; move.w d3,d4 ; move.b #0,d4 ; move.b #0,d5 sub.l d4,d5 divs.l LASTLEN-2,d5 move.w d4,d2 move.w d5,d7 move.l d7,a1 moveq #0,d4 moveq #0,d5 move.w MIDV,d4 move.w SECV,d5 swap d5 swap d4 sub.l d4,d5 divs.l LASTLEN-2,d5 move.l d5,a3 move.l d4,d5 clr.w d3 clr.w d6 sub.l d3,d6 divs.l d0,d6 move.l d6,a4 move.w RIGHTUVS-LEFTUVS(a0),d7 move.w (a0)+,d4 swap d7 clr.w d7 swap d4 clr.w d4 sub.l d4,d7 divs.l d0,d7 move.l d7,a5 ; move.w RIGHTUVS-LEFTUVS(a0),d7 ; swap d7 ; clr.w d7 move.w (a0)+,d7 ; swap d5 ; clr.w d5 ; sub.l d5,d7 ; divs.l d0,d7 ; move.l d7,a6 move.w RIGHTUVS-LEFTUVS(a0),d7 swap d7 clr.w d7 move.w (a0)+,d6 swap d6 clr.w d6 sub.l d6,d7 divs.l d0,d7 lsl.l #8,d6 lsl.l #8,d7 move.w RIGHTBRIGHT,d7 move.l d7,a6 move.l a0,-(a7) move.l d1,-(a7) move.l #TEXTURES,a0 move.w TEXTUREADD,d7 bge.s .okaddtes4 and.w #$7fff,d7 add.l #65536*4,a0 .okaddtes4: ext.l d7 ; add.l d7,d7 asl.l #8,d7 add.l d7,a0 move.w #0,d7 move.w LEFTBRIGHT,d6 subq #1,d0 swap d0 move.w HIGHPOLY,d0 swap d0 ; d0=xdist ; d2=U a1=DU ; d3=V a4=DV ; d4=X a5=DX ; d5=Y a6=DY ; d6=Z a3=DZ ; d0= polynum : polynum : counter : counter ; d1= scratch : scratch : scratch : scratch ; d2= u : uacc : sv : svacc ; d3= v : v : vacc : vacc ; d4= x : x : xacc : xacc ; d5= su : su : suacc : suacc ; d6= z : zacc : bright : brightacc ; d7= scratch : scratch : scratch : scratch ; a0= textures ; a1= uspeed : uspeed : suspeed : suspeed ; a2= screen pointer ; a3= svspeed : svspeed : svspeed : svspeed ; a4= vspeed : vspeed : vspeed : vspeed ; a5= xspeed : xspeed : xspeed : xspeed ; a6= zspeed : zspeed :brightspeed : brightspeed ; a7= shadowmap pointer move.w d2,-(a7) move.l d5,-(a7) move.l a3,-(a7) move.w #0,d2 move.l #0,d5 move.l #0,a3 move.w FIRSTLEN,d0 subq #1,d0 bsr STARTLINE move.l (a7)+,a3 move.l (a7)+,d5 move.w (a7)+,d2 move.w LASTLEN,d0 subq #1,d0 bsr STARTLINE move.l (a7)+,d1 move.l (a7)+,a0 move.l (a7)+,a2 bra .noline .bothaway: move.w #0,6+RIGHTUVS-LEFTUVS(a0) move.w #0,6(a0) .bothtowards: ifne PH tst.w 16+RIGHTUVS-LEFTUVS(a0) blt.s .okone tst.w 16(a0) blt.s .okone move.w #0,2(a0) move.w #0,2+RIGHTUVS-LEFTUVS(a0) move.w #0,14(a0) move.w #0,14+RIGHTUVS-LEFTUVS(a0) .okone: endc move.l RIGHTUVS-LEFTUVS(a0),d7 move.l (a0)+,d2 and.l #$ffffff,d2 and.l #$ffffff,d7 moveq #0,d3 moveq #0,d5 move.w d2,d3 move.w d7,d5 swap d3 swap d5 sub.l d3,d5 divs.l d0,d5 asr.l #8,d5 move.w d5,RIGHTBRIGHT asr.l #8,d3 move.w d3,LEFTBRIGHT clr.w d2 clr.w d7 sub.l d2,d7 asl.l #8,d2 divs.l d0,d7 asl.l #8,d7 move.l RIGHTUVS-LEFTUVS(a0),d6 move.l (a0)+,d3 moveq #0,d4 moveq #0,d5 move.w d6,d5 move.w d3,d4 move.b #0,d4 move.b #0,d5 sub.l d4,d5 divs.l d0,d5 move.w d4,d2 move.w d5,d7 move.l d7,a1 moveq #0,d4 moveq #0,d5 move.b d6,d5 move.b d3,d4 swap d5 swap d4 sub.l d4,d5 divs.l d0,d5 move.l d5,a3 move.l d4,d5 clr.w d3 clr.w d6 sub.l d3,d6 divs.l d0,d6 asr.l #8,d3 ; XX XX vpos vacc asr.l #8,d6 ; XX XX vspeed vspeed ; move.l d6,a4 move.w RIGHTUVS-LEFTUVS(a0),d7 move.w (a0)+,d4 swap d7 clr.w d7 swap d4 clr.w d4 sub.l d4,d7 divs.l d0,d7 asl.l #8,d4 asl.l #8,d7 move.w d3,d4 move.w d6,d7 move.l d7,a5 ; move.w RIGHTUVS-LEFTUVS(a0),d7 ; swap d7 ; clr.w d7 move.w (a0)+,d7 ; swap d5 ; clr.w d5 ; sub.l d5,d7 ; divs.l d0,d7 ; move.l d7,a6 move.w RIGHTUVS-LEFTUVS(a0),d7 swap d7 clr.w d7 move.w (a0)+,d6 swap d6 clr.w d6 sub.l d6,d7 divs.l d0,d7 lsl.l #8,d6 lsl.l #8,d7 move.w RIGHTBRIGHT,d7 move.l d7,a6 moveq #0,d7 moveq #0,d3 move.w RIGHTUVS-LEFTUVS(a0),d7 move.w (a0)+,d3 addq #2,a0 sub.w d3,d7 swap d3 swap d7 divs.l d0,d7 move.l d7,a4 move.l a0,-(a7) move.l d1,-(a7) move.l #TEXTURES,a0 move.w TEXTUREADD,d7 bge.s .okaddtes5 and.w #$7fff,d7 add.l #65536*4,a0 .okaddtes5: ext.l d7 asl.l #8,d7 add.l d7,a0 move.w #0,d7 move.w LEFTBRIGHT,d6 subq #1,d0 swap d0 move.w HIGHPOLY,d0 swap d0 ; d0=xdist ; d2=U a1=DU ; d3=V a4=DV ; d4=X a5=DX ; d5=Y a6=DY ; d6=Z a3=DZ ; d0= polynum : polynum : counter : counter ; d1= scratch : scratch : scratch : scratch ; d2= u : uacc : sv : svacc ; d3= pxpos : pxpos : pxacc : pxacc ; d4= x : xacc : v : vacc ; d5= su : su : suacc : suacc ; d6= z : zacc : pypos : pyacc ; d7= scratch : scratch : scratch : scratch ; a0= textures ; a1= uspeed : uspeed : suspeed : suspeed ; a2= screen pointer ; a3= svspeed : svspeed : svspeed : svspeed ; a4= pxspd : pxspd : pxspd : pxspd ; a5= xspeed : xspeed : vspeed : vspeed ; a6= zspeed : zspeed : pyspeed : pyspeed ; a7= shadowmap pointer bsr STARTLINE move.l (a7)+,d1 move.l (a7)+,a0 move.l (a7)+,a2 .noline: add.w #320,a2 swap d1 dbra d1,DOAHORLINEGOUR bra NOPOLYGON ******************************* STARTLINE: move.l a7,SAVESTACK move.l #SHADOWBUFFER,a7 moveq #0,d1 swap d6 move.w d6,d1 move.l d4,d7 swap d7 lsr.w #8,d7 move.b d7,d1 swap d6 swap d0 moveq #0,d7 move.b (a7,d1.l*2),d7 cmp.w d7,d0 ble .startlight swap d0 bra INTHEDARKGOUR .startlight: swap d0 bra INTHELIGHTGOUR .startdark: *********************************** PENUMBRAGOUR: moveq #0,d1 swap d6 move.w d6,d1 move.l d4,d7 lsr.l #8,d7 swap d7 move.b d7,d1 swap d6 add.l a5,d4 add.l a6,d6 add.l a3,d5 swap d0 moveq #0,d7 move.b (a7,d1.l*2),d7 cmp.w d7,d0 ifne SHADOWMAP ble INTOLIGHTGOUR endc ifeq SHADOWMAP bra INTOLIGHTGOUR endc bra.s INTODARKGOUR INTHEDARKGOUR: moveq #0,d1 swap d6 move.w d6,d1 move.l d4,d7 swap d7 asr.w #8,d7 move.b d7,d1 swap d6 add.l a5,d4 add.l a6,d6 add.l a3,d5 swap d0 moveq #0,d7 move.b (a7,d1.l*2),d7 cmp.w d7,d0 ifne SHADOWMAP ble.s INTOPENUMGOUR endc ifeq SHADOWMAP bra INTOLIGHTGOUR endc INTODARKGOUR: swap d0 ;********************** ; moveq #0,d7 ;********************** swap d2 move.w d2,d1 move.w d4,d7 lsr.w #8,d7 move.b d7,d1 swap d2 add.l a1,d2 add.l a4,d3 move.l #(31*32*256),d7 move.b 1(a0,d1.w*4),d7 bra DARKplottt .noplottt addq #1,a2 dbra d0,INTHEDARKGOUR bra DONEDONEBUM INTOPENUMGOUR: swap d0 ********************* ; moveq #0,d7 ***************** swap d2 move.w d2,d1 move.w d4,d7 lsr.w #8,d7 move.b d7,d1 swap d2 add.l a1,d2 add.l a4,d3 move.l (a0,d1.w*4),d1 moveq #0,d7 move.w d6,d7 swap d3 move.b d3,d7 add.w d1,d7 swap d3 move.b 1(a7,d7.l*2),d7 lsl.w #8,d7 ; sub.w #$1c00,d7 asr.w #1,d7 ; add.w #$1c00,d7 neg.w d7 add.w #$1f00,d7 sub.b d7,d7 asl.l #5,d7 swap d1 move.b d1,d7 bra.s PENUMplottt .noplottt addq #1,a2 dbra d0,PENUMBRAGOUR bra DONEDONEBUM INTHELIGHTGOUR: moveq #0,d1 swap d6 move.w d6,d1 move.l d4,d7 swap d7 lsr.w #8,d7 move.b d7,d1 swap d6 add.l a5,d4 add.l a6,d6 add.l a3,d5 swap d0 moveq #0,d7 move.b (a7,d1.l*2),d7 cmp.w d7,d0 ifne SHADOWMAP bgt.s INTOPENUMGOUR endc INTOLIGHTGOUR: swap d0 swap d2 move.w d2,d1 move.w d4,d7 asr.w #8,d7 move.b d7,d1 swap d2 move.l (a0,d1.w*4),d1 ; SPEC COL OFX OFY add.l a1,d2 add.l a4,d3 bra.s LIGHTPLOTT .noplottt: addq #1,a2 dbra d0,INTHELIGHTGOUR FLIBBLEY: bra.s DONEDONEBUM PENUMplottt move.b GOURPAL(pc,d7.l),(a2)+ dbra d0,PENUMBRAGOUR bra.s DONEDONEBUM DARKplottt move.b GOURPAL(pc,d7.l),(a2)+ dbra d0,INTHEDARKGOUR bra.s DONEDONEBUM LIGHTPLOTT: moveq #0,d7 move.w d2,d7 swap d5 move.b d5,d7 swap d5 ifne BUMPSPEC add.w d1,d7 ; coord in spec map endc swap d1 ifeq SPECMAP and.w #$ff,d1 endc move.b 1(a7,d7.l*2),d7 ; specular value of point. lsl.w #8,d7 ifne SPECULAR add.w d7,d1 endc ifeq SPECULAR tst.w d1 endc bgt.s .okshiney and.w #$ff,d1 .okshiney move.w d6,d7 swap d3 move.b d3,d7 swap d1 ifne BUMPPHONG add.w d1,d7 endc clr.w d1 swap d1 move.b 1(a7,d7.l*2),d7 ; brightness of point neg.b d7 add.b #31,d7 and.w #$ff,d7 swap d7 lsr.l #3,d7 swap d3 add.l d7,d1 move.b GOURPAL(pc,d1.l),(a2)+ dbra d0,INTHELIGHTGOUR DONEDONEBUM: move.l SAVESTACK,a7 rts GOURPAL: incbin "ab3:includes/bigshadow.pal" LEFTSHINEV: dc.l 0 RIGHTSHINEV: dc.l 0 LEFTSHINEU: dc.l 0 RIGHTSHINEU: dc.l 0 TOPPTR: dc.l 0 TOPPTNUM: dc.w 0 BOTPTNUM: dc.w 0 LEFTBRIGHT: dc.w 0 RIGHTBRIGHT: dc.l 0 LEFTSPEC: dc.w 0 RIGHTSPEC: dc.w 0 *********************************************** SIMPLECALCLINE: move.l #ONSCREENPTS,a1 move.w 2(a1,d0.w*4),d2 ;fy move.w 2(a1,d1.w*4),d7 ;sy move.l #RIGHTUVS,a3 asr.w #2,d2 asr.w #2,d7 cmp.w d2,d7 beq .noline bgt.s .lineonright .lineonleft: move.l #LEFTUVS,a3 exg d0,d1 exg d2,d7 .lineonright: move.w d0,TOPPTNUM move.w d1,BOTPTNUM sub.w d2,d7 move.w d2,d3 muls #20,d3 asl.w #4,d2 add.w d3,a3 move.l a3,TOPPTR move.w d7,YDIFF move.w (a1,d0.w*4),d3 ;fx move.w (a1,d1.w*4),d7 ;sx sub.w d3,d7 swap d3 swap d7 clr.w d3 clr.w d7 divs.l YDIFF-2,d7 move.l d7,a0 ; dx move.l #UVCOORDS,a2 move.l #SHADOWPTS,a1 move.w (a2,d0.w*4),d4 move.w 2(a2,d0.w*4),d5 move.w (a2,d1.w*4),d6 move.w 2(a2,d1.w*4),d7 sub.w d4,d6 sub.w d5,d7 swap d4 swap d5 clr.w d4 clr.w d5 swap d6 swap d7 clr.w d6 clr.w d7 divs.l YDIFF-2,d6 divs.l YDIFF-2,d7 move.l d6,a4 move.l d7,a5 muls #10,d0 muls #10,d1 move.l (a1,d0.w),d6 move.l (a1,d1.w),d7 asl.l #5,d6 asl.l #5,d7 sub.l d6,d7 divs.l YDIFF-2,d7 move.l d7,a2 move.l d6,a6 move.l 4(a1,d0.w),d6 move.l 4(a1,d1.w),d7 asl.l #5,d6 asl.l #5,d7 sub.l d6,d7 divs.l YDIFF-2,d7 exg d7,a6 exg d7,d6 move.w 8(a1,d0.w),d0 move.w 8(a1,d1.w),d1 swap d0 swap d1 clr.w d0 clr.w d1 asr.l #2,d0 asr.l #2,d1 sub.l d0,d1 divs.l YDIFF-2,d1 move.l d1,a1 move.l YDIFF-2,d1 subq #1,d1 ; d3=sx a0=dsx ; d4=u a4=du ; d5=v a5=dv ; d6=x a2=dx ; d7=y a6=dy ; d0=z a1=dz ; d1=dsy add.l #128*65536,d6 add.l #128*65536,d7 add.l #128*65536,d0 .PUTINLINE: swap d3 move.w d3,(a3)+ swap d3 add.l a0,d3 move.l d4,(a3)+ add.l a4,d4 move.l d5,(a3)+ swap d6 add.l a5,d5 move.w d6,(a3)+ swap d6 swap d7 add.l a2,d6 move.w d7,(a3)+ swap d7 swap d0 add.l a6,d7 move.w d0,(a3)+ addq #4,a3 swap d0 add.l a1,d0 dbra d1,.PUTINLINE tst.b Gouraud beq .noline move.w TOPPTNUM,d0 move.w BOTPTNUM,d1 move.l TOPPTR,a3 moveq #0,d6 move.w YDIFF,d6 move.l #SPECBRIGHTS,a2 moveq #0,d2 moveq #0,d3 move.b (a2,d0.w*4),d2 move.b 1(a2,d0.w*4),d3 sub.w #128,d2 sub.w #128,d3 move.w d2,d4 move.w d3,d5 muls ACOS,d2 muls ASIN,d3 sub.l d3,d2 muls ASIN,d4 muls ACOS,d5 add.l d5,d4 asl.l #2,d2 swap d2 asl.l #2,d4 swap d4 add.w #128,d2 add.w #128,d4 move.w d2,FSX move.w d4,FSY moveq #0,d2 moveq #0,d3 move.b (a2,d1.w*4),d2 move.b 1(a2,d1.w*4),d3 sub.w #128,d2 sub.w #128,d3 move.w d2,d4 move.w d3,d5 muls ACOS,d2 muls ASIN,d3 sub.l d3,d2 muls ASIN,d4 muls ACOS,d5 add.l d5,d4 asl.l #2,d2 swap d2 asl.l #2,d4 swap d4 add.w #128,d2 add.w #128,d4 move.w d2,SSX move.w d4,SSY move.w 2(a2,d0.w*4),d2 move.w 2(a2,d1.w*4),d3 asr.w #4,d2 asr.w #4,d3 bra .bothtowards tst.w d2 blt .firsttowards bgt.s .firstaway tst.w d3 ble .bothtowards bra .bothaway .firstaway tst.w d3 blt .sectowards bra .bothaway .firsttowards: tst.w d3 ble .bothtowards ; First one is towards, the second away. ; Do the line in two bits: one heading ; from the first point to the rim, the ; other heading from the rim to the second ; point and flagged as behind. move.w d6,d7 ; total length to draw move.w d2,FIRSTY move.w d3,LASTY neg.w d2 add.w d2,d3 ; total change in Y bra.s .onetowards .sectowards: move.w d6,d7 ; total length to draw move.w d2,FIRSTY move.w d3,LASTY neg.w d3 add.w d2,d3 .onetowards: muls d2,d6 divs d3,d6 ; length of first bit of line. ext.l d6 ext.l d7 move.w d6,FIRSTLEN sub.l d6,d7 move.w d7,LASTLEN add.l d7,d6 move.w FIRSTY,d2 move.w LASTY,d3 swap d2 clr.w d2 swap d3 clr.w d3 sub.l d2,d3 divs.l d6,d3 move.l d3,a6 move.l d2,d7 moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 move.b (a2,d0.w*4),d2 move.b 1(a2,d0.w*4),d3 move.w d2,FIRSTU move.w d3,FIRSTV move.w d2,d4 move.w d3,d5 sub.w #128,d2 sub.w #128,d3 muls d2,d2 muls d3,d3 add.l d3,d2 jsr CALCSQROOT tst.w d2 beq.s .nochng sub.w #128,d4 sub.w #128,d5 muls #127,d4 muls #127,d5 divs d2,d4 divs d2,d5 add.w #128,d4 add.w #128,d5 .nochng: move.w d4,MIDU move.w d5,MIDV move.b (a2,d1.w*4),d4 move.b 1(a2,d1.w*4),d5 move.w d4,SECU move.w d5,SECV ; move.w d4,d2 ; move.w d5,d3 ; ; sub.w #128,d2 ; sub.w #128,d3 ; muls d2,d2 ; muls d3,d3 ; add.l d3,d2 ; jsr CALCSQROOT ; ; tst.w d2 ; beq.s .nochng2 ; ; sub.w #128,d4 ; sub.w #128,d5 ; muls #127,d4 ; muls #127,d5 ; divs d2,d4 ; divs d2,d5 ; add.w #128,d4 ; add.w #128,d5 ; ;.nochng2: ; ; add.w MIDU,d4 ; add.w MIDV,d5 ; asr.w #1,d4 ; asr.w #1,d5 ; move.w d4,MIDU ; move.w d4,MIDV move.l #NORMBRIGHTS,a2 move.w (a2,d0.w*2),d0 move.w (a2,d1.w*2),d1 sub.w d0,d1 swap d1 swap d0 divs.l d6,d1 move.w FIRSTLEN,d6 beq.s .nofirstbit ext.l d6 moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 move.w FIRSTU,d2 move.w MIDU,d3 move.w FIRSTV,d4 move.w MIDV,d5 sub.w d2,d3 swap d2 swap d3 divs.l d6,d3 move.l d3,a4 sub.w d4,d5 swap d4 swap d5 divs.l d6,d5 move.l d5,a5 bsr DOABITOFLINE .nofirstbit: move.w LASTLEN,d6 beq.s .nosecbit ext.l d6 moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 move.w MIDU,d2 move.w SECU,d3 move.w MIDV,d4 move.w SECV,d5 sub.w d2,d3 swap d2 swap d3 divs.l d6,d3 move.l d3,a4 sub.w d4,d5 swap d4 swap d5 divs.l d6,d5 move.l d5,a5 bsr DOABITOFLINE .nosecbit: bra .noline .bothaway ; Both are away, so do it simply. .bothtowards: ; Both are towards, so do it simply and flag all ; points as towards. swap d2 clr.w d2 swap d3 clr.w d3 sub.l d2,d3 divs.l d6,d3 move.l d3,a6 move.l d2,d7 moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 ; move.b (a2,d0.w*4),d2 ; move.b (a2,d1.w*4),d3 ; move.b 1(a2,d0.w*4),d4 ; move.b 1(a2,d1.w*4),d5 move.w FSX,d2 move.w SSX,d3 move.w FSY,d4 move.w SSY,d5 sub.w d2,d3 swap d2 swap d3 divs.l d6,d3 move.l d3,a4 sub.w d4,d5 swap d4 swap d5 divs.l d6,d5 move.l d5,a5 move.l #NORMBRIGHTS,a2 movem.l d2/d4,-(a7) moveq #0,d2 moveq #0,d3 move.b (a2,d0.w*2),d2 move.b 1(a2,d0.w*2),d3 sub.w #128,d2 sub.w #128,d3 move.w d2,d4 move.w d3,d5 muls ACOS,d2 muls ASIN,d3 sub.l d3,d2 muls ASIN,d4 muls ACOS,d5 add.l d5,d4 asl.l #2,d2 swap d2 asl.l #2,d4 swap d4 add.w #128,d2 add.w #128,d4 move.w d2,FSX move.w d4,FSY moveq #0,d2 moveq #0,d3 move.b (a2,d1.w*2),d2 move.b 1(a2,d1.w*2),d3 sub.w #128,d2 sub.w #128,d3 move.w d2,d4 move.w d3,d5 muls ACOS,d2 muls ASIN,d3 sub.l d3,d2 muls ASIN,d4 muls ACOS,d5 add.l d5,d4 asl.l #2,d2 swap d2 asl.l #2,d4 swap d4 add.w #128,d2 add.w #128,d4 move.w d2,SSX move.w d4,SSY moveq #0,d0 moveq #0,d1 moveq #0,d3 moveq #0,d5 move.w FSY,d3 move.w SSY,d5 move.w FSX,d0 move.w SSX,d1 ext.l d0 ext.l d1 sub.w d0,d1 swap d1 swap d0 divs.l d6,d1 ext.l d3 ext.l d5 sub.w d3,d5 swap d5 swap d3 divs.l d6,d5 movem.l (a7)+,d2/d4 move.l d6,-(a7) bsr DOABITOFLINE move.l (a7)+,d6 move.w TOPPTNUM,d0 move.w BOTPTNUM,d1 move.l TOPPTR,a3 move.l #NORMVECTS,a2 muls #6,d0 muls #6,d1 moveq #0,d2 moveq #0,d3 move.w 2(a2,d0.w),d2 ; firsty move.w 2(a2,d1.w),d3 ; secy sub.w d2,d3 swap d3 swap d2 divs.l d6,d3 subq #1,d6 .stickiny swap d2 move.w d2,18(a3) swap d2 add.l d3,d2 add.w #20,a3 dbra d6,.stickiny .noline: rts DOABITOFLINE: subq #1,d6 .STICKINGOUR: swap d7 move.b d7,2(a3) swap d7 add.l a6,d7 swap d0 move.w d0,4(a3) swap d0 add.l d1,d0 swap d2 move.b d2,8(a3) swap d4 move.b d4,9(a3) swap d4 swap d3 move.w d3,16(a3) swap d3 add.l d5,d3 adda.w #20,a3 swap d2 add.l a4,d2 add.l a5,d4 dbra d6,.STICKINGOUR rts FIRSTY: dc.w 0 LASTY: dc.w 0 FIRSTU: dc.w 0 SECU: dc.w 0 FIRSTV: dc.w 0 SECV: dc.w 0 dc.w 0 FIRSTLEN: dc.w 0 dc.w 0 LASTLEN: dc.w 0 MIDU: dc.w 0 MIDV: dc.w 0 *!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ move.w d3,TOPLINE move.w d4,BOTLINE ********************************************* CALCSQROOT: tst.l d2 beq .oksqr movem.l d0/d1/d3-d7/a0-a6,-(a7) move.w #31,d0 .findhigh btst d0,d2 bne .foundhigh dbra d0,.findhigh .foundhigh asr.w #1,d0 clr.l d3 bset d0,d3 move.l d3,d0 move.w d0,d1 muls d1,d1 ; x*x sub.l d2,d1 ; x*x-a asr.l #1,d1 ; (x*x-a)/2 divs d0,d1 ; (x*x-a)/2x sub.w d1,d0 ; second approx bgt .stillnot0 move.w #1,d0 .stillnot0 move.w d0,d1 muls d1,d1 sub.l d2,d1 asr.l #1,d1 divs d0,d1 sub.w d1,d0 ; second approx bgt .stillnot02 move.w #1,d0 .stillnot02 move.w d0,d1 muls d1,d1 sub.l d2,d1 asr.l #1,d1 divs d0,d1 sub.w d1,d0 ; second approx bgt .stillnot03 move.w #1,d0 .stillnot03 move.w d0,d2 ext.l d2 movem.l (a7)+,d0/d1/d3-d7/a0-a6 .oksqr rts ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************** ************************ ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** TOPLINE: dc.w 0 BOTLINE: dc.w 0 ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** ********************************************** dc.w 0 YDIFF: dc.w 0 SPINAROUND: dc.w 0 XCOS: dc.w 0 YCOS: dc.w 0 XSIN: dc.w 0 YSIN: dc.w 0 XCOS3: dc.w 0 YCOS3: dc.w 0 XSIN3: dc.w 0 YSIN3: dc.w 0 XCOS2: dc.w 0 YCOS2: dc.w 0 XSIN2: dc.w 0 YSIN2: dc.w 0 XADD: dc.l 0 YADD: dc.l 0 ZADD: dc.l 0 XOFF: dc.w 0 YOFF: dc.w 0 OLDXM: dc.w 0 OLDYM: dc.w 0 TEXTUREADD: dc.w 0 ********************************************************** UVCOORDS: ds.l 250 ROTATEDPTS: ds.l 250*4 SHADOWPTS: ds.l 250*4 ONSCREENPTS: ds.l 250 ZOFF: ifeq LARGESCREEN dc.w 768 endc ifne LARGESCREEN dc.w 300 endc LEFTRIGHT: ds.l 256 POLYGONDATA: ds.b 30000 OBJNAME: dc.b "ab3:vectobj/testcube",0 even doslibname: dc.b 'dos.library',0 even doslib: dc.l 0 **************************** SINETABLE: incbin "ab3:includes/bigsine" YANG: dc.w 0 XANG: dc.w 0 xmouse: dc.w 0 ymouse: dc.w 0 spleen: dc.w 0 lastspleen: dc.w 0 COPIEDPAL: dc.w 256,0 ds.l 3*256 ds.l 10 SHADOWBUFFER: HIGHLIGHT: incbin "work:temp/HIGHLIGHT" PALETTEBIT: ; incbin "256palette" ; dc.w $ffff,$fffe incbin "ab3:shadowtex/shadowpal" include "ab3:source_4000/chunky.s" willy: ds.w 48 PALS: ds.l 2*49 pregour: dc.b 0 Gouraud: dc.b 0 PointAngPtr: dc.l 0 FRAMENUM: dc.w 0 PolyAngPtr: dc.l 0 PtsPtr: dc.l 0 LinesPtr: dc.l 0 POINTER_TO_POINTERS: dc.l 0 FRAME: dc.w 4 FLIBBLE: dc.w 0 START_OF_OBJECT: dc.l 0 num_points: dc.w 0 num_frames: dc.w 0 SORTIT: dc.w 0 PartBuffer: ds.l 2*32 endparttab: x1: dc.w 0 y1: dc.w 0 z1: dc.w 0 x2: dc.w 0 y2: dc.w 0 z2: dc.w 0 x2b: dc.w 0 y2b: dc.w 0 z2b: dc.w 0 x3: dc.w 0 y3: dc.w 0 z3: dc.w 0 l1: dc.w 0 l2: dc.w 0 OBJONOFF: dc.l 0 SAVEHIGHS: ds.w 30 FASTBUFFER: dc.l fasty DS.B 64*256 fasty: ds.b 320*256 ds.b 64*256 ifne MOTIONBLUR fasty2: ds.b 320*256 endc NORMBRIGHTS: ds.w 250 SPECBRIGHTS: dcb.l 100,31 ENDNORM: LEFTUVS: ds.w 10*256 RIGHTUVS: ds.w 10*256 NORMVECTS: ds.w 3*250 ;WORLD: incbin "ab3:includes/world" ;TWEEN: incbin "ab3:includes/tweenbrightfile" NEBBIE: incbin "work:temp/nebbieroar" ds.l (192/4)*16 SECTION blib,code_f TEXTURES: incbin "ab3:shadowtex/shadowmaps" even BLUR: ifne MOTIONBLUR incbin "ab3:shadowtex/blurfile" endc Font: dc.l fontplace fontplace: incbin "ab3:XENFONT.bin" SECTION BGDROP,code_c RAWSCRN: ds.l 2560*8