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