|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
7 S9 n# `* U4 c( J3 G) c / ?, ^1 F' g! ~& P% ?9 r
以下是主框架代码:
5 z5 y; a' |2 q( @- ;======================================================================4 H5 f% t# P0 d
- ;文件头0 l6 Z" b& U4 e
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
) t& F0 w2 ]. e2 C$ h1 k- g - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
& g' w3 A7 }# l1 x. ~- u% Q% _& Z - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码: U! D- P& I0 F! C" l) ?
- ;======================================================================; ^2 K! q8 m: M7 }/ Q
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2$ I# i; f% i h% j
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1$ T9 W W' U) v6 o; W
- ;======================================================================
6 {5 j+ v* o) W; ]6 H8 ]( ?& k - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
! G8 z8 _4 {) {' X8 Y" \) }+ ` - RESET_ADDR = $E000 ;主程序起始地址
4 _/ m. K+ q7 P3 G* F3 |6 j4 k0 P1 z - ;======================================================================
# ` _' I5 p5 G. \$ E( e - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
3 d# n4 z6 f. Q4 q. R - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
8 Y |% T0 ? [, L% X8 F - .INESMAP 4 ;Mapper号 (0-4095)
6 x) x3 q# N/ ^! u# M - .INESSUBMAP 0 ;子Mapper号 (0-15)$ G" Z m$ ~ \
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
9 T; G S" u, u - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
7 I" O1 b6 l J+ j) E; b" v3 Q - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
% v* w: c7 j/ h0 Z' j - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)- I# Y: |" z% H3 j
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)( S! n& M/ N% X
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
$ ]% [4 W- Q7 {& r+ M - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)" H7 r& ~/ ~- B; Y+ U6 B' j
- ;======================================================================/ ~7 k6 H* A( a% K4 t
- .INCLUDE "fc_demo_config.asm" ;全局配置
. x4 i5 j' C4 `, A - .INCLUDE "fc_demo_constant.asm" ;NES常量0 n; r" r9 B* b# m3 u# p, @
- ;======================================================================
4 R( x( |; K8 M) r" _ - ;音乐配置3 Z2 F- s" U7 Q1 J# y& ? R
- .IF 0 = MUSIC_THEME 0 J6 G" K- b2 |
- .INCLUDE "data/music/Gremlin 2/config.asm"
- a6 s( t) ~3 s% A9 w( \& l2 e - .ENDIF' I" r3 F3 X4 w2 c, L
-
c5 k+ c3 n4 F9 Z - .IF 1 = MUSIC_THEME3 Q' o7 b4 x/ b @; D+ y5 Z& X
- .INCLUDE "data/music/Raf World/config.asm"
! N# Q9 \: n' O' y3 ^9 P - .ENDIF" ~$ F% A6 z" }5 n# o# X
- 5 x! X! u- m! l& g5 C* |0 L
- .IF 2 = MUSIC_THEME * r$ Z4 P+ \$ `* o/ f- p5 K7 N( h
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"& b5 A6 j6 T2 G. j M" `. A
- .ENDIF
! p: b1 F! M+ q1 f1 `" x; o - F- v6 s; K {
- ;======================================================================
: X; U# m7 w: z% }) k# i - ;引用CHR图像数据
, f1 X0 I( f6 X | - .BANK NES_16KB_PRG_SIZE * 2/ O0 e5 m+ s/ c. }& z% ~- l
- .ORG $0000
R: v1 G5 ?4 z' A - .INCBIN "data/bkg.chr"* z) b A% }( s: n5 J9 b, c, N
- .INCBIN "data/sp.chr"
9 m( T! `( n3 q% W8 P - 4 A3 l& v3 o! v2 m3 M v+ l
- ;======================================================================* ?" I' V5 Q F+ v! d: ^
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank8 u" \ u1 q( W. }$ H
- .ORG RESET_ADDR
! {" F1 n- S5 d" `. k' ~& l - ;======================================================================2 y$ g0 _! B) K0 j3 w" z3 T9 D0 d
- ;引用其他源文件
3 ~* K; v* h" s; u; [* i% [8 E) ^ - .INCLUDE "fc_demo_ppu.asm" ;PPU处理4 Y( }! `9 v! \: S' D
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
4 U" j1 `6 Q* f \/ [& j8 M - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理: A' N7 w) v3 K0 A4 ]3 U
- ;======================================================================
- P: w, W" c& I - / T9 E5 b4 z; e, A6 i
- ;======================================================================
) r, b' Z7 r6 w - ;等待VBlank到来
3 g8 F. P$ X* D. E, j5 [0 E8 j1 l - Wait_For_VBlank
% j8 L$ s6 Z4 ~7 O - LDA PPU_STATUS3 u- P% |- L3 ?; ~2 R2 `7 h7 M: @
- BPL Wait_For_VBlank
. D# Y, X$ @: }( ^/ n9 \ - RTS% j9 Z+ F( w$ b3 Q) M# V
8 x( v' H4 c' M K, P0 h- ;======================================================================
- Z! i ?( Z0 d* J; |/ i - ;调色板初始化
3 Y& p7 ]4 J. x7 Q" b - Palette_Init
3 P- u" C! p0 g; o1 Y; ] Z - LDA #$3F; f( X% R$ ?, M$ e5 m) U' i
- STA PPU_ADDRESS9 Z6 R0 ?7 ?+ B* ^. m! \+ v
- LDA #$00
/ j8 Y$ y* U4 ~$ B: Y# o' L - STA PPU_ADDRESS
$ d4 Y/ Z% [# T7 O" ?' o H - LDX #$00
. @+ Q, Y, O# u, x! C* ]- H - LDY #$206 i+ v7 P4 r. w& C( `; r$ a2 J, J; n
- .Write_Data0 F) c: K3 P0 S
- LDA Palette_Data,X
$ Q) [+ U; O1 u R1 G% x/ p7 T - STA FC_PPU_Pal_Addr,X+ K0 \+ W4 ?$ @! _; G) z* @# k0 S
- INX7 s' K; f9 r7 H
- DEY
( z! n+ R& A8 U% R Y/ b# Q - BNE .Write_Data
0 N: r) u5 T+ r: u+ g6 s) p - .End
2 m. y4 L* P2 d# d - RTS1 f _& s+ t. R7 m* `
4 y3 K2 d, ] k. A/ S1 Q' \- ;----------------------------------------/ Q0 m/ t8 y; P' p o6 ^
- ;调色板数据7 I) ^7 }6 l2 B, x- C: l7 S
- Palette_Data
3 t5 ?" C, M" y }* q1 r - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
7 A3 A4 }0 N! Z - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
- b9 \$ T/ U9 g- _) @ -
0 S$ @: W! b/ Y$ Q3 x - ;======================================================================; ~; @8 Q( N# y
- ;命名表清空& ^% Q7 Q) B$ I9 V9 S
- Nametable_Clear1 T# z* H3 H* \' C
- LDA #$20
0 f! `8 T) C0 f5 F - STA PPU_ADDRESS5 f V2 F$ M2 {- s) t K$ K Z- I
- LDA #$00' S4 N e3 s2 ^+ z4 U$ g) b
- STA PPU_ADDRESS# k3 g- c7 f l' O# F+ N1 ]
- LDA #$00. o+ o8 ]; P" T) t
- LDX #$00
K8 a& z( m! k& U - LDY #$086 K; k6 h" |- @/ O8 r
- .Write_Data: o. k# r& A; d% |
- STA PPU_DATA
L+ i' m5 q2 e( K3 r - INX* q! A S- G. w6 X' o- C0 e
- BNE .Write_Data
+ S5 }; @8 F6 b2 R& S( e - DEY& K. ^0 a3 o2 Q# t3 K
- BNE .Write_Data1 m5 d7 ]0 z" u) I/ f
- .End/ g% P5 ~( u2 v; Q
- RTS; I* E9 t# {- z6 I) F, B
- 6 j! y% |2 J/ t
- ;======================================================================8 d$ u& s' I6 |: E/ s) I
- ;音乐曲目切换
1 e# t9 j$ c! y- k( D! w - Music_Select_Process
* n: d5 `7 n! a: S
' i- q! S' W& H- L- .Pre_Music;上一曲
& d5 A+ d* @( _, X# Y1 ^4 h8 W, P: U - LDA FC_Gamepad_Once
% Q1 z' F( }1 h1 u$ P& q - CMP #JOY_KEY_LEFT6 v: G! M q4 P. e% ^
- BNE .Next_Music. r1 J: {9 O6 O" G
- JSR Music_Play_Pre% Z8 g5 N, c3 g* ]5 x4 X
- .Next_Music;下一曲
" g8 H8 y5 J9 e2 l+ J$ u0 U - LDA FC_Gamepad_Once
# L* x6 ?9 g5 R- K! N! } - CMP #JOY_KEY_RIGHT
9 z( c5 U! }# p0 x& Q: X - BNE .Next_10_Music
, q/ a! B8 @# h1 @! O" ~9 [ - JSR Music_Play_Next
/ O* r4 i. Y6 \ D' U& w& x - .Next_10_Music;上10曲
9 X% g V7 J j2 k2 U - LDA FC_Gamepad_Once( @& x) v; R3 J% q9 ?" z; q
- CMP #JOY_KEY_UP. K: @0 s# X" S5 ^( u9 j
- BNE .Pre_10_Music$ t) D& _0 \% r% b, k) e
- JSR Music_Play_Next_10
4 v M5 d9 a$ Q - .Pre_10_Music;下10曲. Q; Y2 T/ Z& _+ ~' B
- LDA FC_Gamepad_Once! U, u% w, W$ }4 S4 p. v; |
- CMP #JOY_KEY_DOWN
$ r5 K3 n( t }& B' [- r- q - BNE .Reset
) h2 k9 L: \7 h9 T7 p - JSR Music_Play_Pre_10! g/ Y1 R& D% `1 F- R0 k
- .Reset;重播当前曲目- a. n: D4 {/ Z4 `7 _0 S: Z$ e1 }
- LDA FC_Gamepad_Once
( ~/ [5 V( M: j, D: [ - CMP #JOY_KEY_START
9 V/ l5 l' ~4 a - BNE .End
. C- ^" n8 w8 A* Z - LDA FC_Music_Index s2 {$ q: t3 [+ C2 P( v
- JSR Music_Init_Process
0 S) V# K! x4 M) J - .End" f7 Y! _' j7 @& ?
- RTS
9 J9 B+ A6 S6 c! ]3 N - 8 l L* \4 I; R. D# L
- ;----------------------------------------------------------------------; F5 b& l6 v# b5 D! [2 o6 |4 ^
- ;播放上一曲
) [% }: x4 ^! s; Y R1 p+ P - Music_Play_Pre
# @& E- D- Y) {9 f7 b9 j* G% j - LDA FC_Music_Index/ ]. w! {1 f) F* x0 _: b
- BEQ .End3 U" [" T, |' k; |! |7 [( r
- DEC FC_Music_Index; h5 U, U# l l
- LDA FC_Music_Index
. e& Z' h+ B! A, F: \/ s8 x1 v - JSR Music_Init_Process# A/ X( A/ A' v$ I- j" X* Z
- .End
# n% F0 S e% K {+ P5 a - RTS9 b9 r# K v1 _, u: X
- ;----------------------------------------------------------------------
; D5 Q* F1 } Q5 g- P& p - ;播放下一曲. L& M" s7 h: W8 I" I
- Music_Play_Next
7 W7 o! i8 e& J9 F: X& }- ^ - LDA FC_Music_Index
' D4 G: _- t1 d& Q& i% T R0 @: ? - CMP FC_Music_Max_Index' l; B! o8 A" u* a, [' ~# t
- BCS .End
1 n% `% L/ ~. D2 N7 m- E% l9 t - INC FC_Music_Index
! A) i/ [5 R: R - LDA FC_Music_Index$ S1 C' t7 ~. h2 H# t9 v" a
- JSR Music_Init_Process
1 l) `% c4 o/ ~: ^7 J1 r, a- e4 Y/ {( a - .End3 g. u9 v& v4 Q) ]3 s
- RTS2 a G" c. D5 w( n. E+ s
- & |8 H' ?+ ^8 u$ f4 @7 X
- ;----------------------------------------------------------------------
x8 _ I2 t& J8 S& g1 F5 z - ;播放上10曲
* f H0 Y. A3 a; e- _" A - Music_Play_Pre_10
. b. O, Z! t$ [& f" O& Q3 |3 X* c - LDA FC_Music_Index& I4 F5 ~' A! g7 p7 _5 m# g0 V8 f
- BEQ .End
& _' p) U/ L* y. a( M9 U - SEC
3 y) Q1 o/ O0 D1 i h/ G7 h - SBC #10; X* F" L0 e' z" q3 C. s
- BCS .Pre_101 B3 a3 Z6 P7 |7 T, Y, [; t
- LDA #$009 G1 ?) ^5 W G3 S3 b
- .Pre_10" D z, I! c h% p) T
- STA FC_Music_Index
: Y; K" F! r1 p" @5 T - JSR Music_Init_Process: i- O6 F8 j, y
- .End; x s, Z( z W& s3 @% t+ C
- RTS
- R s7 l$ Y9 e6 a z6 E - ;----------------------------------------------------------------------
3 p- h4 J) G! H) y$ R7 a - ;播放下10曲+ H; y& ^* I4 w- F* U" h
- Music_Play_Next_10
$ f3 ~) f, A8 o9 H8 ~! [9 S - LDA FC_Music_Index
' @' |! G( C7 b. t# J - CMP FC_Music_Max_Index; V# i, V8 e' \4 r9 a1 p
- BCS .End# x2 ?3 @1 }5 v; d/ Y
- CLC5 U& S. [% _, `* [" {
- ADC #109 b7 _6 @6 a# T; }! U/ w
- CMP FC_Music_Max_Index; e s4 j+ E4 o8 k& g6 P7 n. J2 ^
- BCC .Next_10
R& H/ X7 w* Y" Q& F - LDA FC_Music_Max_Index
. K8 {0 P7 k/ h, V8 W8 [$ k - .Next_10
3 F: d1 u3 [2 M2 T- t( u+ X - STA FC_Music_Index
: D7 V; u3 r; M5 e - JSR Music_Init_Process
+ m& V3 Q2 v8 u - .End9 J; l$ d+ e6 s8 a1 }
- RTS
' x5 l* {" C: A' G/ D; n) f - & D5 m1 {" v5 |9 Z( L" s0 y, x
- ;----------------------------------------------------------------------6 R& ?' P6 k# r* [, \. i9 Q- p
- ;8位十六进制转3位十进制制
8 X' W9 r4 U( x; ?( b- {0 A' z- E# y - Hex8ToDec. v4 }+ w% ~1 q0 s
- STA FC_Dec_Data_19 Y5 V9 A" [/ F! ~: Z& t7 E% p
- LDA #$001 ]$ b5 ? a; W$ k4 L% F
- STA FC_Dec_Data_100
& X1 ?% \4 h/ Q. J - STA FC_Dec_Data_10
. m- H& d: K; e& Z& B - LDA FC_Dec_Data_1 r3 S' P8 j, {2 a+ X
- .Convert_1009 g( J/ ~4 E6 v% m* k( K
- CMP #100( m4 u6 |2 K/ v) r
- BCC .Convert_10' [$ K0 r; _7 N/ M; j1 j8 s
- SEC( l# f3 Y; P1 S$ y( p1 p8 T
- SBC #100% }0 s4 X0 H1 ?( } @( n/ C
- INC FC_Dec_Data_100
O+ J$ z9 g. Q1 W - BNE .Convert_100/ }* U( S$ h2 D4 x- y
- .Convert_10& i7 a F5 M& u, k" N
- CMP #103 ]: W' W2 s' Q4 o S+ M
- BCC .End
1 i* Y, f5 }. q- G2 [1 _ - SEC
) K. F1 b5 A6 M: T: k; @. O4 s - SBC #10
/ H5 A4 q! U c, \ - INC FC_Dec_Data_10
+ z6 J2 k) Z3 k# ?! K - BNE .Convert_10& C7 M1 H* n: g: ?2 T6 }/ g
- .End4 Q7 B q9 H* {- m0 M% D9 H
- STA FC_Dec_Data_1: z1 h. ?5 g- v3 }
- RTS) [& }3 s" P* j5 w* C8 |
- ( d! m: _$ o! y- i! X F
- ;----------------------------------------------------------------------7 b; n$ m) p- G/ k; L! p( e3 z
- ;显示曲目信息
) ^1 h$ b, J, \) i; ]7 T8 Q. ~9 l4 d - Music_Info_Display
& _; S" e5 } b- T* R' W* V r& c$ h - LDX FC_PPU_Buf_Count
. x( m: B) K$ w, B% W" d0 { - LDA #PPU_WRITE_MODE_CNT_LINE
! x! h9 j$ J: t$ \3 b! n - STA Use_PPU_Buffer,X
+ g- Z' M4 E1 ~2 u - INX
4 J* G- t, p/ [) z. A y5 ] - / H6 O, r2 p) S Y5 n' z
- LDA #>MUSIC_INFO_POS
2 `" z6 y8 b( Q2 g6 A# S. ^ - STA Use_PPU_Buffer,X
! J8 V- w* s# p. R6 u - INX
6 K1 Y, J6 t, ` - 4 y$ {7 E1 b! c$ u
- ;居中
, v. q' p; q: h9 d" [ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2/ e( Z, W; }+ s1 L% ^# I
- STA Use_PPU_Buffer,X/ j- Z' N3 u5 e$ `/ ?9 \1 _
- INX
/ X0 F' f( |# J& n - . C: y% L4 E8 s0 @, C# {4 d
- LDA #$05
& l( g( P5 [9 U7 v4 U" Q+ A7 Z - STA Use_PPU_Buffer,X
4 o6 _5 r. f' `) S1 @8 n9 `/ P - INX' W- d& b- _9 a0 W, Y( K6 X1 B+ e
- , W+ M. M0 L" B6 w2 `6 U
- LDA FC_Music_Index# x: V4 M# O6 N: y
- CLC0 [' O3 z$ b8 R
- ADC #$01
6 C9 y$ d' v2 `5 }; F& ]7 X% s - JSR Hex8ToDec
' J0 \# j0 F& D( |9 ~1 n -
$ K% q7 V! m! [' {. T/ l - LDA FC_Dec_Data_106 d8 t+ d" [- D$ t# J
- CLC
) u2 i& u$ a0 v3 S - ADC #'0'
) m1 a1 V$ Y- E, c - STA Use_PPU_Buffer,X
" T6 o9 m4 M! O% v; ?( A6 ~. i! V - INX- ]+ E; _+ `' n, Q+ a% k) n7 S; c
- ' T3 E: {; W# N* l2 a
- LDA FC_Dec_Data_15 e5 V( K4 m4 r7 e& l. n; v
- CLC
$ C* @$ O2 d9 _( I9 Y- D' f& G - ADC #'0'- o% u' F6 q/ X" A
- STA Use_PPU_Buffer,X
4 f0 z/ n7 n2 x7 Z: h# I7 @9 o - INX
% Y: @& h+ e5 _8 q - 3 R1 `: ~/ h; S3 |
- LDA #'/'
1 Q# i$ |8 p0 d! c. D" R! I - STA Use_PPU_Buffer,X
8 ^9 M3 D( y* _9 r( H# t - INX+ m4 t/ r0 E) [" o, f; d/ G
-
7 p/ Q* X( [ G9 M - LDA FC_Music_Max_Index% N- Y1 D9 h& {( o) I" @5 H" j
- CLC
3 ?" U4 b5 x3 A/ t+ j. E$ V7 K - ADC #$01
" B# V- Y* ^3 O6 n - JSR Hex8ToDec
$ L B8 L, M; {4 {2 d -
( t! s' C) n6 H - LDA FC_Dec_Data_109 w# Q1 s" f. t3 u1 a
- CLC
% S; r- p2 H f7 T5 h - ADC #'0'
& ^: i; B1 p% j; i2 g - STA Use_PPU_Buffer,X
; N# i% W- x3 G* L) D2 A5 f! v - INX
! C5 G( ^% t! R+ a - : K3 ]- F. ~; U4 P& f, x4 q
- LDA FC_Dec_Data_1; d' q* i! `% \2 g
- CLC) i2 K- M* N( T" |5 a! w( J. U
- ADC #'0'3 @/ ` U" A, Y) ^* z0 c4 A j6 P, R
- STA Use_PPU_Buffer,X
* V5 W# \7 `4 Y* d# t3 I: b: s' s' \" n - INX
) @, {, f* j7 L3 C -
& r9 @( s) |. I' c( k7 p - .End% f2 V( J3 | `9 a
- STX FC_PPU_Buf_Count
: |5 M, r7 @! F8 d) @0 n& m - RTS
3 p0 u6 T0 C) v5 p' d. u - 8 W7 L6 k+ l8 D. W
- ;----------------------------------------------------------------------9 y D% [/ g6 t( ?* ^. v5 `
- ;音乐曲目初始化处理
& i6 |4 _+ @; F( H( I; Z3 N5 m - Music_Init_Process6 G5 i! m0 R2 g* h& ~
- PHA
/ }$ T6 d6 y' Q% M - JSR Music_Clear_Process
`) V a$ k. z2 q* T* k - LDA #$1F
$ P$ F. W4 c" D* M* p4 \ - STA $4015, @( T' h$ r: F X
- PLA
) o9 Q7 f7 o) ^1 U. G4 [ - JSR Music_Init_Addr f0 K$ c3 a% g/ D, k
- JSR Music_Info_Display' T. I- m- A, N: c Z" T' \
- RTS! Q9 M+ N. P% o1 z) e
- " X4 o3 }' f4 v5 g- E
- ;----------------------------------------------------------------------( ] P- M# a5 F! K7 \
- ;音乐播放处理
8 ]9 D. [7 D1 B8 L d' a" L - Music_Play_Process# x$ E9 E6 c" I* g* Q3 q& O) z
- JSR Music_Play_Addr
1 V! P" I% l: m - RTS
8 \& X4 D5 } L6 u - 0 l' j0 d; P1 Y
- ;----------------------------------------------------------------------" H. a% d* Z# _; E* p( ?* P
- ;音乐播放处理2 g1 L2 \ \3 K) Z7 u
- Music_Clear_Process& _! h0 C. ^+ H5 N3 Z& N/ F
- .IF Music_Clear_Addr% R6 ?* ` N, n; d6 |# {1 Q) @
- JSR Music_Clear_Addr# \( p1 v6 q, ?5 M
- RTS8 ~3 l0 ]3 Y4 o1 }) m# Y
- .ELSE
5 Q' l9 s! C8 X J& `; l& Y - LDA #$1F$ C' T: V4 n6 q* C+ F
- STA $4015
% p W6 p" `' H. k4 `' t1 ] - LDA #$00
- e3 L& a3 g1 e5 n3 [0 y$ E5 ~/ a - STA $4010
) K8 |8 e! y3 B$ O7 m& `' o& C- Q - LDX #$00* |) X; U. }; h- p
- LDA #$00
6 K0 t4 }+ r* h3 F7 D - / @, G, d: B$ g
- .Music_Clear_Zreo_Page_0 J: x5 T( @& k' k5 {/ P/ A0 w) N
- STA $00,X
* J2 V% f! ~" ]6 o, i - INX
2 H, V& m. x/ ?0 s8 `, \ - CPX #Use_Zero_Page_Begin# @: M, g+ [- X9 `+ r4 |: b$ P
- BCC .Music_Clear_Zreo_Page_0
+ U* o% e& {; F1 o - 4 g) t$ L- [3 f5 P3 V2 L) p7 ?
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size; y0 g x0 c8 ]. u) J; V. b
- .Music_Clear_Zreo_Page_15 V$ e7 E% B' n1 b
- STA $00,X
4 J3 ~7 i! z- h m3 e% s2 a3 m - INX
Y# o, ?- ]4 z; p6 h4 p% o* I8 A - BNE .Music_Clear_Zreo_Page_1
( K( C- y; `" {# p. M( z( l( s6 ~ -
5 h9 _- n% _+ H u - Music_Clear_Process_1- l2 ~- f/ D7 h' z0 B# J
- STA $0600,X6 }! l2 a) O( }, i" x3 _
- STA $0700,X! v5 k5 \" n I$ v" f
- INX& ]: v/ S/ X' M3 z
- BNE Music_Clear_Process_1
0 z/ o* f& c% M* ]# Q - LDA #$10
& H& k, q& L0 {3 f" \ - STA $4000
* a' T( |" M9 T- O- {7 v - STA $4004
0 s' d. }0 _( F+ i B - STA $400C
' d2 s. N% \8 E# f' u - LDA #$00
* E* [' |/ t( }- E6 d! U - STA $4008* E8 D' _, v$ ]4 J
- LDA #$0F/ X, k: a( R: t2 O8 H, I
- STA $4015
7 c5 ^/ h( z1 v2 {. @! D# g% C% A - .ENDIF6 `: ]2 L2 M4 b6 u7 @5 x9 k2 W
-
4 P; c' H9 G( H! d# | U4 |- X$ _ - RTS! `0 f; A+ E, _& Z' R8 R
7 H" o ?' v9 P" f- ;======================================================================
" @8 P+ s% h' W! k - ;重启处理
) C j' O4 N* N2 t, w9 _1 p - Reset_Program/ h7 V/ Q5 h& i) ~' y1 U
- SEI
d, o9 N8 e w0 X2 k# f - CLD
- p7 [9 ^) c5 T/ V - LDA #$00
0 N" Q5 k1 R3 ~5 F; H - STA PPU_CTRL
% K+ ]% B D7 [) k% b - STA PPU_MASK
: l' N( M& W1 W4 a - STA JOY2_FRAME
6 O* i6 }7 k9 L# t* q - STA APU_STATUS
R2 Z! A9 P. r9 H3 s9 C: s - 4 K3 G7 |/ b+ w1 j C; B
- ;等待屏幕准备完毕
: q1 x; a" S/ l8 v: Y J2 d2 j+ Z6 o - LDX #$024 B( a7 e/ _; ?) g# d( E
- .Wait_For_Screen_Ready" k6 ?0 V0 [* a, d7 L; W0 U
- LDA PPU_STATUS
% o& ]6 V' U0 `' P a! M8 o+ p - BPL .Wait_For_Screen_Ready
: P. G1 N5 \9 m% k6 h9 n9 | - DEX
( `2 `! B; p9 H, B+ K - BNE .Wait_For_Screen_Ready
" B9 Q; }# F3 G! l# E -
3 s7 v6 w$ _- u$ O6 a/ w0 D - ;清空调色板
; A+ h$ Q/ A( q# x/ b - Palette_Clear5 ?, w! Z; d5 z+ Z- K) T, t
- LDA #$3F8 Q$ a! ?* E- l* V4 ^$ W5 x6 b
- STA PPU_ADDRESS0 b+ I K0 W w1 m
- LDA #$00
$ X' j* {+ [1 [2 q, g! E - STA PPU_ADDRESS
( O% y1 Q' z* @8 q8 L ]: C4 [ - LDX #$20
; _% ?/ s3 H [# o' Q3 D( T5 C$ r& Y - LDA #$0F
5 M) F! s6 m- E" |9 E/ l# i - .Write_Data
% c. e% j) `# [( M! H - STA PPU_DATA1 S& z. V- j/ n" C& w3 d
- DEX
2 j( c B. `& ]9 _3 | - BNE .Write_Data% N: N+ `% y) m
- 0 M9 `+ t+ @- x: I+ E
- ;清除声音 $4000-4013% I7 x6 ~3 Y" }! d* i. {6 X
- LDY #$14
, T8 M' w8 P" X - LDX #$00
7 A, a! }$ G* h$ t1 t5 A8 I7 `" i - .Sound_Clear
- Z2 I3 }# X5 k3 G( t - STA $4000,X, F0 r1 D1 N" c* P
- INX
7 s# T, B1 \+ k+ O4 z - DEY; M/ }) m3 ?7 Q9 \3 [
- BNE .Sound_Clear4 f' B. _! \. d! M
- 2 Y+ {1 |$ C0 s( v& ~; f. @+ [
- ;清除 RAM $0000-07FF0 w4 U; u: F0 _6 l: r
- LDA #$00
' g j0 ~9 c9 B8 e$ G - STA $00
$ \/ [% k! l+ l% M/ D4 ? O: G - STA $01
0 H( u2 o+ R/ Q) u, V) } D - TAY2 l' Y5 j9 [# N
- LDX #$08( Z1 K/ c: j8 c# ?
- .Memory_Clear+ c7 z8 S, M& w5 a8 [
- STA [$00],Y8 L, k; `* L2 r5 |" Q p
- INY' N" @' X0 B( P" A) [) C5 Z
- BNE .Memory_Clear6 b; {6 z. W4 q
- INC $016 n: E5 h; _- Y. u% {0 v" `
- DEX
T- @6 ]0 R- D2 Y. ]6 `2 C o3 a - BNE .Memory_Clear9 _0 b8 [$ \; T0 n9 y
-
; O0 o% E$ i& l - ;精灵缓冲初始化
4 Z+ y/ F0 [' m4 Y - LDX #$00/ n9 M5 k* V3 Q2 O5 k
- LDA #$F8' b5 C( {+ G# u" C& `4 H
- .OAM_Clear
! y' A s& [# F0 q+ C - STA OAM_DMA_Buffer,X
/ ]2 D4 z& B9 @. c% a. | - INX
5 ~5 A) U# j8 i - BNE .OAM_Clear
! }& T( @* T/ k9 P5 v( i8 | - 1 m5 H" P( J) e- a, V# J
- ;栈指针初始化
6 y: @. L- }/ K3 e1 u+ e2 n6 r; M - LDX #$FF
5 I. J( {: I- Q. m; n - TXS1 N N8 x9 c- i
- \+ S. n' o q$ c
- JSR Nametable_Clear;命名表清空
' A4 R: J8 |8 W" Y: \" I* X6 u9 X - JSR Palette_Init;初始化调色板缓冲) p ~3 O" _ z3 Y7 W. o' W
- JSR Static_Text_Init;初始化静态文本
# M1 S0 c* d- n0 v' B3 S -
* C& N2 M3 s3 M# x; p - LDA #MUSIC_ITEM_TOTAL - 1( Y3 ~; i8 v' N/ ]
- STA FC_Music_Max_Index6 F$ j& P! C9 H5 m# b
- 0 R. t y7 y3 K' c8 j3 u
- LDA #$1F
6 _& A4 n: _+ y' e1 L$ A3 [ - STA APU_STATUS: i) y* _/ Q) X- Y
- LDA #MUSIC_BGM - 1
; c$ b t2 c) P% J, S% y3 s - STA FC_Music_Index6 ]' K2 q( s1 q! G, a& w& W. `; \% }
- JSR Music_Init_Process;音乐播放
9 k9 d, h% @+ M# I9 q1 j -
) o: E4 a6 U. o/ X" K! j - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
! I: ~) F8 n3 M5 `5 U - LDA #$1E
7 Z9 m3 C+ F6 [. I* a8 h; w/ Q - STA FC_PPU_Mask_Buf
: N8 v f, w, Z - 5 j5 ]! @0 [! Z) W" _8 \$ R9 R
- ;启用NMI处理/ }# U% f' X" v) e3 e
- LDA #$80
; g# a. w( l% a0 B" ^2 p% h - STA PPU_CTRL
+ J/ n5 q! h3 E" n4 { - 2 L$ u' u! n0 L4 j$ d$ }1 l
- ;程序循环, 剩余工作交给 NMI 中断处理
4 c; O3 g9 S4 l$ M( h# q - .Loop4 K$ ?, c' ^) ]/ b" {& t1 D. G* ^
- JMP .Loop/ x1 I9 B# h/ y v+ l6 \
8 c% G7 O; O9 B- ;======================================================================5 X" f! C6 M5 h$ v! U! G
- ;不可屏蔽中断处理; C8 p9 c9 d* I! R/ I
- Nmi_Program6 Y6 h, W- \, ?5 |$ }
- PHA9 w5 v d% Q9 L- w
- TXA
/ X* U9 x6 x/ t5 I9 O1 t4 ~ - PHA# ^' M) z% ~! ^# [$ ^
- TYA5 l8 p, l' h, w; m$ _" R
- PHA
0 G/ h9 F. ~; U+ U5 D" W0 k0 t5 J" z -
3 Y8 M4 d' e+ d) n - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
5 ~7 e. E; J3 f0 ~6 p5 E) F7 R- Q0 h" V; Y -
/ b2 ?; B4 Z8 q9 ^ - JSR FC_PPU_Procrss;PPU处理4 Z1 P( [5 m6 x" U. u/ |: f4 d Y; Y
-
& W7 w; H7 M4 I! r* E2 S/ q, \" P - ;精灵内存更新+ A8 r+ |& P: p f/ A6 v
- LDA #$003 b' }. c ?$ N i0 J5 A9 U
- STA PPU_OAM_ADDR, G; Q/ M- ]; r6 x# c
- LDA #OAM_DMA_Buffer / $01007 ]- N4 n, r" Q$ g |
- STA OAM_DMA
: s9 h5 U1 T0 S" x- f - 4 l+ i9 K" j1 m# J
- JSR FC_Gamepad_Process;手柄输入处理( P# @3 D$ L% r# ]* H
- JSR Music_Select_Process;音乐选曲处理
$ g) r! q3 i7 ~5 ? - JSR Music_Play_Process;音乐播放处理
9 A( r7 h7 X( H - ( [! `/ O3 z; c
- PLA* e' f1 S3 Y) {0 K# u1 b) t
- TAY
4 Z/ Y! o. m. @ - PLA+ B% D6 s0 U5 z* K4 z3 i
- TAX
3 `7 ?# T6 \; M% j& l0 _% ^" _ - PLA4 B2 A* A( C# Z b' P0 ]$ ^. k
N" H O, f% j5 H: u' {- RTI
+ M3 c' l) @% ]3 E1 q
Y1 i( w9 ^; E8 w) U- ;======================================================================
$ U. p* |0 G4 [* j: s2 ` - ;请求中断处理
) p! s b/ v0 S7 J - Irq_Program
! s7 f* _2 r9 y6 J4 a# } - RTI. b7 H% F0 }! r/ h; |" j0 z
- : L0 _; @4 E, I; O" b \" y
- ;======================================================================
5 C$ o# C2 C% v - ;中断向量表
4 J& e) M8 ]" L9 i - .ORG $FFFA
' F+ G( T& a3 P C - .DW Nmi_Program ;NMI触发时执行4 ^! ]" x$ }/ b% s( q4 b
- .DW Reset_Program ;载入ROM时最先执行' w9 c' U/ B. z! O# r' e
- .DW Irq_Program ;IRQ触发时执行2 z! r) U" C4 F
复制代码
5 K7 X8 z1 \- L8 f7 z& C" o4 f
; u0 T1 B C( Z
3 e# G7 d/ \! {https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|