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