|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
% n( |7 h, h) S) y5 a6 y / O; h& b/ s, ]
以下是主框架代码:9 P; S5 T/ ~' C- p
- ;====================================================================== s0 G$ X1 h, S: C" p! z" O
- ;文件头
3 a* k6 S E" e0 ?* U" m5 S( @ - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
Q. C y5 m! @1 R1 X8 k4 u - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量! s7 R/ p H: R/ y7 @# s! l
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
/ I* ^; u4 v4 @8 S( w - ;======================================================================# D! y* a, H/ E) V2 F! w
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
; x1 ^. [1 D4 ~& d7 C - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
; q7 y3 M( S7 E3 l, I" {7 V: f - ;======================================================================
" n% e' F5 U$ c+ i' \ - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
! u t3 e) ?3 y$ L3 \# ~ - RESET_ADDR = $E000 ;主程序起始地址
4 N0 R5 t7 y+ v - ;======================================================================
' ~1 [+ a; O6 I b7 b3 y/ o - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB9 z2 \' Y' O5 J5 a8 ^( u u K; r
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
' ?& ?: h) {0 j - .INESMAP 4 ;Mapper号 (0-4095)& j9 M& ?2 I0 G: o
- .INESSUBMAP 0 ;子Mapper号 (0-15)
8 K- r$ X$ s( @) P0 S - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)4 D+ L! `) [8 i
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)/ \, K0 h% m4 ?# s8 T3 z3 B
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
0 v3 A% e, f# F+ c$ |/ s! R - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
: t( \2 p+ m* u& Q& j, U3 h - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)( ]! g' O( }3 F* m8 U
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)# L A& o. a! l; `+ l/ R1 V7 _
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
( D7 X4 s8 `% b* g0 v: ~ - ;======================================================================
5 |# W( W/ r( p% f, M! O! I - .INCLUDE "fc_demo_config.asm" ;全局配置6 {8 `9 {" j" w* V6 G
- .INCLUDE "fc_demo_constant.asm" ;NES常量
) h" W$ N+ a5 n - ;======================================================================
. h U* {1 X7 _ _- g - ;音乐配置# {" `- J G+ }
- .IF 0 = MUSIC_THEME
. W) `' _$ e, f5 G( m4 r* _ F - .INCLUDE "data/music/Gremlin 2/config.asm"
( l$ [$ M( E/ Q; d* W6 l - .ENDIF0 @$ s, S) V8 ~: F) u$ r% U
-
: a3 G4 v! g' _ - .IF 1 = MUSIC_THEME
z" \# v& g+ [! x, V, M - .INCLUDE "data/music/Raf World/config.asm"
7 {; n3 X2 L0 U - .ENDIF v* ^8 R, V' ~6 e' @7 ^% Y7 o+ z
-
. k8 E" u, C; e# |' a - .IF 2 = MUSIC_THEME 2 a/ }! s1 _( ?9 E
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"* R2 ^5 x8 Q. _5 N+ a7 W( A% Y
- .ENDIF: s6 u2 i/ X+ X) }* e i3 h# M; f
- ( [+ ^7 `6 ?6 n* c) }& G; I
- ;======================================================================# N7 ?3 u4 U: w% |
- ;引用CHR图像数据
0 a" t ~" {3 p2 z, ^$ J% |8 k3 C - .BANK NES_16KB_PRG_SIZE * 2
' S; v( M+ H3 H% c - .ORG $0000
8 i# K: h1 f2 E" e1 ~& U" W0 X+ m& L - .INCBIN "data/bkg.chr". N0 X9 D' X2 {9 y, z$ ^% T
- .INCBIN "data/sp.chr"
9 C' _$ \. t+ |8 @" P1 \6 P -
; t* Z1 Y. W' @* ? - ;======================================================================
8 O/ c' v6 E# Y8 p- Q - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank$ W" ]( X ]0 o
- .ORG RESET_ADDR
- m7 ]/ K8 U, _ ]9 T: R1 q - ;======================================================================6 R& G. s( y, n6 C; c/ |
- ;引用其他源文件
2 O# K+ B, ~8 O) Y - .INCLUDE "fc_demo_ppu.asm" ;PPU处理- o% w% b4 v# Q3 y. [: K
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
; f* M% v \& m+ T( n/ B - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
# A6 W# f# w. [* \, E1 I - ;======================================================================$ |! s7 u% z& ]/ K
- 4 W0 y6 B3 f. y1 i/ s0 G
- ;======================================================================3 w& k4 P p( Q. w1 o+ Q2 o
- ;等待VBlank到来
Z: ~% i6 }8 V - Wait_For_VBlank* Z% J$ T' N% E
- LDA PPU_STATUS
k, q; N5 _/ c$ s - BPL Wait_For_VBlank
, S# ]$ n- e( G, M - RTS# x R$ Z5 u& ^! |$ J
7 q4 w3 G* ~ d9 X( F X- ;======================================================================
. i& f1 Q6 O) I% w" u4 Z - ;调色板初始化
9 Q7 T5 A4 J" I5 B* f0 L - Palette_Init, p8 ?" n ~, c4 ]/ H. \) V
- LDA #$3F; ?& W5 t1 d. I$ x, Y, v- j/ y- m( _
- STA PPU_ADDRESS$ w5 L; E; }/ ~. C3 R
- LDA #$00
8 ^: W( J2 z# }- b - STA PPU_ADDRESS
/ D" s1 F' ?1 J - LDX #$001 U* q( s3 l2 Y$ x1 L- p3 X
- LDY #$200 H6 J9 ?5 ~! l% u* b4 X
- .Write_Data% ]9 J7 n7 ?. r+ K B. X4 Z
- LDA Palette_Data,X
/ s9 J' ^$ G% W8 b - STA FC_PPU_Pal_Addr,X4 m% Z# k, M- v I4 W! ?2 Z
- INX% t% i0 Q1 q3 Z2 W, Q
- DEY, u3 n. f. h3 R! Z L; l6 N
- BNE .Write_Data+ P5 O9 g, m. p8 \ T
- .End
1 k& t# t$ n8 N4 _0 q - RTS
* L1 R5 b" e# U
$ ] c% t$ |/ h0 n0 t- ;----------------------------------------
6 L: h4 T* Q; g% o/ t! s9 {: e4 f+ B0 u - ;调色板数据. n, @' r- b: _8 a# t% u+ Q
- Palette_Data
7 w4 ^- ]# ~% G - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
1 ?( u7 ?( l- E/ ~; n - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
- w4 b. G6 y k! l2 E( j - 7 g0 v: t, A5 G& u
- ;======================================================================; U2 a3 J4 \/ }% f# j2 ~1 M
- ;命名表清空9 T4 t+ S8 N3 i% L
- Nametable_Clear* j( M! v0 @7 g
- LDA #$208 t3 J$ D6 _# H) `* R; r
- STA PPU_ADDRESS
/ h- `1 h7 N$ Q - LDA #$004 I3 S6 A1 ~3 e% b
- STA PPU_ADDRESS: Y/ ~! ~9 C0 Z2 j. i& `( [& z
- LDA #$00" c9 l% n. E3 C0 W: V
- LDX #$00
9 S- Z" c. S+ {" @4 ?3 R$ N - LDY #$085 z2 a6 e: t3 A8 R
- .Write_Data
9 P1 |. y% }/ k% W1 H- T - STA PPU_DATA
+ e. S" |7 [$ v- A* c9 m - INX: x9 g; [) s3 u/ Z7 x+ _' @
- BNE .Write_Data% C0 N9 _& e p' i7 `
- DEY
9 |# B! v/ F4 X2 Z. n2 \" L - BNE .Write_Data
6 z: D. S$ [: _ - .End3 v, ~+ {- }- N+ K" B
- RTS, H) B5 G( w, u6 S3 ~
/ A% m1 _/ [* s7 B& ^& ^; S" N- ;======================================================================
( ]: v; T4 G4 N7 r! y. T t7 [ - ;音乐曲目切换
# J( O+ A4 ~3 C, d - Music_Select_Process
1 a1 E, Y- _ ~$ {3 U
6 W$ d: x5 ?$ R; w, \% z. w. k, f" [- .Pre_Music;上一曲
) k8 k7 n$ ?6 x4 D. Y) l" V - LDA FC_Gamepad_Once6 o4 O( V% Z* b$ |, _+ |: Z
- CMP #JOY_KEY_LEFT
5 R9 p- y) r# R - BNE .Next_Music
' W- j$ S5 S+ Q4 |7 z% m) t" b* Z9 { - JSR Music_Play_Pre8 l& l- q1 F! y, |
- .Next_Music;下一曲
3 x2 q4 c" Z8 {% y. k9 i4 g - LDA FC_Gamepad_Once
5 c) {7 Y7 `/ Z- D: L+ v C l - CMP #JOY_KEY_RIGHT. v3 G% p4 F# v: ` F
- BNE .Next_10_Music: I; u8 n' R+ s) h2 q
- JSR Music_Play_Next
5 C" ^+ ?! i/ x0 ^& q - .Next_10_Music;上10曲* D* X0 H+ B- O4 b) G4 l9 J
- LDA FC_Gamepad_Once
6 q, a6 e% g$ h% @ - CMP #JOY_KEY_UP, D- g% Q* E+ n2 Q: E, w. C& n
- BNE .Pre_10_Music
5 ~7 j* l6 O) a - JSR Music_Play_Next_10# i) M( J; m/ z* M: j q
- .Pre_10_Music;下10曲) Y! A4 K3 |% H ]% L5 x7 P; l
- LDA FC_Gamepad_Once, Z4 N0 H% E# p+ d0 m
- CMP #JOY_KEY_DOWN8 G: t5 t% m% x, y7 T& a
- BNE .Reset
+ y0 S+ g- n2 j) p- o p2 r( [2 R" y - JSR Music_Play_Pre_10
! O- j6 y) `- T" p! t - .Reset;重播当前曲目
# b/ X. l2 o( N4 }6 L- j, s; j - LDA FC_Gamepad_Once
' U1 j0 N; p5 T5 t i) @ - CMP #JOY_KEY_START
# d3 ^0 L2 }7 p) E/ C- ] - BNE .End# G: V8 w4 Y1 d1 ^+ c5 }! h
- LDA FC_Music_Index; c' A5 Q) ^% ^1 m- M; D! ~% A/ I
- JSR Music_Init_Process
3 Y% \5 |+ a6 a1 a" F" x - .End
, Q: X( k& n/ X( b: W* I: I - RTS0 O V1 D( X9 P9 N, N8 B2 {
- 6 q# E! c+ Z- k% v* C8 U3 v
- ;----------------------------------------------------------------------
# K8 y% `4 {- Y! m% D - ;播放上一曲
?) s& f% E) O8 s& A - Music_Play_Pre3 f( w) O" D3 n; G6 N
- LDA FC_Music_Index
% ~5 a. u Q( ?; w' I5 V# Q - BEQ .End
, V0 T* c( q! H - DEC FC_Music_Index
* W$ G2 O4 M& d( f- S G: `' z) @- h - LDA FC_Music_Index
- f* L3 g9 r0 b! \. R ^ - JSR Music_Init_Process1 J4 K, F1 \: M
- .End
- K7 X0 R c5 l, y4 J4 r6 ~ d' t - RTS
7 u! V% H7 T1 F5 s) ?) m6 `8 x - ;----------------------------------------------------------------------0 T% g" ~& g* x G
- ;播放下一曲) @; P2 ]5 B3 | L3 j8 _4 u
- Music_Play_Next
- ]+ X( t- X6 w W; _( K. `* H: Y- t - LDA FC_Music_Index! L" C* t) p" p+ S' o7 o
- CMP FC_Music_Max_Index* |5 S) r1 j. B. y
- BCS .End$ s+ {- L% X& @2 `! v: x5 n( C
- INC FC_Music_Index
. ]2 A' M! }# h - LDA FC_Music_Index1 i+ C5 o' \2 X1 a* B
- JSR Music_Init_Process
! u! _5 z* k% q8 e8 B - .End" i ]- k" x$ x8 e5 |. Y
- RTS6 ~+ i7 d& j: o. h# h
- 5 C3 Z, ^" v# ^0 e
- ;----------------------------------------------------------------------8 a4 U+ G9 O: y5 I; T) I4 |
- ;播放上10曲 x. I( c9 W6 {( X
- Music_Play_Pre_10
# ?. ]5 q/ ^% `2 Q7 F - LDA FC_Music_Index
$ e4 E$ Y2 U( w1 x. A - BEQ .End
, [ L1 V( J: X8 ` - SEC- W) ]% ]4 s0 ?3 A6 S2 m5 G
- SBC #107 l0 @# s0 o$ N& N& u. h
- BCS .Pre_10: {; L# e& p- Q' J* r' Y
- LDA #$00
3 R) h& @1 I m, v5 T3 a - .Pre_100 o7 P8 T' a! |
- STA FC_Music_Index4 N1 x, b; h- b; t! t
- JSR Music_Init_Process
+ Y' S, W5 r7 x H/ `1 p - .End6 b: Z8 G% z9 N
- RTS
, B7 }8 U6 m- I: H9 u2 _$ o6 p - ;----------------------------------------------------------------------4 O1 A8 [4 O, \3 }: O3 k3 L" p
- ;播放下10曲
/ @$ {2 p9 U; n - Music_Play_Next_10: ^2 B2 ^' n' o0 P; N
- LDA FC_Music_Index
" H! h7 X6 U+ ?8 z, _- r- R - CMP FC_Music_Max_Index5 v* P. u8 n) b# v0 ?
- BCS .End
/ K4 E% A: \" O8 g - CLC0 w% W, `$ R- |! S$ z# ?
- ADC #10$ c/ p! b9 A+ _! ?
- CMP FC_Music_Max_Index
+ G4 G% d3 S5 Y6 m2 { - BCC .Next_103 c9 k$ w6 q' A# C& _( D1 [
- LDA FC_Music_Max_Index. b: B3 m+ {2 K" ?) o a" D' L. P
- .Next_109 s- F7 l1 Q+ Y: q8 F; ]8 B
- STA FC_Music_Index: O* M o+ C6 @+ V' T- ?
- JSR Music_Init_Process
1 b; M- r) H7 {. P% y P- b/ E$ H - .End
' \. g F& ]0 N6 N! { - RTS
. I6 K9 J+ i) X; i( k9 x - F$ x2 k/ [" x, q( }- A: q. Q
- ;----------------------------------------------------------------------9 {- I$ Q( ? C# [0 c' O
- ;8位十六进制转3位十进制制
1 G8 H9 f4 D) ^% ?3 } - Hex8ToDec
5 w, S+ \& ^: B* I. Z - STA FC_Dec_Data_1$ ?' @3 b" G" V' M( G
- LDA #$00
# W& e6 S4 w* ^ - STA FC_Dec_Data_100; o5 R9 n. N- }2 ]3 u$ ]7 C' B! T: r
- STA FC_Dec_Data_10" }8 K2 }2 F$ d3 d- f
- LDA FC_Dec_Data_1
6 ^! F q6 @, { - .Convert_100, q3 j* D+ d9 G( V7 q$ M
- CMP #100
5 Z9 S) k1 w2 F - BCC .Convert_10( G' G' b* |# ~) q8 ]
- SEC8 ]3 O o# m. f' k! G* z
- SBC #100 m. s! j+ u+ F
- INC FC_Dec_Data_1000 K+ _5 v) m. M0 k, ]6 A6 f/ ?
- BNE .Convert_1008 k( w1 [4 e& I( M7 r
- .Convert_10
6 H6 @; ^1 B* |: {3 u - CMP #10+ T7 [5 F5 l/ e
- BCC .End( S0 A" u8 N7 `( m5 C4 R! I- w+ g
- SEC, W% k5 O6 Q0 B( S! b
- SBC #10$ L" R+ }3 b! Y
- INC FC_Dec_Data_10
. k& L' F7 Z) \2 a5 \: j s3 n- ^ - BNE .Convert_10
4 X# n" O; E7 }+ } \ - .End/ |9 z* M. y2 Y0 V5 B
- STA FC_Dec_Data_1
( v& g1 Z. @8 q3 {; n0 l' l J. o - RTS
4 J% B/ E- `0 R8 a7 L d2 A
, q& t* q, {! y' `" ~4 g/ M- ;----------------------------------------------------------------------8 ]( E) R D1 l( f3 S! l0 D
- ;显示曲目信息
' I* j" T: a6 I( M5 A& k - Music_Info_Display4 A3 r5 n' W! ]* B
- LDX FC_PPU_Buf_Count
: P2 x( X2 G1 n! b( e2 X - LDA #PPU_WRITE_MODE_CNT_LINE, d5 y; L5 {0 @/ @
- STA Use_PPU_Buffer,X" Z. J# Z( t# n+ o9 v' S6 G
- INX
8 u1 J, x3 h2 j - 6 t" { g" f! ]5 s! H! k3 z' V
- LDA #>MUSIC_INFO_POS7 V4 u9 O2 R. S" |: s
- STA Use_PPU_Buffer,X
7 f7 g7 c( b( K+ q" k - INX
# y' g y, }/ X, ]% G -
! b% x0 r, p0 o1 V: \; |5 j' X W- d1 [ - ;居中: j! a9 O- ^. l- [' b" T
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
; j7 S2 r& @/ c$ N; j4 S2 Y - STA Use_PPU_Buffer,X
6 w+ z ?$ e4 ^- v2 t$ @. a - INX- K/ Q1 j; I+ ?0 D
- # k' m+ \' p, s2 [
- LDA #$05
L; K7 M$ y' x& R9 W1 n - STA Use_PPU_Buffer,X( p( ^) H- @4 P2 S; ?
- INX8 i0 G+ P! ^0 Q2 p
-
) _' Z$ D: z+ u" V& _ - LDA FC_Music_Index
1 n8 n Y$ d) f, ]" R/ y# O+ @5 Q - CLC. n9 B' Y- ^$ a7 P7 X g! H3 H
- ADC #$01* q) D/ t/ h& J( p- f5 \% p4 t
- JSR Hex8ToDec
& X! O" k! }$ J" E; v -
. }1 h; s8 l" E. F$ f6 P - LDA FC_Dec_Data_10 U, A/ o* a; L9 V+ _/ o
- CLC
7 H) h2 s5 h w; O, D! ~0 ? e - ADC #'0'
1 T5 O A- Y( l6 Z+ p* ~9 L - STA Use_PPU_Buffer,X
# ^) X+ f w: B8 @5 ^# c - INX
" z3 ?; j, H* U. k0 P3 g' z- H - 6 O* Z* P" i3 R9 q5 c- ~
- LDA FC_Dec_Data_1
( i S M% q' K! \! s - CLC
( o8 p g9 b) j+ R& T6 K - ADC #'0'1 S- Z' \4 @: s- a' Z
- STA Use_PPU_Buffer,X. w* U7 E( o! @2 l" o( w* P
- INX
. c% j/ K: _: N# W, V' f( A - & d8 y* @7 S; ]9 b; J
- LDA #'/'
}7 ^, m% R5 a" U& ?7 u# q: x- Z - STA Use_PPU_Buffer,X
$ H5 Y: s3 H2 M - INX
+ p! W) Y) n: q& Z6 A - % W% k: i$ V5 i& Y) F; k+ l3 i( H
- LDA FC_Music_Max_Index
' J: b% K- k/ l1 G - CLC: M9 C u' J1 y5 X& w% U$ u+ [4 Z
- ADC #$01
0 K7 [% c T( I$ E( k - JSR Hex8ToDec Z( x- @" u L+ X6 v
- + ~/ B1 K! v, @" l9 A
- LDA FC_Dec_Data_10
d/ {& C8 ]. b: k2 i+ q, p - CLC
1 a, ]% b) H, p0 V4 h - ADC #'0'
# W% `& G- V5 c$ K& c0 F - STA Use_PPU_Buffer,X( \9 E6 H; r) W8 l
- INX
1 e3 D. v6 b8 v) G2 b" l - ^6 t/ C% b# r' i4 X* ~" U) A. V
- LDA FC_Dec_Data_1
' j" S8 Z/ j5 ~4 Y9 ^: }1 Y$ w - CLC
) q& F( L# V0 ]- c - ADC #'0'/ @+ @( W& Q7 b: [
- STA Use_PPU_Buffer,X3 @! \5 e9 H% ?) O; {8 U* Z$ n) O5 D
- INX5 Z$ x5 Q, e/ i% G
-
$ p. M, L3 i( f( K7 {2 l - .End( u. y& @' v" d/ }
- STX FC_PPU_Buf_Count
0 Z8 ^& g+ d5 k* D, v - RTS
# J1 a# ^" i, t+ h& B - ( R& I) E6 F8 Y5 a& A1 V3 s
- ;----------------------------------------------------------------------
- C4 B4 Z- t. F" G: a - ;音乐曲目初始化处理- D" b0 ]6 d# S' J, u3 O* i# r
- Music_Init_Process2 b& O" B. k0 Y+ C
- PHA. ~( \ h- M! J j9 q( V
- JSR Music_Clear_Process
& _& c" h+ m# T( |# I" O - LDA #$1F6 k% c3 U `. w/ r$ t. u9 \
- STA $4015" _( r0 O/ ~ }
- PLA
& p; ~( d: M$ ^" E; t - JSR Music_Init_Addr
d" t: o3 i. u3 f* ?$ U% T - JSR Music_Info_Display
3 O' Y2 O! k+ H2 ?, m; a, N - RTS& H* I/ }9 G& i/ r& x+ _
8 m! b2 ^: ~' d7 K3 o- ;----------------------------------------------------------------------
" X9 f+ ]: G" _; d z - ;音乐播放处理' I% U! A/ p/ U7 d
- Music_Play_Process; `" F0 t: o- g( ^& A% l9 S
- JSR Music_Play_Addr
8 y' a9 B; h1 r/ a/ s - RTS/ K, i; m# b. T" X5 ]" c+ P
- , ]8 s) _! U' Q1 Y, n
- ;----------------------------------------------------------------------
3 m+ L+ {' J& U4 {, }7 N6 L6 B6 N - ;音乐播放处理7 V" d7 I+ [& Z5 E: g
- Music_Clear_Process
3 S/ o7 }* y! p# j; h# y1 O0 W - .IF Music_Clear_Addr
& ?6 v9 O" M3 B( b p. w - JSR Music_Clear_Addr8 Q; Q2 Q) c( y- S% K Y9 e. c
- RTS+ z7 e0 U6 s) B1 a( ^1 H# \
- .ELSE
* E; J1 C( Q# Y2 o, t0 e# W - LDA #$1F% f2 }# w/ o' W; Y5 Z8 v5 O7 h# A$ c
- STA $40152 F2 h! H+ g( E9 F3 e1 {
- LDA #$00
- e7 \1 E; ?! M0 h# e - STA $40108 F9 E- u" A& F/ j
- LDX #$00* D6 [& P/ Q' J7 n) s- n0 f r
- LDA #$001 G+ p) L* [5 p$ y
-
# U+ K8 O) M5 ?" b/ k d - .Music_Clear_Zreo_Page_0
9 u# l, m3 o" C! e y - STA $00,X
+ V5 H6 C6 i' H$ j - INX+ {$ d5 Q7 @2 D- p( g. r4 ^, l
- CPX #Use_Zero_Page_Begin# D( @( g) p7 @$ K% \ {
- BCC .Music_Clear_Zreo_Page_0 V; Q# E. ~& C/ q3 l `! \, q
- 5 Z( A3 v8 l* y8 @# V
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
5 I' o4 D. X+ a3 {: | O - .Music_Clear_Zreo_Page_1
6 T9 g% n \, P/ M2 y% c - STA $00,X9 R& B7 B- [' r- F9 r9 U( n
- INX' ?& @6 }# Q' J
- BNE .Music_Clear_Zreo_Page_1
; u q; p- j% _# l) f8 S0 @ -
1 r+ n( e$ i( i; P - Music_Clear_Process_1% @' H. u: H8 [
- STA $0600,X
* V+ o; t1 I" }, N% A4 @( D |+ ]5 M - STA $0700,X
% s, ]6 p, e% N" {+ X1 C0 z4 s9 F4 P - INX( y9 i) U* U( o$ k8 I7 `9 W
- BNE Music_Clear_Process_19 L$ P: V$ o: c; y$ ?
- LDA #$108 W7 t+ P, Y% ~9 X/ D
- STA $4000) }6 |% ~) F7 ]- w, g
- STA $4004- C7 X4 E/ y8 O0 D/ b L
- STA $400C3 f4 L6 Q1 }" p3 U
- LDA #$001 L3 |" u7 \% g f
- STA $4008
0 t; I4 r+ ], } - LDA #$0F4 E% ?* U# m! \' p
- STA $4015, I& ]/ s# ^1 O" A0 U+ m: q* d9 Q
- .ENDIF; M5 ]1 u, `: Y* C* U. C& r- }
-
( t. `' ?( j% I+ F; b - RTS
k2 n) W2 X) [& E3 K
8 z8 z" E; Z* q, z" D0 e' v8 s- ;======================================================================3 P( C: q6 v9 m+ D" _
- ;重启处理3 X( Y) x0 z4 G" W X
- Reset_Program
0 ^. S. x9 I& v* R r% w - SEI$ S2 `9 ^' ]+ m8 F+ u) g0 P% r' a3 D
- CLD& `5 v4 X9 |$ `2 F" V& Z8 I
- LDA #$00( a4 ]$ m9 @' E, G* @3 [
- STA PPU_CTRL
) j S" K" N% W9 Q! E8 R$ A - STA PPU_MASK1 b& f+ n1 a% V
- STA JOY2_FRAME
& N' U: y9 Z0 m# ^ L& J - STA APU_STATUS
3 z9 U) ?6 u+ r5 I# }( }( m, E - * ~% K, O5 ~: |$ r
- ;等待屏幕准备完毕
) f7 d& O, F4 O' F; d6 W; L: d: Y - LDX #$02
1 S7 Q8 r6 C$ \4 e( D - .Wait_For_Screen_Ready
/ g% U9 Q/ Q% E# ~ - LDA PPU_STATUS! J7 J4 Z7 e/ \! L# s: a
- BPL .Wait_For_Screen_Ready
3 q" k6 p/ o: h - DEX
1 m6 t2 ~2 _0 G' B$ V3 C - BNE .Wait_For_Screen_Ready1 s$ j1 A: B2 Y! { W" q- O* O
-
4 u/ |) c5 s4 X2 T - ;清空调色板$ f' Z5 F* v: t) {, R
- Palette_Clear) N( c0 p9 Q" u" n7 ^ n: ?
- LDA #$3F. J& [7 R% g* m Q
- STA PPU_ADDRESS
0 [: ]/ p7 f. I - LDA #$00
2 h% u; j$ l0 R! T' J* a$ S - STA PPU_ADDRESS; |) e0 s- C: H ^2 B
- LDX #$20
4 w6 r# l3 s8 \2 ^9 I - LDA #$0F% R% a" _' Z" V9 M
- .Write_Data
' X+ L- ]0 i; E: I$ M6 C6 ~ - STA PPU_DATA) m t7 z+ Z5 ]* b; s6 }7 A
- DEX( W! ~7 j8 k8 j2 v9 |
- BNE .Write_Data- }0 D6 w/ c( W E& C0 c, w
7 o' L# r) _2 n5 n9 K- ;清除声音 $4000-4013
8 V/ ?, e' K- @6 h1 U - LDY #$141 t0 Z( d8 {5 ^' `% ^! S) b9 Z$ a
- LDX #$00
m; B+ g' l1 z5 e6 D - .Sound_Clear. }/ `, x! A% I( K( @2 X( N. O4 A
- STA $4000,X' g: ^ N* ?& H- \9 W. t. g( w
- INX1 j* m, k! {* i7 r3 ^5 a8 W
- DEY* Q8 @) p1 _/ d
- BNE .Sound_Clear0 t- z/ o2 C0 U: D0 c6 p
-
. a8 c( P% i; j1 w9 ^ - ;清除 RAM $0000-07FF0 B# T! _, j2 L/ J
- LDA #$007 y+ H, C! S6 b6 `2 b, M$ d5 y
- STA $00
( H, \, q; U- {# v7 ~$ R - STA $018 C6 @3 |* L- l0 E5 r) X0 |6 W
- TAY# x( }, t! L) J) d0 n
- LDX #$08
. ~/ j% K$ w. d, Q* r% `, X. h1 V - .Memory_Clear
6 k# b3 s6 \0 Y - STA [$00],Y
$ B. [, b F/ n% s# z: f2 C8 h - INY
# W- ]3 A' c/ A* }" ` - BNE .Memory_Clear1 D# L$ ^8 r: ?6 y$ j9 L
- INC $01
% R1 N( m( m- F/ w6 S2 ?( M - DEX
0 W3 K( Y; i; H; j( G3 p9 h h% z1 Z - BNE .Memory_Clear/ [% x0 E x V7 n. Q( p E' u* x
- 7 e* b- b9 E8 }: D
- ;精灵缓冲初始化
9 ]9 |0 c8 y. w- | - LDX #$007 p. x5 N8 C! F
- LDA #$F83 i' ~! J4 ?6 A. W3 e# A: W
- .OAM_Clear
, G: g; l: [3 l q - STA OAM_DMA_Buffer,X
# y( c! G. A% V* E0 N# n% W - INX/ N1 }1 Z- L) {; ^
- BNE .OAM_Clear
. _( A- ]" L1 ^6 V% S - 5 c0 }; a3 M: m
- ;栈指针初始化
6 O' p3 r* [ i, r8 F - LDX #$FF( I1 U$ j) C/ ]- e2 ?
- TXS
" ^; @5 ^2 n& L5 n0 |" y - 5 v2 |, x4 h) t L# \
- JSR Nametable_Clear;命名表清空6 T0 L# G: k6 v- ~( f$ T
- JSR Palette_Init;初始化调色板缓冲( {* K, t- q H, O5 ~9 a
- JSR Static_Text_Init;初始化静态文本
; s ?% Z1 n: Y8 S -
; v. z: m" ^1 \4 Q! v1 H - LDA #MUSIC_ITEM_TOTAL - 1
. i( r" t( ^" J- L7 Q* T6 x - STA FC_Music_Max_Index
4 @0 t# J; Y: @2 ~ ] -
7 c" D% H/ w) r5 e' x - LDA #$1F
! x& c0 K& Y2 _) u( @ - STA APU_STATUS
8 O- O" ^( A$ R+ w- T5 L - LDA #MUSIC_BGM - 1
2 O% k8 q/ y8 i- a4 D/ `+ c1 @ - STA FC_Music_Index
: I+ X9 v) D0 I6 A. R( u# L" N - JSR Music_Init_Process;音乐播放
. u) K2 E2 ^9 z$ T8 K' b -
1 @3 l9 C4 K* p& Z2 k; [ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)" e: v: P% ?7 q. E0 ]: X8 m
- LDA #$1E
" s. @8 d( G- \3 j- K7 b7 b - STA FC_PPU_Mask_Buf
- d( h6 A' ^6 p1 V# B; h" ? -
! Y+ {6 H% x/ w# ~( G4 v: X( b - ;启用NMI处理9 ]; H( N5 r7 Y4 u# A
- LDA #$80) O% J4 F+ c6 d/ k! s4 f' D0 N. Y
- STA PPU_CTRL
' A! `: ~! K* X* c$ z* R/ J i - $ Z9 }* P" ]& T: t" E' Q5 b2 d
- ;程序循环, 剩余工作交给 NMI 中断处理/ N) m' ^) d2 W& ~6 t1 O! X
- .Loop
( g/ W' l9 e1 l3 ? f* { - JMP .Loop
& [$ O3 N; t' y h) r - , q6 } h2 p6 P& E) ]% M
- ;======================================================================
4 \) V# `1 K$ e, P ^ - ;不可屏蔽中断处理, b+ O. Q7 a8 X8 v1 A/ {' `8 A
- Nmi_Program; n7 D# `9 m$ }% P! L
- PHA8 X0 c5 G2 |3 [1 @
- TXA
3 I2 R6 [2 r. x$ i - PHA
7 j8 D% t7 N. l" G - TYA
# m% i/ ]3 c0 w+ X; T6 W7 K% ? - PHA1 y9 S" s# P7 c& R
- ' }8 U* @ P3 `' O8 z! o7 c7 `
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
3 ? B* V( Q; U M3 K! |. J/ P - 9 r% `' L7 U3 d1 a
- JSR FC_PPU_Procrss;PPU处理7 a0 N0 D3 p; R( U! M
- ) }- u }/ a' u/ A
- ;精灵内存更新+ L' U% `2 N: }# L) ]$ w; n* T9 o
- LDA #$007 n2 \+ A0 C8 S9 |" S
- STA PPU_OAM_ADDR
0 d% u: N: e( a- }$ g6 h - LDA #OAM_DMA_Buffer / $01004 w: {; f6 \# m: ?
- STA OAM_DMA
. ~" M' q) N9 Z$ q# f) x -
# A( `3 u2 z# @% R8 G6 o - JSR FC_Gamepad_Process;手柄输入处理+ J! d* Z7 f" w" C
- JSR Music_Select_Process;音乐选曲处理
5 \" Q% o x3 ^6 e; C% ~; H( f - JSR Music_Play_Process;音乐播放处理
% P$ q! S! i# O. {% t - - ~" S0 C, Z8 M2 u
- PLA
# d1 ?" `* }8 h2 q. ? w - TAY6 | `5 e! n7 F
- PLA
( W- h8 d6 n6 u" D% O1 O - TAX
9 z. I$ C+ h4 X( [ - PLA9 S9 H% \" Z, B8 d+ [/ t' X/ A$ S
1 t" B7 y% ^0 I9 E8 e- RTI/ Z) H; E1 V& L+ J: ~
- $ p8 d0 n9 \' ~. o+ ~- G, Q
- ;======================================================================
~: P! Q/ \- Q. f% B) r - ;请求中断处理
4 g* Q8 ~. W( h) E- _- L - Irq_Program
+ a: q" e0 ^9 f4 J' I( _. ?+ b - RTI
+ ?- }; C- ]% N& k - % _2 `+ R% H8 {
- ;======================================================================
0 E+ F/ e4 ^1 g - ;中断向量表
8 J* z0 \9 _; i5 }( |! w6 F - .ORG $FFFA# t) B$ S" U2 z' w; c- T7 X
- .DW Nmi_Program ;NMI触发时执行. P7 {2 P' s; L, P' J
- .DW Reset_Program ;载入ROM时最先执行
1 c5 z9 n9 t2 `; s J - .DW Irq_Program ;IRQ触发时执行
7 E! k R& e( O8 I8 X
复制代码 , o9 [/ B& m2 E1 i$ C" F
$ w0 c2 ]# e; D* q2 i! j* v
+ ~ Q. G) S C5 ohttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|