* 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 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 bra .ROTABOUT .SHIFTABOUT add.w d0,XOFF add.w d1,ZOFF .ROTABOUT move.l #SOLIDMAP,a0 move.w #(40*8)-1,d0 move.l #0,d1 CLRSOLID move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ dbra d0,CLRSOLID ******************************************* * Calculate the shadows.... ******************************************* move.w XANG,d1 move.w YANG,d3 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.l #POLYGONDATA,a0 move.w (a0)+,d7 ; number of polys SHADOWLOOP: move.w d7,-(a7) addq #2,a0 move.l #ROTATEDPTS,a2 move.l #UVCOORDS,a3 moveq #3,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 add.w ZOFF,d2 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.l d2,(a2)+ addq #4,a2 move.l (a0)+,(a3)+ dbra d7,.ROTPTLOP move.l #SOLIDMAP,a1 move.l #ROTATEDPTS,a2 move.l #0,d7 .ACROSS: move.w #0,d6 move.l (0*16)(a2),d0 move.l (1*16)(a2),d3 sub.l d0,d3 move.l 4+(0*16)(a2),d1 move.l 4+(1*16)(a2),d4 sub.l d1,d4 move.l 8+(0*16)(a2),d2 move.l 8+(1*16)(a2),d5 sub.l d2,d5 muls.l d7,d3 muls.l d7,d4 muls.l d7,d5 asr.l #4,d3 asr.l #4,d4 asr.l #4,d5 add.l d3,d0 ;tx add.l d4,d1 ;ty add.l d5,d2 ;tz move.l 3*16(a2),d3 move.l 2*16(a2),d6 sub.l d3,d6 muls.l d7,d6 asr.l #4,d6 add.l d6,d3 move.l 4+(3*16)(a2),d4 move.l 4+(2*16)(a2),d6 sub.l d4,d6 muls.l d7,d6 asr.l #4,d6 add.l d6,d4 move.l 8+(3*16)(a2),d5 move.l 8+(2*16)(a2),d6 sub.l d5,d6 muls.l d7,d6 asr.l #4,d6 add.l d6,d5 asr.l #8,d0 asr.l #8,d1 asr.l #8,d3 asr.l #8,d4 asr.l #1,d0 asr.l #1,d1 asr.l #1,d3 asr.l #1,d4 sub.l d0,d3 sub.l d1,d4 sub.l d2,d5 sub.w #512,d2 swap d3 clr.w d3 swap d4 clr.w d4 swap d2 clr.w d2 swap d0 clr.w d0 swap d1 clr.w d1 swap d5 clr.w d5 asr.l #8,d5 asr.l #4,d2 asr.l #8,d3 asr.l #4,d0 asr.l #8,d4 asr.l #4,d1 move.l d3,XADD move.l d4,YADD move.l d5,ZADD add.l #20*65536,d0 ; add.l lmxoff,d0 add.l #20*65536,d1 add.l #20*65536,d2 move.w #0,d6 .DOWN: add.l XADD,d0 add.l YADD,d1 add.l ZADD,d2 move.l d0,d3 ; cmp.l #40*65536,d3 ; blt.s .oksm ; sub.l #40*65536,d3 ;.oksm: move.l d1,d4 move.l d2,d5 swap d3 swap d4 swap d5 ; muls #40,d5 ; add.w d5,d4 muls #40,d5 ext.l d3 add.l d5,d3 asl.w #3,d3 move.w d4,d5 asr.w #3,d5 add.w d5,d3 not.b d4 bset.b d4,(a1,d3.w) addq #1,d6 cmp.w #16,d6 ble .DOWN addq #1,d7 cmp.w #16,d7 ble .ACROSS move.w (a7)+,d7 dbra d7,SHADOWLOOP move.l #SOLIDMAP,a1 ; move.l #$80000000,(40*20+20)*8(a1) move.l #WORLD,a0 move.l #SOLIDMAP,a1 move.w #39,d0 .ZLOOP move.w #39,d1 move.l a0,a3 .XLOOP move.l a3,a2 move.l (a1)+,d2 move.w #31,d3 move.w #0,d4 move.w #0,d5 .shadown1 move.b d4,(a2) add.l d2,d2 bcc.s .noshad1 move.w #127,d5 bra.s .shad1 .noshad1: move.w d5,d4 .shad1: add.w #40,a2 dbra d3,.shadown1 move.l (a1)+,d2 move.w #7,d3 .shadown2 move.b d4,(a2) add.l d2,d2 bcc.s .noshad2 move.w #127,d5 bra.s .shad2 .noshad2: move.w d5,d4 .shad2 add.w #40,a2 dbra d3,.shadown2 add.w #1,a3 dbra d1,.XLOOP add.w #1600,a0 dbra d0,.ZLOOP move.l #POLYGONDATA,a0 move.w (a0)+,d7 ; number of polys POLYGONLOOP: move.l d7,-(a7) move.w (a0)+,TEXTUREADD move.l #ROTATEDPTS,a2 move.l #UVCOORDS,a3 moveq #3,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 add.w ZOFF,d2 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.l d2,(a2)+ addq #4,a2 move.l (a0)+,(a3)+ dbra d7,ROTPTLOP move.l a0,-(a7) moveq #3,d7 move.l #ROTATEDPTS,a0 move.l #ONSCREENPTS,a1 move.l FASTBUFFER,a2 CONVTOSCREEN: move.l (a0)+,d0 move.l (a0)+,d1 move.l (a0)+,d2 addq #4,a0 divs d2,d0 divs d2,d1 add.w #160*4,d0 add.w #128*4,d1 move.w d0,(a1)+ move.w d1,(a1)+ ; ext.l d0 ; ext.l d1 ; asr.l #2,d0 ; and.b #%11111100,d1 ; asl.l #4,d1 ; move.l d1,d2 ; asl.l #2,d1 ; add.l d2,d1 ; add.l d1,d0 ; ; move.b #255,(a2,d0.l) dbra d7,CONVTOSCREEN move.l #ONSCREENPTS,a1 move.w (a1),d0 ;x1 sub.w 4(a1),d0 move.w 8(a1),d2 sub.w 4(a1),d2 move.w 2(a1),d1 ;x1 sub.w 6(a1),d1 move.w 10(a1),d3 sub.w 6(a1),d3 muls d2,d1 muls d0,d3 sub.l d3,d1 ble NOPOLYGON ***************************** * Calculate the light map move.l #LIGHTMAP,a0 move.l #WORLD,a1 move.l #ROTATEDPTS,a2 move.l #0,d7 ACROSS: move.w #0,d6 move.l (0*16)(a2),d0 move.l (1*16)(a2),d3 sub.l d0,d3 move.l 4+(0*16)(a2),d1 move.l 4+(1*16)(a2),d4 sub.l d1,d4 move.l 8+(0*16)(a2),d2 move.l 8+(1*16)(a2),d5 sub.l d2,d5 muls.l d7,d3 muls.l d7,d4 muls.l d7,d5 asr.l #3,d3 asr.l #3,d4 asr.l #3,d5 add.l d3,d0 ;tx add.l d4,d1 ;ty add.l d5,d2 ;tz move.l 3*16(a2),d3 move.l 2*16(a2),d6 sub.l d3,d6 muls.l d7,d6 asr.l #3,d6 add.l d6,d3 move.l 4+(3*16)(a2),d4 move.l 4+(2*16)(a2),d6 sub.l d4,d6 muls.l d7,d6 asr.l #3,d6 add.l d6,d4 move.l 8+(3*16)(a2),d5 move.l 8+(2*16)(a2),d6 sub.l d5,d6 muls.l d7,d6 asr.l #3,d6 add.l d6,d5 asr.l #8,d0 asr.l #8,d1 asr.l #8,d3 asr.l #8,d4 asr.l #1,d0 asr.l #1,d1 asr.l #1,d3 asr.l #1,d4 sub.l d0,d3 sub.l d1,d4 sub.l d2,d5 sub.w #512,d2 swap d3 clr.w d3 swap d4 clr.w d4 swap d2 clr.w d2 swap d0 clr.w d0 swap d1 clr.w d1 swap d5 clr.w d5 asr.l #7,d5 asr.l #4,d2 asr.l #7,d3 asr.l #4,d0 asr.l #7,d4 asr.l #4,d1 move.l d3,XADD move.l d4,YADD move.l d5,ZADD add.l #20*65536,d0 ; add.l lmxoff,d0 add.l #20*65536,d1 add.l #20*65536,d2 move.w #0,d6 DOWN: add.l XADD,d0 add.l YADD,d1 add.l ZADD,d2 move.l d0,d3 ; cmp.l #40*65536,d3 ; blt.s .oksm ; sub.l #40*65536,d3 ;.oksm: move.l d1,d4 move.l d2,d5 swap d3 swap d4 swap d5 muls #40,d5 add.w d5,d4 muls #40,d4 ext.l d3 add.l d4,d3 move.w d6,d4 move.w d7,d5 asl.w #4,d5 add.w d4,d5 move.l d7,-(a7) lea (a1,d3.l),a5 moveq #0,d3 moveq #0,d4 move.b 0(a5),d3 ;x,y,z bra SIMPLE move.b 1(a5),d4 ;x+1,y,z sub.w d3,d4 bge.s .okp1 neg.w d4 mulu d0,d4 neg.l d4 bra.s .dn1 .okp1 mulu d0,d4 .dn1 swap d4 add.w d4,d3 moveq #0,d4 moveq #0,d5 move.b 0(a5),d4 ;x,y+1,z move.b 1(a5),d5 ;x+1,y+1,z sub.w d4,d5 bge.s .okp2 neg.w d5 mulu d0,d5 neg.l d5 bra.s .dn2 .okp2 mulu d0,d5 .dn2 swap d5 add.w d5,d4 sub.w d3,d4 bge.s .okp5 neg.w d4 mulu d1,d4 neg.l d4 bra.s .dn5 .okp5 mulu d1,d4 .dn5 swap d4 add.w d4,d3 moveq #0,d4 moveq #0,d5 move.b 1600(a5),d4 ;x,y,z move.b 1601(a5),d5 ;x+1,y,z sub.w d4,d5 bge.s .okp3 neg.w d5 mulu d0,d5 neg.l d5 bra.s .dn3 .okp3 mulu d0,d5 .dn3 swap d5 add.w d5,d4 moveq #0,d5 moveq #0,d7 move.b 1600(a5),d5 ;x,y+1,z move.b 1601(a5),d7 ;x+1,y+1,z sub.w d5,d7 bge.s .okp4 neg.w d7 mulu d0,d7 neg.l d7 bra.s .dn4 .okp4 mulu d0,d7 .dn4 swap d7 add.w d7,d5 sub.w d4,d5 bge.s .okp6 neg.w d5 mulu d1,d5 neg.l d5 bra.s .dn6 .okp6 mulu d1,d5 .dn6 swap d5 add.w d5,d4 sub.w d3,d4 bge.s .okp7 neg.w d4 mulu d2,d4 neg.l d4 bra.s .dn7 .okp7 mulu d2,d4 .dn7 swap d4 add.w d4,d3 SIMPLE: move.l (a7)+,d7 move.w d6,d4 move.w d7,d5 asl.w #4,d5 add.w d4,d5 lsr.b #2,d3 move.b d3,(a0,d5.w) addq #1,d6 cmp.w #8,d6 ble DOWN addq #1,d7 cmp.w #8,d7 ble ACROSS move.l #LIGHTMAP,a0 move.l #SMOOTHLIGHTMAP,a1 move.w #7,d0 DOWNSQUARES: swap d0 move.w #7,d0 move.l a0,a2 ACROSSSQUARES: moveq #0,d4 move.b 16(a2),d4 ;bl moveq #0,d2 move.b (a2)+,d2 ;tl moveq #0,d3 move.b (a2),d3 ;tr moveq #0,d5 move.b 16(a2),d5 ;br sub.w d2,d3 sub.w d4,d5 swap d2 swap d3 swap d4 swap d5 asr.l #3,d3 asr.l #3,d5 moveq #7,d7 ACROSSSQUARE move.l d2,d1 move.l d4,d6 sub.l d1,d6 asr.l #3,d6 swap d1 move.b d1,(a1)+ swap d1 add.l d6,d1 swap d1 move.b d1,256-1(a1) swap d1 add.l d6,d1 swap d1 move.b d1,256*2-1(a1) swap d1 add.l d6,d1 swap d1 move.b d1,256*3-1(a1) swap d1 add.l d6,d1 swap d1 move.b d1,256*4-1(a1) swap d1 add.l d6,d1 swap d1 move.b d1,256*5-1(a1) swap d1 add.l d6,d1 swap d1 move.b d1,256*6-1(a1) swap d1 add.l d6,d1 swap d1 move.b d1,256*7-1(a1) add.l d3,d2 add.l d5,d4 dbra d7,ACROSSSQUARE dbra d0,ACROSSSQUARES add.w #16,a0 add.w #(256*8)-64,a1 swap d0 dbra d0,DOWNSQUARES ***************************** move.l #LEFTRIGHT,a0 move.w #15,d0 emptyright: move.l #-1,(a0)+ move.l #-1,(a0)+ move.l #-1,(a0)+ move.l #-1,(a0)+ move.l #-1,(a0)+ move.l #-1,(a0)+ move.l #-1,(a0)+ move.l #-1,(a0)+ move.l #-1,(a0)+ move.l #-1,(a0)+ move.l #-1,(a0)+ move.l #-1,(a0)+ move.l #-1,(a0)+ move.l #-1,(a0)+ move.l #-1,(a0)+ move.l #-1,(a0)+ dbra d0,emptyright move.w #0,d0 move.w #1,d1 bsr CALCLINE move.w #1,d0 move.w #2,d1 bsr CALCLINE move.w #2,d0 move.w #3,d1 bsr CALCLINE move.w #3,d0 move.w #0,d1 bsr CALCLINE move.l #LEFTRIGHT,a0 move.l FASTBUFFER,a1 move.l #LEFTUVS,a3 move.l #TEXTURES,a5 move.w TEXTUREADD,d0 move.l #SMOOTHLIGHTMAP,a6 bge.s .okad add.l #65536,a5 and.w #$7fff,d0 .okad: add.w d0,a5 move.w #255,d7 drawpoly: move.w (a0)+,d0 ;left end*4 move.w (a0)+,d1 ; right end*4 blt nolineh asr.w #2,d0 blt nolineh asr.w #2,d1 sub.w d0,d1 blt nolineh move.l (a3),d2 move.l 4(a3),d3 move.l (RIGHTUVS-LEFTUVS)(a3),d4 move.l 4+(RIGHTUVS-LEFTUVS)(a3),d5 sub.l d2,d4 sub.l d3,d5 addq #1,d1 ext.l d1 divs.l d1,d4 divs.l d1,d5 move.l d4,a4 movem.l d7/a1/a3,-(a7) move.l d5,a3 subq #1,d1 moveq #0,d4 lea (a1,d0.w),a1 ; move.l d2,d5 ; swap d5 ; and.b #%11111000,d5 ; add.w d5,d5 ; move.l d3,d6 ; swap d6 ; asr.w #3,d6 ; add.w d6,d5 ; ; move.w 16(a2,d5.w),d6 ; swap d6 ; move.w (a2,d5.w),d6 ; move.l (a2,d5.w*2),d6 ; move.l 32(a2,d5.w*2),d7 ; sub.w d6,d7 ; swap d6 ; swap d7 ; sub.w d6,d7 DOING: .putline: ; move.l d2,d0 ; swap d0 ; and.b #%11111000,d0 ; add.w d0,d0 ; move.l d3,d4 ; swap d4 ; asr.w #3,d4 ; add.w d4,d0 ; ; cmp.w d0,d5 ; beq.s .noread ; move.w d0,d5 ; move.w 16(a2,d5.w),d6 ;tr,br ; swap d6 ; move.w (a2,d5.w),d6 ;tl,bl ; move.l (a2,d5.w*2),d6 ; move.l 32(a2,d5.w*2),d7 ; sub.w d6,d7 ; swap d6 ; swap d7 ; sub.w d6,d7 .noread: ; move.l d3,d0 ; swap d0 ; asl.l #5,d0 ; and.w #%11100000,d0 ; move.w d0,d7 ; add.w d6,d0 ; move.w (a6,d0.w*2),d4 ; swap d6 ; add.w d6,d7 ; swap d6 ; move.b (a6,d7.w*2),d4 ; ; move.l d2,d0 ; swap d0 ; asl.l #5,d0 ; and.w #%11100000,d0 ; add.w d0,d4 ; move.w (a6,d4.w*2),d4 ; move.w d0,d4 ; muls d7,d0 ; asr.w #3,d0 ; add.w d6,d0 ; top bright ; ; swap d7 ; swap d6 ; muls d7,d4 ; asr.w #3,d4 ; add.w d6,d4 ; bot bright ; swap d7 ; swap d6 ; ; sub.w d0,d4 ;bot-top ; move.w d4,d1 ; ; move.l d3,d4 ; swap d4 ; and.b #%111,d4 ; muls d1,d4 ; asr.w #3,d4 ; add.w d0,d4 ; lsl.w #8,d4 move.l d2,d0 lsr.l #8,d0 swap d3 move.b d3,d0 move.b (a6,d0.w),d4 asl.w #8,d4 swap d3 add.l a3,d3 move.b (a5,d0.w*4),d4 add.l a4,d2 move.b TEXTUREPAL(pc,d4.w),(a1)+ dbra d1,.putline movem.l (a7)+,d7/a1/a3 nolineh add.w #320,a1 add.w #16,a3 dbra d7,drawpoly bra PASTIT TEXTUREPAL: incbin "ab3:includes/newtexturemaps.pal" PASTIT: NOPOLYGON: move.l (a7)+,a0 move.l (a7)+,d7 dbra d7,POLYGONLOOP move.l FASTBUFFER,a0 add.l #40*320,a0 move.l #RAWSCRN+40*40,a1 move.l #(320/8)-1,d0 move.l #175,d1 move.w #0,d2 move.w #0,d3 moveq #0,d4 moveq #0,d5 donebigconv jsr CHUNKYTOPLANAR move.l FASTBUFFER,a0 add.l #40*320,a0 move.w #((320*176)/64)-1,d0 moveq #0,d1 clrchunk: move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ move.l d1,(a0)+ dbra d0,clrchunk 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 XCOS: dc.w 0 YCOS: dc.w 0 XSIN: dc.w 0 YSIN: 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 CALCLINE: moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 move.l #UVCOORDS,a0 move.w (a0,d0.w*4),d2 swap d2 move.w 2(a0,d0.w*4),d3 swap d3 move.w (a0,d1.w*4),d4 swap d4 move.w 2(a0,d1.w*4),d5 swap d5 move.l #ONSCREENPTS,a1 move.w 2(a1,d0.w*4),d6 ; ly move.w 2(a1,d1.w*4),d7 ; ry asr.w #2,d6 move.l #LEFTRIGHT+2,a2 move.l #RIGHTUVS,a3 asr.w #2,d7 cmp.w d6,d7 beq .noline bgt.s .lineonright .lineonleft: move.l #LEFTUVS,a3 subq #2,a2 exg d6,d7 exg d0,d1 exg d2,d4 exg d3,d5 *********** * THROW AWAY ABOVE FOR NOW. *********** .lineonright: sub.w d6,d7 lea (a2,d6.w*4),a2 movem.l d0-d7/a0-a6,-(a7) move.l #SUBSTACK,a0 asl.w #2,d0 asl.w #2,d1 move.l #ROTATEDPTS,a1 move.l a0,a2 move.l 4(a1,d0.w*4),(a2)+ ;ty move.l 8(a1,d0.w*4),(a2)+ ;tz move.l 4(a1,d1.w*4),(a2)+ ;by move.l 8(a1,d1.w*4),(a2)+ ;bz move.l d2,(a2)+ ;tu move.l d3,(a2)+ ;tv move.l d4,(a2)+ ;bu move.l d5,(a2)+ ;bv move.l (a1,d0.w*4),(a2)+ ;tx move.l (a1,d1.w*4),(a2)+ ;bx move.l #0,a5 bsr SUBDIVIDE move.l a5,MAXSUB movem.l (a7)+,d0-d7/a0-a6 move.w (a1,d0.w*4),d2 move.w 2(a1,d0.w*4),d3 move.w (a1,d1.w*4),d4 move.w 2(a1,d1.w*4),d5 sub.w d2,d4 ;dx sub.w d3,d5 ;dy ;d7=ddy subq #1,d7 swap d4 clr.w d4 swap d2 clr.w d2 asl.l #2,d4 ext.l d5 divs.l d5,d4 ;dx/dy .putinleftline swap d2 move.w d2,(a2) addq #4,a2 swap d2 add.l d4,d2 dbra d7,.putinleftline .noline: rts MAXSUB: dc.l 0 SUBDIVIDE: add.l #1,a5 move.l (a0),d0 move.l d0,d4 move.l 4(a0),d1 divs d1,d0 move.l 8(a0),d2 add.l d2,d4 and.b #%11111100,d0 move.l d2,40+8(a0) add.w #128*4,d0 move.l 12(a0),d3 asr.l #1,d4 ; middle y move.l d3,40+12(a0) divs d3,d2 and.b #%11111100,d2 add.w #128*4,d2 move.l d1,12(a3,d0.w*4) move.l d3,12(a3,d2.w*4) add.l d1,d3 asr.l #1,d3 move.l 16(a0),d5 move.l d5,(a3,d0.w*4) move.l 24(a0),d6 move.l d6,24+40(a0) add.l d6,d5 asr.l #1,d5 move.l d5,(a3,d2.w*4) move.l 20(a0),d6 move.l d6,4(a3,d0.w*4) move.l 28(a0),d7 move.l d7,28+40(a0) add.l d7,d6 asr.l #1,d6 move.l d7,4(a3,d2.w*4) move.l 32(a0),d7 move.l d7,8(a3,d0.w*4) move.l 36(a0),d1 move.l d1,36+40(a0) add.l d1,d7 asr.l #1,d7 move.l d1,8(a3,d2.w*4) sub.w d0,d2 sub.w #4,d2 ble.s .nomore move.l d4,40(a0) ;my move.l d4,8(a0) move.l d3,40+4(a0) ;mz move.l d3,12(a0) move.l d5,40+16(a0) move.l d5,16+8(a0) move.l d6,40+20(a0) move.l d6,20+8(a0) move.l d7,40+32(a0) move.l d7,36(a0) add.l #40,a0 bsr SUBDIVIDE sub.l #1,a5 sub.l #40,a0 bsr SUBDIVIDE .nomore rts ********************************************************** UVCOORDS: ds.l 4 ROTATEDPTS: ds.l 4*4 ONSCREENPTS: ds.l 4 ZOFF: dc.w 512 LEFTRIGHT: ds.l 256 POLYGONDATA: dc.w 3 dc.w 3*256+3 dc.w -256,128,128,0,0 dc.w 256,128,128,63,0 dc.w 256,128,-128,63,63 dc.w -256,128,-128,0,63 dc.w 3*256+2 dc.w -256,-128,-128,0,0 dc.w -256,-128,128,63,0 dc.w -256,128,128,63,63 dc.w -256,128,-128,0,63 dc.w 3*256+2 dc.w 256,-128,128,0,0 dc.w 256,-128,-128,63,0 dc.w 256,128,-128,63,63 dc.w 256,128,128,0,63 dc.w 3*256+2 dc.w 128,-256,128,0,0 dc.w 128,-256,-128,63,0 dc.w 256,-128,-128,63,63 dc.w 256,-128,128,0,63 SINETABLE: incbin "ab3:includes/bigsine" SHADOWBUFFER: ds.l 65536/4 YANG: dc.w 0 XANG: dc.w 0 ********************************************************** * 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 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 PALETTEBIT: ; incbin "256palette" ; dc.w $ffff,$fffe incbin "ab3:includes/256pal" include "ab3:source_4000/chunky.s" willy: ds.w 49 PALS: ds.l 2*49 FRAME: dc.w 4 FLIBBLE: dc.w 0 LIGHTMAP: dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,31,0,31,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,31,31,31,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,31,0,31,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,31,0,31,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,31,0,31,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,31,31,31,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 SMOOTHLIGHTMAP: ds.b 256*256 SOLIDMAP: ds.b 40*40*8 FASTBUFFER: dc.l fasty fasty: ds.b 320*256 SUBSTACK: ds.l 10*100 LEFTUVS: ds.l 4*256 RIGHTUVS: ds.l 4*256 WORLD: incbin "ab3:includes/world" TWEEN: incbin "ab3:includes/tweenbrightfile" TEXTURES: incbin "ab3:includes/newtexturemaps" SECTION BGDROP,code_c RAWSCRN: ds.l 2560*8