|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下: Y0 U( y9 m# }; z- Q: N
: z9 z: w6 V5 \3 d8 g- Y" T( X! o
以下是主框架代码:2 f6 v7 K9 ?4 F( s% y
- ;======================================================================
; b5 l) ~( m9 h$ m0 t7 y8 F - ;文件头
# w V% _9 z( s" O7 H/ }/ \ - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量) k4 M ?& ~; _; _
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量, `" {, g; S% j* R( O
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
2 ]8 ~: |+ j( P$ b1 M) k8 ? - ;======================================================================
1 T3 B Q, r2 w5 f: j - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2* d4 g, I1 F/ p$ ^& U
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1% P9 t& P8 B% L! s% R3 B+ b
- ;======================================================================( V: c: M6 k; |1 s% E
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1' d6 U# g- p% T8 }, e: k! F, {) g% s
- RESET_ADDR = $E000 ;主程序起始地址
2 O4 t/ d( A3 D: J - ;======================================================================, N* _, l9 i7 \% {' _# v+ h- Y# A
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
! ?. a: ?+ z2 c5 \5 W* ^# O( ^ - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
! P: D" h! X# d - .INESMAP 4 ;Mapper号 (0-4095)! S, J" f* N! b$ v% c% \
- .INESSUBMAP 0 ;子Mapper号 (0-15)
3 r/ d8 H H& h& h - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
$ h, y/ o! n' c6 Z - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)" P' J: Y! ]: `3 t, ?
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
7 h+ ~* ^% _+ y0 B, B - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)1 k. r# X* r$ w" z$ C0 s4 x6 c$ t3 O
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)) v; C3 i, v6 L4 G% P' s5 f
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)0 c+ |' `. t8 ^
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
4 x% A# R/ _/ B i5 K0 O! \1 V$ s' E J - ;======================================================================
6 ~/ _& D) _7 Q1 O/ U; T- _ - .INCLUDE "fc_demo_config.asm" ;全局配置 V2 a* H/ [, c
- .INCLUDE "fc_demo_constant.asm" ;NES常量
0 p) ?) M3 C0 X9 b! {/ r! [1 i - ;======================================================================) P+ L0 W& D% J7 j0 {& L1 {
- ;音乐配置
. q V8 |# v8 T4 ]; r7 ~6 V, t - .IF 0 = MUSIC_THEME
, b! D! H7 H! ]9 C - .INCLUDE "data/music/Gremlin 2/config.asm"! ]% I" {+ U9 w. a3 P! D
- .ENDIF
& d! B C" y% c( h' Z- E - " s" J! P; M1 r8 Q
- .IF 1 = MUSIC_THEME& c2 T% o$ c/ c6 ^/ i/ \+ n" b
- .INCLUDE "data/music/Raf World/config.asm"
* S$ X6 v8 M$ Z4 C, X5 I - .ENDIF
5 n) Q. C6 H# \+ y, u; n - 0 f: w; S& L, i
- .IF 2 = MUSIC_THEME ) ~4 Y6 \+ L& v/ k U7 d% O* K& R$ [
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
2 D5 u; |2 c% N. }* u3 x/ D - .ENDIF
9 s0 Z9 K& N0 U% } - ' }. s+ t- d- j( L' W
- ;======================================================================
6 @, [0 v9 g- m - ;引用CHR图像数据8 |) w$ j) }2 n- ^: y7 C
- .BANK NES_16KB_PRG_SIZE * 2
. t( g4 k' W" p( }8 }6 X9 n } - .ORG $0000
' }* n/ [! W1 W9 N- L5 c- G5 U - .INCBIN "data/bkg.chr") X2 ` x- k. y R9 v' T1 Z
- .INCBIN "data/sp.chr"
! l: p. `/ z& q9 j -
( l* m8 _, i8 g ` - ;======================================================================' c8 i+ z4 S8 x" x+ l) a
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank- F3 O' Z1 X) m5 G/ n
- .ORG RESET_ADDR
4 j2 K+ E, V4 X: v - ;======================================================================
- g+ M _1 h$ `7 n" t4 W - ;引用其他源文件
4 L1 F" u2 e$ m! j: ~6 c& G - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
8 \8 R# ^ f8 @3 Z - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
2 I: c J( U }- Q1 L7 X; g - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
/ D) R% X; H: v - ;======================================================================
) x4 k* |/ B- C2 p* G - # [4 h1 d7 ^2 O: I7 Q( D8 R/ P
- ;======================================================================3 @+ C, `6 x: d& Z" g t
- ;等待VBlank到来* M! i# H \) F
- Wait_For_VBlank
: N( j3 y8 U6 l( d, x - LDA PPU_STATUS
! c, s* n) y. q3 j - BPL Wait_For_VBlank
7 k: p! e% H5 x, o8 O - RTS8 w" g% C9 T$ b' p1 W5 f
- 8 ~- f0 k# J+ u2 P! ^
- ;======================================================================
) T& q& h4 p; F' z3 v( }! m - ;调色板初始化& ~5 H, T) g! H
- Palette_Init
' q+ ]. E1 I* A - LDA #$3F
. }0 Z3 O& Q x0 r. P/ z* P - STA PPU_ADDRESS2 v( z" S; p& U5 o! q
- LDA #$00
4 z: h. ?% A) c I X# _ - STA PPU_ADDRESS
/ w1 ?9 J/ e% m% g8 f* l9 e - LDX #$004 W" d8 S. c3 c2 @& [
- LDY #$201 S& |) [9 }6 i) X& O0 [0 e2 a0 v$ ~
- .Write_Data0 a- b, ]5 b' {3 P
- LDA Palette_Data,X
8 v5 V" ]$ Z9 c; t9 c7 K7 X- k! y - STA FC_PPU_Pal_Addr,X' {5 l M) G6 L% \2 \
- INX* z' z( i; u4 g' {, j
- DEY* ? Q5 {) _' f7 O% I. r
- BNE .Write_Data
7 ], L) p! H6 b. q - .End( S" B* Y. S4 I ^6 V$ T
- RTS
$ e& H! X7 I5 E9 {# X+ {' X
% }9 k' S8 e+ f: z3 W7 i; D- ;----------------------------------------1 `5 O4 k: U/ O, N3 N6 r
- ;调色板数据
/ T6 @8 J& E# ]" @3 ^. b - Palette_Data1 w% P0 }7 k* Y$ t
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
, F8 X( k) Y9 y$ p9 o* U. Z - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22' v7 o$ ^8 ^9 u4 ^. k3 r. J, n
- / ]5 X0 Z- V4 \* ]: @
- ;======================================================================
4 X* b: K7 [7 {8 D" G - ;命名表清空
8 a7 N7 A! S. K" \# }* g. v$ o7 _ - Nametable_Clear' ?& g3 E4 ^; j2 I; N/ T$ p9 O# |
- LDA #$20
x2 {9 @5 {, ~8 B$ e* ~# b; f- { - STA PPU_ADDRESS+ Y; {0 }" D }+ N! k+ o& Z! y" S
- LDA #$00
: X; u5 }7 O5 `3 k - STA PPU_ADDRESS
% K h0 J1 l9 P! x6 u - LDA #$00
: `1 I/ _4 D% s7 P - LDX #$001 C5 n9 n1 T" X8 D8 E) |( j
- LDY #$084 C0 K% q, x7 F& `" E
- .Write_Data
1 m( H+ G; u- n$ M3 z+ x; b - STA PPU_DATA
) ^ g% \" g- x" }2 b% j% j - INX
( g C2 P- e) g1 w - BNE .Write_Data
# J$ Y7 [" v1 F - DEY6 ?6 S" f" J) O4 c
- BNE .Write_Data. J, s- d! {5 A
- .End s" t, u y' I3 A. H m
- RTS
$ l5 ~9 `7 E1 V9 A - 0 I. D7 `2 b" t' `3 e
- ;======================================================================8 [/ B0 `! ^1 j" X
- ;音乐曲目切换! l: k' ~4 a. c& t/ G1 v8 z
- Music_Select_Process
6 r' O$ }5 P* t2 Y, W1 S
8 Y- P& L1 l- X- .Pre_Music;上一曲
* P; s; O/ A! G) a/ }, ^8 |5 ]9 i - LDA FC_Gamepad_Once
1 r3 z- p0 r! e0 v6 a- F - CMP #JOY_KEY_LEFT
% l, R1 v; {$ \! V* G: E: X - BNE .Next_Music; ~3 L+ P x% }, m. R" H
- JSR Music_Play_Pre
7 j2 h* O3 ^: u f6 u' Q4 C1 T - .Next_Music;下一曲
' O: K* ]# V# r) R: l - LDA FC_Gamepad_Once( G$ z* D, H6 `& _9 E
- CMP #JOY_KEY_RIGHT/ m4 C. }. \" M. X9 c) o, p0 h
- BNE .Next_10_Music$ n* ]7 c7 ^8 {- U) c+ v9 ~* Q
- JSR Music_Play_Next9 A+ V/ m" z, e
- .Next_10_Music;上10曲
" D! h3 i* d: F- E5 \! J - LDA FC_Gamepad_Once
( P+ g% G- Z8 J0 f/ } - CMP #JOY_KEY_UP+ t# t& G7 Z7 g% R2 O, b0 r
- BNE .Pre_10_Music! I0 Q5 \! {' F, |
- JSR Music_Play_Next_10
/ M; U. Y/ y' I& V m9 S( s# U6 \( M - .Pre_10_Music;下10曲& a: {: z4 x7 ~8 `, Q& A/ I3 O
- LDA FC_Gamepad_Once1 W Q: V/ i e1 @% L! b7 U
- CMP #JOY_KEY_DOWN( Y8 Y# t! @8 u0 _
- BNE .Reset4 ^) j% ]$ b$ N# Q, h7 k* Q% c- g
- JSR Music_Play_Pre_10; S4 N m* \+ S6 K8 z
- .Reset;重播当前曲目
' k, w$ E/ A) H+ o6 ~ - LDA FC_Gamepad_Once
9 h1 q) C v" ^/ C9 ~ - CMP #JOY_KEY_START' f' Y7 r/ l: }( q7 O- I
- BNE .End$ v, d0 _, d" W# m& K
- LDA FC_Music_Index
( V( Q1 s# j1 Q+ l - JSR Music_Init_Process' C8 L! d( n8 a
- .End9 W0 ^7 p5 s7 J, q
- RTS) {! }# I2 S( T0 o
( s/ d1 O# b0 F+ T5 Y- ;----------------------------------------------------------------------5 y# A4 n9 [+ [8 F- x
- ;播放上一曲
8 ?1 i+ Q5 r) A. s - Music_Play_Pre; B; o% t/ ? h
- LDA FC_Music_Index
0 Q0 m' D5 \1 N# s - BEQ .End9 M7 `) N7 n5 t* e6 T* F! ^8 I
- DEC FC_Music_Index
7 r" t0 X8 A# e0 G; _ - LDA FC_Music_Index, q5 }( b h8 ?7 k1 u; W5 s
- JSR Music_Init_Process
# \9 m7 {' x3 f( ?4 R' S v* | - .End
( _. e& ?3 v* R O - RTS! P3 I J: l; o4 |
- ;----------------------------------------------------------------------/ p6 `: w# p# `
- ;播放下一曲* N6 h- ^+ w3 b1 U% v+ F3 s9 y
- Music_Play_Next# ? J, `+ g% P" U0 y; w D
- LDA FC_Music_Index
+ A0 ~ y N9 a! p! h, X* J- o1 ? - CMP FC_Music_Max_Index$ r6 ]$ s7 v8 m+ m# s- m
- BCS .End
* R7 h% t% @# B - INC FC_Music_Index. i( ?: f; N" U' {/ y
- LDA FC_Music_Index$ |% l7 Q; E' Z% v4 U$ X
- JSR Music_Init_Process7 Y( }3 G8 X, V3 d2 i' M# L
- .End% [5 q3 C8 H6 D, H
- RTS
' ~; ]! U, k( {8 W - # p. Y6 c2 ]4 C1 I9 L" r: j
- ;----------------------------------------------------------------------
* V* t3 _( _( O - ;播放上10曲
' f4 Z5 C7 @7 [! c - Music_Play_Pre_10
2 y6 I8 l' |$ X) B; P. w - LDA FC_Music_Index
$ O( C3 y5 `; B: Y8 _0 H) y - BEQ .End
; w+ Y1 {" v/ T; \2 J' L0 M1 o: v - SEC) z* I/ ] u" O0 q- m
- SBC #10) j9 D8 V# y8 ?0 Q ?. t
- BCS .Pre_10' M# c7 V* c2 m- {0 \$ \, v
- LDA #$003 ~1 z$ H* R: u$ [+ y# ?/ v
- .Pre_10
1 G4 ~+ e p |" G - STA FC_Music_Index
- F1 E* m6 j$ x) t& Y$ Y - JSR Music_Init_Process
$ `* f6 b; @( ?6 e+ W - .End) w H/ d. D9 a3 ]8 R' N
- RTS
}' k2 v) M: w, N - ;----------------------------------------------------------------------
+ ^0 M6 v/ K7 Z* z# p3 r - ;播放下10曲
1 E$ X2 V* ?" C( Q1 Q; P. ] - Music_Play_Next_10
D* w1 k/ h z% T) ] - LDA FC_Music_Index) e. }: y1 g4 v4 Q2 v: g3 P
- CMP FC_Music_Max_Index
# M5 Q% L3 T( o1 k; ]* I \4 h h% ] - BCS .End) [) Q* b% r) f. ?1 v4 R( `
- CLC
% k9 i+ `" ~+ U4 n8 t - ADC #10
$ Z3 R. s' S8 ?* K; b - CMP FC_Music_Max_Index
/ N! t0 Z7 q% M- k0 P* W" B ` - BCC .Next_10
/ h( @" k/ l( e# u - LDA FC_Music_Max_Index
5 w/ u& g- V0 {7 I: w$ D. c - .Next_100 g7 Y5 E9 w8 e) t J
- STA FC_Music_Index
" s0 p }" `! m4 K% H - JSR Music_Init_Process
$ S8 t* q/ t1 V$ V3 t: U; s - .End8 _ s U7 g; { a' e
- RTS
$ Z0 C/ G' d. w+ c2 O& s. q, E$ \
) U F2 l4 b2 C: j- ;----------------------------------------------------------------------
& N$ F( p) K, i% k I) [ - ;8位十六进制转3位十进制制
, {: w5 u j9 H: Y. G, O! i a8 P - Hex8ToDec
9 s K7 H' M3 B$ O - STA FC_Dec_Data_1
' G' A8 M4 b/ K7 i. C; r0 u# I - LDA #$00
. |% [; ^. A6 W) g+ F - STA FC_Dec_Data_100! X/ N. s# f& a- a1 _- h1 i
- STA FC_Dec_Data_10
# @3 ]) b$ ?) R: [4 V/ U+ C0 R4 m3 d - LDA FC_Dec_Data_12 e) n; c& K8 L" i0 d
- .Convert_100) p$ |) @$ {9 O5 R6 T% I' z
- CMP #100
3 h, C: s' l+ @% G9 d* } - BCC .Convert_10" o/ \ ]0 E7 ~; g* {
- SEC* W9 Z; T) x" m' n! `
- SBC #100
3 c9 S$ O% z- J' E" ` - INC FC_Dec_Data_100 r3 r+ C4 v2 c2 D
- BNE .Convert_1007 G& }; m$ o1 c
- .Convert_106 \3 ]8 b8 O$ M/ h% p4 E
- CMP #10- j( a9 C1 b2 }! C2 x& x$ X( J
- BCC .End! C8 R, N9 g) L( Y9 N
- SEC) T# |4 B% w' h$ `/ X" o7 R
- SBC #10+ E4 z) Z* _' n! e3 W
- INC FC_Dec_Data_10, l0 ]" ~4 L6 C0 i, J/ Y
- BNE .Convert_109 |) }, ]- \- o% h9 ]
- .End
9 p1 j) l' Q* W - STA FC_Dec_Data_1
' B1 M0 [& o9 Z# {/ D( j - RTS
9 q0 Z3 }6 z9 |$ F1 z
" ^( f/ v ]# o, X) A: Y2 K- ;----------------------------------------------------------------------
6 T( Q( s' D1 J, N. l) N6 ? - ;显示曲目信息
S9 L8 A4 V% _" H - Music_Info_Display
3 Q5 K9 ?5 z1 G- t - LDX FC_PPU_Buf_Count1 ~' x1 S7 d3 h T% H$ n
- LDA #PPU_WRITE_MODE_CNT_LINE/ p) Q8 o3 }) |5 Z% J
- STA Use_PPU_Buffer,X- Z, ]! y, H* T) B
- INX! K, T+ L2 W; N# g5 z% x6 ]
-
( e% @7 ~4 L7 g$ h W - LDA #>MUSIC_INFO_POS
; |/ d2 z9 |' }; ?2 J" _) M - STA Use_PPU_Buffer,X
0 F: J1 m7 O+ O2 R - INX! q2 c5 z! R' a$ @" f
-
/ y. h* { u" D) Y& v: Y - ;居中8 C8 k9 M( I: G0 Y
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2& D$ c4 l% D9 q l
- STA Use_PPU_Buffer,X, }( [8 P/ g N' D; _6 W2 G$ U# g
- INX$ t; ], T7 b: }4 Z- U& S$ f
-
5 z, c/ t9 v& Z) N4 r - LDA #$05
$ D2 H% k/ }; k - STA Use_PPU_Buffer,X
5 e! J* w d6 A) C6 ?. O - INX
7 }# p' a+ D' p5 i2 R: ]2 l% T - , X) M& ^# E# m$ t/ t; \
- LDA FC_Music_Index6 r; }# I& I+ ]1 L. E) `
- CLC( z, j8 j$ m5 Q( C% c4 T; N
- ADC #$01. `/ k: q3 {4 k& M$ ]
- JSR Hex8ToDec% D& h3 g9 |! t; H# \) b
- $ Y) H6 N6 ~0 U: u: F4 _ w9 T
- LDA FC_Dec_Data_10
# Z8 s2 i& q7 f ? - CLC
2 t! Z5 l" Q! q( L) }2 C# o - ADC #'0'
; b2 v- r0 C- c" d - STA Use_PPU_Buffer,X4 ^' P8 m* i% K
- INX
* R" n/ D% i5 Y) M( [% `* G& w, I! j! Q - " W$ r/ H- u- z8 ?( V: ^! s
- LDA FC_Dec_Data_1
- [. {; r+ r# t& N+ ?! _ - CLC6 E5 y$ }3 N. z
- ADC #'0'' v5 g+ D. f7 S* h. c! a! ~
- STA Use_PPU_Buffer,X
( x$ a% y1 d' ^* D* Y: R6 p - INX" L2 N7 Y9 E* T$ k% N( t0 \0 p
-
* a( z' N% y- @# M - LDA #'/'
0 V h# L+ X9 P - STA Use_PPU_Buffer,X1 i$ ]& A+ H1 p) ?1 d
- INX9 K1 q c# m7 n$ @5 v
- 0 X4 m' m" x$ @4 b8 j8 l" `
- LDA FC_Music_Max_Index2 e: l- f( Q* x: a& S$ L
- CLC0 y1 D" S9 e. @1 ]' v
- ADC #$01
+ ?1 u, X, c) t' E' J - JSR Hex8ToDec$ P5 k6 M: R% T) u W( G
-
8 j4 {: x% ?/ s - LDA FC_Dec_Data_10
/ m: b6 W5 [. D6 s+ F& h9 E - CLC
+ g ~1 V) U8 I7 Q - ADC #'0'1 O [5 G0 U; x& U3 H& F1 A
- STA Use_PPU_Buffer,X
$ ?* c9 w0 T# r' j2 J3 t# m - INX" j0 ^' ^7 e- O3 N# _. z
-
% ?: K/ a: H9 F - LDA FC_Dec_Data_1
# M9 M( a; @8 G9 r5 T0 ]- ? - CLC" L) `3 i: c/ a' Y4 d
- ADC #'0'
- t0 f1 j. i0 }" O9 ? - STA Use_PPU_Buffer,X
+ F% D- \7 |- h ]% m - INX* Q+ G1 @; N* H0 z
- 4 h I- U* s% ^1 d* }
- .End
4 ]. ]% h. Q7 E4 A( `8 U) A, d3 p$ g - STX FC_PPU_Buf_Count
' y! r8 b; G L0 b4 B4 ^ - RTS3 i2 X4 }! O9 u! k, K K6 d8 X) @
# x, U6 b- J/ x- H- ;----------------------------------------------------------------------
0 b% c4 l8 R( `- I$ [& ?3 l( F - ;音乐曲目初始化处理
1 i* J. z! ]% \ W; c - Music_Init_Process4 ?' s E" S# a
- PHA
6 p' i. R- F, P: c - JSR Music_Clear_Process
; c/ X4 ?* { q5 T - LDA #$1F& K, v" O0 q! t7 Q3 w
- STA $4015
& ]2 a' v2 b: w- } - PLA! Y5 z6 a2 ~: o3 a
- JSR Music_Init_Addr6 a8 a9 ]% f% g- H
- JSR Music_Info_Display
# g8 I9 ~! h: Z7 v - RTS, G/ r% K8 @2 w8 v( N$ B2 c6 B
6 |9 G5 ]% g2 i/ z. e- ;----------------------------------------------------------------------
- P; g4 ~# g1 e, G% W% k2 Z - ;音乐播放处理
& t- H3 W' h9 q/ q - Music_Play_Process
' S/ y. n; \3 I+ k5 Y. f( L/ O - JSR Music_Play_Addr4 Q; r2 E3 \7 P
- RTS) \( N, v' t" z6 I
- / V- I5 d$ c. A H* f- o
- ;----------------------------------------------------------------------
$ t9 v6 R5 y( x) ?2 a- y - ;音乐播放处理; o# i; M1 Z% a" H2 A
- Music_Clear_Process8 w$ B% r0 A8 w5 z4 e1 W
- .IF Music_Clear_Addr
8 N# G7 K. l* C - JSR Music_Clear_Addr
7 K% c$ N# i4 ]8 [* { - RTS
, F8 H4 K0 p/ \$ p. r* X - .ELSE
, l/ r% D; \- g) Q6 T' m - LDA #$1F
7 K1 L" H3 P4 |& u- `$ l1 ^! M" B - STA $4015
$ _- \* l' `9 N, O& K& G - LDA #$008 D) R, [% Z0 _2 J3 ]4 x
- STA $4010% F$ D! V( A5 |
- LDX #$00, x. K3 Q; `3 J4 d* E. Q9 H! ]
- LDA #$006 n* n! K6 n e/ Z# o! g. w
- * |# V3 i/ o& l
- .Music_Clear_Zreo_Page_02 J4 P- M9 X5 b, ~
- STA $00,X
" k# u" K6 W& v7 B; n - INX# [5 W& s9 L+ g
- CPX #Use_Zero_Page_Begin$ s% o7 F! F/ r$ f
- BCC .Music_Clear_Zreo_Page_0
2 L6 u d$ P! {4 o7 Z$ J -
+ {2 t% l2 g' \. \: u: S - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size) N8 a) m l i3 ~: T
- .Music_Clear_Zreo_Page_1
# k1 v+ W, G7 s2 R# G - STA $00,X1 E/ R+ {7 U) u& j. a" z4 V5 W. J) r; ?
- INX. |7 o+ O6 o) j
- BNE .Music_Clear_Zreo_Page_15 D! p. E% C* J
-
2 C6 Q, c' d% g+ w! z: L - Music_Clear_Process_1
! f0 ^5 Q) g3 e# S - STA $0600,X
' Z5 L, V# Q% }1 ]7 | G - STA $0700,X
5 M1 H3 U4 M- p5 s - INX. {4 C( i# m9 a! \# j+ F% \/ ^" q% }4 U
- BNE Music_Clear_Process_1, w) @9 q' D* E, I0 T r
- LDA #$10
! e( u+ Q; G6 b9 j* y# B - STA $4000
: _% F0 _1 K% y/ K5 g2 T, L - STA $4004' [6 }; S L' {! w" y
- STA $400C
& `1 @ W8 u% C) g3 A - LDA #$008 I$ T% e( i6 H, ]: m! g& p6 {
- STA $4008
- j S+ q- \" L5 Y - LDA #$0F
E* A _( ]* x: H4 f2 q( v" Q - STA $40153 [7 C* B6 x) y7 f2 H4 O- M
- .ENDIF
* k# B9 w2 f3 M h! \: T - ; ]; c' J8 f3 i. n. m* p# d6 q
- RTS( |0 q9 l3 q- f( Y/ U- n' Z) z. D
- : m7 M- G* Y3 J* B6 E) b0 j- x
- ;======================================================================0 Y& U8 U; w2 `4 \* D+ L
- ;重启处理$ N" j) K! c8 G
- Reset_Program
2 N+ u) |0 z8 w - SEI
/ [1 N' r' d- T+ J& p. y3 q7 ` - CLD/ K7 C$ y4 S) _. d& g6 q' j
- LDA #$00" L, ?: x5 V8 C/ s2 I$ |; v
- STA PPU_CTRL
3 h/ X7 e1 ^) e" x e. Z& v% } - STA PPU_MASK/ |4 f$ E' i( M5 T; }! q
- STA JOY2_FRAME
& d; d6 d5 z# w5 v - STA APU_STATUS, E+ v) |. E2 ^# R
- % i3 a, ~& ], H4 E7 ^8 G
- ;等待屏幕准备完毕
6 l6 z, N$ }% B" C" k. x% Z - LDX #$02
" G% x' V2 E3 o/ |7 i6 P8 Q - .Wait_For_Screen_Ready+ M' J5 T1 Z: T2 |6 K
- LDA PPU_STATUS
4 R, e" \9 w0 _" p' {" U, r - BPL .Wait_For_Screen_Ready( \. v+ R% Y! e% @
- DEX/ r6 P. K% o2 `/ l1 X/ m
- BNE .Wait_For_Screen_Ready
! l4 r5 S9 X0 k3 R -
2 s; z) n; v% W7 }- q; z - ;清空调色板
# a' v: b' ?" V! {9 z - Palette_Clear
. }; ~* i- s8 U5 u. T0 a9 m' V o - LDA #$3F+ Y# Q- z: {- j' v% T( E8 J' y
- STA PPU_ADDRESS* C7 W! b: W1 a. ^/ [ Q3 u9 V
- LDA #$00: o6 e8 I+ q$ T/ }, l3 W% x
- STA PPU_ADDRESS
- p p' @! d6 v: q5 h - LDX #$20# d2 |7 x1 t( U' Q+ E( q
- LDA #$0F
4 Z5 }+ x& \$ C& T' p/ ]+ T - .Write_Data8 z# }" c" f% m3 a+ V; b
- STA PPU_DATA
! U$ I/ {2 Z) r# u: V0 R# X - DEX0 R# c) b; ]- b5 B
- BNE .Write_Data& c3 `# u4 Z7 N( d
9 r- `" |# e$ [: L, k: N N. O- ;清除声音 $4000-4013! D; Q: w6 |7 d3 ]
- LDY #$14
/ T- G: Y# K- z4 b$ C - LDX #$00
" b4 _+ G. l3 t; [+ ?* ]' Z - .Sound_Clear0 f! [4 Z) n9 v4 U+ E
- STA $4000,X8 J9 `9 i% H' \+ [
- INX
, p5 O Q/ ^: ^) ]5 F$ v - DEY- A% f' U; E* B _, A. o
- BNE .Sound_Clear# Y8 l8 ~+ V# K* u8 \! l. D$ S$ L
-
; a, B( M7 v4 x: t - ;清除 RAM $0000-07FF7 V. |6 V0 z, q* G4 V
- LDA #$00
" ?- \( W2 J1 r3 R; M - STA $00
* I+ ^! v( T! j& F - STA $01
0 { a8 `9 Q) g2 z! N' y, z - TAY
C9 Q5 q1 B7 T c0 ?1 v% ?, g) R - LDX #$08. W; W( H: N: y* j2 N8 D' F
- .Memory_Clear
3 D- L- k: W9 `5 v" {, p - STA [$00],Y
+ Y% P' d) k9 e/ a" N( F$ m* T - INY! t. \+ T3 J# f1 `' Q$ ]
- BNE .Memory_Clear9 l1 ?. E/ U% _& ^; j- p
- INC $01
+ P$ [, l+ A* M5 { - DEX1 F9 Q# R+ W1 ^% o
- BNE .Memory_Clear
; V7 m+ g+ p) E K- c+ }0 `" u) H! \ - 7 b7 q+ C5 G3 @! d; t' i
- ;精灵缓冲初始化! j5 e! w5 C; N Z+ ]
- LDX #$00
6 |5 M/ H$ ?/ W8 Q - LDA #$F8
* r* w% }, M- |$ o3 m D% N - .OAM_Clear
' d! o0 L+ }5 _% U8 p' ~, ~ - STA OAM_DMA_Buffer,X8 S, P" j0 ^, A- ]( _% y' a) Z) W
- INX) B9 Y* X! l; t3 C) }
- BNE .OAM_Clear
2 M0 e% R$ Z2 ^- c. C# } - 5 e5 k) R# j3 w+ F- P. Y
- ;栈指针初始化
3 o8 B l* h0 t - LDX #$FF
: p0 ?$ y: h* f4 n6 h- \6 V4 z - TXS
9 k v/ ?4 P. \1 l( C! B4 H, I9 } - / Q6 o6 t! ^/ L3 D4 ~/ S- b
- JSR Nametable_Clear;命名表清空
% r6 h& V' V4 M# y; N - JSR Palette_Init;初始化调色板缓冲
6 g6 j1 r" k5 n1 P7 K0 ] - JSR Static_Text_Init;初始化静态文本
$ V0 C7 e8 |/ K' {. n5 c8 {& L - 2 q! Z( [6 j2 u
- LDA #MUSIC_ITEM_TOTAL - 1) }4 b6 |3 K4 W* d8 ~6 Q
- STA FC_Music_Max_Index
0 |/ i( f- n. A( P - & L: w% c/ j y0 ?- ?7 B4 ?
- LDA #$1F
" j7 w E$ A" C# h - STA APU_STATUS
t) F2 Y$ U" t! [- j, z/ b# k% } - LDA #MUSIC_BGM - 1
( S/ l9 U1 [/ ^ ]5 a( Y - STA FC_Music_Index
' F1 l0 Q# \8 W r) { I4 `1 c - JSR Music_Init_Process;音乐播放- n C& M8 W3 R7 R1 _: E
-
6 M: S& o) E/ K9 R D; f - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
0 U8 S5 U- Y+ F) M - LDA #$1E
$ ]& o( ~5 p" ]$ ] a& d - STA FC_PPU_Mask_Buf
/ M( `$ B# F* B$ L; z -
1 q8 j6 i) J! Z$ Z5 X - ;启用NMI处理: T; ?& D9 p, f/ w& t R
- LDA #$80: k" k! j* u, f9 i9 t7 N
- STA PPU_CTRL
* k/ N- p2 h4 Q, d% X: ^ - ! N/ {1 p2 A- I9 i9 \& h
- ;程序循环, 剩余工作交给 NMI 中断处理* X3 r' v+ D( @! }4 E1 Z$ `/ `
- .Loop/ z' W; W8 W# L# a3 e) v
- JMP .Loop9 G/ ?3 c- S9 y
- & o2 g5 ] B! B3 s/ ?
- ;======================================================================
/ f' `; Z2 c5 a1 s! p& ~& C - ;不可屏蔽中断处理
, ?- {& i6 @9 ?# }. u, `3 @ - Nmi_Program6 I$ L! H. D9 R
- PHA" I) U9 G# [# n, Y0 W/ U
- TXA G6 \9 |) l: X/ Z! B! o* o/ ?
- PHA: s# q7 {% d1 `2 W# X: K' @
- TYA" u1 R, T" J( V
- PHA
0 d) y. k/ r/ y -
+ X0 o- N/ B1 u - LDA PPU_STATUS;读取使得 PPU状态寄存器复位! S' C7 l/ C3 W- g; T; j7 t
-
6 G' q u, p+ [0 } - JSR FC_PPU_Procrss;PPU处理" r q1 v ]7 L6 @5 `" ^
-
6 B' z( h3 i' P3 U - ;精灵内存更新
3 O( l' t Q) F" K" b - LDA #$00
6 m! X, u* d! y7 o0 t& h+ ^6 E - STA PPU_OAM_ADDR7 h/ }" B+ U/ e9 u" q( I) u
- LDA #OAM_DMA_Buffer / $0100
3 s0 i, f" P0 t) D - STA OAM_DMA
6 R) v. G& D% E M4 s/ w' T -
' U8 g9 @0 n$ g( W8 m4 Z' `* P - JSR FC_Gamepad_Process;手柄输入处理# {0 M- ^/ ]+ h: t- }
- JSR Music_Select_Process;音乐选曲处理
- n' i/ l6 @* ~* I9 p' O% Q4 m3 C9 D2 ` - JSR Music_Play_Process;音乐播放处理/ G, w2 ~" h% i& {7 b
- . ^. Z) L; _" A1 a1 h3 c, h
- PLA" R0 M# v) J* f v0 Q9 s& n# O
- TAY
* {2 q: `( v8 N" V6 R - PLA
' a8 f3 l% c3 }- ^7 v& `) C) \" B - TAX$ \) U) R3 N/ r3 `
- PLA: D: |5 z4 a' z" r, C! j
% Z3 F& @2 A" J. I- RTI
4 a9 ?5 G7 ^0 X8 P
& y% {: x# ]/ ?: ^0 I2 N- Z' F( m" X, Y- ;======================================================================
6 M$ G$ H D$ ]5 Q - ;请求中断处理
; v6 @4 O8 l: O+ m7 t - Irq_Program
3 Q' p! P% A' V6 ~ - RTI7 C. c3 u7 y- I `$ y f: x9 Y
6 b% p+ r7 o, n% f' [& k- ;======================================================================0 `$ M/ P0 J: k X3 F2 ~' _8 I
- ;中断向量表
0 s4 G1 e6 Q* q2 l- H - .ORG $FFFA$ k# I! Q% F+ t+ O- m5 f
- .DW Nmi_Program ;NMI触发时执行! X: q/ N% d/ }; @! t% D/ E
- .DW Reset_Program ;载入ROM时最先执行
- l8 l3 I ^( q! m' z+ m) Y - .DW Irq_Program ;IRQ触发时执行' h' M; l. N6 G4 L2 W1 U
复制代码
) l* ?. G$ y3 S% x$ j8 ]
, f/ B. n3 p. n6 R
' K$ w- I. x5 @9 Z: }% k! |https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|