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