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