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