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