|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
4 D H( W" `9 y0 P
# `0 Y b+ E7 A! f8 F" L- u以下是主框架代码:
" y" B' Z5 I( |! M a. p2 _/ q- ~- ;======================================================================; @ p1 \4 I8 k4 n1 \
- ;文件头
# L3 s& T, m0 y3 `$ T2 B1 \ - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
4 e& Z# F) ^; [$ Z5 A- w! z - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
X1 ~. z' N# V( C e/ ^ - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
' w! I* @$ I8 x% Z4 x. x - ;======================================================================
5 I5 o1 A& Z. V l1 J, K- Y3 Q - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
$ H* W; d8 _& ?2 d# b, t( B3 F" ^ - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
9 I; Q4 u6 I, v. _; y5 q, w6 n - ;======================================================================( _ ?9 i3 a S) p, M
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
; f: A/ V/ H/ H+ x$ x- G& T% m7 v q - RESET_ADDR = $E000 ;主程序起始地址
9 V$ L1 q9 q4 y$ ?- X - ;======================================================================( U+ z; p; N; {6 S) r% M% [
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
- T2 L; }6 l6 p) c' }: T8 O - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB( b# k% J3 y6 w& f0 d" L, Z
- .INESMAP 4 ;Mapper号 (0-4095)5 S6 P+ F- ]* F
- .INESSUBMAP 0 ;子Mapper号 (0-15)1 A" u: @& }) H& l9 Z& K
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)% o# b E" H8 }/ P& `3 f
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
8 [; `9 l5 e* j0 y( B# F - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)0 U3 v$ o; a% I; `( s4 H
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)( R# v( ~5 _2 ?9 ~/ k0 Y
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
& j! T# K z: u! _& n3 i0 W1 e - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
0 J: W$ U) C4 f* r. o$ y - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy); U/ Y+ e6 y. t4 n( b4 L: G
- ;======================================================================" D% d# u H; D2 r! m( @+ c
- .INCLUDE "fc_demo_config.asm" ;全局配置6 ^( {$ o$ v' B) S1 i& T$ D
- .INCLUDE "fc_demo_constant.asm" ;NES常量 c! F# C, C$ P" D
- ;======================================================================( h) B+ }$ t1 G' j) e3 W
- ;音乐配置; n% W$ { R, `$ {
- .IF 0 = MUSIC_THEME / a( {# @; Z0 f8 A/ k. f* A+ M2 K
- .INCLUDE "data/music/Gremlin 2/config.asm"
D9 @1 \+ R1 P3 s7 B - .ENDIF6 ` r, ]* @$ m2 c
- ) J1 f' t- a# g k7 \: q6 C* J* v
- .IF 1 = MUSIC_THEME* C6 w& O# w' D- ] C
- .INCLUDE "data/music/Raf World/config.asm"
* R" X7 ^" W# _& i, p9 Z - .ENDIF: U+ x/ J& R2 ~3 c! k8 K# |2 U4 d
- 1 f+ y! F2 G* I; B& {6 L4 p
- .IF 2 = MUSIC_THEME
1 M* N- L$ R7 @1 f# M% ]9 ^ - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
; W6 l& q: O& s - .ENDIF6 v& \5 t4 q9 G# G% e, n% O0 V
- ' A1 w/ R# X, S( { w( p
- ;======================================================================
9 P( b z# f4 p" G; \ - ;引用CHR图像数据8 y: t) N- R$ {( w& U m
- .BANK NES_16KB_PRG_SIZE * 2% ~, E) R( |! X3 n/ x
- .ORG $00003 ?8 z( E- d$ N4 o7 M
- .INCBIN "data/bkg.chr"
7 X) I6 ?& C& j; r( \' `7 s2 N( y4 h9 c - .INCBIN "data/sp.chr"
, j. v8 o6 {# M1 s+ i1 u+ h A2 ^ - ( W& p' S, {; V& k
- ;======================================================================
! @/ @! [5 H# Q, B) u - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
5 \$ W1 Y0 v; k* S/ P. z% ?( ~ - .ORG RESET_ADDR
3 v8 T. r2 _; B7 u; x( @7 {/ n" M5 ^% } - ;======================================================================
' Q2 M4 @ ^, D. i9 i* y - ;引用其他源文件
d% H1 T! W3 t+ ~# O/ q0 n# z6 _ - .INCLUDE "fc_demo_ppu.asm" ;PPU处理7 l4 W. E A/ c% V8 b4 L
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理4 ^5 o. D; B* Z1 Z, c8 C3 g
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
& ?" H3 D3 o& O- u& g& E - ;======================================================================6 n" _! v( N/ @: L- G! ^4 k
$ l: m5 y8 z- G" a' k- x- ;======================================================================6 z9 X4 g( ]5 N7 K- Q" w6 P; ?
- ;等待VBlank到来
- f2 ^2 g9 V/ N - Wait_For_VBlank
9 A* }; b" L9 Q) k) S3 a& z* M - LDA PPU_STATUS/ M: |, D! S: g" l7 ?
- BPL Wait_For_VBlank6 p4 b7 k; l$ z: O# x
- RTS
, Y# V; `4 {1 Z8 F" J* O) y
2 }' h9 W/ R& W1 E% b8 W- ;======================================================================) z/ R$ m/ W# W$ R# g
- ;调色板初始化
3 ?- R, V6 j- S6 _! T# c- w - Palette_Init3 h" Q, x" o- l, ^
- LDA #$3F! S6 y- a+ A) w1 m1 n
- STA PPU_ADDRESS
% b. y+ _- j, }& i" M G) V - LDA #$00
" y/ w# R N: D8 }% N: H* X2 c - STA PPU_ADDRESS
6 n8 i, W) E% R. s: ]9 P4 E; t- ` - LDX #$00
2 A; a1 [ P# e# R5 e - LDY #$20
( B6 M9 S2 s/ u$ n# m+ Y* [ - .Write_Data. S. w5 r F& N# @8 |4 q
- LDA Palette_Data,X9 e# M$ J0 T0 R
- STA FC_PPU_Pal_Addr,X* F3 h, J2 e. n6 E
- INX. y0 _; m0 y' ]( h# F$ Y' l
- DEY
" L, C; E, N0 _0 X9 y6 c - BNE .Write_Data
! i* E" ^4 Y& M" ~ w3 G - .End8 g9 a- C7 d& E$ q. s7 v% }
- RTS
+ q4 C7 V% n& T3 v3 V) k+ g0 ? - ; s6 T& }8 o7 F% ~' [
- ;----------------------------------------, ~' N6 E# e8 G, ~8 r2 g
- ;调色板数据
4 k2 m4 S# i/ z9 \4 l: s - Palette_Data
2 R$ D: w M" W - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
5 P/ k( l8 u/ {7 N2 b6 f - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22" p$ ]7 |9 ] K( c' L/ c
- 2 Q% J( o$ w2 g- a) g! w$ a
- ;======================================================================& y8 d) l/ G* L' n8 I! e1 f
- ;命名表清空
8 V) _, v; j) w. j - Nametable_Clear
2 n, T; o# {: P( G2 z, U3 V - LDA #$20
0 x4 c+ j5 p# ^5 S0 r+ F - STA PPU_ADDRESS
4 X: D7 N/ r. I+ e a, ^( Q: }& x% E - LDA #$00
' d* n2 ~. k/ d- B - STA PPU_ADDRESS
P9 k5 S3 u* o( B) c8 J+ i1 U - LDA #$00+ Y# {8 }' @4 m4 v6 U3 [. \8 x
- LDX #$00
! `# T6 U R) C+ H7 c- g - LDY #$08# d* M; _/ ^. f- C5 ^
- .Write_Data
2 z+ S* l4 S- _9 M4 m - STA PPU_DATA/ s: d5 y" l5 s
- INX( [# {4 t' L' E. p! o! K# }+ `
- BNE .Write_Data4 K2 F# Z2 v, t3 ~% U
- DEY
' k. n% u& ^7 p8 J- `; I - BNE .Write_Data1 Q& @" `5 n0 ~7 H
- .End$ ?% }: Y+ o9 U1 d
- RTS
* Q- {% O9 F( F8 u, Z/ Q* X
4 ]! ^& D* F- @: e5 ?! p0 l- ;======================================================================4 Q# C: T8 S, T7 ^; X) O% t& ?
- ;音乐曲目切换7 |( m. E/ w8 ^/ Z/ n6 o/ b% s# Q' k
- Music_Select_Process3 g# L6 n% b5 d
- 8 A' y: M+ t E; n9 ]9 a
- .Pre_Music;上一曲& s" } f+ h0 o, Q9 _$ l' W" W
- LDA FC_Gamepad_Once
* l: ~. r; ^" L - CMP #JOY_KEY_LEFT
' x4 Y* R# C$ a( e - BNE .Next_Music; p1 X( `3 G/ F* P% C n$ F" |
- JSR Music_Play_Pre
# P+ |! v; M/ U0 s8 e3 | - .Next_Music;下一曲+ c& C% i/ K& r1 D; C. |
- LDA FC_Gamepad_Once# R9 B3 T9 K/ y" o
- CMP #JOY_KEY_RIGHT: a/ k- o3 e1 Z) Z' e1 h. Y" k
- BNE .Next_10_Music
; Z5 D* @3 X2 l' g7 x5 y) m' Q8 O1 W& T - JSR Music_Play_Next
) [; g n+ l3 A3 E - .Next_10_Music;上10曲
7 O# {0 W) J& V - LDA FC_Gamepad_Once) o, A J6 J. X/ g2 S
- CMP #JOY_KEY_UP
' j/ @& ^0 x! _3 B - BNE .Pre_10_Music8 U" r6 V9 L* `8 `
- JSR Music_Play_Next_10
& v# L& s% E6 ^" G - .Pre_10_Music;下10曲
3 y ^6 H Z+ E* k - LDA FC_Gamepad_Once! ]& U4 X7 f# ?9 r8 _# U- \, s# ?
- CMP #JOY_KEY_DOWN
, X8 |1 c$ L, O5 }5 p/ k - BNE .Reset5 D% S' b. t' ^% k# H! [7 N
- JSR Music_Play_Pre_10
; B P( F1 q% S: U - .Reset;重播当前曲目
( j2 h+ x+ {1 u - LDA FC_Gamepad_Once
9 M ]6 }- G- T V/ a9 N - CMP #JOY_KEY_START
4 [! r4 |( L5 u8 ~ - BNE .End
9 K! X0 @ ]/ u. a P% k( U1 U; j - LDA FC_Music_Index: U7 O: r d+ J. n
- JSR Music_Init_Process
6 [' ^$ @, G$ ?7 \% c - .End5 j& C% z0 i) a7 p _. |
- RTS
- y _% |7 {+ Z, U( p; z - 3 ]5 w1 A H3 Y/ r3 ]
- ;----------------------------------------------------------------------
/ z9 T: q/ F0 ?, m) u% F2 u, C - ;播放上一曲5 E( ~7 l9 x7 d6 I6 |5 n2 |
- Music_Play_Pre/ Y( l. c3 a2 O+ }
- LDA FC_Music_Index" y7 ]/ i7 \. _! T# e/ T
- BEQ .End# v% s4 [9 [/ t+ j
- DEC FC_Music_Index n! @2 ]( M# K' b- Y+ m( I
- LDA FC_Music_Index0 O+ W. h9 f9 Y
- JSR Music_Init_Process
$ _2 D9 }% N% ~* h7 d! p7 s - .End) w- K8 u& H* ?; {2 S* r3 x
- RTS
" z3 |0 J; o" J - ;----------------------------------------------------------------------
. N5 @% Y2 x4 L- X - ;播放下一曲" H; a/ _; U4 m: Q3 q
- Music_Play_Next
; ]' O5 v% ?) t7 a4 X - LDA FC_Music_Index/ X) E4 R3 |1 F) g0 E2 Q0 p7 K
- CMP FC_Music_Max_Index! i9 q5 |8 \- H0 ?
- BCS .End5 o8 ~5 D; d% _3 B
- INC FC_Music_Index
3 K. H/ K P5 n: ?2 G' ? - LDA FC_Music_Index
) ]( j* I4 h2 k) U, m - JSR Music_Init_Process
8 n/ P9 ]+ M. E( D' c - .End8 {& e; l! X6 s* A' P
- RTS
( D# H; E0 h6 I; J6 v7 {9 d0 f - ; p- D) V( J9 J& R; J `
- ;----------------------------------------------------------------------
/ U3 g6 ]+ h/ b6 @3 E - ;播放上10曲
4 C5 K! j% t( V! ]- N! W. u! U - Music_Play_Pre_10
/ l5 Y) p/ {, G ~! t% i - LDA FC_Music_Index& N b: m* O: v
- BEQ .End
' E( D/ J$ j& a& ]4 L - SEC+ [9 x8 U! T: }8 x4 u3 x" [8 _
- SBC #10
. g# Y& d4 I/ M9 _% p% Z/ O - BCS .Pre_10 k& B! W1 ?( f0 i' O
- LDA #$00
7 k8 P8 c- B2 I- [- `( r - .Pre_10
0 V+ A6 {% W1 c - STA FC_Music_Index
5 D% H0 Z! g4 x* ~! r8 @0 W - JSR Music_Init_Process
7 n/ `7 ?: T; h; N) ~2 A9 X" x1 n2 B; h - .End
- n8 I5 n/ e$ s+ \- k7 u8 m - RTS; M6 Y3 t2 U- {7 c
- ;----------------------------------------------------------------------
' _, N; G4 O: \) L9 t; q1 \ - ;播放下10曲
. I* [3 I: U/ {9 V; e - Music_Play_Next_10
, K; m/ V! @1 G+ c) m - LDA FC_Music_Index0 }- u4 Z9 K8 [
- CMP FC_Music_Max_Index
4 B0 \4 f5 [/ v6 }% z - BCS .End: W9 R( z# p! ]$ d" c* y, n4 R8 t
- CLC
1 |& s0 H* R; E( ?4 P+ b - ADC #10
7 M0 B' u! Q4 b% [; M" t, g - CMP FC_Music_Max_Index$ c) p. q* Z0 e+ d
- BCC .Next_10
/ X/ C. m7 G7 z; z! h: N% g - LDA FC_Music_Max_Index
; S. o3 R( G6 R. z% Q9 M% O - .Next_10
! h7 A% F0 s `3 }( D3 y M! i - STA FC_Music_Index
6 m0 ]5 l- A7 x# U - JSR Music_Init_Process
+ `1 b* X8 X d$ d8 N7 _: l$ h! e - .End5 s2 ~3 C6 h/ B1 U$ k# c7 e9 s# X* O9 u
- RTS
- U# H. R; K4 W; @
& C- C" ?8 P! C w) P8 l9 |; \1 |- ;----------------------------------------------------------------------1 X; a0 H: Q1 [7 |( u
- ;8位十六进制转3位十进制制" l; I! ~6 m. g7 O- w( x1 r
- Hex8ToDec
, P2 i5 \4 g; C. m" t# e# C; r G! h - STA FC_Dec_Data_1
0 _; U4 Z4 \, M4 S; v6 x! x i- ` - LDA #$004 G8 T% F6 l9 Q7 p, r% h% h
- STA FC_Dec_Data_100
4 [9 O: V. Y3 W: X, H - STA FC_Dec_Data_10
1 }7 `) a; |8 e7 } - LDA FC_Dec_Data_13 u4 K* S8 O- T& b! j% S3 f5 l5 k
- .Convert_100' V2 T8 C. L& Z$ k- I
- CMP #100' r" s5 m. s' R7 i4 k) h% L# X
- BCC .Convert_10
$ \7 _' {5 r" M) j" C: I - SEC
2 @) S0 J3 ~# F3 D5 h( r - SBC #100
8 ~$ I- V1 }; `1 [3 T - INC FC_Dec_Data_1002 j u( ?4 F. c8 s7 o) m9 I0 [ d3 c2 h
- BNE .Convert_1005 t& O0 N D' M( S$ V1 H
- .Convert_103 ^) G5 v1 \9 ]9 u4 x, O. y
- CMP #10& }" b1 B5 m; c% c& D
- BCC .End: n. Q$ M; r5 @6 |8 n
- SEC
" u6 V4 h% z( U: e. K - SBC #10
3 Z7 P) n# m. ~$ H7 y/ {5 v F - INC FC_Dec_Data_107 V7 I3 p Z- M1 c( |6 [2 v: _5 z
- BNE .Convert_10' i2 s# a3 V- o. I+ w3 M* g2 ?
- .End
, S/ N, f3 D( `9 K: G4 e8 i, u. o - STA FC_Dec_Data_1+ A, E) W/ O5 Z$ v
- RTS+ z0 P$ A! \; v3 q; x) ~! s1 W+ D; W
. r9 H* @7 ~/ g* }; S; O- ;----------------------------------------------------------------------
" {6 u+ r1 S' D& O6 K - ;显示曲目信息# V$ U3 u2 A; B% R2 O: @
- Music_Info_Display
/ o: ^/ f$ U0 m - LDX FC_PPU_Buf_Count
, S% j! C6 n9 w) ]/ F# E8 ^1 `1 U - LDA #PPU_WRITE_MODE_CNT_LINE
. t- q d3 R0 f* t8 M5 b, N - STA Use_PPU_Buffer,X$ u# K8 ]" X& ?! u8 m) Q
- INX) x: l& j& f: t c* H
-
5 }; f1 I% W$ ]4 t: m. ` - LDA #>MUSIC_INFO_POS
1 _2 Q$ o% [0 C7 }5 R+ j& q: ?5 S - STA Use_PPU_Buffer,X
D1 F6 M; I8 x9 U2 x& T* t4 J6 j - INX$ z5 U2 b) G3 u# `! Q
- + y% G9 ?) a' s
- ;居中: B& A) J6 ~) w% D5 ^
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
+ t5 ~7 N8 B7 h. X+ S - STA Use_PPU_Buffer,X5 T9 G, k1 U% e! i9 |9 w: c) q
- INX
& D" ?: ?* w! D2 v* y1 d5 A -
& V: x) g* w! s& ]2 s8 l6 \4 x. _ - LDA #$05
" {6 Q% h3 [& Q; A8 F' l: r/ E - STA Use_PPU_Buffer,X8 [& F& c/ [+ i' h: }
- INX
5 ~8 G! b6 a6 `) z, n# C# s - ) C4 F- Q( u- F" Q: ]9 Z
- LDA FC_Music_Index! {+ h, y% m8 a! S5 X) y1 ?
- CLC
2 g* K; z- [* _& M - ADC #$01
p# |" V& p0 @ U) P0 y - JSR Hex8ToDec7 H3 D1 {6 t% |5 u6 p7 E
-
( [; {9 [6 z @* q& m* a2 H" K - LDA FC_Dec_Data_10
% U8 g: v: V' D4 s/ \$ q+ c$ j; } - CLC! ~7 Y6 N% Z" \- m* O a2 _
- ADC #'0'- _7 T; b! h5 u
- STA Use_PPU_Buffer,X' P; Z' [2 I' b& l* O# l
- INX# Y7 ?- \2 e2 ^/ J) i5 v& O
- 6 q) K! L6 Y: Z; z
- LDA FC_Dec_Data_1
0 G4 L# l' o3 f" Y. R0 t - CLC1 i G7 ^1 p$ ` q* r
- ADC #'0'' z0 W" ^2 ?. n& e* C
- STA Use_PPU_Buffer,X* |. `: S1 h! g1 C
- INX/ u6 V4 o# l/ R8 h
- 0 C# x, m4 O- |1 u1 {& r
- LDA #'/'1 z- E+ Y: D& N' p H3 m* K2 ?7 v
- STA Use_PPU_Buffer,X
7 N5 O5 L9 r# ?, H F - INX
4 G) y7 ]' p) {0 y -
' r! L) P+ @6 E2 {! B, p$ `+ n1 l - LDA FC_Music_Max_Index, \, ^" D K8 g+ k' U
- CLC% V+ e5 S1 `* ^; Y) k% z- ^
- ADC #$015 O1 r5 J" |7 F
- JSR Hex8ToDec
3 h! S6 ^. S- H. r - # Z x: G/ o. o
- LDA FC_Dec_Data_10! H( d4 G6 W3 d3 Z& w& d! r4 W! z
- CLC
: V `& m, |# S3 P$ F9 k - ADC #'0'
# v7 s) h2 e% M' U* K2 a& @2 D - STA Use_PPU_Buffer,X
5 {! `1 f1 A+ L - INX
- {7 x. A. ^1 Q8 u- G -
" i. x& S& V: }+ k4 ]6 l - LDA FC_Dec_Data_1
( k* W# r$ H1 | - CLC
$ o, L P2 L8 W - ADC #'0'
& V8 @3 E5 K8 ? l5 Q" a - STA Use_PPU_Buffer,X0 j. b3 a! o: I( w( d" N7 S4 d
- INX3 ~/ e; X1 i7 }
- 9 d0 k) G8 m- ]1 N3 K7 q# F
- .End
2 `+ @3 h0 j3 j# C: c9 T0 k4 Q - STX FC_PPU_Buf_Count
. C5 V: G1 ~6 z3 [# t/ `, b - RTS
4 @7 F8 A5 `) p - - `3 c! {0 D0 d" i( n- `; F9 }
- ;----------------------------------------------------------------------+ L V& W# r+ i3 X5 y
- ;音乐曲目初始化处理2 |8 g7 l- I% A
- Music_Init_Process% E9 x9 r* k$ q1 v% }0 b8 u
- PHA
2 p! s& V1 c$ ~" m$ a - JSR Music_Clear_Process
. Q8 }" ~/ B3 l$ l% R - LDA #$1F0 n3 `& a4 e- C
- STA $4015) y6 a/ S8 f" _8 m1 c
- PLA
9 z8 H8 l! b+ m! M% @ P" z2 E - JSR Music_Init_Addr' [1 k/ \) j& \) b
- JSR Music_Info_Display2 w5 p$ L5 F5 w8 G. h
- RTS) Y/ ^! g8 @* | w) k2 i
- ; b' \ e6 ^; V+ N0 j. Z. L8 `& @4 t3 ^
- ;----------------------------------------------------------------------
+ U" m/ Q' |$ V - ;音乐播放处理
# K1 C s; ?. r# [ c" d - Music_Play_Process
* s8 ^+ |! B1 I, f* L - JSR Music_Play_Addr
7 b9 ?: e* j. |$ Y3 V" i5 C( \1 P5 Y - RTS" z& S; f3 j/ H
" o$ T+ W! R/ p; L- ;----------------------------------------------------------------------. m& ^0 N) v$ E" I
- ;音乐播放处理
6 l0 v4 v, C% [ - Music_Clear_Process# r# U, d7 X; g6 w; A5 G
- .IF Music_Clear_Addr
) O4 T$ Y6 S: M, F& ^ - JSR Music_Clear_Addr6 N4 e+ y& k% W, n. s4 [" ^! G- O! q
- RTS) c" S# {3 R! r8 h3 K
- .ELSE7 [) a; w# U. w5 X6 Q
- LDA #$1F0 u- ]: s! Z4 M7 }' m# i. [: @" I% G
- STA $40157 b0 O: }$ u6 L) w5 h
- LDA #$000 X# X" X0 j: D
- STA $40100 ]9 P% A8 E" _' g! G
- LDX #$00$ I& f$ d2 @- C4 c |/ n7 y
- LDA #$00
* T4 V5 S& i' K; f+ J -
7 n8 |: ~) H# H: H( n7 B1 | - .Music_Clear_Zreo_Page_0
5 t8 ?4 ]( `7 f& g% S# r - STA $00,X
, y2 n% @, j8 X, a& ?$ e - INX
- U, t& u B( w - CPX #Use_Zero_Page_Begin* ~) a e% m2 A% N: r: ?
- BCC .Music_Clear_Zreo_Page_0% J1 e r' b, `% h) c) l
-
! t0 n2 o7 a, z% t n - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
% |2 d) l- Z: M1 v/ e( B0 ~ - .Music_Clear_Zreo_Page_1
& |. X1 J% W+ C% y# U8 G - STA $00,X
6 c; H$ A. P6 L- U+ o - INX+ b; R$ ]3 i9 C0 z7 T
- BNE .Music_Clear_Zreo_Page_1
, n F$ ]8 C( L; @% w u- [ -
) |6 r( J5 A( _' |' l5 v - Music_Clear_Process_1
# C6 R/ t* U9 L; c - STA $0600,X3 H$ W! X% y! i$ Y1 C# Z
- STA $0700,X* y, R2 U$ S- f# N, J
- INX/ g/ i# z+ N) @/ u- w/ ]
- BNE Music_Clear_Process_1 g, x$ P& C& [5 j3 U
- LDA #$10& T, |8 z1 L& K# ~4 r
- STA $4000! p$ X. s8 ^' v" Y% _6 p: B7 T1 [
- STA $4004
$ y0 f+ ~7 c; O4 q& u6 r - STA $400C. F2 ?2 K, c" O$ z: j
- LDA #$00
' w3 o) M- W2 E4 k - STA $40084 o* w, Y. P, _; n# D
- LDA #$0F
v: T9 [# b1 j# Y; C, w - STA $4015 Q V' U. u$ R) y: W" g' h- @
- .ENDIF
8 h5 u& Q+ E2 [% @9 c - , q8 R/ j7 H7 H) f) X
- RTS6 m) t/ l- C b+ l2 B Z: P2 j
H/ n7 H6 y3 X$ L9 X% w- ;======================================================================
( e' z! M$ m) ^6 W% v - ;重启处理
& O* H+ f" V4 ^* F0 v - Reset_Program
5 ~5 ]* o q: a( D8 ~% L' u, j+ A - SEI
4 L% O& G& v0 Y1 e - CLD
4 r# B/ S W5 a - LDA #$00$ O2 n- P; e9 s/ Y
- STA PPU_CTRL
6 q7 e; S3 V2 g' Y - STA PPU_MASK
; T3 I3 R; `$ H+ @8 r- A - STA JOY2_FRAME+ e1 D' V4 Q7 d3 p9 x
- STA APU_STATUS
0 ]( n8 x( ~4 {' X1 `" Y, `1 C( l7 A9 W -
; t" {4 N5 _, n1 i8 n- H - ;等待屏幕准备完毕# q X" Z6 L' G- g* b. F
- LDX #$02
1 r9 M+ U5 d: ^# ^" v) r$ R( V2 t; m3 {" t - .Wait_For_Screen_Ready
% _/ D& t0 m- S - LDA PPU_STATUS% V( ~. } l( j2 k/ C7 z
- BPL .Wait_For_Screen_Ready
4 Q0 B; a3 {/ V - DEX
$ h! u7 {+ E' U& z/ V$ u - BNE .Wait_For_Screen_Ready
% n* K3 D2 O4 O# q4 U1 M -
5 k- g! H, i" k L( v! g - ;清空调色板) s! d: O! p2 K6 |3 S7 T, }
- Palette_Clear
5 D, L* M8 ~, R8 m6 j% ` - LDA #$3F
, R! n! J7 |( h* c! Z - STA PPU_ADDRESS
4 d9 P# U9 V/ I0 S# } - LDA #$00/ \& v& [. D+ i) ~4 j) U
- STA PPU_ADDRESS* Q l c3 K) o( l$ a+ z, C, i* l7 C
- LDX #$20" t4 l# e) a9 z" x$ b2 L! f# Z: x G6 f) O
- LDA #$0F i( S% o. {, c) f p9 X8 H8 H# B5 s
- .Write_Data
- @5 X e; }8 n, `! H - STA PPU_DATA
; R9 a/ p( M1 t. J* o - DEX! ]1 q+ I" F, X/ o
- BNE .Write_Data
1 h6 z* \' H$ B2 { f& H/ _
/ o2 D" W) k$ o- F8 j- ;清除声音 $4000-4013
% l. X. `8 ?6 {. U9 y R) o3 G - LDY #$140 Q. G$ a- Y0 c9 q8 m" x
- LDX #$00
' |* _) E8 ]! {1 L - .Sound_Clear R; t- p8 X n* [
- STA $4000,X: f* `# N' V! v$ f0 G: |
- INX0 d- C4 n/ v* \ k4 _& g% Q9 W
- DEY
. P3 r; Q! \) `$ K- F1 ^ - BNE .Sound_Clear
& A6 m. G* A _) m -
# u! x7 B: ~+ d" i - ;清除 RAM $0000-07FF2 O3 q7 D8 m$ r% Z
- LDA #$00% k( n5 c: Y. ?6 x
- STA $00
- K. b: G; o" B" x( o: I$ V - STA $01
3 f) k0 G& m4 s. \2 ]- e: }7 v - TAY; ]8 \- i: V" H5 j8 [
- LDX #$08
% C4 N3 Q5 @( K( j4 v6 ? - .Memory_Clear
1 o- W7 f: c. D - STA [$00],Y
6 @( M- t1 e- h' i( ^7 [9 @ - INY
" I' d6 Y. J1 ]+ n# w. j - BNE .Memory_Clear v% {' E& G$ {* E& w; |
- INC $01% L: u6 I z6 s6 v+ k
- DEX
' [+ y# Z; k4 R) K P - BNE .Memory_Clear; T& |7 I, @+ V; Y2 f; G9 \
-
# v: t1 p; M$ M, d6 @1 z - ;精灵缓冲初始化
5 a- A3 h% R( ^! S* j3 D - LDX #$00
; ~1 {0 c9 @$ P6 G% W6 l - LDA #$F8
1 M5 Q$ S" ?& }2 n! u - .OAM_Clear
: ~" B \& L+ f0 I+ g9 E# ?/ H - STA OAM_DMA_Buffer,X, G6 l* J6 L" H% |8 ^
- INX/ p+ z6 o0 H+ S+ b6 L- j4 f* Y
- BNE .OAM_Clear
) M1 C; H# y) h5 z - 1 @. `, w6 W2 c& |% l% p" U+ n9 ?
- ;栈指针初始化
7 W& W, f) B! I - LDX #$FF# x+ E8 u3 `" Z" L0 t8 ^# y# Y1 V% y
- TXS
( S) y- R2 h# V# P% J9 g2 t - 6 H q( s' I$ S) { o+ m# O; r
- JSR Nametable_Clear;命名表清空
. p2 r8 f6 w* u - JSR Palette_Init;初始化调色板缓冲5 `7 T8 s8 w5 e9 _
- JSR Static_Text_Init;初始化静态文本
% H3 i2 f& `5 i- _% b n V - 7 A7 j% n; S5 J( K l
- LDA #MUSIC_ITEM_TOTAL - 1
3 ~' ]& y2 x, ?! ^% t8 @2 s2 G - STA FC_Music_Max_Index
7 G' u/ s8 o+ F) m6 ` - 2 j% @0 I0 @& v" W
- LDA #$1F4 Y3 P/ g# ], ?- v8 b" x
- STA APU_STATUS
* x1 ~6 A: x1 T4 A! y$ a - LDA #MUSIC_BGM - 1
7 Y' B& L8 g0 o6 | - STA FC_Music_Index
' f/ T5 w7 y+ C) e, N. ^5 D - JSR Music_Init_Process;音乐播放
% {! w! e9 b; n - D" M( h% o/ B" D" q1 D
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)5 x$ m( G$ n/ _. c
- LDA #$1E
9 _% t2 X, _: p7 T2 L K; l - STA FC_PPU_Mask_Buf
" p2 _0 c+ o/ }" Z. j; z - 9 U: h0 K6 \9 r6 @) n+ e
- ;启用NMI处理
$ Z& g( u, F/ j% I0 D0 G - LDA #$80
) N0 `- }- `7 P' U" k: D- e - STA PPU_CTRL4 O' n4 J) Y& |4 U4 ?4 W
- 2 M7 W: d4 k7 `/ [4 a2 V# s- s
- ;程序循环, 剩余工作交给 NMI 中断处理
* R) M- |0 Y# E/ c: m- s, X - .Loop$ v/ i, e# O+ g. k( U7 u# c
- JMP .Loop
! ^- }, {1 S2 ~# M6 {
9 z- G" x* I$ H2 W& z7 t+ ~- w- ;======================================================================
' n$ ?0 n% g5 ]. g: Q1 g9 G- V. a - ;不可屏蔽中断处理
% }. J# F, Y1 q# p0 H6 _# O. [; F' N - Nmi_Program
6 v" D7 n/ w* Y6 g* D% L - PHA: y& v$ N# J1 D z
- TXA
- q5 n: [& |8 {1 @' T$ ~( a/ C - PHA- L; L7 e+ C$ A! }+ l# M
- TYA
( O; l1 E& q! }; c6 [, [" J - PHA
7 A- O) G1 |0 G( D - 6 H* o$ r6 j# _, G
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位; k: m U$ f) l
-
" i2 \8 K! g. c$ F1 {0 ]+ A, J! D: T - JSR FC_PPU_Procrss;PPU处理
: o y# e* b8 i -
# j/ p/ O. I" Y w& X0 R - ;精灵内存更新0 }1 |9 S; E" H$ b4 {0 `2 }* N
- LDA #$00( g& r3 N. H) N; y
- STA PPU_OAM_ADDR
5 _' C1 q% b B( p - LDA #OAM_DMA_Buffer / $0100
7 [9 @5 l# y5 L - STA OAM_DMA
, ?" y, l$ K+ q -
& n- f) ]% D) x) y7 x7 d2 i) E - JSR FC_Gamepad_Process;手柄输入处理' V% j4 n) ~$ X* a' a
- JSR Music_Select_Process;音乐选曲处理
* ~! V: ?3 F/ N' H% I( A - JSR Music_Play_Process;音乐播放处理
$ G; K3 c; g8 ?# E8 b/ g - Z$ P* N* ^# n! X; W) t, y+ _( m: C
- PLA
$ X" M9 d* }$ E: T9 _# p - TAY
( S, e' m( s& @: X5 a) a1 L - PLA
+ B7 [& S, S) ^$ ?: o8 [ - TAX) X# b: K1 B! e9 a: Z
- PLA% j/ L5 P; k9 q2 v
- 6 G$ }: D6 }; I/ Z
- RTI" s5 F! {+ [' j+ Y! V* V$ P3 G
. }" F* K* ?8 C4 }- ;======================================================================6 b: @4 a; Y: [" \
- ;请求中断处理5 o" o$ D7 d2 H
- Irq_Program
4 |! y* J+ _3 d& q. W& n$ v - RTI# @8 v" C% I! Q
5 N, ^. X$ O0 W+ E; v" g% U& j- ;======================================================================5 O& s/ r R% p9 X' [
- ;中断向量表
$ @) H5 i# N0 \: Q - .ORG $FFFA! V; V0 W, T' M( F6 N
- .DW Nmi_Program ;NMI触发时执行& e" k( U/ T7 F! J8 o& G: z- ^. O
- .DW Reset_Program ;载入ROM时最先执行" o" N5 S2 N' o+ n$ f& p2 |* X4 @
- .DW Irq_Program ;IRQ触发时执行3 A' a5 S" c! J; h0 ^
复制代码
6 d8 @; e% @4 C, C4 K0 I9 r! R% H; \1 U9 m# i
: [% G) G6 X5 B' ]5 }" v3 d& c0 t {
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|