|
- ;[FC][MMC3 精灵碰撞]; {+ K4 b7 S1 |' H
- ;FlameCyclone 20230710 V% z: `- R1 f$ L9 u! P
* h# W; B) w% d- Y8 e- ;文件头
2 T/ e, Q% V3 _9 q$ k) S - ;======================================================================2 B& g) w4 a6 y7 |6 F- ~& y
- .INESPRG 4 ;16KB PRG 数量
" [" {& v. v) C _; M, S - .INESCHR 1 ;8KB CHR 数量. `+ r8 R8 O' R ~$ l
- .INESMAP 4 ;mapper 4
7 x, a9 w p7 }, _ - .INESMIR 1 ;命名表镜像 0水平 1垂直' ]6 y5 N+ e+ b& [. W2 N$ c
- ( {3 F5 ~! {, k
- ;必要条件
# i" k: R- K" m2 p - ;1.持有CHR ROM i2 s0 o) }: g! ^) @) e3 j
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000! R% A0 z$ Q8 D: C( r! C
- ;3.精灵内存(OAM)不为空! o* z& q( ~: X2 W# T% n: g) \
0 e! S7 a9 l. J C2 \5 u4 f. F* s- ;==================================================
; L$ [1 b7 C9 g2 q. K - ;NES端口常量8 b( p" L2 l4 a8 J5 O2 H& I1 }" \
- PPU_CTRL = $2000 ;PPU控制寄存器9 X. x2 w+ X6 f- b
- PPU_MASK = $2001 ;PPU掩码寄存器- f- ?* @! B% z" r/ y
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位9 A; ]) d2 [ g* {0 v R
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
' u# q( \4 A, ?" h - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
, h. p) h7 Q! l# l" ] - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
, w1 c: d4 a3 ~1 r: D; Q - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
- |! ]9 c; r7 C( Y0 n) S - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
6 @! ? E$ G& R' ^- s$ k) K" D - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存8 j0 b* t8 u9 n1 P }( y
- APU_STATUS = $4015 ;声音通道切换( J" h/ n, c1 h) _6 n3 \8 Z+ z
- JOY1_FRAME = $4016 ;手柄1 + 选通
0 b! F% l. J, I9 |# i" i& C8 j - JOY2_FRAME = $4017 ;手柄2 + 选通) x& u) q& N$ [' W0 \" c
- & C1 C( ?5 j* z; v
- ;==================================================& C1 @/ j2 U2 |0 ]% R! |# j5 ]
- ;MMC3端口常量. s3 p8 U* I# {. f( p2 z% h
- MMC3_BANK_CTRL = $8000) v* P9 Z) I i8 i
- MMC3_BANK_DATA = $8001
: B4 E) z6 \4 ]! D& L {- Q& S - MMC3_MIRRORING = $A000
9 \) _2 e" S3 _3 O/ N* m- q - MMC3_PRG_RAM_PROTECT = $A001
8 Z7 ]! w% x6 k& Q7 C. n, y7 T/ y$ ~: A - MMC3_IRQ_LATCH = $C000
9 E; v- E/ S* V - MMC3_IRQ_RELOAD = $C001
" j1 f7 v) R% G: E) { - MMC3_IRQ_DISABLE = $E0000 g d, e: _ X3 _- A4 Z
- MMC3_IRQ_ENABLE = $E001
3 D2 l' w- v/ x/ I
# ^% f, u% s* U. W. \6 _( z- j- ;==================================================
1 T, k9 x$ O& }* e! [/ o P - ;程序块配置: f- \/ X, e7 m1 {
- BANK_DATA_MASK = $07, `) x. a: ^% j) n
- ;--------------------------------------------------
. c+ `3 ?# }7 q# e. O9 P - RESET_BANK = $07
& ]2 e |9 F6 b, I0 U - RESET_ADDR = $FC00
3 @: b7 R# T) D6 y# R! Q8 T
" A, @6 {1 ^- C4 W- ;==================================================# T" g1 p0 x: a+ u. ~
- ;图像块配置
6 j1 T% q3 W# ~9 f, \ - CHR_DATA_BANK = $08
4 ~0 } d! P) c6 l8 n6 r/ n
8 ]; O8 c2 J3 A* ~6 q- ;================================================== `0 i! o" A1 s: I, f6 L$ I
- ;零页内存地址配置
. _0 n* X5 @8 X% T - Use_Ram_Addr = $80
k: t& P' q q2 `9 N - PPU_Ctrl_Buf = Use_Ram_Addr
3 m) \& F# O6 u2 t( q/ ?0 d. [ - PPU_Msak_Buf = PPU_Ctrl_Buf + $01# A; f) `6 a( V4 I8 j& b
- PPU_Scroll_H = PPU_Msak_Buf + $01: I" p+ A3 U Q( E q% {
- PPU_Scroll_V = PPU_Scroll_H + $01/ S4 G2 J0 |( J8 l
- FC_Data_L = PPU_Scroll_V + $01" j: n1 ~! K H4 W
- FC_Data_H = FC_Data_L + $01
2 b9 Z. Z* C$ ^ - FC_Data_Buf = FC_Data_H + $01
4 u+ Q+ i. \4 W- o5 v - ;==================================================8 a$ z" _8 A/ G! B
4 G- J( S- j4 n q1 i! @5 j' I- GAMEPAD_MERGE_FLAG = $049 u. E# K2 C/ M X4 P9 P' y
- * e% W, r A" f0 y( T$ D8 n! Q+ o
- Gamepad_Keep = FC_Data_Buf + 1
9 W1 T/ U0 q; y3 L& j- D& l - Gamepad_Once = Gamepad_Keep + 2$ }: l6 z F( q" l( F
- Gamepad_Temp = Gamepad_Once + 29 |, s+ d1 J2 K
-
]1 R/ m! J/ s2 y# p9 C - Gamepad_0_State = Gamepad_Temp + 2
8 a. i, ~) F: g. y- t - Gamepad_1_State = Gamepad_0_State + 1: q' M$ g3 c- y- X' B
- Gamepad_0_Value = Gamepad_1_State + 1) J5 T$ P; ]/ s& Q7 i$ L
- Gamepad_1_Value = Gamepad_0_Value + 14 n5 ~2 l, @; P( H' Y* D
- Gamepad_Port_Value = Gamepad_1_Value + 1
$ p2 @6 m) M8 v) v - Gamepad_Merge = Gamepad_Port_Value + 1( ?4 f! w" Q' D1 Q
- 7 G; q. N, v) @% t( u4 l5 r% ?
- ;==================================================( c- [, X7 A' S' W+ x) p( {* G- @( t
- IRQ_Index = Gamepad_Merge + $015 M6 n$ ?; `! Y7 U% H: H
- Sprite_0_Y = IRQ_Index + $01
- Z; V6 ^& c9 `6 x" n - Sprite_0_Tile = Sprite_0_Y + $01
( D4 N# Y0 [% a - Sprite_0_Mode = Sprite_0_Tile + $018 Q8 |7 L$ Y- X( f# a4 b
- Sprite_0_X = Sprite_0_Mode + $01
& f) N% T4 C2 M4 W - Sprite_0_Hit_Move_Direction = Sprite_0_X + $01# \' ^9 t, p7 }6 z5 s' s
- ;==================================================
. P. }# G* L" C' z* M8 E. Y# [
) I8 H% R8 ^, W ^0 t8 T- ;CHR图形数据
, z" X+ Z0 C" F* B' d+ @ - ;==================================================
3 u7 S# A7 a$ k0 ]% a- H- @1 D - .BANK CHR_DATA_BANK# L$ g+ \9 J9 Q( |
- .INCBIN "chr_bank/chr_data.chr"4 q7 C! | D" I5 b6 ] a* H3 K
-
( o5 [- M5 J' F& B: i - .BANK RESET_BANK & BANK_DATA_MASK
% _: h8 D4 \* Z* \ - .ORG RESET_ADDR
8 s- D* Q+ F, y$ p9 u -
" |+ N ]% n! \, A8 y" q z - ;--------------------------------------------------& p6 W, z" m9 x. [0 D5 m
- Attributes_Data
8 \6 `) j$ z+ b' [ - ;命名表属性6 r: D7 N1 r/ X) j$ C
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00/ m H/ S! d1 }5 c: E2 _+ |
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA8 [* I8 ? V8 U" U5 k" j
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
7 u( g6 k* Y6 ~! Q - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$550 U- b7 K& ~2 p5 x& l
- ;--------------------------------------------------" n3 }3 J& ~1 C- K' v
- ;调色板数据
: b/ T7 m' @0 S! `7 w% m9 X* y) c - Palette_Data
/ m2 L" S# T# {5 S7 B+ a - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
( c. Y! u, \7 ]" n- {4 Q8 N - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
% a: w G! k( b
. F0 Y! L0 X7 ^2 E" f0 C0 c- ;==================================================
& V* v3 l- h W8 s, P - ;命名表初始化+ Q1 t6 [. v. ]
- Init_Name_Table
' w O+ @$ i- x5 _. l" r3 h) }' P3 u - LDA #$20
5 M( p( }9 h! `2 q/ }4 W% Q: e - STA PPU_ADDRESS
; k5 U) P8 Y4 X - LDA #$00
$ ^4 Q. u* u8 d4 _ - STA PPU_ADDRESS
, h0 ] k/ }' m4 g% D/ m, A - LDA #$00( K8 [8 \& r; J8 m' z) f# x
- LDY #$00- K2 p9 F8 j5 [/ G9 D+ B
- LDX #$10
* P% q, f" C3 {! M8 ~7 f, F - Init_Name_Table_Write/ D7 o% s6 X# L+ Y; h; X$ F7 T
- STA PPU_DATA* k \+ W, c% _- ?: n& K) @9 ~. d
- INY% K0 n6 b+ [3 U* t( R6 b1 Q
- BNE Init_Name_Table_Write
8 ?; ]4 z& I; X; A - DEX0 k! m* i3 ^9 ]& S: N+ ]: m. c
- BNE Init_Name_Table_Write6 e8 P! E2 X' I( _. p% P% Z
- RTS
$ w4 c2 x. d6 c2 Z# _% s - ! ~% {% h* O" r- X0 a
- ;==================================================0 y- m; `+ |) k: L% |; p9 H& b9 f6 n
- ;调色板初始化% `) q. |+ y; h, |
- Init_Palette
! ? y5 ]1 [8 R4 U; W4 B6 u - BIT PPU_STATUS: g& A- w5 D! u( c5 r9 Z
- LDA #$3F
. f& b1 N) u( h, G - STA PPU_ADDRESS( k' A& ^$ }; D, H! ]8 l
- LDA #$00+ M$ r1 ~* ]3 G" D% v8 q
- STA PPU_ADDRESS; n- j) ^: g* w$ S5 o O1 B; U2 K
- LDX #$00
4 x5 f/ Z1 f7 X! H! y* r2 X - Init_Palette_Write9 Q! u) F; B0 ~2 s
- LDA Palette_Data,X
/ T" E2 R' u b- }, X - STA PPU_DATA( K" x- E' r+ u' y
- INX
0 o% ~0 ~9 z# }- {* D1 L - CPX #$201 p: \5 @) ?) p B- g5 Q4 B( x- M
- BCC Init_Palette_Write6 J. h2 V) K& g; y4 K- I6 a
- RTS
, ^- D8 g! g5 Q* x" G - / r2 n1 `+ N' e8 P
- ;==================================================
( J) R8 }9 n4 x - ;设置命名表属性8 }; [% {( C {: p( [ Q8 |. P
- Init_NameTable_Attributes0 `3 ?5 M* G8 g" |
- BIT PPU_STATUS
$ h$ m% S- D# B: d! x! M t - LDA #$230 U" p) J$ Q2 V9 B5 n: I
- STA PPU_ADDRESS
8 a0 B+ q) C: I/ a$ U1 l' p - LDA #$C0
4 G) r' Q( t! v5 X/ P- m - STA PPU_ADDRESS
& |! \. Y* v2 s/ Z0 t! Z& k - LDX #$00
/ e2 w |' I6 [3 u/ V; B& W - Init_NameTable_Attributes_Write
5 k( @0 I$ w7 [# m1 P& f. p# ? - LDA Attributes_Data,X- R3 ~% F$ ~ j/ W) F
- STA PPU_DATA
Y! a, t% H, x' ~, F - INX0 i) R2 @: P; B) a- t1 ^- _9 T3 ]
- CPX #$408 S4 V( _- ?$ v) W* R+ d% u) \, `/ A
- BCC Init_NameTable_Attributes_Write- e3 g& u8 a5 |: J& j$ M. q
- RTS- _/ C2 v" A$ @6 o6 l
- $ M1 a! Z4 b* [8 `
- ;==================================================
f* H1 A4 R# o( w) G$ e n - ;初始化命名表文本
. j. ?( @) G. M8 @ - Init_Name_Table_Text0 w0 W: S2 }, E% x. M* f
- BIT PPU_STATUS& V! C% }( L+ t
- LDA #$20# u$ _3 N% n' s
- STA PPU_ADDRESS
) F9 ?. M; Y, K - LDA #$00
3 D) {1 K8 ]: W - STA PPU_ADDRESS
( x9 S1 e- z. Y/ M/ k, ^% C - LDA #$00# f% t2 o }. b
- STA FC_Data_Buf
7 P8 Y6 ]0 o8 z; {0 c - LDY #30
. ^3 M( n, B1 O/ T# s3 u - Init_Name_Table_Text_Write6 P, m3 n* I. w: B1 Q
- LDX #32
$ f+ q/ T: H2 E s3 c' l* z* O - Init_Name_Table_Text_Write_Char
2 o2 y+ @9 f4 M. ?# I - LDA #'0'
* d/ F0 h( ^$ h( P9 W. Z - CLC' ^* q6 K; f5 z6 _! \
- ADC FC_Data_Buf! y+ L( A2 N: r6 k' q" _
- STA PPU_DATA8 x1 k( o6 h0 D& `( p
- DEX6 l) F) M9 K! c! c/ M, M+ n9 s
- LDA #$14
! v" q+ R- X3 L3 F - STA PPU_DATA: J& a6 z1 M0 r) d2 ~6 c$ w$ l2 `
- DEX
" @& j( [/ x9 G, u% ]" t$ J - BNE Init_Name_Table_Text_Write_Char/ e, S* D$ i W# q' s
- INC FC_Data_Buf
: G; J! H# w5 x8 H: [, T+ } - DEY' _3 c/ u, z/ Z1 {* D+ b! d/ x
- BNE Init_Name_Table_Text_Write
6 Z, ?; K, J, c8 |+ A; P3 k7 p - RTS' T0 G: e, q/ S) P$ n1 }
- # o: `1 ~; I9 G8 J0 ~
- ;==============================2 w2 j, W7 B6 O, e5 I& N
- Init_OAM_Ram;初始化精灵内存" B- \( i8 f: r1 v5 s% e4 A
- LDX #$00
' ^7 M7 B+ M; S - LDA #$00
! _' s- m& ^# _# C - STA PPU_OAM_ADDR
1 e3 k. q; X: D6 x2 N; s* a - LDA #$F83 ]+ n9 }8 ^7 w& _4 d' ]
- Init_OAM_Ram_Write
3 K# h* F9 ]. w/ J: N7 ? - STA PPU_OAM_DATA; x) v* M$ e5 c0 N. X# M; w2 }
- INX7 g9 |; ]# g' m+ o8 Z, u
- BNE Init_OAM_Ram_Write8 r1 \: a( R0 i+ W
- RTS7 i1 x" p% g( u; ]# }1 u9 \8 E
-
) c- L: q. B) | - GamepadProcess;手柄处理( x6 }' w- U. L
- JSR GamepadDatacan: R% G6 j9 c3 ]8 P) b" r! q
- LDA <Gamepad_0_Value
& {. R* T5 E- x2 { - STA <Gamepad_0_State
[" y Y2 o' u) R( B" s; \ - LDA <Gamepad_1_Value
7 ], g! O; v" u6 H; | - STA <Gamepad_1_State$ |' G$ L9 f$ T5 e5 a" y# o$ U
- JSR GamepadDatacan
5 p2 i: {! u5 f - LDX #$01
- j* {$ D3 l# [ - GamepadMergeCheck;合并手柄输入检查, j# m5 j; C- Q; M3 |
- LDA <Gamepad_0_Value,X, K: v5 {7 T) @: C5 d- X2 A5 j
- CMP <Gamepad_0_State,X1 D4 T& B, p0 I7 H
- BEQ GamepadMergeInput* S3 g, a4 s+ W1 c2 ?5 ?
- LDA <Gamepad_Temp,X; U- v$ Q' }) ]% Z/ a
- STA <Gamepad_0_Value,X5 l7 A2 D- Y! z% K
- GamepadMergeInput;合并手柄输入
4 {; \( x+ L% Y- J - DEX
/ V) d* A7 U& o! |) \& v, V5 N - BPL GamepadMergeCheck/ t! m/ ~# ]/ L% H- l& O
- LDA <Gamepad_Merge/ B' [3 S+ Z" v. F
- AND #GAMEPAD_MERGE_FLAG+ M/ W E! B2 z ^# F- ?7 Y( L. r5 @
- BNE GamepadStateProcess/ K* g: v8 J) v! D- B
- LDA <Gamepad_0_Value; `3 @0 T- w. T4 z
- ORA <Gamepad_1_Value/ K, z9 i3 }7 R/ { H8 g8 w
- STA <Gamepad_0_Value
8 x# F! m, e, r( L7 T3 u - GamepadStateProcess;手柄状态处理
4 U, @% s* }3 l# \) i& \. \ - LDX #$01
& I' [' ] Y( t1 Q$ {' z$ q - GamepadStateSave;手柄状态保存
; g) I6 X5 a# g9 z% q: a# b/ J6 ` - LDA <Gamepad_0_Value,X
! z v4 v- @) n4 J9 w) g+ l# d - TAY8 l1 k$ ?- K* P: E) v; B0 A& b
- EOR <Gamepad_Temp,X6 I; C% x& a6 r3 h1 D& ?
- AND <Gamepad_0_Value,X
3 a1 J6 F7 S* |: j8 z1 v - STA <Gamepad_Once,X
) h* ]' a! `( K& ^$ ]- J - STY <Gamepad_Keep,X& X$ o& n+ Y. H& d: _* l# ?4 u
- STY <Gamepad_Temp,X% G" ?$ y7 Z4 K
- DEX& O% y1 C) n1 v
- BPL GamepadStateSave2 T7 K+ W- t( l. p- D
- RTS/ o3 @- w! ^8 U
% }! U" ~( d0 ?- GamepadDatacan;手柄数据扫描. d2 i# x& V( Q Z x
- LDX #$01* j4 @5 u4 ]! ^& Y0 j
- STX $4016
( N% S* ^$ J& y0 s - DEX; x2 T- T. W" s5 p% g
- STX $40162 b+ k, l+ [5 y6 a; h
- LDY #$08
e9 ~5 E' ^2 R# o: h' y - GamepadPortScan;手柄端口扫描; c# q& x3 _) m H* M; N
- LDA $40164 t2 T+ l3 o5 c" K6 V% R6 W1 e
- STA <Gamepad_Port_Value* m5 A, l, m( T) f o. [
- LSR A, C( t/ t. y0 E9 X$ W: y6 w; h
- ORA <Gamepad_Port_Value
* e; [+ p, L; n6 P }1 ^6 @3 a3 l - LSR A2 l' Y! [; C8 V* u
- ROL <Gamepad_0_Value C9 ]: r4 o$ Q- U3 _
- LDA $4017% p& I f6 o: h& x
- STA <Gamepad_Port_Value
7 J. b) X7 j. n. a - LSR A: `' O4 u) e5 j c1 g, n0 k5 w
- ORA <Gamepad_Port_Value0 y5 n$ u+ S# X+ n* |0 e) W' T
- LSR A) C1 _& @( S& L
- ROL <Gamepad_1_Value2 @7 J, k: J2 ~
- DEY- L! M L. h4 A: M- C! Q) x2 s
- BNE GamepadPortScan
% ~* X/ F+ y, l/ F0 O9 w" T - RTS: m. o; o; `# K! y9 U% l4 @2 G
-
( j/ ]6 G4 S1 ~; v. F3 p - ;==================================================
4 Z' p( t# t$ }6 U) k - ;PPU处理
5 X! r$ o0 Q# L/ u# u! D6 d - PPU_Process
- J& ~6 ?7 T; ?$ d2 ~; z; L& p7 M - LDA #$00
# [; f& v$ Y* g% ]/ B9 d- {) G9 u - STA PPU_MASK
; l/ e4 E2 E) w; J( I - , H6 L- \7 Z5 M. p0 `0 _0 ^: B6 Q2 M, V
- BIT PPU_STATUS
: V# a! c4 \8 s+ V! G - LDA #$206 q# c3 J* r0 E( K
- STA PPU_ADDRESS6 F3 X6 l7 Q; y) ?' q; O
- LDA #$00+ h$ P% N& Q( _& k
- STA PPU_ADDRESS
0 @9 E0 q8 r; y0 Z$ }' ` -
$ [) A* n$ F+ G4 j - STA PPU_SCROLL4 s6 Q8 Z* S/ g4 m) R" h4 ~
- STA PPU_SCROLL* _5 I+ s6 s' T4 T
-
4 W" N. T( W6 R - LDA PPU_Msak_Buf
: g" c H* I$ d' p5 T - STA PPU_MASK/ V. @% L( u/ P5 Y
# M: M3 }/ U! l2 b( Q- RTS4 x7 ^; k% g/ J- Q* e
- ; O; E- j/ w- |' P; H4 O1 B
- ;==============================
" }, I4 Q7 z& L# A! a6 B - Time_For_Vblank;延时等待
1 w) O4 F* m ? - LDA PPU_STATUS
% w6 Z) `$ R+ K; v( | - BPL Time_For_Vblank
5 j3 S+ [6 ~! s5 K- N. ^ - RTS
& Z5 w0 D2 x/ w% Z5 f- }+ U& } -
& z" c2 q4 m/ ^ - ;==================================================3 [1 a" O1 k7 R
- ;初始化MMC3; _# L" y6 c: r
- Init_MMC3
* f4 ^& \5 A: ], R' J" a5 ^ - STA MMC3_IRQ_DISABLE2 W( `$ \% p+ U* P& f" Z8 B! E
- 1 s7 r2 B# w8 I* k
- ;设置MMC3水平镜像
6 ] R7 d# e4 j4 S# g' L" q) c - LDA #$01
- W9 Y" _& m+ J9 ]8 l - STA MMC3_MIRRORING B! @$ A6 J, U( }) w1 K; u7 ]. M m- l
- 0 Y' W' @$ e- E4 Q% j
- LDX #$05
8 Z) }5 X/ x, ]8 a& @: m& { - Init_MMC3_Chr_Bank_Write# Z5 W8 p1 l$ u0 ?+ t- H
- STX MMC3_BANK_CTRL+ Y3 y2 I( A9 }+ L. z& `! W r8 P6 v
- LDA MMC3_Chr_Bank_Data,X- I6 ^7 L" d, D( O' p/ ^6 ~2 p- x
- STA MMC3_BANK_DATA
5 w# n2 d1 d. h' ] - DEX
4 B" }1 a5 ~* Z1 I3 W2 m2 N3 N - BPL Init_MMC3_Chr_Bank_Write
. n& ?& ?! Y2 R - RTS
4 F% o3 O2 J. W( P. l+ d5 E - ;--------------------------------------------------
6 L4 P2 H2 \" ~3 f t$ ]! C* b2 J* \ - MMC3_Chr_Bank_Data8 N# F4 R& I; d5 d# U/ P
- .DB $00,$02,$04,$05,$06,$07/ X7 J, i+ S4 s$ Q7 F7 e
. v/ i' H( r1 M* Q; R- ;==================================================% e3 Q# r. b8 ]5 [- ]
- ;重置中断处理
, h6 w. }6 j( ^3 ^ ~1 o - ResetProgram$ n$ {6 `6 `9 t% X4 M
- SEI9 v0 R' I" |# H, M
- CLD. d& \) S# T" W' a$ ?
- LDA #$00) u0 d& ?6 {$ K) H7 A
- STA PPU_CTRL2 f) P& Y0 J0 u. |4 u5 r$ L
- STA PPU_MASK, P5 q2 r# d' S3 I7 M/ r6 O( a
- STA PPU_STATUS! K- r+ G' B/ x! d5 q; {* u" M
- STA JOY2_FRAME0 f) \9 ?5 x6 e$ r3 }
- STA APU_STATUS9 c7 z/ Y! k; n i* q
- ! U' X* d. T9 U6 ?4 U+ N$ ]" m
- LDA #$C0
; u& B" ?$ o, v* L - STA JOY2_FRAME- r+ i+ Z4 P( i" t, ^8 @' ^
-
: m2 X8 V) G1 V2 r - ;等待vblank5 h$ ^8 m" r6 s! H7 d
- LDX #$02) H9 ^* \* ?" x* i' s: U9 O5 _
- Vblank_Wait_1% A3 P* |- w/ ^7 e9 o
- BIT PPU_STATUS
" ^$ ^' E% |% m4 ]$ p/ o) g - BPL Vblank_Wait_1
) t3 t. P; b3 i* S2 h9 H - Vblank_Wait_23 G# o8 L8 ?4 F' n" p
- BIT PPU_STATUS
" F& c2 d* t% b; q - BMI Vblank_Wait_2
: o: D; i% b1 r" @. V/ I - DEX
0 H* ?# a( W! I2 c) [# F: g - BNE Vblank_Wait_18 v: m* I( o5 ]% |, P
- ) E2 M. P; z% i) G) b
- LDX #$FF; Z8 }# F9 r& \( q0 y' S( s3 M
- TXS" F& D" z' J* T4 o! F
-
- ?5 W( Q0 L8 k+ s - ;初始化MMC3- x4 T K1 _3 I% \/ \8 x
- JSR Init_MMC3
6 L" Y: C" I4 |' U) f7 [! h: O8 T, \ -
; W- Z6 S! v$ w. |, c$ f" E - ;==============================* `* U* ?9 \( ]5 R& S( B
- ;RAM初始化) H) [+ ^# e7 d3 X7 U6 Y2 s5 O
- Nes_Ram_Init
* Z5 S. F- f- ]) \: H% i# ? - LDY #$00, W( J. {* C6 Z1 Y4 ~
- LDX #$08% [# Z, U' ~5 O
- LDA #$00! O8 G: L! K* W) G8 U% w, z
- STA <$00
) q; N4 i. V$ x7 ^' E3 G" O% ` - STA <$012 ?/ A, V( W% E* L
- Nes_Ram_Init_Write8 e- n1 R% @" M( g1 L+ a9 D) C! J
- STA [$00],Y4 }9 _9 {2 ~% E' |8 {+ A
- INY
( X1 p. D4 @1 ?. V. ]# ]/ Z1 [ - BNE Nes_Ram_Init_Write3 H5 w, F% R [1 v$ P1 o
- INC <$018 y2 U) T* Y5 B
- DEX% q9 m9 E' g' O. h5 _4 q( I
- BNE Nes_Ram_Init_Write
& h) Z/ M9 y8 E$ u z% l -
9 A1 s- X( k+ ?3 T F* c) T: i; {# y - ;初始化命名表( @1 z a+ M ~# T0 L/ ] j7 H
- JSR Init_Name_Table6 T* a6 K6 p0 [) @
- : ]% ~3 d, z, B: O+ n! ~$ E
- ;初始化调色板9 ^. _! H4 o5 x: z9 {* n
- JSR Init_Palette
6 k$ p$ n& A7 ~ o0 F$ _$ o - 3 L1 g% o- I, c+ J! {4 d: j
- ;初始化命名表属性
5 l; i6 ?+ t5 ~ - JSR Init_NameTable_Attributes, k* i! ]; `) u0 X
-
7 Q* \3 ^& L/ {8 ~# q - ;初始化精灵内存. U( r# Y1 _% x' T
- JSR Init_OAM_Ram
, O3 w- P5 b8 a% Q* W -
& E# _6 [7 v& j/ ]5 A - ;在屏幕上写点东西7 d2 [: J$ M$ `' L9 q4 i
- JSR Init_Name_Table_Text. T5 e' s7 `# C0 u2 V! {6 F! o0 |
- , k+ x" k5 V! E* b+ Z8 l
- JSR Time_For_Vblank( }: n% F- p' h+ G% ^9 @2 ^, h
- ;开启PPU控制
& Q2 k; F ]6 h - LDA #$808 \1 c0 O* |" t, p& E" R
- STA PPU_Ctrl_Buf2 F6 J7 H# t; w
- STA PPU_CTRL9 f& _# S d- b
- 8 Y1 r6 s' p$ w5 w9 u$ {$ Y+ z
- ;开启PPU显示1 }. C7 P& q" r8 F4 @
- LDA #$1E
' s# E0 E7 k! ~4 m - STA PPU_Msak_Buf$ ?9 O% @# p5 S4 H" Z! x
- ) Y* \* f+ i0 \ ]3 z4 e8 a" M
- LDA #77
. x+ l% H3 c8 x* I& h# k - STA Sprite_0_Y5 _3 a8 J4 b4 |0 ]8 R0 R4 r! o
- LDA #$1E& f( n0 r, g5 G
- STA Sprite_0_Tile. [1 _0 h1 I: q+ I4 `4 ~2 G1 U0 c3 h
- LDA #$20
* Z% S# v2 {% O* @8 a) l/ f& R - STA Sprite_0_Mode
8 f( e& `/ S$ \; c: k - LDA #$00
S y# g5 E+ _) Z( ~ - STA Sprite_0_X- X2 f4 T+ \; ?! n" K% G- `+ ~
-
- {7 V7 a# s" J - CLI
$ L/ K( w: p* A+ { - JMP Loop
9 s7 c; o3 b* o& p4 h - . ?( |" P+ ?4 ^. {
- ;==============================, O! D; H1 _$ P7 ?. R# G
- ;死循环, 等待NMI中断
5 ~& n* i- w. M - Loop6 O) O i: k4 D
- JMP Loop3 B# _( h( x, B, i8 m: r
( h+ U- F5 k) F( w. I; ~- ;==================================================
8 d" h" g8 Z# B! r - ;NMI中断处理
7 Y, r& ~( h: z6 ?/ [3 }+ x - NmiProgram/ T# j1 r; S M" E- }% J, V
- PHA
' Y( K7 ]# ]: {% s+ i$ g - TXA
0 I2 {6 [3 c( z6 z - PHA
: P, X0 k W$ |, t, b! O2 p - TYA) ^0 M3 H$ z- { ~$ G% k9 O
- PHA
/ ^. [$ j' J& y& D, t Y - ! Q: J2 j, k5 J* ^# i. R
- BIT PPU_STATUS
1 ^8 X7 w. [/ X$ z$ N2 d- o -
1 h2 E, r1 Q) m - ;关闭PPU控制
( {$ C& @; [1 L! K" X* k d - LDA #$004 [3 K7 R+ _, T* D
- STA PPU_CTRL
3 G q- m( w. Y% s3 P4 t -
, ]; o N# J2 c& X& L8 p - ;处理PPU* G6 D2 u! l) D: Z9 @: f* F: u
- JSR PPU_Process0 J [( ]/ _ X6 r; e
- & ?' N/ o: k& r- a# x5 t" _$ U
- LDA #$00( O) P$ O( x4 M4 s) u$ w& H
- STA PPU_OAM_ADDR
0 M0 Y% d% }. a9 J5 @7 }1 X* L/ s- q' m. W - LDA <Sprite_0_Y
B* F x: ?2 K& y$ h$ m - STA PPU_OAM_DATA) C, u4 a$ V, T$ P9 k0 Z0 d
- LDA <Sprite_0_Tile
' ]& ?* t9 a3 j2 u% G, V - STA PPU_OAM_DATA& _: z' f M$ ~' F. S; l
- LDA <Sprite_0_Mode6 e+ E9 B& U! ]! y" |+ P2 I
- STA PPU_OAM_DATA1 X3 ^ n5 P$ R' d0 g0 [. b
- LDA <Sprite_0_X+ c- E2 z6 ?9 P" j, t6 A8 @3 J) n
- STA PPU_OAM_DATA
% ?. \; C8 B5 `$ N2 l7 c- l - ( B+ m7 t2 h3 W$ E
- ;开启PPU控制
0 D1 ?- u2 u5 `9 r - LDA PPU_Ctrl_Buf6 y X, [; m) q' o
- STA PPU_CTRL
9 U+ W: L) P- o8 X' \9 w- { - . ]* E% O, ^- a( K$ D3 ^6 e$ K
- ;屏幕滚动; j3 X! o# Z0 P+ ?; X1 W$ z
- LDA <PPU_Scroll_H6 K0 k. E$ _* f2 u4 B. o
- STA PPU_SCROLL# T. O1 c, e& O
- LDA #$00+ n3 ]; S- f) i2 g/ |. r4 Z
- STA PPU_SCROLL+ { _+ @1 N5 q' |; y$ D
- ( Q; n0 O7 L2 p4 L4 S
- ;手柄处理
: c) H4 {* v$ y4 E) G - JSR GamepadProcess- A" o# ?3 g- @* `' e/ U9 `
-
9 D5 U @: }6 {( L- Z - INC <PPU_Scroll_H+ R$ L# C5 z' @) e
-
# c! `9 G' B7 S( a2 t. Q( z# F - ;启动0号精灵碰撞检测
) ?, j; R/ l/ l7 v& M T# T - LDA #$01# p3 I: O @ f9 M" r' J
- STA Sprite_0_Hit_Move_Direction+ t: i. A2 N5 h1 D
- JSR Sprite_Hit_Test
5 v# f2 W- [# l2 p4 R- s -
; {. |2 m% A6 N+ J - PLA
$ I9 v, W u$ \) ?* E+ } - TAY" i& p! d/ Q1 K( R
- PLA
2 B4 \- c- G1 M6 O2 }- V5 F - TAX, @2 X1 Q) \# u' v8 z
- PLA
9 a& v0 a! b8 A - RTI
! X% K7 C8 j1 w5 P% f! w
6 p1 L- ]/ m7 F4 ?- ;==============================
7 P2 [9 F; u" @ - ;0号精灵碰撞测试
! r" X. ] a5 W' V! x& B - Sprite_Hit_Test
9 d. Y( h' ^8 b) Y+ V- G, q - / i4 }+ j& _! |4 d0 d4 I
- ;------------------------------
# k9 {3 [8 i% {5 ~8 u: ] - ;等待0号精灵碰撞状态取消
. O: e4 d" y: S" W; x& e f% H - LDA PPU_STATUS
9 \8 A4 @1 `9 L/ N3 X9 u - ASL A- L# {, M) Y% x8 h* D
- BMI * - 40 {( o3 s1 ~+ X* w! X7 L
-
/ ~ g* E, A' s! T* @ - ;------------------------------! h+ n- b) p; B. O {
- ;等待0号精灵碰撞发生' g5 D; j6 f8 y
- LDA PPU_STATUS" ^) h' ^: Q$ n
- ASl A
- _& q3 J) w; R6 ~; t - BPL * - 4
; p" I, H3 b3 f - $ q7 a7 ~4 B' t4 l* ]
- ;------------------------------, e# }2 B, e# g' q
- ;行消隐等待
7 p( Q- C- S7 q; C - Sprite_Hit_Scroll_Wait
& c: w4 N% A" M! B/ u3 J8 J$ l - LDX #$28
" B! B- [% _+ h, y9 Q5 r8 K/ }! Y - DEX
; K6 _' n+ N p0 o, s7 z - BNE * - 1+ l- A* C% y6 q m" F; [7 z+ {
-
& W3 `0 w+ q( U. D - LDA Sprite_0_Hit_Move_Direction* V3 g/ E% U* u& ^, k9 O
- AND #$01
+ ^2 i1 s9 Q& K) q" c1 { - BNE Sprite_Hit_Scroll_Set_Right
- J* R1 J( i4 z" b# \ - : A0 T/ }: @& M. L- [# T) e
- ;------------------------------1 | Y5 l, _( z" b' s2 ]8 [4 c# G
- ;分割画面向左滚动
1 w' o" n9 [; a$ d, ] - Sprite_Hit_Scroll_Set_Left; B& P' D* e* t9 X- M& I z! o1 u
- LDA PPU_STATUS
+ d M; k$ \. ?: ?" W) M N - LDA <PPU_Scroll_H
' ~/ p$ |) _4 g) v5 e - STA PPU_SCROLL% @) ?" H* w( E. b; O
- LDA #$00
2 P# q6 Q! J3 o1 b. j, F( _# q$ L8 ~ - STA PPU_SCROLL, D; z! k1 i+ \2 d t) L
- RTS
' ?+ c7 i: I2 n5 P5 U' e+ H - 5 Q+ O6 P6 @+ }' b% q
- ;------------------------------, J1 t7 S+ I1 I; v- E5 d+ o
- ;分割画面向右滚动
. |# c% b& D' e1 V# J2 C - Sprite_Hit_Scroll_Set_Right( j5 l, v* u, N) z6 I
- LDA PPU_STATUS
0 B' D" M6 L! m9 h' P! c- v - LDA #$00
5 h! }+ U# X( ^$ F - SEC
, F: {0 F1 K" I9 e# p8 n, u) W - SBC <PPU_Scroll_H. o0 O2 P* _! C) I
- STA PPU_SCROLL
& A/ c0 ]1 {! G$ Z - LDA #$003 D7 I. f# w \% V
- STA PPU_SCROLL9 j( o; k$ n3 t& s
- RTS$ }9 R4 {3 m: p3 I7 y
- ( e; ~( z0 d' E0 C. }
- ;==================================================& [; `0 O8 ~ h9 D! b0 L
- ;IRQ中断处理! k$ o6 ~" H7 a* v2 y
- IrqProgram
) A7 Y W" u( I" \) }4 X- F - PHA
. w2 s" [) Q+ {# U, b/ o- b1 S - TXA s* R5 g0 Q4 x
- PHA1 A7 q0 I; f+ Q9 ?
- TYA7 o" n x0 `' z! J" O
- PHA9 n' D$ H2 r" {
-
% Q( v2 u- D% B3 C+ `1 h( S3 d - ;关闭IRQ
0 b. K y3 B+ s$ Q( f) f - STA MMC3_IRQ_DISABLE) Z; f* K8 t) {3 I) q- c7 w7 f
- , F8 X* Z/ P1 \/ o$ V) y* v
- ;允许下个IRQ触发; _" o' N/ X6 G( B! R/ h$ w
- STA MMC3_IRQ_ENABLE( L6 d- x( C. M; L" r* u, S
-
) F0 I0 |% p3 t( u9 ~! K - ;IRQ处理, 15线后继续触发3 T9 r3 F( S7 h) R$ {
- LDA #15
1 ?" M) M4 |3 E$ g - STA MMC3_IRQ_LATCH+ s( N( T H: \6 C! n7 {" [/ V
- & `% C$ r+ c$ z$ x V
- LDA <IRQ_Index
8 c% c* i: l! c( s" r! d# I - BNE * + 43 c$ K/ T Z. ]3 e
- INC <PPU_Scroll_H
' f: V: B- V P5 J& i! ~' l ~ - & X2 b: i$ P+ M5 K+ @
- ;设置屏幕滚动, y( g0 E! Q' E8 E" F/ P
- LDA <IRQ_Index
/ `) F6 _7 s* W! F: W( d - AND #$013 b: F8 ]9 |3 R" \4 f
- BEQ Irq_Scroll_Right8 r* p' u6 P$ B: E
: e3 m9 v( @+ g% z6 C9 \0 i- Irq_Scroll_Left b% }* x# }# S. ^* d0 X
- BIT PPU_STATUS7 _! A. X; Z% i& L3 o
- LDA <PPU_Scroll_H
: _% Z, w8 x& A, f% `! D7 A; Q - STA PPU_SCROLL$ W' u' e: P" @% I: v* a
- STA PPU_SCROLL
. o* `; q; J9 }( I$ }& X$ O - JMP Irq_Scroll_Over, K& W! [& d- s
-
# K# s8 o8 g6 u9 p3 L t - Irq_Scroll_Right/ V- M/ D$ b' a v# j6 }2 f
- SEC8 N% @! ~) U% d: e, p
- SBC <PPU_Scroll_H
+ \: r. L8 x2 R+ E1 }- {" E - STA PPU_SCROLL( g# r" ~7 \! c
- STA PPU_SCROLL5 B+ O& S; e- }7 u
- Irq_Scroll_Over) g9 S/ w# p/ p5 q% Z% K$ p* _1 U
- 7 p. ~% D# N% H# {/ B b& e4 c, p
- INC <IRQ_Index) t; P6 g2 d5 g0 d' H) m0 T1 u
-
0 j1 ]$ p% u2 V( D8 {8 N' \ - LDA <IRQ_Index8 t7 R# x& `- E3 f8 o
- CMP #14 ~1 j' G8 W8 K' F
- BCC * + 5
' h1 h0 M1 B0 A$ `. U8 E - ;关闭IRQ
- g- m% ]& r N, F5 w4 u - STA MMC3_IRQ_DISABLE l3 m% i0 O8 y: |$ B) I6 b
- % o+ Z) k* b3 T. Y
- IrqProgramEnd
, n2 E* |9 c5 I$ F - PLA6 I' P+ p6 v$ E9 Q, _0 G
- TAY
5 S0 a8 ]* {/ Q3 ?/ s - PLA
% \# j+ i" a K& h$ l" { ? i8 B - TAX0 \% k6 d* ?; r, Y6 Q5 [3 w v- j
- PLA+ K/ t2 C$ F0 j# O/ W! ^5 ~) U5 s
- RTI
! E3 B% T( a. [9 } -
7 V B3 D) }- A( O- D - ;==================================================/ i( D. Z4 {* ~) a
- ;中断表
9 a) q0 u2 ?3 Q! e2 u - .ORG $FFFA
0 v; \8 ]9 W5 x- j# @; { - .WORD NmiProgram, q) R% R6 o5 N: N6 _ [
- .WORD ResetProgram4 K5 w3 @( E5 X. Y9 O
- .WORD IrqProgram
复制代码
}& B& }- ^% D: t, o8 \! i |
评分
-
1
查看全部评分
-
|