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