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