|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下6 N1 }& [! z" M8 W3 N# p" q6 V& N

+ W- ?) ]- x1 s1 `+ X' J3 `以下是主框架代码:
- |% r; l& h, z# k- ;======================================================================0 G4 C& b: M: }9 m$ G
- ;文件头( L/ L5 O1 C, O
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
/ X% F4 Y0 g2 n' M) v - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量! E. t) V" c& Q# q N+ d" m
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码, `& }$ W+ Y$ z& e6 L
- ;======================================================================' N, E T1 X" }0 W! ~
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 24 A, }3 S3 {# y$ B8 X9 Z9 u
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1* o& x$ L2 Z( }
- ;======================================================================
7 p& l" k) e* ^6 R3 P - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
& K5 l+ [$ ?7 H, ` - RESET_ADDR = $E000 ;主程序起始地址
0 h! D& \: U) ^+ ]" k - ;======================================================================/ T5 X t/ l3 l$ l+ n) `
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
1 U: o; F) v9 @; S) X# m - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
' a; v3 m* ?9 N4 l4 w8 R; Q$ p$ g - .INESMAP 4 ;Mapper号 (0-4095)
' |. v) U" l+ X' y3 @; s/ D* q - .INESSUBMAP 0 ;子Mapper号 (0-15)
' ~, D) w. z8 \; A - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)6 Y" Y3 m% [2 T4 G# R K1 {. G' s
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在), H% v. |( L1 ^6 M+ V
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)* d% u% x0 e' _: V# Y
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)+ [* x- A2 c ^: u4 o9 N3 x. O/ \8 E
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数); u ]9 Z. i g& v( G
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)8 b, n7 ^7 y! b! Q
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
6 _# L# T; f* v - ;======================================================================
. D! f( S" P. S6 K" t - .INCLUDE "fc_demo_config.asm" ;全局配置- i9 r) b, i) o
- .INCLUDE "fc_demo_constant.asm" ;NES常量
/ j; { B/ R J3 y/ v. Y - ;======================================================================" x2 E* Z8 ]9 g9 \' K: u
- ;音乐配置9 R0 R- C, _' m/ X
- .IF 0 = MUSIC_THEME
0 A" E& e0 L: e `4 v6 l - .INCLUDE "data/music/Gremlin 2/config.asm"9 q! \" z: n6 H* r N
- .ENDIF2 _5 i, f1 U: H) h3 y
-
9 X6 ]/ V1 t' @' T; ]) Z - .IF 1 = MUSIC_THEME) Y9 {7 c2 }& F8 ?, L
- .INCLUDE "data/music/Raf World/config.asm"2 C8 |4 i. b$ `. P. F/ C7 M
- .ENDIF
6 e7 Q' v* n8 M* Y' |. d -
0 q, c. `5 N5 `, f U - .IF 2 = MUSIC_THEME - d* h5 { R1 y/ s# d" h- ?
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
4 t/ ]$ {) \7 J! T+ g6 N+ }- { - .ENDIF
: a' A7 r4 C4 I7 i% e
( b( X# F" Y0 W# S, o- ;======================================================================1 l( ?5 b; p) [5 Z
- ;引用CHR图像数据
+ }( _6 [$ g: G5 c1 ~/ m - .BANK NES_16KB_PRG_SIZE * 2% D8 d5 p+ v: X) W/ n: m
- .ORG $0000
* G2 E. }' Y4 D5 P0 b - .INCBIN "data/bkg.chr"
9 n$ f: `( l8 A9 X$ B7 F - .INCBIN "data/sp.chr"
4 q3 r7 ?6 x5 I- X, f7 i - : d& E: n3 {+ {* n6 b
- ;======================================================================
% Z2 g8 T6 \$ a. v - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
1 y% Y$ {$ b1 f+ P) [ - .ORG RESET_ADDR$ Y% a! ?# r/ e5 @5 M5 ]
- ;======================================================================
- q0 l$ m/ ~- ` - ;引用其他源文件
8 E8 z2 B% g% |% A/ T - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
# `2 a& d& w. Y9 q. L6 ?( a - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理' \* ? g- @- @' I3 P4 L% `) v; b
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理. A( p" {" H) U, v
- ;======================================================================9 c4 S% X) r% o" n8 I: X! m. Y3 W3 b0 q
- 3 }; n3 z/ [7 R; H0 e
- ;======================================================================
& A2 \& U# X% j/ w/ [ - ;等待VBlank到来
. G8 Q0 c' `8 W$ h, { - Wait_For_VBlank9 p; }+ A( P3 u" p' D- N
- LDA PPU_STATUS; z# K: n& [& C% X
- BPL Wait_For_VBlank6 ]$ ]6 P- F, ~- }- B
- RTS* ~5 Z- E( K! ^& V8 u# t) t+ ? a$ d
- F1 l q; P; X1 k& g1 v
- ;======================================================================
* ^; a9 K! p7 c" ?8 U2 } - ;调色板初始化
5 Q" i9 p3 N0 x# v - Palette_Init4 E. I. k! a- N* e2 U
- LDA #$3F# x# k5 L7 m3 m/ \8 ?
- STA PPU_ADDRESS- K& \( Q" O! i
- LDA #$00
- A/ Q" ?8 }4 ]* f; A- \ - STA PPU_ADDRESS. N6 \" Y. e+ g- }
- LDX #$00
% x. Q+ h( b' G/ e2 M" x! r W' _ - LDY #$20( u& Z5 q8 w4 G, b# A
- .Write_Data( L' M7 X5 J9 T9 M$ K1 U' Z$ r
- LDA Palette_Data,X' t& L6 I" t- d8 L
- STA FC_PPU_Pal_Addr,X9 ?& u1 F6 ]1 |0 J( |! X! I p
- INX
' H" x+ F O1 v0 R6 B7 @$ Z - DEY
" q; f; X+ V5 P j - BNE .Write_Data, t. ^* S" ^# y6 D( l6 n
- .End6 P9 r: R4 ?0 s3 l4 E6 f5 L
- RTS7 L4 ^4 s/ W3 y" c$ j; V" X+ S
* q1 M: U! c' N+ H, q- ;----------------------------------------
F% m: d5 e5 W, `) w4 N2 j: t( m2 A - ;调色板数据: g9 [0 ^1 r6 k- k; _4 H5 m' S
- Palette_Data
% F( _# F, p9 t - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B: E1 y8 W2 }) c& {% ]8 ]
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
# G1 c4 o& N. Y - 2 `2 T0 M6 u! a0 m
- ;======================================================================
! {3 `3 ^0 f9 {1 `% u - ;命名表清空
1 Z6 C3 ^) q1 G! R - Nametable_Clear% S$ c. d& E9 s$ _
- LDA #$20
* P7 Q6 D4 M* y9 a - STA PPU_ADDRESS
6 }) x3 x) V0 ]/ C - LDA #$00$ }; Z! e; S) r; z4 G
- STA PPU_ADDRESS& L w/ y- u9 S' F
- LDA #$001 I7 r! c4 F2 {5 M0 q) b' ]
- LDX #$00
0 r$ |, M: }5 J) N - LDY #$08% \6 i, F( o' m' F
- .Write_Data) k m* l& o. U* l [6 k& Q( g/ i
- STA PPU_DATA) X8 j6 V U. T, K
- INX W. {5 o# v$ p" n
- BNE .Write_Data
; T( ?3 r V* K& [2 a8 d - DEY8 o6 G! n5 Q- l8 z! B& {" B5 l
- BNE .Write_Data$ t9 m: q( _( D; _3 R/ K0 m7 [9 ~
- .End6 h. ^6 S7 u" t3 _8 B; I; j/ e( j
- RTS
; \# ~0 `. m0 A0 v - + ~8 f% H' O& N) } t& a# \
- ;======================================================================/ _9 {/ K8 H+ h: I0 Z! U
- ;音乐曲目切换* C! N* T: M4 H) M* i9 ]
- Music_Select_Process8 y( D# ]6 x) `& m
- - o' k/ o. \$ R; C( _1 r" B
- .Pre_Music;上一曲
! ~ O8 @4 @% R6 w2 j - LDA FC_Gamepad_Once) Y* v$ q1 a' e" x0 }* n: ?
- CMP #JOY_KEY_LEFT! T4 w% Y s2 }. M
- BNE .Next_Music
8 S1 |. M; y M9 w- F - JSR Music_Play_Pre0 h3 H2 q8 E) F) B$ U
- .Next_Music;下一曲
! N. ]( m4 N2 M; @ - LDA FC_Gamepad_Once
' \( l H# g1 W - CMP #JOY_KEY_RIGHT2 Y) B% _* G, ^9 a( j% P9 S
- BNE .Next_10_Music
6 Q' R- R' q$ Z - JSR Music_Play_Next7 N- b% T1 q+ o
- .Next_10_Music;上10曲- V2 `! C; v- M/ _
- LDA FC_Gamepad_Once
4 g: r* x# ]8 [ - CMP #JOY_KEY_UP) A" q. }! W2 `5 q5 i: r
- BNE .Pre_10_Music
+ L: i0 M: _& q/ }" G5 U - JSR Music_Play_Next_10
) y/ w+ m1 i7 q$ N1 p - .Pre_10_Music;下10曲
, f6 L+ c1 ]7 r# l - LDA FC_Gamepad_Once
' {) I. s3 X, ]! \2 C - CMP #JOY_KEY_DOWN/ m% {, v0 K8 O: m
- BNE .Reset: h3 _9 V$ e; r1 y0 e+ Y
- JSR Music_Play_Pre_10( @" X8 N' @ Z( J) A" j
- .Reset;重播当前曲目
# o7 C" r0 w- G& ] - LDA FC_Gamepad_Once( O" J; g! v' Q
- CMP #JOY_KEY_START
; }8 W$ E) N- j" C' Z% C9 o - BNE .End9 g; R$ t+ K2 j/ w6 M
- LDA FC_Music_Index3 U. Y& I7 v4 y1 o
- JSR Music_Init_Process
4 R- S1 U4 j. z k+ D2 \ - .End
3 Q1 e" m: ]. v - RTS
9 O) I4 m+ M4 D - , K N! N J1 r. I
- ;----------------------------------------------------------------------
* @& ^, O' P% S - ;播放上一曲
* p% N+ P% Z: J7 Y- y - Music_Play_Pre% p/ j) O- E; F9 K# s% i9 q
- LDA FC_Music_Index: k V3 c; E+ N$ z6 _) s2 b5 t% p5 {
- BEQ .End, L7 ]$ A% a2 [$ m2 s
- DEC FC_Music_Index
2 Z v" O4 I$ ^( B6 _+ m - LDA FC_Music_Index' L5 |1 ?7 b0 ^+ \& D
- JSR Music_Init_Process" a1 q+ O. y5 U) g. ~6 c& G M
- .End
8 y8 v! S: ]% l; C. W+ V - RTS
* Y4 V; }" \ W* x; O - ;----------------------------------------------------------------------
; U: \% C- N7 C* y - ;播放下一曲
; G7 K6 H+ v) T) d6 N - Music_Play_Next
# T+ m j. O5 k3 E9 Q - LDA FC_Music_Index
6 ?) ~( G L: J [2 [- E. V - CMP FC_Music_Max_Index
# h7 p" ^" S9 d! N - BCS .End5 A4 c1 r& Y7 L
- INC FC_Music_Index
- C. k$ _: ?" E; v4 f9 y - LDA FC_Music_Index
6 a) n6 c- v) Q2 @1 w - JSR Music_Init_Process* w( e" {0 X" v7 H3 e6 a
- .End
9 l- J( l8 Z4 i, H; E - RTS
+ @" [, l: J1 a+ A, a( U2 |2 z
$ V' l% B0 u6 @. e7 l- ;----------------------------------------------------------------------
E; u& l3 _2 S$ \+ x C5 \5 j - ;播放上10曲
% c- \/ S( T& a5 @7 i' [! |0 p - Music_Play_Pre_10% A, J1 _3 D) ^- w* e% g6 e3 i, R
- LDA FC_Music_Index) w0 ~5 [% F* H9 @8 E# z3 W7 }* ]
- BEQ .End; h% ]) c3 }" B' Z
- SEC7 E4 l0 E5 R# r5 N( ^* ~* {
- SBC #10
2 J0 ]. t: ^/ B! M4 }1 O - BCS .Pre_10
1 |' X" }: o: ~& t9 W9 X* u - LDA #$00
4 r+ L1 j7 J( G: n1 T - .Pre_10- \2 a- A" b* f. F+ q. B
- STA FC_Music_Index% i8 a) {- m- k$ g( R% _ n
- JSR Music_Init_Process
0 }6 T! R$ C1 z! Q - .End
* x3 o& h" b8 G; N$ } - RTS
1 J3 g; X" n0 e& q9 |6 X; I - ;----------------------------------------------------------------------
7 |( g1 X9 g# U% h - ;播放下10曲
. J/ L) f( y1 @+ d' h - Music_Play_Next_10
, z8 h# ^- W; G% n - LDA FC_Music_Index
6 X( L% C9 n3 x5 A5 [ - CMP FC_Music_Max_Index
- P$ i) B9 _$ ~4 Q0 O6 P9 | - BCS .End
9 F( ]- g; v! D - CLC
: E; B" G8 A$ j; e9 R7 E - ADC #10
5 p8 h5 f' o- F - CMP FC_Music_Max_Index
9 A, p9 j7 ]* n) [ - BCC .Next_10( X# `# h3 }& Z* i; X
- LDA FC_Music_Max_Index! X) ]7 P0 _7 |
- .Next_10
+ j( g0 e) J6 a ~5 R - STA FC_Music_Index
4 K6 l( j6 Q8 p1 O - JSR Music_Init_Process3 K2 O j& Q9 u9 ^
- .End! x, N, g- W: ^
- RTS
1 a% I7 ]6 N1 p# {7 Y! X - + [0 t) Q, W3 h2 b) H# P# `
- ;----------------------------------------------------------------------& {8 m- b7 S4 I! g2 N# w
- ;8位十六进制转3位十进制制0 ^% L. D- b9 r: h2 v
- Hex8ToDec5 g" k ~: Z% h" h' f5 x ^ X
- STA FC_Dec_Data_1
) s6 y- t' r, t9 c& F) d - LDA #$00
) o. `* N# I# q6 } - STA FC_Dec_Data_1009 [" { c) G; I" ~: H6 `
- STA FC_Dec_Data_10
0 P- s# ~- V4 n% Q# q - LDA FC_Dec_Data_1
! Q- d7 t* v) `3 I c& O6 p - .Convert_100( h/ z7 r* N1 K6 V
- CMP #100# k) A9 m" n9 {* \( Q
- BCC .Convert_10
7 N% n" j2 `- f- Z. z) p$ F5 Y - SEC8 N2 s+ N9 K- q) _% G* a$ K& M" V
- SBC #100- O- r. I8 H9 N% O+ i2 z I7 J* Q
- INC FC_Dec_Data_100
1 N5 I0 H8 B& _- [ - BNE .Convert_100' l9 r4 j( K8 T3 U6 T
- .Convert_10' P- R* c4 j5 G- b. l4 I: I
- CMP #10: i! k8 j7 K! S; x# ?
- BCC .End1 m3 U" j7 c u" Y. \3 \
- SEC
" w+ h* }1 B; h5 V' T8 Z - SBC #10
6 h4 G! T" Q T - INC FC_Dec_Data_108 r% L+ ]( f, t4 K& i# j
- BNE .Convert_10! A+ G J) _ A* i; R T) y" l( P5 k
- .End K/ r+ ~. a x- K% ~
- STA FC_Dec_Data_1
7 t4 u- Z Y( N1 e+ O0 G - RTS2 S5 U3 F. d3 w% Y" N3 [* a
- ! O4 ?# U9 N3 D) R
- ;----------------------------------------------------------------------
. x9 F/ W" s1 G8 e! U/ e/ V - ;显示曲目信息
6 Q& {+ Q& f8 T6 v Z - Music_Info_Display, n* j3 Z0 e( R
- LDX FC_PPU_Buf_Count% _' B3 y2 O4 v. h/ Y, C
- LDA #PPU_WRITE_MODE_CNT_LINE
, y) T/ ?7 l- Y/ Z& S& T- E0 Y - STA Use_PPU_Buffer,X
3 R3 b% P2 a/ B# P" u1 U: \& Z - INX
V }" o0 y0 B8 \ -
, _1 I6 u9 c, N$ m; l9 ]# ] - LDA #>MUSIC_INFO_POS
& ^4 o* q. |4 I u; E7 K; h. v$ ? - STA Use_PPU_Buffer,X
; b4 u$ k( b! r0 }/ r - INX
+ y+ C3 Q! L$ s. Y x( O -
6 `; f" @7 w9 w$ w4 a T; k( m - ;居中
' J) E# u9 _) b - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
1 x8 d0 c$ [9 p5 F ] - STA Use_PPU_Buffer,X9 p B5 P0 r& K4 u/ x6 d8 Q/ ]( r
- INX
2 |: U- V- w% c: U - 8 K. b5 A0 }0 q" f$ @
- LDA #$05
5 [; ?: E; X* G8 N" L - STA Use_PPU_Buffer,X
/ ?! h. w( u W5 L - INX
% m6 h! a8 \ {+ K& D - , @. K+ o* D' f* D
- LDA FC_Music_Index, ?' x5 y$ N8 s4 a9 F( f& w
- CLC
% i& ^$ j6 O* U, {% j! {+ P - ADC #$01) F! D- P5 m0 s: R2 \ \8 _8 P- X' L) b
- JSR Hex8ToDec5 I) H- L/ N8 H/ o8 \
- 9 b6 B1 K! p& \
- LDA FC_Dec_Data_108 X8 `% ^4 {0 {6 X
- CLC+ N, K$ T" F6 q- v, \+ S; m
- ADC #'0'
: \& z; N' n, G - STA Use_PPU_Buffer,X" R' I+ J' a9 Z* h, n' i
- INX% m& q. R U' R& t6 R+ \4 ]" Q" K
-
. ~' `) `+ I( W( X, { - LDA FC_Dec_Data_1, L2 |% F: f6 h+ t$ E& f
- CLC
. C' L4 [, u' G- q - ADC #'0'2 j0 [; q4 D- E6 n
- STA Use_PPU_Buffer,X
" w# g' v1 T, M/ b$ [ - INX( ^5 `0 t( `$ s6 K9 b" t0 X5 n
-
; ]) n: _5 q9 N9 ~ - LDA #'/'/ _2 H( Y4 G6 ]
- STA Use_PPU_Buffer,X* {! T% e m5 j: k, Y
- INX" m" ^. d" j" T5 r
-
" V( \: r+ g/ n - LDA FC_Music_Max_Index3 s& U; u. A, i8 ?' v; l k
- CLC
8 J- X1 @- C; [7 E8 r6 D - ADC #$011 h, [; v; C0 Q4 }8 |
- JSR Hex8ToDec8 @1 I: N0 O6 I2 A
-
% ?3 m+ \: L( A$ y5 ] - LDA FC_Dec_Data_10; m8 W$ o7 W; E5 I
- CLC
- {) S L U* j- J! F - ADC #'0'8 _4 x' r* @' g- a: |4 {
- STA Use_PPU_Buffer,X, T0 O8 Y$ D! ^
- INX
9 b* o2 Q( j5 y5 m - % Q; X; [; U( C* M, W
- LDA FC_Dec_Data_1) S% Y3 i" V- o- V
- CLC2 d& [) U- X+ m# q) g) `/ m" ~
- ADC #'0'
, T* S+ K$ q; M5 ? - STA Use_PPU_Buffer,X
" ^' h1 @9 F0 a9 c& P6 m - INX; D' D# C {. Y5 S! |, ?! `) A
- ! D. v4 i* Y5 p9 s! M
- .End! ~' I$ c" m) p
- STX FC_PPU_Buf_Count0 n1 S, P( o; F' W6 D" T- d6 B
- RTS$ H/ M" x1 {5 g" @4 U6 d" x
- z L9 L" ]' ?: `5 h' E! |) O
- ;----------------------------------------------------------------------
' t; E& j6 |- V o - ;音乐曲目初始化处理9 {4 Y! ~! V; k# ?1 m
- Music_Init_Process
* R& J1 |4 M, @2 i - PHA. \1 D2 I5 K7 V. e
- JSR Music_Clear_Process1 S% r/ O6 O* ~2 u* O. W
- LDA #$1F
: C2 V, U |+ _2 D - STA $4015+ s% F( g4 F& k: `/ W. M5 v
- PLA# W; Y6 z) x; N! C. L. }& {
- JSR Music_Init_Addr8 g3 A3 I8 O7 e4 G- D
- JSR Music_Info_Display
6 C& I3 X; W' p6 c% s; s8 @! } - RTS
9 g8 Y8 N3 I4 c4 l' }7 Z0 \4 { - + a) ~4 C) `' t Q. X! ?
- ;----------------------------------------------------------------------
- Y; q! k0 T7 u5 m1 t5 M ~7 b - ;音乐播放处理
2 }& X8 M2 A! _- o - Music_Play_Process
l6 Y7 H# |" j% n B - JSR Music_Play_Addr, g; k( K% J+ h
- RTS5 a9 R6 l9 c$ p! m, Y' l# G3 Z
$ p& k3 \2 M9 Z6 Y% k/ ^( G- ;----------------------------------------------------------------------
R% a/ s/ q) i9 ~9 | - ;音乐播放处理
+ I# h" F, c2 o7 D' O6 s - Music_Clear_Process
6 e& q7 @+ B# s5 N) ?* H( q - .IF Music_Clear_Addr
" u/ b8 N) j: c3 ?- h5 a - JSR Music_Clear_Addr- X Y/ u3 x u7 K
- RTS2 s! A0 D/ J4 g/ z
- .ELSE
9 J0 z8 w$ z4 C0 C5 p - LDA #$1F
3 z4 z! s3 e7 w3 Y - STA $4015
" R) a Z' Q/ l" E, j) B - LDA #$00* Y. X2 p7 D# J. s n4 I
- STA $4010: y8 P% E; L/ Y" b, y% d
- LDX #$00
% t" D$ Y2 ^) t1 h; [ - LDA #$00# W' R8 p) m7 v) @. V
-
6 v2 \# q/ W3 Q - .Music_Clear_Zreo_Page_0
( a0 o1 U: z$ s' L' R; V5 i - STA $00,X( t6 b* f8 e, l2 O( F1 x
- INX
) E. g$ h+ r. A6 q6 O( l - CPX #Use_Zero_Page_Begin) Z& b. Q/ _- G) V
- BCC .Music_Clear_Zreo_Page_07 c- [: I* K: g
- - S& x- X' |$ v `! q5 K4 r
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
! \7 s4 {6 ~) e5 l5 r% p - .Music_Clear_Zreo_Page_16 B% i3 Q) E, g8 H* X5 J+ ^
- STA $00,X
% f# R* _' C) |$ V - INX, J( b f0 f) n2 B1 E/ I+ s [
- BNE .Music_Clear_Zreo_Page_1
8 Z, S0 ?& K* ~0 T% P: o: i - 6 w$ b( x9 T3 [& a! j1 z& X
- Music_Clear_Process_1
1 ~0 H9 h4 w1 \* U- w. U - STA $0600,X4 Q+ P) r3 q1 z( E2 j
- STA $0700,X
& z6 K; ~+ U! p* w4 ~ - INX8 f/ M' e j3 G' e1 A: a
- BNE Music_Clear_Process_1
7 }% T, F2 b+ S7 f; G* D+ u. G4 A# q8 q - LDA #$10) j' U5 l& S- f9 u
- STA $4000
& u& P# |$ i+ o! c - STA $4004
! r5 O( V* q r6 E - STA $400C
6 R3 ^/ h& I. n9 p* V - LDA #$00/ q$ M$ j$ I1 c( F Z# r
- STA $4008
1 k m( m" G. |+ y7 x q - LDA #$0F
% p2 [ [: E' H1 {6 y* O - STA $4015
0 J( I$ m" k8 O# ?7 r% A - .ENDIF |, a1 N7 U. v1 N( i0 ^
-
% t# \4 @! a* x" ~ - RTS1 F4 u3 V8 U$ Q
2 d4 F5 Z& U, |0 M; b4 j- ;======================================================================
: _" i N' |/ o( O& c1 O+ P- z* Y - ;重启处理
5 ^0 b* K8 ^" ]/ n& b h - Reset_Program
1 z$ \( [: c, \1 B - SEI
: G+ _, B* A- K; ^6 p - CLD6 h: p0 t9 F$ s" H# A T% S2 Y
- LDA #$007 |; G, J" u' R
- STA PPU_CTRL
# o2 y% B; f y. a1 a2 P0 ~ }! E - STA PPU_MASK
1 p( U3 \. |: B3 d7 x* v - STA JOY2_FRAME
( b& S3 ]% \ i! Q - STA APU_STATUS
, X. B' j( r$ C& |/ U - 7 `3 F/ g0 f; N6 o' ^
- ;等待屏幕准备完毕
7 j$ {" e# x# l$ q3 r, Q - LDX #$02
2 t, c$ L1 N* z' k# [ - .Wait_For_Screen_Ready
) {1 @$ H4 ^" z8 n0 }2 o: G T - LDA PPU_STATUS
& J5 k0 z: E8 s+ K. G9 _- m [+ @ - BPL .Wait_For_Screen_Ready p7 p! X( i0 ~% j) d6 O6 G! E
- DEX% x q w' U& _8 _+ K. a) y* h
- BNE .Wait_For_Screen_Ready
6 \% o9 @- {+ H - & e; U2 v$ J9 U$ w
- ;清空调色板
: a$ | S; X9 U+ N# G2 |6 u3 x - Palette_Clear
. ]. X/ t6 G5 A2 S q - LDA #$3F" i3 a6 L& s+ L( P9 B1 o
- STA PPU_ADDRESS3 x2 ]' N) q$ P4 x
- LDA #$00
% P1 A# p( O9 D+ F( `" ~5 ` - STA PPU_ADDRESS: o- C6 D5 T5 v! E- o
- LDX #$20
) ~) I6 L' K% r8 I9 _. W& _ - LDA #$0F7 p! x/ n+ M& y I$ u* A) {% M* P
- .Write_Data
2 M8 ?0 N+ j: P- `2 d& V# Y - STA PPU_DATA
# u. Z5 w1 w) @- ? - DEX
: l' a# B8 v% r" I4 g. i# P - BNE .Write_Data
; x3 H3 r3 d% K3 a5 c Q! m; |
# x1 e; e% Q/ P u' w' J- ;清除声音 $4000-4013
2 g* ?: L; y# v' N5 L: c a - LDY #$145 \) S) K _" ~& I
- LDX #$00# M5 z2 @. d3 J/ N
- .Sound_Clear
1 o7 Y5 R' Y2 A. s3 r) \; X2 v, e - STA $4000,X
0 h( l2 O2 y. x5 h3 t - INX
7 z4 k; I- a& ? - DEY
8 t: H% @: n$ S* I - BNE .Sound_Clear
3 P1 p/ r. L {: [+ M! Y/ r - , _8 X/ w' j$ A& B5 F# m
- ;清除 RAM $0000-07FF
1 `6 Y9 k0 ]; X7 s - LDA #$00# x' U @- ~5 I- q4 j
- STA $00+ i0 T( X8 x- Y- |0 |5 `/ {1 G
- STA $01. S R& ]2 v/ O/ F+ o
- TAY
0 V2 M3 F' L+ x7 Y+ C7 O - LDX #$089 Q- y2 I+ l+ r0 T' h# h6 q
- .Memory_Clear
# ~ ?7 [1 }% v0 G+ Z; H+ L - STA [$00],Y
! R% S! i# ^) T$ Q - INY5 I' q+ m1 D" n' w* n
- BNE .Memory_Clear( A8 f6 x1 f; w$ ^+ n; @# n
- INC $012 T( I# _9 ?8 K
- DEX
* L2 }( J4 F' j8 ` - BNE .Memory_Clear
9 ^7 E! y8 {! f* P9 X n) r -
. i' E4 a6 }2 @2 F) T - ;精灵缓冲初始化% l2 G0 C1 s" F) U
- LDX #$00
. Q, A; o2 C' r& j, n - LDA #$F8 G4 g8 j" C. O$ W2 y4 k0 m9 [2 ^
- .OAM_Clear
" l; ~/ A! g) x0 ?, ` - STA OAM_DMA_Buffer,X% Z8 v! ]$ d5 k- w- a* n
- INX
6 Z1 d& ]2 K: u- @ - BNE .OAM_Clear3 b8 h/ @5 P5 y% u3 c: t
-
1 }5 Z; e# y; a) V1 o- ^- ] - ;栈指针初始化/ u! p3 O' |/ d. X
- LDX #$FF. b3 m0 Z% `0 Y% Q* y, e
- TXS
, Q/ a0 L/ ~* o. i4 b( k. z - - s/ }0 S+ {; @3 p9 {. U
- JSR Nametable_Clear;命名表清空, A3 X/ f* v- ~, _5 ]
- JSR Palette_Init;初始化调色板缓冲
* Q" ^# z: ~- Q* S1 ~ - JSR Static_Text_Init;初始化静态文本* {) b9 X' |7 q) e6 v+ b: E0 d
-
7 x( E0 Z6 @" C- p - LDA #MUSIC_ITEM_TOTAL - 1% A$ X" ^+ k! `2 h- D' F
- STA FC_Music_Max_Index" K+ j4 m0 L6 ]: T4 M! I- G
-
& s. s5 p) Q% _4 _- H0 F& ?6 U* F - LDA #$1F: X& v6 E4 }3 a( g4 s
- STA APU_STATUS
& C) y; ]8 Y+ l - LDA #MUSIC_BGM - 1
; O& r+ F+ }' c0 |3 [- N/ a - STA FC_Music_Index2 h1 c/ w/ E& a" x
- JSR Music_Init_Process;音乐播放
, r" G# y$ |& V* D5 p- _ -
) O9 l0 d% y' q4 r* @/ K# \( h% K - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态), j/ M J0 ^" l1 r0 J6 S% \8 ^
- LDA #$1E
7 P: \* y# u7 @0 _, v; e& L - STA FC_PPU_Mask_Buf
) b. P v4 ]+ Z# ~ W, x - - y5 F, E' Y) F4 B3 O) n' z
- ;启用NMI处理5 K% ?. D) R6 w8 O# T
- LDA #$807 c+ o" b6 T- b8 ?" U
- STA PPU_CTRL3 r4 ~, i: l/ E; ]
-
& e1 z/ e9 E b3 j. s - ;程序循环, 剩余工作交给 NMI 中断处理
* L- T- s# @5 a- j - .Loop8 Q8 V5 |5 l; N, p" A& W! e8 N' V& H
- JMP .Loop; z# w5 Q$ o' n9 Z' r
- ) M. p! ?/ k8 Y- }% f
- ;======================================================================
9 r$ D: R5 o4 [ - ;不可屏蔽中断处理
' F, I, L8 `6 A+ q4 O - Nmi_Program
, i) Y9 E+ _3 c7 w* K8 t# x - PHA
6 K# w1 l# h2 m% v* \( }; u" M - TXA
! V8 m( R4 n+ u- R& P - PHA5 e* _: }6 y7 H O5 i
- TYA
' z3 G6 b: a) ~* |( d M' u - PHA
$ C3 s/ A4 x* n" |: H' g - 2 i2 F! L# s! A0 W& f" Y
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
; I! t/ Q2 k: P* i5 D% d1 R - 2 r+ X8 i. T& S5 o, X7 X; s+ F
- JSR FC_PPU_Procrss;PPU处理3 l* y$ ]& [) ? p
-
. _3 c6 a$ i7 L4 y - ;精灵内存更新
/ ]0 K! G% y& `$ \ - LDA #$00
$ B+ p5 l q2 N9 X% W% E) m5 P) O; n( E - STA PPU_OAM_ADDR! g2 I! I( Z9 m
- LDA #OAM_DMA_Buffer / $0100
% K: g; y7 n5 {, D+ | - STA OAM_DMA
2 ^8 G: I$ s; s' A. E" F -
3 `# a9 D- _& { - JSR FC_Gamepad_Process;手柄输入处理! W" k! T& C- G3 X8 l
- JSR Music_Select_Process;音乐选曲处理- P L8 O# p* o# F. `
- JSR Music_Play_Process;音乐播放处理
+ ?6 L! E5 E5 ?/ w2 E' Y - ; B6 K: t! L8 z' V2 P7 L
- PLA
- S% c9 B0 ~) x$ s: [8 o$ g - TAY O1 T+ a0 a4 j7 H9 L( o
- PLA: X% ^8 O' Z3 L
- TAX
, Z" a# e$ J9 F+ J# e' U - PLA" U! Z% u3 E7 z9 z+ U8 _$ ~2 n
- 8 D: N, T u% o$ f
- RTI% Q( g4 }8 g, k7 w% k" j# L, I
P! h* ?. O1 C9 L, [. `& S- ;======================================================================
4 R/ }- P) A) G - ;请求中断处理
y5 P. K' W2 }: y - Irq_Program
. D4 x1 D; _) b8 H' w6 k - RTI
8 e1 j* g) m/ _7 V! ]7 i - 8 _, {7 s" i) H
- ;======================================================================
b2 O s3 K1 O) y4 o0 S6 @ - ;中断向量表
8 z* j0 C& v f" M# @ - .ORG $FFFA2 f* z) L( G2 r) G; o( R8 y
- .DW Nmi_Program ;NMI触发时执行+ y$ y# Z8 ^5 T3 Q& N3 x# I
- .DW Reset_Program ;载入ROM时最先执行
; v; x+ Q3 E. b& C; ?5 J - .DW Irq_Program ;IRQ触发时执行# D/ A0 j f' B. T' B3 v
复制代码 7 g: P' D5 |6 z: Q( P
5 x/ K8 H1 N9 }& U9 Y S: s2 w! R
2 b7 S% U0 @, M4 y. w& Fhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|