|
- ;[FC][MMC3 精灵碰撞]: T8 B( m5 G6 c- ?0 A
- ;FlameCyclone 20230710
& `5 d: t2 |, ]& k4 f! L; c. r
1 M r: Z6 i, ?" I# R. y- ;文件头
7 g9 _& \& _- c! Z- |) m - ;======================================================================9 u% x5 W" ?# }9 v/ v$ V* Z+ D
- .INESPRG 4 ;16KB PRG 数量$ g; c* u/ `8 t
- .INESCHR 1 ;8KB CHR 数量( O* s/ A! T8 i) y0 ?
- .INESMAP 4 ;mapper 4
' R. ~% [- b$ Z" I+ b+ o3 z) ^6 n6 F - .INESMIR 1 ;命名表镜像 0水平 1垂直
, O5 O" W! g( k. H6 Q
) n$ A4 h0 o8 t. L' f- ;必要条件8 t$ q, k, u! ~
- ;1.持有CHR ROM
" q1 ~2 c F! c$ M$ e# b+ K - ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000' c4 W2 B& m. L# I$ W8 Y! |
- ;3.精灵内存(OAM)不为空
. o8 O" e2 W u! B - 9 |& y$ l, A& M1 f: O5 F, C5 b
- ;==================================================
! E, Y. _$ f K$ z& E - ;NES端口常量" l- t2 k9 j: m% u' T
- PPU_CTRL = $2000 ;PPU控制寄存器9 `8 }0 K1 P! n
- PPU_MASK = $2001 ;PPU掩码寄存器2 c# u' r# M' z/ f1 V4 U5 B
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
# F; J2 C+ \9 G4 V- m - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
& c3 e% g3 g% t8 T; r% [ - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1, Q% T5 F9 S: U/ `
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
, h" o A$ {% w - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
1 ^5 C5 l6 s8 e5 d- |% `, W - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
6 B" g# M6 r7 v - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
# e2 `0 U; k7 t; i9 u) r - APU_STATUS = $4015 ;声音通道切换. F7 N. x% E% d5 C: u T
- JOY1_FRAME = $4016 ;手柄1 + 选通
8 T" }# ?+ k: y! U! X - JOY2_FRAME = $4017 ;手柄2 + 选通
, S- P6 d8 ^+ B
5 l" L/ m. @9 K- ;==================================================
+ |" W/ P- \% } u% F - ;MMC3端口常量: L1 A" l D6 A" d
- MMC3_BANK_CTRL = $8000
9 V2 s! i8 _ n5 Z - MMC3_BANK_DATA = $8001
e W& V4 I2 p - MMC3_MIRRORING = $A000
% T' H8 X1 s* ]- _ - MMC3_PRG_RAM_PROTECT = $A001, M [2 S5 ]6 {
- MMC3_IRQ_LATCH = $C000
( D) Z/ x( k) v3 p - MMC3_IRQ_RELOAD = $C001. G, W0 b. V- R( d+ O" M9 A
- MMC3_IRQ_DISABLE = $E000
. U+ o9 Y p6 w) H" Z, a# H1 R - MMC3_IRQ_ENABLE = $E001
3 J- _# ^! |3 ]1 b - . ?1 [7 Y/ R; k5 Z: L
- ;==================================================# v. b" X7 J+ {- g7 }
- ;程序块配置$ u2 U5 N$ F& Y# \: G+ c' E
- BANK_DATA_MASK = $073 [; W, Y, }. Z
- ;--------------------------------------------------
1 r9 Y- S f. p7 ?: u# r - RESET_BANK = $07
8 B! r; _1 [% p9 @ - RESET_ADDR = $FC007 a) z* q6 P5 m6 J' e
- ! }$ U4 \4 i5 Y8 `* C
- ;==================================================
* ~5 k& Z) P, x3 m$ ~& I - ;图像块配置( N$ `+ Y/ n( C4 x
- CHR_DATA_BANK = $08
& W F# t7 E. G' K) A - 5 o6 i0 R( Y. W) X5 K, X* h% M
- ;==================================================
! O# p& P$ @ Q7 C9 A/ z - ;零页内存地址配置. |: x: C$ C3 T% @4 W1 U/ q1 b
- Use_Ram_Addr = $80
+ O0 I( Q3 j4 w9 ^7 c - PPU_Ctrl_Buf = Use_Ram_Addr6 E* m- _: O0 P" f6 G) D1 y
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01# w" I- {/ {0 I& j6 `9 Y
- PPU_Scroll_H = PPU_Msak_Buf + $01! E. D1 K7 [( v: C
- PPU_Scroll_V = PPU_Scroll_H + $01
/ O4 v w) p& P1 R6 c( V$ _& B2 v - FC_Data_L = PPU_Scroll_V + $01
1 T) |, @" f1 R& v# j" H( e3 { - FC_Data_H = FC_Data_L + $01* y1 p4 `2 X+ D1 U+ X
- FC_Data_Buf = FC_Data_H + $01, p' N3 o2 K+ N$ A A3 R+ f9 h
- ;==================================================3 n2 i) v; Y1 s7 x
8 {8 v; p' }' Z5 u! f* F- GAMEPAD_MERGE_FLAG = $04% J4 b- W/ j3 |' a
- 0 q5 A; l9 t6 {; F& F# L
- Gamepad_Keep = FC_Data_Buf + 1
; V3 _' Z! c1 ?) a - Gamepad_Once = Gamepad_Keep + 2+ z( M# F2 H, g6 R: A8 {( A
- Gamepad_Temp = Gamepad_Once + 27 E7 H, k. k& z' X7 q6 S8 R5 ?; G* N
-
) f/ y8 \+ t- Y8 a0 V - Gamepad_0_State = Gamepad_Temp + 2) V. _' z. K$ g& q8 n
- Gamepad_1_State = Gamepad_0_State + 1! ~9 V9 i2 a3 i/ V( ^
- Gamepad_0_Value = Gamepad_1_State + 1
9 [9 [0 Q5 [: A) Q B - Gamepad_1_Value = Gamepad_0_Value + 1
9 J7 d# T+ s) V9 I. j - Gamepad_Port_Value = Gamepad_1_Value + 1: b% y+ C9 |: Z5 l
- Gamepad_Merge = Gamepad_Port_Value + 1* ]& Z9 O4 c# H+ {
1 s% r! L7 X1 J0 D4 Y- ;==================================================9 d1 `, b) p9 a) f$ e
- IRQ_Index = Gamepad_Merge + $01
, T. y* g4 u# c3 H+ O4 q - Sprite_0_Y = IRQ_Index + $01
& V1 R! W: u" r/ _* g# f5 i% L - Sprite_0_Tile = Sprite_0_Y + $01
0 k. n# m6 z* S; z& z - Sprite_0_Mode = Sprite_0_Tile + $01
; Z' m8 h, R9 O$ ^. G+ b# e* I( z8 d - Sprite_0_X = Sprite_0_Mode + $01, b- W y9 D8 k% `* P7 J
- Sprite_0_Hit_Move_Direction = Sprite_0_X + $011 h+ E" a: \8 u! g" l! f7 v
- ;==================================================
; P8 M* n# J: w& A& g" d - ' Q/ i# P, {% `9 l8 ^0 j' c' t
- ;CHR图形数据
% y) ]2 E5 `( ^ - ;==================================================
" S' u6 C7 f5 |& K - .BANK CHR_DATA_BANK
" B5 H# E _) c - .INCBIN "chr_bank/chr_data.chr"
" t& E3 t' B- K$ I- r/ v - , ?0 K( b) {; ]8 I+ `
- .BANK RESET_BANK & BANK_DATA_MASK
/ G. ]' ]" o6 c - .ORG RESET_ADDR% f" D' {" j0 L. H8 R
- 1 w' P- j9 C$ y3 ~- x
- ;--------------------------------------------------
- t8 {' Z& ^8 Q% h - Attributes_Data
& p" d) X" r. N3 S% `& o9 U - ;命名表属性
' |7 `0 I3 m( C5 ^+ S! ~9 @, Q - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$004 c, R# `% ?# m$ v+ O/ b
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
" d' @/ c9 t5 }: ~ - .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
" n d5 y% M) l/ m: V0 i* h - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
# |# |' P/ l7 w+ w: ] - ;--------------------------------------------------
- @) o4 E$ ?% z+ u& H( r' B) Q - ;调色板数据
( s( \ g1 e2 G( U% V - Palette_Data
3 { r, Q U9 @: x5 L: X" R8 x - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F4 t7 ^" o: N; O4 V1 A' w6 f0 O
- .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F$ q+ d* f2 M# `3 O$ w1 j
- / r6 z Q! T" y
- ;==================================================
1 q2 }3 O3 C% j! k; }) f7 b$ p, I - ;命名表初始化
) {% P* O) j& o# B2 ^+ G" y0 X - Init_Name_Table+ y, w0 h! K8 X+ Q0 f
- LDA #$20. u7 A: R1 l* Y" A6 `3 p
- STA PPU_ADDRESS
$ g) |/ |: ~/ a& H5 d# z - LDA #$00
6 F7 A; V- J# U$ x! ~ - STA PPU_ADDRESS
1 W* K- \! c8 U& d9 }6 m6 S - LDA #$007 L3 }) u! P- R1 n, Q
- LDY #$00
# j% D* b$ ^9 d& ^' I- D1 m e - LDX #$10
9 U' u6 p+ y9 {( m; z0 V4 L - Init_Name_Table_Write
) T y) J" X- S1 @ - STA PPU_DATA! H' _) w! l. k& ~- q% d& R7 Z
- INY
! F4 v; ^1 [8 b* I - BNE Init_Name_Table_Write
( N+ B0 s) Y: T# v' y- h# P$ x! Z - DEX
4 H2 l, m. F% P& x/ j, H: z - BNE Init_Name_Table_Write. Q: z/ S% t" F
- RTS
, `( E3 t# N4 `; y9 y -
7 F" a# `0 j3 d: u1 d' C* T. R - ;==================================================( y' X5 B' X- K9 b7 W
- ;调色板初始化- ]' _& r) N% Y( X; I7 D
- Init_Palette) d9 O) ^9 p. c9 S% q7 k5 k
- BIT PPU_STATUS
: }" y! I) B( g( f, t6 D2 f - LDA #$3F
' n L6 ?3 _: e8 H$ c& i - STA PPU_ADDRESS, A! |/ ^2 J3 B. M* b' t
- LDA #$001 U. Z/ W& R2 K1 ]; s. Y
- STA PPU_ADDRESS
9 U& h, {' L: i5 f% j( l$ u - LDX #$00
# f# p- L( g, z& d7 n# d - Init_Palette_Write! |; t2 Q8 W1 \8 \) `
- LDA Palette_Data,X6 q' v) P, R* @
- STA PPU_DATA
# z( V; h# T) b, ^! f C - INX% k; x, [' j) p2 L: U
- CPX #$20
# y' e/ g% d$ _: F - BCC Init_Palette_Write
2 T. M5 s/ ^' h/ w7 s - RTS
) M9 [: t8 m$ e0 n3 _- e3 ` - ' J: `4 N2 o0 U
- ;==================================================
' C4 R3 u1 W8 p" Z - ;设置命名表属性
; `1 v- Q0 |1 a# [" Y7 l2 M @ - Init_NameTable_Attributes7 O& }3 c6 l# Q% O: K9 t" o
- BIT PPU_STATUS8 }/ L4 U7 E$ p2 j1 _
- LDA #$23' q1 |% Y' ]. T* H9 E9 o8 {
- STA PPU_ADDRESS
- r* H% Q) X, D: n- F) J, [; a - LDA #$C0
m. E, }4 L: p1 F+ `9 J& |4 F - STA PPU_ADDRESS: j7 c% I" B% s* G, o+ k
- LDX #$00
# r& k1 `4 O) F6 u( X$ k5 Q' Y+ {; { - Init_NameTable_Attributes_Write
7 f- H0 O% N9 J) H: M1 x% B0 e - LDA Attributes_Data,X, p% B: ?- F" {6 o
- STA PPU_DATA6 l7 H) }8 C% |( \
- INX
0 G% i. F& D B, L4 o - CPX #$40
3 A$ L ]! k8 r3 ]1 h - BCC Init_NameTable_Attributes_Write7 U8 I- k6 X x8 z k& D& }) x
- RTS1 w6 C0 c2 [( u! L) H" s9 \
. a3 w4 J% u+ _! ^; n& C- ;==================================================5 B& m* ~: i* t& T0 z) W" ?6 U
- ;初始化命名表文本
3 ^( v: w0 K/ h - Init_Name_Table_Text3 K( \7 e% |/ c; M
- BIT PPU_STATUS/ ?" E2 A, s. w& [" W- Y
- LDA #$20$ [- H7 Q. T& H4 n0 n \# O- ~' Y
- STA PPU_ADDRESS% b0 U3 W4 M. w4 I
- LDA #$00
$ ~1 \& \4 D3 b2 e' C& P - STA PPU_ADDRESS
- o; t" \; ? w4 b - LDA #$00
3 P b: N/ K- E6 I4 x6 t2 F - STA FC_Data_Buf: V* Z& }, o% S" a; m7 a
- LDY #30
$ [# G M) ~; `, m - Init_Name_Table_Text_Write2 E( I' u L9 @; w( `
- LDX #32' z! r+ a: W0 a1 Q8 x
- Init_Name_Table_Text_Write_Char( V* C( c9 E# |. _4 D
- LDA #'0'
2 T/ }' i" ~7 ^, }8 | - CLC
2 j, D& K( n7 Z! @: j - ADC FC_Data_Buf* X3 o+ P% ^1 ^- h
- STA PPU_DATA
5 U6 b# ^2 c( C - DEX& m( V, l$ U- H/ w6 Z; _% W6 I e
- LDA #$14
1 }' |" W4 ?' ?& J9 P& c* ?# I - STA PPU_DATA
' ^9 t+ a2 b' C5 } - DEX; P0 a5 |3 g: C" z% J1 x
- BNE Init_Name_Table_Text_Write_Char
' O5 c4 q: m9 B* l% t) h1 e6 v - INC FC_Data_Buf
: d0 }8 A% l# t7 g/ J/ T/ X" w - DEY2 u: P* e& P5 u* P
- BNE Init_Name_Table_Text_Write
2 K/ j2 P7 z/ f' a6 M5 w. O - RTS) n# }) _- U Y% j% N
7 j/ O' i6 N! J$ z- ;==============================
( J( o7 W+ A- w G4 n& L - Init_OAM_Ram;初始化精灵内存
* L _ H" }% S8 c - LDX #$00
2 P6 U1 {0 s& a! S2 t K- N+ S; D2 | - LDA #$00+ k: I+ p" u- s, T+ d
- STA PPU_OAM_ADDR S* o' A' K3 U; @3 s S
- LDA #$F8+ P( P2 g' w9 D- D1 f; q. u
- Init_OAM_Ram_Write# Z4 C! B: E, ]/ i* p1 G2 ]8 _# k" T
- STA PPU_OAM_DATA
# \% r0 m. C( [/ z: a/ C- [* Y+ e8 } - INX
! e/ ]* T# ?3 o! N - BNE Init_OAM_Ram_Write
3 z5 z5 `7 K( P - RTS$ i' A! v+ a% \, U( z' [6 h
- * H$ k! F C$ I% l5 F( F
- GamepadProcess;手柄处理
6 f; |$ p$ y. |% s/ \ - JSR GamepadDatacan0 D* f8 ]( @& k |
- LDA <Gamepad_0_Value1 {# ~# Q+ p: }1 {; C( Y0 P9 Q
- STA <Gamepad_0_State% V7 a* B) ?* Y
- LDA <Gamepad_1_Value
' U3 x* a: X+ V8 E( G! v/ s7 i% S' o" D - STA <Gamepad_1_State
* t9 z( |2 E' @3 l - JSR GamepadDatacan; L( L& m7 W6 P2 I6 g, {9 g
- LDX #$01
: F, {: s9 {4 z; H1 E( [ - GamepadMergeCheck;合并手柄输入检查; Q+ d+ n% q/ u# Q* h, w7 ^# \1 a! I
- LDA <Gamepad_0_Value,X9 G) V0 p$ P4 u; u+ P" S
- CMP <Gamepad_0_State,X
, U& E0 y% T- h; ]9 {( G0 b - BEQ GamepadMergeInput, E! f5 {. k- S3 Z$ d" L
- LDA <Gamepad_Temp,X
& w0 G) B o1 X9 v/ S - STA <Gamepad_0_Value,X
j8 Y# }7 x! s* Z1 w$ r# |. R - GamepadMergeInput;合并手柄输入
, M" r' l6 s% r5 U1 j5 T - DEX
$ h% J2 P$ _" j" v+ Q( N( M- }: D - BPL GamepadMergeCheck( n, ^6 G3 p/ z4 T% l
- LDA <Gamepad_Merge# ?( \& o: U# b' z9 _9 a- |
- AND #GAMEPAD_MERGE_FLAG
3 V# E2 `* O5 i! D) f; G - BNE GamepadStateProcess+ j' k& x* o/ ?; b z0 i
- LDA <Gamepad_0_Value; ~5 A7 ^# v2 {6 I/ ? ^' }& H
- ORA <Gamepad_1_Value
, y1 V9 _- S+ c; q. A - STA <Gamepad_0_Value
0 h, n& ^9 C: `/ f$ J7 n9 x - GamepadStateProcess;手柄状态处理+ q" V% O- n% P8 ~
- LDX #$01
. C& z. a8 a! f! @! j7 I! O9 l1 ] - GamepadStateSave;手柄状态保存$ B$ X' V& S% x, \9 ^2 a" m% I
- LDA <Gamepad_0_Value,X' B. e5 N7 q8 s1 U' x
- TAY
+ i! Y1 u" G; T4 a - EOR <Gamepad_Temp,X2 }: V4 M+ ^! K' F) ?
- AND <Gamepad_0_Value,X# @. M8 w4 L9 E( D! Z7 N
- STA <Gamepad_Once,X
$ P) s% O, V) k5 U* G& w$ f& t - STY <Gamepad_Keep,X
5 v% D, r4 l, \) Z - STY <Gamepad_Temp,X, U9 O6 ~6 @7 Z9 E
- DEX
2 r/ w2 Y% x4 t - BPL GamepadStateSave
% g, C) h( ]) c$ c4 k, @ - RTS
1 n" Q6 j! A- m& Z& e
$ h4 t8 Y2 {7 L$ |# ^2 Y# @- GamepadDatacan;手柄数据扫描
) Y1 O7 Z& M3 e/ ]! [+ h - LDX #$01
& \$ D& ]5 T1 h, G - STX $4016- C0 R2 X/ {0 e/ n* z* G
- DEX4 h2 O3 {8 ~1 i; \
- STX $4016! B7 h1 H4 P8 c$ q' S
- LDY #$08
, K- l j; u6 e7 } - GamepadPortScan;手柄端口扫描5 J+ R0 ^1 T8 P1 C
- LDA $4016
0 N' {7 p1 A/ B! ~ - STA <Gamepad_Port_Value
. J( _* m Q+ F - LSR A: W# k/ P( `9 i: D: h
- ORA <Gamepad_Port_Value' {8 |& \: m- Y( L: _* ]
- LSR A/ H( J0 @# F9 I! d
- ROL <Gamepad_0_Value
) z8 R' @% w6 n; ~0 C5 D" I - LDA $40178 p/ K i8 Y5 k3 f
- STA <Gamepad_Port_Value
Z" z) o! y; G& Y+ u5 m - LSR A+ \2 r9 z" R4 b- l; M
- ORA <Gamepad_Port_Value& V& I" F9 X/ t4 c5 Q& j
- LSR A
5 U3 o; g0 e# Z d - ROL <Gamepad_1_Value
0 z7 ~8 f3 y& u4 E0 A: V - DEY
& j, B1 f# ~! _0 I( y0 v+ | B - BNE GamepadPortScan! D1 M) C3 F8 W O- g6 t! o
- RTS' C6 X- \: ?' R
-
( X8 ]( E% S8 N0 t. `; G* C$ I - ;==================================================
0 r! P8 q& S1 Q6 l; b+ U - ;PPU处理
3 i4 B2 ~2 |/ ~' q- ~8 H+ a - PPU_Process
8 ~" f: O. _9 w* h2 L$ J - LDA #$00! M5 O0 n6 [' F* R l) O& `
- STA PPU_MASK
. {+ W0 @4 G, S' r$ N* {4 j* e -
1 M& y8 ^ c0 j2 H) _/ v - BIT PPU_STATUS1 `3 {* M5 c/ h' i; ^( D
- LDA #$20
: D% v) p+ k T# P! R* A - STA PPU_ADDRESS
: r: d8 {0 h4 V2 h - LDA #$00
, V, F# H. H6 W" Y3 D) U. U1 z - STA PPU_ADDRESS& C R* f% p P# G# [
-
! d% V8 ^* ^( a. h - STA PPU_SCROLL/ K% J6 i: w* Q6 J
- STA PPU_SCROLL Q* p: _) G3 m, w. S: l+ B
-
& q7 }" M8 L5 O9 |( M' X - LDA PPU_Msak_Buf0 } P. T$ f Q8 o2 ?
- STA PPU_MASK- |* e+ x, p2 }- v# L9 S6 j
- `$ \2 e2 Z2 Z- k' E
- RTS
/ D" ~9 U; F' a* A- f- L - 6 L: t0 v# B; i. S. j" m- ?. N
- ;==============================
9 O: k1 X9 G6 O. |' T - Time_For_Vblank;延时等待
) Y* j9 o- C3 f4 I9 n$ [2 m - LDA PPU_STATUS
|+ S8 c; W7 t3 N3 O+ `# R1 e - BPL Time_For_Vblank7 [+ u H! | ~ D# k5 P# B6 P
- RTS
# T. h3 R$ |4 u8 u- C! T1 {0 @& | -
$ S$ {4 h% X; V; n - ;==================================================
0 T% Y& T+ M3 V* k- E - ;初始化MMC3
' R0 d' D: m+ M- V z - Init_MMC3
* G3 E- f4 s) Q! `! D5 C/ F' V - STA MMC3_IRQ_DISABLE9 M3 T9 w# ^) `6 _$ W
-
+ f& ]) j7 s2 F5 s! V9 ` - ;设置MMC3水平镜像
& a5 U! J0 h8 E3 \2 T0 k Y3 V - LDA #$01
9 ~$ g/ g2 ^6 e0 H - STA MMC3_MIRRORING2 M6 S+ b7 X7 g2 U, ~9 p
- 9 Z+ P. \: d: a9 i
- LDX #$05% y( S4 p" ?; k
- Init_MMC3_Chr_Bank_Write# V! t3 m& D* [# P* ]
- STX MMC3_BANK_CTRL5 j& Y, m! M/ Z5 C" h5 n
- LDA MMC3_Chr_Bank_Data,X% Q+ ~+ t' C$ p2 i, s. s) u" j. [
- STA MMC3_BANK_DATA8 p/ @# p0 D3 R9 z: R a( t
- DEX. `' l5 v/ T* G% f: H5 X8 q1 w* p/ w1 i
- BPL Init_MMC3_Chr_Bank_Write. K- t. A% F6 P# Z7 S- {! h
- RTS
9 q$ M. ]8 H+ b# {9 j- \( s - ;--------------------------------------------------
) ^5 \& T7 k9 ?& O) c - MMC3_Chr_Bank_Data
$ f0 n! _# [+ S+ I - .DB $00,$02,$04,$05,$06,$07
+ s) P" \8 p3 ^/ k5 ^
4 `9 `. Y9 Y/ X+ }( }4 e) B. G& D- ;==================================================
! q$ A) v2 r4 w" m( j+ S$ Y+ p - ;重置中断处理
9 @- @# K; g7 y! Q: J. |) R - ResetProgram
4 w& y8 w3 l5 ~# j4 O3 E$ l+ H - SEI$ m2 C9 t' i0 n, C8 y! K
- CLD
- Q9 `2 I1 w8 i. n4 u) q9 ~ - LDA #$00' a* }& T* k! H3 E
- STA PPU_CTRL
* ^" M6 h* O. t; l3 I - STA PPU_MASK6 Q$ ^+ M. H1 V
- STA PPU_STATUS
9 U6 q7 [- Q. T e - STA JOY2_FRAME9 C. W0 i/ k! ^( e' `. t: E4 m# L
- STA APU_STATUS
& l0 V4 t0 ]+ ^4 p& V) z8 U9 w -
" r' @8 i" j9 T; T7 X/ K7 E - LDA #$C00 Y" H$ X' m% U8 E0 [. s
- STA JOY2_FRAME
+ G6 y& q, ~' a: d# a - 7 k8 ~! x# F& J+ a* j6 C9 T F
- ;等待vblank
; x5 A: s. Q9 T$ A. v4 X. ? - LDX #$02
; d! a7 Q5 ]" t! D6 B( X1 ? - Vblank_Wait_1
8 t5 y1 U8 ?" C2 p; _ - BIT PPU_STATUS
& B6 W. ~% u! w/ c. E* Q( N - BPL Vblank_Wait_1; }2 L' N( c& K" t* X
- Vblank_Wait_2
: x3 v ~% g D1 p; K; t' [& W - BIT PPU_STATUS& ` A1 |: y* }4 o3 g i( p1 M6 ]
- BMI Vblank_Wait_2
( ]: f1 e" k d, p: y6 k) W - DEX3 q1 x( D7 ?. n' K
- BNE Vblank_Wait_12 p( }, K" b {
- : c0 d- F) _; n7 e
- LDX #$FF" A1 m1 ?- W! X6 N" S, R1 a
- TXS6 O) Y' L: U- ~* Y$ \
-
! w: U4 A. i4 K4 J: E) a! t" o - ;初始化MMC32 K2 d" K& V1 x+ F
- JSR Init_MMC3
: f; i5 r3 x; k$ X6 I+ u -
2 I* \* n6 r% Y* ~ - ;==============================
! t9 C9 I0 x% o% m" ? - ;RAM初始化, O3 p! a# K! T
- Nes_Ram_Init4 L6 g3 p4 s( S" d
- LDY #$00
" H* {- S7 S/ a( l: | - LDX #$084 o/ I% u( O O8 E0 s0 n
- LDA #$00 A7 ]6 J3 D% @$ r, N
- STA <$00
, X1 I. B5 a% I' f - STA <$01; N! q. J8 |% F
- Nes_Ram_Init_Write6 o) |% N0 |' y& k' N8 g
- STA [$00],Y
( O; Q. x* p/ [4 H o - INY1 C [0 a E/ e9 x$ h
- BNE Nes_Ram_Init_Write
4 z! w3 i( g9 m! @. h n+ v* l - INC <$01
) E0 F, A, Q9 \3 {1 \ - DEX. k# c1 V% l$ E; Y7 \
- BNE Nes_Ram_Init_Write
6 L7 x* ~: {* p - 1 Y1 e; q) C3 T6 [# X2 n4 L5 v
- ;初始化命名表) l$ I* U3 x. J# f$ w/ \
- JSR Init_Name_Table' ^6 J! k# n* T# g, x
-
9 Z; ^2 x4 h3 r7 U: F5 p7 ~5 I8 X/ r2 M - ;初始化调色板# [7 K1 H7 d) `+ K
- JSR Init_Palette
u4 \! D2 M& U2 H5 F) q% f/ N" Y1 T - * E& d' ]3 \3 @
- ;初始化命名表属性
( e# | }* Y5 P: r - JSR Init_NameTable_Attributes$ k: F2 X: i+ o& a0 c, m/ J- \4 Y! L
- 7 {- n& T) s/ \7 w' ~. H
- ;初始化精灵内存$ E0 [8 X9 h- u- R2 }( s" c" ?
- JSR Init_OAM_Ram1 l( g- C+ A" J: T3 |. h2 j$ U
- 6 X, [0 j* ~$ O- p; S
- ;在屏幕上写点东西; o; u6 T% L1 i
- JSR Init_Name_Table_Text
{- v3 Q3 q G -
( T0 j$ c: z5 u% g7 h1 i2 o2 d: u - JSR Time_For_Vblank9 d4 K. ]$ x; p4 q9 a5 s
- ;开启PPU控制3 x% e( N/ I; U7 Y+ {; `$ `
- LDA #$808 }$ v4 ]2 T: Q1 \+ _3 }2 x
- STA PPU_Ctrl_Buf% A5 R3 |- ~4 p
- STA PPU_CTRL
" w' T! L- j9 W. ?5 z - 2 q) u* e: x1 o! D8 {* D
- ;开启PPU显示& @" \5 }; T, @
- LDA #$1E1 u% |" g( y4 W# u! t
- STA PPU_Msak_Buf- Y0 K$ U8 A) |: h* Y
-
, \, [9 f4 {+ i8 G3 O4 h6 Z - LDA #771 `7 @# f! W" q( ?# O
- STA Sprite_0_Y
2 }3 m4 d( s; m5 n9 C ] - LDA #$1E4 k/ L. d2 O' T# m' K9 z/ _- c' J0 m% O
- STA Sprite_0_Tile6 h' k R9 i1 [. [
- LDA #$20' S; v( {/ ]/ R. Q
- STA Sprite_0_Mode
! c( p9 N6 ~- X! i! ~* S Z - LDA #$00: m% N" R# F' M
- STA Sprite_0_X2 V1 n p( Q2 u
- 4 p2 Q6 C0 V: l
- CLI
5 u4 b/ ?9 u$ Q/ J% ?! ^8 E - JMP Loop% h ~7 K J8 B5 A
- ! f# @2 g, g8 z9 u- P- U
- ;==============================- D' N0 U/ Z- L1 x F6 X
- ;死循环, 等待NMI中断
" a1 u$ j( R8 M6 v! b! N) m - Loop
% F) |- z2 B* k4 c/ C - JMP Loop
) a' _) S8 A5 r: e9 k4 s- v6 F - 3 q7 j0 Z; K6 [2 { d5 s
- ;==================================================. _4 u9 P+ N$ W& D3 f# x0 i
- ;NMI中断处理
7 q4 ?9 K( ~4 x# A - NmiProgram
* }6 Y9 l; \' T+ b - PHA% ^4 q- n8 h0 y: [
- TXA
) O8 n* `8 @3 P& I; E" L; W5 X) O3 S - PHA( q$ D- u/ H+ K: [* v+ _3 q
- TYA( H6 Y4 x# W: y Y `) }
- PHA
( Z/ U, Q$ V! ~' P - ! j, w+ |' e! ?' K2 O r, t
- BIT PPU_STATUS; E! q4 u9 h, p1 Y
- 7 W$ k2 m) I `1 z
- ;关闭PPU控制; R u) R- y7 A, [" `8 O8 m
- LDA #$00
3 a3 `! J3 N5 P' Y6 o* L - STA PPU_CTRL
# m. F6 I1 d% f# U) w - + |/ ?# M% G" o- W# K3 ^. ?* V) K
- ;处理PPU
' S, _, S4 y3 V8 j. @* t- P - JSR PPU_Process& |+ a6 H" `& e! c
-
$ K# Z$ @ r4 C# j& x- ~ - LDA #$00( `1 }+ V- M8 d% ~/ v7 X
- STA PPU_OAM_ADDR3 u# h- a% l' f1 f3 k% V& k
- LDA <Sprite_0_Y8 U( o0 t$ u7 @
- STA PPU_OAM_DATA
3 U `! @5 G' V6 } - LDA <Sprite_0_Tile6 Y2 t3 l$ o* n0 \
- STA PPU_OAM_DATA0 y) s* |% B& I3 ?/ G( Z* G
- LDA <Sprite_0_Mode& ^" Y# a3 H' B) F
- STA PPU_OAM_DATA+ p- [9 s- L# U2 C
- LDA <Sprite_0_X
% @( |% j6 H& W' a4 C - STA PPU_OAM_DATA5 X/ P8 R' b$ t
-
4 E+ w: C4 o; z: b - ;开启PPU控制
+ Q7 d @9 W5 I1 o) `8 |0 V - LDA PPU_Ctrl_Buf' I8 `0 j( G2 L; }, g, i, Q
- STA PPU_CTRL/ i Y! V, C, x- H' n& ~
- & U& h/ j* }; T4 q: [3 {2 g
- ;屏幕滚动
( s9 O- G) T1 ?/ k% @% p - LDA <PPU_Scroll_H! a% n! y5 p3 W
- STA PPU_SCROLL
. f3 {9 w1 F4 I4 L! j1 n - LDA #$00
3 K" R5 N- N1 b7 m; J+ ] - STA PPU_SCROLL' g3 ?2 m3 U2 E/ z) M1 q: C$ m( j
- . U6 X2 a( G, m) v' e' s" S
- ;手柄处理5 n; v$ B) V, J1 y$ e% z$ A2 J1 e
- JSR GamepadProcess
$ c, V% u, s( h) b - - U+ ]3 Z: b; M
- INC <PPU_Scroll_H
3 p8 M: O8 N& e- w/ |6 q+ e8 i - , ?' s2 a3 R' f- W
- ;启动0号精灵碰撞检测" a+ J* [. L" v/ E5 F
- LDA #$01' R5 y k+ c/ l' H) Q
- STA Sprite_0_Hit_Move_Direction
( D! ^) q; j7 `" E% p - JSR Sprite_Hit_Test
$ r, n4 f" _% P l+ R -
r5 B' @4 M; N7 A2 \" [ - PLA- a2 g) e2 D# e/ [: x
- TAY3 u1 Q9 V/ j4 b8 e! [6 b- e F* |
- PLA- n) U/ _* C* I+ m
- TAX( z8 j; Z5 z* X+ R. g- j7 t* U' D& ?
- PLA, @: D; K+ @; K3 S( Z: z% N$ a
- RTI
* b' t& `% K. D0 ~# o% w - 2 e1 c. h0 _" O" e, _9 M
- ;==============================) n0 ~- a6 D+ N5 _
- ;0号精灵碰撞测试
$ T5 v- p! m5 ~6 Q( D) K% ]. H - Sprite_Hit_Test9 {! `& P5 V* D5 m3 k* X8 g
$ {/ l% P0 S5 x3 _3 }+ Z6 l) Z- ;------------------------------
M6 |2 p% S- b$ S& B, O - ;等待0号精灵碰撞状态取消& Z {4 w/ I* Q
- LDA PPU_STATUS+ M' f2 H/ Y) u
- ASL A/ u- I T: Q$ w+ {0 b7 g
- BMI * - 42 b9 ]. \+ K3 q
-
/ B& `8 x- W; {+ j6 R% e - ;------------------------------8 L* }' N; H& W1 A; {
- ;等待0号精灵碰撞发生
1 [" b Q; u/ J7 ?. m( ~6 u - LDA PPU_STATUS F: O0 u% F7 }5 ]1 D1 e! S/ j0 n" F8 y
- ASl A5 o. h7 y9 c: a; N
- BPL * - 4
' w# _* l0 m2 C9 Q9 |
$ b" [' J$ @& ^5 C3 G0 N3 l- Y- ;------------------------------* q. M. l- x/ ]2 n/ t7 W1 E
- ;行消隐等待
3 U) H6 N' F. v5 s, Z; J( t6 {1 n - Sprite_Hit_Scroll_Wait
! k [- \* V( ~/ Y! Z5 M. o! b - LDX #$28* Y5 m: M! g6 p; K0 N
- DEX9 v- w6 Y0 u; N% s" M
- BNE * - 10 y* D+ P6 o1 X
-
/ h8 p+ E' X, E- p% y - LDA Sprite_0_Hit_Move_Direction
& }7 L1 B/ }+ [3 I. U - AND #$01
- Y$ \. k$ p0 e - BNE Sprite_Hit_Scroll_Set_Right' u6 L1 C6 ^* ~2 N$ ]5 S! n" b
- 4 S7 n0 y( }4 F+ Z5 Y- h
- ;------------------------------
6 x- C2 o7 ]6 _6 R1 z! j$ H - ;分割画面向左滚动7 |1 G" n" q6 ^0 p7 [. ^
- Sprite_Hit_Scroll_Set_Left
! O* y5 T+ a) p; C - LDA PPU_STATUS
0 Z3 [7 o; M: k* P1 R- ^1 k! M. G - LDA <PPU_Scroll_H
7 B" z/ g) G; [3 k - STA PPU_SCROLL8 A2 a$ F" W' H; p5 s A
- LDA #$002 h6 q# N# U6 N1 m
- STA PPU_SCROLL
/ ]7 X) X! M4 N2 [ - RTS2 T/ P: ?+ Y" L5 Z* t
- - S! Q1 \0 L" M; f7 e) l
- ;------------------------------
+ Y3 M& f; }/ u - ;分割画面向右滚动, t; O/ e3 {/ X3 w3 |! n/ _
- Sprite_Hit_Scroll_Set_Right
/ `5 p) m/ h( ?: D - LDA PPU_STATUS
: \" T8 {6 q/ ^+ x5 r: G - LDA #$003 c0 X b7 A. ?7 ^; X
- SEC
1 z4 I Y& I+ N+ C3 e - SBC <PPU_Scroll_H* [, S5 q, @" ~
- STA PPU_SCROLL
9 h5 r, _: v8 A - LDA #$00
' M7 H' R8 ]1 c" f - STA PPU_SCROLL3 ` s* S( i5 S+ v! F5 f
- RTS- |6 Q/ z% d5 L8 D6 ]
- 0 ], n. w7 A% F" L5 |% b+ ]
- ;==================================================
/ `" w6 T& j, C) y# Y7 Q - ;IRQ中断处理1 J4 h% K$ M3 J# x
- IrqProgram
; P, M! w; Z% V& h$ E3 S7 M - PHA6 Q5 {/ C; G, s& E
- TXA- M, k( k/ P+ l y6 O6 x1 \
- PHA
$ {9 j, A7 n: W- T - TYA
/ a/ M7 T# Q3 T1 @/ w; l c - PHA
6 y2 Q- H9 J0 X/ X5 z -
) ?7 C* ]5 T# D& A: a" j/ \ j2 p# | - ;关闭IRQ
$ n9 T' k& m1 F4 L% q) T8 d- ]0 i - STA MMC3_IRQ_DISABLE" m4 g: [% W7 V1 X k: J S4 P* `
-
! Z5 Y$ U( |+ i: ^: K - ;允许下个IRQ触发' O7 F5 R( }# c9 L5 z" K
- STA MMC3_IRQ_ENABLE: ?3 b5 o, T2 @5 N; v+ f% i
- , T; O4 K, K. \" s7 X M- E
- ;IRQ处理, 15线后继续触发6 ^) F3 i) B, }) m
- LDA #15
' a; q8 ^3 M+ Q/ ^) ]1 S - STA MMC3_IRQ_LATCH
& \# u+ U& }- x, }6 B( l% z -
. J# {3 J' S C3 \ - LDA <IRQ_Index
3 Z0 _/ M: ~2 T# [* X - BNE * + 4
6 ^! a# m% o+ r' ]; ^* |0 `0 v& ?+ R% m - INC <PPU_Scroll_H+ y) D7 l0 d/ w# n/ u$ B- L
-
; f9 o) D: R% s/ {3 K- y: m# s - ;设置屏幕滚动8 I& c: h" k$ f
- LDA <IRQ_Index
$ {( v( P9 \, f% v9 X% Q5 Y" d - AND #$01
& m' T$ ^; p: }$ S/ E - BEQ Irq_Scroll_Right& S% M: ?6 |8 c3 t0 r% m) R
# u& d! T5 _9 k8 S) ~" p7 O) p+ R- Irq_Scroll_Left0 j' B% b0 ^0 C m7 Y# R" g) w
- BIT PPU_STATUS
/ j8 x: {; k- b! K+ r+ Z, A - LDA <PPU_Scroll_H
/ w6 B: }$ L. j; r" ?! c - STA PPU_SCROLL
# }1 s* r# w* S5 N$ Q! d( @: S - STA PPU_SCROLL
' h& r; z0 k6 M3 J$ | - JMP Irq_Scroll_Over$ U* N. u' t5 y5 v6 y) `1 s
- 3 J+ q# ?, f$ ], O% @, ~
- Irq_Scroll_Right4 V" s) j# l$ ~/ O+ o
- SEC
' t' { e9 L" |6 Y3 h7 e - SBC <PPU_Scroll_H
% D* L2 z+ o+ T( e8 Q+ q. W - STA PPU_SCROLL
1 e% M3 ?6 g5 w/ K0 k6 O - STA PPU_SCROLL8 [ }7 m }+ R8 |4 m
- Irq_Scroll_Over, {) U. N& b! J1 S! k' b& m8 S8 j
-
9 Y; q, K: F6 |9 q ^$ l - INC <IRQ_Index! _( N& G5 B- } y6 m
-
2 h: L' V0 I2 V# v! `, H$ T, W - LDA <IRQ_Index' W4 I( C# O0 P
- CMP #149 G* t+ y- u. e( D: e2 L1 L
- BCC * + 5) j- C. x# o" B* a+ ^. e' p. i; r- V
- ;关闭IRQ
/ ?4 I& U. R& @4 G6 F# a+ w( ? - STA MMC3_IRQ_DISABLE
( }6 T4 ^/ p" Z, Z; X6 v" ` -
$ i8 ~+ @/ j" m6 o) t - IrqProgramEnd% ?4 _# g5 N+ A, d& P$ C7 `
- PLA
& ]2 t" I7 o6 `2 F& R - TAY
7 Z/ S- d g' N6 C - PLA7 @# O! g2 m! o1 b! l: K
- TAX
8 K& ]4 S3 y. j, _% k6 ` - PLA
# ^" d9 K' v& ?& w3 x2 S4 n; ` - RTI( L* y, p* Y/ Z5 R) P+ ]
- 4 ?; L- x6 ?: O. L" C
- ;==================================================
2 L( o+ r# g! ^9 g, S+ u' V9 S$ @ - ;中断表9 _. y. s; f1 j' S
- .ORG $FFFA. k5 P5 i% o- O) l% r
- .WORD NmiProgram. o% X& t0 g( B+ ^8 I& Z
- .WORD ResetProgram/ Z* |0 p; r: b
- .WORD IrqProgram
复制代码 6 K" ]/ J: V) Z, Z- `8 a I
|
评分
-
1
查看全部评分
-
|