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