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