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