|
|
- ;[FC][MMC3 精灵碰撞]
. n2 F2 s0 {) B5 ]" S( u6 h - ;FlameCyclone 20230710
' n) e, p, x: a5 w - ( g9 |/ |7 V. \; K
- ;文件头: O, {) M5 K9 T
- ;====================================================================== w# @: E) V" {7 Z, m/ u* |5 x
- .INESPRG 4 ;16KB PRG 数量
" Y6 r* K- e7 } p/ ?$ j2 U - .INESCHR 1 ;8KB CHR 数量* E Q2 N7 ~* z% }
- .INESMAP 4 ;mapper 4
( e% T# a" h+ |, d8 K - .INESMIR 1 ;命名表镜像 0水平 1垂直$ l1 |3 X8 q/ _) D
* K2 O; f' e- k0 w. T/ a. D# h- ;必要条件) d& G2 ` e4 M9 Z
- ;1.持有CHR ROM/ @+ }/ x8 b& z L; y
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
: Y7 m! w u. {3 ~) n - ;3.精灵内存(OAM)不为空$ Q" \* d8 r) F6 A! C
- " e9 I( Z7 G7 `- ?! j6 I! q& Q C2 i
- ;==================================================
) K7 A$ j, d. `1 p- Q2 @. q# Z) X - ;NES端口常量
" n8 F% \+ F% y: T" e - PPU_CTRL = $2000 ;PPU控制寄存器
& Y' [( n5 F# `# E2 F - PPU_MASK = $2001 ;PPU掩码寄存器! s3 ^0 h* j& {5 o: L
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位3 Z1 j, d2 V3 J- W. ~, r4 G$ k, K
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1* L% w9 I7 W! N
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1) }4 K9 l5 v- b; G: L% u
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 # g. D) |* S7 x v: }$ _- x) Z& D7 A
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加- B' S% H, ^" `/ U1 i
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
7 u; p. n5 ?5 y7 ~ - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存* u9 l2 o3 H, v/ n
- APU_STATUS = $4015 ;声音通道切换
3 Q* a' I) A* r, Q+ x4 m - JOY1_FRAME = $4016 ;手柄1 + 选通2 f9 q; ]' C- B8 `( v, `$ c
- JOY2_FRAME = $4017 ;手柄2 + 选通
3 ?) y, ?2 W- V$ l+ E# ~% c) ^ - 4 k0 |( `0 Z1 b _1 z; |
- ;==================================================* E" K+ X# g5 f! C& [
- ;MMC3端口常量
( Q' L( f6 c# L4 M# D: } j( t- W" P - MMC3_BANK_CTRL = $8000( J+ ^$ i4 Q( ?' A: K" L% p$ a
- MMC3_BANK_DATA = $8001 N5 i+ j* N* r+ W1 ~ h& B1 |1 L
- MMC3_MIRRORING = $A000
. W% i- U& C9 K" R( O s0 Q - MMC3_PRG_RAM_PROTECT = $A001
6 |% l( e+ a: F, X- Q2 Q" T9 T* c V - MMC3_IRQ_LATCH = $C000
2 C( b6 u0 F' ^0 i0 ^ - MMC3_IRQ_RELOAD = $C001
8 k% E) j1 D# i: r3 G1 V - MMC3_IRQ_DISABLE = $E000, S% H6 k O1 {' b& r) C% x
- MMC3_IRQ_ENABLE = $E001
3 ^ l2 i- e6 Z) g - # n( N$ {# B* b% p
- ;==================================================
& }* ~; q* }+ h5 ~7 V( ^' A9 d0 H - ;程序块配置+ y; J) Q; P) F3 R
- BANK_DATA_MASK = $07& E y8 M9 f+ E& ]8 v O3 k
- ;--------------------------------------------------# `! O( H9 o# r2 Z9 y e$ I
- RESET_BANK = $07
4 V* o9 t3 j3 q - RESET_ADDR = $FC003 v. Q/ @, H& z& a
( e1 a P5 Y) u6 }! {- ;==================================================
' m: @8 n. t0 w* N1 | - ;图像块配置) a' @& S1 S6 _; c- z; D+ W
- CHR_DATA_BANK = $08
! y" D) ]& l1 T - 1 a* G8 Q- h& Z* }
- ;==================================================5 q- h5 d7 d" l' n/ n, X
- ;零页内存地址配置
! [! b9 y- D# u4 O- z/ ] - Use_Ram_Addr = $807 ~3 y3 A0 y( g
- PPU_Ctrl_Buf = Use_Ram_Addr2 y1 L: M8 _; m8 {3 _6 b d9 F
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01
: G5 Y# P* y: V - PPU_Scroll_H = PPU_Msak_Buf + $01' K Q/ [0 l- q a. ]2 ?0 N
- PPU_Scroll_V = PPU_Scroll_H + $01
+ ]% ]$ U' W- {* p% m - FC_Data_L = PPU_Scroll_V + $017 s& Q. T$ X* d. q* S4 y# h
- FC_Data_H = FC_Data_L + $01
6 h* F) G4 F- [0 u - FC_Data_Buf = FC_Data_H + $016 j% }4 z6 f w2 R
- ;==================================================& @% D2 @6 k u4 G7 ~ @
- ( a' H- n8 G9 m2 A8 c8 G/ L6 t
- GAMEPAD_MERGE_FLAG = $04: D3 {! h( H( `9 ` L
- / M) f, X" I3 u
- Gamepad_Keep = FC_Data_Buf + 18 L4 N6 G, O9 @' o1 E
- Gamepad_Once = Gamepad_Keep + 2: m6 o/ N% v) S7 [
- Gamepad_Temp = Gamepad_Once + 2; ]6 C8 b& S; y) Q+ p
-
4 e6 ?* j; N" M; Y. J - Gamepad_0_State = Gamepad_Temp + 2
2 n: x3 V, b4 }, U% w% o' F - Gamepad_1_State = Gamepad_0_State + 1
" [5 w4 S; A7 E( \" W, J) F, ?) z - Gamepad_0_Value = Gamepad_1_State + 1
) x* o' H$ o# \4 V. ?9 T - Gamepad_1_Value = Gamepad_0_Value + 1
8 n- Y/ d( t: y - Gamepad_Port_Value = Gamepad_1_Value + 1* x' x$ i# Y) ]# t/ u9 d
- Gamepad_Merge = Gamepad_Port_Value + 1
. S7 o: ~: R8 L: I. d+ y
) c1 Z. I, K9 t8 {/ m# @. ~- ;==================================================& b8 ^* M6 b) \% d
- IRQ_Index = Gamepad_Merge + $01
6 o! y" b/ _. @( E - Sprite_0_Y = IRQ_Index + $01
: h1 }3 Z$ |* r1 } - Sprite_0_Tile = Sprite_0_Y + $017 F% _2 H3 z/ D; U2 h
- Sprite_0_Mode = Sprite_0_Tile + $01) Y1 U/ }; a ]* q. j. Y& s, V' L; C
- Sprite_0_X = Sprite_0_Mode + $01
; S( W* c4 G0 S8 n. k - Sprite_0_Hit_Move_Direction = Sprite_0_X + $01; ^4 x; Q0 j# r' ]/ t+ R
- ;==================================================
* _* i/ I& @8 M( D/ i - ; y+ D q, p N& H3 f
- ;CHR图形数据
7 X/ C6 \4 L' ?6 b t - ;==================================================1 }( B& K" T% @5 G" p
- .BANK CHR_DATA_BANK
& Y. `6 b- n% K - .INCBIN "chr_bank/chr_data.chr"
6 c$ J- e1 J* h; ^ -
! w' I% W1 q+ `: A - .BANK RESET_BANK & BANK_DATA_MASK& \ K. p* G# J0 }3 B0 t. T3 P1 f- v
- .ORG RESET_ADDR2 r/ n, F3 x% J" T# ?
- 3 `$ H6 V7 U* l% A
- ;--------------------------------------------------! d" d4 [/ M' _" E. U" z- x3 c8 X" ^- g
- Attributes_Data
+ G; w/ y- @5 L* {- x! y0 s - ;命名表属性
6 ^ }5 g: P7 e A4 ^ ^ - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00/ v }2 O3 s4 b" I
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA9 }0 {9 f5 q8 P; w' Z' m6 O. k
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA0 b- }; W" L% c/ S! b9 ]
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$556 P! b% a# c+ g1 Y
- ;--------------------------------------------------7 x7 g _4 F: q9 L4 m
- ;调色板数据
5 m% H" Q$ ?! Y5 i - Palette_Data
) |' U. {& S9 M' ? - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
! V3 }" }# h$ ^6 }: p& y* U - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
7 ]8 f: x( L7 _1 y, T5 N2 s
: {( u2 R! p5 K. x( n- ;==================================================
# A- r8 H9 b8 o5 J; a% h' O - ;命名表初始化
2 `' p/ n& b4 }8 P - Init_Name_Table
8 e. {0 Z6 N: n2 V3 N/ A5 o& P/ W - LDA #$20
/ P5 v; }8 J7 Q `4 |4 ~6 X0 l - STA PPU_ADDRESS# E; \% p9 h. C6 F: P2 R
- LDA #$00- m* r' T$ s! ^( u& J1 z
- STA PPU_ADDRESS$ N1 f: C S# N- @, Q
- LDA #$00
. f* V6 C9 i( t+ C( x2 w* o0 l - LDY #$00
6 x9 O0 B3 S% T6 r+ ~' M - LDX #$10# m* ~. @: I3 G7 g% p
- Init_Name_Table_Write' F2 `$ D& p6 q. Q- d9 F+ k+ l
- STA PPU_DATA
1 E: t5 d8 j! N+ d+ ?+ J v& J$ K - INY
) D8 v+ W6 D% D& E) }* L( O - BNE Init_Name_Table_Write
, \/ |4 A9 x {4 K- L! ~ - DEX
" o) a( i9 a! m% t( n5 y0 F5 P - BNE Init_Name_Table_Write0 H0 V" Y( l( g* o
- RTS
: \* A. a: n4 O1 ?! L: B -
. R8 @8 n3 q" [& O- K6 ^- u - ;==================================================
/ T2 Z$ k4 ? x2 l, E - ;调色板初始化# o4 t7 t: w0 l8 y$ ]
- Init_Palette- ~4 f4 E' E) R9 |
- BIT PPU_STATUS; O0 ?& U; I+ y/ q3 T5 G* _7 M
- LDA #$3F- B# e9 D; W0 L& w: t6 I: b
- STA PPU_ADDRESS8 t" \5 E- Y3 ?( _% @6 b3 s
- LDA #$00
& Q0 m/ ] |: y- z2 k; o - STA PPU_ADDRESS2 P% P2 t# I: v5 [* Q
- LDX #$00
" j0 @: Y! X/ F - Init_Palette_Write
& |7 F; ? L6 M9 P - LDA Palette_Data,X5 M& R+ m# }# ^9 F; B
- STA PPU_DATA& n9 Y; ^$ C8 p8 o
- INX
2 q# T9 v6 ^9 q% F - CPX #$20
8 u5 k2 \: d2 S# ^ - BCC Init_Palette_Write9 \* A$ F3 g' D; Q( s( u! s' j0 w! }
- RTS7 a7 e6 M0 ?/ ?1 X! G: O* F
-
2 ]$ Q- m+ I) _. `3 K# ` - ;================================================== Y0 p b! N/ B
- ;设置命名表属性, C5 \6 m$ I: w( K* v) c: y
- Init_NameTable_Attributes
+ ^' C8 s& u+ C x - BIT PPU_STATUS
8 @- k1 J$ L% K6 u5 x - LDA #$235 Y$ { a$ H# I( k+ }$ E7 c7 P
- STA PPU_ADDRESS
' N8 N' `3 I7 _& W! w" S7 _ - LDA #$C0
' l3 _: g! g! z9 ~ - STA PPU_ADDRESS: P7 t$ z( } o
- LDX #$00
: b3 K; G: Y5 }! c. W* n, [& B - Init_NameTable_Attributes_Write$ Q0 l6 J" P# n; Q
- LDA Attributes_Data,X5 F; m. K: J9 W6 I
- STA PPU_DATA
1 S! U4 E* U; `* y - INX
) D6 x. G0 ^* _ j3 K0 R; u' t" }: { - CPX #$40
0 r* H9 F) m+ A& T, y- K - BCC Init_NameTable_Attributes_Write2 Y8 F0 o5 p9 v) E2 w) Q9 `
- RTS
D, s& G% I/ R$ k% v6 q; }4 F
$ m+ t1 L5 Z5 O+ d1 [. A- ;==================================================% I/ J. b6 C# m! ~8 ?
- ;初始化命名表文本
% r; L8 K) V3 k& i* N - Init_Name_Table_Text
I+ \7 J2 W1 e4 p. n$ ]; T* X - BIT PPU_STATUS
) s7 E( b8 V- ?( p - LDA #$203 \ f8 a- j( \" u* @$ h
- STA PPU_ADDRESS
+ K4 m: R3 z0 y0 L; a5 b - LDA #$00
8 g- s/ B2 z1 ] - STA PPU_ADDRESS
/ s$ q6 ~3 L8 Q0 i. \. j5 V# l% k; H - LDA #$00/ K5 u- V: d4 i! h3 y% E
- STA FC_Data_Buf1 A( @- L( v+ i) ?7 c$ Z
- LDY #30
8 ^7 w$ D! p/ M6 ?& {) g6 \ - Init_Name_Table_Text_Write6 @+ M3 n# I$ T) f5 K
- LDX #32. t; S! Z& ~' j* V7 w
- Init_Name_Table_Text_Write_Char
# Z2 [5 a2 j9 b: @( o - LDA #'0'0 K' j7 I$ a p' J- o
- CLC
% o; t( }, p! j( m; q) q1 L& W - ADC FC_Data_Buf! Y6 y7 H$ e- e3 V/ K
- STA PPU_DATA, j% t% Z& U. @. k& u* u/ T
- DEX
; [; R: @0 l7 Z0 M0 e% C - LDA #$14
( b3 A! ~" w$ g- L- U/ N - STA PPU_DATA% a/ J; |0 O N, k) H
- DEX
4 c1 a$ @; M4 ?2 B* L7 j1 _) _7 Q% M - BNE Init_Name_Table_Text_Write_Char0 w+ {& r/ ?/ p3 L
- INC FC_Data_Buf
. [+ B) Q# d9 y& C' o" f/ U - DEY
5 @& U: I7 Y% t7 d - BNE Init_Name_Table_Text_Write' J# j' C! } ~% P9 q7 H
- RTS
( T O) N6 T) E, f( v5 R# v* ]2 [8 n
& z3 W5 x- A, i7 k) r- ;==============================
& t8 v: ?0 M* v - Init_OAM_Ram;初始化精灵内存
; j! P# q2 W; Q. k7 [6 M7 K - LDX #$00 ^! U8 b5 C k. Q7 J5 V$ V* b! w8 q' B
- LDA #$00
: v+ F6 r ^4 ~) p5 W( a9 V( @ - STA PPU_OAM_ADDR
1 \+ S5 R* G, z1 f- G2 k - LDA #$F8
& c/ a, [( Q+ G) `6 `, ?( d - Init_OAM_Ram_Write. b( {. D1 Z$ g2 X* ^5 W( w
- STA PPU_OAM_DATA* R- _$ Y" B7 Z0 A" _& G/ {4 v( v
- INX
) W! n( E( b# z2 q- ] - BNE Init_OAM_Ram_Write3 ^% G- U: ~* |4 }
- RTS, p, t8 V/ l4 k
-
1 ?* L0 L+ z, G3 k# r+ I8 B' Z - GamepadProcess;手柄处理
8 E2 @" v2 x; p- L7 z4 | - JSR GamepadDatacan
# Z$ g$ E* p9 l" L! A - LDA <Gamepad_0_Value
4 ~$ N) j4 {5 u3 z - STA <Gamepad_0_State( q y7 }$ l3 |( @! k, R$ M$ E
- LDA <Gamepad_1_Value) ~" A- T: F3 ^' ?& g
- STA <Gamepad_1_State
8 z* r [, B2 C1 ~ D4 _% ] - JSR GamepadDatacan
+ [/ k- o* R7 E8 M4 i- H3 ` - LDX #$01
5 t1 |/ d3 h6 v6 O8 b( b$ ` - GamepadMergeCheck;合并手柄输入检查. i7 y" M4 G ?7 c+ E7 n: [5 v k
- LDA <Gamepad_0_Value,X
- f' o# D1 s4 T1 e - CMP <Gamepad_0_State,X
$ Y' {6 F' U# Z6 j4 A+ C e6 s7 P - BEQ GamepadMergeInput
* J3 f& ]6 n9 c( | - LDA <Gamepad_Temp,X
7 l' u, D6 }" Q) P0 v- J4 W1 D, J - STA <Gamepad_0_Value,X
3 N7 F/ U9 Z" b- ~& k, f - GamepadMergeInput;合并手柄输入
9 |/ j6 R: \+ O0 p( m4 d8 { - DEX1 [- t2 X3 S: Y( r2 F: X/ v$ r
- BPL GamepadMergeCheck
$ F% |/ F* W2 D6 Y - LDA <Gamepad_Merge+ o5 C0 K0 p4 z( C6 {
- AND #GAMEPAD_MERGE_FLAG) Q2 G! k" @) P0 w: o
- BNE GamepadStateProcess2 M- u2 e0 D, z
- LDA <Gamepad_0_Value
# W2 w8 Z! k+ e* t/ J* l5 [ - ORA <Gamepad_1_Value2 O( ^' k1 r+ z& _$ @' u" N) `
- STA <Gamepad_0_Value
9 H8 n% C v; }0 Z; O' Q - GamepadStateProcess;手柄状态处理
- a6 p8 m- \/ G8 J - LDX #$01
1 k+ B1 z/ m! A% c5 V4 I# h - GamepadStateSave;手柄状态保存5 o8 e3 q& [4 Q3 I- r" J2 X
- LDA <Gamepad_0_Value,X, ^! l) I3 h: J
- TAY
. W3 ?" g! A6 Q0 e) I7 d - EOR <Gamepad_Temp,X% { u+ t& }! T9 X% n5 z
- AND <Gamepad_0_Value,X
1 S0 P$ u" L5 \' V, h - STA <Gamepad_Once,X9 h" _; X# E) a
- STY <Gamepad_Keep,X
( k5 f$ T, Z" |/ y0 ^ - STY <Gamepad_Temp,X
% h" s+ w. X# f, f2 q: Y5 s - DEX
+ E4 K7 |2 q+ k. B& b - BPL GamepadStateSave! [9 q" C0 @( F6 d; z1 w+ W
- RTS9 l! S8 U# N$ p: T/ X
- # b2 [' |9 J- U
- GamepadDatacan;手柄数据扫描
5 s, S+ ~4 L4 k - LDX #$01! D9 O: a% D% m: {- _, C- n( b# s/ T
- STX $4016; l8 d3 R0 Z* v/ P9 k+ M5 f0 ~
- DEX" D! ]% ~1 s+ S' d
- STX $40164 @/ [/ N9 T4 P: W9 r2 y6 D, \
- LDY #$08
, n9 @6 }9 N8 d - GamepadPortScan;手柄端口扫描6 M" n! D# J. K" [4 L
- LDA $4016
3 y+ H/ U9 r: e3 ?5 [1 {. E3 U - STA <Gamepad_Port_Value
' {/ A0 d) C* l5 k - LSR A" b+ S4 M W* o0 M/ R
- ORA <Gamepad_Port_Value
" \; h4 n9 h7 U \ - LSR A! h0 d/ m7 V5 n6 `- ^9 m b% C
- ROL <Gamepad_0_Value
; ~ M0 i% e8 V, | - LDA $4017
5 d+ D* _% _" `3 L/ j) F- c - STA <Gamepad_Port_Value) b4 ^+ ]. J: J3 U& p. v' j
- LSR A
& Z3 K1 m+ ?6 W* q" h" X - ORA <Gamepad_Port_Value5 Q' z* |9 [" e6 n) V' S, e* f% Z/ a
- LSR A7 e, ^/ t; Q2 }; i2 `
- ROL <Gamepad_1_Value
" x) r5 ~2 L. ~% r2 i% X, G - DEY
9 L+ j7 S4 s0 S$ X$ y - BNE GamepadPortScan
1 i+ y4 ~2 {; I2 f0 m3 {4 W" Q - RTS; S& F! z u! ]. V
- 0 [, C: m/ E1 V1 P. x5 e
- ;==================================================
: H: Z0 m- F1 }6 w6 Z3 W7 P. D - ;PPU处理
* q& ?+ Y9 ~' _, X! S - PPU_Process
5 s9 o" r/ w8 p6 s# |! D& n+ {: Q - LDA #$00% I1 W( i4 t+ g/ A. G t. z
- STA PPU_MASK4 A5 p) n. q0 z( T, x# ^3 w9 Z
- + B( n# I2 W& U! K$ L
- BIT PPU_STATUS
8 w. w% y- A( k4 \ G+ e5 O - LDA #$20# C; ~0 A+ B" n& x' D9 @
- STA PPU_ADDRESS5 G. F4 J0 c' a) E& Z8 u' o _
- LDA #$00
5 v4 W6 g b8 ?( r - STA PPU_ADDRESS/ S" \2 W/ Y8 z" w8 p4 c& X
- & d7 b" [. n7 O% K
- STA PPU_SCROLL* \/ U: p- [$ ~- X" L
- STA PPU_SCROLL" A" v: \2 _% X* Q
- 6 J. Q4 U7 W) c; d; r
- LDA PPU_Msak_Buf6 f) z$ ^2 U/ F$ C+ t o/ N+ k
- STA PPU_MASK8 O/ ?6 |" p' K
: `5 W1 n, e9 K7 R. v* H- RTS
8 C, Z& K/ Y! ~2 a8 T: C7 O+ G( N& u9 ^ - & ? q6 y0 ?* N1 ^
- ;==============================; j3 x e0 j! k% G' s5 M
- Time_For_Vblank;延时等待" W! d% |" h: @0 G7 s7 }8 G$ l
- LDA PPU_STATUS: J; v( X5 G# T# e5 i
- BPL Time_For_Vblank
$ ~# \1 T: N8 h" G& L. V - RTS
! P# F5 v8 l, M% E1 e1 |5 d5 R+ h9 a - S, E7 u/ J0 C4 e# f: _& {
- ;==================================================
5 R$ j/ u* i4 U3 J h: v - ;初始化MMC3
+ S9 _ }- S$ Y0 A y/ k - Init_MMC38 l: p6 \9 W7 y& y; a0 J1 y
- STA MMC3_IRQ_DISABLE- u! Y' o" N; z2 J* t& h# F
- 6 y$ x# F# k2 O/ i
- ;设置MMC3水平镜像3 O# l5 X: {1 A% M
- LDA #$01
. V0 R! T+ r5 y - STA MMC3_MIRRORING8 _, o+ O3 C* i9 B$ |6 V
- 7 ]8 v! \' d! h8 Q9 M) X
- LDX #$05& o7 j2 z4 H# q: ~% O2 s& C4 h
- Init_MMC3_Chr_Bank_Write7 K. T+ i. c5 j: Z8 ]" d
- STX MMC3_BANK_CTRL
% X# g. ]9 N' O) s! P( l - LDA MMC3_Chr_Bank_Data,X
) K) T% g' [" P7 K' \5 [6 a3 Y7 ]( c - STA MMC3_BANK_DATA
9 Q+ H% T y' O4 A1 `* ?. y* u; d - DEX1 V6 Q K" J, L3 E; _4 N, `( b7 u
- BPL Init_MMC3_Chr_Bank_Write! ]/ g' D2 |( r0 W' c% i$ X# E" S4 H
- RTS
, e$ r }* X& f. V8 t$ u - ;--------------------------------------------------5 K; w0 {# I& ?% B
- MMC3_Chr_Bank_Data/ E" V+ R9 f* r6 D
- .DB $00,$02,$04,$05,$06,$07
" h; o; ?& Z, I) H7 A/ c8 O6 B - - Z# V) L/ @" ^4 _3 K
- ;==================================================$ r& H: S2 N( d# Z: a
- ;重置中断处理
. @5 h! T) u, H) n0 ]* x - ResetProgram
) a: m6 }% [7 w g - SEI) `. a3 Q2 T9 D* e) c
- CLD" m9 K& b0 m5 q/ p: A, o7 V
- LDA #$00: w! s* W1 `% N
- STA PPU_CTRL- C0 p% o& i& U+ e
- STA PPU_MASK
- I* s6 W1 E; g* o9 T _' b - STA PPU_STATUS! t- r4 _( V9 k. ?5 I3 ]
- STA JOY2_FRAME
9 z% O# n, N7 t) A7 o - STA APU_STATUS6 D4 M8 ~( S Y( t& t
-
2 j0 V8 S4 m! k' ] X0 O - LDA #$C0
' O* C) t9 _. y2 u! r1 M1 e) H& M! B - STA JOY2_FRAME3 p7 w1 B' U0 h( |8 w/ i* o5 r" h( W
- , G- w8 ]- d5 e8 U& @
- ;等待vblank
. h G9 ]( D, V' g8 j4 e! ? - LDX #$02. x7 N4 I5 r( H0 o0 k7 c3 \
- Vblank_Wait_1! f2 X* |3 H9 V; w" b: I* W
- BIT PPU_STATUS
3 A" Q& ]4 K6 G0 A - BPL Vblank_Wait_1
- N% ]; ^' @2 U2 G0 U6 v$ T - Vblank_Wait_2
9 |$ E+ V h. y8 q: q - BIT PPU_STATUS- G. u# @" F/ x0 V: m4 g
- BMI Vblank_Wait_2
. f( C9 O; F" t' D; J( ^( G - DEX6 R, N. |: t+ K* u
- BNE Vblank_Wait_1
1 b- O% D+ N0 R7 P8 `# Z - * y7 Q$ D+ j" N0 P9 z
- LDX #$FF' n' s! l% f) K2 w; \
- TXS
; J- c7 j n4 W% f% k* g5 x7 t - 4 _1 V2 ^$ b5 m. E5 p# h; X1 h8 t
- ;初始化MMC3. Y5 e, a4 t+ t' n
- JSR Init_MMC3( i& b; r: q5 p* ?' U& \0 E$ }, R
- G$ V p& u& z1 H6 }
- ;==============================, O7 I+ J- _1 k2 Q$ ^/ ]
- ;RAM初始化8 O/ u+ i# n% ]4 F
- Nes_Ram_Init
! j7 c8 n. [) g9 e2 g- B8 @/ ?" S - LDY #$009 x U5 V: T4 D) \! n
- LDX #$08
, @7 N& ]" w2 s - LDA #$00& R! T. y' @+ C$ n
- STA <$007 ~0 Q0 B. u( l) n% ?7 \5 O
- STA <$010 [' e7 Y, t% Y0 \& _# A/ @5 N
- Nes_Ram_Init_Write: O$ `$ @0 B N" N9 L
- STA [$00],Y
9 v; N f8 e% w- o - INY
6 y _8 F) s2 `% C! g - BNE Nes_Ram_Init_Write, x% i# t! z' Z* s9 @( o
- INC <$01" X6 S: e q' u# ?1 B* _7 x
- DEX
) H5 C2 T1 P! C8 ^ N: s - BNE Nes_Ram_Init_Write% n4 r' b& H" V
-
+ n0 l/ o" c" |! |7 ^ - ;初始化命名表! T+ v# i. z6 s# p+ B# D
- JSR Init_Name_Table0 K5 ^3 l# d$ J
-
: I" o% q$ v! e/ b" L' s! Y; ] - ;初始化调色板5 P- O. ^9 {& ^/ l9 W) y: x- ^" {
- JSR Init_Palette
- A* f( S' v3 ]6 [6 Q8 H6 X - 3 Z* B t, Y! E. M9 M' q; t% `, P
- ;初始化命名表属性
" O( t+ m3 Q: _7 A/ y& Z% k5 K+ y - JSR Init_NameTable_Attributes
* C# ^; b5 _% |7 f9 E: a -
7 }. `2 K/ W: a - ;初始化精灵内存& H1 d1 m7 M0 a. {
- JSR Init_OAM_Ram
0 c, F8 U8 W+ j, P# k+ w2 g2 I9 e - / G1 J8 _$ J+ s2 K# X" r
- ;在屏幕上写点东西
- V: n/ z- a7 t1 T& @9 o- c7 { - JSR Init_Name_Table_Text, j5 |- a0 i% Y% T" }7 n% t
-
: R3 v; @" v. W - JSR Time_For_Vblank
7 ~ G0 V- l8 T; ?9 Y$ w [5 W& O - ;开启PPU控制
. Y: F4 B Z/ d- p0 a) f/ O2 J - LDA #$80) A- f0 ^& g/ O5 k
- STA PPU_Ctrl_Buf
# j4 P5 |" r* X: B$ G- S, u - STA PPU_CTRL8 f `! B3 c3 K e
-
+ Z6 s5 R& t- l& a! O6 }* L - ;开启PPU显示
5 A P! e2 M, J5 u$ V. @ - LDA #$1E9 k/ f' B' }9 G/ ]) @: Y5 L% j
- STA PPU_Msak_Buf
: n% H% J* `. V1 q# C - , o. F+ T9 L+ ]0 s
- LDA #77
' n: G4 S! r8 e) X) L - STA Sprite_0_Y/ t* _$ A1 ]" ?8 k
- LDA #$1E
/ P; e6 N) f3 p6 W. \ - STA Sprite_0_Tile
6 h3 _6 n- T6 X) F - LDA #$20/ h& c# f+ ^! {8 \$ E( B* I
- STA Sprite_0_Mode
! Q ]$ S, _2 c3 T& ` - LDA #$00
+ T+ l8 U( o/ r0 R N' F G - STA Sprite_0_X
) I- _' Q9 h% x7 E d, z -
# v7 b* p# A: E - CLI1 C, v+ H5 T1 h
- JMP Loop, m( T% ?2 |) l" p! S( P( V6 N
- - o F* V+ n. |" C" }
- ;==============================
' H( |( Z" _+ I# R2 \0 H% L - ;死循环, 等待NMI中断
- E/ q0 \' K# `4 Z" Q$ O7 d) Z0 L9 C - Loop" g9 K% U$ ]! R1 X( A( }# y7 {( J
- JMP Loop
; z, u0 s2 \$ j( S. p
! M3 H2 g* i9 u2 p+ x3 @7 ?- ;==================================================! H$ }% c8 `8 U
- ;NMI中断处理" w6 Q1 g9 ~; h- {
- NmiProgram
3 ~ q3 k! k7 D5 U - PHA
* q8 K p+ ?9 e: Z! P' D7 D% z - TXA
) N' s) L3 D) g - PHA
0 F- {1 q8 l6 s' Z p' S. z - TYA
( v4 x: ]( F1 s+ c. n% T - PHA
1 [5 y4 ]/ p5 M0 R& D6 O -
3 k0 L/ }; Y! I# t! e - BIT PPU_STATUS! a7 `/ w8 \& n2 M# T5 g, {
- 2 o9 [: S% Q9 M3 R% Y/ `
- ;关闭PPU控制" _2 F! j2 A" h+ C
- LDA #$00! C! L& @; l8 h* {8 x
- STA PPU_CTRL2 r3 G* Q# {* }
- 7 c+ v, V: j, q! _" k
- ;处理PPU, q3 S# g; F9 W V1 m7 a
- JSR PPU_Process
# x8 ~& ^- \0 C - . d) ?* z7 r f; N+ J" v+ i
- LDA #$00; j0 Y$ w# E' |* }1 {
- STA PPU_OAM_ADDR: J+ ^! V, t6 B% w
- LDA <Sprite_0_Y% X G. y+ s/ {. L/ y
- STA PPU_OAM_DATA9 A% X. A s5 ]+ q I2 W
- LDA <Sprite_0_Tile1 U2 g$ C; X: H! X/ j
- STA PPU_OAM_DATA/ V: X! o, _9 F3 w- J" _; t
- LDA <Sprite_0_Mode/ X: }* W' Z7 |5 e/ ]
- STA PPU_OAM_DATA
( C) @1 @( g D" a% x - LDA <Sprite_0_X
" L! F2 x( w$ m, P4 h - STA PPU_OAM_DATA
% z3 i, T7 Z* E7 d: Q -
: e( M+ {$ O) G$ m1 {3 m - ;开启PPU控制, P% _$ g: W6 g8 O7 w4 a6 T6 `
- LDA PPU_Ctrl_Buf9 h4 b6 J- M; b5 R( }3 n- @2 @
- STA PPU_CTRL* v* C6 x$ T4 O$ a7 @
- 3 `% u& c; ~7 {4 }: W
- ;屏幕滚动
/ t6 @5 k) m2 K8 \( x! J - LDA <PPU_Scroll_H
. \. P4 W% f4 N: J: z) | - STA PPU_SCROLL
; }; \5 A6 q+ `: }/ p$ O - LDA #$00$ W! O; n2 x+ ]: A
- STA PPU_SCROLL o7 X+ e9 _0 {" s0 b
- 1 g; [5 M2 @" b, L4 J% C3 B
- ;手柄处理: w: O0 |7 T5 \- T V3 {" T2 B" ^3 \
- JSR GamepadProcess
5 T4 K6 f2 a8 Z5 h" ], I# S -
$ F, F& C; `" e - INC <PPU_Scroll_H
; A4 J1 I' K8 u' ^7 U& t, l- K2 F -
& Y# j6 `1 I- i+ D - ;启动0号精灵碰撞检测
( i: ]) {. @, H6 ^: k - LDA #$01$ a# M2 z, y5 _8 m+ Z3 P) h4 w
- STA Sprite_0_Hit_Move_Direction8 u: u+ G: E Z$ N7 B) Y
- JSR Sprite_Hit_Test
/ P$ W3 B* i6 T: a$ x: Y -
7 L' ?$ S' i5 T ~: D# T k - PLA" {1 U' ^0 U" `! z4 U% w
- TAY& P0 f7 D/ T- J9 @
- PLA
4 U2 g) r0 S' ? - TAX3 J" `/ C2 z$ |& j( v% v
- PLA
7 i: \; H: y" A! [4 _& e- _: U - RTI* ?. S- ^" @- O
- / _4 M3 E) K! i7 i1 \
- ;==============================
e) |' K$ I- h# ^1 C* X - ;0号精灵碰撞测试2 J# v: V: v9 {0 r
- Sprite_Hit_Test+ D' W/ h$ D& Y6 }
$ H2 t- X* n6 m2 a( `- ;------------------------------7 Q% q6 z0 J+ Z9 W/ I9 z# h+ b
- ;等待0号精灵碰撞状态取消) |0 p! m+ P( z3 o# c. D4 E& c, m
- LDA PPU_STATUS/ N9 x; J; H4 n O0 h/ h
- ASL A
" S8 D$ [+ L# L( ? - BMI * - 4" ^8 B% I' y6 ^9 _1 p+ w; H9 m$ `
- 3 ~/ u" n) O4 a9 {+ u
- ;------------------------------0 P( ^% Q F! T# ^/ p
- ;等待0号精灵碰撞发生$ g& e( c! w' u: z
- LDA PPU_STATUS
. H: m: f2 `3 e% T! p - ASl A
1 L7 B' H# i: ]2 Q( ? B - BPL * - 4
4 H' I3 s R' O! R5 W' S: f- f% C - # m* X# E! {8 A& R* x' Z
- ;------------------------------5 j0 b9 v4 v. w8 s- e9 r+ P6 H1 O
- ;行消隐等待
8 H7 }. Z6 s2 ?# H; U - Sprite_Hit_Scroll_Wait
, N$ B" ^& [* i( h3 x - LDX #$282 i% T `: F$ c1 `5 T
- DEX$ R+ H2 F1 y8 n8 M
- BNE * - 17 L `9 p# V1 Y V' d
-
, h, X- n, B( y - LDA Sprite_0_Hit_Move_Direction0 j9 O% t- ^: `4 Q( X8 B
- AND #$01# `9 H$ \9 z2 {5 q( Q' h
- BNE Sprite_Hit_Scroll_Set_Right* l1 k! S K8 }& W
- ( _- O' t3 E. s; z! ~9 B
- ;------------------------------
5 ^7 J/ T3 P# ~3 N" Q - ;分割画面向左滚动
! W" e1 A+ X# d* Z) V4 V1 r( n, T - Sprite_Hit_Scroll_Set_Left
7 S e9 ]; v9 f: s - LDA PPU_STATUS
7 w* {6 b7 x: D* O4 x& i - LDA <PPU_Scroll_H) K' U; E) c7 O. i
- STA PPU_SCROLL! y+ n7 H: l, Y; r1 q3 g7 f& K+ a7 J
- LDA #$00* p# W( t. a/ f; n8 _; F
- STA PPU_SCROLL- f/ E( z$ ]; f8 N0 N
- RTS
2 D, B& p3 s" V1 O
% D0 ]9 J" D2 E- ;------------------------------
& X" P! J& ^! q# W: l - ;分割画面向右滚动
8 n2 K8 K; ^; v) z - Sprite_Hit_Scroll_Set_Right2 x* D; d0 u; Y
- LDA PPU_STATUS
$ R/ U: _1 o t; q. a - LDA #$003 [, Y7 S$ G8 v" G9 _
- SEC+ U$ M1 P" s7 ~: j- R* l2 a8 O
- SBC <PPU_Scroll_H
8 i9 H5 ^' {# ]2 U4 g. p0 d - STA PPU_SCROLL
7 k5 F; G' m/ V9 T0 o; d - LDA #$00
* x9 w' ] h( S1 v: o7 m5 a - STA PPU_SCROLL; k! }% H5 T& c# a% \& R' d; X0 k/ w
- RTS2 X v* H5 }$ B# w0 D! H. |- j" n0 e
8 n9 f4 U: u H* s- ;==================================================
0 u' ~' O( z! [( Q1 _ - ;IRQ中断处理+ r- b7 {" m2 \( N3 }: j
- IrqProgram/ ~0 U5 h% n% o6 Y$ e
- PHA* H6 Z8 g' T7 p6 K: U+ s
- TXA" v( [( E; |0 ^3 G2 n- R
- PHA
2 J4 y$ W* G8 O8 _/ G, { - TYA
# u$ K( {9 e& c- k5 H$ _ - PHA% E" L7 F$ Y$ Q" ]. Q! E
-
6 i f+ O; K9 @ E+ D - ;关闭IRQ
+ H% a4 `* m) _$ \% b2 Z* ? - STA MMC3_IRQ_DISABLE' g% H+ s9 a4 q+ |5 ^, ]5 B
- - `! R& w! ]) r8 b2 A) O% v5 c
- ;允许下个IRQ触发5 Z0 a# }* n8 \; e; c; [
- STA MMC3_IRQ_ENABLE
- l6 g7 p. `- J O2 Z% e -
4 m( |8 @. Z2 F; H - ;IRQ处理, 15线后继续触发
, @' S4 j$ p( p0 q - LDA #15
% U* A6 k& F2 |, a+ J# Y) M - STA MMC3_IRQ_LATCH5 @; a: G8 i0 K( F) I% r* @" T
-
! S& U: j% ^7 H' r3 E: D2 ] - LDA <IRQ_Index/ ^( D7 Z7 q/ N1 K; ?
- BNE * + 49 ]7 z" I+ q4 V4 c" ]3 \
- INC <PPU_Scroll_H
6 ^/ h. q7 M+ B/ j; W - * x. d& p5 M9 W9 ~$ @# w* p
- ;设置屏幕滚动" _7 M( ]7 ^0 ]7 c! q- u
- LDA <IRQ_Index
6 S# E. P! x7 W+ P - AND #$01* F7 ]! ?& B$ \- Y
- BEQ Irq_Scroll_Right
! O0 o3 z, F5 q/ p - $ R& f5 f& b5 C
- Irq_Scroll_Left
' \( ]6 B! e! g" _ - BIT PPU_STATUS
' _. k& t& z" `" X* A0 ~7 d - LDA <PPU_Scroll_H; B; @/ T' }3 q6 o; M _& ^
- STA PPU_SCROLL
' w& h+ A0 o) b5 I+ \- a - STA PPU_SCROLL& _7 ^+ k) X- y% f6 f+ c5 M/ z0 o) L& }
- JMP Irq_Scroll_Over4 Z7 C; x5 p& D- f$ x' j) H5 q
- 0 f, Q8 T! t$ V( x9 c$ ~
- Irq_Scroll_Right! @2 }' S' M* a* i! D( j5 M k
- SEC* x4 |: x; Y# N/ t
- SBC <PPU_Scroll_H+ [" x3 V8 K6 ?
- STA PPU_SCROLL
6 [8 g1 p' [! Q+ F" r5 |. G - STA PPU_SCROLL
4 C, q `/ X! ]& N& e* M/ E2 g - Irq_Scroll_Over
, ~ C* w- w$ g- v -
( D. q) @6 J, U - INC <IRQ_Index1 k6 m; D4 B/ J K5 `9 w* k
- + A" I" x8 }+ t% k- A6 z% G9 ~% J
- LDA <IRQ_Index
. @4 i( Q( J9 d5 \ - CMP #14
8 }8 X0 h! f! v* [' f7 v% D - BCC * + 5
0 P+ N& y; ?# T1 ` - ;关闭IRQ
2 x0 m4 e& r) v; V) @ ]" { - STA MMC3_IRQ_DISABLE" J4 |( ?' x! U, A4 N
-
7 _$ G6 ~. T6 u6 {+ K, e - IrqProgramEnd
2 J- v& p* N) A# s8 q4 o - PLA8 H3 C$ S# e6 a9 d
- TAY
5 V- L! ]9 b! B" P1 v - PLA
; y, K& W) C$ c" z# K - TAX* |% s+ j% H6 G4 K# G) L
- PLA
5 y+ G9 N2 G$ k9 O6 F6 A - RTI, e; O. s7 [9 u4 h6 z6 }4 m, Y7 }
- " ]) b( l$ `9 X+ {
- ;==================================================
0 z+ r0 Z" l8 ^& g4 H - ;中断表
/ X- W, k) z5 p; `; ~ - .ORG $FFFA0 m- v- @: Y6 Y* X8 c0 u. E# Z
- .WORD NmiProgram" \$ f- Y6 \( g4 Q- A$ w
- .WORD ResetProgram
( g& B8 j% n& O% R; C! f6 h - .WORD IrqProgram
复制代码 7 \8 \, S4 \# E; L/ Z$ I! x4 V
|
评分
-
1
查看全部评分
-
|