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