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