|
|
- ;[FC][MMC3 精灵碰撞]
4 d$ {; P7 J! |3 [, K - ;FlameCyclone 20230710
% u2 ~' | y) O+ @. s+ y4 b
) H* N% M$ o; R+ N- ;文件头7 e/ N, f# Y6 z j J# C; V
- ;======================================================================% s7 E4 I3 z+ Z$ U
- .INESPRG 4 ;16KB PRG 数量+ {$ Z4 Z. h+ @& F" H9 y
- .INESCHR 1 ;8KB CHR 数量
5 w0 I# T8 ~) _% j: q* E - .INESMAP 4 ;mapper 4/ }& ^0 b% a8 c0 }1 y/ I
- .INESMIR 1 ;命名表镜像 0水平 1垂直% x8 @0 Y1 w9 p" W( }* z4 _
- ( O; b/ _$ p7 ~3 f7 }3 ~
- ;必要条件
1 \0 R! \+ S6 } Y. \1 N - ;1.持有CHR ROM: Q* @+ y# q, z
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$10007 Y) h( V2 C+ V, X; D# s
- ;3.精灵内存(OAM)不为空
' `1 W+ e8 K' S7 J
8 i6 L8 X ?% e! p; }& i: i1 E- ;==================================================8 }& l1 W$ ^! I, j5 H5 _! n
- ;NES端口常量( v+ ]$ Z. } N8 U. n4 i
- PPU_CTRL = $2000 ;PPU控制寄存器% X5 F% ~- J4 W
- PPU_MASK = $2001 ;PPU掩码寄存器0 }* P9 G2 V( _5 R0 e! O2 [
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
- ?, e; z; `5 Y' p# R: ? - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
8 a; N+ ?* Z' l6 ~+ x - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
4 T' w' u7 \2 F+ P' | - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
4 J4 K' g# r9 m - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
) [" X5 X7 T4 G6 V6 m9 p, X - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 % [2 d3 L0 }7 W, o! z
- OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存2 i! n) c( W! _$ H0 E, E7 ^2 e& E
- APU_STATUS = $4015 ;声音通道切换
! w/ u. p/ f+ l4 H8 i( G& p - JOY1_FRAME = $4016 ;手柄1 + 选通+ `3 m5 q- r: w
- JOY2_FRAME = $4017 ;手柄2 + 选通2 F/ }/ Z$ s; U e) C5 E
- 7 r i7 B" e2 L* Q9 E# u' K
- ;==================================================
+ |6 f4 [- H* V& T m1 q7 P. l! n - ;MMC3端口常量
9 q# M1 `. I. K {( y - MMC3_BANK_CTRL = $8000+ @9 r6 ]* ?- |) K
- MMC3_BANK_DATA = $80011 c# l, q' v$ d, ^) ?
- MMC3_MIRRORING = $A000
8 G' F* `( x$ g. b7 R' H2 T - MMC3_PRG_RAM_PROTECT = $A001
5 Q* F. Q9 h5 A8 f2 C5 F9 c( V - MMC3_IRQ_LATCH = $C000
. q: J% X, S3 k0 J4 A2 F/ Z, t G - MMC3_IRQ_RELOAD = $C001
- Z2 r4 z; r3 n/ N - MMC3_IRQ_DISABLE = $E000
; Y+ Z) c7 ?& l0 ] - MMC3_IRQ_ENABLE = $E001* G; U; u1 M3 R7 K7 p7 u- j
7 Q* w& ]* e9 g0 l6 a- ;==================================================
# ]2 F, |( ^ M! `8 g1 L - ;程序块配置
/ q' A: m1 M4 Y/ ?; k H - BANK_DATA_MASK = $07
; ]7 c3 @, a. H' g: T" c5 |9 S - ;--------------------------------------------------: [4 G, W$ ~+ G" b9 q. k
- RESET_BANK = $076 u3 ^0 C# e: [3 r& a
- RESET_ADDR = $FC00
$ \( L$ O+ d" b% E c7 Z7 @5 Q; [ - 4 s, M' \7 ?1 K$ w3 F% \- C2 F% r
- ;==================================================- T% b# S8 J8 L% R+ r/ E
- ;图像块配置
9 D' J, h0 x! }0 ?: } - CHR_DATA_BANK = $084 Z4 k, ?8 z9 ~. M
- * u' B9 S; f" m0 e& `3 p; W
- ;==================================================
# A3 s, _9 z$ s. K/ o - ;零页内存地址配置3 l, s- v; \& \
- Use_Ram_Addr = $800 L# l8 i' w7 a2 ^) j& [
- PPU_Ctrl_Buf = Use_Ram_Addr
- h# {5 g: {; }( D: E& X) q+ B - PPU_Msak_Buf = PPU_Ctrl_Buf + $01
" T8 G+ ?. R" f! P+ H, T. e c7 ] - PPU_Scroll_H = PPU_Msak_Buf + $01* s) o# s* d; i6 E1 f, A# \' |5 W( ~
- PPU_Scroll_V = PPU_Scroll_H + $01& ~# k! ^! R+ W: X2 [! ^0 D
- FC_Data_L = PPU_Scroll_V + $01
4 l' s# T" y9 F4 t& T - FC_Data_H = FC_Data_L + $013 o- o4 P6 K r( I/ C3 o
- FC_Data_Buf = FC_Data_H + $01* O0 \: \+ M% _, ^
- ;==================================================
* a% Y# M0 n+ Y" L: c+ S# a1 s( M
( I% h' S6 e; n8 Z5 F- GAMEPAD_MERGE_FLAG = $04
4 ?/ O% \, R$ c/ s - # r3 l4 x7 a( L- O# x% Y; w) g
- Gamepad_Keep = FC_Data_Buf + 16 ?& W& ?! C& d/ @2 z, h8 o3 K: z& T
- Gamepad_Once = Gamepad_Keep + 2
5 K9 `) c* W/ R* V" h - Gamepad_Temp = Gamepad_Once + 2, C( u6 D$ r; O4 g; U! A* f" ?9 x
- ) h$ _) [7 `! F* K
- Gamepad_0_State = Gamepad_Temp + 2
; x2 B) I' C/ I. @4 Z - Gamepad_1_State = Gamepad_0_State + 1( {0 k# f+ V2 E9 X
- Gamepad_0_Value = Gamepad_1_State + 1
* e2 W8 d7 C, s- h - Gamepad_1_Value = Gamepad_0_Value + 13 f! W+ K7 h) [- i# R) d& Z
- Gamepad_Port_Value = Gamepad_1_Value + 1. N9 J: d: R" Y4 v' G
- Gamepad_Merge = Gamepad_Port_Value + 1% s1 a' b1 ?3 j+ J
: X. [" y/ @7 s- ;==================================================
% r0 R8 G* g% Y' f$ B! B - IRQ_Index = Gamepad_Merge + $01. V( ]+ h$ [7 P: {; U0 v9 n
- Sprite_0_Y = IRQ_Index + $01$ L/ \7 j7 Q5 [! n
- Sprite_0_Tile = Sprite_0_Y + $014 K6 u. |3 l4 b6 |. ?2 E; L
- Sprite_0_Mode = Sprite_0_Tile + $01
# h9 o5 J! C% A! a+ j; o - Sprite_0_X = Sprite_0_Mode + $01& _4 G( S' Q; `, D! h
- Sprite_0_Hit_Move_Direction = Sprite_0_X + $01
" J, j% `7 l) ^6 j' h, j - ;==================================================$ f! ~: ^" V! ?; l
8 I2 C) R& P8 G' {! Y! s; ?" u- ;CHR图形数据& V: d2 s5 g9 T
- ;==================================================( e8 c/ q8 L: B
- .BANK CHR_DATA_BANK
Y7 e6 d3 X$ j/ O7 G x6 ~ - .INCBIN "chr_bank/chr_data.chr"
9 a2 h0 d% A/ P0 `0 @/ w - . S' ~# m, t+ W% i& E- ]
- .BANK RESET_BANK & BANK_DATA_MASK2 c/ _: f7 V1 I* V
- .ORG RESET_ADDR
' g% Y8 p, {% W- e1 |' c( | -
4 c. X/ b0 t5 j& \% Q5 I/ B - ;--------------------------------------------------- h1 f7 a8 J; h1 X& F) ?
- Attributes_Data
' ~! ], Q, b: P4 i) A& G - ;命名表属性- B" Z7 }3 e% i9 {; K
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
$ n7 p" j6 M/ L# Z. X0 H6 s - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
( g5 K G- N# | `" k; C" ~" E - .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA }- X: ?4 T: t0 x3 z9 x
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55# ]( a" v5 Z# f, n M1 U! S
- ;--------------------------------------------------
: k! M, k$ K4 S& t( U1 S - ;调色板数据
3 c& f7 q3 E' u - Palette_Data
1 @4 ^0 i! ? c" [ - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F; _" M& J! h) _6 L4 m9 J
- .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
" F6 y# ^0 f7 ?/ W
. p& r/ ?" l; y& [5 T- ;==================================================
) Z5 f' m& i& s3 p* S - ;命名表初始化7 A. ]- | i M8 J* B/ c, `. e
- Init_Name_Table
' Z9 B2 e: Z6 r4 x% L - LDA #$20
5 o2 z2 b+ i8 [5 ?2 |0 w - STA PPU_ADDRESS' L3 R6 K/ V5 r9 r' Y# a3 G- I
- LDA #$00
4 y& x; I* C0 j- ? - STA PPU_ADDRESS- i/ U" [2 l% a9 i. ?
- LDA #$006 s1 v$ _) e7 B( k
- LDY #$00% b$ n0 m0 x) Q8 L
- LDX #$10# h- X6 O' c2 j/ O& ?3 t( M+ r! F
- Init_Name_Table_Write
6 w% F7 O9 Q8 {6 K* |& \+ Y - STA PPU_DATA
4 Y1 k# L) F% ^2 u0 Z" r - INY
' m+ B- G0 K4 Y4 Z/ Z - BNE Init_Name_Table_Write1 m& \6 M" T6 Q! `1 z. k% D" o; P
- DEX8 f% `% a* A# `8 Q
- BNE Init_Name_Table_Write) t/ W9 U% s9 P# ^6 T
- RTS
! o2 b" k3 N# t) ] - / h8 g2 I& y0 v2 a' K
- ;==================================================
2 K8 `- }8 F/ d! l' e$ @( u0 K - ;调色板初始化
: w) {( Q& p& C; ^0 h - Init_Palette5 R/ O: S4 m$ [! {6 F
- BIT PPU_STATUS" P4 d( |$ x" H" o$ v+ c" U
- LDA #$3F; z" L) E5 i& R- P. {, B [6 d( O
- STA PPU_ADDRESS
/ `" f$ A' Q" U - LDA #$00/ e$ }! v4 D$ P8 r( H
- STA PPU_ADDRESS; K2 n' ~6 Y1 p8 ~0 a- z7 B9 K. f
- LDX #$00& L$ D+ `; ?9 a* Z- {
- Init_Palette_Write1 C* o% |" b9 V2 i
- LDA Palette_Data,X S: Z% b& c8 W
- STA PPU_DATA6 ~' L# M* Z8 K7 H! r( Z5 v
- INX
2 i/ H$ x7 B1 m' _ - CPX #$20
* ^ ^% G7 G* u. f: y - BCC Init_Palette_Write1 n, A8 x+ p' e p& a3 B
- RTS9 X" X+ q3 \" @( W0 y7 o# e6 r
-
2 e& V1 L7 I1 w! N& S, u; ~" r1 L - ;==================================================
' @% g) o8 k- b6 n4 r - ;设置命名表属性
0 M8 Q9 P" k) E - Init_NameTable_Attributes
* k& Y" R+ T" u/ r V9 _4 t9 j. f6 k - BIT PPU_STATUS
N2 ?/ A o& g1 z1 z - LDA #$23
7 d$ W. O4 |1 v+ | - STA PPU_ADDRESS& k8 B- C$ e- J
- LDA #$C0' b7 q- F' h: b2 a! H+ U. J1 Y: @# [
- STA PPU_ADDRESS6 t, d1 z6 v- r9 ]
- LDX #$00! J: E! {# e, G H) L
- Init_NameTable_Attributes_Write
4 Y! B' u e2 T0 b4 Y* a' {+ d - LDA Attributes_Data,X
6 I, Z* m" L) L ]9 s% a* i - STA PPU_DATA
+ \' P( v7 Z/ v9 e, M, W - INX, K1 m" x9 k$ [
- CPX #$40# {5 b% j: } z- X) m
- BCC Init_NameTable_Attributes_Write
# q4 u9 L$ G* [* Y% P5 c# ? - RTS, ~' ]0 }5 n' S1 N
" q6 ]; j, x$ Y- ;==================================================; m7 u) q6 T w9 A2 Z) O5 L
- ;初始化命名表文本
/ N0 L7 R) Z& ~4 S+ q+ F9 L - Init_Name_Table_Text
1 }9 C1 O$ g0 c; B! V" n - BIT PPU_STATUS& [( O) `6 {! m9 X5 i( z
- LDA #$20
! D" A( n! E6 s9 v3 D% w* y - STA PPU_ADDRESS
* C5 Y; B5 N; g# ?) X - LDA #$00
; G1 s* r2 y8 W4 R( H - STA PPU_ADDRESS" ?$ X8 v2 \1 f: m# V& B
- LDA #$00
6 p% X- E5 Y& w5 p; { \+ r - STA FC_Data_Buf+ S5 Z9 E4 I5 `/ Y; Y3 `- J5 y
- LDY #30( {/ d r1 C% A& Z L
- Init_Name_Table_Text_Write
4 F9 j! d& }3 i& T - LDX #32
5 U' a' h( Y5 U4 X+ Q( z# z+ v - Init_Name_Table_Text_Write_Char6 a! X. h5 z9 U" I5 N& H) `
- LDA #'0'
' U) Y( O7 X. Z4 Y2 k) i4 N - CLC' w( L# h* T! I2 j" E
- ADC FC_Data_Buf
; s0 v* E/ D' }4 B; ~ \, ?2 A - STA PPU_DATA+ j2 b: C# j( x3 E( ? H5 K1 N
- DEX
6 q3 d) `# t E - LDA #$14
. j# l/ H4 x( r - STA PPU_DATA/ T8 |/ q; Z' l6 V
- DEX
r* p1 `' P! C, i, U( J% S - BNE Init_Name_Table_Text_Write_Char7 i5 L1 N* q2 S7 d3 ~
- INC FC_Data_Buf1 O+ |0 |( Z( O* a: A# W1 c4 B
- DEY# w0 u7 M# v q+ c, j
- BNE Init_Name_Table_Text_Write
* F$ ~, o- R; W" G- @5 D! N8 t0 u - RTS) t# T. F# `# T, X; s. y5 ~* L, v
* G+ }/ w; p! q! K1 Q8 D5 {8 y- ;==============================! H: h: y" K d) k S- ?5 k/ A
- Init_OAM_Ram;初始化精灵内存4 |' Y0 q3 c: F7 ~! t" z
- LDX #$00
4 Q; v+ D ?8 ^. a/ ~' e" ~ - LDA #$00* h. C0 \" o$ C" ]$ W+ N; d+ ^# a
- STA PPU_OAM_ADDR
: p6 [+ v- L1 X" L$ e - LDA #$F82 E. {7 R( h: ` b
- Init_OAM_Ram_Write( H8 s/ ~. ^- \8 S
- STA PPU_OAM_DATA
1 j v, Q) j# [ k: r; T9 O - INX$ |8 W2 T) F3 H
- BNE Init_OAM_Ram_Write
+ C; u5 v% y7 c4 s1 R( A - RTS; c& \) v8 ]: U& q; W; N
- & n) Y% _7 O! f, a" n- e9 l& `
- GamepadProcess;手柄处理
W: b; m8 N( k4 @ - JSR GamepadDatacan
5 Q& L f, }. _ - LDA <Gamepad_0_Value
9 a8 e" J; x d' a& @9 L" ` - STA <Gamepad_0_State# s6 f, J7 v* ~* L5 w) `1 G
- LDA <Gamepad_1_Value* I2 r: {# L( z8 R% l& _- U( b
- STA <Gamepad_1_State2 A$ G6 C t- E3 V8 n
- JSR GamepadDatacan% e/ s! Z2 i% v
- LDX #$01
* {. {" [( I, ~' o4 W. W - GamepadMergeCheck;合并手柄输入检查
6 O( T! b, k' c; N3 U) a! k - LDA <Gamepad_0_Value,X
) a& z3 f" E7 F& }0 A) m - CMP <Gamepad_0_State,X
7 `( }& x( O! e. ^; Q+ s: j - BEQ GamepadMergeInput, [7 g1 @3 Y% Y: u& S r3 T
- LDA <Gamepad_Temp,X
" u# S& i$ y u" T( n D - STA <Gamepad_0_Value,X9 [9 W+ d# Z- \# M" W; x; j
- GamepadMergeInput;合并手柄输入& T( N9 E" L! q1 Y0 y; [; \
- DEX
; T+ _3 E9 x3 N. Z - BPL GamepadMergeCheck
5 x& h) b) N" S/ K: R v+ t - LDA <Gamepad_Merge
) b; c" b( X+ y; _. K) A% O' @& F r - AND #GAMEPAD_MERGE_FLAG
0 s- g3 a0 k0 Q, Y) q - BNE GamepadStateProcess
" C/ U" F7 D+ D+ l - LDA <Gamepad_0_Value2 M( w+ P$ j1 u1 E/ h2 `# Y
- ORA <Gamepad_1_Value2 X- g2 r/ y/ V1 ^( t
- STA <Gamepad_0_Value* D' Z" ]5 W) U. V
- GamepadStateProcess;手柄状态处理
8 l& R. q' ~2 F5 Q9 K# n+ ?) n - LDX #$011 k1 H' M0 ~$ H' R) Y4 T: h
- GamepadStateSave;手柄状态保存1 ?$ W0 j0 z7 Y+ x2 Y* p' ^
- LDA <Gamepad_0_Value,X
. M% e G2 C' ?6 c - TAY/ F0 v& i: M1 \0 L2 p
- EOR <Gamepad_Temp,X
4 c5 P* [8 g" @ - AND <Gamepad_0_Value,X8 ^% P/ a- q# t! P9 c$ v z
- STA <Gamepad_Once,X
" _3 G7 P2 o ` r1 E( z - STY <Gamepad_Keep,X! g; D; P. Q0 i9 q) \ E" L$ V
- STY <Gamepad_Temp,X
( B% e3 @1 E" J - DEX
) i+ V* K j" d" g: U; F - BPL GamepadStateSave2 ^* R% P) b' D) H* i7 g( y! w
- RTS
; [7 c, x, b6 p7 r# R" }
9 u& D& [5 `1 [ ]! y- GamepadDatacan;手柄数据扫描* [6 N+ w$ |! {: f2 S# T9 g$ S$ G
- LDX #$01
- M* V3 y1 U, W7 W, b2 ^ - STX $4016
. U( @& E- w+ k0 x - DEX2 @( D# w8 u& z5 `/ x
- STX $4016* h$ u( ?& o, u( S+ b
- LDY #$08
6 E9 y) b H! U p- Y" z) k - GamepadPortScan;手柄端口扫描) K) V$ }5 D4 r) z
- LDA $4016
3 D+ h) ?5 R/ s, G1 S - STA <Gamepad_Port_Value
8 @7 J) _0 ?: @7 d, s5 p! G! { - LSR A
! e! |- _2 p& \# C - ORA <Gamepad_Port_Value+ u1 y3 E4 i" V# R2 L, i
- LSR A
1 x8 L( ^0 k( \7 c' t - ROL <Gamepad_0_Value2 ~$ Q2 |: j9 }
- LDA $4017 g& {5 }0 I6 K) n7 @3 K
- STA <Gamepad_Port_Value7 i5 }4 q7 A; q
- LSR A
4 C @* {* N+ | - ORA <Gamepad_Port_Value
; I; S L4 K/ S: t - LSR A
7 z, F5 e% g9 p/ ^8 h - ROL <Gamepad_1_Value: f! x7 h- ^' W5 G, G4 X
- DEY7 l" p* ]* `, a$ V- v! H- j7 p
- BNE GamepadPortScan. G/ V, B( K( j. d1 P' ]
- RTS
/ V" p! i* j7 G; w/ k - ! w! v7 ~( t- e& Y) m, v+ v# u
- ;==================================================2 l; \' m7 O( B! P" C. N9 K* y
- ;PPU处理
+ B3 z2 w3 W3 l0 i5 s - PPU_Process4 l! i& _' R$ S( ?- L. F% _
- LDA #$00
! t" {; c7 }$ J2 P& T" { - STA PPU_MASK6 i: u! k& g& f1 d
-
7 x! F! L# b9 k6 ] - BIT PPU_STATUS
, m2 }2 K! [2 g( r, n( A) p' e - LDA #$20/ |" W9 Y, _4 S! Y; z' D
- STA PPU_ADDRESS; y/ m1 V6 O$ L- k$ x$ D9 b
- LDA #$00, K0 { R' q5 ?0 q
- STA PPU_ADDRESS
' m% d$ N5 Z. N! }$ G5 l1 k -
$ t7 J5 S. e! D - STA PPU_SCROLL1 q5 l$ _. v9 v. I9 Q0 J
- STA PPU_SCROLL. z( F& [( \, |) v
-
7 k; U% r V5 x8 a' l - LDA PPU_Msak_Buf8 @, g$ [2 {' E# g
- STA PPU_MASK0 x0 s; [( D1 N* U1 v- E- i
% p# g7 J# { t0 f- RTS
: ` g1 V2 D b - % a2 v8 {" ^+ j( j2 i4 B# e
- ;==============================
- w( d2 M! N7 M, e x/ ? - Time_For_Vblank;延时等待
. v- `0 I) f* ~$ k+ x - LDA PPU_STATUS
8 P0 B. G. _: N - BPL Time_For_Vblank
A* E$ }& C& b3 i* m" U4 M - RTS4 q* }8 E! O: V7 M* A" P
- 3 S, N& A- \8 G( c
- ;==================================================
9 c7 k. ~& i, d D - ;初始化MMC3+ J( p; R3 O: P/ p
- Init_MMC3
, Y/ k6 S1 N! m- h8 _) w - STA MMC3_IRQ_DISABLE+ Y/ b3 k" y* F9 t8 h
-
3 _6 H% C9 _$ A w( _! \ - ;设置MMC3水平镜像3 Y' E* i! ?6 Z) R$ B
- LDA #$01 R) w7 }% o" e# H; _: t
- STA MMC3_MIRRORING) w: o; d4 h. n A$ C/ v! Z) \: ^
-
$ `5 m* S2 A9 ]+ D - LDX #$05
2 s4 q* R c; T9 i. J0 E% V - Init_MMC3_Chr_Bank_Write
9 R# g. ^) C c8 i1 L' F. u1 t: T - STX MMC3_BANK_CTRL
( c" c5 Y7 o) l( w: s; q - LDA MMC3_Chr_Bank_Data,X
# w# F# }. c: {) o, x2 s - STA MMC3_BANK_DATA
' Z! G k$ F- z0 n ~6 [ - DEX& p G! h3 R! H0 x2 D
- BPL Init_MMC3_Chr_Bank_Write
. {$ y3 ]/ n1 W: |: E# r2 p4 \ - RTS
: [& ]$ l E: D - ;--------------------------------------------------
% q' E) b* ]0 V4 G5 } - MMC3_Chr_Bank_Data
3 D! P! Q! `( w% J - .DB $00,$02,$04,$05,$06,$07
+ i! J( K& b+ f/ |( _) U, q - ! t2 |: B& u6 O4 W
- ;==================================================
4 m3 E9 M E* T- {% n- }2 r - ;重置中断处理
$ N( j$ ]% w/ P8 ^ - ResetProgram
J) `5 W" T4 A7 h - SEI
% } t d) X8 H4 a1 q" ~ - CLD
/ \! B. B9 Y# k" v# Z5 G$ Q- M - LDA #$00$ ~8 p# l$ b% e
- STA PPU_CTRL0 q8 y" R6 y4 }% ?& g
- STA PPU_MASK
$ S, u; u5 }; d - STA PPU_STATUS
. Q( a5 D+ k6 X! ?$ w: P# e# ` - STA JOY2_FRAME3 @5 X/ ~2 ]" L' i) w
- STA APU_STATUS; b) y( `2 y2 x7 j- E1 k4 x- p
-
& G# a' G. R& {: F! J8 G - LDA #$C0
; z) v6 R- _ O5 Y, A M+ }2 C - STA JOY2_FRAME
8 \' d) C8 l+ m2 Z5 c5 X1 b' _ - & M) J) B' y0 v; S
- ;等待vblank
* I2 E; L9 v* g5 C; d - LDX #$02
6 y2 |: g9 ?8 X" A3 W0 w - Vblank_Wait_10 D/ r3 O2 L% g% q! A) p
- BIT PPU_STATUS. h q# X) q4 D1 Q7 B9 a
- BPL Vblank_Wait_12 }6 b2 r2 w2 I( f5 E: A
- Vblank_Wait_2( \6 \$ |2 z% L+ ?7 H
- BIT PPU_STATUS
/ Y9 [/ ~3 o$ y! b3 @ - BMI Vblank_Wait_2" k! G% v4 ~0 g3 S& w* {
- DEX
6 w6 [/ U0 l$ ]& w9 q) R4 B - BNE Vblank_Wait_1
y. b& [- l$ T& P/ o8 T, q - 2 F6 o8 B- N4 u$ @7 T! N' V
- LDX #$FF8 O: z" h- u, i$ r% A/ ?1 i1 S
- TXS: G! T- K$ w! |1 b" W. `
-
8 u. P# W; P# U- Q$ ^0 n - ;初始化MMC32 ?' S2 t5 n4 P, s1 G
- JSR Init_MMC3, J% F8 d, D* E8 \4 ^2 l
- 0 F/ q. T4 @5 a0 d& o8 H f; h
- ;==============================0 n9 e" d0 y2 [! g+ a$ q
- ;RAM初始化! h" R8 c1 |% ]7 f4 A% m% J
- Nes_Ram_Init
& f- c5 X* A' r - LDY #$006 ~5 o. W2 W& R5 w$ Z. @3 o* r
- LDX #$088 f/ g: t3 r0 R2 h/ F
- LDA #$00
: |4 b5 G) j' }# I# p9 @3 w - STA <$00
$ t# M, l& d+ E - STA <$01, K9 i3 @2 q5 u4 J- A4 U) O
- Nes_Ram_Init_Write
v0 }' _8 }0 c$ Y0 J& I- y - STA [$00],Y( {8 {* S8 K2 r3 d3 w0 }% W+ U" `
- INY' R3 [; A2 u! y) i4 o' }2 \
- BNE Nes_Ram_Init_Write' B" ^) D+ g+ J0 }
- INC <$01
; C$ u/ F9 ]1 C; X - DEX
9 c+ L |& y' t0 b. E; Y - BNE Nes_Ram_Init_Write- p% Q$ L" J7 X
- $ j5 L q7 U T$ d9 ~$ J
- ;初始化命名表
$ ]2 l& x* t/ o& ~6 F* { - JSR Init_Name_Table* J6 t3 i2 a l9 i0 f( v
-
; j2 p9 ]* U' v2 k9 s - ;初始化调色板
6 H% h' a: }* r - JSR Init_Palette
8 O5 i) X7 L6 K' P( n8 b2 [ - v" u; ?8 E. I
- ;初始化命名表属性! d0 M8 D# [- U8 w6 O q7 J2 Q
- JSR Init_NameTable_Attributes
@# F2 L* r& T3 | -
1 K! y* _7 I% X* b - ;初始化精灵内存
& n2 l% Q. u, X) m$ W& M% ] - JSR Init_OAM_Ram
7 a# S) ]: a. u/ L I X -
/ G; A# b3 j5 \: \ - ;在屏幕上写点东西
4 d4 g8 _% [. U& X3 e$ Z) i - JSR Init_Name_Table_Text/ W4 r5 j* \- R9 {1 A O7 n
- ' V/ R' H0 ?; Y9 {9 \: Q+ J
- JSR Time_For_Vblank
7 O: } r( k4 h- H1 r - ;开启PPU控制7 A! B; Y \6 Y+ o% [
- LDA #$80
+ q8 O5 Z7 M5 D) q& O; L( u - STA PPU_Ctrl_Buf
2 }* L z8 M, p$ W3 ^ - STA PPU_CTRL8 m3 Q4 s2 Z: X
- 2 o% l# m# l. |' ^( J
- ;开启PPU显示* j% P( H6 W/ I* h3 p. c) X: a: F
- LDA #$1E
+ T6 T1 W6 K" j0 f, T2 D# H3 P - STA PPU_Msak_Buf
, A$ f3 p# t) Q0 \. |. b -
; H. |) w; P3 K' C% [5 ? - LDA #77! t3 {& b8 [" H* B* b' n( z' O
- STA Sprite_0_Y) B8 ]' m0 e4 ~& P& W( t* x( t
- LDA #$1E
! L% J, _; Q. I - STA Sprite_0_Tile, P+ x: l4 m7 S3 o. X' \3 J8 p" U$ I
- LDA #$20
: m7 j. l, a$ @( d8 B9 A# |4 C+ \; e - STA Sprite_0_Mode- [- a1 ~- S* {( V! Z
- LDA #$00+ o7 a: G) Q# H& o% S
- STA Sprite_0_X
) q0 z0 m# W1 i) k' Y -
" j; S+ ~% W u' H2 T - CLI/ t. H$ r0 S* ^
- JMP Loop
' h8 O9 G& _) u$ S) X+ O, t - 4 t& i& m7 g! Y
- ;==============================
$ F- x. e+ Q- L" L: L# g0 \8 W - ;死循环, 等待NMI中断9 f1 `0 D8 \: j$ H- Z, V7 x4 {
- Loop5 A; U* W: M, i# n/ A# @1 G. B
- JMP Loop
4 H9 k" L' v7 f: g0 ~" j, D6 H
$ _ O1 P6 c. O( W5 e8 |, w0 k. p; K- ;==================================================
! N/ p$ t) Y) C - ;NMI中断处理 r; n( Q) t% v9 x8 r5 ~
- NmiProgram! s4 Z; K/ p6 N
- PHA$ B4 K) L& G3 z4 A; g, @
- TXA, U6 V* z" ~: C: i
- PHA H& ^" C l6 D; r9 K9 n) X
- TYA
8 O, ~. d7 G3 j8 N, F( i - PHA
. [3 ?% }7 G, l' \: a -
$ Q/ l. u8 J) v# u6 `- n - BIT PPU_STATUS
+ t) ?; G) \& u1 o" U" a - . L+ m+ s; n% O2 F Y
- ;关闭PPU控制
, Y. f( X2 t- P, G8 S1 { - LDA #$00+ O& N6 F' B! y8 D4 ?9 @
- STA PPU_CTRL
0 h9 O6 u" ^! ^& m5 L2 b - 7 e' b* N1 K+ T3 h9 N* _9 `
- ;处理PPU
! G0 r1 B; g x S" m - JSR PPU_Process
# s6 q# M+ N% P7 u' @5 T# X - 6 _$ G8 Z- \8 Q# m$ S
- LDA #$00
% e* T/ T+ y' M9 W - STA PPU_OAM_ADDR
7 k5 B( i6 H! E - LDA <Sprite_0_Y
3 Y+ A) k4 Q8 b. `) o) Z - STA PPU_OAM_DATA7 V& `. g ~. b+ t: p6 T
- LDA <Sprite_0_Tile
' k4 }" ?0 X* \; p2 w - STA PPU_OAM_DATA
4 I/ _6 L. l% q - LDA <Sprite_0_Mode
- c" r$ Q+ H6 v- _$ g - STA PPU_OAM_DATA
8 P2 e5 W* s( P/ {8 X& x - LDA <Sprite_0_X6 r4 `7 {, [1 P7 r
- STA PPU_OAM_DATA B' i0 [' }5 m2 L+ z' P4 J
-
- T% g) z8 e% _1 o - ;开启PPU控制 k* }6 D/ n, s/ n
- LDA PPU_Ctrl_Buf
. N; j2 Q0 C) O2 W* b - STA PPU_CTRL
- r% B( v# N: h3 X - * y: ?! t0 Q, J* D
- ;屏幕滚动
! b$ a+ }8 e* L5 k) n - LDA <PPU_Scroll_H
0 O4 h W: h. R. R* ]! ? - STA PPU_SCROLL7 S' t9 a9 v3 ]- F! Z5 k' m
- LDA #$00) x3 ?4 o# Q/ B2 Q: y6 X
- STA PPU_SCROLL7 ?# H3 { q* x/ n4 u E
- 0 {& A) D& M) b; _% m6 H
- ;手柄处理
( u# C4 ] S! J5 i - JSR GamepadProcess7 M- l! v) q' L- a1 X) u' r
-
2 |! |* s- u5 S6 T( f( v2 b$ ` - INC <PPU_Scroll_H
9 ~! v. `! Y! Q/ C% g' g+ Y& g7 Y' e - 9 d1 z: {1 i: k1 l8 f
- ;启动0号精灵碰撞检测) d% T" e. ?2 G+ R8 q# I( P
- LDA #$01
5 d. e7 \, `7 f2 H/ ]( G - STA Sprite_0_Hit_Move_Direction
- c4 g7 }' i" w - JSR Sprite_Hit_Test
! ~7 R' J- n0 l - ! R1 C* ]* P( I T( A& H s
- PLA
/ e, s- y1 |) v8 Y4 x+ U - TAY
$ o7 ]% T; J$ c0 P - PLA/ t2 A/ p% m$ Y
- TAX0 G" D. A' `- |8 K/ z9 u+ m
- PLA" v, B8 c: v: T+ n0 X; d( U! }$ d: V
- RTI
+ t5 ]4 i1 D5 P# n; ^4 K6 I - ( h% P6 S V% C* m
- ;==============================0 A7 V) u8 M! o) U: j% i# n
- ;0号精灵碰撞测试5 n6 R2 `1 c- y4 P0 T! ], m
- Sprite_Hit_Test u2 j- L! P2 x2 l
8 @8 k! h& T- J0 J/ `8 |- ;------------------------------: f. R8 C. x5 m( {
- ;等待0号精灵碰撞状态取消& D8 C9 m3 [. Z: K3 e
- LDA PPU_STATUS3 h' q" |# j) w% m. U- D/ W
- ASL A
7 O" `, X5 f- O/ D8 H5 ~8 G - BMI * - 4
( C4 e# z# X$ ]- c -
* b `( P5 J) B" r3 o, m - ;------------------------------; K3 z1 S7 G0 U
- ;等待0号精灵碰撞发生
. T8 h2 T! K$ [) x& s/ a - LDA PPU_STATUS
3 f7 [8 w( ], U# A - ASl A
U, B# }: \: V t* w - BPL * - 4
; s' ]- x6 k* S5 T4 ]' ^ - 7 U; m2 a- m/ ^- J2 Y$ o
- ;------------------------------
9 U# j, [8 t9 f* B - ;行消隐等待
5 |1 w$ A" Y* R8 }3 ?8 I1 M1 c - Sprite_Hit_Scroll_Wait
3 E# x' b/ C, B( ^ - LDX #$28- u4 L0 @$ J5 T3 R+ _9 l6 h' f- L
- DEX$ X8 S! j1 _* L4 ~( p
- BNE * - 1
3 f$ y4 O! s! n( M - $ t( Y* N- D; h$ t- c" f
- LDA Sprite_0_Hit_Move_Direction8 Q7 z* n/ E. z
- AND #$01; o8 o+ v3 k6 v- ~: }
- BNE Sprite_Hit_Scroll_Set_Right$ g3 r+ L* {0 ~0 ?8 X
8 P, `1 K, W2 U6 Z$ @& z/ l9 |: E* D- ;------------------------------; L9 D" K V' d" L5 Y
- ;分割画面向左滚动
# L' O% U4 e3 o6 \& O: \0 [ - Sprite_Hit_Scroll_Set_Left
: L$ O+ N3 `2 {: w2 J$ H7 ] - LDA PPU_STATUS
/ o/ o4 R, b7 t4 c( a* R' k! @3 r1 k - LDA <PPU_Scroll_H
9 \+ B& f$ U2 D, \7 s H7 X - STA PPU_SCROLL: G; Z. N+ T. n% e! O. T6 I
- LDA #$00. l+ ?. b1 a* _% D" q' t; q
- STA PPU_SCROLL/ E* O, P+ [1 G% q
- RTS: P; ~ F9 k$ R
0 h) w- x/ _( ], s6 ~. d- ;------------------------------
$ d7 Z, G% @# [! B$ y - ;分割画面向右滚动
/ W0 v5 l; u( H3 {* Z8 w - Sprite_Hit_Scroll_Set_Right
8 u t' q* z9 L' T; F2 X - LDA PPU_STATUS
; y' R( I6 e6 q) l$ v" r% `- _- m% ^ - LDA #$008 c6 d+ r: o2 @6 W
- SEC
# ^! P: n! O* ~2 p% V - SBC <PPU_Scroll_H" h) X* P% @( N6 P* L4 I
- STA PPU_SCROLL% C. H5 @1 @& W( G4 h
- LDA #$00/ ^. O2 ]1 J# s2 `% S8 H& ^6 v. V
- STA PPU_SCROLL/ e6 ?5 r, | w: k8 [
- RTS- c# A$ n# X0 x& r+ O
! J1 K2 N+ x: N. c- ;==================================================) q2 _8 l9 {% G8 W) f5 I8 B ~* ], I
- ;IRQ中断处理( H. C; H7 j1 U
- IrqProgram
2 V- w! K9 b( ^7 W1 O, o1 A - PHA0 |5 x' X& O: l1 T& h6 C) ?% }
- TXA: R$ n+ d( ^1 _4 {* Y; @6 e
- PHA& M$ B$ D8 k: a( l
- TYA* E* z' V2 L8 K/ m" o1 I
- PHA
* t4 U# j/ K! d+ B. u -
& F1 `2 V( O) j0 m - ;关闭IRQ. r7 N! K& _0 x/ C& m8 o, y9 X
- STA MMC3_IRQ_DISABLE
3 S+ G1 t1 L* q. b3 o -
+ H# Y8 s3 X4 R2 R) q0 T - ;允许下个IRQ触发 y5 B0 _: v" m7 n
- STA MMC3_IRQ_ENABLE
+ z6 J3 e3 ~) H8 B" n/ A - 4 C2 `' H* v# }' }
- ;IRQ处理, 15线后继续触发
2 m% J5 Z# I! u - LDA #15
1 j- |; T" b% i4 V - STA MMC3_IRQ_LATCH
( W6 ^6 l Z0 s6 Y+ p -
; c% g9 X3 M; ~ - LDA <IRQ_Index( C9 b. Q4 D& T# J [, x
- BNE * + 4/ K2 H. |' D2 q0 e5 |( M
- INC <PPU_Scroll_H
2 p+ t, W: v- n6 N7 \! [) r - ' g$ o5 F/ x0 j/ x
- ;设置屏幕滚动
) ], r, H" p7 v. l% U - LDA <IRQ_Index2 d& }4 _6 O" O: _ V4 B$ ]5 F, f* L
- AND #$01+ I5 k2 r- Q" s0 |: n
- BEQ Irq_Scroll_Right" c3 ~- q+ p' Z8 {( ]) d2 B
- 2 F0 J" [6 t+ f) N: E# A) v& R
- Irq_Scroll_Left7 o- g- R! T* }9 b1 v! m# n
- BIT PPU_STATUS" Y2 Z; C9 W/ P" |# p
- LDA <PPU_Scroll_H
& u. K, D; l, x/ {9 m - STA PPU_SCROLL0 |% D, B% t7 U* q2 O" `, A* e
- STA PPU_SCROLL
; q; [! ~ z. F7 P9 W" P* b/ ~5 z - JMP Irq_Scroll_Over
) b0 `# z0 ?1 J) t& P. h Q -
P" z! Z+ P" |) O - Irq_Scroll_Right
$ I8 z" ~; R- u1 R. f - SEC
* m1 r1 s, x7 I - SBC <PPU_Scroll_H
9 q: z& Q5 `( D& ]: P0 K R: X - STA PPU_SCROLL% z# B- ]) l6 u& S+ P5 ]
- STA PPU_SCROLL
6 _6 o) T! ~1 ^* o7 G8 q' g K - Irq_Scroll_Over u' g0 K# E$ r6 g9 a
-
E7 q: F- C! y! ? - INC <IRQ_Index
( F! N& [( q3 v, k -
& g( R3 Y7 ^" m6 c0 y# }, O - LDA <IRQ_Index5 W# Q/ c. i% X/ e
- CMP #14
4 g3 d5 a4 d& `& I1 p+ } - BCC * + 59 z4 f% Y8 y- w; n
- ;关闭IRQ! Z8 Q$ H6 L1 ]8 H5 z" j
- STA MMC3_IRQ_DISABLE- d# c" v% r5 F
-
5 A+ P; Y0 Z' x1 I8 v# Y - IrqProgramEnd
/ O" q# q8 P+ U$ @* h7 p - PLA" L# X9 G6 q1 M/ S1 ]0 g& H3 b
- TAY. x/ w" [/ }: J- S! v' {+ N
- PLA' M1 `! G$ x' D" l
- TAX0 o3 u" ^( z3 G9 C& k
- PLA' Z% }: z+ N( Z; Q8 ~
- RTI
5 K6 w$ d4 q5 ?7 r5 d8 F -
+ F' A, W& o% d* G' P - ;==================================================
$ O0 @7 Q; }5 ~ - ;中断表
) S7 P, \$ i/ ~4 J- v$ R - .ORG $FFFA
! X$ i$ q( ~% @9 W - .WORD NmiProgram
5 L8 C ?3 g A1 } - .WORD ResetProgram! r: y" v! \- `; `* W6 F
- .WORD IrqProgram
复制代码
' `4 Q3 f/ v+ ~7 a |
评分
-
1
查看全部评分
-
|