|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
. \; ]1 `; q/ H7 Z7 {( I * I4 X7 U) ^, t: X4 v- ]
以下是主框架代码:6 G4 e% j' G( w% R2 c! s+ q" V
- ;======================================================================' [9 i; u, S& N# Y3 L3 S7 X
- ;文件头5 k* V( q+ v7 T8 l9 u# G: X% q
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量% r' Q I3 W0 M4 ]& Y; b
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
) I7 ]! w" ~( h7 r - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码0 x5 k! [! M: s! i' L( u5 u
- ;======================================================================
, L0 d4 z0 V; a/ a* U - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2/ g$ Q. }/ v1 y+ X3 `. ]! m/ p
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1( y( m K# s# a; d1 ]
- ;======================================================================/ [5 l/ ]! y& d! j
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1- t! D2 G6 I6 m7 b
- RESET_ADDR = $E000 ;主程序起始地址8 H( }# B0 A$ I/ ?( n0 d4 t
- ;======================================================================' p5 _$ {4 C5 A% ~5 c4 u/ Q8 u1 @5 B
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
& K% |, u) W9 G7 `/ Z1 S - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
0 a+ D; C9 c" _3 d, F1 M6 L - .INESMAP 4 ;Mapper号 (0-4095)( L* a+ z8 M( \$ V$ x! O9 V6 [
- .INESSUBMAP 0 ;子Mapper号 (0-15)- D% F. b( a& N7 ?) q6 M: c# H" p
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
+ E: W/ C0 a R& }6 Z. G# ` - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
5 u- l0 Z/ M7 j' U - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
$ @: v. A; M* Y1 z7 w - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)/ K& b! W ~# H) F
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
( N) O* s$ ^" D0 R7 f - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)2 C6 _4 D9 C1 m& |
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
" W2 s# _/ N( P/ q* A3 J; t& r7 c! T2 l - ;======================================================================
, b- U4 Y5 s) c6 I* Z% A i - .INCLUDE "fc_demo_config.asm" ;全局配置
5 T9 K7 }0 H" M - .INCLUDE "fc_demo_constant.asm" ;NES常量
' F P3 r) O- p - ;======================================================================& b% f% W; k, p' q& l3 d8 o
- ;音乐配置7 Y6 @, c3 R6 n4 |
- .IF 0 = MUSIC_THEME
3 }# t9 T: S: n7 q2 C - .INCLUDE "data/music/Gremlin 2/config.asm": P' K, g! I" _2 Z! ^
- .ENDIF
) g* \9 C! y, c. S6 U - % ?$ b5 I' I& k# @4 V! E( d2 v
- .IF 1 = MUSIC_THEME3 [3 A$ H/ D/ ]
- .INCLUDE "data/music/Raf World/config.asm"! m- s# a* M# E4 E5 x8 s
- .ENDIF
. t0 W C5 s. ~ -
4 y0 F$ c/ c3 K( F) O - .IF 2 = MUSIC_THEME
. v3 W* a* s2 w# ^ - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"5 u9 m# Q& |) ?; z# k0 r4 U7 B9 k
- .ENDIF
) X4 z& I; o$ W8 j0 l; v - 2 S/ x0 T+ V) m2 r) V& D: c
- ;======================================================================0 [$ S G2 T0 D& M
- ;引用CHR图像数据
+ K3 I$ Q3 z% l m - .BANK NES_16KB_PRG_SIZE * 2! E0 G" q# [' k5 r$ [% `+ d
- .ORG $0000
" k2 u0 w" s: `9 w$ ^9 h - .INCBIN "data/bkg.chr"
; _; ^8 o A: p; r1 V - .INCBIN "data/sp.chr"$ F9 ?9 {. k4 |- v2 ]$ l
-
9 \; Z$ K; W# m: x' v t - ;======================================================================+ E; X! u4 s _! g- q' g1 @
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank- b, W7 S3 r1 u/ L+ |) i% s8 s
- .ORG RESET_ADDR
) X: |% J3 P. v: Z4 q/ M! `5 ] - ;======================================================================
6 W( t/ ^5 R# A$ z4 p# d - ;引用其他源文件 n$ K/ r, Y( V( R# ?0 C
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
' x) {% t# v7 O" m5 P8 o) D6 V0 H - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理: `5 I. Q l# Z* T! f
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理9 ~7 y9 g4 l" y5 N% r6 R# e
- ;======================================================================
- k! u, T7 }. o* j - 3 Y5 t: l% p4 L, U8 F
- ;======================================================================1 ] a8 O4 ]9 H$ n$ n
- ;等待VBlank到来
4 a. C( l! P) p% c9 T6 u/ {; h0 Y/ _ - Wait_For_VBlank% R6 W9 u3 |2 y( Y, _7 A6 u
- LDA PPU_STATUS
) s4 Z( h1 J6 n( i# J$ b# c& E5 l - BPL Wait_For_VBlank& Y; ?6 y( {4 I4 y0 w% F) W$ H' \
- RTS% { Q/ i; u/ |& f$ o( v5 A# l
- ; h1 C* w, b* o8 L
- ;======================================================================
9 X7 o' M! [% q3 d" i6 i: \' H - ;调色板初始化
! j4 k8 |4 |' X - Palette_Init4 x& c7 M" y# W
- LDA #$3F
$ O0 n' X8 K( ?2 }* | - STA PPU_ADDRESS, t; A, \$ f# H5 x/ h
- LDA #$007 Y) z( P- ?$ F
- STA PPU_ADDRESS
) h1 W4 Y/ g3 x/ [ - LDX #$00+ D4 L* O2 e( k7 s+ s# n2 y5 C" m
- LDY #$20
$ Y3 O& S4 a& S6 r# p+ X - .Write_Data" W6 z* l( b; K7 }
- LDA Palette_Data,X
6 O. I! c. I r1 P0 `0 j- O) s& s7 u - STA FC_PPU_Pal_Addr,X
4 p) T& U* C# X. N9 Y - INX* v' R$ ]8 m2 s8 I5 [8 L3 e
- DEY
L, \- C4 F& N7 Q" j( x5 y2 r - BNE .Write_Data9 m2 J n. r9 u1 ]2 U Q, `- o
- .End
: U6 O, _5 n8 Y Q T - RTS
" }% Z5 H) ~1 m2 v9 x }0 b$ H
- w# m0 X0 n6 L+ y; [" u- ;----------------------------------------0 ~6 D( M3 K! i: o1 K
- ;调色板数据 ?1 v/ g1 |) v) P5 d
- Palette_Data
! r t `4 k2 F0 @7 ]2 F# ~ - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
' M, g+ \- i" ]9 ~% e3 P7 h6 } - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 220 N9 a& K+ @- f& k$ L" L
-
0 I6 A* i, `% ]$ f- z - ;====================================================================== X* j* }5 {3 R& F+ `! _2 z3 ?5 c
- ;命名表清空
1 F. {! q! x4 C2 j" g9 a - Nametable_Clear: m! i' m ]8 Z0 {) W
- LDA #$20( \6 P+ Z* K! _
- STA PPU_ADDRESS
" b) W& K1 a2 g, L - LDA #$00$ n7 d; C9 Y/ ~
- STA PPU_ADDRESS
6 N! i5 g. d8 a. Q- f - LDA #$00
\# \; B' R+ ^& ~ U - LDX #$00( R0 ^, O1 O, o
- LDY #$08$ G& |4 M) {; I
- .Write_Data6 {3 g0 z& w( S) V
- STA PPU_DATA6 d8 Q4 m4 K/ D0 I% a% x8 L( s: ^& o
- INX
% y! p2 y; S* w" p* [ - BNE .Write_Data8 l5 F* N8 B% d; j) z! Y5 ~
- DEY
' e, U# s; M. H" J4 @ - BNE .Write_Data
- T: G5 u% b5 V$ u+ C - .End, _* y& z+ K: ]# c" o7 t
- RTS
; V7 N" ]/ g, U5 T8 t! x6 {8 s
, W6 `# @/ }, G- ;======================================================================6 w1 K3 L W8 k8 h& c3 H* U
- ;音乐曲目切换7 U& F) g5 P* h" [
- Music_Select_Process- j6 f; ^2 W J" U9 l
- $ i' S* B" W4 m' m- C9 C; c0 P
- .Pre_Music;上一曲! _+ f7 t, c: Q7 n' y
- LDA FC_Gamepad_Once
. t+ d4 V: U7 R4 m7 o6 B - CMP #JOY_KEY_LEFT5 f2 ], b* \' \% H5 d. A/ L6 R
- BNE .Next_Music
' E1 _: ^1 [5 g4 Q: N - JSR Music_Play_Pre! Y" [* \8 F, `9 t( u$ X% L$ _- O
- .Next_Music;下一曲
) z5 c; I1 J) [ - LDA FC_Gamepad_Once
3 @! H4 u' |+ e2 W" m; A* p8 j - CMP #JOY_KEY_RIGHT3 ?/ h( | k, }# L; L
- BNE .Next_10_Music
3 j, p2 `, w' [% K( h% x - JSR Music_Play_Next# X# o& H$ Z/ }8 e; l+ S4 n' X
- .Next_10_Music;上10曲6 D# K& V- V; c5 s8 B+ K' j
- LDA FC_Gamepad_Once
8 h, z4 K8 p. N4 G b - CMP #JOY_KEY_UP
3 k+ p6 ]9 f. V) ?/ k; V - BNE .Pre_10_Music
) Z' X( K* K/ ^3 V# ? - JSR Music_Play_Next_10* i) u# R3 o& g
- .Pre_10_Music;下10曲
2 E4 s0 u, K t. d5 x - LDA FC_Gamepad_Once
9 M, T- Q, P. X - CMP #JOY_KEY_DOWN
P7 a2 h1 v% l - BNE .Reset& j$ U ]% S$ c! C
- JSR Music_Play_Pre_10" U' L* d. t! ]6 W! l
- .Reset;重播当前曲目
8 t* Q9 y; L s& h# d - LDA FC_Gamepad_Once
; |' j6 b/ H* Q4 m _ - CMP #JOY_KEY_START) u% K" X8 S( ?# s& G6 c; \
- BNE .End
- d, }" L3 T5 O6 K( ^* }, ^9 h; D% v$ T - LDA FC_Music_Index P& H2 O( c4 y$ B: x* `- @0 O1 k
- JSR Music_Init_Process0 L. \+ G9 B4 y4 ?* J( D4 w5 c7 e, n
- .End S6 _. |- Z {, ?
- RTS, }3 ?+ w3 ^7 ]# `' s7 E8 y
- . D9 s# j$ R4 J) j0 v
- ;----------------------------------------------------------------------
! R( V+ P, P( c3 Z+ t d - ;播放上一曲
_1 Q' [/ Q0 Q$ V - Music_Play_Pre
% j; U" @, y- ~ - LDA FC_Music_Index/ m7 e6 `* ^& s" y4 z) G5 q
- BEQ .End
" r3 w. X% G0 V8 V# n - DEC FC_Music_Index
& @. F( q8 ]1 y9 `; e& D - LDA FC_Music_Index4 ~; D% l" |( f( w; F- K* t
- JSR Music_Init_Process3 S- Y+ g+ n K, K3 I t4 Z
- .End
) S% d3 ?% \$ Y9 R' K5 t/ Q4 ] - RTS
6 U: O& {3 H2 l& ]. q7 Z- r# B) P - ;----------------------------------------------------------------------! t+ f; P8 B) p2 ]
- ;播放下一曲
- a, A1 f$ Z) T& P5 B9 g- Y1 V4 \ - Music_Play_Next; V& f. E) r8 ~ q
- LDA FC_Music_Index
% X: R! H7 H4 F( L: C/ | - CMP FC_Music_Max_Index
; M- w3 A7 B, S$ {# u - BCS .End# P7 i# ^0 y3 L' U+ V2 w& _/ m5 N
- INC FC_Music_Index& D+ a7 v; z8 H! K
- LDA FC_Music_Index
+ j. L8 J. r3 o; A0 _$ t - JSR Music_Init_Process4 x6 b* ]0 ?8 w, X' r) v
- .End
; T* R$ g% t$ n* o- S- N0 h& i - RTS
* g' z5 r" ]) n$ U
' y6 ^( }! _2 {/ j5 g- ;----------------------------------------------------------------------; u& _0 ]/ `0 F/ ?- j
- ;播放上10曲
+ f; w6 D- f. q9 V+ s: m - Music_Play_Pre_10
5 O! B. [3 ^' p8 m9 a9 M( u$ k$ K - LDA FC_Music_Index' n$ E: |( [# o( l% R/ k& f
- BEQ .End
, f5 @) U7 A) F | - SEC
: Q+ s, ]- x: L+ e' w - SBC #107 t) c; A. ]/ R; K) X
- BCS .Pre_10" X/ B# F0 e- ?( u
- LDA #$007 T, @( D8 b) |' c& F4 ^" I- s% Z
- .Pre_10/ E, {" q" }9 {
- STA FC_Music_Index
& B9 K- h3 k2 u! j1 F& a - JSR Music_Init_Process- w$ @* Q1 d4 x$ v% g& k
- .End7 n: x `9 @2 b8 T
- RTS
3 |( J3 h5 M! d% V- `: a - ;----------------------------------------------------------------------# `8 a* Z5 r/ {, Z
- ;播放下10曲
( i9 V3 u O$ N/ P/ k* C% b' L - Music_Play_Next_10
* D; Y' M6 E5 z) L( P - LDA FC_Music_Index
- g* C2 i, x' c0 E6 b* T - CMP FC_Music_Max_Index
) |& V+ ^4 _2 w: r8 Q; o - BCS .End9 J/ ?( C0 O7 ~' N% n2 N
- CLC( a! X6 w- C' C" L
- ADC #10) |5 b* Y. u7 E. M- Y5 e) E( h
- CMP FC_Music_Max_Index
* R* z/ }5 ^' ~& k - BCC .Next_10
+ A! B. O3 R4 B# m - LDA FC_Music_Max_Index
" q: e/ g- i$ M! G7 I8 ^; ? }3 } - .Next_10
: O' A. `! D! A: v1 k - STA FC_Music_Index
- C9 j8 s$ A& h Q" m - JSR Music_Init_Process
/ F# I+ ~- e- @, I$ V) P3 w2 j - .End# \) {: u5 ]; G6 u6 K- z' @0 A, }
- RTS2 S4 E/ M& J9 q7 w: ?
- 6 x8 E# W+ e. v# a
- ;----------------------------------------------------------------------+ ]* ], ?5 R& ^# W2 p+ l6 v! z- K
- ;8位十六进制转3位十进制制6 q8 G: m5 `+ \: G+ X! Z
- Hex8ToDec0 K$ i' S7 @9 W" s
- STA FC_Dec_Data_1( g2 _; M7 G0 [% C/ v! b+ r) Z
- LDA #$00
7 }2 Y5 x0 ~9 L$ d - STA FC_Dec_Data_100* V% ^ u9 L( K8 W
- STA FC_Dec_Data_10
; v1 L. ^4 l0 A& z - LDA FC_Dec_Data_1
& |! v4 k. u) L: K0 V - .Convert_100
3 O. `0 U0 V8 W0 N. z7 y; J. Q - CMP #100, _4 i& s6 E+ I8 O
- BCC .Convert_10" c( ~: c2 c7 {/ I
- SEC4 v: ?4 L& h8 l+ ]$ M3 v: h
- SBC #1004 {5 ?: g3 V7 {4 a+ [, i9 x
- INC FC_Dec_Data_100
5 T# W) @$ a# C. A8 L1 h+ e - BNE .Convert_100+ _: v( ?( l7 G
- .Convert_10( i: @+ ]' j& d4 T
- CMP #10
8 E7 _2 [* e. k! \$ m& A+ W; m% g, c - BCC .End
; r5 u# { h) l0 H2 F - SEC/ t; g1 D; F& `5 s. e/ L
- SBC #105 n# ?/ a9 G' c# e. g& O0 l
- INC FC_Dec_Data_10
$ N3 f& C$ `) z' q$ C. A Z4 }# { - BNE .Convert_10
% X9 ]' A' {3 z! o. K - .End% O5 s& e1 v3 m
- STA FC_Dec_Data_1: _& @ Q: B% s+ o! e! a, j
- RTS& c4 y) i2 Q, O8 \& e
0 S4 A9 f" W# @: i' J3 k- ;----------------------------------------------------------------------
) ?5 ^1 ~; A9 q5 E - ;显示曲目信息7 x& s D$ X2 ~/ k4 {
- Music_Info_Display
o; C3 e( `0 z2 E$ _; g0 V- p# K - LDX FC_PPU_Buf_Count
% ?! Z( ~3 K6 o" m, _5 L1 I$ I - LDA #PPU_WRITE_MODE_CNT_LINE6 [9 Y8 O5 v4 B4 ?0 L p
- STA Use_PPU_Buffer,X
' v! t- U4 P+ V5 j: I6 |1 ]4 o - INX
& x6 B0 x+ C; W4 R6 X -
7 e; _ {6 n2 h9 N- \3 E - LDA #>MUSIC_INFO_POS
* W4 w/ k* d6 b( _' v7 p1 G - STA Use_PPU_Buffer,X
1 }8 M4 V. v% L6 @* I - INX1 ~! H+ {" W) i# P8 d" Q
- " N7 U C4 p" k" J4 E2 Y" J" q, n3 q
- ;居中& w+ b: G+ U! J+ j5 Z2 v( \# m! n
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
# f( w& D8 r5 D p& r - STA Use_PPU_Buffer,X( L: v5 }9 O# Y8 u! U2 ~
- INX% [7 y! x5 x* t9 D
- ! p& c. T5 {" W, s
- LDA #$05
" j$ p' f% y: b; N - STA Use_PPU_Buffer,X
% d# |3 O3 g1 @, ~" Z - INX
8 v1 Y" x1 C' o2 { - * `, w: q% _5 l6 L ~
- LDA FC_Music_Index
) _' _/ ?# j7 ^) Q0 t5 r - CLC
" x! R7 @3 n- K( L1 f6 X% K( D - ADC #$013 [/ G3 m& K7 V& j6 c2 z5 o8 D' C2 i
- JSR Hex8ToDec" D% q) L7 w5 Q( ~4 W
- - c% K# N& d2 |" e, X
- LDA FC_Dec_Data_10
3 p) Q+ i: w: R, i/ A6 d9 S - CLC4 w9 h; z. b6 Q* y# v* n
- ADC #'0'
. ~9 \9 V$ ]7 H/ K - STA Use_PPU_Buffer,X7 u! Y1 ^# L6 S' l& O( m
- INX
- E6 x' F, ~* b9 R: m2 P - 7 y* o4 b/ U9 k# Q n% y0 F
- LDA FC_Dec_Data_1" T9 _; d$ u* M- g5 u. B: S
- CLC
7 ] N6 d, w+ _ N - ADC #'0'
3 R: K& {; e8 U) w8 ^2 v8 {* C - STA Use_PPU_Buffer,X
, d$ s5 f+ G" s% P' g" J - INX) G" o/ d# _1 Y5 F
- / T7 V$ B$ l- H! l( H
- LDA #'/': g$ N! N) i8 ?( M9 \+ V
- STA Use_PPU_Buffer,X
" M. ^2 S0 Y9 f, r. s9 q - INX' [/ c* \, T& X
-
% d0 v1 @; C1 Z+ [! w - LDA FC_Music_Max_Index
- ?9 N% _) i- s9 T3 b+ }* `1 w - CLC. Z4 I1 b& |6 V
- ADC #$01/ r! z7 G+ G1 c& Y2 \
- JSR Hex8ToDec
7 K. s7 o5 {0 P - 3 ]( E5 B$ E I: M6 m
- LDA FC_Dec_Data_106 M9 l+ t! t& a, F. Q) j2 a5 ^0 z
- CLC% e2 Y! E2 W+ Q+ {6 w' ~
- ADC #'0'
9 X8 Q# u1 _1 s - STA Use_PPU_Buffer,X, s9 ?$ K: |8 e; q2 s- z$ I
- INX% u3 g8 |% j6 Y n2 G
-
" X5 G' N5 S- l7 o! E9 w& o4 Z - LDA FC_Dec_Data_1
6 b5 w, Y! T& `& Z4 B% Z - CLC5 D/ G1 t" ^" |. k" P7 v, U- B
- ADC #'0'( _# p6 y/ T6 S% l) T' w- {
- STA Use_PPU_Buffer,X' t% D, G3 A8 F6 @: c) M" ~- a3 S G# M
- INX* ~5 x, s3 y8 J
-
/ E; y% h' D9 A" v$ m - .End6 q8 i$ i! I) {; p }, E
- STX FC_PPU_Buf_Count
$ E1 ?' L2 f$ A - RTS: g$ ~" M) F# t. `* v
- ! |2 n, O7 r0 x/ [# z; k
- ;----------------------------------------------------------------------
2 p; D- `) M- R) | - ;音乐曲目初始化处理
) B& u$ `/ R( v) X& b) { - Music_Init_Process
! }/ r, |( ^" [& P - PHA
( R8 [/ z, _+ P" d$ x - JSR Music_Clear_Process
: E5 x4 ]+ n; S - LDA #$1F& D/ S' R; [. p' [+ G8 k
- STA $4015, u5 \: u5 w6 q! @& `1 H
- PLA
/ @& r# o6 u) z" {# A) E8 W' _ - JSR Music_Init_Addr
9 C- ^4 @# b* o1 j8 [3 ~ - JSR Music_Info_Display1 l$ L6 j2 J0 Q! k- `4 c6 v1 M& K
- RTS
! t' T: Q5 K* O6 ^. P0 A1 x; J - . `' m. l1 L* {; x4 p% s) q
- ;----------------------------------------------------------------------) R5 Q, S" b; K' i k
- ;音乐播放处理
/ o6 N& L- O$ N9 H8 x2 @9 O& U - Music_Play_Process& y) M- Q' L6 \" o
- JSR Music_Play_Addr
; y" w7 L" I8 X% m" c - RTS# y1 f J0 _( @, f2 ^! S
- 9 [+ l: B) i4 ?# }/ S' {6 g
- ;----------------------------------------------------------------------
H, O, R) w0 r) s( S& S3 N - ;音乐播放处理9 A3 c/ ]! @! j. B3 }
- Music_Clear_Process9 l# ]' ~' Y2 X { `+ ]! t
- .IF Music_Clear_Addr! ]8 W6 k9 ?$ V" e2 ]
- JSR Music_Clear_Addr
% B# R1 n9 D$ g; W, r, b - RTS
& E, h* x+ X2 e5 q' W' O6 e- C8 D - .ELSE
3 Y8 Z9 k( W( ~" v+ | - LDA #$1F, m& u! N( q( N8 K2 N5 a! P( H9 G7 h
- STA $4015( Y& ?/ @ ]0 f- h
- LDA #$00
" W7 F& X& G/ D - STA $40103 _* I+ _0 ^6 H; ~/ V
- LDX #$00
) C( P; S0 N2 B - LDA #$00. ~2 a- y0 ]+ ^3 G& y5 K
- ; C. p( Z: a! H5 [
- .Music_Clear_Zreo_Page_0
5 Z) p) m5 g* a9 P/ \ - STA $00,X
+ y8 i# i: O) C - INX& E N5 L+ E! A; N" @$ W: }
- CPX #Use_Zero_Page_Begin
& \& L4 f8 |, s. k/ e - BCC .Music_Clear_Zreo_Page_0- ]9 L }! E: j/ W
-
4 m8 Q E* M# x; t9 t; E( p0 E - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
+ M' f" Q* [8 L# G7 \ - .Music_Clear_Zreo_Page_1: T3 A* T: k# F% A% y; s
- STA $00,X7 Z& r V% s: i6 ^0 O) y1 d9 U
- INX) l* S( Y3 U( I$ I6 G+ Q6 {
- BNE .Music_Clear_Zreo_Page_1
0 ^4 c- S3 W$ }3 m# H - 1 H8 D' e! `# d4 {% C/ S
- Music_Clear_Process_1
" o8 t9 N4 x- i: u# G - STA $0600,X
/ n* P( H! H) M; |# V3 J2 @ - STA $0700,X2 W8 G3 ?6 T) r6 W- z+ ]
- INX! c1 E: U$ p" X$ a) l5 y1 f
- BNE Music_Clear_Process_1
% y2 j1 D9 w0 m5 {! L# ^ - LDA #$10
4 ~6 V" h) j, x9 r6 Q: R! v6 | - STA $40008 v2 E. Q! D: L, V
- STA $4004
3 ?3 h! G# J; p/ L& J! | - STA $400C& C! A3 d1 @! Z) I4 E
- LDA #$00
( G, f. Z1 P% R5 w- Z: E - STA $4008
. B! q" J9 }! h* ]7 I - LDA #$0F" D# W. J# R/ v% k8 N' {! S
- STA $4015) S$ Q' D; e1 z1 [; E
- .ENDIF0 W s* ~- T- i/ b
- ! p3 k7 H: c' m" \7 r7 `$ i
- RTS m$ K# b) g0 o3 v" w' B( O
* Y; F; r0 }: Y) C& l. M* Y- ;======================================================================
) @/ F5 R- h/ I - ;重启处理
# r8 M) f, b" {8 u3 a5 i, s - Reset_Program& a+ v: _6 V- e E' K( |! y
- SEI
/ i) C! `8 h1 p+ a1 C& c) B - CLD
* F% ^3 f5 b5 i - LDA #$00
& ?+ Z- \+ c0 V2 M) W2 o - STA PPU_CTRL
3 x) c' c. E# O - STA PPU_MASK
/ \/ i" T, X8 ] - STA JOY2_FRAME
7 Q+ o2 x7 W" a3 G0 \; r' x4 K - STA APU_STATUS0 m4 o5 U+ r+ v/ Y- z5 W* G! ?- y/ Y' w
-
6 y, {+ N. T' N8 h( d: b0 a - ;等待屏幕准备完毕
6 k6 d+ R; s9 K' U( E3 T - LDX #$02
" Y% L+ `% }3 ` - .Wait_For_Screen_Ready
- o0 ]/ p+ N' B9 B5 t; y+ H - LDA PPU_STATUS$ m P, Z/ i0 y! g4 T$ k1 N
- BPL .Wait_For_Screen_Ready
3 }0 C5 i4 b. r; x) `& {4 h: Z5 } - DEX2 v% S% R q( o" x; ?
- BNE .Wait_For_Screen_Ready, r# D+ p; w" ~
-
! I2 H+ K8 t8 U2 A - ;清空调色板
( t3 A: D/ z) S( d! Z - Palette_Clear
; s- s# ^8 I2 R9 M/ C, R& o - LDA #$3F2 G9 b2 {! c! P
- STA PPU_ADDRESS
: t2 W& W' g0 h x3 B) V - LDA #$00. b1 V% x+ l1 l: C/ M+ X7 v3 B: J
- STA PPU_ADDRESS0 s# T$ }/ x: w
- LDX #$20# K2 g) k2 L1 f8 }3 u' W- L0 I
- LDA #$0F: y8 [2 \1 c% U) z& e: H
- .Write_Data
' f, z, g D4 u9 z( l+ o$ j - STA PPU_DATA+ r% g9 J+ b3 A8 R3 o
- DEX
% Q& ?0 b! _' }0 M - BNE .Write_Data
5 z: I5 G/ j1 p4 D3 M% X. ` - ( `" @( }! a6 H) R- D7 U
- ;清除声音 $4000-4013# e# m! j0 P$ Q4 J8 C
- LDY #$14
" A: j. f5 `; E8 L- o - LDX #$00- X" o/ {2 M0 `& C
- .Sound_Clear
( V- y9 j& g( d2 f/ l. l - STA $4000,X
4 H( _2 K. R4 U" J/ w6 E8 H4 f* M/ I - INX8 p4 _- w+ H$ ]: B! S' Z$ G
- DEY
: I& T- \, H2 ?% u; Y3 d, I H - BNE .Sound_Clear8 z/ x J& c% F2 @( C% l
- 3 O u! Z/ p& O% i( Z
- ;清除 RAM $0000-07FF% c% r' V" R% e* i2 D
- LDA #$00; u( Y+ N: M6 s: W( W
- STA $006 E5 v( u0 `# E2 e1 u! ~
- STA $01
. _* {6 ^+ Y f4 q* E( K j$ T/ V. g - TAY
4 I" P$ k8 Q( Q% P5 `% ? - LDX #$08
2 W4 E7 L- Y, z6 V3 a+ `4 Q: A! m - .Memory_Clear
, b# e$ `8 L" g" r+ r F - STA [$00],Y
: ]# X. V& o8 O$ s; } - INY: w; t- s) m& g l$ D" S
- BNE .Memory_Clear
2 E) B4 @ m$ ~( A8 j - INC $01
, Y" U. o0 R/ Q7 `9 y" A" x - DEX
+ O8 E$ ]# e5 Q. }8 `' A - BNE .Memory_Clear( Z4 e1 o$ \, L* \+ j
- * f# p' i- T: W5 F$ Y
- ;精灵缓冲初始化! c7 r; |( |+ n+ \) r
- LDX #$00
# x: B2 N( y$ Q) G3 H - LDA #$F8
+ a" L! D9 o" h% k, C% ] - .OAM_Clear
3 ?0 E% q, l: L2 ^& P, s( T- v; M - STA OAM_DMA_Buffer,X* d: \6 G/ j* [) h5 U I6 L; d. w: Q* \
- INX
6 s6 n: k8 M/ c+ a, {, A! o d - BNE .OAM_Clear
' b& ~& F) g, B8 \9 O! n$ i+ c - * }& V( p) p4 X. [; ] O6 ^% X
- ;栈指针初始化
) z" N, E+ m9 \! P! W. z% V - LDX #$FF( y5 o$ Q$ `5 l0 k _
- TXS& @8 x/ i( A4 p* O2 u' r
-
$ V$ @3 ]) e" D, v9 N ?: f1 c - JSR Nametable_Clear;命名表清空
% z: U4 E% I0 s3 B; r( P9 k7 Q - JSR Palette_Init;初始化调色板缓冲( z1 n9 J9 x& s8 C( w8 {
- JSR Static_Text_Init;初始化静态文本
2 }/ W( i- E. Q! M$ d# l+ P -
, W' Y8 g8 R' q( J - LDA #MUSIC_ITEM_TOTAL - 1$ ~% M6 Q1 o7 F; w0 t+ C- i1 i
- STA FC_Music_Max_Index
- y" r! w% q' J. G - ' s7 s8 X; F& @6 W. l
- LDA #$1F
" E; l1 P: g) X/ g: g - STA APU_STATUS
5 A9 ^% S6 ?3 I: {! p( L - LDA #MUSIC_BGM - 1
- g5 h0 O5 u. e - STA FC_Music_Index
2 g/ y- D1 y! |7 [5 T - JSR Music_Init_Process;音乐播放
J* h. m1 h/ d! {: q - 4 x0 S4 l/ [6 `. [: C; f7 V
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)! M8 t* a% d. z% t% n, a
- LDA #$1E
2 m+ a- G, _. Y* ] - STA FC_PPU_Mask_Buf
; w1 A$ P1 T' b) T: M, v9 o6 p -
+ ~( ^/ z0 N" w6 p R4 Q - ;启用NMI处理; {+ B1 ]" y/ o8 u
- LDA #$80
4 C2 |, u N3 E% _& G; h - STA PPU_CTRL
' g; o+ C4 U' f! R* ^ -
% U, V( A6 ~( y1 `$ }( | - ;程序循环, 剩余工作交给 NMI 中断处理
" x3 b$ l& ?- E$ k6 k - .Loop9 w& M0 _' L; K; u x8 Z) n! M
- JMP .Loop
* S8 j3 w9 Q# n* X5 a - , O! l& n h+ o1 m6 [9 R1 k8 q
- ;======================================================================4 v+ Q+ X/ X2 d4 g
- ;不可屏蔽中断处理
/ K& r9 ?2 w d: S& G/ M2 K - Nmi_Program
" T/ h7 `/ F3 r1 ?9 S - PHA/ Q* g+ n& {# G
- TXA
# F, s8 K! b, b0 A0 y, [& K - PHA
0 d' U( |: b, j2 ]& T- c ]" P- q - TYA- h- V& F0 p+ y- g: `5 H, s z
- PHA- w4 \3 o' H. Z8 f9 q
-
1 h$ p, i0 ~" T4 w8 ], h, \3 H, u2 } - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
% s/ L+ Q; c5 e* g& X% z -
* E$ H4 g2 `8 u! i1 }- x7 R - JSR FC_PPU_Procrss;PPU处理% W' l) ^6 t- w4 X; {5 d
-
' U' a: ^- [ l) ]0 e, ]2 r - ;精灵内存更新
/ f" q1 P5 f# m# F4 M7 M/ b - LDA #$00
0 C" Q6 u2 V _+ e& a - STA PPU_OAM_ADDR
# l: r: u/ d. |6 `+ j: ~& \& U" ?$ X - LDA #OAM_DMA_Buffer / $01003 N1 C: M& ^' g' e) ^* A9 j* H% b$ n
- STA OAM_DMA) T- l9 F' r% Q/ g
- 0 b7 Y6 Q+ k) o: N0 x# T! G8 U1 }
- JSR FC_Gamepad_Process;手柄输入处理
7 i* L, _8 k: W - JSR Music_Select_Process;音乐选曲处理! G& w4 x/ e# z+ _6 j6 M9 t
- JSR Music_Play_Process;音乐播放处理
) H+ L. r* \, w+ Q% ` -
4 D1 R2 ]' a; e# [# l" m - PLA
2 H7 U; J1 _: v9 A' J; N - TAY7 _& h* }# J/ T& ^& O v4 S' W2 ^7 L
- PLA5 Q7 d( ^1 @8 b1 R" K
- TAX
# x. f. Y9 q2 A7 ^6 ?" c {3 A5 e - PLA3 ?8 J8 ~5 p/ A
2 y; N2 v7 T" f& z: E) a/ g% O- RTI
9 d8 Z" r& J$ J! ]( J - % m# [. o2 e, K; g& w$ \. Y$ e2 K c+ k
- ;======================================================================
/ ^+ T5 a. _) R: c: |' i5 q - ;请求中断处理
# Q7 k: o/ D' T6 d" E* _ - Irq_Program
5 C; P/ P9 s; w* b) \2 n+ y - RTI
/ C9 U9 o9 ~+ a- {: z
2 N" L' I Z) u0 a5 e- ;======================================================================
5 o" T+ O9 W' h B9 m - ;中断向量表
! ?3 F7 I- L5 | - .ORG $FFFA5 F# P3 o8 o" e6 M. g* B
- .DW Nmi_Program ;NMI触发时执行% J( q. a5 `% Y/ O
- .DW Reset_Program ;载入ROM时最先执行
! H/ z D* H( r% Y- q+ T E+ F - .DW Irq_Program ;IRQ触发时执行$ _- @2 Z5 z9 Q/ T5 `+ o o! E. E
复制代码
- b7 w9 Y% k0 w7 R9 W5 p" q- x
& y8 U" }8 s/ I( I+ O9 H+ X) }
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|