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