|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
. V) L; `) C+ d. x* q' M
; H, `! X" n8 ?以下是主框架代码:6 z2 [" ?- |" a+ [ J# j
- ;======================================================================
# V5 j5 }6 @7 ^ - ;文件头. r( B$ Y5 l0 Z. j5 u# J* p: H
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量& ^* n9 j. G e% e. D/ `" x
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
5 C( M; n y( X# i3 O+ m7 e0 Y1 Z9 u- I - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
" o8 W# K+ Q7 L8 e3 F1 n* g& E* T$ q - ;======================================================================. j& q7 X1 b: k! {; U) }$ K
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 20 u4 f5 e9 a6 I5 B# P
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
- e7 g# w9 y0 R8 v, R# B9 M5 Z7 ]0 J - ;======================================================================
2 d" @8 N" G: C7 d% U, J- o - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 18 v- H7 w* `; S
- RESET_ADDR = $E000 ;主程序起始地址( c6 `& A4 c! _# d
- ;======================================================================% V4 P; X$ T; l6 t! d( Q1 [% P5 B7 y
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB1 d W0 Q2 F" m" s4 H
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
6 w! t+ N" W" V- b - .INESMAP 4 ;Mapper号 (0-4095)& B' f$ O. a! p, D) X
- .INESSUBMAP 0 ;子Mapper号 (0-15) z U% B+ x6 P( A
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)& I7 |5 o4 f f- p- s8 S
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
/ f, z* _" j) q$ { - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)& v/ G2 j8 M& `9 Z+ L
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
" M! m% Y) R: [+ J% O - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
& V/ U/ f8 i* S1 X" q - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)5 _) \( K# ^, |8 W
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)4 j; a! j3 a2 K$ z! Q8 s
- ;======================================================================
- }$ D8 l$ ^7 c - .INCLUDE "fc_demo_config.asm" ;全局配置' F0 g1 t% w& R( w/ Z2 w
- .INCLUDE "fc_demo_constant.asm" ;NES常量. G/ e: M l/ n4 {" A% l( M
- ;======================================================================
2 t9 y4 i8 d' y3 h8 m0 V s% U - ;音乐配置
: p- c7 |/ D u, H' y" k - .IF 0 = MUSIC_THEME 3 l$ P6 {! w/ N
- .INCLUDE "data/music/Gremlin 2/config.asm"$ `; m4 X7 R* Z0 o% L0 Y0 z. S( q+ W
- .ENDIF
- ?& a# {9 o% G2 k8 O - / [: c0 \" k( Y8 i! a# Z1 L2 G: K
- .IF 1 = MUSIC_THEME W j6 Q& I# L1 E' Z8 |0 [
- .INCLUDE "data/music/Raf World/config.asm"( |- a! a$ e& ?1 F* v6 _: N
- .ENDIF. @& M# Y- u% J: W3 `8 a# J1 K. N
-
& j, _6 W: Q, U3 @" J - .IF 2 = MUSIC_THEME
1 g! b* { e) z) w - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
! O' F' u6 }, F( l! l - .ENDIF" F& l( Q3 ^- z1 j/ `' t
- # `- K; J: t) e$ j9 B
- ;======================================================================
H) Z$ I8 x7 P4 L, B - ;引用CHR图像数据
# ?' S% q3 Y3 x! e5 | - .BANK NES_16KB_PRG_SIZE * 2
- I/ A' J% e2 y+ j - .ORG $00000 D9 M9 ^ b9 K" R4 n$ E
- .INCBIN "data/bkg.chr"9 A- }' V, k% W* B4 e
- .INCBIN "data/sp.chr"
- k% g/ U' g9 O* X4 G# _/ S: E - * t% }. q I4 s3 c5 j( Y4 Z- s1 h: V# c
- ;======================================================================
! z% T, z( @, {2 w4 z - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank# _( Y+ d: v/ m" x
- .ORG RESET_ADDR% q) {9 j4 D/ A
- ;======================================================================2 X9 F9 w1 V# @9 T
- ;引用其他源文件& K- r, n0 w q- q' z! R4 y
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
$ B, ?1 g+ A1 S - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理. c7 v/ u ?2 W' }
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
: ~. p3 f6 u3 `& M& I - ;======================================================================
! \, M2 [# Z/ ^) L! b, t
$ S7 c; Q7 g1 ?- W& E1 B, ]+ d6 D9 Y. c9 y- ;======================================================================
3 b6 `, K( w0 E - ;等待VBlank到来
' O9 S% a( d* W" U. |; X - Wait_For_VBlank F# g+ E" I7 d9 U' W3 r3 x7 _
- LDA PPU_STATUS
+ Y' o+ n w; N0 o# w; \1 y - BPL Wait_For_VBlank6 e- A1 |! Q% }% n/ l) G' M
- RTS/ n' {0 ~* G! j5 x. N& X
- n* r9 ]1 M& Z- y- ;======================================================================
& U' r' \5 N; x, y/ c - ;调色板初始化( ]" f' l% j& P! c4 w& g
- Palette_Init
! V$ R& g) p% g$ |( \1 k1 x2 J - LDA #$3F
4 `2 m+ M% ?' r; f - STA PPU_ADDRESS
6 f. y# ~7 b& f7 g9 h5 Q& v0 Q - LDA #$00
$ C& g. R7 [/ o" i( v+ H& G - STA PPU_ADDRESS
2 Q9 x' T6 F) Z4 d% i L - LDX #$00' M5 `' ]( A% o9 D
- LDY #$20. |4 u/ K4 k& C
- .Write_Data1 P5 r% I I O: u5 s( e( k; V, ]
- LDA Palette_Data,X' q: n! f; @3 W& j% o$ l8 Y, d( I
- STA FC_PPU_Pal_Addr,X" c: K' G! e) C( R
- INX+ p U1 K% p8 B' h7 U
- DEY$ s$ Y4 ]( [- u/ W5 D
- BNE .Write_Data+ f3 B2 p [0 N" E7 K& e- c
- .End
5 y2 p1 z' b& y2 e+ t - RTS
4 B/ V0 M/ u4 k; A5 ~6 R: t( i - ( m+ f5 a( v# i* i7 M! k
- ;----------------------------------------
& \( T' ?6 N0 n1 b/ G0 p' O1 R O - ;调色板数据+ q9 I( }) g: s8 D* N; Q
- Palette_Data
( z9 |) }, ?0 [3 D5 D - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
5 g8 J; |1 E" L& o - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
% l# G* n# [: Y - ) W1 X; a" \1 \4 @+ h4 X1 P
- ;======================================================================! @$ _4 C: w# G3 _7 J
- ;命名表清空' L3 Q$ V6 g% I3 N7 s) c0 M3 r
- Nametable_Clear
E H( h8 N" H( | - LDA #$20/ j) c' f3 A8 n) B- K9 S; Y
- STA PPU_ADDRESS. U' l* g$ U( H( t
- LDA #$00 Y. h9 P" W" U* b& E
- STA PPU_ADDRESS1 c0 S4 [0 M, P3 o4 C( n/ H0 z6 ]
- LDA #$005 ?% ~" `# A, L/ ~
- LDX #$004 R% O. X3 l" |" G9 E: B1 S
- LDY #$08
7 }" s; G8 O8 M! l& r - .Write_Data: h$ e7 j4 y F8 x. ] P2 j5 |
- STA PPU_DATA5 S1 y* _" e6 ?+ b( t0 _
- INX; \- @) Q/ Q& T( @
- BNE .Write_Data
& |! i, i5 U- {* ~+ ` - DEY
1 E7 w+ v, A+ ] - BNE .Write_Data
J: l) p4 m- n/ ] - .End
" T u1 k j7 n j3 U h - RTS* J3 y6 W' S: x# d+ Y6 b
- - ]9 [) ]9 o( H9 M9 n. W
- ;======================================================================
: x+ G/ d8 \# b/ }! G F$ a; Q1 ]) f; c' c - ;音乐曲目切换# I# V" c) e& e7 l4 [4 |; J
- Music_Select_Process) Z9 j7 u X1 L/ u: u2 M
- ; y/ o( V$ v2 w# N. n* `
- .Pre_Music;上一曲2 v u0 U% k8 i$ _ }3 \( E
- LDA FC_Gamepad_Once
" @1 ]6 e: p. }, p1 \4 } - CMP #JOY_KEY_LEFT
" t5 t! J/ k4 B% R+ V& c( } - BNE .Next_Music
1 N% U( i" T( a+ r - JSR Music_Play_Pre2 x# l( `- ]7 w4 ?6 b6 B- R3 `, Z
- .Next_Music;下一曲/ g3 L" s! [6 N% _$ ~" I h
- LDA FC_Gamepad_Once
0 g2 m$ Q2 o% l7 N5 a. M/ |4 ]) E - CMP #JOY_KEY_RIGHT
! X, A( W, D$ Y - BNE .Next_10_Music; g1 ]) O# }% D3 g3 D, Y" |. [
- JSR Music_Play_Next0 H) R) i! I2 ]
- .Next_10_Music;上10曲
+ t. \" Z3 N* h - LDA FC_Gamepad_Once
* F& K0 }+ m# d3 V - CMP #JOY_KEY_UP6 Z, M2 }- L* A9 ]
- BNE .Pre_10_Music2 x n6 e* q0 ^, ~
- JSR Music_Play_Next_10/ M0 d g5 N5 s
- .Pre_10_Music;下10曲
0 I+ w% a/ r/ U7 E2 l - LDA FC_Gamepad_Once6 F( |* o: b K" Z5 ~5 ~% s
- CMP #JOY_KEY_DOWN
" v/ M) Q- S. g+ g3 y: ` - BNE .Reset7 Z( W8 ` c& D& K
- JSR Music_Play_Pre_10
/ a% N+ r; t4 {9 y5 W6 T1 T - .Reset;重播当前曲目& K% i+ W/ o- P6 L
- LDA FC_Gamepad_Once0 e" W v J% T3 W9 x# P% |
- CMP #JOY_KEY_START& t% w9 L O; w V$ f/ Z3 }
- BNE .End/ s" z1 Z8 |# U
- LDA FC_Music_Index7 S9 B5 r) V/ H+ p" t5 j# ~' ~% X' `
- JSR Music_Init_Process
9 G$ g& B- l" n X. L# A0 V; @5 C - .End
5 F* I* A% g# S1 a - RTS
! {0 C" \' y/ D) I$ ~; @: G/ d: ` - & b4 k" D4 a) z! K) z
- ;---------------------------------------------------------------------- a3 W0 q ^7 f+ Q. y5 f
- ;播放上一曲& ]+ Q4 N1 E. s
- Music_Play_Pre
; R! @) y6 D- t4 _% k- _: f6 U5 f - LDA FC_Music_Index& A* z/ e& q9 o+ \& o7 b$ K
- BEQ .End1 [- [$ W! G5 |- B* S5 w
- DEC FC_Music_Index, k3 `9 P( C# T7 I+ x7 f
- LDA FC_Music_Index# j9 M( ]8 u9 [- {/ t6 t
- JSR Music_Init_Process! _# o/ j9 g: L; ^1 s8 a
- .End% s3 A: Z9 U5 b; G) Y0 [4 X# Z% }
- RTS
% J/ i& a9 x" n- u1 s8 |9 |9 p3 F - ;----------------------------------------------------------------------; N, L! c" z7 e0 D' y
- ;播放下一曲
0 |2 s- c# b6 d2 B7 B8 [7 z( S - Music_Play_Next
b' n5 R1 d1 D6 C# ?: d% i2 C - LDA FC_Music_Index
! x7 e, P b- T7 b$ U8 C - CMP FC_Music_Max_Index, _' r5 ^& \- }( f0 G- U' x6 t. R
- BCS .End
$ e4 T& p: a, b. H6 Y - INC FC_Music_Index6 E0 g- K9 O) t
- LDA FC_Music_Index3 {5 T* N9 ]# J
- JSR Music_Init_Process% B) C" K, C( g9 p/ i. |1 L" r
- .End+ `2 G7 z: J* p3 ~5 U/ T+ C* E4 Z
- RTS
- n: R6 v, Z v2 n* z - 6 D5 v$ d: A7 q. B! d- p
- ;----------------------------------------------------------------------
, q9 D( D! K, ~( ` - ;播放上10曲$ q4 e3 w+ D( O8 Z. D9 ]
- Music_Play_Pre_10
. `) ]3 o* k( @* \( d+ h9 O - LDA FC_Music_Index0 ~3 f# ^3 H" C8 U
- BEQ .End6 ?2 f, [; x6 P8 n0 v
- SEC
0 | X* D, J$ X' a0 k8 { - SBC #106 h: o1 q5 s! Q2 g8 o
- BCS .Pre_10( P/ l9 F% X; H4 [# M" P
- LDA #$00" n O! W! u# g" d$ ~
- .Pre_10& P0 Q* Z" @) V
- STA FC_Music_Index2 J8 `' e. m, ^0 W/ i1 k
- JSR Music_Init_Process. `" k- X( A- |! G4 C/ J
- .End( @7 r( @( [4 w; B+ @
- RTS O) S; f+ J/ p% W( y
- ;----------------------------------------------------------------------) X: ], _" ^; H* A8 b: C
- ;播放下10曲- h5 y) o2 Z# e
- Music_Play_Next_10+ }) ~4 H; d: ], o/ m8 K) L6 l
- LDA FC_Music_Index; N7 w# u3 j6 _- D
- CMP FC_Music_Max_Index
$ I) _5 V2 \& \ - BCS .End
0 I) ]# j' i& U y - CLC
# r% A2 Z8 G! X8 i+ m$ K; N - ADC #10
* k' X) ]# p, w: |7 T) A2 ~ - CMP FC_Music_Max_Index0 X* o Y3 L' c/ b: ?' T
- BCC .Next_10
# H$ x& S! ]" \* m* l* ^/ G - LDA FC_Music_Max_Index& R* f( E# @# j( N
- .Next_10/ T; @* X x1 @2 S# o
- STA FC_Music_Index; P- B( P0 J7 N, ?/ t! T, X. i! `
- JSR Music_Init_Process
: Y W: {/ k" T2 x' J - .End
+ a( Z# y0 y- S) _+ W - RTS
7 G, Z: I% Y. H* l! ]/ o0 W' D0 \
7 I$ ~8 G t$ n1 \+ e- ;----------------------------------------------------------------------
7 m0 ~) s u9 v6 q5 L' O1 l - ;8位十六进制转3位十进制制
9 \) q3 A- G9 p6 P* \; v - Hex8ToDec
3 X8 t% g- j# @7 q# o8 U - STA FC_Dec_Data_1
0 F, E( E" h! M+ h - LDA #$00: y7 m( c2 m+ W4 } G# a* ^9 J
- STA FC_Dec_Data_1007 o$ J: Q" @' u* v( M+ M8 f
- STA FC_Dec_Data_10* [+ s8 e7 L; g2 o
- LDA FC_Dec_Data_16 \/ K1 L% v% P3 t+ \1 M
- .Convert_100
; @( f; q% _* d) X( ?' z5 a - CMP #100
/ e7 y3 h( ?: B - BCC .Convert_10- h0 p0 `9 y# F; S
- SEC: U( R7 T& W/ |5 x8 p! c
- SBC #1004 N) f. S0 E6 S1 N8 O1 M4 ?
- INC FC_Dec_Data_100
- ^* d9 @- g: F6 V4 c - BNE .Convert_100
7 a$ G, n! z8 f - .Convert_10
, w/ @7 `" D; u: j - CMP #10; w& I1 F* y) ~1 W$ ^% ], c
- BCC .End6 i7 I7 w8 O3 I+ d" C" L
- SEC' H7 G. n4 V- o) d
- SBC #10
2 \8 O/ e+ t" v; A8 g& I# V - INC FC_Dec_Data_104 f) e9 o% A/ W G
- BNE .Convert_108 z7 b. v& _4 R9 \, S
- .End1 r0 E( `& h$ v5 S4 s" Y
- STA FC_Dec_Data_1
4 d) r. C4 g' H" n0 r - RTS6 }. e& q5 T* t
6 j/ t* L3 u7 {- l3 @" p# L c- ;----------------------------------------------------------------------
4 m; ~9 f* A( c+ Y9 c - ;显示曲目信息* k! b* j' z$ ]- O
- Music_Info_Display( Q& D2 m; T5 @+ @5 x
- LDX FC_PPU_Buf_Count# i1 d! R3 y- |2 Z- Z3 N: k" H. ^$ j
- LDA #PPU_WRITE_MODE_CNT_LINE
6 i- T$ i' S" i. `+ F" W - STA Use_PPU_Buffer,X
g+ s2 j/ G/ b# s3 S+ a9 a6 n - INX
* y/ d* k9 O7 G0 w - 3 O( i# `6 H$ C
- LDA #>MUSIC_INFO_POS+ q/ [5 B' u5 r( m9 u" R9 r# K" p
- STA Use_PPU_Buffer,X
5 ]3 m* p8 l- m( G" Y" z - INX
2 c5 o4 Z! n3 E+ c -
. ?: X, O% L& {, C# ` - ;居中2 c" d2 X# q- S, M: E. g9 k4 U
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
?/ X# K" ~8 j/ K) @& I - STA Use_PPU_Buffer,X/ o+ w- W7 m+ _$ p4 ]
- INX, c% V, X+ \9 t K4 K3 R6 Q1 N" c
-
6 y5 Z* k4 _+ s4 J7 r. c - LDA #$052 l$ G; S. A# D. A, |" L9 S, X
- STA Use_PPU_Buffer,X6 b% ?0 s( _3 L3 r7 U4 o/ o
- INX. ]# ]1 }" X- u% W/ e5 }6 D! r
-
0 L4 ~# D5 n/ U2 z# ~ - LDA FC_Music_Index
$ G8 p: k( o. u' I& h - CLC
, w l( @- M a ^+ t - ADC #$01
9 O; j/ d+ ]7 Y0 P - JSR Hex8ToDec o% U: H# t2 F
-
% d5 E& E. P5 L4 X: v8 d" ?7 O - LDA FC_Dec_Data_10
6 W# a1 [0 T* F5 h* a. b# P - CLC
) X4 U* l: P" C2 W8 V/ [/ ^7 e - ADC #'0'
! w* e( D5 R% L3 F9 e4 A- t2 i - STA Use_PPU_Buffer,X* |8 g$ Y3 i3 T( x
- INX
: P; |+ Z% W4 _- \2 P: j9 m -
' ?( {/ S. O3 m4 O0 L8 \5 x - LDA FC_Dec_Data_1
, ]- R5 B3 s. Y& ? - CLC3 y [5 {3 m9 A! W' Y l1 j
- ADC #'0'2 E* Q, W9 p4 F
- STA Use_PPU_Buffer,X( T8 U3 v/ J' `- R8 h3 _; D3 F
- INX" g8 w. `+ b) J% s$ z' B1 a" T
-
; h9 Y7 J6 |+ H4 K - LDA #'/'
# c8 i, x, C/ N* ? - STA Use_PPU_Buffer,X
! G" K5 Y0 q1 ~7 h' y8 |0 n4 } - INX
& _( n8 L3 p: T8 L m - 2 g! `( j d# U7 @2 t1 x9 }4 X9 c
- LDA FC_Music_Max_Index
" J* F/ N$ i" M" o9 t9 f2 u - CLC' }" g4 j- E" a& \. }" o
- ADC #$01& m( @" s! a* H1 g. e2 h' e
- JSR Hex8ToDec+ y5 |8 E5 G. m0 N P2 G! s! y E0 \- e
- ; p3 L. B* O4 Z
- LDA FC_Dec_Data_10) e/ Z! r. U' b% N; h4 J& G
- CLC
- l9 w3 p9 A. G w8 m& ~9 l" C7 {/ n - ADC #'0'
. d W' m. C! J - STA Use_PPU_Buffer,X5 N& }# y/ R& s+ N5 N- H1 y. M
- INX9 N( q3 y" ~) ?8 ~, L3 F& Y
-
) q% G* _/ v3 M! Z& E9 ` - LDA FC_Dec_Data_19 h- O! r1 L% K& o
- CLC
+ e. q1 I% Y0 L' v - ADC #'0'
$ U$ y6 T- G0 E6 | a - STA Use_PPU_Buffer,X
& c: e! c0 E; D( Y D) d+ @ - INX
3 G7 `4 J. y: m6 ~; q -
- s5 c3 ~6 t& q0 ~5 `2 e - .End9 ?: Z6 W* k* ~3 S" t+ S$ A% A- M
- STX FC_PPU_Buf_Count$ d& k! V, i$ h& V, C$ }
- RTS% l/ q! M2 o6 }5 x' ^+ }- M7 {
- 0 j4 B0 o0 w' G; c9 ]( T0 G
- ;----------------------------------------------------------------------/ o9 \) V% }( M, m7 [& W
- ;音乐曲目初始化处理
) o/ T; y- a4 t" z: I; v/ L, Z9 A - Music_Init_Process
0 l. s8 k: {- v - PHA2 Q4 C5 I0 n5 s; U. n/ S& f9 E6 A
- JSR Music_Clear_Process8 q/ s8 l( y+ y$ {/ _) F
- LDA #$1F5 O, H: S. n, f) I* _1 Z0 ^
- STA $4015+ |' _0 c) w2 N8 {
- PLA
0 x5 [& f9 w: S+ \1 K Q$ S- q - JSR Music_Init_Addr
' M3 A4 t5 k7 U( }" [ - JSR Music_Info_Display
+ O# f5 a( z- h3 ~ - RTS" q- i& E/ F Z7 D0 M, I( \! K' b
* A6 E, {' a! F- ;----------------------------------------------------------------------/ S% m5 B9 P: D
- ;音乐播放处理
5 |8 b3 T2 `6 S2 ^ - Music_Play_Process1 ~( J4 a6 c5 X' N
- JSR Music_Play_Addr
/ I/ ]8 [1 X5 t, P( U - RTS7 P3 i9 L. c% a' H) ]# X
- ( p# h+ x6 s7 U, Y. p
- ;----------------------------------------------------------------------8 ~& l, B% B0 l3 j2 d
- ;音乐播放处理
0 T g, p- v! X2 c% B. `" E - Music_Clear_Process5 |1 V% K3 Y3 w* o
- .IF Music_Clear_Addr
3 U$ _7 [0 k4 ^8 h - JSR Music_Clear_Addr' R1 Q5 `+ o. S& R
- RTS
( o$ v* ~# F! C - .ELSE
% _, g9 L. t. {( [5 p/ Y - LDA #$1F
2 ]: n/ Q" \5 Y+ E: D [/ O0 D" S" o. y* B - STA $4015
2 @/ n) F. [2 `2 y4 Y, p: J' v - LDA #$00" W$ c8 H: a% `( v: l3 @
- STA $40105 E- Z$ H+ v/ h; Q2 q3 S" m, ^
- LDX #$00
. j# S, h) J+ M6 t1 j5 Y1 \) X - LDA #$000 a/ V1 Y2 m. L/ R
-
( g- t, n2 Z4 Y* C7 v! r; ` - .Music_Clear_Zreo_Page_0
6 O# q$ X/ r1 y7 r$ p9 |! Z8 H- u - STA $00,X
8 b# a" H- Z+ r2 [; _ - INX
5 o/ x3 s4 v. f( T7 u - CPX #Use_Zero_Page_Begin
. W; r0 m+ f0 k% A. u$ q0 Y, S - BCC .Music_Clear_Zreo_Page_0
: i A- X+ A: z' x) z: r1 ^ -
3 N8 t, b9 M' Z5 L4 q - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size) r7 S* H$ _4 t. C# j0 k
- .Music_Clear_Zreo_Page_1
) a9 y5 \! w V! X4 @3 n, z* ? - STA $00,X
- a! e" q/ X; b* z. |! R9 ^ - INX) p- @( K n5 H
- BNE .Music_Clear_Zreo_Page_1
5 e: z& @9 z& h! x4 X - / t4 q# Q: B- h
- Music_Clear_Process_1; S( Z; i) q: i
- STA $0600,X+ Y: P) o+ Q9 Q2 l) A5 e/ m
- STA $0700,X9 E: V5 E6 V9 T3 {
- INX
, \ ~% i- U9 U j( E - BNE Music_Clear_Process_1
6 G; e- Y3 B( @, [' L - LDA #$10
: }* t8 q+ M% q" A, l) m: X - STA $4000# E7 r: P/ Z8 Z1 B/ H' q
- STA $4004# O5 r& Q, V+ ^" D1 ]; N
- STA $400C
& }" k9 B& ~) x4 H) Z# f# ~9 [3 A - LDA #$00
, _% X5 @- U' q8 f" q1 l, } - STA $4008
a4 G) X5 r* Z: u4 s% ] - LDA #$0F! e2 Y/ U" P1 I3 ]( F( u8 l( s/ A
- STA $4015
' n8 @( Z( r, \0 V6 u - .ENDIF- B! G& T/ ]+ r! H, w3 O* L
- 1 o( |& i, h- M. \6 D& t. t
- RTS
3 U h% R1 J' Y% B
3 X6 b# Z. V9 `9 T- ;======================================================================
; Y/ `% h- s9 {* Z" ^9 K7 ? - ;重启处理
* \; O; a; i3 Y7 R4 L - Reset_Program& G2 X' X- W7 z! x+ `7 }6 n
- SEI( p5 m: M5 Z! q) E0 t, D
- CLD
! o0 z; |2 g% S5 i - LDA #$00
% \ o5 g. P: W0 t - STA PPU_CTRL
6 e4 `6 {, B( U5 n2 q" w5 L3 c - STA PPU_MASK
. A0 z1 Y0 Z, h9 ]+ }$ R - STA JOY2_FRAME
5 {+ b5 a, u, ?1 U" q p - STA APU_STATUS
; f5 Z7 X$ ?: i8 r -
% U' ?1 h5 w: p G+ F' s - ;等待屏幕准备完毕
! P) Y1 l; k' I! R) Y8 R$ L' Y - LDX #$02* B- Y5 x( r) K' C8 {
- .Wait_For_Screen_Ready9 J7 {) \" \3 ^0 _" B, f. L, E
- LDA PPU_STATUS! E2 t2 \" F \0 g5 y, }
- BPL .Wait_For_Screen_Ready/ c8 j- _4 Y k; c+ ~8 M
- DEX
9 q5 X, Z D5 L% e+ j& A - BNE .Wait_For_Screen_Ready6 r& F& w2 s' }: r' N* Z
-
( T( U* j& V% B# U* B0 R# \ - ;清空调色板. p/ y: k. s) e3 P
- Palette_Clear
9 r% B* A @- [ - LDA #$3F
v3 V) j- M p# W5 J$ N - STA PPU_ADDRESS
/ B0 J e( r! U9 B" g6 O - LDA #$00
1 l. v# {" P& u - STA PPU_ADDRESS
. Q+ i* u. A5 X/ W3 D9 ~5 L2 @: T - LDX #$20
5 s/ x+ V5 p3 I( T4 @+ e6 o8 z - LDA #$0F9 B) E4 `6 E2 e+ g
- .Write_Data5 f$ T1 C5 j% ^6 p6 s4 A2 ~' }5 t
- STA PPU_DATA# V# I" N3 y I7 I
- DEX) o' @ P# g# q$ @+ A% G' b' e
- BNE .Write_Data* q! E2 r. J1 n# H5 n' h7 Y
- . P S1 Q4 T+ F. n; W
- ;清除声音 $4000-4013+ z% v, M# ` |
- LDY #$14
' k" s7 u& C5 |7 _7 g$ ]! K' C3 ` - LDX #$00- A c" }( z/ }( X3 q3 s; Z9 }
- .Sound_Clear
. p) ^* l* g( v( [5 q9 T: I - STA $4000,X& R0 ^6 ?' L( w* p
- INX4 _% T& |# b1 u" v8 }
- DEY
8 b4 g% C9 c& Q2 ?& @" L5 e6 _* c - BNE .Sound_Clear: a2 N+ y$ O8 _8 K# ~/ w U4 X
-
; f1 O' _! r1 F/ Q3 H* L p - ;清除 RAM $0000-07FF
: y( _) C, e6 |2 o0 g" } - LDA #$00
7 e. s) J% x0 i' ?2 ~, v: Y% j a) X - STA $00# X( Z' I+ L/ r" P
- STA $01, W) t- K2 P7 U8 J9 z
- TAY7 g+ ~$ O2 |* Z
- LDX #$08
3 k( J; Y1 c3 ]8 q - .Memory_Clear2 w1 D) ^/ g0 I+ D! h
- STA [$00],Y
3 e/ X1 ?( e& G5 d+ p' l) F - INY* Z8 u6 }. N) k% U
- BNE .Memory_Clear
6 v/ {3 z4 Y2 F9 x m% E, | - INC $015 s+ w7 d7 b4 D2 M
- DEX& C* ^6 S( Y |6 I: _ T) U
- BNE .Memory_Clear- U* e- D6 c( v1 Q, e
- 9 A( B* K; I/ G0 t
- ;精灵缓冲初始化
' O4 f1 C) s8 T9 f y3 z9 c- { - LDX #$00
L$ [: ]1 W6 x* u! J - LDA #$F8
. ~8 P% G: ]+ s" a8 h - .OAM_Clear2 p8 h0 u5 b$ B" ?) d) K5 b4 }
- STA OAM_DMA_Buffer,X
7 @) p2 o- {+ y! Y# @ - INX
0 r, G) E8 `" c - BNE .OAM_Clear
4 Q1 p# K9 f2 V- Q6 p -
- Y z' ^/ o6 y2 ? - ;栈指针初始化
1 K1 X& N/ R5 h - LDX #$FF
8 R" ^2 T1 p+ m7 x+ L - TXS
5 n" o0 I' Q7 K1 M; E" n -
4 g& z6 u% t0 J7 N - JSR Nametable_Clear;命名表清空
7 m4 |/ k# k: a& v. j$ w - JSR Palette_Init;初始化调色板缓冲) k1 E5 {3 s9 w* I! e* `
- JSR Static_Text_Init;初始化静态文本2 m5 j" o6 C* w; b8 Z: z1 I
-
. n; X; U. U ]$ s3 D. p& W1 }) X - LDA #MUSIC_ITEM_TOTAL - 1
: W6 h8 y0 |' X0 S: D - STA FC_Music_Max_Index
1 x9 `% k' l* r* l" Q, v - ( E; L" |9 K. v0 a- V' }9 i
- LDA #$1F
5 G1 x* }7 m" e+ r" j" O, { - STA APU_STATUS
& S- W/ L8 |$ p, F& J; d) K' X - LDA #MUSIC_BGM - 1
( w6 T7 ^0 a" l4 g - STA FC_Music_Index8 m7 `( e T+ T! `9 }
- JSR Music_Init_Process;音乐播放9 P1 a# W+ y5 U: s5 z0 Q# y2 N$ ^
-
# N M& a' m. t1 f% {) [ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态) D( ]: O1 X+ `( O6 ]; C/ b
- LDA #$1E
0 M7 T! l. C* t( i' ?1 W6 V; | - STA FC_PPU_Mask_Buf
+ f; O6 _0 a; P# s: Q% l - # u6 j' I2 b5 X
- ;启用NMI处理& P/ _& v+ M: \% S, B" _; t
- LDA #$80+ i% n, ~1 S& B) R3 W! e% N
- STA PPU_CTRL t7 J. @+ e. ^8 p
-
! ~* n! B+ _: P6 T - ;程序循环, 剩余工作交给 NMI 中断处理
0 S5 b. T1 ^: s7 t( v, S - .Loop
" x6 ^2 `. {% t/ r0 ~ - JMP .Loop! h" s* @7 i6 o+ Z% v
7 t* i9 O6 x& | S- ;======================================================================0 ]4 Q1 N5 g: b$ A* M4 \3 X
- ;不可屏蔽中断处理' t' n6 g- \" ?& I& ?/ V5 |( G; ^3 o3 N
- Nmi_Program1 Y$ L2 k7 c6 {
- PHA
- Z+ N' C- _& d" Q" m - TXA
5 V$ B7 T( ?0 B% P7 a- m' l8 Y - PHA8 ^+ a7 J) ?8 d, _. d$ }# G& A4 z2 N
- TYA
9 c* M8 n# }; Y# F7 x2 |. T* r, y# j8 \ - PHA7 K. J7 M1 m! o6 f6 J0 K: U* o, u
-
1 D9 k4 W9 v4 a- N6 {; t% k - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
' {/ v; Z4 ]4 X& n& q2 D -
7 A; b. X7 V9 y - JSR FC_PPU_Procrss;PPU处理
0 j$ X7 p. w8 E -
1 u9 h4 P( K! X7 K+ W - ;精灵内存更新 p0 n. f- a& @* t3 b+ ]/ V
- LDA #$000 i' \& B0 J* S' `' L
- STA PPU_OAM_ADDR1 h, T) n) \5 G4 u" T6 Q
- LDA #OAM_DMA_Buffer / $0100! I8 O" n6 |* `/ v0 U: e# i' ]
- STA OAM_DMA L2 z! y+ g( K& \, M" v; S
- 6 v3 Q* ?1 k2 q; N% Q* N
- JSR FC_Gamepad_Process;手柄输入处理
& `3 h( K) W) P& A4 }0 t - JSR Music_Select_Process;音乐选曲处理
/ s" g1 O8 e- V3 @% ?1 Q - JSR Music_Play_Process;音乐播放处理
S! n: J1 ^" b8 K! ?. v; D - $ \, P& h) {- P; w( N( R" d: L' G
- PLA
+ m" R6 x; A& M4 g9 P% `% a - TAY
0 S7 `" n( A( s: y, f8 r - PLA
. f% A5 o3 _, |1 a; O1 K4 }8 q - TAX9 Z7 g& Z' R* z1 T+ u7 K) @
- PLA
" m' [, _# l8 F8 N2 l. U
! C/ R g' e5 Y4 i% i7 Z- RTI' d; |( z2 B- R: g+ I+ |
- 1 s0 a2 j& K" Q* d. n
- ;======================================================================
- H4 [7 _& l6 o4 K7 k# f - ;请求中断处理1 {: c: I7 p( c% T" G: t5 X1 c2 z8 P
- Irq_Program
7 k# j1 g$ W; p3 i - RTI1 o! t$ a$ v; R0 W3 f- g
- . Z5 n3 O4 N% `0 Q: R+ a8 B7 O
- ;======================================================================
; d5 Q0 ?2 A0 R8 [6 R - ;中断向量表& a4 m$ W' K1 ]3 n8 \9 q
- .ORG $FFFA) p' T2 m% n+ J* |6 y" J* v
- .DW Nmi_Program ;NMI触发时执行! z2 k$ j; U: N/ i4 \1 b7 c3 r
- .DW Reset_Program ;载入ROM时最先执行
1 x0 M: `) I9 q6 x# R - .DW Irq_Program ;IRQ触发时执行
! D# m; z; [% O7 E4 d: |3 N' F
复制代码
& {4 N9 N/ V, d4 p& `+ h4 _+ E1 @. H5 E. K! ~
2 X8 Q1 }( Z" i4 e- F0 x
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|