|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下7 c4 C: m, j! E3 U2 d4 _$ u5 Y
4 ?5 A- \, S/ W, d
以下是主框架代码:3 ?9 p) X7 b1 `
- ;======================================================================
" b& ]$ p" i: H$ t3 e - ;文件头
" [0 I- q# [! ]8 m - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量9 T+ X0 l5 M6 j
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
7 k9 R9 p# `6 R+ C; w& D - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
' M e+ c) Q1 W1 a( A2 u - ;======================================================================
( T# a" o0 \" Y0 }& U - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2- I6 i6 l* T" y* ] j1 p4 `* g, R
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 17 x' ]# n$ G! I" [& @1 e5 V# E; {
- ;======================================================================
: E/ ^8 X1 B* N) C% P - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
- _% v7 i! w% Q; E - RESET_ADDR = $E000 ;主程序起始地址
7 F w3 p% E" s G4 o8 { - ;======================================================================
# R! U7 q4 D% A# V - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB: m4 U. N0 y0 L
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB! J% L2 w# z! n+ v8 c
- .INESMAP 4 ;Mapper号 (0-4095)
; g/ q1 K. |, L" j' n# e P - .INESSUBMAP 0 ;子Mapper号 (0-15)% ^: j! G; v* H C* m$ K
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏). `* K% [2 r! V5 p* C
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
& c$ a: m0 e* z, u" P% m% K$ X - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)8 a" V! t! i: h! ~, F
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)# [7 v0 q" T" z4 N0 M; |9 r
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)+ E( Y3 c- z% d* N
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)" O7 l3 H+ Q6 v8 h: P
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)0 J. r: l2 v. V$ e# ~6 u2 h
- ;======================================================================
3 l( Q: o! b% Y) p - .INCLUDE "fc_demo_config.asm" ;全局配置
! N6 }: ?8 F6 B: z% L& i# s - .INCLUDE "fc_demo_constant.asm" ;NES常量
, q K9 J$ P2 h& W" x: @) D) D2 M - ;======================================================================
1 K3 U. u ~! i5 D; } - ;音乐配置2 ]) K& m7 t/ k0 d9 }/ M
- .IF 0 = MUSIC_THEME & {" R) V$ _' v. f& |1 R1 s
- .INCLUDE "data/music/Gremlin 2/config.asm"
; a4 ]; ^/ S* ~1 k% [ - .ENDIF
- u+ l' ^3 v% F - , V" K1 l% M0 ^" z3 g* Z
- .IF 1 = MUSIC_THEME
) n& l1 v1 d$ j- N1 _5 v - .INCLUDE "data/music/Raf World/config.asm"
. @! i5 Z0 L( a Y - .ENDIF2 l' C9 h f# ?8 `5 g$ V1 n. \
- 5 z- y* b8 Y/ F) P/ S2 _! {) [& l
- .IF 2 = MUSIC_THEME
2 O6 B7 A% b) A - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
( l$ g; D5 H7 @, l+ K$ u! H+ z" q - .ENDIF! n) }% A; F& x
- 3 _7 c2 Z" U* h, }2 W% E* R
- ;======================================================================
# x) M7 h) Q1 A2 O$ g. j1 s - ;引用CHR图像数据- x; q5 s. V" s: p
- .BANK NES_16KB_PRG_SIZE * 2 C, X' P2 i l+ Q1 G: c
- .ORG $0000
2 B2 J0 F2 e( F; j9 |: n @: `. U% I% o - .INCBIN "data/bkg.chr"$ k& {4 q, o, S& d
- .INCBIN "data/sp.chr"
/ U, [" F! k1 q, n0 f+ v$ @ -
' v1 \$ C' W, Y3 ?- J - ;======================================================================
/ I/ H& E2 Y& T/ Z+ q) B - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
; ^, k) W- S" d, g - .ORG RESET_ADDR
Y' k; Y# U- Q x4 G, B+ m: c - ;======================================================================5 o0 \ z* g8 {8 A% L; i5 e3 `
- ;引用其他源文件! j! ^ s* u6 a G+ ^* v; q) {
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理3 W+ I* C& L7 ]: Q
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
$ F f1 F" X7 A- c5 y - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理; L Y6 _5 u; N6 g, C6 a
- ;======================================================================4 t) \. B2 q# J0 n4 a( B" d
% ]' i/ Q; A: P$ B# t }- ;======================================================================; j# Q l* t0 w9 o& M3 n8 }/ p y! G9 p
- ;等待VBlank到来3 y( L9 [* @ W$ l2 @6 B2 C
- Wait_For_VBlank: n/ i6 z; b/ U0 @/ N# e+ D# D
- LDA PPU_STATUS/ N& V9 v) g) b. M6 } i: Q
- BPL Wait_For_VBlank0 E3 B* u- a0 l, ~8 V6 z- o4 o
- RTS9 a+ J: ~/ g9 `8 a3 G
- 7 c6 m# d- n' O( j
- ;======================================================================7 U0 C& O; F$ [3 R
- ;调色板初始化
/ M$ i6 I; \# d - Palette_Init% u$ o0 |# L* V7 W' z2 i
- LDA #$3F& d/ R# o$ J& [( F. @" G8 f8 I
- STA PPU_ADDRESS. J) N; ]4 W' U: j m& d
- LDA #$00
/ P- g/ F& l0 Z; d# I6 U. \ - STA PPU_ADDRESS
: Z8 y0 n7 B1 G8 b0 P2 a" F2 f - LDX #$00$ V/ ^; K; V7 u5 k9 i+ F& d
- LDY #$20
7 ?0 H3 L3 J- W; `4 | - .Write_Data
. t, @- i8 x. e" v3 f) Q. J0 D6 z - LDA Palette_Data,X
% d( R/ Y5 U! d1 B. Z v - STA FC_PPU_Pal_Addr,X
6 [3 G. t* B, z0 w4 A8 Q - INX
; T/ V* U0 g, y3 Z - DEY3 A- r! h1 |0 T3 J
- BNE .Write_Data# U6 ], Q/ x. R& D$ ~$ D
- .End7 Z8 v B) j. I* J* n
- RTS
% E! ]3 E9 Y" w1 {* w8 n8 \ - 4 h! R, c! K1 K; V! C- @# S
- ;----------------------------------------' G1 N6 n9 y/ C( Z4 ]4 }
- ;调色板数据
K0 t7 F1 Z" k0 H( e/ p8 S; j4 | - Palette_Data8 t" [' {" Q4 s `- A) ?% Q# i
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
5 M5 ^* ]# \2 U& j% Y: E, f, z - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
# [- \. q r7 ]0 H/ I7 i2 S -
; }4 X9 ~, e& {+ P) }- A - ;======================================================================
! `! Y1 _6 A; X4 Y - ;命名表清空
# l) A4 |' }- w7 k3 X+ r - Nametable_Clear
3 Q( I' x: S) E& _6 v+ m3 J+ b - LDA #$20
( _# U; L. y5 N) {% b4 g# P( ]; h* _ - STA PPU_ADDRESS0 f! A( ~9 t: S* H8 m
- LDA #$00
' c4 P/ ^5 T/ k2 p - STA PPU_ADDRESS$ \1 K5 a7 t* _
- LDA #$00! f1 g9 I2 L. z* `7 r7 a4 S7 E& c- d
- LDX #$00
: B' P5 n' v5 s+ ^3 \8 f: | - LDY #$084 D0 ?2 J# x/ a! |/ H# R4 g
- .Write_Data
. X6 d* Q( E: W - STA PPU_DATA; @; c/ F7 m; Y4 q$ G5 L/ _# L& L% M' h
- INX
9 Y3 B: p6 v z - BNE .Write_Data
% z! ?" G7 p. M! Z - DEY- o2 a- N4 ~7 k/ L5 d/ A: r
- BNE .Write_Data8 y# @0 X/ w8 _& f8 K1 I/ V
- .End
m7 |( h% t9 k- h r, |; A# J. L$ X - RTS
) c6 g% n) a, n/ l
+ E& k7 X/ h8 u3 o2 A6 M+ k- ;======================================================================7 v0 n: ~4 b! f' ?+ d3 E" |
- ;音乐曲目切换
. I9 H* p5 {& J. b+ z$ Q1 G - Music_Select_Process
" G# a& M; a! o- T# U' M* w1 j+ A# Z$ U - & _! e0 y& Z0 x' S7 A+ ~+ U
- .Pre_Music;上一曲# N+ P4 |( a+ V. [
- LDA FC_Gamepad_Once
4 l9 W% X2 t" C, y7 ]4 R - CMP #JOY_KEY_LEFT) Y; R; ^% i: V# E
- BNE .Next_Music
/ K) a5 O* b9 U' | - JSR Music_Play_Pre& \* K. d' J" v' j0 \
- .Next_Music;下一曲
) D$ {: x% t' |8 ?9 p - LDA FC_Gamepad_Once
& n, W+ z$ R6 E7 t/ M - CMP #JOY_KEY_RIGHT
9 S P3 e3 K. U( O* }( e6 I - BNE .Next_10_Music% w9 {8 g( O& g! a. j
- JSR Music_Play_Next6 }/ D8 Q4 W3 }4 x* Y0 ~# m& I
- .Next_10_Music;上10曲4 d/ f( z, G0 x6 X
- LDA FC_Gamepad_Once i7 p* d; P, A5 H2 _* ?/ k
- CMP #JOY_KEY_UP# x; K5 T' W4 n) W% T6 y
- BNE .Pre_10_Music
9 v) A- P2 F; g3 ]$ L6 L) Z - JSR Music_Play_Next_10. G' i. c) k+ M8 y
- .Pre_10_Music;下10曲9 R" E5 e. ]* B7 P
- LDA FC_Gamepad_Once8 Z. b# B/ J$ P, ?) h
- CMP #JOY_KEY_DOWN5 l# { I W; F* h- K2 _" \ i
- BNE .Reset
: e2 u' V7 U' F; Q- k4 a) `( a - JSR Music_Play_Pre_10
/ Y' N$ S( i- F! Z u - .Reset;重播当前曲目1 s P5 e# n" n$ T/ C8 f. d. x
- LDA FC_Gamepad_Once% s& E5 q/ d: K* Y" y; p5 W. A& q
- CMP #JOY_KEY_START
& j+ J7 f T& ~/ k7 | - BNE .End
# s( O- L: @4 g - LDA FC_Music_Index) g' B6 w7 @: H" d, W" v `
- JSR Music_Init_Process# e: {* K* N& p
- .End
" F# J# ~& P9 k - RTS
/ T" _% n9 ~9 M7 i1 ~: w
* L. k& ^" J5 ?4 p* b- ]* `- ;----------------------------------------------------------------------# V* P& B. `; ?; g" g
- ;播放上一曲
) K$ U3 O, R* W1 [. V# }: V8 f6 ]& R - Music_Play_Pre
" `) A- ^: r4 m' U( J - LDA FC_Music_Index) R/ [/ Q2 ~0 b2 ~' a9 [
- BEQ .End
: }$ N7 [0 |& l! T3 e) z0 g% @ - DEC FC_Music_Index
5 Z( N4 Z- D/ v% Z6 C - LDA FC_Music_Index
) B- s% _+ w3 Y; I$ a+ n& T. y: Y - JSR Music_Init_Process3 Y9 N% U1 Q% `0 c2 z
- .End. M# D) J" m) G5 {% e8 X2 R
- RTS# x0 E, a8 p5 D4 J. D; o
- ;----------------------------------------------------------------------
, S+ S2 F1 C8 Z* {' F, O - ;播放下一曲
: _5 R% f7 q I6 s8 t0 E' v - Music_Play_Next
3 w; I; E$ P; r# s/ y# Q9 I - LDA FC_Music_Index
+ E; Z4 J1 }3 ^0 I% [* s - CMP FC_Music_Max_Index- r9 `: X; `8 H
- BCS .End
7 [5 S. K1 V7 J - INC FC_Music_Index* r9 H7 v: q% ]& t1 K" c d
- LDA FC_Music_Index7 M" b3 z7 ~) w% l8 w
- JSR Music_Init_Process& L3 J. z, n' |$ n) T
- .End
9 |& s- G: M* B& ?# I& h' T - RTS
" q( K; T3 d C0 T B5 H! V& ?6 g - 2 w5 ?# k! @: R+ @
- ;----------------------------------------------------------------------0 _9 V+ C, x1 e0 G/ O3 C
- ;播放上10曲
! H2 ]8 @& d5 Z8 H+ D+ u - Music_Play_Pre_10
( M1 B4 }5 u5 b) ]( T& \$ n - LDA FC_Music_Index/ ~4 r* S, P" q6 [4 k
- BEQ .End, G6 T& [( f3 k z
- SEC
% \# R1 `; c) g0 r+ P$ V( s" B - SBC #10! Q8 v( w' D2 w9 W4 O+ M
- BCS .Pre_10
$ }5 P" i$ y0 p4 r9 `+ v - LDA #$00; X1 @. }7 P7 S I9 M
- .Pre_10& q8 k: q9 g, h9 O
- STA FC_Music_Index. `" F$ D* y3 b7 A6 ~/ l# @
- JSR Music_Init_Process2 G" D* z# }- }# T0 H
- .End
- f, r3 S6 Q. P6 G+ D* X - RTS2 l2 Y1 m1 Y# s9 X6 u/ }
- ;----------------------------------------------------------------------3 _- f+ _% R) d. o, ^
- ;播放下10曲4 ~- N4 x- s- x7 `
- Music_Play_Next_10& e; c; A* d, k( w5 s5 l0 ?
- LDA FC_Music_Index# C4 e2 ?: F* P* B! E
- CMP FC_Music_Max_Index
: q/ k) T4 d4 S/ A! W- }* z - BCS .End
4 S9 q; P' y: E* @1 f5 h( g - CLC
/ \+ h8 Q3 l; L& \2 t - ADC #10' X- i: m9 ?# h8 q$ V
- CMP FC_Music_Max_Index$ Z# j# {5 d3 X' r
- BCC .Next_10
- h) @' q7 b# Q8 j - LDA FC_Music_Max_Index
) c$ g' b' P1 ] Z% m* N - .Next_10
s: x" X% C6 d" F7 u - STA FC_Music_Index5 ]3 ]* l4 K$ @7 P4 a1 F$ u
- JSR Music_Init_Process/ [1 G1 {( d: b: }, {' p0 F3 q
- .End
% H: h3 w. B0 R' v& M8 s - RTS* _& ?+ h$ A. L
- 3 l3 o& k2 T3 C" {( E
- ;----------------------------------------------------------------------& e9 R' }7 ]* k
- ;8位十六进制转3位十进制制0 R8 H1 n6 q- g% q( m
- Hex8ToDec
* ~$ F% }, f% t0 r+ |! A - STA FC_Dec_Data_1
2 J8 `2 Y& `0 k) @. D0 v - LDA #$00& _0 V1 ^* D# F) Q$ w
- STA FC_Dec_Data_100
6 ?" ?) }3 |0 {* D( h - STA FC_Dec_Data_10
. B8 x% M( C ?+ r - LDA FC_Dec_Data_1
* p4 ~6 s' u) p) ?8 }0 W! ? - .Convert_1002 i9 w/ ?$ m+ m+ Z3 a. t& B( \
- CMP #100
; B1 D: U' t) M: e" ?( \' ~0 E* N - BCC .Convert_10+ B1 L% }2 m( D( `- ^$ g5 A# h7 {
- SEC1 A7 C6 V. L \5 M2 ^
- SBC #100+ Z; o2 W7 N1 s: S) s$ |
- INC FC_Dec_Data_1001 `; `* [- Z1 l8 a* a. X
- BNE .Convert_1007 o! E" a* K2 s- ?
- .Convert_10. A/ v& H$ ?! B$ }/ B$ |
- CMP #10
1 f% v& z. U: M" I: s - BCC .End; W. |, B. B9 C N2 Q6 h
- SEC; ?3 `( v1 b' l- W% k7 s
- SBC #10, Q; r. Y7 X6 ^) t. O3 a
- INC FC_Dec_Data_103 n1 v4 E6 {3 Z H( h+ X
- BNE .Convert_10
/ i- J- }% B$ l4 Q8 H4 i2 w, T - .End
# Y. j8 k1 u, \ - STA FC_Dec_Data_1" o! e' E9 q1 s! I2 T: n7 ^+ B
- RTS
( m; t: Y3 u. ]2 q# r% l - 4 ~$ Q# _' ~/ n8 d9 K7 T5 h
- ;----------------------------------------------------------------------
5 v4 r% W9 Z" H& w( M) e - ;显示曲目信息' R; K% V: q+ d. r# t' \
- Music_Info_Display
2 U$ j3 }3 Z* S% h - LDX FC_PPU_Buf_Count+ [. f& F) n' G0 o( H$ J3 p6 C
- LDA #PPU_WRITE_MODE_CNT_LINE
, A) \. N5 k* G" D! p - STA Use_PPU_Buffer,X6 [7 v2 r) u& A. [0 ^+ A. c, _
- INX
8 I& f, n/ k/ c( a - $ y" s/ J3 g7 ~6 v! c. z
- LDA #>MUSIC_INFO_POS
+ n( t8 L6 y1 F: F) k4 c - STA Use_PPU_Buffer,X
$ W0 \* ~9 g8 s2 L& g O; u9 U& N - INX
2 E, L6 |0 {# F, _ - , _1 R* d2 `$ I% h1 J# L
- ;居中
7 f6 F# F6 E3 C0 Q; ^ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
) T. N3 J& @: L+ A - STA Use_PPU_Buffer,X
! O# B3 I# ^* ]5 q$ B - INX
: F. e, C6 P3 ]/ { -
1 v/ e- G6 y/ w( B - LDA #$05) m8 U' f1 G. b/ U* a$ ~* s
- STA Use_PPU_Buffer,X
# X( u2 P- A; S* \7 G+ c - INX
! `# d# f3 c8 v$ N( r X - - O j' F- r4 K- a' F) {
- LDA FC_Music_Index
4 G) e5 w! r7 ]$ M - CLC5 O6 B1 w) [( G
- ADC #$01* R& Y6 u, A# V P
- JSR Hex8ToDec
+ w' H9 X& `) ^: n. H6 [ -
O) \* k' }7 Q( j' f; y' q - LDA FC_Dec_Data_10" P" [. |7 ^! [8 s# ]3 ^
- CLC
4 m9 a' X# x" [; q: x. H - ADC #'0'- B* x) ?+ y) k1 v
- STA Use_PPU_Buffer,X
7 A: D2 u) v7 u7 O1 B8 p/ I7 A - INX3 [8 S, s: {3 K
-
4 ]" r% X0 X9 j, ~, _4 z! P8 `, r - LDA FC_Dec_Data_1
6 ~3 o6 Q. H) t# J9 O2 ~6 a - CLC2 M/ @) W1 Z9 B
- ADC #'0'
2 M6 W7 ?" b& m1 c% E9 Z - STA Use_PPU_Buffer,X
6 ~2 z9 ?- ]8 A7 o! k$ E5 m$ W* l - INX
L, P1 i" Q/ l+ |. K7 S" V6 X$ C -
# p" R# ^8 B. O9 J+ _3 @3 [9 _ - LDA #'/'
) e; v0 @1 }0 F7 [6 J. y" C/ B - STA Use_PPU_Buffer,X- f7 g8 I2 q+ W+ J+ n. i
- INX! b. y' S' {9 [
-
; H4 P X" Y8 j; C3 k - LDA FC_Music_Max_Index
; d1 L3 Z4 s. M$ I/ }& h! d - CLC+ E& ]+ ]* }! \% M; q$ G2 l
- ADC #$01
( P t0 @) {" U, I% d' Y0 O2 v - JSR Hex8ToDec {4 [. a6 o- u/ B$ J
- 1 ~6 F& }' E7 L6 K& p
- LDA FC_Dec_Data_10
3 R' C$ G* f4 m4 [ - CLC
# u1 e/ g- l/ k/ ]$ y - ADC #'0'6 K" p# J ]; A' j
- STA Use_PPU_Buffer,X5 y, q5 e0 k: f) J; ^
- INX
& _0 f* r* `( v |# t - 0 f' f, X P0 R& U
- LDA FC_Dec_Data_1
5 |/ j& h" b( Y5 ^5 W - CLC
0 j& Z( t" i9 M' K! A O% W4 ] - ADC #'0'
4 U. V# D3 T8 \ - STA Use_PPU_Buffer,X! z1 M! B4 F5 J: P2 J
- INX: ?) R$ F. B* t/ l
-
# E4 F# i2 ~2 R, x7 x- }; M5 g7 j - .End
% [9 c! M/ O4 d7 y) [7 u# K6 e3 k - STX FC_PPU_Buf_Count
' k# R1 S: m) }% r! c - RTS V( q* Y! J# Z7 f4 f1 k0 {
+ E3 U) P4 A3 j4 ?- m- ;----------------------------------------------------------------------( }- C5 @& d+ V4 i; h# X% o
- ;音乐曲目初始化处理
7 t/ S1 m8 B( O8 V( B- ], @3 A9 E3 m - Music_Init_Process5 Y( D! D0 ^: v. f
- PHA
" A! M7 ^1 |! w0 Q - JSR Music_Clear_Process: d3 V" J. W! ?
- LDA #$1F
+ t5 q: t1 D/ d* }! M/ b7 N+ [& E - STA $4015
, N2 S+ c3 a9 t5 O: j8 b* t - PLA( Y) Y" c% C0 D2 m U$ D, N" q
- JSR Music_Init_Addr
2 u* G: b9 d% Y& j) c/ X - JSR Music_Info_Display) W) y, `& I4 b p
- RTS
C8 }2 T9 o6 h Y, _0 s" O( [ - ) v5 f6 t& {, w- _7 T/ E
- ;----------------------------------------------------------------------
) {# p; w5 f- ^ e5 W* i - ;音乐播放处理
F" p5 _, s1 U. b5 f" H; B - Music_Play_Process2 Z; w4 C4 h' D b
- JSR Music_Play_Addr4 _+ Y% s* f: y+ t9 `! P2 A7 F- s Z
- RTS9 Q+ {* X3 N( r7 K3 n
- 7 W- G# W% r$ V/ L1 U" L- H. l4 k
- ;----------------------------------------------------------------------% {3 g: V% Z. v5 ?
- ;音乐播放处理
N6 o" v1 L5 H; d - Music_Clear_Process) U3 M t# \* b
- .IF Music_Clear_Addr
0 f0 |+ F2 v3 A V& T - JSR Music_Clear_Addr
/ @8 k6 P4 `. k2 q - RTS, v; E- E6 y; j* j0 e. w; Y
- .ELSE
# `: F7 O0 m5 ^( D$ T: U7 G; f - LDA #$1F h/ h! T* w6 v% D# c; O3 N
- STA $4015
1 d' p' @% j! E# W" a7 O - LDA #$00
5 Y* s# P0 ^# C9 x* Y - STA $4010
% P% J0 n2 ^7 `* a1 p* B - LDX #$00
; g8 `& m, n( r1 R - LDA #$00
8 c! v/ q' n+ S, x -
9 s$ |8 X$ {& o& H2 z) D - .Music_Clear_Zreo_Page_0) G! @1 i+ Q/ K \$ ^3 `
- STA $00,X
1 A! L/ v0 o7 c$ M' u8 R/ `1 ^ - INX, C! G9 m; q* J4 B' C* d. Y
- CPX #Use_Zero_Page_Begin
0 x& t7 D# X& v. l - BCC .Music_Clear_Zreo_Page_0
, U: y0 o2 h/ Q8 ~9 a - . x9 A8 w: A# o3 k
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size; v7 w& z, h; B$ F: ^% \: R
- .Music_Clear_Zreo_Page_1# G) d/ m' a u9 U4 `7 R
- STA $00,X
3 @! @4 [* ^7 e - INX
+ R, K# x- T/ l7 B3 Q - BNE .Music_Clear_Zreo_Page_1+ a" h& X! S: G. t: ]; m
-
) \2 ^! P: `$ I1 w4 ^& b3 K% {2 s - Music_Clear_Process_1
6 k# L& S( z. Y+ H9 q - STA $0600,X
" U- X% a* ?+ w/ q H& V - STA $0700,X
A4 q6 G$ a' }/ s3 @4 X& o - INX5 \) Z+ o& G% m) V
- BNE Music_Clear_Process_1
+ D. e, g; {$ L7 a( y/ v9 S - LDA #$10
# J; U2 O: l. i* H9 S. [ - STA $4000
1 d- o3 G. w' @0 A% Q - STA $4004
! u6 R7 a. ~; l9 m - STA $400C
: k5 n9 K: T; H9 O$ u; ~0 `2 s4 S7 G - LDA #$00
3 z o; ]* s) F$ K - STA $4008$ q4 D5 J' P( w/ d
- LDA #$0F
0 P* S/ i$ y l' a L2 ~# Z - STA $4015
9 `6 p" Z9 `1 L6 Q2 H( I - .ENDIF6 F/ ~ a( O4 `1 g8 e, z: \ W
- 9 C+ e. k. P4 m5 X( e3 K2 B1 G
- RTS- V' D7 c W' p& S0 S% B; i
: L1 ], M( `: y- ]+ D- ;======================================================================+ P: ~* N) |2 c
- ;重启处理1 o! e2 Z: d6 D" r, [
- Reset_Program3 K, K% _" V+ r; r
- SEI) Z: |. W n* D' s4 E5 `
- CLD
5 C0 J8 c2 ]5 l( G4 ?: ^9 x! V' I - LDA #$008 ]/ I! C0 O) b. Q+ H
- STA PPU_CTRL% _$ P+ O8 Q T, z( R% U/ U) q
- STA PPU_MASK
+ A6 b3 P0 _! u) x" n+ z; n9 u - STA JOY2_FRAME
+ {! g% \' P0 l% v" o7 Z" O - STA APU_STATUS
' P8 a% B- Y2 k7 t! r& ~ - a' |+ X3 h2 y) I
- ;等待屏幕准备完毕
4 {) H; v7 a. S* } o6 c$ u - LDX #$02( K+ j: A2 L. m' Z8 O6 S: C' \# \6 i
- .Wait_For_Screen_Ready' G( Q0 a! U6 M+ L4 e" M7 j
- LDA PPU_STATUS# D& C& x5 X' L' L
- BPL .Wait_For_Screen_Ready& }! l6 J) V, I R
- DEX" S$ X; {+ V. i7 E# _* } E5 e, G% d: t
- BNE .Wait_For_Screen_Ready0 E2 m* P1 b; r3 J1 }
-
. q1 s$ I. r1 L" Y1 E& B1 r" q4 o - ;清空调色板
- d+ z8 t1 g8 a" A& d" }* e0 a - Palette_Clear
; X% d" g0 ^8 e( z( n1 z - LDA #$3F$ C. Y1 x, u/ h. P
- STA PPU_ADDRESS
* d2 ?0 q; ?) E1 D& E - LDA #$00
- i- f8 T+ b$ p2 v- T$ M+ r - STA PPU_ADDRESS! S; J5 |3 S: E* @
- LDX #$208 D8 C) u/ Z* G" F" p
- LDA #$0F- J0 S6 _' V6 p' @, X* t
- .Write_Data
8 O3 B6 Q- ` e1 f, _ - STA PPU_DATA: t7 G& p3 w$ q# n- f/ K* f. e5 R$ A8 M+ J
- DEX3 }- [' n/ d+ Y$ |+ ?, k
- BNE .Write_Data2 W. i6 o+ z3 r
- 9 e- B7 E% o0 r
- ;清除声音 $4000-40135 n+ A) q. m/ \5 Q$ N- O
- LDY #$14
* h8 h+ P8 ]1 s) C# ^. V- q% U( I - LDX #$00
( I, J6 f+ n. W ^9 N1 E- o) K - .Sound_Clear! ?" y; A6 T4 G$ J) B$ k' C
- STA $4000,X$ H7 R0 C* m; M! Q. a& w6 A
- INX
{ C& l+ Y+ D1 C - DEY
: s9 \8 H: `9 W) l) ]6 E c# q - BNE .Sound_Clear9 x z* Y- M6 t _6 X0 l
- / v: o# v+ r8 b, V: s+ E6 b
- ;清除 RAM $0000-07FF! d/ m2 P2 [. r; h. |' }* h
- LDA #$00
/ f: [, @, Z: U8 a2 | - STA $00' v/ n% B/ D5 J. k0 D8 i
- STA $013 Z" f+ f' E# A
- TAY( k4 F, n9 j) i0 ]6 U
- LDX #$08
' w0 [* l) @! \ - .Memory_Clear
z( v3 o! T' F - STA [$00],Y9 M% j$ \: t6 X- r# Z$ `4 h
- INY
# U' E- a0 V5 [+ r% E# E) Y - BNE .Memory_Clear
) d4 n4 v ?, ?* Q0 W8 Y9 h( H - INC $01+ L4 c5 L: g7 p' M
- DEX
: X; h5 q' M0 J) J+ F - BNE .Memory_Clear
$ m5 ]6 I+ N6 D9 x - 4 i6 m+ A& [. _' p; |
- ;精灵缓冲初始化5 R$ b+ w, a8 J! x* ?% @" p
- LDX #$00$ L3 n) I3 L0 N) v4 u# F* J0 i- m( c
- LDA #$F8( I3 J) y3 e6 c, e8 r1 P
- .OAM_Clear
) {+ {3 M# A, Q" k& W* ~ - STA OAM_DMA_Buffer,X$ G( B9 U$ L: T, q2 w3 d+ M2 Y
- INX
6 Q. C8 e4 N0 ^5 M& T - BNE .OAM_Clear
$ d6 A' K5 {0 p. k" z - ; W. Q. a* |# h, D2 Y$ L' @/ ?
- ;栈指针初始化7 b% O) C- P* U, D0 O( N1 x2 E; d
- LDX #$FF6 F5 v0 j X0 @* p+ u
- TXS9 r0 ^! k! n; h4 Z: ^: h
-
* q0 o* J, I) y1 U0 m0 H - JSR Nametable_Clear;命名表清空
O% n8 k X3 l) a7 W - JSR Palette_Init;初始化调色板缓冲2 R6 K+ D0 f$ e2 `3 |
- JSR Static_Text_Init;初始化静态文本" G) i7 ^8 Z& M
- / G5 \# `7 z% c7 S3 L6 B; T& z
- LDA #MUSIC_ITEM_TOTAL - 1
/ |2 z, C( g* {- e( {9 d" p" t9 Z% _ - STA FC_Music_Max_Index
, \, h3 v7 z8 p; z% t+ c- m0 `- n! L6 Q - ! s) T# h6 U+ t% ]- H
- LDA #$1F9 Y# N4 H7 Q' L5 [" `# q
- STA APU_STATUS& F# a& O6 V3 A7 P6 `, m- D
- LDA #MUSIC_BGM - 1
p- R% m7 O3 o: D+ G) P - STA FC_Music_Index7 C W+ A3 A3 Q! G
- JSR Music_Init_Process;音乐播放
/ R% k7 R2 s- M5 W5 C -
" f& u$ L0 G N1 C8 M - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
3 B+ ?( \" w8 B2 d - LDA #$1E
_7 Y. M5 \6 ?7 Y* n; Y& m - STA FC_PPU_Mask_Buf
5 t& v/ z6 T: ^8 M - $ @, S- l1 K6 F. u1 V
- ;启用NMI处理 H/ u" e) R0 S5 l% G0 H
- LDA #$80
; x5 }+ z* e8 O8 R0 N+ N6 I - STA PPU_CTRL1 O. ^0 f% Y& A2 F2 j
-
, f/ o6 D: D! v' c - ;程序循环, 剩余工作交给 NMI 中断处理$ l& \: O, S+ {5 ^
- .Loop
. o) A( r8 i$ y1 q. k - JMP .Loop
% J; ~! \1 w& ^8 M - . T( M* U4 \. g( F
- ;======================================================================9 Q$ g/ b3 D; y' C
- ;不可屏蔽中断处理
% i0 G/ a' w5 G( F - Nmi_Program! Z. X8 Q8 u/ w$ P
- PHA
& f6 d! ]; l5 T$ k - TXA
" R8 A& I8 W- o8 j2 v+ y - PHA. e& p" F7 ^, K8 v" I
- TYA- e# u# l! H) T6 C+ j
- PHA
1 v4 p, |* a( t1 w - 7 C; v/ G- E( p& f
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位6 W }/ B5 ^4 O F/ p. M
- ( Y' M9 t/ Z) k& G ^
- JSR FC_PPU_Procrss;PPU处理! M4 B1 V, K* F, g& p) w
-
& s1 y2 ~- m/ U$ N; G - ;精灵内存更新
+ t' a9 p& P) @# C+ [+ ~ - LDA #$005 N8 [& m1 D1 m1 D0 o
- STA PPU_OAM_ADDR3 T7 `# Q1 o7 f5 _
- LDA #OAM_DMA_Buffer / $0100$ W: c4 x, Y* L. P# y1 [. c
- STA OAM_DMA( H1 t/ l$ J' {" q! C# I; M& N
-
. b3 D. u7 S7 | - JSR FC_Gamepad_Process;手柄输入处理
" ~) s# @* n7 p. T; z; o; F4 R4 U - JSR Music_Select_Process;音乐选曲处理/ t. a& \( C5 S1 X T9 n# `7 T
- JSR Music_Play_Process;音乐播放处理
4 h( V+ m: b3 w" {" p - . T9 T! `7 H2 V; b$ R' a
- PLA# m9 P6 Q W. {
- TAY) n5 z' E# d/ U% r+ e3 T* C9 f
- PLA8 _6 I' |; s8 c/ G6 U+ H
- TAX. z8 [: c( W5 F0 K! e3 ?" m; K
- PLA
" Q8 O3 ]8 b- X# N% S% N
- X4 z8 ?" h( ]; `! g; m4 I/ Q- RTI
* { p7 A" n4 r0 O. A4 i3 C% P7 x% Y - # [. W0 i5 n9 K4 [3 u: g; m. y1 `
- ;======================================================================
" d" r! b$ }' q7 w5 V/ N - ;请求中断处理9 g% m! P2 a) Y; u
- Irq_Program
; ~5 A! z/ t! l9 R; V - RTI/ }+ Y6 z+ p: P0 {7 C4 K
- 6 i' B5 ]/ R& E$ J. ~ u* T
- ;======================================================================% |$ `: O- e6 c6 S% i+ [
- ;中断向量表5 q8 v0 B1 |/ ^5 ~ T7 l( n# x) w
- .ORG $FFFA
# F( d7 }" j7 F - .DW Nmi_Program ;NMI触发时执行
) R( @7 j. M8 N+ R - .DW Reset_Program ;载入ROM时最先执行
Y2 }. W4 Z' S3 }3 b - .DW Irq_Program ;IRQ触发时执行& P1 ]8 |4 q6 S4 `
复制代码 " q+ e I& R9 A1 X
: U; G0 t, S4 j# F2 h
6 S+ j8 h" B o+ D/ y
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|