|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下1 N# m( K* Y/ H, y" X

6 c, P8 w& [) x% r以下是主框架代码:
; e4 g% I9 }1 \) t0 Q: G- ;======================================================================' w. S) C5 j7 I7 v$ D6 O( ^' ~
- ;文件头
* T& q; @8 v; V* X6 m3 m - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量% r$ J5 i) @! Q! z/ }* r6 i
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量& d( g; y$ { F! o1 u
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
2 D% d# L `5 Z) d/ w' @ - ;======================================================================
0 u$ _4 c) o, x! B2 H - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
! G; s1 _ C$ K: ~( p+ Z4 b$ } - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
/ L6 {7 M% U! V- _ - ;======================================================================' [% J# ^' K! A; M7 l$ Q- f+ G, ^' _
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
( K$ F$ X' I1 n& G, s2 f - RESET_ADDR = $E000 ;主程序起始地址
' X$ U0 @9 b$ l) E v - ;======================================================================% w1 C' a7 U" Y9 W* V
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
! w0 ?0 E! a! _: t! G5 L9 W - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB2 m v$ r3 _; B: O: [1 P7 V" k
- .INESMAP 4 ;Mapper号 (0-4095)
9 u+ n) i6 ]1 q# p9 t6 O - .INESSUBMAP 0 ;子Mapper号 (0-15)7 R t: v$ y) y
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏): {) e: r Z. I4 L5 @* x
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
; H" y1 E* W# s3 D8 }! X" N! H - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
J# y/ `1 o. J: a- U, c - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
0 D1 [" y: H- f, b - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
4 |' g, X/ x% ?' E1 @ - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)6 ~1 h7 Y u7 _& V6 j) u1 u
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)/ O: e0 ^4 b# k& i' N" O
- ;======================================================================8 S- A0 V% O; Y
- .INCLUDE "fc_demo_config.asm" ;全局配置' h, G, X( p- D4 G/ d" \" H* S
- .INCLUDE "fc_demo_constant.asm" ;NES常量
) V* F t( O+ p5 [% A - ;======================================================================
" X2 J0 d9 P; P - ;音乐配置
& j$ {7 d. @) c3 g - .IF 0 = MUSIC_THEME % ?5 P# E: [3 J8 r3 h( ~5 z5 o
- .INCLUDE "data/music/Gremlin 2/config.asm"
6 c5 P8 _. d* B - .ENDIF+ D7 ]8 k* V3 P; X
- 3 u6 h4 A {6 P3 x' k" L4 `% m
- .IF 1 = MUSIC_THEME2 [, a6 D9 l ?2 o# ]1 u' W# A2 P
- .INCLUDE "data/music/Raf World/config.asm"
( R+ f! K0 |9 w& F - .ENDIF
) c# _, V) H; O$ ]% L- B2 M# R( b - 5 [7 n1 }: s7 Z. p5 }
- .IF 2 = MUSIC_THEME
) g+ x; d9 {1 d l& G - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
$ e. T Y, F( V$ C: s - .ENDIF, y% G$ P3 ?+ W( z3 D1 h4 t
/ ]* J$ L4 {( w( K9 r- ;======================================================================
6 D0 R' l# n' G d, g5 l$ D - ;引用CHR图像数据
5 y1 h- O" v/ F8 T: ]3 X - .BANK NES_16KB_PRG_SIZE * 27 |' Z# ~1 \5 H+ |5 P
- .ORG $00005 F: S W0 W3 v; `4 f6 T2 H+ F2 O
- .INCBIN "data/bkg.chr"" n% X+ o$ T! K; v6 J
- .INCBIN "data/sp.chr"6 P) m+ Y& ?0 b
-
5 }, g4 m- n8 d' F- H - ;======================================================================
' Q) ^; U* N$ u: N5 L9 y - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank" t, h- X( V5 M! D6 t7 E* Z
- .ORG RESET_ADDR
9 O* H7 g$ t: m/ x! s - ;======================================================================
! E. m$ {* ~/ {" {+ `' T* H- `% ` - ;引用其他源文件# j" D( g0 [. S# P p1 i, X# {5 g
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理9 T& U! P) A7 ^. V' y9 E
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理4 ]# j5 U* y+ i8 M
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理1 X- Z2 U2 I4 N, x: k) S
- ;======================================================================
5 [9 x8 X% ?* `: P( d( `% K8 f, N
# P2 F; W/ p4 T# l4 G& \; {0 D- ;======================================================================3 v7 y$ [. F) j; [
- ;等待VBlank到来
& k" x j- b" E, K8 V) c - Wait_For_VBlank
+ d. j4 G* U6 q; o - LDA PPU_STATUS
+ A) F; \& _$ \& } - BPL Wait_For_VBlank
`0 U% B) x& B, h - RTS- T. ]! Y, D2 f) H
- E! ]6 f! j b$ r
- ;======================================================================
% `) Z9 C* _2 x& d1 w0 h# O' O1 N - ;调色板初始化
! L' A6 A V& d; z0 C - Palette_Init
7 E; i' W1 y/ `3 m - LDA #$3F) ]8 k) }+ i# Z. y) R }
- STA PPU_ADDRESS0 a1 V2 x) ]7 A6 I% v# w0 A
- LDA #$00
L( q( ^3 q: ^+ e - STA PPU_ADDRESS- f3 x+ b5 j" k ^. z G" S
- LDX #$00/ b: ^2 D: m' b3 V* r$ {
- LDY #$20
- l: W' }* J3 G- w2 W - .Write_Data
1 O0 w e5 N) }# e2 x - LDA Palette_Data,X
$ a s z! ?& l& m2 Q - STA FC_PPU_Pal_Addr,X
. q4 n: g k7 G - INX8 x0 }, Q# W; g, K* {
- DEY: ]1 v$ U/ R3 B- I7 n% p5 X1 j5 I
- BNE .Write_Data: D% P# k% Q" h+ y( a8 ?! \& Y
- .End
/ A1 P- t; S( P& N9 F - RTS* }3 `% t$ u9 y3 p9 f5 S
- 4 H. t! z& n& h% b' O7 k- y6 Q3 k
- ;----------------------------------------
+ x6 r+ R8 L4 J6 _, B - ;调色板数据
) A! C/ s5 \; m% G: f/ z - Palette_Data
' G: T6 Z. s {$ j* m; X) P8 Y - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
2 F- m# P6 T9 M - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22% {3 s p1 Z. M* Z
- % h9 z1 K7 Q$ `( Z: z
- ;======================================================================! Y+ {- A% n' `( g# c
- ;命名表清空' R) F4 \, S& k: S
- Nametable_Clear
' }# Q: k0 [1 ^ - LDA #$204 r! C t2 P7 A+ T! I& f
- STA PPU_ADDRESS
' I. v" v, o7 r7 { - LDA #$00* G, P$ ~$ E1 F9 g/ r) N
- STA PPU_ADDRESS
7 r- r, g7 Z# n1 V/ j - LDA #$00: t8 Z1 s3 c/ Z9 t4 R5 D
- LDX #$00
6 q% | z7 A$ Z7 m4 U - LDY #$08
% T% ]/ i- u6 s! i$ [" \+ q% A - .Write_Data# H4 _3 k- F; X0 x
- STA PPU_DATA3 `( U) H1 I* G. M
- INX
/ ~: j, n( W! N$ _2 v - BNE .Write_Data
3 B, w5 g# a* R9 Q: U3 ~- g - DEY" y f# G. S- @' H6 C8 y
- BNE .Write_Data
- W1 Z% h% x0 t4 V! b - .End
" @/ n, i/ J( Q% R3 T0 D - RTS: Q9 @3 A* f" q' w8 u7 q
! O. @& t- i$ g' l- W6 h1 X9 s; y- ;======================================================================( S1 [. H l, k' c
- ;音乐曲目切换, O+ S, Z0 \: @; J7 ?8 Q
- Music_Select_Process
4 F( S9 T" T% C7 c
$ S' q6 w7 x$ I3 u N% B( b/ m- .Pre_Music;上一曲
: f D7 _- ?, b% e3 ~) {+ j+ j9 a8 q - LDA FC_Gamepad_Once
) a& V& @) @3 g" X$ _0 W - CMP #JOY_KEY_LEFT
% F& w; i# Q" B k: O - BNE .Next_Music
W( D! o5 D: v - JSR Music_Play_Pre
i" U P; J- _4 H! x% M/ g - .Next_Music;下一曲* V" P/ J; z8 B4 C6 o4 }7 k- Y+ p
- LDA FC_Gamepad_Once- x/ n/ g W4 e4 r$ R
- CMP #JOY_KEY_RIGHT% V) X* {/ ]! p' G- K. Z) t5 `
- BNE .Next_10_Music
% C! J2 `" W2 a z0 g0 L. P - JSR Music_Play_Next
- I5 S. H9 E& U1 J - .Next_10_Music;上10曲
1 ?) d L. }& d: H( i6 V" x - LDA FC_Gamepad_Once
: g3 l# h3 W+ ` - CMP #JOY_KEY_UP
0 z O, H# Q( ]* z - BNE .Pre_10_Music
' Z2 @' Y% @) }2 ]) s# Q/ I3 g" d - JSR Music_Play_Next_10
[- X& v1 m0 W1 W3 L( m+ h+ }7 E1 Y - .Pre_10_Music;下10曲; ^+ P+ n7 [. r: w, i& b) J
- LDA FC_Gamepad_Once
" @( @/ H7 [3 c - CMP #JOY_KEY_DOWN
; A u) Y1 o4 e. Z4 q* W& o - BNE .Reset: ? r! X+ `" A, k5 F
- JSR Music_Play_Pre_100 I7 }& r% H6 D
- .Reset;重播当前曲目
7 f8 P+ u, z0 o: z1 F3 G0 R - LDA FC_Gamepad_Once5 X, y9 k! x: { r D
- CMP #JOY_KEY_START1 H' m, J( N0 T8 ]! L$ j: B
- BNE .End- x( O) w4 B" M3 X$ e9 c
- LDA FC_Music_Index
, `% v( l3 }" d; w/ X - JSR Music_Init_Process9 R" ]2 {: e% j' z0 ^ r8 m
- .End
0 O3 \: x/ t& C g, k' b - RTS8 V' A" i( }' [, E7 K6 k8 V) j
4 o) n& _3 I( F' F, w7 z9 M! K3 b- ;----------------------------------------------------------------------% `: G B1 ^9 r
- ;播放上一曲' ]5 I( |# b& N/ m2 O+ A! y, j
- Music_Play_Pre' Z( V4 A& A [5 x' _$ y- Z$ l
- LDA FC_Music_Index
2 {4 ~1 n: y- G- r& Y: B, { - BEQ .End" L9 F3 f4 K; w+ l" t K
- DEC FC_Music_Index
) ?) h: a4 [1 ^# [5 u3 a9 Y. p2 b: L - LDA FC_Music_Index
# d q2 x$ s* ]! z' S$ I - JSR Music_Init_Process' l, B; ]( q) }$ z8 [7 z$ m! z
- .End6 W& x1 u' q* l9 F) q" W8 E
- RTS
9 h0 U5 |. O, e! }' L h2 F5 H, U) p - ;----------------------------------------------------------------------% b* X( g# x5 x; v4 j7 U: P
- ;播放下一曲
1 Z0 H, m. z. W3 U+ j) q - Music_Play_Next/ Y* ]4 I9 U7 Q* u: | |
- LDA FC_Music_Index, U% h0 h; u8 X. d+ {( f+ {5 t
- CMP FC_Music_Max_Index& B1 Y& S5 i4 @ P
- BCS .End
o, Q! }7 I( b. `* ~, @ - INC FC_Music_Index9 ~% |$ ?$ V$ y" x3 Y
- LDA FC_Music_Index
1 I5 \1 j5 l/ }1 o% @6 [3 i - JSR Music_Init_Process
" o! V" |2 x5 S/ m( X4 s9 k# ^ - .End
) g' i. m- v- [. k! ?1 R3 q - RTS0 s j# J% a. ?' O+ q1 @, ]
- " _: W0 k9 z; x3 J9 Q! ~( f
- ;----------------------------------------------------------------------
; g5 ]. P x3 a7 v* x - ;播放上10曲
3 A) N, j& \; x4 A - Music_Play_Pre_10
3 S- |5 l) u; [& n# N' y2 ~ - LDA FC_Music_Index% V: @/ ]( o6 X6 i2 K$ E- ]
- BEQ .End5 z& y6 t/ G6 T- H4 g6 T# k
- SEC0 }: _( E) a. X3 n
- SBC #10
7 n; s7 e7 R8 d/ d - BCS .Pre_10
- C% o3 W- V V" l' b - LDA #$00
3 c. ? d! [% s' K- a/ P! }) O! J" q - .Pre_10
( C9 C! t8 W" ]% U8 E; U1 E: h - STA FC_Music_Index2 `+ d, V2 o' W' R4 B2 ]
- JSR Music_Init_Process
# B3 {9 V/ r0 d& z, d, [) V; v - .End
( b5 I8 l+ p, y) K6 m l - RTS
/ N+ D/ {1 Z; b7 `( B - ;----------------------------------------------------------------------
9 n, D8 c- T( x" o( K! e7 k# c - ;播放下10曲) ?/ [0 M! d$ H( X, }- i
- Music_Play_Next_10
1 U9 T) ^8 T/ |. r - LDA FC_Music_Index* I/ i" o6 `' }) S
- CMP FC_Music_Max_Index. ~3 e/ z7 }5 l. v, W$ W4 @/ L7 g
- BCS .End
6 B/ T/ T/ L) P. |5 G# h: K - CLC
1 ] z/ q9 c+ e5 B1 s& w+ t; T& H - ADC #10
; H- e/ V6 _8 K" P2 L. x1 n3 N. g% C0 h - CMP FC_Music_Max_Index* V1 S. C( {4 V' C5 K
- BCC .Next_10
$ c/ C$ P! L$ }$ I+ z; c/ j - LDA FC_Music_Max_Index0 G! n2 N. m) z O- I0 u
- .Next_10# y! b% k" i( I" v. _9 }/ ^
- STA FC_Music_Index2 [) X5 U) p- {& Z2 N
- JSR Music_Init_Process* V1 B2 U7 [8 I5 G3 }3 j( R) m
- .End2 ~, z1 e' u$ P6 j! o/ Z
- RTS2 F$ o9 N+ l# `* I. @
}( l& `$ p! }- ;----------------------------------------------------------------------
) I" m$ C; |% Z/ v2 y! {# g$ O( T - ;8位十六进制转3位十进制制
" B8 ~+ c3 ~: S& D- k - Hex8ToDec
- ~# @2 D: |8 _! ~3 H M4 w - STA FC_Dec_Data_1: e( k+ ]0 a! E
- LDA #$00
* o! m6 s% B) W; g - STA FC_Dec_Data_100( ]$ Q( b* J9 F$ W& A
- STA FC_Dec_Data_10 \/ S! h" B) u7 e6 _$ v
- LDA FC_Dec_Data_1& N* ]! z1 {: }# O0 Q* A. F/ ^- x& Y
- .Convert_1006 {" C! \* }) Y' Q
- CMP #100
2 `9 J! U y# ^2 ~( M2 K8 Z - BCC .Convert_10 W" o& X1 z$ O9 y8 I5 K, Q& Z
- SEC
4 s0 ~+ j. H2 l7 G - SBC #100; a L( ?2 C+ E7 r. ~
- INC FC_Dec_Data_1004 V5 f `% `% U0 p7 T' E
- BNE .Convert_1000 a e% }: v0 i9 j
- .Convert_10( D2 p" H2 I: h7 o9 \
- CMP #10" t2 w4 t: J$ D6 z) q0 o
- BCC .End5 L- n8 n7 m; W( D5 C
- SEC3 F0 P8 c2 D) }
- SBC #10
5 N) \ w. p$ c( c - INC FC_Dec_Data_10: [ B3 l. Q7 \1 r% I% O" T, c
- BNE .Convert_10* R' C: T6 W z1 [' f
- .End
3 W0 j( C( v7 q1 K) Q - STA FC_Dec_Data_1& T$ l! J2 c" ?4 l& I8 a1 x
- RTS/ b# ^4 n8 J$ I$ k0 ?3 |
% u& w) n4 y* O( e7 @$ M; L- ;----------------------------------------------------------------------3 V6 L2 n3 W7 c) ~: q
- ;显示曲目信息! C4 F7 r( m* I& v
- Music_Info_Display6 @2 k# w# `, C% g R- A% i
- LDX FC_PPU_Buf_Count
. E! Y! d) e S) y - LDA #PPU_WRITE_MODE_CNT_LINE" }9 O* P; V2 e, p% _
- STA Use_PPU_Buffer,X6 Y! V. v, {: Q
- INX
3 E+ Q7 u. y" i; C: I! U* w( W - . ~& k( B2 h& R V- F
- LDA #>MUSIC_INFO_POS$ u$ D, \* m! k" t' g
- STA Use_PPU_Buffer,X
9 D8 f1 P5 ?* r - INX# N, v, C }9 n2 I! x- n1 g/ |
- ) y3 s$ R% _: G* H! o4 y0 q2 v
- ;居中
; P1 B% C7 z% V F6 a0 w' d - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
3 `$ i& f' T& r! O( A, ^ - STA Use_PPU_Buffer,X$ B- C: ~& [8 R! I8 y$ T- ^; j
- INX
* h5 I+ `8 u, u -
3 Y9 C5 ~9 v6 ] B1 V) T0 F - LDA #$05
" q% r( W+ l* E7 ` - STA Use_PPU_Buffer,X
2 N" T8 Y) n K - INX& V8 U" y' Q0 h0 ^/ d7 a
- ; F |4 [* v- k5 F- m5 I( [
- LDA FC_Music_Index
$ h. r3 \3 U: I6 A - CLC# P# E5 p- F0 K8 }, |
- ADC #$010 H5 i& F& L3 U( `6 @
- JSR Hex8ToDec
7 R" P5 j, H+ p5 A - ! ?3 }4 O- @0 S: J2 O
- LDA FC_Dec_Data_106 u$ s8 ~$ \; r$ k0 `3 `4 B' Y
- CLC
* {; N$ y$ h$ v - ADC #'0') F+ s4 l2 U9 g: o/ E F3 M
- STA Use_PPU_Buffer,X* E" c# D; b( C& ?0 U. s$ ^# ?
- INX1 I+ M/ n, b3 r: }
-
$ F! g3 |# ]5 d% e2 I+ c% ] - LDA FC_Dec_Data_1
9 Z/ x, y1 A1 g2 a$ @' p - CLC
6 @% B# l" n9 }% F( X0 w - ADC #'0'
- Y9 C y! n, [( j. @ - STA Use_PPU_Buffer,X
. B# |2 F* `/ [$ i3 e - INX, l8 P' J# ~3 [: F
- : C3 P& D7 f* N! |; s
- LDA #'/'
+ G. W4 N2 Q2 z - STA Use_PPU_Buffer,X. ~! l) w, h3 D: ~, `
- INX
# S/ K3 C8 v% w* y; @- ` - 9 Z3 Z* h6 f0 E- X* y* T( q
- LDA FC_Music_Max_Index
! \* H3 }) N9 C. e( D7 Q - CLC* o2 ^, @+ k0 q3 L
- ADC #$01
! i% D& z, p& U# ^1 c! h - JSR Hex8ToDec& j6 X, q& C- [/ [: o5 [6 \0 h
-
# j1 x: _8 ]" B3 s% ~1 K' a( U. b - LDA FC_Dec_Data_10 l3 [: t* G6 P" S# z
- CLC( E- B' h6 `( ^
- ADC #'0'
& `9 y: o5 k2 L: L: a: G R/ Y2 U& x - STA Use_PPU_Buffer,X/ u0 Q. x' ~, h# K
- INX+ h/ |6 U* s$ n6 g+ q, |
- 9 G/ R5 |. v6 N! _6 \+ {
- LDA FC_Dec_Data_1
7 a3 V: r* Q2 c- D d+ G O - CLC
* K) |. f6 f6 ?0 G1 W: Q - ADC #'0'9 p1 P. Y! X9 ^2 O( `
- STA Use_PPU_Buffer,X
; V4 g# f! L! i+ P- y1 l9 `8 v, b - INX$ r- b7 F+ x4 q' k; N! U
-
; y2 @# g; @% s% p9 J K3 v - .End c+ h: s+ \7 w1 c9 `2 o* F
- STX FC_PPU_Buf_Count: {% Q9 Y6 R; a6 }3 ]
- RTS
8 p% t" @4 Q H* v q! Y) E8 A
& m# o5 h. D4 _. m; X- ;----------------------------------------------------------------------
9 x) z/ j$ K6 h4 J" X2 v4 s0 [ - ;音乐曲目初始化处理3 H+ ~! j8 a3 i4 v$ }3 ?
- Music_Init_Process
4 }' ]6 U' [+ p0 b - PHA/ I7 A4 {( `& k5 ^ {! o
- JSR Music_Clear_Process
; [# r0 ?2 q1 n% e - LDA #$1F
4 p0 z8 R9 d9 T' I- g. r - STA $4015
* r G+ [9 z; P; c2 w9 m& d: A8 ?# o - PLA
/ T+ A* @" c+ q: P' ` - JSR Music_Init_Addr
6 }/ w0 c3 Y" ~6 {; S8 [ - JSR Music_Info_Display
# n" L w/ \9 g' t6 l - RTS
* j6 Q# a {5 o% C/ P - , U* Z: I/ _1 V& [& d- q/ k9 J
- ;----------------------------------------------------------------------" f+ B+ g8 G6 J/ R9 ~
- ;音乐播放处理& }# T6 k" Z( d% m) U6 W7 |& A
- Music_Play_Process$ a @# S2 _" G. b6 m* A1 C9 Q" N
- JSR Music_Play_Addr9 ]0 h' g9 I1 \% j+ S
- RTS
2 y5 A# q% c. V+ r% |4 X3 J. Q
6 M2 r# O6 I% P( e( H- ;----------------------------------------------------------------------
' V+ j- z" ?0 Q, k - ;音乐播放处理
: Z: s$ M8 N" D$ b - Music_Clear_Process. q; y3 z1 {! S/ e
- .IF Music_Clear_Addr
7 d( X2 [* H1 _ - JSR Music_Clear_Addr
! `: y. B" u& ]) J6 K( P- o( [' P - RTS$ S1 \. M/ d% `- Y
- .ELSE
3 `; d% ]8 t7 m, {) { - LDA #$1F
0 X5 o! f% Z5 r; g9 c - STA $4015
; a: A: ^" w8 A$ X - LDA #$00# n0 c) Z* N, R7 q
- STA $4010
- ~& X$ I7 p6 @ - LDX #$00
9 B1 D& W) }9 N$ Y! s - LDA #$00: s1 `+ P$ p- F) y7 `5 X3 ?3 W+ a
- l% G2 P$ s$ u
- .Music_Clear_Zreo_Page_01 W$ {# u: B7 \
- STA $00,X" L1 r) l8 G- u+ d; |( p
- INX
5 S0 j% K" Q( w+ G! R* d - CPX #Use_Zero_Page_Begin
3 e& _- F* z0 L+ S- p' W - BCC .Music_Clear_Zreo_Page_0
' X. j1 h6 N4 n$ Q7 m7 u* B1 { -
7 i, _: d' S3 [$ v+ H* w* g - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size/ f1 X) h0 g. r$ V" ^+ W
- .Music_Clear_Zreo_Page_1
" q4 F- W. Q+ r$ z+ ?4 k: I - STA $00,X5 H7 ?- p' }* `; \$ K* A9 y
- INX# s D$ T3 A4 R8 l) T5 W: `2 B# ~# y
- BNE .Music_Clear_Zreo_Page_1( y) H+ R$ y" J2 d" s5 f) U+ p E
- , m. \7 c3 Q, ^- [% {6 R
- Music_Clear_Process_1
1 y/ v3 |2 m: v, Z - STA $0600,X
7 A5 V: U+ Q8 w, g, m - STA $0700,X2 Q9 ^" ^, l$ K; I6 C9 G/ t* r
- INX
7 L1 d- |2 L: g6 U4 I# C S - BNE Music_Clear_Process_1$ J( Y3 r0 R) O5 S/ K+ {/ u
- LDA #$10+ J, N" F. y5 d8 _3 `0 t
- STA $4000% C) F3 y6 G& G: r& ^9 @
- STA $40042 @. k0 \, ?& V) G6 i
- STA $400C5 D r# L: D0 {7 u; Q; Q1 j, u
- LDA #$00
% q( T4 Z+ f7 L* i - STA $4008- V; T" m0 }( B0 M" I7 L# _
- LDA #$0F' D/ `2 ?" G( _, a" K
- STA $4015
' n1 Y H, ?2 I; t" e& z - .ENDIF
$ i% m( P/ _( I* k -
( t' j0 W- H3 m h, c3 B( h - RTS
7 u% p. J7 A* |& f- Y - 9 z- w# L; p* p( n2 L
- ;======================================================================* D1 P. Y8 K) h* M0 u: C
- ;重启处理2 I4 e/ ?3 |1 b2 a9 u9 j2 d
- Reset_Program" z5 M" \0 ^* _; w$ k
- SEI$ D8 T1 ~2 m* K* n% z; C; K7 o
- CLD) I$ c3 j8 T7 j& S
- LDA #$00
; _* E6 ~" B& X - STA PPU_CTRL) ^/ f; S" [: D' e" d \
- STA PPU_MASK" T7 n, {) C2 I2 y- C. B7 Z# @. d
- STA JOY2_FRAME
8 ]; e9 j& `8 ^" X; | - STA APU_STATUS4 b% o: ]7 g. F) p
-
8 O: v5 |3 t( F7 ]% Z - ;等待屏幕准备完毕* W% F9 V7 Z( h7 b6 F% f
- LDX #$02
! b5 U( | ~( X( V" b - .Wait_For_Screen_Ready
, ^7 v. C u& f! Y' Q, K" J - LDA PPU_STATUS- i; L0 ^. W+ p# w7 p* f
- BPL .Wait_For_Screen_Ready
2 e# g; B, j6 ^( `0 O6 L - DEX0 h1 T) ]4 ^1 [. U
- BNE .Wait_For_Screen_Ready
: c& P; k- j& O! Q& j' Z! N( e1 S - ' E, U( B- o# k9 z4 B5 [3 r: ?% ]
- ;清空调色板: D' n! T! \) |9 B e8 k' Q: k1 o# ]
- Palette_Clear7 [9 u4 ~* v( b3 W) G' h
- LDA #$3F$ D+ R" ]4 L. z/ Z9 F
- STA PPU_ADDRESS
! A. r) ] I- H# [+ R - LDA #$00
7 V! z1 Z! D" Y/ U. D, } - STA PPU_ADDRESS
1 h, Q) `: R1 {, W% e8 ^4 W, K; f8 ^- B - LDX #$20- W5 K; y7 S2 Y/ u
- LDA #$0F: F) _5 h0 D3 c/ q, |: i0 u
- .Write_Data
. ~6 h, O9 Q! G0 V) K! b( w: R( q9 N - STA PPU_DATA
! i$ ^: J5 C; R8 B7 w* a - DEX
3 |: v0 v" A1 }+ b0 F8 X6 l0 D - BNE .Write_Data6 c% ~" O$ D) j0 f* ^/ g
; c2 v) j8 G* L8 x' l3 r! `7 R- ;清除声音 $4000-4013
% |* R8 k" p4 E. q! E, _& w - LDY #$14
/ I r5 Q% h7 u8 N3 X, | - LDX #$00
: {- I, @# @$ H* f4 H! q1 P - .Sound_Clear
4 e7 c4 ^+ l1 o( Y, g ~ - STA $4000,X
$ M3 A$ B, ^: a; u* p - INX6 d8 R2 Y5 \7 C3 A: ~. M. M% A1 y
- DEY6 k$ y6 `! D0 r/ w
- BNE .Sound_Clear# B, K8 {4 f$ l" @9 k
- 5 ^2 e' d5 j: M% `( F
- ;清除 RAM $0000-07FF
4 X/ G* k6 ^1 v( D - LDA #$00
1 ?5 h" l0 L2 ? - STA $00! N j; n0 K1 h" b
- STA $01% H" _! u9 ^1 [2 D8 W
- TAY
: |! v! v X2 u; T. ~( F - LDX #$08( F' i H8 E' K3 Z+ ^0 W* a
- .Memory_Clear
; E: c" l% f0 k2 d w5 U W - STA [$00],Y* q" a) E8 n$ e
- INY
$ k' p: x8 ?& U, V$ c$ x' |- g - BNE .Memory_Clear
( f, S$ g& d7 S0 ?3 F' C - INC $01
/ m" D' S! u+ r - DEX
" F% S, `; z! c - BNE .Memory_Clear+ J7 f& C$ ]* B: ]% ~; a: l( w
- ! |/ {! H0 F) D: ]) `5 A
- ;精灵缓冲初始化
4 z6 h/ L% c: Z) l7 j# | - LDX #$00
4 H3 I' {+ y; t3 f - LDA #$F8
' O; d; U) O! p2 F+ Z# c - .OAM_Clear
) z& R- H* a/ p% Z" k6 J2 O - STA OAM_DMA_Buffer,X0 P2 E; N. U& Z
- INX2 {3 ?4 R0 C9 B( H
- BNE .OAM_Clear. p0 \$ G. h) e0 M* o
- % a/ ]* e' T+ J$ E
- ;栈指针初始化
. i. c. C/ F: M" Y0 A" S3 v5 t2 K - LDX #$FF
* ?- m, O8 `" ?* M$ r - TXS
8 A9 k" U# K9 z3 A8 R -
* Z C _* [: L9 v - JSR Nametable_Clear;命名表清空5 f0 \/ H* F& i; \
- JSR Palette_Init;初始化调色板缓冲5 }. I% Y, p' n+ x/ ~1 X
- JSR Static_Text_Init;初始化静态文本' [' N# j4 h/ J& h
- 7 @, R* @% I4 Q4 q* a8 Z
- LDA #MUSIC_ITEM_TOTAL - 1) {, l2 }& D9 k6 G5 B) r
- STA FC_Music_Max_Index
% ^5 C) m0 c' V4 O -
) Q. R4 t7 L% L9 x. b - LDA #$1F
; z6 O$ D7 v) M4 _' i2 ~9 l - STA APU_STATUS) P3 D- S# m& V6 l M q
- LDA #MUSIC_BGM - 16 ?7 {3 C( o& E. {9 W" A$ [- u
- STA FC_Music_Index. V: \; e) T7 j0 a
- JSR Music_Init_Process;音乐播放) S$ O4 Q0 Z3 }, C1 h& s- ]
- - v. Y: K. t- G3 K B9 a% F
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
9 S5 u1 |: Y- S) } - LDA #$1E
9 S+ o5 ~% u j. D+ n - STA FC_PPU_Mask_Buf
* p: N/ P7 I- t - ' l* k( m# ~" a& y: }
- ;启用NMI处理( g% e- m: Y G. Q0 x
- LDA #$80% L& B. p9 ~9 I" d% n) S
- STA PPU_CTRL
, |) H) w6 F6 [/ z6 K; @ -
5 {4 Z1 C" _$ s, { - ;程序循环, 剩余工作交给 NMI 中断处理
6 p( }5 l; ^& `, W9 m! s3 ] - .Loop X$ z5 w6 q3 r Q+ W6 ?! W
- JMP .Loop
- t$ s7 Z# g `: {5 I5 P4 a3 G% { - 6 E' k6 H$ J; l: k
- ;======================================================================
y3 C, I8 F2 g - ;不可屏蔽中断处理/ P5 V3 H. y4 h e+ O
- Nmi_Program! W% R! X! T% `' z! Z
- PHA9 a/ L+ S1 I8 }3 I, Y
- TXA
1 X! g: O, `1 V: d% e - PHA+ d- a7 Q( M) t& n( q
- TYA
) R) [5 M1 V( D7 N - PHA0 R# m! S3 {$ Q% t7 X- G k6 A8 X# @
-
7 f& x6 a6 G# r Y+ p - LDA PPU_STATUS;读取使得 PPU状态寄存器复位# R! B. ^) @7 O5 U6 L1 t; V
- . S6 z+ k$ v# k) c; l
- JSR FC_PPU_Procrss;PPU处理
; r$ ^/ E7 K4 @# T -
5 J& f0 V. b1 D4 I$ d4 i - ;精灵内存更新
6 e v: }/ O+ L9 X% p+ |6 Z - LDA #$00
7 x/ j& K! D- `7 u- K3 F - STA PPU_OAM_ADDR1 Q: l, w; s q
- LDA #OAM_DMA_Buffer / $0100
/ p5 c( o" i/ O u8 V( {$ h! E: r/ e - STA OAM_DMA
- c1 i: d; I- }% i - / H8 v6 X8 K' D: v c( A2 {4 ^
- JSR FC_Gamepad_Process;手柄输入处理3 k' `9 ` s; K1 r0 a
- JSR Music_Select_Process;音乐选曲处理
/ y2 h1 k1 S6 q! O' v' Z( R - JSR Music_Play_Process;音乐播放处理
# t; f, z2 E c+ A6 d - 7 W$ g. ~% @3 w2 f: Q
- PLA
% |4 T; C( \7 s5 C - TAY) Y3 J* P4 J7 Y# A/ n3 e. c
- PLA0 u/ H$ ]8 r) `2 ?+ H2 Q& h
- TAX
+ z( b, @; O) _: R - PLA
( ?3 e% s: j W- w0 I( [! Y5 P! z - m9 J3 D, S* j* U2 z. z- k
- RTI( b% a- t) f3 D' o7 {& i
- , y2 X5 R+ d. C) F
- ;======================================================================
1 w- f0 V/ r# j+ Q - ;请求中断处理
& r4 N9 w5 F6 z8 Z& S0 G - Irq_Program: j- Y3 p" O0 y2 L4 c+ { _: x
- RTI* s* L/ N5 g( z+ v) o+ Z* B$ [% n
- 0 B% j4 V7 X2 u
- ;======================================================================5 k) f+ b2 Q3 q! O) R
- ;中断向量表+ v! d, S( Q g& ^
- .ORG $FFFA$ A% d- ?- S7 v& t
- .DW Nmi_Program ;NMI触发时执行$ G2 a- c) r5 S2 y3 U! r
- .DW Reset_Program ;载入ROM时最先执行
7 o3 F0 s# \/ y, J: c0 x3 X - .DW Irq_Program ;IRQ触发时执行6 f/ a3 O. x2 ~' l4 E% Z
复制代码
0 X3 j5 M* z3 b Z# H6 T" {: o8 g0 Y+ m. s* m1 M; {: p# Q
" T6 W6 r/ F5 E( ahttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|