|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下- U3 `/ k5 G B" X8 p4 b
2 N- d! r3 ]. B: n+ d$ x" y
以下是主框架代码:: n) j" ~$ X* \
- ;======================================================================
5 b9 k1 a: o0 I$ }4 g1 P6 |) l# i - ;文件头3 C. V8 k* N; D. r
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量1 P5 e f; C$ q. H1 H- F3 Y. U# O" c
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
' H( H# x% `+ w/ D - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码0 e- u' j6 _: b0 p2 L# T& s/ Z
- ;======================================================================% ?8 U4 L5 R, c
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
& p, ]1 w7 F8 u9 a& p. e* ^6 x# v - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1+ l f* I* i% ]1 m
- ;======================================================================0 P0 i7 k5 M A6 I, q& y/ ?& s" ]- x
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1# K( Q& M0 W& ]4 [
- RESET_ADDR = $E000 ;主程序起始地址0 x$ c3 M q7 X! }' K" i" z8 ^
- ;======================================================================$ Q# [9 i' t* `4 X* i5 T
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
8 [" ~8 v( z" Q8 M) a) w* `1 | - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
' X% c2 d4 t% S - .INESMAP 4 ;Mapper号 (0-4095)
5 B( I. k3 L1 D8 w7 H+ l( w - .INESSUBMAP 0 ;子Mapper号 (0-15)
8 q3 q) ]) q4 q) u- { v4 B, b9 u - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
4 _$ c6 \* n/ G, ^# r t6 ]/ P - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
# ]6 M1 u5 j6 n* l f* H: r - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
& S/ A6 y+ D( f5 o' Q - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
2 o+ F' _6 J2 o: Q U0 y - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
7 t+ P- @( c) W8 |7 F - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)% ?( C( I% j `' b! l: L( m; X
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
4 m+ v$ A9 b/ B, \9 H- p - ;======================================================================4 k0 [1 m m5 e& a' c) L
- .INCLUDE "fc_demo_config.asm" ;全局配置
, h1 z1 C# A% f* b; C' N - .INCLUDE "fc_demo_constant.asm" ;NES常量
: f4 r2 ~8 B( K U2 x' p8 }5 { - ;======================================================================. r, y% ~1 ~; T) ]2 T
- ;音乐配置
3 a) y8 T; M6 I, L - .IF 0 = MUSIC_THEME 7 i$ s- l8 A" b% S
- .INCLUDE "data/music/Gremlin 2/config.asm" O8 V% r# y0 R1 v
- .ENDIF
5 ~) @. N* R/ { - ' i k; o8 P$ X( `& u0 H& `- V
- .IF 1 = MUSIC_THEME
" m$ H |2 n. P D' ?0 T5 ~7 [! r - .INCLUDE "data/music/Raf World/config.asm"" @, m! J6 R$ D
- .ENDIF
7 u7 N/ b+ F5 G/ Q& e, b - 3 u9 M# v( x: |" V6 N. ~1 e) H
- .IF 2 = MUSIC_THEME 6 G7 N) s9 S% o* n* H
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm". g& c+ i$ {4 z. `
- .ENDIF
) C! l& e8 N2 w# g; A
' n9 v6 \ u3 L2 m2 j8 n0 O- ;======================================================================! Y9 U; D7 D9 F" {' ?4 U
- ;引用CHR图像数据
. G, T+ H1 ^$ l3 U) F5 B - .BANK NES_16KB_PRG_SIZE * 2& q( K3 g$ ]+ k' J8 n
- .ORG $0000; K' `; U$ O6 f
- .INCBIN "data/bkg.chr"
+ o# ^0 _6 @) J9 \ - .INCBIN "data/sp.chr"
" B+ m- h' C' U1 P2 T4 G -
4 e4 g; Q" q' d' s1 P - ;======================================================================' z2 V6 T; t) g8 m; T
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank m* o7 Z/ \% g& Z0 s |
- .ORG RESET_ADDR
; T. f. n' ~' ?; B - ;======================================================================
: R" Z9 E( B3 W% M* ]" n - ;引用其他源文件
" T( F5 c$ j( [ - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
& L) `5 b% a( A% r+ l9 R: b& v - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理. }0 j4 i* g2 ~, M
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理6 \% k$ `: H4 t' W. I* K- c
- ;======================================================================. k& I) A' K; D+ i) v1 R9 _- l
2 i. P( B* }& Y/ T% g, W- ;======================================================================
! q: \1 I# D! ~9 [9 s - ;等待VBlank到来6 m) M7 K& v: D% k
- Wait_For_VBlank' r- r7 J0 \! i3 v1 A A, n
- LDA PPU_STATUS
- B% m7 K8 a) R4 ?$ z: _4 M - BPL Wait_For_VBlank
_0 D8 b' w* }! s - RTS6 q5 R! Z1 n- q2 |. g( T: t' P; L
2 y1 f/ z6 P+ q- ;======================================================================
' d: B* F4 ~$ K; v) _ - ;调色板初始化
6 d5 a9 F4 g: Q; P5 Q' S - Palette_Init( I7 | T, C7 B$ v0 ~
- LDA #$3F
J W7 N7 Q @' w7 f3 y - STA PPU_ADDRESS2 \. ~# i- G9 M# ]: e' L9 E8 ^2 A
- LDA #$00/ a! N7 ]& Q# J6 N( x5 Q( r; h
- STA PPU_ADDRESS
6 |7 g1 Z3 T4 I9 D; I6 k, _ - LDX #$00
0 \! \2 N. J$ ~, q" j* ? b - LDY #$20
3 N! G( v& S& h2 I - .Write_Data
" \/ d+ B; O+ o% @ - LDA Palette_Data,X2 h _( c- {6 e) {9 o9 ?
- STA FC_PPU_Pal_Addr,X
+ W; {7 p" V! N$ z - INX
* {% W: ?( d2 s! k R7 S$ X - DEY& Y) p- Z u" v
- BNE .Write_Data) H8 I' c$ n) j2 T# p7 b
- .End$ L/ y/ c! l% x1 N
- RTS, h% v8 `7 R1 I# J0 X+ i* C
8 c3 g( `7 i7 W* x- ;----------------------------------------$ j+ a( Z! D3 b, i7 | L* i
- ;调色板数据
. B9 r& h# E2 d1 G# i I- v - Palette_Data
6 ^% {5 p3 ^4 m W6 Y2 L; h8 ?1 N( j* p8 J - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
1 L4 d/ h0 O7 v - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22/ t) D' c8 G) m" I* g5 [
-
f9 z- v2 {6 B, @6 e s: p8 a4 r - ;======================================================================1 x7 |# u1 ^3 e) \$ X8 N
- ;命名表清空
! h* \4 H/ c+ a0 j' f9 l3 c" y - Nametable_Clear
: R# D8 B8 C' _) J' X! W. H - LDA #$20
5 ^- y; p' w. A8 V# ^' z - STA PPU_ADDRESS
8 g# _& c& [+ C. h9 H4 w/ F& t - LDA #$00# J# y* K2 u/ f7 q6 T- x
- STA PPU_ADDRESS
8 e! J3 K) J0 @# u2 L( g - LDA #$00% ?9 e/ b7 M% T& @, d
- LDX #$00
5 [* h: }) ~7 g! S3 W - LDY #$08. ]- J# w4 h% c+ x. I- M' L
- .Write_Data
9 V& ^; P4 M9 f- u* ?& |# f& \ - STA PPU_DATA/ G! X1 s. E& M6 S4 z
- INX
* D" {4 r7 H3 ` - BNE .Write_Data
* {8 w4 p) H% R6 B4 ?+ F7 r - DEY
9 ?# o7 d/ {" \. k( X - BNE .Write_Data
* L9 c+ C$ Y8 H - .End; o. @+ u$ k2 ]2 [/ e! J* k) e X
- RTS# n0 l; v1 G; K9 t5 M+ C0 b: i
- 5 e+ @1 C& y* S/ u
- ;======================================================================
" c4 e: }; Z/ Q$ c3 l/ K3 V8 Q - ;音乐曲目切换
, P9 x) ~! f7 k' \9 z4 h - Music_Select_Process
& `: \$ C0 y9 Z% S: g# u
2 q+ Z$ L& a* |5 M( U- .Pre_Music;上一曲7 c0 s$ j% m; w
- LDA FC_Gamepad_Once# F, R# w2 C8 W0 J
- CMP #JOY_KEY_LEFT
7 R, \1 }) W: X9 S - BNE .Next_Music
2 `% H( h, Q1 s0 H - JSR Music_Play_Pre
! m$ B# w$ ^. X9 R! O \ - .Next_Music;下一曲
2 L) z E3 a0 x8 W9 ] - LDA FC_Gamepad_Once
( h- k7 C" _1 Y+ r9 B. d - CMP #JOY_KEY_RIGHT
9 q: @) G$ ^ T0 |$ t - BNE .Next_10_Music
2 \6 F v+ U- C/ J* B: y! W2 ^ - JSR Music_Play_Next* r% K2 d) i- z+ q
- .Next_10_Music;上10曲5 |! Q/ K. G6 D* U0 X4 [
- LDA FC_Gamepad_Once8 J$ ]8 V8 q3 X. D" K9 x3 L5 V
- CMP #JOY_KEY_UP. n9 _; N) y0 ]- z8 {0 D4 e
- BNE .Pre_10_Music; i: c+ J. Z, D P
- JSR Music_Play_Next_102 @! q' M- q% K8 q
- .Pre_10_Music;下10曲
; J; N/ k& H% S7 w2 u' C - LDA FC_Gamepad_Once" o# Y' A$ ? B, G
- CMP #JOY_KEY_DOWN+ `% I/ C) O& \* c
- BNE .Reset
% V6 c% u1 v8 Z: h& y8 g - JSR Music_Play_Pre_10
O; d+ m" Q) B( R5 V4 q1 h% j - .Reset;重播当前曲目$ Z: V5 U% W0 a: J& j
- LDA FC_Gamepad_Once
7 f d" ^. k, A8 \% t7 y* F3 u - CMP #JOY_KEY_START: h* Y& W1 p2 a9 o. s
- BNE .End
( }& f( r$ X# O- s - LDA FC_Music_Index
3 P& v( a0 D! X g - JSR Music_Init_Process3 `3 i. ]1 z( O: c, a
- .End- o/ k& f3 `" b& E( j8 Q
- RTS2 ^8 k' z4 N4 Q5 C- A) J' h
- 1 a( {$ {) A# X. s/ X
- ;----------------------------------------------------------------------" s% G: D1 A, T$ e- Z Q
- ;播放上一曲
/ U. m2 }6 l5 }. b; A$ V7 t/ t - Music_Play_Pre0 S4 h+ c8 ]- j
- LDA FC_Music_Index
' d/ [' V8 T8 k. k) b - BEQ .End
) N5 Y1 L, `1 r& } - DEC FC_Music_Index% r- [7 c% [! N; V8 K
- LDA FC_Music_Index
: q! R; ?. R/ U6 x) i, K3 ]* A - JSR Music_Init_Process* m& c# q: i7 Z4 C3 P7 K! Q2 ]
- .End6 w+ g* }1 _$ r' g1 \# F
- RTS4 _9 U+ K" K! K9 }, t6 q# A2 q
- ;----------------------------------------------------------------------9 J. Z& f- ~0 F8 i8 S, g+ b. j3 V
- ;播放下一曲- \& ^2 b. w+ A% v+ W: K- i
- Music_Play_Next
* c" K- p6 U+ G2 t - LDA FC_Music_Index
$ i/ Z3 j% Z3 b; h: B - CMP FC_Music_Max_Index
- I( D5 f! Y; K2 w) q' E - BCS .End
. ?/ _+ `1 C* q) h' O& R - INC FC_Music_Index
7 `% w8 \' C& f7 A* q" H - LDA FC_Music_Index
% t* Q3 S$ C, f& J/ I |1 E7 Y3 I - JSR Music_Init_Process
' Q$ J7 R: g: O" p: ]7 z6 v - .End$ x6 w5 L9 k( Y* @% d% c* I
- RTS
2 k8 j6 ~/ T9 ?* w
& i; q# ~4 |4 R8 t- ;----------------------------------------------------------------------6 C$ y) T( \4 h, ~' `+ l% N* R4 ]
- ;播放上10曲7 ]% e4 c4 O3 j! ?( L+ d, z
- Music_Play_Pre_10
" R' ^+ e: e% \0 }9 V9 E1 y - LDA FC_Music_Index
, D& g" @% j9 B! o6 L1 j - BEQ .End0 G$ O/ i4 L9 Z6 m2 l" ?0 ]
- SEC+ T6 d' M. U1 H8 e( R* d/ P/ Y
- SBC #10
9 X% k* `! B2 ~- `% k/ m - BCS .Pre_10
- Z4 u' P# j" w; G& T( E1 b - LDA #$00
! Q& _8 Q1 G |2 v' }8 m1 J, U7 \ - .Pre_104 M! n. G6 _' i: y1 z2 q% ]* k
- STA FC_Music_Index |6 `% t8 u( w. ]7 ~8 [: N2 V
- JSR Music_Init_Process
r( f2 u8 y" ?" y8 U - .End
; ]( G+ J. ^" b, j - RTS0 d' u* M+ W* y6 K P2 L
- ;----------------------------------------------------------------------
& }8 q( i/ I9 b - ;播放下10曲
3 |9 P# T3 K6 o$ Y0 I - Music_Play_Next_10
' a* n/ F/ l- u6 Y% {/ O7 d0 r - LDA FC_Music_Index" U$ b9 ? n4 N0 K2 H" Y& c
- CMP FC_Music_Max_Index
/ u, @! o: V- i' [" z - BCS .End1 p, c: j$ Q. P) K
- CLC7 c- K" E. C' w
- ADC #10) i6 X5 z* I d I: l7 f' V% U
- CMP FC_Music_Max_Index; T0 g6 e* Q$ X( e2 n
- BCC .Next_10! I1 u& `: h1 Q" O
- LDA FC_Music_Max_Index5 K+ u# m' Z: [4 [/ c! L5 ?& F9 k
- .Next_10
; `9 J; F2 u0 C' o* `2 T$ ] X - STA FC_Music_Index
* _2 e$ k, p+ ]0 Q. l q3 q - JSR Music_Init_Process
4 x f1 t) H N - .End
6 C/ }8 Z6 }7 z; M/ Y2 S: ] - RTS
^6 O3 t' z% D - ! p! E5 j/ o* U+ e3 ]2 O# r
- ;----------------------------------------------------------------------
+ P% j6 Y+ ~1 ]/ c' M$ ~* f. C - ;8位十六进制转3位十进制制! ?( r' N. M# V) B3 z0 R; Y1 g
- Hex8ToDec4 A$ ~0 i7 E# ^& u
- STA FC_Dec_Data_1
$ ^$ m3 a3 P+ ~5 B - LDA #$00% u; M# i" |0 ]; N' q4 P: s; D
- STA FC_Dec_Data_100
' m6 v' Z2 {5 H- z - STA FC_Dec_Data_108 P, ^; q2 w! N+ U, n
- LDA FC_Dec_Data_18 c3 s% C1 @6 I9 S% }. V, G
- .Convert_100$ j+ a0 E( l: ?1 z, a
- CMP #100% d: u& X. n- {; S3 f1 N, e
- BCC .Convert_10
3 f: ]# |: w o0 t* L7 E- {; P1 L2 ^ - SEC
& j. f0 F0 m* A3 f4 I) P - SBC #100
8 H4 m/ W0 s0 x) O" f - INC FC_Dec_Data_100
6 K0 M9 }9 s# y! d4 e5 ]; w - BNE .Convert_100# o4 u) F3 l \3 l
- .Convert_102 |; I+ O( T2 ]9 P9 t9 Y; a" n
- CMP #106 i, N5 c: E; ~
- BCC .End$ N! }+ P3 x/ F2 C/ |! L+ L
- SEC$ y3 ~9 x! k3 p- r/ d% d
- SBC #10
: g8 G* i+ ]- J) J7 Z - INC FC_Dec_Data_107 F: s& F5 `/ g+ M% t+ g7 K# Z
- BNE .Convert_106 H* B: C7 J$ L
- .End9 ^( E h. @! R; F, z3 i+ S
- STA FC_Dec_Data_1( \ L" L9 ^0 Z4 W
- RTS, t( _4 L/ G/ \5 t/ m- G3 |
- 1 C# N& r! f8 }% D& F
- ;----------------------------------------------------------------------
7 N6 w3 X$ ?' e Z2 m7 s - ;显示曲目信息
( U9 O9 z( o2 ?1 G7 C, j - Music_Info_Display
+ d6 Q- {2 M+ a6 M1 W M8 E* O, F - LDX FC_PPU_Buf_Count
- N/ B8 M0 @6 j3 T) R0 U - LDA #PPU_WRITE_MODE_CNT_LINE
8 P7 u( `3 r% l0 B& f - STA Use_PPU_Buffer,X
- b: a( v. A0 e# Y, f+ c - INX
) Q2 r. x W" F" q* N( V+ Q+ L - * ^- L& \- ^" p: e) Y) O
- LDA #>MUSIC_INFO_POS1 O% U! P0 T7 F* T6 H4 R: d
- STA Use_PPU_Buffer,X' h, t% @) T' V
- INX
- k% Q5 T- W" R [ -
N, P s" n; s/ ^ - ;居中4 t$ ~7 R0 ?' ^$ |) v
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
4 b3 n' `9 L. h4 t+ T - STA Use_PPU_Buffer,X
1 a9 X" H$ q" c! T - INX
" V% F9 N4 Q E- u' D. ? -
1 U, f, d$ l% P6 Y* e) ?0 _. Y - LDA #$05- \+ a# {0 p* L; S& Z
- STA Use_PPU_Buffer,X
7 o* ?! W) t$ x- z1 ` - INX: L5 b4 `; ^" |! M3 L& F) \" M% ^$ x. X
- 9 M& n) c X# ^6 a- N# j; L
- LDA FC_Music_Index h# F v: L& {3 w) M2 Z
- CLC
S# g$ ^, @0 L8 [5 t! {8 J2 u - ADC #$01
: r) g) \7 E' m. C# | - JSR Hex8ToDec5 K: _. C3 b: s/ n+ _/ t
- 0 E* ?# O3 e1 z, j9 }# T( [
- LDA FC_Dec_Data_10) b$ Y+ d8 `% \+ k# q/ F
- CLC
4 v) K. R( K8 l9 n - ADC #'0'
6 j5 p' l% _2 {3 L* E - STA Use_PPU_Buffer,X
H: s7 ~6 F f- H4 ^ {5 `& d - INX2 C# i5 k3 D" y/ M
-
2 h0 |' o, C- d8 W9 V* `$ @4 R - LDA FC_Dec_Data_17 m! o& T( C% K5 \. ]( v. k
- CLC
7 W4 o4 w) Q8 g* L3 b) e - ADC #'0'
" h! b1 g1 [( V o% Q - STA Use_PPU_Buffer,X
0 z8 _* x6 I9 v F - INX7 \( L4 \" b9 m( m( p8 D
- % r% s( c5 X9 p
- LDA #'/'( l" Z. H }5 B N1 L' R
- STA Use_PPU_Buffer,X
. W' K3 H8 {8 g8 |- _: y$ ] - INX# ]+ L2 F/ i. q/ H7 {+ o
-
) P1 U6 ~! ]5 j; w1 M4 R - LDA FC_Music_Max_Index2 t* ]6 L5 n( {, X+ R0 s' J0 F
- CLC
( O" y7 K2 g# n. p - ADC #$01
: j5 t8 O8 A' d8 m( v8 O - JSR Hex8ToDec" _( n" ^% c' y# ?& G
- 0 O5 |9 @9 V |$ w) t, p
- LDA FC_Dec_Data_10
/ d4 p9 [( j7 k - CLC0 m0 q& L# ]$ A4 \$ T
- ADC #'0'0 \' q. I* _& O
- STA Use_PPU_Buffer,X
) Y$ N7 p2 G9 |6 n& @ - INX
& D; ^! e3 d# @: M3 ]6 \ -
- @- G' T2 H5 c% J b - LDA FC_Dec_Data_1
) k2 l5 k2 V% @8 B - CLC7 E* B2 n# K/ i# L8 K0 `% T8 ^. n' O F
- ADC #'0'
- V" V# d9 I+ e0 Q. r - STA Use_PPU_Buffer,X: v7 Y' \3 A% W6 P! o+ P! l
- INX4 w2 m! Y' b/ b: g% e
-
3 Q" n$ [" _$ V1 d" G" V2 T( j' G - .End; l1 ^" S' h2 t/ C' h2 y9 t
- STX FC_PPU_Buf_Count
& w6 k/ D% f) z, J V - RTS
9 b: H$ U. s) r: m$ [& n4 E- d - 7 q$ V, [9 V/ v0 z, z! W7 A
- ;----------------------------------------------------------------------
& H K. {* _/ P; M: l' a, {) E" p - ;音乐曲目初始化处理$ Z1 P* a0 V8 ?' @9 Q; w
- Music_Init_Process
! \, A% [9 j2 [ - PHA
/ x- ~5 }) Y% U% P - JSR Music_Clear_Process+ \) Z3 W. {. l7 ~+ S; N
- LDA #$1F% \5 s! ]# n/ y% ?
- STA $4015
/ }3 I' }" H5 P$ L/ z - PLA% d y& M5 _# S3 v8 l
- JSR Music_Init_Addr+ R' f* Z6 y* K% u b$ H
- JSR Music_Info_Display% e, d" t$ a3 h" Y
- RTS/ \4 y) _) V5 j" [1 y# N- i
- ( F# x$ F8 h% l# P# w
- ;----------------------------------------------------------------------
$ R9 p& T& J: w# g/ H* x! V! d - ;音乐播放处理
2 K8 X# S. p1 Y" A$ b7 n+ l: K - Music_Play_Process
+ Y' K# U$ G: c* z: ^% w( f3 _# L - JSR Music_Play_Addr% A6 r1 A" v' l
- RTS
' o" P3 r- h$ r/ g# b- h1 Y& F* J/ d - * ?0 ~( F6 e+ l( L
- ;----------------------------------------------------------------------, `+ D# ^5 S4 k; |- V* D; @
- ;音乐播放处理6 e7 N' B7 V9 P7 o2 b% E
- Music_Clear_Process
. `0 ^2 ^7 U% B8 @ v5 P - .IF Music_Clear_Addr
5 M5 D( Z' V5 h" L - JSR Music_Clear_Addr
% h7 D% \' W: Z6 ]+ C - RTS/ I% d6 O" w3 g* f4 A6 A Y
- .ELSE- d9 U; v" u9 W
- LDA #$1F
3 j9 a6 N. f2 q3 W - STA $40156 |6 y) u7 n% `5 f
- LDA #$00# q! z3 x, g; k+ D: |1 S# |8 x9 Y
- STA $4010
2 B1 X+ I% z) ?. q8 m" [- w! \- f - LDX #$001 A* Q# g% [% }% |
- LDA #$004 Z! F% G: D3 Z% u0 U4 d) b r1 T
- 6 l+ \ |, w i3 ]
- .Music_Clear_Zreo_Page_00 N( ]" k# H$ J; ?# B' u
- STA $00,X, A5 o3 ?+ @. ]& a6 S
- INX8 N5 j' `2 v7 H
- CPX #Use_Zero_Page_Begin
, B; E" L" Z: o6 K/ v - BCC .Music_Clear_Zreo_Page_0" [, Y' z' {$ b1 O- @* R
-
. }- K5 x7 v4 `/ u ^3 s - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
* y+ Z; j4 ^! q9 K: ]" [0 @) A: }/ @ - .Music_Clear_Zreo_Page_1, q5 C3 s( o' M% R
- STA $00,X3 \# D! _" n2 m) Y3 L5 ~* \4 {
- INX
1 W7 B( Y7 P( S* K - BNE .Music_Clear_Zreo_Page_1
$ U; G. a2 m( l' h+ ?7 y - ; i# K E* L, E
- Music_Clear_Process_1/ y' J& m. z H; ^
- STA $0600,X2 M+ E% ~" t; B% x7 }4 C
- STA $0700,X" E; @7 F! ~( O X5 I
- INX2 x- W5 ?- k5 M1 t% t0 u
- BNE Music_Clear_Process_1" n# s7 c* k2 j
- LDA #$10$ G- \" ^, W0 m. v9 g7 G
- STA $4000) U8 F6 O7 e/ h2 t' p5 a1 F
- STA $4004
# _8 x4 g. n2 N3 p8 Q - STA $400C
; G2 E0 @( K3 \6 \. k - LDA #$00
4 l u9 n: r6 h7 U6 h8 w9 i6 ~ - STA $4008
% }4 X) @3 ~+ L# L+ y - LDA #$0F8 ~ z; o. k& s( q& S- j; }2 w! c
- STA $4015
" o. {: Z; w: O# p1 { - .ENDIF2 j6 \6 @" b# N7 k% g d
-
3 `" q( u1 V( v$ v9 G! R - RTS
7 k# B2 _1 ?1 ] Y: c - ) l$ V* _: A5 b8 s% ?
- ;======================================================================9 l! r2 u# r2 N6 [, a
- ;重启处理
* v% I) J7 ?$ {" ?1 q. } - Reset_Program
* `0 {+ }+ I1 x* T5 X - SEI7 k7 i& b4 I' K; ]3 b6 c
- CLD$ {$ }8 n' t+ D, q) y
- LDA #$008 A* D" |# ~6 S2 ]7 V; {/ p
- STA PPU_CTRL
: v* N/ Z: Q) y" K. i: ?: E - STA PPU_MASK: Z3 Q9 C& H5 o7 C1 Q- M
- STA JOY2_FRAME) L* K5 Y7 Q% l \
- STA APU_STATUS) |' Z Z# _3 C& p. }/ \
- $ X _, K- P- S l$ \0 {5 R
- ;等待屏幕准备完毕5 Y" D$ e1 a4 ~; m9 }
- LDX #$02
$ B% C" {5 [& u" G - .Wait_For_Screen_Ready2 V- g! V4 l; M7 C' f, F
- LDA PPU_STATUS( F$ b# e$ H- n5 I( ^; a
- BPL .Wait_For_Screen_Ready7 ~3 B6 R2 b- | i& w$ `1 G
- DEX
/ @" _: q* O! y+ }1 r5 h! P - BNE .Wait_For_Screen_Ready
7 _. r+ U) T+ r - ' a- |% J* i5 a5 h+ V' W& i
- ;清空调色板
' M \0 Y$ l2 ~& P - Palette_Clear
" N' g' f% t0 Y; k7 v9 o - LDA #$3F# f( ?5 x9 ^( W8 w0 C
- STA PPU_ADDRESS
% ^$ ~) W2 H8 `- z! n9 M - LDA #$00
: i* l2 R- |( ]4 A1 u& A; @ - STA PPU_ADDRESS% A9 h/ r$ R* }* w, N) Z
- LDX #$20' r. I# h4 a- @: h: ?! [4 U
- LDA #$0F
: c+ w [$ t/ g/ `4 O4 Y1 U - .Write_Data
, s; B0 w' A l - STA PPU_DATA. M. w. m) ~6 a! p# g: e( H' ~
- DEX
2 ^: X2 O# ` C" n. G& o# Y! Z - BNE .Write_Data
( w4 E/ e/ Q! R7 V. h$ f' J
* K; g6 M \% ^* G, C" t- ;清除声音 $4000-4013
; t. E2 d) S% E; \7 i - LDY #$14! h& M2 R2 |" J
- LDX #$00' [2 T, d1 Q1 J% C6 U/ m
- .Sound_Clear
* \6 I8 S3 K3 F8 O" J m1 B3 s - STA $4000,X
2 J! _5 J/ a% l1 O/ ~9 [7 T( | - INX
* \- y/ j, ^0 G, X - DEY
' w5 w4 x, y3 N, y - BNE .Sound_Clear' u4 j d1 r! }# i
-
% j# R' ?: Q6 S* S2 o' p& m( P - ;清除 RAM $0000-07FF8 N/ L7 E, K5 e
- LDA #$00
6 q# Y9 {; W8 @* _* S# \ - STA $00
$ N) U" b) G, w; K5 C% U9 ]& z - STA $01
/ D* b) l1 s5 n - TAY- n0 C$ U$ Y; a0 G
- LDX #$08, g0 R3 w% S. A9 u" {6 |
- .Memory_Clear
$ X, g* L1 r4 Z9 q# C: ^% Z/ } - STA [$00],Y
! ]9 o2 M/ h2 Q4 _ - INY
5 F% v) T# d8 c, v) m3 u6 z - BNE .Memory_Clear
$ \9 \' W6 U; F - INC $01$ J1 R. j0 J+ N1 `. z _9 K
- DEX, J: O$ m/ A' @! V* W6 r; G) v
- BNE .Memory_Clear
! ]9 k/ U# t: h7 u7 d! d8 z. x -
4 D5 j1 s$ i- k9 E7 Y! u' Q- P. ] - ;精灵缓冲初始化
% [5 D3 V. ?- W" G3 x - LDX #$00
8 Q; q/ u* }1 j% i8 ` - LDA #$F8 L* {6 |8 S h. V; _
- .OAM_Clear2 }) B0 M4 {3 E# e `) K6 A0 C- R
- STA OAM_DMA_Buffer,X
i9 X+ B2 Q) Z' e9 y& j5 u0 F - INX
& `# J/ ?, M' a6 p - BNE .OAM_Clear: {) Z- o0 t; u/ J0 D: d# m
- n$ D2 \( [) q }! [+ `- o8 G
- ;栈指针初始化
( i1 }( }& M- K8 h, a$ g* q# v - LDX #$FF. E0 S+ u; [* N# N9 U
- TXS8 Y4 _3 b4 @. G! _- t7 p
- ! Q2 Q6 y1 P' Y8 _
- JSR Nametable_Clear;命名表清空
" u% A' F/ n, A+ k5 j/ j% a - JSR Palette_Init;初始化调色板缓冲' y: ]2 O/ D3 m! k/ r6 o! ]7 s
- JSR Static_Text_Init;初始化静态文本
7 V c8 X/ `8 r# M4 x; {( c0 u -
' ] h1 |' C# q- N3 z& m& m$ C - LDA #MUSIC_ITEM_TOTAL - 1
0 a& ? {! a" n" a# ~, n- q( H - STA FC_Music_Max_Index, S1 C+ n2 Y9 ^
- , d; l: w$ N; N0 z4 I% l
- LDA #$1F
. e4 E/ E5 a9 o* W% j$ Z; g - STA APU_STATUS
3 X3 R n c. G$ s; ^ - LDA #MUSIC_BGM - 1
4 o# L8 D/ d- } - STA FC_Music_Index
6 c" P; B8 e( c- u4 P& l - JSR Music_Init_Process;音乐播放
' {5 l% G# S: k; N -
0 H! j2 N6 ~& b - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
6 K: X5 y# [1 b- w: w: ` - LDA #$1E
7 A3 l3 B+ g# B7 x7 X2 Y9 P - STA FC_PPU_Mask_Buf
) E, H0 @6 x, C - # i6 r7 \# C5 Y; ]; @
- ;启用NMI处理
: B' B# Q* K% V6 ~( q - LDA #$801 }% d8 p6 Z; X0 ^8 P8 t: ]
- STA PPU_CTRL7 r4 Z6 O3 Y, e: E
- ' _" v) b1 t: \- Z* L
- ;程序循环, 剩余工作交给 NMI 中断处理
0 D! n; B( I- s( l- i$ |) e% a7 A - .Loop5 M- Z! W$ @( A& r H- i2 n
- JMP .Loop
2 _ v3 b! H% H - 4 ~ V) _& P& [: {% c) s
- ;======================================================================
2 V% w; z5 b( F. p - ;不可屏蔽中断处理
/ ^# t& H3 T/ S& x& R - Nmi_Program
9 W: H: P; B Y( V r - PHA
+ ^5 F. Z, @2 C - TXA2 _: x- K8 d3 i; c$ f0 B- s7 T
- PHA* T7 q" K- z" m! |
- TYA# Z3 K9 t3 S. @0 v# ?5 ^. m3 X
- PHA9 L3 m& H5 ^1 w. r2 E, e
-
# F7 \. d* G% N0 K& p7 f - LDA PPU_STATUS;读取使得 PPU状态寄存器复位6 S) M4 y0 N) e
- G, ?; Y3 o/ ^3 s0 Y8 F& Y" ]. x
- JSR FC_PPU_Procrss;PPU处理
3 X1 a; j6 V6 l4 o. n G% H# |1 y - 7 Y$ R! |5 Z) z( w! V! A9 t! `
- ;精灵内存更新
2 W% H% B9 G( g, G - LDA #$00. ]3 S: h6 P& P. B; v3 I% N( v
- STA PPU_OAM_ADDR; C W. Q0 k$ V2 m7 G0 b
- LDA #OAM_DMA_Buffer / $0100) P# f3 Y: y! l% I7 h
- STA OAM_DMA$ e! W- a# \ ~3 u
- 3 k# d& p2 }* ?* y4 K
- JSR FC_Gamepad_Process;手柄输入处理
: c, F! p: I! a3 Z& d3 ~ - JSR Music_Select_Process;音乐选曲处理
+ b2 k, h! b: A6 b$ S - JSR Music_Play_Process;音乐播放处理5 z# v% X" i( b3 _
-
% {+ ~7 ]6 K* [) ? - PLA" y" }+ k, e! i% [
- TAY
4 ?7 B3 ?8 J& g9 i7 [% c - PLA
* D& E6 o2 `4 m6 F9 s6 O - TAX
% l% u8 t) Z0 `5 r, `' t2 ]& U - PLA/ {1 h: g2 b, c2 z4 ^7 {
- % W/ J4 ^9 D" T) N
- RTI
5 o$ `1 t5 f ?/ k
) `$ M/ f: L G$ u- ;======================================================================* D3 g2 a! z+ N3 F5 k* ]$ O
- ;请求中断处理$ C8 F( ~% O* Y% M, l
- Irq_Program
+ [& g( i4 N+ I1 b- m! { - RTI
+ ^) p. e5 [: S z1 ` - ( p( O$ ]% s( l4 C8 B
- ;======================================================================
5 D# f' n2 u! Y( Z8 Q X - ;中断向量表
0 ~ ?2 A6 y: [$ A6 t% s - .ORG $FFFA, b* Z( V; f! L/ P' q2 {3 h+ Y
- .DW Nmi_Program ;NMI触发时执行
/ Y3 r" U" h% K4 x8 `! M4 Z - .DW Reset_Program ;载入ROM时最先执行
7 V1 u0 p; y& M0 g* O: L4 B. z - .DW Irq_Program ;IRQ触发时执行
9 b# [4 R% q0 J' l7 }! [) i# e
复制代码
! B: k8 ?5 K1 Q; N% N$ r
2 l6 l0 P G( }! E. D# }. D
' F8 y9 v1 o: _) `2 q# r9 z, uhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|