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