|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下5 }- d9 m4 [1 S( P2 i
3 K( A8 S, p9 h0 M6 }6 k. D
以下是主框架代码:
/ W7 d9 ?! D+ M& }( T1 H- ;======================================================================' `- q9 Q) c* X5 `- \, y
- ;文件头4 ~ s9 ~' f1 s
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量; K( M7 o1 c9 b @, [; W5 b. z6 F# w
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
; s2 _8 K `! I" Q - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
; }8 w# r; h& S# ^ - ;======================================================================
1 i0 P) O! F6 k; C - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
7 @+ E m# Q% J8 ~8 Q% H - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
: J" {. ~4 k( ?1 M ^ - ;======================================================================8 Z" ]5 G0 `$ m; J% H9 J
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 16 D6 k) O e- L
- RESET_ADDR = $E000 ;主程序起始地址+ I( V# @$ l6 P$ u7 K+ k% [2 X8 ?. I
- ;======================================================================1 V3 q; s9 q4 v8 g9 O- N. d! q
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
7 l9 p. p( p9 R - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
1 S1 v5 \! y/ b2 d( J) C! _2 s* a s - .INESMAP 4 ;Mapper号 (0-4095)
, [( K0 [. K; P - .INESSUBMAP 0 ;子Mapper号 (0-15)
7 {0 Q2 x: W. m# z7 `: j9 ` - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)# Q9 Y0 G' a1 i, u) N7 ~ |
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
, u. E1 w" V6 U2 d( q* m - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数); z1 c3 W* Z* E+ `/ h4 G- R& F+ ~
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
# }7 r9 X$ V, Z$ k1 E - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
1 h/ A* m- ~2 a. o" F# Z - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数) q; D0 r4 t; T8 ?0 a
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
2 t7 ?6 H. x2 E, |& ^) Q2 n - ;======================================================================
L5 n+ j! ?( y/ ]. J - .INCLUDE "fc_demo_config.asm" ;全局配置+ S# S$ G1 Z- b
- .INCLUDE "fc_demo_constant.asm" ;NES常量5 u; Q, H8 E/ U( Q6 ?8 y
- ;======================================================================
2 R2 |3 Z1 ]# X1 c) L- A - ;音乐配置
. }! F. i+ W) \+ \. F5 c - .IF 0 = MUSIC_THEME / Z) w( z" p6 `7 A
- .INCLUDE "data/music/Gremlin 2/config.asm"
) _8 L V* x# K3 J! P# \2 c - .ENDIF& h% Q. |4 k! c0 R* b
-
& Y* X* R5 s0 Y+ S+ v4 R4 C - .IF 1 = MUSIC_THEME: v. [2 e0 p) {
- .INCLUDE "data/music/Raf World/config.asm"1 b J* @5 h/ b
- .ENDIF
) G" ~ o: {! Y, O# X - . R* w: M4 P+ k# Q
- .IF 2 = MUSIC_THEME
X8 D+ m8 X8 W! s9 `4 }; K) T' V - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
8 C4 Y" M0 O9 ~4 x; U5 M. v - .ENDIF& F* A. R$ l# |$ G7 \
( q) c# C. {' s4 }- ;======================================================================
% E$ w: i) r3 n4 P - ;引用CHR图像数据
: |1 J) o4 [( C! I - .BANK NES_16KB_PRG_SIZE * 2+ L2 ^; t" @5 _- r
- .ORG $0000
6 j& G; q; j- d ^ - .INCBIN "data/bkg.chr"1 y& A- h# _: o1 a& V
- .INCBIN "data/sp.chr"
+ n# U) G% n$ T9 q* O3 f9 S -
' L6 f& B( R9 Q4 e - ;======================================================================
0 ]( I7 r- r/ M, g& ]' r - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank, |* Y4 R4 Q# n% u8 c
- .ORG RESET_ADDR( C/ c7 h4 t$ d7 ?5 G3 @
- ;======================================================================' B$ R1 [) ? {. [, z3 r
- ;引用其他源文件
; ^4 E6 O9 [* K - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
+ M- F: c5 D% B) ?$ x9 l; o - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理( d t# n: U3 f. v
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
C, N8 P6 v! ]2 M& _ - ;======================================================================
0 h8 P- {, t6 H7 J' Q/ M) |: x0 H - 2 {3 |0 x1 U1 |$ D: d+ I3 o. [
- ;======================================================================9 D! \! Q( q; c7 i$ r
- ;等待VBlank到来
3 k1 x% ^, X9 j: `& [; V, c9 t - Wait_For_VBlank4 v- w. D# J0 }; ]. Y
- LDA PPU_STATUS, t6 J4 h6 a4 r
- BPL Wait_For_VBlank9 [" x& [1 ~ D3 Z. N7 Z
- RTS
6 M, C6 q+ p, T" P7 G1 @9 O
5 P4 s6 N- O" _' u& K* F: y- ;======================================================================4 v ]9 ^2 c9 X' d% R% q6 O
- ;调色板初始化5 R1 D' B" j) h/ h
- Palette_Init3 O( k# l( s7 o- X3 W6 R! E J% @
- LDA #$3F
2 R" C- o' [7 B; \' y) M: L/ c - STA PPU_ADDRESS4 r2 S9 ^% O8 `" t
- LDA #$00# U+ ]3 I, r+ ~- l4 [& j" ]
- STA PPU_ADDRESS1 _# z9 y4 Y! K% a( @! j/ [3 A
- LDX #$00
- ~) ^3 Y( [6 f% D- R - LDY #$20
& f5 y* C: u3 d# [8 l - .Write_Data
: D2 k8 u, J: E T; D) C* x7 B$ K - LDA Palette_Data,X- j3 }6 `* q( E/ W* e: ^' V `+ h
- STA FC_PPU_Pal_Addr,X. }- r3 {5 ^8 u
- INX& x2 n- ?# {5 K* z. d7 B
- DEY. P9 f' @/ F# K! _2 k ~+ K
- BNE .Write_Data
6 Z- I# K7 z( b n% f - .End
8 s" B: f8 s( a: n" T8 F, q) M - RTS5 p5 F* o- W, `: E! a$ e
- c9 h" \" G+ z3 N# e4 [ u; a- ;----------------------------------------' O5 W$ c* x( `# o" c
- ;调色板数据
3 q/ I, j4 `4 G - Palette_Data
' w8 e+ @: V9 ~1 f( A, o# a - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B" ]9 V X- m# w" u7 ]- F( m* E
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
. f% m+ B! M1 d - # t! q# x9 y' X; F
- ;======================================================================
% [' O o/ J! h5 a, O0 b8 [ t2 f, U - ;命名表清空
2 W5 [7 Z$ D0 C; w - Nametable_Clear
2 ?9 h3 C. I) }. h, I$ J A) @ - LDA #$20
% ]' C7 f1 }) A) I4 m6 y. l% J - STA PPU_ADDRESS
5 z0 x- h* i( K" r+ f - LDA #$00 j, D1 I: {; d1 y( m) ]/ i; g
- STA PPU_ADDRESS
' G% x# L/ e$ ]. N1 I - LDA #$00
w; s6 H$ x% x7 l8 O5 K - LDX #$00
! C+ B8 o1 T$ y6 B! x5 ~2 } - LDY #$08- w$ m. u/ O4 W: t- @
- .Write_Data
7 B. K5 U9 ], ]2 F: t; B, h - STA PPU_DATA
/ Q: W8 T8 ]: a - INX
" `( A, L' o$ C; q- T5 A0 W3 v - BNE .Write_Data+ k6 ]+ W8 V/ d! v0 `% b$ o4 \
- DEY
0 U; J. }8 [ }' @5 i - BNE .Write_Data
* g" x- b" m. j9 C T% ]; e& I - .End
2 E0 c. k; P B% X7 ?& f: e1 K% c - RTS, V3 B9 [6 @6 Q: H5 |
- 6 B: ?7 ^% b( t
- ;======================================================================
& C7 [7 M4 r# \* S8 g' ]1 I - ;音乐曲目切换* J( S/ y' Z# S
- Music_Select_Process- J; ^$ n+ O5 a5 K$ a* z
- " r, t2 q3 c: j& W0 M7 }- A- V" t. M
- .Pre_Music;上一曲# G6 x6 `7 J8 s& w+ }) p
- LDA FC_Gamepad_Once
) Y, {3 B8 ^6 P% l) M - CMP #JOY_KEY_LEFT" G6 m h I1 Y' V1 m
- BNE .Next_Music6 Y: k: i( b' ^- T; ?3 `- }
- JSR Music_Play_Pre
. j: k. G6 p* L" U0 E$ F - .Next_Music;下一曲' y, p0 i4 }+ q( f
- LDA FC_Gamepad_Once2 S& A$ U9 j5 b, j: w
- CMP #JOY_KEY_RIGHT: ]$ Y, f: d- U/ i5 j
- BNE .Next_10_Music
5 o ~& y8 h. `) r* l; z1 {. A6 ^ - JSR Music_Play_Next1 J! A" P! i" \ [* T1 w
- .Next_10_Music;上10曲9 w, w) W; R* `2 c M4 X E6 s
- LDA FC_Gamepad_Once+ c, A: r- {3 H1 h% S' T8 }
- CMP #JOY_KEY_UP) f( l% P" `/ Q8 X. \ u
- BNE .Pre_10_Music
, ]4 C0 _! P# I; j - JSR Music_Play_Next_105 ^+ i( `* H* ? r5 J1 Z; i
- .Pre_10_Music;下10曲
- {$ Z3 r; [5 c7 ] - LDA FC_Gamepad_Once* ], K2 L& S1 z) B
- CMP #JOY_KEY_DOWN
& ], n" j+ {" }3 E8 f) }8 B& N) R2 o - BNE .Reset5 Z7 k, `- N% ~- \$ f
- JSR Music_Play_Pre_10( S$ { k i4 n& L! J
- .Reset;重播当前曲目1 G+ E4 n/ ?' q2 B# {% J. R! ]
- LDA FC_Gamepad_Once3 b u) s! }3 Y
- CMP #JOY_KEY_START9 r: S, I$ c, {. H7 V
- BNE .End
! Y, v4 o) `& [8 w, o - LDA FC_Music_Index$ G% A1 ^% E* ?5 k; G* N3 v
- JSR Music_Init_Process7 w0 n+ P1 a" D8 O4 k
- .End9 ]( B* [; N/ N
- RTS1 G- o* A( b5 n. [3 m5 e Y( \: `
- 9 g/ ?4 ]! R' L) _
- ;----------------------------------------------------------------------
) z9 M3 _8 H D- V - ;播放上一曲
' P. m1 }, G3 |$ Y6 {) b - Music_Play_Pre/ }' [: S# X. r5 ~
- LDA FC_Music_Index
3 \7 y& i* F% P2 } c: x - BEQ .End5 U5 h/ M9 g$ M" l. b& v/ [
- DEC FC_Music_Index) s6 O9 F# Z4 x# ?0 ?
- LDA FC_Music_Index" r8 |8 x; m! L5 N
- JSR Music_Init_Process
% ?& O6 c: q' | - .End
( h9 e/ P: y6 C6 W9 L) i; }0 R3 J - RTS
6 w" x2 C# H: |7 t7 m - ;----------------------------------------------------------------------
9 [$ P; r( U* `, {$ X/ n - ;播放下一曲: P$ G. @+ e+ g \1 U" `, F6 y
- Music_Play_Next$ r' H% t4 y; N ^, x0 O0 f
- LDA FC_Music_Index. @) @* Y0 O1 S# H; }5 \* Z& Q
- CMP FC_Music_Max_Index a2 o/ E: f+ U g0 |: h7 S
- BCS .End
# x/ G! a8 B; f5 \! q: \9 S - INC FC_Music_Index$ V; v# e- L5 [ ]
- LDA FC_Music_Index! U, m Z, a, ^4 w" |6 P
- JSR Music_Init_Process+ g) t5 e+ J( }' M0 T H
- .End
4 E& b {* Y* q$ B% f0 [ - RTS) G4 S5 Z7 e& `/ M3 q8 G+ d
! e" m- @3 @# A/ q$ b- ;----------------------------------------------------------------------3 e# p) a5 N) I# o: J6 Y5 g5 p
- ;播放上10曲
6 H- Q! i3 c! s1 |6 \. o - Music_Play_Pre_10* M+ c& ~: G4 y: _1 }+ A
- LDA FC_Music_Index. h( C. {* p6 N: l
- BEQ .End6 V$ I0 p8 U1 V" y
- SEC3 `+ m( d' c. ~) N
- SBC #10. m9 m4 Z% `+ ?6 P
- BCS .Pre_10
, `: Q! n" G' }/ j% C - LDA #$00
/ {. t8 l2 l2 f6 W8 \ - .Pre_10* I: P; r. h! N1 @& |5 {
- STA FC_Music_Index
" o+ H/ l ]( r, B8 j% z/ M1 H - JSR Music_Init_Process9 W" ~! p/ A& W5 L( }( L6 p+ i! u5 P% R
- .End
( G! } A, l( o& k: D: I2 z% S& B% ? - RTS- M9 C0 c4 e P+ z& l7 E. M$ T) [* r
- ;----------------------------------------------------------------------8 @: m( N4 Q9 E% \; ~/ b
- ;播放下10曲9 o; n6 r% T3 p9 k5 h4 r3 s% V' e
- Music_Play_Next_10
2 F4 W# {$ ]; Z0 A+ e$ \2 @ - LDA FC_Music_Index G5 [: C, m. B+ Z1 F
- CMP FC_Music_Max_Index
9 X% Q0 ?2 z- U5 N& w+ ~ - BCS .End5 |! `3 K- ~' g
- CLC
) x3 ]& `1 C' X4 e. Q. w& ~! ] - ADC #10
. _6 C2 f9 F2 u6 f$ I( ~; j - CMP FC_Music_Max_Index
. G9 `6 X, O+ E' B! ? - BCC .Next_10
: C* C! G9 m7 }5 x- O - LDA FC_Music_Max_Index
& M& p, Q1 k' O' j - .Next_10
* N J0 f& H& I - STA FC_Music_Index$ N. A& }, h+ U2 ^, Q
- JSR Music_Init_Process
6 m+ O) s# O2 |9 D - .End
4 d7 }' P7 V, o7 G+ Q! M' r5 E - RTS8 o1 Q- x, ^% ^
- 6 m' U" Z+ @6 [' B
- ;----------------------------------------------------------------------
4 Z% E L" b& B# C! O, x1 @ - ;8位十六进制转3位十进制制! H3 u9 b1 w+ l0 ~* k. R9 A8 O+ f& a- h
- Hex8ToDec, I' j. K u4 z/ r
- STA FC_Dec_Data_1
l; v3 F; Y/ ~0 B8 w g" G - LDA #$00
" ]2 q) u9 m; y' a; W& [ - STA FC_Dec_Data_1000 z, O4 W4 `" p3 d3 b5 ^% U) N
- STA FC_Dec_Data_10
: |! `: {0 p! |. q; |) g. _3 h - LDA FC_Dec_Data_1. d. o* w4 k2 u w
- .Convert_100
M0 g+ `2 l+ f7 C6 ~ - CMP #100
& e& j. `' G5 j9 Y$ E7 y - BCC .Convert_10$ w( A* U+ H/ H- A6 p0 J, s
- SEC: n! o& W/ o! H+ a
- SBC #100! a0 h8 R6 M/ q8 k
- INC FC_Dec_Data_100( e3 M9 F: b6 r+ h8 c+ y
- BNE .Convert_100
, l9 T: X+ [! i* j; C- u# Q - .Convert_10 w5 ~" j' Q3 @2 N- [
- CMP #10
& ~8 D6 f; v2 M" u$ K - BCC .End
' _9 @( A! \; `3 V7 Y) G - SEC7 P% P$ R4 L# B5 i1 J% ]9 q
- SBC #10' U }, e1 [% }: H/ q
- INC FC_Dec_Data_10- a6 y- V4 |8 ~5 S
- BNE .Convert_10" g+ ^, ^. Z+ f; I8 C, Z
- .End
! ?; p6 Z$ \) z# H- F1 H+ R - STA FC_Dec_Data_12 J5 ?; n/ `+ d% q
- RTS
p- W& U$ |, t( s - 2 t: X5 f i5 f m) }
- ;----------------------------------------------------------------------
5 c1 X2 m& Z! x9 Y) L, B% L - ;显示曲目信息" U1 c% e: j8 k6 ?
- Music_Info_Display: f: v- s+ H( s: ^/ O+ O+ m/ B' P# ~
- LDX FC_PPU_Buf_Count
# `5 q, K! B0 e. f - LDA #PPU_WRITE_MODE_CNT_LINE7 l6 a0 e d+ V/ \+ K' d8 ?& _
- STA Use_PPU_Buffer,X! b/ F; c% E4 [+ T5 G
- INX
& B- M9 v3 H+ D$ W+ Q8 Y; R -
k) b8 X* j7 j3 n4 m% I& R - LDA #>MUSIC_INFO_POS
* [, Y0 X. H, n" R+ n+ W - STA Use_PPU_Buffer,X
9 `" B2 a3 U! z3 ]( ? - INX
1 K8 `$ d" c" O( X1 K6 V - 9 d7 Y1 L. V- \& A- {0 m
- ;居中/ |/ V* _4 x: }$ u8 ?
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
7 ]: F& X1 w; k2 g- g7 M% |# l - STA Use_PPU_Buffer,X7 D7 K! w4 C) Q$ t5 s$ t9 I! k
- INX5 u- H9 n: f+ H9 Q0 L
-
" o4 L/ `5 ^6 F- H5 _ - LDA #$05) D, v7 F+ ], i4 E% ?
- STA Use_PPU_Buffer,X
' I, ^' }- ]# s7 W3 M5 _& ?. k! K - INX
8 Q8 A( E+ F; c! J. C" O, x - 1 e) g2 O1 M$ N/ }& F, ^) j
- LDA FC_Music_Index
/ E1 R! l/ n0 h1 {2 | - CLC' h5 i% \7 _ ^7 j
- ADC #$01
) d: n$ z- _2 W! q' a - JSR Hex8ToDec
% N( z% t2 l8 [ -
. H* K' J4 M) } - LDA FC_Dec_Data_10
2 _4 }% h9 V5 [ T - CLC% E' M' q$ p! _- ]+ _ D
- ADC #'0'
) H" f% K6 R( u0 }, t+ Z - STA Use_PPU_Buffer,X7 a& v; E5 j' x1 e
- INX; J. L% L \. K+ m' f
-
$ i, {- d8 q" q# { - LDA FC_Dec_Data_1
. E0 `2 s/ D1 C( ?) ` - CLC; W, d% b3 K5 }
- ADC #'0'
9 u# N# o/ v6 e! r I' U - STA Use_PPU_Buffer,X; f$ l5 `( u, b/ e
- INX; b7 j& c" V+ w( B9 W
-
3 N% x$ {0 [( u9 ` - LDA #'/'
; G4 `: X6 C" G% q5 e - STA Use_PPU_Buffer,X
6 A: d' j! p9 Q6 C; S - INX
4 s# @0 E' A2 T6 } - " g( C, B* [! a
- LDA FC_Music_Max_Index
9 R4 a: D1 w9 h$ S8 e - CLC
* x5 P4 z* J4 B- c - ADC #$01, ^- E8 V0 K- e( v7 k
- JSR Hex8ToDec
, C3 ?* N2 K2 \+ { - ; V% U% R, {3 X. I8 w9 c' `% I
- LDA FC_Dec_Data_10
8 f: K i" L5 w% | - CLC
* p: C7 b8 z! T5 G0 S, o - ADC #'0'
7 C- D2 p; F! z: u! b4 L; Z - STA Use_PPU_Buffer,X
/ U8 Q4 u5 F$ W- a6 v2 h - INX& ]% ~9 S8 ?* g. i! w
- / Z* \ j+ L, G0 e1 t% j
- LDA FC_Dec_Data_18 S+ E$ l& R4 v: Y8 U
- CLC' n, ^3 r. T1 _1 G; j7 }1 q' M
- ADC #'0'
( e4 ~+ y4 e1 E3 ?8 p0 b - STA Use_PPU_Buffer,X
/ a( U' E3 J: s2 L. y - INX" c4 ]$ w' T/ @
-
. w, |) J4 D& i: {! z - .End5 K. R! e/ E9 X, [4 t) P$ i6 p) o, x
- STX FC_PPU_Buf_Count0 @- ~: [% g8 J2 K- v4 y
- RTS
9 |* r B2 X7 k4 c - 2 i0 B4 h! H$ F/ Z6 {% D; j0 r% S
- ;----------------------------------------------------------------------) ?: j1 A' W8 p: l. Q
- ;音乐曲目初始化处理
% p4 z4 c% T5 q" o( n) v - Music_Init_Process
. |+ x" [9 L, G0 t) E' G5 K - PHA
; b: ^% b- V9 H$ i! a - JSR Music_Clear_Process
7 `0 M7 y0 T0 d/ {2 |* G: w& p: C, J - LDA #$1F
6 v2 m0 e1 a$ |4 |3 ? - STA $4015' T- A( a2 X3 f* i
- PLA
3 ]/ k: d& p2 s3 B' G - JSR Music_Init_Addr& ?+ {" Q7 Q+ W+ A: G
- JSR Music_Info_Display6 Z$ A0 v# s( j
- RTS* b) ]& U( Q5 C7 G# Z
- Q1 n- b9 w+ }6 A' c2 ~- ;----------------------------------------------------------------------& e2 j. _9 @$ j
- ;音乐播放处理$ R' p% y7 s( Q E5 ]. L; B$ R
- Music_Play_Process
* t( J: J( [0 R5 L - JSR Music_Play_Addr
6 L# J, G* a! _1 N - RTS
0 v) O$ |9 Y6 N9 X
& W5 B; M- W8 L/ O- ;----------------------------------------------------------------------6 s, j" h6 u* `% |- |1 E2 @
- ;音乐播放处理9 T" t# V, t5 ^, X5 r5 g
- Music_Clear_Process! k3 b8 M% N& g! n( |% Z
- .IF Music_Clear_Addr/ }9 D6 k# n9 F5 d3 v- {
- JSR Music_Clear_Addr5 b5 M; H: h! I/ l) v
- RTS$ }& ^5 v# g" V* q- B! i
- .ELSE
2 X( K6 g* ^4 ]+ L: | - LDA #$1F/ e% o& g- o. Q* B" @' \
- STA $4015
- @, `& b- w; W - LDA #$00) |& p( m) G9 f, w8 t& G
- STA $40109 f# m9 a9 ~* @& ~/ G; _0 B! F( W
- LDX #$00
( r d6 k8 x- Z5 O' B8 s - LDA #$002 ^' I8 Z2 z! p) T7 ^
-
- }, Q2 K! _( r7 _0 V; B0 e. H. \ - .Music_Clear_Zreo_Page_0
9 f8 v |8 x' Y0 C6 F - STA $00,X; ^2 H" v4 x: Q4 r: ?
- INX! I" I0 H) w `. u7 X3 U0 q" O; n* b( ^
- CPX #Use_Zero_Page_Begin
$ o5 i1 Y$ H( w5 ]0 `+ z - BCC .Music_Clear_Zreo_Page_0
4 G f. G. q$ C' D# _0 Q -
7 v! } x5 h. s: b2 k, u { - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
/ s: s! [9 w; n5 |8 m& x - .Music_Clear_Zreo_Page_18 p, U4 W" Y$ ^" A3 a8 p6 W5 x6 @1 a
- STA $00,X( e- @8 @) z2 F8 {; n6 O0 ]+ L
- INX" h3 Q- A& U( Z
- BNE .Music_Clear_Zreo_Page_1
4 J$ D, Z1 B8 w, S% Y/ Q -
- M# V' X) T) f* }/ j - Music_Clear_Process_1
0 b2 F; G; U" a3 z - STA $0600,X
/ H; E4 \8 @0 l7 K9 I2 v% o# [% Y - STA $0700,X
/ z* |$ ~9 `) v* R- h - INX
) x H) T/ E7 z4 X I r - BNE Music_Clear_Process_10 b/ f4 n2 a, @7 w/ ^; m8 d* n
- LDA #$10
. h+ k) |8 B) `# s - STA $4000
, }- _ C E0 F- p* A& m2 f3 R, a - STA $40045 {4 ?- ^# M0 Z( G' }) q& R+ a
- STA $400C9 O5 B3 `( [- A5 y9 w4 z
- LDA #$002 x) O+ _7 Y9 U4 B
- STA $40080 C. x. d. L/ }0 M Q
- LDA #$0F
9 d3 m2 [! o$ k3 B& t: r - STA $4015
4 P; C4 a. ]9 c, D A - .ENDIF4 [' Z( @7 g6 \% [- z( h# f+ |
-
' D5 ~" q7 f% B - RTS
6 I) X4 h, v- \0 f+ W
8 C+ T% i& U& ^6 \' i* k- ;======================================================================
6 } U4 G5 Q) k; _ - ;重启处理
- ^0 D4 F) \! y - Reset_Program- l2 ^' S v* E
- SEI
8 n7 C5 U. I. n - CLD- X) V9 \; I8 y8 i% _: u
- LDA #$00
5 j; O/ `( k0 |; v& t* e1 C - STA PPU_CTRL, g+ J: n g# a ?! k( y' Q
- STA PPU_MASK
- h! l) ^3 M' B" r! o4 S% u - STA JOY2_FRAME
( ^, c: L* ?) u3 j, |0 K - STA APU_STATUS/ ]( Q5 M2 l# Y! }/ u$ X
- F" R/ m8 ?1 c
- ;等待屏幕准备完毕+ o4 w# Y2 k( }% S
- LDX #$02+ I+ ]. m" I2 U0 ^1 g
- .Wait_For_Screen_Ready1 C6 x8 z$ m, x( ]2 \1 b
- LDA PPU_STATUS) h, [# i D! r2 u" p5 \9 o3 Z/ x7 ~% [
- BPL .Wait_For_Screen_Ready, u J6 W" p9 u5 F% a. U$ U" I
- DEX
, `/ W7 u; }0 a: x - BNE .Wait_For_Screen_Ready
( M' X: x( K: Z c* b# S, h% w7 Q. F -
# u0 V# m$ E# f& R! m - ;清空调色板$ T& ?4 U# }; H+ L$ k
- Palette_Clear5 Y. {1 X" u# W7 K6 [
- LDA #$3F
! l0 B+ T# y9 P% @+ q- B% R - STA PPU_ADDRESS! h+ B3 P" H" n2 S7 p% s
- LDA #$00% D# t- u4 E/ ]# y
- STA PPU_ADDRESS5 Z+ V% l2 n( t6 y$ y" x- x
- LDX #$20
8 I) S% _5 _. K - LDA #$0F
' f; ]" T1 A3 m0 q+ ` - .Write_Data
4 v. }' x3 l6 K8 C& ]' Z - STA PPU_DATA- k; O4 w3 [* ^! u/ n$ K
- DEX
9 ]. x! o1 {$ {; D# S' P4 L" m1 g - BNE .Write_Data
2 K- S" c7 Z l" a
% ~, ?% j$ `! V" u: _2 j; k- ;清除声音 $4000-4013
4 X" G+ F% t# r0 F$ q - LDY #$14% F: [ A0 q5 O" M
- LDX #$00
- {/ M } w4 W5 | - .Sound_Clear
" M6 J# H7 E0 P$ v# V8 J - STA $4000,X
1 d) m4 h! [& x: E. r6 g - INX
1 E& x; L# p C0 O* d# e1 i - DEY
( H @3 U" M- h( Z - BNE .Sound_Clear3 x) J; m1 ^4 N0 V+ t6 `
- 4 X; r' T0 G# b% Z/ E
- ;清除 RAM $0000-07FF
0 X5 r: W6 d$ z& ^/ b4 R - LDA #$00# g0 C; P+ E1 [2 d
- STA $008 |* F+ m$ M/ \" j" G: w* i I
- STA $01 c" B8 n v( @" I3 a' w2 t5 b# }) ?
- TAY
' A2 I: v4 p7 Y6 S- R8 d - LDX #$08; G: T0 E" z2 ?! k. O2 e
- .Memory_Clear
* [. g0 f3 r( T9 U; n2 P- w - STA [$00],Y
" o% S( L" S. W) @7 N# Y - INY
5 A: V6 t7 x& k' B0 J - BNE .Memory_Clear
: h6 s& B' }0 W! B: Z - INC $01
' V0 U. W* \, A5 r8 e. t# d - DEX* F) L4 z$ Z6 |3 G4 L0 C$ |& G
- BNE .Memory_Clear
3 Y4 n% [7 g9 `, H -
2 A' j8 O; k1 p; H - ;精灵缓冲初始化
0 B( d0 R8 T5 ^' Q5 ]& _) X' i0 e - LDX #$00
* k/ D$ x0 ]! ]7 j( f- g7 V - LDA #$F88 J0 S% M* h% m) }) _
- .OAM_Clear& U* }+ X* j9 J9 G
- STA OAM_DMA_Buffer,X6 z/ Z% d! i8 \' B6 q
- INX
$ h1 n& d* H4 Y - BNE .OAM_Clear8 _. O/ ` T6 l4 T5 ^ U
-
# }' }: U* M9 k4 c7 g$ v4 K, S# g - ;栈指针初始化
$ p/ Z s% `. B- F8 J - LDX #$FF
g* y+ _8 ]4 }, f0 X - TXS
k! G! w- t& h' N. n3 J - 2 t' L; Q+ \; v: L
- JSR Nametable_Clear;命名表清空3 E% F& i" F- }0 [+ M: o% R7 d% F, m4 D
- JSR Palette_Init;初始化调色板缓冲
4 t% ^, T3 k* y) W - JSR Static_Text_Init;初始化静态文本5 k- [& J" ~3 N! X0 h t, [9 r
- 0 Y: s5 o4 U* i* u2 l( Y; ^& A
- LDA #MUSIC_ITEM_TOTAL - 1
! ^3 }5 g# d& C! i1 q - STA FC_Music_Max_Index
8 J; F( a: {* I) L& v! P; } -
9 S# w* R1 Q( u1 X$ H5 A3 r, p. S - LDA #$1F
& M9 }: T, Q" p5 z* L. J" p/ _! U" f - STA APU_STATUS; P( ` j6 g5 L! t
- LDA #MUSIC_BGM - 1; ]' j. N, i+ F5 o6 w, g/ m
- STA FC_Music_Index7 R; B0 E$ F- r& X1 B2 |
- JSR Music_Init_Process;音乐播放 h$ X4 G9 s$ Q% ^: K& s$ X' ~
- ) ?) u- Y, @2 v; B
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)' M. O, Q6 e3 p) B! V6 z
- LDA #$1E, V1 f" v+ v- O. O- w$ S7 n9 z: b
- STA FC_PPU_Mask_Buf8 e, {4 f9 J* \# G$ A6 Z0 D
- % j% H% `! ] x: e
- ;启用NMI处理3 d, ]( r- K5 B5 f# `* k1 L& ]
- LDA #$80
7 X# O- n+ o4 _: J8 v" T' i0 D6 e - STA PPU_CTRL
% T. G+ `( M/ \0 g7 M, u - $ z9 E4 q9 s j' f# |
- ;程序循环, 剩余工作交给 NMI 中断处理6 f! o1 P" k7 Z0 E. q# p
- .Loop
* _8 T' f5 B+ T% z t6 E4 K. R - JMP .Loop
* k+ R1 q& J; x" `
& o( Z, T- U" a- ;======================================================================6 _, j3 s' _/ P K- r' i
- ;不可屏蔽中断处理9 |1 @1 J5 R9 z) h1 ]! E6 }
- Nmi_Program
! F# R/ S' c; A6 K: D- f9 _ - PHA
- Q) p* o& T/ Q" J: g8 ?" B - TXA+ |) i. b9 l, c5 X8 [" e
- PHA
6 u) }$ ~: g& I. ]. J( l7 |. M - TYA
8 p8 G5 j+ H. v6 P4 G - PHA# O7 y. }' ^7 S, D) N
-
/ p" v! v) A; p3 D# A4 [ - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
& `* D& ~& @# ^" k. Q/ N; x# i% M - * O0 g3 O+ I' i7 M4 N
- JSR FC_PPU_Procrss;PPU处理
5 A: Y6 g5 b/ a5 @9 c, J -
: v1 w5 e6 _9 W5 ^& m( p - ;精灵内存更新
7 t1 g/ Q: n$ a$ v - LDA #$00
! y9 O s$ J% a* P% \) [0 D - STA PPU_OAM_ADDR# C) `6 W5 `. g- ~9 k- m# j/ R
- LDA #OAM_DMA_Buffer / $01007 }: t2 Y3 [1 ^/ C* A- U
- STA OAM_DMA, ^6 E; I' ]. W; H2 {5 O2 j1 B3 R
-
) t! W9 Z& M- {$ y$ v) Y: p - JSR FC_Gamepad_Process;手柄输入处理2 o. C {9 k3 b, B0 U2 x' G& m: t$ c
- JSR Music_Select_Process;音乐选曲处理
5 v2 K, d( O" }6 o- q - JSR Music_Play_Process;音乐播放处理
/ I$ e, p( L. }1 L& I$ B1 X -
: Y( p- [# i4 y9 N& [; R - PLA$ a& X: |, u8 f
- TAY
" v2 o, P& Q* `, K - PLA- l) P& S# O b, k% X8 a
- TAX
\4 R' R4 W( N: | - PLA
. _3 k) k6 N4 i% h+ h
, C* k9 o2 ?2 [% _: [- RTI
) ~7 e& c# S" \, I3 ~8 U$ ]2 u
1 J; v2 e" I* c& F: _# t- ;======================================================================0 |6 m( I, A* v4 w2 y0 J
- ;请求中断处理3 S- z9 S1 o+ o) r2 r$ e- ^- R# c
- Irq_Program
% w! r3 @5 U8 g - RTI
% I+ B( s8 c( e$ [$ _5 T$ v
9 Y2 P6 Q) B: [; N! I7 P, u- ;======================================================================
& |+ ^: B" a8 h* ]- _( T7 \3 W5 d - ;中断向量表' }6 `4 C$ _9 _ q% ]
- .ORG $FFFA
3 T1 U3 E5 ^# t( {* f - .DW Nmi_Program ;NMI触发时执行 H9 _ J" q$ a2 m: n
- .DW Reset_Program ;载入ROM时最先执行3 Y; e2 M& A% R. f
- .DW Irq_Program ;IRQ触发时执行* u" f! \* C- L* N: U
复制代码
; L+ G! {9 I z6 V: j- r' Q. f
# ~6 m1 g& X F; }) y3 `# y2 I5 ]6 W& j' E
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|