INCLUDE "regdefs.asm" ORIGINX equ RAMSTART+2 ORIGINY equ RAMSTART+4 ORIGINZ equ RAMSTART+6 NEWX equ RAMSTART+8 NEWY equ RAMSTART+10 NEWZ equ RAMSTART+12 FINALZ equ RAMSTART+14 PHASEX equ RAMSTART+80 PHASEY equ RAMSTART+82 PHASEZ equ RAMSTART+84 FLAGS equ RAMSTART+128 COORDLIST equ RAMSTART+256 POINTS equ 20 org $0 dc.l $0010F300 ;Valeur de SP dc.l $00C00402 ;Valeur de PC dc.l $00C00408,$00C0040E,$00C0040E,$0000034C dc.l $0000034E,$0000034E,$00C0041A,$00C00420 dc.l $0000034E,$0000034E,$00C00426,$00C00426 dc.l $00C00426,$00C0042C,$00C00426,$00C00426 dc.l $00C00426,$00C00426,$00C00426,$00C00426 dc.l $00C00426,$00C00426,$00C00432,VBlank dc.l IRQ2,$00C00426,$00C00426,$00C00426 dc.l $00C00426,$00C00426,$0000056E,$0000056E dc.l $0000056E,$0000056E,$0000056E,$0000056E dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF dc.l $FFFFFFFF,$FFFFFFFF org $0100 dc.b "NEO-GEO",$00 dc.w $0052 ;Numéro de série (Super Sidekicks) dc.l $00080000 ;Dépend du jeu dc.l $00100000 ;Pointer to debugging switch dc.w $0000 org $0114 dc.b $01 ;Pas de bootscreen !!!! dc.b $37 ;Premier sprite du logo NeoGeo dc.l $00000200 ;Pointeur vers la config Japonaise dc.l $00000200 ;Pointeur vers la config Américaine dc.l $00000200 ;Pointeur vers la config Euro jmp Start jmp Start jmp Start jmp Start dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF dc.l $FFFFFFFF,$FFFFFFFF dc.l $00000186 ; Pointeur vers les codes de sécurité org $186 dc.l $76004A6D,$0A146600,$003C206D,$0A043E2D dc.l $0A0813C0,$00300001,$32100C01,$00FF671A dc.l $30280002,$B02D0ACE,$66103028,$0004B02D dc.l $0ACF6606,$B22D0AD0,$67085088,$51CFFFD4 dc.l $36074E75,$206D0A04,$3E2D0A08,$3210E049 dc.l $0C0100FF,$671A3010,$B02D0ACE,$66123028 dc.l $0002E048,$B02D0ACF,$6606B22D,$0AD06708 dc.l $588851CF,$FFD83607 dc.w $4e75 org $200 dc.b "0123456789ABCDEF" dc.l $FFFFFFFF dc.w $0364 dc.b $14,$13,$24,$01 VBlank: btst #7, $10fd80 bne DisplayedLogo move.l #$c00438, a0 jmp (a0) DisplayedLogo: movem.l d0-d7/a0-a6,-(a7) move.w #$4,REG_IRQACK ; Acknowledge move.b d0,REG_DIPSW ; Watchdog btst #0,FLAGS beq noanim lea COORDLIST,a0 clr.l d2 move.l #POINTS-1,d5 transf: movem.l d2/d5,-(a7) jsr transform movem.l (a7)+,d2/d5 move.w FINALZ,d0 move.w #SCB2+1,d1 add.w d2,d1 move.w d1,VRAM_ADDR jsr SetSprZoom clr.l d0 move.w FINALZ,d0 ;X=X/(Z/2) addi #128,d0 neg.b d0 muls #100,d3 divs d0,d3 addi.w #(304/2)-8,d3 move.w d3,d0 move.w #SCB4+1,d1 add.w d2,d1 move.w d1,VRAM_ADDR jsr SetSprX clr.l d0 move.w FINALZ,d0 ;Y=Y/(Z/2) addi #128,d0 neg.b d0 muls #100,d6 divs d0,d6 addi.w #(224/2)-8,d6 move.w d6,d0 move.w #SCB3+1,d1 add.w d2,d1 move.w d1,VRAM_ADDR jsr SetSprY move.l d2,d0 lsl.l #6,d0 addi.w #64,d0 move.w d0,VRAM_ADDR move.w #1,VRAM_MOD clr.l d4 move.w FINALZ,d4 addi #80,d4 lsr.w #5,d4 ; COS/64 > 0 à 3 palettes btst #2,d4 beq noclip move.l #3,d4 noclip: lsl.w #8,d4 ; <<8 Clipping à la con clspr: move.w #0,VRAM_RW ; Map move.w d4,VRAM_RW move.l #30,d0 cla: move.w #6,VRAM_RW ; Clear avec un sprite vide (6), sinon bug HW quand on zoom (taille=2 au lieu de 1 ?) move.w d4,VRAM_RW dbra d0,cla addq.l #1,d2 dbra d5,transf add.w #194,PHASEX add.w #316,PHASEY add.w #49,PHASEZ noanim: movem.l (a7)+,d0-d7/a0-a6 rte IRQ2: move.w #2, REG_IRQACK rte IRQ3: move.w #1, REG_IRQACK rte Start: lea $10F300, sp move.b d0,REG_DIPSW move.w #7,REG_IRQACK clr.b FLAGS move.w #$2000,sr ; VBL move.l #$F2FF,d0 lea RAMSTART,a0 clram: clr.b (a0)+ dbra d0,clram lea Palette_dec3,a0 lea $400000,a1 move.l #16*4,d0 ldpal: move.w (a0)+,(a1)+ dbra d0,ldpal lea $400000+(16*2*256)-2,a0 move.w #$8000,(a0) ; Backdrop gris move.l #(40*32)-1,d0 move.w #FIXMAP,VRAM_ADDR move.w #$0001,VRAM_MOD clfix: move.w #$00FF,VRAM_RW ; Palette 0, tile FF nop dbra d0,clfix ;move.w #SCB2+1,VRAM_ADDR ;move.w #$0FFF,VRAM_RW ; Zoom ;move.w #SCB3+1,VRAM_ADDR ;move.w #((496-32)<<7)+1,VRAM_RW ; Position Y, 1 tile ;move.w #SCB4+1,VRAM_ADDR ;move.w #((8+32)<<7),VRAM_RW ; Position X move.l #POINTS-1,d0 lea Coords,a0 lea COORDLIST,a1 LoadCoords: move.w (a0)+,(a1)+ ; X move.w (a0)+,(a1)+ ; Y move.w (a0)+,(a1)+ ; Z dbra d0,LoadCoords bset.b #0,FLAGS Loop: bra Loop Coords: dc.w -40,-40,-40 dc.w 0,-40,-40 dc.w 40,-40,-40 dc.w 40,-40,0 dc.w 40,-40,40 dc.w 0,-40,40 dc.w -40,-40,40 dc.w -40,-40,0 dc.w -40,0,-40 dc.w 40,0,-40 dc.w 40,0,40 dc.w -40,0,40 dc.w -40,40,-40 dc.w 0,40,-40 dc.w 40,40,-40 dc.w 40,40,0 dc.w 40,40,40 dc.w 0,40,40 dc.w -40,40,40 dc.w -40,40,0 Cos: dc.w $7FFF,$7FF5,$7FD7,$7FA6,$7F60,$7F07,$7E9A,$7E19 dc.w $7D85,$7CDD,$7C22,$7B54,$7A72,$797E,$7877,$775D dc.w $7630,$74F1,$73A0,$723D,$70C8,$6F42,$6DAA,$6C01 dc.w $6A48,$687E,$66A4,$64BA,$62C0,$60B7,$5E9F,$5C79 dc.w $5A44,$5800,$55B0,$5352,$50E7,$4E6F,$4BEB,$495C dc.w $46C1,$441B,$416B,$3EB0,$3BEC,$391E,$3647,$3369 dc.w $3082,$2D93,$2A9E,$27A1,$249F,$2197,$1E8A,$1B78 dc.w $1862,$1548,$122A,$0F0A,$0BE8,$08C3,$059E,$0277 dc.w $FF50,$FC2A,$F903,$F5DE,$F2BB,$EF99,$EC7A,$E95E dc.w $E646,$E331,$E021,$DD16,$DA11,$D711,$D418,$D125 dc.w $CE3A,$CB57,$C87B,$C5A8,$C2DF,$C01F,$BD68,$BABC dc.w $B81B,$B585,$B2FB,$B07C,$AE0A,$ABA5,$A94D,$A702 dc.w $A4C5,$A296,$A075,$9E64,$9C62,$9A6F,$988C,$96B8 dc.w $94F6,$9344,$91A2,$9012,$8E94,$8D26,$8BCB,$8A82 dc.w $894B,$8826,$8714,$8615,$8529,$8450,$838A,$82D7 dc.w $8238,$81AC,$8134,$80D0,$807F,$8042,$8019,$8004 dc.w $8003,$8015,$803C,$8076,$80C4,$8126,$819C,$8225 dc.w $82C2,$8372,$8435,$850C,$85F6,$86F2,$8802,$8924 dc.w $8A59,$8BA0,$8CF9,$8E63,$8FE0,$916E,$930D,$94BD dc.w $967D,$984E,$9A2F,$9C20,$9E21,$A030,$A24F,$A47C dc.w $A6B7,$A900,$AB56,$ADBA,$B02B,$B2A8,$B531,$B7C5 dc.w $BA65,$BD0F,$BFC4,$C283,$C54C,$C81D,$CAF7,$CDDA dc.w $D0C4,$D3B6,$D6AE,$D9AD,$DCB2,$DFBC,$E2CC,$E5E0 dc.w $E8F8,$EC13,$EF32,$F253,$F576,$F89B,$FBC1,$FEE8 dc.w $020F,$0536,$085B,$0B80,$0EA3,$11C3,$14E1,$17FB dc.w $1B12,$1E24,$2132,$243B,$273E,$2A3B,$2D32,$3021 dc.w $3309,$35E9,$38C1,$3B8F,$3E55,$4111,$43C3,$466A dc.w $4906,$4B97,$4E1D,$5096,$5302,$5562,$57B5,$59F9 dc.w $5C30,$5E59,$6073,$627E,$647A,$6666,$6842,$6A0E dc.w $6BC9,$6D74,$6F0E,$7096,$720E,$7373,$74C6,$7608 dc.w $7737,$7853,$795D,$7A54,$7B38,$7C09,$7CC6,$7D71 dc.w $7E07,$7E8A,$7EFA,$7F56,$7F9E,$7FD2,$7FF2,$7FFF Palette_dec3: dc.w $1909,$1999,$0777,$1666 dc.w $7555,$0555,$7444,$0444 dc.w $1333,$0333,$1222,$0000 dc.w $0000,$0000,$0000,$0000 Palette_dec2: dc.w $0C0C,$0CCC,$699A,$7888 dc.w $6778,$0777,$1666,$7555 dc.w $7444,$0444,$0333,$0000 dc.w $0000,$0000,$0000,$0000 Palette_dec1: dc.w $1E0E,$1EEE,$7CCC,$1BBB dc.w $1AAA,$7999,$7888,$7777 dc.w $1666,$7555,$1444,$0000 dc.w $0000,$0000,$0000,$0000 Palette: dc.w $5F0F,$7FFF,$0EEE,$6CCD dc.w $0CCC,$0BBB,$0AAA,$0999 dc.w $0888,$0777,$6556,$0000 dc.w $0000,$0000,$0000,$0000 .org $8000 transform: move.w (a0)+,ORIGINX move.w (a0)+,ORIGINY move.w (a0)+,ORIGINZ clr.l d0 move.w PHASEX,d0 lsr.l #8,d0 bsr GetCos bsr GetSin ;--- Rotation sur l'axe X --- OK clr.l d3 move.w ORIGINY,d3 clr.l d4 move.w ORIGINZ,d4 ;NewY = (CosX * OriginY) - (SinX * OriginZ) muls d2,d3 ; CosX * Y muls d1,d4 ; SinX * Z sub.l d4,d3 add.l d3,d3 ; <<1 (virer le signe ?) swap d3 move.w d3,NEWY clr.l d5 move.w ORIGINY,d5 clr.l d3 move.w ORIGINZ,d3 ;NewZ = (SinX * OriginY) + (CosX * OriginZ) muls d1,d5 ; SinX * Y muls d2,d3 ; CosX * Z add.l d5,d3 add.l d3,d3 ; <<1 (virer le signe ?) swap d3 move.w d3,NEWZ clr.l d0 move.w PHASEY,d0 lsr.l #8,d0 bsr GetCos bsr GetSin ;--- Rotation sur l'axe Y --- OK clr.l d3 move.w NEWZ,d3 clr.l d4 move.w ORIGINX,d4 ;FinZ = (CosY * NewZ) - (SinY * SprX) muls d2,d3 ; CosY * Z muls d1,d4 ; SinY * X sub.l d4,d3 add.l d3,d3 ; <<1 (virer le signe ?) swap d3 move.w d3,FINALZ clr.l d5 move.w NEWZ,d5 clr.l d3 move.w ORIGINX,d3 ;NewX = (SinY * NewZ) + (CosY * SprX) muls d1,d5 ; SinY * Z muls d2,d3 ; CosY * X add.l d5,d3 add.l d3,d3 ; <<1 (virer le signe ?) swap d3 move d3,NEWX clr.l d0 move.w PHASEZ,d0 lsr.l #8,d0 bsr GetCos bsr GetSin ;--- Rotation sur l'axe Z --- OK clr.l d3 move.w NEWX,d3 clr.l d4 move.w NEWY,d4 ;FinX = (CosZ * NewX) - (SinZ * NewY) muls d2,d3 ; CosZ * X muls d1,d4 ; SinZ * Y sub.l d4,d3 add.l d3,d3 ; <<1 (virer le signe ?) swap d3 ; D3 = X clr.l d5 move.w NEWX,d5 clr.l d6 move.w NEWY,d6 ;FinY = (SinZ * NewX) + (CosZ * NewY) muls d1,d5 ; SinZ * X muls d2,d6 ; CosZ * Y add.l d5,d6 add.l d6,d6 ; <<1 (virer le signe ?) swap d6 ; D6 = Y rts SetSprX: addi.w #8,d0 ; Bord de l'écran lsl.l #7,d0 ; Décalage pour SCB4 move.w d0,VRAM_RW ; Position X rts SetSprY: neg.w d0 addi.w #496,d0 lsl.w #7,d0 add #$1,d0 ; 1 Tile move.w d0,VRAM_RW ; Position Y rts SetSprZoom: addi.w #128,d0 move.l d0,d1 lsr.l #4,d1 andi.l #$F,d1 lsl.l #8,d1 or.w d1,d0 move.w d0,VRAM_RW ; Zoom rts GetSin: movem.l d0/a0,-(a7) lea Cos,a0 add.b #$40,d0 adda.l d0,a0 adda.l d0,a0 clr.l d1 move.w (a0),d1 ; d1=Sin movem.l (a7)+,d0/a0 rts GetCos: movem.l d0/a0,-(a7) lea Cos,a0 adda.l d0,a0 adda.l d0,a0 clr.l d2 move.w (a0),d2 ; d2=Cos movem.l (a7)+,d0/a0 rts