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