|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下+ `9 j: `4 O+ ?3 t: ^5 X

% H, S& }1 ]7 _6 x* u5 j以下是主框架代码:
) |4 s' \- M8 W- ;======================================================================6 z' |: G" |) K6 U
- ;文件头( F0 j% F9 ~% f! n, U
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量) h) o) S3 l/ u, i
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量( Y; @9 W4 V9 z U: g! \
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
( z4 ?, J N! {+ a; }7 G" C; R - ;======================================================================
4 m, U) }8 _7 h; {; g" z - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 20 j3 G, h/ j# y( q. l
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 17 V8 U$ n5 O, r/ ]) R/ ^1 O
- ;======================================================================
* e/ q, V3 \6 v2 c" d8 z - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
Q# o( M; \* w0 _' n/ ?5 T& D: r - RESET_ADDR = $E000 ;主程序起始地址
2 M% K& y" C" V. b - ;======================================================================4 z. I4 j4 L! W( S# R
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
3 F% z3 }& R# c- m7 V! p1 g5 v6 Z - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
3 S, n7 m5 A% g9 w: }3 C ~ - .INESMAP 4 ;Mapper号 (0-4095)' n& ?/ H8 Q. B# h
- .INESSUBMAP 0 ;子Mapper号 (0-15)9 J0 `- c% k( Y* f1 B" A7 A
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
8 l0 Y+ d0 |4 ^$ r - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
3 U# x& i$ L" }' h - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)/ @8 A8 _' z1 r+ K) @. e8 ~
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
@0 u; i a0 P+ W$ \: y6 z - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
7 k) s; O" i2 t; D4 e - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
+ C2 l( D: ~* q7 {0 ` - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
; `) n2 z" e3 a3 t; ` - ;======================================================================
! b3 J! u! b4 M5 v. z) X* ? - .INCLUDE "fc_demo_config.asm" ;全局配置
Z3 T$ N' F! s; z4 \' k H - .INCLUDE "fc_demo_constant.asm" ;NES常量
1 k2 K+ s; m0 v8 _ - ;======================================================================
/ p% Q8 L w0 {3 u/ s" P, ` - ;音乐配置
5 O) |4 U+ j- \0 [% L5 S6 t3 u - .IF 0 = MUSIC_THEME 4 C- G. I: m: z$ s- K: v
- .INCLUDE "data/music/Gremlin 2/config.asm"2 I/ t0 J7 G$ I
- .ENDIF
/ t9 z, ]: w# R, A2 |$ q& r" j -
$ H, s- N0 x: _% e. ]/ C9 C, n - .IF 1 = MUSIC_THEME3 R1 x6 M; y3 C8 D4 t0 ^( _. ~
- .INCLUDE "data/music/Raf World/config.asm"
. m2 M5 S) I/ E% `7 j - .ENDIF) N* S( L" @ Z3 Y
- : W- |/ b5 O8 ], h. J
- .IF 2 = MUSIC_THEME
/ L% M6 d- c, Q2 N+ _, W* r' }% t - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
9 j1 \# y9 m, Q - .ENDIF
) O9 f9 J! K: j4 }
6 W: Y [1 q7 ]# o! f' N3 h- ;======================================================================5 ~- ?5 @8 ~9 x! s0 `1 { o
- ;引用CHR图像数据/ y. s2 T/ F$ J# k
- .BANK NES_16KB_PRG_SIZE * 2
; n6 Y4 v9 S( f) \# a" k! v - .ORG $00008 D: q. J9 g, } D9 W% j
- .INCBIN "data/bkg.chr". c! j$ Z, c7 r4 Z( ?6 M% I
- .INCBIN "data/sp.chr"
% ~. m+ l+ Y+ Y, Y% O s$ V, d -
0 l+ ]# B; R! Y - ;======================================================================
) s5 k* S% J6 a. x( i% d4 q - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank% Q3 Y( Q5 }( T! [5 _( Q0 b- }
- .ORG RESET_ADDR
0 H! A2 W9 f5 G/ h" j- v5 _ - ;======================================================================
6 f5 M( y2 n' L2 }& g- y5 L. t8 ` - ;引用其他源文件! _. O. f8 [: G0 e4 z
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
E" U# l5 m( [7 E# w7 K* u - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
. c# C7 c% ]- \$ `1 d5 `( n- K9 X+ P - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理2 N) e8 y! G+ l3 O: m6 f8 Y
- ;====================================================================== @- ~8 ^9 x( q0 d# U
+ \1 Z' y# B5 K7 X. [: M- I- ;======================================================================
5 T0 r0 A/ C7 U* v - ;等待VBlank到来- x- p5 p, v6 |; X
- Wait_For_VBlank
) [+ J' l0 G& R) D. x - LDA PPU_STATUS
9 Q' ?- U$ o$ q% C5 d* S - BPL Wait_For_VBlank
0 V K) g8 t7 R5 L0 \ a4 v- Y - RTS
# Z8 j! g* D, D, f" y+ G" w. {1 c6 f - 2 T _# i0 U4 t0 N, e7 T
- ;======================================================================
4 x* |: Q1 E; F+ T - ;调色板初始化* }9 ]; V6 Q+ G, z& o3 w2 t1 U
- Palette_Init. K' u! L% h! M K( u2 C/ ~
- LDA #$3F4 ?% z& p6 ~* o: N4 C
- STA PPU_ADDRESS' f0 D+ `/ D6 l0 V# }
- LDA #$00
( w8 X# N5 b5 L, v S* }0 i3 ^ - STA PPU_ADDRESS: H, W- L1 S- b1 A7 Q% P
- LDX #$00. b, Z& ?# f" H
- LDY #$20 u' d, L p% r8 j3 H L
- .Write_Data
! @ x" q; c& B8 D7 m) C7 U - LDA Palette_Data,X
2 n4 w. |. W* K6 G - STA FC_PPU_Pal_Addr,X
& d* }: Y6 ` M- l: w - INX# [5 P8 U8 l7 h
- DEY4 T$ J2 ^: v% d/ i6 x# J/ O' j
- BNE .Write_Data
2 l) k& E! G, z4 h4 g# E - .End. @! {6 C6 | Y
- RTS7 @3 ^, z7 e0 h. d4 p
- $ w V' }% o$ U# i: l
- ;----------------------------------------
+ a) a1 y+ q8 H# D$ W2 [" Z - ;调色板数据
. t$ d, y- R5 M4 s' L9 ^ - Palette_Data8 P3 d% W/ X. [% l$ q* v" a
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
3 u+ ^6 w8 }5 ^+ [7 @ X; o: ?9 p - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
5 m; f C C4 Z* h; l' o f7 ? -
# m$ F: m9 W" ^1 q5 I - ;======================================================================0 C% Z e! z2 q4 _
- ;命名表清空
" p3 n5 k) L: i- n1 z o+ d - Nametable_Clear
% O+ a1 \& q+ f( n- V! L - LDA #$20
! M" A% H( _7 g8 N - STA PPU_ADDRESS
% }4 v3 O. o8 z% D7 B - LDA #$00% h* K L: L( [1 }# C* L
- STA PPU_ADDRESS
' v) H$ z+ e! y% _, ]0 } - LDA #$00
" g4 v$ o# | m& x3 m t' D - LDX #$003 k( l( }) J8 y( t$ T1 ~
- LDY #$08( G9 j- H0 r* E9 Q0 L
- .Write_Data! G: y6 b( {. U0 e7 i" X
- STA PPU_DATA) C/ Z. j t1 |: a6 U' L( | B' \
- INX
I5 p5 m# m3 S# \ - BNE .Write_Data! F& Y( N, L ~) J% \
- DEY
( r4 ^6 ?' v8 ?1 A: ?! M) F: W - BNE .Write_Data. h! G+ a/ {/ S' ^$ O9 r
- .End- C; [1 A/ _, D2 E: X1 {! d$ W& t
- RTS
( i# l0 ~ K, _* U6 n, a
8 V! a3 a# V u! h- ;======================================================================
6 X+ k) M: `# f7 Z$ ^( ^0 V - ;音乐曲目切换
; Z0 m8 e# h1 W8 T" P - Music_Select_Process7 e& K0 F; \. @
- 1 ?& e9 O, f7 K9 v; y! W
- .Pre_Music;上一曲
% D( K7 E- p% x" F, L - LDA FC_Gamepad_Once
4 X2 E2 z0 L5 X9 k! i7 K% y - CMP #JOY_KEY_LEFT! w/ @& O, F% t
- BNE .Next_Music- h. u5 J" H( `( i8 r8 \
- JSR Music_Play_Pre
& ~) l" g7 f8 R& G& J: M, D - .Next_Music;下一曲
0 V) m0 Y% `" b) ` - LDA FC_Gamepad_Once r Q m! D; g. l" D
- CMP #JOY_KEY_RIGHT
* Y7 I6 a0 S4 {: d- r* z* @ - BNE .Next_10_Music
" r. h9 B. k' I) ]2 V4 _ - JSR Music_Play_Next
0 t* O }9 o* j9 X9 O - .Next_10_Music;上10曲' \8 F9 V; v* \' U" e: h/ k
- LDA FC_Gamepad_Once; O' f( c: p1 o& T$ j2 [* q& q# ]6 D
- CMP #JOY_KEY_UP
! `) L, E3 c1 n& J6 R/ W - BNE .Pre_10_Music
% |6 u" O' b8 p0 _3 G$ y$ K; a# A0 q1 k. Q - JSR Music_Play_Next_10
/ B3 q" u3 s' R/ ^ - .Pre_10_Music;下10曲
; ?$ |3 H& ^" ~1 D: q; o" t - LDA FC_Gamepad_Once6 J: X" w6 h0 o2 _5 W8 @
- CMP #JOY_KEY_DOWN
% }7 ~+ q8 j, M3 r2 {; d( E+ _ - BNE .Reset: P9 U6 Y y3 E2 }! n+ W
- JSR Music_Play_Pre_10
1 I( x. p7 y. v( ]$ F" s. i - .Reset;重播当前曲目
; Q2 b& U# M3 N4 }: { - LDA FC_Gamepad_Once2 E b' y! `) ]( ~* [
- CMP #JOY_KEY_START8 |6 f* j' D: X6 x. x
- BNE .End
0 w# N7 s5 p6 O j! ^9 n. [ - LDA FC_Music_Index
; p' t$ U+ P; B6 n: U+ n* n - JSR Music_Init_Process. j7 G1 p: C6 ^) C9 p5 k
- .End- Y2 K4 ]$ _4 d+ y: K* P3 U5 B% L
- RTS
1 n. X9 P% [8 Q$ f! M; s9 z# Q. Y - 4 h, b2 w% T d& h
- ;----------------------------------------------------------------------
4 K; d2 R1 l9 i; P9 x' P - ;播放上一曲( G& I/ @0 Z! l! Z
- Music_Play_Pre! M( w7 M4 C9 B' V7 u
- LDA FC_Music_Index
3 y8 W/ i9 v6 u+ Y3 C" O - BEQ .End4 d/ k* r" J) w1 [% Z8 m1 x* W
- DEC FC_Music_Index, L0 s( J9 V% U; f6 O$ o; u7 P, z
- LDA FC_Music_Index
- O: M' U: }# X" k4 ~: m+ ? - JSR Music_Init_Process Q: G I$ b5 k9 o2 @
- .End
! G+ N0 m# P4 t - RTS$ e1 C2 C! C# i
- ;----------------------------------------------------------------------5 _7 \# G) o8 Y& L5 R
- ;播放下一曲
$ U0 X+ u! l. V& v - Music_Play_Next' g3 y" y/ O6 Z5 D
- LDA FC_Music_Index. z* P. ~! |3 }1 ?6 v9 u
- CMP FC_Music_Max_Index4 m Q8 ~$ ~) s. w8 A" A& q: m$ u {
- BCS .End4 X( |7 k4 Z" ^8 l# _: C
- INC FC_Music_Index" I- u9 ]! o6 x7 R% O% p
- LDA FC_Music_Index
3 C$ M/ H$ o: s' A - JSR Music_Init_Process# \2 R- E/ ?! V w: c
- .End
+ V$ r# d" U% m L6 g& I9 c - RTS) k& q7 o% b8 i( N
- 2 k2 e |6 @1 [2 s2 |, ]4 _* T0 G
- ;----------------------------------------------------------------------- y- c/ N" s" x. M. m
- ;播放上10曲
) v1 m3 o( N% q2 R: b9 D - Music_Play_Pre_10
! I5 L/ T/ e- z8 } - LDA FC_Music_Index! W0 U- @# D: E
- BEQ .End
% T. H6 l6 W( j: y - SEC
$ ]9 C; O, k0 u* g- n8 b8 v2 @ - SBC #10& N, @& a& H0 m8 J8 V* e
- BCS .Pre_102 x( v1 K) K5 \
- LDA #$00
6 a; [5 f$ w+ Y. x) M9 ] - .Pre_10
/ u2 S# x* J @. U4 q7 u) J - STA FC_Music_Index
: q$ d$ @# x1 z! \# U" c - JSR Music_Init_Process, b; F, F n' I# q8 V$ r
- .End
( ]8 ~3 F. E3 H- F) @ - RTS+ U- A" S& v0 v% |/ }# {
- ;----------------------------------------------------------------------
. x4 j( _7 t4 d/ m S0 I - ;播放下10曲* O2 Z* O5 i- ?7 q5 y) K$ n
- Music_Play_Next_10
4 W- c M, x7 {/ ?* { - LDA FC_Music_Index4 Q! E( n1 w2 @* E% c; T! X
- CMP FC_Music_Max_Index M: n, Y6 @, E' {: |) p
- BCS .End; r$ b+ j/ ]4 ]
- CLC
6 K+ L: J, N- }6 h - ADC #10
7 ~# d- n) }! d6 U9 ? - CMP FC_Music_Max_Index. P( L, t i$ M3 i
- BCC .Next_10
& q/ l8 u" Q* t; _0 r - LDA FC_Music_Max_Index
/ j0 w8 A# }! k" _4 B- e/ ~3 J- u7 G - .Next_103 A: Z) i# H: B5 M
- STA FC_Music_Index- O! J! \6 I' f
- JSR Music_Init_Process
- `" D! f) L* o: `% h' y4 S+ m - .End) v; [: {$ k/ x9 k1 p- a# k% s7 z
- RTS
- x& p! m3 w, u( c: ~1 n
& p! {; L8 w4 {4 H7 k$ U/ P8 \- ;----------------------------------------------------------------------
. H/ O7 J6 z* y( ~- g) V - ;8位十六进制转3位十进制制2 B& K' ?2 s% F
- Hex8ToDec
, |* p* B4 F3 B2 G" n - STA FC_Dec_Data_1( G; C$ h0 m! D" {- |) A
- LDA #$00
2 a* w! P/ B$ E& X& F+ v - STA FC_Dec_Data_100. ?+ V' b/ U. G0 J% ^
- STA FC_Dec_Data_103 T: m, K6 u$ @4 G7 ~' I
- LDA FC_Dec_Data_1: @' x* r. V* P( B6 @7 W8 w1 |& N
- .Convert_100
1 l+ b: x- a; \5 s8 v+ f - CMP #1002 Z/ c1 F; _2 k
- BCC .Convert_10
: P4 h( B, Y) }9 J0 _" ^4 f - SEC0 i; e E) v1 q v/ }5 G% u( k
- SBC #100
: h, o7 a0 Y& _, [, K - INC FC_Dec_Data_100% r( [, A+ o5 G
- BNE .Convert_100: I3 X; A+ c2 \% U1 h
- .Convert_10
% Z% Y, B1 w# e7 I% n - CMP #105 |7 E5 O3 O. Z1 }" R
- BCC .End
& Y5 G4 A, r) Z) w* |- O - SEC3 ]$ c" G- o' i% G
- SBC #103 S4 S( C8 h" Q* j% s% i) ?
- INC FC_Dec_Data_100 b& a& C7 r3 l _
- BNE .Convert_109 _. W4 H! R6 D5 B Z. m
- .End9 y! f) E" T+ K2 [2 m$ U
- STA FC_Dec_Data_1) {2 F/ ]5 o: G
- RTS& T. H1 `1 o4 x8 ~' o% Q
! W4 t3 k4 U0 y, K V/ o& I- ;----------------------------------------------------------------------. _, b, c9 w2 n$ a2 ?4 P3 p5 ]
- ;显示曲目信息
( _5 P9 {9 b" ~ s3 K - Music_Info_Display
- F1 M( L' g6 U! \" ], O - LDX FC_PPU_Buf_Count
% M, D( `2 c4 D( y - LDA #PPU_WRITE_MODE_CNT_LINE
, c _8 B( a$ W - STA Use_PPU_Buffer,X
( S4 l8 \# h8 z2 o" i- ~' | - INX
! O9 B4 Q8 p z8 m9 C7 Z& A - 7 ?: ~, G0 f/ J) a# k4 B8 D* ?
- LDA #>MUSIC_INFO_POS
0 Z# l* p9 A l1 _/ M0 T - STA Use_PPU_Buffer,X3 T& p8 P" Q8 g
- INX
3 g" `+ l# X1 T9 U - " h6 p# f0 O" y% K7 Y4 B
- ;居中: l8 o& @* g' J8 h! X
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/25 \2 c' A0 O; d; r; g
- STA Use_PPU_Buffer,X
9 L) Q; h4 r/ O - INX( T8 W: m2 }2 ]
-
& \; g, g- p6 k8 q) } - LDA #$055 \7 t* l8 G( O. M
- STA Use_PPU_Buffer,X
* B0 ]8 i0 @2 W }7 r - INX0 G1 K' b- h; A& d2 F
- 7 x" r4 E6 |9 J# X% B
- LDA FC_Music_Index
1 Q( Q w( t. Y9 l& v - CLC
" U3 T5 e* ^6 G. q4 q, V2 p - ADC #$01
! }& O; y& b8 m c6 z - JSR Hex8ToDec
/ S2 b( q; s. e - ' R) J7 k' Y `* ^$ H8 {, ^" R
- LDA FC_Dec_Data_108 ~$ t( u+ J W9 Z h
- CLC3 V- W1 H+ |' m
- ADC #'0'
; O5 P' s# e/ k2 O7 }" q0 c+ c - STA Use_PPU_Buffer,X8 q! X9 p( s, T5 B+ T; T- ^* M
- INX
+ W9 G8 v2 o0 [# @: Q$ U - # m' R9 W- I) Q, [, d
- LDA FC_Dec_Data_1
5 g8 K, Y) ^% S6 S, y0 K - CLC
& Q4 ?' b- E) g! C: v. ] - ADC #'0'
6 ]2 D1 q" |# V, V) y - STA Use_PPU_Buffer,X }9 f& ~- I. w/ J+ \/ O$ e
- INX
3 g8 ~4 V( E) ?/ p4 j& ` - 2 e7 r# ~# ^& w" G
- LDA #'/'
9 @/ U& I% h" t. @ - STA Use_PPU_Buffer,X3 e" z: m3 D, _5 q8 E3 i
- INX. w G! V' ^& `0 ?. ]4 r1 _1 r2 `
- ( L4 G: }2 T X j
- LDA FC_Music_Max_Index, d9 ] X$ ^7 c# ^. f! p0 Q
- CLC
( k1 [( [( ?9 D3 i# @% n. | - ADC #$01
: b4 A9 ~1 \5 }8 x3 J' S; s8 c - JSR Hex8ToDec
5 U. G( e2 S, K4 y0 F6 v& y - 2 b( W H7 `3 ~! o" p# Y
- LDA FC_Dec_Data_10
- ^# K, G9 N5 ^) z4 b/ e7 O o - CLC1 G v6 ^6 H+ v" U* [
- ADC #'0'
$ t/ F3 X# |3 j$ a - STA Use_PPU_Buffer,X
+ i& \% T4 G4 W - INX
; x2 w7 M) e- H! D+ w5 G( J" Z% i9 P$ I - : R3 _$ x+ |+ a" v7 K3 j, T# S$ G
- LDA FC_Dec_Data_1
' O+ {. A4 }: V$ x( V, G- n - CLC
7 |4 }' r: A4 l8 r: s+ `( t - ADC #'0'8 a5 g3 s6 V9 |* K0 d8 P) [
- STA Use_PPU_Buffer,X, [& J% ?) Z* z C9 V4 M0 i9 q; p
- INX
( t7 y% X' _5 v0 `3 ]7 Y* `4 T - ; F& l; | Q2 e/ ?
- .End! ^( d e; J/ y. t
- STX FC_PPU_Buf_Count
' [$ d1 f& [% D7 y! l - RTS
6 X7 c% D& d! q, f; W) Q+ a - : }7 B: E9 R3 I" _
- ;----------------------------------------------------------------------
3 L& f$ ~. u1 c - ;音乐曲目初始化处理2 z7 k/ T1 w0 d4 C
- Music_Init_Process
# `% `8 s$ R! y, Q - PHA8 y! r- z& j7 L* ^$ o: n m* |) j
- JSR Music_Clear_Process9 i. x0 | u0 k* ^. D, |( ^- Z
- LDA #$1F
- o4 j" v$ F) y5 t g" b - STA $4015
# u0 G; V$ x% R' U1 ]. O - PLA* ]# o/ p0 \' o& N. H
- JSR Music_Init_Addr" @* W6 \4 D1 s- x8 V6 h% o
- JSR Music_Info_Display
$ W" ~) B2 {8 B - RTS
* G* D/ c* i& O% x
0 P5 y2 d- ?% B# z( L- ;----------------------------------------------------------------------
7 F$ F, @, L6 Y, C9 J5 n- K - ;音乐播放处理
# I7 Z( }, L; G( [9 F - Music_Play_Process
6 f8 y( ~* q+ q( N7 @9 ^8 q4 R - JSR Music_Play_Addr9 M+ \ s. X0 C6 \; q. c+ J" U- p
- RTS
. _$ f& n. z: ^! h - % _% [+ l3 o5 [9 i l
- ;----------------------------------------------------------------------5 [2 P0 d, [$ B2 i; g2 @
- ;音乐播放处理' F! G V1 c) C4 V/ m- }
- Music_Clear_Process
( D& S* H) u: \" p0 i4 Y1 g" L - .IF Music_Clear_Addr
2 j5 t, G( F, W5 Z - JSR Music_Clear_Addr0 n/ _! G6 K: o( R3 z
- RTS
+ z$ j: S- r8 c$ l: Z0 F' H - .ELSE
$ v* W8 o" R( `3 S/ r - LDA #$1F4 [: K9 Z' p; }/ [
- STA $4015" j' n5 h+ v2 ]4 Z- G" J
- LDA #$000 R- Q! \0 c2 K5 M/ P0 B# m
- STA $4010
1 n: S( B+ f$ S2 W$ W/ i8 T$ \4 c! l U - LDX #$00; l# ^; S; s- e( z* i' \& o
- LDA #$007 {+ O( K+ @3 C1 B2 |- \
- K5 v9 s- L5 H" F8 g" S$ x
- .Music_Clear_Zreo_Page_02 P7 a: a- Z; l" F! E0 Y6 [3 z
- STA $00,X
3 N1 L- q, G' s1 b/ G% F - INX+ C1 ]% r3 d& ?0 }! ^5 y* U0 K
- CPX #Use_Zero_Page_Begin4 i+ ? q. r: g$ l+ y2 d
- BCC .Music_Clear_Zreo_Page_08 g: `" D4 q* K, C1 J
- # H$ B3 G" x# ~: i2 j/ ^
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
- S9 H& W* N8 u+ |3 c3 g - .Music_Clear_Zreo_Page_1% O2 X2 |3 w1 H* q- T/ V
- STA $00,X9 Y. w& _. B" k' P0 u3 v8 A" H
- INX, C8 n# h% y% h
- BNE .Music_Clear_Zreo_Page_1, A" z0 K+ _, W% L$ ~& ~! l e
-
- e' p8 M7 `2 g: ~& O( n: S - Music_Clear_Process_1- q% q/ Z8 O1 a' ]
- STA $0600,X
0 d8 z: }% i! D3 C; C9 T - STA $0700,X
; X x" |- B: B - INX/ _, D& i: ` b8 _6 n$ g" j$ q
- BNE Music_Clear_Process_10 @' G3 t1 I$ B6 P8 h8 @, p$ J
- LDA #$10
8 v5 h1 W, l! p+ [ - STA $4000
0 n- k( `- O$ W" g7 U - STA $4004
& B! h4 A# g8 G* f. D; E4 I: R( a, X - STA $400C
# Y; p4 P/ D g( i! }! h5 F4 ~/ p! c - LDA #$00, F7 i8 h. e: x I7 Z d
- STA $40085 i7 l# A+ e" m: z3 D
- LDA #$0F
0 b4 C/ r k3 `. g; N - STA $4015
3 t; {8 ^: @) a( y9 S" ? - .ENDIF/ Z' k7 A- ]# E5 j1 X4 v- z
- - j0 @. V7 _8 _4 E/ D0 |" Z O; d
- RTS
9 k6 R/ S# }' ]5 s
6 `/ I: p! G0 Y7 z2 |9 s& `- ;======================================================================( {# }) \7 f% T% M$ P
- ;重启处理& L2 n0 f2 z' [! A# V1 u8 m
- Reset_Program' ?/ x* i2 @! d, P" y8 w
- SEI
: Y6 w/ R7 \! a - CLD0 X" b/ m' Q( Y# w
- LDA #$00 q3 C; ?) O! t- G: r
- STA PPU_CTRL
% S/ Q) u4 n/ K9 U) c - STA PPU_MASK
9 u# }, ]. I8 @4 b8 c5 h; r - STA JOY2_FRAME: n; B* ?: D1 B& S* w- i
- STA APU_STATUS5 B- d! f/ E6 r9 }% w5 g8 P
-
. _( Q' j! \2 W" j4 i; _ - ;等待屏幕准备完毕6 i" K0 f; h) K9 N7 O+ ~/ ]
- LDX #$02
3 F l3 k$ l1 M4 f - .Wait_For_Screen_Ready
/ [# W9 y6 q6 d1 M - LDA PPU_STATUS
# O- g8 o! ]1 M1 G1 P Q - BPL .Wait_For_Screen_Ready
" W3 E; |$ j& j& N - DEX
; W9 }3 Y6 X4 f - BNE .Wait_For_Screen_Ready
7 `# N4 {4 _& E9 W) N - 1 ~ }& E1 S- b
- ;清空调色板- _0 J+ Y- P6 y2 z0 `
- Palette_Clear
! d/ r/ Y/ x4 g: ~* s* f+ Z - LDA #$3F! u' I! q K7 g& d$ \; O* M! { O
- STA PPU_ADDRESS- a' g3 V* H3 l, [7 p" b H3 @
- LDA #$00
2 S0 M2 B+ z8 `1 i; N - STA PPU_ADDRESS
. `, E% H/ U0 E - LDX #$209 K6 b/ C/ d' s# E
- LDA #$0F5 Z& m, {& |8 d( s& Y9 X1 _6 E4 I
- .Write_Data! F, S( o! ]/ @" d. A
- STA PPU_DATA1 O. J: `$ O- e9 n+ T! \
- DEX
! r: \( h* w% K- ]- }; n - BNE .Write_Data! U P2 N Z% B4 A4 J
- - S+ F- v! n ~
- ;清除声音 $4000-4013
$ F' T9 L2 ]' l - LDY #$14% Q* q4 m' n6 J1 j, O' M. L3 w8 Y* i
- LDX #$00# Y1 r% p5 @3 b) t+ \
- .Sound_Clear
u8 Z. |( B( h4 X' } - STA $4000,X3 D2 d B8 p1 A* N, C
- INX
h$ n& B3 r. `" d, M - DEY# v" i, X) x3 @5 u
- BNE .Sound_Clear- ~5 s3 w3 m' }) H* ?" s/ C
- 9 O6 `" N. R% H3 `8 E6 M1 \
- ;清除 RAM $0000-07FF
. o8 \, E! y! q9 x - LDA #$00
% W9 U, x4 n4 p6 P, ^, A: V! h - STA $000 N9 K0 z0 w N7 k! B" Y8 w
- STA $018 w3 k7 X6 A$ [! ~8 s) f# Q
- TAY
2 v5 {! r/ n$ Y: r) ?9 c - LDX #$083 `) p1 _0 j$ v- M- |" F
- .Memory_Clear P) o+ s5 @. t H! {9 z
- STA [$00],Y
; ~3 H. [. P+ e - INY, A! q% A# V# F/ S! H7 ]/ l
- BNE .Memory_Clear- I7 q z p7 A+ I" V
- INC $01
. O' E; I# g; m - DEX3 C. v- e' c. Q2 H1 ~- N- \
- BNE .Memory_Clear
& K/ z3 J4 C' R - ( }' n- V9 E) Z
- ;精灵缓冲初始化
% _2 A: H# o! O' z9 n - LDX #$00
9 f: `/ l5 X8 }5 W, c" }8 y - LDA #$F8
& c5 u* k( H$ q3 R/ `' g - .OAM_Clear
& y) }: Q, q/ `6 I( b& ]- X, {# t - STA OAM_DMA_Buffer,X
' `! W x0 r, O4 C - INX
% M- z. X- G, A7 Q9 H - BNE .OAM_Clear
! E& g% w% \, Y - 1 Z. @& f( k2 i: p+ g! X& J; B
- ;栈指针初始化0 A* l2 K/ ]) p+ ?) Q2 Y3 |
- LDX #$FF
: N8 L2 D2 z6 s! t0 \ - TXS3 M( U* I' D* G% O9 D
- 4 ?- O" s3 z% g2 S8 C3 i7 g
- JSR Nametable_Clear;命名表清空2 t, q0 N! G6 Y5 }7 X: y' Q+ ~- }
- JSR Palette_Init;初始化调色板缓冲
: `9 c- z3 N. \/ V1 E/ ^& s9 v - JSR Static_Text_Init;初始化静态文本1 ~; f' N2 b U \/ i( I2 e0 g
- & T' Y' F3 U# a- Q
- LDA #MUSIC_ITEM_TOTAL - 1/ R& T% P5 C4 C
- STA FC_Music_Max_Index% q! Q* O0 @: s% R0 j( A
- 8 r9 K. v) }0 k8 ]$ ] Q5 W8 e
- LDA #$1F3 c( z/ D" f; q
- STA APU_STATUS
3 ?4 y y7 n+ K) J - LDA #MUSIC_BGM - 1
7 ?) n0 u6 k: [& m( p, E/ ~, g - STA FC_Music_Index
' x3 s' z: z9 R* f - JSR Music_Init_Process;音乐播放
% o1 u+ f' a7 [5 M; | -
$ k( L* V/ t2 [; f - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)( ^( k$ l; T! g) z9 b/ ?
- LDA #$1E
7 B! X2 e8 {" ` - STA FC_PPU_Mask_Buf1 j0 }2 d- c9 M( M2 y
-
+ [! A# v: K, U5 c - ;启用NMI处理
- W! z2 `) @2 B - LDA #$80
* ?: r' w# [. K" ~2 g6 o5 L( u$ x6 B - STA PPU_CTRL
' O4 ~# R% A4 c7 @& V& U -
. X5 k& i5 e g8 q) I, I, _9 L - ;程序循环, 剩余工作交给 NMI 中断处理' ]4 E3 Z: e' e2 ]4 L6 {" C' G
- .Loop) G2 B- W, q( C+ i3 H5 a4 W( F
- JMP .Loop
, C/ g. }4 }" o& _* [' I
- n5 _ A0 x q! F. f: Q* |1 J* e- ;======================================================================
6 Y% |5 O* A8 k - ;不可屏蔽中断处理
$ f6 E; g/ D F' M: g" s( Q/ c/ ^# y - Nmi_Program. g$ A7 W" x) [! v' v
- PHA9 K( k) f- B6 K) y! g, M
- TXA
2 W) u9 r7 Y( k! W, y' K- k - PHA0 y5 {3 [' m$ l" q( _% M
- TYA
$ x" [4 r4 d& _6 o' p - PHA
! h9 D2 c3 G8 y7 _$ H -
+ S0 H4 G) t9 U0 q4 s# G - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
0 g+ L/ G" y% v6 L; t0 r% b -
2 \4 M; B5 b8 r - JSR FC_PPU_Procrss;PPU处理
$ E+ [ p6 ?( C0 Y - - P" T' ?, ]( o, M
- ;精灵内存更新/ F* [( F2 Q. T
- LDA #$00
6 W. A, m9 c, Q Q, q6 I. Z - STA PPU_OAM_ADDR
$ }2 d' _6 O6 H# ]! \# j0 w - LDA #OAM_DMA_Buffer / $01009 I5 Z. _7 v7 l7 w1 B
- STA OAM_DMA
' p, J0 ^. m& [& | -
9 ?9 v7 b" }# J9 C" `7 J - JSR FC_Gamepad_Process;手柄输入处理4 x+ B4 u5 X. N ?
- JSR Music_Select_Process;音乐选曲处理* I: R/ ^! h6 L3 h, `
- JSR Music_Play_Process;音乐播放处理
% N: Q, ^5 x: b -
( h! J1 `- X, ~5 P; a }; y, ^" Q - PLA/ A* h5 X* P: J: X4 x, e4 L( U
- TAY; X* i) r$ f2 ~2 A
- PLA
; L( [1 P) M7 F2 Z1 W - TAX8 x" ?8 `2 X" J# C+ u0 `# I
- PLA
. O* v. |. Z/ S# `4 o - & p e; H! r6 J
- RTI
" t" w/ ]5 v3 M4 D- n/ \; ~ t - . B( }3 p- ]9 l/ D$ @; J' i: b
- ;======================================================================
# E' u% A7 y2 g# L: |1 Z+ H - ;请求中断处理, l2 t3 g$ n4 }: |6 B
- Irq_Program
D( | Q/ g) M4 I3 o5 J - RTI
7 }' P: p$ E! V" q+ j: P2 Z" c
: U; J8 _7 r6 Y2 g0 c- ;======================================================================, p5 `3 Y# P0 R2 q W1 _! Y
- ;中断向量表
8 d: z9 L! ` ` G M2 O, R - .ORG $FFFA
) R% _. c0 K) m8 M$ C3 K% n - .DW Nmi_Program ;NMI触发时执行5 F# g `8 h9 ~. w' [" l9 G% U
- .DW Reset_Program ;载入ROM时最先执行: D7 ~- Z* S/ W+ N" T/ v
- .DW Irq_Program ;IRQ触发时执行. r! H* E% R8 M. o8 w5 Q0 Z
复制代码
9 R" m$ j. v6 U2 g6 c" m. E, i
, O) Y( p( ]8 S$ l% R; z8 u+ S& Q! E
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|