|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
9 I3 Y% ?* ~# a$ r9 m/ N : u: V1 Z; ], V6 i
以下是主框架代码:+ i% U2 N" C" v
- ;======================================================================
0 r" O" m3 \% T% s9 b - ;文件头7 p: M) T' P' M% k: o0 X
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量+ D# {( E$ l' {
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
* H5 B, b8 O: ^. I - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
2 k5 a+ ^5 w" o) o - ;======================================================================* d, {+ i4 P6 P, y1 P3 w
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 24 h9 T: l8 ~" d1 R! f E$ a
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1* k+ r _% c; `# b# V1 e
- ;======================================================================
& ]- }, B3 P3 [$ `5 `/ r - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
) ^; d* l" p; I. ~9 h# r# y5 g1 S - RESET_ADDR = $E000 ;主程序起始地址0 j E* x, \3 f/ {$ p9 E
- ;======================================================================0 k. \* U9 n* C% }4 Q6 T; B
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB2 }2 ]3 ?, w& E, B2 q
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB7 G/ g* M( L6 `, K
- .INESMAP 4 ;Mapper号 (0-4095)
" Q7 A5 Z5 G# q8 x: ^ n - .INESSUBMAP 0 ;子Mapper号 (0-15)1 \3 c- R" m3 Z8 L9 _% B; n! o0 m
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏), ~3 ]5 e h- [/ K8 @/ P
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
# s; u7 o( Z/ I* D$ ?8 J# P" j - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)* S% ]- I) Z- Y4 T( H3 j0 R
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)4 @+ T$ i) c+ v/ L: Y5 N
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
0 E- y$ A, L! `6 ^" y! Q - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)& {5 M1 x% P0 {2 B5 @/ U
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
/ e) p$ ^: G; s- M# h' t; x% ~) V8 ` - ;======================================================================( G, ~1 H7 k* d, Z4 C
- .INCLUDE "fc_demo_config.asm" ;全局配置
4 D4 s! v% C: ?: g% V - .INCLUDE "fc_demo_constant.asm" ;NES常量0 B$ H6 }) h q, `+ I$ e
- ;======================================================================
1 Q8 R& ~0 z: M/ q) K - ;音乐配置, c8 |3 r* X# W D$ b1 m
- .IF 0 = MUSIC_THEME - ]& P) q$ \' d# m: K6 q
- .INCLUDE "data/music/Gremlin 2/config.asm"- Y; x8 M( K0 v/ H1 x) i
- .ENDIF
: `* H" W6 {3 C+ k -
2 Q) p- g }7 Q' x" w# d - .IF 1 = MUSIC_THEME
. m/ o! Q) ~. \8 G - .INCLUDE "data/music/Raf World/config.asm"
( W9 a. ]0 A4 @3 Q* B3 C! \ - .ENDIF
; B7 H$ X9 W7 Z9 C - 4 }% _ P1 u2 s/ S! h0 ~3 T6 R
- .IF 2 = MUSIC_THEME
[) K9 a5 a4 a - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"2 b! w+ Z1 [. \# K5 l% \% \
- .ENDIF' R" y z* t \( W& ?! [( Q
0 D$ P+ m% ]1 a- ;======================================================================
0 m9 g J6 x( N( [7 _3 L' \ - ;引用CHR图像数据
+ a/ M% c8 x9 b; k9 X - .BANK NES_16KB_PRG_SIZE * 2
& O! e4 V! H# o& Y' z A# m/ G# Q - .ORG $0000
7 u5 V2 S; @, e4 {& J$ X0 _& T - .INCBIN "data/bkg.chr"
1 ?( g: `) P. Z2 Y1 K* d - .INCBIN "data/sp.chr"
) ?: `: q/ B$ b) t+ t' ~ - 2 Q2 e) K& [3 E% S
- ;======================================================================. i! u2 T# j; U3 _# i& W
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
$ J- A p. ~% t s( D7 i+ B - .ORG RESET_ADDR
$ Q) l8 z& n% R- A% Y: d$ e4 F - ;======================================================================
f$ a$ [8 P7 H) C6 M% q - ;引用其他源文件
; ?9 {: I$ ^6 |* T/ F* x - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
2 S% ^" U6 P% G: E: F7 i8 i# R - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
% y G* p: ^5 G& t: S" n& R" F( F - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理$ f& b6 ~/ U- b. }0 R/ i. ]
- ;======================================================================
% [) q* ]% y; n4 s+ t5 k/ L# z; a
2 G3 O2 v' X( ?8 |0 S- ;======================================================================& {9 f4 M, w# E+ ?! `8 R
- ;等待VBlank到来
$ M1 j7 K) b; D" ~$ } - Wait_For_VBlank; G0 ~! [+ D' ~
- LDA PPU_STATUS9 |7 W3 V3 m( U0 Y
- BPL Wait_For_VBlank
$ {* L9 _( q! v9 [+ R - RTS
" m& J" J5 s* S; @ A
0 f% L* \' K; X. b- ;======================================================================
4 m) p" J8 ~8 J% Q2 E W* t) u - ;调色板初始化5 B1 a `6 N- [0 R% n
- Palette_Init
& t+ F. w H( ^# [$ V7 T- y - LDA #$3F
- M" S) z+ P+ W) ?+ C! H3 M - STA PPU_ADDRESS
. C, r$ U- R1 j- m - LDA #$00
1 _( z, h4 J* S, [& o- h8 m - STA PPU_ADDRESS
, k X |: F% ` w2 M - LDX #$008 ~; y2 L# [/ v7 A
- LDY #$20
3 U5 K' o: _& W+ M - .Write_Data$ i; @5 V2 M4 q- }: s
- LDA Palette_Data,X
4 A+ m) R7 M( }9 }! g; a, T( K - STA FC_PPU_Pal_Addr,X6 R& Y. u1 O, x4 A' t9 l
- INX% N/ ]2 N }: O: q: |
- DEY' ~. x* m0 x4 l6 ?3 k- e8 C
- BNE .Write_Data
) \6 L: E! u0 U7 d, L - .End
D, M; J l7 K2 p - RTS
! d) l2 Z1 Y$ w$ _' c
z$ A9 W- z) _7 f) @- ;----------------------------------------
* S- _) _0 v2 Y - ;调色板数据1 C* X6 u# l* g. e
- Palette_Data+ _4 x" d1 f' _5 H+ o$ l
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B; w: W$ o, T' m5 X, l2 o
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
! e8 `5 r" E S9 _- U3 b - 8 v1 _, q- J. F
- ;======================================================================+ l7 e5 S/ X2 H4 w" n' N; [9 |
- ;命名表清空
/ K; P. V% y, @% w - Nametable_Clear
8 b4 z5 n8 a5 m n# Y' B - LDA #$20; L ]. X8 ]9 e, W- |' z& g
- STA PPU_ADDRESS
6 z5 @: N2 P, T5 Z - LDA #$00$ R! B& n, T% ]9 u1 S* ^: ^
- STA PPU_ADDRESS
8 Y A% g/ t$ R3 F9 N& }, o - LDA #$00; D! d$ e& y/ c& ~6 K
- LDX #$00 \" s: q* _8 {' n' A
- LDY #$08
! z" Q& A$ {2 W3 x9 @4 j" J - .Write_Data
6 K( x& ]$ V% Y0 V; X! x O - STA PPU_DATA5 d3 a) k% M7 b- A/ K
- INX
( o# q, I" Q+ c. o4 Z - BNE .Write_Data$ z% ^8 C7 H0 W* {9 ?
- DEY' }* T, L2 M. ~# W4 g; U: u( h: s
- BNE .Write_Data# E h6 I7 U4 l
- .End
1 m. l4 \/ m; ]5 [ - RTS
6 r e# m! T* p( D# d
* s; Q5 U! G, c- ;======================================================================
) M! H4 s# j# N - ;音乐曲目切换
2 x" u i, _$ y; |: u+ | - Music_Select_Process
" ?3 c/ C7 Y0 R - & z. e/ n' y# \- s# s
- .Pre_Music;上一曲9 [; f' W8 ^4 G) ^7 G8 t
- LDA FC_Gamepad_Once
, |/ w/ k% j/ ^7 ^ - CMP #JOY_KEY_LEFT- T/ v, I. W0 m5 c6 ~
- BNE .Next_Music
! F( n4 D2 _; [+ o - JSR Music_Play_Pre
; L3 Q$ N6 M/ _4 O8 N+ K - .Next_Music;下一曲
5 `: W y& ?5 C5 f, M: I - LDA FC_Gamepad_Once
) \. p% a. c* \3 U3 F O) T - CMP #JOY_KEY_RIGHT
! E9 z/ |8 K. _ - BNE .Next_10_Music1 ^ s( {6 I5 M/ [( }/ @3 e
- JSR Music_Play_Next
* X! F0 w* G5 ~5 X% ?2 w3 G - .Next_10_Music;上10曲; u% k( u; p1 \! B1 r5 w7 J/ Z! ~. O
- LDA FC_Gamepad_Once
3 q; G, K: ]9 ]' B# F2 {( K6 y - CMP #JOY_KEY_UP- c/ K% f) D9 K+ n
- BNE .Pre_10_Music
$ x/ P% F* t5 Y6 o2 J& j! A7 w - JSR Music_Play_Next_10
& E- T1 Y0 @ X - .Pre_10_Music;下10曲) C+ S4 }4 Q9 S$ N- [
- LDA FC_Gamepad_Once* |! ?5 L2 E8 M; O3 b0 V
- CMP #JOY_KEY_DOWN
: S, a+ z6 s6 s% z - BNE .Reset
9 ]8 n. N/ W( U# E/ o! w! h - JSR Music_Play_Pre_10, ^* R+ v! [$ c3 U
- .Reset;重播当前曲目
1 q! ?8 j7 E5 E4 r, N" F - LDA FC_Gamepad_Once
) t2 D; q7 G* [$ q4 q. w - CMP #JOY_KEY_START' v2 v4 E4 G9 c2 r" H0 D
- BNE .End! G0 P* t k- q) e' X1 u
- LDA FC_Music_Index
* U3 s" J' F0 ` - JSR Music_Init_Process
( U3 s( m0 Y( i- | - .End
9 b o9 G# o7 V" \& \- x - RTS
0 v) q. T3 @" L: T5 a - * L6 Q8 g; n2 J6 V8 v# H$ ]' B. H
- ;----------------------------------------------------------------------
! g7 s7 P# l' @9 T9 W6 [ - ;播放上一曲
/ a( h- \; x" H) D) w7 g - Music_Play_Pre5 J$ a6 O7 {% l6 ]7 V1 m
- LDA FC_Music_Index
/ W9 @. E( t- `, e2 O - BEQ .End
' C( N) {7 s4 @# Z" v6 k# r+ R - DEC FC_Music_Index" X3 d7 [0 N4 e' {3 [, d( B0 u
- LDA FC_Music_Index2 L3 G5 _6 y6 T) }, G6 j
- JSR Music_Init_Process
. h' P& V/ H; i) _8 Y o - .End5 ~% y( ^$ L. {& U
- RTS
; \# S( b9 @4 m9 L" I - ;----------------------------------------------------------------------
/ G2 s1 V7 ?! s% Z4 W - ;播放下一曲
1 y D a0 E3 W0 Y- g - Music_Play_Next, w6 n/ C& E `7 A* M
- LDA FC_Music_Index
6 P f/ w. Y1 }* p5 j - CMP FC_Music_Max_Index
" D6 q+ Y7 [& Y6 A# G - BCS .End6 ]+ q& k P8 y7 |9 d
- INC FC_Music_Index& N9 D+ `; K$ F
- LDA FC_Music_Index9 k1 v I3 J; v/ C# y
- JSR Music_Init_Process
6 {6 Z/ \# p7 W' W( W% y0 \+ R - .End
$ {9 k) p; [3 y3 E7 q - RTS( p" B0 }% G. T$ Q# {% I
1 d8 J- M" \0 c+ w' s5 A- ;----------------------------------------------------------------------9 x; w) f3 ^# R) \
- ;播放上10曲$ v5 f0 l3 {. c0 A/ J1 d; E
- Music_Play_Pre_10& ]* M* {4 C7 m5 [; R7 K* s, c/ X
- LDA FC_Music_Index# T9 i% M, Z9 j* C! @
- BEQ .End3 C( }0 m0 M8 `9 I& E0 J% l4 |
- SEC
, n' o+ j+ {. Q' u- { - SBC #10
; y8 m0 _% h5 \, D) ~# X6 ?+ q - BCS .Pre_100 Q( C9 W1 n0 h6 f
- LDA #$00
$ y6 b; z$ h; ~' D - .Pre_106 O/ Y7 T$ F# ?2 o H
- STA FC_Music_Index
" N! D5 O. `% U - JSR Music_Init_Process
' k* V/ B2 d( f& j( ^ - .End8 L% x+ {* i2 v: C- ? d
- RTS
& P$ n. B# a7 Y; j( v- u+ W, u - ;---------------------------------------------------------------------- Q) r9 I9 e. g4 ?8 g% X1 \
- ;播放下10曲
! Q% u; A! ^% R7 v: x* ~& Z1 ~# \ - Music_Play_Next_108 L. a3 n. G; D" h: d
- LDA FC_Music_Index
- ?) o, O* l2 y& x# j - CMP FC_Music_Max_Index' u. T$ h" M& _6 g( B
- BCS .End
6 n9 r5 [2 t) P6 M# J( j( B - CLC7 l. t7 m; _' \9 p' Y3 H
- ADC #10+ F" a% A, j" Z+ J- i! a2 q8 l
- CMP FC_Music_Max_Index
) I/ n) i! R' t! q2 F. R; \ - BCC .Next_10
1 Q6 W1 O s' N2 H+ v* M9 w - LDA FC_Music_Max_Index
) d$ g) G" _( W6 p" x+ k* b- ? - .Next_10
3 ? }/ n' {, U# g! Y$ d: a. D - STA FC_Music_Index& T. ^! `: q( H9 E. v" ^
- JSR Music_Init_Process; V* p1 \; I% N4 m6 }
- .End4 E$ z. K. V( B( y9 d4 t
- RTS
& m0 z: g9 p3 N6 r8 { - " H$ ~: [9 I" d `! C8 Z. c
- ;----------------------------------------------------------------------
2 Q* |2 p5 v9 p3 O5 ^- k - ;8位十六进制转3位十进制制! @4 B& H- y2 R
- Hex8ToDec( Z9 j6 V/ d, J) f. o ~( m. j$ p
- STA FC_Dec_Data_1
$ w9 Z$ k) O8 ]# e - LDA #$00' z' j* X' c+ Y) ~
- STA FC_Dec_Data_100
2 t% J, J; d" C9 c/ l2 } - STA FC_Dec_Data_10* ~( J. n5 ]3 @! D6 g) R
- LDA FC_Dec_Data_1
9 B& O; a6 ^5 t- T9 H4 c - .Convert_1002 ^! ~4 p( w; x3 s w7 ~
- CMP #1004 v/ ]) w$ R7 U8 j- G& g- U) x+ E+ y
- BCC .Convert_10) r" Q% g, T- S0 Q/ f6 [
- SEC _, A# ~2 j+ I" E0 s5 @
- SBC #1003 \; t8 Q% o: c0 v+ U9 @
- INC FC_Dec_Data_100
4 ^7 u8 i% }' o( v - BNE .Convert_100& _, ~$ c1 i$ h+ |$ n9 n
- .Convert_10& b0 ^, @5 f9 Y' n1 G
- CMP #10, T; T1 s) ?" c2 O& b" k( Q: D
- BCC .End
/ F# v- ^/ a5 ` - SEC# u7 x+ D# T: z" q$ D8 \5 S, M# }
- SBC #10( t" V- g6 v3 D/ Y1 f" t: W2 Z2 c
- INC FC_Dec_Data_10
2 `4 U, Y4 v" H - BNE .Convert_10
- w( ? u9 {# G. W - .End
: G, T5 l, U7 M5 v3 Q: L. k - STA FC_Dec_Data_1. m+ A9 W: d' P- ?
- RTS
( ?1 J! T; T) D% o& e/ B6 n& [ - H. Z. S3 e5 P# P W
- ;----------------------------------------------------------------------1 _. Z2 ?" N. f! i4 k& O; h
- ;显示曲目信息0 ]6 R- X+ W0 F+ z9 c* c; B
- Music_Info_Display
: A8 r' j# c* m - LDX FC_PPU_Buf_Count
# N4 D! z$ E3 B' X4 t5 b - LDA #PPU_WRITE_MODE_CNT_LINE
3 q, [6 x c- O/ K* r - STA Use_PPU_Buffer,X
" B4 @/ F1 A' t. x' X ]4 F) b; ] - INX
5 V7 n8 T$ X9 c5 F - & g/ r. d' x7 c1 x8 ^$ u8 E
- LDA #>MUSIC_INFO_POS g$ }. g0 I% \* s
- STA Use_PPU_Buffer,X
9 d+ [6 C. {' [0 E8 ?% J8 H - INX
8 a4 p& ~/ ^6 R/ t) ?+ @ -
) e5 {4 o# y" D, J2 i - ;居中. E' ~) y4 j* K0 |: `1 l, S
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2/ S9 S6 F9 c% @
- STA Use_PPU_Buffer,X# \# S. \. |& t; Q! g
- INX( K* X6 p/ s! n9 M
- 3 u- R# e9 c$ O/ _# V9 U- H
- LDA #$05
, Z0 m4 H* ~6 @' U - STA Use_PPU_Buffer,X
. B* }/ \2 G1 P. `) z - INX' n& ]$ s- @: W- ]
- . L! ]1 h6 @7 O6 o" g/ A6 p
- LDA FC_Music_Index- E4 R9 x5 [9 n) Q
- CLC
' B g, b% W! G; E- _4 M - ADC #$01
. X( Z2 M0 D+ e, N; a - JSR Hex8ToDec
# x3 m3 d' M: g; a - 6 j) A6 m% o+ a# ^& `9 Z
- LDA FC_Dec_Data_10
8 I5 O3 r( C# x& f* | - CLC2 ]+ d8 l& g3 o# o, s
- ADC #'0'
& c/ O: l4 ~: U% K/ ? - STA Use_PPU_Buffer,X
+ \% z7 }0 s) r$ b! e+ q - INX9 G( v3 y. {2 R& i |, i
-
7 X3 ^$ ]/ o5 ~ - LDA FC_Dec_Data_1
& C0 q$ l, r! b& N( k/ j - CLC
: w: `, ?' r( B7 } - ADC #'0'9 A: X. L% c4 I8 {6 I* Q
- STA Use_PPU_Buffer,X
% j! u; ]- q: a- a+ @; C) @ - INX
- [! S/ A1 q* q2 Z - 5 g0 O% m. j1 F/ D* r) W
- LDA #'/'
! j `3 q7 R! K- O( j2 O% i- I - STA Use_PPU_Buffer,X% f( ]0 d- z+ C
- INX" ~$ \6 \ U+ p T+ Y% k1 G4 w$ @7 X
- & S) u5 G1 E1 @, f2 m
- LDA FC_Music_Max_Index
8 s% F( A. U$ J0 _ t - CLC
s) P4 k: d: R: e3 @ - ADC #$01" t5 Z+ j0 P% P7 d
- JSR Hex8ToDec
+ F" ` l- C3 h- n w- \ -
1 D4 X" D2 M5 G4 ]' g - LDA FC_Dec_Data_10
. p7 s! G4 Q' i$ i- J - CLC
, M" l: r d/ p/ @0 ]: ]. Z - ADC #'0'# m R; s6 N9 C* E
- STA Use_PPU_Buffer,X
. v& O' r$ `( Z3 D) j, Z( { - INX
8 k, T* K O( ^ o- X) j0 q - 3 n0 m; r5 z+ b6 F
- LDA FC_Dec_Data_1
3 t; P: W+ j9 ^1 J - CLC* ?; d. U; m8 g0 m# a
- ADC #'0'& @/ ?) D! ?! ^ e1 r# c
- STA Use_PPU_Buffer,X7 f, W: K+ ~- N6 @+ V" d6 ?
- INX
2 s* c6 N9 x3 D# o0 @ -
/ }% \# ~9 U; W( G* Z+ D' o - .End
1 A) Q) A$ M0 Q6 M8 M3 r - STX FC_PPU_Buf_Count5 x' p5 I! U$ ?, Y( N- e
- RTS& C* X7 w; w3 t* O+ J
$ {% g+ ?4 I+ E; c/ Q- ;----------------------------------------------------------------------8 R& j- k) j9 |+ j
- ;音乐曲目初始化处理" L/ n4 @& O0 Z- t8 j/ f( R
- Music_Init_Process
0 K/ D; F! F3 P( i0 s: R, q9 {% n - PHA
" z* |( N$ t$ o - JSR Music_Clear_Process" w5 [" m5 F" a6 o3 c# y
- LDA #$1F
6 o3 F! }0 f* x7 p* z+ @0 s1 @ - STA $40150 A9 ~" p; e$ v1 F3 o! h; Y6 W6 V
- PLA" D+ i& r2 e/ M8 o( R8 w3 K
- JSR Music_Init_Addr" U T* k t8 g1 ?0 i% W
- JSR Music_Info_Display
: f! i7 S) t* `" E* o e$ C - RTS
$ {4 u$ W9 D! ^ - 5 w5 i# h% y# g, {
- ;----------------------------------------------------------------------
. u: H3 B3 x9 I3 Z( }. E - ;音乐播放处理
" ?/ k0 p) H1 V+ S% o4 l$ r - Music_Play_Process% ?& z. C: s% ?' h9 C9 x
- JSR Music_Play_Addr
4 X2 D, [$ B1 [ - RTS
. X" S+ s6 G4 L+ ?( ]
3 C+ V7 J. ~5 E7 ]( |/ y; h- ;----------------------------------------------------------------------
: g* F# O h. ?; t - ;音乐播放处理
; d& {4 h. m# ^. B) V - Music_Clear_Process2 j, }' F( Y: \# M# W8 M0 F, i
- .IF Music_Clear_Addr/ i1 y) i3 D& N; D
- JSR Music_Clear_Addr6 ^5 c& A0 z8 Y# d3 c
- RTS' j1 i2 D d9 e1 v
- .ELSE
/ G( {% H: |# b) c/ H/ @ Q* X - LDA #$1F4 z7 n+ `9 `: g2 \
- STA $4015
5 w0 @2 ?7 F& m/ j# d" w( F' O - LDA #$00
! E& o4 L7 |& d6 W6 z& j2 P - STA $4010$ Z: r$ v4 Q! Z
- LDX #$00
; x/ S# R, Z5 \, a, z5 l - LDA #$00
" o$ F# [4 J% L/ K -
; w! f9 n* i9 O P- x. R. r6 o1 Z - .Music_Clear_Zreo_Page_0
# T4 x+ t1 Z/ f. ]9 d - STA $00,X
& }2 ~4 S2 [% I; t% b; [ - INX: y% h1 @- ?/ D% v9 _7 X% n/ q
- CPX #Use_Zero_Page_Begin! {8 s' \: v1 C4 Y, }4 j/ T
- BCC .Music_Clear_Zreo_Page_0" I) r4 ~7 Y8 g: U/ M
- + i8 U+ R* k2 m$ z0 a0 \/ M
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
+ n, F8 O2 O) U - .Music_Clear_Zreo_Page_1$ T1 i, \9 @6 S3 o5 W
- STA $00,X
6 o2 S$ g ^. z* k% E7 m: T6 S - INX
# ~$ v1 w5 s( d" B- d6 C - BNE .Music_Clear_Zreo_Page_1! S. ?8 i- s& {! @/ `
- % ~# D- g0 u/ l! `: B& j
- Music_Clear_Process_1
' H, z* \% U% Z3 Y, \+ a - STA $0600,X
3 O! v3 |0 P' [( R - STA $0700,X
3 A& v% D5 C- b; q - INX
5 t" B. @' v- x0 V. c - BNE Music_Clear_Process_1
/ L' A& U3 ^- n% `8 [. H - LDA #$103 T: x2 |6 [$ ^$ M* m. J
- STA $4000
+ c* G# T) I G6 B- C6 D7 u6 i - STA $4004
# [3 r! s6 L. ? - STA $400C4 q8 s, T3 {$ c4 e( {
- LDA #$00
: I1 U% H, T" E' Z - STA $40084 C! L8 Y7 I, a2 p, c1 W0 k2 D
- LDA #$0F+ Z0 X2 i- w6 u" S4 r) {$ \
- STA $4015
6 J4 C+ Z3 K) t& h4 q$ T9 M - .ENDIF& D( j: q7 o. Y" P, a- @0 C
- 0 W2 r: k( [7 ^$ W# Z" \
- RTS
( g. e4 e& @) R" q
& b3 k) Y1 Y0 U. t2 t J: l5 _- ;======================================================================" z- I- y! z" Z
- ;重启处理9 Q* u/ V8 a/ m+ h
- Reset_Program
$ n v E0 @ x - SEI
' R/ |6 ^- |: x - CLD
% d6 n! {8 R" u: c7 \9 V - LDA #$00
; U' G7 I- s% m4 T- \ - STA PPU_CTRL' s3 J2 a9 C8 k: ?
- STA PPU_MASK
7 q6 G& ^- L8 z3 F: u* l$ O `- z. j - STA JOY2_FRAME
: V% w, w4 E9 B1 F; M - STA APU_STATUS$ C P) ?# T2 j4 Z6 U
- - c ]+ M4 I5 o& ^8 E7 l& s
- ;等待屏幕准备完毕
6 T3 N/ o. ]1 ?4 }1 K - LDX #$02
D5 U/ E( w, ? - .Wait_For_Screen_Ready
3 H T% ^8 a' `1 y g - LDA PPU_STATUS" T9 K4 n1 N% I% | K' E7 j7 ]5 b( t8 m
- BPL .Wait_For_Screen_Ready
! w' f) J2 R' u! _! z/ q2 S7 F1 W8 V - DEX
( K# k4 ^! V- q$ `; ^8 C: ~5 P" u - BNE .Wait_For_Screen_Ready
2 Z: H6 C7 a& u S" V' ] -
6 J3 A& v) M3 b) ? - ;清空调色板
. \9 m5 ^( D4 R; f. g8 j - Palette_Clear" D- M3 U7 O2 J' A7 O% ~% x' z- J
- LDA #$3F* `* N$ n4 W. {; i E% L8 n$ j9 S
- STA PPU_ADDRESS' F! }/ l6 T" E, {6 ?0 M
- LDA #$00" z+ Y' }% y z, ?* h, J
- STA PPU_ADDRESS
9 E, q6 E; Q6 L - LDX #$20
p5 k' w* S5 N/ E8 K - LDA #$0F
# f- g' Y. F7 S* ^ - .Write_Data
8 ?% ^5 m# ?& R2 r. c; N - STA PPU_DATA
3 J) w/ w3 d& p* r - DEX" O% N9 j( G9 J1 g# C3 h4 }$ u1 `
- BNE .Write_Data9 D; J7 d; ^ w' J* ]
- ' c; ?; a$ }, i9 L
- ;清除声音 $4000-4013
+ _. Q: D' d1 g' C* J - LDY #$14, Q; H4 K; T3 U/ K) F/ s
- LDX #$00
+ f/ h& J. F! E, x6 U# L/ D - .Sound_Clear
5 g% @6 O) Q; i! e" Q) l4 m$ [7 U9 P - STA $4000,X
% h" p2 K0 Z3 P' i$ M - INX' Q6 x5 H% J. s
- DEY
. [0 z7 I! m! } - BNE .Sound_Clear1 Y4 V6 y: I5 P$ k" a# W
-
" L2 U2 ~& x2 w* ~5 F# z6 D6 O - ;清除 RAM $0000-07FF5 ] k) M! K" m! T5 {6 V
- LDA #$00
' D$ ?* K. i# H& w# ` - STA $00- o3 P5 M1 O. W' e3 `3 l; C5 y
- STA $011 U2 k" F9 t R/ y
- TAY) C: ^5 W: e; K5 w
- LDX #$08
; X: T% r2 p6 v+ N3 ? - .Memory_Clear
( {& k6 C& j( z - STA [$00],Y
* N0 A8 N( p! s) A# k5 D* r - INY
2 _$ Y3 `9 X) M' M" z* T: |8 A - BNE .Memory_Clear
/ i* z& U3 S2 [) i# q - INC $01
) S q( b5 K0 E( b" w9 m - DEX
& s, r- K7 A2 s$ D/ }7 m( V - BNE .Memory_Clear; J2 ~' Y. @- L
- + B+ L- c+ z, b3 @3 _4 P% E
- ;精灵缓冲初始化& i D" F& T$ t& H& z% R
- LDX #$00( e3 y! H* M' i6 I
- LDA #$F8
( O& s6 t3 W) G3 F. b- l/ y$ j: l - .OAM_Clear9 U3 c7 ?$ J& H g, g- R
- STA OAM_DMA_Buffer,X7 t- D$ X/ g0 s
- INX) p s3 a$ L) s# c/ U
- BNE .OAM_Clear0 v( i8 ~! l7 f) i
- 3 x9 Q2 z" ?! g7 G2 W
- ;栈指针初始化) b6 Y# O+ [3 E5 M$ @. _: U/ a
- LDX #$FF( g2 _1 W& l* E/ Z
- TXS1 S, z% |* t D: } l
-
! E! x! s+ o6 D. X9 P - JSR Nametable_Clear;命名表清空
2 X: q! S: w. ~( Q2 Q1 T$ R, v: ? - JSR Palette_Init;初始化调色板缓冲
4 [+ o7 y( p6 A5 @1 s- B - JSR Static_Text_Init;初始化静态文本% C0 ?' e! `8 n, i9 [" j/ ]
-
2 n# j; ] q; W' Y; ] - LDA #MUSIC_ITEM_TOTAL - 1* k4 M; ~( ~2 D$ P
- STA FC_Music_Max_Index
( D3 s C7 \6 I, w1 [- O' m -
! Y3 i e& `2 r: w - LDA #$1F$ a; Y1 n( M) Q5 d$ x8 T; S/ e, o
- STA APU_STATUS g" X7 v# g/ H; W/ G; U* d7 ~! n
- LDA #MUSIC_BGM - 1
: Z; L* S# ~, k4 j- B1 H- H - STA FC_Music_Index5 `# Q# y- h* E: R8 B5 H
- JSR Music_Init_Process;音乐播放
* o" \3 B0 F8 D! A, @5 K/ q -
+ }% t2 {) j8 k9 ` - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)* I( R2 g: k1 \2 o) ^! H& ~1 c
- LDA #$1E' }; B7 {, h' @5 w) h, l! c$ L
- STA FC_PPU_Mask_Buf
5 e: v% n( s6 o4 b4 I -
$ }5 I7 r8 R+ d2 o - ;启用NMI处理
- T7 W9 j4 ?9 O9 p" z4 | - LDA #$804 m' ^. B: d9 X+ w
- STA PPU_CTRL
' O, u& h$ X( m& [9 _ u -
" k- ~* W- A, D4 w' |8 | - ;程序循环, 剩余工作交给 NMI 中断处理
5 G/ o# z3 X6 a( A - .Loop
/ @: M8 e0 [3 L6 n0 U - JMP .Loop
3 p: n) t2 N" f+ Y+ H - 4 O- N+ v/ M: D J
- ;======================================================================
* I' s* ?6 A: u+ r/ a - ;不可屏蔽中断处理
9 j! ?4 Y: O! y7 [; I$ D# K: L% W. g: d( j - Nmi_Program
6 r8 n+ a8 k: x! D$ M4 S - PHA
7 T, {) b) z% p+ V, m3 J( { - TXA
% v) }0 O$ E+ C A' G6 R - PHA
* B3 R) ?/ k8 F- L$ r2 R1 F - TYA: H( |% w+ g7 p! y+ P7 h2 V" F
- PHA
& U2 r) Y N! W -
; |6 g- A- \$ G - LDA PPU_STATUS;读取使得 PPU状态寄存器复位. b! T" x/ e ~) g% A* g
- . r6 l! k5 V# b5 i+ x! L
- JSR FC_PPU_Procrss;PPU处理
/ G/ {8 b" B% ?' X. V1 h8 U - + F* `, u! `( g4 l( h
- ;精灵内存更新
3 x6 I8 l6 } t4 _6 A& O' T2 V6 L - LDA #$00/ G- ]& F& m# K. h8 a
- STA PPU_OAM_ADDR
: ~4 s5 B* O; r" ^4 x" S1 @" A& E - LDA #OAM_DMA_Buffer / $0100
, a- g2 ?& I0 n5 q - STA OAM_DMA- ? D5 D9 h: I; g' A- }9 @8 y
-
% |. n. ^8 M4 z6 M - JSR FC_Gamepad_Process;手柄输入处理
0 o" I+ `7 a0 ^, n; l0 t - JSR Music_Select_Process;音乐选曲处理: y1 U- L: @6 _1 X
- JSR Music_Play_Process;音乐播放处理: a' A2 w, d8 T, Q8 S
- 5 s9 b9 n+ [& c; z, i$ ^* |" C
- PLA
3 h# _3 k* O- j$ q& F - TAY5 S% I9 Y( m7 C: U4 z1 V
- PLA
4 M3 J% h: I8 p q - TAX9 _4 T$ g% x7 _7 g" [0 e
- PLA& |* Z6 r' ~5 ^4 J
- 9 F! K) {* q0 Z- V( R" ~
- RTI
5 [4 ]0 l1 a& C' B% r$ n# i - 9 m+ ]( v3 U% X* v
- ;======================================================================4 F H5 O+ B! Y }8 l
- ;请求中断处理
' l8 K/ H2 I( @ - Irq_Program
) }- m i, ~2 ?" w' s" D- `. A - RTI
% q/ L/ H( Z9 c* X# |/ o9 s - ) c+ c( b9 |+ J% Z
- ;======================================================================
; m& ?' X& r/ b0 D: W+ D - ;中断向量表7 q j) c0 B4 W& ?! \4 g
- .ORG $FFFA
9 K9 e8 L5 p6 f( E( m - .DW Nmi_Program ;NMI触发时执行1 v# n1 y1 T: f! |4 R! R
- .DW Reset_Program ;载入ROM时最先执行 H" ^: W* S. e, g0 T
- .DW Irq_Program ;IRQ触发时执行
! W6 @1 f( Z) b8 Y; a
复制代码 o0 g$ ~& ?$ g' }/ L- L
# B4 h# r" d2 b3 R$ ?% T
0 X4 i" G: f W/ t- s* e- H- v. l% Rhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|