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