|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下5 N0 [$ O* j5 u t! r `; c8 l! L
0 t7 r X! o* Y4 X3 X8 }
以下是主框架代码:2 S5 B( Y9 c4 P# [1 u
- ;======================================================================
( B' ?3 k6 `2 b$ V3 m% ~ - ;文件头
* l, w& T$ }$ ]- I$ I e - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量 I. v8 x6 n* w/ ]! f9 v
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量" x3 Q8 _3 R P; s2 o7 F$ ~9 o! ^. a
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码7 e2 M6 ~, H0 f
- ;======================================================================5 e( K ~3 f; N) Z3 c
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
! V: ?: f2 I, l; H5 N' |8 b5 g6 M - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
1 E t6 t: `4 J - ;======================================================================6 T$ S2 z9 W- k2 T
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1! s( p3 r9 w. p( @2 F
- RESET_ADDR = $E000 ;主程序起始地址
8 c$ X- W5 _% _) V7 h8 ` - ;======================================================================7 S5 D0 U" c2 f j: j7 A* P0 `
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB7 a: V, t# V8 S; P Y& B H
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
% [! j7 e. X" K% e5 {4 D6 M" T - .INESMAP 4 ;Mapper号 (0-4095)
- L p6 Z6 W% ? - .INESSUBMAP 0 ;子Mapper号 (0-15)9 m( W& Y" K% w2 Q
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)$ t; d. R/ F1 b+ Y. _; m) ] b
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)) E2 |& a- ^- G a' @3 }9 h
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)2 L6 [" J0 ^$ l& V* t
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)4 r7 Z) C5 j2 t
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
5 }0 V1 V$ n% M) H+ f- ? - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
* I' M: u+ L; s a" { - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)' ]9 L6 N5 s, |- m8 O2 p
- ;======================================================================
! V% p: G4 Y& Y. a. n - .INCLUDE "fc_demo_config.asm" ;全局配置/ c8 L5 u" m4 e; o
- .INCLUDE "fc_demo_constant.asm" ;NES常量
9 v( B3 ~5 L& } - ;======================================================================( y: Z- Z4 @" _
- ;音乐配置: A6 R5 y2 Z( N8 m1 m! m
- .IF 0 = MUSIC_THEME
% k, D& Q2 G) X1 {( h - .INCLUDE "data/music/Gremlin 2/config.asm"
2 p/ V( ]* z7 Q' q6 d& N+ { - .ENDIF5 \1 v& `- X& P! }, B3 X7 p
-
Q" Z n, g6 G - .IF 1 = MUSIC_THEME
1 I1 i8 Z6 x, \. h% X/ k" ^) j. b - .INCLUDE "data/music/Raf World/config.asm") t8 o( }( s* G8 [7 O; P6 z
- .ENDIF6 F* {7 G0 e8 N" J; Z3 K
-
0 m' P6 Y" Q; D, I" c - .IF 2 = MUSIC_THEME 8 W6 ]" M* Z5 B5 u' z$ N8 W
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
2 x1 M, c$ S9 u# N/ n: J. u - .ENDIF
5 G+ N3 T% I2 C m# N: A
) |4 q4 c- K; @1 J- ;======================================================================
4 z/ R y* j' B - ;引用CHR图像数据9 y# V1 v# i. Y
- .BANK NES_16KB_PRG_SIZE * 2
9 u. x/ Q0 `/ _; y8 e0 M8 H4 x/ S0 ~ - .ORG $0000
8 i3 }2 T( ]4 l+ |3 l, |: q1 } - .INCBIN "data/bkg.chr"
: w9 j9 {* e4 c; d/ m, h# P3 U" w0 o - .INCBIN "data/sp.chr"- n& D( }" Q5 J) {3 W
- - G' U' I2 ~' H1 g3 s
- ;======================================================================
U L& m2 b) `8 X - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank2 V! }' A1 j2 W6 Q- j% i
- .ORG RESET_ADDR& E4 _. O+ [. [6 Y" H
- ;======================================================================
/ Q& C% ^0 | m2 v; v - ;引用其他源文件
* R3 |9 K! A7 n% v - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
5 n* F/ M" n6 P - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理# O2 o/ m. R2 p( q5 r+ u
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
a! i Z6 X& D8 o" _ - ;======================================================================
$ Q6 j) u# I$ f7 V" H2 a" N* i - 0 j8 V; Z; m- v+ M- w
- ;======================================================================
! |' s2 m2 p; r) b( o - ;等待VBlank到来. ?8 X) Y9 |( P- i; b# @" ~
- Wait_For_VBlank3 {5 p# a; D# |1 J+ R5 C
- LDA PPU_STATUS3 c% r! G, Y* o$ B+ E6 U% `
- BPL Wait_For_VBlank
' e) N5 z/ a: M6 t8 J( ?, u9 N* g - RTS
1 @, O' D4 b7 x+ l* U! c% ?' g
3 L( }. t$ v* p1 r3 s/ [- ;======================================================================
& p3 r A! d6 H4 j8 l$ t+ |8 o - ;调色板初始化
+ k! W+ U9 V9 l - Palette_Init* _; x$ }1 I1 W: f; ?4 k
- LDA #$3F
- W- |5 f; c* Y+ m5 \! j3 Z - STA PPU_ADDRESS
$ N: M# R- ~# _" u- x2 E5 B* }4 | - LDA #$00
( C! ~ q0 Z3 m4 f- ` - STA PPU_ADDRESS4 A# t5 o' `/ }( X# N
- LDX #$00
^8 ^9 J# q2 w! O+ S, r6 I - LDY #$20
9 u' ?; x6 R5 V- B! E - .Write_Data
& ]5 ^' B) l9 h; q$ s2 Y; U. H+ v- a - LDA Palette_Data,X
" \ `0 f t/ }3 ^& [( t& W - STA FC_PPU_Pal_Addr,X
b9 A$ Y% h7 M& [$ L8 r - INX
~/ }# i3 L; w* X' \3 f - DEY
4 \0 q- z! g' u5 d - BNE .Write_Data
. \+ L- |6 a, S4 V. Y2 G& z& Y - .End
6 X# @& A! G3 ` - RTS7 f$ Y0 h) c5 `+ X7 g$ t: l
4 N2 o4 e% v* u5 k4 h- ;----------------------------------------$ s, z$ r! \: o2 l. ?3 M- I
- ;调色板数据
' j. {1 K; H* ]$ s B& j* q - Palette_Data2 J8 W! n; \4 p6 ?9 F
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
: H: O X# ~' G- g* l4 e: p - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22/ g5 m( `! i9 ?2 H
-
9 [- u; {. @) M - ;======================================================================: I; c' V3 ?/ ~0 _$ z
- ;命名表清空
2 U; w, T# K7 L1 A3 f$ K - Nametable_Clear/ \! @# C% B: \
- LDA #$20( e6 S" u+ ]9 `4 B5 ]; \$ W. @
- STA PPU_ADDRESS2 v r m+ k; n' @
- LDA #$00+ G& g9 B1 i6 |3 }/ F
- STA PPU_ADDRESS3 O. d# u/ W- W7 q* k2 G7 M3 J
- LDA #$00" E( `9 s; [ q
- LDX #$00
$ R. O. u) V f1 W7 I- u0 M5 F - LDY #$08# S; g, j$ }! F. q0 u" F
- .Write_Data
) m, A6 z' r9 t, X) f0 F - STA PPU_DATA( z( F6 K4 D( |: q" {$ M
- INX9 ?$ {! a* r1 x- I# q
- BNE .Write_Data
' |' S3 P8 {1 s) I - DEY
: I, O: V( j! ? - BNE .Write_Data8 {1 f( c3 a7 ^3 u7 Z$ y
- .End5 T7 W4 z$ _. h4 X2 |9 l, ]
- RTS
% I' ]& w$ r$ \' s - / i- p. @+ p/ F& y8 s9 m
- ;======================================================================
7 z, l8 }+ A' | - ;音乐曲目切换 D! {8 \; J7 H0 Q: k+ V9 L
- Music_Select_Process9 n4 ?7 n$ Q% H3 b( J, n: v8 X
3 W: |7 l5 i3 q# d9 I) |8 W3 C- .Pre_Music;上一曲0 L1 S9 i# x" X5 [$ Z( V
- LDA FC_Gamepad_Once
$ o5 b" T% k; f( v# [ - CMP #JOY_KEY_LEFT; M0 ]8 {! t3 U$ `& {
- BNE .Next_Music4 y- D/ L% X9 x n
- JSR Music_Play_Pre
9 U1 x8 h1 q, `0 x1 c5 |: D4 v; f& q - .Next_Music;下一曲8 H, I* [! ?% @* u0 p: e, q
- LDA FC_Gamepad_Once
4 c! e# M- A9 N1 Q! L8 | - CMP #JOY_KEY_RIGHT
/ J" j8 x# Y3 A9 z - BNE .Next_10_Music! D' g; O7 f) |7 r$ T& t
- JSR Music_Play_Next( F; B! [" ], I( O. Z7 P
- .Next_10_Music;上10曲# O: l3 M0 @; v2 d- ]; A
- LDA FC_Gamepad_Once
: _) ~. K1 ]" s' m* C* [5 {; P; B. g - CMP #JOY_KEY_UP
. a" u0 x5 A' H - BNE .Pre_10_Music
' R9 D( w1 ~7 Q% Y - JSR Music_Play_Next_10
0 h& ^7 H0 C9 P" u - .Pre_10_Music;下10曲
& s$ l$ ?% e6 p& c6 i% P. V - LDA FC_Gamepad_Once% f% Z! B2 c! S
- CMP #JOY_KEY_DOWN
! E" e4 N1 \) L& e+ W" D - BNE .Reset
8 [2 X7 B9 K- I) { - JSR Music_Play_Pre_10; ] e( l) M2 e/ r- e
- .Reset;重播当前曲目1 m' l6 K* [- L7 {5 x- ~% Y
- LDA FC_Gamepad_Once
9 |9 ~6 H8 r/ ?6 R; w# F1 x - CMP #JOY_KEY_START
$ `1 S& j" U, C/ D - BNE .End( O# _- l/ F( T; w
- LDA FC_Music_Index
; @$ S' W# {4 b3 _ - JSR Music_Init_Process! ~+ x: A) ~- m: @
- .End0 e: v: ~; Z$ M: f
- RTS" H2 D/ X) b& l2 ] u' K: }% X
& T! e# p( c; L1 q- ;----------------------------------------------------------------------
2 m+ i/ [; L" T# o - ;播放上一曲
+ m+ |! N' r8 l - Music_Play_Pre
' ~) f: i: p5 K% M4 D; H3 F - LDA FC_Music_Index4 m7 l% O& n4 [" Y& }
- BEQ .End
, t" j' ~. Q- A' \3 A! P. ?$ P4 \ - DEC FC_Music_Index% y, Y2 W' X6 ^% ]! v* r& m: A
- LDA FC_Music_Index
& L( {) A; r- X* U3 @" r9 C5 } - JSR Music_Init_Process2 V: U- M' j% [& z$ |# R
- .End1 e% U! r* O4 r: r) d2 R5 C) w. D
- RTS- z. k1 b3 t5 @6 ?5 s$ O
- ;----------------------------------------------------------------------
: A, O' A2 L: j) t; M% r - ;播放下一曲
7 _8 \. k6 x: W5 \ - Music_Play_Next: x7 I( o- \ _3 K" |# m# i+ E v
- LDA FC_Music_Index
; S/ J$ D: o7 ` L - CMP FC_Music_Max_Index: k* T7 P: D+ r! F% a
- BCS .End
( d3 N3 M4 M- p4 s; S! j, b - INC FC_Music_Index
9 k! @6 d9 I1 r9 M) G$ m3 x - LDA FC_Music_Index
$ [" d6 G8 |1 M! P! Q- | - JSR Music_Init_Process
$ A7 o( n' `8 ^" q, I - .End
7 x0 b4 L- e1 }$ S: A2 \% G# H2 k7 y - RTS
4 ~/ I& C6 i7 a O
?- ^/ g* t3 k- ;----------------------------------------------------------------------
, ~ |# H% [% s0 b# N5 q - ;播放上10曲
& c8 d+ o* T" K6 X* h& }8 T - Music_Play_Pre_10, ^1 O4 a4 _! Q6 W# J/ z
- LDA FC_Music_Index
8 n8 o& u' } z6 S2 B - BEQ .End) m' Q6 \8 F/ i5 ^; N, Y3 m
- SEC
$ O/ [' A" A g$ k: T - SBC #10
' y% \$ ~6 S& W- m* `- ?) D- f$ W - BCS .Pre_10
3 Q: s7 M Z6 g& V1 M/ e; R2 s - LDA #$00
- y) m7 F) y& z - .Pre_10) N. a& }& C% I7 y. U3 T: X
- STA FC_Music_Index; c7 P# y5 x; D: T3 T/ W+ K7 x/ q+ y
- JSR Music_Init_Process
) M; v4 G0 T# r8 F - .End
' p+ @1 D) j: z0 s6 _4 v - RTS4 _& t, w( C( Y- r4 F! r! s
- ;----------------------------------------------------------------------
5 D) Z( d% l0 [+ |" M - ;播放下10曲
$ Q5 U) C* Z/ i+ `% {! ] - Music_Play_Next_10) f1 {& b' U8 u J
- LDA FC_Music_Index
2 ^& B A& Z W) [! b7 z: Y - CMP FC_Music_Max_Index
0 A9 C1 F& m/ `( c/ M - BCS .End" {* M. D: e" ^
- CLC
; @: c" V& u" h; g! v - ADC #10( g4 ?& F- u W j
- CMP FC_Music_Max_Index+ v: u: \4 K3 L) d8 M
- BCC .Next_10% G( I1 V" A' C& q/ c
- LDA FC_Music_Max_Index& D5 J) `" G/ p9 J2 E) S
- .Next_10$ ]) ?7 J6 j2 L! r' ?
- STA FC_Music_Index
. |# w6 a( s# S; f - JSR Music_Init_Process
2 A7 I* l% [4 \9 K - .End2 m/ R: O' c: D$ ^" m0 q
- RTS
7 h) L9 B) a2 G$ M R& D - ( U2 }. U, C4 P- O5 S
- ;----------------------------------------------------------------------' n% B' I5 K! N) X: y3 G
- ;8位十六进制转3位十进制制$ D9 m3 G5 C4 g' I3 Q. Y+ S3 f
- Hex8ToDec: D9 T& c3 J2 t
- STA FC_Dec_Data_1+ k) w! l% J: m
- LDA #$00
" ^) C; q* M! c& A; U0 V - STA FC_Dec_Data_100$ U( y9 O0 d0 _: ?7 p( @
- STA FC_Dec_Data_102 j( I2 U5 \, V! k: ?8 r1 d( k- I
- LDA FC_Dec_Data_16 u9 g) o. z1 r: j
- .Convert_100
4 g6 r8 n: K& V* o - CMP #100
" R% w$ m7 z2 e# w* N$ w' q - BCC .Convert_107 A) {8 y% D$ N9 c, i% ]
- SEC$ l, Q7 f' N5 O* u5 H% M9 ~
- SBC #100 x- O, X3 u7 k4 l. w
- INC FC_Dec_Data_1004 Y' t" b& Z! O {/ p
- BNE .Convert_100
7 }, \- S& J A. z4 l - .Convert_10! E+ p S# C& y! v
- CMP #10, d$ V; z- ]; ^4 f6 D% @ k
- BCC .End/ f2 b% |( j. a7 y1 T
- SEC3 v4 f) \! Z# z5 `$ c
- SBC #10
: p& p$ O: O2 C& P0 Y9 r - INC FC_Dec_Data_10/ H! T( o! L0 K$ [4 c V
- BNE .Convert_105 [6 e! l. r3 A5 J2 f
- .End, z+ a2 m6 J$ d4 e3 A# U! c
- STA FC_Dec_Data_19 V; P$ X9 u# [9 `0 Q1 s
- RTS6 B. q2 G5 _" P8 m- K
- 7 C& C) b E% S7 R+ W
- ;----------------------------------------------------------------------/ [% P* {! F9 L# K1 H1 B" u
- ;显示曲目信息$ k0 O; d& t% b8 i1 L
- Music_Info_Display+ B! w% e( R, t& e: B
- LDX FC_PPU_Buf_Count5 z4 T7 F* n+ s9 }
- LDA #PPU_WRITE_MODE_CNT_LINE
, s5 ~7 v( o% F- ]0 I - STA Use_PPU_Buffer,X
$ O- {6 ^0 z; \3 k# I& E - INX
$ G* r& L2 y: U; n) I9 X- _ - & L, h+ f' ?8 f2 @
- LDA #>MUSIC_INFO_POS% c: U! g7 r% f
- STA Use_PPU_Buffer,X
5 [( z, R, O7 F; ? e% W - INX( y+ I6 V) L# e' \- q
- / t6 `4 {9 W& q! h2 K
- ;居中
& E/ a' S }# Q- S - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2% w2 ~0 s' ^ }! ]% x' r
- STA Use_PPU_Buffer,X& |3 s. t( _* b& \8 ?
- INX- k- G3 X- f$ q! r% |
- B: x4 Y1 N3 d7 F# O2 w& d! u4 h
- LDA #$05
: S( `5 p6 ?1 z, L - STA Use_PPU_Buffer,X# I6 n4 c: V& P8 H" |( J! ~- b
- INX
0 ~' |7 g( [, f: H" C# z/ Q - 5 m# I6 {# V ~. T: d
- LDA FC_Music_Index
6 }6 h' [, W5 d" A4 G7 K ] - CLC
2 T2 F( P9 A( h$ U. ?$ [% b9 e - ADC #$01
- i7 I% T; j0 T4 I* }9 F - JSR Hex8ToDec
; A& E0 ~! A6 \ -
3 m. P' X5 w) |8 S - LDA FC_Dec_Data_10. W. i1 |4 {) x0 p8 Z; d
- CLC
. h) d9 H1 S) D ~5 O: j - ADC #'0'
! H8 m. b2 R2 M - STA Use_PPU_Buffer,X- c- h0 ^ u5 f5 f3 a1 e
- INX
5 @- q# N7 W/ E2 e -
' }/ o; I0 e" x% G S% d+ i - LDA FC_Dec_Data_1
: W3 [ l; o0 X- X2 N5 o - CLC
. [/ T; f- w6 m7 Z - ADC #'0'# e8 @/ w( j% X0 G
- STA Use_PPU_Buffer,X! d# m6 I! @$ G5 X
- INX
9 h0 ~+ P- L# d& u -
7 e" B5 {+ x( |1 h2 [ - LDA #'/'
1 J/ Z/ g0 a" U" g$ O" Y2 n - STA Use_PPU_Buffer,X0 @5 j/ v- l) j; b6 I4 p" Y
- INX
/ l' z/ W3 q! H0 F -
* H- y/ G2 `) p& p* o# x& J! r - LDA FC_Music_Max_Index( f: _1 | @+ P) p
- CLC
7 w t, {; C" o. f0 \ - ADC #$018 X. w; Z, ^- r( r! f
- JSR Hex8ToDec1 r5 @9 l; N1 w0 r
- % m; x, ]! ^2 g$ x0 Z4 f6 O% z
- LDA FC_Dec_Data_10$ X- F- V& e5 v' v( @
- CLC
8 \, _3 e. b* f6 O4 R9 H% U* v - ADC #'0'$ v: E* H4 D% y1 r/ x# H; Q
- STA Use_PPU_Buffer,X
2 [! \) A: o# |8 G( Y - INX3 N: t$ o; o" s1 A ~
- 9 N8 @1 W1 F" o1 x4 c+ A$ O0 H
- LDA FC_Dec_Data_1+ C. s6 y4 i: G- d1 A; C
- CLC
* H+ i% {/ g, [) v+ }( @) z - ADC #'0'
8 O8 B2 d/ u9 j1 B; f+ b) g - STA Use_PPU_Buffer,X
$ `0 m- k4 O3 v2 f& S- D. g& X9 R3 X - INX
3 ~3 X0 j \6 a S4 [: C/ S! E -
0 K2 |* V/ r& e6 B- e. k - .End
, o/ l: G/ C( z$ G" B - STX FC_PPU_Buf_Count
7 g. I; S. U1 g: C6 Z: j - RTS
' Y- f$ |* m G* r - z8 @, s6 b9 [9 { y4 ]+ e
- ;----------------------------------------------------------------------$ h+ I* D: ~ j$ ?( w# x0 ]6 `
- ;音乐曲目初始化处理
- m4 z ]0 d. e# X) F - Music_Init_Process
! ^$ h2 N9 ~: t7 e: ^& i - PHA5 r6 k W$ d9 V; `; X
- JSR Music_Clear_Process
L2 K, Q! N9 e/ j1 | - LDA #$1F
1 _ S' u+ E/ A - STA $4015- {- P: K% S0 }( B) H! l. p
- PLA
. k. I0 z/ {. Y) x0 z5 X* r5 B - JSR Music_Init_Addr
! K7 t) V5 \( i2 {1 U& o4 t - JSR Music_Info_Display- `# F/ a5 l& Q4 J- N
- RTS
3 K) Q' q* k" n3 k _
) G; n4 ?% _0 Q9 }% o- ;----------------------------------------------------------------------
3 g) e2 j% L/ o" ?* w, L/ ^& V - ;音乐播放处理
2 y" l4 t& I; X% G& I+ d/ c, n - Music_Play_Process
7 Z% L! y) t( B6 Y - JSR Music_Play_Addr, r2 c& z A* O4 M
- RTS
% ]% d1 {% H: _1 e3 j
0 _: }7 I1 ?# I/ b( j- ;----------------------------------------------------------------------- r* T4 d- b0 n9 o$ d
- ;音乐播放处理
4 G+ k& e& G( N% X7 o; Z% Q" X - Music_Clear_Process
# c( f; o" }* r; d; t - .IF Music_Clear_Addr/ X: e* r* r1 p A9 c
- JSR Music_Clear_Addr( d8 L/ t' x$ q5 R: o5 f0 V
- RTS
1 V& Z. ~ b. F( g& D, J7 p; R - .ELSE
4 f9 v( B3 ^ l/ R - LDA #$1F! `- s6 t$ z% b: f: g% u
- STA $40158 r8 W& \: N8 Z
- LDA #$00$ y3 m8 u' o& t8 k* P9 i! q
- STA $4010. z* H# O) Z9 y2 a0 d$ X) g
- LDX #$003 X7 U/ `" N: j" z- w
- LDA #$00) E& L7 v; ~5 h c
- , h# {( e' t7 R$ E
- .Music_Clear_Zreo_Page_0
# j0 y6 R( N ~! F t% J - STA $00,X
, w, c4 ], Z& d3 O - INX0 a$ [' x, J3 u2 X' A3 {% b
- CPX #Use_Zero_Page_Begin
$ B2 n6 ~# q6 q- z: P - BCC .Music_Clear_Zreo_Page_0; E' {2 M. H ]$ T* M2 U
- - g) f( `! |( h
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size6 ]9 V" l3 `$ N- T
- .Music_Clear_Zreo_Page_1
+ Q% v& i; s( D/ ]; u - STA $00,X1 p0 G. A5 S8 g9 ]! K' `, a) x
- INX
# j% g m8 {, s3 Z8 ^# M) T$ X8 U - BNE .Music_Clear_Zreo_Page_1
; N3 t+ y L4 ~1 T/ o7 K/ m$ C -
* y5 u: }" m& }4 u7 K - Music_Clear_Process_1
8 L4 x( y. m/ U - STA $0600,X
1 e) k# y( J4 I' `- D% W! c - STA $0700,X. N$ I0 A3 k4 u; p$ {* R k
- INX
" g1 T( k; ~( z9 Q& k& J% b1 N - BNE Music_Clear_Process_1. z( n! o. X: }& P+ b) r
- LDA #$10, S% M @' v1 l2 Y! d4 k1 p6 V9 z6 a
- STA $4000
" {& \; X* H+ w0 v. A - STA $4004
* \8 u& u6 u7 k) r% }. ^ - STA $400C: O9 H/ V8 N* D
- LDA #$00
! B- X) L- ~# z' f B - STA $4008
- |! k4 {8 ?4 p: R7 D$ O - LDA #$0F
$ i7 z, O& E' O7 p4 {1 L# {( g - STA $4015
0 G* o. Z! S8 o2 m/ d/ H - .ENDIF4 ]" j( e7 I n. z! h9 T6 P
- ; R" F; ^) v- I/ P" [
- RTS. r! q& Z/ F( J
- " b' M" U R4 C
- ;======================================================================
6 ^: F8 `6 |3 _# F P, _ - ;重启处理
3 |( i) v9 {) g, ] - Reset_Program4 {7 [2 C2 l' H# l) s7 x
- SEI
: v) l+ h7 B& Z- o - CLD9 `: w- ~, i1 U3 \/ K+ Z% A! {* g
- LDA #$007 x5 t% d8 B$ V
- STA PPU_CTRL0 x0 t5 T) D( _; `+ J
- STA PPU_MASK
8 D4 l+ G# d" [) u - STA JOY2_FRAME
5 m/ P- @: ~$ t' ?0 X3 I - STA APU_STATUS
J2 d' T" O4 d$ \3 m- v4 Q) e -
% R A8 S& e- x: x- }3 @ - ;等待屏幕准备完毕
+ g- u0 W: f. \( ?: i - LDX #$02+ d* a7 X7 P0 Y: u1 p9 ` M
- .Wait_For_Screen_Ready1 {$ `# Q* k( F# z' Q/ |
- LDA PPU_STATUS
, T: D+ k! p9 j" o - BPL .Wait_For_Screen_Ready
& N5 }! z8 @7 ^( _- e" E - DEX
1 S/ S1 W) [ f - BNE .Wait_For_Screen_Ready
7 V' {& ^' d% N( p' B -
+ E) F# b* R! x- }! ?5 Q; s - ;清空调色板! o+ h1 n5 S: G$ J
- Palette_Clear
% t! X. H% t" L - LDA #$3F
+ L7 Z, H' |* X1 H. F, V1 b - STA PPU_ADDRESS) V& \/ I# `4 W3 D
- LDA #$00
- k$ W) J$ g, t5 k - STA PPU_ADDRESS; v) l7 t0 T: Z$ U: r: k; h
- LDX #$20
1 n& L* S! Y# u - LDA #$0F. Z% Z+ D. }) k- m3 z
- .Write_Data
$ ]+ p' F$ t) Y! H - STA PPU_DATA
4 r2 R' N Q C, D6 _: @ - DEX
$ K, }4 J5 ~- K, c# h1 { - BNE .Write_Data7 Q6 u, d2 d9 x7 U2 ^
1 U$ M% f$ R1 h- ;清除声音 $4000-4013% S9 r. i! I) l0 a' X& _
- LDY #$14
" H" {* x, a; y) {+ [1 L0 W - LDX #$00
w" t' j6 `* i$ n5 o, ?4 I - .Sound_Clear; y& N5 H1 _: T, R
- STA $4000,X
$ C; T2 a, \9 p3 m5 W' ] - INX& Y1 g) t& s" o" r1 M4 L
- DEY+ g* @9 R! E7 M, U2 T
- BNE .Sound_Clear) i! s6 F* c4 S7 R3 {
-
; m6 S; _. j" J3 n5 s - ;清除 RAM $0000-07FF* s8 j6 C. H; t
- LDA #$00
7 n( D$ c! }) [/ \% g+ S+ t: A2 ] - STA $00
$ S8 f9 H- Q# Y4 h# R' f: u/ f - STA $018 {; y+ W! F$ A( l
- TAY2 ]9 |; q0 H' z* y, T5 g1 r. b
- LDX #$08
+ B4 e2 P. B) h" F, a( T5 ?/ ` - .Memory_Clear
" { H# f% s5 N: R! r - STA [$00],Y
. Y; i7 `0 m2 `2 L0 r; G0 M9 w. ` - INY: x$ E: r; b+ f+ r* S6 v
- BNE .Memory_Clear# T5 f; T( ?3 Z6 `
- INC $01* E, @# F g8 N) L- v
- DEX
8 ^/ l2 o4 ^: N" L - BNE .Memory_Clear
8 J1 M* e1 \8 J, f - ) b9 |+ R. y' `# R: ?* N0 d9 F
- ;精灵缓冲初始化3 ~: r1 r5 J6 S. v" A
- LDX #$00
( B! m: I: T4 Q" E6 A& J! H) ` - LDA #$F8
3 Z0 z# Q& ^3 p6 ?/ }0 ]$ O) u - .OAM_Clear+ `6 {/ w! z) _0 c: a* n8 v
- STA OAM_DMA_Buffer,X) J% H/ G9 J( o+ _6 o, `8 N0 f# v
- INX
1 p4 [% s. K8 X5 w% M5 O - BNE .OAM_Clear
0 N6 f0 M) ~+ s -
" X) Q5 Q3 C t- w - ;栈指针初始化
' S: ~8 X3 o1 `% [6 _/ Y" f( q' B - LDX #$FF
& l& } H1 w5 o- b2 c' ^- t3 Y% V! o - TXS8 ~! E0 b: c# A8 l/ a2 E% v
- 8 H" b: N: x9 L( N% x
- JSR Nametable_Clear;命名表清空
3 a: D( Z9 J$ H - JSR Palette_Init;初始化调色板缓冲
( A2 m8 u6 R {9 f) D6 @ - JSR Static_Text_Init;初始化静态文本( @; X$ y- J" P L/ |- q
-
2 K/ a: H+ A; ~( H3 ~0 c# J - LDA #MUSIC_ITEM_TOTAL - 1: C+ W% A8 H4 C4 ~( r
- STA FC_Music_Max_Index
: Y! d+ \1 I+ u- h2 K -
, _' E. \( q( k/ |$ j - LDA #$1F$ V6 g& n: f0 `2 A$ p/ h
- STA APU_STATUS
# ^% {, `- L- a/ X. \) ^* X - LDA #MUSIC_BGM - 1
- v$ x9 A$ m% E- D1 J/ I( R - STA FC_Music_Index
6 n; R; }6 z* N3 c - JSR Music_Init_Process;音乐播放: q [5 ?6 H& i9 G- T
- 6 K' @1 M; k- P, V1 A
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)+ `& y; J, ~/ T! [4 B5 s6 n
- LDA #$1E9 P* W/ A+ j+ X1 c
- STA FC_PPU_Mask_Buf
( D6 @6 b- T* q. }9 T" _5 g9 Q -
3 R$ B3 V% l Q; Q+ G7 [ - ;启用NMI处理
/ ]( J0 J5 E7 E7 \% k - LDA #$80! u7 D4 p9 l4 [" B
- STA PPU_CTRL
' z- z( F% F2 o* O, m& M -
& J, h- u7 o$ Y - ;程序循环, 剩余工作交给 NMI 中断处理7 S& T: i" O9 B1 L' k, r
- .Loop
, I! z4 I, s% h# P1 q! v: q - JMP .Loop
|! H) Q* m% ]- r" l p) e N
3 m. X- k G) U- E, r" z6 _- D- ;======================================================================# N% T% f+ i6 A+ Q! [
- ;不可屏蔽中断处理
) z2 x+ X! G k" i P4 m5 t+ H - Nmi_Program
- r; [, P& z# v; { - PHA0 Q0 l2 f- S0 Y u9 \
- TXA
5 K" d/ ~+ F9 j1 z! r6 Q - PHA+ \5 d5 B* m3 V- G
- TYA* U1 {- |/ X5 d$ M0 V) w) f
- PHA1 c/ Q* b6 l; h( `; U& `
-
% g! |$ D4 F( X b' b - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
( P7 m1 s, A+ T - % v9 D# k4 q0 {5 ]! n
- JSR FC_PPU_Procrss;PPU处理
* e7 {0 z# i% b/ P2 n, l, G5 J - 5 ~3 r# c, @% Y
- ;精灵内存更新- F$ q# G! \1 U9 [4 r Q. P6 \8 H
- LDA #$00. i2 V2 f+ S F s: A8 @" X) z
- STA PPU_OAM_ADDR8 B8 p$ l) r# H0 n) K
- LDA #OAM_DMA_Buffer / $0100" P2 [8 [; E# E; E' T9 D; v
- STA OAM_DMA
/ N, T" C1 F- F) f - ; ^$ z% m2 \' ?. p' x w# ?
- JSR FC_Gamepad_Process;手柄输入处理
~ {8 }4 n, c( U' \6 f - JSR Music_Select_Process;音乐选曲处理
/ [: M, X r9 d - JSR Music_Play_Process;音乐播放处理1 ^# h( b7 c9 U8 e' }& x
- , r6 H" V2 D7 Q
- PLA# d- T4 f, u' h# Y" Z
- TAY
* o8 J; |# r0 ]9 j9 Y/ U+ j8 Q - PLA
. N8 C0 o, ?2 R0 ]7 \ - TAX8 q8 U5 U6 p1 x
- PLA, J6 k2 U+ m2 D; z* {1 [8 r; t* O: Y
7 L }) P. D9 W) o8 |8 N0 R# x- RTI% g7 U0 ?4 ?- K; y+ }' x
- 7 [. O" O( a$ C( Z' \/ w
- ;======================================================================
$ M0 z8 \2 j# \7 D - ;请求中断处理# K/ |6 H9 i8 @+ V+ O7 c3 D
- Irq_Program$ k: H o: \: R( g. o+ Y
- RTI3 _ K7 H; @2 _* K& o6 Z+ j: t) \
3 k( F# Z% K7 R ^/ n( k. }- ;======================================================================
~6 ]! Z l6 J+ h: j& a - ;中断向量表
7 P- u( a! S) M - .ORG $FFFA
' D' S; ]4 [2 o# ?! M - .DW Nmi_Program ;NMI触发时执行" w% S: c5 @- J' ~6 n
- .DW Reset_Program ;载入ROM时最先执行
% D) k, F' E: u9 e3 l5 b - .DW Irq_Program ;IRQ触发时执行8 B+ y" ~+ ?( T0 a
复制代码
" r" _/ F1 i3 z, Y% [* n* z! C t! s1 z9 y
6 v& T5 ]5 w! q7 d; D e
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|