|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下% p7 p7 f: `$ q/ y* w/ X

7 N0 ?* o# h8 X! U以下是主框架代码:
( l( Q) }; T. ]* a, {4 K- ;======================================================================$ h* ]5 \/ l% b
- ;文件头
* W4 {$ J2 G" w9 H* n - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
4 [9 i z0 s2 b+ h( `: W5 B - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量, z3 F4 s1 o, u- u2 P$ m
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
+ ~3 K E$ C8 ?7 h - ;======================================================================
1 X1 l5 t3 p8 j! A* J - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2- }7 X) ]+ {. V1 K( ~
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
. z" |6 J( z# |( E$ t' U! Z% R5 Q - ;======================================================================: o9 o- o/ T9 S" g
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
( N3 [5 w7 s3 W - RESET_ADDR = $E000 ;主程序起始地址5 V6 k9 C8 b. w
- ;======================================================================+ k9 F0 a3 L8 z8 Q$ [1 \
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB/ W9 {' C* I7 a: d! e; G$ j- ~
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB' d3 _( q8 R+ P/ R" k
- .INESMAP 4 ;Mapper号 (0-4095)5 y" m* Q( `8 z& |0 a4 E. J
- .INESSUBMAP 0 ;子Mapper号 (0-15)
% `9 g0 E2 d" Y% q - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)7 m8 G! ]& N5 J5 ?. }; f
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)4 a% P* b7 a& E/ |
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)# d" [8 S& @. W0 ?( {5 l
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)7 G1 R5 ?* z0 i F) e
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)5 F4 K @$ J+ n+ i& C
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
( p' ^3 L5 B& L; F6 V/ t - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)* q; E7 d2 k" A4 f7 P9 E% V$ R
- ;======================================================================3 W/ `& |1 V; n! W$ P9 |$ V1 L
- .INCLUDE "fc_demo_config.asm" ;全局配置. q+ P& X1 t% w% C. f8 Y0 V9 x
- .INCLUDE "fc_demo_constant.asm" ;NES常量
# x4 E7 r& [" ^' ^5 b5 v) v - ;======================================================================! G: F9 I9 D9 N" T
- ;音乐配置' y w" T5 D: _, f3 |
- .IF 0 = MUSIC_THEME . r+ z7 a0 W0 h) b1 O' X7 X
- .INCLUDE "data/music/Gremlin 2/config.asm"
' f C2 b3 d7 V9 f+ v) u$ h7 V4 u - .ENDIF- m6 p0 ?0 j* A7 q6 R, V
-
) x% ^( J) [8 X - .IF 1 = MUSIC_THEME
8 {/ \! C3 ^* U) E* W. ~ - .INCLUDE "data/music/Raf World/config.asm"
. `$ r& X( T( p( H: E; X G - .ENDIF
9 m; ~9 q/ y" f7 H6 Z& H -
" L1 _; R2 S8 I7 n+ U - .IF 2 = MUSIC_THEME
8 y- K$ a# c: t2 I" x y' r - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"! U' d3 k S8 d4 D- A! S% N
- .ENDIF
$ V" P! u# O. r' j4 c
( G( W) ?% |: z- ;======================================================================
; a$ ]; y- @2 G+ S - ;引用CHR图像数据
8 ^! K: c- y, d - .BANK NES_16KB_PRG_SIZE * 2" d) a6 T% R: J# `2 Q
- .ORG $00002 C3 Y: X* w9 R2 X8 x- \/ v ?! j5 {
- .INCBIN "data/bkg.chr"/ {2 e3 K7 A- I8 |
- .INCBIN "data/sp.chr"- V5 u7 a, X. G' x, A' _, a6 R
-
: S& W* F+ R. w - ;======================================================================% r8 w9 z4 z9 O1 a, ~4 Q
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
8 a4 ~% e; G W' E6 u - .ORG RESET_ADDR
+ `: }; [5 k* F9 ^; G4 s - ;======================================================================( H% ^8 O' ]3 Z, ~5 ~6 |6 ?9 j w+ R
- ;引用其他源文件, ~- h3 G7 o" T7 G3 B+ X# V3 n5 C
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
. f4 {% E+ \. P7 B& h" r - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理( g; a1 ^% _& [5 T
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理% L4 K8 W! J. P# J7 v
- ;======================================================================
$ s1 ]( L/ r) m }8 V. q; H" T% k
. Q7 E5 t/ x2 N* L- ;======================================================================# ?) O2 q: X9 N
- ;等待VBlank到来, n0 G) o# v9 b' M
- Wait_For_VBlank0 v+ h" K# ~% ~
- LDA PPU_STATUS
! b }$ L5 X# a; c - BPL Wait_For_VBlank9 F' Y. R1 Z7 ?! [$ ^7 E! z
- RTS
0 s3 u9 O0 L( x# c
8 c, g( h. N+ L' S- ;======================================================================3 o Y$ o; ]+ E; A: B M
- ;调色板初始化, b0 n+ G& x& c) v9 I0 }
- Palette_Init0 F' X2 [" D4 z6 F; d4 X) D0 ?" A
- LDA #$3F# E6 x" c$ f8 ]; C$ Y5 H" h3 P( l
- STA PPU_ADDRESS; @2 P% b6 e* I5 A2 o
- LDA #$00
3 g8 a6 l' Q7 U; g8 t: n! R6 A - STA PPU_ADDRESS
1 z% g/ f# F- @! k, a' x - LDX #$00
x( t8 J2 [/ s; {3 n - LDY #$20" K1 x7 K) y; _3 A/ N9 |
- .Write_Data
9 s2 V: v$ }+ G x! h- c7 {7 w - LDA Palette_Data,X
9 b1 N7 l: i5 i, X5 Q - STA FC_PPU_Pal_Addr,X
/ R: z2 d5 f. x1 p* }& X% I9 y - INX
$ u: C1 t6 x- h7 k7 I" Q1 u* Z - DEY
4 u* ]: t- B. n* m7 ` - BNE .Write_Data
% m- l; Z. s. B3 m4 K3 g - .End
+ U6 `: t( r% g* x$ d2 m - RTS" t* V+ f6 X" s Z/ l
- Z5 y3 R7 z9 ~4 ?7 r( B7 m0 ?- ;----------------------------------------5 j0 o/ x3 j8 T6 P' ~$ f6 d2 `% P
- ;调色板数据, ]( j: c Z, r9 z4 R! E* ]
- Palette_Data4 Z" S! P6 b7 Y4 R1 w6 u
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B; I) e2 W1 ]: l
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22; b5 X% s% E; D! c5 Q' O* O b
-
, x; V/ ?2 p, w- F4 f - ;======================================================================
- E) ]" H( n e) J; ?1 X0 H, o - ;命名表清空
; m q1 H W& |: Q6 z - Nametable_Clear# d, l$ @+ e9 b0 ?1 I4 Z8 X4 b( Z! ^7 I4 H
- LDA #$208 P A2 o0 E* T( x+ S
- STA PPU_ADDRESS' R4 q" a) K# o5 R' \2 K3 y/ t
- LDA #$00
2 j7 k: ^; j, u5 J' k - STA PPU_ADDRESS2 [7 g% {" h7 c8 f
- LDA #$00, o' y% j' K j1 U
- LDX #$002 u3 |0 [* V! i/ l# L
- LDY #$085 r2 w% l' g1 @
- .Write_Data/ T/ a3 C4 V* Q$ r; D% D
- STA PPU_DATA
2 q" x1 G$ d3 u- f s - INX" s+ v5 M- ~! Q- j4 Y
- BNE .Write_Data2 B1 h# Q+ ]0 U0 U. Z
- DEY1 u! p- m; N" N5 [! D1 d
- BNE .Write_Data; d" M) n2 I8 o; b% w1 Y$ L
- .End
0 v2 E% Y5 A+ x3 r - RTS
% p, a3 p; u1 P8 b1 D' K
( y c7 }# a; M7 @$ O) z7 L- ;======================================================================
' E: h8 R- M, T3 ~0 R, q - ;音乐曲目切换9 K+ F4 r8 ]! z1 Q) J
- Music_Select_Process0 U {( p& t. x9 j# \
- 7 \6 o5 }( r2 D2 S, y
- .Pre_Music;上一曲8 ?# D8 A, K1 P4 f* \
- LDA FC_Gamepad_Once
. b/ r" a7 V) I - CMP #JOY_KEY_LEFT
- X- \* [2 U7 @$ V* J: h. k# g' t - BNE .Next_Music
9 S( e- Z7 c% T - JSR Music_Play_Pre' s& t8 F) I% \. T
- .Next_Music;下一曲; |1 z/ R7 z) z: f( K0 I4 R
- LDA FC_Gamepad_Once+ t. ~ E' O$ j7 O
- CMP #JOY_KEY_RIGHT C$ `$ } ?6 z9 k
- BNE .Next_10_Music7 h# F* [1 q: C* s0 F7 r+ e
- JSR Music_Play_Next/ H2 Z! Z1 |3 S9 b5 {* D
- .Next_10_Music;上10曲( R9 b) ^, y" x6 B8 j) n
- LDA FC_Gamepad_Once5 z. ]- F8 O6 d ?2 o) d, ~
- CMP #JOY_KEY_UP% ?) d5 g. H$ v& i5 E. X! f
- BNE .Pre_10_Music6 L8 R( Y( A4 r% g' O* V+ @
- JSR Music_Play_Next_10
/ i6 E. J! I% o/ f - .Pre_10_Music;下10曲: z# p1 u- E0 Z) d9 G6 W9 w7 Q
- LDA FC_Gamepad_Once
, B2 m) s/ Z/ W3 q - CMP #JOY_KEY_DOWN
" E& I0 H1 s6 e5 A: V" c, E - BNE .Reset
- l/ @9 {2 N* Y( \7 r' f w1 o - JSR Music_Play_Pre_105 X" u$ ?6 S! j ^
- .Reset;重播当前曲目
! i: [; c0 J# F' [ - LDA FC_Gamepad_Once
/ a4 ` y5 s2 x* D# q2 ]/ H - CMP #JOY_KEY_START" {' F: |4 I8 D& ~7 Z8 n
- BNE .End
0 G' P9 v8 r: ~- r+ a - LDA FC_Music_Index( Y" g+ i) T5 I) V- t# X
- JSR Music_Init_Process
# \" q/ i6 W1 p* y/ u3 C - .End
# z- Z3 y4 U: E: u5 d) w - RTS
9 j- C) j! g Z1 w6 |
( ]) E, @8 c3 y4 E& x" u, }4 N- ;----------------------------------------------------------------------
- h. @5 Q) ]7 ~8 ~. Z - ;播放上一曲9 q: ]& V/ T; \2 k) t4 W# s
- Music_Play_Pre
7 F! {2 a7 w/ B8 S: X2 y - LDA FC_Music_Index5 D5 P/ w1 ~& |
- BEQ .End
( E7 m* z" w1 m2 y& H h - DEC FC_Music_Index3 a. I( A0 r5 s. h0 X
- LDA FC_Music_Index
* D" q! k9 d3 R$ Z* F+ R4 n" |/ A - JSR Music_Init_Process& w6 u; T* C% A5 e- q
- .End# ~3 R1 _% o& W) a5 A$ z% ?4 ]
- RTS
3 M5 t* O# R( F1 q' q3 N: c# T - ;----------------------------------------------------------------------
0 c2 e. \ l% k6 n4 } - ;播放下一曲" o; q% L" {+ X; [* d! ]3 V* p
- Music_Play_Next
& @% `* s. B) W7 C - LDA FC_Music_Index
1 {$ n, r1 r& P3 \6 c3 a% r - CMP FC_Music_Max_Index, u: x3 E: u8 `
- BCS .End
3 P( L+ {& K2 z. j* S+ T - INC FC_Music_Index& X `8 q" |# ]& u
- LDA FC_Music_Index, m8 m9 X$ I x, O$ @; G
- JSR Music_Init_Process
: m+ i$ k3 l+ {1 J3 P; s# K4 b2 v9 p - .End7 R9 J( x0 i, K8 z
- RTS
" t6 h" B$ ~. g( J! I/ n# ^
8 z. E4 [) ^% G& Z0 a6 g8 ^: d2 }- ;----------------------------------------------------------------------" T) f' X& o5 ]5 x: b- ^' T n5 T8 k/ [& ?
- ;播放上10曲
3 _. Y: p0 s4 @3 t# I' F - Music_Play_Pre_10: ^% \* b+ A t5 s. ?. N! Y
- LDA FC_Music_Index, M9 m8 k/ I8 ]' D& L; i! @7 H
- BEQ .End; h3 ^ i( r8 R; S5 j
- SEC6 G$ ]) m1 Z, R$ Y, @+ N& v( Q6 ?* q
- SBC #10
+ k- b) |& Q( N) y - BCS .Pre_10
; ^. E. T# X. f' K5 p8 ]; d/ L3 D - LDA #$00* |2 y: Q0 d6 v4 ^2 o
- .Pre_10
% m1 a) s9 ~% _# [; G" R' h - STA FC_Music_Index8 b, t0 H6 \. c" v
- JSR Music_Init_Process
+ T" \: r$ l3 v. E - .End6 R% P# w; M% o3 [# r
- RTS; c6 _; s2 u$ F9 P9 K* P- ~
- ;----------------------------------------------------------------------
. N* _$ r L$ |- \$ e. }( K0 J - ;播放下10曲
; \+ U2 V/ _! G# R - Music_Play_Next_10* v0 Y: B. U0 ^% X, }% Y8 _
- LDA FC_Music_Index
8 e, ~' x2 S5 k5 L2 Z) H7 ^ g, \4 v i - CMP FC_Music_Max_Index5 F4 V! G1 M. j* y) o6 y
- BCS .End
+ V# G7 H) [5 S! ~; e# Q5 L - CLC8 f3 X( l M5 s) G
- ADC #10
- p' l3 y9 S6 ?3 ]7 Z - CMP FC_Music_Max_Index
! j! d7 U4 R* i5 |# ] - BCC .Next_10
, B' J3 t. I& M4 _. x& ] - LDA FC_Music_Max_Index
2 R# ]: A( p9 y7 U( C - .Next_10( x% x2 z$ \1 r0 E4 j
- STA FC_Music_Index
+ f/ G! @4 J" w. T - JSR Music_Init_Process
. R6 O& D R3 [ - .End. ^' I$ \( E1 ~7 e4 U( \* {, }
- RTS
0 r3 \* m! z- [/ Q: `, [
Q! @9 c$ K8 X4 p K; @- ;----------------------------------------------------------------------
* j. |) R0 ]" l, N8 W - ;8位十六进制转3位十进制制' }) @* }: a6 B# B$ f1 P: c
- Hex8ToDec% k6 v% b4 ^3 T* J2 Z
- STA FC_Dec_Data_14 {+ s" F( ^$ O: ]8 s- a
- LDA #$00$ w: {% ?5 a( b- I- `- c" Z
- STA FC_Dec_Data_100
6 u. P- a" u8 A - STA FC_Dec_Data_10
4 D* W% o. l! o/ U- ^# l; r9 f# a - LDA FC_Dec_Data_1 e; `. ?1 l& m/ c5 H
- .Convert_100
- e/ _% M7 o8 H0 ]: I' O - CMP #100
# ^6 m! R# Y5 l$ W+ i* a - BCC .Convert_10
, }0 G* d) s3 M- x9 i& a - SEC9 M# p9 t) Q( S$ X( z. K. I9 h
- SBC #1002 j/ G: s8 m4 x! l4 ? `
- INC FC_Dec_Data_100
* K* |- e3 \- [# a# c - BNE .Convert_100
" i" j2 G5 E5 z8 H# I2 K! b9 u2 q - .Convert_10( S$ P' |; [3 T1 S/ F
- CMP #10+ b, s+ K& ~* [1 W3 J" H
- BCC .End& w" c, e" j o7 F/ N; V
- SEC9 d6 m2 K" V. D5 u$ Z
- SBC #10
. x# \. v/ s$ }* r - INC FC_Dec_Data_10' p$ h. i' m% @; p
- BNE .Convert_10
6 h# a( v! _3 X( q( Q - .End
( I# |, Y! l& m0 \ - STA FC_Dec_Data_1
' N, L7 b( s8 y k - RTS0 d2 q6 X/ {+ ^) U
; ?: z r" t# r( e- Y' ^& z- ;----------------------------------------------------------------------) S+ b! R9 v4 y: w( r& O5 {
- ;显示曲目信息 h. U4 l6 _0 I- ^5 u
- Music_Info_Display
. o1 w; G, v) k' Q& g - LDX FC_PPU_Buf_Count
" ~8 J+ b% a+ s' I0 r3 f% @/ H - LDA #PPU_WRITE_MODE_CNT_LINE1 ?/ ?6 w0 [" ]3 f$ G) l
- STA Use_PPU_Buffer,X
9 @8 y' ]) z2 i# y( `% b - INX
! [7 D/ O5 \2 h( |- o- l5 _ - 9 m' A/ L4 S: ~! b
- LDA #>MUSIC_INFO_POS3 q' m! s* A7 D( E. z* J
- STA Use_PPU_Buffer,X
. N8 t7 L, ?" M2 @5 Y# X; f2 {' ^/ e - INX
; z+ N; @ j: B; x4 ` - . R- Z u6 h" ^$ O& e
- ;居中* i0 Q5 L3 j z, [7 L
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
8 \, W2 |0 e/ W2 P - STA Use_PPU_Buffer,X
: m. y0 M) B0 g - INX
1 a! z t" k9 X; h! x6 x -
6 S& _" e' e* R1 P( \4 T - LDA #$05; [1 F* G( d" N# N1 W" w7 m
- STA Use_PPU_Buffer,X
8 `0 l( _" D" l1 N* ~ - INX7 i) e7 c# f( G/ z' E4 G4 ~
- ; O% t9 l% U O7 k8 Q8 Z
- LDA FC_Music_Index# \, o6 }* X7 E
- CLC4 G3 R6 ]# {0 s- @
- ADC #$016 b' [3 t; c' w# `8 ?
- JSR Hex8ToDec
* b9 W7 S5 Q. @6 b. P6 W5 ]2 S -
4 d7 ^- M4 V0 A: O8 @ - LDA FC_Dec_Data_10, s U! h; ^1 p k7 K7 ]4 O8 W
- CLC
/ Y! ]! k1 V: C9 ^ - ADC #'0'
8 j+ j8 [5 o+ T1 ]3 ^, Y - STA Use_PPU_Buffer,X
4 X% u6 j& t: T- j5 w( `3 K0 R - INX; u3 W: S1 ~: W1 e$ q4 T/ s
- : l2 W. y: b( T
- LDA FC_Dec_Data_1: _8 ?7 n% i4 ^5 k9 G# w7 E
- CLC# L" O. F9 B% J: O! M) v
- ADC #'0'
8 ?. [' [- e5 z& { ?1 j) n - STA Use_PPU_Buffer,X
# S7 p# K+ t) t$ I3 a6 F - INX \4 V8 I. g$ _0 D* W
-
) z8 j( m8 r& q s - LDA #'/'5 A: w& b. ^9 K( l$ v
- STA Use_PPU_Buffer,X+ Q$ Y" X! l7 s
- INX4 k8 D4 q! H% Z, g: W0 b0 q ~
-
3 S9 n* j. o' c" j$ n. y - LDA FC_Music_Max_Index
' _; v: K A' @# e3 U7 e- W+ T - CLC8 X/ E+ H2 n. u- C% G
- ADC #$01$ J0 z0 S$ j1 [+ A9 s8 f1 ~0 l6 [
- JSR Hex8ToDec
) d1 v( X3 k8 i$ U -
4 o! B; D9 D4 T9 y7 s: ?; x - LDA FC_Dec_Data_106 {6 R. o, v. I$ r- ]
- CLC
3 B7 _4 ?5 @5 ^! B1 { t - ADC #'0'. N6 d# ]) [; H l
- STA Use_PPU_Buffer,X
+ N" ~6 @0 P" { Z - INX
8 y& s. Z+ `. f0 ` -
4 w7 s7 o9 ?1 U A* m3 ] - LDA FC_Dec_Data_1
6 W& R6 u* w. v/ r6 g - CLC
, i/ a8 N6 i( s/ L; a7 f, {1 @ - ADC #'0'
5 S6 |5 Q% M. j - STA Use_PPU_Buffer,X6 S: ^) j/ k9 b, l
- INX
. H6 Z8 Y/ d& U/ ~+ E1 f - * N% p, V) o6 p
- .End' H4 O4 }8 u3 Y
- STX FC_PPU_Buf_Count
0 q8 g6 ]/ n7 C R - RTS/ }% S& ~/ k+ ^, r% E$ s
- 3 x0 t$ d: \+ v+ Q B
- ;----------------------------------------------------------------------
m9 T8 h2 f4 Y+ H* I - ;音乐曲目初始化处理5 l1 h6 U$ S) u0 R/ C3 `9 ?2 d
- Music_Init_Process% } u/ m1 t( v/ g7 G% R
- PHA1 K0 s# }/ Q' r, j
- JSR Music_Clear_Process
1 W% k1 c: S! s0 k3 M$ V) e: O - LDA #$1F& V0 ?. ~$ N2 ]. B4 X( z
- STA $4015
) K: _2 f1 w# y( T& l6 g - PLA
5 @* ~% f, w1 S$ c w - JSR Music_Init_Addr8 t4 f9 P8 o1 G6 b
- JSR Music_Info_Display
0 ~( @! D8 e0 i' |' u4 n - RTS8 |3 m& n) n1 e! e+ t) Y3 V6 m
3 h! l) Z. L# v; @* ]$ V' m- ;----------------------------------------------------------------------: ~& G+ Z- [2 i/ N! _. [
- ;音乐播放处理1 q* M5 N# G8 A, p; ]' _
- Music_Play_Process
( H# T5 s; Q* r! y! W8 y4 N - JSR Music_Play_Addr
# B. x6 f1 o; | - RTS
9 r+ S+ h0 `; K/ Q6 g( M
! S% u1 _' T9 W, h/ Z5 B- ;----------------------------------------------------------------------1 \ c4 f! Y. t( v8 {
- ;音乐播放处理. e9 C7 {1 B* B
- Music_Clear_Process
% U+ a! b% q% `$ Z6 y2 ~ - .IF Music_Clear_Addr8 I/ J- z, A( T
- JSR Music_Clear_Addr$ [3 h# h/ X- R4 H' u/ ^+ o
- RTS
5 j& T1 T/ m6 `5 ?; K# X: Z7 A - .ELSE: v7 o! \' g R
- LDA #$1F
" A# a+ R! @+ `) [& H2 G$ x - STA $4015
% ^* E. A3 K7 I3 n - LDA #$006 Z3 p. l/ D1 B" D
- STA $4010
/ `: ]5 }" Q8 i1 a# P; B7 X - LDX #$001 h+ |5 n6 `7 U9 [ s
- LDA #$009 A" v0 }3 G' h
-
[3 E" z$ P- k6 K" J' @0 `$ n - .Music_Clear_Zreo_Page_0) X4 g. U2 n0 c$ q# H( o$ }# q
- STA $00,X4 w# j+ s7 |5 `5 ^& u# c
- INX
' ]. r! G4 B% ` - CPX #Use_Zero_Page_Begin# Q c. L7 ?/ @. y) O1 q
- BCC .Music_Clear_Zreo_Page_03 P7 O& o7 X& w+ V
-
$ r& }% c$ p. {7 g$ Q8 j# a - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size( d; R' m) @) u' q
- .Music_Clear_Zreo_Page_1
8 W; U0 h0 }& l - STA $00,X. p$ G5 Y7 x8 e' V
- INX& F. {$ n4 Q {+ Q
- BNE .Music_Clear_Zreo_Page_1' @; y$ T9 e6 }6 g9 L$ P2 i
- & F/ a. @4 F9 `# [" N
- Music_Clear_Process_1
9 `/ |5 Y V! l. c( Y9 S* \ - STA $0600,X0 [. m' K+ [4 D( w; B2 Z- K! c
- STA $0700,X# }/ V9 Z. K/ `/ G# R v d
- INX
9 [$ b, R9 G3 ]+ t1 y" I1 m - BNE Music_Clear_Process_16 }5 I0 I2 r* Y4 s1 B2 w i1 J
- LDA #$10
4 V: i8 L- V2 L6 L6 Z+ b - STA $4000, A* [9 L _' Z0 w' D/ h% G
- STA $4004
: m- k7 H |" f, D6 c - STA $400C
! r' [$ m5 d- K% N+ N: e - LDA #$00
; C! c2 S4 u/ t5 l/ F- x - STA $4008
" W2 t( M( t8 x$ K9 U: J& _ - LDA #$0F
0 m! V9 U# @# P- t - STA $4015
) O8 }7 f' _% ?; j - .ENDIF. r1 j4 `! q* m
-
$ e# j7 O( Y- W& g6 B - RTS
4 V) c% y0 J8 K' o* x! f0 o; e% Q e
; G3 t! v1 {- {, `( N, K0 N- ;======================================================================
3 _9 ?2 m- f* |7 i - ;重启处理0 }$ A0 Y' K3 O4 q
- Reset_Program, K) D* Q: S7 d: Q
- SEI: i2 H# I$ T4 t G
- CLD
0 }/ H5 Y; z1 ? - LDA #$00
) z3 h; d$ L4 v - STA PPU_CTRL# X. _' L4 A2 V i: T3 k2 J w
- STA PPU_MASK g H" W3 [: ^1 ]
- STA JOY2_FRAME
( `" J, S' P# D4 q3 x: u' v - STA APU_STATUS
7 N( o* x1 O4 X8 I, B -
k/ D" X5 }, p. }# X - ;等待屏幕准备完毕
$ f1 f/ }8 @9 z - LDX #$02
4 E& L8 S& |' _/ h) J0 { - .Wait_For_Screen_Ready d, c2 y& s. v8 v Y+ _3 F
- LDA PPU_STATUS6 a# A' T+ V# i
- BPL .Wait_For_Screen_Ready6 ^5 n) B- I! a0 i. T1 ~: Z9 w
- DEX
& U2 B3 O, e. C W - BNE .Wait_For_Screen_Ready z1 b0 @+ L1 b u: C
- ) m1 Z8 `2 c! c/ r: @. s P. i! {9 @
- ;清空调色板
7 G- c2 a' V( G0 G, _! u - Palette_Clear
) N) @& M& v5 G: s - LDA #$3F `1 _" |! v! z3 Z4 w5 P) a
- STA PPU_ADDRESS' P7 S9 l" p( r& J
- LDA #$00- R7 W2 r! |/ G' t' C
- STA PPU_ADDRESS' v" [$ ]' ^0 f' A& S& u
- LDX #$20& F+ P7 M4 x3 v% N% v2 C) k1 T
- LDA #$0F- K5 D7 V N- n; O) i
- .Write_Data
7 X" d& P0 ? a7 o3 Q) N - STA PPU_DATA
0 I) k7 D4 m, v' J' N0 s - DEX
% @, `/ b8 \; \: \ - BNE .Write_Data
" Y! I5 _. Z% c! K - - M8 {( ?+ O, c6 G
- ;清除声音 $4000-40133 n: ?2 h, Q) I" U, z5 r0 D0 k
- LDY #$14
9 v" I# |: _+ ] h - LDX #$00
4 F3 k) k6 ?; y - .Sound_Clear! y4 @5 X+ z+ h- p* t7 ^
- STA $4000,X- d# X3 q G$ U3 I4 G, Y
- INX
( |1 T) o6 A2 \2 f& L - DEY
t7 W% Z8 H5 F1 f - BNE .Sound_Clear
! J& k; H2 F2 r, b# n7 ]8 Y$ N -
6 ` C2 Z" N5 C' l$ G8 j - ;清除 RAM $0000-07FF
% u, ~5 W5 e3 w& W& m6 s _ - LDA #$00" R! r. O/ a0 C) W' S3 g
- STA $00
$ u. }1 A& X# o5 Y - STA $01
, {- p5 I8 \+ h. V$ F - TAY. t1 ~: K F w$ m& l& a6 D6 }# l0 m
- LDX #$08
* I- L. |1 |/ {( O8 s - .Memory_Clear
* h9 ?! Q5 Z. P, g, z: o. P4 @ - STA [$00],Y
1 O4 J$ ^( j+ h! d" o - INY
' h7 x+ b0 K$ i- | - BNE .Memory_Clear
0 p* o1 F, r7 f& w0 ] - INC $01" V% p: R- t4 a7 C- \
- DEX
; M4 b/ m/ Z5 f" k2 K8 i ^' V - BNE .Memory_Clear
$ P8 l8 ?+ f, a - 3 q- k" H, _3 {, D1 l" e9 P1 {! A5 H
- ;精灵缓冲初始化; a# ?5 K! I1 t w
- LDX #$00
7 F$ R" R2 Y- ?2 b. f- D1 D' R7 E - LDA #$F8$ Q# \6 ^" I8 k! F8 \& I) H! ?
- .OAM_Clear! T, {# h2 B( c8 o, q( c* C
- STA OAM_DMA_Buffer,X
( n& S6 H2 t% ^* ]1 p1 H! F - INX- I- U! H! o+ N* a
- BNE .OAM_Clear
4 }4 j0 `8 f, g, s- D# s -
% h4 _$ ^: u9 d" C3 ^8 Y( o - ;栈指针初始化3 ~8 Q; A% E4 }- y; t
- LDX #$FF2 j( c* _; ]! l
- TXS1 n" P0 @2 M# ~5 w, N/ G" t" V
- J8 `5 T5 z$ g1 A
- JSR Nametable_Clear;命名表清空1 j8 l" F5 R# h$ [# g6 ^/ w" q
- JSR Palette_Init;初始化调色板缓冲! ?2 c$ @" i3 y
- JSR Static_Text_Init;初始化静态文本
( |: q# e/ \. N6 { -
2 u1 R6 i$ R: P" P/ M& I% f - LDA #MUSIC_ITEM_TOTAL - 1
* p7 s9 u, \) C! q. T1 l - STA FC_Music_Max_Index7 j0 x9 Y$ H. G( s- p6 v6 D- [
-
+ g* X- g# f& Q - LDA #$1F X7 F& t6 l* ~4 _
- STA APU_STATUS9 x0 I2 q$ e* W, M' L$ c
- LDA #MUSIC_BGM - 1. m* d9 r8 i. L, L
- STA FC_Music_Index
0 B% B c1 i4 Q9 E9 H: q& F - JSR Music_Init_Process;音乐播放! u, ~- m P& z! r( h' E$ }7 s0 p7 H
- . N( H/ @) v" _
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
; P: }: J3 [; q; `' n4 s, M& K - LDA #$1E
# M* ~ _& A) `4 Y+ f3 r - STA FC_PPU_Mask_Buf
% i4 n3 D4 [% W7 F- N6 N* b. w -
8 u; r# ~5 C/ ~/ ] - ;启用NMI处理
* z+ }5 o. H. T, M. d$ P e - LDA #$80
- q, S. h& w* _ - STA PPU_CTRL
, s9 V! O4 Q: l% K( j: Y( v - ( I; {; ~) s8 d
- ;程序循环, 剩余工作交给 NMI 中断处理
! T. j, `' }. r0 V - .Loop2 d7 A4 D( B4 w4 ^; f4 e
- JMP .Loop
. W/ }; N* j0 k% s
4 X' ] i7 H* G4 }& @4 X/ M- ;======================================================================
x. \3 S2 r8 q - ;不可屏蔽中断处理3 X9 b0 o5 Q# Q2 A+ Q: B- J
- Nmi_Program
& |" u! w) U4 v( l - PHA
/ p% K; k$ F; b/ d) U* P - TXA
8 L% S4 `, i! ]6 Y ~& x - PHA
2 ?7 ?1 m) m9 H4 H, d8 r+ a& z - TYA F7 q- {, h+ k
- PHA7 w7 I8 ~: v) H" J4 A
-
# d' k, I* O1 P, ?' e4 E3 p R - LDA PPU_STATUS;读取使得 PPU状态寄存器复位6 }- A* q: k" }! U2 |# _& ]
-
" u6 M' A8 H5 c1 i* o3 l - JSR FC_PPU_Procrss;PPU处理. f( N9 v$ Y7 u4 h
-
) N* Z+ x: F! a8 h - ;精灵内存更新
# ~/ A0 e) e7 V0 l+ q6 h: r - LDA #$00
+ j( O3 _6 g0 i5 a% ^& {0 }2 [ - STA PPU_OAM_ADDR" B. S, O/ b; {+ E( B8 N
- LDA #OAM_DMA_Buffer / $01009 S6 x7 ^+ x, ?% G" k
- STA OAM_DMA
+ ~: k, b! h, q/ E% K - 3 Y* W9 i5 `0 F3 Z. L- i
- JSR FC_Gamepad_Process;手柄输入处理2 X2 o% A- z/ B& k: [
- JSR Music_Select_Process;音乐选曲处理
0 q2 {8 w1 s0 h0 l - JSR Music_Play_Process;音乐播放处理9 L) l- }# L6 l+ n! g
- N3 x/ j4 M" z, d
- PLA
, S9 @6 J- c# z! R% | - TAY7 `& |2 v0 d% V
- PLA
! q" \0 Y8 e- g: ^5 h5 ~ - TAX9 e9 E* j) u8 Z/ m; |
- PLA9 m9 D% }7 {2 \9 X
- 9 F( d7 I9 d2 l8 a
- RTI
; i% w( _3 ~2 l6 I' c
" Q$ p; f& x5 n% j# ]6 x4 P% A4 r5 f- ;======================================================================8 T( i; d, Y: v2 j' \
- ;请求中断处理
/ n1 G# f* P5 p1 B - Irq_Program5 K' P/ W' u+ A0 t- j
- RTI+ ~8 ]! n/ T( Y3 n8 |- ^
; R, B- ?( R/ p4 F- ;======================================================================
, P, h3 [. B; V* k6 e3 i, X - ;中断向量表
& m! K/ t; \, `$ N4 ^; @ - .ORG $FFFA8 Q' r1 m g* H: K; s7 E
- .DW Nmi_Program ;NMI触发时执行
6 I( n' b* R, ?5 r, t( K - .DW Reset_Program ;载入ROM时最先执行
. z7 S% Y. x0 C+ p4 Y! J - .DW Irq_Program ;IRQ触发时执行5 m6 a7 R5 e, H7 j" R% `
复制代码
$ ]& s5 q4 s, g! Y H
! ?5 u( |: f2 [! g3 E" n8 w: m" B' k4 i" F3 q* z1 r. I
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|