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