|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下: {5 e4 ]* H/ @# p7 \: \1 P' U' w

1 ]# Z3 m+ S3 X1 `以下是主框架代码:
. j: w; R' T0 k+ s) |+ V- ;======================================================================
- Q/ g1 l; O% w! f- F7 w0 q, _8 c - ;文件头3 S; @0 A2 W8 ?6 j) _2 |/ _
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量, x( V% B+ }* x
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
0 q! A/ b4 B" r - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码: ]( g M c# w: D0 H, v
- ;======================================================================1 T5 d; ^1 f4 U D2 x$ J
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
3 y4 R! E0 Z8 V - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
( J2 S. n, [1 N - ;======================================================================7 j+ |. f8 K9 Q4 l* U! L) y4 Q7 P0 o
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1' ^$ g$ H+ j) Z* l4 k/ }
- RESET_ADDR = $E000 ;主程序起始地址% s' o7 |! l: W! C: D: z
- ;======================================================================2 F/ ?4 }# c; L& L
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
# H! `, W& w5 g+ Q7 W- F - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
( \5 ^8 ]* v v- |' F& t7 ] - .INESMAP 4 ;Mapper号 (0-4095)
5 U2 p- Z- S+ X, u - .INESSUBMAP 0 ;子Mapper号 (0-15)
" H/ i6 ?1 A# p - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
/ v3 o* }/ a% N6 i/ X6 { - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
, f) v, ~+ [: s* ~! h& V - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
e' @2 Z/ n$ M2 B - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)2 `$ }$ k' \9 t/ E( c: w
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
) [6 Y e& A" l) u - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)4 }; R# E2 M6 q: O" `
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy) D" N4 H- b6 j0 L
- ;======================================================================
$ Z& M- L4 u9 @ - .INCLUDE "fc_demo_config.asm" ;全局配置& s; `% Z A" |
- .INCLUDE "fc_demo_constant.asm" ;NES常量
$ G3 Z4 v0 v) Z" C, s9 Z9 j - ;======================================================================
5 e6 n5 I1 P( z - ;音乐配置
6 G- ~$ P; o; _3 k8 n" z) E - .IF 0 = MUSIC_THEME 1 z' ^% e8 x+ ~* B$ Z6 o1 G5 v
- .INCLUDE "data/music/Gremlin 2/config.asm"
- X* q3 ?) g0 r2 L0 k - .ENDIF
& W n- L' ]! s3 U -
' }0 ~4 j- T* r1 e - .IF 1 = MUSIC_THEME
; `5 J+ o' k2 i' Z - .INCLUDE "data/music/Raf World/config.asm", m4 \' Q% [8 s
- .ENDIF* }5 b: P# k, d# J) Z9 ` M
-
9 {; N- w" `% l1 u; J - .IF 2 = MUSIC_THEME % Z( @! g: g( b8 t
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
8 g3 j4 z% L$ Y, K: [ - .ENDIF
3 I, q# W9 f4 w; l% w& O7 H6 N0 B
. p3 ?3 N7 B: Y+ ?4 l" S. E7 k- ;======================================================================8 r. a/ F7 a6 Z8 i6 V
- ;引用CHR图像数据
- _3 ?' _: j! f6 f0 y- B5 e - .BANK NES_16KB_PRG_SIZE * 2
4 `1 W6 z! U9 U) f - .ORG $0000# n0 e) x3 E) [
- .INCBIN "data/bkg.chr"
' s: G! }4 |2 V% x - .INCBIN "data/sp.chr": |" C% D. B# o
-
5 D+ \; H3 A5 ]2 k; U- O - ;======================================================================( G7 Q) N2 ]! L! M
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank! }: V0 y4 }& k
- .ORG RESET_ADDR
% O1 \5 Q4 ]) Y0 q/ H% g - ;======================================================================+ }( E% N. v+ N) f
- ;引用其他源文件
5 u. _$ U* j6 n! L9 U! n! K - .INCLUDE "fc_demo_ppu.asm" ;PPU处理* u& m+ k$ L. [7 @
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
9 w6 t$ t* P. H) I8 L - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
% h6 ^, ^) E. ?* ] c) Z - ;======================================================================
; u) v' Y4 ?4 Q, u
6 t5 w- U/ v+ t ]8 D; h6 [" d- ;======================================================================
; b1 D( N+ s! g1 ~ - ;等待VBlank到来
* M0 b8 A7 Z5 _: I$ y$ x" Y) n; D - Wait_For_VBlank
5 [! o! x" Y5 I% j) F - LDA PPU_STATUS* l5 M% T; A2 a5 z: k
- BPL Wait_For_VBlank' E7 n. G- I8 @ G" g5 N
- RTS
3 R: h7 \* l) I6 R1 m0 ^$ F
5 W7 A$ k2 _: g- V* p- ;======================================================================
3 |: i, t1 h+ ?* G$ c* u - ;调色板初始化
* g* q, P$ t4 j6 G! Z - Palette_Init8 z/ @& ~5 i3 ? a, T
- LDA #$3F
! w/ T s4 `2 c- l - STA PPU_ADDRESS
- N( t0 \; i( Y9 p, v. V4 x - LDA #$00# M/ X- ]* }# R6 { [4 G
- STA PPU_ADDRESS g" `" h" F. s; g& v
- LDX #$000 w% i/ I* }7 c [ q: o' d
- LDY #$20
8 i1 x9 K. g' M - .Write_Data
; T5 M) o! j+ s+ d! h - LDA Palette_Data,X
& U5 f6 X3 S' J$ B/ K7 T# U: \ - STA FC_PPU_Pal_Addr,X
# ^0 L) O [1 e2 l2 d+ z0 C" f J - INX7 W5 e- u! G$ I; W
- DEY' e2 b* E+ c! O* b7 e7 y
- BNE .Write_Data
$ u I4 N, C8 O, C% w - .End# n9 k! \6 X3 Q1 t+ B
- RTS
, O. g8 ~; W2 {: o+ n+ Q
" |9 o. [7 C) L" d- ;----------------------------------------$ g) F% S# I1 k* q2 [( p
- ;调色板数据
; ~) R* c, p; s6 l - Palette_Data, T f( U1 j' L, I& a" F7 X
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B" R { C* r6 q: V9 ]# M; u, f D4 g% m
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
/ K- F* ~# l$ K! h5 ] R' v - 7 x% _' U5 U2 y8 A: i
- ;======================================================================( I( e! z% ^/ H
- ;命名表清空, z' E9 ^- E$ Y, f- R- d
- Nametable_Clear
: j. Y- g0 X: e" r+ H4 a. H - LDA #$202 ~' `4 T4 Z. |. m) u: I
- STA PPU_ADDRESS, ~% O$ e$ i+ B5 F
- LDA #$00& n3 O5 @$ S# _2 ~% x8 h
- STA PPU_ADDRESS
$ ]5 i; u# G; A% a; o - LDA #$00
+ @8 D, M s; b - LDX #$00
$ E' R3 k7 ?! {3 v- h) \+ _ - LDY #$08+ Q- |$ }2 i* u: t" w. N9 w% Z
- .Write_Data
& X: Q+ b: V" C& o - STA PPU_DATA) H7 V' U/ p. \, ]* ~$ B8 g/ @( m/ h0 Y
- INX
9 S) ]8 {6 @3 i/ Z - BNE .Write_Data! ^& N" C5 K9 t' M% m" Y
- DEY
$ j7 Z1 N; q& h; g* K, ]" H - BNE .Write_Data
! B' c' ~9 S; x$ A4 c/ t7 X - .End
( R2 F# P9 i0 {; M5 E& V - RTS" F: m! i. c+ G# O: {; s
. R! U- m1 G( \: K" C! r8 M# Q- ;======================================================================
& v+ }' Q3 g! s0 I, Q - ;音乐曲目切换- v1 E! A6 `0 }
- Music_Select_Process0 p, l7 ~3 b% Y+ ?# J! S* e
0 T2 m" M! a; B; S0 B# M- .Pre_Music;上一曲
1 m7 d: Y' d9 V - LDA FC_Gamepad_Once
* m: ?+ P2 O% @9 z/ S8 u - CMP #JOY_KEY_LEFT" s8 b" H( f$ P/ w3 g
- BNE .Next_Music; x- o6 x& x4 Y- B. ^
- JSR Music_Play_Pre
0 p% \ u: E" O$ a+ J" b* m ^4 O - .Next_Music;下一曲
3 `6 B6 [0 |# p+ B - LDA FC_Gamepad_Once" W) F; v2 a+ Y; W% z
- CMP #JOY_KEY_RIGHT
7 z' l7 o, A3 P w) T1 b - BNE .Next_10_Music
$ Z6 M* p% B# R( N% { - JSR Music_Play_Next
. _5 _. p6 e) R9 z; V - .Next_10_Music;上10曲
7 m* o" A2 h* j& B - LDA FC_Gamepad_Once N" E& r9 D1 t/ J W
- CMP #JOY_KEY_UP% o& U l+ }1 N( p, x
- BNE .Pre_10_Music
& T" u- ^ a* t - JSR Music_Play_Next_10
6 J0 d7 h7 m/ e, q - .Pre_10_Music;下10曲% @7 I+ u; U7 s; w
- LDA FC_Gamepad_Once
" P# N9 V+ }6 ?! O8 C, M - CMP #JOY_KEY_DOWN
- q" [" ^/ i& V - BNE .Reset
* m3 J( p% p4 ]6 P6 Y9 O0 Q - JSR Music_Play_Pre_102 v: c( }/ ^9 H* U+ I
- .Reset;重播当前曲目
( {) s: ~7 D* ]7 m; K - LDA FC_Gamepad_Once
8 i/ L8 v2 |- W' v8 U/ t - CMP #JOY_KEY_START/ N5 q+ d9 m( G: N! L( ?0 c
- BNE .End5 k4 p; \& T3 t4 r7 y' ~
- LDA FC_Music_Index
2 U' g$ T; D( c- A; `1 f - JSR Music_Init_Process
9 D% S6 I7 f4 S3 }$ t& `3 z - .End
- } j* a) J' v - RTS$ D/ u1 S, ^) g) G* ~% l: N/ j
- o3 \8 ~' j/ z2 j- ;----------------------------------------------------------------------1 h( W& L# P) I, T/ H
- ;播放上一曲 L0 {2 K; a, b5 l* `8 ~
- Music_Play_Pre
: k9 f' A1 S; A$ T9 Q% N$ g - LDA FC_Music_Index+ ?6 c$ {: A/ |
- BEQ .End
! \: f7 U% C) P- Z7 m, N, f; B- m4 b - DEC FC_Music_Index# T. a% w9 _! ]' X* A, K
- LDA FC_Music_Index
- J& b% v8 H9 A, T: @ - JSR Music_Init_Process5 e8 W! h) [1 O+ p+ j6 q
- .End/ n0 T0 P$ ~; d; O! S. B
- RTS! i4 j* F- ?4 M1 p
- ;----------------------------------------------------------------------
3 Y) P+ v. @5 Y1 _ - ;播放下一曲3 ~8 K T1 t$ o% r
- Music_Play_Next5 ~6 n# @% [0 Y3 L2 l( g; ?
- LDA FC_Music_Index
# F5 N9 v9 n; `; v, i( n' ?3 D, t - CMP FC_Music_Max_Index
1 i: I0 Z [! q. O! q" { d, q - BCS .End" K! I& Y4 t$ P$ H: n- L; ?0 p# ~
- INC FC_Music_Index
5 ]! m- d9 W1 \6 l. d - LDA FC_Music_Index
& S- {* E, @/ C/ V, t - JSR Music_Init_Process$ P5 K% W N2 D" o7 B1 B/ F* b
- .End$ t- n# m- W9 M5 b: s. L* V) d
- RTS
Y" j: x% l3 {% Z2 L+ @# ^
7 l# q( T3 q3 n8 D/ k- N- ;----------------------------------------------------------------------
3 X7 `- Q( p. ]8 O - ;播放上10曲
j; {. ?# ^. |9 Z, N) l - Music_Play_Pre_10
/ M! I; O8 ?! v# W! R6 C8 y4 I! J+ c) x - LDA FC_Music_Index
3 {1 B% S/ u! c1 M - BEQ .End
& I7 H9 K* g& C - SEC
/ L4 d: Z2 d. {2 f) p - SBC #10
- w' H) c( x6 p) _9 Z0 ?' M+ u - BCS .Pre_10
" W8 Z# i" Q7 C* Q - LDA #$00
F8 a- A9 i5 t - .Pre_109 I M# V; }7 g1 q0 s' H6 f
- STA FC_Music_Index, y9 m" B. b9 f$ l+ m
- JSR Music_Init_Process
' B V+ D5 O- B& \; ^ - .End0 \8 \) _. y3 b! H2 x4 }1 Q# a
- RTS) Y3 D3 B( z* [8 M, r. F
- ;----------------------------------------------------------------------
! ^# j/ K* Z5 ?# s" D - ;播放下10曲1 I% Z3 {( `0 A4 F; i( `; `) l) P
- Music_Play_Next_10
9 C7 m9 M/ l1 N& {/ `2 q3 U - LDA FC_Music_Index
. r3 G5 p/ _" \# R* J2 p$ ~ - CMP FC_Music_Max_Index
" ]7 l! h& {5 Z3 l; p - BCS .End
! |& p5 F: [9 [+ N$ j, c! Z/ b - CLC* P, c* a+ M2 X; ]
- ADC #104 Y, D/ q0 Q6 o7 x& O
- CMP FC_Music_Max_Index8 W" P" L9 d+ u) d0 E O5 G8 L
- BCC .Next_10
2 v/ L, U" b. d3 u- q - LDA FC_Music_Max_Index
0 m. u/ a0 V z& }# z - .Next_10# j1 u( J4 v0 i. `7 ^' Y
- STA FC_Music_Index
2 K) x1 [1 o/ @ - JSR Music_Init_Process; N$ ^( s9 N4 U3 n% F1 o
- .End
/ a1 o' ~8 ?4 [5 f# Y - RTS
1 o9 q: A( A5 C4 J - / F" c8 a, x- {# Z; L
- ;----------------------------------------------------------------------
" h. A0 ]4 S6 x2 A y1 |1 C9 G" R - ;8位十六进制转3位十进制制
$ A& x' h( P4 ~4 D9 W$ d - Hex8ToDec
0 L2 d9 P9 b, v. J. |" ~( z - STA FC_Dec_Data_1
# j( {0 i, b3 g; q6 X - LDA #$00; T9 a7 h) C$ ] ^, U2 l4 u: P
- STA FC_Dec_Data_1002 p% P' K1 Z! F$ U3 e% A
- STA FC_Dec_Data_10
) ~9 M! X5 e/ B& Q7 e1 B& N1 E - LDA FC_Dec_Data_1
n( Y& f" ^) E0 n* m- B - .Convert_100) h, _# c# w1 a6 u! `7 j
- CMP #100
- ^/ W, A# E8 G& y5 g! a8 ? - BCC .Convert_109 J8 A* n. s* H# H2 P. ]
- SEC$ G. ]2 I1 y- B% _5 W
- SBC #100
* v- R% N6 T$ s( A( m' G - INC FC_Dec_Data_100' b- E5 s+ x- p% N5 h* Q
- BNE .Convert_1009 K& h0 E% b" l$ u3 `
- .Convert_10# u# q( P$ U- o' N2 h1 Z% U
- CMP #10! @! T. }( d0 W$ ]! K! g
- BCC .End
2 J& k& Y" j# E4 Q$ t3 U - SEC) n7 A4 p9 X$ N( X6 R# Z' G2 T: Q
- SBC #10
8 {5 V( y( X3 T R - INC FC_Dec_Data_10
* T$ Z; ?2 N4 j0 r5 P6 N - BNE .Convert_10& c) ?* Z% q. ?' X
- .End
1 m0 A( o4 s1 T: C& z - STA FC_Dec_Data_1" V" X* P1 {, X# q( L* U& Z
- RTS& i! L9 G+ B' x$ x: E2 p, M( ^7 z: K
- 0 \9 Y2 V/ X$ v% O" m0 [
- ;----------------------------------------------------------------------
0 y3 u+ \* H9 G* q - ;显示曲目信息2 v- K+ T( a+ x" z5 b, ^
- Music_Info_Display& U5 f y7 ^ Y; h9 l
- LDX FC_PPU_Buf_Count! ^4 G' s% X& q: y& p( j+ _0 q
- LDA #PPU_WRITE_MODE_CNT_LINE
A: }. B( \! s6 O - STA Use_PPU_Buffer,X
) m0 P; i4 v# ~- z - INX
& G# j, ^' B& Q4 c. ~+ u. G -
* Q8 k F w8 c0 y - LDA #>MUSIC_INFO_POS
! }. {4 R/ r% _7 p- B9 J1 J - STA Use_PPU_Buffer,X( I/ @8 T( U! l) s: k& @
- INX' x; @# f7 [. V0 e2 A9 A: h5 n2 t
-
6 _' E) n% E" X/ {& T! U: u - ;居中
" e, V7 u4 B0 x: X4 d2 E# l - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2' C/ d$ C( [: _6 u. f
- STA Use_PPU_Buffer,X0 K9 U9 J- w' {3 y
- INX8 f8 A- ~& h u( c; R# X8 `7 b
- ; n& R8 `- S( H- I
- LDA #$05
e1 f0 Y, X( Y+ e - STA Use_PPU_Buffer,X5 Y$ G0 C, g3 [/ B) k
- INX
/ u7 f1 S3 F5 c5 R4 A -
; a) Z' [6 ?9 h - LDA FC_Music_Index# _$ e6 {: B! B- e7 @2 j0 J
- CLC6 l) U- v& M4 A4 Z* J
- ADC #$018 P: k# g) l: L8 s& W9 A
- JSR Hex8ToDec
) S" y7 n8 u& j( s - - i& w/ ~: d- ~. L
- LDA FC_Dec_Data_107 C3 @; h, p' Y, u: P0 j# t0 b8 G
- CLC
( [8 X7 P% \: [! m2 Z Q8 h - ADC #'0'
; p2 |9 L3 b" y8 Q - STA Use_PPU_Buffer,X
' z8 j* P4 h, r4 S$ |2 ]; z - INX$ E4 ]+ }: F; m0 G
- 4 b# h/ D+ R& \5 j# D# j
- LDA FC_Dec_Data_1, D& [3 }6 r. F/ P( H
- CLC
/ h5 c. V L0 D! l - ADC #'0'. T4 G. [) A$ O" H+ y/ g
- STA Use_PPU_Buffer,X. V; ?7 @5 \, i) h* t! f. W
- INX
# N3 G" ]! i+ c* X8 n5 n - : m5 k! W' K" p6 \# Q9 Z
- LDA #'/'
2 Z$ K0 {) [5 u1 p! [# v# C/ s$ S - STA Use_PPU_Buffer,X
$ p/ \+ x" M/ _! |; }+ i1 w - INX- F& M/ ]( L! W) c8 ^: m8 _) l
- 1 X, Z- e. S# D0 X: p$ F) J
- LDA FC_Music_Max_Index
. i! n' r1 ~' @& _( F - CLC J, L/ R$ t' a. X( g# n6 n/ u
- ADC #$01* ~5 P5 t, M5 `# |6 n
- JSR Hex8ToDec0 L: D" z4 U* @7 D
- ) m: p& J1 {) M: D% s7 P
- LDA FC_Dec_Data_10 Z1 C& }2 p% L5 X
- CLC2 S4 t/ S2 ]1 |
- ADC #'0'# L6 S$ x0 Z8 U
- STA Use_PPU_Buffer,X# s, P" c N: @. g$ T6 @
- INX" I7 I) W: t- K; `3 m
- ! b; u9 Q- _- g0 G
- LDA FC_Dec_Data_1
: H! |1 Y) q n0 C: c" m4 g4 d! \ - CLC. ^9 W: s. x$ [& T
- ADC #'0'
9 x. _+ [. W, N: ] - STA Use_PPU_Buffer,X( [! [" J0 L8 V+ o# ~
- INX. `1 R% S; `) g6 a* p
-
2 P9 {, W8 W5 x* j - .End
) n% ]9 i) W; Q- W3 P5 s. L9 S - STX FC_PPU_Buf_Count
3 A& W+ a7 h7 `7 {3 m8 H* i - RTS. H# x* k& Y8 K# ~ y
5 a" d" E3 ^) ]' b/ X- ;----------------------------------------------------------------------5 C' B, x. d1 r* j. P0 ~! S9 X
- ;音乐曲目初始化处理
! N, `5 u1 |) F) n: Z7 L" T2 y - Music_Init_Process
: w$ K2 J H% Y0 W4 [; R6 w - PHA
; ?, }+ K. [: O2 z! Q3 G" { - JSR Music_Clear_Process
+ B2 U- _: s2 x1 V - LDA #$1F
( O1 N/ M4 k0 i* G - STA $4015- J. ?, `! P, X. Z9 o7 g4 E
- PLA
( ^9 _5 }8 ?& H, }9 C9 ] - JSR Music_Init_Addr
7 W9 M, }1 x, C- J: T H9 i: x - JSR Music_Info_Display, R7 {9 M: ?- |1 g9 L% d9 u8 r% |
- RTS
, \2 H+ @, `; s1 p; b - 9 q9 d# F g) h5 b3 d
- ;----------------------------------------------------------------------
7 r* M! j, c' Q( ]" g* C1 x1 r2 e* Y - ;音乐播放处理, i( s7 \0 c6 @
- Music_Play_Process# k; K& F& i" V4 o& q% b
- JSR Music_Play_Addr* N+ l9 O7 Q2 c7 Y- u
- RTS
: G" w. P' s3 S( a% @9 n
! m" o9 `6 K l8 r; @- ;----------------------------------------------------------------------
w0 b& ^" n$ z4 x - ;音乐播放处理* R7 f' ]4 O& _- E8 ~+ j; }
- Music_Clear_Process i6 ]$ I. W/ G9 w: w2 c# k4 i
- .IF Music_Clear_Addr
( Q% q$ j8 X% r - JSR Music_Clear_Addr. P. l0 ~* v2 n/ A
- RTS
. y0 O3 c2 S/ n# y; u1 X - .ELSE
; [0 k5 ?6 z; ?8 c- | F) R - LDA #$1F4 C' m0 m# `! V# z$ @
- STA $4015
4 f. n8 b% l$ M1 U, r - LDA #$00+ q% A4 T: X/ _7 g3 N$ |5 A7 O
- STA $4010
4 n( e3 i6 |; u/ B1 i; e- U7 R - LDX #$00
- R% W0 c1 u$ m# ? - LDA #$00
" J5 |; A3 U! l2 M7 h4 {! T: a - - _; W) N+ x" l
- .Music_Clear_Zreo_Page_0
$ @7 n. @+ g5 N# y/ I - STA $00,X
' I& W. ]* l' @; A: N* ` - INX; k5 T! |( q6 H; w2 r( y, g, `' v
- CPX #Use_Zero_Page_Begin$ Y* R. m- `. d
- BCC .Music_Clear_Zreo_Page_0' e/ E' g: m- y1 \# R
-
6 e9 f0 d, T$ ~4 ]: _' o - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size B1 s z+ ~' w" A0 A, y- m
- .Music_Clear_Zreo_Page_1
/ D/ F3 _3 x8 x8 H0 A J3 r5 Y - STA $00,X
3 X8 W+ j+ b. F% q - INX
3 V3 ]) @2 Q% @' A0 a0 H$ R( x- w - BNE .Music_Clear_Zreo_Page_1$ d" u' [4 O7 H: _6 w4 x: t3 r
- + D: @' U {( L( ^3 N4 @
- Music_Clear_Process_1
y& O+ b) N' k$ ~ - STA $0600,X' \. i' ^% ^) L1 P8 F+ y8 M! h
- STA $0700,X
, K. ^* f# [1 I' S5 }7 h) }" \' P: a - INX; z9 r; m' n" {
- BNE Music_Clear_Process_1
2 [$ K C& X) B& g - LDA #$10% R0 E8 F- D/ c8 D' F9 e
- STA $4000& g1 ^$ J- o" ]. K$ t& v. }& r" _$ B
- STA $4004
% t8 o* J( A$ {0 S9 {, e9 K v8 m - STA $400C
) ]- n7 v/ h) q7 d. W( m - LDA #$00: T8 c8 |, Q! @ @0 u# \( k& Z
- STA $4008
' B. m: i! n: s) P- T7 z* R& f - LDA #$0F( |! @' _0 x1 ?. R2 Z3 Z
- STA $4015
$ l6 z N' t2 X* f: J; T3 p - .ENDIF
2 k7 N# T2 g4 W1 ` -
# F$ o' L* @5 U$ Z& p1 I - RTS
6 r4 J3 t( g" U* k: A) W _8 J - 1 H! ]% B0 r2 H2 s
- ;======================================================================6 u( t- U9 C, A
- ;重启处理
9 T; Q3 l4 s0 U' w/ _ - Reset_Program
7 l4 |+ \2 Z$ g2 W: w y& q - SEI& L9 [ ]% W4 a7 }
- CLD6 M6 v$ b0 h2 t" E( _/ J
- LDA #$00 G+ y* E7 {! M$ w& }/ \
- STA PPU_CTRL8 ^# c8 h3 v( c6 g- S
- STA PPU_MASK
# {- K6 t' p1 n - STA JOY2_FRAME: c+ d0 Z3 _% a/ }
- STA APU_STATUS9 b" K7 J" s+ y+ B( ^) ^/ D
-
2 [6 R% c9 B' O7 x" @4 ^ - ;等待屏幕准备完毕
/ W3 ^5 T; X; x/ A) [- ^ - LDX #$02' v# c+ k: r0 \# y1 p3 a9 |% |% t. {9 r
- .Wait_For_Screen_Ready' q7 p! D/ n, q0 T! F) d/ G3 c. f
- LDA PPU_STATUS
2 i: D) g6 \; Z' a3 a - BPL .Wait_For_Screen_Ready7 _9 i- F7 v( C4 _ i) ~9 I2 y9 V
- DEX$ s3 m0 m ] b8 i$ I# w; c" ^" R7 T
- BNE .Wait_For_Screen_Ready6 Q% R% J+ q- e8 f
- 6 S& }7 w& D o! u6 z6 L6 t
- ;清空调色板
/ a$ Q4 d' }4 @1 p# I4 T - Palette_Clear
$ ? F6 |' U6 [( |/ z2 z - LDA #$3F, x5 m1 h% I! Z, k; N+ Z e, h
- STA PPU_ADDRESS/ [% ^& n$ s' ?4 M
- LDA #$00
- {# I: ?0 Y* i7 m0 M - STA PPU_ADDRESS
" z& g9 }, R; d( t( @ - LDX #$20: M5 h; \# h. s% o# t8 a9 o
- LDA #$0F
: I# B* J- O( Z/ q. I - .Write_Data/ v' I& K3 G9 n7 m
- STA PPU_DATA* f: j7 j$ s! t
- DEX! J% s' ~; J9 n2 K
- BNE .Write_Data
) E0 q7 b- ^6 W! q
. Y/ r% p; a2 N- ]. e# J- ;清除声音 $4000-4013" U7 p b- J: i9 s. M5 x. X
- LDY #$14
# w; v @) b7 G8 m1 e! ] - LDX #$00
+ d+ p7 z& B7 @ ?+ _( D$ L( ?2 A% X2 b - .Sound_Clear
% G+ p. q: L5 q8 L' R: x - STA $4000,X
, a" e' Z. @; M - INX
, [( ~. f# ]+ R - DEY
2 a3 C& r: ?0 ^0 `1 K1 I4 c8 c" u( E- j - BNE .Sound_Clear0 b% w& }% r- \4 U1 ]9 V, ^
- ' C6 u) K2 U I8 c. F. P/ B
- ;清除 RAM $0000-07FF/ r: R& k- Q8 M( e+ H6 i8 H: C9 i
- LDA #$00
5 q1 t3 |/ ]( _) s. Q+ p - STA $00
& f7 |5 C& D: D6 ` - STA $01* }, t0 ~# ~/ a0 a8 L
- TAY6 h* \6 W" g9 [! q* l- C* ?
- LDX #$088 F0 D+ Q3 J" S7 b; q7 q0 T
- .Memory_Clear
" m4 ]. s) v2 J/ ?! V3 A: ] - STA [$00],Y
% a8 M# m" ~8 B, v7 [. R - INY
3 u$ i+ A% w2 L1 L9 J# d- Z - BNE .Memory_Clear8 n* |. | b# D9 s3 e% ]3 ~& V# v
- INC $01' b0 V5 S% F$ m
- DEX) q' Y, p# j, |2 M: [
- BNE .Memory_Clear
( E4 G, D5 T7 R1 p/ f" ` j5 s! y+ ~" k+ M - - u1 i! I; [, \. m
- ;精灵缓冲初始化
0 s0 x1 v; A& U5 [6 Y* c% i% \+ t: k - LDX #$000 b6 p$ e4 a. t1 c* r2 I1 H O
- LDA #$F8
; ?3 p+ s+ x4 b$ L1 @% r - .OAM_Clear- s, F$ F" x* k$ H
- STA OAM_DMA_Buffer,X
" @9 ~8 j b; O3 ^7 Z' Y - INX- e, I* {* g& [8 f- s0 F1 L
- BNE .OAM_Clear- T' Z. m# f& D
- / k7 a+ S( Q: f9 n
- ;栈指针初始化6 D9 g4 s: i5 h( e3 K/ J8 x" h
- LDX #$FF" a% A7 F, \/ y9 q# N
- TXS1 z: b8 N* D; N' V% X- s& W- k
- " r( N; E# _2 S. _! a
- JSR Nametable_Clear;命名表清空
8 X: W" g( {" @! L4 B - JSR Palette_Init;初始化调色板缓冲
# u1 p* X D8 |5 c f0 r& X0 L - JSR Static_Text_Init;初始化静态文本
5 M; k% U: K6 G3 [ - % A, A7 j5 S9 v9 J2 r
- LDA #MUSIC_ITEM_TOTAL - 1( y% ], G3 Q* p0 u/ T7 ?* y
- STA FC_Music_Max_Index9 j: {3 g- C* K: F
- Q2 H2 u- y0 ?* v% D- }$ ]
- LDA #$1F
9 _" I' G, A F$ L - STA APU_STATUS% Y% [# b, [* o* h! n5 F6 N
- LDA #MUSIC_BGM - 1' ]2 C5 w5 y6 e7 W* b3 w
- STA FC_Music_Index
( P+ n3 p' @+ Q2 L/ ]4 d - JSR Music_Init_Process;音乐播放5 j7 z/ t" u$ {* B0 y1 H% m
-
+ I& `# f( I0 c l - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)2 y! B9 d+ r A) Z- a
- LDA #$1E" w# n1 ]! h9 W+ w
- STA FC_PPU_Mask_Buf% \! j+ b7 F P/ p1 m1 y3 G# n
- 1 P8 \- y* @# X1 t2 `. Z* X1 S" e: z
- ;启用NMI处理" E h9 N5 ~7 V; I j
- LDA #$80
4 q% r: u+ B! k7 m* V C - STA PPU_CTRL I& y) k0 x" ^- a3 e$ L
-
6 _9 Z6 g) e: y0 p" O; a5 G: V - ;程序循环, 剩余工作交给 NMI 中断处理1 e) z: t' d# U' n6 N
- .Loop) J, ]6 W3 x* ^+ M |) b6 }
- JMP .Loop, L$ f8 g2 X4 G2 _" |
- 0 v. C9 @4 Y: @* w6 p+ r
- ;======================================================================
: b O0 M. A8 Q- E( f# B6 g1 e - ;不可屏蔽中断处理9 C7 I: [6 `. s# ]4 D" u) P
- Nmi_Program
' o n2 r, }. A/ A! w4 V4 R - PHA
$ F3 ?5 k m. E1 v - TXA
4 g. H- Y7 L* U) _7 @; ] - PHA
+ j4 z9 u/ S& V- g( j5 m - TYA% l0 X1 J% Q# n! w; D
- PHA
. Z+ h- k; M- ~: f -
1 A* q- U4 i O0 o2 h) V$ c) g - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
& U7 n! p' R4 ^3 F: m) I -
- ]2 }1 a8 m7 a% p - JSR FC_PPU_Procrss;PPU处理
) \' e5 ]) N0 h, _0 n8 j- Q -
; S. }4 z [. H/ c$ r3 {: T2 A - ;精灵内存更新- N8 t+ f+ e) }' \8 q; |' Y4 Q
- LDA #$00
! `5 N0 w/ d0 O8 @& V5 [" H! y9 ~2 g - STA PPU_OAM_ADDR. d) U" t& f9 G3 F
- LDA #OAM_DMA_Buffer / $0100 i$ z) y$ O0 U5 z$ c. A
- STA OAM_DMA2 T( r0 X& N) n p3 C
-
& ?& p! M9 P9 V - JSR FC_Gamepad_Process;手柄输入处理
0 v& m7 [# E' I+ A3 z' N6 w: g, Q - JSR Music_Select_Process;音乐选曲处理* m' B% H6 ^2 K. n5 A
- JSR Music_Play_Process;音乐播放处理" N$ n; r, B B `
- ! |/ _6 |! c6 M5 _9 W
- PLA
7 f( z2 q( k2 _* D - TAY4 [$ V( c7 }( ~8 V H- Z
- PLA
5 G& u7 f% |% { - TAX
# a8 r1 J' D* ~3 R - PLA! Z& ]+ C. Y0 v1 n" o
- * t, ~- H1 e1 f
- RTI
" a/ Z Y. {4 K3 v' F - / w" I2 { e) n( z
- ;======================================================================
' u9 D9 v) R$ y/ ? - ;请求中断处理. }: h: G/ X- v4 ?; p
- Irq_Program
5 ?8 x' d# t, k# l0 \* N - RTI
9 m" H1 ~ L* s, A3 [ - ( u" H% H6 d/ y
- ;======================================================================
( V5 s& K& P" w, X - ;中断向量表
! F! v& H3 k- s6 i4 h/ h4 o6 D; U - .ORG $FFFA7 v d2 j# |- J) E. r
- .DW Nmi_Program ;NMI触发时执行
! c. {9 i% h5 q* ^ - .DW Reset_Program ;载入ROM时最先执行& e' K# q, T+ Z* q) H" ~
- .DW Irq_Program ;IRQ触发时执行) R- ~3 |" ^. y( H, G* x
复制代码
% |* o+ g U2 C1 |# }5 r4 h" Z
3 n) x! s% k, G7 x
5 l ]0 m( w( y, dhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|