|
|
- ;[FC][MMC3 精灵碰撞]. R: h$ I/ ?: ^0 q; I
- ;FlameCyclone 20230710
4 o$ m0 o5 f5 n% F4 @ - & I+ ]$ v7 ~6 o! w
- ;文件头! Q9 A7 ]' w! ^8 D2 A
- ;======================================================================% f" d' P3 c, j8 i! N& ]
- .INESPRG 4 ;16KB PRG 数量3 @7 I- h3 _: X I' k- ]' Y
- .INESCHR 1 ;8KB CHR 数量
4 p% e) w, ^6 i& ^/ C9 W# e; m - .INESMAP 4 ;mapper 4! s! e( r; U, C6 [' w$ E, R! m
- .INESMIR 1 ;命名表镜像 0水平 1垂直# r! V- y4 Y5 C6 Z
7 u6 \- J J0 T& t8 }+ l3 @- ;必要条件- }2 p" @' I0 k1 Z$ g
- ;1.持有CHR ROM
; j! }" S- `2 k+ {' E3 y( {. a - ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000& N5 D& x2 j9 k m! [: V+ K
- ;3.精灵内存(OAM)不为空
0 e. d4 L! X$ X) |9 F - - J# Z' q9 Q+ q9 d1 u2 `+ L$ V
- ;==================================================) L; Y- g4 \. Z; S' I
- ;NES端口常量
7 M' K; I$ k6 F# a/ x8 F - PPU_CTRL = $2000 ;PPU控制寄存器' N3 Z1 [ Z$ t+ w
- PPU_MASK = $2001 ;PPU掩码寄存器
/ E8 N2 n' |- G- N( s - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位3 F- U2 |3 J1 O9 ?9 P
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1 V6 g# r: l0 |" x& G& E
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
0 a' c5 _7 w+ P. v, b4 l: a: t - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
' g" T7 ^$ z" ^ - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
4 y! j: R& e. b! m+ d2 z) m - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 9 ^9 p. }" k$ I# t+ ^) B, M
- OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存, Y0 R3 X0 \' _7 j$ S) r5 K
- APU_STATUS = $4015 ;声音通道切换
$ u7 {$ o6 y, D4 n: o - JOY1_FRAME = $4016 ;手柄1 + 选通
) B2 y8 D# O" Q: q0 | - JOY2_FRAME = $4017 ;手柄2 + 选通
- L2 E$ U# g! W - ) f9 k" M! h) K3 o' k
- ;==================================================
6 G" I( ]! g: l# D - ;MMC3端口常量
" S7 i2 f) M9 s$ ?! C - MMC3_BANK_CTRL = $8000! C0 _0 R7 d6 A a" [
- MMC3_BANK_DATA = $8001# l* A, y' A% z3 n9 i/ Z/ n4 R
- MMC3_MIRRORING = $A000
, x# w4 ]! Z9 y% s - MMC3_PRG_RAM_PROTECT = $A001
6 r: n; P0 e/ h9 u H/ C - MMC3_IRQ_LATCH = $C000
) S5 D6 u; v) m) r1 P4 ~; J - MMC3_IRQ_RELOAD = $C0011 y( v% G) `- f1 {' E
- MMC3_IRQ_DISABLE = $E000- Q2 ^+ O& \- i& s" w. t
- MMC3_IRQ_ENABLE = $E001. L; ]1 w u0 S2 p6 a$ ]( G( E) \" F* J
- 0 t% P# h6 C9 n) i$ B$ `0 X* N
- ;==================================================
$ Y4 Q z' o+ i+ ~9 }9 F3 U% k( W - ;程序块配置, V0 F7 M$ L- x3 r; x
- BANK_DATA_MASK = $07
. A# {1 W' a# ^$ Q# S - ;--------------------------------------------------0 K! R8 J1 w) E C
- RESET_BANK = $07; }3 K' u$ `6 c( @% P" @+ a
- RESET_ADDR = $FC00/ D! H/ s" w9 w" m1 Q
8 t# u' I5 e% G- ;==================================================8 B7 a% F. G- b
- ;图像块配置6 |8 s: G% \8 I! ?$ a( R, g7 T! J1 c
- CHR_DATA_BANK = $08
" j& e, R+ v8 \9 A0 T4 \ - & x6 W3 H) R$ F _6 X
- ;==================================================. N: K" P$ a6 @8 R8 [
- ;零页内存地址配置" W7 u% Q2 U; Q; U9 Y7 Z( N! x8 h; j
- Use_Ram_Addr = $807 k0 Z! `& D8 ^5 A# b) N5 b& V
- PPU_Ctrl_Buf = Use_Ram_Addr* ~6 `) R" I- A
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01
! f$ Y- o( p9 H; \3 k& j% J - PPU_Scroll_H = PPU_Msak_Buf + $01
3 x' r y- p* g. z0 g! n/ w1 @/ Y - PPU_Scroll_V = PPU_Scroll_H + $01
* G/ X! H( O7 F# Y) j - FC_Data_L = PPU_Scroll_V + $01& d/ \9 e' S2 I( l7 Y. E
- FC_Data_H = FC_Data_L + $01+ D* D5 j( ^6 X$ o: m R
- FC_Data_Buf = FC_Data_H + $01
! \8 `' h' \& b - ;==================================================
4 a+ [; v2 a) D7 O. E- ` - 9 I) o' w% b, Z E
- GAMEPAD_MERGE_FLAG = $040 w% j: a Y! i8 p
$ d( Y w/ w( M1 c0 K8 }( Y- Gamepad_Keep = FC_Data_Buf + 1, E$ H' n* T3 {+ e: F; G& a& D
- Gamepad_Once = Gamepad_Keep + 2
! o2 s* Y. x( A$ _0 k - Gamepad_Temp = Gamepad_Once + 24 i4 M) ~: ^" w+ N0 i
- - R8 |: w' V1 k0 M1 [+ ?
- Gamepad_0_State = Gamepad_Temp + 2
$ x! s& E5 Z9 S1 i: o - Gamepad_1_State = Gamepad_0_State + 1$ M/ i9 p3 u: `9 A$ q. A# e1 w* k0 Y( c
- Gamepad_0_Value = Gamepad_1_State + 1! i- ^1 I3 U% X5 H9 V) b- [) ^
- Gamepad_1_Value = Gamepad_0_Value + 1
* C" w' V! P5 O5 V! M - Gamepad_Port_Value = Gamepad_1_Value + 1
* m% _, {2 O. i/ k& H) Y* a+ C - Gamepad_Merge = Gamepad_Port_Value + 1
0 G& B0 V a$ W0 m, \( O r+ l/ L
$ Q7 o) W; p& v Y) L- ;==================================================
4 e5 G/ T ? D - IRQ_Index = Gamepad_Merge + $01! p3 b7 _# \* b" e0 R
- Sprite_0_Y = IRQ_Index + $01
7 b% V) `6 \; O* j( q& _! r - Sprite_0_Tile = Sprite_0_Y + $01
% }+ g& s i ~- h1 j - Sprite_0_Mode = Sprite_0_Tile + $01' T" C4 ~9 T% Z6 L/ e
- Sprite_0_X = Sprite_0_Mode + $01
; v2 M8 h9 n8 n - Sprite_0_Hit_Move_Direction = Sprite_0_X + $01
$ u* }1 C- ?% I - ;==================================================5 S0 b7 D# o3 G) l
1 m+ m) g a+ [6 i% M- ;CHR图形数据0 t0 t' {% { @5 m i, p
- ;==================================================8 M& L% x( J8 {6 J+ D* O* ]
- .BANK CHR_DATA_BANK
& V. ]1 ^, q0 ^4 s' C% [ - .INCBIN "chr_bank/chr_data.chr"
0 Y& o2 s/ U3 b9 V' A - 7 S9 k, o# p2 F2 H& ]1 R/ \
- .BANK RESET_BANK & BANK_DATA_MASK
2 t- n2 r! }+ B- R1 ` - .ORG RESET_ADDR
+ G2 R" P+ L+ F7 }( x. s$ D5 ? -
# d( v: F) ~9 o# } - ;--------------------------------------------------
- b0 U8 F4 Y3 q" C1 F, }% e - Attributes_Data3 Q- z, u6 g8 E) x- J: ^! s3 P( H- ?
- ;命名表属性
* i. i# c J9 z7 u; o$ m. b - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, n$ a. n' S9 f& Y* y
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA* W+ M3 X' f5 p! t- z( o: A
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA; S$ `' W% M0 k4 P b
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
' _' r" X" N0 i3 q6 z7 P - ;--------------------------------------------------& j9 w; U: m+ S8 w9 R# K n( G1 n
- ;调色板数据
& p0 R8 P% d. f7 E! l - Palette_Data
$ p7 H3 R" Z4 p( i6 h - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F5 u L1 A, F; A# x- f: [1 j
- .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
, p/ {+ B% i) `: q9 ]9 P- F* ] - ) z, V4 T- N2 ]
- ;==================================================
7 {& t' D" w- m- y/ J - ;命名表初始化
T! s" w( J7 F- O9 G. N. z! o - Init_Name_Table
5 x7 b, o5 ~9 s/ |7 W - LDA #$20' n% q* n% j3 c8 p) Z$ [
- STA PPU_ADDRESS5 j H8 Z& d) p, `# j! D, Y
- LDA #$009 v- t" j, w) J) q5 h
- STA PPU_ADDRESS& Y! T( i( }) A9 q
- LDA #$00% t4 P: H( e& K+ M
- LDY #$00
+ m: B4 X& @/ _ - LDX #$10
0 Y/ V6 ]& I7 e5 X1 O, t- ]6 v0 r9 Y( V - Init_Name_Table_Write9 {: f, [. U- O+ z0 x: ]/ i
- STA PPU_DATA
. {$ r' {& R+ Z. G3 Y! W - INY% `* }4 M1 x* i# B
- BNE Init_Name_Table_Write* q) C8 P4 K: V+ x
- DEX
# G" N5 ]9 {( m, D6 _' w% e - BNE Init_Name_Table_Write& G$ V2 l# o/ ~) g: I
- RTS
+ @- _* f `) [. l) K1 P: N# o& n - ( D* ^5 ]6 x/ z# G2 J% B+ O* L: P
- ;==================================================
9 g+ @3 P- w4 S' f( e! B - ;调色板初始化
$ s$ v1 E: f' S9 {2 X9 R8 F - Init_Palette
1 I+ D& w3 z$ u5 n& h" f5 H2 m1 r - BIT PPU_STATUS
. a* i5 a& G, f7 F7 }- t - LDA #$3F
; J# i( X5 Q3 J- a - STA PPU_ADDRESS
: Y k, r8 \( Y5 R. N* C9 k - LDA #$00% E4 p' T0 o# K/ Z, h. X
- STA PPU_ADDRESS) [ C) W+ k. D* e
- LDX #$008 s" j" H* l7 G- g4 `( V
- Init_Palette_Write: y, i' |6 B/ o
- LDA Palette_Data,X
% @; z, U) K$ L% x5 b! c/ Z - STA PPU_DATA
% \' y. n% N; A) l8 @ - INX7 Z, ]3 m' c! ~5 R* V9 W# d
- CPX #$20, w2 h! @- V5 a8 I, V0 i& T# w
- BCC Init_Palette_Write
* T$ n& e% k. u0 N% w3 v* g4 O - RTS
* f L# k# w+ @9 B' D$ y5 H! ] -
" `7 c/ k/ c4 n( V% N n: X$ T - ;==================================================
$ {7 a; M+ {2 D7 a0 F" \$ ]3 [ - ;设置命名表属性* b0 E- f; ]. B! a- M p
- Init_NameTable_Attributes
, I* R6 c) {8 v - BIT PPU_STATUS
0 ]9 R% q. F$ Q* ^ x& _ - LDA #$23
3 a4 ~8 U3 n! J! G( g0 l5 _, i& a - STA PPU_ADDRESS+ w1 O# h# `- F) Z/ I$ F
- LDA #$C0& D+ m! U* F: E+ p6 ?
- STA PPU_ADDRESS
1 g' s6 R4 m8 h2 X1 j - LDX #$00
5 W0 Y4 u, Q* j: i% X* |7 Q: { - Init_NameTable_Attributes_Write7 \7 X4 V" O9 I; V
- LDA Attributes_Data,X
+ i9 T B l1 c& U1 e8 M* L - STA PPU_DATA
9 M4 e, w9 I/ ]4 i - INX
0 y2 t, z3 Q: I5 ` - CPX #$40, r9 e+ i( O }& N- }% g8 B# t
- BCC Init_NameTable_Attributes_Write3 g5 A$ I" x5 R* B3 F
- RTS4 h- _5 n& C' z; |( H+ J
- ( h2 P) w1 w& u1 O
- ;==================================================. ~2 {& j8 C9 A6 ?- V2 }
- ;初始化命名表文本
! I$ B! c/ o" J, t: ^: ^ - Init_Name_Table_Text3 y s5 d; U' x; N5 R. S0 h! e
- BIT PPU_STATUS
3 R% ?! B2 ?7 i - LDA #$20/ p" m. e: @5 m' @' X6 u$ o0 m
- STA PPU_ADDRESS1 s, M* }, @$ |' \( z) b
- LDA #$00' [# G* C# J. ]( y
- STA PPU_ADDRESS8 G: A- F7 {, ^6 S6 [
- LDA #$00 `& e1 ^$ p# l9 B
- STA FC_Data_Buf
6 O8 A1 W2 k! Q- d( W - LDY #30, p- B& R; [6 l
- Init_Name_Table_Text_Write
8 b0 B1 {( x2 G; k4 U( ^+ g- E - LDX #32
: P7 d. a5 D: ~5 a - Init_Name_Table_Text_Write_Char
L5 U; @& h$ w) [ - LDA #'0'# t- Z! z! [. t" M" E O
- CLC
. r; D1 ~. D) A/ l7 M - ADC FC_Data_Buf
& w$ _% `4 d+ b - STA PPU_DATA W8 }9 q" E9 e: V8 J% Q
- DEX
! V, _- c6 G1 o9 I3 N- T - LDA #$14
7 x( l7 W; b& l: b: J" p7 V - STA PPU_DATA
" z O1 a$ h, ~) `8 ^) b - DEX7 ]' @0 C* M+ r& Y' G5 K
- BNE Init_Name_Table_Text_Write_Char+ J: f) k' D' ]- Q
- INC FC_Data_Buf
/ L- ]7 w# U4 Q7 r1 a4 B% O# | - DEY
3 Y. V" K* J8 T4 h) _9 F - BNE Init_Name_Table_Text_Write2 U5 @- R& J% s! b$ G! g
- RTS+ F( ]8 K5 T1 e( q* \
- % A) C- h; g* Y P1 {; m5 R
- ;==============================
9 V" G1 X# q: X& G4 e( k - Init_OAM_Ram;初始化精灵内存; G' c; q. X$ T( @1 _
- LDX #$00% e' s `2 E2 `, \$ x" t2 D
- LDA #$00: T' g' M) m( ~) l. J4 N% {4 B$ O
- STA PPU_OAM_ADDR
- ]' }+ b& @+ \ - LDA #$F8
/ L+ `( Q( r; N) ` - Init_OAM_Ram_Write
~# ?3 l1 }. s7 M& a' q - STA PPU_OAM_DATA
) v' [3 `4 j! q2 c% g - INX9 G/ n& ]7 `+ O5 v: A: s8 s
- BNE Init_OAM_Ram_Write! i, G( y& v1 N4 e1 N
- RTS6 i* c, {6 E) w. Z6 P
- 1 W# i) t+ [! S. z5 }1 g
- GamepadProcess;手柄处理
! A6 r7 h3 F5 s1 l9 K9 m - JSR GamepadDatacan
& u0 C& a* j" e$ N% [ - LDA <Gamepad_0_Value
5 R, e8 q$ M, M, S2 Z - STA <Gamepad_0_State
& g' i9 Z$ D- [) U9 i2 x, p; S - LDA <Gamepad_1_Value
0 N4 [: x9 q( P5 G - STA <Gamepad_1_State5 ^! F9 S7 o7 Y2 D9 w. \4 V
- JSR GamepadDatacan* r" v% \ b' J- F/ J' [5 r
- LDX #$016 g6 F$ v5 S+ i) f( Y+ [
- GamepadMergeCheck;合并手柄输入检查8 }$ V3 G( I4 R: d; z" t2 ^
- LDA <Gamepad_0_Value,X3 |: L+ ]2 W, n6 N
- CMP <Gamepad_0_State,X
$ P; P" s6 R/ K2 @0 ]. A7 Q' Z - BEQ GamepadMergeInput' Z/ `9 l# V9 f4 s+ X
- LDA <Gamepad_Temp,X
7 U9 ]8 y6 y% u - STA <Gamepad_0_Value,X
! O% G6 M3 y1 e9 g1 L9 F - GamepadMergeInput;合并手柄输入
' h! j$ c5 i/ {% V9 C8 A/ f4 J% j - DEX$ h& z& }* ~$ E$ ~ t. \
- BPL GamepadMergeCheck5 r u" A* ^, ~$ U; L
- LDA <Gamepad_Merge
9 F2 V5 E4 h; L2 h. P g9 F+ ]( g - AND #GAMEPAD_MERGE_FLAG
; H- C4 Z% f; E: m - BNE GamepadStateProcess5 p- m; ^; Z. G5 ]2 @" ] o
- LDA <Gamepad_0_Value& T* C [ S/ O+ `) P5 ~ I
- ORA <Gamepad_1_Value* ]8 E! B9 D) ?* n
- STA <Gamepad_0_Value
/ a8 J( `6 B" S7 k' y - GamepadStateProcess;手柄状态处理 t; K7 |4 {% w8 G+ r# Y
- LDX #$011 D& \% H6 [* W% t8 U
- GamepadStateSave;手柄状态保存$ g: }0 l" u) E! H
- LDA <Gamepad_0_Value,X
6 \4 u9 ~+ ^. Q' | - TAY6 R) U& x1 D& n$ u' Z
- EOR <Gamepad_Temp,X5 j# A6 O- I( J- q
- AND <Gamepad_0_Value,X
* c% l' F S2 m" E - STA <Gamepad_Once,X6 F- A0 V1 g; E O" I# F3 z/ Y7 U- W
- STY <Gamepad_Keep,X* w/ k% ]) _; e& f
- STY <Gamepad_Temp,X$ L: N6 K! a# N' A
- DEX( W: r1 h% A! T: S2 I* u
- BPL GamepadStateSave
3 H& y0 E9 `6 W! q - RTS
1 W2 P7 w* Z4 U0 n5 v - ' b# A$ j: s* @& `0 @
- GamepadDatacan;手柄数据扫描; ]. s# w9 k( _* q
- LDX #$011 I6 ?! z7 d3 w
- STX $4016
! @/ s8 W; [( H/ o4 J$ w' v - DEX# q- Y/ Y% W5 K: L, D3 P( S
- STX $4016, f! u( w# i8 y2 L
- LDY #$08+ L, O5 I N+ t
- GamepadPortScan;手柄端口扫描3 `. |* O( w/ _2 ^ ^ X
- LDA $4016$ f! Y: Y' D* G! e# y
- STA <Gamepad_Port_Value
+ S' l p) c- l0 _9 m& B: c - LSR A& n, D" I9 A5 z2 D$ F. M
- ORA <Gamepad_Port_Value* ?2 U) x: @4 Y
- LSR A7 u" B0 K7 F" ~9 h+ r
- ROL <Gamepad_0_Value% B2 r/ Y* D8 u- V9 ~: w
- LDA $4017
( L) f/ l7 |. H! v8 f4 J- x( |# ~ - STA <Gamepad_Port_Value
5 w/ b3 m6 j, i9 j5 a - LSR A! y; C* Y# h6 k, y
- ORA <Gamepad_Port_Value
- e% r) c$ a5 ~2 k - LSR A/ D9 a# [0 t+ H
- ROL <Gamepad_1_Value9 m4 C& ~, s- s V) l- n4 }5 ]& M
- DEY/ P8 K8 G, Z: M8 Y" K/ {
- BNE GamepadPortScan
$ Z( [5 x# H) d7 N - RTS
5 }' R5 q7 p. T/ R m -
9 Z. r4 F# k2 p% B& d - ;==================================================
8 @( x2 P. ~6 {5 ~8 e1 K9 X( l: j - ;PPU处理
( Q8 m. w, T4 V* E - PPU_Process. j8 D7 h8 o9 U6 c0 E3 K8 V
- LDA #$00
7 m2 ~8 ~. F- k( ^4 z% L - STA PPU_MASK
2 P- O5 P5 t2 f) c4 ? -
, Z3 Q* I6 g4 n- H$ f - BIT PPU_STATUS$ ~/ A8 Q4 R5 n2 c, A2 l0 U+ ?
- LDA #$20
3 y% }. k1 Z: e3 R- P$ A - STA PPU_ADDRESS+ E% ]+ b }7 d: x h8 R7 ?* M
- LDA #$00- T0 {( I' x5 P, J$ l
- STA PPU_ADDRESS
$ {: n, o2 s L1 b' x - 3 _ u0 Y: N4 N( H
- STA PPU_SCROLL
: M% Q. i, q/ w. N P - STA PPU_SCROLL" v. ^; s0 [6 f0 V: d4 n
- 4 @. V2 t7 @# n9 e) g1 i* m9 U; }
- LDA PPU_Msak_Buf0 y3 J" c, Q9 o9 h) E4 a' c8 U8 @
- STA PPU_MASK
( M) U- I: L$ F4 G. J - ) Q. T, w Z6 ]' ^; i1 [) v$ G
- RTS. }( I. }9 H" t. j5 M: d/ a8 Y
- : Z, U& k5 M" [' a4 e' v
- ;==============================- o: i! x$ @ e1 ]4 H" c L
- Time_For_Vblank;延时等待
$ G; c, k: V9 i. D, e - LDA PPU_STATUS
1 U, ^& E% o( e/ Q9 [# m7 _+ S - BPL Time_For_Vblank
3 S4 I( T$ Z7 r, j* @! b - RTS
4 d4 [& ^# w# @ F - _; R6 U. q9 G$ D0 r
- ;==================================================+ {6 G$ I$ E/ k; b1 d0 x
- ;初始化MMC3
0 _! m, M$ I* G+ K - Init_MMC33 g! I8 [- M7 h# D# g9 [
- STA MMC3_IRQ_DISABLE
+ N. `& Y7 }7 Q, m -
9 i0 r3 [7 E* G: k L - ;设置MMC3水平镜像
4 Z3 a% I# h0 B0 ^5 V2 l - LDA #$01
' A( e- K9 p3 _0 Q7 M - STA MMC3_MIRRORING" N v+ g \( B# H
-
$ C* {& x. g6 [! K - LDX #$05( D \- \8 U: J
- Init_MMC3_Chr_Bank_Write
& m+ o* k w6 Q3 m9 U" } - STX MMC3_BANK_CTRL6 _4 e0 t* A) ?9 F* L, B3 }+ R9 i
- LDA MMC3_Chr_Bank_Data,X
' I/ d; B# r4 q8 _( k( h - STA MMC3_BANK_DATA5 |' [8 k4 P6 c7 N i
- DEX
( ~8 k1 f3 C& X" T: |; y3 A/ ` - BPL Init_MMC3_Chr_Bank_Write7 F) m. [% y. W$ ?$ m( Z6 A6 m
- RTS) H% {7 W! b. ?9 y" O
- ;--------------------------------------------------
. W$ w& h0 o! m+ v( I0 b' g; C$ e% n - MMC3_Chr_Bank_Data
- M- a+ C4 \) ?3 i- W% R - .DB $00,$02,$04,$05,$06,$07
1 ]6 I6 m) p4 k5 W0 I - q5 J. C) V0 [
- ;==================================================" y2 s2 B) }! I$ T
- ;重置中断处理* H, k' z1 z% K2 z! m
- ResetProgram
- A) `: i% B4 [ e$ ]7 N - SEI
9 `# I7 [! S' } - CLD0 u5 k" m" D: j7 V+ X7 K) b
- LDA #$00
1 ]* D( j+ Q2 I8 t9 {* J, W: N0 N - STA PPU_CTRL8 R9 e7 \, C+ }; E- ?
- STA PPU_MASK6 I6 _- w2 p* F4 Z; U. `" J/ b
- STA PPU_STATUS* G, s) z9 l5 R- d; f
- STA JOY2_FRAME
1 M7 ]1 {, x) h - STA APU_STATUS8 F- M1 `; A2 I; V6 X% @6 j) Q
-
. v2 r G1 c/ w - LDA #$C0
& e2 H: r/ \1 a$ ~. D - STA JOY2_FRAME+ f! F C- X/ @# j
-
; o1 _ K: @/ M* N6 r. Z$ } - ;等待vblank) u6 H7 V4 u' k2 S( b' F
- LDX #$02
& i0 C: R, [2 a8 _% ~ - Vblank_Wait_1* `' d9 l5 {9 `9 w! W9 R
- BIT PPU_STATUS
# M0 |- |3 B; ]9 @4 U% z6 | - BPL Vblank_Wait_1
0 {! k# m+ y' @; m - Vblank_Wait_2: j) I) U2 d( U- | z7 s2 i
- BIT PPU_STATUS+ K' C, p& U1 ]2 `0 i. G& H
- BMI Vblank_Wait_2
" }5 _2 |- U0 O) _ - DEX
9 u1 A4 ~4 e) [; m! Q - BNE Vblank_Wait_1! M3 u2 D, V- n7 G
- ) P0 F! G5 Z" g: o! s
- LDX #$FF
& i, [6 G0 {! i% E0 }* g; Z9 b- m - TXS
+ j n; A$ Q5 I) h# Y3 o9 o: p& [ - : _; {( }) J$ s% R) \1 H1 L
- ;初始化MMC3
, a" b* d! v0 d/ l [7 f - JSR Init_MMC39 P/ U0 a& a* {4 x$ y
-
. Z9 E P2 ] w2 v; O, B- | - ;==============================
9 E: h, H' U% K6 t( s+ \ - ;RAM初始化* e1 z. k5 I& b0 K# w# R1 T* S
- Nes_Ram_Init% x. }3 q5 l. `) b" m; m) }
- LDY #$00
7 P) J: U# o6 m0 P, K - LDX #$08, t6 W) @# C/ l' C
- LDA #$00
1 ^9 @* T" A) d3 ]( J. O - STA <$00
( Z0 m; [! J4 y( h+ Z4 l0 ~. X1 R+ G - STA <$01
3 o4 j; O j& u$ s$ p - Nes_Ram_Init_Write
{0 J0 D& o" n! D8 m: }$ C - STA [$00],Y4 w1 I: v% o& C0 y
- INY
9 Z8 [; X+ F/ S! d7 r - BNE Nes_Ram_Init_Write
! n0 u5 S U4 A- P/ w/ M - INC <$01" d( D3 Z% A! N) v: X @
- DEX! E) Y g0 i: ?6 z1 ]
- BNE Nes_Ram_Init_Write- v$ c2 p" @/ i& B/ Z
-
: e" o$ a8 z5 B - ;初始化命名表% E" @5 j7 K7 C+ F! U4 i
- JSR Init_Name_Table
8 f- L# a9 f; K, T1 ^ - 6 T9 N( F" ~2 b q
- ;初始化调色板
' M$ T* F; d3 p- R" {% q! V- B! { - JSR Init_Palette
& u0 ~: c2 s# A/ R% H a8 x -
$ {- S2 e- i0 `# \ - ;初始化命名表属性* t" H' p- }/ {5 ?: R% c+ t
- JSR Init_NameTable_Attributes0 [. A5 I. X+ \ n8 \ n6 P
- 0 A0 |2 G9 c% t
- ;初始化精灵内存
$ b X: I; b0 \7 J" W) z - JSR Init_OAM_Ram
- g% p9 J2 d- {0 F( b" x9 I - 3 z+ u% f8 W+ d
- ;在屏幕上写点东西
7 _$ E2 q# _; E9 K# s - JSR Init_Name_Table_Text9 f6 E( u% g6 [% U0 B
- 1 _, _% I4 P. D3 L, m
- JSR Time_For_Vblank
# `) m3 t& x& A+ y( `! } - ;开启PPU控制
. A3 t% j! M; _4 W" U8 B) [: F - LDA #$80% `% t" C7 C* ~+ T8 w
- STA PPU_Ctrl_Buf0 R; o( D: [5 D- t' b: P
- STA PPU_CTRL) n( M2 ~3 l9 q; v' _
-
/ y/ b) J$ W2 t6 a, T3 Q0 w - ;开启PPU显示- e# h5 ^: k+ q2 O/ M5 X
- LDA #$1E9 n+ F+ H, q' X9 E# U
- STA PPU_Msak_Buf
4 O0 b% f; I- o7 U1 T1 @+ ]7 z - # o( f3 `, A7 l* X; u h
- LDA #777 \: e+ R" Y; P. a5 r$ J
- STA Sprite_0_Y
8 @6 {0 G0 G$ u$ z/ x2 z8 H - LDA #$1E
t. F5 [2 _2 A - STA Sprite_0_Tile
+ w* k# q8 W0 ~7 [, p5 ^5 u - LDA #$20: ~0 S0 Z8 V7 r! m J* R
- STA Sprite_0_Mode3 o7 |" r5 _0 a2 |! H& ?
- LDA #$001 |. D; U% @0 W7 C) [! ^9 D
- STA Sprite_0_X! i- h' L+ H+ X% y) i. p$ x
-
+ T4 `2 I! O1 D4 [; g - CLI6 E; D W0 \0 S% [0 v* m7 c! e
- JMP Loop$ ]% H. {. d, V# a% Q) Q7 G# E8 l
- . s1 W, r& O; \( W8 t8 }4 R0 P
- ;==============================
1 `- Y1 l# c& k' X, J! {( C - ;死循环, 等待NMI中断1 I- I' V) d2 |' z$ B' a7 k$ E
- Loop6 p8 q! ^9 T* I1 q1 e
- JMP Loop6 X* F, ^, K' n
- - i+ W% V! Z$ F
- ;==================================================
2 K) C3 \7 L- F8 n - ;NMI中断处理
# M. S: b# Z* ]+ Y" E# L! Y - NmiProgram
3 b) U3 ]! {' o. A6 e - PHA( N& `) H: e, g' b0 g
- TXA4 b) h% ?. u. L$ w( q
- PHA8 U3 Q; H5 n0 E: ?- }3 M% X
- TYA
3 j5 F* g, c4 `5 s. X! k* K' N' P! z - PHA6 T* r3 W, w! g9 G% [' N9 o( S1 `
- 8 X# N3 L# m8 m$ C. x. N7 T) `
- BIT PPU_STATUS: ~: Z x& F& R3 D$ ?6 s3 M
- 0 B4 g3 z% y4 W1 q* _1 D9 v- a
- ;关闭PPU控制
# A1 H6 |9 j: g. s- n8 A - LDA #$001 ^/ ^9 @! ?3 Q0 H4 e5 K
- STA PPU_CTRL3 o j# }# q" ^. W
- , l ?' p8 N N
- ;处理PPU! |5 P( o- D/ y! G
- JSR PPU_Process
3 r: A C0 G2 ^! O, i' k" @7 f - ; h5 O. F4 ~8 T) y" S7 C
- LDA #$00+ l K0 I( {" j1 r& r0 y8 o) X
- STA PPU_OAM_ADDR
& `9 w% @& Z# ~ P - LDA <Sprite_0_Y+ V7 s# E( _# i7 V" L c
- STA PPU_OAM_DATA
4 i. ~2 ^" \' D# U9 V' m# W, g - LDA <Sprite_0_Tile7 X4 X# X4 Y/ n2 M0 s
- STA PPU_OAM_DATA$ m6 s$ s* m9 F, s6 P: o- K& @
- LDA <Sprite_0_Mode
4 w- G1 [* Z% s+ C9 |0 L! {6 S - STA PPU_OAM_DATA
) o. q v0 B( Z0 }: a6 |& v - LDA <Sprite_0_X7 w2 V0 J N# L& I# q
- STA PPU_OAM_DATA
0 X4 H# Q" J- o - $ X8 y) V2 b3 h% d6 y" S8 ^
- ;开启PPU控制; A2 j6 x& J' ]0 [9 O
- LDA PPU_Ctrl_Buf
- \' g" @ b# |5 M& S6 a - STA PPU_CTRL
% V1 ?, K9 e- z) D9 A -
) K; M9 @4 O/ z/ M' n - ;屏幕滚动
; r/ }) X( q' q2 M# t+ j% T - LDA <PPU_Scroll_H
* h+ ~+ `5 P% f( ] - STA PPU_SCROLL: }: l6 n" O! C) s5 {( {6 B
- LDA #$00
5 l) g$ A1 _1 N2 f - STA PPU_SCROLL
Q# u$ {+ T+ v: a3 a+ S0 ?6 \% e - * B$ j/ z K5 ?
- ;手柄处理
3 [8 i2 u6 G. W# c- F - JSR GamepadProcess3 q4 I, a, o0 |- @
- : ? u5 W( D3 p# `+ S
- INC <PPU_Scroll_H) b, A9 `1 {0 w: D3 [4 g2 {8 O
- * { s3 P) z0 A: y3 d- i
- ;启动0号精灵碰撞检测
& f" \! B" D2 ], V - LDA #$01
% u! c' N: }1 B9 ?6 x1 d - STA Sprite_0_Hit_Move_Direction
9 Y/ X& b% Z2 \9 ]& x - JSR Sprite_Hit_Test) p$ R V+ p1 o
-
% l4 e1 H) G P c - PLA; g; u: M; ]' s, [! g
- TAY5 p5 F. t( n8 D0 s* F0 g; w
- PLA
. V* {6 D9 j+ n4 E- ^ - TAX
4 E" v; L* Y% ~& r5 T# K - PLA) Q7 z, B; p4 k
- RTI
/ Z& ^% O1 M% N/ Q, Q F+ m* A - 4 C2 g( a% f+ L. G* e) o
- ;==============================1 _7 a, G! O) d/ b
- ;0号精灵碰撞测试
% a, a0 U, J% G4 g* [$ G - Sprite_Hit_Test- S5 z/ c4 ~6 v2 ?% K
- ! b4 u z0 A( |8 x% j8 h
- ;------------------------------
/ S/ `+ v7 X3 W$ m3 v - ;等待0号精灵碰撞状态取消
3 {" p0 i% C, S! F5 r; b - LDA PPU_STATUS
2 H7 L# [) Q8 S9 f* P - ASL A2 ~! v3 t( h4 s/ E% ?+ l
- BMI * - 4
- T1 W# p, t- G- n! X -
' w. k: w; R9 l w - ;------------------------------
; y( }% |9 r8 G4 h* Y* K' S8 S* m - ;等待0号精灵碰撞发生
* ~; [+ S* A7 N4 G% N4 x - LDA PPU_STATUS
- R3 A# n, @& L O& S3 K6 w - ASl A9 Q+ q G- V' W
- BPL * - 4& p6 Q; C9 i ]$ |- S: ]1 M4 V
# |( W" w- [5 I3 G( V5 Q- ;------------------------------- B8 [) I; E6 v$ h* X
- ;行消隐等待& ~8 x2 E) l6 _. S: ]
- Sprite_Hit_Scroll_Wait
1 d# p8 u# G1 x) J' s - LDX #$28
9 F5 t1 Z. y& z. ~5 X' l - DEX: J( f! h+ M9 \6 _6 G$ F* g7 h3 _/ _3 S
- BNE * - 1! q4 e0 _2 b- X
-
( N8 O6 F0 n4 ~# }; E - LDA Sprite_0_Hit_Move_Direction a2 m9 Z9 d% i2 O& | D
- AND #$01
4 h7 [ ]# e4 Y3 B - BNE Sprite_Hit_Scroll_Set_Right: f# N2 x, T ~: g$ N6 m+ ^' r# I
- 2 l. c, ]- g9 I& h' L2 n( |; s0 U
- ;------------------------------! i: c( X# S4 E
- ;分割画面向左滚动
5 F# z7 O" c5 |! ?8 i( P( a - Sprite_Hit_Scroll_Set_Left
! {- o- |: p, {8 T y - LDA PPU_STATUS
' A( y& ^7 T/ a" D* ~3 K+ x - LDA <PPU_Scroll_H
9 ]0 O1 A F# n: r - STA PPU_SCROLL
1 O$ ]! k0 G% H# X/ y6 ] - LDA #$001 O, O7 p1 F& c' g9 Q- T. O6 q0 O8 Z
- STA PPU_SCROLL6 R; ]! `. e6 |% x7 K
- RTS8 D; v% Y( p# E
- 4 t: V) m$ A' M
- ;------------------------------: [0 q! _3 V$ h7 y( h8 |% T# @
- ;分割画面向右滚动
7 D3 }1 e0 z$ g - Sprite_Hit_Scroll_Set_Right/ r2 L6 e# e" I7 T
- LDA PPU_STATUS+ |2 m1 H; u) k
- LDA #$00
* c2 p2 R+ M" E4 L; [- \7 U$ H6 n - SEC' J/ D0 ^1 g8 n$ A
- SBC <PPU_Scroll_H
& O6 B* C# s1 f4 F2 B+ f6 a - STA PPU_SCROLL) n. w* {7 D% F
- LDA #$00
$ a0 [" r6 i( A. _# \ - STA PPU_SCROLL
~8 I" d5 [: p7 m& n, s - RTS$ U7 o$ I$ P' q: `7 h
- 9 M$ |: q7 j. t0 O1 @
- ;==================================================$ f) q& o0 }9 u9 j: ^
- ;IRQ中断处理
1 F( R/ Q$ d6 x- F7 |; Z1 b - IrqProgram
- h! \% ?" R7 R0 |7 B9 Y - PHA# A& d4 Q% O: g
- TXA
3 A F8 P$ }; b) k. k4 q/ @* \ - PHA
6 k7 v" Q6 g( h+ G6 p+ v - TYA2 u- o% f! [* R9 F
- PHA
: c( M! Q; d0 \ - 8 G/ j# k w$ Z
- ;关闭IRQ
4 D- M& Q9 h9 u& b9 w# ?5 `- S - STA MMC3_IRQ_DISABLE
% n: W- ^ @7 k8 v3 K$ Q2 \" v -
4 [$ M/ k8 o9 u+ i8 H; n& Z - ;允许下个IRQ触发
8 n) N& x) g$ @) [* N5 C - STA MMC3_IRQ_ENABLE0 X6 Q; d# [# y- o; P4 o3 h
-
7 m. ~9 O( f$ `; q - ;IRQ处理, 15线后继续触发
' ~, R0 [3 f' b - LDA #15
6 r6 l) n; Z" j. C - STA MMC3_IRQ_LATCH4 I! R0 Y/ j4 F/ \* j; { `4 \8 I: P
- N! P$ @0 @# G* @6 ^6 D
- LDA <IRQ_Index
! [( l/ _: c! Y3 q4 b# p" U1 c$ v - BNE * + 4
$ v/ W. B8 e5 e8 N4 ]' N - INC <PPU_Scroll_H
/ ?: N4 h& v# O% E+ [ -
) L; S( W1 S! r1 Z8 W - ;设置屏幕滚动5 c5 }5 C* {$ b
- LDA <IRQ_Index3 e! u+ g2 D9 l# ~- ]
- AND #$01
8 c/ V7 H6 T; r+ @. E4 i) y$ ` - BEQ Irq_Scroll_Right
2 [( _# J4 x. c1 h. C - * e) x6 F* Y \. ?7 ~
- Irq_Scroll_Left
4 v r$ d/ H g4 M3 `5 j& R* ~ - BIT PPU_STATUS
; m$ P, s/ t" h4 [* G) s - LDA <PPU_Scroll_H
: Q6 k U* d/ J- l) R$ X - STA PPU_SCROLL
+ g! ^8 ^' ?5 o1 _3 q - STA PPU_SCROLL
) b( G7 d& D- S( H, T; k - JMP Irq_Scroll_Over
/ P9 u6 ^, f) S -
+ x4 }* h! g# B$ P' H7 A2 _ - Irq_Scroll_Right
6 u9 d; M+ E9 z* U( y m - SEC+ Y) e* ~+ z: ]' z8 [& E: \+ B
- SBC <PPU_Scroll_H7 v8 L+ A9 b! ^) m( O* v" {
- STA PPU_SCROLL: |" j. n% `7 _' V2 I4 F5 N7 r
- STA PPU_SCROLL
5 ^/ x. m s& R# x' O% f - Irq_Scroll_Over5 S* B* a9 s6 N/ D
- , v" Y+ c! [8 Q% S
- INC <IRQ_Index
" L' o! p/ X8 H/ x1 x$ g+ T -
+ \, z" M, D2 ]- l: v - LDA <IRQ_Index2 t& e1 K8 H7 v b P4 v) y' N
- CMP #14
8 m+ ^' }# A+ ~* \ - BCC * + 5
8 ~5 F# T# M- ]- w% C - ;关闭IRQ
( ]7 H* u# e+ X) _ - STA MMC3_IRQ_DISABLE
4 a O. \8 y1 T1 N -
# H( v- e$ w# Z' f - IrqProgramEnd
5 D" y% f0 a9 u9 ] w/ N - PLA2 X# d0 N# f0 Y# f7 I- g$ P6 {
- TAY O7 P' c$ s/ [, x8 g) A3 V6 l
- PLA
8 J* l( r! r: _8 G! n" l* } - TAX0 f8 Q7 [7 a' X4 U1 R
- PLA, ~) g2 }7 y ?3 m0 F0 v7 F
- RTI) g0 N# H) O6 B' n: s
- * x, }* z$ F6 L/ M4 P; x4 `; {/ `2 }* a
- ;==================================================
6 {' ~3 K( U4 ^$ k) J - ;中断表
! y% Q+ C, O& t0 O Q5 S$ k - .ORG $FFFA; w; Q0 F2 a6 M+ r4 w1 m
- .WORD NmiProgram
4 t% x" E, i, K. O, b - .WORD ResetProgram( ?" w) S" f7 `
- .WORD IrqProgram
复制代码
3 {$ l5 _8 b7 @) n1 ]; n |
评分
-
1
查看全部评分
-
|