|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下/ G* [) O, |+ D! W4 E

, u6 _$ j! j6 K% @ ]& i以下是主框架代码:' d7 N. ? u: U% W
- ;======================================================================; m4 h$ g, |0 t
- ;文件头
$ Q. F9 ]8 E$ q% t$ {2 Y - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
8 j9 K$ I o% G4 F" o8 S" j - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量5 w4 D3 ^+ C& U6 L5 G6 o
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
8 O% \; l* t4 _2 O/ |8 S - ;======================================================================) j0 X- f V& \4 d
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
% S: K" g/ M) V3 L - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 12 \" A3 ]8 w2 k1 v: c* i2 O: o
- ;======================================================================& e1 A3 h" A: p" x( M5 V
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
1 B1 T5 A& y: D- P - RESET_ADDR = $E000 ;主程序起始地址
9 k* ^0 V5 H! Y6 A1 Y' } @. U - ;======================================================================1 }( z; A8 v( Y5 r5 S& z
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
- b$ d- V* ?' l( M- D - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB4 Z* |- t' j7 S! r
- .INESMAP 4 ;Mapper号 (0-4095)
2 Q) s4 W I1 H* W m V+ w - .INESSUBMAP 0 ;子Mapper号 (0-15)
$ n3 h; g9 t" F1 P - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)/ I( r6 F' C# M! D4 B9 o
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
6 c4 t5 \. p" }9 R ?+ K - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
. p8 w5 a% n! k - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
) }0 x$ m: l( d& n1 | - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
/ [8 k' R) l4 C6 U/ b4 c5 R: l - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
* T c6 D3 |5 D7 B% r$ y1 r - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
+ e H3 i+ q! M' @ - ;======================================================================0 H# t5 K5 _, P
- .INCLUDE "fc_demo_config.asm" ;全局配置! ^! q% R. U& c8 V
- .INCLUDE "fc_demo_constant.asm" ;NES常量1 W9 ]6 p1 X; C# i6 i) p; [
- ;======================================================================8 j$ y. n w5 a1 d" v- x9 n9 v( W
- ;音乐配置
0 v w/ H$ y3 U+ }$ R9 e/ F0 y - .IF 0 = MUSIC_THEME
6 q; @: i9 @( L - .INCLUDE "data/music/Gremlin 2/config.asm" N- I8 O) D6 U. X4 x9 L
- .ENDIF
' w4 E, U* U2 m2 X -
3 `, m/ W1 |9 V! m' }& K - .IF 1 = MUSIC_THEME7 `1 w% m+ x1 j4 G; e1 P
- .INCLUDE "data/music/Raf World/config.asm"6 Y8 {; A7 n( N% w* k
- .ENDIF
- v8 y% c6 G% \( O -
! L9 s( h9 n6 ~, ]1 N' N" B - .IF 2 = MUSIC_THEME
9 V! w7 d+ y" G, r. j& A1 z - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
% g4 I; I' S5 t7 W% A2 t7 W - .ENDIF
; j& e8 A. d+ Z9 r8 ?) |5 E
" q8 q" H/ z* Q- ;======================================================================: M5 }/ ]; E9 x+ _/ G1 g
- ;引用CHR图像数据4 E; c: t" b+ m# q
- .BANK NES_16KB_PRG_SIZE * 2
4 N% {# z! \! G+ ]6 l' L6 a - .ORG $00009 J' c; b: b1 ]& _" L
- .INCBIN "data/bkg.chr"1 b- q& c" W8 B& D8 m' O1 B0 V/ @9 {
- .INCBIN "data/sp.chr"7 _: Q5 t% Q) m# E$ f2 a
- ( x/ o( Z& l( p2 {: X' J( |
- ;======================================================================
' B5 C3 e- O6 ]. {! i - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank8 ^, g: b! F7 e# |8 ?0 W
- .ORG RESET_ADDR& H! f& c( J0 V3 P6 ^ m0 E' G
- ;======================================================================
g' p: R) S8 i1 N0 j - ;引用其他源文件 I. h( M% H* r; t+ P7 H6 X2 g
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理8 S: k3 p% X1 O! m+ z8 [3 W/ B
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理( T f8 f/ P8 D9 L
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
& O+ F- g: F0 F' s8 J C+ b - ;======================================================================4 ?0 B# R4 l- U, f0 p
- 1 v5 X$ K$ P7 W) d1 A
- ;======================================================================
; B2 F1 Y7 U+ }7 p9 F/ p7 ?+ b' `+ N - ;等待VBlank到来+ r7 ~3 B4 }4 R. {% O. c' f7 l
- Wait_For_VBlank
5 n- z$ E" r$ [5 e9 M- A: @ - LDA PPU_STATUS( }0 {7 ^3 I# |) H/ n% y
- BPL Wait_For_VBlank
' O: p1 P* L" U( c/ V9 m% S - RTS
# B) p% t! @. \4 Q
- H. z8 e( S4 m" J( N# v# P- ;======================================================================" L- _: b" J1 T; n8 v% r
- ;调色板初始化4 O9 [& N; @3 r( b
- Palette_Init
) y# R. h9 i: n H- {/ _ - LDA #$3F) v& D! H; @" y* _+ i2 U+ ]* K$ O
- STA PPU_ADDRESS& ^5 S' @* S5 b4 x/ X& y- O7 e. \
- LDA #$00$ S! h$ }1 c: ^
- STA PPU_ADDRESS6 @2 p" B, y- h; x1 B8 P9 g& C
- LDX #$00, H& W; x: [; e$ ?0 w1 O3 |, e
- LDY #$20
+ {' P% n2 C i; Y7 i C& _ - .Write_Data
$ C- H0 N% f. e# j7 D - LDA Palette_Data,X: c, P/ J+ u1 h+ L
- STA FC_PPU_Pal_Addr,X& J$ s) S# m) \ i. y3 P9 O
- INX
% p7 r7 J, w0 [0 L, m: { - DEY
; W, q( ?$ x) X6 L - BNE .Write_Data, M4 h5 [ `" \
- .End
' W- H7 X; |+ _4 `) u - RTS, G0 Y0 s6 o( F0 G
" G& L2 D( G" B/ Z S( k6 z- ;----------------------------------------. } w8 r( ]& }0 `& |5 O
- ;调色板数据( ]3 \+ I( N9 r* o6 K8 S) y: D
- Palette_Data
6 o \7 _# a. p- j7 J4 ? - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
4 j7 \5 b2 _& C7 ~& u/ {8 C0 c. l6 f2 o - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 225 g; t1 X- d! }+ s: i
-
+ G' x+ z. a1 J/ o; R - ;======================================================================$ L: A6 I$ l: o$ `4 ~. j
- ;命名表清空
0 ` J# f& }4 M - Nametable_Clear" z- b: |5 x$ ]# Q6 E5 h2 ]
- LDA #$20" L; r" U1 R, L
- STA PPU_ADDRESS
7 g7 Z7 Q% D/ T- z - LDA #$00
; G4 T: n4 m2 _9 A - STA PPU_ADDRESS
/ ?& E( A; ~8 a" V: q- H% y - LDA #$00
: M( w7 w2 g7 d+ I; k - LDX #$00
6 X, t) V& \8 ]4 ~8 N0 j - LDY #$08; {+ G5 c$ t' ~+ y/ {" j
- .Write_Data7 {0 B; U4 t( G9 _* I( T c. V
- STA PPU_DATA: h/ Z a1 ]. d! @ [6 ^; N# q/ Q# g* e% N
- INX, X! b1 g D P# D* l0 R7 l' x
- BNE .Write_Data
) Q- d# Y+ z- R: V' Q/ \. Z - DEY
) d* ^; n4 |: I( ]' y) [& V7 z - BNE .Write_Data5 p, _# S. l; y
- .End% b' _2 e" l8 |6 u5 R) B- J
- RTS
7 L! L2 I2 k6 B% S( x; b, u
8 R9 w- ]1 A! c' J( T- ;======================================================================
: L# h/ o" @ s6 v2 R - ;音乐曲目切换
0 K, E' n; N# }1 s - Music_Select_Process+ H6 k7 K( e3 { ?* [- r7 ], v1 C
- : `2 y) g+ C/ z+ ?, ?
- .Pre_Music;上一曲- s, l: I$ p9 z) |! V W; h% [
- LDA FC_Gamepad_Once/ `% @' L. E. ~3 b, ]/ u! V
- CMP #JOY_KEY_LEFT3 q; f6 Q$ ^/ J1 {, v @3 L. [1 }9 `* F& y
- BNE .Next_Music5 f- `& O- v6 ]0 Z& {$ J
- JSR Music_Play_Pre
/ V! A: A: b: U! a - .Next_Music;下一曲 c. V' U4 Z+ H5 b
- LDA FC_Gamepad_Once
2 O4 b( A7 m& o% Y0 B9 f' U8 p8 [+ i - CMP #JOY_KEY_RIGHT0 q0 X8 B6 {! r: O( q
- BNE .Next_10_Music" s; L2 n' n+ G6 g, `: I
- JSR Music_Play_Next, I$ L$ t- u! [- h% Y
- .Next_10_Music;上10曲
$ b$ q0 Y5 F0 h' F - LDA FC_Gamepad_Once% N0 p6 e6 ?% D% t; V, \
- CMP #JOY_KEY_UP/ ^0 \- _2 ? k2 h9 Q
- BNE .Pre_10_Music5 [: V7 v% T& D; c. [0 x
- JSR Music_Play_Next_10
# O9 {! I/ v1 ~) j, U7 U - .Pre_10_Music;下10曲: Y2 v5 g8 e2 K' @% O- F
- LDA FC_Gamepad_Once
, ^# I& G2 S- m7 R6 j - CMP #JOY_KEY_DOWN- o+ U# y! L8 p$ d4 K
- BNE .Reset3 ~- ^" [% l0 v4 h3 V! q
- JSR Music_Play_Pre_103 S) g+ P6 ?" X9 y. @5 J/ J
- .Reset;重播当前曲目' g9 Y9 E/ t& @6 r; R3 M! x2 ^7 N
- LDA FC_Gamepad_Once: [4 _6 k z/ v$ E# Z
- CMP #JOY_KEY_START
' ^. D& B4 @& X7 O3 O) J - BNE .End
# w; \8 j/ L1 N/ r7 f3 W - LDA FC_Music_Index5 F. s9 e# ], l) h
- JSR Music_Init_Process
5 _8 D! n2 ]( f' t& z- ~2 i - .End
5 d" N& F. [# Q0 I0 M$ N - RTS
! h5 v8 ~; M5 _+ P
& C7 y8 \+ y* p1 W3 x+ i: N- ;----------------------------------------------------------------------
7 T' m, O3 o! B6 e# c, S - ;播放上一曲
, ?* y$ g W# W, v: W8 d - Music_Play_Pre
% w! F: q5 u W5 g. ^0 E+ o - LDA FC_Music_Index; U" h6 B. y! o. E. ?
- BEQ .End) {7 f5 }+ x- Q
- DEC FC_Music_Index
# @! X, E- P! ~% k( I" V1 @ - LDA FC_Music_Index
2 P# l# t$ T1 ^# `4 n - JSR Music_Init_Process8 x! e6 Q& T; D# [
- .End: @+ C; o1 g. S4 C3 X
- RTS" r0 l" D( p6 _& H, f* p2 R
- ;----------------------------------------------------------------------
% k9 ^ `7 A9 V7 Z+ x# v - ;播放下一曲
! b6 ~) q. d/ e! C - Music_Play_Next5 ?! Q- i2 G- U' F. f) }& b
- LDA FC_Music_Index
n* m% y: |# H+ a! q- w; j6 h - CMP FC_Music_Max_Index
: G- U- {% f( r - BCS .End2 r8 t1 e- B3 Z* ^4 H8 Y
- INC FC_Music_Index
7 K# Q9 F. s# p4 j - LDA FC_Music_Index
! |9 {& ]- B" D3 O - JSR Music_Init_Process9 ^0 Y" N& v: O0 _3 f3 @4 p
- .End0 z- o/ g! B; V# [ `- H* L! j
- RTS" d) I! l5 W8 l* ]/ `% X
- M# y. a# \1 o9 u- ;----------------------------------------------------------------------
1 e3 @7 i+ y# s k% t" i - ;播放上10曲
) `* d$ J# D' t+ }: s5 r# P - Music_Play_Pre_10 o& Q. z+ r8 D( v
- LDA FC_Music_Index6 I$ I8 s' p# c* R/ F: z ]1 g
- BEQ .End- T c" u, K. R1 `; \9 D: n
- SEC
; J+ ?' o7 }5 l! M' y - SBC #10
; y- z: z2 A0 U B& z$ M. U/ r - BCS .Pre_10: d7 h- z) w! |. Z" |' P! |
- LDA #$00
% u) f" E4 F* W2 }5 _! Y @ - .Pre_10
6 |; ~6 T" U5 a. Q" r4 g! ~ - STA FC_Music_Index- R# D/ h, m6 v, i% s# T% \
- JSR Music_Init_Process. [1 L0 H: u& T6 J
- .End. X2 X9 G1 s* p( C4 p* a3 k
- RTS# |* M2 p/ \1 ^
- ;----------------------------------------------------------------------
0 c' M( V3 e1 H- C+ |) k - ;播放下10曲
& A$ L" `) i; J: \ - Music_Play_Next_10
" W% M8 A% U/ t" i/ _ - LDA FC_Music_Index
3 ^+ l6 Q* x% T$ W& V8 ?7 U* X6 L - CMP FC_Music_Max_Index
" Q% M$ c# s: _0 A& Z% l: b6 ]* x0 V - BCS .End% A1 x, m4 W$ V2 H: t
- CLC2 f3 x# e9 d T) m5 h
- ADC #10% S3 q" X1 c6 h5 q. @9 n9 P0 X" e( Z
- CMP FC_Music_Max_Index& V1 Q/ A" d! d& o- c% Y4 X
- BCC .Next_10
& u+ m. A: X/ Q' p. K+ |9 d - LDA FC_Music_Max_Index
1 H$ G, ~( h d/ E" {9 s - .Next_107 G, A. x* ^1 X; G
- STA FC_Music_Index# j# I0 F+ ^8 _2 g- O
- JSR Music_Init_Process
9 `6 d& M {' b1 l, i8 K - .End
2 v* X+ {3 a. K, t - RTS2 C( `* k2 F$ }* {8 _( W7 f v
, s, y# P5 H6 ^- ;----------------------------------------------------------------------
- J8 p% o$ j) r# u' i* P6 N - ;8位十六进制转3位十进制制
$ z1 g6 o2 [; `9 @' F6 ~9 d - Hex8ToDec1 [$ b# {0 F8 M; [3 h& A P# @2 e( }
- STA FC_Dec_Data_1
- J( ]+ i: m) |5 @ - LDA #$00
+ {+ a" s. q J* ^ - STA FC_Dec_Data_100
& [, n- F$ f2 a8 d- c, B- _ - STA FC_Dec_Data_101 [2 B2 R+ P# ^/ Z( @
- LDA FC_Dec_Data_1
/ Z7 |. f' Y4 N3 A! d- Z! N - .Convert_100
: Z, c0 l8 [7 l8 Z$ ^. O - CMP #100
( l8 d! J9 z# Q5 C7 ] - BCC .Convert_10
# [& r# l+ L" u( K7 m4 `5 N! k - SEC: v6 T. v5 I3 S, ]. A. j ~
- SBC #100
: M U K: p7 G7 R6 P - INC FC_Dec_Data_100
; l: {' D5 R& I# v7 y! d( i, B3 ^ - BNE .Convert_100
: m9 W( D3 w6 L( x - .Convert_10
' \8 q. c' i3 }* X( W+ { t0 R - CMP #10# W8 @' X1 L* Q% {/ k
- BCC .End
/ k9 M" I6 T: m. ]( m5 U* q - SEC
8 E, B; o! Y6 M' D& l+ t* }# x5 q - SBC #10
" x& h2 @- y6 P - INC FC_Dec_Data_102 ?/ o) |% ^* u
- BNE .Convert_10
4 H& b& L$ y7 o& `4 Q) H - .End6 A q- `+ S+ P+ _2 h+ E
- STA FC_Dec_Data_1, q% _3 i0 }5 m& z
- RTS( M% N6 G/ P* @) g5 Z3 _
- - L$ u( ]/ l1 L1 a6 D5 b* Z7 e8 N
- ;----------------------------------------------------------------------
- @+ ?, x2 c8 ]6 {& ] - ;显示曲目信息6 [2 F% A0 B. x$ r/ N5 \. l# o- \
- Music_Info_Display
, \2 z$ y( d# w) } - LDX FC_PPU_Buf_Count
1 C" `2 B& A8 d+ E' c, a - LDA #PPU_WRITE_MODE_CNT_LINE* H7 ~1 Q* ~5 u
- STA Use_PPU_Buffer,X; M+ @! d: c) x
- INX( P5 n' V r/ _/ Z* o% i: ~5 G! @
- ( u( k* Q" m# j) e0 F" {: n, P+ ?
- LDA #>MUSIC_INFO_POS
& d. f4 A' ]. O - STA Use_PPU_Buffer,X
, j% }! U" E+ f1 K4 T9 a) } - INX
8 [3 x1 t% G4 Q1 X b% L - $ C* Y* e' b' u N2 U
- ;居中
/ L2 n+ D- V9 F% L" d0 }+ D - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
: Z0 i; S+ D6 W' S - STA Use_PPU_Buffer,X
+ {2 L& a( G9 L0 M9 t - INX9 c6 h% `0 ?6 Y% K2 Z+ P" v( X
-
4 _- d I/ M3 s0 K6 W& C - LDA #$055 ]; c( r. a1 P% C( ]
- STA Use_PPU_Buffer,X. X# J" b* a* A6 L$ p1 r
- INX" L0 i, z; u* G2 r- i3 ~
-
8 P' k$ ^; r g, q4 e0 ~ - LDA FC_Music_Index$ i+ H5 U, d' t+ I0 _( y$ ?, N0 F! q
- CLC
& K2 p* U& J$ Z+ O4 ^5 H - ADC #$013 B+ S- \: J( Y% Q( g
- JSR Hex8ToDec: l% g- i$ ` k( ?
- 9 c! a) m" r1 I% M5 b t C
- LDA FC_Dec_Data_105 U5 `& B9 w! d/ W; T/ B" B+ c
- CLC
6 _7 x. Z5 L3 ]% X" k - ADC #'0'
4 J4 R. b" Y k' c - STA Use_PPU_Buffer,X
`. }( J; K1 K! O! U' k - INX
! n8 r# _& l( a& F' a' L- ` - / k0 \4 t0 K3 e# H. t5 v% b. l
- LDA FC_Dec_Data_1
8 X d! N( y7 {- O$ X7 J4 r! m% Y - CLC
, h8 L) D5 x) ~& M4 r - ADC #'0'
/ U b+ g/ Z8 | - STA Use_PPU_Buffer,X
7 ]- u4 z; |8 E' S* d( u; Y. N& V - INX
7 T4 O b0 c5 @) ~) R" r" K0 N -
, N1 r# U( w' ]/ z$ C. C z W - LDA #'/'4 J) I q4 n5 ^% W
- STA Use_PPU_Buffer,X2 g7 i. {; ? l0 C, z9 y3 @+ V
- INX2 M& z. a: B* j& j; ~
-
2 t: B) T/ K) l! E1 O% C! T - LDA FC_Music_Max_Index
6 f. T: u3 a; n H/ s - CLC) @% A. m. L% e' T
- ADC #$01$ u) i/ d. f4 l
- JSR Hex8ToDec
) |+ r# R4 E: M' d1 A: y - 6 ~0 h9 c2 x& A
- LDA FC_Dec_Data_107 D! y5 L: ?8 f- h- W9 u
- CLC
9 J6 q. G( d. I, q/ X - ADC #'0'& Y% c6 {) h4 m5 y4 n) V' g: Z
- STA Use_PPU_Buffer,X
( X/ R+ i+ ?$ f - INX/ e/ x# _ x, S
- 7 }+ }5 I2 C7 ?& d1 Q) n' o U, Q
- LDA FC_Dec_Data_1
$ I; j' M( p) h8 @* ~ - CLC
, g' w3 R; W k- `" u - ADC #'0'
) c8 Z" O( i% q' c3 B - STA Use_PPU_Buffer,X
# e, g/ z+ P7 M: i. `) e1 u& d8 I - INX
/ B. F7 h/ \* `9 ]- b8 P! [7 f - ' g' @$ P' \0 ?2 R2 P" e# D4 D
- .End! B$ ?# Z7 C% f( b. U- y
- STX FC_PPU_Buf_Count
2 v; U; G' A# W q' |7 |0 v% c - RTS7 i9 {) T" n' y: A$ I
7 ^9 K' d0 Q9 n/ V8 Y- o- ;----------------------------------------------------------------------/ M0 m$ J' W3 e6 b! z
- ;音乐曲目初始化处理
* k6 {. L3 {; l+ R: V" w+ |2 ] - Music_Init_Process, }; H0 E6 L9 \: D* s" J
- PHA
4 |7 E: b G* `9 v3 M8 F; e - JSR Music_Clear_Process, L0 _5 ^) A: c; @- z; X& d$ X( V
- LDA #$1F
# G- e3 @ q) a5 g - STA $4015
" f8 i7 U' z/ l4 X2 ]" o - PLA
2 Z- c' x3 d& F. U# g1 G - JSR Music_Init_Addr: i e! d1 I6 d5 @; o$ G3 ?
- JSR Music_Info_Display; k! m0 q1 Y* M9 d( ^5 m
- RTS6 j- O8 g# K! }, x
- % E! y' P# ~5 k- B, K6 c# e
- ;---------------------------------------------------------------------- o! a5 ^" }$ s8 K, y- W! N
- ;音乐播放处理
( i% F4 O( B+ p5 I0 `7 u4 C N - Music_Play_Process$ E2 P$ J2 P, @7 U0 O$ O# v" L
- JSR Music_Play_Addr
9 ^, G7 F y0 T" L - RTS# e1 r" p4 Z3 |0 ^2 |0 b+ `
- 1 d+ {0 C+ `7 j# s8 s* f
- ;----------------------------------------------------------------------
7 v. Y/ h C, D. n( v3 x - ;音乐播放处理# i* U X' _8 C8 S4 u. T
- Music_Clear_Process7 u- [6 z- S, @: I
- .IF Music_Clear_Addr7 r* k; ~5 [0 P5 @2 d
- JSR Music_Clear_Addr+ R2 P6 a9 L9 k! k2 m: s- A7 w
- RTS( c3 J _2 q* k% W" h8 K2 k' a
- .ELSE
' v8 K, a& s) D( F6 | _+ G - LDA #$1F3 G3 Y( g2 ^1 ^& Q
- STA $40154 G1 |; g5 F3 z/ A! L0 j8 r
- LDA #$005 y7 I4 c! p) e
- STA $40104 `5 ]/ u6 ]! z# N4 i$ w+ I% \( `
- LDX #$00
! d% Q; _4 G+ i. f. _" ? - LDA #$00: G8 L) ^+ @8 O% a0 }& f, b/ }7 o
-
& A3 ], L, q& H) \) | - .Music_Clear_Zreo_Page_0
0 Q! v/ \9 _2 ~% q+ | - STA $00,X# ]# P/ s3 Z/ F- t$ U1 [- q% T) M
- INX
) l; R0 ~7 x( H; `$ {( b - CPX #Use_Zero_Page_Begin
, U, v8 x5 Z" ` M - BCC .Music_Clear_Zreo_Page_07 F) \. o/ _( Q. i+ A w
-
- Y0 |6 b; v- v! G2 V) U9 j - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size. p/ Z' V$ s! @8 s* [- G4 i
- .Music_Clear_Zreo_Page_1
/ Y0 d. ]8 f) ?/ A& V9 z4 b - STA $00,X
; F7 T: H& E$ E7 Z - INX
% V: _2 z+ |% I5 m4 Z& l! y - BNE .Music_Clear_Zreo_Page_1) C/ c: u: C: k; G0 G) p
-
8 S+ O3 A9 D9 H7 r, e. z - Music_Clear_Process_1
) v8 a. ^+ V% J6 L. U0 j - STA $0600,X3 y! S5 }& d. [/ q
- STA $0700,X
8 l6 A4 D: v. d" {. j( u! j2 T - INX
8 P+ D8 Z. \. t: B7 V - BNE Music_Clear_Process_1, q1 E8 A7 _" G7 p8 @) k
- LDA #$10
! |! v G' ?# R5 ^+ \0 [" e: N7 g - STA $4000
! i% W9 M; B# k- k$ l b* k! S - STA $40047 T3 j, d" L) L% C
- STA $400C
, H3 B6 ?" [1 ]1 D/ T) n - LDA #$00* L6 v& Z d$ H" Y" ~; L
- STA $4008; E: t9 f! L7 Z, D. E4 O
- LDA #$0F
/ t5 Y$ p9 F5 S' W7 i- }5 F - STA $40153 [3 W8 @5 s4 |! D2 X' ?. W7 R
- .ENDIF( y# L/ \" {2 t3 ^0 X+ u
-
% y* W" J- Q* n. |! `# ^ - RTS4 v& A2 p! x, W: Q W
- & j$ _; \8 Y, \; M. o
- ;======================================================================) x1 T' x1 j- a5 t8 e3 c7 g
- ;重启处理3 O1 l W7 p4 z% c6 d2 ~4 S
- Reset_Program4 m& G$ w, n' X
- SEI
+ m! O" ~& [0 Q( K - CLD1 s) o0 }# t7 q! W3 c# r3 l
- LDA #$00" X+ f/ m& u, Y9 y7 o( k( r
- STA PPU_CTRL; F2 q8 Y1 h2 \. p. k1 @# z# G
- STA PPU_MASK/ u7 y* j' g7 C5 Q) j* D
- STA JOY2_FRAME
9 q/ c/ ?* P* k - STA APU_STATUS
+ ^& M+ Z) B+ E -
: ?6 H0 d2 `1 L* e5 B. u# Q9 r - ;等待屏幕准备完毕5 j: i: K( S) D4 A
- LDX #$02
- x- f1 j0 r B/ h5 Y - .Wait_For_Screen_Ready" K1 ?2 r; Q+ E+ J
- LDA PPU_STATUS
3 B) Z( r; T) v4 X( ~ - BPL .Wait_For_Screen_Ready& J# h! o6 D7 M) z( \5 Z
- DEX: l* i' c% e2 ~1 D" D& R
- BNE .Wait_For_Screen_Ready0 v: H! O$ N3 T1 ?. l
- ( [; L* h ~5 j: C# W
- ;清空调色板" i2 Q X9 Q5 C& `9 S+ b- A
- Palette_Clear' a8 `9 I1 c0 y, Y" r$ M
- LDA #$3F
# Q) J# z0 f8 ^ w - STA PPU_ADDRESS
1 A. h6 t( E0 A7 ]) H - LDA #$004 N0 u8 {5 E( y* i( |" L% e
- STA PPU_ADDRESS
% }. P m" Y; z. @ A' K' R, ] - LDX #$20
% _1 k/ w" q! _" Q/ b% [ - LDA #$0F; D3 L/ P2 i+ J/ c3 Q! Q
- .Write_Data
5 E( V2 z7 G) j4 l7 Q+ E E - STA PPU_DATA
Y2 Y ]1 n4 I% V/ W0 r - DEX
* S0 L0 k5 B0 [' j$ L - BNE .Write_Data
. \3 j% a8 Y0 T& r# T
8 O' c0 c4 t" H: _7 R- ;清除声音 $4000-4013
5 C" F* z" ]' C$ P |3 V) x3 a - LDY #$146 ]: a) h0 e D
- LDX #$00
/ |/ V7 N! R: c - .Sound_Clear. K( H2 R- d9 s
- STA $4000,X, ]+ |6 G. H! |/ [- E4 ?) m4 i4 e
- INX& `% P% B4 y% F# z1 x
- DEY: T3 p; f! ?+ y, d
- BNE .Sound_Clear
4 Z; e& K: J* A9 D - 0 D6 v! y9 W4 P4 }) T
- ;清除 RAM $0000-07FF
5 ] \4 q0 ]0 ^( D6 j; p% ? - LDA #$00
" M" L1 |1 S! a+ A - STA $002 p% W9 k' g- ^6 P: s1 T5 O
- STA $01
9 r \" h4 j/ y7 Y$ m) o2 }9 o - TAY% v2 _6 J- s/ j2 B$ p# L6 v
- LDX #$08
3 q& y% N1 V7 t4 {, P: v - .Memory_Clear
# P: r$ z8 }1 X* F5 e% | - STA [$00],Y* M! c9 z( S8 [ O
- INY6 V$ y; f. r: c/ z: W* L9 r
- BNE .Memory_Clear
- x v; \1 S- w; S - INC $017 m- k$ |- p+ v1 `. r4 N$ ~
- DEX; d7 y i; G# f% D) C6 R
- BNE .Memory_Clear6 ]! J9 b0 d* o) l" V9 a
- . F1 o# i- J. U' Q# |$ F" W
- ;精灵缓冲初始化" |; n# c* |/ C J5 W
- LDX #$00
+ _/ q( o. O5 B# H - LDA #$F8
! X$ ~! k/ ?4 Y! R, w- c - .OAM_Clear' m4 X2 n" }/ O5 K8 z* j7 T- D% e
- STA OAM_DMA_Buffer,X2 y# a; u3 [# k& x) X M6 k& K
- INX
! s9 S8 V( t7 n/ }0 h& I - BNE .OAM_Clear9 k* a" T D$ h4 x1 S! z( p
- $ d+ a0 y# e, U7 D$ E& _
- ;栈指针初始化
% v# E8 ]& J8 f8 J5 U - LDX #$FF" L9 y( c* }& r) ]1 L a5 v
- TXS4 O5 b& I) b& Z2 f$ n( J+ K
- 0 U7 Y* p& M; `3 t1 C# O, F' w
- JSR Nametable_Clear;命名表清空* G9 X) O5 Y% {! f5 y
- JSR Palette_Init;初始化调色板缓冲$ |3 H: w, F5 R
- JSR Static_Text_Init;初始化静态文本
2 S5 ^/ F8 B0 ^8 `. a - % m2 g6 P4 a7 P. c4 q% t' `
- LDA #MUSIC_ITEM_TOTAL - 1
% @" ^: e# |5 B d9 K5 ^ - STA FC_Music_Max_Index
7 D L5 h4 [2 s1 p - ; r$ z8 t. \4 R7 U8 i' y# s
- LDA #$1F: } i/ u, X/ z5 K
- STA APU_STATUS( c/ P: K* T( \! l+ \6 S! V% F
- LDA #MUSIC_BGM - 15 X. v- l2 H1 e& x- ]3 l/ _
- STA FC_Music_Index
* a+ v! F' r* v( X. r: g - JSR Music_Init_Process;音乐播放$ C; B5 H$ Q" \! X0 s4 ?7 P9 o( J
-
8 p- g: O- G' i3 R0 | - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)+ X1 p1 Q5 @; m0 w* Z$ s2 U
- LDA #$1E3 P8 }1 o* ~& G
- STA FC_PPU_Mask_Buf
! n3 a& T9 O( l. s0 E' {3 w - ( Z/ t. u9 b# X) p/ L' d
- ;启用NMI处理
& Z4 H6 b' M/ \% k. r8 q I5 o - LDA #$80+ i/ e0 a" d+ _- h+ k
- STA PPU_CTRL
# ?% B) X( ?8 s" b$ k% b, a: n -
. k4 i1 M( \2 X8 V2 z - ;程序循环, 剩余工作交给 NMI 中断处理
) d) s: g5 R% e$ s - .Loop
9 h' b+ u1 Y v* Y' I. i/ n# w - JMP .Loop
' M2 n5 N3 n0 N0 f. Q; K - ! N6 J X, @2 d9 F
- ;======================================================================& x6 i( f. \. Z; Y, ?
- ;不可屏蔽中断处理0 C+ ^5 T; x; q- o$ n9 k5 |' D* d9 T
- Nmi_Program
0 r8 |4 N1 [( I# [9 W0 } - PHA5 O0 x: d3 Z4 j- j
- TXA
# D& c7 V. l+ w e N - PHA
! w; E. i0 O# @5 P9 d5 `' ] - TYA5 s( X9 W# Z9 r
- PHA/ n# g% s( R0 o8 E! K6 ^( b% L
- 5 \2 c- x! w/ }& A+ r+ p6 J
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位5 Q T6 B0 M+ Z1 i/ p
-
; t' N! b: h6 E1 U# d d: [ - JSR FC_PPU_Procrss;PPU处理
4 b/ Y$ [! ?; E. T -
$ m$ W$ @' @ P - ;精灵内存更新
3 J. x Y; a* D! ~ - LDA #$00# ^% c+ M+ o" b( @5 k2 k' v
- STA PPU_OAM_ADDR& ?5 l- f1 y- u# [
- LDA #OAM_DMA_Buffer / $0100
" N: s% E' q2 s' {$ n9 b - STA OAM_DMA) z. O# [; W- t4 a
-
( f7 s7 p. j* ^9 {! p4 ] - JSR FC_Gamepad_Process;手柄输入处理4 _7 h* ^9 q4 x m: B
- JSR Music_Select_Process;音乐选曲处理
0 X8 K8 L# I* j/ l, T - JSR Music_Play_Process;音乐播放处理
2 T0 d# V5 H; z7 ~" |3 ^. i. x - 4 [ j1 n4 q. ~8 {* W
- PLA
( N3 q6 P5 N/ U$ W& \ - TAY7 J( g( c- h# ?; B
- PLA
: ^+ Y. Y/ m' u( J6 p7 c - TAX/ `, i* A p: V8 {
- PLA
, k# y: ]6 S, C5 q# B" h8 ~
4 O: i2 f; i2 u1 }/ H% @- RTI
; ?& A: L( P) b# S5 c - 5 O" u- B' s Q! {9 M
- ;======================================================================
( `6 b) ]2 V7 V& }9 a, O* {: `# _3 f - ;请求中断处理
" v; X& N7 \1 a2 X! M - Irq_Program
+ U9 ^, S( Y* I7 Q% }5 E: L - RTI$ e: ^8 V" V; R" \3 J. B+ D
7 K4 ?4 ^* H! S) k* @- ;======================================================================3 X5 x5 V v7 G7 U- i A( B/ ~& T
- ;中断向量表
: s' m2 q7 q% r6 e. } }% y* Z3 Q4 n - .ORG $FFFA
& r1 W6 y3 S! L6 D - .DW Nmi_Program ;NMI触发时执行
' s+ c& O: r" V. G/ Q. H" S - .DW Reset_Program ;载入ROM时最先执行1 N) l3 `* F: u6 q
- .DW Irq_Program ;IRQ触发时执行% ]$ L k$ V. b1 [, g
复制代码 2 p3 z. c" e& B9 ^% U2 U* y
. M& G; ]0 h( c/ r
* ?/ Z- l# [! L3 ?4 F. Phttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|