|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
1 G S; u; r4 T7 I9 U, r/ X
0 j: J8 o, v4 @+ x6 e/ U以下是主框架代码:
. Z; A" w& _( [$ b5 J- ;======================================================================
3 @ o' L' o$ P% i% k+ f - ;文件头
" n: {; H: m% ~" A3 ?+ j; k - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量( q" f& P' g' r
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
- q- r& s, ~2 V( X# o6 | - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
1 }/ D: m5 E9 v* N+ d& |9 f! L - ;======================================================================
4 R+ ~$ x4 h4 X$ { - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2& |, A& S a9 ?1 h
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
# W8 ^& Z( A' K; S! \+ ~' ] - ;======================================================================: d& `8 W+ @% ], M3 f- w
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
& s0 j4 F$ @9 q- R - RESET_ADDR = $E000 ;主程序起始地址
9 _- y4 a! Q1 {/ a/ {+ o h - ;======================================================================0 m% I' g+ [- E8 s% G, R
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB. d1 f* u+ D+ T# p
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
; j' T- `1 I" Q/ F( Z0 D - .INESMAP 4 ;Mapper号 (0-4095)3 @# i/ F9 x8 E, X
- .INESSUBMAP 0 ;子Mapper号 (0-15); F9 i7 a2 F0 D* n6 A
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)( `& H( t6 \! j+ G" c8 p
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
# r" s7 x2 x, W& ]+ d0 A - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)0 a: A* g' L0 e* l7 f
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)2 {/ W8 D) w1 G4 c& F' u2 x2 N
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
4 Y% g" w2 j, ^' Y - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)- q# ^) ^; T" g
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy), u! c, _+ {8 L+ U* d' q( q
- ;======================================================================3 p' ~* \( ]# l7 }: K
- .INCLUDE "fc_demo_config.asm" ;全局配置
0 S) |6 n8 N5 p- ]$ L - .INCLUDE "fc_demo_constant.asm" ;NES常量
- I: O; X' `; T* w$ u - ;======================================================================
- h/ S; K& ?: P) C) ~ - ;音乐配置! m' H$ ^6 n. e7 i/ X
- .IF 0 = MUSIC_THEME : p- E. H K7 j' ^' w/ u/ D( B
- .INCLUDE "data/music/Gremlin 2/config.asm"
% T2 X2 r$ [4 n a% e5 ^5 x$ j0 s - .ENDIF, X3 c. u }# I
- 5 F6 f% T) X1 @3 I8 P
- .IF 1 = MUSIC_THEME
! ^2 H! N; t$ n. ^6 f - .INCLUDE "data/music/Raf World/config.asm"- l7 V- v1 `) G# m( X* ^
- .ENDIF
: u4 d4 T7 q8 `- J: `4 V -
0 {0 N# E6 H0 n& O7 S - .IF 2 = MUSIC_THEME 3 n, A$ p8 I: }* I, ~
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
4 k& w/ T/ m. I) o; Z - .ENDIF
9 \& _) U# i; C0 j ` - # C2 p8 o# c0 O" x4 @" m
- ;======================================================================$ N' m; Y0 \' Q; s7 ?0 i
- ;引用CHR图像数据) i' O0 A k/ }8 A6 a
- .BANK NES_16KB_PRG_SIZE * 26 q4 h) M9 y3 i5 {% r4 X* g; c
- .ORG $0000: a$ s U! R5 I0 k- X6 t! r6 S- x
- .INCBIN "data/bkg.chr", X8 g" ~9 l7 `) i
- .INCBIN "data/sp.chr"
& y* U7 r7 G+ ]. ^# x6 @% T2 T- t -
& W x! E3 a" H s/ P! H1 g( k7 O& k - ;======================================================================2 Q9 I$ ^' h2 n( ?4 Q. t
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
7 W% K; M; h# B) a3 J7 z4 Y - .ORG RESET_ADDR7 H- I3 ^0 B: k" s$ N' O
- ;======================================================================
3 C1 G+ o' L- I8 n0 y; C6 P2 O - ;引用其他源文件
: A) Q8 o$ [8 o$ J; M - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
- x, b7 G/ p) b: i- @ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理# z& O' O+ Y2 S7 A1 l* \) V
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理' K5 v9 H! y1 m0 O2 q$ t# f- V
- ;======================================================================
. n4 K: z4 \% I& X5 |
5 {! W6 Y* z# l$ j8 N9 s1 d- ;======================================================================, n& s- v2 V) V$ l
- ;等待VBlank到来4 L0 P3 ]1 l: o C$ U
- Wait_For_VBlank6 u1 t6 a: @$ f" a) y
- LDA PPU_STATUS! L, |0 T+ a0 d8 q- Z( T, |
- BPL Wait_For_VBlank e) }- k& }! u2 n9 e* ?% w* N0 G
- RTS
$ V. g1 A) }& A - . w6 V) { J2 I* ^! M4 Y
- ;======================================================================0 d4 G' p$ I6 y! r d! X- i; v
- ;调色板初始化
0 R/ \5 {1 m3 I/ m9 i - Palette_Init
n* C) j- a0 u - LDA #$3F1 B# S0 k8 {$ j
- STA PPU_ADDRESS. K6 A0 R; Q ]& r; z/ K, E
- LDA #$00
" E+ j3 v2 ?$ \0 B - STA PPU_ADDRESS% G4 {# Q$ A9 s' ]6 R' T2 P: @* g% k2 i
- LDX #$00
; G" d, b2 ?3 l - LDY #$20
# Z+ Z" I2 S# I7 P; E5 e - .Write_Data
" J ^) x) B. h) A, p - LDA Palette_Data,X5 y, d: ^* F- j- U
- STA FC_PPU_Pal_Addr,X
6 e: L6 x! C; d - INX
. Y8 F6 w- f/ y5 B - DEY* l9 S% F. [9 f0 o* x" K' B
- BNE .Write_Data) O8 x n: C# u" Y- G
- .End
7 n! {' G1 e$ z" S* x- p& K: R - RTS
T" M. c1 C0 q9 A
7 m& U9 {( p. z" A( }- ;----------------------------------------
* X0 C2 u' E( N3 a - ;调色板数据
+ _$ U& F, F$ _" p5 h5 y- @+ V4 m - Palette_Data) P3 p y' \4 H- W$ ~5 O* b6 w
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
# q% r0 I7 q) x# Z# y! F - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
' z' |* |# |) x5 a6 Y1 e - 3 l/ b' S$ u/ l2 U# [5 o
- ;======================================================================
1 Y% n6 {) t9 O% y0 M8 u0 h, { - ;命名表清空% ?! {- R" l- e1 j/ F7 o
- Nametable_Clear7 n( O" y3 S$ G9 a" G
- LDA #$20
" U" ^7 C- P- j3 j* O% ^& f+ N7 u - STA PPU_ADDRESS J3 t2 K! S; w, R7 J$ x$ y
- LDA #$00
3 _) d& B9 H4 f" M# P- J+ s$ ~ - STA PPU_ADDRESS
3 u9 j9 Z. h8 C) t9 e' s' ^6 h. }, k - LDA #$003 X5 j; m) |( o; f) n
- LDX #$00, j; c/ J2 L' {
- LDY #$08
' o" ~' e- Y+ @0 @# r - .Write_Data
* n7 S) i- S: I% N1 e - STA PPU_DATA
. ^- E) \8 t O; ~ - INX' P' z9 a5 t4 B( U
- BNE .Write_Data
- E' a- ?3 j, U# T - DEY" _* D, A* ~1 |) ^
- BNE .Write_Data2 [# k. S$ z# W0 k
- .End
& r( W$ J& E) \+ W* P" o3 }( o& {9 y! r - RTS
) c0 F1 O! G( A3 o/ k* ]% K# I - , S# e' F) K. T' g4 f! b% E
- ;======================================================================: f2 b- _/ f% I: Q p
- ;音乐曲目切换$ f3 e0 ]( E' u5 V, u8 t- s0 r
- Music_Select_Process
) K5 y/ B8 _ p X, R! y - & b8 i; D& ~, |* m
- .Pre_Music;上一曲$ {' i5 P1 c. A6 r- E
- LDA FC_Gamepad_Once: ~ f$ ~# J9 _( a0 C
- CMP #JOY_KEY_LEFT
0 c. B v; w/ N - BNE .Next_Music
' X! V0 J3 ~& {8 h! f2 v4 J - JSR Music_Play_Pre8 Y' D: X# d# ]9 M8 R" B* c! v
- .Next_Music;下一曲
+ r' I6 I0 V U/ L - LDA FC_Gamepad_Once! ?, z" V+ j- O* ]0 L
- CMP #JOY_KEY_RIGHT
& R7 q5 B+ L3 [3 ^5 ^6 Z y - BNE .Next_10_Music' m7 S# Q& }, Z* g- ?& d2 {/ C
- JSR Music_Play_Next
- ^4 p9 m! O6 Z+ G - .Next_10_Music;上10曲0 ]1 k' q# } G) C/ Y2 b* e
- LDA FC_Gamepad_Once8 v. U$ @- z: o' ^
- CMP #JOY_KEY_UP. |; m2 }6 W- u$ @0 @* _+ D( J, Y
- BNE .Pre_10_Music
1 r" \* m- J) J& u - JSR Music_Play_Next_10
: \) P+ ?0 f' m4 U* } - .Pre_10_Music;下10曲
% l1 ?9 v% A* H+ f: S0 ~ - LDA FC_Gamepad_Once6 q& n5 \2 G% m" U
- CMP #JOY_KEY_DOWN6 Z0 A3 l. \6 J7 v8 J
- BNE .Reset
% @2 {* h b1 Z: x9 U - JSR Music_Play_Pre_10+ j) Q, ~! E0 @! m/ C0 @1 k$ f
- .Reset;重播当前曲目
3 Z2 G8 F/ I* Q. s- p7 X - LDA FC_Gamepad_Once- K: a) w8 u; `7 M. b- Q" ^
- CMP #JOY_KEY_START
W V% R) i+ O: _. I0 \) ` - BNE .End
+ |- I. [) F* f% Z - LDA FC_Music_Index
6 j8 c( S+ F* m3 y- x6 r - JSR Music_Init_Process
1 z0 Y& W C8 Z( f; \; I - .End
( V& y5 d6 D% f- K- T4 ]! G' P2 V6 s - RTS' r% B1 J1 x8 |% a9 q* n
0 H/ p$ k0 K% l0 u* a( N9 R- ;----------------------------------------------------------------------% [, }* z9 ^7 C( T$ E
- ;播放上一曲, m% n ]1 D( Z0 w
- Music_Play_Pre$ s9 i: \, F$ M0 X4 n a
- LDA FC_Music_Index
- F1 y- x, x6 S) t& o+ Y9 W - BEQ .End$ j% U1 ?# a7 a& T/ T% o# k
- DEC FC_Music_Index4 X$ q( W& ^9 K* [+ G
- LDA FC_Music_Index
% E* \! Z u; ^" {# p) B - JSR Music_Init_Process$ J p: @4 g- B, a5 T0 ]
- .End- D- P# H/ O# {" i% N, m4 J
- RTS5 K/ E0 T+ u* p
- ;----------------------------------------------------------------------# K$ D1 e& ]$ W' `3 Q
- ;播放下一曲
4 \; c) A* E! Q% Y. _+ S - Music_Play_Next
7 h1 E" G; U3 }+ u9 x/ U8 Y( n - LDA FC_Music_Index& w" M4 Z, `/ A- r0 t& {( E, X
- CMP FC_Music_Max_Index
, Y& ?! m* z5 W8 G2 ]) ` - BCS .End4 P7 m8 m$ B' l7 `9 J( x# F' {
- INC FC_Music_Index
) P8 J+ k! p& x% }( C - LDA FC_Music_Index
; a4 z' X8 n9 P& }* [0 y' q - JSR Music_Init_Process. Q+ `9 z3 D1 D( C$ B
- .End
2 x1 Y, N- k5 ~ h; S - RTS6 D5 R' }' z9 T# `% H1 l* ]
- ) {2 ]/ Q7 }! R
- ;----------------------------------------------------------------------) N- T7 i: s# c& H+ F, i
- ;播放上10曲
* e& g. T7 `2 L! Y/ g - Music_Play_Pre_10% k7 v. g, ]9 W1 C5 i
- LDA FC_Music_Index
; I7 e4 `4 V% u% u: N - BEQ .End
; r, `* x' F, e$ g0 j2 Z - SEC( H4 l2 ?8 a# V! e% F0 B
- SBC #10
7 ~) q8 Q5 ?/ P; Y7 I1 o! ] - BCS .Pre_10
& G4 j- Z# w+ \, Q- t$ b2 A - LDA #$00
# z" U# X) b; N, P6 R - .Pre_10, u3 j4 t) a3 w/ G; R
- STA FC_Music_Index
: Q+ _' F0 ]' h - JSR Music_Init_Process/ x7 f6 S" v2 @: q" J* `( n: i0 b
- .End
' [. V" ?: k0 Q1 I# G2 L+ {5 H% s5 q - RTS
' E a* { _; ?& c - ;----------------------------------------------------------------------5 k1 g) ~+ g- _& \8 N
- ;播放下10曲. ` p" F3 ]1 {- Y
- Music_Play_Next_10) u$ K$ w( W0 D1 h3 G9 ~" [" p! `
- LDA FC_Music_Index" u2 ~$ {6 Y- J5 J
- CMP FC_Music_Max_Index; c+ h/ \8 `4 Z( Y- Z3 \
- BCS .End
* {8 S: e3 i: a- w# q G - CLC/ ?0 y* n( q) W7 d9 C: n, O5 q
- ADC #10
1 O0 e1 ?. @8 |4 s c* F7 G - CMP FC_Music_Max_Index$ _ X8 T8 W, z- v5 U" H- s# j8 [2 i7 e, X% H
- BCC .Next_10
3 `0 l( p" V& z* C9 z* O& g - LDA FC_Music_Max_Index
. ^+ z. [3 w- M* w - .Next_10
# i0 e& J r/ D t% w! L+ J - STA FC_Music_Index
[5 ^# X, Y" `1 A% x% {9 |2 O - JSR Music_Init_Process a$ p0 a! C& }9 }
- .End
( `! v; g9 c* V: U3 b: A - RTS
0 {2 @3 F! w( P4 S, ^: R, O - - R6 L8 F, v* E' o# b' k1 f
- ;---------------------------------------------------------------------- ] g Q8 _' F9 f" J' `6 k5 G
- ;8位十六进制转3位十进制制
( n6 k5 V: ?/ U* K - Hex8ToDec [( [- Y+ ^8 k+ c* P9 y
- STA FC_Dec_Data_1
/ t8 ?, r" z* C3 P - LDA #$00
! u3 i* w+ H" i; n& \ - STA FC_Dec_Data_100
; v) T# I1 L+ |# u9 A$ |9 S - STA FC_Dec_Data_10
/ j: b5 ~! ]8 ^( Z; x - LDA FC_Dec_Data_1# ^6 m3 Y9 _8 H$ R
- .Convert_1006 n; x& ], j$ s( }% `( j
- CMP #1003 M7 g. v9 P& Y" I' h4 Q
- BCC .Convert_10
0 c$ ^) \% A' I. L8 K: L! } - SEC
3 b8 Y. ^ _3 z9 F9 E5 p - SBC #100' w9 m% q+ G1 a2 l! a3 a
- INC FC_Dec_Data_100/ \/ _5 a7 k8 H6 m6 s! N+ I
- BNE .Convert_100
0 i5 o" ]5 k1 h# S - .Convert_10
: D! e2 B& r! s - CMP #10* `8 j( z' d0 f3 q7 ^
- BCC .End
6 Y* Y8 l: }( D - SEC/ Y; ~6 G( @9 T5 l& e) C# F+ \! R
- SBC #10. `1 b9 S" t9 V
- INC FC_Dec_Data_10
7 y, P% S+ z, h% P7 T - BNE .Convert_106 j) B7 x0 H* h: p5 X- Y
- .End& ]' D5 k( e6 L( q) y ]- j
- STA FC_Dec_Data_1
+ ?4 ]6 F' O9 n% T4 U - RTS. q. z8 {5 Q p7 U
* q8 S2 q Y' }( E' J5 ^- d- ;----------------------------------------------------------------------
6 x8 ^ h9 Q- W; G3 N# x+ F/ _" g - ;显示曲目信息
: C& |& `. V3 w - Music_Info_Display
h, M' M# F. A4 p - LDX FC_PPU_Buf_Count
9 t$ {) x. y2 S% I, @( u: o - LDA #PPU_WRITE_MODE_CNT_LINE
* V9 x8 U. O9 @ - STA Use_PPU_Buffer,X
4 P5 {' ]' E- w2 V- s* X - INX4 j4 e9 @2 z& d* \
- % x5 u% n. t2 U' I- v) \' d6 ?* q
- LDA #>MUSIC_INFO_POS- K6 T* p! A9 D8 m9 W
- STA Use_PPU_Buffer,X
6 z3 E/ H4 D8 u! ` - INX. x, k4 X0 {# n3 ~: C
- ' h9 }& s) ]1 A1 \. y; R f# h. f
- ;居中6 \# @7 d0 W$ }- P# ]8 x
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2% O6 h) d8 p, Y d4 J
- STA Use_PPU_Buffer,X: p2 Z% O0 ^( \
- INX* L7 `* V* d0 `& h( {' @* \ A, ]/ o; \
- ! A: A; f V% B# \4 b
- LDA #$05- H! J4 k: N. C% b# `5 {3 A$ P
- STA Use_PPU_Buffer,X
! }1 o3 F8 \6 F/ ^& O% |! T - INX) G, z' j4 V( C- @# z
-
, k% ~2 @ _4 ]) u. e1 S/ s' l& E - LDA FC_Music_Index, @& ]6 A" l/ Q2 }
- CLC7 @3 ~6 q8 S# |
- ADC #$01$ h. M @. P+ z8 X
- JSR Hex8ToDec: v7 F' y8 e2 [) c
-
2 F( W+ h6 Q$ P! G; S. r" G* U - LDA FC_Dec_Data_109 \: n, i$ P7 c) V9 ]
- CLC0 x9 l' s3 h+ z# I5 |
- ADC #'0'
^9 `% {7 w9 ]5 c, C - STA Use_PPU_Buffer,X
5 f( W7 e( ^- F+ ~1 h" F" a# w7 `0 s - INX |) ]& |. I' p/ B0 G. j/ u ?# B
-
$ a- c: c- W4 I s- [' H, f) N - LDA FC_Dec_Data_1
; \4 E6 @9 d h" U4 Y - CLC
% W8 K8 d* |; `( I - ADC #'0'& v: G+ \ B9 t. f1 c
- STA Use_PPU_Buffer,X
% v* e# v# @7 r) z - INX ?) V/ a. a% L. V- P5 g$ Y
- # _, W9 m5 |) ]( J- C; v
- LDA #'/'
4 p; p1 d5 M; r% u/ {0 E - STA Use_PPU_Buffer,X
! e5 `1 `. b+ w7 G# W% E' {$ a! M - INX3 K! g6 i1 Y; Y8 y
-
5 I+ \5 J w: D - LDA FC_Music_Max_Index
) p) ~: P* k1 ~' w, k; D - CLC
8 V" N' p# Z+ }7 |: v: p - ADC #$01
3 u& J# G/ d3 Q4 ~8 b, G - JSR Hex8ToDec
2 X! u) e) b# ~8 n- D - 4 z3 S; f( L, p& a( Z& H
- LDA FC_Dec_Data_10
8 a3 F8 H) B: ~" m - CLC
8 P: P; b9 j* U$ g( ^) G. \ - ADC #'0'
9 J/ P5 b/ v$ N5 _ - STA Use_PPU_Buffer,X
. g6 p- h- r2 @: u% _ - INX
9 g% f1 G0 @) J7 ]- Q. m* S$ ] -
$ J8 M. E h4 _( g* q& _7 D+ n3 e - LDA FC_Dec_Data_13 Y$ v5 M2 u0 x( @
- CLC
0 o! a. M/ a2 I - ADC #'0'
/ b9 S( K' {- {; J4 O - STA Use_PPU_Buffer,X* f, Y- k1 t; Z* |
- INX. p! |9 e. ]' `# I# c
-
1 o1 T! j1 l9 D) L8 L - .End, G) O0 g6 k8 |
- STX FC_PPU_Buf_Count1 j+ @3 X$ x: X' i4 p. k5 ~
- RTS
5 Y" }. \, I1 c) E. I$ o% H
4 C8 w& n: _+ V% l- ;----------------------------------------------------------------------9 _3 \* ~, U* K4 Q" D( p3 @, W
- ;音乐曲目初始化处理$ S1 [% }9 ~4 M; m' v5 T
- Music_Init_Process1 q4 _5 C5 b1 z
- PHA! V x& G- ^* Q2 N% F
- JSR Music_Clear_Process, t: A3 _, ^" W, F
- LDA #$1F
' h3 e0 \% A- H; O. n - STA $40157 \, l3 ]: F. B
- PLA/ e0 O" ]9 I7 A! M0 b4 M' S
- JSR Music_Init_Addr; ]9 u7 m2 o+ S A$ D. b) t
- JSR Music_Info_Display
+ j# B; Q M4 R - RTS5 y) r) u6 G6 {, F
- $ q( e/ v% P% C7 Q+ A8 O" b
- ;----------------------------------------------------------------------
% E |: @+ B [3 T$ R! J7 N4 x' i - ;音乐播放处理4 j6 \# r' B$ D8 k% r$ U% j: b
- Music_Play_Process
. c% g+ n+ Y o; S3 R" ?1 r - JSR Music_Play_Addr
o8 k8 A' a. n& A3 y8 s( ~# ~ - RTS
\9 k- b. T E2 A/ p - 6 w! ?. ^8 e- w6 p: V t2 d. V5 | F
- ;----------------------------------------------------------------------2 O% J4 V- |2 ~0 e- Y5 O
- ;音乐播放处理
0 B# Q% u7 a# t - Music_Clear_Process; \) q k5 [! l Y- N
- .IF Music_Clear_Addr5 ^' z, j, z8 j* H0 k$ @
- JSR Music_Clear_Addr% D. g3 q4 l! b
- RTS# Z! ^( T8 S% P4 d: R* h
- .ELSE7 j6 b( [- Q) h1 {' \3 ~$ f* V5 {
- LDA #$1F/ d+ X. `: m* ]/ L! ] q
- STA $4015
" m; T9 A: w( V$ a5 W; l4 R - LDA #$00
4 k; D9 o: \, X% ?( J: A - STA $4010
# }& s- b' J& @ - LDX #$00
, F3 \+ V5 d& ^" x3 I% s, L - LDA #$000 u* c8 ~) @/ e! ]5 x
- & u' T+ E7 w" p( s5 U8 Y1 V, t
- .Music_Clear_Zreo_Page_0
* d2 v0 H: B0 b8 _3 } - STA $00,X
9 @0 A) T' u: r- z1 p - INX
- n! e3 V/ r2 Z9 p% [' ?8 F - CPX #Use_Zero_Page_Begin
2 l' g8 o8 P# d; W" C9 n) x - BCC .Music_Clear_Zreo_Page_0
+ l' M/ J+ Y# z o7 [" P" l& T - 8 G( o0 _$ x, A. M5 l) R
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
x/ m$ Q; B# h! U - .Music_Clear_Zreo_Page_1
0 z% [1 Y2 f& }5 o2 v - STA $00,X6 R" H% N2 X" L2 l; n
- INX5 X' I, @ t7 n" h ]- X
- BNE .Music_Clear_Zreo_Page_1
: l( ^! w3 z" I, J4 }% [" T' E - 5 l6 z! f2 J8 R% ~
- Music_Clear_Process_1
7 S) \) M# g+ A+ ]7 e: _7 i - STA $0600,X
' l0 Q) ? B3 H" Q - STA $0700,X
" } D' [4 |) f - INX' v2 }3 u; e V
- BNE Music_Clear_Process_1
( H* h+ q. I: }' k3 m2 j3 W& x - LDA #$10. O6 ~6 s7 z- q- a8 ^. F4 e9 i
- STA $4000" e1 Y- o+ P/ }. N
- STA $4004
+ F$ W! A3 ^$ h3 ~1 l1 x - STA $400C
, h/ L: y4 w* h+ K+ } - LDA #$00& f' @2 o3 Z, ~" u, h, S
- STA $40081 z$ ?6 S6 L2 P4 g$ i
- LDA #$0F( `; S0 \& k! K! C, q/ I! U
- STA $4015
& g! u: s, D$ X6 F# ~ - .ENDIF
8 e6 V. a. ?7 d -
& Y5 p; L( l- u - RTS. F" b/ K. v# P+ K7 s; { p
$ U3 v4 v$ ^5 e. D- ;======================================================================
. f: ~$ Y4 u+ L: u - ;重启处理9 E! F* S! O) X( x; a
- Reset_Program
! ?* K' d' ~, ] - SEI, F$ U# r: k* K6 Q& J5 h
- CLD
* [& ?9 K& g) J- k- ?2 @& r - LDA #$00
q; K, |* O1 n* a0 l0 ~" M - STA PPU_CTRL
& q/ q! r% f! K8 S - STA PPU_MASK
* a2 E6 H6 F- \/ U9 n) z - STA JOY2_FRAME
5 a* p( d8 ~$ _& Z - STA APU_STATUS6 u7 r6 |6 n: r# Y- z+ l
- / Q! X0 g/ k0 d8 Q
- ;等待屏幕准备完毕
* i' U# ~' W' E& F7 a3 B - LDX #$02" `3 Q) z: E/ k2 f+ [+ \
- .Wait_For_Screen_Ready
# d! g. \5 I- R; d3 q8 x - LDA PPU_STATUS
+ g9 x3 {! F% z - BPL .Wait_For_Screen_Ready
, W8 d$ j0 `' V/ n! M8 C - DEX
$ W2 u- @% Z6 d9 v - BNE .Wait_For_Screen_Ready$ `2 t& _" B) \4 t/ g
-
; B9 P$ Q5 H6 t& ]" Q/ v - ;清空调色板' Y$ }' R, f( {2 Y3 N; E
- Palette_Clear
- T' `4 T/ j" W4 z2 {6 O - LDA #$3F
' t4 s5 }: R. Q3 B5 S2 N( E% B) _/ X- n - STA PPU_ADDRESS! E( H5 e6 N% [$ p* I, S/ D
- LDA #$00
3 a1 ]4 I- d5 R. s9 H0 p - STA PPU_ADDRESS
- o7 x3 p, T& Q# o* }" { - LDX #$20
9 z- A( [- B; c% q: [1 o - LDA #$0F
. \& ]4 s; J$ j - .Write_Data
! x: k0 X3 N! J( e. o4 l* V$ j+ `8 C - STA PPU_DATA: J" @; l/ U" Q
- DEX* Y' _) ^ y: C2 z1 Q) m" r# Q! b
- BNE .Write_Data0 H5 _8 s. U: t: L3 l& x& B4 T
- ) o W6 Y/ u" o: f
- ;清除声音 $4000-4013
( F( M% Y, L+ R" _! w4 `6 F - LDY #$14
( [# H( Z! g) C( v+ E% {# m - LDX #$00
/ `% @# u# H! }3 M9 M - .Sound_Clear! a2 }7 V! H" P$ r. Y
- STA $4000,X
% d/ j: ]; I* |8 W# r2 i - INX
% @- |8 |# i& S, x# g1 } - DEY$ ]; d! B- @" V' n$ W
- BNE .Sound_Clear
9 |1 W; ?. d* c7 V, ~ j -
q; q4 z( x& v+ Y - ;清除 RAM $0000-07FF6 P4 r: l- m& a- q6 a
- LDA #$00
% Y( G% z* |7 v* @) f1 J" t2 O6 M - STA $00
8 t5 u1 O c: d0 n j! Y) o - STA $010 i& H) b9 a, E' n/ h
- TAY4 r# @( ^5 U9 W0 B6 M5 c
- LDX #$08
7 V( B8 A- c3 {, B" H - .Memory_Clear
( H Y+ @, N; `! J( f3 V$ y - STA [$00],Y& ]3 O' f# k" q& }( X- j
- INY
# s: |( R6 }' P/ I - BNE .Memory_Clear
* h9 p3 |9 W5 m1 Z) [9 ^4 Q - INC $01& W2 \- f& K+ L n
- DEX
2 `( i4 c) s$ D1 G* B1 ] - BNE .Memory_Clear2 w. e3 A( k# Z" N
- . p8 j$ g* F. t& } a; f
- ;精灵缓冲初始化( s! i& \6 Y' j' B
- LDX #$007 E. }0 \0 h* K5 ~/ F+ `
- LDA #$F86 ~ `3 W6 [* V$ ], y
- .OAM_Clear# V/ W& ]6 s9 T8 K6 T. [
- STA OAM_DMA_Buffer,X
/ X; v" d* }" w# A K - INX$ z6 i# h$ |0 e4 h" k
- BNE .OAM_Clear; m/ A# s% _5 T+ U
-
0 y* c- T% t" j. Z - ;栈指针初始化6 J+ X0 L" g$ a, A# j9 I
- LDX #$FF' B" o/ }% j3 U( h T- A) q
- TXS2 t% M5 h; ^0 }! B
- - X6 ]. W0 F2 b. y2 F) @2 b
- JSR Nametable_Clear;命名表清空
" _5 R; V- l# i5 W - JSR Palette_Init;初始化调色板缓冲
1 ] a5 h$ u: ^8 V$ |. ~* x - JSR Static_Text_Init;初始化静态文本# H6 y5 o9 [. ]% A" i' j! ^
-
' R' X% ]. Y! G) ~: u - LDA #MUSIC_ITEM_TOTAL - 1
+ g! O5 A: E: b2 u - STA FC_Music_Max_Index
+ S# [" O7 f* l6 t -
. ^. s" a) V; |+ w - LDA #$1F
. r0 a7 T4 m8 X; i3 [" R3 D - STA APU_STATUS
. t# X: P7 E* ]$ w - LDA #MUSIC_BGM - 1
, D Q; ~8 T. }/ M/ \3 Y* |- Q3 V- m - STA FC_Music_Index
$ @- \5 w: X" [/ x! C - JSR Music_Init_Process;音乐播放
& H/ E. M% B* K7 v' |9 e! h - ' D5 w- ]7 i- n: c' j* g3 D* I! c
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态). N7 a2 M9 k) x2 q; ~) t) \& K
- LDA #$1E
# i4 N* Y. m/ g( {: B - STA FC_PPU_Mask_Buf
/ s" P2 b4 d1 p) T) @& l9 ~9 y0 g - + P" O4 @/ ?' Z) q+ y( R
- ;启用NMI处理+ q; P% r `6 y1 x9 Q
- LDA #$80
. k; m0 Q9 D4 D }% ` - STA PPU_CTRL8 _/ Y# F! B. P* v( C4 c# W
-
; J4 v7 E' k+ p/ Y - ;程序循环, 剩余工作交给 NMI 中断处理
7 A5 m( ?+ u7 \- K4 S - .Loop
# N4 \, c8 r( {7 I: B; _ - JMP .Loop7 x7 |% s* Y* v) c
- ) F, K5 a7 |3 r' p0 U- ^
- ;======================================================================
9 A U/ h6 t) l7 \ - ;不可屏蔽中断处理# n1 s# H' O& a$ b+ G& A
- Nmi_Program
- i6 D, L$ Z6 K0 i - PHA
+ d: N+ C$ ~6 h c; E ~: d - TXA4 L5 ~6 K U' h! q1 b) K" k" ?1 `
- PHA; s' T. F) s r" \. X4 h$ p4 l4 [' S
- TYA
6 K, d# e& b$ _8 ]& G - PHA
( H# }1 b8 C) h: h" b& v9 T -
3 V( z+ k3 U$ s - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
: V6 d/ J; O8 u+ X0 @- ~ -
" i2 q9 T# g6 @0 o+ v - JSR FC_PPU_Procrss;PPU处理
0 n j; [, a# S. R- { - 3 G, y$ H9 n7 O6 _6 B, Q
- ;精灵内存更新
4 D; R, e* K* N2 K/ Q1 G$ A/ G - LDA #$00) N4 c4 D5 X# n! g* ^! j
- STA PPU_OAM_ADDR: C8 r. b, y8 O5 p: U7 E+ r& ^
- LDA #OAM_DMA_Buffer / $0100
1 X( y+ N; f, C - STA OAM_DMA! m6 `% }! W! C n" M6 ?. G
- i# R' p, [( h+ {
- JSR FC_Gamepad_Process;手柄输入处理
( N8 O9 A: Q" M/ R/ O* v; h$ |! K - JSR Music_Select_Process;音乐选曲处理8 _2 _% X7 T X) u J
- JSR Music_Play_Process;音乐播放处理
! R0 z# q) x) o) t -
h! x/ R& J" {8 G* a - PLA; H1 N7 @/ [9 d O
- TAY
3 s7 J; U+ E# ?. C3 Z& | - PLA
0 U; h# P0 D! Z. [/ E - TAX
; G# Q' U& ?+ i! W8 y/ z5 I4 v - PLA
# A8 |* _ Q& A e! Z
C7 |' e6 J# g5 ]; u6 [- RTI5 A3 C& m d" J/ I) {
/ I% K& [! C& ?3 t* U- ;======================================================================# ]- b( e1 g* b/ K* U
- ;请求中断处理5 j3 i a* w. J& B! `' O
- Irq_Program; i; c" |' b! y. w! Q4 r( A) |! V5 b
- RTI
, p! I$ |! [, i$ E! Y: \& r. o0 x: F - 6 |( O1 `/ J+ g& J4 Y Z
- ;======================================================================
1 }8 U% ^* I q( l1 ] q - ;中断向量表
2 J2 s+ P5 F/ F, N' A2 C* w9 j - .ORG $FFFA8 z" v6 ~! X& p# N, I
- .DW Nmi_Program ;NMI触发时执行5 r) S( c2 X3 `! k! z
- .DW Reset_Program ;载入ROM时最先执行
) f* ~1 r6 q1 n9 h8 r - .DW Irq_Program ;IRQ触发时执行6 k' Z B- |6 z9 \, S
复制代码
1 y2 F. q# J7 l/ _- g3 ?, \* W
* B7 S; n" A2 @/ ^2 ~2 o) e
; n- Z4 Z: a: @ _- {9 q5 Q9 Dhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|