|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
4 ?9 A9 z Y4 b. W7 |, g3 n4 f
4 u+ F3 Y7 {5 I& Z以下是主框架代码:
4 {4 ~: q. g/ X; C* g* [: p5 F- ;======================================================================& l# t* z+ `4 x" L
- ;文件头. q0 K/ p1 v2 w: H" t" {8 X
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
) |7 S, W! A8 ?/ p - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
$ G5 A- a& O+ I M+ V; L! W - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
K/ J9 W0 w+ Z% v/ O/ @ - ;======================================================================
, {) \2 {0 H; a( q7 }& A - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
% ~$ s$ k5 \ ?) } - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
U# f7 v7 r. C/ F, K - ;======================================================================7 i P; u+ @( |9 E" O
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 17 V/ ]2 X% D: m. c, A# U. |# @
- RESET_ADDR = $E000 ;主程序起始地址
5 U1 n' C( b' e" a* g7 t) W - ;======================================================================% \' b2 a4 T' ]6 V+ f
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB' F" N% f5 R6 w; m
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB* @0 ^8 M5 d& y
- .INESMAP 4 ;Mapper号 (0-4095)' R9 D7 {" U7 H: u8 r) f
- .INESSUBMAP 0 ;子Mapper号 (0-15)
+ _0 t2 M' V4 Q- l* l9 Y! `# u - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)/ \( g" b; R5 r! I4 B. c& v" Q' g% p
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)) K/ S8 m+ \( H8 g
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
# ~" m# c0 ~8 \; N5 f/ ` - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)0 z7 G; M' m- B$ V; b5 I* z% }6 g
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)/ W/ |$ O( I0 T$ n
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)& g% o: s& T& D# p8 ^ ?
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
5 \, G: K7 ~1 s% Y - ;======================================================================
% R9 o7 p" R9 V) L" P, y1 H% B - .INCLUDE "fc_demo_config.asm" ;全局配置
$ X3 t; A' `1 [ - .INCLUDE "fc_demo_constant.asm" ;NES常量& {3 a4 O) v& R
- ;======================================================================
$ D. P5 R/ ?5 z3 a) U$ W4 K - ;音乐配置4 |: A9 z; q2 z( A: y9 Z
- .IF 0 = MUSIC_THEME 4 ^# \9 E2 _7 @& b0 {. g' j
- .INCLUDE "data/music/Gremlin 2/config.asm"' d- O! M3 n2 d3 |, D. b7 t z' J
- .ENDIF
v$ n: C$ L3 C, p7 E/ C# j- i -
2 p! M2 L& s' E4 R" @ - .IF 1 = MUSIC_THEME4 N' t& F0 l' B9 L
- .INCLUDE "data/music/Raf World/config.asm" Q0 q: r9 U- M# b7 K4 p
- .ENDIF: A$ X8 Q C4 U, I- C
-
% y) B j J' q4 ]9 T - .IF 2 = MUSIC_THEME
! V- `1 M1 b$ f# ~1 M! |3 D4 ] - .INCLUDE "data/music/Ninja Gaiden 3/config.asm") Y4 W2 v9 ]& A ^ @, P
- .ENDIF3 Q6 v. h9 a+ q
% N# N) g: o" R# u2 B7 T6 v" p5 }( k/ R- ;====================================================================== X9 U" H% V+ t) O9 c7 h7 j1 T0 ^
- ;引用CHR图像数据% `' G m6 [/ y/ @( R* C% G
- .BANK NES_16KB_PRG_SIZE * 2
$ E. y2 n! u( [- n' n - .ORG $0000
/ f/ m- K5 q1 U1 V - .INCBIN "data/bkg.chr"9 N" I0 _3 x1 o% ?0 A' K' s
- .INCBIN "data/sp.chr"
( S1 J( G2 \) h' D- T W -
. J7 Y/ d& h' J* ?' A3 ^3 } - ;======================================================================0 s, R3 E U* F4 ~8 v1 P
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank! W- P1 i4 b; ?
- .ORG RESET_ADDR1 n3 {7 C$ t- D4 d' v1 O$ k
- ;======================================================================7 f+ ~1 _4 e; N5 c$ z1 c
- ;引用其他源文件
* s5 ^9 B9 ~- y4 ]2 P - .INCLUDE "fc_demo_ppu.asm" ;PPU处理, {% `; }6 f- G( h! a8 J
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理* X/ Y5 L6 o$ N4 a0 q; B; j3 |
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
: n6 E: ~0 \- t) M7 s3 U. C0 r" N - ;======================================================================
2 l$ \, T0 \- Y, ~9 ~/ R; \
- T3 o9 y3 z% ~5 h% `; @- ;======================================================================1 b' f Y4 `" Z% b; \" b- t
- ;等待VBlank到来
3 u) G! [- \# [ l. J7 Q, o - Wait_For_VBlank3 K) s* J E4 S8 e2 Z( b) q
- LDA PPU_STATUS0 z4 I% ^- R3 U: t7 M7 L8 R) d
- BPL Wait_For_VBlank
" E) i, |- @2 S9 X9 y. a( I. c - RTS7 Y- S+ i/ Y9 T* Y
- 3 u# z% n$ }3 ]( }
- ;======================================================================
( m- Q4 k; {, w/ e) G- F' x - ;调色板初始化6 B6 l2 R; J# L+ L" @
- Palette_Init
+ t& x& C) W* n" Z* ?1 z9 n - LDA #$3F
: M G, z5 }2 M" }1 A7 ]) E - STA PPU_ADDRESS- m: A1 \( [$ k
- LDA #$00
, ?7 x0 F4 k/ ]. u& o+ c1 [ - STA PPU_ADDRESS* ~7 {/ N, r! u. U! ?$ q
- LDX #$00! L* ?$ Q5 r) u/ }2 P! \
- LDY #$20
$ H5 A& P1 l( M" j+ h# Y1 ]1 e4 K - .Write_Data& Y5 s( `% I7 V: W0 ] x" y
- LDA Palette_Data,X9 S! X. \+ R$ o7 Y
- STA FC_PPU_Pal_Addr,X
! ?8 x+ S6 r9 m6 r3 w$ l7 a! k8 l$ E - INX
8 H& U4 b- i9 c) n! a* i h - DEY
" a# ^6 v- I, t" i, a2 a4 k - BNE .Write_Data
! n5 e4 }; k: i2 j e' v' @ - .End) [! T- V; a$ J
- RTS
' s6 Z6 U/ F; f) W% L
8 f6 g5 i0 X F7 A- ;----------------------------------------
; r P1 h* f1 T3 @ - ;调色板数据
, e8 o8 [( y- `7 Z5 R) I - Palette_Data# y4 Z7 ~' n% D; ]8 H3 f. v
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
2 d9 y, @3 O: Q1 b - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22$ m& g9 ^0 c( A9 H; Y' r1 j. u; `
- ( T: {$ C* ], j1 P" v; k/ f
- ;======================================================================9 e+ {' Z5 f* c
- ;命名表清空' M1 l' k. c2 |6 k$ Q: \/ m
- Nametable_Clear0 |# |. Y) O# b
- LDA #$20$ S" j' d0 W: e# c$ @8 c# F
- STA PPU_ADDRESS4 a+ h( y" N! K6 z+ b& c; V# X
- LDA #$00
H# f; d1 u8 v' U3 t" ] - STA PPU_ADDRESS
$ z! n- F7 F3 a" n - LDA #$00/ \' @! v0 G+ m
- LDX #$00
& j+ X0 [ W7 r m! c - LDY #$08; r' J' c: a! O& I; O2 @( U
- .Write_Data
5 E% M0 ^. R, c: H. `- r' q - STA PPU_DATA
3 _& D& O& K6 a/ r. o - INX) A; U6 {/ N: P. ^5 f
- BNE .Write_Data
, k) |( n9 w& z/ O - DEY
! h v* P. w( N - BNE .Write_Data' p4 I' ^+ v B5 @+ J1 s/ P
- .End) _2 E* J+ e* }* }0 d8 Z
- RTS& z' |8 A( @. a7 t9 a
0 a3 z! C0 v; H$ G0 Z3 s- ;======================================================================7 Z$ Y1 L0 M8 F4 @8 B# q
- ;音乐曲目切换
L4 c) ~" U4 E, ~" Z4 i; r - Music_Select_Process S- I& h$ r4 G# M3 ]* }6 e
- a' S- V6 U1 I6 A) E- K2 n R; D- .Pre_Music;上一曲% ?, g* K7 o4 u0 u; ]. s
- LDA FC_Gamepad_Once: K: O# k# c9 B$ Q2 a, {( t+ [
- CMP #JOY_KEY_LEFT5 ?& u! r! x4 f; @
- BNE .Next_Music
+ b. [9 T, ?) [" r3 ]1 Y - JSR Music_Play_Pre, \9 \) w+ L9 Q* f% L* L) }$ U* ^4 A
- .Next_Music;下一曲: K9 G1 D- t9 S7 C6 B
- LDA FC_Gamepad_Once9 M# W4 v5 k9 s
- CMP #JOY_KEY_RIGHT
" X% _! C1 \$ j3 e0 j7 R' p3 G - BNE .Next_10_Music) u9 d$ y( ~8 J* r, B
- JSR Music_Play_Next! m. e# p* j# @$ ?. V; Q3 B8 o/ u
- .Next_10_Music;上10曲6 n2 F) @5 v. _2 c5 V3 A$ x8 h0 R/ x1 ?
- LDA FC_Gamepad_Once h; w* n4 [" Z0 ~6 X
- CMP #JOY_KEY_UP( M* q: p, ]4 n3 K8 D
- BNE .Pre_10_Music* u7 I' u: x5 ]: j; Z, y
- JSR Music_Play_Next_10
1 O" T ^6 y% A* A) | - .Pre_10_Music;下10曲) c- x# v3 B* w
- LDA FC_Gamepad_Once' o# i% o6 e* `; e6 p( j4 g3 K) u7 O
- CMP #JOY_KEY_DOWN( k0 ~! j8 g* U% O# d h% _
- BNE .Reset
2 i2 q5 o6 N" | - JSR Music_Play_Pre_10
2 u5 z) N( b- ~( H1 Y - .Reset;重播当前曲目
. B5 f" ^; E" ]" b6 d8 A - LDA FC_Gamepad_Once/ A, L$ `) u( K9 M) W# {& ?" R
- CMP #JOY_KEY_START$ [1 w+ D( d' p9 O
- BNE .End
3 W! y; [5 f; S$ n6 }' d. O - LDA FC_Music_Index
! k8 A% j L/ [+ u: h2 \0 E4 a: X - JSR Music_Init_Process5 N' P! p5 m9 ~" P( J
- .End1 a! E" H: K; V0 u$ P
- RTS
4 R% [6 z9 e; V _
$ @& z# L, ~: D+ h+ ~3 s# d/ q- ;----------------------------------------------------------------------8 v( {' b( f7 D
- ;播放上一曲; b* H( d* S7 q, }
- Music_Play_Pre
5 f! W( D" n0 B& w8 q! N - LDA FC_Music_Index a3 u$ Z1 z4 M; m* i ^+ _
- BEQ .End
+ h& D) B4 ]6 p- R. O2 {% `. } - DEC FC_Music_Index
* Z. D- j- z: Q! \( I - LDA FC_Music_Index9 N3 O. T$ M" T# r
- JSR Music_Init_Process
, n: V9 t; L: P0 j( s+ z4 _2 w - .End& V ?' j% \" T
- RTS
* @& k# E5 M3 B4 k2 s - ;----------------------------------------------------------------------
$ X; W1 N4 c. q" ] - ;播放下一曲
6 B5 N2 f+ W f( U - Music_Play_Next! q- W; D3 v" G* r- O1 I* q
- LDA FC_Music_Index
$ h6 r# `1 b4 j3 S - CMP FC_Music_Max_Index) o$ f/ h/ b6 C
- BCS .End6 ^$ u( _2 Q4 b$ {" s t
- INC FC_Music_Index
# b& W- S# w8 W; Y) C! s* G - LDA FC_Music_Index
/ H% t- @; d& Q) f, j2 }( I0 l - JSR Music_Init_Process
M2 c& a* [ [ - .End" N0 s/ b7 K5 M0 Q1 ^7 |% g+ Y( ` D
- RTS
3 n+ L* L6 i" i$ [ b - + ~ l9 F; U0 Y) d, R" e
- ;----------------------------------------------------------------------
$ Q6 o9 M2 Y1 e/ s+ [% ] - ;播放上10曲
- W/ @9 H( j; c7 Y" o* V - Music_Play_Pre_10: n p1 ?! X- k) H0 {
- LDA FC_Music_Index
- |* W, r, w. a1 W6 r - BEQ .End2 Q/ ?+ x+ i7 I8 [8 v
- SEC) a& p& u; o5 w* _, t
- SBC #10+ f. V( | n( @) Z6 I! }2 g' I- N# |+ q
- BCS .Pre_10
+ K7 w1 \6 L; k& f9 O; c - LDA #$00( U2 H' V* c8 d a
- .Pre_10/ x% k. e+ E0 a* Z/ v+ _( y
- STA FC_Music_Index
c; I) Z @7 ~4 D% ~ - JSR Music_Init_Process
& N0 g D+ {) g H, `$ K3 p - .End1 q' o: N) _% T
- RTS+ W& K8 [2 @ e( D
- ;----------------------------------------------------------------------
+ J4 P4 u& |3 o" \0 o; P! q - ;播放下10曲9 M x: ~# Z0 b! I8 v8 o7 {% H
- Music_Play_Next_10' x- K8 X0 `# Z3 k) Q
- LDA FC_Music_Index! B T) U+ a s1 r- b4 Z4 a1 b0 s
- CMP FC_Music_Max_Index
, }- g& F/ V5 B! q" F+ c5 \. `8 m - BCS .End1 p( G7 U! P6 c4 E) h+ _
- CLC5 P: m5 X% X! q* Y
- ADC #10
! o( o$ e1 W/ g; F9 K% F' x0 \+ r - CMP FC_Music_Max_Index
2 m) i( I7 j6 D" ~7 f - BCC .Next_10$ l$ X) r) ?; @9 ?6 y
- LDA FC_Music_Max_Index
( v7 T" \" @" g% Y6 f+ f4 Q, p - .Next_10
W) g) H) y. r& g - STA FC_Music_Index
# Q4 {2 J/ f, x; Y. Z5 Y& c6 Z - JSR Music_Init_Process
; P! z9 G) k: F0 v/ N" F( h; g - .End0 d8 {: ~. v0 {# `- w
- RTS
{) d8 P1 e4 Y5 j% V - 7 A2 y9 w: I2 M, ?
- ;----------------------------------------------------------------------
' X' k+ [+ z; F+ _" r - ;8位十六进制转3位十进制制
! J4 J8 p. Y/ C9 m O - Hex8ToDec9 n$ Q+ j$ n+ M8 n. e/ w1 f
- STA FC_Dec_Data_1
4 @8 G4 X3 f6 E. y! U - LDA #$00
; Y- G' j+ s: v1 A k7 V+ @ - STA FC_Dec_Data_1007 j6 Q. u3 v+ A2 n
- STA FC_Dec_Data_10; W: p2 J) X3 m+ i3 W( @
- LDA FC_Dec_Data_1
& T2 _8 f3 Q& r' h9 M1 Z+ } - .Convert_100
$ {: j1 ^, D; I [9 v9 X - CMP #100( \, I( Z1 A5 r9 _! |+ }
- BCC .Convert_105 i. ]! a4 x& F, s7 e1 ]' E8 ^
- SEC
) X0 |0 H K+ E' X9 p - SBC #100
; {5 J9 M) G% E. J: A - INC FC_Dec_Data_100/ k, s( s" L* Z+ |# C
- BNE .Convert_1003 _# P. I$ J% z
- .Convert_109 p/ k/ x6 U6 S8 d u6 a4 @# t
- CMP #10
5 x% D0 U0 |1 q- s3 H; c. f/ A - BCC .End
. k. f c& q1 @* i - SEC
8 C3 Q$ l6 s8 i# y" @& h3 F1 W2 s - SBC #10
- f. |2 N" y$ l, c# A# i7 S - INC FC_Dec_Data_10' Z* c8 Y4 C4 S# D* |
- BNE .Convert_10
( S$ M, C! C- N4 q3 \% Z: | - .End7 F$ ~* J, l8 d+ n- o6 N# p
- STA FC_Dec_Data_1
/ ?& a g$ G( g9 O6 s/ u* g* I V - RTS
3 {2 y r( T* V4 ]& O& R
3 u' w/ [9 a* m) O: v- ;----------------------------------------------------------------------" k8 N- i! w, R: e H0 ]
- ;显示曲目信息" O. L0 b1 V) j
- Music_Info_Display$ [! v1 W' Y1 E. H3 ?
- LDX FC_PPU_Buf_Count2 R# v! H( D' k1 |# w5 E1 _
- LDA #PPU_WRITE_MODE_CNT_LINE$ W1 @% e4 h; G U) d2 c
- STA Use_PPU_Buffer,X! _2 V3 u, Z6 Y( }
- INX( x* x5 N+ r' X4 U6 f4 w6 I
- 6 s2 y' A! l: J7 i* }1 h
- LDA #>MUSIC_INFO_POS
) j7 N- c+ L5 Y. E6 ~: F3 e0 s - STA Use_PPU_Buffer,X7 b- L% l; g/ M/ o' j) U
- INX6 A' `, S& q( G/ t8 I
- 7 J# X( Y J8 M5 c0 G* [
- ;居中
4 X7 `" y4 _/ E$ _. K/ k! y - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2& H# V3 U- }6 L. M
- STA Use_PPU_Buffer,X
' n* p1 L) F/ g; G1 p9 X2 ]- V - INX1 B3 t4 V- k1 p1 Z8 B3 d6 p
- / H1 |4 Y7 z z2 v! P
- LDA #$055 {( Q. r) h2 }5 r) b1 O) g# d* @
- STA Use_PPU_Buffer,X1 j$ M6 G9 I ?$ B# c) J3 q
- INX
8 {2 E0 c6 ?3 b1 U3 ^2 ?( R/ e* L -
5 o$ S$ y4 L) Y) Y% F - LDA FC_Music_Index3 r" A f& R; z5 ]& X( ^
- CLC2 } L& n* e9 p" b
- ADC #$01; N" J6 M+ W+ A8 s7 D. h0 @1 F! G5 y+ j2 F
- JSR Hex8ToDec
# C. V9 e0 B% w$ {7 g9 a - . R! {0 x) n/ c7 M, h t# S
- LDA FC_Dec_Data_101 K- w% K4 N0 E% h S5 q
- CLC
4 [( {' G) Q0 s- e9 x - ADC #'0'
. ?. w- E+ }( p' l9 f% O. u - STA Use_PPU_Buffer,X7 x/ C6 ]1 b% ]& ^
- INX
( b+ w3 y2 f0 w: O - # h0 e( F- k& ]. h, J. R2 p
- LDA FC_Dec_Data_1
0 n9 q6 i0 c& C# w# u9 T - CLC6 s1 h& d$ ~% U9 w* J8 r/ @
- ADC #'0'
5 f, O- O2 f8 l; M& d4 _ - STA Use_PPU_Buffer,X
1 ?+ j; P! v7 y3 e" u' ^" |' M - INX! z3 c" h: L! j
-
$ w. M' h; g5 q* ~+ r& S E4 f - LDA #'/'
9 E8 v) b! |6 G3 q - STA Use_PPU_Buffer,X6 ~7 l) t S3 A4 l/ V1 R& h' }8 h5 o
- INX0 W1 b2 f# `8 [( I( p. o$ [) V
-
* d0 V9 `% H4 L$ C) X+ ?- z - LDA FC_Music_Max_Index
# j1 ]) L! R7 Q - CLC
: f- P$ w) n( s- o% J; n - ADC #$01
4 k% s& d, V+ l - JSR Hex8ToDec
0 b h' d/ ^! X+ x/ `2 }. a3 U, e1 y -
) k4 w. U& V* H. a% f4 t - LDA FC_Dec_Data_10: }! e% E3 P) T
- CLC# W0 }3 K$ q: n4 W6 Y# |5 K
- ADC #'0'
$ K& @* s4 {- Z D) ~9 e - STA Use_PPU_Buffer,X
; b. Q. R% i' y4 D+ r, i9 Z - INX( J0 S& j- t% v* a7 [( M: d/ y9 X, l
-
- w- x* N% R6 ^- b5 y. r - LDA FC_Dec_Data_1& y% m) ?' e' p; q( |
- CLC
! ^8 V, ?+ ?( r V - ADC #'0'+ c) F/ u; }* a' M% s! A8 [
- STA Use_PPU_Buffer,X
7 H& {+ K3 A6 X9 @ - INX! Y3 P2 S& j5 S1 N( o4 z
-
6 L5 G {& n& n+ m' u( m - .End! m9 M4 v2 J; x% p& @1 x, i
- STX FC_PPU_Buf_Count
% a% B0 E* A$ e1 b; T/ D2 K- L - RTS
# T1 Q: V$ Q/ F7 q( L3 Q- V - # y' [. R6 s2 A
- ;----------------------------------------------------------------------
! w6 w' F/ M( v2 J& i5 Q. O* u - ;音乐曲目初始化处理4 e4 n1 m6 s+ y1 H
- Music_Init_Process- M9 E7 c+ a4 L3 i9 W
- PHA
- n% G: U) S* f3 x - JSR Music_Clear_Process
- U Y* P% ^, V- U - LDA #$1F9 Q* g1 \' b8 X% ~
- STA $4015! U8 M5 q$ L4 ~ }8 u0 l
- PLA: j% m: W- |% J8 R+ `
- JSR Music_Init_Addr
" c1 Y2 U- L4 {# \2 w6 [ - JSR Music_Info_Display
5 }6 T) A0 S: [, R$ l& `; H9 W" _ - RTS
) a: i. H( i4 m( \% N2 f - : h: p7 y( L: z
- ;----------------------------------------------------------------------
' c& j/ ]5 A* N - ;音乐播放处理
0 a) C l/ H! o" x) R! E; u - Music_Play_Process
" C' Y$ R$ A& ^( }' T - JSR Music_Play_Addr0 j6 D0 D k/ S& b
- RTS
8 }# H9 R# a# |5 N3 W1 C, s - - c0 a8 ~% e) |4 V
- ;----------------------------------------------------------------------' ^- [' a$ l; v# G+ j: U1 U1 w
- ;音乐播放处理
: {/ D0 s, M, Q: B# \6 g - Music_Clear_Process
( a/ y* u& h L- t9 r5 c - .IF Music_Clear_Addr( G: r4 }& }/ f" s
- JSR Music_Clear_Addr; k* ?* n+ R. O+ I, z0 \
- RTS
- U2 U+ A6 A9 e6 h - .ELSE
. T' g3 A! E$ D) { - LDA #$1F5 m6 z: q& I, i+ ^. J( m+ `
- STA $4015
7 A, ?/ }! c# s% K6 p - LDA #$00; Z# T5 l1 |. M0 o. |: j
- STA $4010
( b1 T( Z! b$ A: D2 X' L$ u - LDX #$00
% ]) \7 y% J: O8 J) C* t% o) |, Z - LDA #$00 U- K$ z/ `5 A9 ? Z( Q
-
! {. o# C4 H. h2 B! _4 O - .Music_Clear_Zreo_Page_0
# D4 b0 C J3 F E* G8 c - STA $00,X: X! h7 m/ V/ C* H
- INX4 N+ }" ^. |# x, M
- CPX #Use_Zero_Page_Begin
1 T: C8 s5 E% Q3 P { - BCC .Music_Clear_Zreo_Page_0
' [1 C' W- X5 P' d0 P% k - % c# m) o' Z4 ]; L5 A3 k* l
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
3 P2 E( m4 o1 [7 u- R [ - .Music_Clear_Zreo_Page_1" I& q# _" F' v2 q% ^! M$ K& K* u- y. G
- STA $00,X- R$ I; H/ |- _7 c1 P* Y
- INX; k/ m. @% w+ h3 }+ k. r6 n9 @
- BNE .Music_Clear_Zreo_Page_1- V5 u$ Z. H( c
- ( f& J7 x% u% A( }1 B$ w
- Music_Clear_Process_1
* W9 \+ x' a# D& S' I9 ^ - STA $0600,X9 d1 E! G6 k4 _+ R, s+ ]& D6 J o
- STA $0700,X
' n, s2 r V/ q3 I - INX
) [; M) x/ p: e" N7 R3 O- \1 p - BNE Music_Clear_Process_12 B, D; [! [) w6 M0 A$ ?3 k N% a
- LDA #$10
& ]3 `4 m1 X# L6 i - STA $4000* u; ]0 j. d0 }0 ^& x3 ^3 ~
- STA $40042 M' I, k: ^6 I# s( |' \9 ~
- STA $400C2 k" o+ A, q, h
- LDA #$00
7 c' m5 P3 |1 `! z - STA $4008; `7 O4 A6 X' B B
- LDA #$0F; N# b) _( O' V. p% J' C
- STA $4015
/ i' S( ^% c [4 ?; | - .ENDIF) Q, d" C [4 I( |$ S+ b* A) a
- / t, a# _% g' d1 X" D" b$ z
- RTS* D5 i7 m) |4 c
$ [9 W0 ?# X; O- y6 i' ~# y) U- ;======================================================================7 y j3 j; X- P# f B
- ;重启处理
3 C% [+ k, R: O5 f; ?1 I. D - Reset_Program$ y- [) f; u$ d0 u) Z
- SEI( z- |$ O, w$ P( e, o# h) v3 m
- CLD; [' i! I# G( i0 i; X3 q$ q
- LDA #$00' A' v- M0 s4 t3 w, ]; ^$ M) ?
- STA PPU_CTRL4 M" H9 c" I# g, p: t6 e/ B/ R
- STA PPU_MASK
# D$ S, \. p6 y E' W& H - STA JOY2_FRAME
/ J4 W- W3 |3 Z" E# y: x9 i" p- ? - STA APU_STATUS. H+ ~( i- l* d/ z
- 2 Y5 X/ c) n8 A' q6 d3 u
- ;等待屏幕准备完毕9 U' a. ~ [7 T$ s6 n8 Z! w4 u2 }, K
- LDX #$028 ]. N* Q% n7 L; V: ~# k7 ]
- .Wait_For_Screen_Ready' M7 `" \) P8 X) a8 w) e' b
- LDA PPU_STATUS4 d, y" i) d3 K" x/ j2 [* H
- BPL .Wait_For_Screen_Ready- x" a0 W& O! ^1 @3 `7 R
- DEX& I: a+ h' n% N! v6 `2 R
- BNE .Wait_For_Screen_Ready
! @# ~% ]0 C3 f! l) U. _ - / w3 f9 b- r0 Y( N
- ;清空调色板
! h% |5 K6 R4 \7 | - Palette_Clear6 [/ p, ~0 d6 o1 l* Z* R
- LDA #$3F( ` E5 i/ k8 Q+ X/ i
- STA PPU_ADDRESS
+ j0 O3 p v3 n$ q) ^, ~. S9 U4 d - LDA #$004 a5 I8 {, W! r p, C
- STA PPU_ADDRESS
& G$ U6 k5 \: G5 w K; v - LDX #$204 f) \ h, r6 l# S! ? Q
- LDA #$0F; d3 Y$ y- u7 ^8 A. @) ^2 d
- .Write_Data* [: V! C, p' D7 M* O* x; v
- STA PPU_DATA5 a1 Q* D; p2 M( F4 B1 X' k
- DEX& \+ R2 x/ p" E0 t$ O6 V) U
- BNE .Write_Data, K7 g" l& h" x
- . C! r( U }8 j8 q) {3 {
- ;清除声音 $4000-4013
9 L0 f- e1 I4 n- k6 Z7 a3 b5 Z - LDY #$14
. h; _2 E8 @! |1 V+ a - LDX #$00
5 Z3 j$ T1 j# d4 d8 F - .Sound_Clear6 }: ~4 \' N+ g; Q( p1 k" ~) B: C: I
- STA $4000,X. D4 E0 W+ x! L K) l8 j
- INX
9 k+ X, a" l* t+ o8 p9 p - DEY
~0 F5 K' V9 N \$ [9 m - BNE .Sound_Clear7 R# X! v" Z( s0 r7 U3 r# @6 N
- / G+ G" c0 o0 W3 y, m
- ;清除 RAM $0000-07FF7 {. e, O' r+ |9 t
- LDA #$00+ W* Y5 ?% z6 H, Y9 l, w4 }
- STA $00
f. I- [- [$ X) ~ - STA $015 B4 T( O( W8 F% y% ^
- TAY, v- N6 E0 \) a# l9 e
- LDX #$088 x8 h( T5 q" }0 l2 F% _! O
- .Memory_Clear
$ g4 @; K3 o' ^4 l# {3 L2 [, @# G - STA [$00],Y' i& M' s* Y" D' Z
- INY
' V. m# o+ W. ]( I7 g5 ? - BNE .Memory_Clear7 o9 E8 S! z# q4 v6 Y4 {
- INC $01* F, X h/ z& W4 U y8 O: e# k/ [9 v
- DEX; l. I8 b9 }) l& @
- BNE .Memory_Clear
* x) R& B9 d. f1 I/ {% c# n0 Y -
% W' s5 o) U6 Z0 j+ A" Z - ;精灵缓冲初始化3 C3 P% J9 \) n3 U! w% V
- LDX #$007 m h$ t3 h. g6 ~! I+ {
- LDA #$F8
5 [+ s6 \7 E- d5 K9 s/ I& d - .OAM_Clear
1 L/ R6 h }$ K8 v" d: P3 T3 E) m9 p+ } - STA OAM_DMA_Buffer,X6 v: M5 U& n' A+ D$ K3 b
- INX
! j( z( d; }1 M/ f2 p. s- S - BNE .OAM_Clear
# k c/ I% W# K2 G# R6 y - ! A+ Z, _# K6 e
- ;栈指针初始化
( e5 m* P, \& h' b - LDX #$FF/ O1 {9 f$ [+ r6 b
- TXS
( K$ s0 q6 X5 q2 p8 \) R - 4 x" q! F0 J+ W" H1 M1 h x
- JSR Nametable_Clear;命名表清空9 B5 H9 q2 c/ V. J
- JSR Palette_Init;初始化调色板缓冲8 i' z2 t% \2 t9 M8 @& l
- JSR Static_Text_Init;初始化静态文本
& Z) @1 b d, g* b/ p Z. _ - * R) [1 m0 ~' B7 X, _& @" B
- LDA #MUSIC_ITEM_TOTAL - 1
& c. d. ^+ d( p$ I0 b0 G, j* v7 m - STA FC_Music_Max_Index
7 D$ L4 \7 F8 ?& C( w9 M - . G2 q; g/ C/ i8 \* g
- LDA #$1F
, q6 {; ]7 z1 {9 [5 \ - STA APU_STATUS
' r& K' h* Q4 D( N% n! k' S7 U# T; a" O - LDA #MUSIC_BGM - 1
9 {* x, |# Z/ `( g" {: F/ r - STA FC_Music_Index7 [, X+ j% _2 U0 A
- JSR Music_Init_Process;音乐播放. ~; Q5 ], o5 H1 v5 j5 Y2 H
- $ w/ i7 T0 z+ e2 e# S0 G& k: B
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
# s; ~+ R$ u) q - LDA #$1E
0 |. `& u1 R# L r1 K( q) ` - STA FC_PPU_Mask_Buf6 V9 s, G. D7 r5 {1 P0 t' }( k
- 2 ^; H i% {5 v7 }* z
- ;启用NMI处理2 O, p; e6 h" U" ]5 W, m, b' i
- LDA #$80+ `5 A7 I' z( U5 u
- STA PPU_CTRL
: j Z$ M) V% O f* U4 m - - s; V" I# x* h# k" T9 v
- ;程序循环, 剩余工作交给 NMI 中断处理
6 @: u x6 W0 `; a6 V$ C8 L" R - .Loop9 y: i1 u( U# U7 k1 q
- JMP .Loop7 r1 h3 `, R% n; `% c3 j3 N
- 5 x1 \0 }% A C$ J5 u
- ;======================================================================
5 O! c9 z- K, _9 R8 i- u- d - ;不可屏蔽中断处理3 E, V* Y V4 K$ t* t
- Nmi_Program
5 E+ O3 P! n7 E' Q3 r - PHA+ v) d$ E- g0 y, G- F0 C
- TXA5 s# q8 W/ j( f( c6 W7 }' f
- PHA
3 C& R( w# d0 i6 B" M% x1 {5 c - TYA
J6 H3 p' k0 b% z4 V - PHA0 e' V ^+ m/ `- y
- 7 N. I- y9 ]( {2 k8 Y
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位' E+ w3 m @# g" e$ p- t
-
" t9 n9 r/ T- [$ @ T - JSR FC_PPU_Procrss;PPU处理+ F6 l0 {, T/ E# ^
- / {3 r. z! Y; l( K5 k c ]
- ;精灵内存更新( v! t3 a6 ~! ~& v" o/ d2 ]
- LDA #$00
- Q9 Z% D. w$ g6 c - STA PPU_OAM_ADDR- R$ p% c( B! Z- M" I/ J; n9 d
- LDA #OAM_DMA_Buffer / $0100( K# B4 l6 ]" g) Y- @) k7 _ p
- STA OAM_DMA: l, x5 Z9 O" _+ O& b; P) l* }8 x; ~
-
, o8 l5 ]# Q" K7 \/ ?3 V4 Y1 _ - JSR FC_Gamepad_Process;手柄输入处理2 J# D: c7 V9 J6 Z
- JSR Music_Select_Process;音乐选曲处理% m* l* U2 K6 p/ t( L: T1 y8 q B
- JSR Music_Play_Process;音乐播放处理
* L" }, @3 ~7 G1 ]: a -
# u) h& r u9 b3 J - PLA
% u/ C/ b$ G# J: ^ - TAY( ^! I, O+ x. [0 d# \- x
- PLA
" ]/ y/ f. Q$ h/ I* }' `' M. x9 b - TAX
' c8 F' r0 z/ e, w% W5 @, @, ~8 z - PLA& g+ o. I" X* ~ b
# q& C& {0 V5 T9 W1 C4 S: z+ u& u- RTI
! z3 h/ J" X! y6 q: Z* J - i+ I6 i+ b4 a2 v" P
- ;======================================================================
4 N+ c$ n. `7 |8 j - ;请求中断处理# ?3 N4 L4 S3 D. w, l9 S, t1 E1 Q- ^) b
- Irq_Program
4 ]% ]0 ?7 l7 C - RTI
- G( h' R7 c- D7 V - 3 M! k3 w$ v$ W! Q+ U- q
- ;======================================================================% k& Z9 V8 C- U# j4 d
- ;中断向量表, t- h( r% H7 r V
- .ORG $FFFA
: R; r$ A' C8 @& n - .DW Nmi_Program ;NMI触发时执行& [0 z7 ]1 y8 @$ P
- .DW Reset_Program ;载入ROM时最先执行0 E6 g [& r9 _9 Q2 G8 N/ O
- .DW Irq_Program ;IRQ触发时执行, F7 D- ]+ g7 _
复制代码
' l, t* L4 z3 [
h- |4 L( @# G) Z3 s
' r3 O5 l9 y+ Qhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|