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