|
- ;[FC][MMC3 精灵碰撞]1 P5 x( n2 j' k& X
- ;FlameCyclone 202307100 i( L: y& x( g6 G; B4 s
- " G6 b/ E0 n( {1 y
- ;文件头1 ~+ P {0 I5 W7 H# @) F
- ;======================================================================
/ I# j( N/ u( C7 p - .INESPRG 4 ;16KB PRG 数量8 \. \8 I' S! W
- .INESCHR 1 ;8KB CHR 数量
; @2 Z0 x' G& Z2 ]5 F6 d9 p - .INESMAP 4 ;mapper 4; A, u# K" b2 O" K+ {6 V7 r/ h
- .INESMIR 1 ;命名表镜像 0水平 1垂直% q! u: t7 a. f) ^. f9 ?) {6 d2 D
5 Q# c4 @$ F. A: H2 Q2 h2 m8 A- ;必要条件
# N0 e2 f0 }; m) b9 w8 U - ;1.持有CHR ROM/ P0 b/ w% L y4 ?+ S" m- Q6 |
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
! I6 @9 F% Y. {+ K; @5 [ - ;3.精灵内存(OAM)不为空. R6 l+ G& h0 G2 p. n/ {1 y
# `# h0 n9 H+ X, @- U- ;==================================================
4 n; Z2 k, v/ }0 E0 ~$ ^ - ;NES端口常量/ {, i& l- t. H$ `+ j6 ?
- PPU_CTRL = $2000 ;PPU控制寄存器
) z9 a. e: d6 E9 j4 m - PPU_MASK = $2001 ;PPU掩码寄存器+ Z4 e. |4 }! q" d$ m+ r
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
' K2 a: v0 g# T% R6 ~2 l - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加11 Y! ]7 |2 N$ [/ ~$ L9 m1 g ?8 B
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
2 Q5 l V/ }% l0 n2 s0 P* Y: O- e% X - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 % { @; s6 O# n0 h/ M
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
+ A7 w8 G, N% V+ c - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
. c! A. N4 i, N4 V2 n6 H+ k - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
* B u" D' i) { - APU_STATUS = $4015 ;声音通道切换
0 R0 v2 l2 h7 N4 V/ I( F, q* Z - JOY1_FRAME = $4016 ;手柄1 + 选通
" r: z+ W3 g' K - JOY2_FRAME = $4017 ;手柄2 + 选通
9 f! X- k9 b! R - * o8 H X0 w5 Z/ X. ~2 G* S1 m
- ;==================================================: M; H! H6 M$ N" { a4 J
- ;MMC3端口常量
0 w: a( L! m) y+ U" \ - MMC3_BANK_CTRL = $8000
* v2 p. S% G* W3 y- Y - MMC3_BANK_DATA = $8001
, ~* u( f2 P. @ - MMC3_MIRRORING = $A000) T/ ^" }4 J# C4 u* X5 @
- MMC3_PRG_RAM_PROTECT = $A0017 w9 p7 ]) `: Y4 P# r
- MMC3_IRQ_LATCH = $C0009 f* t4 x5 X1 E% w6 G9 U
- MMC3_IRQ_RELOAD = $C001+ Y; U7 U0 O4 s0 ~) U
- MMC3_IRQ_DISABLE = $E000
4 l# d2 D# v0 l5 _6 I$ |5 d O, X - MMC3_IRQ_ENABLE = $E0016 D8 @; e: }1 C5 \ z
- 0 F- k0 Q" V0 B& s. o+ t# P* L+ C. n
- ;==================================================1 k7 H8 `2 @7 c" _ e8 u: ?) ^2 A) x+ `0 E
- ;程序块配置* T, v, k4 }) H$ R4 ]; I7 b# `9 x
- BANK_DATA_MASK = $07
/ j& l7 Q3 V' R! U - ;--------------------------------------------------0 n0 d. @! R" o4 e1 M
- RESET_BANK = $07# V# G$ `/ P! [: L" {
- RESET_ADDR = $FC006 x7 k+ Q0 o8 b3 I0 _
- 3 e* ? O4 R9 e0 L- I: B8 c2 A
- ;==================================================( e! S- I) b6 S' N5 B# t
- ;图像块配置
# i7 u0 G7 F/ C2 H& F - CHR_DATA_BANK = $08
( |6 M) z% v7 l, N - / _! X" J, P( V) I% ~5 N
- ;==================================================
! }2 ?3 _% N1 \% q - ;零页内存地址配置
0 i/ W D! `& u6 B5 A. X - Use_Ram_Addr = $80% F! I$ T& f: N0 w
- PPU_Ctrl_Buf = Use_Ram_Addr1 ~- B$ X9 U9 Z5 n
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01
V5 @! E5 S0 r2 ^ - PPU_Scroll_H = PPU_Msak_Buf + $016 L# _+ p1 R: c3 W- K- U3 v3 y( N
- PPU_Scroll_V = PPU_Scroll_H + $013 {, F) ~2 W2 i% c2 t
- FC_Data_L = PPU_Scroll_V + $01. R: |& q8 C$ n8 O! N
- FC_Data_H = FC_Data_L + $01
% q7 J+ U: W2 p! E - FC_Data_Buf = FC_Data_H + $01' h0 i ~7 e5 N- Z# K+ @8 F! ^0 {
- ;==================================================
6 k. n9 t B. F8 f7 y R. U- r - 5 p9 V* B' O3 k% [* L) O2 s. h
- GAMEPAD_MERGE_FLAG = $04
; A7 q/ s, W2 n8 ?, \
- j9 a# P8 r; B' V* Q! X- Gamepad_Keep = FC_Data_Buf + 19 p$ ^" \# O: U( A
- Gamepad_Once = Gamepad_Keep + 28 y1 t8 P. V s
- Gamepad_Temp = Gamepad_Once + 2
1 W; ^$ m6 n2 H! U! s -
2 Q0 P5 D- Q) F! Z' |4 F( L$ d! x - Gamepad_0_State = Gamepad_Temp + 2
( D& B: h/ n. I" x; X - Gamepad_1_State = Gamepad_0_State + 10 |' x6 e2 _6 Y0 S9 B7 N" p
- Gamepad_0_Value = Gamepad_1_State + 1
0 k% s& C: M9 r7 H+ Q" n - Gamepad_1_Value = Gamepad_0_Value + 10 h1 I6 U, x" \/ t& E
- Gamepad_Port_Value = Gamepad_1_Value + 1
; r+ ^. j7 G2 K N- q - Gamepad_Merge = Gamepad_Port_Value + 16 E7 ~% r. Z) n! X
$ m6 o! y/ A3 j/ y, C- ;==================================================
7 H2 u5 W) y" O9 O' N# l; ] - IRQ_Index = Gamepad_Merge + $01
+ x5 i6 }# { g/ F4 h$ s# x8 Q* W7 ` - Sprite_0_Y = IRQ_Index + $01
& L$ j' c+ i8 h C - Sprite_0_Tile = Sprite_0_Y + $01
) y) S7 t6 n! l' p% v, c - Sprite_0_Mode = Sprite_0_Tile + $01- ^! A( Z$ T% a0 Z Z2 t
- Sprite_0_X = Sprite_0_Mode + $01
- {0 y" x$ }1 z! D4 _8 m X - Sprite_0_Hit_Move_Direction = Sprite_0_X + $01# k9 N3 _5 O" e- ?- p1 _2 b$ I" E
- ;==================================================
! E5 a7 Z, |) L' [! t$ h& V
0 j/ U. L K8 f- ;CHR图形数据
* b$ O+ d- |) D9 t5 F- L - ;==================================================2 f7 l: g( y1 K* \
- .BANK CHR_DATA_BANK
1 |2 ~( q* X. ]9 q( Y - .INCBIN "chr_bank/chr_data.chr"! S; [: d6 X0 P% h8 D+ v+ `
-
' W& u; I7 C' s; `$ R( z - .BANK RESET_BANK & BANK_DATA_MASK4 e+ R! |& O" b2 ^: _& |- f" F8 h
- .ORG RESET_ADDR/ N9 N; X3 _/ T' J @. C' Y2 z4 Q
-
( f) B) e6 p; [# H* v' L - ;--------------------------------------------------: Z5 J ^& @8 G9 p. D1 {
- Attributes_Data0 u% w' o: s3 D O3 c4 c# ]
- ;命名表属性
9 t( t2 [0 K3 n0 s. t7 x - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00+ Q- S$ H; U& X0 Y
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA2 i/ L8 d( c9 c5 ^" z$ @. L2 I+ z
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
/ A" ]! u" X/ ~* J - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
! h* R2 ?$ C% }' b - ;--------------------------------------------------4 e, d! k/ ~4 T: |' ]# D
- ;调色板数据
+ ?" f3 ^/ D x( D - Palette_Data
/ `4 e( ]9 W8 U - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F0 N! W7 c' ~4 W+ u& ^2 R
- .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F- ?; X8 _% b: M+ n0 d! D
- 9 l( C1 d! H- d" c
- ;==================================================- W4 x! \/ R1 ?( x# u' Q4 L
- ;命名表初始化
9 `7 Y* [' C! a! u8 }& u; V& U - Init_Name_Table
8 A4 g! E* c% F+ z& a0 v$ Y ^8 g! C, X - LDA #$20
* n8 [. ?8 i) o v - STA PPU_ADDRESS; q0 L% m1 g1 G# \+ D/ k
- LDA #$00
- Q% h# j$ ^! t - STA PPU_ADDRESS
8 F9 q2 G% m! ~, }, h - LDA #$00# B1 G. j4 p" W/ @; Y) a5 f. p
- LDY #$00
. l6 a( y' U$ z; b - LDX #$10
; \$ M2 f. e! x! {1 y' U8 r1 m - Init_Name_Table_Write
4 m; L3 U/ j+ ?+ X' T. T - STA PPU_DATA2 d( `# c0 E4 b' q; `5 A
- INY
! k) b: g, x& h8 H8 x* f - BNE Init_Name_Table_Write0 }0 _2 {+ g4 t& `8 V3 j
- DEX2 ^ Y: ? y7 O$ c. o) L0 J0 l
- BNE Init_Name_Table_Write5 I# g3 b- Z& `! d& s
- RTS: }! n6 o X: o3 b7 w! o N
- + z/ D" o/ y8 k5 ]- {0 Q
- ;==================================================
5 p' e' W% D5 t7 o% |2 Y7 ~ - ;调色板初始化. v8 ?8 X: L p) @$ \
- Init_Palette
* k8 p. G K# `/ f - BIT PPU_STATUS
) A! f% }; l; o5 ^! v9 b: { - LDA #$3F
" ~ A# R5 \5 n3 h2 ^ - STA PPU_ADDRESS
8 A0 x% _3 C& M0 U" y - LDA #$00" G) L. f, V3 C6 w2 |5 H/ G
- STA PPU_ADDRESS0 e+ c% J& l4 [
- LDX #$00
. V/ D) n S/ Q2 q - Init_Palette_Write
( g8 e' h1 M' p4 m" @( I - LDA Palette_Data,X
% L S6 N1 r2 W9 b% Y: h - STA PPU_DATA6 \, a6 B0 J3 L n. b
- INX, q/ H1 w9 M, F( w$ {
- CPX #$20
. ?& ^. [! j6 ~ - BCC Init_Palette_Write# L9 j; Q J$ N; U+ R
- RTS* }$ B1 X8 q- V. J! A
- 2 X: Z ?9 h# a6 E
- ;==================================================
; m: T7 ^$ f2 c% m# m& f7 R( J ~. v - ;设置命名表属性
: v& T7 j1 t5 K$ B: i X4 @ - Init_NameTable_Attributes) ?" a* |& P3 h' P/ B
- BIT PPU_STATUS
& l9 M1 n/ |8 N0 W# r* d - LDA #$23
4 O8 b0 g' {& b# l! v: t I - STA PPU_ADDRESS
4 E& Q( P' J- x9 `6 E - LDA #$C0
! M- x2 z* r3 Q- I/ Q - STA PPU_ADDRESS
1 l$ I0 e$ e8 g5 R% @* w2 B& D' W, u } - LDX #$00
' S# C# U7 P2 l - Init_NameTable_Attributes_Write
# b( A' }( h2 l3 Z+ D - LDA Attributes_Data,X6 k" y1 ?& L2 N/ z
- STA PPU_DATA
; g [" R" z+ ]% b* l1 ^3 D - INX
: R# v+ I% D' L, [( P( y' t - CPX #$40% n! A% Q- A r9 [) a
- BCC Init_NameTable_Attributes_Write V$ t# N& ?" i
- RTS( U4 {+ m6 r4 G! \4 P
- * O+ l4 n% e6 x
- ;==================================================6 t+ h1 b( o0 B) | m
- ;初始化命名表文本
6 {$ P C) s- h J - Init_Name_Table_Text. }+ P4 H% A, T" i
- BIT PPU_STATUS
( Y- `9 ?9 m3 o - LDA #$20: Z6 Q3 b4 ?4 n* H: H# f$ g
- STA PPU_ADDRESS3 U, x$ _/ e+ R) W6 D8 c- e
- LDA #$00
/ e3 f! w9 ]+ L' J/ e - STA PPU_ADDRESS" ?2 ]% r z) U( T- ]: T" K5 |" r
- LDA #$005 k9 X: q# e* v8 ^- a& ?
- STA FC_Data_Buf
+ n1 y, [- ^+ p0 H - LDY #306 Y& m ?# `6 |6 o& X: _3 v% |
- Init_Name_Table_Text_Write9 f1 c5 r+ u9 U5 ?& Q+ S O \4 r
- LDX #32
7 F5 `; A4 a* g; H8 n8 {1 s! [7 q - Init_Name_Table_Text_Write_Char
* A& h& v% T+ E& }) E8 U) A! I - LDA #'0'
# G) ?- \8 b: ~6 X% a) l - CLC* l/ O* }" R1 Y8 W( R& A$ P, @$ G& ]
- ADC FC_Data_Buf
" {/ {2 z! b- a8 S - STA PPU_DATA
' |: {; k& @) S# X* z - DEX) E3 L I* x9 p, v, j( e
- LDA #$14
; h5 o, N1 E& m* W9 e) q - STA PPU_DATA
/ y3 R N/ \& H' ]0 x% j" M v6 b) I - DEX& M( O3 H* G+ [1 d
- BNE Init_Name_Table_Text_Write_Char
; K; c+ b8 B* Z. {' i% Z/ @/ l - INC FC_Data_Buf( W* e& q9 @$ Y+ b* J
- DEY4 W& G ?! p9 ?& G7 r
- BNE Init_Name_Table_Text_Write9 L$ h1 U. o: [
- RTS
$ z7 ?/ S( `3 r, q8 W7 [ - " d6 h& S0 w5 @! J1 k# e
- ;==============================
7 ^8 `/ G" C; v' u8 t! e' ^, ` - Init_OAM_Ram;初始化精灵内存
! m8 k$ a( T I6 B( Y7 H$ c( } - LDX #$00, b7 n5 P" o1 X8 j6 ]% W' e
- LDA #$004 N, m9 V( S# i4 m z: ^
- STA PPU_OAM_ADDR
. z* k" ~% ~" q, j7 }/ u- Z - LDA #$F8
, A8 s3 y% } J - Init_OAM_Ram_Write6 c/ Q3 G/ G. \+ r
- STA PPU_OAM_DATA
S; Q$ S, d2 T9 ?; L2 c! n( k - INX
! i R6 f- w* @/ T; E, I - BNE Init_OAM_Ram_Write% r2 a9 H( n y- j1 I
- RTS
8 j" {5 j- \4 f" o: ^ - 2 v- g1 W" E' U& }
- GamepadProcess;手柄处理
) \- y( I2 S3 Z5 r$ p - JSR GamepadDatacan0 [. B7 Y# u( z1 F% O
- LDA <Gamepad_0_Value
" y, Z! ]& o6 E7 a2 \ [2 N* l6 A - STA <Gamepad_0_State
3 O3 r/ }2 |- d7 U# s+ H5 [9 { - LDA <Gamepad_1_Value% N; x1 I: D b2 p; N3 c
- STA <Gamepad_1_State
" |" E9 Q+ j9 g P - JSR GamepadDatacan9 t" t( ^0 Z. m
- LDX #$01
/ I1 m+ i- _1 f5 p) L* x - GamepadMergeCheck;合并手柄输入检查
4 J/ w8 P8 }; C$ W - LDA <Gamepad_0_Value,X
4 i, o* R- t" S8 S1 U5 b0 ^6 d* A" I - CMP <Gamepad_0_State,X
7 l. |' l2 r" R) \ - BEQ GamepadMergeInput$ a5 [4 L0 S: s
- LDA <Gamepad_Temp,X- c! [% _8 Y+ D; \; e7 `
- STA <Gamepad_0_Value,X2 P* W4 l' G v0 h# C3 e0 h9 `( ~2 k, _
- GamepadMergeInput;合并手柄输入
3 S# w3 I8 H; ~ - DEX# S1 Y3 B* r& o: e. q+ s; I
- BPL GamepadMergeCheck" \0 Q$ V ^8 S8 t4 |
- LDA <Gamepad_Merge
: Q: z; D( Y, T, z7 f3 v2 z6 i - AND #GAMEPAD_MERGE_FLAG8 o. N4 U! L5 E: R& _
- BNE GamepadStateProcess$ A5 ?6 {1 B4 i% ?1 O! ^
- LDA <Gamepad_0_Value
! g9 k$ @4 a; m, f1 z - ORA <Gamepad_1_Value) w' \" O$ ]- Q
- STA <Gamepad_0_Value" y. V8 b* x# J! v; h+ q) v$ e9 L5 h
- GamepadStateProcess;手柄状态处理) }. P4 m3 C( t! C8 ~* h) \% a
- LDX #$01* B, |/ w, {8 B0 H4 i
- GamepadStateSave;手柄状态保存
g O4 b) `8 ]2 L# \+ t+ K' ^% O - LDA <Gamepad_0_Value,X
# b7 v! U7 j. c% x/ X( B; `' G' N+ | - TAY
6 b0 X" x% q, Z4 n - EOR <Gamepad_Temp,X
, _- y% c$ `0 J' D - AND <Gamepad_0_Value,X
; x2 b# F9 Z8 |6 V2 t+ D - STA <Gamepad_Once,X
3 ^/ b- H$ T! N# [8 o - STY <Gamepad_Keep,X# b& v" h# Y* ^! a, L4 o/ K/ n& e
- STY <Gamepad_Temp,X( e# i4 F: N D7 n4 D
- DEX* Z: j: j; @5 M1 ]: I
- BPL GamepadStateSave: b2 l" V4 ]7 K9 S- x$ f
- RTS8 ?; m, [( j1 [" {1 o5 }
- ( @# q) O9 a, f: _% b1 Y9 w5 y/ q
- GamepadDatacan;手柄数据扫描5 h# Y- Z$ X0 v7 e
- LDX #$01
) u* e& U# h( i5 j% V - STX $4016
+ `1 z- }, i" r. A - DEX" Q! ]$ b" `' z. @1 {
- STX $40164 x4 ]) _5 d2 ], U5 m$ q P' G: y
- LDY #$08
6 D6 C7 e0 v; K7 o - GamepadPortScan;手柄端口扫描 S7 b! T7 ?$ q7 E0 y" V; S
- LDA $4016
; o& Q( L) Z9 E$ D; ] - STA <Gamepad_Port_Value q. ]3 ]; \2 m. P8 o& f" B
- LSR A
- D0 t: X4 V6 n: r0 U! G( Z - ORA <Gamepad_Port_Value
/ v6 X7 b. t' B% l# o& H - LSR A2 W! @: i3 s3 \ ]4 r6 i
- ROL <Gamepad_0_Value
! x" p" c& S2 z3 X# Y2 z$ p - LDA $4017. L9 |9 k$ {, M1 w
- STA <Gamepad_Port_Value
- g/ [5 N8 |9 t" C - LSR A2 L, I# i- `9 [/ R0 W. A1 \
- ORA <Gamepad_Port_Value# ?* N" O' }$ `& {4 d8 ]4 A5 E
- LSR A
9 u7 T" g8 P- d0 |2 X - ROL <Gamepad_1_Value
; c, g2 L: t! n/ a7 \- j, H - DEY) T/ q, i8 b3 c, S- i
- BNE GamepadPortScan! s$ m* E/ h! {( }+ C$ `4 F
- RTS
4 K* G" y! V# R/ @+ H: j - ; ]) ~) F0 U3 ^( b' c7 r
- ;==================================================! \# a& O, ~* [, p6 U& Q6 C# s9 J' M
- ;PPU处理
' o7 n7 q$ C& V d7 L* e( M9 z' a& Z - PPU_Process0 ]' N J, @5 J# ]" D5 K
- LDA #$00( s* ^" t0 m5 y/ E. w; M
- STA PPU_MASK
. A& K/ H7 j; D5 Q1 y4 {) f' ]) Q$ T -
5 v( p0 z. \. _8 a' W3 K. u# g - BIT PPU_STATUS
4 H5 e9 t U$ z" a8 `& [: M0 H& k - LDA #$200 g: p& q, T( _1 B+ ]
- STA PPU_ADDRESS
. m' ]- m# J+ i, [6 r - LDA #$008 F- v1 n: T/ B$ ?& M* A$ p
- STA PPU_ADDRESS2 V& x7 E. f8 w5 z4 o+ X/ j4 t
- 4 L4 N7 j8 t; ~) G( J
- STA PPU_SCROLL* U) ~# j$ u' ]! W! W9 l
- STA PPU_SCROLL7 O& X. t1 F, H5 e; a D
-
R9 c! u/ l, y( Z u! l" X- p/ D - LDA PPU_Msak_Buf
6 _" J3 L/ R) I4 d9 c# Z3 I - STA PPU_MASK3 B1 y- P+ P. L8 j+ m& q
( }1 W5 C) p5 w! E- RTS, ]# L" B3 P- ~, T3 t1 H9 m6 e
-
( \# |4 }- n' p( Z: k& ` - ;==============================
( R. f3 G# R3 D/ x3 ~- E g - Time_For_Vblank;延时等待3 o6 Z- o$ F# u4 F3 }2 c/ o
- LDA PPU_STATUS0 }: U& p/ T- V! ?- |" Y
- BPL Time_For_Vblank& N7 p% D1 y" h* W8 L
- RTS
' k; N1 r) o: o: a" @" V. h. @% S$ ] -
: @5 E5 i& N9 {. ?, L - ;==================================================9 b! [: L- [4 Y! R: K/ u
- ;初始化MMC3
/ H3 f2 r7 P* Z% P: K1 K - Init_MMC3
- \) K8 E( ^" I+ S - STA MMC3_IRQ_DISABLE
; {; S0 Z/ |1 S# b7 p! ]2 P1 E# S/ E -
; G+ X1 g9 h6 o S, K" {8 m! q - ;设置MMC3水平镜像4 H5 u+ _ J, _8 E. Z T
- LDA #$014 [* h4 X/ w. m
- STA MMC3_MIRRORING
4 K; o7 A- V$ H' d) a- z- `7 v9 g -
5 G% [' m) j/ S3 b - LDX #$05+ h7 C2 M( ~9 n5 K, ~# \0 ?
- Init_MMC3_Chr_Bank_Write
7 }, V/ ]& }8 v r - STX MMC3_BANK_CTRL7 U% ?0 a. P- q( ?+ a3 v, j
- LDA MMC3_Chr_Bank_Data,X$ K5 P" d: o1 U- O* T7 y
- STA MMC3_BANK_DATA
8 D# M$ L4 N( G$ r7 \* f! I - DEX
$ k6 P) e4 Z' _2 C5 R - BPL Init_MMC3_Chr_Bank_Write$ V4 ]/ h) G( \/ e8 h' A
- RTS
8 V" L. U+ g# d4 k2 G1 u- I - ;--------------------------------------------------6 w- c# |' E2 P/ K$ Q( I- g
- MMC3_Chr_Bank_Data
9 ~- s W# i6 n" v3 G; r! Y6 J - .DB $00,$02,$04,$05,$06,$07
6 i4 Q) P1 N) v9 p$ C4 J# O9 X' r G% N" W
: N+ L& r3 ~( p- C; t- ;==================================================. V+ ^; I: h1 V9 A; N+ G* `9 P
- ;重置中断处理8 W6 I1 w- c7 F, j w" _( s
- ResetProgram! m9 S) X% o. F4 u+ C1 B, H& V
- SEI0 T& Y: c. ~8 o. r& n
- CLD0 {6 H7 R. H$ [5 k; P* Y
- LDA #$00! O0 C+ K: L. F7 t8 f4 }/ X
- STA PPU_CTRL) c& ^' M5 r, o2 S' Y
- STA PPU_MASK
) u* K2 z* k+ r7 q; ?; [$ Q - STA PPU_STATUS
1 [1 \2 A V S% | - STA JOY2_FRAME8 Q/ A) l. a% T) A. f
- STA APU_STATUS2 k5 g9 S. A& }5 g" Q0 P; l
-
* I0 \: h2 [* ~* Z3 O3 S3 |" r$ | - LDA #$C0. f: L( L5 b4 x5 C" O
- STA JOY2_FRAME/ }' p) F( E: D. w# w# f4 I. o
-
- D6 t* {0 c" K( a4 ^% ?6 R - ;等待vblank) _" @ [' y' `2 X; c9 j& E
- LDX #$02* `0 c0 p; m( A1 p/ Q4 U6 S4 w q' w9 @
- Vblank_Wait_1" a' ^& D5 ]2 ~5 c. {" @
- BIT PPU_STATUS
1 H% `- g; w( z0 c4 ~ - BPL Vblank_Wait_1. k d& U5 w4 A* f/ X9 r2 n
- Vblank_Wait_2' ~8 Y( i6 j8 T/ n
- BIT PPU_STATUS( h6 ^$ o4 _2 ~2 Z% S3 V
- BMI Vblank_Wait_21 P2 A7 o& d* \- h5 C
- DEX
8 f; A# I# S, E) T - BNE Vblank_Wait_1
' {: k3 p: d# `% h' r+ O - . n3 Q6 l& q- a1 z9 `4 S" o
- LDX #$FF
9 }/ l3 o, C# b( k2 ]8 Q0 j - TXS
7 s3 K1 h' ]2 p: q$ Q -
3 k, W' _ t j" j - ;初始化MMC3
/ [' R7 W, H9 ^+ g) _9 y/ c- }/ z - JSR Init_MMC3
/ j' g/ \( g+ x7 K - ) g; A/ _1 N7 L4 e& c% h
- ;==============================) o! i8 ]5 A# P: J, d* C. i9 [
- ;RAM初始化% W2 d# \( w: q6 W9 k8 y4 w; z1 _
- Nes_Ram_Init3 i5 h/ m4 g3 F- ]6 X! E
- LDY #$00
* @0 h8 D0 d# U) { - LDX #$08
( x$ g e8 _: R$ G: H - LDA #$00
& g" X5 u" r3 z5 z& O - STA <$00& Z& S" O7 a: B# d: o( }, B
- STA <$01
+ v' p* a) C) w- V. A - Nes_Ram_Init_Write
9 U2 m' Z2 U8 ?% I' U+ n - STA [$00],Y) F, ?/ N2 P% x
- INY
% _8 J! }+ s3 g' z5 h' `3 P - BNE Nes_Ram_Init_Write
& Q: Y. k5 X6 y6 Z8 Y' S - INC <$01
7 y! ~6 a% ]( ?" `5 o9 f: [1 a \ - DEX
7 t! u- _' f* Z Q" I - BNE Nes_Ram_Init_Write
w& v+ r$ P8 V; u/ E& Y9 P' D -
: ^8 v7 G" Q3 T9 v0 ~$ ]3 @ y% O T( r - ;初始化命名表
' E; f+ |& ]3 X9 ~ - JSR Init_Name_Table
' j1 W% g$ @" {# _% w9 t -
7 U# z5 \0 |4 q7 z: z- p# q7 U" S2 E - ;初始化调色板! h* A- l! a. c$ ]$ f$ A
- JSR Init_Palette3 \6 C& f- p1 d! @2 N2 c# X. ~
-
% p7 h6 D/ o! } - ;初始化命名表属性
3 U5 B& ~8 P9 J1 L1 x# L7 ~5 J - JSR Init_NameTable_Attributes
, L G; a2 @4 ~7 I2 t$ F - 9 f( n: k1 `$ ]
- ;初始化精灵内存
! Y# Q! R" ]: G( f+ {* R0 k. @ - JSR Init_OAM_Ram9 u* X8 J" {; l, ?2 L
- $ |5 K" k: @. i/ L# I
- ;在屏幕上写点东西
, J) e, R* t# a0 v5 E# X- l - JSR Init_Name_Table_Text
2 I$ _( b; R% q/ ]1 J0 |1 Y -
- k6 y' {3 P3 X* `, i6 f. t. D - JSR Time_For_Vblank
. f2 I4 n4 ?5 L+ K - ;开启PPU控制
( R" Q- d- L; i2 }$ H - LDA #$80
: U3 }: z& v5 C/ d9 z/ e! Y o2 D* n% I - STA PPU_Ctrl_Buf+ c; ? J, b/ C1 [ a5 u2 _( Z" ]& K
- STA PPU_CTRL
/ w6 `4 f0 O* n2 r! r! X" d - 1 _8 G- Y8 E0 P0 A% n
- ;开启PPU显示
( ^& m" u' L0 h: j8 v2 Q - LDA #$1E
4 _# D5 U8 i1 h6 Q - STA PPU_Msak_Buf. Q* r0 S" h% a
-
1 F% j# |! o! K' \& ~ - LDA #77) ~$ F5 i& S& j& ] f
- STA Sprite_0_Y
B& O& `; F" \$ D- } - LDA #$1E
+ k. w9 b; x6 O( m, q3 P! v - STA Sprite_0_Tile2 `! D- j9 B+ I) `
- LDA #$202 D* ]: s. _, P4 s
- STA Sprite_0_Mode
" o: V: ^2 T4 | - LDA #$00
]6 J8 r( ^& E" E2 J0 @ - STA Sprite_0_X
3 L/ J3 `2 t" |/ l w( x - 5 y; N. J8 w. a; n
- CLI3 _3 t) }6 l( t9 g1 F: y+ S2 \* D
- JMP Loop! B5 I' N5 B8 \8 x
- , D! [& G8 j4 O# o
- ;==============================
( W I/ g4 \$ b, f) X; g6 j! T - ;死循环, 等待NMI中断- `/ T4 A& d' w& `8 r% Y: m
- Loop
( m* e: u {0 F( L8 h% ~ - JMP Loop
8 w) Y4 z+ w! P' L
$ e e) H1 f ?( ]- ;==================================================% q9 o* |6 u, x( q4 @, }) o9 k
- ;NMI中断处理2 }6 o0 t* }' k1 c: L
- NmiProgram
; t: `6 Z3 H" E d/ b, r5 _! x1 B - PHA
2 H9 Q. J. p0 i6 |" s! c0 [ - TXA
% S7 ]" V+ R" Y* g - PHA. V3 N/ O, p+ @$ ~% `0 [# C
- TYA, y5 `# s( o8 f' t) S' y, p
- PHA8 p4 q% X7 j6 b& s+ u# A; P7 q
- ( z) w8 D' q' D1 h8 b t% m
- BIT PPU_STATUS
# [; x9 A6 T6 B" A - 5 a; P9 g/ n. k$ q6 |9 u$ k/ b9 H4 S
- ;关闭PPU控制% K% k3 {; M6 f% i
- LDA #$005 A' A, Y, h9 ~9 h9 v5 M
- STA PPU_CTRL' y/ L4 |, A, k
-
/ R: K# }1 x! M5 b" S* @8 h - ;处理PPU+ o( L8 z9 n; @/ p) ~$ p
- JSR PPU_Process# ?) c6 Q/ I/ N. C$ o
- 6 c# R$ c/ F! l$ c
- LDA #$00
& h' [6 ]6 S& j% Z$ F; H& B - STA PPU_OAM_ADDR1 @5 A5 i, S+ E5 ~* X
- LDA <Sprite_0_Y
8 ?# R7 {, B1 X9 N! p1 L - STA PPU_OAM_DATA* h& S" A0 q I- \1 y
- LDA <Sprite_0_Tile& p, E% w6 H3 {8 I' Q8 z
- STA PPU_OAM_DATA
3 w* F* A% Z; u$ k$ X+ Z- k - LDA <Sprite_0_Mode6 q* s! L8 G2 A
- STA PPU_OAM_DATA
& G4 A* H9 N7 r7 ^1 v# [ - LDA <Sprite_0_X
8 N8 ~* E$ g7 N/ L* c! V - STA PPU_OAM_DATA) p7 t% k3 {2 l; ~
-
. D6 H+ [+ I2 [ - ;开启PPU控制6 x5 @3 u9 q- i' V& i) r7 ^
- LDA PPU_Ctrl_Buf) y3 T- e! q+ B: d4 l
- STA PPU_CTRL
! P7 I* V& x0 Y2 \ - 9 W) d8 p7 H7 A+ ]& V0 M% ] V% k2 ~
- ;屏幕滚动# }5 C5 u! I1 t9 G& c
- LDA <PPU_Scroll_H
5 g8 Y T4 z B" U; P4 D2 J - STA PPU_SCROLL
& B/ V2 W' J c3 e - LDA #$00; l3 P) f( _/ u4 m4 f: j' Y
- STA PPU_SCROLL
Y+ c1 Z7 q+ c1 v$ y6 j' d9 V - 5 M6 K8 _ \* {* L+ \5 S
- ;手柄处理. [" l2 Q' D4 B# d- y
- JSR GamepadProcess
. `4 Y& Z( W1 k0 }7 o& F -
7 g- y6 u* |. D, X - INC <PPU_Scroll_H6 T7 k* l; ]3 C4 w, ]8 d1 Y/ C/ a
-
, y" K+ t. ?; G% r9 T - ;启动0号精灵碰撞检测/ X7 r4 R' D# h* t: s
- LDA #$01$ D1 K$ n) g( c" v( c
- STA Sprite_0_Hit_Move_Direction: c; h- r7 W4 S* n2 v- W8 @
- JSR Sprite_Hit_Test0 w9 c: t5 y# Q: [4 n
-
6 B1 S: ~/ C- ~- B5 ^7 ^3 ?5 I - PLA
5 |6 H5 l9 q4 s9 D - TAY
5 Z: s- E, W! y - PLA+ T% T+ o/ p R, _- I8 _
- TAX5 g. u+ ]7 I1 {* J; E1 B
- PLA- }: b& N5 x; t5 U% D* p0 Z, J* R) h8 q
- RTI' P8 O! w# \; c
- ) G, a6 }: a/ ^: v) d! `3 E
- ;==============================* t% H; P0 t3 ]$ M6 @
- ;0号精灵碰撞测试6 V" d* v% Q$ t9 Z; v" u9 i
- Sprite_Hit_Test
]+ j( Q. j2 P) f. B. ~4 P/ u- a
& t$ y& ?( U5 F- ;------------------------------
3 E" E; q4 |5 {) W5 |. f3 T - ;等待0号精灵碰撞状态取消
: M7 L. {$ ]/ s3 _4 ^9 c - LDA PPU_STATUS
- W) a& i. E$ p - ASL A1 a+ V# f3 I7 S+ X6 B l
- BMI * - 4
! X4 T$ I3 d/ H& F1 ~, g -
, Y; x' R3 g8 R) z3 L - ;------------------------------% z3 a; a" @; O; Q4 k! D
- ;等待0号精灵碰撞发生
# A% C, a! x5 P - LDA PPU_STATUS# g2 I+ _7 G' o
- ASl A8 L8 u0 I% ~: {" x2 b3 r) g
- BPL * - 4# w& ^" M J8 `
+ _% i7 ^* Q. ^( T/ Z& y, V- ;------------------------------; v, k' e0 @! U% f Y
- ;行消隐等待5 p; ^# r) |9 K+ G/ C: h( y& @9 g
- Sprite_Hit_Scroll_Wait
7 X( L9 P; U2 U - LDX #$28
# x7 V# s, W0 H& W! O1 D$ B, Q+ c5 c - DEX
* w! ?+ E9 o$ r# v - BNE * - 13 }4 e/ k. R7 p3 U# `! }
-
' g4 P. y" U4 c3 @/ g) G - LDA Sprite_0_Hit_Move_Direction* m/ d. ~1 O7 n+ E3 S; b! H" p
- AND #$01
# u& o9 F3 T# ^% z3 X! p- X - BNE Sprite_Hit_Scroll_Set_Right
2 b8 C7 J4 E: ^7 ]; M
- g7 p7 z# q& `4 ?! u- K7 m$ {- ;------------------------------
, H! k9 |- k8 u! g! y - ;分割画面向左滚动2 |7 Z( ~1 E4 B( J* {1 T
- Sprite_Hit_Scroll_Set_Left5 g8 z5 z. \3 |' Y2 c3 O
- LDA PPU_STATUS
6 [1 _0 V- X1 c6 G2 B7 Y' I; N - LDA <PPU_Scroll_H
3 Q" z+ m8 R. x6 S) q - STA PPU_SCROLL
) {1 {0 @! ?0 R, X E* Y/ h - LDA #$00
* k' r: a+ a, H - STA PPU_SCROLL
# \" S" o0 Q4 V& y% E# M - RTS
: u% [% H6 N0 S) D9 u6 K- U - . K& s3 c1 j* X; f* F% _
- ;------------------------------, Z3 c3 M: j; G) f
- ;分割画面向右滚动! e( O V: l0 Z( P8 `
- Sprite_Hit_Scroll_Set_Right7 d) G. J: Q, K( H" @5 V
- LDA PPU_STATUS
8 r+ \3 A1 }, f6 K( q4 O - LDA #$00
6 W0 ]! v' ~2 C) N/ J9 d/ O$ R5 y" u - SEC
# y7 C7 p' r" ?, b - SBC <PPU_Scroll_H* V# h/ w( @$ q! Q- k
- STA PPU_SCROLL
/ y$ I) u% N) ?& j+ K$ H2 j - LDA #$00. |! h( l" `% Y
- STA PPU_SCROLL
) D X! m6 P7 _% m0 o$ X - RTS
: q: s, B1 v) ]: }" Q* x- P+ B - - y7 E3 ~4 d o( O+ W% V, V5 F
- ;==================================================
9 x) ^- m" C" I' i: A5 _ - ;IRQ中断处理
% s( h) R: h6 ~, g: [2 ] - IrqProgram
3 ?8 e7 h( I9 K0 D) N! Y - PHA2 f, c" e3 A6 m \7 X
- TXA
$ g' m" `6 S! x8 Y: l8 g - PHA
0 R; i$ p# t+ n( b( k6 H - TYA
" J# g: K/ [+ s3 s - PHA9 [9 L' v7 ]' Z8 O5 T
-
' K8 z$ l& x2 G5 e% z0 \8 ^ - ;关闭IRQ
5 R+ s9 w# h1 m. S( ~% i - STA MMC3_IRQ_DISABLE
, a5 c9 ^- h/ g -
% _ W6 b% l8 r" n" a7 r - ;允许下个IRQ触发
: A, {0 f, b' t2 c z - STA MMC3_IRQ_ENABLE% y4 S4 l6 J1 Y1 l
- 8 E' v0 U+ u5 ~. R5 g
- ;IRQ处理, 15线后继续触发
* z A( X% H1 e' {& p* `) x" U* Z - LDA #15' k/ s* p) G0 }; ~' p+ l# U: o' N
- STA MMC3_IRQ_LATCH# `, L6 C4 i! V2 d
-
6 j) z7 }0 R' m3 ~' Z - LDA <IRQ_Index* N( }4 g8 @4 R% d* b
- BNE * + 4; ~( J) L( h& i6 r5 E8 C
- INC <PPU_Scroll_H8 C) P4 P, @* ^8 F
-
9 f" T J; t, S! s0 u4 c& j' ? p - ;设置屏幕滚动
; _4 [$ ?+ R$ a0 ?* v# E$ N - LDA <IRQ_Index
. q& j) u: M# Z1 j5 k - AND #$01
% j U2 z1 }; [6 T - BEQ Irq_Scroll_Right( F, g" t Q" X+ ]* C, |! T
- E2 v+ Y/ h$ {- E- Irq_Scroll_Left1 A9 D) H7 }6 h/ i& V
- BIT PPU_STATUS4 o% g. j+ ` S+ l' X
- LDA <PPU_Scroll_H
- |, I! T0 d* L6 X, l8 I - STA PPU_SCROLL# v( }0 l7 P4 i! O$ Q1 O3 I! o+ G
- STA PPU_SCROLL7 I: F4 W" q s! A9 ]7 D, O
- JMP Irq_Scroll_Over3 I V7 h/ g. Y6 Y% w! [
-
" c3 u* n% j4 l+ I8 ~9 u - Irq_Scroll_Right
1 J0 u! T& ~6 a% P2 w - SEC% p" v. S; s* }- b' I8 W8 ]) t
- SBC <PPU_Scroll_H
8 G' V% E- ?1 y - STA PPU_SCROLL% i( h8 G" q' c4 }3 l5 G
- STA PPU_SCROLL6 n( F- G) Z9 d2 [9 p4 H- w
- Irq_Scroll_Over
: {0 [, J& P+ h: w' t$ s - ' h; m; y* {6 X) }
- INC <IRQ_Index* L% _1 W! k7 M% I
-
. Y# i! h5 b4 d2 w9 F2 Q - LDA <IRQ_Index
$ ~* i3 f2 }! t& N0 ~- t - CMP #146 D( g9 h" W0 d4 ?% }- z! Z. ~
- BCC * + 5( P+ z7 v) d6 y0 ~
- ;关闭IRQ
# i H- d, e- H) x; v0 j" o - STA MMC3_IRQ_DISABLE, W1 l. g* w9 f7 H, ? f9 t
- 1 K$ p/ b8 T! t
- IrqProgramEnd
1 f% m! [! b `' v - PLA
; ], s9 j& I% R0 N, E2 }. q - TAY
& I' H0 f3 @! K7 ^; A - PLA2 I. f3 B$ }7 T0 c) g
- TAX; \! R* c" q( R0 X: B
- PLA' n3 t& W* H( K+ z
- RTI
4 v# d; R+ s$ x- g, T - " E4 A: E, v* n7 V4 f% w4 s( K. n! p
- ;==================================================
* x D# N5 X* ~: l5 _ - ;中断表
R. A# B0 Q: ` x3 g. [% C" k6 e - .ORG $FFFA
" I6 Q: O( ?& `5 C - .WORD NmiProgram {" s* s" Q' E" r- S
- .WORD ResetProgram8 R; f$ C5 ?1 Z
- .WORD IrqProgram
复制代码 # p8 V- D$ D9 w; O, y7 s: a
|
评分
-
1
查看全部评分
-
|