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