|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
/ f, y$ s/ _0 m7 X- f
( i+ _3 [' F0 _4 ~5 ` L以下是主框架代码:+ Y: d4 V# a' a3 [' C' }
- ;======================================================================: n0 O4 m6 u* {% y% T! m
- ;文件头2 |8 `, t1 B" F3 a
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
8 R L1 c; e% Q# o, { - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量! e. I' c# b, p; p5 K7 ~
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
# c: F( R$ ~. Y2 d: | - ;======================================================================/ X S1 L1 A Z# F& [
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2) x4 N6 f+ Y# |2 S. d$ i
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 13 w2 @4 E3 {# u( g! ^, U
- ;======================================================================
9 T' }, u' M* c* i- @% l; f) y - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
& y7 O( o4 F4 J1 [! w# R, l - RESET_ADDR = $E000 ;主程序起始地址
& B5 e2 v/ M# z8 X' B% B: ^) X( q - ;======================================================================
9 ~3 `6 C1 X0 p3 x - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
0 n' f9 {8 v1 P: B - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
5 i! l5 Y! G9 t. i - .INESMAP 4 ;Mapper号 (0-4095)0 o# [) r2 h% e9 _. I" a
- .INESSUBMAP 0 ;子Mapper号 (0-15)6 @; c# Q0 W+ k1 K! t3 T
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)2 R3 B' P; H) ?
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
! S4 p9 S. q3 t3 G5 X - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)% E4 W0 e* h! e. |3 k3 ^# m
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
: ?" M+ x# s8 v. Q3 ~ - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
3 [- Q, o: d, n1 ?5 _ R3 x - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)4 c: X4 l. f1 ]+ c* ~ ?
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy), Z' B5 e, w7 i
- ;======================================================================
6 H- j+ g3 z1 D: U% f n - .INCLUDE "fc_demo_config.asm" ;全局配置: v2 D7 B; @( O; V. g) s* D# K
- .INCLUDE "fc_demo_constant.asm" ;NES常量
* J% \. M4 Q; y - ;======================================================================
) f5 X$ @$ A& S4 c# F5 R6 ] - ;音乐配置
3 @7 h/ k5 o- }+ M4 h% G - .IF 0 = MUSIC_THEME $ t5 s" B ]' L* e9 D. `
- .INCLUDE "data/music/Gremlin 2/config.asm"' s4 ^6 H4 e9 p3 {3 ~
- .ENDIF
* y5 J; [( U% y' ?8 c6 x7 J( z+ ` -
5 v9 J1 _2 d- k4 V - .IF 1 = MUSIC_THEME/ K2 h5 H: p8 ]1 J" @
- .INCLUDE "data/music/Raf World/config.asm"
2 h; J0 U* ?1 L, b) w4 i, m2 j0 ` - .ENDIF, o6 g# `" e2 s$ g7 r* }7 @9 J
- " ?4 R! d) x) w8 e( X
- .IF 2 = MUSIC_THEME 6 E$ U1 k& }3 k7 |5 Q) M9 _
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
0 ]- L- L9 O$ H' Z6 D - .ENDIF0 P; h7 k0 @$ i+ c" _: A
- * L) a# _7 g1 ?
- ;======================================================================
V( I, E, {- @: q - ;引用CHR图像数据' ~* j& [; n$ c
- .BANK NES_16KB_PRG_SIZE * 2; T/ C- u0 x7 D
- .ORG $0000
6 n" J! g0 y+ n8 [! u, ? - .INCBIN "data/bkg.chr"5 H" j! |$ h5 T/ H! }% \7 n% @
- .INCBIN "data/sp.chr"2 Y6 B$ B8 f* O9 f# z$ O
- 7 s! x$ z% _$ B/ l$ O a$ |+ A4 O3 c5 Q
- ;======================================================================
- B3 _) D2 P1 a/ L; S) K* ` - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
% C) W9 y6 P' c* t8 Y% a, _: D - .ORG RESET_ADDR
7 U2 c( e* D0 b - ;======================================================================
* Z: o. ?6 K' E8 M4 f$ | - ;引用其他源文件2 i+ Z5 ]5 R9 i5 N: e, Z! Y/ ^6 ~8 U
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
+ F+ W7 b! i! g5 ^: J - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
2 u/ _9 W5 f$ N - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理8 u, I' o3 A% W8 ~: {
- ;======================================================================
: Q0 m) D4 w" \0 j2 }9 b; M
! x% B) ?; N0 p- ;======================================================================
8 r8 h6 U v# {& D6 p5 A0 m* O3 { - ;等待VBlank到来7 l7 S8 |2 N9 H9 Z" |
- Wait_For_VBlank% u: ~- F' ]: U
- LDA PPU_STATUS
- A8 f [+ T9 `/ I. C - BPL Wait_For_VBlank
8 k9 |2 {3 J5 ^* W9 J# N7 s - RTS' M: O7 Q1 @$ b# Z
+ w0 V# W$ H9 i& x" W6 }% k L% X; a- ;======================================================================
. W: q* D% I1 K' C( M7 V7 @ - ;调色板初始化
: Z Z- |$ c$ k' K - Palette_Init
! s& o. R1 o; k3 ]3 c: Q5 p; } - LDA #$3F- D3 V6 ]# B7 ^
- STA PPU_ADDRESS
8 q" k, @" e" h# m - LDA #$00
+ n/ B* I j; R% e - STA PPU_ADDRESS
" a- ^- C. C! k* ?- Y7 B - LDX #$00& j: T- j* r2 A: p, m% G$ P
- LDY #$20
; c% b9 X' t: u6 k) C/ W - .Write_Data, S" y \! q; [% \8 P$ l
- LDA Palette_Data,X" ]( H* Q' Q# s/ O) _
- STA FC_PPU_Pal_Addr,X# i" P! R* p( K
- INX
$ I2 [! ~$ P1 b- Z* n! O; f( u; @ - DEY
6 B+ a2 q" x$ P- Q# ~+ @ - BNE .Write_Data
; j& f' T2 H7 R7 | - .End
/ A& Q# x+ j* g1 Q5 d6 }( D - RTS% l W. A, y7 y4 O0 H! s
- 7 e1 F9 _1 N( L; W; x
- ;----------------------------------------
0 o7 Z# E& `: T% ]* v, D' Z# n; n - ;调色板数据+ J5 V' d: [/ w$ B! o" Q0 a8 \
- Palette_Data! h! ?& k9 P7 P/ ]9 ?
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
3 z+ t; o" F9 ]9 ? - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
$ o: H3 x) ^5 Y4 _ - 0 N4 O+ w( }3 _ U: e" ^' Y
- ;======================================================================6 v& O& ]4 l% A
- ;命名表清空1 n6 N$ X3 O6 \% J: t
- Nametable_Clear. a+ d; I6 l. Q1 @
- LDA #$20
; w9 J) N5 ^& E$ P& L - STA PPU_ADDRESS# F3 f' o3 _' o" |2 o( x2 r
- LDA #$00
8 M8 Y7 x, v4 ?. e+ ^8 Q - STA PPU_ADDRESS$ H, r- ]0 j( K' I9 X& @# j8 X
- LDA #$00
3 U3 T/ N3 M5 w - LDX #$00
/ {9 w6 {( V n8 y - LDY #$08
3 O0 c( `0 b X9 o& C% L9 L; Y+ N - .Write_Data
# O, L( P u. J. o' B - STA PPU_DATA5 _4 B7 Q; r$ H# W
- INX+ \5 T. {+ D+ P; ?, B
- BNE .Write_Data: s' V: ]' l- Q4 I9 G" N$ G% B7 l1 Z" g
- DEY* s5 I, \# {" h
- BNE .Write_Data! F4 v: m/ w' c1 y) D0 l% s
- .End! r C7 }/ j4 V
- RTS
/ j( ?( G$ @2 y/ d
8 i, L' a9 b) z8 P( G- ;======================================================================
9 ]5 [( P2 {* E2 {2 }- d+ q- Q( t - ;音乐曲目切换
$ O" K/ J$ r3 u3 o1 {& B1 | - Music_Select_Process
" C( R6 N0 o6 o5 m2 d4 L0 y* ~
9 `3 H$ o) Q: P3 F- U: z- .Pre_Music;上一曲 _" X1 A# K* \! U# Y; d& k
- LDA FC_Gamepad_Once
0 l# y; ^/ l7 q6 @ - CMP #JOY_KEY_LEFT
5 x6 G0 G! q% e: H5 a2 q( N0 W; W, J - BNE .Next_Music1 \5 l; L3 s% g- F h
- JSR Music_Play_Pre
7 K. t& V* s) X6 r9 K - .Next_Music;下一曲
( S) x3 P& { D) f! `* I" `/ ^ - LDA FC_Gamepad_Once+ c* ]3 {. h8 A2 w
- CMP #JOY_KEY_RIGHT
+ A: Q* X8 o% G, d3 ?/ }) ~! B - BNE .Next_10_Music5 ?: Q. P3 b. D# k" {0 Q3 Q
- JSR Music_Play_Next
' v1 F f% K3 f6 e6 D+ P$ k3 k - .Next_10_Music;上10曲7 w' a! h' M9 b! k
- LDA FC_Gamepad_Once: w3 i9 T1 r! O5 Y$ l7 e5 g
- CMP #JOY_KEY_UP
8 b! ^7 E u: A& V# }5 G& A% C6 x - BNE .Pre_10_Music
' T# @6 C$ Z0 ]0 B# i, W - JSR Music_Play_Next_10
7 S, c0 `! @ O& Q k, H - .Pre_10_Music;下10曲# e( S5 R" B$ |2 ?, l3 ^
- LDA FC_Gamepad_Once
5 y0 n# l8 d" H+ x - CMP #JOY_KEY_DOWN
) G/ P7 _1 ]" B - BNE .Reset- L1 ?( j- A3 h* A8 E# a+ H c
- JSR Music_Play_Pre_10) {' s3 d& h/ v# f/ S! O( @
- .Reset;重播当前曲目0 n9 ~$ o! Z" a: [4 z8 d2 p
- LDA FC_Gamepad_Once
2 j F( ]4 r* | p- k- ]8 z" T9 f - CMP #JOY_KEY_START
9 Q( k1 G* R! G; B - BNE .End
$ V% {6 e4 q" Z; E) N" z - LDA FC_Music_Index
) w3 K0 Y* ]- z. q, B - JSR Music_Init_Process+ `; i1 H" i( G2 f z6 a0 r& d
- .End
: R" h; P4 c( A; D - RTS
6 x# R- f4 {# V5 K/ s k
! B P z$ N, e/ g* h* K! G- ;----------------------------------------------------------------------
6 K# I0 E/ a; e/ S/ J' p - ;播放上一曲
1 [# Z" B, v: z) q5 l - Music_Play_Pre
& g; w5 `/ \/ M+ L5 F' r( ] - LDA FC_Music_Index5 a, i% N( O# x/ ^5 R/ ] ~# v
- BEQ .End
/ m7 L; G7 m n( i E& R - DEC FC_Music_Index0 h0 g* v& h$ D8 o" c& y
- LDA FC_Music_Index
$ {( Z- r! a' s: I8 |& j: y! }! C - JSR Music_Init_Process
) d+ K/ w6 e* ^0 x& _" n$ D+ m( e - .End3 q1 W# F" D* w5 Q
- RTS
/ D0 c ` Q* D, J' |. E - ;----------------------------------------------------------------------
# C! l* z4 S$ f a! z& b - ;播放下一曲
6 C O$ h0 F; F( x [! r8 D - Music_Play_Next4 a* H: O0 C S
- LDA FC_Music_Index
3 C' y% H. f5 V T - CMP FC_Music_Max_Index1 W7 s3 ^) l/ E6 s2 a
- BCS .End
" z) a v" q" n" q. \& j - INC FC_Music_Index* x3 m3 T0 N, l" M
- LDA FC_Music_Index
7 u' J8 }; I' t4 ~ i' n - JSR Music_Init_Process
5 }) }) s! [) T: F - .End$ _+ }! x- H1 c9 R( s d4 j
- RTS. R( _+ H" ?* d9 \; D2 H8 n
- ; H9 f0 o$ D+ @) {; R& H
- ;----------------------------------------------------------------------, ? B4 I* P* b( ^' g% {4 C" X; m
- ;播放上10曲
: u9 S+ T: A. l7 p( M8 X6 B" _* j - Music_Play_Pre_10
! F/ {+ K2 b3 g9 z, R - LDA FC_Music_Index+ r1 E7 k5 n! ~' w/ X2 ?) K. Q
- BEQ .End& Q/ z5 j! y. y1 e% s# o+ X# G
- SEC) a$ c! ^( b) I1 @8 x) i' p
- SBC #10; \' M2 g1 r1 Z3 E6 m' [
- BCS .Pre_10
* k# R& k% m0 C* b8 Y x2 e - LDA #$00
& @' Y% e1 s9 k7 K: S2 S - .Pre_108 S- d6 @' k8 N3 |' w
- STA FC_Music_Index
, `; @! c$ \( @ M, d! {7 H6 h - JSR Music_Init_Process2 @, R' w* _; {/ m2 P- j# Z
- .End$ |$ f0 z( {8 B3 }: o0 q8 m0 l
- RTS+ Q9 y- d0 u6 Q* E7 m
- ;----------------------------------------------------------------------; ~! b; q+ H- o; Q; @ P
- ;播放下10曲0 L& e- C; b- x) o; k$ P
- Music_Play_Next_107 G* t4 R% h( G) |& h, o( A
- LDA FC_Music_Index9 F+ D2 Q g1 o; f* L& n0 |$ t
- CMP FC_Music_Max_Index
], m( X; U% j, I5 U# }& B - BCS .End
0 z$ S, M$ z$ i: }$ I - CLC
! L: f) o. s3 s) P+ ~' B - ADC #10$ C# K" ~$ t' L0 Y# G( L5 W L
- CMP FC_Music_Max_Index
# `) Q- I3 a5 @. J9 h8 j - BCC .Next_10
+ P* e2 e) e3 S - LDA FC_Music_Max_Index
4 p' A$ W+ W" m- Y% o$ s - .Next_10+ k# I2 `0 `2 G( l
- STA FC_Music_Index
d3 l' C, q1 N+ b - JSR Music_Init_Process
& `" e- [2 b( J- C$ _0 G, } - .End# X9 t: h' b6 K$ s1 q
- RTS8 l' V+ ~6 V% a G
- $ j$ g/ e& c; A
- ;----------------------------------------------------------------------, c2 p/ w9 R3 I9 D& v y
- ;8位十六进制转3位十进制制
4 b" C& ~/ l6 U- a# e' }8 Z - Hex8ToDec
G: J5 v2 Q- k, W" R9 x* t+ ~# R - STA FC_Dec_Data_1- H& E: ~$ w' X6 k
- LDA #$00 \9 F$ C" W s7 m- j+ `
- STA FC_Dec_Data_100+ H3 t& h. {$ B$ e2 v" p6 s2 g
- STA FC_Dec_Data_10
' l+ N/ B4 W+ f1 T& C8 m$ S- h% [ - LDA FC_Dec_Data_1! C1 A. ?. r6 @7 ]; t: H+ Y" L: g
- .Convert_100( ^* F! l0 r( h7 v6 ~& j2 g9 h' I
- CMP #100) P/ ^" S$ |5 B5 q$ E
- BCC .Convert_10! J* Q9 y- ^7 Y1 U" E7 G
- SEC
6 j/ c7 F" E0 P7 [9 ~$ H - SBC #100* v+ c+ ^* f6 g
- INC FC_Dec_Data_1007 ?& {; q* H/ G2 n
- BNE .Convert_100
* N0 a0 p, z$ F0 }( B - .Convert_106 Q" ?8 z* `0 A9 s
- CMP #10; `8 t! E( Y: @% x) C: J
- BCC .End0 X& D3 C; h& I" h/ i# s- {: ^4 l
- SEC( @/ ]" n2 q v* ^, X- f$ O
- SBC #10
) a) m. G. e3 ] - INC FC_Dec_Data_105 I7 R7 I5 s5 r4 M9 J! F9 R( k4 l1 L
- BNE .Convert_10
/ V) m6 ^7 ]* t# P6 N - .End" k1 O7 p3 s7 o# F- ?$ N
- STA FC_Dec_Data_1) C. w2 { I1 W* A1 W
- RTS; c' d, X, b& o+ p0 a8 W
- ; E* H/ F3 f+ }' p' f3 k D+ q
- ;----------------------------------------------------------------------& _0 ]: n% [# Y4 s9 N
- ;显示曲目信息
# p5 ~/ G7 b1 J& c; }" b - Music_Info_Display
. ?' `/ _ L% L2 q* k - LDX FC_PPU_Buf_Count
# W4 C: Q! x+ T* z; X. K - LDA #PPU_WRITE_MODE_CNT_LINE! s, j- B$ u; f6 d1 L2 J
- STA Use_PPU_Buffer,X
- O u, L; {5 p% Y# y' X% z - INX
/ ^6 Q2 W$ t# ]$ l2 S - + m! g3 h, e8 O2 ?' X: y# h: E
- LDA #>MUSIC_INFO_POS0 {3 ~& V c- q1 F
- STA Use_PPU_Buffer,X' l6 _* C9 B0 b# O
- INX
% P t/ d# F- x S- U - / f' Z- |! n- e7 M1 Z
- ;居中$ g0 v- d. i' O3 C- k( L
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2$ [! e% W& F! N, |
- STA Use_PPU_Buffer,X; X( L0 a( ^7 O( A8 }6 G
- INX
3 I! C. W; R# P# } -
& W6 u+ E% f6 \# j' K0 l - LDA #$05
# c" w; S- E( \8 h; f' A: [ - STA Use_PPU_Buffer,X
h" ~9 ?/ C4 I2 I$ a - INX
5 _6 }3 N% Z; M - # {1 Y0 {; ?7 z, B" ~' |
- LDA FC_Music_Index3 s, x/ O( t) c5 s8 j
- CLC
9 f: H2 s1 w) j) I& w+ B3 V - ADC #$01
% m8 a8 q& I6 o - JSR Hex8ToDec
, f% y. |/ t' E& g5 l -
0 v' Q# }/ f. z: r% _/ k: O) r; H - LDA FC_Dec_Data_104 j" r- a( r1 j" R( \- d( H% {& j
- CLC, G2 Q9 @5 k( o% }
- ADC #'0'; g+ q1 k+ ~$ X( h% l8 J
- STA Use_PPU_Buffer,X8 s) ^/ ]) u- U. c. S
- INX
* W0 L& ^9 _8 Z' h2 e3 ] - . d ?& L) j0 e# s, y
- LDA FC_Dec_Data_1
8 X; p* _! }8 S W4 B; O - CLC% j- S2 W* f& l" U4 ~/ S
- ADC #'0'" Z+ F" t% K/ |% j+ D0 u
- STA Use_PPU_Buffer,X
; m9 M) @2 W4 R- Z$ P _* ? - INX9 u: m F$ M5 Z( j1 K* v+ e
- ( L7 J7 J/ u- V& k& Q+ ~9 q
- LDA #'/'
z/ X$ |# G0 Q0 _+ W, x& |% L3 O - STA Use_PPU_Buffer,X7 G9 t5 z; r, O/ J
- INX2 Z" ]7 W, i, J) C7 j: A
-
; D' K( W( u3 ~ - LDA FC_Music_Max_Index$ D9 Y- _) C- c0 _. B
- CLC4 r! @* w. K6 m- w4 d1 c
- ADC #$01
- P! a9 o# e* P) M' D - JSR Hex8ToDec2 i2 u2 B( x' }- G6 p0 C
-
6 i4 a; ], T7 Y+ c$ f9 x0 U+ A - LDA FC_Dec_Data_10
$ U) o6 m8 F' X: z( q: S - CLC
" @6 G" ?" t" g) { - ADC #'0'$ T/ H( y9 U0 _6 I5 a
- STA Use_PPU_Buffer,X
1 s0 v! O: P1 t" r i) a - INX
( G! r8 K: K" Y - : z% _& c( K. N8 o& {& B2 }
- LDA FC_Dec_Data_1+ R5 \3 M1 m1 z! a4 q
- CLC
1 i. e# o. X3 `$ y" [7 J6 V - ADC #'0'
, m9 g4 u2 t6 M+ B1 C - STA Use_PPU_Buffer,X! M. O0 }; [2 t; n
- INX1 B, q% l( p. G: _% ~$ h
- * t: q3 u6 u5 y& W
- .End- D; O* E: ^5 t, S. @. Q3 g
- STX FC_PPU_Buf_Count
. Y& f* j9 d/ o8 F e - RTS1 ?* A4 v- F) [# O& Z
3 T, y% H- J/ A& c: y% O8 Q2 O) q- ;----------------------------------------------------------------------
& z( |1 _. E- R2 h2 ]; a# z - ;音乐曲目初始化处理+ ~* G4 n7 z) b) `# Z* R
- Music_Init_Process
9 ^4 k% x5 f! j3 l3 c {0 e9 B - PHA) k0 r! y" W- Y2 Q% c
- JSR Music_Clear_Process) i" d4 S2 o5 v/ F% j% ]' U
- LDA #$1F( ]; d2 W2 r/ J+ E# m
- STA $4015! c6 _0 ~! W7 G" J3 R8 K
- PLA* ?" ]5 o" Q3 p) H! Q) V
- JSR Music_Init_Addr% W! q1 O3 ~& s
- JSR Music_Info_Display
( C( l! v, P. o! S% d& |. N" } - RTS) s$ _0 P3 Z- f* e6 r. t0 C
7 D& Q Z& F$ H6 B. x3 J; n, i- ;----------------------------------------------------------------------
9 M" } k" a* X0 o1 R" ? - ;音乐播放处理
4 D I! f. m9 [/ X% h( s4 A6 n - Music_Play_Process
4 \4 M! O; A5 c" e# ~ - JSR Music_Play_Addr
9 \% ^ a/ j% ]$ C! C% j5 L; L0 h) x- j: z - RTS0 d/ N+ K6 |9 J. ]" ]
) L. Z; W8 F9 u' W" h# o+ ?+ m- ;----------------------------------------------------------------------" E* v' r* U0 u& S
- ;音乐播放处理7 i$ P! |, ^0 W& a! e$ j
- Music_Clear_Process: r+ V1 h2 q1 I+ t5 P* L# e
- .IF Music_Clear_Addr
8 x( B/ I i' H8 Y+ V7 G. u - JSR Music_Clear_Addr
" z! Q( R% m, m: ]1 ?7 U, x9 r - RTS
9 _4 y. u5 _8 c! R2 x; { - .ELSE
( Q9 ]8 u6 L- a. [, D% W - LDA #$1F
4 r4 h) h. X$ v1 A' q. G, B - STA $4015
' w6 r/ P8 \$ C" L" ]( b - LDA #$004 S2 T9 q6 H0 I' n8 K
- STA $40100 @9 d1 ^. k; j. Y% m: |" {. Z; c
- LDX #$001 a) Y/ L8 o4 W4 V, u9 C! e. _8 b& g
- LDA #$00
' B% Q: C' I; v2 ~( X( D - # O: \6 ^0 a8 `/ u& N( t
- .Music_Clear_Zreo_Page_0
7 |. _0 q# C- N) r - STA $00,X. B9 v8 ?7 e) ?1 ]! s1 M
- INX% r) s% F3 O; `& p* `1 @
- CPX #Use_Zero_Page_Begin" j9 I5 W8 t! R3 I& b( n4 E
- BCC .Music_Clear_Zreo_Page_0- I6 G* H3 j/ r* J6 _
- / G5 u$ J. R. \5 a/ |3 Y* x6 g9 w
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size$ a& B) }- f0 n |$ R2 b
- .Music_Clear_Zreo_Page_1
$ o) X m1 \3 S, \ - STA $00,X: K) D: x. S# ~4 I8 @& B9 Y) ]5 C
- INX( t' j( A- ?1 B
- BNE .Music_Clear_Zreo_Page_1
; s& @3 D, T8 [6 v3 F2 B. X* v - $ M1 K/ i4 H- _8 W
- Music_Clear_Process_1! B8 x* j& g! d. u
- STA $0600,X- k/ U; B# n& i5 U
- STA $0700,X
- c. l7 p+ L6 o( P* C0 Q - INX, u# }% m2 [/ R
- BNE Music_Clear_Process_1
! ^6 C. S, u, k, E. f - LDA #$10
2 g8 w! h9 u7 v) I q - STA $4000$ h0 E' A( l: h& x, q* Y" `
- STA $40048 F: u1 i& ]3 l& V) F
- STA $400C
/ {4 p& H7 |# { x- k - LDA #$00
7 O: E3 F4 G/ R0 G8 V) m; u( j - STA $4008
- z7 u1 r3 g* J2 C, x5 { - LDA #$0F1 Q" |( O- z/ o; E7 f8 g
- STA $4015, j2 S$ F: X- j l
- .ENDIF" |1 R% f$ ]7 S& K1 b
-
- n3 b1 ?- Z9 |# l0 |6 h7 Z - RTS
2 ^; \8 r6 o/ ~# j - % A: K& V1 d9 Y1 }
- ;======================================================================
9 P$ U# Z2 L. V: K - ;重启处理
2 @7 M* c* U$ O/ q/ R - Reset_Program9 o" k" B: ^6 r- o
- SEI3 L5 [7 A2 ]7 S5 C
- CLD
+ i# |& e3 c& y% [ - LDA #$00
( i; X% _. V8 e5 r5 u - STA PPU_CTRL
+ l# ?2 u4 u u+ j4 v" E, o - STA PPU_MASK
* C7 Q7 e) o0 U, }8 d - STA JOY2_FRAME1 h# Z1 A' T7 e) q7 `6 P; R
- STA APU_STATUS
: b8 B! s8 i( h6 ^ - / V: {7 }1 J6 Z+ x- ]
- ;等待屏幕准备完毕' C Y. d6 g0 R2 ^8 o, i+ X
- LDX #$02
0 ~& ^$ n5 ?/ C1 G+ V+ R4 W% M5 z7 Z - .Wait_For_Screen_Ready
7 E6 u8 C( J7 T2 r$ x - LDA PPU_STATUS
, J/ @# X9 s6 P2 A - BPL .Wait_For_Screen_Ready; z% g1 [7 g1 _* A+ ]! _7 ?
- DEX
2 o$ a! ~% J6 ^0 b, H - BNE .Wait_For_Screen_Ready# Q! C8 V- D6 N. {* U
-
5 x, m: _' n( z1 m# ?# U - ;清空调色板
( h; R# u- U5 k* f) k1 k - Palette_Clear
7 ~% U4 U* v0 S- O - LDA #$3F
9 W1 U2 z. F* O" A - STA PPU_ADDRESS/ D4 ^. l! b/ K# O
- LDA #$00
5 Y* G0 V0 Y1 O- ?; p - STA PPU_ADDRESS$ b) g4 z0 f9 p8 P1 ]
- LDX #$20+ t! B/ s& D; O
- LDA #$0F2 ^# t# l, W8 X! I: o' C, \6 e
- .Write_Data9 W2 ?/ T/ m- l
- STA PPU_DATA+ L5 u1 N+ [8 K
- DEX% n% G1 ]# x) |) r' l
- BNE .Write_Data
5 r; ]& }* E D9 c! r - . F6 `4 S- X2 w( W6 M9 Z' S! s
- ;清除声音 $4000-40138 e; @, A4 _# Y3 {- H6 ^
- LDY #$148 q+ n. V' w# j$ m3 l% a
- LDX #$00) }2 V2 |) E- }" l3 ?6 k6 e$ {
- .Sound_Clear
. p# z: }& Q& o" d - STA $4000,X+ `$ }' H/ Z |: V& |
- INX
1 Y3 k8 Q' S! ?0 W - DEY2 n; s- K/ ?8 |2 \! R3 n5 S# q
- BNE .Sound_Clear% v2 g* I6 ?9 u
-
q, Y- M: b8 I3 M" ` - ;清除 RAM $0000-07FF
1 B" L' x Z9 h0 F+ f. w - LDA #$00
- o3 n0 L+ a% M+ J - STA $00& M. `' c- \1 E2 v( h# n9 @
- STA $01: C0 L3 v) k1 x
- TAY, t7 Q+ s& `3 f$ M
- LDX #$083 y: w, s8 g2 e' B3 m
- .Memory_Clear- @! {0 ~: a( l/ ~- P$ e3 J3 G
- STA [$00],Y* O8 o8 g( A; p' K" U/ r, N- m& l
- INY
& Y! N( {; A: z1 f' g - BNE .Memory_Clear
8 j7 ]+ c4 P- O# F2 l# {7 ?; C) L - INC $01
! x% L. P! R: M- B8 t. _3 s, b - DEX
9 c/ f' Q8 e7 q! L; a5 G - BNE .Memory_Clear
. Q9 C! \! ]" Z8 e f/ l -
) J9 V( z# D; g - ;精灵缓冲初始化: K% i( t# |! E) i9 A5 X4 R% M
- LDX #$00+ h" p! k7 p& i* J1 i& ~% }
- LDA #$F86 V2 P0 J$ x0 q \) e$ l! d
- .OAM_Clear
9 A1 p0 F( w1 q0 I; H - STA OAM_DMA_Buffer,X# _- R+ l9 ^6 ~0 D; P
- INX
% j3 }$ T- v# ^" n: m5 t& o - BNE .OAM_Clear
# v4 b) s, v6 b% N" w - ; w7 H: J, @) s8 y2 t' a
- ;栈指针初始化
1 }, n* K. o; m# ~1 L - LDX #$FF* `& J% V' Q: f7 i6 |5 t* C
- TXS
3 H* q# Y3 I7 }* ?# Z8 e) k - " ~" r* L- x6 Q! V, O; [
- JSR Nametable_Clear;命名表清空
$ i; N3 p! ^2 u1 P - JSR Palette_Init;初始化调色板缓冲
2 T/ L- T6 V7 \! F' U8 H1 R - JSR Static_Text_Init;初始化静态文本& ~5 }) b8 m! r Q
- h J- X$ d) l9 t5 c% V
- LDA #MUSIC_ITEM_TOTAL - 1% n' v2 x D0 J& u
- STA FC_Music_Max_Index
9 I/ g! E# \5 u4 `/ x- | T/ J# X - 5 T8 q0 X: b4 {' v; a& @& C" S3 d
- LDA #$1F
' }8 C- s. r0 j0 V! \( b m/ C - STA APU_STATUS2 d' {2 V5 a2 i6 H
- LDA #MUSIC_BGM - 1* E+ r2 g5 @/ P$ n
- STA FC_Music_Index
6 f% Z& @( z1 V- Y6 f7 |3 l' B4 R( X - JSR Music_Init_Process;音乐播放
1 f3 D- N$ g, O -
+ ~3 l/ t9 y0 I. H1 c- L0 }9 J - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
' v+ @. X8 y4 t2 W8 H9 x3 p1 E1 t - LDA #$1E* E- x% U" K0 W3 s! ]
- STA FC_PPU_Mask_Buf( Q7 h+ c) W2 M/ h+ K1 o
-
% i& ]% Q6 |/ ?) j. L) N. N, q - ;启用NMI处理' M( a" r1 J; o1 Q* m
- LDA #$80) O* Q a8 [% P! Z [( K& L
- STA PPU_CTRL9 M& j; ~! t0 m1 Q- G, k3 a9 R
-
0 N! b7 ~) }# s; q& v0 v, k - ;程序循环, 剩余工作交给 NMI 中断处理
! t: u! L m! s& W- C. G - .Loop
6 i3 T. t3 r! Z" _( w& X - JMP .Loop
' b: O- Q9 X f0 x0 G - 0 @0 ^; B, o x) Q: U: G
- ;======================================================================4 o9 Z7 K: s: |& l. E
- ;不可屏蔽中断处理
9 x0 \0 M+ y; w) |& Y - Nmi_Program4 x( }) f3 b- j' H
- PHA& g- H$ w1 d% u
- TXA# e, r6 m0 A/ I1 `
- PHA
$ |% Y, I4 z& W, a5 }3 d - TYA8 s0 s. c& ~: f2 V
- PHA
4 C- b% M$ Q. s6 `$ ] -
3 U2 P4 Y' s) s - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
( e1 W( t# d ` - 7 g8 z& C# A" [$ G) R9 B1 d, k
- JSR FC_PPU_Procrss;PPU处理5 U( K( r( M: d* l. B5 o
- `5 m* }9 ?- q
- ;精灵内存更新0 s* i/ h. |& I0 X( [& g: _" N
- LDA #$00
9 A3 e! x1 c# |% E& T - STA PPU_OAM_ADDR7 v6 W, f3 U3 e, c1 |& K, ]
- LDA #OAM_DMA_Buffer / $01002 A% I. X: l9 @: r" j$ y
- STA OAM_DMA
, M. x3 \& T0 G: L6 Y: g8 ?* d0 v -
; M) ?* Z/ y! J& g5 c - JSR FC_Gamepad_Process;手柄输入处理$ Q3 Z" V( e. i2 R, N
- JSR Music_Select_Process;音乐选曲处理
5 p+ M0 L$ G2 j - JSR Music_Play_Process;音乐播放处理
3 M' k8 B+ L# U) }" { - 7 H; C- e, p0 R& o8 V; s
- PLA
" S- O" p8 D0 k5 ^5 L9 x( R1 p p - TAY( n! b* U4 b, O! m5 R- y! B7 P
- PLA
3 x0 ^$ z. E% d - TAX/ F/ k7 B" i7 f( p6 m: _
- PLA
, i( P: u+ e, i l" V - $ c3 y- ^7 Q, t- ]' @6 D1 U
- RTI
: j# t" z4 `( T8 H6 M. T1 h - : {3 s9 Y# A) W% B6 G* f9 g
- ;======================================================================, W% x! i- p( x
- ;请求中断处理& h9 _4 k0 g u$ L
- Irq_Program
+ F O: O: C6 o6 d; X9 z - RTI
7 N2 l' O$ o% J5 T' q - - v' r9 `5 R# j4 \ m( I- M
- ;======================================================================
# n0 T2 g/ [) R2 Q5 X3 r" ~. ] - ;中断向量表
* O( d. v" D+ @6 x# ] - .ORG $FFFA
5 B. m1 C" s+ m' V9 |# w+ V+ J - .DW Nmi_Program ;NMI触发时执行
3 C, A+ P6 w+ m6 g6 n% E2 }4 S - .DW Reset_Program ;载入ROM时最先执行
3 l0 w7 U( F1 ~ - .DW Irq_Program ;IRQ触发时执行7 A( N e& q! K0 z
复制代码 6 J+ z& k8 f# R! }
+ d# o/ N$ p1 [* M# O9 G1 V
/ w' \, o: p! Mhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|