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