|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
5 `9 O: ^# l9 J' v8 C
4 p+ |% V m7 k M9 c* |以下是主框架代码:( u+ x. _# V0 _+ N
- ;======================================================================
. X( ^" o2 p; T - ;文件头
) @" a9 s6 F! \ - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
; j) ?6 L5 |. N* `" x - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量3 n" n+ j$ k5 n" Q- {2 w) Z1 l
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
% b, i! i s4 z# ~, s/ h2 L - ;======================================================================
; a8 ?0 c) i! T( ~( B - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2* T& Z# z9 v6 p5 n6 D
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
7 {1 j) y o* K/ ? - ;======================================================================3 e# g9 h3 l8 G5 b }
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 15 X, E9 e9 x* N: ^/ ^! W* Z' s
- RESET_ADDR = $E000 ;主程序起始地址$ R+ G5 v/ a' a
- ;======================================================================
% _* L+ {1 K/ V# |2 ]# v - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB6 ~$ L1 p A; H6 p2 F- Z7 q
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB8 Q' j- H G1 s- @* K+ V8 n, I4 P# s+ K
- .INESMAP 4 ;Mapper号 (0-4095)
& J% X6 R1 \( l+ i+ p, ]) I5 M( D# S - .INESSUBMAP 0 ;子Mapper号 (0-15) ?6 ~. f- \4 B
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
3 i L; v. G4 h7 H! m - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
7 _5 V# f/ U7 _2 ` - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)6 p, \" f: I# j- |" s
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)( L; ]6 ?- T2 M1 a. w+ J* V
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)% |$ t2 ]/ }+ m; x! b
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)5 U. I6 e# X! T3 d) w9 U( D; p. D
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)3 i; l$ r( I& \ ~
- ;======================================================================9 _) a. p* s) F! G/ d
- .INCLUDE "fc_demo_config.asm" ;全局配置3 W9 X7 c3 S' o3 d3 B
- .INCLUDE "fc_demo_constant.asm" ;NES常量4 S( E; C6 Q- \: }" i$ a% E: R
- ;====================================================================== V4 k5 b) u [' [7 s' w8 I
- ;音乐配置
- ?' J+ d* z; \7 K" u - .IF 0 = MUSIC_THEME ( k% I; g" ~: W& @3 H, a& p
- .INCLUDE "data/music/Gremlin 2/config.asm"
, ~/ p7 W; O& X& i0 Q4 `! M$ m - .ENDIF, s: x& a4 A+ J+ f1 S
- ' D1 E+ I: `6 T
- .IF 1 = MUSIC_THEME
" r& F6 }) b7 l" I - .INCLUDE "data/music/Raf World/config.asm"/ i% ]4 ?& I2 p* X
- .ENDIF
4 C, O1 s8 [2 M" }. p4 R$ H% A& J- ^ -
7 o b# F" G5 e% S - .IF 2 = MUSIC_THEME + W5 W) t% |% @1 L/ B4 M$ }/ B
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"& z$ o5 `7 m$ `8 f) B
- .ENDIF
6 R M* T/ D6 h Y. K) w/ @9 U1 s
/ k! m; }. Y+ x- o- ;======================================================================
3 X. O8 {* J: Y; c$ r9 w- p - ;引用CHR图像数据5 q, V0 C2 w+ ]4 d' X% i9 L
- .BANK NES_16KB_PRG_SIZE * 22 a5 W6 l& \: L w+ o3 o7 C
- .ORG $00004 s) E6 @* x1 {2 A' S2 d
- .INCBIN "data/bkg.chr"
4 C5 n0 ~' d6 \* b, r/ C - .INCBIN "data/sp.chr"; s+ n6 N8 m3 o- {2 {
- 8 a6 Z8 {% J6 j3 V/ {2 T
- ;======================================================================1 \# T: Z/ I) ~
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
: k3 _* E0 s- }! {' Q - .ORG RESET_ADDR" E& u' q8 g$ }4 B8 H* i. ^7 v" ~
- ;======================================================================
8 J' {) ~. F8 q8 u& @ - ;引用其他源文件- M# Y8 @, y" y
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
0 y3 a; f- X7 `% D7 T5 J* ]/ c. B - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
- _* `& Y5 n- c* L. ?/ B - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
) P7 A) z) a- |: Q3 L+ V& I5 Z - ;======================================================================! _7 u& ]0 Q2 D: L& [
Z- q& @6 J! r4 q( O3 l- ;======================================================================, j( F j* g, V) m
- ;等待VBlank到来
) V, b0 F" m) d9 F, `, c/ E! Y0 O - Wait_For_VBlank
) C( @ p) n! ~, m5 d8 [ - LDA PPU_STATUS1 o. |, ]( c" ]& C! j5 G
- BPL Wait_For_VBlank: ^- z4 c* `* W
- RTS" l$ v @$ G/ e7 G* T
- ! {# v4 E2 ^# f8 n4 u$ f
- ;======================================================================
4 c* @8 S G# {( G% S* _ - ;调色板初始化# j5 V0 P; n1 P" e/ G( }
- Palette_Init
/ t/ ~* R6 n9 D: y7 f. ~# _. n - LDA #$3F
, f4 ?& y0 ~, x3 x- D2 M1 z) D8 v - STA PPU_ADDRESS" R- S/ K5 _" b% H# p
- LDA #$00
y' [! M x+ o# r* ?' |9 I) s, I# E - STA PPU_ADDRESS H/ j" H# g$ c. v, P
- LDX #$00
/ H" K& Q( k, ^2 D% V& W! |9 }! P - LDY #$20
, ~3 M2 Q& z0 X I! P2 p5 \5 C - .Write_Data
: u6 P. w3 N$ k: X - LDA Palette_Data,X
9 Q! l$ V/ Q0 Y1 H7 a - STA FC_PPU_Pal_Addr,X
9 [* q9 v6 \' ? - INX( S# |7 g$ T9 F1 V v
- DEY
8 F' q8 p( L2 @( c) j3 e - BNE .Write_Data
: v9 N% f, n) w2 _. M4 c* ~ - .End9 D6 J! h( _ @4 L9 z+ R) G7 n
- RTS* `. r4 T+ b0 l7 e) F8 L
$ Y7 g" R1 T a5 q% L- ;----------------------------------------' Z' T) _) A: M* d9 ~* Q' B
- ;调色板数据
% z [5 ?2 G3 G5 l! N' Y2 w6 L0 E- v - Palette_Data
1 u" k0 m0 c" @6 l* T3 t - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B( B1 \( F5 j2 ~7 A
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
. U5 ?6 @$ K6 U1 J7 t0 j - ! c) }% d5 S% ?% c) F0 B
- ;======================================================================
. X# Y5 u; v( v3 m- h& V# ] - ;命名表清空
" c; |4 k. i6 z1 \; B( b - Nametable_Clear* _! A8 U+ ~: ^# ]* ?
- LDA #$20
+ m# ]+ L5 A3 R+ ^7 R2 {9 n5 `9 a - STA PPU_ADDRESS+ _1 P4 K( u: s" q$ ~' \* d: s( r
- LDA #$00# R; Z& L" J& i& {6 @6 t1 S8 |3 u! ^
- STA PPU_ADDRESS6 h" K# b y8 y K* ~- z
- LDA #$00+ }# L. U) g* u8 z( {/ U: _2 H9 M
- LDX #$00; R2 O4 x! D& f2 @" j$ c2 w
- LDY #$08 I% n" n- |0 P3 h4 i8 \
- .Write_Data1 U$ y3 J B( h1 U' E. f- Q
- STA PPU_DATA
# k9 W l9 V6 V' P - INX9 D4 r' y6 c7 l5 A6 E+ }/ q
- BNE .Write_Data4 W! J) g6 b8 ^- h
- DEY0 M) M2 F# z5 V) R
- BNE .Write_Data
q8 ^; F. M: ]7 r W* X - .End; {' w- o( g: l
- RTS9 o) O- J" a$ F# W+ E& l; p
- 1 ~! s5 P$ ~/ X9 W7 J
- ;======================================================================/ i: @$ x& F: m- o
- ;音乐曲目切换
( q+ [" u% X: u3 } - Music_Select_Process5 W, n$ ] [1 [5 S& U
5 s* `9 U! N& U2 C2 N+ W- .Pre_Music;上一曲
% K! Q1 J9 f/ N5 t, y" Z: {1 E - LDA FC_Gamepad_Once
3 B( u" G/ P, V2 j P+ q1 i3 V - CMP #JOY_KEY_LEFT
) i/ q5 [0 T* y - BNE .Next_Music. Z5 |( }" h6 S* a: ~8 E3 x
- JSR Music_Play_Pre
) u! O& N: m) v+ r - .Next_Music;下一曲' k K* k" ?% q! f5 w* \
- LDA FC_Gamepad_Once
+ v" c: A; F& k" n- j1 v - CMP #JOY_KEY_RIGHT) h& @' ?6 x6 h8 r: T* {4 V
- BNE .Next_10_Music i7 v! G3 o- }5 \
- JSR Music_Play_Next
( X0 z2 j, ?3 q' j) n: s - .Next_10_Music;上10曲
5 ~ D+ ]8 \9 w/ c - LDA FC_Gamepad_Once5 \+ M- Y7 C. J6 }1 ]4 W
- CMP #JOY_KEY_UP
% n$ Z+ _8 U( d - BNE .Pre_10_Music% q. o5 v6 _ M t4 _/ A [2 ~
- JSR Music_Play_Next_10
; A A, m! b1 B+ W - .Pre_10_Music;下10曲
Q: ~( n. J, q1 W- `0 ?. E& r - LDA FC_Gamepad_Once0 o* y/ Y3 F2 u& P
- CMP #JOY_KEY_DOWN
' N4 O" g. b' m; s. v5 Z5 u. q - BNE .Reset! F- `- r& H% p. Z4 Q% r8 {9 H
- JSR Music_Play_Pre_109 N; I7 R1 \9 s& c. N
- .Reset;重播当前曲目
' J- ?# p5 i( F- r - LDA FC_Gamepad_Once$ A. V, q- k) {6 c
- CMP #JOY_KEY_START
3 |! A0 I3 c% [1 _0 k' Q& V - BNE .End/ W# @/ Q! G z+ [* l
- LDA FC_Music_Index
) |9 M" h* q2 J; Q- F# z' q - JSR Music_Init_Process
4 K; K( V9 a r/ ]3 M - .End
" L; P. x2 F% A- q; m - RTS. N* b' n5 I1 J) M* V2 m
0 X. ?0 i& |6 i) Z2 i- ;----------------------------------------------------------------------5 ^( S L6 M) i* F* Z2 G2 {1 T
- ;播放上一曲
B( J; T/ J p2 d - Music_Play_Pre
/ ~! k/ r& u+ _) h5 D - LDA FC_Music_Index
! Z2 f$ C1 ]1 p3 N) o# l - BEQ .End) |7 p5 ~! V- h0 E, V7 ^6 G
- DEC FC_Music_Index
4 y5 q1 m1 @$ p2 e! y - LDA FC_Music_Index# U9 r1 \6 r* T# w
- JSR Music_Init_Process
! b7 r6 m) B* C8 h0 P+ {3 Z' |$ m - .End
2 d% C9 m" M! M- \2 o: n$ v - RTS
- M& }3 _0 k$ ` - ;----------------------------------------------------------------------" }. J# B- p/ c9 o+ l4 o
- ;播放下一曲. Y. ?5 a3 O4 e4 @: m5 z3 C" q7 q6 D
- Music_Play_Next
' C( L* D( I* U - LDA FC_Music_Index
' B6 f4 g5 T% l8 T: n - CMP FC_Music_Max_Index$ `7 h3 }! |- p! \& r! v( ]
- BCS .End2 h, n' O3 K, c% m1 a4 _* g, `
- INC FC_Music_Index
8 D0 f4 L8 D2 Y7 } - LDA FC_Music_Index$ r5 d6 R ~! k5 R/ @+ H3 k
- JSR Music_Init_Process4 Z. u4 H/ e% i* H( @) P6 z5 C& f
- .End
) |1 y; w6 h& K' v - RTS
/ e% A# {2 b6 U( n: M% |9 Y
+ i& k- Z/ S2 @5 u# U: `- ;----------------------------------------------------------------------
6 Y8 D# H/ C3 p8 q2 R; L4 S - ;播放上10曲
0 g6 L! v' P! u# l0 H# w - Music_Play_Pre_10, F" T" j" N! T( H' L" O
- LDA FC_Music_Index& o+ {' z- `& B. {3 @3 y3 N
- BEQ .End' W* D7 W6 ?4 O' G& X- w4 F
- SEC, ^- `" t }& Y2 `
- SBC #10
7 j- f9 L; M1 b4 Z - BCS .Pre_10) G" W4 g, A6 @% ]4 A8 n& M
- LDA #$00
9 Z, J" f$ \: X. Q - .Pre_10
9 h: q3 h: I8 |! X* v - STA FC_Music_Index4 ?( C1 @! ^6 P) S$ W8 B
- JSR Music_Init_Process5 I. H' T2 J X- b
- .End$ @5 ^) r) O8 d. H4 }
- RTS: \5 O* ~4 f) T0 V* T$ ^' l
- ;----------------------------------------------------------------------: d3 `# W9 m, y+ e4 Q; b0 s: i
- ;播放下10曲4 X. b) q' R/ Q: @
- Music_Play_Next_10
2 k3 R: d" ^7 {% G( l* m" z2 q, o - LDA FC_Music_Index/ d x+ v( }( Y+ L' E. M" A% a
- CMP FC_Music_Max_Index
. R, V, G3 C/ G" [! c+ q6 D - BCS .End
] z3 Q1 M( Y1 l' t3 F - CLC9 M' _9 l7 x- T; o; C
- ADC #10
* p1 w8 |+ C: U - CMP FC_Music_Max_Index
) U5 D. P2 W) ~) |9 b i, B! m - BCC .Next_10
9 g5 w J( W& u; O( ~ - LDA FC_Music_Max_Index
; l7 @ H' z+ O8 I3 V6 c - .Next_10
7 t. x" p5 V* O) M6 H/ w - STA FC_Music_Index
& p; x( b# o: @* f% q' q - JSR Music_Init_Process0 Q6 b7 h, r. m4 _) x. ?7 ~
- .End
" G6 _0 B4 Q4 u3 G - RTS! Y) C# F/ ~/ y9 j4 d/ s: |
- 7 i3 V0 K0 E, n+ D: X
- ;----------------------------------------------------------------------: I6 I$ d K' `# {# s
- ;8位十六进制转3位十进制制
5 T% w1 d, v4 R4 W: {2 m; x - Hex8ToDec" V. X0 A9 R5 U" T' |$ L
- STA FC_Dec_Data_19 D8 g6 q( G) L9 M6 R6 @
- LDA #$006 N9 _9 `6 k8 S# t
- STA FC_Dec_Data_1009 m7 ^6 l5 Z! T; B
- STA FC_Dec_Data_10! a; b/ j! h- ~ _ W- J" U2 t
- LDA FC_Dec_Data_14 A d7 Q' E* B5 `2 J6 ]
- .Convert_100
. l7 N: K5 @5 \ - CMP #100
V% x6 ~( j' k% j y. g - BCC .Convert_10+ `0 q0 e; @ Y4 ?* n5 O5 C& P
- SEC0 F2 i) P" Y' `7 }
- SBC #100
5 h& P" @0 g8 Z7 l! k3 Z - INC FC_Dec_Data_100
. }; N( @! i6 v+ s: B( G - BNE .Convert_100
a. \6 B, b* ^1 B' W - .Convert_10
. I5 I. s9 q$ E4 ?& o9 Z - CMP #10
+ j# W; I. f4 S1 H8 N - BCC .End
' ?9 M. |# `2 D - SEC. C0 n+ w. v B* p, T4 |
- SBC #10
/ U% O1 m6 q! ? - INC FC_Dec_Data_10
6 m0 T# ], l* E. X; Y8 c) V6 W - BNE .Convert_10# q9 E4 X0 M0 r' t& |4 f
- .End
2 S1 q$ Z& o7 V4 T. M# Z - STA FC_Dec_Data_1
! c7 q% P4 f) y2 s: r - RTS0 t2 h- |1 ?: `$ c
7 T6 O: v: M. z$ r0 x- ;----------------------------------------------------------------------) y: |0 G1 d9 Y" p/ E" @" o3 _9 X
- ;显示曲目信息9 n. K( ]0 q. s' \- O# M
- Music_Info_Display: I/ K! Y, N9 G: u+ E7 n
- LDX FC_PPU_Buf_Count6 H" k# S( O9 u4 Y8 [$ V+ j
- LDA #PPU_WRITE_MODE_CNT_LINE
; l! h8 H3 r( G8 y- M( S6 H" E7 z4 J - STA Use_PPU_Buffer,X
1 `2 _& S/ `. {3 { - INX
& W" c0 j* W( _. S9 s+ R( | - : O/ f, z/ q( J/ D* y
- LDA #>MUSIC_INFO_POS' a0 n* m* e8 o% z( f2 V( x' a1 h( ?
- STA Use_PPU_Buffer,X' K7 I0 ^' Z( n( w" X8 x
- INX- t6 p! M1 q, n
- : U! V5 T8 `5 c$ N4 D- K2 e, j) s
- ;居中1 S# }; ?1 S2 S& {1 \
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2- R: U3 t% N7 @. ?8 @0 G4 S9 Y
- STA Use_PPU_Buffer,X- P4 t, T$ S' a7 c0 ]6 {- x
- INX/ G. j, J" F; d0 x9 {
- 3 V2 N5 {* G! @9 B% o9 Y/ d) }
- LDA #$05
5 K/ I6 y- q; s, E R - STA Use_PPU_Buffer,X/ e r4 K. k- R
- INX9 [+ O1 P! w0 b0 z1 e/ I
- ; d' Z3 [) c8 G) N8 X, t1 ?
- LDA FC_Music_Index
' y( `' c% A8 n* h) K; {! H; A - CLC
, Z8 A: o2 Q+ B! o# Q8 d3 q - ADC #$019 g& Z) [8 T7 `9 Y& ?, `
- JSR Hex8ToDec. v' d# v$ C, I
- " z& ^4 P. O! U5 n) X
- LDA FC_Dec_Data_104 k! g; y; n% o' N. h3 g3 v7 v& u
- CLC5 X7 U1 v5 L' S& Z. X2 L/ |6 o
- ADC #'0' i9 B1 K6 a: B- a$ c: m
- STA Use_PPU_Buffer,X
9 s; O d* ?* v* p, m - INX. M7 m* X( x' z9 E h- ?
- 5 P( O4 I- K r6 M) V
- LDA FC_Dec_Data_1
) x9 u3 _1 W8 Z& J. Y; V7 a3 U% v - CLC) w+ o! h* E5 p4 ^
- ADC #'0'
1 h4 ^9 S ^% U3 U' ^8 ] - STA Use_PPU_Buffer,X: \) }1 E/ F8 m5 @
- INX0 |& i ^- h# v# S8 Y
- ; ^1 F+ t! i- C4 S7 I* S
- LDA #'/'
: S2 h4 M% D e. J, R - STA Use_PPU_Buffer,X( M9 f- G2 ^6 q1 z8 p$ B
- INX# @" u: R2 @5 r5 p
-
" d: [ ~0 @; U - LDA FC_Music_Max_Index' N9 s2 y9 g1 G& q
- CLC
. u: c; _; m" `+ Y# F% J2 j2 o5 | - ADC #$01
6 C9 f' Z! w" c+ I; w g - JSR Hex8ToDec
* N# I7 q/ L' [; c' y; T' x( \% Z) c - - q, h/ ^- S# J. z2 F9 R
- LDA FC_Dec_Data_10
+ ~8 B/ }) ~( d - CLC
$ B9 p4 i w5 d2 @9 \! Q - ADC #'0'' ~$ g7 P) E% E$ U% e h
- STA Use_PPU_Buffer,X5 }& g( a4 ^' K0 | X, i
- INX
|2 p4 g0 R l* F3 P - . d% e, I; [ u& S( v0 I8 z
- LDA FC_Dec_Data_1
5 E; ]2 B! L4 ]% u% z1 J% q - CLC+ o# V) `) @9 G; m# l% C
- ADC #'0'/ B2 C& a! E5 c- V8 c
- STA Use_PPU_Buffer,X% [9 z1 r( c& ] ]: Y
- INX
6 C9 n% o6 j$ E6 U8 u$ b3 G3 | -
' E$ m( F9 X9 l: i1 m) ? - .End
* w; ~. T( M6 r. }! o" [& r+ j - STX FC_PPU_Buf_Count) I8 H' ]+ y4 M8 f
- RTS
3 j5 b8 z2 Q& ]" O) @2 ` - & ?5 z& i4 j3 F3 h& e5 B p
- ;----------------------------------------------------------------------
& {+ i! x3 m$ V - ;音乐曲目初始化处理 |5 @- S" y) u, J4 E
- Music_Init_Process
# o: L% f a k - PHA
& c$ \/ l& s4 ^/ a - JSR Music_Clear_Process
. y. e" `& L1 e$ v$ o6 F& z; q - LDA #$1F; Q" `, M2 |5 C6 R/ x
- STA $4015
9 F5 A. C$ O, t* _ - PLA; L$ g# [1 ]5 R0 T' p
- JSR Music_Init_Addr/ ~7 p# X! @4 |* b4 m5 f
- JSR Music_Info_Display! h7 z4 k. b- j5 m" C+ Z
- RTS
0 v2 o8 }2 D0 b2 m- S$ z - * C9 d( ^1 v% C: R" w/ ]( o) c- Q
- ;----------------------------------------------------------------------
|! ~, _8 d _8 W' c( L" p7 b - ;音乐播放处理
/ O9 [: y `# q/ D# L* z - Music_Play_Process
* b/ p2 {/ C1 D - JSR Music_Play_Addr6 u$ j2 s% U! F4 t$ w8 J7 J9 c4 }
- RTS
: ~( R0 E j* b' V. [
( D8 \- d1 a" i) j; s6 V- ;----------------------------------------------------------------------
! T. N0 y4 E; ^0 I9 h - ;音乐播放处理0 q6 q) @$ U8 y8 \9 m. e/ J
- Music_Clear_Process
4 S' Y* q/ u9 ]3 p. S8 o N/ y - .IF Music_Clear_Addr
6 u' v3 | P2 _6 c) Y8 Q - JSR Music_Clear_Addr
( }4 B) \$ ?; K9 P8 { - RTS
: v1 S# w. F: \ - .ELSE
' x4 k. E. r5 F - LDA #$1F5 x- f: D6 t% ~: l
- STA $4015
9 D" y1 b. O8 f- G# w# D& s6 p3 G, Q, i# Y - LDA #$00
A, {* m. g# h9 G - STA $4010
6 b8 J. F0 n5 r/ }7 e3 V - LDX #$00
+ Y0 o! h6 G/ I+ { - LDA #$00) |3 l1 z$ g( A2 @9 j
-
4 C j" T1 l- z# G4 F7 B& q - .Music_Clear_Zreo_Page_07 _& |* N* ~1 q$ ?- R6 |) k
- STA $00,X
' I0 X8 `8 P/ z1 Y - INX
+ V" x3 {3 g* ] - CPX #Use_Zero_Page_Begin
7 [. u. g1 B( l' r - BCC .Music_Clear_Zreo_Page_0+ M0 \3 B2 t: C# H3 c$ [4 l) m
-
9 L' c& S, G* }9 I- ^( u - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
3 Y/ S; B1 h( d: t- S - .Music_Clear_Zreo_Page_1
! j( _3 q: U! c - STA $00,X+ I' O& O8 q9 Y8 X
- INX
' @) \8 `' u7 @, I3 T1 Y - BNE .Music_Clear_Zreo_Page_1
1 I2 y* |" i w/ x: P; P8 R+ ^ -
( |* C' C0 `6 i) F' @$ x/ n( p. k8 p - Music_Clear_Process_1
" j" Y" e- ]+ m" v } - STA $0600,X. K% g6 X* q; h+ n7 E( D4 m
- STA $0700,X
+ b5 _5 C% d9 A: B( ? - INX: j# t) h$ K% H3 T& I
- BNE Music_Clear_Process_1
! r$ p, t2 Q8 {) \* u* |0 C5 Q, { - LDA #$10
! s8 _9 m$ t' l, Q4 J - STA $4000
: r2 `5 h" ]/ \- ]) W+ ` - STA $4004
: m, g3 {, ~& B9 n - STA $400C
( ^3 u+ r" U3 ?5 R- h6 f, X - LDA #$00
' }, Q0 y( t, p4 s$ P) [2 n: y - STA $4008
$ @8 V) V& H0 F! D# l - LDA #$0F
! w0 v! {: m, E4 U - STA $40158 r' ^/ e {3 {$ S5 u
- .ENDIF
! k! D5 z% a0 b4 O7 b - 3 @* K6 @# _0 ?% ~
- RTS
9 v7 U' o8 I @7 Q
, `0 f/ x+ Q/ {; e0 Q( N0 q; e; ] y- ;======================================================================! v$ E; `# _# S! P' v
- ;重启处理
. @( Y" G5 Q' `# S - Reset_Program* a* V. ~2 F; g1 [9 s
- SEI
1 K9 l( [. `- v4 j! L1 M - CLD
7 n% J& p i1 E, M - LDA #$00' ^$ g" {$ F9 ^3 ~5 _ G( |
- STA PPU_CTRL& @9 A& z$ F* Z7 Q. E! I
- STA PPU_MASK; ]+ e; C9 b: [4 {5 Z
- STA JOY2_FRAME
% }: Z7 e1 [, F4 X# h - STA APU_STATUS" ~5 A) [( t$ j+ ^. p- J. V: g
-
4 u3 U! h3 N8 ]4 ?% p4 L1 t0 f - ;等待屏幕准备完毕
( w' c5 }/ v0 P - LDX #$024 e7 }% ~7 a" S! ^
- .Wait_For_Screen_Ready& s( _ t5 {+ [- T
- LDA PPU_STATUS9 p) t0 o! `; J+ M& f
- BPL .Wait_For_Screen_Ready
; a2 P( c+ x/ s+ G( V4 k, | - DEX3 X9 [1 c% M$ j9 Y+ N6 A
- BNE .Wait_For_Screen_Ready
6 P5 E: X1 U, x' C - 9 ]6 t3 t. U) F; K$ z, c
- ;清空调色板. a& ^2 ?* |0 r4 Z9 A0 h0 W
- Palette_Clear7 _' B+ }2 w% o3 c7 h: \) o# N
- LDA #$3F
# O) H- d! d" m9 D9 ? - STA PPU_ADDRESS7 I4 V1 [; W4 b0 N' M& a. B/ D& Z; L
- LDA #$00
& |3 a' l# D1 z9 ?2 Z0 X - STA PPU_ADDRESS) M" r1 n9 F4 p6 d, A6 J
- LDX #$20
- ?$ B9 R9 X7 ^1 C - LDA #$0F- s6 Y/ G' G, H8 ^$ B6 Z; u
- .Write_Data2 E T3 a0 l! r3 U3 P1 M
- STA PPU_DATA. A: D' y5 P) I+ L, u# D) w+ u
- DEX
b- c# X4 Z( L- l$ {1 _9 \) w1 ? - BNE .Write_Data
1 i+ K: t8 o" k- z2 |
1 U- }# A8 V$ ]- ;清除声音 $4000-40134 c$ x! k% g0 U- \
- LDY #$14
, o, H2 W/ S) f B8 b; \% A - LDX #$00
& s3 Z5 B( [0 B - .Sound_Clear$ b5 v! r4 o' H) Z8 Z% i
- STA $4000,X& K5 _9 p; ?" @% R: H
- INX
( [7 v) L: o$ `& @; _8 m - DEY8 x" K8 c5 h: U
- BNE .Sound_Clear
( T' N" A- S4 I |' e% M - 4 a: W7 h) X' P4 ?
- ;清除 RAM $0000-07FF
) }3 g6 y' t0 n* Q4 c - LDA #$00
0 F) O* a" _9 f o' b4 Y - STA $00# M: r, q. Q& J; u2 q6 _5 ^; d- S
- STA $01
9 {/ }( \& b7 U+ v( s, f o - TAY
# _2 i. j9 k# @( j, {5 V - LDX #$08. P g" M" x- ` N* F/ F
- .Memory_Clear1 E# O' ^' O' D+ h+ [
- STA [$00],Y) t% ~. j) e# w0 ?) J
- INY K+ L5 w# f& R; B& Y
- BNE .Memory_Clear
& \- c# R1 K7 P$ q - INC $01
/ `0 i" ^ z1 E' H' F; ?( F& s - DEX/ X b! Z9 v3 L, t
- BNE .Memory_Clear
W, C$ @5 C$ W8 W5 { - ) l* H" b, c1 b1 _/ l! p/ \
- ;精灵缓冲初始化& e0 U4 o+ ^5 _2 i0 m4 x2 M; v5 ^
- LDX #$00
2 n9 u; ^0 t/ N# z - LDA #$F8: \/ E w& q* v: C
- .OAM_Clear3 }7 Y+ Y* D2 o7 C7 X
- STA OAM_DMA_Buffer,X1 \. c% W- z* N" H
- INX. ?. L+ C* a9 a( S0 B
- BNE .OAM_Clear, j9 h( l% F4 `4 a
- 3 F1 s, B9 P" e
- ;栈指针初始化/ g+ n- z8 K l2 n3 l, I6 r$ Z
- LDX #$FF) y5 {/ d) d9 z/ h- l
- TXS
$ x3 K# L6 d4 l& g6 f - 7 O5 c- c$ @) j) n) p
- JSR Nametable_Clear;命名表清空
' K' I( v1 Z; x t$ X1 p ~; c - JSR Palette_Init;初始化调色板缓冲) G2 M, ]* W: R
- JSR Static_Text_Init;初始化静态文本
! q: u) I# d4 d -
. J5 L1 r( Q0 ] k% e- l - LDA #MUSIC_ITEM_TOTAL - 1! h% J, B- \+ O3 b# Q
- STA FC_Music_Max_Index
% Q2 j. ^: p' j1 X - : b5 J( C, P* g3 S6 C B# s
- LDA #$1F/ i. }4 H% C% Z; _( H, T+ K1 G5 F
- STA APU_STATUS
; o: t9 ?) x K3 B$ Q - LDA #MUSIC_BGM - 13 }* J, ^( i% L2 ~- v; a2 S
- STA FC_Music_Index
f) O/ X/ K* {. Z/ z1 N1 p - JSR Music_Init_Process;音乐播放
. D* s( ~- t3 C -
9 j6 b5 w& t* g9 }( m7 S1 _ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
: H! { c$ a5 |/ Q. v# N - LDA #$1E
3 o) u$ Z6 c! E4 k0 j4 r9 L$ p3 N - STA FC_PPU_Mask_Buf# a7 b) i- P3 N; `' @
-
; y6 T! q& @3 t/ m - ;启用NMI处理, J g; e8 v2 C. o0 S" Q" o6 _
- LDA #$80
6 a3 e1 P6 s9 D% | - STA PPU_CTRL( u$ U" z) G2 Z
-
0 [) F- m+ j" F - ;程序循环, 剩余工作交给 NMI 中断处理- Y# g S0 h2 M/ b. g7 ^
- .Loop, ]9 w E1 C% n( \
- JMP .Loop/ N; a: m$ P$ b; J
- 8 H U6 c0 \0 |' T! l2 A
- ;======================================================================, H2 \/ I; H9 ~, @! h# ?7 T
- ;不可屏蔽中断处理) W$ d! v/ |; a7 D! K
- Nmi_Program3 ~- t5 G8 [4 S- B e. v6 N
- PHA4 g. u9 M% n2 n6 O9 S
- TXA
1 G# g f9 v+ g; A - PHA
- q; G& }( `, j# @# o2 F - TYA
" V# \8 Q+ y7 r - PHA
& r! O2 O7 a/ E" v" W - - N* j7 D/ Y0 ]# b( e. U( C5 s" n
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
4 Z% L/ _' h) u# { - 5 k2 ]0 _: O9 X. f" I3 F0 S6 ?, _
- JSR FC_PPU_Procrss;PPU处理
+ ~+ A& s: ~2 m$ N% }) E -
. }# w2 E/ U G - ;精灵内存更新3 Y1 u1 M# V% y
- LDA #$00$ U" E- Y; L; N; O t
- STA PPU_OAM_ADDR
5 A5 _- C1 z% |; S( G+ X - LDA #OAM_DMA_Buffer / $0100
% H7 U& [* j# E a& i7 v - STA OAM_DMA
$ l/ K1 t( G8 j9 C$ s) a$ U -
6 e6 ]3 Y- J T5 {# c - JSR FC_Gamepad_Process;手柄输入处理
* {8 m5 T- Z) |/ o3 W7 |' J- |- N1 x - JSR Music_Select_Process;音乐选曲处理
% u; F z/ R1 s8 k8 T F) m1 h - JSR Music_Play_Process;音乐播放处理$ X7 _4 N7 ]& z* A) I/ d
- ' o: Y: q+ s( y- @+ e8 A
- PLA
! X6 T% t( V+ j, L( j4 J& G8 z, X0 } - TAY3 q) i3 q: g) K& x
- PLA
6 u& w3 c* J, i% K - TAX
! _+ u) K7 c( s - PLA3 i% E* E& z' d) T' x; k
- ; Q( K5 d. x: w6 Z: p4 @- T
- RTI5 m/ e2 q: T% |8 H2 c
- 9 W. R, l( ^% E
- ;======================================================================
' _# }# P+ D6 i& B- a7 i2 m - ;请求中断处理
' N7 r% ~3 P4 v2 e. A$ Z - Irq_Program
8 W6 J0 p* W7 D - RTI
/ j% Y3 H* b, A- p) d4 C# E. N& `4 ]: i
* P, k2 c( C) f& q- H2 u \$ q/ W- ;======================================================================
% e- m- v( b( f$ x - ;中断向量表+ f7 V8 R6 t1 c- g% S8 D
- .ORG $FFFA
- D }! t% x; R: @2 g |; X - .DW Nmi_Program ;NMI触发时执行1 N, L( @* D% r* T
- .DW Reset_Program ;载入ROM时最先执行) ~; o, c" j, D& b: A2 X8 |9 \
- .DW Irq_Program ;IRQ触发时执行$ G7 h3 m' `7 ~
复制代码 / B9 A* F. Z; c$ \* S/ n. w. \$ v' }
4 \. v/ d* h. f0 c
# a% D7 G0 A% b: }https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|