* 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 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 loop: 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 #160,d0 add.w d0,YANG and.w #8190,YANG muls #8190,d1 divs #160,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 #160,d0 add.w d0,BANG and.w #8190,BANG muls #8190,d1 divs #160,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 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 bge.s .okokokok moveq #0,d6 .okokokok: add.w #32,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 move.w z1,d3 muls d0,d3 move.w x1,d4 muls d2,d4 sub.l d4,d3 add.l d3,d3 divs l2,d3 ; asr.l #8,d3 ; asr.l #1,d3 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 bge.s .okokokok moveq #0,d6 .okokokok: muls d6,d6 asr.w #5,d6 ; ; cmp.w #28,d6 ; blt.s .okbig ; move.w #28,d6 ;.okbig .dontbother: move.w d6,(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 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 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: ******************************************* * 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 move.l FASTBUFFER,a0 add.l #40*320+64,a0 move.l #RAWSCRN+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 bra .SHOWNSCRN .SHOWSHADOW move.l #SHADOWBUFFER,a0 add.l #40*256,a0 move.l #RAWSCRN+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: move.l FASTBUFFER,a0 move.l #NEBBIE,a1 add.l #40*320+64,a0 move.w #175,d0 clrchunk: move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ add.w #(320-192),a0 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 #(256/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 add.w d7,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 .okaddtes and.w #$7fff,d7 add.l #65536,a0 .okaddtes: add.w 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 (a0,d2.w*4) beq.s .noplottt move.b d6,(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 #256,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 ************************************************** 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 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 #$3c,d5 bge.s .okbr2 moveq #0,d5 .okbr2: move.w d5,d0 asl.w #8,d5 move.w d5,BRIGHTNESS+2 sub.w #$3c,d0 asr.w #1,d0 add.w #$3c,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 asl.w #4,d0 add.w d0,a0 muls #(320/16),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 .okaddtes and.w #$7fff,d7 add.l #65536,a0 .okaddtes: add.w 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 #$3c00,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 bra NOPOLYGON TEXTUREPAL: incbin "ab3:includes/shadow.pal" 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 NOPOLYGON: polybehind: rts GOURPOLY: DOAHORLINEGOUR: 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,DOAHORLINEGOUR 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 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 swap d5 swap d4 sub.l d4,d5 divs.l d0,d5 asr.l #8,d4 asr.l #8,d5 move.w d4,d2 ext.l d5 move.w d5,d7 move.l d7,a1 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)+,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 .okaddtes and.w #$7fff,d7 add.l #65536,a0 .okaddtes: add.w d7,a0 move.w #0,d7 move.l RIGHTBRIGHT,a6 move.w LEFTBRIGHT,d5 swap d5 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 INTHELIGHTGOUR bra.s INTHEDARKGOUR PENUMBRAGOUR: 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 add.l a6,d5 moveq #0,d7 move.b (a7,d1.l),d7 cmp.w d7,d5 ble INTOLIGHTGOUR bra.s INTODARKGOUR INTHEDARKGOUR: 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 add.l a6,d5 moveq #0,d7 move.b (a7,d1.l),d7 cmp.w d7,d5 ble.s INTOPENUMGOUR INTODARKGOUR: move.w #$3c00,d7 swap d2 move.w d2,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 bne.s DARKplottt .noplottt addq #1,a2 dbra d0,INTHEDARKGOUR bra PASTACGOUR INTOPENUMGOUR: move.l d5,d7 swap d7 sub.w #$3c00,d7 asr.w #1,d7 add.w #$3c00,d7 swap d2 move.w d2,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 bne.s PENUMplottt .noplottt addq #1,a2 dbra d0,PENUMBRAGOUR bra PASTACGOUR PENUMplottt move.w d2,d1 move.b GOURPAL(pc,d7.w),d1 move.b GOURPAL(pc,d7.w),(a2)+ dbra d0,PENUMBRAGOUR bra PASTACGOUR DARKplottt move.w d2,d1 add.w #256,d1 move.b GOURPAL(pc,d7.w),d1 move.b GOURPAL(pc,d7.w),(a2)+ dbra d0,INTHEDARKGOUR bra PASTACGOUR INTHELIGHTGOUR: 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 add.l a6,d5 moveq #0,d7 move.b (a7,d1.l),d7 cmp.w d7,d5 bgt.s INTOPENUMGOUR INTOLIGHTGOUR: move.l d5,d7 swap d7 swap d2 move.w d2,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.w d2,d1 move.b GOURPAL(pc,d7.w),d1 move.b GOURPAL(pc,d1.w),(a2)+ dbra d0,INTHELIGHTGOUR bra PASTACGOUR .noplottt: addq #1,a2 dbra d0,INTHELIGHTGOUR bra PASTACGOUR GOURPAL: incbin "ab3:includes/shadow.pal" PASTACGOUR: 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,DOAHORLINEGOUR bra NOPOLYGON ******************************************** *********************************** *************************** ******************* DORIGHTLEFT: add.w d0,a2 add.l d7,d2 neg.l d7 add.w d5,d4 neg.w d5 move.w d4,d2 move.w d5,d7 move.l d7,a1 exg d3,d6 clr.w d3 clr.w d6 sub.l d3,d6 divs.l d0,d6 move.l d6,a4 move.w LEFTBRIGHT,d6 move.w RIGHTBRIGHT,d7 add.w d7,d6 neg.w d6 move.w d6,LEFTBRIGHT move.w d7,RIGHTBRIGHT move.w RIGHTUVS-LEFTUVS(a0),d4 move.w (a0)+,d7 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),d5 swap d5 clr.w d5 move.w (a0)+,d7 swap d7 clr.w d7 sub.l d5,d7 divs.l d0,d7 move.l d7,a6 move.w RIGHTUVS-LEFTUVS(a0),d6 swap d6 clr.w d6 move.w (a0)+,d7 swap d7 clr.w d7 sub.l d6,d7 divs.l d0,d7 swap d7 move.l d7,a3 move.l a0,-(a7) move.l d1,-(a7) move.l #TEXTURES,a0 move.w TEXTUREADD,d7 bge.s .okaddtes and.w #$7fff,d7 add.l #65536,a0 .okaddtes: add.w d7,a0 move.w #0,d7 move.l RIGHTBRIGHT,a6 move.w LEFTBRIGHT,d5 swap d5 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 INTHELIGHTGOURRL bra.s INTHEDARKGOURRL PENUMBRAGOURRL: 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 add.l a6,d5 moveq #0,d7 move.b (a7,d1.l),d7 cmp.w d7,d5 ble INTOLIGHTGOURRL bra.s INTODARKGOURRL INTHEDARKGOURRL: 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 add.l a6,d5 moveq #0,d7 move.b (a7,d1.l),d7 cmp.w d7,d5 ble.s INTOPENUMGOURRL INTODARKGOURRL: move.w #$3c00,d7 swap d2 move.w d2,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 bne.s DARKplotttRL .noplottt subq #1,a2 dbra d0,INTHEDARKGOURRL bra PASTACGOUR INTOPENUMGOURRL: move.l d5,d7 swap d7 sub.w #$3c00,d7 asr.w #1,d7 add.w #$3c00,d7 swap d2 move.w d2,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 bne.s PENUMplotttRL .noplottt subq #1,a2 dbra d0,PENUMBRAGOURRL bra PASTACGOUR PENUMplotttRL move.w d2,d1 move.b GOURPALRL(pc,d7.w),d1 move.b GOURPALRL(pc,d1.w),-(a2) dbra d0,PENUMBRAGOUR bra PASTACGOUR DARKplotttRL move.w d2,d1 add.w #256,d1 move.b GOURPALRL(pc,d7.w),d1 move.b GOURPALRL(pc,d1.w),-(a2) dbra d0,INTHEDARKGOURRL bra PASTACGOUR INTHELIGHTGOURRL: 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 add.l a6,d5 moveq #0,d7 move.b (a7,d1.l),d7 cmp.w d7,d5 bgt.s INTOPENUMGOURRL INTOLIGHTGOURRL: move.l d5,d7 swap d7 swap d2 move.w d2,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.w d2,d1 move.b GOURPALRL(pc,d7.w),d1 move.b GOURPALRL(pc,d1.w),-(a2) dbra d0,INTHELIGHTGOURRL bra PASTACGOUR .noplottt: subq #1,a2 dbra d0,INTHELIGHTGOURRL bra PASTACGOUR GOURPALRL: incbin "ab3:includes/shadow.pal" 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 asl.w #4,d2 add.w d2,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)+ 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,d4 move.w YDIFF,d4 move.l #SPECBRIGHTS,a2 move.w (a2,d0.w*2),d2 move.w (a2,d1.w*2),d3 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 clr.w d0 clr.w d1 divs.l d4,d1 sub.w d2,d3 swap d2 swap d3 clr.w d2 clr.w d3 divs.l d4,d3 subq #1,d4 .STICKINGOUR: swap d0 move.w d0,4(a3) swap d0 add.l d1,d0 swap d2 move.w d2,8(a3) adda.w #16,a3 swap d2 add.l d3,d2 dbra d4,.STICKINGOUR .noline: rts *!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ ************************************************ 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: dc.w 768 LEFTRIGHT: ds.l 256 POLYGONDATA: incbin "ab3:vectobj/testcube" **************************** 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: ds.l 65536/4 PALETTEBIT: ; incbin "256palette" ; dc.w $ffff,$fffe incbin "ab3:includes/256pal" 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 fasty: ds.b 320*256 NORMBRIGHTS: ds.w 250 SPECBRIGHTS: dcb.l 100,31 ENDNORM: LEFTUVS: ds.w 8*256 RIGHTUVS: ds.w 8*256 NORMVECTS: ds.w 3*250 ;WORLD: incbin "ab3:includes/world" ;TWEEN: incbin "ab3:includes/tweenbrightfile" TEXTURES: incbin "ab3:includes/newtexturemaps" NEBBIE: incbin "work:temp/nebbieroar" ds.l (192/4)*16 SECTION BGDROP,code_c RAWSCRN: ds.l 2560*8