|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下9 I& J# s5 j1 `: |. m& [

% p' y ~5 b8 w; b" h以下是主框架代码:
* P2 j+ ]0 P: |) ^3 C. W+ g9 C1 f7 [- ;======================================================================
$ _/ o: {8 X9 U6 ^+ h5 c - ;文件头
. t( K8 {. N; D5 d; f1 M8 K/ j - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
% y! |$ T4 {7 E6 y H - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
2 n! w* D6 E8 a0 v1 p, k) W - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码$ S3 i, S7 h! U; [/ o! M) e9 [
- ;======================================================================
; g% ?* l/ K5 f - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2. `" n* G7 D" F/ c" f b1 g
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
( p; D6 h$ m# E8 t3 \5 A - ;======================================================================
- c: X; f; P+ i2 _$ T - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
6 ?/ e" y ?. a) @, i - RESET_ADDR = $E000 ;主程序起始地址
( Z5 T! J% Y# d# D - ;======================================================================
3 H+ u2 P* T+ L5 I - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
+ m' l0 e( i- a; K - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB& V/ \: _# i4 Y4 x6 b
- .INESMAP 4 ;Mapper号 (0-4095)$ v4 k& z/ h1 t- N( b
- .INESSUBMAP 0 ;子Mapper号 (0-15)5 O# L7 i$ ~+ c& A, y/ O
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)# u( k/ c; q. n' ~; r$ M+ S
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)! @) r8 B% t) ~, Z! ?' o2 }
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)0 h& K- `9 L) Q; a7 A# s5 n
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
$ l0 ]/ i3 o2 |+ _/ O" Z$ |" A# m2 Z - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)$ X( C: X) ~# \% G
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)" T/ d( [' o/ @+ g
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
, m/ l% j% X( d( M7 K4 |3 S - ;======================================================================
. d+ a+ v9 } O J. M - .INCLUDE "fc_demo_config.asm" ;全局配置
4 D- I% W/ G# \+ x6 a4 M1 M - .INCLUDE "fc_demo_constant.asm" ;NES常量$ T( l0 R+ z4 B7 n4 p
- ;======================================================================5 N7 I! O1 C0 f
- ;音乐配置
6 b$ [& Q' A/ M - .IF 0 = MUSIC_THEME
; M0 u |9 D/ x2 A - .INCLUDE "data/music/Gremlin 2/config.asm"/ i! v E, Z& ^8 r+ z2 p3 g
- .ENDIF
" c4 A( |3 `1 I& _9 p: z - 0 h4 ^7 Z. v/ I7 @$ \
- .IF 1 = MUSIC_THEME
/ y" A7 G0 d/ y5 o, V - .INCLUDE "data/music/Raf World/config.asm"5 w" c9 i5 |8 W; ?/ p* ?1 @# V, E
- .ENDIF
8 O, r; B; p& A5 U -
. b) F; k" Q1 @( ], j - .IF 2 = MUSIC_THEME ( q' m( R5 n Z
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
: P* u* j1 Q2 T- u+ P. Z! a: E - .ENDIF4 l9 @7 x' {5 S! a; x- j+ p. f, t
- 6 f/ B* J3 u: @( f
- ;======================================================================
5 |# ~1 c" Z) t2 E - ;引用CHR图像数据* |! C0 w% f0 x4 Q
- .BANK NES_16KB_PRG_SIZE * 2
1 [1 G* L9 S# U" { - .ORG $0000" T7 b0 T f7 @$ a+ J6 [5 P: I
- .INCBIN "data/bkg.chr"8 L" ]& B" }9 [4 L% o7 c. g
- .INCBIN "data/sp.chr"2 Q; _/ `- ^4 `6 d
-
6 h- Y- z8 U7 O6 [# I - ;======================================================================1 L7 F/ n% f5 ]
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
. x, ^) F7 N. |4 x {' k; F+ K; n8 x - .ORG RESET_ADDR
3 s: H$ S0 V: Z; X4 M4 O# P - ;======================================================================
! H2 e3 F3 E, i% F1 B6 u - ;引用其他源文件; F0 d0 v2 C3 g6 M: p
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
1 e. B) V1 _ w - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理9 D1 F* X* u3 s+ g4 P
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理9 f0 P9 q/ R5 o: C( y2 h9 m$ g; J
- ;======================================================================1 \" c1 ^7 @' A1 c0 {8 A
- ; w( L1 r/ g' H% ~/ N& y9 {2 K
- ;======================================================================
& A7 k0 J) _7 T# {2 i- R5 Y - ;等待VBlank到来( y! X, ^$ }! L5 W
- Wait_For_VBlank
' B: f& l U9 i/ P - LDA PPU_STATUS
( c4 S1 l+ H0 ]. R& @$ G& \ - BPL Wait_For_VBlank
. P% T- \; C% H* ]& u( L! e - RTS
) A# H4 \ u* f1 X: M& I
7 V$ a: z. f4 e3 l- ;======================================================================
# y2 c, Q0 q6 o6 ?& n - ;调色板初始化
0 m# P) _, @7 q5 Y' c - Palette_Init
& S6 X- Q; _( y+ f1 U - LDA #$3F$ L, G- r; [/ J3 `2 k4 O2 Y1 N2 q
- STA PPU_ADDRESS4 `$ \6 m8 h* c# A
- LDA #$00
8 u& ]% S) o2 m" ^% V3 W - STA PPU_ADDRESS
' i/ A1 y) y% j3 h: ~ - LDX #$00: k8 ^- E2 m3 k1 h+ N9 p- @
- LDY #$20
/ k: Y5 w. i) ^; a c! i$ v0 U - .Write_Data3 D- ~* w8 k0 F9 Y5 i
- LDA Palette_Data,X" l& x0 G( W2 | ?4 \
- STA FC_PPU_Pal_Addr,X- I, I9 A% r% |7 \. ^3 A
- INX0 ~$ Y6 w" u0 W& _4 g* L
- DEY* K* K. p% b( M1 G
- BNE .Write_Data- J, [$ U- J- K$ m k1 i" c
- .End
$ w) t/ W; q& d0 } t - RTS
. Q0 k( E5 L1 m% [( x0 d( { - ; O5 R8 a7 r! f1 E j5 D$ Y6 v
- ;----------------------------------------: r( A: _6 X3 B8 q
- ;调色板数据
- `8 a, T" ~4 Y- k/ s - Palette_Data% M6 N8 E- f- E- L
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B" } H0 ?- t5 k9 P. \
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
5 S! m4 }: U* x+ T1 E, x - D8 {8 L! T3 C. s+ {# B
- ;======================================================================
; s# y L7 A$ ^ H# y - ;命名表清空
! ^ {4 ?+ Y& f( K" n/ g - Nametable_Clear D7 K: } a1 R" O9 X$ h' d
- LDA #$20
) a- y$ ~( P( u h7 X2 f5 | - STA PPU_ADDRESS$ V$ I; O+ o- E9 ~) u0 B
- LDA #$00; o+ }- v0 e& ^& V- E! l3 W
- STA PPU_ADDRESS
L* ~1 q2 ?4 ^* w! a - LDA #$00& h4 x9 W v4 f7 K: j9 h3 E$ c# X
- LDX #$00! \& J4 D+ k9 ], _: Z [9 _% S5 _$ M
- LDY #$08
2 u9 g6 J, V F$ B) R. Z - .Write_Data
1 l' J/ e$ R% f - STA PPU_DATA7 p6 R4 P% ~7 l9 ^
- INX9 j: r& G* e2 |
- BNE .Write_Data8 [2 `, p2 Z8 @1 |# l( u
- DEY9 ]6 h" ]( g# n E
- BNE .Write_Data% t1 i- ?) x4 q
- .End" \8 A, u+ G8 u9 c
- RTS- }+ k- B; p* Q
- # W7 H @+ T) l
- ;======================================================================
+ ~% a9 O" V4 |' w- b i: ~+ s! Q. } - ;音乐曲目切换8 K; C. s. e; F. R* H0 ]
- Music_Select_Process) z6 S+ W9 n7 n' z
- & p6 ^% i- u: \0 S6 ^$ @ e
- .Pre_Music;上一曲4 E2 J: g+ T9 a2 E4 ?% C$ m
- LDA FC_Gamepad_Once
8 }; a u" x7 f y) D4 P4 [$ x - CMP #JOY_KEY_LEFT( H; ~# ^! i& p& E
- BNE .Next_Music7 [. V5 A( @- X7 d9 a' x
- JSR Music_Play_Pre" i0 H! `: X! B- f$ p( ~+ g
- .Next_Music;下一曲1 Q8 T: U) _. t6 l( F5 o
- LDA FC_Gamepad_Once8 f9 O) e9 W# Z* j
- CMP #JOY_KEY_RIGHT9 W- r& |2 C" ~* |7 O3 H5 \% T
- BNE .Next_10_Music t& X5 J# g" i1 J6 L; p
- JSR Music_Play_Next
2 W/ R* ~( X& ?: R - .Next_10_Music;上10曲/ J/ V" E ^6 {* C$ g- C' l6 D7 S1 e# m
- LDA FC_Gamepad_Once
$ Z S9 F4 v% B4 U- _% x: B, ? - CMP #JOY_KEY_UP
3 v! g. d- `% i7 @0 }2 k - BNE .Pre_10_Music
7 e2 A! r9 O" C7 b/ }) D - JSR Music_Play_Next_10
0 ~0 z& T- j+ m1 K$ y& h) b - .Pre_10_Music;下10曲- \$ \! V9 A# _$ e4 y+ s: w
- LDA FC_Gamepad_Once/ {: k" Q6 }9 E- o G% A
- CMP #JOY_KEY_DOWN
7 E9 G. B2 K o9 ~8 K6 |1 \9 B. c - BNE .Reset
3 |1 N& [0 I, E+ O - JSR Music_Play_Pre_10/ N6 g4 z7 _8 Y6 a" A4 L
- .Reset;重播当前曲目
2 c. _) O8 j) p7 K4 f - LDA FC_Gamepad_Once
5 E# U& O; C; n. u, c, {2 ]4 V - CMP #JOY_KEY_START, |; y# X* a4 f/ z( {
- BNE .End4 V! |' B: R* o8 \8 j! t
- LDA FC_Music_Index
8 V1 x* ^9 [, ]3 G( e- W8 W - JSR Music_Init_Process0 M1 K7 L5 w3 t
- .End
7 n4 B0 v$ `1 ]2 ^; s/ l - RTS* d6 z% N* z9 C7 d& r; V8 g% X
- # M) o( g6 H, R+ x# |
- ;----------------------------------------------------------------------
/ B+ x% O0 a" B - ;播放上一曲
; V3 x" N/ O7 F& M1 h ~( ]/ t - Music_Play_Pre
. {4 d. F2 q( R' Z6 \8 H2 @ - LDA FC_Music_Index
; W' C2 C$ o# g8 o- Z& s n - BEQ .End
' ?+ s1 F" k! n; [ - DEC FC_Music_Index9 a+ `- M5 f+ P! ~) p
- LDA FC_Music_Index3 p4 H0 x p+ A: B+ e! N, g a" }$ g
- JSR Music_Init_Process
, @: F" f; ?* r* | - .End5 n: e0 l) v$ v! H! V8 Q
- RTS$ H% ^: E2 \! I+ V, H6 a! s4 \# A
- ;----------------------------------------------------------------------% |& B# k1 |' F3 u. ]! A
- ;播放下一曲' p. P" S: C% ], w I5 f
- Music_Play_Next$ w+ U% r8 X K- Z
- LDA FC_Music_Index
^9 a P: S' o4 ]5 K - CMP FC_Music_Max_Index- r5 H# k# n+ a1 @
- BCS .End" Y, l5 p) D1 a6 ]6 m
- INC FC_Music_Index
9 P& @5 B/ @$ x( q. Q& R$ G - LDA FC_Music_Index+ A/ |- K9 }6 H9 [
- JSR Music_Init_Process
$ `; G2 B; e4 H( ~, e" n- c% h - .End
7 T' f- V7 {: p - RTS
- m& e' J# b. L, x+ F
4 X+ i- c3 [* l7 j3 D' E- ;----------------------------------------------------------------------
5 m( Z: O9 Q: f) |4 M, R+ D, S - ;播放上10曲
{! h/ x* ~0 W. @& K: } - Music_Play_Pre_109 d: d" U, R! n+ A: c- i$ k# F- @
- LDA FC_Music_Index+ y* O' q" _- H. `' _
- BEQ .End" w: }( K# k ~$ }" x7 `' c" \
- SEC$ |" X: d) C$ m0 l9 r9 Q9 i
- SBC #10
+ `2 b9 o; ^9 w! v - BCS .Pre_10& k# b0 V% a; S4 u
- LDA #$00
/ [: W0 G, \; C) q ?5 Z; X8 `2 J S - .Pre_10
" T6 ~& ] C$ z! ^+ G' e* N! i - STA FC_Music_Index P( Y- Z4 e( p- Y
- JSR Music_Init_Process5 L8 |$ y# d. F% Q! R5 h
- .End
$ c# l' P: n+ i3 t) L& X2 s0 @ - RTS9 M; C) @; M9 V0 G
- ;----------------------------------------------------------------------; i2 a3 g, }$ m6 b$ H5 m. V5 L- u
- ;播放下10曲7 H4 h: H# s4 L" }0 S) G
- Music_Play_Next_10
" i/ `& m; s, a0 M - LDA FC_Music_Index
& a& \6 x) q5 R/ {9 I/ C9 T0 L - CMP FC_Music_Max_Index6 c, \0 { n, i: ^
- BCS .End
- D; W9 @! z$ N. p2 j8 v - CLC: L2 c! g3 M- c+ ], y ~7 v. f/ ^
- ADC #105 w/ N/ O+ r3 w& M
- CMP FC_Music_Max_Index
+ l; @$ F0 q. |: C* S4 G - BCC .Next_10( ~7 A" O" J, z, I7 X
- LDA FC_Music_Max_Index
- p) }7 [4 p! b - .Next_10
7 y9 N. \# Q; X' w: @ - STA FC_Music_Index% e* y I- f- I0 W# o
- JSR Music_Init_Process! @* E# [4 X2 s
- .End
* A. b- _9 p% s5 V7 ^$ ^, K. q* Q1 l - RTS0 w6 W1 q) s% @1 f' H/ e: B/ d
! I7 s8 ~9 t! W4 `; R- ;----------------------------------------------------------------------
6 | p: V, J9 g# G) @2 s. ~% J - ;8位十六进制转3位十进制制: `2 L7 Y" d, n; |8 i$ C
- Hex8ToDec
& q5 [) \" i0 v' u6 m% ~" w - STA FC_Dec_Data_1
3 H/ e/ [, o# D$ S1 I9 d - LDA #$000 V9 \, o4 ^8 p0 ~9 v, V
- STA FC_Dec_Data_100. I9 ]" h1 Z/ h! h7 V9 P5 g
- STA FC_Dec_Data_10
# Z6 Q$ h1 o9 c1 | - LDA FC_Dec_Data_1
7 P: T( G1 l- s8 |) d, c - .Convert_1004 o& {( Q7 S7 J/ n
- CMP #100% T3 w! G1 v4 \) L/ G9 W( V
- BCC .Convert_10% M' X' W B' r( D
- SEC
, c0 H/ E* Y$ s8 T( ~7 ~" o - SBC #100
; X2 `% N; M: N! @0 S - INC FC_Dec_Data_100* @4 D4 R1 j$ [; \& g4 |2 d' c- R
- BNE .Convert_1005 \4 C& o F4 V% P* q/ P4 z
- .Convert_10! X6 a* f8 r( W$ U$ A6 {& d7 s
- CMP #10& j4 h4 {& p/ B, G2 Q
- BCC .End
+ @; |( a# o& x: ^$ u6 y$ g! B - SEC
9 u) J2 t+ e6 b: ? - SBC #10
5 ^' g4 H+ L1 p- [; ?2 e! ^; g - INC FC_Dec_Data_10
: ?; L8 Q9 k# V9 O - BNE .Convert_105 u& A6 q$ C8 C! z$ y
- .End- o. o3 d; ^ m! I4 j
- STA FC_Dec_Data_1
, K7 n+ [7 `: S - RTS
; _$ K5 A0 d8 J6 t/ } v
% a+ L X( e* K* r- ;----------------------------------------------------------------------
5 {6 l# i6 w2 P& W7 T& V - ;显示曲目信息
h# S) m1 M& u% @! Y/ [ - Music_Info_Display
- {' e# Z2 H5 B( C4 I" I5 F2 S - LDX FC_PPU_Buf_Count
- `7 D! k* j# t8 {7 z% q - LDA #PPU_WRITE_MODE_CNT_LINE! c4 x' o. U7 Y' N# k. n( L) y
- STA Use_PPU_Buffer,X6 B% e9 s$ z- v O/ t* J
- INX
2 E2 k9 D3 R2 z0 L/ j -
* H; G9 u. f0 z$ N - LDA #>MUSIC_INFO_POS$ r$ }2 K; c2 R& H5 B3 e% l
- STA Use_PPU_Buffer,X
- m+ M1 w* z- G9 I" ?* X - INX
: Y. _7 W* f6 | - ' u- M; T+ V9 ^8 J" V" I5 S# A
- ;居中
! p: X% T# }( I( Y( [+ J - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2# D8 K! S. D" D" j8 s
- STA Use_PPU_Buffer,X+ Y. w. M3 Z1 ~( G3 L
- INX+ S5 T) ~8 k4 i }9 p1 b
- * c" y; z7 a+ e) m$ J2 T
- LDA #$051 ?% d7 P- b2 Z1 Q3 M* |
- STA Use_PPU_Buffer,X
; d# Y! e J- B! O2 D7 e- v - INX4 x) ~) M1 J) b
- $ t1 R4 t6 Y% U5 B6 J, M. @
- LDA FC_Music_Index
{4 _- q) r- H5 j6 p+ b) g - CLC
- b0 k3 n. u; T3 } - ADC #$01, Y1 _4 I) k2 ~" ]3 j% m/ p% d
- JSR Hex8ToDec
, ^* I. Y. M9 C2 B/ G8 `) L - 7 N* }* v) v! @2 l8 N/ w; l1 R5 _
- LDA FC_Dec_Data_103 P6 Q" b- @: |3 @4 N5 K, a. U% M9 w) R
- CLC* |$ i, h& ]: v- m% y
- ADC #'0'
& D) K3 n; q( w; t) u+ I1 \ - STA Use_PPU_Buffer,X+ }0 n \1 Z' [$ C* \
- INX
! A% \$ ?6 ]9 Z -
0 g3 {$ C; l" T - LDA FC_Dec_Data_1
/ G* n+ f' j1 i# o* J2 x - CLC
0 K y1 c. H: y - ADC #'0'& o+ m. q9 {6 Z* j1 O
- STA Use_PPU_Buffer,X3 N9 _1 ?* G$ S' Z) L
- INX6 m. G" e9 Z3 q5 a8 `. {: r
- 5 M/ f# [4 f- h1 v
- LDA #'/'2 R1 p% X2 |- W) h# Z% E1 Y
- STA Use_PPU_Buffer,X
& N$ a! }: U: I" T - INX
5 \) i& t4 H Q) n' g D6 Y -
) f$ H" ~6 K) L - LDA FC_Music_Max_Index8 [ \9 H3 C' Y3 J0 u
- CLC- a4 X1 o" l1 Z0 e$ v6 t
- ADC #$01
2 ?( Z4 k3 I+ n4 | - JSR Hex8ToDec5 e) |3 Q! M, ?- q
- # L* E' z/ r) ]
- LDA FC_Dec_Data_10/ i0 J( o% H7 S, e3 M$ ^" |4 r
- CLC% J' H' c! r! a0 [( v, {, u6 N
- ADC #'0'' m, s, ]+ r' g# [! w
- STA Use_PPU_Buffer,X0 N6 s' z# y4 S% |; U) @
- INX
3 J! P9 Q% R+ z7 s# ? R" V9 j - $ w9 i6 X2 G. y8 Q
- LDA FC_Dec_Data_11 y4 P' n2 Y* V! M" q7 L; m
- CLC& F4 T0 d, L. R- f f: t$ D, a8 w5 Q
- ADC #'0'+ {2 M. m. h$ A8 X, r
- STA Use_PPU_Buffer,X
9 j/ H4 F* C* u$ x9 C- P - INX- c( q& s8 p0 v+ L4 U6 u. ?0 b
-
; ?( K6 v) `& M! w: L3 i# h+ x - .End, V4 i/ Y/ l7 C
- STX FC_PPU_Buf_Count* D2 o% `2 Z( o$ _$ I2 t" G
- RTS
' g" i: b& a; g) g
( ~! n% G% }1 a- u e/ ?. N" d* I- ;----------------------------------------------------------------------0 X: u# C% K. N1 F0 {+ ?/ X
- ;音乐曲目初始化处理& r1 S3 E1 _5 \! R+ C( b0 j1 k
- Music_Init_Process
/ {0 } Y, b G. L( B+ _3 E - PHA
& Z3 O/ w/ A0 y# v7 N; q( I0 P - JSR Music_Clear_Process( D( a( _$ @ h1 \. G w
- LDA #$1F& K2 [7 ~8 m; L* Z7 u$ ^5 [& a
- STA $4015
" L- M' E& ]6 n0 B$ J$ d+ G. ^ - PLA
9 ^; O9 ~' z* J' ~! A3 f - JSR Music_Init_Addr
% d3 \' x+ o! G; w0 o - JSR Music_Info_Display4 a/ g5 N: _4 ^. s3 s* |4 V
- RTS; r' e, R" A6 c2 [' z- _: y
- & P: B! M) D& J
- ;----------------------------------------------------------------------
3 {% o/ o5 l8 l4 l- X - ;音乐播放处理$ [1 |; c1 n3 o% w/ Q" u7 Z) m
- Music_Play_Process! ]! T9 ^2 ] K2 k0 j7 D
- JSR Music_Play_Addr
_+ E# e4 v; M4 W - RTS
) C& T0 F7 h7 c! \2 }4 D( ?5 t - 3 {& U& E: u% T; E! F* M
- ;----------------------------------------------------------------------- f. o X0 @( x$ r* l/ G
- ;音乐播放处理
$ }. j8 ]: `0 A+ H - Music_Clear_Process+ N0 K+ S C3 }/ f: n h2 P7 p6 `4 V
- .IF Music_Clear_Addr4 ^. m3 Z: T" r( Y3 V8 U
- JSR Music_Clear_Addr+ c' p; a% D6 O1 Q/ b" L
- RTS' H, S; i- h4 ~) U, y- i
- .ELSE9 N: i) C$ D! V' m9 C$ v
- LDA #$1F7 h% x8 m0 }! \/ V% \4 k- z
- STA $4015/ I, V/ u7 ~3 U( `( H
- LDA #$00; c$ i r+ H! `3 O; n
- STA $4010
0 M! B# D7 B+ D3 N - LDX #$00
3 V4 b$ a3 ?7 l! j0 n - LDA #$00; v$ |5 x% ^* H, R& T% q1 ? z
-
0 w: e' L0 V* y% n - .Music_Clear_Zreo_Page_07 W) G$ Z, a; i( E3 j+ L' c9 l/ K6 X
- STA $00,X
1 H, [. o u( O+ H - INX" f$ }$ K- Y# O+ M1 g' {9 X) P, Y
- CPX #Use_Zero_Page_Begin
7 }& [ u0 _3 t5 e) _ - BCC .Music_Clear_Zreo_Page_0
3 o$ D, O$ [% q' O - , P$ v! M5 | X# p* K1 r( O' Z1 p
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
9 n7 Q( M7 x2 q, R: f& B - .Music_Clear_Zreo_Page_1: N7 _2 x' e% @' o
- STA $00,X' d' H, t( |7 G f5 n8 `
- INX
- Z g" Y9 w( m- e - BNE .Music_Clear_Zreo_Page_1
; Q5 x, D) K4 g7 U7 ?$ G) V -
. N+ X9 B: f* M# Y4 w- Z - Music_Clear_Process_1: I( |# w5 G/ j9 P6 [
- STA $0600,X- C4 t5 e" A4 V/ |3 _, G" J- [- h
- STA $0700,X
1 ^; s/ c+ ~4 k - INX
$ j. L7 k% K( {$ H" c- d7 @ - BNE Music_Clear_Process_17 m5 ^/ s5 X7 ^. f
- LDA #$10
2 u2 }2 r; `) l+ m. U3 x - STA $40007 S+ ]9 f+ y9 T! g% z" Y9 w# K
- STA $40048 g* Y- X$ {7 c9 F- v) Q7 n
- STA $400C8 k0 ^# \4 _1 q9 D* U: n
- LDA #$00* ~3 i' t! r( Y( \0 ~6 m- m
- STA $40083 {: @1 q$ p# c( `
- LDA #$0F
) a3 M! W1 R6 k: G# Y - STA $4015
0 v" }3 T; ?, [9 h, }$ }# M' p - .ENDIF! R. O- v. T- V2 M
- 2 O/ H+ \. N. ^
- RTS
# n6 J" o$ F6 k: P - , } F7 I8 I& G; B% ~8 u( E7 n, N
- ;======================================================================
5 F$ b5 X2 C d" h. o5 w+ ~ - ;重启处理7 L3 }+ h! O( S6 V
- Reset_Program* _' y* A; E% n( H
- SEI5 c8 l# t( |/ B9 u4 O
- CLD
# ~0 L% T0 Z' Y9 ` - LDA #$00
7 n. h. ]. c1 l$ Q - STA PPU_CTRL* ?( F: o2 x& U5 j3 ]$ v
- STA PPU_MASK, @ l( j5 _6 P# M( {! K0 J
- STA JOY2_FRAME* W3 P5 V& V# T+ r7 ~
- STA APU_STATUS
1 u1 m# G* G" l% W3 Z5 I6 C -
- d ]" o% T* M" w+ p; J( {6 m - ;等待屏幕准备完毕9 r3 ^9 q T5 O( g0 X
- LDX #$02/ ~( o% G' y. }! p
- .Wait_For_Screen_Ready* y/ y' S+ e' G9 G) o( O2 l
- LDA PPU_STATUS
: B, b1 a5 C8 }% Z' a2 w - BPL .Wait_For_Screen_Ready e1 i6 A6 K6 Z) k& x
- DEX
^" \2 @& {- p( G - BNE .Wait_For_Screen_Ready
# C% ?) m% V# V# |3 P5 @. l: N8 H - ^1 x. Z/ o( N! O4 P q
- ;清空调色板* h* X$ Z2 k) g2 l3 H/ r. Y
- Palette_Clear
* W, o; H ^' o& c! [ - LDA #$3F: h& N$ F; g0 J* F6 K1 ^' j
- STA PPU_ADDRESS0 u( g; f9 M% f5 j6 m
- LDA #$00
) |9 P3 ]6 a, p0 R* Y1 t; { - STA PPU_ADDRESS" Y( |, j, P1 ^ o3 U" D
- LDX #$20
9 z. ]) S3 d/ F, N; u7 K - LDA #$0F
0 D# J* n! w9 r" Q1 B! V" Q - .Write_Data
4 G% i: g( H0 k1 p9 Y* f - STA PPU_DATA
& z" E. l' d( W) Y" L: @: ]" {3 p - DEX
' j+ U$ c' b, @* h& G - BNE .Write_Data5 m1 Y8 k( \, i l& @/ q8 l
% K! X B# S9 f2 f- ;清除声音 $4000-4013( }) U/ D0 H1 K% I5 M$ \: b6 W% n
- LDY #$14
4 `- d7 v" P2 x0 {8 ` - LDX #$00 K$ }5 a* M0 g! F! s) j, _0 j5 [
- .Sound_Clear
6 T0 ~- s6 Z# m" i% C2 B8 ]" n - STA $4000,X9 h& o3 B* l+ T
- INX
7 ^: l0 n4 f0 |; H! o - DEY) y4 A5 ^" O6 N$ ~! i5 M! P
- BNE .Sound_Clear" V) G% t/ J& I! \9 ], [& g2 ^7 u5 M
- 6 @+ P. y# {- M; n
- ;清除 RAM $0000-07FF
: i; b- d' F" I3 I% r2 v4 \$ N- ? - LDA #$001 n* ^& g6 E& O+ E# E
- STA $003 U6 ^: s4 u9 C2 j
- STA $01 t2 r9 o) I7 ?1 f" [ F$ O
- TAY
; n: m! E. J+ P+ s" z3 j - LDX #$08
- ^ ]" M7 O0 u* F0 a$ |: z - .Memory_Clear
% p& Z1 e' J) V0 h - STA [$00],Y- X/ k Q- z7 G+ W
- INY, L; a7 \4 d7 |; R9 v
- BNE .Memory_Clear
. c2 n* l" {2 `# k1 Y+ @1 e - INC $01
: e, o. C: j. P; _# s" D - DEX
/ N' ?0 Q4 L5 Z' ~- m5 T2 X c% j - BNE .Memory_Clear* j ~ H9 M C- p7 F( e
-
% S7 n. u {3 Y( h/ D3 { - ;精灵缓冲初始化$ l* L3 q# E, f i! W' Q
- LDX #$006 w) }1 T' G( j; L1 H0 }( }
- LDA #$F8
' Q9 S+ ~- v4 G( s0 O( t - .OAM_Clear4 ?" j& i1 k O: ] P9 }
- STA OAM_DMA_Buffer,X2 i/ [6 R, E/ j! W
- INX
; W: r+ c+ \* b4 r - BNE .OAM_Clear( Q- V) I+ R: F
-
; \8 R* N& w: Z5 B/ z% V - ;栈指针初始化
* F. n, }& v7 ^0 y! i. c) v - LDX #$FF! O/ H6 V7 s+ t' m" g! g
- TXS! `6 g5 } H- N
-
" s& V, I& ~4 l i s& D' o* f0 m - JSR Nametable_Clear;命名表清空
; h* e. M- M6 H" t4 r0 X: i - JSR Palette_Init;初始化调色板缓冲, c7 s2 G' ?* J3 w0 [1 r
- JSR Static_Text_Init;初始化静态文本
# {! P+ H3 V5 r. B8 L3 W - " j7 p2 O) L x* Z! M; S
- LDA #MUSIC_ITEM_TOTAL - 1
" u# n6 Y5 x* F - STA FC_Music_Max_Index
. V: e* Q* g c$ X1 U - $ c) {. @$ D4 U$ i4 b
- LDA #$1F8 h2 |6 U& o u
- STA APU_STATUS& w& ~% y/ p/ |. h
- LDA #MUSIC_BGM - 10 x! ~ C6 G9 O3 w& ?5 n
- STA FC_Music_Index+ h1 g% s. ]$ p, G3 s
- JSR Music_Init_Process;音乐播放 W0 ^, r& B9 s! D
- " D* p: z6 L# j8 C& _; l! q7 ~
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)! L1 X8 G/ h, T
- LDA #$1E
G$ t+ c9 y: V% E - STA FC_PPU_Mask_Buf7 q% }4 V, B7 S& m
-
0 t& o4 T5 c2 V$ q - ;启用NMI处理( v: _4 ]) h8 t0 K0 J# i9 g
- LDA #$80
' u3 v- |* e) e7 |% q: b) k B% X8 l - STA PPU_CTRL
4 z& u! c4 v$ l! t5 s8 J7 Z -
0 ]3 E: {. S/ b( I- g3 U* W7 y& a - ;程序循环, 剩余工作交给 NMI 中断处理
5 y+ e4 H. V& j7 t - .Loop6 T2 N' g4 z- Y1 f' F
- JMP .Loop9 v4 I, h9 ?5 [1 u# i* g( [; s
6 m I4 R; t) A, }- ;======================================================================" {, u( ?2 f! x( | r4 }- w! p
- ;不可屏蔽中断处理
& f6 B' S+ z7 D" F - Nmi_Program* @% P. k6 a2 x& N8 p' x
- PHA2 {+ u* ] K1 [( r
- TXA# m5 |) v6 D* d& @
- PHA
% ~5 p" k( V* q# D. }9 n - TYA! V$ O" N$ X' f; c5 t9 Z2 z
- PHA, C5 Y' ~* [; N& z* k5 P
- * _+ F& @3 g i& _
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
. Y# ^/ a& ? B9 m6 K; k - 8 W# H2 M7 j1 W, e2 Y$ U
- JSR FC_PPU_Procrss;PPU处理% Z% S% R2 ^; y& E
-
* |$ ]1 k8 w4 O1 _2 g - ;精灵内存更新1 ~/ M# f" c0 j+ s
- LDA #$00! C9 C& ~6 `# c2 o4 e
- STA PPU_OAM_ADDR0 X# u& P4 ` Z6 r: U% G1 U
- LDA #OAM_DMA_Buffer / $0100$ [4 W; B: m, j5 W
- STA OAM_DMA
% J0 i9 E7 f; Q) s. k* x4 ?0 V5 i - 9 i* l+ B/ l" ^
- JSR FC_Gamepad_Process;手柄输入处理4 p/ w: ~1 x I, A' o5 N% U. F
- JSR Music_Select_Process;音乐选曲处理1 S. x$ o3 q {$ ]+ m
- JSR Music_Play_Process;音乐播放处理& t7 @' r6 f# e7 {) W8 j* L% l# v! h
-
: [; v9 B8 n {( b$ Q$ T - PLA
! M, Y/ W* a4 a6 ?% A - TAY
- L7 `, O+ U2 I: P$ B; e1 J$ O# d - PLA" r) u- p$ W4 F3 S: H( c7 {# {
- TAX! E3 P1 w% K3 [; Q- k! _
- PLA0 ?4 K4 d7 q9 Q- c; Z& B
- . {0 A2 g( r2 d2 E
- RTI
1 ^$ R4 W' U0 ^8 X6 x) N
$ ?/ l' m' x/ r& y% n# i, [- ;======================================================================' b" C9 j- X6 O8 |$ v
- ;请求中断处理
0 t- m* O+ a) @* N) B& o/ B4 q - Irq_Program
4 l4 y& i0 \/ a. n. Z - RTI9 w4 C3 `0 A8 ]) l
- ; G* A0 Z S& ]9 R1 n
- ;======================================================================8 o" }: {* _/ C J% g Z
- ;中断向量表1 M7 c) T" x! Y- W% [3 d+ U6 @
- .ORG $FFFA7 Z& K" J0 A* e, R( q2 g
- .DW Nmi_Program ;NMI触发时执行; E! ?7 j: b! F; J9 {% n
- .DW Reset_Program ;载入ROM时最先执行
- e9 H) |2 T6 w9 Z$ r9 @ - .DW Irq_Program ;IRQ触发时执行
8 n E7 G; c. U# R: y {: p+ }+ O
复制代码
9 N! h: ~1 Z4 e4 n0 x8 Z1 k% @% |
: g( y& K+ Z/ r# A! b3 x: {$ Z! u: p% q( w" J" ~% C6 A' {$ Y
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|