************************************************* * Colourful sprite rotation program * * by Nick Jameson in 1995 * ************************************************* ENHANCE EQU 1 TIMING EQU 0 WIDTH EQU 1 ASPECT EQU 0 BLUE EQU 1 LINCOLN EQU 0 DISTORT EQU 0 WOBBLE2 EQU 0 COUNTF EQU 0 HEIGHT EQU $71 DELAY EQU 3 FETCH EQU $60 EYE EQU $8D007900 LIPS EQU $8D009D00 OPT A+,O+ INCDIR include: INCLUDE hardware/hard.i SECTION ,CODE_C bra prepare frame lea sintab(pc),a0 ;AUTO ROTATE:- move.w angle(pc),d0 move.w rotsin1(pc),d1 move.w rotsin2(pc),d2 btst.b #2,POTINP-VHPOSR(a6) beq.s nacc addq.w #5,d1 subq.w #1,d2 move.w d1,rotsin1-sintab(a0) move.w d2,rotsin2-sintab(a0) nacc and.w #$3FE,d1 and.w #$3FE,d2 move.l a0,a1 move.l a0,a2 add.w d1,a1 add.w d2,a2 move.w (a2),d2 asr.w #1,d2 add.w (a1),d2 asr.w #7,d2 add.w d2,d0 move.w zoom(pc),d4 move.b xs(pc),d7 move.b ys(pc),d6 ;READ JOYSTICK:- move.w JOY1DAT-VHPOSR(a6),d5 btst #1,d5 beq.s noright not.b d5 addq.b #8,d7 bvc.s noright subq.b #8,d7 noright and.b #1,d5 beq.s nodown addq.b #8,d6 bvc.s nodown subq.b #8,d6 nodown btst #9,d5 beq.s noleft not.w d5 subq.b #8,d7 bvc.s noleft addq.b #8,d7 noleft and.w #$100,d5 beq.s noup subq.b #8,d6 bvc.s noup addq.b #8,d6 noup move.b mouse(pc),d1 ;move.b mouse+1(pc),d3 ;READ MOUSE:- move.b JOY0DAT-VHPOSR(a6),d2 ;move.b JOY0DAT-VHPOSR+1(a6),d5 move.b d2,mouse-sintab(a0) ;move.b d5,mouse-sintab+1(a0) sub.b d1,d2 ;sub.b d3,d5 ext.w d2 ;ext.w d5 add.w d2,d4 ;asl.w #5,d5 ;add.w d5,d0 move.w d0,angle-sintab(a0) and.w #$1FF0,d0 cmp.w #$2B6,d4 bcs.s zoomok sub.w d2,d4 zoomok move.w d4,zoom-sintab(a0) move.b d7,xs-sintab(a0) move.b d6,ys-sintab(a0) addq.b #4,d6 addq.b #4,d7 asr.b #3,d6 asr.b #3,d7 sub.b d7,xs-sintab(a0) sub.b d6,ys-sintab(a0) ;addq.b #1,d6 ;addq.b #1,d7 ;asr.b #1,d6 ;asr.b #1,d7 add.b x(pc),d7 add.b d6,y-sintab(a0) move.b d7,x-sintab(a0) move.w y(pc),a2 add.w #$18,d4 mulu d4,d4 lsr.l #4,d4 add.w #$200,d4 ;d0=angle ;d4=zoom (size) ;d7=x ;a2=y ;NOW USE THOSE NUMBERS TO DRAW FRAME:- move.w d4,d5 lsr.w #3,d0 add.w d0,a0 muls $100(a0),d4 ;zoomed cosine muls (a0),d5 ;zoomed sine asr.l #2,d4 asr.l #2,d5 move.l d4,a5 move.l d5,a1 IFNE ASPECT^WIDTH add.l d4,d4 add.l d5,d5 add.l a5,d4 add.l a1,d5 asr.l #1,d4 asr.l #1,d5 ENDC move.w d5,a4 lsr.l #8,d4 move.w d4,a3 swap d4 swap d5 moveq #22,d6 ;xlo offset ;xhi offset 1=2 ;ylo offset ;yhi offset 1=$200 ;d1:d0=-22*d4:a3[+0.5] ;d3:d2=-22*d5:a4[+0.5] move.w a3,d0 move.b d4,d1 move.w a4,d2 move.w d5,d3 mulu d6,d0 mulu d6,d1 mulu d6,d2 mulu d6,d3 swap d0 swap d2 add.b d0,d1 add.w d2,d3 swap d0 swap d2 neg.w d0 negx.b d1 neg.w d2 negx.w d3 add.b d7,d1 add.b d7,d1 add.w a2,d3 add.w a2,d3 addq.b #1,d1 add.w #$100,d3 lea pels+2(pc),a0 move.w #$FEFE,d6 N SET 0 OPT OW- REPT 45 move.w d3,d7 move.b d1,d7 add.w a3,d0 addx.b d4,d1 add.w a4,d2 addx.w d5,d3 and.w d6,d7 move.w d7,N(a0) ;`optimized' 1st time N SET N+4 ENDR OPT OW+ move.l a1,d5 asr.l #8,d5 lsr.l #1,d5 move.l a5,d4 asr.l #1,d4 move.w d5,a4 ;=sinlo move.w d4,a5 ;=coslo swap d4 ;.w=coshi 1=$200 swap d5 ;.b=sinhi 1=2 ;d1:d0=(HEIGHT-1)>>1*d5:a4[+0.5] ;d3:d2=-((HEIGHT-1)>>1)*d4:a5[+0.5] moveq #(HEIGHT-1)>>1,d7 move.w a4,d0 move.b d5,d1 move.w d4,d2 mulu d7,d0 mulu d7,d1 mulu d7,d2 moveq #1,d3 swap d3 move.w d2,d3 move.w a5,d2 mulu d7,d2 swap d0 swap d2 add.b d0,d1 add.w d2,d3 swap d0 swap d2 neg.w d2 negx.w d3 addq.b #1,d1 add.w #$100,d3 add.w d7,d7 ;scanline counter lea scrbuf(pc),a1 ;screen buffer stack ;xYYYYYYYxXXXXXXX0 rotate move.l d3,a0 ;4 move.b d1,d3 ;4 and.w d6,d3 ;4 exg a0,d3 ;6(8?) sub.w a4,d0 ;4 subx.b d5,d1 ;4 add.w a5,d2 ;4 addx.w d4,d3 ;4 pels move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;get (cx+rx,cy+ry), put in (sx,sy) move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 move.w 1(a0),-(a1) ;16 dbf d7,rotate ;10(12?) ;1 MEM CYCLE/PIXEL SAVED BY NOT ADDRESSING A COPPER LIST SV EQU $AC-HEIGHT>>1 IFNE WIDTH lea COLOR17-VHPOSR(a6),a2 lea COLOR31-VHPOSR(a6),a3 lea COLOR01-VHPOSR(a6),a0 lea COLOR15-VHPOSR(a6),a5 ELSEIF lea COLOR17-VHPOSR(a6),a0 lea COLOR31-VHPOSR(a6),a5 lea COLOR01-VHPOSR(a6),a2 lea COLOR15-VHPOSR(a6),a3 ENDC lea 1(a6),a4 move.w #(SV-1)<<8+$80,d0 moveq #$6E,d7 IFNE TIMING move.w #0,COLOR00-VHPOSR(a6) ENDC ;SYNCHRONIZE PROCESSOR THEN DISPLAY FRAME:- ;ABOUT 23/45 CYCLES/PIXEL WASTED BY NOT USING COPPER;REFLECT?REPEAT? ;WIDTH?DOUBLE HEIGHT PIXELS(SYNC.[PART OF?]CALC. TO DISP.?)?FRAME RATE? ;LACE ONE FRAME WITH NEXT?ETC syncchk cmp.w (a6),d0 bcs.s syncchk sync cmp.w (a6),d0 bcc.s sync IFNE TIMING move.w #$333,COLOR00-VHPOSR(a6) ENDC REPT HEIGHT movem.l (a1)+,d0-6 movem.l d0-6,(a0) move.w (a1)+,(a5) movem.l (a1)+,d0-6 movem.l d0-6,(a2) move.w (a1)+,(a3) movem.l (a1)+,d0-6 cmp.b (a4),d7 DC.W $64FC ;bcc.s cmp.. movem.l d0-6,(a0) move.w (a1)+,(a5) ENDR IFNE TIMING move.w #$900,COLOR00-VHPOSR(a6) ENDC btst.b #6,(_ciaa).l bne frame lea ($7FFF).w,a1 move.w a1,DMACON-VHPOSR(a6) move.w a1,d7 addq.w #1,a1 lea restore(pc),a0 putback move.l (a0)+,(a1)+ dbf d7,putback lea scrbuf(pc),a0 IFNE COUNTF move.l a0,a1 moveq #-1,d1 move.w #$3FF,d7 wplp move.l d1,(a1)+ dbf d7,wplp move.l a0,a1 move.w #45*HEIGHT-1,d7 cflp move.w -(a1),d0 sf (a0,d0.w) dbf d7,cflp ENDC moveq #0,d0 move.w #4095,d7 count tst.b (a0)+ bne.s notused addq.w #1,d0 notused dbf d7,count move.w d0,(colcnt).l rts prepare lea frame(pc),a0 cmp.l #$28000,a0 bcc.s go rts go INCBIN startupcode.i lea (CUSTOM).l,a6 lea ($7FFF).w,a0 move.w a0,INTENA(a6) move.w a0,DMACON(a6) move.w a0,d7 addq.w #1,a0 lea restore(pc),a1 clr.l red-restore(a1) clr.l green-restore(a1) clr.l blue-restore(a1) preserv move.l (a0)+,(a1)+ dbf d7,preserv moveq #$7F,d1 alp moveq #$7F,d0 anlp OPT OW- IFNE ENHANCE subq.b #1,d1 bsr getpel move.w d2,d4 addq.b #1,d0 bsr getpel move.w d2,d5 addq.b #1,d1 bsr getpel move.w d2,d6 addq.b #1,d1 bsr getpel move.w d2,d7 swap d4 swap d5 swap d6 swap d7 subq.b #1,d0 bsr getpel move.w d2,d4 subq.b #1,d0 bsr getpel move.w d2,d5 subq.b #1,d1 bsr getpel move.w d2,d6 subq.b #1,d1 bsr getpel addq.b #1,d0 addq.b #1,d1 move.w d2,d7 bsr.s mix ELSEIF bsr getpel ENDC bsr putpel dbf d0,anlp dbf d1,alp OPT OW+ bra pcsdone IFNE ENHANCE mix movem.l d0-1/d3-7/a0-6,-(sp) move.l d4,a0 move.l d5,a1 move.l d6,a2 move.l d7,a3 move.l #$F000F,d3 and.l d3,d4 and.l d3,d5 and.l d3,d6 and.l d3,d7 add.l d4,d7 add.l d5,d7 add.l d6,d7 move.w d7,d2 swap d7 add.w d7,d2 addq.w #4,d2 lsr.w #3,d2 move.b d2,-(sp) move.l a0,d4 move.l a1,d5 move.l a2,d6 move.l a3,d7 lsr.l #4,d4 lsr.l #4,d5 lsr.l #4,d6 lsr.l #4,d7 and.l d3,d4 and.l d3,d5 and.l d3,d6 and.l d3,d7 add.l d4,d7 add.l d5,d7 add.l d6,d7 move.w d7,d2 swap d7 add.w d7,d2 addq.w #4,d2 add.w d2,d2 move.b d2,-(sp) move.l a0,d4 move.l a1,d5 move.l a2,d6 move.l a3,d7 lsr.l #8,d4 lsr.l #8,d5 lsr.l #8,d6 lsr.l #8,d7 and.l d3,d4 and.l d3,d5 and.l d3,d6 and.l d3,d7 add.l d4,d7 add.l d5,d7 add.l d6,d7 move.w d7,d2 swap d7 add.w d7,d2 addq.w #4,d2 lsl.w #5,d2 and.w #$F00,d2 move.b (sp)+,d2 and.b #$F0,d2 or.b (sp)+,d2 movem.l (sp)+,d0-1/d3-7/a0-6 rts ENDC putpel and.l #$FFF,d2 move.w d2,d3 lea scrbuf(pc),a0 and.w #$F00,d2 lsr.w #8,d2 add.l d2,red-scrbuf(a0) move.w d3,d2 and.w #$F0,d2 lsr.w #4,d2 add.l d2,green-scrbuf(a0) move.w d3,d2 and.w #$F,d2 add.l d2,blue-scrbuf(a0) IFEQ COUNTF sf (a0,d3.w) ENDC move.l d1,-(sp) lsl.w #8,d1 move.b d0,d1 add.w d1,d1 lea ($10000).l,a0 add.l d1,a0 move.w d3,(a0) move.w d3,$100(a0) tst.w d1 bmi.s big add.l #$20000,a0 big sub.l #$10000,a0 move.w d3,(a0) move.w d3,$100(a0) move.l (sp)+,d1 rts getpel movem.l d0-1/d3-5/a0,-(sp) add.b #$40,d0 add.b #$40,d1 and.b #$7F,d0 and.b #$7F,d1 move.w d0,d2 lsr.w #3,d2 lsl.w #4,d1 add.w d2,d1 lea picture(pc),a0 add.w d1,a0 and.b #7,d0 addq.b #1,d0 move.b (a0),d1 move.b $800(a0),d2 move.b $1000(a0),d3 move.b $1800(a0),d4 move.b $2000(a0),d5 rol.b d0,d5 lsl.b d0,d4 addx.b d5,d5 lsl.b d0,d3 addx.b d5,d5 lsl.b d0,d2 addx.b d5,d5 lsl.b d0,d1 addx.b d5,d5 and.w #$1F,d5 IFEQ BLUE cmp.w #11,d5 bcs.s nback cmp.w #14,d5 bcc.s nback movem.l (sp),d3-4 lsl.b #2,d3 bpl.s xg not.b d3 xg lsl.b #2,d4 bpl.s yg not.b d4 yg and.w #$7F,d3 and.w #$7F,d4 move.w d3,d0 lsr.w #3,d0 neg.w d0 add.w #$F,d0 moveq #0,d1 move.w d4,d1 lsl.w #6,d1 moveq #$40,d2 sub.w d4,d2 muls d3,d2 add.l d2,d1 lsl.l #7,d1 swap d1 move.w d4,d2 mulu d3,d2 lsl.l #6,d2 swap d2 lsl.w #4,d0 or.w d0,d2 lsl.w #4,d2 or.w d1,d2 movem.l (sp)+,d0-1/d3-5/a0 rts ENDC nback add.w d5,d5 move.w colours(pc,d5.w),d2 movem.l (sp)+,d0-1/d3-5/a0 rts IFEQ LINCOLN colours DC.L $0000BBB,$8110210,$3200520,$8300950 DC.L $D600F92,$A810577,$1560798,$3330555 DC.L $7420832,$B430C64,$7500952,$A530B72 DC.L $7440D74,$B840EA4,$D960C94,$EC50FD5 ELSEIF colours DC.L $0000001,$0110012,$0220023,$0330034 DC.L $0440045,$0550056,$0660067,$0770078 DC.L $0880089,$099009A,$0AA00AB,$0BB00BC DC.L $0CC00CD,$0DD00DE,$0EE00EF,$0FF01FF ENDC pcsdone lea sintab(pc),a6 tst.w (a6) beq.s tabdone jsr (a6) expand move.w -(a5),d0 move.w d0,(a2)+ move.w d0,(a6)+ neg.w d0 move.w d0,(a3)+ move.w d0,-(a4) dbf d7,expand EV EQU SV+HEIGHT tabdone lea x(pc),a5 lea (CUSTOM+VHPOSR).l,a6 movem.l red(pc),d0-2 move.w #$4000,a0 add.l a0,d0 add.l a0,d1 add.l a0,d2 lsr.l #7,d0 lsr.l #8,d1 lsr.l #8,d2 lsr.w #3,d1 lsr.w #7,d2 and.w #$F00,d0 and.w #$F0,d1 and.w #$F,d2 or.w d0,d1 or.w d1,d2 move.w d2,backcol-x(a5) move.w d2,COLOR00-VHPOSR(a6) move.l #$42000000+DELAY*$11,BPLCON0-VHPOSR(a6) move.l #$A100A1+SV<<24+EV<<8,DIWSTRT-VHPOSR(a6) IFNE WIDTH IFEQ DISTORT move.l #$FFEEFFEE,BPL1MOD-VHPOSR(a6) ELSEIF move.l #0,BPL1MOD-VHPOSR(a6) ENDC move.l #FETCH*$10001+$40,DDFSTRT-VHPOSR(a6) moveq #5,d7 ELSEIF move.l #$FFF4FFF4,BPL1MOD-VHPOSR(a6) move.l #$680090,DDFSTRT-VHPOSR(a6) moveq #7,d7 ENDC lea (copper).l,a0 move.l a0,COP1LCH-VHPOSR(a6) lea (bpls).l,a1 move.l a0,d1 moveq #3,d3 blp move.w a1,2(a0) move.l a1,d0 swap d0 move.w d0,6(a0) addq.w #8,a0 IFNE WIDTH IFEQ DISTORT add.w #$12,a1 ELSEIF add.w #HEIGHT*$12,a1 ENDC ELSEIF add.w #$C,a1 ENDC dbf d3,blp lea (sprs).l,a1 sub.l a1,d1 IFNE WIDTH divu #6,d1 ELSEIF lsr.w #3,d1 ENDC slp move.w a1,2(a0) move.l a1,d0 swap d0 move.w d0,6(a0) addq.w #8,a0 add.w d1,a1 dbf d7,slp IFNE WIDTH lea -4(a1),a2 move.w a2,2(a0) move.w a2,10(a0) move.l a2,d0 swap d0 move.w d0,6(a0) move.w d0,14(a0) ENDC move.l #EYE,(a5) moveq #0,d0 move.w d0,xs-x(a5) move.w d0,rotsin1-x(a5) move.w d0,rotsin2-x(a5) move.w #$147,zoom-x(a5) move.w #$FF48,angle-x(a5) move.w JOY0DAT-VHPOSR(a6),mouse-x(a5) move.w COPJMP1-VHPOSR(a6),d0 move.w #$83A0,DMACON-VHPOSR(a6) bra frame ;c(n)=cos(n*pi/256) ;s(n)=sin(n*pi/256) ;c(0)=1 ;s(0)=0 ;c(1)=cos(pi/256)=$FFFB10B5/$100000000 ;s(1)=sin(pi/256)=$03243A40/$100000000 ;c(n+1)=c(n)c(1)-s(n)s(1) ;s(n+1)=s(n)c(1)+c(n)s(1) ;1=$40000000 for calc ;1=$4000 in table ;a0 cos ptr ;a1 sin ptr ;a2 for rounding ;d0=c(n) ;d1=s(n) ;d2-4 general ;d5 c(1)lo ;d6 s(1)lo ;d7 s(1)hi:count ;d0>d2 ;d1*$0.03243A40>d3 s(n)s(1) ;d2*$0.FFFB10B5>d0 c(n)c(1) ;c(n+1)>d0 ;d1*$0.FFFB10B5>d4 s(n)c(1) ;d2*$0.03243A40>d1 c(n)s(1) ;s(n+1)>d1 sintab lea $100(a6),a0 lea $202(a6),a1 move.l a1,a5 move.w #$8000,a2 move.l #$40000000,d0 moveq #0,d1 move.w #$10B5,d5 move.w #$3A40,d6 move.l #$3240040,d7 calcsin move.l d0,d2 move.l d1,d3 sub.l a2,d2 sub.l a2,d3 swap d2 swap d3 move.w d2,(a0)+ move.w d3,-(a1) move.l d0,d2 move.w d1,d4 swap d7 mulu d7,d4 swap d1 move.w d1,d3 mulu d6,d3 add.l d3,d4 clr.w d4 swap d4 move.w d1,d3 mulu d7,d3 add.l d4,d3 moveq #-5,d4 mulu d2,d4 swap d2 move.w d2,d0 mulu d5,d0 add.l d0,d4 clr.w d4 addx.w d4,d4 swap d4 moveq #-5,d0 mulu d2,d0 sub.l d3,d0 add.l d4,d0 swap d1 moveq #-5,d4 mulu d1,d4 swap d1 move.w d1,d3 mulu d5,d3 add.l d3,d4 clr.w d4 swap d4 moveq #-5,d3 mulu d1,d3 add.l d4,d3 swap d2 move.w d2,d4 mulu d7,d4 swap d2 move.w d2,d1 mulu d6,d1 add.l d1,d4 clr.w d4 swap d4 move.w d2,d1 mulu d7,d1 swap d7 add.l d3,d1 add.l d4,d1 dbf d7,calcsin lea $400(a6),a2 lea $200(a6),a3 lea $402(a6),a4 move.w #$80,d7 rts DS.W $228 IFEQ LINCOLN picture INCBIN headofvenus ELSEIF picture INCBIN headoflincoln ENDC colcnt DC.W 0 mouse DC.W 0 angle DC.W 0 rotsin1 DC.W 0 rotsin2 DC.W 0 zoom DC.W 0 x DC.W 0 y DC.W 0 xs DC.B 0 ys DC.B 0 red DC.L 0 green DC.L 0 blue DC.L 0 backcol DC.W 0 DS.W 45*HEIGHT scrbuf DCB.L $400,$FFFFFFFF restore DS.L $8000 ATT EQU $80 IFEQ WIDTH SH01 EQU $E2+DELAY SH23 EQU $F2+DELAY SH45 EQU $11E+DELAY SH67 EQU $12E+DELAY bpls DC.L 0,$CCCCCCCC,0 DC.L 0,$3C3C3C3C,0 DC.L 0,$03FC03FC,0 DC.L 0,$0003FFFC,0 sprs DC.W SV<<8&$FF00+SH01>>1,EV<<8+SV>>6&4+EV>>7&2+SH01&1 DCB.L HEIGHT,$CCCC3C3C DC.L 0 DC.W SV<<8&$FF00+SH01>>1,EV<<8+SV>>6&4+EV>>7&2+SH01&1+ATT DCB.L HEIGHT,$03FC0003 DC.L 0 DC.W SV<<8&$FF00+SH23>>1,EV<<8+SV>>6&4+EV>>7&2+SH23&1 DCB.L HEIGHT,$CCCC3C3C DC.L 0 DC.W SV<<8&$FF00+SH23>>1,EV<<8+SV>>6&4+EV>>7&2+SH23&1+ATT DCB.L HEIGHT,$03FCFFFC DC.L 0 DC.W SV<<8&$FF00+SH45>>1,EV<<8+SV>>6&4+EV>>7&2+SH45&1 DCB.L HEIGHT,$CCCC3C3C DC.L 0 DC.W SV<<8&$FF00+SH45>>1,EV<<8+SV>>6&4+EV>>7&2+SH45&1+ATT DCB.L HEIGHT,$03FC0003 DC.L 0 DC.W SV<<8&$FF00+SH67>>1,EV<<8+SV>>6&4+EV>>7&2+SH67&1 DCB.L HEIGHT,$CCCC3C3C DC.L 0 DC.W SV<<8&$FF00+SH67>>1,EV<<8+SV>>6&4+EV>>7&2+SH67&1+ATT DCB.L HEIGHT,$03FCFFFC DC.L 0 ELSEIF SH01 EQU (FETCH+8)<<1+45+DELAY SH23 EQU SH01+16 SH45 EQU SH23+16 IFEQ DISTORT bpls DC.W $E38E,$38E3,$8E38,0,0,$38,$E38E,$38E3,$8E00 DC.W $1F81,$F81F,$81F8,0,0,$07,$E07E,$07E0,$7E00 DC.W $007F,$F800,$7FF8,0,0,$00,$1FFE,$001F,$FE00 DC.W $0000,$07FF,$FFF8,0,0,$00,$0001,$FFFF,$FE00 sprs DC.W SV<<8&$FF00+SH01>>1,EV<<8+SV>>6&4+EV>>7&2+SH01&1 DCB.L HEIGHT,$E38E1F81 DC.L 0 DC.W SV<<8&$FF00+SH01>>1,EV<<8+SV>>6&4+EV>>7&2+SH01&1+ATT DCB.L HEIGHT,$007F0000 DC.L 0 DC.W SV<<8&$FF00+SH23>>1,EV<<8+SV>>6&4+EV>>7&2+SH23&1 DCB.L HEIGHT,$38E3F81F DC.L 0 DC.W SV<<8&$FF00+SH23>>1,EV<<8+SV>>6&4+EV>>7&2+SH23&1+ATT DCB.L HEIGHT,$F80007FF DC.L 0 DC.W SV<<8&$FF00+SH45>>1,EV<<8+SV>>6&4+EV>>7&2+SH45&1 DCB.L HEIGHT,$8E3881F8 DC.L 0 DC.W SV<<8&$FF00+SH45>>1,EV<<8+SV>>6&4+EV>>7&2+SH45&1+ATT DCB.L HEIGHT,$7FF8FFF8 DC.L 0 ELSEIF IFNE WOBBLE2 bpls REPT HEIGHT>>2 DC.W $638E,$38E3,$8E38,0,0,$38,$E38E,$38E3,$8E00 DC.W $638E,$38E3,$8E38,0,0,$38,$E38E,$38E3,$8E00 DC.W $71C7,$1C71,$C71C,0,0,$1C,$71C7,$1C71,$C600 DC.W $71C7,$1C71,$C71C,0,0,$1C,$71C7,$1C71,$C600 ENDR DC.W $638E,$38E3,$8E38,0,0,$38,$E38E,$38E3,$8E00 REPT HEIGHT>>2 DC.W $1F81,$F81F,$81F8,0,0,$07,$E07E,$07E0,$7E00 DC.W $1F81,$F81F,$81F8,0,0,$07,$E07E,$07E0,$7E00 DC.W $0FC0,$FC0F,$C0FC,0,0,$03,$F03F,$03F0,$3E00 DC.W $0FC0,$FC0F,$C0FC,0,0,$03,$F03F,$03F0,$3E00 ENDR DC.W $1F81,$F81F,$81F8,0,0,$07,$E07E,$07E0,$7E00 REPT HEIGHT>>2 DC.W $007F,$F800,$7FF8,0,0,$00,$1FFE,$001F,$FE00 DC.W $007F,$F800,$7FF8,0,0,$00,$1FFE,$001F,$FE00 DC.W $003F,$FC00,$3FFC,0,0,$00,$0FFF,$000F,$FE00 DC.W $003F,$FC00,$3FFC,0,0,$00,$0FFF,$000F,$FE00 ENDR DC.W $007F,$F800,$7FF8,0,0,$00,$1FFE,$001F,$FE00 REPT HEIGHT>>2 DC.W $0000,$07FF,$FFF8,0,0,$00,$0001,$FFFF,$FE00 DC.W $0000,$07FF,$FFF8,0,0,$00,$0001,$FFFF,$FE00 DC.W $0000,$03FF,$FFFC,0,0,$00,$0000,$FFFF,$FE00 DC.W $0000,$03FF,$FFFC,0,0,$00,$0000,$FFFF,$FE00 ENDR DC.W $0000,$07FF,$FFF8,0,0,$00,$0001,$FFFF,$FE00 sprs DC.W SV<<8&$FF00+SH01>>1,EV<<8+SV>>6&4+EV>>7&2+SH01&1 REPT HEIGHT>>2 DC.L $E38E1F81,$E38E1F81 DC.L $71C70FC0,$71C70FC0 ENDR DC.L $E38E1F81,0 DC.W SV<<8&$FF00+SH01>>1,EV<<8+SV>>6&4+EV>>7&2+SH01&1+ATT REPT HEIGHT>>2 DC.L $007F0000,$007F0000 DC.L $003F0000,$003F0000 ENDR DC.L $007F0000,0 DC.W SV<<8&$FF00+SH23>>1,EV<<8+SV>>6&4+EV>>7&2+SH23&1 REPT HEIGHT>>2 DC.L $38E3F81F,$38E3F81F DC.L $1C71FC0F,$1C71FC0F ENDR DC.L $38E3F81F,0 DC.W SV<<8&$FF00+SH23>>1,EV<<8+SV>>6&4+EV>>7&2+SH23&1+ATT REPT HEIGHT>>2 DC.L $F80007FF,$F80007FF DC.L $FC0003FF,$FC0003FF ENDR DC.L $F80007FF,0 DC.W SV<<8&$FF00+SH45>>1,EV<<8+SV>>6&4+EV>>7&2+SH45&1 REPT HEIGHT>>2 DC.L $8E3881F8,$8E3881F8 DC.L $C71CC0FC,$C71CC0FC ENDR DC.L $8E3881F8,0 DC.W SV<<8&$FF00+SH45>>1,EV<<8+SV>>6&4+EV>>7&2+SH45&1+ATT REPT HEIGHT>>2 DC.L $7FF8FFF8,$7FF8FFF8 DC.L $3FFCFFFC,$3FFCFFFC ENDR DC.L $7FF8FFF8,0 ELSEIF bpls REPT HEIGHT>>1 DC.W $638E,$38E3,$8E38,0,0,$38,$E38E,$38E3,$8E00 DC.W $71C7,$1C71,$C71C,0,0,$1C,$71C7,$1C71,$C600 ENDR DC.W $638E,$38E3,$8E38,0,0,$38,$E38E,$38E3,$8E00 REPT HEIGHT>>1 DC.W $1F81,$F81F,$81F8,0,0,$07,$E07E,$07E0,$7E00 DC.W $0FC0,$FC0F,$C0FC,0,0,$03,$F03F,$03F0,$3E00 ENDR DC.W $1F81,$F81F,$81F8,0,0,$07,$E07E,$07E0,$7E00 REPT HEIGHT>>1 DC.W $007F,$F800,$7FF8,0,0,$00,$1FFE,$001F,$FE00 DC.W $003F,$FC00,$3FFC,0,0,$00,$0FFF,$000F,$FE00 ENDR DC.W $007F,$F800,$7FF8,0,0,$00,$1FFE,$001F,$FE00 REPT HEIGHT>>1 DC.W $0000,$07FF,$FFF8,0,0,$00,$0001,$FFFF,$FE00 DC.W $0000,$03FF,$FFFC,0,0,$00,$0000,$FFFF,$FE00 ENDR DC.W $0000,$07FF,$FFF8,0,0,$00,$0001,$FFFF,$FE00 sprs DC.W SV<<8&$FF00+SH01>>1,EV<<8+SV>>6&4+EV>>7&2+SH01&1 REPT HEIGHT>>1 DC.L $E38E1F81,$71C70FC0 ENDR DC.L $E38E1F81,0 DC.W SV<<8&$FF00+SH01>>1,EV<<8+SV>>6&4+EV>>7&2+SH01&1+ATT REPT HEIGHT>>1 DC.L $007F0000,$003F0000 ENDR DC.L $007F0000,0 DC.W SV<<8&$FF00+SH23>>1,EV<<8+SV>>6&4+EV>>7&2+SH23&1 REPT HEIGHT>>1 DC.L $38E3F81F,$1C71FC0F ENDR DC.L $38E3F81F,0 DC.W SV<<8&$FF00+SH23>>1,EV<<8+SV>>6&4+EV>>7&2+SH23&1+ATT REPT HEIGHT>>1 DC.L $F80007FF,$FC0003FF ENDR DC.L $F80007FF,0 DC.W SV<<8&$FF00+SH45>>1,EV<<8+SV>>6&4+EV>>7&2+SH45&1 REPT HEIGHT>>1 DC.L $8E3881F8,$C71CC0FC ENDR DC.L $8E3881F8,0 DC.W SV<<8&$FF00+SH45>>1,EV<<8+SV>>6&4+EV>>7&2+SH45&1+ATT REPT HEIGHT>>1 DC.L $7FF8FFF8,$3FFCFFFC ENDR DC.L $7FF8FFF8,0 ENDC ENDC ENDC copper DC.W BPL1PTL,0,BPL1PTH,0 DC.W BPL2PTL,0,BPL2PTH,0 DC.W BPL3PTL,0,BPL3PTH,0 DC.W BPL4PTL,0,BPL4PTH,0 DC.W SPR0PTL,0,SPR0PTH,0 DC.W SPR1PTL,0,SPR1PTH,0 DC.W SPR2PTL,0,SPR2PTH,0 DC.W SPR3PTL,0,SPR3PTH,0 DC.W SPR4PTL,0,SPR4PTH,0 DC.W SPR5PTL,0,SPR5PTH,0 DC.W SPR6PTL,0,SPR6PTH,0 DC.W SPR7PTL,0,SPR7PTH,0 DC.L $FFFFFFFE