CHEESEY equ 0 ************************************************* * Stuff to do to get a C2P version: * Change copperlist * Change wall drawing * change floor drawing * change object drawing * change polygon drawing (ugh) * Write a palette generator program in AMOS * to provide a good 256 colour palette and * convert all graphics files specified * (possibly included in the game linker * program). * Possibly change the wall/floor/object * palettes to look nicer with more shades. * RE-implement stippling (if not present) * as it will look gorgeous now. ************************************************* ;MIDDLEX set 96 ;RIGHTX set 191 ;BOTTOMY set 160 ;MIDDLEX set 96 ;RIGHTX set 191 ;BOTTOMY set 160 _break macro ; bkpt \1 endm FILTER macro ; move.l d0,-(sp) ; move.l #65000,d0 ;.loop\@ ; bchg #1,$bfe001 ; dbra d0,.loop\@ ; move.l (sp)+,d0 endm BLACK macro move.w #0,$dff180 endm RED macro move.w #$f00,$dff180 endm FLASHER macro ; movem.l d1,-(sp) ; move.w #-1,d1 ; ;loop3\@ ;; move.w #\1,$dff180 ; nop ; nop ; move.w #\2,$dff180 ; nop ; nop ; dbra d1,loop3\@ ; movem.l (sp)+,d1 endm GREEN macro move.w #$0f0,$dff180 endm BLUE macro move.w #$f,$dff180 endm DataCacheOff macro movem.l a0-a6/d0-d7,-(sp) move.l 4.w,a6 moveq #0,d0 move.l #%0000000100000000,d1 jsr _LVOCacheControl(a6) movem.l (sp)+,a0-a6/d0-d7 endm DataCacheOn macro movem.l a0-a6/d0-d7,-(sp) move.l 4.w,a6 moveq #-1,d0 move.l #%0000000100000000,d1 jsr _LVOCacheControl(a6) movem.l (sp)+,a0-a6/d0-d7 endm opt P=68020 include utils:sysinc/hardware/intbits.i CD32VER equ 0 maxscrdiv EQU 8 max3ddiv EQU 5 playerheight EQU 12*1024 playercrouched EQU 8*1024 scrheight EQU 80 ; k/j/m ; 4/8 ; s/x ; b/n midoffset EQU 104*4*40 SECTION Scrn,CODE OpenLib equ -552 CloseLib equ -414 INTREQ equ $09C INTENA equ $09A INTENAR equ $01C DMACON equ $096 SERPER equ $032 SERDATR equ $018 SERDAT equ $030 vhposr equ $006 vhposrl equ $007 bltcon0 equ $40 bltcon1 equ $42 bltcpt equ $48 bltbpt equ $4c bltapt equ $50 spr0ctl equ $142 spr1ctl equ $14a spr2ctl equ $152 spr3ctl equ $15a spr4ctl equ $162 spr5ctl equ $16a spr6ctl equ $172 spr7ctl equ $17a spr0pos equ $140 spr1pos equ $148 spr2pos equ $150 spr3pos equ $158 spr4pos equ $160 spr5pos equ $168 spr6pos equ $170 spr7pos equ $178 bltdpt equ $54 bltafwm equ $44 bltalwm equ $46 bltsize equ $58 bltcmod equ $60 bltbmod equ $62 bltamod equ $64 bltdmod equ $66 diwstart equ $8e ; Screen hardware registers. diwstop equ $90 ddfstart equ $92 ddfstop equ $94 bplcon0 equ $100 bplcon1 equ $102 col0 equ $180 col1 equ $182 col2 equ $184 col3 equ $186 col4 equ $188 col5 equ $18a col6 equ $18c col7 equ $18e col8 equ $190 col9 equ $192 col10 equ $194 col11 equ $196 col12 equ $198 col13 equ $19a dmacon equ $96 dmaconr equ $002 intenar equ $01c intena equ $09a intreq equ $09c intreqr equ $01e intreqrl equ $01f bpl1pth equ $e0 bpl1ptl equ $e2 bpl2pth equ $e4 bpl2ptl equ $e6 bpl3pth equ $e8 bpl3ptl equ $ea bpl4pth equ $ec bpl4ptl equ $ee bpl5pth equ $f0 bpl5ptl equ $f2 bpl6pth equ $f4 bpl6ptl equ $f6 bpl7pth equ $f8 bpl7ptl equ $fa bpl8pth equ $fc bpl8ptl equ $fe spr0pth equ $120 spr0ptl equ $122 spr1pth equ $124 spr1ptl equ $126 spr2pth equ $128 spr2ptl equ $12a spr3pth equ $12c spr3ptl equ $12e spr4pth equ $130 spr4ptl equ $132 spr5pth equ $134 spr5ptl equ $136 spr6pth equ $138 spr6ptl equ $13a spr7pth equ $13c spr7ptl equ $13e adkcon equ $09E ; move.l #length,d0 ; moveq.l #2,d1 ; chipmem ; move.l 4.w,a6 ; jsr allocmem(a6) = -198 ; tst.l d0 ; beq.s ohbugger ; move.l d0,memaddr ; move.l 4.w,a6 ; move.l memaddr,a1 ; move.l #size,d0 ; jsr freemem(a6) =-210 ** This waits for the blitter to finish before allowing program ** execution to continue. include "ab3:source_4000/protsetupdecode" SAVEREGS MACRO movem.l d0-d7/a0-a6,-(a7) ENDM GETREGS MACRO movem.l (a7)+,d0-d7/a0-a6 ENDM WB MACRO \@bf: btst #6,dmaconr(a6) bne.s \@bf ENDM WBa MACRO \@bf: move.w #\2,$dff180 btst #6,$bfe001 bne.s \@bf \@bz: move.w #$f0f,$dff180 btst #6,$bfe001 beq.s \@bz ENDM *Another version for when a6 <> dff000 WBSLOW MACRO \@bf: btst #6,$dff000+dmaconr bne.s \@bf ENDM WT MACRO \@bf: btst #6,(a3) bne.s \@bd rts \@bd: btst #4,(a0) beq.s \@bf ENDM WTNOT MACRO \@bf: btst #6,(a3) bne.s \@bd rts \@bd: btst #4,(a0) bne.s \@bf ENDM ** include "ab3:source_4000/ProtectionProtection" include "macros.i" include "ab3:source_4000/defs.i" wtclickk: btst #6,$bfe001 bne.s wtclickk move.w (a0)+,LEVTOPLAY jsr MakePatch ; FLASHER $0f0,$fff ; PROTFCALC ; PROTGCALC ; PROTHCALC ; PROTICALC ; PROTKCALC ; PROTLCALC ; PROTMCALC move.l #$dff000,a6 ; NB V. IMPORTANT: A6=CUSTOM BASE move.w intenar(a6),_storeint and.w #$c000,_storeint move.w #13,SERPER(a6) ;19200 baud, 8 bits, no parity st GOURSEL move.l 4.w,a6 lea VBLANKInt(pc),a1 moveq #INTB_COPER,d0 jsr _LVOAddIntServer(a6) IFEQ CD32VER move.l 4.w,a6 lea KEYInt(pc),a1 moveq #INTB_PORTS,d0 jsr _LVOAddIntServer(a6) ENDC IFNE CD32VER clr.b PLR1KEYS clr.b PLR1PATH clr.b PLR1MOUSE st PLR1JOY clr.b PLR2KEYS clr.b PLR2PATH clr.b PLR2MOUSE st PLR2JOY ELSE st PLR1KEYS clr.b PLR1PATH clr.b PLR1MOUSE clr.b PLR1JOY st PLR2KEYS clr.b PLR2PATH clr.b PLR2MOUSE clr.b PLR2JOY ENDC PRSDO move.l #2,d1 move.l #10240*2,d0 move.l 4.w,a6 jsr -198(a6) move.l d0,TEXTSCRN move.w d0,TSPTl swap d0 move.w d0,TSPTh move.l #nullspr,d0 move.w d0,txs0l move.w d0,txs1l move.w d0,txs2l move.w d0,txs3l move.w d0,txs4l move.w d0,txs5l move.w d0,txs6l move.w d0,txs7l swap d0 move.w d0,txs0h move.w d0,txs1h move.w d0,txs2h move.w d0,txs3h move.w d0,txs4h move.w d0,txs5h move.w d0,txs6h move.w d0,txs7h move.l #0,d1 move.l #140000,d0 move.l 4.w,a6 jsr -198(a6) move.l d0,LEVELDATA move.l #0,d1 ifeq CHEESEY move.l #320*256,d0 endc ifne CHEESEY move.l #320*160,d0 endc move.l 4.w,a6 jsr -198(a6) move.l d0,FASTBUFFER jsr START rts FASTBUFFER: dc.l 0 _storeint dc.w 0 * Load level into buffers. clr.b doanything clr.b dosounds ; DRAW TEXT SCREEN TWEENTEXT: move.l #LEVELTEXT,a0 move.w PLOPT,d0 muls #82*16,d0 add.l d0,a0 move.w #14,d7 move.w #0,d0 DOWNTEXT: move.l TEXTSCRN,a1 jsr DRAWLINEOFTEXT addq #1,d0 add.w #82,a0 dbra d7,DOWNTEXT rts FONTADDRS: dc.l ENDFONT0,CHARWIDTHS0 dc.l ENDFONT1,CHARWIDTHS1 dc.l ENDFONT2,CHARWIDTHS2 ENDFONT0: incbin "endfont0" CHARWIDTHS0: incbin "charwidths0" ENDFONT1: ; incbin "endfont1" CHARWIDTHS1: ; incbin "charwidths1" ENDFONT2: ; incbin "endfont2" CHARWIDTHS2: ; incbin "charwidths2" even DRAWLINEOFTEXT: movem.l d0/a0/d7,-(a7) muls #80*16,d0 add.l d0,a1 ; screen pointer move.l #FONTADDRS,a3 moveq #0,d0 move.b (a0)+,d0 move.l (a3,d0.w*8),a2 move.l 4(a3,d0.w*8),a3 moveq #0,d1 ; width counter: move.w #79,d6 tst.b (a0)+ beq.s NOTCENTRED moveq #-1,d5 move.l a0,a4 moveq #0,d2 moveq #0,d3 move.w #79,d0 ; number of chars .addup: addq #1,d5 move.b (a4)+,d2 move.b -32(a3,d2.w),d4 add.w d4,d3 cmp.b #32,d2 beq.s .DONTPUTIN move.w d5,d6 move.w d3,d1 .DONTPUTIN: dbra d0,.addup asr.w #1,d1 neg.w d1 add.w #320,d1 ; horiz pos of start x NOTCENTRED: move.w d6,d7 DOACHAR: moveq #0,d2 move.b (a0)+,d2 sub.w #32,d2 moveq #0,d6 move.b (a3,d2.w),d6 asl.w #5,d2 lea (a2,d2.w),a4 ; char font val SET 0 REPT 16 move.w (a4)+,d0 bfins d0,val(a1){d1:d6} val SET val+80 ENDR add.w d6,d1 dbra d7,DOACHAR movem.l (a7)+,d0/a0/d7 rts CLRTWEENSCRN: move.l TEXTSCRN,a0 move.w #(10240/16)-1,d0 move.l #$0,d1 .lll 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,.lll rts LEVTOPLAY: dc.w 0 COPYLINK: dc.l 0 PLAYTHEGAME: move.w #0,TXTCOLL bsr CLRTWEENSCRN cmp.b #'n',mors bne.s .notext bsr TWEENTEXT .notext ;charlie move.l #TEXTCOP,$dff080 move.w #$10,d0 move.w #7,d1 .fdup move.w d0,TXTCOLL add.w #$121,d0 .wtframe: btst #5,$dff000+intreqrl beq.s .wtframe move.w #$0020,$dff000+intreq dbra d1,.fdup jsr INITCOPPERSCRN move.l #$dff000,a6 jsr SETPLAYERS move.l #0,TYPEOFMEM move.l #LLname,a0 jsr LOADAFILE move.l d0,LINKS move.l #0,TYPEOFMEM move.l #LLFname,a0 jsr LOADAFILE move.l d0,FLYLINKS ; Get level memory. move.l #1,d1 move.l #40000,d0 move.l 4.w,a6 jsr -198(a6) move.l d0,LEVELGRAPHICS move.l #1,d1 move.l #40000,d0 move.l 4.w,a6 jsr -198(a6) move.l d0,LEVELCLIPS move.l #$dff000,a6 ; move.b LEVTOPLAY,d0 ; move.b d0,LEVA ; move.b d0,LEVB ; move.b d0,LEVC ; move.b d0,LEVD ; move.b d0,LEVE ; move.l #LEVELDATAD,LEVELDATA ; move.l #LEVELGRAPHICSD,LEVELGRAPHICS ; move.l #LEVELCLIPSD,LEVELCLIPS ; bra noload ********************************* ; move.l doslib,a6 ; move.l #LLname,d1 ; move.l #1005,d2 ; jsr -30(a6) ; move.l d0,LLhandle ; ; move.l doslib,a6 ; move.l d0,d1 ; move.l #LINKS,d2 ; move.l #10000,d3 ; jsr -42(a6) ; ; move.l doslib,a6 ; move.l LLhandle,d1 ; jsr -36(a6) ******************************** ; move.l doslib,a6 ; move.l #LLFname,d1 ; move.l #1005,d2 ; jsr -30(a6) ; move.l d0,LLhandle ; move.l doslib,a6 ; move.l d0,d1 ; move.l #FLYLINKS,d2 ; move.l #10000,d3 ; jsr -42(a6) ; move.l doslib,a6 ; move.l LLhandle,d1 ; jsr -36(a6) ************************ ******** move.l doslib,a6 move.l #LDname,d1 move.l #1005,d2 jsr -30(a6) move.l d0,LDhandle move.l doslib,a6 move.l d0,d1 move.l LEVELCLIPS,d2 move.l #40000,d3 jsr -42(a6) move.l doslib,a6 move.l LDhandle,d1 jsr -36(a6) ************************************* move.l LEVELCLIPS,d0 moveq #0,d1 move.l LEVELDATA,a0 lea WorkSpace,a1 lea $0,a2 jsr unLHA ************************************* ******** move.l doslib,a6 move.l #LGname,d1 move.l #1005,d2 jsr -30(a6) move.l d0,LGhandle move.l doslib,a6 move.l d0,d1 move.l LEVELCLIPS,d2 move.l #40000,d3 jsr -42(a6) move.l doslib,a6 move.l LGhandle,d1 jsr -36(a6) ************************************* move.l LEVELCLIPS,d0 moveq #0,d1 move.l LEVELGRAPHICS,a0 lea WorkSpace,a1 lea $0,a2 jsr unLHA ************************************* ******** move.l doslib,a6 move.l #LCname,d1 move.l #1005,d2 jsr -30(a6) move.l d0,LChandle move.l doslib,a6 move.l d0,d1 move.l #WorkSpace+16384,d2 move.l #16000,d3 jsr -42(a6) move.l doslib,a6 move.l LChandle,d1 jsr -36(a6) ************************************* move.l #WorkSpace+16384,d0 moveq #0,d1 move.l LEVELCLIPS,a0 lea WorkSpace,a1 lea $0,a2 jsr unLHA ************************************* ******* noload: ******** ; move.l doslib,a6 ; move.l #Prefsname,d1 ; move.l #1005,d2 ; jsr -30(a6) ; move.l d0,Prefshandle ; move.l doslib,a6 ; move.l d0,d1 ; move.l #Prefsfile,d2 ; move.l #50,d3 ; jsr -42(a6) ; move.l doslib,a6 ; move.l Prefshandle,d1 ; jsr -36(a6) ******* IFNE CD32VER move.l doslib,a6 move.l #115,d1 jsr -198(a6) ENDC ; move.l doslib,d0 ; move.l d0,a1 ; move.l 4.w,a6 ; jsr CloseLib(a6) move.l #$dff000,a6 charlie: ; jmp ENDGAMESCROLL move.w #$87c0,dmacon(a6) move.w #%1000000000100000,dmacon(a6) ; move.w intenar(a6),saveinters move.w #%00101111,intena(a6) move.w #255,adkcon(a6) *** Put myself in supervisor mode bra blag ; move.l $6c,d0 ; move.l #blag,$6c ; move.w #$8010,intreq(a6) rts saveit: ds.l 10 doslibname: dc.b 'dos.library',0 even doslib: dc.l 0 mors: dc.w 0 LDname: dc.b 'ab3:levels/level_' LEVA: dc.b 'a/twolev.bin',0 even LDhandle: dc.l 0 LGname: dc.b 'ab3:levels/level_' LEVB: dc.b 'a/twolev.graph.bin',0 even LGhandle: dc.l 0 LCname: dc.b 'ab3:levels/level_' LEVC: dc.b 'a/twolev.clips',0 even LChandle: dc.l 0 LLname: dc.b 'ab3:levels/level_' LEVD: dc.b 'a/twolev.map',0 even LLFname: dc.b 'ab3:levels/level_' LEVE: dc.b 'a/twolev.flymap',0 even LLhandle: dc.l 0 cnop 0,4 Prefsname: dc.b 'ram:prefs',0 even Prefshandle: dc.l 0 Prefsfile: dc.b 'k4nx' even cnop 0,4 VBLANKInt dc.l 0,0 dc.b NT_INTERRUPT,9 dc.l Prefsname dc.l 0 dc.l Chan0inter KEYInt dc.l 0,0 dc.b NT_INTERRUPT,127 dc.l Prefsname dc.l 0 dc.l key_interrupt blag: ; move.w #$10,intreq(a6) ; move.l d0,$6c ; move.w #$7fff,intena(a6) ; move.w #$20,$dff1dc ; move.l 4.w,a6 ; lea VBLANKInt(pc),a1 ; moveq #INTB_COPER,d0 ; jsr _LVOAddIntServer(a6) **************************** * Initialize level **************************** * Poke all clip offsets into * correct bit of level data. **************************** move.l LEVELGRAPHICS,a0 move.l 12(a0),a1 add.l a0,a1 move.l a1,ZoneGraphAdds move.l (a0),a1 add.l a0,a1 move.l a1,DoorData move.l 4(a0),a1 add.l a0,a1 move.l a1,LiftData move.l 8(a0),a1 add.l a0,a1 move.l a1,SwitchData adda.w #16,a0 move.l a0,ZoneAdds move.l LEVELDATA,a4 lea 160*10(a4),a1 lea 54(a1),a2 move.l a2,CPtPos move.w 12(a1),NumCPts move.w 14(a1),NumLevPts move.l 16+6(a1),a2 add.l a4,a2 move.l a2,Points move.w 8+6(a1),d0 lea 4(a2,d0.w*4),a2 move.l a2,PointBrights move.w 16(a1),d0 addq #1,d0 muls #80,d0 add.l d0,a2 move.l a2,ZoneBorderPts move.l 20+6(a1),a2 add.l a4,a2 move.l a2,FloorLines move.w -2(a2),ENDZONE move.l 24+6(a1),a2 add.l a4,a2 move.l a2,ObjectData ***************************************** * Just for charles ; move.w #$6060,6(a2) ; move.l #$d0000,8(a2) ; sub.w #40,4(a2) ; move.w #45*256+45,14(a2) **************************************** move.l 28+6(a1),a2 add.l a4,a2 move.l a2,PlayerShotData move.l 32+6(a1),a2 add.l a4,a2 move.l a2,NastyShotData add.l #64*20,a2 move.l a2,OtherNastyData move.l 36+6(a1),a2 add.l a4,a2 move.l a2,ObjectPoints move.l 40+6(a1),a2 add.l a4,a2 move.l a2,PLR1_Obj move.l 44+6(a1),a2 add.l a4,a2 move.l a2,PLR2_Obj move.w 14+6(a1),NumObjectPoints ; bra noclips move.l LEVELCLIPS,a2 moveq #0,d0 move.w 10+6(a1),d7 ;numzones move.w d7,NUMZONES assignclips: move.l (a0)+,a3 add.l a4,a3 ; pointer to a zone adda.w #ToListOfGraph,a3 ; pointer to zonelist dowholezone: tst.w (a3) blt.s nomorethiszone tst.w 2(a3) blt.s thisonenull move.l d0,d1 asr.l #1,d1 move.w d1,2(a3) findnextclip: cmp.w #-2,(a2,d0.l) beq.s foundnextclip addq.l #2,d0 bra.s findnextclip foundnextclip addq.l #2,d0 thisonenull: addq #8,a3 bra.s dowholezone nomorethiszone: dbra d7,assignclips lea (a2,d0.l),a2 move.l a2,CONNECT_TABLE noclips: * Put in addresses of glowything ************************************ ; cmp.b #'k',Prefsfile ; bne.s nkb ;nkb: ; cmp.b #'m',Prefsfile ; bne.s nmc ; clr.b PLR1KEYS ; clr.b PLR1PATH ; st PLR1MOUSE ; clr.b PLR1JOY ;nmc: ; cmp.b #'j',Prefsfile ; bne.s njc ; clr.b PLR1KEYS ; clr.b PLR1PATH ; clr.b PLR1MOUSE ; st PLR1JOY ;njc: clr.b PLR1_StoodInTop move.l #playerheight,PLR1s_height move.l #empty,pos1LEFT move.l #empty,pos2LEFT move.l #empty,pos1RIGHT move.l #empty,pos2RIGHT move.l #empty,pos0LEFT move.l #empty,pos3LEFT move.l #empty,pos0RIGHT move.l #empty,pos3RIGHT move.l #emptyend,Samp0endLEFT move.l #emptyend,Samp1endLEFT move.l #emptyend,Samp0endRIGHT move.l #emptyend,Samp1endRIGHT move.l #emptyend,Samp2endLEFT move.l #emptyend,Samp3endLEFT move.l #emptyend,Samp2endRIGHT move.l #emptyend,Samp3endRIGHT move.l #nullline,d0 move.w d0,n1l swap d0 move.w d0,n1h move.l Panel,d0 move.w d0,p1l swap d0 move.w d0,p1h swap d0 add.l #40,d0 move.w d0,p2l swap d0 move.w d0,p2h swap d0 add.l #40,d0 move.w d0,p3l swap d0 move.w d0,p3h swap d0 add.l #40,d0 move.w d0,p4l swap d0 move.w d0,p4h swap d0 add.l #40,d0 move.w d0,p5l swap d0 move.w d0,p5h swap d0 add.l #40,d0 move.w d0,p6l swap d0 move.w d0,p6h swap d0 add.l #40,d0 move.w d0,p7l swap d0 move.w d0,p7h swap d0 add.l #40,d0 move.w d0,p8l swap d0 move.w d0,p8h ******************************* * TIMER SCREEN SETUP ; move.l #TimerScr,d0 ; move.w d0,p1l ; swap d0 ; move.w d0,p1h ; move.w #$1201,Panelcon ; move.l #borders,d0 ; move.w d0,s0l ; swap d0 ; move.w d0,s0h ; move.l #borders+2592,d0 ; move.w d0,s1l ; swap d0 ; move.w d0,s1h ; move.l #borders+2592*2,d0 ; move.w d0,s2l ; swap d0 ; move.w d0,s2h ; move.l #borders+2592*3,d0 ; move.w d0,s3l ; swap d0 ; move.w d0,s3h move.l #nullspr,d0 move.w d0,s0l move.w d0,s1l move.w d0,s2l move.w d0,s3l move.w d0,s4l move.w d0,s5l move.w d0,s6l move.w d0,s7l swap d0 move.w d0,s0h move.w d0,s1h move.w d0,s2h move.w d0,s3h move.w d0,s4h move.w d0,s5h move.w d0,s6h move.w d0,s7h ; move.w #52*256+64,borders ; move.w #212*256+0,borders+8 ; move.w #52*256+64,borders+2592 ; move.w #212*256+128,borders+8+2592 ; move.w #52*256+192,borders+2592*2 ; move.w #212*256+0,borders+8+2592*2 ; move.w #52*256+192,borders+2592*3 ; move.w #212*256+128,borders+8+2592*3 move.l #FacePlace,d0 move.w d0,f1l swap d0 move.w d0,f1h move.l #FacePlace+32*24,d0 move.w d0,f2l swap d0 move.w d0,f2h move.l #FacePlace+32*24*2,d0 move.w d0,f3l swap d0 move.w d0,f3h move.l #FacePlace+32*24*3,d0 move.w d0,f4l swap d0 move.w d0,f4h move.l #FacePlace+32*24*4,d0 move.w d0,f5l swap d0 move.w d0,f5h move.l #bigfield,d0 move.w d0,ocl swap d0 move.w d0,och bset.b #1,$bfe001 ; jmp stuff ;endstuff: move.w #$00ff,$dff09e ; move.l #Blurbfield,$dff080 move.w #0,d0 move.l scrn,d0 move.w d0,pl1l swap d0 move.w d0,pl1h swap d0 add.l #10240,d0 move.w d0,pl2l swap d0 move.w d0,pl2h swap d0 add.l #10240,d0 move.w d0,pl3l swap d0 move.w d0,pl3h swap d0 add.l #10240,d0 move.w d0,pl4l swap d0 move.w d0,pl4h swap d0 add.l #10240,d0 move.w d0,pl5l swap d0 move.w d0,pl5h swap d0 add.l #10240,d0 move.w d0,pl6l swap d0 move.w d0,pl6h swap d0 add.l #10240,d0 move.w d0,pl7l swap d0 move.w d0,pl7h swap d0 add.l #10240,d0 move.w d0,pl8l swap d0 move.w d0,pl8h **************************** jsr INITPLAYER ; bsr initobjpos **************************** move.l #$dff000,a6 move.l #null,$dff0a0 move.w #100,$dff0a4 move.w #443,$dff0a6 move.w #63,$dff0a8 move.l #null2,$dff0b0 move.w #100,$dff0b4 move.w #443,$dff0b6 move.w #63,$dff0b8 move.l #null4,$dff0c0 move.w #100,$dff0c4 move.w #443,$dff0c6 move.w #63,$dff0c8 move.l #null3,$dff0d0 move.w #100,$dff0d4 move.w #443,$dff0d6 move.w #63,$dff0d8 ifeq CHEESEY move.l #tab,a1 move.w #64,d7 move.w #0,d6 outerlop move.l #pretab,a0 move.w #255,d5 scaledownlop: move.b (a0)+,d0 ext.w d0 ext.l d0 muls d6,d0 asr.l #6,d0 move.b d0,(a1)+ dbra d5,scaledownlop addq #1,d6 dbra d7,outerlop endc move.l #$dff000,a6 move.w #$c018,intena(a6) move.w #$f,dmacon(a6) move.w #$820f,dmacon(a6) ; bsr protinit ; move.w #$20,$1dc(a6) move.w #$0,$dff034 move.w #0,Conditions cmp.b #'n',mors beq.s .nokeys move.w #%111111111111,Conditions .nokeys: move.l #KeyMap,a5 clr.b $45(a5) move.l #ingame,mt_data clr.b UseAllChannels ; cmp.b #'b',Prefsfile+3 ; bne.s .noback ; jsr mt_init ;.noback: ; ; clr.b CHANNELDATA ; clr.b CHANNELDATA+8 ; clr.b CHANNELDATA+16 ; clr.b CHANNELDATA+24 ; ; cmp.b #'b',Prefsfile+3 ; bne.s noreserve ; ; st CHANNELDATA ; st CHANNELDATA+8 ; st CHANNELDATA+16 ; st CHANNELDATA+24 ;noreserve: ; st CHANNELDATA ; st CHANNELDATA+8 move.l SampleList+6*8,pos0LEFT move.l SampleList+6*8+4,Samp0endLEFT move.l #playerheight,PLR1s_targheight move.l #playerheight,PLR1s_height move.l #playerheight,PLR2s_targheight move.l #playerheight,PLR2s_height ; cmp.b #'n',mors ; beq.s nohandshake ; ; move.b #%11011000,$bfd200 ; move.b #%00010000,$bfd000 ;waitloop: ; btst.b #4,$bfd000 ; bne.s waitloop ; move.b #%11000000,$bfd200 ;wtmouse: ; btst #6,$bfe001 ; bne.s wtmouse ;nohandshake: ; jmp end ; move.l COPSCRN1,drawpt ; move.l COPSCRN2,olddrawpt jsr CLEARKEYBOARD ; jsr MAKEBACKROUT clr.b MASTERQUITTING cmp.b #'n',mors seq SLAVEQUITTING ; move.w #200,PLAYERTWOHEALTH ; move.w #200,PLAYERONEHEALTH ; move.l #ANOTHERSUP,$80 ; trap #0 ; rts ; ;ANOTHERSUP: move.l $4.w,a6 jsr _LVOSuperState(a6) move.l d0,SSTACK CACHE_FREEZE_OFF d2 ; charlie ; DATA_CACHE_ON d2 DataCacheOn move.l $4.w,a6 move.l SSTACK,d0 jsr _LVOUserState(a6) move.l #0,hitcol cmp.b #'n',mors bne.s NOCLTXT move.b #0,lastpressed .wtpress btst #6,$bfe001 beq.s CLOSETXT btst #7,$bfe001 beq.s CLOSETXT tst.b lastpressed beq.s .wtpress CLOSETXT: move.w #$8f8,d0 move.w #7,d1 .fdup move.w d0,TXTCOLL sub.w #$121,d0 .wtframe: btst #5,$dff000+intreqrl beq.s .wtframe move.w #$0020,$dff000+intreq dbra d1,.fdup move.w #0,TXTCOLL NOCLTXT: move.l 4.w,a6 jsr _LVOForbid(a6) ; jsr _LVODisable(a6) ; move.w #%0111111111111111,intena+$dff000 ; move.w #%1000000011111111,intena+$dff000 ;charlie move.l #PALETTEBIT,$dff084 move.l #bigfield,$dff080 ; Point the copper at our copperlist. clr.b PLR1_Ducked clr.b PLR2_Ducked clr.b p1_ducked clr.b p2_ducked ******************************************** ; jmp docredits ******************************************** st doanything st dosounds jsr CLRNASTYMEM move.l #COMPACTMAP,a0 move.l a0,LASTZONE move.w #255,d0 .clrmap move.l #0,(a0)+ dbra d0,.clrmap move.l #COMPACTMAP,a0 move.l #BIGMAP,a1 bra NOALLWALLS move.l ZoneGraphAdds,a2 DOALLWALLS: move.l (a2),d0 beq.s nomorezones move.l d0,a3 addq #8,a2 add.l LEVELGRAPHICS,a3 addq #2,a3 move.l a1,a4 ; DOLOWERROOM innerwalls: move.b (a3),d1 move.b 1(a3),d0 bne doneinner tst.b d1 blt noid move.b d1,d3 and.w #15,d1 moveq #0,d0 move.w d1,d2 add.w d1,d1 add.w d2,d1 addq #1,d1 bset d1,d0 btst #4,d3 beq.s .nodoor addq #1,d1 bset d1,d0 .nodoor or.l d0,(a0) move.w 2(a3),(a4) move.w 4(a3),2(a4) noid: add.w #30,a3 addq #4,a4 bra innerwalls doneinner: add.w #40,a1 addq #4,a0 bra DOALLWALLS nomorezones: NOALLWALLS move.w #96,MIDDLEX move.w #192,RIGHTX move.w #160,BOTTOMY move.w #80,TOTHEMIDDLE clr.b FULLSCR move.l scrn,a0 jsr WIPEDISPLAY move.l scrn2,a0 jsr WIPEDISPLAY st PLAYERONEGUNS+1 st PLAYERTWOGUNS+1 move.w #100,timetodamage move.w #299,d0 move.l #DAMAGED,a0 CLRDAM: move.w #0,(a0)+ dbra d0,CLRDAM moveq #0,d0 move.w d0,STOPOFFSET neg.w d0 add.w TOTHEMIDDLE,d0 move.w d0,SMIDDLEY muls #320,d0 move.l d0,SBIGMIDDLEY move.w #0,PLR1_AIMSPD move.w #0,PLR2_AIMSPD move.l scrn,SCRNSHOWPT move.l scrn2,SCRNDRAWPT move.w #%110000000000,$dff034 lop: move.b MAPON,REALMAPON move.b FULLSCRTEMP,d0 move.b FULLSCR,d1 eor.b d1,d0 beq.s .notswapscr2 move.b FULLSCRTEMP,FULLSCR beq.s .notswapscr3 move.w #144,MIDDLEX move.w #288,RIGHTX move.w #232,BOTTOMY move.w #120,TOTHEMIDDLE move.l SCRNSHOWPT,a0 jsr WIPEDISPLAY move.l SCRNDRAWPT,a0 jsr WIPEDISPLAY bra.s .notswapscr2 .notswapscr3: move.w #96,MIDDLEX move.w #192,RIGHTX move.w #160,BOTTOMY move.w #80,TOTHEMIDDLE move.l SCRNSHOWPT,a0 jsr WIPEDISPLAY move.l SCRNDRAWPT,a0 jsr WIPEDISPLAY .notswapscr2: btst #6,$bfe001 ;charlie bne.b .nocop ;charlie move.l #bigfield,$dff080 ; Point the copper at our copperlist. .nocop move.l #KeyMap,a5 cmp.b #'n',mors bne .nopause tst.b $19(a5) beq.s .nopause clr.b doanything .waitrel: tst.b PLR1JOY beq.s .NOJOY jsr _ReadJoy1 .NOJOY tst.b $19(a5) bne.s .waitrel bsr PAUSEOPTS st doanything .nopause: move.l hitcol,d0 move.l d0,d1 ******************************************** * Remove after colour testing ; moveq #0,d1 ******************************************** add.l #PALETTEBIT,d1 tst.l d0 beq.s nofadedownhc sub.l #2116,d0 move.l d0,hitcol nofadedownhc: move.l d1,a0 move.l #PALETTESPACE,a1 move.l #(2116/4)-2,d0 putinpal: move.l (a0)+,(a1)+ dbra d0,putinpal st READCONTROLS move.l #$dff000,a6 cmp.b #'n',mors beq .nopause move.b SLAVEPAUSE,d0 or.b MASTERPAUSE,d0 beq.s .nopause clr.b doanything move.l #KeyMap,a5 .waitrel: cmp.b #'s',mors beq.s .RE2 tst.b PLR1JOY beq.s .NOJOY jsr _ReadJoy1 bra .RE1 .RE2: tst.b PLR2JOY beq.s .NOJOY jsr _ReadJoy2 .RE1 .NOJOY: tst.b $19(a5) bne.s .waitrel bsr PAUSEOPTS cmp.b #'m',mors bne.s .slavelast Jsr SENDFIRST bra .masfirst .slavelast Jsr RECFIRST .masfirst: clr.b SLAVEPAUSE clr.b MASTERPAUSE st doanything .nopause: move.l drawpt,d0 move.l olddrawpt,drawpt move.l d0,olddrawpt move.l SCRNDRAWPT,d0 move.l SCRNSHOWPT,SCRNDRAWPT move.l d0,SCRNSHOWPT ; move.l d0,$dff084 move.l drawpt,a3 ; move.l COPSCRNBUFF,a3 adda.w #10,a3 move.l a3,frompt add.l #104*4*40,a3 move.l a3,midpt cmp.b #'s',mors beq.s nowaitslave waitfortop: btst.b #0,intreqrl(a6) beq.b waitfortop move.w #$1,intreq(a6) ; move.l #PLR1_GunData,GunData move.b PLR1_GunSelected,GunSelected bra waitmaster nowaitslave: ; move.l #PLR2_GunData,GunData move.b PLR2_GunSelected,GunSelected waitmaster: move.l d0,d1 move.l d1,d0 move.w d0,pl1l swap d0 move.w d0,pl1h add.l #10240,d1 move.l d1,d0 move.w d0,pl2l swap d0 move.w d0,pl2h add.l #10240,d1 move.l d1,d0 move.w d0,pl3l swap d0 move.w d0,pl3h add.l #10240,d1 move.l d1,d0 move.w d0,pl4l swap d0 move.w d0,pl4h add.l #10240,d1 move.l d1,d0 move.w d0,pl5l swap d0 move.w d0,pl5h add.l #10240,d1 move.l d1,d0 move.w d0,pl6l swap d0 move.w d0,pl6h add.l #10240,d1 move.l d1,d0 move.w d0,pl7l swap d0 move.w d0,pl7h add.l #10240,d1 move.l d1,d0 move.w d0,pl8l swap d0 move.w d0,pl8h move.l #SMIDDLEY,a0 movem.l (a0)+,d0/d1 move.l d0,MIDDLEY move.l d1,MIDDLEY+4 move.l waterpt,a0 move.l (a0)+,watertouse cmp.l #endwaterlist,a0 blt.s okwat move.l #waterlist,a0 okwat: move.l a0,waterpt add.w #640,wtan and.w #8191,wtan add.l #1,wateroff and.l #$3fff3fff,wateroff move.l PLR1_xoff,OLDX1 move.l PLR1_zoff,OLDZ1 move.l PLR2_xoff,OLDX2 move.l PLR2_zoff,OLDZ2 move.l #$dff000,a6 cmp.b #'s',mors beq ASlaveShouldWaitOnHisMaster cmp.b #'n',mors bne NotOnePlayer movem.l d0-d7/a0-a6,-(a7) moveq #0,d0 move.b GunSelected,d0 move.l LINKFILE,a6 add.l #GunBulletTypes,a6 move.w (a6,d0.w*8),d0 move.l #PLAYERONEAMMO,a6 move.w (a6,d0.w*2),d0 move.w d0,Ammo movem.l (a7)+,d0-d7/a0-a6 move.w PLAYERONEHEALTH,Energy move.w FramesToDraw,TempFrames cmp.w #15,TempFrames blt.s .okframe move.w #15,TempFrames .okframe: move.w #0,FramesToDraw ********************************************* *********** TAKE THIS OUT ******************* ********************************************* move.l CHEATPTR,a4 add.l #200000,a4 moveq #0,d0 move.b (a4),d0 move.l #KeyMap,a5 tst.b (a5,d0.w) beq.s .nocheat addq #1,a4 cmp.l #ENDCHEAT,a4 blt.s .nocheat cmp.w #0,CHEATNUM beq.s .nocheat sub.w #1,CHEATNUM move.l #CHEATFRAME,a4 move.w #127,PLR1_energy jsr EnergyBar .nocheat sub.l #200000,a4 move.l a4,CHEATPTR ********************************************** ********************************************** ********************************************** move.l PLR1s_xoff,p1_xoff move.l PLR1s_zoff,p1_zoff move.l PLR1s_yoff,p1_yoff move.l PLR1s_height,p1_height move.w PLR1s_angpos,p1_angpos move.w PLR1_bobble,p1_bobble move.b PLR1_clicked,p1_clicked move.b PLR1_fire,p1_fire clr.b PLR1_clicked move.b PLR1_SPCTAP,p1_spctap clr.b PLR1_SPCTAP move.b PLR1_Ducked,p1_ducked move.b PLR1_GunSelected,p1_gunselected bsr PLR1_Control move.l PLR1_Roompt,a0 move.l ToZoneRoof(a0),SplitHeight move.w p1_xoff,THISPLRxoff move.w p1_zoff,THISPLRzoff move.l #$60000,p2_yoff move.l PLR2_Obj,a0 move.w #-1,GraphicRoom(a0) move.w #-1,12(a0) move.b #0,17(a0) move.l #BollocksRoom,PLR2_Roompt bra donetalking NotOnePlayer: move.l #KeyMap,a5 tst.b $19(a5) sne MASTERPAUSE ********************************* move.w PLAYERONEHEALTH,Energy ; change this back ********************************* movem.l d0-d7/a0-a6,-(a7) moveq #0,d0 move.b GunSelected,d0 move.l LINKFILE,a6 add.l #GunBulletTypes,a6 move.w (a6,d0.w*8),d0 move.l #PLAYERONEAMMO,a6 move.w (a6,d0.w*2),d0 move.w d0,Ammo movem.l (a7)+,d0-d7/a0-a6 jsr SENDFIRST move.w FramesToDraw,TempFrames cmp.w #15,TempFrames blt.s .okframe move.w #15,TempFrames .okframe: move.w #0,FramesToDraw move.l PLR1s_xoff,p1_xoff move.l PLR1s_zoff,p1_zoff move.l PLR1s_yoff,p1_yoff move.l PLR1s_height,p1_height move.w PLR1s_angpos,p1_angpos move.w PLR1_bobble,p1_bobble move.b PLR1_clicked,p1_clicked clr.b PLR1_clicked move.b PLR1_fire,p1_fire move.b PLR1_SPCTAP,p1_spctap clr.b PLR1_SPCTAP move.b PLR1_Ducked,p1_ducked move.b PLR1_GunSelected,p1_gunselected move.l PLR1_AIMSPD,d0 jsr SENDFIRST move.l d0,PLR2_AIMSPD move.l p1_xoff,d0 jsr SENDFIRST move.l d0,p2_xoff move.l p1_zoff,d0 jsr SENDFIRST move.l d0,p2_zoff move.l p1_yoff,d0 jsr SENDFIRST move.l d0,p2_yoff move.l p1_height,d0 jsr SENDFIRST move.l d0,p2_height move.w p1_angpos,d0 swap d0 move.w p1_bobble,d0 jsr SENDFIRST move.w d0,p2_bobble swap d0 move.w d0,p2_angpos move.w TempFrames,d0 swap d0 move.b p1_spctap,d0 lsl.w #8,d0 move.b p1_clicked,d0 jsr SENDFIRST move.b d0,p2_clicked lsr.w #8,d0 move.b d0,p2_spctap move.w Rand1,d0 swap d0 move.b p1_ducked,d0 lsl.w #8,d0 move.b p1_gunselected,d0 jsr SENDFIRST move.b d0,p2_gunselected lsr.w #8,d0 move.b d0,p2_ducked move.b p1_fire,d0 lsl.w #8,d0 move.b MASTERQUITTING,d0 or.b d0,SLAVEQUITTING swap d0 move.b MASTERPAUSE,d0 or.b d0,SLAVEPAUSE jsr SENDFIRST or.b d0,MASTERPAUSE or.b d0,SLAVEPAUSE swap d0 or.b d0,SLAVEQUITTING or.b d0,MASTERQUITTING lsr.w #8,d0 move.b d0,p2_fire bsr PLR1_Control bsr PLR2_Control move.l PLR1_Roompt,a0 move.l ToZoneRoof(a0),SplitHeight move.w p1_xoff,THISPLRxoff move.w p1_zoff,THISPLRzoff bra donetalking ASlaveShouldWaitOnHisMaster: move.l #KeyMap,a5 tst.b $19(a5) sne SLAVEPAUSE movem.l d0-d7/a0-a6,-(a7) moveq #0,d0 move.b GunSelected,d0 move.l LINKFILE,a6 add.l #GunBulletTypes,a6 move.w (a6,d0.w*8),d0 move.l #PLAYERTWOAMMO,a6 move.w (a6,d0.w*2),d0 move.w d0,Ammo movem.l (a7)+,d0-d7/a0-a6 move.w PLAYERTWOHEALTH,Energy jsr RECFIRST move.l PLR2s_xoff,p2_xoff move.l PLR2s_zoff,p2_zoff move.l PLR2s_yoff,p2_yoff move.l PLR2s_height,p2_height move.w PLR2s_angpos,p2_angpos move.w PLR2_bobble,p2_bobble move.b PLR2_clicked,p2_clicked clr.b PLR2_clicked move.b PLR2_fire,p2_fire move.b PLR2_SPCTAP,p2_spctap clr.b PLR2_SPCTAP move.b PLR2_Ducked,p2_ducked move.b PLR2_GunSelected,p2_gunselected move.l PLR2_AIMSPD,d0 jsr RECFIRST move.l d0,PLR1_AIMSPD move.l p2_xoff,d0 jsr RECFIRST move.l d0,p1_xoff move.l p2_zoff,d0 jsr RECFIRST move.l d0,p1_zoff move.l p2_yoff,d0 jsr RECFIRST move.l d0,p1_yoff move.l p2_height,d0 jsr RECFIRST move.l d0,p1_height move.w p2_angpos,d0 swap d0 move.w p2_bobble,d0 jsr RECFIRST move.w d0,p1_bobble swap d0 move.w d0,p1_angpos move.b p2_spctap,d0 lsl.w #8,d0 move.b p2_clicked,d0 jsr RECFIRST move.b d0,p1_clicked lsr.w #8,d0 move.b d0,p1_spctap swap d0 move.w d0,TempFrames move.b p2_ducked,d0 lsl.w #8,d0 move.b p2_gunselected,d0 jsr RECFIRST move.b d0,p1_gunselected lsr.w #8,d0 move.b d0,p1_ducked swap d0 move.w d0,Rand1 move.b p2_fire,d0 lsl.w #8,d0 move.b SLAVEQUITTING,d0 or.b d0,MASTERQUITTING swap d0 move.b SLAVEPAUSE,d0 or.b d0,MASTERPAUSE jsr RECFIRST or.b d0,MASTERPAUSE or.b d0,SLAVEPAUSE swap d0 or.b d0,SLAVEQUITTING or.b d0,MASTERQUITTING lsr.w #8,d0 move.b d0,p1_fire bsr PLR1_Control bsr PLR2_Control move.w p2_xoff,THISPLRxoff move.w p2_zoff,THISPLRzoff move.l PLR2_Roompt,a0 move.l ToZoneRoof(a0),SplitHeight donetalking: move.l #ZoneBrightTable,a1 move.l ZoneAdds,a2 move.l PLR2_ListOfGraphRooms,a0 ; move.l PLR2_PointsToRotatePtr,a5 move.l a0,a5 cmp.b #'s',mors beq.s doallz move.l PLR1_ListOfGraphRooms,a0 ; move.l PLR1_PointsToRotatePtr,a5 move.l a0,a5 doallz move.w (a0),d0 blt.s doneallz add.w #8,a0 move.l (a2,d0.w*4),a3 add.l LEVELDATA,a3 move.w ToZoneBrightness(a3),d2 blt.s justbright move.w d2,d3 lsr.w #8,d3 tst.b d3 beq.s justbright move.l #BrightAnimTable,a4 move.w -2(a4,d3.w*2),d2 justbright: muls #32,d2 divs #20,d2 move.w d2,(a1,d0.w*4) move.w ToUpperBrightness(a3),d2 blt.s justbright2 move.w d2,d3 lsr.w #8,d3 tst.b d3 beq.s justbright2 move.l #BrightAnimTable,a4 move.w -2(a4,d3.w*2),d2 justbright2: muls #32,d2 divs #20,d2 move.w d2,2(a1,d0.w*4) bra doallz doneallz: move.l PointBrights,a2 move.l #CurrentPointBrights,a3 justtheone: move.w (a5),d0 blt whythehell addq #8,a5 muls #40,d0 move.w #39,d7 allinzone: move.w (a2,d0.w*2),d2 tst.b d2 blt.s .justbright move.w d2,d3 lsr.w #8,d3 tst.b d3 beq.s .justbright move.w d3,d4 and.w #$f,d3 lsr.w #4,d4 add.w #1,d4 move.l #BrightAnimTable,a0 move.w -2(a0,d3.w*2),d3 ext.w d2 sub.w d2,d3 muls d4,d3 asr.w #4,d3 add.w d3,d2 .justbright: ext.w d2 muls #31,d2 divs #20,d2 bge.s .itspos sub.w #600,d2 .itspos: add.w #300,d2 move.w d2,(a3,d0.w*2) addq #1,d0 dbra d7,allinzone bra justtheone whythehell: move.l PLR1_Roompt,a0 move.l #CurrentPointBrights,a1 move.l ZoneBorderPts,a2 move.w (a0),d0 muls #10,d0 lea (a2,d0.w*2),a2 lea (a1,d0.w*8),a1 moveq #9,d7 moveq #0,d0 moveq #0,d1 findaverage: tst.w (a2)+ blt.s .foundaverage addq #1,d0 move.w (a1)+,d2 bge.s .okpos neg.w d2 .okpos: add.w d2,d1 dbra d7,findaverage .foundaverage: ext.l d1 divs d0,d1 sub.w #300,d1 move.w d1,PLR1_RoomBright cmp.b #'n',mors beq nosee move.l PLR1_Roompt,FromRoom move.l PLR2_Roompt,ToRoom move.w p1_xoff,Viewerx move.w p1_zoff,Viewerz move.l p1_yoff,d0 asr.l #7,d0 move.w d0,Viewery move.w p2_xoff,Targetx move.w p2_zoff,Targetz move.l p2_yoff,d0 asr.l #7,d0 move.w d0,Targety move.b PLR1_StoodInTop,ViewerTop move.b PLR2_StoodInTop,TargetTop jsr CanItBeSeen move.l PLR1_Obj,a0 move.b CanSee,d0 and.b #2,d0 move.b d0,17(a0) move.l PLR2_Obj,a0 move.b CanSee,d0 and.b #1,d0 move.b d0,17(a0) nosee: move.w TempFrames,d0 add.w d0,p1_holddown cmp.w #30,p1_holddown blt.s oklength move.w #30,p1_holddown oklength: tst.b p1_fire bne.s okstillheld sub.w d0,p1_holddown bge.s okstillheld move.w #0,p1_holddown okstillheld: move.w TempFrames,d0 add.w d0,p2_holddown cmp.w #30,p2_holddown blt.s oklength2 move.w #30,p2_holddown oklength2: tst.b p2_fire bne.s okstillheld2 sub.w d0,p2_holddown bge.s okstillheld2 move.w #0,p2_holddown okstillheld2: ***** CHECKING LIGHT ********* ; move.w #-20,d0 ; move.w PLR1_xoff,d1 ; move.w PLR1_zoff,d2 ; move.l PLR1_Roompt,a0 ; move.w (a0),d3 ; move.w PLR1_angpos,d4 ; ; jsr BRIGHTENPOINTSANGLE ****************************** ; move.l #PLR1_GunData,a1 ; move.w p1_holddown,d0 ; move.w #50,10+32*3(a1) ; move.l #PLR2_GunData,a1 ; move.w p2_holddown,d0 ; move.w #50,10+32*3(a1) ****************************************** ****************************************** move.w TempFrames,d1 bgt.s noze moveq #1,d1 noze: move.w PLR1_xoff,d0 sub.w OLDX1,d0 asl.w #4,d0 ext.l d0 divs d1,d0 move.w d0,XDIFF1 move.w PLR2_xoff,d0 sub.w OLDX2,d0 asl.w #4,d0 ext.l d0 divs d1,d0 move.w d0,XDIFF2 move.w PLR1_zoff,d0 sub.w OLDZ1,d0 asl.w #4,d0 ext.l d0 divs d1,d0 move.w d0,ZDIFF1 move.w PLR2_zoff,d0 sub.w OLDZ2,d0 asl.w #4,d0 ext.l d0 divs d1,d0 move.w d0,ZDIFF2 cmp.b #'s',mors beq.s ImPlayer2OhYesIAm bsr USEPLR1 bra IWasPlayer1 ImPlayer2OhYesIAm: bsr USEPLR2 IWasPlayer1: cmp.b #'s',mors beq drawplayer2 move.w #0,scaleval move.l PLR1_xoff,xoff move.l PLR1_yoff,yoff move.l PLR1_zoff,zoff move.w PLR1_angpos,angpos move.w PLR1_cosval,cosval move.w PLR1_sinval,sinval move.l PLR1_ListOfGraphRooms,ListOfGraphRooms move.l PLR1_PointsToRotatePtr,PointsToRotatePtr move.l PLR1_Roompt,Roompt move.l #KeyMap,a5 moveq #0,d5 move.b look_behind_key,d5 tst.b (a5,d5.w) beq.s .nolookback move.l PLR1_Obj,a0 move.w #-1,12+128(a0) eor.w #4096,angpos neg.w cosval neg.w sinval .nolookback: bsr OrderZones jsr objmoveanim jsr EnergyBar jsr AmmoBar ;******************************************** ;************* Do reflection **************** ; ; move.l ListOfGraphRooms,a0 ; move.l ZoneAdds,a1 ;checkwaterheights ; move.w (a0),d0 ; blt allzonesdone ; addq #8,a0 ; move.l (a1,d0.w*4),a2 ; ; add.l LEVELDATA,a2 ; ; move.l ToZoneWater(a2),d0 ; cmp.l ToZoneFloor(a2),d0 ; blt.s WEHAVEAHEIGHT ; ; bra.s checkwaterheights ; ;WEHAVEAHEIGHT: ; ; sub.l yoff,d0 ; blt.s underwater ; ; add.l d0,d0 ; add.l d0,yoff ; ; move.l FASTBUFFER2,FASTBUFFER ; move.w #0,leftclip ; move.w RIGHTX,rightclip ; move.w #0,deftopclip ; move.w #BOTTOMY/2,defbotclip ; move.w #0,topclip ; move.w #BOTTOMY/2,botclip ; ; clr.b DOANYWATER ; ; bsr DrawDisplay ; ;allzonesdone: ;underwater: ******************************************** st DOANYWATER move.l PLR1_yoff,yoff move.w #0,leftclip move.w RIGHTX,rightclip move.w #0,deftopclip move.w WIDESCRN,d0 add.w d0,deftopclip move.w BOTTOMY,defbotclip sub.w d0,defbotclip move.w #0,topclip add.w d0,topclip move.w BOTTOMY,botclip sub.w d0,botclip ; sub.l #10*104*4,frompt ; sub.l #10*104*4,midpt * Subroom loop bsr DrawDisplay bra nodrawp2 drawplayer2 move.w #0,scaleval move.l PLR2_xoff,xoff move.l PLR2_yoff,yoff move.l PLR2_zoff,zoff move.w PLR2_angpos,angpos move.w PLR2_cosval,cosval move.w PLR2_sinval,sinval move.l PLR2_ListOfGraphRooms,ListOfGraphRooms move.l PLR2_PointsToRotatePtr,PointsToRotatePtr move.l PLR2_Roompt,Roompt move.l #KeyMap,a5 moveq #0,d5 move.b look_behind_key,d5 tst.b (a5,d5.w) beq.s .nolookback move.l PLR1_Obj,a0 move.w #-1,12+128(a0) eor.w #4096,angpos neg.w cosval neg.w sinval .nolookback: bsr OrderZones jsr objmoveanim jsr EnergyBar jsr AmmoBar move.w WIDESCRN,d0 move.w #0,leftclip move.w RIGHTX,rightclip move.w #0,deftopclip add.w d0,deftopclip move.w BOTTOMY,defbotclip sub.w d0,defbotclip move.w #0,topclip add.w d0,topclip move.w BOTTOMY,botclip sub.w d0,botclip bsr DrawDisplay nodrawp2: ***************************************** * Copy from copbuff to chip ram ; move.l drawpt,a3 ; adda.w #10,a3 ; move.l COPSCRNBUFF,a2 ; move.w #2,d6 ; adda.w #10,a2 ;COPYOUT ; move.w #31,d0 ;COPYDOWN1: ; move.w #3,d1 ; move.l a2,a4 ; move.l a3,a5 ;.inlop1: ;val SET 0 ; REPT 20 ; move.w val(a4),val(a5) ;val SET val+104*4 ; ENDR ; adda.l #104*4*20,a4 ; adda.l #104*4*20,a5 ; dbra d1,.inlop1 ; addq #4,a2 ; addq #4,a3 ; dbra d0,COPYDOWN1 ; addq #4,a2 ; addq #4,a3 ; dbra d6,COPYOUT tst.b REALMAPON beq.s .nomap bsr DoTheMapWotNastyCharlesIsForcingMeToDo .nomap move.w WIDESCRN,d7 tst.b FULLSCR beq nobigconv move.l FASTBUFFER,a0 ; add.l #320*2*20,a0 move.w d7,d6 muls #320,d6 add.l d6,a0 move.l SCRNDRAWPT,a1 move.w d7,d6 muls #40,d6 add.l d6,a1 add.l #2,a1 move.l #(288/8)-1,d0 move.l #231,d1 sub.w d7,d1 sub.w d7,d1 blt nochunk move.w #(320-288),d2 move.w #4,d3 bra donebigconv nobigconv: move.l FASTBUFFER,a0 move.w d7,d6 muls #320,d6 add.l d6,a0 move.l SCRNDRAWPT,a1 add.l #8+40*20,a1 move.w d7,d6 muls #40,d6 add.l d6,a1 move.l #(192/8)-1,d0 move.l #159,d1 sub.w d7,d1 sub.w d7,d1 blt nochunk move.w #(320-192),d2 move.w #16,d3 donebigconv tst.b DOUBLEHEIGHT beq.s .nodoub asr.w #1,d1 blt nochunk add.w #320,d2 add.w #40,d3 .nodoub: move.b DOUBLEWIDTH,d4 move.b PLR1_TELEPORTED,d5 clr.b PLR1_TELEPORTED cmp.b #'s',mors bne.s .notplr2 move.b PLR2_TELEPORTED,d5 clr.b PLR2_TELEPORTED .notplr2 jsr CHUNKYTOPLANAR nochunk: move.l #KeyMap,a5 tst.b $4a(a5) beq .nosmallscr move.l #0,d7 move.l #0,d6 tst.b FULLSCR bne.s .attop move.l #40*20,d7 move.l #40*52,d6 .attop: move.w WIDESCRN,d0 move.l SCRNDRAWPT,a0 add.l d7,a0 muls #40,d0 add.l d0,a0 bsr CLRTWOLINES move.w WIDESCRN,d0 move.l SCRNSHOWPT,a0 add.l d7,a0 muls #40,d0 add.l d0,a0 bsr CLRTWOLINES add.w #2,WIDESCRN move.l SCRNDRAWPT,a0 add.l #232*40,a0 sub.l d6,a0 move.w WIDESCRN,d0 muls #40,d0 sub.l d0,a0 bsr CLRTWOLINES move.l SCRNSHOWPT,a0 sub.l d6,a0 add.l #232*40,a0 move.w WIDESCRN,d0 muls #40,d0 sub.l d0,a0 bsr CLRTWOLINES .nosmallscr tst.b $5e(a5) beq.s .nobigscr tst.w WIDESCRN ble.s .nobigscr sub.w #2,WIDESCRN .nobigscr tst.b (a5) beq.s .nosavescrn not.b USEDOUG jsr SAVETHESCREEN .nosavescrn: tst.b $5b(a5) beq notdoubheight tst.b LASTDH bne notdoubheight2 move.l SCRNSHOWPT,a0 jsr WIPEDISPLAY move.l SCRNDRAWPT,a0 jsr WIPEDISPLAY st LASTDH move.w #0,d0 move.w #0,d1 not.b DOUBLEHEIGHT beq.s singlepixheight move.w #-40,d0 move.w #40,d1 singlepixheight: move.l #SCRMODULOS,a0 move.w #115,d2 putinmode: move.w d0,6(a0) move.w d0,6+4(a0) move.w d1,6+16(a0) move.w d1,6+16+4(a0) add.w #32,a0 dbra d2,putinmode bra notdoubheight2 notdoubheight: clr.b LASTDH notdoubheight2 tst.b $5a(a5) beq.s notdoubwidth tst.b LASTDW bne notdoubwidth2 move.l SCRNSHOWPT,a0 jsr WIPEDISPLAY move.l SCRNDRAWPT,a0 jsr WIPEDISPLAY st LASTDW not.b DOUBLEWIDTH bra.s notdoubwidth2 notdoubwidth: clr.b LASTDW notdoubwidth2: ***************************************** move.l PLR2_Roompt,a0 move.l #WorkSpace,a1 clr.l (a1) clr.l 4(a1) clr.l 8(a1) clr.l 12(a1) clr.l 16(a1) clr.l 20(a1) clr.l 24(a1) clr.l 28(a1) cmp.b #'n',mors beq.s plr1only lea ToListOfGraph(a0),a0 .doallrooms: move.w (a0),d0 blt.s .allroomsdone addq #8,a0 move.w d0,d1 asr.w #3,d0 bset d1,(a1,d0.w) bra .doallrooms .allroomsdone: plr1only: move.l PLR1_Roompt,a0 lea ToListOfGraph(a0),a0 .doallrooms2: move.w (a0),d0 blt.s .allroomsdone2 addq #8,a0 move.w d0,d1 asr.w #3,d0 bset d1,(a1,d0.w) bra .doallrooms2 .allroomsdone2: move.l #%000001,d7 lea TEAMWORK,a2 move.l ObjectData,a0 sub.w #64,a0 .doallobs: add.w #64,a0 move.w (a0),d0 blt.s .allobsdone move.w 12(a0),d0 blt.s .doallobs move.w d0,d1 asr.w #3,d0 btst d1,(a1,d0.w) bne.s .worryobj move.b 16(a0),d0 btst d0,d7 beq.s .doallobs moveq #0,d0 move.b teamnumber(a0),d0 blt.s .doallobs asl.w #4,d0 tst.w SEENBY(a2,d0.w) blt.s .doallobs .worryobj: or.b #127,worry(a0) bra.s .doallobs .allobsdone: ; move.l #brightentab,a0 ; move.l frompt,a3 ; adda.w #(4*33)+(104*4*20),a3 ; move.w #20,d7 ; move.w #20,d6 ;horl: ; move.w d6,d5 ; move.l a3,a1 ;vertl ; move.w (a1),d0 ; move.w (a0,d0.w*2),(a1) ; addq #4,a1 ; dbra d5,vertl ; adda.w #104*4,a3 ; dbra d7,horl move.l #$dff000,a6 ; move.w #$300,col0(a6) move.l #KeyMap,a5 tst.b $45(a5) beq.s noend cmp.b #'s',mors beq plr2quit st MASTERQUITTING bra noend plr2quit: st SLAVEQUITTING noend: tst.b MASTERQUITTING beq.s .noquit tst.b SLAVEQUITTING beq.s .noquit jmp endnomusic .noquit cmp.b #'n',mors bne.s noexit move.l PLR1_Roompt,a0 move.w (a0),d0 ; move.w PLOPT,d1 ; move.l #ENDZONES,a0 ; cmp.w (a0,d1.w*2),d0 cmp.w ENDZONE,d0 ; change this for quick exit, charlie zzzz: ; bra end bne.s noexit jmp end noexit: ; tst.w PLAYERONEHEALTH ; bgt nnoend1 ; jmp end ;nnoend1: ; tst.w PLAYERTWOHEALTH ; bgt nnoend2 ; jmp end ;nnoend2: ; move.l SwitchData,a0 ; tst.b 24+8(a0) ; bne end ; JSR STOPTIMER bra lop include "ab3:source_4000/ab3diipatchidr.s" CLRTWOLINES: moveq #0,d1 move.w #7,d2 .ccc move.l d1,2(a0) move.l d1,6(a0) move.l d1,10(a0) move.l d1,14(a0) move.l d1,18(a0) move.l d1,22(a0) move.l d1,26(a0) move.l d1,30(a0) move.l d1,34(a0) move.l d1,2+40(a0) move.l d1,6+40(a0) move.l d1,10+40(a0) move.l d1,14+40(a0) move.l d1,18+40(a0) move.l d1,22+40(a0) move.l d1,26+40(a0) move.l d1,30+40(a0) move.l d1,34+40(a0) add.l #10240,a0 dbra d2,.ccc rts LASTDH: dc.b 0 LASTDW: dc.b 0 WIDESCRN: dc.w 0 TRRANS: dc.w 0 DOANYWATER: dc.w 0 DoTheMapWotNastyCharlesIsForcingMeToDo: move.l #SHADINGTABLE,a4 ; add.w MAPBRIGHT,a4 move.l #KeyMap,a5 tst.b $50(a5) beq.s .nobrighter tst.w MAPBRIGHT beq.s .nobrighter sub.w #1,MAPBRIGHT .nobrighter: tst.b $51(a5) beq.s .nodimmer cmp.w #7,MAPBRIGHT bge.s .nodimmer add.w #1,MAPBRIGHT .nodimmer: move.l #Rotated,a1 move.l #COMPACTMAP,a2 move.l #BIGMAP-40,a3 preshow: add.w #40,a3 SHOWMAP: move.l (a2)+,d5 move.l a2,d7 cmp.l LASTZONE,d7 bgt shownmap tst.l d5 beq.s preshow move.w #9,d7 wallsofzone asr.l #1,d5 bcs.s WALLSEEN asr.l #1,d5 bcs.s WALLMAPPED asr.l #1,d5 addq #4,a3 bra.s DECIDEDWALL WALLMAPPED: move.w #$b00,d4 asr.l #1,d5 bcc.s .notadoor move.w #$e00,d4 .notadoor st TRRANS bra.s DECIDEDCOLOUR WALLSEEN: clr.b TRRANS move.w #255,d4 asr.l #2,d5 bcc.s .notadoor move.w #254,d4 .notadoor DECIDEDCOLOUR: move.w (a3)+,d6 move.l (a1,d6.w*8),d0 asr.l #7,d0 add.w mapxoff,d0 move.w 6(a1,d6.w*8),d1 add.w mapzoff,d1 move.w (a3)+,d6 move.l (a1,d6.w*8),d2 asr.l #7,d2 add.w mapxoff,d2 move.w 6(a1,d6.w*8),d3 add.w mapzoff,d3 neg.w d1 neg.w d3 movem.l d7/d5,-(a7) bsr CLIPANDDRAW movem.l (a7)+,d7/d5 DECIDEDWALL: dbra d7,wallsofzone bra SHOWMAP shownmap: clr.b TRRANS move.w mapxoff,d0 move.w mapzoff,d1 neg.w d1 move.w d0,d2 move.w d1,d3 sub.w #128,d1 add.w #128,d3 move.w #250,d4 bsr CLIPANDDRAW move.w mapxoff,d0 move.w mapzoff,d1 neg.w d1 move.w d0,d2 move.w d1,d3 sub.w #128,d1 sub.w #32,d3 sub.w #64,d2 move.w #250,d4 bsr CLIPANDDRAW move.w mapxoff,d0 move.w mapzoff,d1 neg.w d1 move.w d0,d2 move.w d1,d3 sub.w #128,d1 sub.w #32,d3 add.w #64,d2 move.w #250,d4 bsr CLIPANDDRAW rts CLIPANDDRAW: tst.b FULLSCR beq.s .nodov add.w d0,d0 add.w d2,d2 ext.l d0 ext.l d2 divs #3,d0 divs #3,d2 .nodov: move.w MAPBRIGHT,d5 asr.w d5,d0 asr.w d5,d1 asr.w d5,d2 asr.w d5,d3 NOSCALING: add.w #96,d0 bge p1xpos add.w #96,d2 blt OFFSCREEN x1nx2p: move.w d3,d5 sub.w d1,d5 move.w d2,d6 sub.w d0,d6 beq OFFSCREEN muls d0,d5 divs d6,d5 sub.w d5,d1 move.w #0,d0 bra doneleftclip p1xpos: add.w #96,d2 bge doneleftclip move.w d1,d5 sub.w d3,d5 move.w d0,d6 sub.w d2,d6 beq OFFSCREEN muls d2,d5 divs d6,d5 sub.w d5,d3 move.w #0,d2 doneleftclip: cmp.w #191,d0 ble p1xneg cmp.w #191,d2 bgt OFFSCREEN move.w d0,d6 sub.w d2,d6 beq OFFSCREEN sub.w #191,d0 move.w d3,d5 sub.w d1,d5 muls d5,d0 divs d6,d0 add.w d0,d1 move.w #191,d0 bra donerightclip p1xneg: cmp.w #191,d2 ble donerightclip move.w d2,d6 sub.w d0,d6 beq OFFSCREEN sub.w #191,d2 move.w d1,d5 sub.w d3,d5 muls d5,d2 divs d6,d2 add.w d2,d3 move.w #191,d2 donerightclip: ********************************* add.w #80,d1 bge p1ypos add.w #80,d3 blt OFFSCREEN move.w d2,d5 sub.w d0,d5 move.w d3,d6 sub.w d1,d6 beq OFFSCREEN muls d1,d5 divs d6,d5 sub.w d5,d0 move.w #0,d1 bra donetopclip p1ypos: add.w #80,d3 bge donetopclip move.w d0,d5 sub.w d2,d5 move.w d1,d6 sub.w d3,d6 beq OFFSCREEN muls d3,d5 divs d6,d5 sub.w d5,d2 move.w #0,d3 donetopclip: cmp.w #159,d1 ble p1yneg cmp.w #159,d3 bgt OFFSCREEN move.w d1,d6 sub.w d3,d6 beq OFFSCREEN sub.w #159,d1 move.w d2,d5 sub.w d0,d5 muls d5,d1 divs d6,d1 add.w d1,d0 move.w #159,d1 bra donebotclip p1yneg: cmp.w #159,d3 ble donebotclip move.w d3,d6 sub.w d1,d6 beq OFFSCREEN sub.w #159,d3 move.w d0,d5 sub.w d2,d5 muls d5,d3 divs d6,d3 add.w d3,d2 move.w #159,d3 donebotclip: tst.b TRRANS bne DRAWAtransLINE bra DRAWAMAPLINE OFFSCREEN: NOLINEtrans: rts MAPBRIGHT: dc.w 3 mapxoff: dc.w 0 mapzoff: dc.w 0 DRAWAtransLINE: move.l FASTBUFFER,a0 ; screen to render to. tst.b FULLSCR beq.s .nooffset add.l #(320*40)+(48*2),a0 .nooffset: cmp.w d1,d3 bgt.s .okdown bne.s .aline cmp.w d0,d2 beq.s NOLINEtrans .aline exg d0,d2 exg d1,d3 .okdown move.w d1,d5 muls #320,d5 add.l d5,a0 lea (a0,d0.w*2),a0 sub.w d1,d3 sub.w d0,d2 bge.s downrighttrans downlefttrans: neg.w d2 cmp.w d2,d3 bgt.s downmorelefttrans downleftmoretrans: move.w #320,d6 move.w d2,d0 move.w d2,d7 .linelop: move.b (a0),d4 move.b (a4,d4.w*2),(a0) subq #1,a0 sub.w d3,d0 bgt.s .noextra add.w d2,d0 add.w d6,a0 .noextra: dbra d7,.linelop rts downmorelefttrans: move.w #320,d6 move.w d3,d0 move.w d3,d7 .linelop: move.b (a0),d4 move.b (a4,d4.w*2),(a0) add.w d6,a0 sub.w d2,d0 bgt.s .noextra add.w d3,d0 subq #1,a0 .noextra: dbra d7,.linelop rts downrighttrans: cmp.w d2,d3 bgt.s downmorerighttrans downrightmoretrans: move.w #320,d6 move.w d2,d0 move.w d2,d7 .linelop: move.b (a0),d4 move.b (a4,d4.w*2),(a0)+ sub.w d3,d0 bgt.s .noextra add.w d2,d0 add.w d6,a0 .noextra: dbra d7,.linelop rts downmorerighttrans: move.w #320,d6 move.w d3,d0 move.w d3,d7 .linelop: move.b (a0),d4 move.b (a4,d4.w*2),(a0) add.w d6,a0 sub.w d2,d0 bgt.s .noextra add.w d3,d0 addq #1,a0 .noextra: dbra d7,.linelop rts NOLINE: rts DRAWAMAPLINE: move.l FASTBUFFER,a0 ; screen to render to. cmp.w d1,d3 bgt.s .okdown bne.s .aline cmp.w d0,d2 beq.s NOLINE .aline exg d0,d2 exg d1,d3 .okdown move.w d1,d5 muls #320,d5 add.l d5,a0 lea (a0,d0.w),a0 sub.w d1,d3 sub.w d0,d2 bge.s downright downleft: neg.w d2 cmp.w d2,d3 bgt.s downmoreleft downleftmore: move.w #320,d6 move.w d2,d0 move.w d2,d7 addq #1,a0 .linelop: move.b d4,-(a0) sub.w d3,d0 bgt.s .noextra add.w d2,d0 add.w d6,a0 .noextra: dbra d7,.linelop rts downmoreleft: move.w #320,d6 move.w d3,d0 move.w d3,d7 .linelop: move.b d4,(a0) add.w d6,a0 sub.w d2,d0 bgt.s .noextra add.w d3,d0 subq #1,a0 .noextra: dbra d7,.linelop rts downright: cmp.w d2,d3 bgt.s downmoreright downrightmore: move.w #320,d6 move.w d2,d0 move.w d2,d7 .linelop: move.b d4,(a0)+ sub.w d3,d0 bgt.s .noextra add.w d2,d0 add.w d6,a0 .noextra: dbra d7,.linelop rts downmoreright: move.w #320,d6 move.w d3,d0 move.w d3,d7 .linelop: move.b d4,(a0) add.w d6,a0 sub.w d2,d0 bgt.s .noextra add.w d3,d0 addq #1,a0 .noextra: dbra d7,.linelop rts SAVETHESCREEN: move.l old,$dff080 move.w #$8020,$dff000+intena move.l _IntuitionBase,a6 jsr _LVORethinkDisplay(a6) move.l doslib,a6 move.l #SAVENAME,d1 move.l #1006,d2 jsr -30(a6) move.l d0,handle move.l doslib,a6 move.l #mt_init,d2 move.l handle,d1 move.l #10240*8,d3 jsr _LVOWrite(a6) move.l doslib,a6 move.l handle,d1 jsr -36(a6) move.l doslib,a6 move.l #200,d1 jsr -198(a6) move.w #$0020,$dff000+intena move.l #bigfield,$dff080 add.b #1,SAVELETTER rts SAVENAME: dc.b 'work:rawscrn' SAVELETTER: dc.b 'd',0 even include "ab3:source_4000/CHUNKY.s" MASTERQUITTING: dc.b 0 SLAVEQUITTING: dc.b 0 MASTERPAUSE: dc.b 0 SLAVEPAUSE: dc.b 0 PAUSEOPTS: include "ab3:source_4000/pauseopts" ENDZONE: dc.w 0 ENDZONES: ; LEVEL 1 dc.w -1 ; dc.w 55 ; LEVEL 2 dc.w 149 ; LEVEL 3 dc.w 155 ; LEVEL 4 dc.w 107 ; LEVEL 5 dc.w 67 ; LEVEL 6 dc.w 132 ; LEVEL 7 dc.w 203 ; LEVEL 8 dc.w 166 ; LEVEL 9 dc.w 118 ; LEVEL 10 dc.w 102 ; LEVEL 11 dc.w 103 ; LEVEL 12 dc.w 2 ; LEVEL 13 dc.w 98 ; LEVEL 14 dc.w 0 ; LEVEL 15 dc.w 148 ; LEVEL 16 dc.w 103 *************************************************************************** *************************************************************************** ****************** End of Main Loop here ********************************** *************************************************************************** *************************************************************************** putinsmallscr: rts move.l #$1fe0000,statskip move.l #$1fe0000,statskip+4 move.l #healthpal,a5 ; move.l COPSCRN1,a0 ; move.l COPSCRN2,a2 move.w #scrheight-1,d0 move.l #0,d6 move.w #0,d3 move.w #$2bdf,startwait move.w #$2d01,endwait .fillcop move.w #$180,d1 move.l a0,a1 move.l a2,a3 move.w #$10c,(a1)+ move.w #$10c,(a3)+ move.w d3,(a1)+ move.w d3,(a3)+ eor.w #$8000,d3 move.w #$106,(a1)+ move.w #$106,(a3)+ move.w #$2c42,d5 or.w d3,d5 and.w #$fffe,d5 move.w d5,(a1)+ move.w d5,(a3)+ bsr do32 move.w #$106,(a1)+ move.w #$106,(a3)+ move.w #$4c42,d5 or.w d3,d5 and.w #$fffe,d5 move.w d5,(a1)+ move.w d5,(a3)+ bsr do32 move.w #$106,(a1)+ move.w #$106,(a3)+ move.w #$6c42,d5 or.w d3,d5 and.w #$fffe,d5 move.w d5,(a1)+ move.w d5,(a3)+ bsr do32 move.l #$1060c42,(a1)+ move.l #$1060c42,(a3)+ move.w #$19e,(a1)+ move.w (a5),(a1)+ move.w #$19e,(a3)+ move.w (a5)+,(a3)+ ********************************** adda.w #104*4,a0 adda.w #104*4,a2 dbra d0,.fillcop move.w #$48,fetchstart move.w #$88,fetchstop move.w #$2cb1,winstart move.w #$2c91,winstop move.w #-24,modulo move.w #-24,modulo+4 move.l #nullspr,d0 move.w d0,s4l move.w d0,s5l move.w d0,s6l move.w d0,s7l swap d0 move.w d0,s4h move.w d0,s5h move.w d0,s6h move.w d0,s7h ; move.l #borders,d0 ; move.w d0,s0l ; swap d0 ; move.w d0,s0h ; move.l #borders+2592,d0 ; move.w d0,s1l ; swap d0 ; move.w d0,s1h ; move.l #borders+2592*2,d0 ; move.w d0,s2l ; swap d0 ; move.w d0,s2h ; move.l #borders+2592*3,d0 ; move.w d0,s3l ; swap d0 ; move.w d0,s3h move.l scrn,a0 add.l #40,a0 move.l scrn,a1 add.l #160,a1 move.l scrn,a2 add.l #280,a2 move.l #smallscrntab,a3 move.w #191,d7 ; counter move.w #0,d1 ; xpos .plotscrnloop: move.b (a3)+,d0 move.w d1,d2 asr.w #3,d2 move.b d1,d3 not.b d3 bclr.b d3,-40(a0,d2.w) bclr.b d3,(a0,d2.w) bclr.b d3,40(a0,d2.w) bclr.b d3,-40(a1,d2.w) bclr.b d3,(a1,d2.w) bclr.b d3,40(a1,d2.w) bclr.b d3,-40(a2,d2.w) btst #0,d0 beq.s .nobp1 bset.b d3,-40(a0,d2.w) .nobp1: btst #1,d0 beq.s .nobp2 bset.b d3,(a0,d2.w) .nobp2: btst #2,d0 beq.s .nobp3 bset.b d3,40(a0,d2.w) .nobp3: btst #3,d0 beq.s .nobp4 bset.b d3,-40(a1,d2.w) .nobp4: btst #4,d0 beq.s .nobp5 bset.b d3,(a1,d2.w) .nobp5: btst #5,d0 beq.s .nobp6 bset.b d3,40(a1,d2.w) .nobp6: btst #6,d0 beq.s .nobp7 bset.b d3,-40(a2,d2.w) .nobp7: addq #1,d1 dbra d7,.plotscrnloop rts putinlargescr: move.l #$1000000,statskip move.l #$fffffffe,statskip+4 move.l #healthpal,a5 ; move.l COPSCRN1,a0 ; move.l COPSCRN2,a2 move.w #scrheight-1,d0 move.l #0,d6 move.w #0,d3 move.w #$29df,startwait move.w #$2b01,endwait .fillcop move.w #$180,d1 move.l a0,a1 move.l a2,a3 move.w #$10c,(a1)+ move.w #$10c,(a3)+ move.w d3,(a1)+ move.w d3,(a3)+ eor.w #$8000,d3 move.w #$106,(a1)+ move.w #$106,(a3)+ move.w #$2c42,d5 or.w d3,d5 and.w #$fffe,d5 move.w d5,(a1)+ move.w d5,(a3)+ bsr do32 move.w #$106,(a1)+ move.w #$106,(a3)+ move.w #$4c42,d5 or.w d3,d5 and.w #$fffe,d5 move.w d5,(a1)+ move.w d5,(a3)+ bsr do32 move.w #$106,(a1)+ move.w #$106,(a3)+ move.w #$6c42,d5 or.w d3,d5 and.w #$fffe,d5 move.w d5,(a1)+ move.w d5,(a3)+ bsr do32 move.w startwait,(a1)+ move.w #$fffe,(a1)+ move.w endwait,(a1)+ move.w #$ff00,(a1)+ move.w startwait,(a3)+ move.w #$fffe,(a3)+ move.w endwait,(a3)+ move.w #$ff00,(a3)+ ; move.l $1fe0000,(a1)+ ; move.l $1fe0000,(a3)+ ; move.l $1fe0000,(a1)+ ; move.l $1fe0000,(a3)+ add.w #$300,startwait add.w #$300,endwait ; move.l #$1060c42,(a1)+ ; move.l #$1060c42,(a3)+ ; move.w #$19e,(a1)+ ; move.w (a5),(a1)+ ; move.w #$19e,(a3)+ ; move.w (a5)+,(a3)+ ********************************** adda.w #104*4,a0 adda.w #104*4,a2 dbra d0,.fillcop move.w #$38,fetchstart move.w #$b8,fetchstop move.w #$2c81,winstart move.w #$2cc1,winstop move.w #-40,modulo move.w #-40,modulo+4 move.l #nullspr,d0 move.w d0,s0l move.w d0,s1l move.w d0,s2l move.w d0,s3l move.w d0,s4l move.w d0,s5l move.w d0,s6l move.w d0,s7l swap d0 move.w d0,s0h move.w d0,s1h move.w d0,s2h move.w d0,s3h move.w d0,s4h move.w d0,s5h move.w d0,s6h move.w d0,s7h move.l scrn,a0 move.l a0,a1 move.l a0,a2 add.l #40,a0 add.l #160,a1 add.l #280,a2 move.l #scrntab,a3 move.w #319,d7 ; counter move.w #0,d1 ; xpos .plotscrnloop: move.b (a3)+,d0 move.w d1,d2 asr.w #3,d2 move.b d1,d3 not.b d3 bclr.b d3,-40(a0,d2.w) bclr.b d3,(a0,d2.w) bclr.b d3,40(a0,d2.w) bclr.b d3,-40(a1,d2.w) bclr.b d3,(a1,d2.w) bclr.b d3,40(a1,d2.w) bclr.b d3,-40(a2,d2.w) btst #0,d0 beq.s .nobp1 bset.b d3,-40(a0,d2.w) .nobp1: btst #1,d0 beq.s .nobp2 bset.b d3,(a0,d2.w) .nobp2: btst #2,d0 beq.s .nobp3 bset.b d3,40(a0,d2.w) .nobp3: btst #3,d0 beq.s .nobp4 bset.b d3,-40(a1,d2.w) .nobp4: btst #4,d0 beq.s .nobp5 bset.b d3,(a1,d2.w) .nobp5: btst #5,d0 beq.s .nobp6 bset.b d3,40(a1,d2.w) .nobp6: btst #6,d0 beq.s .nobp7 bset.b d3,-40(a2,d2.w) .nobp7: addq #1,d1 dbra d7,.plotscrnloop rts CLEARKEYBOARD: move.l #KeyMap,a5 moveq #0,d0 move.w #15,d1 clrloo: move.l d0,(a5)+ move.l d0,(a5)+ move.l d0,(a5)+ move.l d0,(a5)+ dbra d1,clrloo rts READCONTROLS: dc.w 0 tstststst: dc.w 0 BollocksRoom: dc.w -1 ds.l 50 GUNYOFFS: dc.w 20 dc.w 20 dc.w 0 dc.w 20 dc.w 20 dc.w 0 dc.w 0 dc.w 20 PLR1_BOBBLEY: dc.l 0 PLR2_BOBBLEY: dc.l 0 USEPLR1: *********************************** move.l PLR1_Obj,a0 move.b #4,16(a0) move.l ObjectPoints,a1 move.l #ObjRotated,a2 move.w (a0),d0 move.l PLR1_xoff,(a1,d0.w*8) move.l PLR1_zoff,4(a1,d0.w*8) move.l PLR1_Roompt,a1 moveq #0,d2 move.b damagetaken(a0),d2 beq .notbeenshot moveq #0,d4 move.w ImpactX(a0),d3 beq.s .notwist move.w d2,d4 .notwist: add.w d3,PLR1s_xspdval move.w ImpactZ(a0),d3 beq.s .notwist2 move.w d2,d4 .notwist2: add.w d3,PLR1s_zspdval move.w ImpactY(a0),d3 ext.l d3 asl.l #8,d3 add.l d3,PLR1s_yvel move.w #0,ImpactX(a0) move.w #0,ImpactY(a0) move.w #0,ImpactZ(a0) jsr GetRand muls d4,d0 asr.l #8,d0 asr.l #4,d0 add.w d0,PLR1s_angspd move.l #7*2116,hitcol sub.w d2,PLAYERONEHEALTH movem.l d0-d7/a0-a6,-(a7) move.b #$fb,IDNUM move.w #19,Samplenum clr.b notifplaying move.w #0,Noisex move.w #0,Noisez move.w #100,Noisevol jsr MakeSomeNoise movem.l (a7)+,d0-d7/a0-a6 .notbeenshot move.b #0,damagetaken(a0) move.b #10,numlives(a0) move.w p1_angpos,Facing(a0) move.b PLR1_StoodInTop,ObjInTop(a0) move.w (a1),12(a0) move.w (a1),d2 move.l #ZoneBrightTable,a1 move.l (a1,d2.w*4),d2 tst.b PLR1_StoodInTop bne.s .okinbott swap d2 .okinbott: move.w d2,2(a0) move.l p1_yoff,d0 move.l p1_height,d1 asr.l #1,d1 add.l d1,d0 asr.l #7,d0 move.w d0,4(a0) *********************************** move.l PLR2_Obj,a0 move.b #5,16(a0) move.w p2_angpos,d0 and.w #8190,d0 move.w d0,Facing(a0) ; ; jsr ViewpointToDraw ; asl.w #2,d0 ; moveq #0,d1 ; move.b p2_bobble,d1 ; not.b d1 ; lsr.b #3,d1 ; and.b #$3,d1 ; add.w d1,d0 ; move.w d0,10(a0) ; move.w #10,8(a0) ; move.l ObjectPoints,a1 move.l #ObjRotated,a2 move.w (a0),d0 move.l PLR2_xoff,(a1,d0.w*8) move.l PLR2_zoff,4(a1,d0.w*8) move.l PLR2_Roompt,a1 moveq #0,d2 move.b damagetaken(a0),d2 beq .notbeenshot2 move.w ImpactX(a0),d3 add.w d3,PLR2s_xspdval move.w ImpactZ(a0),d3 add.w d3,PLR2s_zspdval move.w ImpactY(a0),d3 ext.l d3 asl.l #8,d3 add.l d3,PLR2s_yvel move.w #0,ImpactX(a0) move.w #0,ImpactY(a0) move.w #0,ImpactZ(a0) sub.w d2,PLAYERTWOHEALTH .notbeenshot2 move.b #0,damagetaken(a0) move.b #10,numlives(a0) move.b PLR2_StoodInTop,ObjInTop(a0) move.w (a1),12(a0) move.w (a1),d2 move.l #ZoneBrightTable,a1 move.l (a1,d2.w*4),d2 tst.b PLR2_StoodInTop bne.s .okinbott2 swap d2 .okinbott2: move.w d2,2(a0) move.l p2_yoff,d0 move.l p2_height,d1 asr.l #1,d1 add.l d1,d0 asr.l #7,d0 move.w d0,4(a0) jsr ViewpointToDraw add.l d0,d0 move.l LINKFILE,a6 add.l #PLR2ALIEN,a6 move.w (a6),d7 move.w d7,d1 move.l LINKFILE,a6 add.l #AlienStats,a6 muls #AlienStatLen,d1 add.l d1,a6 move.b A_GFXType+1(a6),VECOBJ cmp.w #1,A_GFXType(a6) bne.s .NOSIDES2 moveq #0,d0 .NOSIDES2: move.l LINKFILE,a6 add.l #AlienAnimData,a6 move.w d7,d1 muls #A_AnimLen,d1 add.l d1,a6 ; move.l ANIMPOINTER,a6 muls #A_OptLen,d0 add.w d0,a6 move.w SecTimer(a0),d1 move.w d1,d2 muls #A_FrameLen,d1 addq #1,d2 move.w d2,d3 muls #A_FrameLen,d3 tst.b (a6,d3.w) bge.s .noendanim move.w #0,d2 .noendanim move.w d2,SecTimer(a0) move.w d2,d1 muls #A_FrameLen,d1 move.l #0,8(a0) move.b (a6,d1.w),9(a0) move.b 1(a6,d1.w),d0 ext.w d0 bgt.s .noflip move.b #128,10(a0) neg.w d0 .noflip: sub.w #1,d0 move.b d0,11(a0) move.w #-1,6(a0) cmp.b #1,VECOBJ beq.s .nosize bgt.s .setlight move.w 2(a6,d1.w),6(a0) bra.s .ddone .nosize ; move.l #$00090001,8(a0) bra.s .ddone .setlight: move.w 2(a6,d1.w),6(a0) move.b VECOBJ,d1 or.b d1,10(a0) .ddone: ********************************** move.l PLR1_Obj,a0 ifeq CHEESEY tst.w PLAYERONEHEALTH bgt.s .notdead move.w #-1,12+128(a0) rts .notdead: move.l PLR1_Roompt,a1 move.w Facing(a0),d0 add.w #4096,d0 and.w #8190,d0 move.w d0,Facing+128(a0) move.w (a1),12+128(a0) move.w (a1),GraphicRoom+128(a0) moveq #0,d0 move.b p1_gunselected,d0 move.l LINKFILE,a1 add.l #GunObjects,a1 move.w (a1,d0.w*2),d0 move.b d0,TypeOfThing+128(a0) move.b #1,128+16(a0) move.w (a0),d0 move.w 128(a0),d1 move.l ObjectPoints,a1 move.l (a1,d0.w*8),(a1,d1.w*8) move.l 4(a1,d0.w*8),4(a1,d1.w*8) st WhichAnim+128(a0) move.l p1_yoff,d0 move.l p1_height,d1 asr.l #2,d1 add.l #10*128,d1 add.l d1,d0 asr.l #7,d0 move.w d0,4+128(a0) move.l PLR1_BOBBLEY,d1 asr.l #8,d1 move.l d1,d0 asr.l #1,d0 add.l d0,d1 add.w d1,4+128(a0) move.b ObjInTop(a0),ObjInTop+128(a0) endc ifne CHEESEY move.w #-1,12+128(a0) endc rts *************************************************** ************************************************** USEPLR2: *********************************** move.l PLR2_Obj,a0 move.b #5,16(a0) move.l ObjectPoints,a1 move.l #ObjRotated,a2 move.w (a0),d0 move.l PLR2_xoff,(a1,d0.w*8) move.l PLR2_zoff,4(a1,d0.w*8) move.l PLR2_Roompt,a1 moveq #0,d2 move.b damagetaken(a0),d2 beq .notbeenshot moveq #0,d4 move.w ImpactX(a0),d3 beq.s .notwist move.w d2,d4 .notwist: add.w d3,PLR2s_xspdval move.w ImpactZ(a0),d3 beq.s .notwist2 move.w d2,d4 .notwist2: add.w d3,PLR2s_zspdval jsr GetRand muls d4,d0 asr.l #8,d0 asr.l #4,d0 add.w d0,PLR2s_angspd move.l #7*2116,hitcol sub.w d2,PLAYERTWOHEALTH movem.l d0-d7/a0-a6,-(a7) move.w #19,Samplenum clr.b notifplaying move.b #$fb,IDNUM move.w #0,Noisex move.w #0,Noisez move.w #100,Noisevol jsr MakeSomeNoise movem.l (a7)+,d0-d7/a0-a6 .notbeenshot move.b #0,damagetaken(a0) move.b #10,numlives(a0) move.w p2_angpos,Facing(a0) move.b PLR2_StoodInTop,ObjInTop(a0) move.w (a1),12(a0) move.w (a1),d2 move.l #ZoneBrightTable,a1 move.l (a1,d2.w*4),d2 tst.b PLR2_StoodInTop bne.s .okinbott swap d2 .okinbott: move.w d2,2(a0) move.l PLR2_yoff,d0 move.l p2_height,d1 asr.l #1,d1 add.l d1,d0 asr.l #7,d0 move.w d0,4(a0) *********************************** move.l PLR1_Obj,a0 move.b #4,16(a0) move.w PLR1_angpos,d0 and.w #8190,d0 move.w d0,Facing(a0) ; ; jsr ViewpointToDraw ; asl.w #2,d0 ; moveq #0,d1 ; move.b p2_bobble,d1 ; not.b d1 ; lsr.b #3,d1 ; and.b #$3,d1 ; add.w d1,d0 ; move.w d0,10(a0) ; move.w #10,8(a0) ; move.l ObjectPoints,a1 move.l #ObjRotated,a2 move.w (a0),d0 move.l PLR1_xoff,(a1,d0.w*8) move.l PLR1_zoff,4(a1,d0.w*8) move.l PLR1_Roompt,a1 moveq #0,d2 move.b damagetaken(a0),d2 beq .notbeenshot2 move.w ImpactX(a0),d3 add.w d3,PLR1s_xspdval move.w ImpactZ(a0),d3 add.w d3,PLR1s_zspdval sub.w d2,PLAYERONEHEALTH .notbeenshot2 move.b #0,damagetaken(a0) move.b #10,numlives(a0) move.b PLR1_StoodInTop,ObjInTop(a0) move.w (a1),12(a0) move.w (a1),d2 move.l #ZoneBrightTable,a1 move.l (a1,d2.w*4),d2 tst.b PLR1_StoodInTop bne.s .okinbott2 swap d2 .okinbott2: move.w d2,2(a0) move.l p1_yoff,d0 move.l p1_height,d1 asr.l #1,d1 add.l d1,d0 asr.l #7,d0 move.w d0,4(a0) jsr ViewpointToDraw add.l d0,d0 move.l LINKFILE,a6 add.l #PLR1ALIEN,a6 move.w (a6),d7 move.w d7,d1 move.l LINKFILE,a6 add.l #AlienStats,a6 muls #AlienStatLen,d1 add.l d1,a6 move.b A_GFXType+1(a6),VECOBJ cmp.w #1,A_GFXType(a6) bne.s .NOSIDES2 moveq #0,d0 .NOSIDES2: move.l LINKFILE,a6 add.l #AlienAnimData,a6 move.w d7,d1 muls #A_AnimLen,d1 add.l d1,a6 ; move.l ANIMPOINTER,a6 muls #A_OptLen,d0 add.w d0,a6 move.w SecTimer(a0),d1 move.w d1,d2 muls #A_FrameLen,d1 addq #1,d2 move.w d2,d3 muls #A_FrameLen,d3 tst.b (a6,d3.w) bge.s .noendanim move.w #0,d2 .noendanim move.w d2,SecTimer(a0) move.w d2,d1 muls #A_FrameLen,d1 move.l #0,8(a0) move.b (a6,d1.w),9(a0) move.b 1(a6,d1.w),d0 ext.w d0 bgt.s .noflip move.b #128,10(a0) neg.w d0 .noflip: sub.w #1,d0 move.b d0,11(a0) move.w #-1,6(a0) cmp.b #1,VECOBJ beq.s .nosize bgt.s .setlight move.w 2(a6,d1.w),6(a0) bra.s .ddone .nosize ; move.l #$00090001,8(a0) bra.s .ddone .setlight: move.w 2(a6,d1.w),6(a0) move.b VECOBJ,d1 or.b d1,10(a0) .ddone: ********************************** move.l PLR2_Obj,a0 ifeq CHEESEY tst.w PLAYERTWOHEALTH bgt.s .notdead move.w #-1,12+64(a0) rts .notdead: move.l PLR2_Roompt,a1 move.w Facing(a0),d0 add.w #4096,d0 and.w #8190,d0 move.w d0,Facing+64(a0) move.w (a1),12+64(a0) move.w (a1),GraphicRoom+64(a0) moveq #0,d0 move.b p2_gunselected,d0 move.l LINKFILE,a1 add.l #GunObjects,a1 move.w (a1,d0.w*2),d0 move.b d0,TypeOfThing+64(a0) move.b #1,64+16(a0) move.w (a0),d0 move.w 64(a0),d1 move.l ObjectPoints,a1 move.l (a1,d0.w*8),(a1,d1.w*8) move.l 4(a1,d0.w*8),4(a1,d1.w*8) st WhichAnim+64(a0) move.l p2_yoff,d0 move.l p2_height,d1 asr.l #2,d1 add.l #10*128,d1 add.l d1,d0 asr.l #7,d0 move.w d0,4+64(a0) move.l PLR2_BOBBLEY,d1 asr.l #8,d1 move.l d1,d0 asr.l #1,d0 add.l d0,d1 add.w d1,4+64(a0) move.b ObjInTop(a0),ObjInTop+64(a0) endc ifne CHEESEY move.w #-1,12+64(a0) endc rts GunSelected: dc.b 0 even GunData: dc.l 0 protA: dc.w 0 Path: ; incbin "testpath" endpath: pathpt: dc.l Path PLR1KEYS: dc.b 0 PLR1PATH: dc.b 0 PLR1MOUSE: dc.b -1 PLR1JOY: dc.b 0 PLR2KEYS: dc.b 0 PLR2PATH: dc.b 0 PLR2MOUSE: dc.b -1 PLR2JOY: dc.b 0 even PLR1_bobble: dc.w 0 PLR2_bobble: dc.w 0 xwobble: dc.l 0 xwobxoff: dc.w 0 xwobzoff: dc.w 0 PLR1_Control: ; Take a snapshot of everything. move.l PLR1_xoff,d2 move.l d2,PLR1_oldxoff move.l d2,oldx move.l PLR1_zoff,d3 move.l d3,PLR1_oldzoff move.l d3,oldz move.l p1_xoff,d0 move.l d0,PLR1_xoff move.l d0,newx move.l p1_zoff,d1 move.l d1,newz move.l d1,PLR1_zoff move.l p1_height,PLR1_height sub.l d2,d0 sub.l d3,d1 move.l d0,xdiff move.l d1,zdiff move.w p1_angpos,d0 move.w d0,PLR1_angpos move.l #SineTable,a1 move.w (a1,d0.w),PLR1_sinval add.w #2048,d0 and.w #8190,d0 move.w (a1,d0.w),PLR1_cosval move.l p1_yoff,d0 move.w p1_bobble,d1 move.w (a1,d1.w),d1 move.w d1,d3 ble.s .notnegative neg.w d1 .notnegative: add.w #16384,d1 asr.w #4,d1 tst.b PLR1_Ducked bne.s .notdouble add.w d1,d1 .notdouble ext.l d1 move.l d1,PLR1_BOBBLEY move.l PLR1_height,d4 sub.l d1,d4 add.l d1,d0 cmp.b #'s',mors beq.s .otherwob asr.w #6,d3 ext.l d3 move.l d3,xwobble move.w PLR1_sinval,d1 muls d3,d1 move.w PLR1_cosval,d2 muls d3,d2 swap d1 swap d2 asr.w #7,d1 move.w d1,xwobxoff asr.w #7,d2 neg.w d2 move.w d2,xwobzoff .otherwob move.l d0,PLR1_yoff move.l d0,newy move.l d0,oldy move.l d4,thingheight move.l #40*256,StepUpVal tst.b PLR1_Ducked beq.s .okbigstep move.l #10*256,StepUpVal .okbigstep: move.l #$1000000,StepDownVal move.l PLR1_Roompt,a0 move.w ToTelZone(a0),d0 blt .noteleport move.w ToTelX(a0),newx move.w ToTelZ(a0),newz move.w #-1,CollId move.l #%111111111111111111,CollideFlags bsr Collision tst.b hitwall beq.s .teleport move.w PLR1_xoff,newx move.w PLR1_zoff,newz bra .noteleport .teleport: st PLR1_TELEPORTED move.l PLR1_Roompt,a0 move.w ToTelZone(a0),d0 move.w ToTelX(a0),PLR1_xoff move.w ToTelZ(a0),PLR1_zoff move.l PLR1_yoff,d1 sub.l ToZoneFloor(a0),d1 move.l ZoneAdds,a0 move.l (a0,d0.w*4),a0 add.l LEVELDATA,a0 move.l a0,PLR1_Roompt add.l ToZoneFloor(a0),d1 move.l d1,PLR1s_yoff move.l d1,PLR1_yoff move.l d1,PLR1s_tyoff move.l PLR1_xoff,PLR1s_xoff move.l PLR1_zoff,PLR1s_zoff SAVEREGS move.w #0,Noisex move.w #0,Noisez move.w #26,Samplenum move.w #100,Noisevol move.b #$fa,IDNUM jsr MakeSomeNoise GETREGS bra .cantmove .noteleport: move.l PLR1_Roompt,objroom move.w #%100000000,wallflags move.b PLR1_StoodInTop,StoodInTop move.l #%1011111110111000011,CollideFlags move.w #-1,CollId bsr Collision tst.b hitwall beq.s .nothitanything move.w oldx,PLR1_xoff move.w oldz,PLR1_zoff move.l PLR1_xoff,PLR1s_xoff move.l PLR1_zoff,PLR1s_zoff bra .cantmove .nothitanything: move.w #40,extlen move.b #0,awayfromwall clr.b exitfirst clr.b wallbounce bsr MoveObject move.b StoodInTop,PLR1_StoodInTop move.l objroom,PLR1_Roompt move.w newx,PLR1_xoff move.w newz,PLR1_zoff move.l PLR1_xoff,PLR1s_xoff move.l PLR1_zoff,PLR1s_zoff .cantmove: move.l PLR1_Roompt,a0 move.l ToZoneFloor(a0),d0 tst.b PLR1_StoodInTop beq.s notintop move.l ToUpperFloor(a0),d0 notintop: adda.w #ToZonePts,a0 sub.l PLR1_height,d0 move.l d0,PLR1s_tyoff move.w p1_angpos,tmpangpos ; move.l (a0),a0 ; jump to viewpoint list * A0 is pointing at a pointer to list of points to rotate move.w (a0)+,d1 ext.l d1 add.l PLR1_Roompt,d1 move.l d1,PLR1_PointsToRotatePtr tst.w (a0)+ sne.s DRAWNGRAPHTOP beq.s nobackgraphics cmp.b #'s',mors beq.s nobackgraphics move.l a0,-(a7) jsr putinbackdrop move.l (a7)+,a0 nobackgraphics: adda.w #10,a0 move.l a0,PLR1_ListOfGraphRooms ************************************************* rts DRAWNGRAPHTOP dc.w 0 tstzone: dc.l 0 CollId: dc.w 0 PLR2_Control: ; Take a snapshot of everything. move.l PLR2_xoff,d2 move.l d2,PLR2_oldxoff move.l d2,oldx move.l PLR2_zoff,d3 move.l d3,PLR2_oldzoff move.l d3,oldz move.l p2_xoff,d0 move.l d0,PLR2_xoff move.l d0,newx move.l p2_zoff,d1 move.l d1,newz move.l d1,PLR2_zoff move.l p2_height,PLR2_height sub.l d2,d0 sub.l d3,d1 move.l d0,xdiff move.l d1,zdiff move.w p2_angpos,d0 move.w d0,PLR2_angpos move.l #SineTable,a1 move.w (a1,d0.w),PLR2_sinval add.w #2048,d0 and.w #8190,d0 move.w (a1,d0.w),PLR2_cosval move.l p2_yoff,d0 move.w p2_bobble,d1 move.w (a1,d1.w),d1 move.w d1,d3 ble.s .notnegative neg.w d1 .notnegative: add.w #16384,d1 asr.w #4,d1 tst.b PLR2_Ducked bne.s .notdouble add.w d1,d1 .notdouble ext.l d1 move.l d1,PLR2_BOBBLEY move.l PLR2_height,d4 sub.l d1,d4 add.l d1,d0 cmp.b #'s',mors bne.s .otherwob asr.w #6,d3 ext.l d3 move.l d3,xwobble move.w PLR2_sinval,d1 muls d3,d1 move.w PLR2_cosval,d2 muls d3,d2 swap d1 swap d2 asr.w #7,d1 move.w d1,xwobxoff asr.w #7,d2 neg.w d2 move.w d2,xwobzoff .otherwob move.l d0,PLR2_yoff move.l d0,newy move.l d0,oldy move.l d4,thingheight move.l #40*256,StepUpVal tst.b PLR2_Ducked beq.s .okbigstep move.l #10*256,StepUpVal .okbigstep: move.l #$1000000,StepDownVal move.l PLR2_Roompt,a0 move.w ToTelZone(a0),d0 blt .noteleport move.w ToTelX(a0),newx move.w ToTelZ(a0),newz move.w #-1,CollId move.l #%111111111111111111,CollideFlags bsr Collision tst.b hitwall beq.s .teleport move.w PLR2_xoff,newx move.w PLR2_zoff,newz bra .noteleport .teleport: st PLR2_TELEPORTED move.l PLR2_Roompt,a0 move.w ToTelZone(a0),d0 move.w ToTelX(a0),PLR2_xoff move.w ToTelZ(a0),PLR2_zoff move.l PLR2_yoff,d1 sub.l ToZoneFloor(a0),d1 move.l ZoneAdds,a0 move.l (a0,d0.w*4),a0 add.l LEVELDATA,a0 move.l a0,PLR2_Roompt add.l ToZoneFloor(a0),d1 move.l d1,PLR2s_yoff move.l d1,PLR2_yoff move.l d1,PLR2s_tyoff move.l PLR2_xoff,PLR2s_xoff move.l PLR2_zoff,PLR2s_zoff SAVEREGS move.w #0,Noisex move.w #0,Noisez move.w #26,Samplenum move.w #100,Noisevol move.b #$fa,IDNUM jsr MakeSomeNoise GETREGS bra .cantmove .noteleport: move.l PLR2_Roompt,objroom move.w #%100000000000,wallflags move.b PLR2_StoodInTop,StoodInTop move.l #%1011111010111100011,CollideFlags move.w #-1,CollId bsr Collision tst.b hitwall beq.s .nothitanything move.w oldx,PLR2_xoff move.w oldz,PLR2_zoff move.l PLR2_xoff,PLR2s_xoff move.l PLR2_zoff,PLR2s_zoff bra .cantmove .nothitanything: move.w #40,extlen move.b #0,awayfromwall clr.b exitfirst clr.b wallbounce bsr MoveObject move.b StoodInTop,PLR2_StoodInTop move.l objroom,PLR2_Roompt move.w newx,PLR2_xoff move.w newz,PLR2_zoff move.l PLR2_xoff,PLR2s_xoff move.l PLR2_zoff,PLR2s_zoff .cantmove move.l PLR2_Roompt,a0 move.l ToZoneFloor(a0),d0 tst.b PLR2_StoodInTop beq.s .notintop move.l ToUpperFloor(a0),d0 .notintop: adda.w #ToZonePts,a0 sub.l PLR2_height,d0 move.l d0,PLR2s_tyoff move.w p2_angpos,tmpangpos ; move.l (a0),a0 ; jump to viewpoint list * A0 is pointing at a pointer to list of points to rotate move.w (a0)+,d1 ext.l d1 add.l PLR2_Roompt,d1 move.l d1,PLR2_PointsToRotatePtr tst.w (a0)+ sne.s DRAWNGRAPHTOP beq.s .nobackgraphics cmp.b #'s',mors bne.s .nobackgraphics move.l a0,-(a7) jsr putinbackdrop move.l (a7)+,a0 .nobackgraphics: adda.w #10,a0 move.l a0,PLR2_ListOfGraphRooms ***************************************************** rts KeyMap: ds.b 256 fillscrnwater: dc.w 0 DONTDOGUN: dc.w 0 ;temptemp: ds.l 200 ;temptempptr: dc.l 0 DrawDisplay: ; move.l #temptemp,temptempptr clr.b fillscrnwater move.l #SineTable,a0 move.w angpos,d0 move.w (a0,d0.w),d6 adda.w #2048,a0 move.w (a0,d0.w),d7 move.w d6,sinval move.w d7,cosval move.l yoff,d0 asr.l #8,d0 move.w d0,d1 add.w #256-32,d1 and.w #255,d1 move.w d1,wallyoff move.l yoff,d0 asr.l #6,d0 move.w d0,flooryoff move.w xoff,d6 move.w d6,d3 asr.w #1,d3 add.w d3,d6 asr.w #1,d6 move.w d6,xoff34 move.w zoff,d6 move.w d6,d3 asr.w #1,d3 add.w d3,d6 asr.w #1,d6 move.w d6,zoff34 bsr RotateLevelPts bsr RotateObjectPts bsr CalcPLR1InLine cmp.b #'n',mors bne.s doplr2too move.l PLR2_Obj,a0 move.w #-1,12(a0) move.w #-1,GraphicRoom(a0) bra noplr2either doplr2too: bsr CalcPLR2InLine noplr2either: move.l endoflist,a0 ; move.w #-1,(a0) ; move.l #FinalOrder,a0 subroomloop: ; move.w (a0)+,d7 move.w -(a0),d7 blt jumpoutofrooms ; bsr setlrclip ; move.w leftclip,d0 ; cmp.w rightclip,d0 ; bge subroomloop move.l a0,-(a7) move.l ZoneAdds,a0 move.l (a0,d7.w*4),a0 add.l LEVELDATA,a0 move.l ToZoneRoof(a0),SplitHeight move.l a0,ROOMBACK move.l ZoneGraphAdds,a0 move.l 4(a0,d7.w*8),a2 move.l (a0,d7.w*8),a0 add.l LEVELGRAPHICS,a0 add.l LEVELGRAPHICS,a2 move.l a2,ThisRoomToDraw+4 move.l a0,ThisRoomToDraw move.l ListOfGraphRooms,a1 finditit: tst.w (a1) blt nomoretodoatall cmp.w (a1),d7 beq outoffind adda.w #8,a1 bra finditit outoffind: move.l a1,-(a7) move.w #0,leftclip move.w RIGHTX,rightclip moveq #0,d7 move.w 2(a1),d7 blt.s outofrcliplop move.l LEVELCLIPS,a0 lea (a0,d7.l*2),a0 tst.w (a0) blt outoflcliplop bsr NEWsetlclip intolcliplop: ; clips tst.w (a0) blt outoflcliplop bsr NEWsetlclip bra intolcliplop outoflcliplop: addq #2,a0 tst.w (a0) blt outofrcliplop bsr NEWsetrclip intorcliplop: ; clips tst.w (a0) blt outofrcliplop bsr NEWsetrclip bra intorcliplop outofrcliplop: move.w leftclip,d0 cmp.w RIGHTX,d0 bge dontbothercantseeit move.w rightclip,d1 blt dontbothercantseeit cmp.w d1,d0 bge dontbothercantseeit move.l yoff,d0 cmp.l SplitHeight,d0 blt botfirst move.l ThisRoomToDraw+4,a0 cmp.l LEVELGRAPHICS,a0 beq.s noupperroom st DOUPPER move.l ROOMBACK,a1 move.l ToUpperRoof(a1),TOPOFROOM move.l ToUpperFloor(a1),BOTOFROOM move.l #CurrentPointBrights+4,PointBrightsPtr bsr dothisroom noupperroom: move.l ThisRoomToDraw,a0 clr.b DOUPPER move.l #CurrentPointBrights,PointBrightsPtr move.l ROOMBACK,a1 move.l ToZoneRoof(a1),d0 move.l d0,TOPOFROOM move.l ToZoneFloor(a1),d1 move.l d1,BOTOFROOM move.l ToZoneWater(a1),d2 cmp.l yoff,d2 blt.s .abovefirst move.l d2,BEFOREWATTOP move.l d1,BEFOREWATBOT move.l d2,AFTERWATBOT move.l d0,AFTERWATTOP bra.s .belowfirst .abovefirst: move.l d0,BEFOREWATTOP move.l d2,BEFOREWATBOT move.l d1,AFTERWATBOT move.l d2,AFTERWATTOP .belowfirst: bsr dothisroom bra dontbothercantseeit botfirst: move.l ThisRoomToDraw,a0 clr.b DOUPPER move.l #CurrentPointBrights,PointBrightsPtr move.l ROOMBACK,a1 move.l ToZoneRoof(a1),d0 move.l d0,TOPOFROOM move.l ToZoneFloor(a1),d1 move.l d1,BOTOFROOM move.l ToZoneWater(a1),d2 cmp.l yoff,d2 blt.s .abovefirst move.l d2,BEFOREWATTOP move.l d1,BEFOREWATBOT move.l d2,AFTERWATBOT move.l d0,AFTERWATTOP bra.s .belowfirst .abovefirst: move.l d0,BEFOREWATTOP move.l d2,BEFOREWATBOT move.l d1,AFTERWATBOT move.l d2,AFTERWATTOP .belowfirst: bsr dothisroom move.l ThisRoomToDraw+4,a0 cmp.l LEVELGRAPHICS,a0 beq.s noupperroom2 move.l #CurrentPointBrights+4,PointBrightsPtr move.l ROOMBACK,a1 move.l ToUpperRoof(a1),TOPOFROOM move.l ToUpperFloor(a1),BOTOFROOM st DOUPPER bsr dothisroom noupperroom2: dontbothercantseeit: pastemp: move.l (a7)+,a1 move.l ThisRoomToDraw,a0 move.w (a0),d7 adda.w #8,a1 bra finditit nomoretodoatall: move.l (a7)+,a0 bra subroomloop jumpoutofrooms: tst.b DONTDOGUN bne NOGUNLOOK cmp.b #'s',mors beq.s drawslavegun moveq #0,d0 move.b PLR1_GunSelected,d0 moveq #0,d1 move.b PLR1_GunFrame,d1 ; bsr DRAWINGUN bra drawngun drawslavegun moveq #0,d0 move.b PLR2_GunSelected,d0 moveq #0,d1 move.b PLR2_GunFrame,d1 ; bsr DRAWINGUN drawngun: NOGUNLOOK: moveq #0,d1 move.b PLR1_GunFrame,d1 sub.w TempFrames,d1 bgt.s .nn moveq #0,d1 .nn move.b d1,PLR1_GunFrame ble.s .donefire sub.b #1,PLR1_GunFrame .donefire: moveq #0,d1 move.b PLR2_GunFrame,d1 sub.w TempFrames,d1 bgt.s .nn2 moveq #0,d1 .nn2 move.b d2,PLR2_GunFrame ble.s .donefire2 sub.b #1,PLR2_GunFrame .donefire2: tst.b DOANYWATER beq.s nowaterfull move.w #231,d0 move.l FASTBUFFER,a0 tst.b fillscrnwater beq nowaterfull bgt oknothalf moveq #119,d0 add.l #320*120*2,a0 oknothalf: bclr.b #1,$bfe001 move.l #brightentab+512*4,a2 moveq #0,d2 tst.b FULLSCR bne.s DOALLSCREEN DOSOMESCREEN: move.w #159,d0 .fw: move.w #191,d1 .fwa: move.b (a0),d2 move.b (a2,d2.w*2),(a0)+ dbra d1,.fwa add.w #(320-192),a0 dbra d0,.fw rts DOALLSCREEN: fw: move.w #287,d1 fwa: move.b (a0),d2 move.b (a2,d2.w*2),(a0)+ dbra d1,fwa add.w #32,a0 dbra d0,fw ; move.l frompt,a0 ; add.l #104*4*60,a0 ; ; move.w #31,d0 ;fw: ; move.w d5,d1 ; move.l a0,a1 ;fwd: ;val SET 104*4*19 ; REPT 20 ; and.w #$ff,val(a1) ;val SET val-104*4 ; ENDR ; sub.l #104*4*20,a1 ; dbra d1,fwd ; addq #4,a0 ; dbra d0,fw ; ; addq #4,a0 ; ; move.w #31,d0 ;sw: ; move.w d5,d1 ; move.l a0,a1 ;swd: ;val SET 104*4*19 ; REPT 20 ; and.w #$ff,val(a1) ;val SET val-104*4 ; ENDR ; sub.l #104*4*20,a1 ; dbra d1,swd ; addq #4,a0 ; dbra d0,sw ; ; addq #4,a0 ; ; move.w #31,d0 ;tw: ; move.w d5,d1 ; move.l a0,a1 ;twd: ;val SET 104*4*19 ; REPT 20 ; and.w #$ff,val(a1) ;val SET val-104*4 ; ENDR ; sub.l #104*4*20,a1 ; dbra d1,twd ; addq #4,a0 ; dbra d0,tw ; rts nowaterfull: bset.b #1,$bfe001 rts prot9: dc.w 0 ;TempBuffer: ds.l 100 prot8: dc.w 0 ClipTable: ds.l 30 EndOfClipPt: dc.l 0 DOUPPER: dc.w 0 RealTable: dc.l prot1-78935450 dc.l prot2-78935450 dc.l prot3-78935450 dc.l prot4-78935450 dc.l prot5-78935450 dc.l prot6-78935450 dc.l prot7-78935450 dc.l prot8-78935450 dc.l prot9-78935450 dc.l protA-78935450 dothisroom move.w (a0)+,d0 move.w d0,currzone move.w d0,d1 muls #40,d1 add.l #BIGMAP,d1 move.l d1,BIGPTR move.w d0,d1 ext.l d1 asl.w #2,d1 add.l #COMPACTMAP,d1 move.l d1,COMPACTPTR add.l #4,d1 cmp.l LASTZONE,d1 ble.s .nochange move.l d1,LASTZONE .nochange: move.l #ZoneBrightTable,a1 move.l (a1,d0.w*4),d1 tst.b DOUPPER bne.s .okbot swap d1 .okbot: move.w d1,ZoneBright polyloop: move.w (a0)+,d0 move.w d0,WALLIDENT and.w #$ff,d0 tst.b d0 blt jumpoutofloop beq itsawall cmp.w #3,d0 beq itsasetclip blt itsafloor cmp.w #4,d0 beq itsanobject cmp.w #5,d0 beq itsanarc cmp.w #6,d0 beq itsalightbeam cmp.w #7,d0 beq.s itswater cmp.w #9,d0 ble itsachunkyfloor cmp.w #11,d0 ble itsabumpyfloor cmp.w #12,d0 beq.s itsbackdrop cmp.w #13,d0 beq.s itsaseewall bra polyloop itsaseewall: st seethru jsr itsawalldraw bra polyloop itsbackdrop: jsr putinbackdrop bra polyloop itswater: PROTHCHECK move.w #2,SMALLIT move.w #3,d0 clr.b gourfloor move.l #FloorLine,LineToUse st usewater clr.b usebumps jsr itsafloordraw bra polyloop itsanarc: jsr CurveDraw bra polyloop itsanobject: jsr ObjDraw bra polyloop itsalightbeam: jsr LightDraw bra polyloop itsabumpyfloor: move.w #1,SMALLIT sub.w #9,d0 st usebumps st smoothbumps clr.b usewater move.l #BumpLine,LineToUse jsr itsafloordraw bra polyloop itsachunkyfloor: move.w #1,SMALLIT subq.w #7,d0 st usebumps sub.w #12,topclip ; add.w #10,botclip clr.b smoothbumps clr.b usewater move.l #BumpLine,LineToUse jsr itsafloordraw add.w #12,topclip ; sub.w #10,botclip bra polyloop itsafloor: move.l PointBrightsPtr,FloorPtBrights move.w currzone,d1 muls #80,d1 cmp.w #2,d0 bne.s .nfl add.l #2,d1 .nfl add.l d1,FloorPtBrights move.w #1,SMALLIT movem.l a0/d0,-(a7) move.l $4.w,a6 jsr _LVOSuperState(a6) move.l d0,SSTACK movem.l (a7)+,a0/d0 move.l #FloorLine,LineToUse * 1,2 = floor/roof clr.b usewater clr.b usebumps move.b GOURSEL,gourfloor jsr itsafloordraw move.l a0,-(a7) move.l $4.w,a6 move.l SSTACK,d0 jsr _LVOUserState(a6) move.l (a7)+,a0 bra polyloop itsasetclip: bra polyloop itsawall: clr.b seethru ; move.l #stripbuffer,a1 jsr itsawalldraw bra polyloop jumpoutofloop: rts LASTZONE: dc.l 0 COMPACTPTR: dc.l 0 BIGPTR: dc.l 0 WALLIDENT: dc.w 0 SMALLIT: dc.w 0 GOURSEL: dc.w 0 ThisRoomToDraw: dc.l 0,0 SplitHeight: dc.l 0 include "ab3:source_4000/OrderZones" ReadMouse: move.l #$dff000,a6 clr.l d0 clr.l d1 move.w $a(a6),d0 lsr.w #8,d0 ext.l d0 move.w d0,d3 move.w oldmy,d2 sub.w d2,d0 cmp.w #127,d0 blt nonegy move.w #255,d1 sub.w d0,d1 move.w d1,d0 neg.w d0 nonegy: cmp.w #-127,d0 bge nonegy2 move.w #255,d1 add.w d0,d1 move.w d1,d0 nonegy2: add.b d0,d2 add.w d0,oldy2 move.w d2,oldmy move.w d2,d0 move.w oldy2,d0 move.w d0,ymouse clr.l d0 clr.l d1 move.w $a(a6),d0 ext.w d0 ext.l d0 move.w d0,d3 move.w oldmx,d2 sub.w d2,d0 cmp.w #127,d0 blt nonegx move.w #255,d1 sub.w d0,d1 move.w d1,d0 neg.w d0 nonegx: cmp.w #-127,d0 bge nonegx2 move.w #255,d1 add.w d0,d1 move.w d1,d0 nonegx2: add.b d0,d2 move.w d0,d1 move.w d2,oldmx move.w #$0,$dff034 add.w d0,oldx2 move.w oldx2,d0 and.w #2047,d0 move.w d0,oldx2 asl.w #2,d0 sub.w prevx,d0 add.w d0,prevx add.w d0,angpos move.w #0,lrs rts noturn: ; got to move lr instead. ; d1 = speed moved l/r move.w d1,lrs rts lrs: dc.w 0 prevx: dc.w 0 angpos: dc.w 0 mang: dc.w 0 oldymouse: dc.w 0 xmouse: dc.w 0 ymouse: dc.w 0 oldx2: dc.w 0 oldmx: dc.w 0 oldmy: dc.w 0 oldy2: dc.w 0 MAPON: dc.w $0 REALMAPON: dc.w 0 RotateLevelPts: tst.b REALMAPON beq ONLYTHELONELY move.w sinval,d6 swap d6 move.w cosval,d6 move.l Points,a3 move.l #Rotated,a1 move.l #OnScreen,a2 move.w xoff,d4 move.w zoff,d5 ; move.w #$c40,$dff106 ; move.w #$f00,$dff180 move.w NumLevPts,d7 tst.b FULLSCR bne BIGALL pointrotlop2: move.w (a3)+,d0 sub.w d4,d0 move.w d0,d2 move.w (a3)+,d1 sub.w d5,d1 muls d6,d2 swap d6 move.w d1,d3 muls d6,d3 sub.l d3,d2 add.l d2,d2 swap d2 ext.l d2 asl.l #7,d2 add.l xwobble,d2 move.l d2,(a1)+ muls d6,d0 swap d6 muls d6,d1 add.l d0,d1 asl.l #1,d1 swap d1 ; ext.l d1 ; divs #3,d1 move.l d1,(a1)+ tst.w d1 bgt.s ptnotbehind tst.w d2 bgt.s onrightsomewhere move.w #0,d2 bra putin onrightsomewhere: move.w RIGHTX,d2 bra putin ptnotbehind: divs d1,d2 add.w MIDDLEX,d2 putin: move.w d2,(a2)+ dbra d7,pointrotlop2 outofpointrot: rts BIGALL: pointrotlop2B: move.w (a3)+,d0 sub.w d4,d0 move.w d0,d2 move.w (a3)+,d1 sub.w d5,d1 muls d6,d2 swap d6 move.w d1,d3 muls d6,d3 sub.l d3,d2 add.l d2,d2 swap d2 ext.l d2 asl.l #7,d2 add.l xwobble,d2 move.l d2,(a1)+ muls d6,d0 swap d6 muls d6,d1 add.l d0,d1 asl.l #2,d1 swap d1 ext.l d1 divs #3,d1 move.l d1,(a1)+ tst.w d1 bgt.s ptnotbehindB tst.w d2 bgt.s onrightsomewhereB move.w #0,d2 bra putinB onrightsomewhereB: move.w RIGHTX,d2 bra putinB ptnotbehindB: divs d1,d2 add.w MIDDLEX,d2 putinB: move.w d2,(a2)+ dbra d7,pointrotlop2B rts ONLYTHELONELY: move.w sinval,d6 swap d6 move.w cosval,d6 move.l PointsToRotatePtr,a0 move.l Points,a3 move.l #Rotated,a1 move.l #OnScreen,a2 move.w xoff,d4 move.w zoff,d5 ; move.w #$c40,$dff106 ; move.w #$f00,$dff180 tst.b FULLSCR bne BIGLONELY pointrotlop: move.w (a0)+,d7 blt outofpointrot move.w (a3,d7*4),d0 sub.w d4,d0 move.w d0,d2 move.w 2(a3,d7*4),d1 sub.w d5,d1 muls d6,d2 swap d6 move.w d1,d3 muls d6,d3 sub.l d3,d2 add.l d2,d2 swap d2 ext.l d2 asl.l #7,d2 add.l xwobble,d2 move.l d2,(a1,d7*8) muls d6,d0 swap d6 muls d6,d1 add.l d0,d1 asl.l #1,d1 swap d1 ; ext.l d1 ; divs #3,d1 move.l d1,4(a1,d7*8) tst.w d1 bgt.s .ptnotbehind tst.w d2 bgt.s .onrightsomewhere move.w #0,d2 bra .putin .onrightsomewhere: move.w RIGHTX,d2 bra .putin .ptnotbehind: divs d1,d2 add.w MIDDLEX,d2 .putin: move.w d2,(a2,d7*2) bra pointrotlop ; move.w #$c40,$dff106 ; move.w #$ff0,$dff180 rts BIGLONELY: .pointrotlop: move.w (a0)+,d7 blt.s .outofpointrot move.w (a3,d7*4),d0 sub.w d4,d0 move.w d0,d2 move.w 2(a3,d7*4),d1 sub.w d5,d1 muls d6,d2 swap d6 move.w d1,d3 muls d6,d3 sub.l d3,d2 add.l d2,d2 swap d2 ext.l d2 asl.l #7,d2 add.l xwobble,d2 move.l d2,(a1,d7*8) muls d6,d0 swap d6 muls d6,d1 add.l d0,d1 asl.l #2,d1 swap d1 ext.l d1 divs #3,d1 move.l d1,4(a1,d7*8) tst.w d1 bgt.s .ptnotbehind tst.w d2 bgt.s .onrightsomewhere move.w #0,d2 bra .putin .onrightsomewhere: move.w RIGHTX,d2 bra .putin .ptnotbehind: divs d1,d2 add.w MIDDLEX,d2 .putin: move.w d2,(a2,d7*2) bra .pointrotlop .outofpointrot: ; move.w #$c40,$dff106 ; move.w #$ff0,$dff180 rts PLR1_ObjDists ds.w 250 PLR2_ObjDists ds.w 250 CalcPLR1InLine: move.w PLR1_sinval,d5 move.w PLR1_cosval,d6 move.l ObjectData,a4 move.l ObjectPoints,a0 move.w NumObjectPoints,d7 move.l #PLR1_ObsInLine,a2 move.l #PLR1_ObjDists,a3 .objpointrotlop: cmp.b #3,16(a4) beq.s .itaux move.w (a0),d0 sub.w PLR1_xoff,d0 move.w 4(a0),d1 addq #8,a0 tst.w 12(a4) blt .noworkout moveq #0,d2 move.b 16(a4),d2 ;move.l #ColBoxTable,a6 ;lea (a6,d2.w*8),a6 sub.w PLR1_zoff,d1 move.w d0,d2 muls d6,d2 move.w d1,d3 muls d5,d3 sub.l d3,d2 add.l d2,d2 bgt.s .okh neg.l d2 .okh: swap d2 muls d5,d0 muls d6,d1 add.l d0,d1 asl.l #2,d1 swap d1 moveq #0,d3 tst.w d1 ble.s .notinline asr.w #1,d2 cmp.w #80,d2 bgt.s .notinline st d3 .notinline move.b d3,(a2)+ move.w d1,(a3)+ add.w #64,a4 dbra d7,.objpointrotlop rts .itaux: add.w #64,a4 bra .objpointrotlop .noworkout: move.b #0,(a2)+ move.w #0,(a3)+ add.w #64,a4 dbra d7,.objpointrotlop rts CalcPLR2InLine: move.w PLR2_sinval,d5 move.w PLR2_cosval,d6 move.l ObjectData,a4 move.l ObjectPoints,a0 move.w NumObjectPoints,d7 move.l #PLR2_ObsInLine,a2 move.l #PLR2_ObjDists,a3 .objpointrotlop: cmp.b #3,16(a4) beq.s .itaux move.w (a0),d0 sub.w PLR2_xoff,d0 move.w 4(a0),d1 addq #8,a0 tst.w 12(a4) blt .noworkout moveq #0,d2 move.b 16(a4),d2 ; move.l #ColBoxTable,a6 ; lea (a6,d2.w*8),a6 sub.w PLR2_zoff,d1 move.w d0,d2 muls d6,d2 move.w d1,d3 muls d5,d3 sub.l d3,d2 add.l d2,d2 bgt.s .okh neg.l d2 .okh: swap d2 muls d5,d0 muls d6,d1 add.l d0,d1 asl.l #2,d1 swap d1 moveq #0,d3 tst.w d1 ble.s .notinline asr.w #1,d2 cmp.w (a6),d2 bgt.s .notinline st d3 .notinline move.b d3,(a2)+ move.w d1,(a3)+ add.w #64,a4 dbra d7,.objpointrotlop rts .itaux: add.w #64,a4 bra .objpointrotlop .noworkout: move.w #0,(a3)+ move.b #0,(a2)+ add.w #64,a4 dbra d7,.objpointrotlop rts RotateObjectPts: move.w sinval,d5 move.w cosval,d6 move.l ObjectData,a4 move.l ObjectPoints,a0 move.w NumObjectPoints,d7 move.l #ObjRotated,a1 tst.b FULLSCR bne BIGOBJPTS .objpointrotlop: cmp.b #3,16(a4) beq.s .itaux move.w (a0),d0 sub.w xoff,d0 move.w 4(a0),d1 addq #8,a0 tst.w 12(a4) blt .noworkout sub.w zoff,d1 move.w d0,d2 muls d6,d2 move.w d1,d3 muls d5,d3 sub.l d3,d2 add.l d2,d2 swap d2 move.w d2,(a1)+ muls d5,d0 muls d6,d1 add.l d0,d1 asl.l #1,d1 swap d1 ; ext.l d1 ; divs #3,d1 moveq #0,d3 move.w d1,(a1)+ ext.l d2 asl.l #7,d2 add.l xwobble,d2 move.l d2,(a1)+ dbra d7,.objpointrotlop rts .itaux: add.w #64,a4 bra .objpointrotlop .noworkout: move.l #0,(a1)+ move.l #0,(a1)+ add.w #64,a4 dbra d7,.objpointrotlop rts BIGOBJPTS: .objpointrotlop: cmp.b #3,16(a4) beq.s .itaux move.w (a0),d0 sub.w xoff,d0 move.w 4(a0),d1 addq #8,a0 tst.w 12(a4) blt .noworkout sub.w zoff,d1 move.w d0,d2 muls d6,d2 move.w d1,d3 muls d5,d3 sub.l d3,d2 add.l d2,d2 swap d2 move.w d2,(a1)+ muls d5,d0 muls d6,d1 add.l d0,d1 asl.l #2,d1 swap d1 ext.l d1 divs #3,d1 moveq #0,d3 move.w d1,(a1)+ ext.l d2 asl.l #7,d2 add.l xwobble,d2 move.l d2,(a1)+ sub.l xwobble,d2 add.w #64,a4 dbra d7,.objpointrotlop rts .itaux: add.w #64,a4 bra .objpointrotlop .noworkout: move.l #0,(a1)+ move.l #0,(a1)+ add.w #64,a4 dbra d7,.objpointrotlop rts LightDraw: move.w (a0)+,d0 move.w (a0)+,d1 move.l #Rotated,a1 move.w 6(a1,d0.w*8),d2 ble.s oneendbehind move.w 6(a1,d1.w*8),d3 bgt.s bothendsinfront oneendbehind: rts bothendsinfront: move.l #OnScreen,a2 move.w (a2,d0.w*2),d0 bge.s okleftend moveq #0,d0 okleftend: move.w (a2,d1.w*2),d1 bgt.s somevis rts somevis: cmp.w RIGHTX,d0 blt.s somevis2 rts somevis2: cmp.w RIGHTX,d1 blt.s okrightend move.w RIGHTX,d1 subq #1,d1 okrightend: sub.w d0,d1 blt.s wrongbloodywayround move.l #brightentab,a4 move.l #objintocop,a1 lea (a1,d0.w*2),a1 move.l frompt,a3 move.w #104*4,d6 move.w #79,d2 lacross: move.w d2,d3 move.l a3,a2 adda.w (a1)+,a2 ldown: add.w d6,a2 move.w (a2),d7 move.w (a4,d7.w*2),(a2) dbra d3,ldown dbra d1,lacross wrongbloodywayround: rts FaceToPlace: dc.w 0 Cheese: dc.w 4,15 FacesList: dc.w 0,4*4 dc.w 1,2*4 dc.w 0,2*4 dc.w 2,2*4 dc.w 0,2*4 dc.w 1,3*4 dc.w 0,2*4 dc.w 2,3*4 dc.w 0,5*4 dc.w 1,2*4 dc.w 0,2*4 dc.w 2,2*4 dc.w 0,2*4 dc.w 1,2*4 dc.w 0,2*4 dc.w 2,3*4 dc.w 0,1*4 dc.w 1,3*4 dc.w 0,1*4 dc.w 2,3*4 dc.w 0,1*4 EndOfFacesList: FacesPtr: dc.l FacesList FacesCounter: dc.w 0 Expression: dc.w 0 Energy: dc.w 191 OldEnergy: dc.w 191 Ammo: dc.w 63 OldAmmo: dc.w 63 FullEnergy: ; move.w #127,Energy ; move.w #127,OldEnergy ; move.l #health,a0 ; move.l #borders,a1 ; add.l #25*8*2+6,a1 ; lea 2592(a1),a2 ; move.w #127,d0 ;PutInFull: ; move.b (a0)+,(a1) ; move.b (a0)+,8(a1) ; add.w #16,a1 ; move.b (a0)+,(a2) ; move.b (a0)+,8(a2) ; add.w #16,a2 ; dbra d0,PutInFull rts ;EnergyBar: move.w Energy,d0 bgt.s .noeneg move.w #0,d0 .noeneg: move.w d0,Energy cmp.w OldEnergy,d0 bne.s gottochange NoChange rts gottochange: blt LessEnergy cmp.w #127,Energy blt.s NotMax move.w #127,Energy NotMax: move.w Energy,d0 move.w OldEnergy,d2 sub.w d0,d2 beq.s NoChange neg.w d2 move.w #127,d3 sub.w d0,d3 move.l #health,a0 lea (a0,d3.w*4),a0 ; move.l #borders+25*16+6,a1 lsl.w #4,d3 add.w d3,a1 lea 2592(a1),a2 EnergyRise: move.b (a0)+,(a1) move.b (a0)+,8(a1) add.w #16,a1 move.b (a0)+,(a2) move.b (a0)+,8(a2) add.w #16,a2 subq #1,d2 bgt.s EnergyRise move.w Energy,OldEnergy rts LessEnergy: move.w OldEnergy,d2 sub.w d0,d2 move.w #127,d3 sub.w OldEnergy,d3 ; move.l #borders+25*16+6,a1 asl.w #4,d3 add.w d3,a1 lea 2592(a1),a2 EnergyDrain: move.b #0,(a1) move.b #0,8(a1) move.b #0,(a2) move.b #0,8(a2) add.w #16,a1 add.w #16,a2 subq #1,d2 bgt.s EnergyDrain move.w Energy,OldEnergy rts firstdigit: dc.b 0 secdigit: dc.b 0 thirddigit: dc.b 0 even gunny: dc.w 0 AmmoBar: * Do guns first. move.l #borderchars,a4 move.b p1_gunselected,d0 move.l #PLAYERONEGUNS,a5 cmp.b #'s',mors bne.s .notplr2 move.l #PLAYERTWOGUNS,a5 move.b p2_gunselected,d0 .notplr2: move.b d0,gunny move.w #9,d2 moveq #0,d0 putingunnums: move.w #4,d1 move.l a4,a0 cmp.b gunny,d0 bne.s .notsel add.l #5*10*8*2,a0 addq #2,a5 bra.s .donesel .notsel: tst.w (a5)+ beq.s .donesel add.l #5*10*8,a0 .donesel: move.l SCRNDRAWPT,a1 add.w d0,a1 add.l #3+(240*40),a1 bsr DRAWDIGIT addq #1,d0 dbra d2,putingunnums move.w Ammo,d0 ext.l d0 divs #10,d0 swap d0 move.b d0,thirddigit swap d0 ext.l d0 divs #10,d0 move.b d0,firstdigit swap d0 move.b d0,secdigit move.l #borderchars+15*8*10,a0 cmp.w #10,Ammo blt.s .notsmallamo add.l #7*8*10,a0 .notsmallamo: move.l SCRNDRAWPT,a1 add.l #20+238*40,a1 move.b firstdigit,d0 move.w #6,d1 bsr DRAWDIGIT move.l SCRNDRAWPT,a1 add.l #21+238*40,a1 move.b secdigit,d0 move.w #6,d1 bsr DRAWDIGIT move.l SCRNDRAWPT,a1 add.l #22+238*40,a1 move.b thirddigit,d0 move.w #6,d1 bsr DRAWDIGIT rts EnergyBar: move.w Energy,d0 bge.s .okpo moveq #0,d0 .okpo: ext.l d0 divs #10,d0 swap d0 move.b d0,thirddigit swap d0 ext.l d0 divs #10,d0 move.b d0,firstdigit swap d0 move.b d0,secdigit move.l #borderchars+15*8*10,a0 cmp.w #10,Energy blt.s .notsmallamo add.l #7*8*10,a0 .notsmallamo: move.l SCRNDRAWPT,a1 add.l #34+238*40,a1 move.b firstdigit,d0 move.w #6,d1 bsr DRAWDIGIT move.l SCRNDRAWPT,a1 add.l #35+238*40,a1 move.b secdigit,d0 move.w #6,d1 bsr DRAWDIGIT move.l SCRNDRAWPT,a1 add.l #36+238*40,a1 move.b thirddigit,d0 move.w #6,d1 bsr DRAWDIGIT move.l SCRNSHOWPT,a1 add.l #34+238*40,a1 move.b firstdigit,d0 move.w #6,d1 bsr DRAWDIGIT move.l SCRNSHOWPT,a1 add.l #35+238*40,a1 move.b secdigit,d0 move.w #6,d1 bsr DRAWDIGIT move.l SCRNSHOWPT,a1 add.l #36+238*40,a1 move.b thirddigit,d0 move.w #6,d1 bsr DRAWDIGIT rts DRAWDIGIT: ext.w d0 lea (a0,d0.w),a2 charlines: lea 30720(a1),a3 move.b (a2),(a1) move.b 10(a2),10240(a1) move.b 20(a2),20480(a1) move.b 30(a2),(a3) move.b 40(a2),10240(a3) move.b 50(a2),20480(a3) lea 30720(a3),a3 move.b 60(a2),(a3) move.b 70(a2),10240(a3) add.w #10*8,a2 add.w #40,a1 dbra d1,charlines rts borderchars: incbin "ab3:includes/bordercharsRAW" NARRATOR: ; sub.w #1,NARRTIME ; bge .NOCHARYET ; move.w #3,NARRTIME move.l #SCROLLSCRN,d1 move.w d1,scroll swap d1 move.w d1,scrolh move.w SCROLLTIMER,d0 subq #1,d0 move.w d0,SCROLLTIMER cmp.w #40,d0 bge .NOCHARYET tst.w d0 bge.s .okcha move.w #150,SCROLLTIMER bra .NOCHARYET .okcha: move.l #SCROLLSCRN,a0 add.w SCROLLXPOS,a0 moveq #1,d7 .doachar: move.l SCROLLPOINTER,a1 moveq #0,d1 move.b (a1)+,d1 ; character move.l a1,d2 cmp.l ENDSCROLL,d2 blt.s .notrestartscroll move.l #BLANKSCROLL,a1 move.l #BLANKSCROLL+80,ENDSCROLL .notrestartscroll move.l a1,SCROLLPOINTER move.l #SCROLLCHARS,a1 asl.w #3,d1 add.w d1,a1 move.b (a1)+,(a0) move.b (a1)+,80(a0) move.b (a1)+,80*2(a0) move.b (a1)+,80*3(a0) move.b (a1)+,80*4(a0) move.b (a1)+,80*5(a0) move.b (a1)+,80*6(a0) move.b (a1)+,80*7(a0) addq #1,a0 dbra d7,.doachar move.w SCROLLXPOS,d0 addq #2,d0 move.w d0,SCROLLXPOS cmp.w #80,d0 blt .NOCHARYET move.w #0,SCROLLXPOS .NOCHARYET: rts ; cmp.w OldAmmo,d0 ; bne.s .gottochange ; NARRTIME: dc.w 5 SCROLLCHARS: incbin "ab3:includes/scrollfont" .NoChange rts .gottochange: blt LessAmmo cmp.w #63,Ammo blt.s .NotMax move.w #63,Ammo .NotMax: move.w Ammo,d0 move.w OldAmmo,d2 sub.w d0,d2 beq.s .NoChange neg.w d2 move.w #63,d3 sub.w d0,d3 move.l #Ammunition,a0 lea (a0,d3.w*8),a0 ; move.l #borders+5184+25*16+1,a1 lsl.w #5,d3 add.w d3,a1 lea 2592(a1),a2 AmmoRise: move.b (a0)+,(a1) move.b (a0)+,8(a1) add.w #16,a1 move.b (a0)+,(a2) move.b (a0)+,8(a2) add.w #16,a2 move.b (a0)+,(a1) move.b (a0)+,8(a1) add.w #16,a1 move.b (a0)+,(a2) move.b (a0)+,8(a2) add.w #16,a2 subq #1,d2 bgt.s AmmoRise move.w Ammo,OldAmmo rts LessAmmo: move.w OldAmmo,d2 sub.w d0,d2 move.w #63,d3 sub.w OldAmmo,d3 ; move.l #borders++5184+25*16+1,a1 asl.w #5,d3 add.w d3,a1 lea 2592(a1),a2 AmmoDrain: move.b #0,(a1) move.b #0,8(a1) move.b #0,(a2) move.b #0,8(a2) add.w #16,a1 add.w #16,a2 move.b #0,(a1) move.b #0,8(a1) move.b #0,(a2) move.b #0,8(a2) add.w #16,a1 add.w #16,a2 subq #1,d2 bgt.s AmmoDrain move.w Ammo,OldAmmo rts nulop: move.w #$0010,$dff000+intreq rte doanything: dc.w 0 end: ; _break #0 move.l #$dff000,a6 move.w #$f,$dff000+dmacon waitfortop22: btst.b #0,intreqrl(a6) beq waitfortop22 waitfortop222: btst.b #0,intreqrl(a6) beq waitfortop222 clr.b dosounds clr.b doanything move.w PLAYERONEHEALTH,Energy cmp.b #'s',mors bne.s .notsl move.w PLAYERTWOHEALTH,Energy .notsl: move.l drawpt,d0 move.l olddrawpt,drawpt move.l d0,olddrawpt ; cmp.b #'b',Prefsfile+3 ; bne.s .noback ; jsr mt_end ;.noback tst.w Energy bgt.s wevewon move.w #0,Energy bsr EnergyBar move.l #gameover,mt_data st UseAllChannels clr.b reachedend jsr mt_init playgameover: move.l #$dff000,a6 waitfortop2: btst.b #0,intreqrl(a6) beq waitfortop2 move.w #$1,intreq(a6) jsr mt_music tst.b reachedend beq.s playgameover bra wevelost wevewon: bsr EnergyBar cmp.b #'n',mors bne.s .nonextlev add.w #1,MAXLEVEL st FINISHEDLEVEL .nonextlev: move.l #welldone,mt_data st UseAllChannels clr.b reachedend jsr mt_init playwelldone: move.l #$dff000,a6 waitfortop3: btst.b #0,intreqrl(a6) beq waitfortop3 move.w #$1,intreq(a6) jsr mt_music tst.b reachedend beq.s playwelldone wevelost: PROTICHECK a0 jmp closeeverything endnomusic clr.b doanything ; cmp.b #'b',Prefsfile+3 ; bne.s .noback ; jsr mt_end ;.noback ******************************* ; cmp.b #'n',mors ; bne.s .nonextlev ; cmp.w #15,MAXLEVEL ; bge.s .nonextlev ; add.w #1,MAXLEVEL ; st FINISHEDLEVEL ;.nonextlev: ****************************** jmp closeeverything do32: move.w #31,d7 move.w #$180,d1 across: move.w d1,(a1)+ move.w d1,(a3)+ move.w #0,(a1)+ move.w #0,(a3)+ add.w #2,d1 dbra d7,across rts string: dc.b 'credits',0 ENDGAMESCROLL: move.l 4.w,a6 move.l #string,d1 moveq #0,d2 moveq #0,d3 jsr _LVOExecute(a6) ; include "endscroll.s" *********************************** include "ab3:source_4000/CD32JOY" ************************************* * Set left and right clip values ************************************* NEWsetlclip: move.l #OnScreen,a1 move.l #Rotated,a2 move.l CONNECT_TABLE,a3 move.l Points,a4 move.w (a0),d0 bge.s .notignoreleft ; move.l #0,(a6) bra .leftnotoktoclip .notignoreleft: move.w 6(a2,d0*8),d3 ; left z val bgt.s .leftclipinfront addq #2,a0 rts tst.w 6(a2,d0*8) bgt.s .leftnotoktoclip .ignoreboth: ; move.l #0,(a6) ; move.l #96*65536,4(a6) move.w #0,leftclip move.w RIGHTX,rightclip addq #8,a6 addq #2,a0 rts .leftclipinfront: move.w (a1,d0*2),d1 ; left x on screen move.w (a0),d2 move.w 2(a3,d2.w*4),d2 move.w (a1,d2.w*2),d2 cmp.w d1,d2 bgt.s .leftnotoktoclip ************************************* move.w 2(a3,d0.w*4),d6 move.w (a4,d0.w*4),d2 move.w 2(a4,d0.w*4),d3 move.w (a4,d6.w*4),d4 move.w 2(a4,d6.w*4),d5 sub.w d2,d4 ;dx sub.w d3,d5 ;dz move.w xoff,d0 move.w zoff,d6 sub.w d2,d0 sub.w d3,d6 muls d0,d4 muls d6,d5 add.l d4,d5 bge.s .leftnotoktoclip ************************************* ; move.w d1,(a6) ; move.w d3,2(a6) cmp.w leftclip,d1 ble.s .leftnotoktoclip move.w d1,leftclip .leftnotoktoclip: addq #2,a0 rts NEWsetrclip move.l #OnScreen,a1 move.l #Rotated,a2 move.l CONNECT_TABLE,a3 move.w (a0),d0 bge.s .notignoreright ; move.w #96,4(a6) ; move.w #0,6(a6) move.w #0,d4 bra .rightnotoktoclip .notignoreright: move.w 6(a2,d0*8),d4 ; right z val bgt.s .rightclipinfront ; move.w #96,4(a6) ; move.w #0,6(a6) bra.s .rightnotoktoclip .rightclipinfront: move.w (a1,d0*2),d1 ; right x on screen move.w (a0),d2 move.w (a3,d2.w*4),d2 move.w (a1,d2.w*2),d2 cmp.w d1,d2 blt.s .rightnotoktoclip ; move.w d1,4(a6) ; move.w d4,6(a6) ************************************* move.w (a3,d0.w*4),d6 move.w (a4,d0.w*4),d2 move.w 2(a4,d0.w*4),d3 move.w (a4,d6.w*4),d4 move.w 2(a4,d6.w*4),d5 sub.w d2,d4 ;dx sub.w d3,d5 ;dz move.w xoff,d0 move.w zoff,d6 sub.w d2,d0 sub.w d3,d6 muls d0,d4 muls d6,d5 add.l d4,d5 ble.s .rightnotoktoclip ************************************* cmp.w rightclip,d1 bge.s .rightnotoktoclip addq #1,d1 move.w d1,rightclip .rightnotoktoclip: addq #8,a6 addq #2,a0 rts FIRSTsetlrclip: move.l #OnScreen,a1 move.l #Rotated,a2 move.w (a0)+,d0 bge.s .notignoreleft bra .leftnotoktoclip .notignoreleft: move.w 6(a2,d0*8),d3 ; left z val bgt.s .leftclipinfront move.w (a0),d0 blt.s .ignoreboth tst.w 6(a2,d0*8) bgt.s .leftnotoktoclip .ignoreboth move.w RIGHTX,rightclip move.w #0,leftclip addq #2,a0 rts .leftclipinfront: move.w (a1,d0*2),d1 ; left x on screen cmp.w leftclip,d1 ble.s .leftnotoktoclip move.w d1,leftclip .leftnotoktoclip: move.w (a0)+,d0 bge.s .notignoreright move.w #0,d4 bra .rightnotoktoclip .notignoreright: move.w 6(a2,d0*8),d4 ; right z val ble.s .rightnotoktoclip .rightclipinfront: move.w (a1,d0*2),d1 ; right x on screen addq #1,d1 cmp.w rightclip,d1 bge.s .rightnotoktoclip move.w d1,rightclip .rightnotoktoclip: ; move.w leftclip,d0 ; move.w rightclip,d1 ; cmp.w d0,d1 ; bge.s .noswap ; move.w #192,rightclip ; move.w #0,leftclip ;.noswap: rts leftclip2: dc.w 0 rightclip2: dc.w 0 ZoneBright: dc.w 0 npolys: dc.w 0 PLR1_fire: dc.b 0 PLR2_fire: dc.b 0 ***************************************************** pastdata: *********************************** * This routine animates brightnesses. liftpt: dc.l liftanimtab brightpt: dc.l brightanimtab liftanim: rts ****************************** include "ab3:source_4000/ObjectMove" include "ab3:source_4000/newAnims" include "ab3:source_4000/airoutine.s" ****************************** startpass: ; include "ab3:source_4000/password_reloc.s" endpass: rotanimpt: dc.w 0 xradd: dc.w 5 yradd: dc.w 8 xrpos: dc.w 320 yrpos: dc.w 320 rotanim: rts option: dc.l 0,0 ********** WALL STUFF ******************************* include "AB3:source_4000/hireswall.s" include "AB3:source_4000/hiresgourwall.s" ***************************************************** ****************************************** * floor polygon numsidestd: dc.w 0 bottomline: dc.w 0 checkforwater: tst.b usewater beq.s .notwater move.l Roompt,a1 move.w (a1),d7 cmp.w currzone,d7 bne.s .notwater move.b #$f,fillscrnwater .notwater: move.w (a0)+,d6 ; sides-1 add.w d6,d6 add.w d6,a0 add.w #4+6,a0 rts rts ;NewCornerBuff: ; ds.l 100 CLRNOFLOOR: dc.w 0 itsafloordraw: * If D0 =1 then its a floor otherwise (=2) it's * a roof. move.w #0,above move.w (a0)+,d6 ; ypos of poly tst.b usewater beq.s .oknon tst.b DOANYWATER beq dontdrawreturn .oknon move.w d6,d7 ext.l d7 asl.l #6,d7 cmp.l TOPOFROOM,d7 blt checkforwater cmp.l BOTOFROOM,d7 bgt.s dontdrawreturn move.w leftclip,d7 cmp.w rightclip,d7 bge.s dontdrawreturn sub.w flooryoff,d6 bgt.s below blt.s aboveplayer tst.b usewater beq.s .notwater move.l Roompt,a1 move.w (a1),d7 cmp.w currzone,d7 bne.s .notwater st fillscrnwater .notwater: dontdrawreturn: move.w (a0)+,d6 ; sides-1 add.w d6,d6 add.w d6,a0 add.w #4+6,a0 rts aboveplayer: tst.b usewater beq.s .notwater move.l Roompt,a1 move.w (a1),d7 cmp.w currzone,d7 bne.s .notwater move.b #$f,fillscrnwater .notwater: btst #1,d0 beq.s dontdrawreturn move.w MIDDLEY,d7 sub.w topclip,d7 ble.s dontdrawreturn move.w #1,d0 move.w d0,above neg.w d6 bra.s notbelow below: move.w botclip,d7 sub.w MIDDLEY,d7 ble.s dontdrawreturn notbelow: btst #0,d0 beq.s dontdrawreturn move.w d6,distaddr muls #64,d6 move.l d6,ypos ext.l d7 divs.l d7,d6 ; zpos of bottom ; visible line beq dontdrawreturn cmp.l #32767,d6 bgt dontdrawreturn move.w d6,minz move.w d7,bottomline ; Go round each point finding out ; if it should be visible or not. move.l a0,-(a7) move.w (a0)+,d7 ; number of sides move.l #Rotated,a1 move.l #OnScreen,a2 ; move.l #NewCornerBuff,a3 moveq #0,d4 moveq #0,d5 moveq #0,d6 clr.b anyclipping cornerprocessloop: move.w (a0)+,d0 and.w #$fff,d0 move.w 6(a1,d0.w*8),d1 ble .canttell move.w (a2,d0.w*2),d3 cmp.w leftclip,d3 bgt.s .nol st d4 st anyclipping bra.s .nos .nol: cmp.w rightclip,d3 blt.s .nor st d6 st anyclipping bra.s .nos .nor: st d5 .nos: bra .cantell .canttell: st d5 st anyclipping .cantell: dbra d7,cornerprocessloop move.l (a7)+,a0 tst.b d5 bne.s somefloortodraw eor.b d4,d6 bne dontdrawreturn somefloortodraw: tst.b gourfloor bne goursides move.w #300,top move.w #-1,bottom move.w #0,drawit move.l #Rotated,a1 move.l #OnScreen,a2 move.w (a0)+,d7 ; no of sides sideloop: move.w minz,d6 move.w (a0)+,d1 move.w (a0),d3 and.w #$fff,d1 and.w #$fff,d3 move.w 6(a1,d1*8),d4 ;first z cmp.w d6,d4 bgt firstinfront move.w 6(a1,d3*8),d5 ; sec z cmp.w d6,d5 ble bothbehind ** line must be on left and partially behind. sub.w d5,d4 move.l (a1,d1*8),d0 sub.l (a1,d3*8),d0 asr.l #7,d0 sub.w d5,d6 muls d6,d0 ; new x coord divs d4,d0 ext.l d0 asl.l #7,d0 add.l (a1,d3*8),d0 move.w minz,d4 move.w (a2,d3*2),d2 divs d4,d0 add.w MIDDLEX,d0 move.l ypos,d3 divs d5,d3 move.w bottomline,d1 bra lineclipped firstinfront: move.w 6(a1,d3*8),d5 ; sec z cmp.w d6,d5 bgt bothinfront ** line must be on right and partially behind. sub.w d4,d5 ; dz move.l (a1,d3*8),d2 sub.l (a1,d1*8),d2 ; dx sub.w d4,d6 asr.l #7,d2 muls d6,d2 ; new x coord divs d5,d2 ext.l d2 asl.l #7,d2 add.l (a1,d1*8),d2 move.w minz,d5 move.w (a2,d1*2),d0 divs d5,d2 add.w MIDDLEX,d2 move.l ypos,d1 divs d4,d1 move.w bottomline,d3 bra lineclipped bothinfront: * Also, usefully enough, both are on-screen * so no bottom clipping is needed. move.w (a2,d1*2),d0 ; first x move.w (a2,d3*2),d2 ; second x move.l ypos,d1 move.l d1,d3 divs d4,d1 ; first y divs d5,d3 ; second y lineclipped: move.l #rightsidetab,a3 cmp.w d1,d3 beq lineflat st drawit bgt lineonright move.l #leftsidetab,a3 exg d1,d3 exg d0,d2 lea (a3,d1*2),a3 cmp.w top(pc),d1 bge.s .nonewtop move.w d1,top .nonewtop: cmp.w bottom(pc),d3 ble.s .nonewbot move.w d3,bottom .nonewbot: sub.w d1,d3 ; dy sub.w d0,d2 ; dx blt .linegoingleft ext.l d2 divs d3,d2 move.w d2,d6 swap d2 ; moveq #0,d6 ; sub.w d3,d2 ; blt.s .noco ;.makeco ; addq #1,d6 ; sub.w d3,d2 ; bge.s .makeco ;.noco ; add.w d3,d2 move.w d3,d4 move.w d3,d5 subq #1,d5 move.w d6,d1 addq #1,d1 .pixlopright: move.w d0,(a3)+ sub.w d2,d4 bge.s .nobigstep add.w d1,d0 add.w d3,d4 dbra d5,.pixlopright bra lineflat .nobigstep add.w d6,d0 dbra d5,.pixlopright bra lineflat .linegoingleft: neg.w d2 ext.l d2 divs d3,d2 move.w d2,d6 swap d2 ; moveq #0,d6 ; sub.w d3,d2 ; blt.s .nocol ;.makecol ; addq #1,d6 ; sub.w d3,d2 ; bge.s .makecol ;.nocol ; add.w d3,d2 move.w d3,d4 move.w d3,d5 subq #1,d5 move.w d6,d1 addq #1,d1 .pixlopleft: sub.w d2,d4 bge.s .nobigstepl sub.w d1,d0 add.w d3,d4 move.w d0,(a3)+ dbra d5,.pixlopleft bra lineflat .nobigstepl sub.w d6,d0 move.w d0,(a3)+ dbra d5,.pixlopleft bra lineflat lineonright: lea (a3,d1*2),a3 cmp.w top(pc),d1 bge.s .nonewtop move.w d1,top .nonewtop: cmp.w bottom(pc),d3 ble.s .nonewbot move.w d3,bottom .nonewbot: sub.w d1,d3 ; dy sub.w d0,d2 ; dx blt .linegoingleft ; addq #1,d0 ext.l d2 divs d3,d2 move.w d2,d6 swap d2 ; moveq #0,d6 ; sub.w d3,d2 ; blt.s .noco ;.makeco ; addq #1,d6 ; sub.w d3,d2 ; bge.s .makeco ;.noco ; add.w d3,d2 move.w d3,d4 move.w d3,d5 subq #1,d5 move.w d6,d1 addq #1,d1 .pixlopright: sub.w d2,d4 bge.s .nobigstep add.w d1,d0 add.w d3,d4 move.w d0,(a3)+ dbra d5,.pixlopright bra lineflat .nobigstep add.w d6,d0 move.w d0,(a3)+ dbra d5,.pixlopright bra lineflat .linegoingleft: ; addq #1,d0 neg.w d2 ext.l d2 divs d3,d2 move.w d2,d6 swap d2 ; moveq #0,d6 ; sub.w d3,d2 ; blt.s .nocol ;.makecol ; addq #1,d6 ; sub.w d3,d2 ; bge.s .makecol ;.nocol ; add.w d3,d2 move.w d3,d4 move.w d3,d5 subq #1,d5 move.w d6,d1 addq #1,d1 .pixlopleft: move.w d0,(a3)+ sub.w d2,d4 bge.s .nobigstepl sub.w d1,d0 add.w d3,d4 dbra d5,.pixlopleft bra lineflat .nobigstepl sub.w d6,d0 dbra d5,.pixlopleft lineflat: bothbehind: dbra d7,sideloop bra pastsides fbr: dc.w 0 sbr: dc.w 0 FloorPtBrights: dc.l 0 goursides: move.w #300,top move.w #-1,bottom move.w #0,drawit move.l #Rotated,a1 move.l #OnScreen,a2 move.w (a0)+,d7 ; no of sides sideloopGOUR: move.w minz,d6 move.w (a0)+,d1 move.w (a0),d3 move.w d1,d4 move.w d3,d5 and.w #$0fff,d1 and.w #$0fff,d3 rol.w #4,d4 rol.w #4,d5 and.w #$f,d4 and.w #$f,d5 move.l FloorPtBrights,a4 move.w (a4,d4.w*8),d4 bge.s .okpos1 neg.w d4 .okpos1: sub.w #300,d4 move.w d4,fbr move.w (a4,d5.w*8),d4 bge.s .okpos2 neg.w d4 .okpos2: sub.w #300,d4 move.w d4,sbr move.w 6(a1,d1*8),d4 ;first z cmp.w d6,d4 bgt firstinfrontGOUR move.w 6(a1,d3*8),d5 ; sec z cmp.w d6,d5 ble bothbehindGOUR ** line must be on left and partially behind. sub.w d5,d4 move.w fbr,d0 sub.w sbr,d0 sub.w d5,d6 muls d6,d0 divs d4,d0 add.w sbr,d0 move.w d0,fbr move.l (a1,d1*8),d0 sub.l (a1,d3*8),d0 asr.l #7,d0 muls d6,d0 ; new x coord divs d4,d0 ext.l d0 asl.l #7,d0 add.l (a1,d3*8),d0 move.w minz,d4 move.w (a2,d3*2),d2 divs d4,d0 add.w MIDDLEX,d0 move.l ypos,d3 divs d5,d3 move.w bottomline,d1 bra lineclippedGOUR firstinfrontGOUR: move.w 6(a1,d3*8),d5 ; sec z cmp.w d6,d5 bgt bothinfrontGOUR ** line must be on right and partially behind. sub.w d4,d5 ; dz move.w sbr,d2 sub.w fbr,d2 sub.w d4,d6 muls d6,d2 divs d5,d2 add.w fbr,d2 move.w d2,sbr move.l (a1,d3*8),d2 sub.l (a1,d1*8),d2 ; dx asr.l #7,d2 muls d6,d2 ; new x coord divs d5,d2 ext.l d2 asl.l #7,d2 add.l (a1,d1*8),d2 move.w minz,d5 move.w (a2,d1*2),d0 divs d5,d2 add.w MIDDLEX,d2 move.l ypos,d1 divs d4,d1 move.w bottomline,d3 bra lineclippedGOUR bothinfrontGOUR: * Also, usefully enough, both are on-screen * so no bottom clipping is needed. move.w (a2,d1*2),d0 ; first x move.w (a2,d3*2),d2 ; second x move.l ypos,d1 move.l d1,d3 divs d4,d1 ; first y divs d5,d3 ; second y lineclippedGOUR: move.l #rightsidetab,a3 cmp.w d1,d3 bne linenotflatGOUR ; move.w fbr,d4 ; move.w sbr,d5 ; cmp.w d0,d2 ; bgt.s .nsw ; exg d4,d5 ;.nsw: ; move.l #leftbrighttab,a3 ; move.w d4,(a3,d3.w) ; move.l #rightbrighttab,a3 ; move.w d5,(a3,d3.w) bra lineflatGOUR linenotflatGOUR st drawit bgt lineonrightGOUR move.l #leftsidetab,a3 exg d1,d3 exg d0,d2 lea (a3,d1*2),a3 lea leftbrighttab-leftsidetab(a3),a4 cmp.w top(pc),d1 bge.s .nonewtop move.w d1,top .nonewtop: cmp.w bottom(pc),d3 ble.s .nonewbot move.w d3,bottom .nonewbot: sub.w d1,d3 ; dy sub.w d0,d2 ; dx blt .linegoingleft ext.l d2 divs d3,d2 move.w d2,d6 swap d2 move.w d2,a5 ; moveq #0,d6 ; sub.w d3,d2 ; blt.s .noco ;.makeco ; addq #1,d6 ; sub.w d3,d2 ; bge.s .makeco ;.noco ; add.w d3,d2 move.w d3,d4 move.w d3,d5 subq #1,d5 move.w d6,d1 addq #1,d1 move.w d1,a6 moveq #0,d1 move.w sbr,d1 move.w fbr,d2 sub.w d1,d2 ext.l d2 asl.w #8,d2 asl.w #2,d2 divs d3,d2 ext.l d2 asl.l #6,d2 swap d1 .pixlopright: move.w d0,(a3)+ swap d1 move.w d1,(a4)+ swap d1 add.l d2,d1 sub.w a5,d4 bge.s .nobigstep add.w a6,d0 add.w d3,d4 dbra d5,.pixlopright bra lineflatGOUR .nobigstep add.w d6,d0 dbra d5,.pixlopright bra lineflatGOUR .linegoingleft: neg.w d2 ext.l d2 divs d3,d2 move.w d2,d6 swap d2 ; moveq #0,d6 ; sub.w d3,d2 ; blt.s .nocol ;.makecol ; addq #1,d6 ; sub.w d3,d2 ; bge.s .makecol ;.nocol ; add.w d3,d2 move.w d3,d4 move.w d3,d5 subq #1,d5 move.w d6,d1 addq #1,d1 move.w d1,a6 move.w d2,a5 moveq #0,d1 move.w sbr,d1 move.w fbr,d2 sub.w d1,d2 ext.l d2 asl.w #8,d2 asl.w #2,d2 divs d3,d2 ext.l d2 asl.l #6,d2 swap d1 .pixlopleft: swap d1 move.w d1,(a4)+ swap d1 add.l d2,d1 sub.w a5,d4 bge.s .nobigstepl sub.w a6,d0 add.w d3,d4 move.w d0,(a3)+ dbra d5,.pixlopleft bra lineflatGOUR .nobigstepl sub.w d6,d0 move.w d0,(a3)+ dbra d5,.pixlopleft bra lineflatGOUR lineonrightGOUR: lea (a3,d1*2),a3 lea rightbrighttab-rightsidetab(a3),a4 cmp.w top(pc),d1 bge.s .nonewtop move.w d1,top .nonewtop: cmp.w bottom(pc),d3 ble.s .nonewbot move.w d3,bottom .nonewbot: sub.w d1,d3 ; dy sub.w d0,d2 ; dx blt .linegoingleft ; addq #1,d0 ext.l d2 divs d3,d2 move.w d2,d6 swap d2 ; moveq #0,d6 ; sub.w d3,d2 ; blt.s .noco ;.makeco ; addq #1,d6 ; sub.w d3,d2 ; bge.s .makeco ;.noco ; add.w d3,d2 move.w d3,d4 move.w d3,d5 subq #1,d5 move.w d6,d1 addq #1,d1 move.w d1,a6 move.w d2,a5 moveq #0,d1 move.w fbr,d1 move.w sbr,d2 sub.w d1,d2 ext.l d2 asl.w #8,d2 asl.w #2,d2 divs d3,d2 ext.l d2 asl.l #6,d2 swap d1 .pixlopright: swap d1 move.w d1,(a4)+ swap d1 add.l d2,d1 sub.w a5,d4 bge.s .nobigstep add.w a6,d0 add.w d3,d4 move.w d0,(a3)+ dbra d5,.pixlopright bra lineflatGOUR .nobigstep add.w d6,d0 move.w d0,(a3)+ dbra d5,.pixlopright bra lineflatGOUR .linegoingleft: ; addq #1,d0 neg.w d2 ext.l d2 divs d3,d2 move.w d2,d6 swap d2 ; moveq #0,d6 ; sub.w d3,d2 ; blt.s .nocol ;.makecol ; addq #1,d6 ; sub.w d3,d2 ; bge.s .makecol ;.nocol ; add.w d3,d2 move.w d3,d4 move.w d3,d5 subq #1,d5 move.w d6,d1 addq #1,d1 move.w d1,a6 move.w d2,a5 moveq #0,d1 move.w fbr,d1 move.w sbr,d2 sub.w d1,d2 ext.l d2 asl.w #8,d2 asl.w #2,d2 divs d3,d2 ext.l d2 asl.l #6,d2 swap d1 .pixlopleft: swap d1 move.w d1,(a4)+ swap d1 add.l d2,d1 move.w d0,(a3)+ sub.w a5,d4 bge.s .nobigstepl sub.w a6,d0 add.w d3,d4 dbra d5,.pixlopleft bra lineflatGOUR .nobigstepl sub.w d6,d0 dbra d5,.pixlopleft lineflatGOUR: bothbehindGOUR: dbra d7,sideloopGOUR pastsides: addq #2,a0 move.w #320,linedir ; move.l FASTBUFFER2,a6 ; add.l BIGMIDDLEY,a6 ; move.l a6,REFPTR move.l FASTBUFFER,a6 add.l BIGMIDDLEY,a6 move.w (a0)+,d6 add.w SMALLIT,d6 move.w d6,scaleval move.w (a0)+,d6 ifne CHEESEY move.w d6,d7 ; 000000XX000000YY lsr.w #6,d6 add.w d6,d7 ; 000000XX0000XXYY and.b #%111,d6 ; 000000XX00000XYY add.b d7,d7 ; 000000XX0000XYY0 asl.w #4,d7 ; 00XX0000 XYY00000 and.w #%0010000011100000,d7 move.w d7,d6 endc move.w d6,whichtile move.w (a0)+,d6 add.w ZoneBright,d6 move.w d6,lighttype move.w above(pc),d6 beq groundfloor * on ceiling: move.w #-320,linedir suba.w #320,a6 groundfloor: move.w xoff,d6 move.w zoff,d7 add.w xwobxoff,d7 add.w xwobzoff,d6 ext.l d6 ext.l d7 tst.b FULLSCR beq.s .shiftit asl.l #2,d6 asl.l #2,d7 divs #3,d6 divs #3,d7 swap d6 swap d7 clr.w d6 clr.w d7 asr.l #2,d6 asr.l #2,d7 bra.s .donsht .shiftit ; divs #3,d6 ; divs #3,d7 swap d6 swap d7 clr.w d6 clr.w d7 asr.l #1,d6 asr.l #1,d7 .donsht: move.w scaleval(pc),d3 beq.s .samescale bgt.s .scaledown neg.w d3 asr.l d3,d7 asr.l d3,d6 bra.s .samescale .scaledown: asl.l d3,d6 asl.l d3,d7 .samescale ifne CHEESEY asr.l #1,d6 asr.l #1,d7 endc move.l d6,sxoff move.l d7,szoff bra pastscale asr.l #3,d1 asr.l #3,d2 asr.l #2,d1 asr.l #2,d2 asr.l #1,d1 asr.l #1,d2 scaleprogfrom nop nop asl.l #1,d1 asl.l #1,d2 asl.l #2,d1 asl.l #2,d2 asl.l #3,d1 asl.l #3,d2 top: dc.w 0 bottom: dc.w 0 ypos: dc.l 0 nfloors: dc.w 0 lighttype: dc.w 0 above: dc.w 0 linedir: dc.w 0 distaddr: dc.w 0 minz: dc.l 0 leftsidetab: ds.w 512*2 rightsidetab: ds.w 512*2 leftbrighttab: ds.w 512*2 rightbrighttab: ds.w 512*2 PointBrights: dc.l 0 CurrentPointBrights: ds.l 2*256*10 movespd: dc.w 0 largespd: dc.l 0 disttobot: dc.w 0 pastscale: tst.b drawit(pc) beq dontdrawfloor tst.b DOUBLEHEIGHT beq pix1h move.l a0,-(a7) move.w linedir,d1 add.w d1,linedir move.l #leftsidetab,a4 move.w top(pc),d1 tst.w above beq.s .clipfloor sub.w #320,a6 move.w MIDDLEY,d7 subq #1,d7 sub.w d1,d7 move.w d7,disttobot move.w bottom(pc),d7 move.w MIDDLEY,d3 move.w d3,d4 sub.w topclip,d3 sub.w botclip,d4 cmp.w d3,d1 bge predontdrawfloor cmp.w d4,d7 blt predontdrawfloor cmp.w d4,d1 bge.s .nocliptoproof move.w d4,d1 .nocliptoproof cmp.w d3,d7 blt .doneclip move.w d3,d7 bra .doneclip .clipfloor: move.w BOTTOMY,d7 sub.w MIDDLEY,d7 subq #1,d7 sub.w d1,d7 move.w d7,disttobot move.w bottom(pc),d7 move.w botclip,d4 sub.w MIDDLEY,d4 cmp.w d4,d1 bge predontdrawfloor move.w topclip,d3 sub.w MIDDLEY,d3 cmp.w d3,d1 bge.s .nocliptopfloor move.w d3,d1 .nocliptopfloor cmp.w d3,d7 ble predontdrawfloor cmp.w d4,d7 blt.s .noclipbotfloor move.w d4,d7 .noclipbotfloor: .doneclip: lea (a4,d1*2),a4 addq #1,d7 sub.w d1,d7 ;moveq #0,d0 asr.w #1,d1 ; addx d0,d1 ; move.l #dists,a2 move.w distaddr,d0 muls #64,d0 move.l d0,a2 ; muls #25,d0 ; adda.w d0,a2 ; lea (a2,d1*2),a2 asr.w #1,d7 ble predontdrawfloor move.w d1,d0 bne.s .notzero moveq #1,d0 .notzero add.w d0,d0 muls linedir,d1 add.l d1,a6 ; sub.l d1,REFPTR move.l TexturePal,a1 move.l LineToUse,a5 move.w #4,tonextline bra pix2h pix1h: move.l a0,-(a7) move.l #leftsidetab,a4 move.w top(pc),d1 tst.w above beq.s clipfloor move.w MIDDLEY,d7 subq #1,d7 sub.w d1,d7 move.w d7,disttobot move.w bottom(pc),d7 move.w MIDDLEY,d3 move.w d3,d4 sub.w topclip,d3 sub.w botclip,d4 cmp.w d3,d1 bge predontdrawfloor cmp.w d4,d7 blt predontdrawfloor cmp.w d4,d1 bge.s .nocliptoproof move.w d4,d1 .nocliptoproof cmp.w d3,d7 blt doneclip move.w d3,d7 bra doneclip clipfloor: move.w BOTTOMY,d7 sub.w MIDDLEY,d7 subq #1,d7 sub.w d1,d7 move.w d7,disttobot move.w bottom(pc),d7 move.w botclip,d4 sub.w MIDDLEY,d4 cmp.w d4,d1 bge predontdrawfloor move.w topclip,d3 sub.w MIDDLEY,d3 cmp.w d3,d1 bge.s .nocliptopfloor move.w d3,d1 .nocliptopfloor cmp.w d3,d7 ble predontdrawfloor cmp.w d4,d7 blt.s .noclipbotfloor move.w d4,d7 .noclipbotfloor: doneclip: lea (a4,d1*2),a4 ; move.l #dists,a2 move.w distaddr,d0 muls #64,d0 move.l d0,a2 ; muls #25,d0 ; adda.w d0,a2 ; lea (a2,d1*2),a2 sub.w d1,d7 ble predontdrawfloor move.w d1,d0 bne.s .notzero moveq #1,d0 .notzero muls linedir,d1 add.l d1,a6 ; sub.l d1,REFPTR move.l TexturePal,a1 move.l LineToUse,a5 move.w #2,tonextline pix2h: tst.b gourfloor bne dogourfloor tst.b anyclipping beq dofloornoclip dofloor: ; move.w (a2)+,d0 move.w leftclip,d3 move.w rightclip,d4 move.w rightsidetab-leftsidetab(a4),d2 addq #1,d2 cmp.w d3,d2 ble.s nodrawline cmp.w d4,d2 ble.s noclipright move.w d4,d2 noclipright: move.w (a4),d1 cmp.w d4,d1 bge.s nodrawline cmp.w d3,d1 bge.s noclipleft move.w d3,d1 noclipleft: cmp.w d1,d2 ble.s nodrawline move.w d1,leftedge move.w d2,rightedge ; moveq #0,d1 ; moveq #0,d3 ; move.w leftbrighttab-leftsidetab(a4),d1 ; bge.s .okbl ; moveq #0,d1 ;.okbl: ; move.w rightbrighttab-leftsidetab(a4),d3 ; bge.s .okbr ; moveq #0,d3 ;.okbr: ; sub.w d1,d3 ; asl.w #8,d1 ; move.l d1,leftbright ; swap d3 ; asr.l #5,d3 ; divs d5,d3 ; move.w d3,d5 ; muls.w d6,d5 ; asr.l #3,d5 ; clr.b d5 ; add.w d5,leftbright+2 ; ext.l d3 ; asl.l #5,d3 ; swap d3 ; asl.w #8,d3 ; move.l d3,brightspd move.l a6,a3 movem.l d0/d7/a2/a4/a5/a6,-(a7) move.l a2,d7 asl.l #2,d7 ext.l d0 divs.l d0,d7 move.l d7,d0 jsr (a5) movem.l (a7)+,d0/d7/a2/a4/a5/a6 nodrawline sub.w #1,disttobot move.w linedir(pc),d3 adda.w d3,a6 ; ext.l d3 ; sub.l d3,REFPTR move.w tonextline,d3 add.w d3,a4 asr.w #1,d3 add.w d3,d0 subq #1,d7 bgt dofloor predontdrawfloor move.l (a7)+,a0 dontdrawfloor: rts tonextline: dc.w 0 anyclipping: dc.w 0 dofloornoclip: ; move.w (a2)+,d0 move.w rightsidetab-leftsidetab(a4),d2 addq #1,d2 move.w (a4),d1 move.w d1,leftedge move.w d2,rightedge ; sub.w d1,d2 ; moveq #0,d1 ; moveq #0,d3 ; move.w leftbrighttab-leftsidetab(a4),d1 ; bge.s .okbl ; moveq #0,d1 ;.okbl: ; move.w rightbrighttab-leftsidetab(a4),d3 ; bge.s .okbr ; moveq #0,d3 ;.okbr: ; sub.w d1,d3 ; asl.w #8,d1 ; move.l d1,leftbright ; swap d3 ; asr.l #5,d3 ; divs d2,d3 ; ext.l d3 ; asl.l #5,d3 ; swap d3 ; asl.w #8,d3 ; move.l d3,brightspd move.l a6,a3 movem.l d0/d7/a2/a4/a5/a6,-(a7) move.l a2,d7 asl.l #2,d7 ext.l d0 divs.l d0,d7 move.l d7,d0 jsr (a5) movem.l (a7)+,d0/d7/a2/a4/a5/a6 sub.w #1,disttobot move.w linedir(pc),d3 adda.w d3,a6 ; ext.l d3 ; sub.l d3,REFPTR move.w tonextline,d3 add.w d3,a4 asr.w #1,d3 add.w d3,d0 subq #1,d7 bgt dofloornoclip bra predontdrawfloor dogourfloor: tst.b anyclipping beq dofloornoclipGOUR dofloorGOUR: ; move.w (a2)+,d0 move.w leftclip,d3 move.w rightclip,d4 move.w rightsidetab-leftsidetab(a4),d2 move.w d2,d5 sub.w (a4),d5 addq #1,d5 moveq #0,d6 addq #1,d2 cmp.w d3,d2 ble nodrawlineGOUR cmp.w d4,d2 ble.s nocliprightGOUR move.w d4,d2 nocliprightGOUR: move.w (a4),d1 cmp.w d4,d1 bge nodrawlineGOUR cmp.w d3,d1 bge.s noclipleftGOUR move.w d3,d6 subq #1,d6 sub.w d1,d6 move.w d3,d1 noclipleftGOUR: cmp.w d1,d2 ble nodrawlineGOUR move.w d1,leftedge move.w d2,rightedge move.l a2,d2 asl.l #2,d2 ext.l d0 divs.l d0,d2 move.l d2,dst asr.l #7,d2 asr.l #2,d2 ; addq #5,d2 ; add.w lighttype,d2 moveq #0,d1 moveq #0,d3 move.w leftbrighttab-leftsidetab(a4),d1 add.w d2,d1 bge.s .okbl moveq #0,d1 .okbl: ; asr.w #1,d1 cmp.w #30,d1 ble.s .okdl move.w #30,d1 .okdl: move.w rightbrighttab-leftsidetab(a4),d3 add.w d2,d3 bge.s .okbr moveq #0,d3 .okbr: ; asr.w #1,d3 cmp.w #30,d3 ble.s .okdr move.w #30,d3 .okdr: sub.w d1,d3 asl.w #8,d1 move.w d1,leftbright swap d3 tst.l d3 bgt.s .OKITSPOSALREADY neg.l d3 asr.l #6,d3 divs d5,d3 neg.w d3 bra.s .OKNOWITSNEG .OKITSPOSALREADY asr.l #6,d3 divs d5,d3 .OKNOWITSNEG muls d3,d6 add.w #256*4,d6 asr.w #2,d6 clr.b d6 add.w leftbright,d6 bge.s .oklbnn moveq #0,d6 .oklbnn: move.w d6,leftbright ext.l d3 asr.l #2,d3 ; swap d3 ; asl.w #8,d3 move.w d3,brightspd move.l a6,a3 movem.l d0/d7/a2/a4/a5/a6,-(a7) move.l dst,d0 move.l TexturePal,a1 move.l floortile,a0 adda.w whichtile,a0 jsr pastfloorbright movem.l (a7)+,d0/d7/a2/a4/a5/a6 nodrawlineGOUR sub.w #1,disttobot move.w linedir(pc),d3 adda.w d3,a6 ; ext.l d3 ; sub.l d3,REFPTR move.w tonextline,d3 add.w d3,a4 asr.w #1,d3 add.w d3,d0 subq #1,d7 bgt dofloorGOUR predontdrawfloorGOUR move.l (a7)+,a0 dontdrawfloorGOUR: rts REFPTR: dc.l 0 dofloornoclipGOUR: ; move.w (a2)+,d0 move.w rightsidetab-leftsidetab(a4),d2 addq #1,d2 move.w (a4),d1 move.w d1,leftedge move.w d2,rightedge sub.w d1,d2 move.l a2,d6 asl.l #2,d6 ext.l d0 divs.l d0,d6 move.l d6,d5 asr.l #7,d5 asr.l #2,d5 ; addq #5,d5 ; add.w lighttype,d5 moveq #0,d1 moveq #0,d3 move.w leftbrighttab-leftsidetab(a4),d1 add.w d5,d1 bge.s .okbl moveq #0,d1 .okbl: ; asr.w #1,d1 cmp.w #30,d1 ble.s .okdl move.w #30,d1 .okdl: move.w rightbrighttab-leftsidetab(a4),d3 add.w d5,d3 bge.s .okbr moveq #0,d3 .okbr: ; asr.w #1,d3 cmp.w #30,d3 ble.s .okdr move.w #30,d3 .okdr: ; sub.w d1,d3 ; asl.w #8,d1 ; move.l d1,leftbright ; swap d3 ; asr.l #5,d3 ; divs d2,d3 ; ext.l d3 ; asl.l #5,d3 ; swap d3 ; asl.w #8,d3 ; move.l d3,brightspd sub.w d1,d3 asl.w #8,d1 move.w d1,leftbright swap d3 ext.l d2 divs.l d2,d3 asr.l #8,d3 move.w d3,brightspd move.l a6,a3 movem.l d0/d7/a2/a4/a5/a6,-(a7) move.l d6,d0 move.l d0,dst move.l TexturePal,a1 move.l floortile,a0 adda.w whichtile,a0 jsr pastfloorbright movem.l (a7)+,d0/d7/a2/a4/a5/a6 sub.w #1,disttobot move.w linedir(pc),d3 adda.w d3,a6 ; ext.l d3 ; sub.l d3,REFPTR move.w tonextline,d3 add.w d3,a4 asr.w #1,d3 add.w d3,d0 subq #1,d7 bgt dofloornoclipGOUR bra predontdrawfloorGOUR dists: ; incbin "floordists" drawit: dc.w 0 LineToUse: dc.l 0 *************************** * Right then, time for the floor * routine... * For test purposes, give it * a3 = point to screen * d0= z distance away * and sinval+cosval must be set up. *************************** BLACKFLOOR: moveq #0,d0 bra.s DOBLACK SimpleFloorLine: CACHE_OFF d2 move.l #doacrossline,a1 move.w leftedge(pc),d1 move.w rightedge(pc),d3 sub.w d1,d3 lea (a1,d1.w*4),a1 move.w (a1,d3.w*4),d4 move.w #$4e75,(a1,d3.w*4) tst.b CLRNOFLOOR bne.s BLACKFLOOR move.l #PLAINSCALE,a2 move.w d0,d2 move.w lighttype,d1 asr.w #8,d2 add.w #5,d1 add.w d2,d1 bge.s .fixedbright moveq #0,d1 .fixedbright: cmp.w #28,d1 ble.s .smallbright move.w #28,d1 .smallbright: lea (a2,d1.w*2),a2 move.w whichtile,d0 move.w d0,d1 and.w #$3,d1 and.w #$300,d0 lsl.b #6,d1 move.b d1,d0 move.w d0,tstwhich move.w (a2,d0.w),d0 DOBLACK: jsr (a1) move.w d4,(a1,d3.w*4) CACHE_ON d2 rts tstwhich: dc.w 0 whichtile: dc.w 0 PLAINSCALE: ;incbin "ab3:includes/plainscale" storeit: dc.l 0 doacrossline: val SET 0 REPT 32 move.w d0,val(a3) val SET val+4 ENDR val SET val+4 REPT 32 move.w d0,val(a3) val SET val+4 ENDR val SET val+4 REPT 32 move.w d0,val(a3) val SET val+4 ENDR rts leftedge: dc.w 0 rightedge: dc.w 0 rndpt: dc.l rndtab dst: dc.l 0 FloorLine: move.l floortile,a0 adda.w whichtile,a0 move.w lighttype,d1 move.l d0,dst ; *4 move.l d0,d2 ; *4 ********************* * Old version asr.l #2,d2 asr.l #8,d2 add.w #5,d1 ********************* ; asr.w #3,d2 ; sub.w #4,d2 ; cmp.w #6,d2 ; blt.s flbrbr ; move.w #6,d2 ;flbrbr: ********************* add.w d2,d1 bge.s .fixedbright moveq #0,d1 .fixedbright: cmp.w #28,d1 ble.s .smallbright move.w #28,d1 .smallbright: move.l TexturePal,a1 add.l floorbright(pc,d1.w*4),a1 bra pastfloorbright ConstCol: dc.w 0 BumpLine: tst.b smoothbumps beq.s Chunky move.l #SmoothTile,a0 lea Smoothscalecols,a1 bra pastast Chunky: moveq #0,d2 move.l #Bumptile,a0 move.w whichtile,d2 adda.w d2,a0 ror.l #2,d2 lsr.w #6,d2 rol.l #2,d2 and.w #15,d2 move.l #ConstCols,a1 move.w (a1,d2.w*2),ConstCol lea Bumpscalecols,a1 pastast: move.w lighttype,d1 move.l d0,dst move.l d0,d2 ********************* * Old version asr.l #2,d2 asr.l #8,d2 add.w #5,d1 ********************* ; asr.w #3,d2 ; sub.w #4,d2 ; cmp.w #6,d2 ; blt.s flbrbr ; move.w #6,d2 ;flbrbr: ********************* add.w d2,d1 bge.s .fixedbright moveq #0,d1 .fixedbright: cmp.w #31,d1 ble.s .smallbright move.w #31,d1 .smallbright: add.l floorbright(pc,d1.w*4),a1 bra pastfloorbright floorbright: dc.l 512*0 dc.l 512*1 dc.l 512*2 dc.l 512*3 dc.l 512*4 dc.l 512*5 dc.l 512*6 dc.l 512*7 dc.l 512*8 dc.l 512*9 dc.l 512*10 dc.l 512*11 dc.l 512*12 dc.l 512*13 dc.l 512*14 dc.l 512*15 dc.l 512*16 dc.l 512*17 dc.l 512*18 dc.l 512*19 dc.l 512*20 dc.l 512*21 dc.l 512*22 dc.l 512*23 dc.l 512*24 dc.l 512*25 dc.l 512*26 dc.l 512*27 dc.l 512*28 dc.l 512*29 dc.l 512*30 dc.l 512*31 widthleft: dc.w 0 scaleval: dc.w 0 sxoff: dc.l 0 szoff: dc.l 0 xoff34: dc.w 0 zoff34: dc.w 0 scosval: dc.w 0 ssinval: dc.w 0 floorsetbright: move.l #walltiles,a0 pastfloorbright: move.l d0,d1 muls cosval,d1 ; change in x across whole width move.l d0,d2 muls sinval,d2 ; change in z across whole width neg.l d2 ifne CHEESEY asr.l #3,d2 asr.l #3,d1 endc ifeq CHEESEY asr.l #2,d2 asr.l #2,d1 endc scaleprog: move.w scaleval(pc),d3 beq.s .samescale bgt.s .scaledown neg.w d3 asr.l d3,d1 asr.l d3,d2 bra.s .samescale .scaledown: asl.l d3,d1 asl.l d3,d2 .samescale move.l d1,d3 ; z cos move.l d3,d6 move.l d3,d5 asr.l #1,d6 add.l d6,d3 asr.l #1,d3 move.l d2,d4 ; z sin move.l d4,d6 asr.l #1,d6 add.l d4,d6 add.l d3,d4 neg.l d4 ; start x asr.l #1,d6 ; zsin/2 sub.l d6,d5 ; start z add.l sxoff,d4 add.l szoff,d5 tst.b FULLSCR beq.s .nob moveq #0,d6 move.w leftedge(pc),d6 beq.s .nomultleftB add.l d6,d6 divs #3,d6 ext.l d6 move.l d1,a4 move.l d2,a5 muls.l d6,d1 asr.l #7,d1 add.l d1,d4 muls.l d6,d2 asr.l #7,d2 add.l d2,d5 move.l a4,d1 move.l a5,d2 move.w leftedge(pc),d6 .nomultleftB: move.w d4,startsmoothx move.w d5,startsmoothz asr.l #8,d4 asl.l #8,d5 ; add.w szoff,d5 ; add.w sxoff,d4 ; and.w #63,d4 ; and.w #63*256,d5 move.w d4,d5 asr.l #6,d1 asr.l #6,d2 divs.l #3,d1 divs.l #3,d2 bra.s doneallmult .nob moveq #0,d6 move.w leftedge(pc),d6 beq.s nomultleft move.l d1,a4 move.l d2,a5 muls.l d6,d1 asr.l #7,d1 add.l d1,d4 muls.l d6,d2 asr.l #7,d2 add.l d2,d5 move.l a4,d1 move.l a5,d2 move.w leftedge(pc),d6 nomultleft: move.w d4,startsmoothx move.w d5,startsmoothz asr.l #8,d4 asl.l #8,d5 ; add.w szoff,d5 ; add.w sxoff,d4 ; and.w #63,d4 ; and.w #63*256,d5 move.w d4,d5 asr.l #7,d1 asr.l #7,d2 ; divs.l #3,d1 ; divs.l #3,d2 doneallmult: move.w d1,a4 move.w d2,a5 asl.l #8,d2 ; and.w #%0011111100000000,d2 asr.l #8,d1 move.w d1,d2 ifeq CHEESEY move.l #$3fff3fff,d1 endc ifne CHEESEY move.l #$1fff1fff,d1 endc and.l d1,d5 ; swap d5 ; move.w startsmoothz,d5 ; swap d5 ; swap d2 ; move.w a5,d2 ; swap d2 *********************************** tst.b DOUBLEWIDTH beq.s .nodoub and.b #$fe,d6 move.w d6,a2 moveq #0,d0 move.w rightedge(pc),d3 lea (a3,a2.w),a3 move.w d3,d7 sub.w a2,d7 asr.w #1,d7 move.w startsmoothx,d3 tst.b usewater bne texturedwaterDOUB ; tst.b gourfloor bra gouraudfloorDOUB .nodoub: move.w d6,a2 moveq #0,d0 move.w rightedge(pc),d3 lea (a3,a2.w),a3 move.w d3,d7 sub.w a2,d7 intofirststrip: allintofirst: move.w startsmoothx,d3 tstwat: tst.b usewater bne texturedwater ; tst.b gourfloor bra gouraudfloor ****************************** * BumpMap the floor/ceiling! * tst.b usebumps bne.s BumpMap ****************************** ordinary: moveq #0,d0 dbra d7,acrossscrn rts usebumps: dc.w $0 smoothbumps: dc.w $0 gourfloor: dc.w 0 include "ab3:source_4000/bumpmap.s" CNOP 0,4 backbefore: and.w d1,d5 move.b (a0,d5.w*4),d0 add.w a4,d3 addx.l d6,d5 move.w (a1,d0.w*2),(a3) addq #4,a3 dbcs d7,acrossscrn dbcc d7,backbefore bra.s past1 acrossscrn: and.w d1,d5 move.b (a0,d5.w*4),d0 add.w a4,d3 addx.l d2,d5 move.w (a1,d0.w*2),(a3) addq #4,a3 dbcs d7,acrossscrn dbcc d7,backbefore past1: bcc.s gotoacross move.w d4,d7 bne.s .notdoneyet rts .notdoneyet: cmp.w #32,d7 ble.s .notoowide move.w #32,d7 .notoowide sub.w d7,d4 addq #4,a3 dbra d7,backbefore rts gotoacross: move.w d4,d7 bne.s .notdoneyet rts .notdoneyet: cmp.w #32,d7 ble.s .notoowide move.w #32,d7 .notoowide sub.w d7,d4 addq #4,a3 dbra d7,acrossscrn rts leftbright: dc.l 0 brightspd: dc.l 0 gouraudfloor: move.w leftbright,d0 move.l d1,d4 move.w brightspd,d1 move.w d7,d3 asr.w #1,d7 btst #0,d3 beq.s .nosingle1 move.w d5,d3 move.l d5,d6 lsr.w #8,d3 swap d6 move.b d3,d6 move.w d0,d3 ifeq CHEESEY move.b (a0,d6.w*4),d3 endc ifne CHEESEY move.b (a0,d6.w),d3 endc add.w d1,d0 add.l d2,d5 and.l d4,d5 move.b (a1,d3.w),(a3)+ .nosingle1 move.w d7,d3 asr.w #1,d7 btst #0,d3 beq.s .nosingle2 move.w d5,d3 move.l d5,d6 lsr.w #8,d3 swap d6 move.b d3,d6 move.w d0,d3 ifeq CHEESEY move.b (a0,d6.w*4),d3 endc ifne CHEESEY move.b (a0,d6.w),d3 endc add.w d1,d0 add.l d2,d5 and.l d4,d5 move.l d5,d6 swap d6 move.b (a1,d3.w),(a3)+ move.w d5,d3 lsr.w #8,d3 move.b d3,d6 move.w d0,d3 ifeq CHEESEY move.b (a0,d6.w*4),d3 endc ifne CHEESEY move.b (a0,d6.w),d3 endc add.w d1,d0 add.l d2,d5 and.l d4,d5 move.b (a1,d3.w),(a3)+ .nosingle2 move.l d5,d6 swap d6 dbra d7,acrossscrngour rts CNOP 0,4 acrossscrngour: move.w d5,d3 lsr.w #8,d3 move.b d3,d6 move.w d0,d3 ifeq CHEESEY move.b (a0,d6.w*4),d3 endc ifne CHEESEY move.b (a0,d6.w),d3 endc add.w d1,d0 add.l d2,d5 and.l d4,d5 move.l d5,d6 swap d6 move.b (a1,d3.w),(a3)+ move.w d5,d3 lsr.w #8,d3 move.b d3,d6 move.w d0,d3 ifeq CHEESEY move.b (a0,d6.w*4),d3 endc ifne CHEESEY move.b (a0,d6.w),d3 endc add.w d1,d0 add.l d2,d5 and.l d4,d5 move.l d5,d6 swap d6 move.b (a1,d3.w),(a3)+ move.w d5,d3 lsr.w #8,d3 move.b d3,d6 move.w d0,d3 ifeq CHEESEY move.b (a0,d6.w*4),d3 endc ifne CHEESEY move.b (a0,d6.w),d3 endc add.w d1,d0 add.l d2,d5 and.l d4,d5 move.l d5,d6 swap d6 move.b (a1,d3.w),(a3)+ move.w d5,d3 lsr.w #8,d3 move.b d3,d6 move.w d0,d3 ifeq CHEESEY move.b (a0,d6.w*4),d3 endc ifne CHEESEY move.b (a0,d6.w),d3 endc add.w d1,d0 add.l d2,d5 and.l d4,d5 move.l d5,d6 swap d6 move.b (a1,d3.w),(a3)+ dbra d7,acrossscrngour rts gouraudfloorDOUB: move.w leftbright,d0 move.l d1,d4 move.w brightspd,d1 add.w d1,d1 add.l d2,d2 move.w d7,d3 asr.w #1,d7 btst #0,d3 beq.s .nosingle1 move.w d5,d3 move.l d5,d6 lsr.w #8,d3 swap d6 move.b d3,d6 move.w d0,d3 ifeq CHEESEY move.b (a0,d6.w*4),d3 endc ifne CHEESEY move.b (a0,d6.w),d3 endc add.w d1,d0 add.l d2,d5 and.l d4,d5 move.w (a1,d3.w),(a3)+ .nosingle1 move.w d7,d3 asr.w #1,d7 btst #0,d3 beq.s .nosingle2 move.w d5,d3 move.l d5,d6 lsr.w #8,d3 swap d6 move.b d3,d6 move.w d0,d3 ifeq CHEESEY move.b (a0,d6.w*4),d3 endc ifne CHEESEY move.b (a0,d6.w),d3 endc add.w d1,d0 add.l d2,d5 and.l d4,d5 move.l d5,d6 swap d6 move.w (a1,d3.w),(a3)+ move.w d5,d3 lsr.w #8,d3 move.b d3,d6 move.w d0,d3 ifeq CHEESEY move.b (a0,d6.w*4),d3 endc ifne CHEESEY move.b (a0,d6.w),d3 endc add.w d1,d0 add.l d2,d5 and.l d4,d5 move.w (a1,d3.w),(a3)+ .nosingle2 move.l d5,d6 swap d6 dbra d7,acrossscrngourD rts CNOP 0,4 acrossscrngourD: move.w d5,d3 lsr.w #8,d3 move.b d3,d6 move.w d0,d3 ifeq CHEESEY move.b (a0,d6.w*4),d3 endc ifne CHEESEY move.b (a0,d6.w),d3 endc add.w d1,d0 add.l d2,d5 and.l d4,d5 move.l d5,d6 swap d6 move.w (a1,d3.w),(a3)+ move.w d5,d3 lsr.w #8,d3 move.b d3,d6 move.w d0,d3 ifeq CHEESEY move.b (a0,d6.w*4),d3 endc ifne CHEESEY move.b (a0,d6.w),d3 endc add.w d1,d0 add.l d2,d5 and.l d4,d5 move.l d5,d6 swap d6 move.w (a1,d3.w),(a3)+ move.w d5,d3 lsr.w #8,d3 move.b d3,d6 move.w d0,d3 ifeq CHEESEY move.b (a0,d6.w*4),d3 endc ifne CHEESEY move.b (a0,d6.w),d3 endc add.w d1,d0 add.l d2,d5 and.l d4,d5 move.l d5,d6 swap d6 move.w (a1,d3.w),(a3)+ move.w d5,d3 lsr.w #8,d3 move.b d3,d6 move.w d0,d3 ifeq CHEESEY move.b (a0,d6.w*4),d3 endc ifne CHEESEY move.b (a0,d6.w),d3 endc add.w d1,d0 add.l d2,d5 and.l d4,d5 move.l d5,d6 swap d6 move.w (a1,d3.w),(a3)+ dbra d7,acrossscrngourD rts ;backbeforegour: ; and.w #63*256+63,d5 ; move.b (a0,d5.w*4),d0 ; add.l d1,d0 ; bcc.s .nomoreb ; add.w #256,d0 ;.nomoreb: ; add.w a4,d3 ; move.w (a1,d0.w*2),(a3)+ ; addx.l d6,d5 ; dbcs d7,acrossscrngour ; dbcc d7,backbeforegour ; rts ; bra.s past1gour ;acrossscrngour: ; and.l #$3f3f,d5 ; move.b (a0,d5.w*4),d0 ; add.l d1,d0 ; bcc.s .nomoreb ; add.w #256,d0 ;.nomoreb: ; add.w a4,d3 ; move.w (a1,d0.w*2),(a3)+ ; addx.l d2,d5 ; dbcs d7,acrossscrngour ; dbcc d7,backbeforegour ;past1gour: ; rts move.w d4,d7 bne.s .notdoneyet move.l d0,leftbright rts .notdoneyet: cmp.w #32,d7 ble.s .notoowide move.w #32,d7 .notoowide sub.w d7,d4 addq #4,a3 ; dbra d7,backbeforegour rts gotoacrossgour: move.w d4,d7 bne.s .notdoneyet rts .notdoneyet: cmp.w #32,d7 ble.s .notoowide move.w #32,d7 .notoowide sub.w d7,d4 addq #4,a3 dbra d7,acrossscrngour rts waterpt: dc.l waterlist waterlist: dc.l waterfile dc.l waterfile+2 dc.l waterfile+256 dc.l waterfile+256+2 dc.l waterfile+512 dc.l waterfile+512+2 dc.l waterfile+768 dc.l waterfile+768+2 ; dc.l waterfile+768 ; dc.l waterfile+512+2 ; dc.l waterfile+512 ; dc.l waterfile+256+2 ; dc.l waterfile+256 ; dc.l waterfile+2 endwaterlist: watertouse: dc.l waterfile wtan: dc.w 0 wateroff: dc.l 0 REFLECTIONWATER: move.l d1,d4 add.l wateroff,d5 move.l #brightentab,a1 move.l dst,d0 clr.b d0 add.w d0,d0 cmp.w #12*512,d0 blt.s .notoowater move.w #12*512,d0 .notoowater: adda.w d0,a1 move.l dst,d0 asl.w #7,d0 add.w wtan,d0 and.w #8191,d0 move.l #SineTable,a0 move.w (a0,d0.w),d0 ext.l d0 move.l dst,d3 add.w #300,d3 divs d3,d0 asr.w #5,d0 addq #4,d0 cmp.w disttobot,d0 blt.s oknotoffbotototr move.w disttobot,d0 subq #1,d0 oknotoffbotototr ; move.w dst,d3 ; asr.w #7,d3 ; add.w d3,d0 muls #320,d0 tst.w above beq.s nonnnnnegr neg.l d0 nonnnnnegr: move.l d0,a6 move.l watertouse,a0 ; move.l #mixtab,a5 moveq #0,d1 move.w startsmoothx,d3 dbra d7,acrossscrnwr rts backbeforewr: and.w d1,d5 move.w (a0,d5.w*4),d0 move.b (a3,a6.w),d0 move.w (a1,d0.w),(a3)+ add.w a4,d3 addx.l d6,d5 dbcs d7,acrossscrnwr dbcc d7,backbeforewr rts acrossscrnwr: move.w d5,d3 move.l d5,d6 lsr.w #8,d3 swap d6 move.b d3,d6 move.w (a0,d6.w*4),d0 add.l d2,d5 move.w (a4,a6.w),d1 addq #2,a4 move.b (a3,a6.w),d1 move.b (a5,d1.l),d0 and.l d4,d5 move.w (a1,d0.w),(a3)+ dbra d7,acrossscrnwr rts texturedwater: move.l d1,d4 add.l wateroff,d5 move.l #brightentab,a1 move.l dst,d0 asr.l #1,d0 clr.b d0 add.w d0,d0 cmp.w #9*512,d0 blt.s .notoowater move.w #9*512,d0 .notoowater: adda.w d0,a1 move.l dst,d0 asl.w #7,d0 add.w wtan,d0 and.w #8191,d0 move.l #SineTable,a0 move.w (a0,d0.w),d0 ext.l d0 move.l dst,d3 add.w #300,d3 divs d3,d0 asr.w #5,d0 addq #4,d0 cmp.w disttobot,d0 blt.s oknotoffbototot move.w disttobot,d0 subq #1,d0 oknotoffbototot ; move.w dst,d3 ; asr.w #7,d3 ; add.w d3,d0 tst.b DOUBLEHEIGHT beq.s .nodoub and.b #$fe,d0 .nodoub: muls #320,d0 tst.w above beq.s nonnnnneg neg.l d0 nonnnnneg: move.l d0,a6 move.l watertouse,a0 move.w startsmoothx,d3 dbra d7,acrossscrnw rts backbeforew: and.w d1,d5 move.w (a0,d5.w*4),d0 move.b (a3,a6.w),d0 move.b (a1,d0.w),(a3)+ add.w a4,d3 addx.l d6,d5 dbcs d7,acrossscrnw dbcc d7,backbeforew rts acrossscrnw: move.w d5,d3 move.l d5,d6 lsr.w #8,d3 swap d6 move.b d3,d6 move.w (a0,d6.w*4),d0 add.l d2,d5 move.b (a3,a6.w),d0 and.l d4,d5 move.b (a1,d0.w),(a3)+ dbra d7,acrossscrnw rts texturedwaterDOUB: move.l d1,d4 add.l wateroff,d5 move.l #brightentab,a1 move.l dst,d0 asr.l #1,d0 clr.b d0 add.w d0,d0 cmp.w #9*512,d0 blt.s .notoowater move.w #9*512,d0 .notoowater: adda.w d0,a1 move.l dst,d0 asl.w #7,d0 add.w wtan,d0 and.w #8191,d0 move.l #SineTable,a0 move.w (a0,d0.w),d0 ext.l d0 move.l dst,d3 add.w #300,d3 divs d3,d0 asr.w #5,d0 addq #4,d0 cmp.w disttobot,d0 blt.s .oknotoffbototot move.w disttobot,d0 subq #1,d0 .oknotoffbototot ; move.w dst,d3 ; asr.w #7,d3 ; add.w d3,d0 tst.b DOUBLEHEIGHT beq.s .nodoub and.b #$fe,d0 .nodoub: muls #320,d0 tst.w above beq.s .nonnnnneg neg.l d0 .nonnnnneg: move.l d0,a6 move.l watertouse,a0 add.l d2,d2 move.w startsmoothx,d3 dbra d7,acrossscrnwD rts acrossscrnwD: move.w d5,d3 move.l d5,d6 lsr.w #8,d3 swap d6 move.b d3,d6 move.w (a0,d6.w*4),d0 add.l d2,d5 move.b (a3,a6.w),d0 and.l d4,d5 move.w (a1,d0.w),(a3)+ dbra d7,acrossscrnwD rts usewater: dc.w 0 dc.w 0 startsmoothx: dc.w 0 dc.w 0 startsmoothz: dc.w 0 ******************************** * include "AB3:source_4000/ObjDrawHIRES.s" * ******************************** numframes: dc.w 0 alframe: dc.l 0 alan: dcb.l 8,0 dcb.l 8,1 dcb.l 8,2 dcb.l 8,3 endalan: alanptr: dc.l alan Time2: dc.l 0 dispco: dc.w 0 key_interrupt: movem.l d0-d7/a0-a6,-(sp) ; move.w INTREQR,d0 ; btst #3,d0 ; beq .not_key move.b $bfdd00,d0 btst #0,d0 bne .key_cont ; move.b $bfed01,d0 ; btst #0,d0 ; bne .key_cont ; btst #3,d0 ; beq .key_cont move.b $bfec01,d0 clr.b $bfec01 tst.b d0 beq .key_cont ; bset #6,$bfee01 ; move.b #$f0,$bfe401 ; move.b #$00,$bfe501 ; bset #0,$bfee01 not.b d0 ror.b #1,d0 lea.l KeyMap,a0 tst.b d0 bmi.b .key_up and.w #$7f,d0 ; add.w #1,d0 move.b #$ff,(a0,d0.w) move.b d0,lastpressed bra.b .key_cont2 .key_up: and.w #$7f,d0 ; add.w #1,d0 move.b #$00,(a0,d0.w) .key_cont2 ; btst #0,$bfed01 ; beq .key_cont2 ; move.b #%00000000,$bfee01 ; move.b #%10001000,$bfed01 ;alt keys should not be independent so overlay ralt on lalt .key_cont ; move.w #$0008,INTREQ .not_key: ;lea.l $dff000,a5 ; lea.l _keypressed(pc),a0 ; move.b 101(a0),d0 ;read LALT ; or.b 102(a0),d0 ;blend it with RALT ; move.b d0,127(a0) ;save in combined position movem.l (sp)+,d0-d7/a0-a6 rts lastpressed: dc.b 0 KInt_CCode Ds.b 1 KInt_Askey Ds.b 1 KInt_OCode Ds.w 1 OldSpace: dc.b 0 SpaceTapped: dc.b 0 PLR1_SPCTAP: dc.b 0 PLR2_SPCTAP: dc.b 0 PLR1_Ducked: dc.b 0 PLR2_Ducked: dc.b 0 even include "ab3:source_4000/PLR1CONTROL.s" include "ab3:source_4000/PLR2CONTROL.s" include "ab3:source_4000/FALL.s" prot7: dc.w 0 GOTTOSEND: dc.w 0 OtherInter: move.w #$0010,$dff000+intreq movem.l d0-d7/a0-a6,-(a7) bra justshake cnop 0,4 Chan0inter: SAVEREGS jsr .routine GETREGS ; move.w #1024+'.',$dff030 moveq #1,d0 rts .routine ;w move.w #$0010,$dff000+intreq tst.b doanything bne dosomething movem.l d0-d7/a0-a6,-(a7) bra JUSTSOUNDS rts tabheld: dc.w 0 ObjWork: ds.l 512 WORKPTR: dc.l 0 thistime: dc.w 0 DOALLANIMS: sub.b #1,thistime ble.s .okdosome rts .okdosome: move.b #5,thistime move.l #ObjWork,a5 move.l ObjectData,a0 Objectloop2: tst.w (a0) blt doneallobj2 move.w 12(a0),d0 blt doneobj2 move.w d0,GraphicRoom(a0) tst.b worry(a0) beq.s doneobj2 move.b 16(a0),d0 cmp.b #1,d0 blt JUMPALIENANIM beq JUMPOBJECTANIM ; cmp.b #2,d0 ; beq JUMPBULLET doneobj2: adda.w #64,a0 addq #8,a5 bra Objectloop2 doneallobj2: rts JUMPALIENANIM: moveq #0,d0 move.b WhichAnim(a0),d0 ; 0=walking ; 1=attacking ; 2=getting hit ; 3=dying cmp.b #1,d0 blt.s ALWALK beq.s ALATTACK cmp.b #3,d0 blt ALGETHIT beq ALDIE bra doneobj2 ALDIE move.l #10,d0 bra intowalk ALGETHIT: move.l #9,d0 bra intowalk ALATTACK: move.l #8,d0 bra intowalk AUXOBJ: dc.w 0 ALWALK: jsr ViewpointToDraw add.l d0,d0 move.l LINKFILE,a6 add.l #AlienStats,a6 moveq #0,d1 move.b TypeOfThing(a0),d1 muls #AlienStatLen,d1 add.l d1,a6 cmp.w #1,A_GFXType(a6) bne.s NOSIDES2 moveq #0,d0 intowalk: NOSIDES2: move.b d0,2(a5) move.l LINKFILE,a6 add.l #AlienAnimData,a6 moveq #0,d1 move.b TypeOfThing(a0),d1 muls #A_AnimLen,d1 add.l d1,a6 ; move.l ANIMPOINTER,a6 muls #A_OptLen,d0 add.w d0,a6 move.w SecTimer(a0),d1 move.w d1,d2 muls #A_FrameLen,d1 moveq #0,d0 move.b 5(a6,d1.w),d0 beq.s .nosoundmake movem.l d0-d7/a0-a6,-(a7) subq #1,d0 move.w d0,Samplenum clr.b notifplaying move.b 1(a0),IDNUM move.w #80,Noisevol move.l #ObjRotated,a1 move.w (a0),d0 lea (a1,d0.w*8),a1 move.l (a1),Noisex jsr MakeSomeNoise movem.l (a7)+,d0-d7/a0-a6 .nosoundmake move.b 6(a6,d1.w),d0 beq.s .noaction add.b #1,(a5) move.b d2,1(a5) .noaction addq #1,d2 moveq #0,d0 move.b 7(a6,d1.w),d0 beq.s .nospecial move.b d0,d3 and.w #63,d3 lsr.w #6,d0 cmp.w #2,d0 blt.s .storeval beq.s .randval sub.b #1,4(a5) beq.s .nospecial move.w d3,d2 bra.s .nospecial .randval: jsr GetRand divs d3,d0 swap d0 move.w d0,d3 .storeval: move.b d3,4(a5) .nospecial: move.w d2,d3 muls #A_FrameLen,d3 tst.b (a6,d3.w) bge.s .noendanim st 3(a5) move.w #0,d2 .noendanim move.w d2,SecTimer(a0) bra doneobj2 JUMPOBJECTANIM: bra doneobj2 timetodamage: dc.w 0 SAVESAVE: dc.w 0 dosomething: addq.w #1,FramesToDraw movem.l d0-d7/a0-a6,-(a7) jsr NARRATOR bsr DOALLANIMS sub.w #1,timetodamage bgt.s .nodam move.w #100,timetodamage move.l PLR1_Roompt,a0 move.w ToFloorNoise(a0),d0 tst.b PLR1_StoodInTop beq.s .okinbot move.w ToUpperFloorNoise(a0),d0 .okinbot: move.l LINKFILE,a0 add.l #FloorData,a0 move.w (a0,d0.w*4),d0 ; damage. move.l PLR1_Obj,a0 add.b d0,damagetaken(a0) move.l PLR2_Roompt,a0 move.w ToFloorNoise(a0),d0 tst.b PLR2_StoodInTop beq.s .okinbot2 move.w ToUpperFloorNoise(a0),d0 .okinbot2: move.l LINKFILE,a0 add.l #FloorData,a0 move.w (a0,d0.w*4),d0 ; damage. move.l PLR2_Obj,a0 add.b d0,damagetaken(a0) .nodam: move.l #KeyMap,a5 tst.b $42(a5) bne.s .tabprsd clr.b tabheld bra.s .noswitch .tabprsd: tst.b tabheld bne.s .noswitch not.b MAPON st tabheld .noswitch tst.b $3e(a5) sne d0 tst.b $1e(a5) sne d1 tst.b $2d(a5) sne d2 tst.b $2f(a5) sne d3 tst.b $3d(a5) sne d4 tst.b $3f(a5) sne d5 tst.b $1d(a5) sne d6 tst.b $1f(a5) sne d7 or.b d4,d0 or.b d5,d0 or.b d6,d1 or.b d7,d1 or.b d4,d2 or.b d6,d2 or.b d7,d3 or.b d5,d3 move.w MAPBRIGHT,d4 add.w #2,d4 clr.l d5 bset d4,d5 tst.b d0 beq.s .nomapup sub.w d5,mapzoff .nomapup tst.b d1 beq.s .nomapdown add.w d5,mapzoff .nomapdown tst.b d2 beq.s .nomapleft add.w d5,mapxoff .nomapleft tst.b d3 beq.s .nomapright sub.w d5,mapxoff .nomapright tst.b $2e(a5) beq.s .nomapcentre move.w #0,mapxoff move.w #0,mapzoff .nomapcentre ; move.w STOPOFFSET,d0 ; tst.b 27(a5) ; beq.s .nolookup ; sub.w #5,d0 ; cmp.w #-80,d0 ; bgt.s .nolookup ; move.w #-80,d0 ;.nolookup: ; tst.b 42(a5) ; beq.s .nolookdown ; add.w #5,d0 ; cmp.w #80,d0 ; blt.s .nolookdown ; move.w #80,d0 ;.nolookdown: ; ; move.w d0,STOPOFFSET ; neg.w d0 ; add.w #120,d0 ; move.w d0,SMIDDLEY ; muls #320*2,d0 ; move.l d0,SBIGMIDDLEY ; jsr INITREC ; jsr RECEIVE ; tst.l BUFFER ; beq.s justshake ; st GOTTOSEND ; move.l #OtherInter,$6c justshake: cmp.b #'b',Prefsfile+3 bne.s .noback jsr mt_music .noback: bra dontshowtime tst.b oktodisplay beq dontshowtime clr.b oktodisplay subq.w #1,dispco bgt dontshowtime move.w #10,dispco move.l #TimerScr+10,a0 move.l TimeCount,d0 bge.s timenotneg move.l #1111*256,d0 timenotneg: asr.l #8,d0 move.l #digits,a1 move.w #7,d2 digitlop divs #10,d0 swap d0 lea (a1,d0.w*8),a2 move.b (a2)+,(a0) move.b (a2)+,24(a0) move.b (a2)+,24*2(a0) move.b (a2)+,24*3(a0) move.b (a2)+,24*4(a0) move.b (a2)+,24*5(a0) move.b (a2)+,24*6(a0) move.b (a2)+,24*7(a0) subq #1,a0 swap d0 ext.l d0 dbra d2,digitlop move.l #TimerScr+10+24*10,a0 move.l NumTimes,d0 move.l #digits,a1 move.w #3,d2 digitlop2 divs #10,d0 swap d0 lea (a1,d0.w*8),a2 move.b (a2)+,(a0) move.b (a2)+,24(a0) move.b (a2)+,24*2(a0) move.b (a2)+,24*3(a0) move.b (a2)+,24*4(a0) move.b (a2)+,24*5(a0) move.b (a2)+,24*6(a0) move.b (a2)+,24*7(a0) subq #1,a0 swap d0 ext.l d0 dbra d2,digitlop2 move.l #TimerScr+10+24*20,a0 moveq #0,d0 move.w FramesToDraw,d0 move.l #digits,a1 move.w #2,d2 digitlop3 divs #10,d0 swap d0 lea (a1,d0.w*8),a2 move.b (a2)+,(a0) move.b (a2)+,24(a0) move.b (a2)+,24*2(a0) move.b (a2)+,24*3(a0) move.b (a2)+,24*4(a0) move.b (a2)+,24*5(a0) move.b (a2)+,24*6(a0) move.b (a2)+,24*7(a0) subq #1,a0 swap d0 ext.l d0 dbra d2,digitlop3 dontshowtime: move.l alanptr,a0 move.l (a0)+,alframe cmp.l #endalan,a0 blt.s nostartalan move.l #alan,a0 nostartalan: move.l a0,alanptr tst.b READCONTROLS beq nocontrols cmp.b #'s',mors beq control2 tst.w PLAYERONEHEALTH bgt .propercontrol move.l #7*2116,hitcol move.l #PLR1_Obj,a0 move.w #-1,12+128(a0) clr.b PLR1_fire clr.b PLR1_clicked move.w #0,ADDTOBOBBLE move.l #playercrouched,PLR1s_height move.w #-80,d0 move.w d0,STOPOFFSET neg.w d0 add.w TOTHEMIDDLE,d0 move.w d0,SMIDDLEY muls #320,d0 move.l d0,SBIGMIDDLEY jsr PLR1_fall move.l PLR1s_xspdval,d6 move.l PLR1s_zspdval,d7 tst.b SLOWDOWN beq.s .nofriction neg.l d6 ble.s .nobug1 asr.l #3,d6 add.l #1,d6 bra.s .bug1 .nobug1 asr.l #3,d6 .bug1: neg.l d7 ble.s .nobug2 asr.l #3,d7 add.l #1,d7 bra.s .bug2 .nobug2 asr.l #3,d7 .bug2: add.l d6,PLR1s_xspdval add.l d7,PLR1s_zspdval .nofriction: move.l PLR1s_xspdval,d6 move.l PLR1s_zspdval,d7 add.l d6,PLR1s_xoff add.l d7,PLR1s_zoff move.w PLR1s_angspd,d3 tst.b SLOWDOWN beq.s .nofric asr.w #2,d3 bge.s .nneg addq #1,d3 .nneg: .nofric: move.w d3,PLR1s_angspd add.w d3,PLR1s_angpos add.w d3,PLR1s_angpos and.w #8190,PLR1s_angpos bra nocontrols .propercontrol: tst.b PLR1MOUSE beq.s PLR1_nomouse bsr PLR1_mouse_control PLR1_nomouse: tst.b PLR1KEYS beq.s PLR1_nokeys bsr PLR1_keyboard_control PLR1_nokeys: ; tst.b PLR1PATH ; beq.s PLR1_nopath ; bsr PLR1_follow_path ;PLR1_nopath: tst.b PLR1JOY beq.s PLR1_nojoy bsr PLR1_JoyStick_control PLR1_nojoy: bra nocontrols control2: tst.w PLAYERTWOHEALTH bgt .propercontrol move.l #7*2116,hitcol move.l #PLR1_Obj,a0 move.w #-1,12+128(a0) clr.b PLR2_fire move.w #0,ADDTOBOBBLE move.l #playercrouched,PLR2s_height move.w #-80,d0 move.w d0,STOPOFFSET neg.w d0 add.w TOTHEMIDDLE,d0 move.w d0,SMIDDLEY muls #320,d0 move.l d0,SBIGMIDDLEY jsr PLR2_fall move.l PLR2s_xspdval,d6 move.l PLR2s_zspdval,d7 tst.b SLOWDOWN beq.s .nofriction neg.l d6 ble.s .nobug1 asr.l #3,d6 add.l #1,d6 bra.s .bug1 .nobug1 asr.l #3,d6 .bug1: neg.l d7 ble.s .nobug2 asr.l #3,d7 add.l #1,d7 bra.s .bug2 .nobug2 asr.l #3,d7 .bug2: add.l d6,PLR2s_xspdval add.l d7,PLR2s_zspdval .nofriction: move.l PLR2s_xspdval,d6 move.l PLR2s_zspdval,d7 add.l d6,PLR2s_xoff add.l d7,PLR2s_zoff move.w PLR2s_angspd,d3 tst.b SLOWDOWN beq.s .nofric asr.w #2,d3 bge.s .nneg addq #1,d3 .nneg: .nofric: move.w d3,PLR2s_angspd add.w d3,PLR2s_angpos add.w d3,PLR2s_angpos and.w #8190,PLR2s_angpos bra.s nocontrols .propercontrol: tst.b PLR2MOUSE beq.s PLR2_nomouse bsr PLR2_mouse_control PLR2_nomouse: tst.b PLR2KEYS beq.s PLR2_nokeys bsr PLR2_keyboard_control PLR2_nokeys: ; tst.b PLR2PATH ; beq.s PLR2_nopath ; bsr PLR1_follow_path ;PLR2_nopath: tst.b PLR2JOY beq.s PLR2_nojoy bsr PLR2_JoyStick_control PLR2_nojoy: nocontrols: move.l #$dff000,a6 cmp.b #'4',Prefsfile+1 bne.s nomuckabout move.w #$0,d0 tst.b NoiseMade0LEFT beq.s noturnoff0 move.w #1,d0 noturnoff0: tst.b NoiseMade0RIGHT beq.s noturnoff1 or.w #2,d0 noturnoff1: tst.b NoiseMade1RIGHT beq.s noturnoff2 or.w #4,d0 noturnoff2: tst.b NoiseMade1LEFT beq.s noturnoff3 or.w #8,d0 noturnoff3: move.w d0,dmacon(a6) nomuckabout: ; tst.b PLR2_fire ; beq.s firenotpressed2 ; fire was pressed last time. ; btst #7,$bfe001 ; bne.s firenownotpressed2 ; fire is still pressed this time. ; st PLR2_fire ; bra dointer firenownotpressed2: ; fire has been released. ; clr.b PLR2_fire ; bra dointer firenotpressed2 ; fire was not pressed last frame... ; btst #7,$bfe001 ; if it has still not been pressed, go back above ; bne.s firenownotpressed2 ; fire was not pressed last time, and was this time, so has ; been clicked. ; st PLR2_clicked ; st PLR2_fire dointer JUSTSOUNDS: tst.b dosounds beq.s .notthing cmp.b #'4',Prefsfile+1 beq fourchannel btst #1,$dff000+intreqr bne.s newsampbitl .notthing: movem.l (a7)+,d0-d7/a0-a6 moveq #0,d0 rts dosounds: dc.w 0 swappedem: dc.w 0 newsampbitl: move.w #$820f,$dff000+dmacon move.w #$200,$dff000+intreq ; tst.b CHANNELDATA ; bne nochannel0 move.l pos0LEFT,a0 move.l pos2LEFT,a1 move.l #tab,a2 moveq #0,d0 moveq #0,d1 move.b vol0left,d0 move.b vol2left,d1 cmp.b d1,d0 slt swappedem bge.s fbig0 ; d1 is bigger so scale d0 and use d1 ; as audiochannel volume. exg a0,a1 asl.w #6,d0 divs d1,d0 lsl.w #8,d0 adda.w d0,a2 move.w d1,$dff0a8 bra.s donechan0 fbig0: tst.w d0 beq.s donechan0 asl.w #6,d1 divs d0,d1 lsl.w #8,d1 adda.w d1,a2 move.w d0,$dff0a8 donechan0: move.l Aupt0,a3 move.l a3,$dff0a0 move.l Auback0,Aupt0 move.l a3,Auback0 move.l Auback0,a3 moveq #0,d0 moveq #0,d1 moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 move.w #49,d7 loop: move.l (a0)+,d0 move.b (a1)+,d1 move.b (a1)+,d2 move.b (a1)+,d3 move.b (a1)+,d4 move.b (a2,d3.w),d5 swap d5 move.b (a2,d1.w),d5 asl.l #8,d5 move.b (a2,d2.w),d5 swap d5 move.b (a2,d4.w),d5 add.l d5,d0 move.l d0,(a3)+ dbra d7,loop tst.b swappedem beq.s .ok23 exg a0,a1 .ok23: cmp.l Samp0endLEFT,a0 blt.s .notoffendsamp1 move.l #empty,a0 move.l #emptyend,Samp0endLEFT move.b #0,vol0left st LEFTCHANDATA+1 move.w #0,LEFTCHANDATA+2 .notoffendsamp1: cmp.l Samp2endLEFT,a1 blt.s .notoffendsamp2 move.l #empty,a1 move.l #emptyend,Samp2endLEFT move.b #0,vol2left st LEFTCHANDATA+1+8 move.w #0,LEFTCHANDATA+2+8 .notoffendsamp2: move.l a0,pos0LEFT move.l a1,pos2LEFT nochannel0: tst.b CHANNELDATA+16 bne nochannel1 move.l pos0RIGHT,a0 move.l pos2RIGHT,a1 move.l Aupt1,a3 move.l a3,$dff0b0 move.l Auback1,Aupt1 move.l a3,Auback1 move.l #tab,a2 moveq #0,d0 moveq #0,d1 move.b vol0right,d0 move.b vol2right,d1 cmp.b d1,d0 slt swappedem bge.s fbig1 ; d1 is bigger so scale d0 and use d1 ; as audiochannel volume. exg a0,a1 asl.w #6,d0 divs d1,d0 lsl.w #8,d0 adda.w d0,a2 move.w d1,$dff0b8 bra.s donechan1 fbig1: tst.w d0 beq.s donechan1 asl.w #6,d1 divs d0,d1 lsl.w #8,d1 adda.w d1,a2 move.w d0,$dff0b8 donechan1: moveq #0,d0 moveq #0,d1 moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 move.w #49,d7 loop2: move.l (a0)+,d0 move.b (a1)+,d1 move.b (a1)+,d2 move.b (a1)+,d3 move.b (a1)+,d4 move.b (a2,d3.w),d5 swap d5 move.b (a2,d1.w),d5 asl.l #8,d5 move.b (a2,d2.w),d5 swap d5 move.b (a2,d4.w),d5 add.l d5,d0 move.l d0,(a3)+ dbra d7,loop2 tst.b swappedem beq.s ok01 exg a0,a1 ok01: cmp.l Samp0endRIGHT,a0 blt.s .notoffendsamp1 move.l #empty,a0 move.l #emptyend,Samp0endRIGHT move.b #0,vol0right st RIGHTCHANDATA+1 move.w #0,RIGHTCHANDATA+2 .notoffendsamp1: cmp.l Samp2endRIGHT,a1 blt.s .notoffendsamp2 move.l #empty,a1 move.l #emptyend,Samp2endRIGHT move.b #0,vol2right st RIGHTCHANDATA+1+8 move.w #0,RIGHTCHANDATA+2+8 .notoffendsamp2: move.l a0,pos0RIGHT move.l a1,pos2RIGHT nochannel1: ******************* Other two channels move.l pos1LEFT,a0 move.l pos3LEFT,a1 move.l #tab,a2 moveq #0,d0 moveq #0,d1 move.b vol1left,d0 move.b vol3left,d1 cmp.b d1,d0 slt swappedem bge.s fbig2 ; d1 is bigger so scale d0 and use d1 ; as audiochannel volume. exg a0,a1 asl.w #6,d0 divs d1,d0 lsl.w #8,d0 adda.w d0,a2 move.w d1,$dff0d8 bra.s donechan2 fbig2: tst.w d0 beq.s donechan2 asl.w #6,d1 divs d0,d1 lsl.w #8,d1 adda.w d1,a2 move.w d0,$dff0d8 donechan2: move.l Aupt2,a3 move.l a3,$dff0d0 move.l Auback2,Aupt2 move.l a3,Auback2 moveq #0,d0 moveq #0,d1 moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 move.w #49,d7 loop3: move.l (a0)+,d0 move.b (a1)+,d1 move.b (a1)+,d2 move.b (a1)+,d3 move.b (a1)+,d4 move.b (a2,d3.w),d5 swap d5 move.b (a2,d1.w),d5 asl.l #8,d5 move.b (a2,d2.w),d5 swap d5 move.b (a2,d4.w),d5 add.l d5,d0 move.l d0,(a3)+ dbra d7,loop3 tst.b swappedem beq.s .ok23 exg a0,a1 .ok23: cmp.l Samp1endLEFT,a0 blt.s .notoffendsamp3 move.l #empty,a0 move.l #emptyend,Samp1endLEFT move.b #0,vol1left st LEFTCHANDATA+1+4 move.w #0,LEFTCHANDATA+2+4 .notoffendsamp3: cmp.l Samp3endLEFT,a1 blt.s .notoffendsamp4 move.l #empty,a1 move.l #emptyend,Samp3endLEFT move.b #0,vol3left st LEFTCHANDATA+1+12 move.w #0,LEFTCHANDATA+2+12 .notoffendsamp4: move.l a0,pos1LEFT move.l a1,pos3LEFT move.l pos1RIGHT,a0 move.l pos3RIGHT,a1 move.l Aupt3,a3 move.l a3,$dff0c0 move.l Auback3,Aupt3 move.l a3,Auback3 move.l #tab,a2 moveq #0,d0 moveq #0,d1 move.b vol1right,d0 move.b vol3right,d1 cmp.b d1,d0 slt.s swappedem bge.s fbig3 exg a0,a1 asl.w #6,d0 divs d1,d0 lsl.w #8,d0 adda.w d0,a2 move.w d1,$dff0c8 bra.s donechan3 fbig3: tst.w d0 beq.s donechan3 asl.w #6,d1 divs d0,d1 lsl.w #8,d1 adda.w d1,a2 move.w d0,$dff0c8 donechan3: moveq #0,d0 moveq #0,d1 moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 move.w #49,d7 loop4: move.l (a0)+,d0 move.b (a1)+,d1 move.b (a1)+,d2 move.b (a1)+,d3 move.b (a1)+,d4 move.b (a2,d3.w),d5 swap d5 move.b (a2,d1.w),d5 asl.l #8,d5 move.b (a2,d2.w),d5 swap d5 move.b (a2,d4.w),d5 add.l d5,d0 move.l d0,(a3)+ dbra d7,loop4 tst.b swappedem beq.s .ok23 exg a0,a1 .ok23: cmp.l Samp1endRIGHT,a0 blt.s notoffendsamp3 move.l #empty,a0 move.l #emptyend,Samp1endRIGHT move.b #0,vol1right st RIGHTCHANDATA+1+4 move.w #0,RIGHTCHANDATA+2+4 notoffendsamp3: cmp.l Samp3endRIGHT,a1 blt.s notoffendsamp4 move.l #empty,a1 move.l #emptyend,Samp3endRIGHT move.b #0,vol3right st RIGHTCHANDATA+1+12 move.w #0,RIGHTCHANDATA+2+12 notoffendsamp4: move.l a0,pos1RIGHT move.l a1,pos3RIGHT movem.l (a7)+,d0-d7/a0-a6 tst.b counting beq .nostartcounter JSR STARTCOUNT .nostartcounter: moveq #0,d0 rts *********************************** * 4 channel sound routine *********************************** fourchannel: move.l #$dff000,a6 btst #7,intreqrl(a6) beq.s nofinish0 ; move.w #0,LEFTCHANDATA+2 ; st LEFTCHANDATA+1 move.l #null,$a0(a6) move.w #100,$a4(a6) move.w #$0080,intreq(a6) nofinish0: tst.b NoiseMade0pLEFT beq.s NoChan0sound move.l Samp0endLEFT,d0 move.l pos0LEFT,d1 sub.l d1,d0 lsr.l #1,d0 move.w d0,$a4(a6) move.l d1,$a0(a6) ext.l d0 divs #100,d0 move.w d0,playnull0 move.w #$8201,dmacon(a6) moveq #0,d0 move.b vol0left,d0 move.w d0,$a8(a6) NoChan0sound: ***************************************** ***************************************** btst #0,intreqr(a6) beq.s nofinish1 move.l #null,$b0(a6) move.w #100,$b4(a6) move.w #$0100,intreq(a6) nofinish1: tst.b NoiseMade0pRIGHT beq.s NoChan1sound move.l Samp0endRIGHT,d0 move.l pos0RIGHT,d1 sub.l d1,d0 lsr.l #1,d0 move.w d0,$b4(a6) move.l d1,$b0(a6) ext.l d0 divs #100,d0 move.w d0,playnull1 move.w #$8202,dmacon(a6) moveq #0,d0 move.b vol0right,d0 move.w d0,$b8(a6) NoChan1sound: ***************************************** ***************************************** btst #1,intreqr(a6) beq.s nofinish2 move.l #null,$c0(a6) move.w #100,$c4(a6) move.w #$0200,intreq(a6) nofinish2: tst.b NoiseMade1pRIGHT beq.s NoChan2sound move.l Samp1endRIGHT,d0 move.l pos1RIGHT,d1 sub.l d1,d0 lsr.l #1,d0 move.w d0,$c4(a6) ext.l d0 divs #100,d0 move.w d0,playnull2 move.l d1,$c0(a6) move.w #$8204,dmacon(a6) moveq #0,d0 move.b vol1right,d0 move.w d0,$c8(a6) NoChan2sound: ***************************************** ***************************************** btst #2,intreqr(a6) beq.s nofinish3 move.l #null,$d0(a6) move.w #100,$d4(a6) move.w #$0400,intreq(a6) nofinish3: tst.b NoiseMade1pLEFT beq.s NoChan3sound move.l Samp1endLEFT,d0 move.l pos1LEFT,d1 sub.l d1,d0 lsr.l #1,d0 move.w d0,$d4(a6) ext.l d0 divs #100,d0 move.w d0,playnull3 move.l d1,$d0(a6) move.w #$8208,dmacon(a6) moveq #0,d0 move.b vol1left,d0 move.w d0,$d8(a6) NoChan3sound: nomorechannels: move.l NoiseMade0LEFT,NoiseMade0pLEFT move.l #0,NoiseMade0LEFT move.l NoiseMade0RIGHT,NoiseMade0pRIGHT move.l #0,NoiseMade0RIGHT ; tst.b playnull0 ; beq.s .nnul ; sub.b #1,playnull0 ; bra.s chan0still ;.nnul: ; ;chan0still: tst.b NoiseMade0pLEFT bne.s chan0still tst.w playnull0 beq.s nnul0 sub.w #1,playnull0 bra.s chan0still nnul0: move.w #0,LEFTCHANDATA+2 st LEFTCHANDATA+1 chan0still: tst.b NoiseMade0pRIGHT bne.s chan1still ;it'll never work tst.w playnull1 beq.s nnul1 sub.w #1,playnull1 bra.s chan1still nnul1: move.w #0,RIGHTCHANDATA+2 st RIGHTCHANDATA+1 chan1still: tst.b NoiseMade1pRIGHT bne.s chan2still tst.w playnull2 beq.s nnul2 sub.w #1,playnull2 bra.s chan2still nnul2: move.w #0,RIGHTCHANDATA+2+4 st RIGHTCHANDATA+1+4 chan2still: tst.b NoiseMade1pLEFT bne.s chan3still tst.w playnull3 beq.s nnul3 sub.w #1,playnull3 bra.s chan3still nnul3: move.w #0,LEFTCHANDATA+2+4 st LEFTCHANDATA+1+4 chan3still: movem.l (a7)+,d0-d7/a0-a6 moveq #0,d0 rts backbeat: dc.w 0 playnull0: dc.w 0 playnull1: dc.w 0 playnull2: dc.w 0 playnull3: dc.w 0 Samp0endRIGHT: dc.l emptyend Samp1endRIGHT: dc.l emptyend Samp2endRIGHT: dc.l emptyend Samp3endRIGHT: dc.l emptyend Samp0endLEFT: dc.l emptyend Samp1endLEFT: dc.l emptyend Samp2endLEFT: dc.l emptyend Samp3endLEFT: dc.l emptyend Aupt0: dc.l null Auback0: dc.l null+500 Aupt2: dc.l null3 Auback2: dc.l null3+500 Aupt3: dc.l null4 Auback3: dc.l null4+500 Aupt1: dc.l null2 Auback1: dc.l null2+500 NoiseMade0LEFT: dc.b 0 NoiseMade1LEFT: dc.b 0 NoiseMade2LEFT: dc.b 0 NoiseMade3LEFT: dc.b 0 NoiseMade0pLEFT: dc.b 0 NoiseMade1pLEFT: dc.b 0 NoiseMade2pLEFT: dc.b 0 NoiseMade3pLEFT: dc.b 0 NoiseMade0RIGHT: dc.b 0 NoiseMade1RIGHT: dc.b 0 NoiseMade2RIGHT: dc.b 0 NoiseMade3RIGHT: dc.b 0 NoiseMade0pRIGHT: dc.b 0 NoiseMade1pRIGHT: dc.b 0 NoiseMade2pRIGHT: dc.b 0 NoiseMade3pRIGHT: dc.b 0 empty: ds.l 100 emptyend: ************************************** * I want a routine to calculate all the * info needed for the sound player to * work, given say position of noise, volume * and sample number. Samplenum: dc.w 0 Noisex: dc.w 0 Noisez: dc.w 0 Noisevol: dc.w 0 chanpick: dc.w 0 IDNUM: dc.w 0 needleft: dc.b 0 needright: dc.b 0 STEREO: dc.b $0 even prot6: dc.w 0 even CHANNELDATA: LEFTCHANDATA: dc.l $00000000 dc.l $00000000 dc.l $FF000000 dc.l $FF000000 RIGHTCHANDATA: dc.l $00000000 dc.l $00000000 dc.l $FF000000 dc.l $FF000000 RIGHTPLAYEDTAB: ds.l 20 LEFTPLAYEDTAB: ds.l 20 MakeSomeNoise: ; Plan for new sound handler: ; It is sent a sample number, ; a position relative to the ; player, an id number and a volume. ; Also notifplaying. ; indirect inputs are the available ; channel flags and whether or not ; stereo sound is selected. ; the algorithm must decide ; whether the new sound is more ; important than the ones already ; playing. Thus an 'importance' ; must be calculated, probably ; using volume. ; The output needs to be: ; Write the pointers and volumes of ; the sound channels tst.b notifplaying beq.s dontworry ; find if we are already playing move.b IDNUM,d0 move.w #7,d1 lea CHANNELDATA,a3 findsameasme tst.b (a3) bne.s notavail cmp.b 1(a3),d0 beq SameAsMe notavail: add.w #4,a3 dbra d1,findsameasme bra dontworry SameAsMe rts noiseloud: dc.w 0 dontworry: ; Ok its fine for us to play a sound. ; So calculate left/right volume. move.w Noisex,d1 muls d1,d1 move.w Noisez,d2 muls d2,d2 move.w #64,d3 move.w #32767,noiseloud moveq #1,d0 add.l d1,d2 beq pastcalc 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,d3 muls d3,d3 ; x*x sub.l d2,d3 ; x*x-a asr.l #1,d3 ; (x*x-a)/2 divs d0,d3 ; (x*x-a)/2x sub.w d3,d0 ; second approx bgt .stillnot0 move.w #1,d0 .stillnot0 move.w d0,d3 muls d3,d3 sub.l d2,d3 asr.l #1,d3 divs d0,d3 sub.w d3,d0 ; second approx bgt .stillnot02 move.w #1,d0 .stillnot02 move.w Noisevol,d3 ext.l d3 asl.l #6,d3 cmp.l #32767,d3 ble.s .nnnn move.l #32767,d3 .nnnn asr.w #2,d0 addq #1,d0 divs d0,d3 move.w d3,noiseloud cmp.w #64,d3 ble.s notooloud move.w #64,d3 notooloud: pastcalc: ; d3 contains volume of noise. move.w d3,d4 tst.b STEREO beq NOSTEREO move.w d3,d2 muls Noisex,d2 asl.w #2,d0 divs d0,d2 bgt.s quietleft add.w d2,d4 bge.s donequiet move.w #0,d4 bra.s donequiet quietleft: sub.w d2,d3 bge.s donequiet move.w #0,d3 donequiet: ; d3=leftvol? ; d4=rightvol? clr.w needleft cmp.b d3,d4 bgt.s RightLouder ; Left is louder; is it MUCH louder? st needleft move.w d3,d2 sub.w d4,d2 cmp.w #32,d2 slt needright bra aboutsame RightLouder: st needright move.w d4,d2 sub.w d3,d2 cmp.w #32,d2 slt needleft aboutsame: ; Find least important sound on left move.l #0,a2 move.l #0,d5 move.w #32767,d2 move.b IDNUM,d0 lea LEFTCHANDATA,a3 move.w #3,d1 FindLeftChannel tst.b (a3) bne.s .notactive cmp.b 1(a3),d0 beq.s FOUNDLEFT cmp.w 2(a3),d2 blt.s .notactive move.w 2(a3),d2 move.l a3,a2 move.w d5,d6 .notactive: add.w #4,a3 add.w #1,d5 dbra d1,FindLeftChannel move.l a2,a3 bra.s gopastleft FOUNDLEFT: move.w d5,d6 gopastleft: tst.l a3 bne.s FOUNDALEFT NONOISE: rts FOUNDALEFT: cmp.w noiseloud,d3 bge.s NONOISE ; d6 = channel number move.b d0,1(a3) move.w d3,2(a3) move.w Samplenum,d5 move.l #SampleList,a3 move.l (a3,d5.w*8),a1 move.l 4(a3,d5.w*8),a2 tst.b d6 seq NoiseMade0LEFT beq.s .chan0 cmp.b #2,d6 slt NoiseMade1LEFT blt .chan1 seq NoiseMade2LEFT beq .chan2 st NoiseMade3LEFT move.b d5,LEFTPLAYEDTAB+9 move.b d3,LEFTPLAYEDTAB+1+9 move.b d4,LEFTPLAYEDTAB+2+9 move.b d3,vol3left move.l a1,pos3LEFT move.l a2,Samp3endLEFT bra dorightchan .chan0: move.b d5,LEFTPLAYEDTAB move.b d3,LEFTPLAYEDTAB+1 move.b d4,LEFTPLAYEDTAB+2 move.l a1,pos0LEFT move.l a2,Samp0endLEFT move.b d3,vol0left bra dorightchan .chan1: move.b d5,LEFTPLAYEDTAB+3 move.b d3,LEFTPLAYEDTAB+1+3 move.b d4,LEFTPLAYEDTAB+2+3 move.b d3,vol1left move.l a1,pos1LEFT move.l a2,Samp1endLEFT bra dorightchan .chan2: move.b d5,LEFTPLAYEDTAB+6 move.b d3,LEFTPLAYEDTAB+1+6 move.b d4,LEFTPLAYEDTAB+2+6 move.l a1,pos2LEFT move.l a2,Samp2endLEFT move.b d3,vol2left dorightchan: ; Find least important sound on right move.l #0,a2 move.l #0,d5 move.w #10000,d2 move.b IDNUM,d0 lea RIGHTCHANDATA,a3 move.w #3,d1 FindRightChannel tst.b (a3) bne.s .notactive cmp.b 1(a3),d0 beq.s FOUNDRIGHT cmp.w 2(a3),d2 blt.s .notactive move.w 2(a3),d2 move.l a3,a2 move.w d5,d6 .notactive: add.w #4,a3 add.w #1,d5 dbra d1,FindRightChannel move.l a2,a3 bra.s gopastright FOUNDRIGHT: move.w d5,d6 gopastright: tst.l a3 bne.s FOUNDARIGHT rts FOUNDARIGHT: ; d6 = channel number move.b d0,1(a3) move.w d3,2(a3) move.w Samplenum,d5 move.l #SampleList,a3 move.l (a3,d5.w*8),a1 move.l 4(a3,d5.w*8),a2 tst.b d6 seq NoiseMade0RIGHT beq.s .chan0 cmp.b #2,d6 slt NoiseMade1RIGHT blt .chan1 seq NoiseMade2RIGHT beq .chan2 st NoiseMade3RIGHT move.b d5,RIGHTPLAYEDTAB+9 move.b d3,RIGHTPLAYEDTAB+1+9 move.b d4,RIGHTPLAYEDTAB+2+9 move.b d4,vol3right move.l a1,pos3RIGHT move.l a2,Samp3endRIGHT rts .chan0: move.b d5,RIGHTPLAYEDTAB move.b d3,RIGHTPLAYEDTAB+1 move.b d4,RIGHTPLAYEDTAB+2 move.l a1,pos0RIGHT move.l a2,Samp0endRIGHT move.b d4,vol0right rts .chan1: move.b d5,RIGHTPLAYEDTAB+3 move.b d3,RIGHTPLAYEDTAB+1+3 move.b d4,RIGHTPLAYEDTAB+2+3 move.b d3,vol1right move.l a1,pos1RIGHT move.l a2,Samp1endRIGHT rts .chan2: move.b d5,RIGHTPLAYEDTAB+6 move.b d3,RIGHTPLAYEDTAB+1+6 move.b d4,RIGHTPLAYEDTAB+2+6 move.l a1,pos2RIGHT move.l a2,Samp2endRIGHT move.b d3,vol2right rts NOSTEREO: move.l #0,a2 move.l #-1,d5 move.w #32767,d2 move.b IDNUM,d0 lea CHANNELDATA,a3 move.w #7,d1 FindChannel tst.b (a3) bne.s .notactive cmp.b 1(a3),d0 beq.s FOUNDMYCHAN cmp.w 2(a3),d2 blt.s .notactive move.w 2(a3),d2 move.l a3,a2 move.w d5,d6 add.w #1,d6 .notactive: add.w #4,a3 add.w #1,d5 dbra d1,FindChannel move.l a2,a3 bra.s gopastchan FOUNDMYCHAN: move.w 2(a3),d2 FOUNDCHAN: move.w d5,d6 add.w #1,d6 gopastchan: tst.w d6 bge.s FOUNDACHAN tooquiet: rts FOUNDACHAN: ; d6 = channel number cmp.w noiseloud,d2 bgt.s tooquiet move.b d0,1(a3) move.w noiseloud,2(a3) move.w Samplenum,d5 move.l #SampleList,a3 move.l (a3,d5.w*8),a1 move.l 4(a3,d5.w*8),a2 tst.b d6 beq .chan0 cmp.b #2,d6 blt .chan1 beq .chan2 cmp.b #4,d6 blt .chan3 beq .chan4 cmp.b #6,d6 blt .chan5 beq .chan6 st NoiseMade3RIGHT move.b d5,RIGHTPLAYEDTAB+9 move.b d3,RIGHTPLAYEDTAB+1+9 move.b d4,RIGHTPLAYEDTAB+2+9 move.b d4,vol3right move.l a1,pos3RIGHT move.l a2,Samp3endRIGHT rts .chan3: st NoiseMade3LEFT move.b d5,LEFTPLAYEDTAB+9 move.b d3,LEFTPLAYEDTAB+1+9 move.b d4,LEFTPLAYEDTAB+2+9 move.b d3,vol3left move.l a1,pos3LEFT move.l a2,Samp3endLEFT bra dorightchan .chan0: st NoiseMade0LEFT move.b d5,LEFTPLAYEDTAB move.b d3,LEFTPLAYEDTAB+1 move.b d4,LEFTPLAYEDTAB+2 move.l a1,pos0LEFT move.l a2,Samp0endLEFT move.b d3,vol0left rts .chan1: st NoiseMade1LEFT move.b d5,LEFTPLAYEDTAB+3 move.b d3,LEFTPLAYEDTAB+1+3 move.b d4,LEFTPLAYEDTAB+2+3 move.b d3,vol1left move.l a1,pos1LEFT move.l a2,Samp1endLEFT rts .chan2: st NoiseMade2LEFT move.b d5,LEFTPLAYEDTAB+6 move.b d3,LEFTPLAYEDTAB+1+6 move.b d4,LEFTPLAYEDTAB+2+6 move.l a1,pos2LEFT move.l a2,Samp2endLEFT move.b d3,vol2left rts .chan4: st NoiseMade0RIGHT move.b d5,RIGHTPLAYEDTAB move.b d3,RIGHTPLAYEDTAB+1 move.b d4,RIGHTPLAYEDTAB+2 move.l a1,pos0RIGHT move.l a2,Samp0endRIGHT move.b d4,vol0right rts .chan5: st NoiseMade1RIGHT move.b d5,RIGHTPLAYEDTAB+3 move.b d3,RIGHTPLAYEDTAB+1+3 move.b d4,RIGHTPLAYEDTAB+2+3 move.b d3,vol1right move.l a1,pos1RIGHT move.l a2,Samp1endRIGHT rts .chan6: st NoiseMade2RIGHT move.b d5,RIGHTPLAYEDTAB+6 move.b d3,RIGHTPLAYEDTAB+1+6 move.b d4,RIGHTPLAYEDTAB+2+6 move.l a1,pos2RIGHT move.l a2,Samp2endRIGHT move.b d3,vol2right rts SampleList: dc.l Scream,EndScream dc.l Shoot,EndShoot dc.l Munch,EndMunch dc.l PooGun,EndPooGun dc.l Collect,EndCollect ;5 dc.l DoorNoise,EndDoorNoise dc.l 0,0 dc.l Stomp,EndStomp dc.l LowScream,EndLowScream dc.l BaddieGun,EndBaddieGun ;10 dc.l SwitchNoise,EndSwitch dc.l Reload,EndReload dc.l NoAmmo,EndNoAmmo dc.l Splotch,EndSplotch dc.l SplatPop,EndSplatPop ;15 dc.l Boom,EndBoom dc.l Hiss,EndHiss dc.l Howl1,EndHowl1 dc.l Howl2,EndHowl2 dc.l Pant,EndPant ;20 dc.l Whoosh,EndWhoosh dc.l ROAR,EndROAR dc.l whoosh,Endwhoosh dc.l 0,0 dc.l 0,0 dc.l 0,0 dc.l 0,0 dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.l 0 storeval: dc.w 0 include "ab3:source_4000/wallchunk.s" include "ab3:source_4000/newloadfromdisk.s" include "ab3:source_4000/screensetup.s" include "ab3:source_4000/CONTROLLOOP.s" saveinters: dc.w 0 z: dc.w 10 notifplaying: dc.w 0 audpos1: dc.w 0 audpos1b: dc.w 0 audpos2: dc.w 0 audpos2b: dc.w 0 audpos3: dc.w 0 audpos3b: dc.w 0 audpos4: dc.w 0 audpos4b: dc.w 0 vol0left: dc.w 0 vol0right: dc.w 0 vol1left: dc.w 0 vol1right: dc.w 0 vol2left: dc.w 0 vol2right: dc.w 0 vol3left: dc.w 0 vol3right: dc.w 0 pos: dc.l 0 pos0LEFT: dc.l empty pos1LEFT: dc.l empty pos2LEFT: dc.l empty pos3LEFT: dc.l empty pos0RIGHT: dc.l empty pos1RIGHT: dc.l empty pos2RIGHT: dc.l empty pos3RIGHT: dc.l empty numtodo dc.w 0 npt: dc.w 0 pretab: val SET 0 REPT 128 dc.b val val SET val+1 ENDR val SET -128 REPT 128 dc.b val val SET val+1 ENDR tab: ifeq CHEESEY ds.b 256*65 endc test: dc.l 0 ds.l 30 even ConstCols: ; incbin "ConstCols" even Smoothscalecols: ; incbin "smoothbumppalscaled" even SmoothTile: ; incbin "smoothbumptile" even Bumpscalecols: ; incbin "Bumppalscaled" even Bumptile: ; incbin "bumptile" even scalecols: ;incbin "bytepixpalscaled" even ;floorscalecols: ; incbin "floor256pal" ; ds.w 256*4 even PaletteAddr: dc.l 0 ChunkAddr: dc.l 0 ;walltiles: ; dc.l GreenMechanicWALL ; dc.l BlueGreyMetalWALL ; dc.l TechnoDetailWALL ; dc.l BlueStoneWALL ; dc.l RedAlertWALL ; dc.l RockWALL ; ;GreenMechanicWALL: incbin "ab3:includes/walls/greenmechanic.wad" ;BlueGreyMetalWALL: incbin "ab3:includes/walls/BlueGreyMetal.wad" ;TechnoDetailWALL: incbin "ab3:includes/walls/TechnoDetail.wad" ;BlueStoneWALL: incbin "ab3:includes/walls/bluestone.wad" ;RedAlertWALL: incbin "ab3:includes/walls/redalert.wad" ;RockWALL: incbin "ab3:includes/walls/rock.wad" floortile: dc.l 0 ; incbin "floortile" even wallrouts: ; incbin "2x2WallDraw" CNOP 0,64 ifeq CHEESEY BackPicture: incbin "rawback" EndBackPicture: endc drawpt: dc.l 0 olddrawpt: dc.l 0 frompt: dc.l 0 SineTable: incbin "bigsine" angspd: dc.w 0 flooryoff: dc.w 0 xoff: dc.l 0 yoff: dc.l 0 yvel: dc.l 0 zoff: dc.l 0 tyoff: dc.l 0 xspdval: dc.l 0 zspdval: dc.l 0 Zone: dc.w 0 PLR1: dc.b $ff even PLR1_energy: dc.w 191 PLR1_GunSelected: dc.w 0 PLR1_cosval: dc.w 0 PLR1_sinval: dc.w 0 PLR1_angpos: dc.w 0 PLR1_angspd: dc.w 0 PLR1_xoff: dc.l 0 PLR1_yoff: dc.l 0 PLR1_yvel: dc.l 0 PLR1_zoff: dc.l 0 PLR1_tyoff: dc.l 0 PLR1_xspdval: dc.l 0 PLR1_zspdval: dc.l 0 PLR1_Zone: dc.w 0 PLR1_Roompt: dc.l 0 PLR1_FloorSpd: dc.l 0 PLR2_FloorSpd: dc.l 0 PLR1_OldRoompt: dc.l 0 PLR1_PointsToRotatePtr: dc.l 0 PLR1_ListOfGraphRooms: dc.l 0 PLR1_oldxoff: dc.l 0 PLR1_oldzoff: dc.l 0 PLR1_StoodInTop: dc.b 0 even PLR1_height: dc.l 0 PLR1_RoomBright: dc.w 0 DOUBLEWIDTH: dc.b $0,0 DOUBLEHEIGHT: dc.b 0,0 PLR1_TELEPORTED: dc.w 0 PLR2_TELEPORTED: dc.w 0 ds.w 4 OLDX1: dc.l 0 OLDX2: dc.l 0 OLDZ1: dc.l 0 OLDZ2: dc.l 0 XDIFF1: dc.l 0 ZDIFF1: dc.l 0 XDIFF2: dc.l 0 ZDIFF2: dc.l 0 PLR1s_cosval: dc.w 0 PLR1s_sinval: dc.w 0 PLR1s_angpos: dc.w 0 PLR1s_angspd: dc.w 0 PLR1s_xoff: dc.l 0 PLR1s_yoff: dc.l 0 PLR1s_yvel: dc.l 0 PLR1s_zoff: dc.l 0 PLR1s_tyoff: dc.l 0 PLR1s_xspdval: dc.l 0 PLR1s_zspdval: dc.l 0 PLR1s_Zone: dc.w 0 PLR1s_Roompt: dc.l 0 PLR1s_OldRoompt: dc.l 0 PLR1s_PointsToRotatePtr: dc.l 0 PLR1s_ListOfGraphRooms: dc.l 0 PLR1s_oldxoff: dc.l 0 PLR1s_oldzoff: dc.l 0 PLR1s_height: dc.l 0 PLR1s_targheight: dc.l 0 p1_xoff: dc.l 0 p1_zoff: dc.l 0 p1_yoff: dc.l 0 p1_height: dc.l 0 p1_angpos: dc.w 0 p1_bobble: dc.w 0 p1_clicked: dc.b 0 p1_spctap: dc.b 0 p1_ducked: dc.b 0 p1_gunselected: dc.b 0 p1_fire: dc.b 0 even p1_holddown: dc.w 0 ds.w 4 PLR2: dc.b $ff even PLR2_GunSelected: dc.w 0 PLR2_energy: dc.w 191 PLR2_cosval: dc.w 0 PLR2_sinval: dc.w 0 PLR2_angpos: dc.w 0 PLR2_angspd: dc.w 0 PLR2_xoff: dc.l 0 PLR2_yoff: dc.l 0 PLR2_yvel: dc.l 0 PLR2_zoff: dc.l 0 PLR2_tyoff: dc.l 0 PLR2_xspdval: dc.l 0 PLR2_zspdval: dc.l 0 PLR2_Zone: dc.w 0 PLR2_Roompt: dc.l 0 PLR2_OldRoompt: dc.l 0 PLR2_PointsToRotatePtr: dc.l 0 PLR2_ListOfGraphRooms: dc.l 0 PLR2_oldxoff: dc.l 0 PLR2_oldzoff: dc.l 0 PLR2_StoodInTop: dc.b 0 even PLR2_height: dc.l 0 ds.w 4 PLR2s_cosval: dc.w 0 PLR2s_sinval: dc.w 0 PLR2s_angpos: dc.w 0 PLR2s_angspd: dc.w 0 PLR2s_xoff: dc.l 0 PLR2s_yoff: dc.l 0 PLR2s_yvel: dc.l 0 PLR2s_zoff: dc.l 0 PLR2s_tyoff: dc.l 0 PLR2s_xspdval: dc.l 0 PLR2s_zspdval: dc.l 0 PLR2s_Zone: dc.w 0 PLR2s_Roompt: dc.l 0 PLR2s_OldRoompt: dc.l 0 PLR2s_PointsToRotatePtr: dc.l 0 PLR2s_ListOfGraphRooms: dc.l 0 PLR2s_oldxoff: dc.l 0 PLR2s_oldzoff: dc.l 0 PLR2s_height: dc.l 0 PLR2s_targheight: dc.l 0 ds.w 4 p2_xoff: dc.l 0 p2_zoff: dc.l 0 p2_yoff: dc.l 0 p2_height: dc.l 0 p2_angpos: dc.w 0 p2_bobble: dc.w 0 p2_clicked: dc.b 0 p2_spctap: dc.b 0 p2_ducked: dc.b 0 p2_gunselected: dc.b 0 p2_fire: dc.b 0 even p2_holddown: dc.w 0 liftanimtab: endliftanimtab: glassball: ; incbin "glassball.inc" endglass glassballpt: dc.l glassball rndtab: ; incbin "randfile" endrnd: brightanimtab: ; dcb.w 200,20 ; dc.w 5 ; dc.w 10,20 ; dc.w 5 ; dcb.w 30,20 ; dc.w 7,10,10,5,10,0,5,6,5,6,5,6,5,6,0 ; dcb.w 40,0 ; dc.w 1,2,3,2,3,2,3,2,3,2,3,2,3,0 ; dcb.w 300,0 ; dc.w 1,0,1,0,2,2,2,5,5,5,5,5,5,5,5,5,6,10 ; dc.w -1 Roompt: dc.l 0 OldRoompt: dc.l 0 ***************************************************************** * include "AB3:source_4000/LevelData2" * ***************************************************************** wallpt: dc.l 0 floorpt: dc.l 0 Rotated: ds.l 2*800 ObjRotated: ds.l 2*500 OnScreen: ds.l 2*800 startwait: dc.w 0 endwait: dc.w 0 ;Faces: ; incbin "faces2raw" LINKS: dc.l 0 FLYLINKS: dc.l 0 ************************************************************* consttab: incbin "constantfile" ******************************************************************* ********************************* ; include "ab3:source_4000/loadmod.a" ; include "ab3:source_4000/proplayer.a" darkentab: ;val SET 0 ; REPT 256 ; dc.b val ;val SET val+1 ; ENDR ; incbin "darkenfile" MIDDLEX: dc.w 0 RIGHTX: dc.w 192 FULLSCR: dc.w 0 SHADINGTABLE: incbin "SHADEFILE" ****************************************** * Link file !***************************** ****************************************** LINKSPACE: ; ds.l 22500 ; incbin "ab3:includes/test.lnk" LINKname: dc.b "ab3:includes/test.lnk",0 LINKFILE: dc.l LINKSPACE ****************************************** brightentab: incbin "brightenfile" WorkSpace: ds.l 8192 waterfile: incbin "waterfile" SECTION ffff,CODE_C nullspr: dc.l 0 cnop 0,8 ;borders: ; incbin "newleftbord" ; incbin "newrightbord" health: ;incbin "healthstrip" Ammunition: ;incbin "ammostrip" healthpal: ;incbin "healthpal" PanelKeys: ;incbin "greenkey" ; incbin "redkey" ; incbin "yellowkey" ; incbin "bluekey" null: ds.w 100 null2: ds.w 100 null3: ds.w 100 null4: ds.w 100 Blurbfield: dc.w bpl1ptl bl1l: dc.w 0 dc.w bpl1pth bl1h: dc.w 0 dc.w diwstart,$2c81 dc.w diwstop,$1cc1 dc.w ddfstart,$38 dc.w ddfstop,$b8 dc.w bplcon0,$9201 dc.w bplcon1,0 dc.w $106,$c40 blcols: dc.w col0,0 dc.w col1,$fff dc.w $108,0 dc.w $10a,0 dc.w $ffff,$fffe dc.w $ffff,$fffe nullline: ds.b 80 include "ab3:source_4000/titlecop.s" bigfield: ; Start of our copper list. dc.w dmacon,$8020 dc.w intreq,$8011 dc.w $1fc,$f dc.w diwstart winstart: dc.w $2c81 dc.w diwstop winstop: dc.w $2cc1 dc.w ddfstart fetchstart: dc.w $38 dc.w ddfstop fetchstop: dc.w $b8 bordercols: incbin "borderpal" dc.w spr0ptl s0l: dc.w 0 dc.w spr0pth s0h: dc.w 0 dc.w spr1ptl s1l: dc.w 0 dc.w spr1pth s1h: dc.w 0 dc.w spr2ptl s2l: dc.w 0 dc.w spr2pth s2h: dc.w 0 dc.w spr3ptl s3l: dc.w 0 dc.w spr3pth s3h: dc.w 0 dc.w spr4ptl s4l: dc.w 0 dc.w spr4pth s4h: dc.w 0 dc.w spr5ptl s5l: dc.w 0 dc.w spr5pth s5h: dc.w 0 dc.w spr6ptl s6l: dc.w 0 dc.w spr6pth s6h: dc.w 0 dc.w spr7ptl s7l: dc.w 0 dc.w spr7pth s7h: dc.w 0 ; dc.w $106,$c42 ; incbin "borderpal" dc.w $106,$c42 dc.w bplcon0,$0211 dc.w bplcon1 smoff: dc.w $0 dc.w $108 modulo: dc.w 0 dc.w $10a,0 dc.w $1001,$ff00 dc.w intreq,$11 PALETTESPACE: dcb.l 528,$1fe0000 dc.w $2001,$ff00 dc.w bpl1pth pl1h dc.w 0 dc.w bpl1ptl pl1l dc.w 0 dc.w bpl2pth pl2h dc.w 0 dc.w bpl2ptl pl2l dc.w 0 dc.w bpl3pth pl3h dc.w 0 dc.w bpl3ptl pl3l dc.w 0 dc.w bpl4pth pl4h dc.w 0 dc.w bpl4ptl pl4l dc.w 0 dc.w bpl5pth pl5h dc.w 0 dc.w bpl5ptl pl5l dc.w 0 dc.w bpl6pth pl6h dc.w 0 dc.w bpl6ptl pl6l dc.w 0 dc.w bpl7pth pl7h dc.w 0 dc.w bpl7ptl pl7l dc.w 0 dc.w bpl8pth pl8h dc.w 0 dc.w bpl8ptl pl8l dc.w 0 val SET $2c SCRMODULOS: REPT 232 dc.b val,1,$ff,$fe dc.w $108,0 dc.w $10a,0 dc.b val,$df,$ff,$fe val SET (val+1)&$ff ENDR dc.w $108,0,$10a,0 dc.w $2401,$ff00 dc.w ddfstop,$c8 dc.w bplcon0,$9201 dc.w bpl1ptl scroll: dc.w 0 dc.w bpl1pth scrolh: dc.w 0 dc.w $106,$c40 dc.w $180,0 dc.w $182,$f0 ; dc.w $108,40 ; dc.w $10a,40 ; dc.w $80 ;JUMPBACKH: ; dc.w 0 ; dc.w $82 ;JUMPBACKL: ; dc.w 0 ; dc.w $8a,0 dc.w $ffff,$fffe dc.w $ffff,$fffe PALETTEBIT: incbin "256palette" dc.w $ffff,$fffe yposcop: ; dc.w $2a11,$fffe ; dc.w $8a,0 ; ds.l 104*12 ;colbars: ;val SET $2a ; dcb.l 104*80,$1fe0000 ; dc.w $106,$c42 ; ; dc.w $80 ;pch1: ; dc.w 0 ; dc.w $82 ;pcl1: ; dc.w 0 ; ; dc.w $88,0 ; ; dc.w $ffff,$fffe ; End copper list. ; ds.l 104*12 ;colbars2: ;val SET $2a ; dcb.l 104*80,$1fe0000 ; ; dc.w $106,$c42 ; ; dc.w $80 ;pch2: ; dc.w 0 ; dc.w $82 ;pcl2: ; dc.w 0 ; ; dc.w $88,0 ; ; dc.w $ffff,$fffe ; End copper list. ; ds.l 104*10 NullCopper: dc.w $ffff,$fffe hitcol: dc.l 0 old: dc.l 0 CNOP 0,64 SCROLLSCRN: ds.l 20*16 SCROLLOFFSET: dc.w 0 SCROLLTIMER: dc.w 100 SCROLLDIRECTION: dc.w 1 SCROLLXPOS: dc.w 0 SCROLLPOINTER: dc.l testscroll ENDSCROLL: dc.l endtestscroll testscroll: ; 12345678901234567890123456789012345678901234567890123456789012345678901234567890 ; dc.b "The Quick Brown Fox Jumped Over The Lazy Dog! " ; dc.b "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ " ; dc.b "The Quick Brown Fox Jumped Over The Lazy Dog! " BLANKSCROLL: dc.b " " endtestscroll: prot5: dc.w 0 PanelCop: dc.w $80 och: dc.w 0 dc.w $82 ocl: dc.w 0 statskip: dc.w $1fe,0 dc.w $1fe,0 dc.w $10c,0 dc.w bplcon0,$1201 dc.w bpl1ptl n1l: dc.w 0 dc.w bpl1pth n1h: dc.w 0 dc.w $108,-24 ; incbin "Panelpal" dc.w bpl2pth p2h dc.w 0 dc.w bpl2ptl p2l dc.w 0 dc.w bpl3pth p3h dc.w 0 dc.w bpl3ptl p3l dc.w 0 dc.w bpl4pth p4h dc.w 0 dc.w bpl4ptl p4l dc.w 0 dc.w bpl5pth p5h dc.w 0 dc.w bpl5ptl p5l dc.w 0 dc.w bpl6pth p6h dc.w 0 dc.w bpl6ptl p6l dc.w 0 dc.w bpl7pth p7h dc.w 0 dc.w bpl7ptl p7l dc.w 0 dc.w bpl8pth p8h dc.w 0 dc.w bpl8ptl p8l dc.w 0 dc.w ddfstart,$38 dc.w ddfstop,$b8 dc.w diwstart,$2c81 dc.w diwstop,$2cc1 dc.w bplcon0 Panelcon: dc.w $0211 dc.w bpl1pth p1h dc.w 0 dc.w bpl1ptl p1l dc.w 0 dc.w $108,40*7 dc.w $10a,40*7 dc.w $ffff,$fffe dc.w $180,$fff dc.w $f801,$ff00 dc.w col1,$50 dc.w $f901,$ff00 dc.w col1,$90 dc.w $fa01,$ff00 dc.w col1,$f0 dc.w $fb01,$ff00 dc.w col1,$f0 dc.w $fc01,$ff00 dc.w col1,$90 dc.w $fd01,$ff00 dc.w col1,$50 dc.w $fe01,$ff00 dc.w col1,$fff dc.w $ffdf,$fffe dc.w $a01,$ff00 dc.w bplcon0,$201 ; incbin "faces2cols" dc.w bpl1pth f1h dc.w 0 dc.w bpl1ptl f1l dc.w 0 dc.w bpl2pth f2h dc.w 0 dc.w bpl2ptl f2l dc.w 0 dc.w bpl3pth f3h dc.w 0 dc.w bpl3ptl f3l dc.w 0 dc.w bpl4pth f4h dc.w 0 dc.w bpl4ptl f4l dc.w 0 dc.w bpl5pth f5h dc.w 0 dc.w bpl5ptl f5l dc.w 0 dc.w $0c01,$ff00 dc.w bplcon0,$5201 dc.w $ffff,$fffe cnop 0,64 FacePlace: ; ds.l 6*32*5 TEXTSCRN: dc.l 0 TEXTCOP: dc.w intreq,$8030 dc.w spr0ptl txs0l: dc.w 0 dc.w spr0pth txs0h: dc.w 0 dc.w spr1ptl txs1l: dc.w 0 dc.w spr1pth txs1h: dc.w 0 dc.w spr2ptl txs2l: dc.w 0 dc.w spr2pth txs2h: dc.w 0 dc.w spr3ptl txs3l: dc.w 0 dc.w spr3pth txs3h: dc.w 0 dc.w spr4ptl txs4l: dc.w 0 dc.w spr4pth txs4h: dc.w 0 dc.w spr5ptl txs5l: dc.w 0 dc.w spr5pth txs5h: dc.w 0 dc.w spr6ptl txs6l: dc.w 0 dc.w spr6pth txs6h: dc.w 0 dc.w spr7ptl txs7l: dc.w 0 dc.w spr7pth txs7h: dc.w 0 dc.w $10c,$0088 dc.w $1fc,$f dc.w diwstart,$2c81 ; Top left corner of screen. dc.w diwstop,$2cc1 ; Bottom right corner of screen. dc.w ddfstart,$38 ; Data fetch start. dc.w ddfstop,$c8 ; Data fetch stop. dc.w bplcon0 TSCP: dc.w $9201 dc.w $106,$c40 dc.w $2a01,$ff00 dc.w col0,0 dc.w col1 TOPLET: TXTCOLL: dc.w 0 dc.w col2 BOTLET: dc.w 0 dc.w col3 ALLTEXT: dc.w $fff dc.w $106,$e40 dc.w col3 ALLTEXTLOW: dc.w $0 dc.w bpl1pth TSPTh: dc.w 0 dc.w bpl1ptl TSPTl: dc.w 0 dc.w bpl2pth TSPTh2: dc.w 0 dc.w bpl2ptl TSPTl2: dc.w 0 dc.w $108,0 dc.w $10a,0 dc.w $ffff,$fffe ******************************************** * Stuff you don't have to worry about yet. * ******************************************** closeeverything: ; jsr mt_end move.l #nullcop,d0 ; move.l old,d0 ;charlie move.l d0,$dff080 ; Restore old copper list. move.w d0,ocl swap d0 move.w d0,och ; move.l doslib,a6 ; move.l #4,d1 ; jsr -198(a6) ; move.l doslib,d0 ; move.l d0,a1 ; move.l 4.w,a6 ; jsr CloseLib(a6) move.l #$dff000,a6 move.w #$8020,dmacon(a6) move.w #$f,dmacon(a6) ; move.l 4.w,a6 ; lea VBLANKInt,a1 ; moveq #INTB_COPER,d0 ; jsr _LVORemIntServer(a6) ; IFEQ CD32VER ; move.l OLDKINT,$68.w ; ENDC ; move.w saveinters,d0 ; or.w #$c000,d0 ; move.w d0,intena(a6) clr.w $dff0a8 clr.w $dff0b8 clr.w $dff0c8 clr.w $dff0d8 ; move.l oldview,a1 ; move.l a1,d0 ; move.l gfxbase,a6 ; jsr -$de(a6) ; cmp.b #'s',mors ; beq.s leaveold ; move.w #$f8e,$dff1dc ;leaveold: jsr RELEASELEVELMEM jsr RELEASESCRNMEM move.l #0,d0 rts intbase: dc.l 0 gfxbase: dc.l 0 oldview: dc.l 0 stuff: PRSDL Lea gfxname(pc),a1 Moveq.l #0,d0 Move.l $4.w,a6 Jsr -$228(a6) add.w d1,RVAL1 Move.l d0,gfxbase Move.l d0,a6 Use As Base Reg Move.l 34(a6),oldview move.l 38(a6),old rts gfxname dc.b "graphics.library",0 even INTUNAME dc.b "intuition.library",0 even cnop 0,64 Panel: dc.l 0 TimerScr: ;ds.b 40*64 scrntab: ds.b 16 val SET 32 REPT 96 dc.b val,val,val val SET val+1 ENDR ds.b 16 smallscrntab: val SET 32 REPT 96 dc.b val,val val SET val+1 ENDR cnop 0,64 scrn: dc.l 0 ; incbin "ab3:includes/newborderRAW" ; ds.b 80 scrn2: dc.l 0 ;flib: ; incbin "ab3:includes/newborderRAW" ; ds.b 80 ;flib2: ; incbin "ab3:includes/newborderRAW" ; ds.b 80 ; incbin "ab3:includes/newborderRAW" ; ds.b 80 SCRNDRAWPT: dc.l 0 SCRNSHOWPT: dc.l 0 ; dcb.l 8,$33333333 ; dc.l 0 ; dc.l 0 ; ; dcb.l 8,$0f0f0f0f ; dc.l 0 ; dc.l 0 ; ; dcb.l 8,$00ff00ff ; dc.l 0 ; dc.l 0 ; ; dcb.l 8,$0000ffff ; dc.l 0 ; dc.l 0 ; ; dc.l 0,-1,0,-1,0,-1,0,-1 ; dc.l 0 ; dc.l 0 ; ; dc.l -1,-1,0,0,-1,-1,0,0 ; dc.l 0 ; dc.l 0 ; ; dc.l 0,0,-1,-1,-1,-1,-1,-1 ; dc.l 0 ; dc.l 0 NumTimes: dc.l 0 TimeCount: dc.l 0 oldtime: dc.l 0 counting: dc.b 0 oktodisplay: dc.b 0 INITTIMER: move.l #0,TimeCount move.l #0,NumTimes rts STARTCOUNT: move.l d0,-(a7) move.l $dff004,d0 and.l #$1ffff,d0 move.l d0,oldtime st counting move.l (a7)+,d0 rts STOPCOUNT: move.l d0,-(a7) move.l $dff004,d0 and.l #$1ffff,d0 sub.l oldtime,d0 cmp.l #-256,d0 bge.s okcount add.l #313*256,d0 okcount: add.l d0,TimeCount addq.l #1,NumTimes clr.b counting move.l (a7)+,d0 rts STOPCOUNTNOADD: move.l d0,-(a7) move.l $dff004,d0 and.l #$1ffff,d0 sub.l oldtime,d0 cmp.l #-256,d0 bge.s okcount2 add.l #313*256,d0 okcount2: add.l d0,TimeCount clr.b counting move.l (a7)+,d0 rts maxbot: dc.w 0 tstneg: dc.l 0 STOPTIMER: st oktodisplay rts digits: incbin "numbers.inc" COMPACTMAP: ds.l 257 BIGMAP: ds.l 256*10 Section Sounds,CODE_C nullcop: dc.w $106,$c40 dc.w $180,0 dc.w $100,$0 dc.w $ffff,$fffe Scream: ; incbin "ab3:sounds/Scream" ; ds.w 100 EndScream: LowScream: ; incbin "ab3:sounds/LowScream" ; ds.w 100 EndLowScream: BaddieGun: ; incbin "ab3:sounds/BaddieGun" EndBaddieGun: bass: ; incbin "ab3:sounds/backbass+drum" bassend: Shoot: ; incbin "ab3:sounds/fire!" EndShoot: Munch: ; incbin "ab3:sounds/munch" EndMunch: PooGun: ; incbin "ab3:sounds/shoot.dm" EndPooGun: Collect: ; incbin "ab3:sounds/collect" EndCollect: DoorNoise: ; incbin "ab3:sounds/newdoor" EndDoorNoise: Stomp: ; incbin "ab3:sounds/footstep3" EndStomp: SwitchNoise: ; incbin "ab3:sounds/switch" EndSwitch: Reload: ; incbin "ab3:sounds/switch1.SFX" EndReload: CHEATFRAME: dc.b 26,20,33,27,17,12 ENDCHEAT: NoAmmo: ; incbin "ab3:sounds/noammo" EndNoAmmo: Splotch: ; incbin "ab3:sounds/splotch" EndSplotch: SplatPop: ; incbin "ab3:sounds/splatpop" EndSplatPop: Boom: ; incbin "ab3:sounds/boom" EndBoom: Hiss: ; incbin "ab3:sounds/newhiss" EndHiss: Howl1: ; incbin "ab3:sounds/howl1" EndHowl1: Howl2: ; incbin "ab3:sounds/howl2" EndHowl2: Pant: ; incbin "ab3:sounds/pant" EndPant: Whoosh: ; incbin "ab3:sounds/whoosh" EndWhoosh: ROAR: ; incbin "ab3:sounds/bigscream" EndROAR whoosh: ; incbin "ab3:sounds/flame" Endwhoosh: SECTION music,code_c UseAllChannels: dc.w 0 mt_init: move.l mt_data,a0 move.l a0,a1 add.l #$3b8,a1 moveq #$7f,d0 moveq #0,d1 mt_loop:move.l d1,d2 subq.w #1,d0 mt_lop2:move.b (a1)+,d1 cmp.b d2,d1 bgt.s mt_loop dbf d0,mt_lop2 addq.b #1,d2 lea mt_samplestarts(pc),a1 asl.l #8,d2 asl.l #2,d2 add.l #$43c,d2 add.l a0,d2 move.l d2,a2 moveq #$1e,d0 mt_lop3: clr.l (a2) move.l a2,(a1)+ moveq #0,d1 move.w 42(a0),d1 asl.l #1,d1 add.l d1,a2 add.l #$1e,a0 dbf d0,mt_lop3 or.b #$2,$bfe001 move.b #$6,mt_speed clr.w $dff0a8 clr.w $dff0b8 clr.w $dff0c8 clr.w $dff0d8 clr.b mt_songpos clr.b mt_counter clr.w mt_pattpos rts mt_end: clr.w $dff0a8 clr.w $dff0b8 clr.w $dff0c8 clr.w $dff0d8 move.w #$f,$dff096 rts mt_music: movem.l d0-d4/a0-a3/a5-a6,-(a7) move.l mt_data,a0 addq.b #$1,mt_counter move.b mt_counter,D0 cmp.b mt_speed,D0 blt.s mt_nonew clr.b mt_counter bra mt_getnew mt_nonew: lea mt_voice1(pc),a6 lea $dff0a0,a5 bsr mt_checkcom lea mt_voice2(pc),a6 lea $dff0b0,a5 bsr mt_checkcom ; tst.b UseAllChannels ; beq mt_endr lea mt_voice3(pc),a6 lea $dff0c0,a5 bsr mt_checkcom lea mt_voice4(pc),a6 lea $dff0d0,a5 bsr mt_checkcom bra mt_endr mt_arpeggio: moveq #0,d0 move.b mt_counter,d0 divs #$3,d0 swap d0 cmp.w #$0,d0 beq.s mt_arp2 cmp.w #$2,d0 beq.s mt_arp1 moveq #0,d0 move.b $3(a6),d0 lsr.b #4,d0 bra.s mt_arp3 mt_arp1:moveq #0,d0 move.b $3(a6),d0 and.b #$f,d0 bra.s mt_arp3 mt_arp2:move.w $10(a6),d2 bra.s mt_arp4 mt_arp3:asl.w #1,d0 moveq #0,d1 move.w $10(a6),d1 lea mt_periods(pc),a0 moveq #$24,d7 mt_arploop: move.w (a0,d0.w),d2 cmp.w (a0),d1 bge.s mt_arp4 addq.l #2,a0 dbf d7,mt_arploop rts mt_arp4:move.w d2,$6(a5) rts mt_getnew: move.l mt_data,a0 move.l a0,a3 move.l a0,a2 add.l #$c,a3 add.l #$3b8,a2 add.l #$43c,a0 moveq #0,d0 move.l d0,d1 move.b mt_songpos,d0 move.b (a2,d0.w),d1 asl.l #8,d1 asl.l #2,d1 add.w mt_pattpos,d1 clr.w mt_dmacon lea $dff0a0,a5 lea mt_voice1(pc),a6 bsr mt_playvoice lea $dff0b0,a5 lea mt_voice2(pc),a6 bsr mt_playvoice ; tst.b UseAllChannels ; beq mt_setdma lea $dff0c0,a5 lea mt_voice3(pc),a6 bsr mt_playvoice lea $dff0d0,a5 lea mt_voice4(pc),a6 bsr mt_playvoice bra mt_setdma PROTCALC: ; include "ab3:source_4000/protcalc.s" incbin "ab3:includes/protcalc.bin" ENDPROTCALC: mt_playvoice: move.l (a0,d1.l),(a6) addq.l #4,d1 moveq #0,d2 move.b $2(a6),d2 and.b #$f0,d2 lsr.b #4,d2 move.b (a6),d0 and.b #$f0,d0 or.b d0,d2 tst.b d2 beq.s mt_setregs moveq #0,d3 lea mt_samplestarts(pc),a1 move.l d2,d4 subq.l #$1,d2 asl.l #2,d2 mulu #$1e,d4 move.l (a1,d2.l),$4(a6) move.w (a3,d4.l),$8(a6) move.w $2(a3,d4.l),$12(a6) move.w $4(a3,d4.l),d3 tst.w d3 beq.s mt_noloop move.l $4(a6),d2 asl.w #1,d3 add.l d3,d2 move.l d2,$a(a6) move.w $4(a3,d4.l),d0 add.w $6(a3,d4.l),d0 move.w d0,8(a6) move.w $6(a3,d4.l),$e(a6) move.w $12(a6),d0 asr.w #2,d0 move.w d0,$8(a5) bra.s mt_setregs mt_noloop: move.l $4(a6),d2 add.l d3,d2 move.l d2,$a(a6) move.w $6(a3,d4.l),$e(a6) move.w $12(a6),d0 asr.w #2,d0 move.w d0,$8(a5) mt_setregs: move.w (a6),d0 and.w #$fff,d0 beq mt_checkcom2 move.b $2(a6),d0 and.b #$F,d0 cmp.b #$3,d0 bne.s mt_setperiod bsr mt_setmyport bra mt_checkcom2 mt_setperiod: move.w (a6),$10(a6) and.w #$fff,$10(a6) move.w $14(a6),d0 move.w d0,$dff096 clr.b $1b(a6) move.l $4(a6),(a5) move.w $8(a6),$4(a5) move.w $10(a6),d0 and.w #$fff,d0 move.w d0,$6(a5) move.w $14(a6),d0 or.w d0,mt_dmacon bra mt_checkcom2 mt_setdma: move.w #250,d0 mt_wait: add.w #1,testchip dbra d0,mt_wait move.w mt_dmacon,d0 or.w #$8000,d0 and.w #%1111111111110011,d0 move.w d0,$dff096 move.w #250,d0 mt_wait2: add.w #1,testchip dbra d0,mt_wait2 lea $dff000,a5 tst.b UseAllChannels beq.s noall lea mt_voice4(pc),a6 move.l $a(a6),$d0(a5) move.w $e(a6),$d4(a5) lea mt_voice3(pc),a6 move.l $a(a6),$c0(a5) move.w $e(a6),$c4(a5) noall: lea mt_voice2(pc),a6 move.l $a(a6),$b0(a5) move.w $e(a6),$b4(a5) lea mt_voice1(pc),a6 move.l $a(a6),$a0(a5) move.w $e(a6),$a4(a5) add.w #$10,mt_pattpos cmp.w #$400,mt_pattpos bne.s mt_endr mt_nex: clr.w mt_pattpos clr.b mt_break addq.b #1,mt_songpos and.b #$7f,mt_songpos move.b mt_songpos,d1 ; cmp.b mt_data+$3b6,d1 ; bne.s mt_endr ; move.b mt_data+$3b7,mt_songpos mt_endr:tst.b mt_break bne.s mt_nex movem.l (a7)+,d0-d4/a0-a3/a5-a6 rts mt_setmyport: move.w (a6),d2 and.w #$fff,d2 move.w d2,$18(a6) move.w $10(a6),d0 clr.b $16(a6) cmp.w d0,d2 beq.s mt_clrport bge.s mt_rt move.b #$1,$16(a6) rts mt_clrport: clr.w $18(a6) mt_rt: rts CODESTORE: dc.l 0 mt_myport: move.b $3(a6),d0 beq.s mt_myslide move.b d0,$17(a6) clr.b $3(a6) mt_myslide: tst.w $18(a6) beq.s mt_rt moveq #0,d0 move.b $17(a6),d0 tst.b $16(a6) bne.s mt_mysub add.w d0,$10(a6) move.w $18(a6),d0 cmp.w $10(a6),d0 bgt.s mt_myok move.w $18(a6),$10(a6) clr.w $18(a6) mt_myok:move.w $10(a6),$6(a5) rts mt_mysub: sub.w d0,$10(a6) move.w $18(a6),d0 cmp.w $10(a6),d0 blt.s mt_myok move.w $18(a6),$10(a6) clr.w $18(a6) move.w $10(a6),$6(a5) rts mt_vib: move.b $3(a6),d0 beq.s mt_vi move.b d0,$1a(a6) mt_vi: move.b $1b(a6),d0 lea mt_sin(pc),a4 lsr.w #$2,d0 and.w #$1f,d0 moveq #0,d2 move.b (a4,d0.w),d2 move.b $1a(a6),d0 and.w #$f,d0 mulu d0,d2 lsr.w #$6,d2 move.w $10(a6),d0 tst.b $1b(a6) bmi.s mt_vibmin add.w d2,d0 bra.s mt_vib2 mt_vibmin: sub.w d2,d0 mt_vib2:move.w d0,$6(a5) move.b $1a(a6),d0 lsr.w #$2,d0 and.w #$3c,d0 add.b d0,$1b(a6) rts mt_nop: move.w $10(a6),$6(a5) rts mt_checkcom: move.w $2(a6),d0 and.w #$fff,d0 beq.s mt_nop move.b $2(a6),d0 and.b #$f,d0 tst.b d0 beq mt_arpeggio cmp.b #$1,d0 beq.s mt_portup cmp.b #$2,d0 beq mt_portdown cmp.b #$3,d0 beq mt_myport cmp.b #$4,d0 beq mt_vib move.w $10(a6),$6(a5) cmp.b #$a,d0 beq.s mt_volslide rts mt_volslide: moveq #0,d0 move.b $3(a6),d0 lsr.b #4,d0 tst.b d0 beq.s mt_voldown add.w d0,$12(a6) cmp.w #$40,$12(a6) bmi.s mt_vol2 move.w #$40,$12(a6) mt_vol2:move.w $12(a6),d0 asr.w #2,d0 move.w d0,$8(a5) rts mt_voldown: moveq #0,d0 move.b $3(a6),d0 and.b #$f,d0 sub.w d0,$12(a6) bpl.s mt_vol3 clr.w $12(a6) mt_vol3:move.w $12(a6),d0 asr.w #2,d0 move.w d0,$8(a5) rts mt_portup: moveq #0,d0 move.b $3(a6),d0 sub.w d0,$10(a6) move.w $10(a6),d0 and.w #$fff,d0 cmp.w #$71,d0 bpl.s mt_por2 and.w #$f000,$10(a6) or.w #$71,$10(a6) mt_por2:move.w $10(a6),d0 and.w #$fff,d0 move.w d0,$6(a5) rts mt_portdown: clr.w d0 move.b $3(a6),d0 add.w d0,$10(a6) move.w $10(a6),d0 and.w #$fff,d0 cmp.w #$358,d0 bmi.s mt_por3 and.w #$f000,$10(a6) or.w #$358,$10(a6) mt_por3:move.w $10(a6),d0 and.w #$fff,d0 move.w d0,$6(a5) rts mt_checkcom2: move.b $2(a6),d0 and.b #$f,d0 cmp.b #$e,d0 beq.s mt_setfilt cmp.b #$d,d0 beq.s mt_pattbreak cmp.b #$b,d0 beq.s mt_posjmp cmp.b #$c,d0 beq.s mt_setvol cmp.b #$f,d0 beq.s mt_setspeed rts mt_setfilt: move.b $3(a6),d0 and.b #$1,d0 asl.b #$1,d0 and.b #$fd,$bfe001 or.b d0,$bfe001 rts mt_pattbreak: not.b mt_break rts mt_posjmp: st reachedend move.b $3(a6),d0 subq.b #$1,d0 move.b d0,mt_songpos not.b mt_break rts mt_setvol: cmp.b #$40,$3(a6) ble.s mt_vol4 move.b #$40,$3(a6) mt_vol4:move.b $3(a6),d0 asr.w #2,d0 move.w d0,$8(a5) rts mt_setspeed: cmp.b #$1f,$3(a6) ble.s mt_sets move.b #$1f,$3(a6) mt_sets:move.b $3(a6),d0 beq.s mt_rts2 move.b d0,mt_speed clr.b mt_counter mt_rts2:rts mt_sin: DC.b $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd DC.b $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18 mt_periods: DC.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a,$01fc,$01e0 DC.w $01c5,$01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d,$010d,$00fe DC.w $00f0,$00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097,$008f,$0087 DC.w $007f,$0078,$0071,$0000,$0000 reachedend: dc.b 0 mt_speed: DC.b 6 mt_songpos: DC.b 0 mt_pattpos: DC.w 0 mt_counter: DC.b 0 mt_break: DC.b 0 mt_dmacon: DC.w 0 mt_samplestarts:DS.L $1f mt_voice1: DS.w 10 DC.w 1 DS.w 3 mt_voice2: DS.w 10 DC.w 2 DS.w 3 mt_voice3: DS.w 10 DC.w 4 DS.w 3 mt_voice4: DS.w 10 DC.w 8 DS.w 3 CHEATPTR: dc.l 0 CHEATNUM: dc.l 0 testchip: dc.w 0 ;/* End of File */ mt_data: dc.l 0 tstchip: dc.l 0 include "SERIAL_NIGHTMARE" ingame: ; incbin "ab3:includes/ingame" gameover: ;incbin "ab3:includes/gameover" welldone: incbin "ab3:includes/newwelldone"