|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下6 \# G2 T- I2 }$ e9 l8 ~4 p; B* K

& s* ~9 |: x) h J& ?/ E. k以下是主框架代码:
- V0 [$ A# C4 e3 b+ A" C2 F- ;======================================================================# Q7 d: |" B: a, Z: U* @; S+ c; r
- ;文件头
& e' J: e6 Q. f* K - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量7 i* D1 E4 z. k$ T3 i
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量) W' W: P/ s# U9 {) o
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
9 m9 [) t+ M4 e q5 m9 n, V - ;======================================================================
( U% e+ @ I/ L) q7 g' R: h - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2- G* p, o$ P' R
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
& N9 u9 ~1 I3 |5 }5 s1 ^ - ;======================================================================9 F/ W+ G/ U4 y
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1% A2 E3 h) q4 E( a) S8 Z
- RESET_ADDR = $E000 ;主程序起始地址
* {% z- ^4 y% b4 _6 g. }0 k - ;======================================================================
3 X& D& v' `/ J1 W - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB2 I( d/ c2 u/ h* h( M% H
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
# d, }. a# g) Y" a4 y p& W - .INESMAP 4 ;Mapper号 (0-4095)- c4 x% e3 [8 P) O
- .INESSUBMAP 0 ;子Mapper号 (0-15)9 M; V' r/ y$ E$ W, g
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏) Y. J! b! I u9 M( x+ @
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)0 L! O' S5 x! \+ N
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)& Q% G# P- u+ a6 I$ d
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
8 H" _5 J0 r. ^# } - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)2 h1 V* u- d9 o: X* ^
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
& F: g3 I' `; a+ t - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
: L: t- q4 _" v( y, S - ;======================================================================
" J& T. S' o# w8 } - .INCLUDE "fc_demo_config.asm" ;全局配置
% u. U: t A# T" ?* ~ - .INCLUDE "fc_demo_constant.asm" ;NES常量
4 Z! T" E( K& ]& ]8 P - ;======================================================================
$ Q+ }" b. @, K7 k2 _' l2 p - ;音乐配置
2 a. E3 K$ ~8 g5 I) B4 f/ b. g - .IF 0 = MUSIC_THEME
, y' m) p2 w( M. X - .INCLUDE "data/music/Gremlin 2/config.asm"! I7 E/ o: Y; n" O) t$ {
- .ENDIF" \! O6 G1 r" M( U0 e: H7 L
- ( t6 h _3 G( X: n
- .IF 1 = MUSIC_THEME' e) ~& u Q S% C7 a
- .INCLUDE "data/music/Raf World/config.asm"
+ U1 t6 ~# E. E3 h$ K" D - .ENDIF0 Z/ Y: \- L' G" t' q }
- . ?2 N, O& X) n) r5 |2 L8 F
- .IF 2 = MUSIC_THEME % o: g6 @. b8 E7 j3 `
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
& S! V! a0 `8 T7 p. u1 `' q' V) b - .ENDIF
Q: S, F$ Y9 W3 w' d" z& x* `& K - 6 n1 j1 D. ~9 f/ F3 H2 f7 C& l
- ;======================================================================$ d! v% S! i \
- ;引用CHR图像数据. | f5 L( v5 i* d
- .BANK NES_16KB_PRG_SIZE * 2
) e4 I% t2 f8 N& j9 y9 w2 j2 g/ B - .ORG $0000) g' [# Q9 d1 {$ Z
- .INCBIN "data/bkg.chr"
9 y+ m/ d: P# `3 L7 S2 v - .INCBIN "data/sp.chr"
% a/ I! K! x& z5 `! i# X - " h, W; Y7 @( r0 T+ s6 L
- ;======================================================================
" f4 \% J1 z4 |( @7 @3 o - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
/ B$ k/ ]& s, s: [" a. o - .ORG RESET_ADDR7 l3 J" w% V6 ]
- ;======================================================================: [+ z5 F, S) K6 R
- ;引用其他源文件6 B6 K- `$ @0 Y+ z" i; @
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
* c- P1 w" [8 U# g4 J. O6 i' T - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
6 [0 q7 X+ n6 b8 P: v. q - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理' `/ v% i$ W5 t+ E3 b6 N: s
- ;======================================================================
" V% U' b ]' N9 Q9 X - 2 h% N1 w: t, I( N0 X
- ;======================================================================. h+ ?+ c! { X4 g, t! h
- ;等待VBlank到来. J! N* z( g! M( S" E
- Wait_For_VBlank
- s% M% I1 L6 V" @' w) Q! r - LDA PPU_STATUS
+ Y" v0 D- `0 Z# ]# l; V - BPL Wait_For_VBlank) R! R$ a( Z/ M- {, N+ Z/ r0 v
- RTS
$ Q$ L) E% ]: c% I - 1 s* V; H( ?( P( b) Y
- ;======================================================================
5 W. u# F5 n6 F1 d; `0 @/ A6 j - ;调色板初始化! r& P6 V5 n- _
- Palette_Init
* R C2 H( ?& \0 J - LDA #$3F
2 g+ ~' D* e. N t+ m" a2 T) e4 M - STA PPU_ADDRESS
$ e* S! z$ Q. Y7 [, ] - LDA #$00; J& Q4 S" y9 `7 M
- STA PPU_ADDRESS. @; M8 ?4 W, M6 }6 d! p& q
- LDX #$001 q% `2 F3 f) l, M. f( p' ^
- LDY #$20
8 Z G! U& U) t - .Write_Data
, F, `& I- V& L& o1 A3 {" \ - LDA Palette_Data,X* i4 ~9 j5 R4 x
- STA FC_PPU_Pal_Addr,X- H0 E* }7 j1 j) q2 M( T. a
- INX
2 m* ~! o( F9 l4 ]$ F. } - DEY5 i* ?! R+ X& r' x- a; `
- BNE .Write_Data
- J6 ^: Q% Q* ]8 M( Q - .End
* q( N0 b5 Q0 z3 h+ t - RTS1 O0 j3 i. B2 y# b% {" Z: t8 w
- 8 r' J) U* O k( _) b' @" J
- ;----------------------------------------8 s9 [& }6 T! i6 C
- ;调色板数据
- c7 `3 o) j) _/ y- r - Palette_Data0 J( I( H5 p0 T& N0 z: z- [
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
( T% c) G. P5 L" ?- Y& l1 O1 c - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 220 l4 E( O% y. V
- C/ S. I2 a# N2 u, Y/ ?1 C* v
- ;======================================================================( R' Y) N5 F& _
- ;命名表清空
5 t0 c! F7 _ ?2 x1 t1 `, F - Nametable_Clear" N8 y. T6 O& c' B. T+ t
- LDA #$20
; u" }8 x3 V+ d, u9 S$ S - STA PPU_ADDRESS* x% k, F; m7 P$ v: p* p
- LDA #$002 T* ]# U5 A' {. E$ D" m# b
- STA PPU_ADDRESS
0 O) F& g Q- n4 O3 F - LDA #$00
1 {( _6 b, `" W& \- T' S - LDX #$004 q8 ]% Y8 o2 z* }& h/ Q& X1 ]
- LDY #$08) e2 W+ I4 h5 b2 ~6 c; z! n( k
- .Write_Data
" q2 q! k b/ m4 F# I - STA PPU_DATA
9 s4 b. Y! Z" A5 w - INX6 |# @5 K1 y) w: h
- BNE .Write_Data
; b! g ~! f. E - DEY4 _0 Q6 L- f8 K5 H. } v- ?) ~! N+ M3 P
- BNE .Write_Data$ Z! O S0 V8 M" v2 `
- .End6 z( z" g7 k! H: z
- RTS5 ` m& {4 ?" e3 I- F
( n" ^) B9 I/ s1 m9 \ _- ;======================================================================5 ^. s2 L1 M+ P& R( E. c+ b1 c
- ;音乐曲目切换
3 R, [/ b) U( C$ a% N3 K - Music_Select_Process: p4 K# O9 [) a$ B& F" J
3 i4 p3 @0 K; p5 k7 k ]. o- .Pre_Music;上一曲
/ i P; O; ?0 b! [1 h# K7 R7 d - LDA FC_Gamepad_Once: q: [% O/ }4 [2 R8 o! h
- CMP #JOY_KEY_LEFT' r1 \7 C" H# G/ b
- BNE .Next_Music
& } e) N$ Z# t8 Q - JSR Music_Play_Pre% b1 o, c5 a7 e7 E6 A
- .Next_Music;下一曲! \. B1 o" Z* I% q8 s3 o' x8 q1 a: p
- LDA FC_Gamepad_Once: X: J* c* a; {6 n- F
- CMP #JOY_KEY_RIGHT% @: W& y1 v' q @
- BNE .Next_10_Music) _# T7 G8 m7 [4 B
- JSR Music_Play_Next
( r% k+ C4 n1 t$ {- z( W - .Next_10_Music;上10曲0 I# H+ A0 q1 @2 R
- LDA FC_Gamepad_Once' ]1 w% |3 X4 _& f/ }6 Y
- CMP #JOY_KEY_UP% N; Z: Z. ^& j; c
- BNE .Pre_10_Music, K, I" z* {# ^5 z. f- p
- JSR Music_Play_Next_10
+ i# k+ [- F z0 h - .Pre_10_Music;下10曲
8 m- Q) D5 L9 G; \8 [! w - LDA FC_Gamepad_Once4 N+ S6 y% `; Y6 p) o
- CMP #JOY_KEY_DOWN5 p9 k$ l8 d8 X5 Q" I3 ]' _
- BNE .Reset' e _; H3 W( }3 X9 B/ q3 S
- JSR Music_Play_Pre_10& ]6 |5 K3 y) p* o$ f9 x9 F" W
- .Reset;重播当前曲目, C o4 m, b! V% E# o( f9 k
- LDA FC_Gamepad_Once
+ S) e* n! L/ p+ n: v- ~ - CMP #JOY_KEY_START. g% |* n: u: l- C$ D! x9 o
- BNE .End$ x* [# L1 m) l4 Y- c" j( h
- LDA FC_Music_Index
" m' F# I" a3 R; G - JSR Music_Init_Process' o8 L/ f8 v, f( |! U7 n# _$ F
- .End
% c; s! S1 U/ D - RTS
5 Y$ O9 [3 {; [. ]) W - ) R( x+ `8 }- q0 I5 z' \% G. A
- ;----------------------------------------------------------------------
$ }8 }2 y0 z( D. t8 [* P8 {1 a6 k - ;播放上一曲
( T6 n; Q' Q0 F4 R! O; G - Music_Play_Pre. ^6 p+ S4 a# g& t' j$ @- x* `
- LDA FC_Music_Index' \' ?# I! {+ v. ^3 a Z( S, d& F' l
- BEQ .End
& k0 y, f* D1 G0 |5 a* P9 ^( w2 G - DEC FC_Music_Index0 h x: v/ M$ @. ^( ]
- LDA FC_Music_Index! q6 H. Y. M$ Y
- JSR Music_Init_Process
- q# q3 e p, X4 c. V - .End
& I: f/ [) U- Z' Q( _. O2 d: H+ S4 ? - RTS m% d! T: V% G' r+ c, U, M0 G
- ;----------------------------------------------------------------------. u4 b; k2 V8 f8 D& G9 O! A
- ;播放下一曲
: w3 u8 c1 Z% g0 y, Q - Music_Play_Next g7 v4 n0 `' C! {+ T
- LDA FC_Music_Index
2 d2 r! C# i( } V( |; v4 C3 [ - CMP FC_Music_Max_Index: f; `+ ^8 O6 t) D
- BCS .End9 D, l! V2 y* C* ^( {1 [6 {
- INC FC_Music_Index
4 A! {" O) b4 ` _! z) t& O0 g2 W6 ?: S - LDA FC_Music_Index; @2 _" j% q' ]* a+ n' c
- JSR Music_Init_Process
; D6 J% L5 l4 i) X7 L4 O4 J% Z - .End4 \& V% s+ ]/ a
- RTS
0 q4 G" L. Y6 F - + |" { Z- J0 P- D
- ;----------------------------------------------------------------------& \% `# E8 M+ B8 @4 A
- ;播放上10曲
. P h1 X5 V3 y0 X( `2 c; p( W - Music_Play_Pre_10
5 S" J7 u: J# T9 } - LDA FC_Music_Index1 x0 K; A# p' A7 f/ E, f% E8 ]
- BEQ .End% ]6 D9 @5 T) P; g2 j
- SEC& q; ?% z+ k9 j5 ~
- SBC #10$ b( e8 r0 G( w' }% W
- BCS .Pre_104 l3 |) t1 f9 h% h/ r& Y
- LDA #$00$ J( ]* k$ q [% @+ X
- .Pre_10' A" C9 L+ B2 U/ Y0 ]
- STA FC_Music_Index! I' ^9 e+ S0 Q2 P$ k
- JSR Music_Init_Process0 @2 }. Y# O% k! L
- .End
, C1 m: K2 H: k- y: H. z- _. g) s1 E - RTS! D4 X! l5 w) t/ q/ M
- ;----------------------------------------------------------------------
: A) N( c9 N% W N' x- V - ;播放下10曲
4 P& [( w7 E& F/ F - Music_Play_Next_101 ?* m* L+ [0 W
- LDA FC_Music_Index
\" e: }7 q0 \3 a - CMP FC_Music_Max_Index* I. G. B- P+ T* \; ^
- BCS .End
3 D# \" C5 ]5 r& N5 } - CLC3 J9 Y: W4 s% V. _
- ADC #10
3 C+ R: p6 P, ^2 S - CMP FC_Music_Max_Index. G( b7 W! x7 y+ [* c0 k
- BCC .Next_10
$ }; b6 J* m, B$ A6 h - LDA FC_Music_Max_Index
3 s4 k1 u7 Q4 Y' D - .Next_10; _2 H' `- p- s6 V3 n$ @
- STA FC_Music_Index8 h* h( g3 N- L& t& i' P4 k
- JSR Music_Init_Process
5 p- B9 z) `( l6 @ P: ? - .End
7 ^; b4 E3 T9 R: J - RTS
' i1 @7 Y* [! S8 G( {6 s* D
0 f) W( y$ K* v& u w, F- ;----------------------------------------------------------------------
7 x& @$ L$ Q) O: H7 l* @ - ;8位十六进制转3位十进制制! a% M8 ~/ }4 _" }
- Hex8ToDec2 U9 k0 |# i8 O. [1 F
- STA FC_Dec_Data_1
" r9 G3 j' w. ^+ ?! u9 e8 u - LDA #$00, t) K0 n) D" m. q' a" l
- STA FC_Dec_Data_100 e0 F6 |5 _+ x" Z2 o
- STA FC_Dec_Data_10
: W! E8 m. @9 S2 r- g; D - LDA FC_Dec_Data_1
& J/ O" i0 O% y. a+ |8 t9 ?. }+ y - .Convert_100! z) w1 Z1 | p3 G% o b
- CMP #100
3 J. \! E% ~& [ - BCC .Convert_10
+ h2 v3 c/ v$ b$ }, g: c( v& e e - SEC
6 t6 i% b" ?, @, b/ X; y5 ]% z - SBC #100
. S% ] t @0 t$ C( `" M - INC FC_Dec_Data_100
1 z5 ^9 E+ i9 X$ {9 e/ \ - BNE .Convert_100( k( g. [# N* f2 ?9 i \, s4 Q
- .Convert_105 Y0 D% z* O% h: k
- CMP #10* Q* `0 A- p$ b% M
- BCC .End
& l; F& ?! L( e - SEC: W5 V" W9 p+ G R+ y- x4 G
- SBC #10
' Y$ h/ F) @; s0 B% a9 C" i - INC FC_Dec_Data_10
# C* J1 U; c! Z' n; A - BNE .Convert_10
3 y* z6 d$ {. P* j% C$ n - .End, B, C$ U0 X& O9 Z t) t+ e) ?
- STA FC_Dec_Data_1
" ?7 y( i& D6 Q7 O# U - RTS
) D" k5 y. s( s+ a, d6 x! S7 ^3 t
. y4 h& v! S- j9 _' j! [- ;----------------------------------------------------------------------
# J' u8 Y% y) D/ _3 A' O - ;显示曲目信息
$ G5 T3 u1 [4 O o i# U6 l8 w - Music_Info_Display
& G; x6 _. g) T' O# i. x; Z9 m/ t - LDX FC_PPU_Buf_Count" B* a; z! i f; G4 p" u& O
- LDA #PPU_WRITE_MODE_CNT_LINE; b: j% e+ ~8 I
- STA Use_PPU_Buffer,X
+ n* T$ v4 b0 ~; U: |% | - INX# h: B9 X2 f- ?# J' H- Z# e# {
- 3 X: `% D( [7 [+ B1 R6 g: O
- LDA #>MUSIC_INFO_POS8 {- I3 D% a6 a: }
- STA Use_PPU_Buffer,X3 e# ]1 `& @% V3 F0 R" J: G+ h: W
- INX( I9 G/ {- O% q' O
- # F. E* g) j. c" o! x' B
- ;居中
7 V- T. m' c* U" @ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2" V- h% m* I5 L& k, |: R
- STA Use_PPU_Buffer,X8 ~3 W' s. g! S! u
- INX. J- @) }0 H, _, N" d# S. C
-
! k- v- D+ C: l: j' p4 W; ~ - LDA #$058 b! V* p) G# T4 Y" {2 u
- STA Use_PPU_Buffer,X
7 h3 e/ E3 y% h: ^ - INX" W% @4 w6 c: x( R1 n% k. ]0 g+ q
- 5 n2 d1 `; {; c4 k, z; }
- LDA FC_Music_Index4 f# R# W4 R2 y( H( b
- CLC
3 B0 s, H6 i, Q/ R. ^& t - ADC #$01' Q; z8 t1 L- }7 k4 m y2 Y
- JSR Hex8ToDec7 D" H1 x# L0 \* M) o
- ' C- f$ G2 K# X8 S
- LDA FC_Dec_Data_10
2 y3 [' q' f9 d6 S) q - CLC2 G4 O1 B) g4 {( f$ U, @& y
- ADC #'0'- g2 W0 t1 h4 M8 Q* |
- STA Use_PPU_Buffer,X
p% t; i, F$ k& u8 R - INX
4 }2 |. R3 ?- D) `; E. U* p - 3 ~; `2 z1 J2 J7 a
- LDA FC_Dec_Data_1: z. V8 ?3 r7 w/ n0 F
- CLC, d" t2 U: f5 G1 J
- ADC #'0' e. R, a6 K, G
- STA Use_PPU_Buffer,X
8 Z- V+ @% p3 y/ K: V - INX* d ]+ O g9 y0 O
-
4 Z" n3 N7 ~9 E6 a3 m# E3 _ n4 p - LDA #'/'
/ s- P' M m* r - STA Use_PPU_Buffer,X
6 [# k- a* ~+ ?3 E* I9 `% R - INX9 ^, V* D" \) e* p( z% F5 I/ }
-
1 s5 u: t& \( B0 ` - LDA FC_Music_Max_Index
. h0 \( e" m3 P+ Q# a - CLC2 T) Z, E3 U, ^7 N
- ADC #$01
: K2 q8 a- _' B) H4 J8 x - JSR Hex8ToDec
7 i' g" V$ ]+ K - 6 Q+ a$ X. v9 y* s& a
- LDA FC_Dec_Data_10 H! X, P9 T, p, a0 f
- CLC. O& y4 ^& L! L D! {
- ADC #'0'
7 j2 r) ~3 H: R2 f/ }( m4 d - STA Use_PPU_Buffer,X
$ L7 j' l; n3 ~: `) j( r) { - INX
# Y6 g0 U1 q! h& k% a - $ _8 [4 S8 |- v
- LDA FC_Dec_Data_1" ~3 y- u1 o0 c( ?
- CLC3 s0 e( U# B0 e6 g0 D7 F2 S
- ADC #'0'
& J6 ^, D, X6 A0 i) C; {4 n% [ - STA Use_PPU_Buffer,X$ c) \- z3 K8 ?4 l$ x m
- INX
. p" \1 q; L8 d. y ]; { - , ^' I2 f. R4 L& u
- .End! p" b5 C; C+ o
- STX FC_PPU_Buf_Count7 Z2 J j" Q+ ^, [
- RTS
$ O7 N* W; h% ]. y9 |; g
2 ^$ r$ v7 R$ @- ;----------------------------------------------------------------------5 f6 N3 l' s4 e) C
- ;音乐曲目初始化处理8 J5 K, t$ Z {% M/ B
- Music_Init_Process
+ `* A8 A5 M' G" S+ S, m - PHA
/ \9 z5 ~7 F+ q( A; x - JSR Music_Clear_Process
9 P6 o% o1 u" D- E) z% K - LDA #$1F% v6 t$ [6 n; L
- STA $4015# L8 f; ?& B$ [9 h% _1 }4 [$ y
- PLA5 ]6 i1 v( B3 C7 B1 _' T$ y
- JSR Music_Init_Addr- ^8 ]/ m- X8 {: v5 r6 _6 p: I& G* |
- JSR Music_Info_Display' D# t9 {. T8 B7 h! t% }% \0 X
- RTS
1 T$ B) U; g" E' N% K! c - " ^$ F* t& W* F2 ?! H
- ;----------------------------------------------------------------------
) U @5 t( y, i; g) A - ;音乐播放处理
0 a! v( C% y" @( D. y( e. i* I - Music_Play_Process
& D2 b8 X5 O6 C7 b4 r0 | - JSR Music_Play_Addr1 p7 `8 x3 q& E. `0 C$ q* R3 d
- RTS% W! }, B# a M( c
' ^' j5 G2 K; [- o! g& L- ;----------------------------------------------------------------------4 W, \- T; [, N* \
- ;音乐播放处理* z o1 b I7 `8 G" K' @
- Music_Clear_Process
. ]4 K Q& m( u6 ?; a - .IF Music_Clear_Addr
( L# P4 l( y* N( [' r; r( | - JSR Music_Clear_Addr
: R2 I7 A/ `3 } - RTS
6 i) q: h. g7 O( i6 \7 P - .ELSE
' S6 ?% J& H2 ~0 O0 Y: R" a - LDA #$1F
( ], V% O/ D' v. [% E ^0 d - STA $40155 [8 u* s; h6 y
- LDA #$00
" ~$ a% S5 G4 R/ e, d/ l c - STA $4010
- M( Z" r) {0 Q( x/ `7 g& X - LDX #$00) G: v4 r L" Z; ~1 a4 T
- LDA #$003 [& K+ K; e" c" x. o; ?) l" C4 V
- ; ]1 c/ a# G T
- .Music_Clear_Zreo_Page_0% r. X8 a6 F: M
- STA $00,X
5 l- ^( D7 |* w2 a8 E" u& E& P - INX2 i1 B! T: @' u, }" i: u+ @
- CPX #Use_Zero_Page_Begin, f _9 \0 H/ k6 e) }2 K6 ^, T' ?
- BCC .Music_Clear_Zreo_Page_0) E! M: z2 k6 k4 o2 }; ?9 w) W' v7 z4 N
-
9 ~; e2 [' v" [# W( W+ i) C6 l - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
0 K2 F# u( h) R - .Music_Clear_Zreo_Page_1
9 I9 P, ]* c' y L; R - STA $00,X7 I9 i4 _/ t2 \. o {- t) K
- INX. D/ v/ r& _# Y" i- A5 n1 Y
- BNE .Music_Clear_Zreo_Page_16 K* g8 h3 U |$ R/ f5 d9 E
-
' a$ V# t3 U$ F; L, c! D - Music_Clear_Process_1; X0 O ]# {% `9 s
- STA $0600,X
1 n, d# r* L& W" W1 r; B7 z - STA $0700,X7 `: B# _" p) g; { f2 K3 P9 R
- INX2 Y% O) I! J7 k6 K* v" J! t4 F
- BNE Music_Clear_Process_1
`4 q& _/ o/ k0 d. r - LDA #$10 N6 i( d+ }' C0 Q* Q
- STA $40004 z3 ^: [! B s/ L* W
- STA $4004
) _( M4 H, o9 ]6 R - STA $400C
: b9 d* K& U( v! D/ F) z - LDA #$00, t$ u% S/ H- _: z
- STA $4008
3 c, r- n- a+ w( ^, T9 ?- e+ M, } - LDA #$0F# N9 A% i+ |! y! G6 d
- STA $4015; G: |4 I! ?) V) A8 b' P T
- .ENDIF
8 }2 F. h/ g' k3 y+ M8 ^ - 9 O+ q2 A- D0 l) n7 V# y
- RTS- N! ^1 Q! r! J% w8 @ T
. G1 X' r+ }( P- ;======================================================================' J$ b5 H. ?# Y4 r. r3 r
- ;重启处理. G" f' ~* J2 V- }' k3 Y% E% Z. K
- Reset_Program# v; U* Y+ h f J8 K
- SEI
2 M9 F+ A' T# N - CLD
2 R$ y+ m& F$ d! H' p - LDA #$00
) W& [' h3 p3 X2 t7 O* K - STA PPU_CTRL
( ]: _" s. ~3 m! @: {, {$ ]. O, _2 [3 l - STA PPU_MASK* @, W0 J0 \; w' l8 r$ N
- STA JOY2_FRAME; t' h0 I4 T9 j( q0 \; g
- STA APU_STATUS9 m# H: W8 N3 F3 E
-
; _* h$ ?- p7 w - ;等待屏幕准备完毕
+ f5 S9 V1 o3 L r: l* w - LDX #$02! |2 U7 Z! \' p2 D; E, @/ h7 A2 y
- .Wait_For_Screen_Ready8 e1 z2 @7 q" u' O2 B+ ~& B/ y, p( t
- LDA PPU_STATUS" w C6 K7 s( `/ C% d
- BPL .Wait_For_Screen_Ready/ ~# R, l; W* R! W$ w
- DEX
1 I/ m4 ~! {0 Q9 `6 g - BNE .Wait_For_Screen_Ready
- S G1 ?* o+ o% x0 s& r; ]5 k9 o# ^ -
0 |9 F9 k1 I# l+ }7 Z+ [+ G - ;清空调色板
/ d: K; G9 b& U8 U - Palette_Clear7 r; T5 k& O' o5 [ |
- LDA #$3F
& g5 J- c/ q$ P( g - STA PPU_ADDRESS' L# W& S8 R% g( @ a+ H% }5 w0 E q
- LDA #$00. m. c1 P( H/ N* T
- STA PPU_ADDRESS
: V# f7 U& r0 I% C) h5 N - LDX #$20
, X/ K, X# I; c$ S! f - LDA #$0F
4 [4 Y/ j; u- Q/ k3 ^5 x - .Write_Data
* t! b- ?1 H% n7 R- u6 E% u - STA PPU_DATA
, d4 U) R4 A1 n0 `( _4 w2 A- W" p - DEX
7 o; i# y1 h/ `+ P7 _( x5 m - BNE .Write_Data( q- o0 T( i; ]# Z% a4 S8 v
2 F; }# W" m e8 q3 {9 V- ;清除声音 $4000-40133 q$ P& k1 J5 S
- LDY #$14
3 q, G$ Y& i7 |& {( | - LDX #$00
. R& F; S" \1 k5 j$ A - .Sound_Clear
K: y# v& F% [3 s! W+ M - STA $4000,X
# n( l7 `' W$ d7 m- y - INX
: {3 l$ c9 g4 v" c - DEY
- G& k6 e/ n4 b/ X, w; ^ - BNE .Sound_Clear/ |$ S! |1 q- W% u( M
- ! q" s! g$ E- f4 A& m0 P0 t
- ;清除 RAM $0000-07FF
! D% h1 s) I0 l# x - LDA #$00
2 m. l Y; |+ p0 Y$ y; y - STA $00
0 I. u0 S# A6 E; `0 T - STA $01
6 F1 R$ `# D$ {2 T/ ]8 h: ?+ a - TAY1 |. Y& F" t1 z
- LDX #$08
3 Y) }+ i4 m; I, R2 L- m0 n( K - .Memory_Clear
$ m8 k1 z. }4 u8 O% w H - STA [$00],Y$ K. ?- d" L, C4 K2 h% I
- INY2 o+ Y) w# W5 o- f7 A- ?
- BNE .Memory_Clear
4 L9 r" h$ ~" S* D - INC $01
- _8 c* _9 E6 d( c* z - DEX
7 ~6 A# X3 ^$ V% I. R4 p( |4 C - BNE .Memory_Clear. m( s) B# X) Q N! G- f
- & L# W+ }: E/ ] ]
- ;精灵缓冲初始化3 `$ p4 s( @* `0 J: d
- LDX #$001 y4 g0 t2 J+ A: Y
- LDA #$F8
1 }) K+ \# E" s& u# Q: Q3 [ - .OAM_Clear
7 u6 p3 Q8 [. a1 i8 b* t, c7 X4 W - STA OAM_DMA_Buffer,X
6 E4 z7 R# w) S$ K3 A - INX
, p8 ~, R K: _ O$ S/ U - BNE .OAM_Clear% q: e' {: V: L' s X" S
- ) e/ A, q A8 T* m
- ;栈指针初始化8 S* B- e! {; @5 h
- LDX #$FF
3 c9 ^3 Y% @$ F% @7 L% Z& D - TXS e8 ^8 |+ `: t' y O1 N
- / l1 D( K. d* s5 w
- JSR Nametable_Clear;命名表清空; Z! Z5 U: J+ ]! n
- JSR Palette_Init;初始化调色板缓冲
c- N1 P, t- q# y- b) t - JSR Static_Text_Init;初始化静态文本$ k& b3 q h c$ ^# J$ e
- 9 o5 C' Z4 a0 h
- LDA #MUSIC_ITEM_TOTAL - 1
- a- @6 u5 U: i7 C3 N; c - STA FC_Music_Max_Index L0 Q! S! n7 d$ e: P, W# ?
- ! ^. L5 ^: Z* w- k
- LDA #$1F# Z; z/ K8 e! H& f7 n" O
- STA APU_STATUS4 S8 |2 _! g4 ?& c0 I0 k' U
- LDA #MUSIC_BGM - 1
" R3 Q1 e2 e/ i6 m - STA FC_Music_Index: k" @$ ?, t I7 A; ?( N
- JSR Music_Init_Process;音乐播放6 x; g% O7 Y7 A( [* e' a
-
5 ?5 d g' v I0 u6 s1 ~6 u) Y - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
2 n. T$ c, b3 Z1 B! d - LDA #$1E
* h; K$ x4 C( S; c C# {! Z1 k% e6 u - STA FC_PPU_Mask_Buf/ J% ?% c& F k0 Q
- - V, w) m1 m$ C; m4 n
- ;启用NMI处理
& W" Z4 I; s" d - LDA #$80
% u: i- F4 \6 D9 I - STA PPU_CTRL5 _7 G, M n* S' w- S
-
2 P. S% X s/ t- d; R8 Q( h0 q7 J - ;程序循环, 剩余工作交给 NMI 中断处理
6 X$ F0 p3 a, ^. M' Y' ^7 t' T - .Loop% {$ [/ H7 P5 o' t% u
- JMP .Loop% Y/ A; i4 o5 p6 Z9 P
- & F% f8 d3 j {, x8 S
- ;======================================================================
+ l9 ~# i" _. N! K; Q+ F1 X; ] - ;不可屏蔽中断处理; Y! Y) R( K/ D7 @7 u; m) W
- Nmi_Program9 S+ M$ y* l: w! |1 Y
- PHA
: e0 j3 [( q$ K* \- Q; }1 O5 \% F - TXA
2 s9 x6 Z& G) F% p h/ ]( R* V - PHA
9 D8 e- q4 ?3 { - TYA
5 s, b$ E& k% ]# N2 r, P# @ - PHA9 V/ u# ]2 r1 }" ^, N5 R* {' y6 X
- 1 ^# r5 ^2 v, `- }* i2 o
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位* S4 V; a& b$ a: y9 g) h: z
- * F) K& I) Z- B y1 j4 B
- JSR FC_PPU_Procrss;PPU处理4 [% _6 k* n- @9 f& h$ T
- F0 i: R/ _3 j
- ;精灵内存更新 g% Z \% |! X; _# W" |
- LDA #$00
# P b$ v, N; W3 k& G6 h* Z5 r - STA PPU_OAM_ADDR
1 n* p, o* i K( n2 ~ - LDA #OAM_DMA_Buffer / $0100
7 S1 _$ r8 c- r# X* b; _" |& {% z - STA OAM_DMA
0 c' H, F* S- t8 H& q - 7 Q8 R% T u% l! y3 J! a' n- z
- JSR FC_Gamepad_Process;手柄输入处理: d- z2 F: q- Z# d0 q/ w
- JSR Music_Select_Process;音乐选曲处理1 J( t8 Q& q5 F7 A. e/ y
- JSR Music_Play_Process;音乐播放处理& } O0 C% c1 T, b% ]4 o1 ~, m
-
8 v9 b2 Y- N, t/ G - PLA
' w! x. |+ B6 o" s* Y5 X- j7 A4 ^ - TAY% }% W8 n. a& `; K: g" M
- PLA0 N- \0 b0 G: @, o9 ^ P* T
- TAX
7 J2 h2 _4 ]0 N2 _ - PLA
9 J. J k7 a1 g8 v+ a
. J! ]! ^+ r9 d3 U2 f- RTI
( s8 z3 |8 V* v/ _' u+ k" H - 1 l1 m) H* P, X
- ;======================================================================
: x( D- W2 B0 [: Z9 y - ;请求中断处理, {& w+ a3 }4 n
- Irq_Program4 o2 O: @( c: c- r' |+ I" l
- RTI
3 ?' _5 Y5 q$ ~$ b4 E7 T0 Y
6 R, t$ n1 e& q6 S- ;====================================================================== [3 _$ |1 o' c% ]" |% Q
- ;中断向量表* j. J* h4 B: y; e
- .ORG $FFFA
9 X! X% s: E5 X1 n - .DW Nmi_Program ;NMI触发时执行
4 Y, r- N, ]+ c7 a2 `9 J- |; d A1 t - .DW Reset_Program ;载入ROM时最先执行9 J2 b6 ^8 a. B: b+ l) l
- .DW Irq_Program ;IRQ触发时执行! W3 _! y- f) s) U$ c
复制代码
* f- _0 A7 v; {( e! Y' h: H, \! m5 s; j7 G
8 o+ }4 H' G. s% }8 A. L& \ uhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|