|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下4 T6 C+ h' W5 o1 S

# i# ^/ {+ D0 e: a) M$ x以下是主框架代码:- q0 D4 U* R" t0 c: |
- ;======================================================================
9 F' ?5 h- i. e L - ;文件头
5 T9 o/ h/ y+ d3 I: p' N0 ?) ?6 b - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量2 b# \ v6 T9 ^+ E6 @/ G
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
% U9 D4 A: e8 U: b - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
- {! k: G$ A: j2 R4 u+ P - ;======================================================================
; _8 l3 ~5 o5 M% V M$ b8 | - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
0 C2 C6 M! w1 d& A" G - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1! ]7 O2 A; P! L$ d h
- ;======================================================================7 s' T% Q9 e5 Z$ v, j
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
, ]) ~, D9 n* ^5 | - RESET_ADDR = $E000 ;主程序起始地址
2 w3 M' G5 K$ n- R" I4 F- Q - ;======================================================================
; T3 Q& D1 |- ?8 k) K6 F5 P4 }/ Z; J - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
( A3 K/ ]$ d8 O. Y6 d2 x - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
p! u ]' Y; Z+ b! J - .INESMAP 4 ;Mapper号 (0-4095)
( k2 ]* [3 E8 D- E. W! H( i - .INESSUBMAP 0 ;子Mapper号 (0-15)8 o# F; }9 s8 v# D. S% M
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)3 ^) J3 y4 l% @
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
- [7 u+ @* P n, E* Q, B. N$ _- E - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
$ g8 G9 B" ~9 q& s6 E, ]8 e - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)& k% j# |" T( j
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)7 T9 Z3 M5 q$ l+ C5 C
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
+ W6 Q1 |* u( | - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
" \* w- @* }$ o1 E; Y - ;======================================================================
9 ^4 I5 V- _2 n" W8 R& X - .INCLUDE "fc_demo_config.asm" ;全局配置
1 ?: C) x9 m5 |# i( \- ~5 t - .INCLUDE "fc_demo_constant.asm" ;NES常量
$ m9 O; L' H! i. M& } - ;======================================================================
{: b/ v# z* }" ^* Y# [; m - ;音乐配置! h9 S. }; m' m" _1 [3 c0 J
- .IF 0 = MUSIC_THEME ! E$ g3 {5 m9 r$ J% x7 F0 ?, P; r
- .INCLUDE "data/music/Gremlin 2/config.asm"
: B$ R6 K! K3 x0 V8 R; R0 ~) g9 Q - .ENDIF: @4 a" v* }/ _+ h
-
) P# j& G7 S9 K - .IF 1 = MUSIC_THEME. q' m8 U- o$ Y
- .INCLUDE "data/music/Raf World/config.asm"% z: G* D$ w; u- F
- .ENDIF8 f5 ^: Z) U c. H
- : b: S- m4 w, ]' @5 [2 u9 K
- .IF 2 = MUSIC_THEME
0 d$ W2 S9 m% m) A# _# N - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
( ]. v( G1 e* N$ r( `7 s' V- Z5 K - .ENDIF
M/ @3 G# [& j; o" j7 s
# u5 J! k$ \% ]% c- ;======================================================================* [2 Q6 V [ ?/ u: k( w
- ;引用CHR图像数据! K. N! ~% [: H0 {
- .BANK NES_16KB_PRG_SIZE * 2
9 R3 {* l& r* ~0 `* | - .ORG $0000
2 h* y& [ W* q, u: U! h - .INCBIN "data/bkg.chr"' t% D7 \$ p8 R6 B" N; ~
- .INCBIN "data/sp.chr"( t' |' d; B" I5 n
-
) ?3 U; @0 z, C' [ - ;======================================================================
( M; C0 O6 x+ H) X0 _ E - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
. ~3 ~% {* ~. d* h! \$ \5 O - .ORG RESET_ADDR6 u6 v) V: Q/ o
- ;====================================================================== m7 m5 S- X/ {1 E( j1 a0 G
- ;引用其他源文件
# C' p0 ?" S' v3 T( o( P - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
, K( l. u# c+ w7 v0 Z - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
( _* D M9 }) h - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理7 D/ q# J9 P/ N7 w- L
- ;======================================================================
- G/ ^& Y) o; z- d& I' X9 h4 v - 2 q* n4 q+ }1 a* j8 N' p' i* C
- ;======================================================================
7 s s: m: P2 j8 I2 A5 f" z9 D( k - ;等待VBlank到来# e C/ n4 {3 o. r5 K' H6 Z9 D& ?* y3 Z
- Wait_For_VBlank
* x/ H! `, I6 V1 U6 l0 ` - LDA PPU_STATUS
% x( Y4 o8 E- F& g7 o - BPL Wait_For_VBlank# [- K/ Q( P: E( m& ~
- RTS6 p1 D+ b6 F7 D3 D
/ M( p3 u9 A! `/ ~+ }- ;======================================================================
# e& j8 b( ?8 R: ?% v0 b - ;调色板初始化
: r& b: a# _# v$ F! f - Palette_Init
; N2 N2 V l' s3 _ - LDA #$3F
1 A6 v- [0 ?0 c - STA PPU_ADDRESS8 @, m: u9 m; u; Y! ~
- LDA #$00
7 ]1 ] G4 t% t& T" [7 V - STA PPU_ADDRESS
% O- Q" n p: {" U& | - LDX #$00: m( F$ K, o* @ K6 z& e! N4 g
- LDY #$20: r3 B! \5 V/ L9 a! v! z: T
- .Write_Data" r, t0 A& ?% a
- LDA Palette_Data,X( a+ O& ~: t1 L# V
- STA FC_PPU_Pal_Addr,X
! \ b. ?; L9 x$ O5 F5 ^- D$ R - INX" n8 `. P$ t G1 w9 Q" F9 @6 L9 y
- DEY9 Y5 E2 S1 C* t( P! l
- BNE .Write_Data
2 P# A+ L" E9 Q, ]7 x" b - .End
1 d. f) b( {9 o' Q6 s - RTS
9 G. I5 ^4 g& L% ^- U; s5 {+ t1 W
1 `- R. z6 y1 a3 {! e: r- ;----------------------------------------4 U4 n+ L) N; E' |: W3 O
- ;调色板数据
: D6 A( o0 `6 H# b% u- o - Palette_Data: r' j- a9 F" e2 \4 j6 R7 h* s
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
( p" m2 `/ d0 C" \7 W - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 229 V: _3 s" e9 n% N3 ]; R4 j
-
9 {. r* X+ f5 d - ;======================================================================
+ Z6 [, D1 {, E' }- y - ;命名表清空
( K& `! L" ^ G7 A) _$ x$ D1 c* N - Nametable_Clear$ f3 q2 X6 M! U1 R( Z9 q
- LDA #$20 X9 w* ^* F V7 m3 s% \/ J
- STA PPU_ADDRESS1 W B& S+ j3 \5 l& n. ?: _
- LDA #$00% A3 q* a, Z! D- R9 m9 v
- STA PPU_ADDRESS# O+ V: A: ], S/ n+ }$ @
- LDA #$00
9 R! ^1 E! n8 {& `% Z; W; s% n - LDX #$00$ e, |7 d5 [3 g7 T
- LDY #$08/ \% A* ?. e$ O7 E" b! B! f% Y0 c4 W! R
- .Write_Data
, x1 Q% w6 m f% X, B8 N - STA PPU_DATA
/ K/ K" X/ B* S& T$ p - INX
: j6 j/ B1 E3 K - BNE .Write_Data8 l+ V9 Z$ J& ?7 d) l/ c& a
- DEY
$ F" }( ?! f( |# w% W$ Q' A+ x- G - BNE .Write_Data# F1 {8 i- g) y8 n
- .End
. @ X, L0 j- r7 U: r: B/ @ - RTS
; d- r# H: ]5 \* g - 6 c6 p+ V5 U- v, ]4 n N3 j
- ;======================================================================
0 {& E! c0 M, W' ^ D8 R! z - ;音乐曲目切换
6 G! Q1 P0 @5 T' p5 O - Music_Select_Process6 d* m; B9 O" B2 D* ?
: O8 c K' K( U/ M" ?5 x6 R7 @2 {- .Pre_Music;上一曲: q. R6 L. r5 D( Z% y2 r- z4 ]7 z# _
- LDA FC_Gamepad_Once" ^& W, I! |- H) N0 p' h% ^7 Y$ d
- CMP #JOY_KEY_LEFT. j) E* d. I) \; k8 d
- BNE .Next_Music
3 @+ j) a4 |1 I1 T- L% f. Q0 _ - JSR Music_Play_Pre
; K9 b' |: Y& V% x7 R9 t - .Next_Music;下一曲
6 M& ]6 z" C$ U/ S7 |( C2 | - LDA FC_Gamepad_Once
`. K5 p5 g2 Y/ g - CMP #JOY_KEY_RIGHT4 X# I& m& }- p) H! }8 h
- BNE .Next_10_Music
" v7 C# a* l% i4 a: e - JSR Music_Play_Next
- _% l# f2 m/ U. _% B" W - .Next_10_Music;上10曲
& j7 i" ?; P# x6 H- E - LDA FC_Gamepad_Once
3 Q: |4 `- [% M1 I2 \7 j4 y - CMP #JOY_KEY_UP
2 U4 o3 b3 ^6 G( Q - BNE .Pre_10_Music
, Z3 G% \8 G, z2 G, R: \: |1 l3 p _ - JSR Music_Play_Next_10
1 g( [ z5 T$ B& V2 @ - .Pre_10_Music;下10曲 z6 L; ], J2 t! r7 x3 M
- LDA FC_Gamepad_Once
! f7 e& d z' a - CMP #JOY_KEY_DOWN" k+ R. ?) V8 O( `# H: n/ }( S
- BNE .Reset# G, W6 U; j5 }) w3 x
- JSR Music_Play_Pre_10
% k; r6 a# U; G I; }5 ` - .Reset;重播当前曲目
' w+ M" J, S7 t) ^! r. J - LDA FC_Gamepad_Once
, z+ g( @8 k0 b) P' i - CMP #JOY_KEY_START/ I* h9 d' m" ^$ d8 u: W
- BNE .End
5 _" r1 b3 Q2 p - LDA FC_Music_Index
& T$ R8 {- m: ]8 B' ]3 y7 _ - JSR Music_Init_Process6 E) G) {7 W5 D9 v# P0 `
- .End
& L4 o3 Y$ z- T/ c/ `# M" y) P - RTS" [% i9 y& @ h. X" k" x
# [, j- H; d: Z* T- ;----------------------------------------------------------------------* K [, \. c6 s9 F0 x
- ;播放上一曲
& Q: {/ T/ Z1 x6 F - Music_Play_Pre8 N8 J' Z7 B4 F4 U+ c. w
- LDA FC_Music_Index% l x4 K) |3 s* ~' g& I- G
- BEQ .End4 \6 x2 n% b- S7 t' |; A9 g
- DEC FC_Music_Index
1 T* o5 `! R' X5 i" F" t - LDA FC_Music_Index
2 C! u8 [ R* N/ x" J1 r - JSR Music_Init_Process. p% D3 T- T+ m7 C; f2 I5 \. V
- .End6 [) [! U, t3 j; _3 [* i9 {
- RTS2 |( I; J0 e/ e# i/ ^
- ;----------------------------------------------------------------------, W. v9 T2 @6 E4 x& h: M5 O2 t7 z
- ;播放下一曲/ A( z/ c& E" H' T
- Music_Play_Next! [* G# W) Z7 Y/ U W; e/ t
- LDA FC_Music_Index
! X& {, l4 }9 {4 W! h+ n( C3 I - CMP FC_Music_Max_Index
[: W- @4 _1 E8 I - BCS .End
) K: n/ {% ~; C8 {% C - INC FC_Music_Index
% J0 ^8 o6 n# ~$ p& d* E - LDA FC_Music_Index# p3 J% O5 C( Q0 a1 c, b
- JSR Music_Init_Process: X2 x1 M% R k- ?, R9 c9 |. D
- .End
* t# L J9 }$ ^, p - RTS2 P8 p) Y+ ^$ e
- 8 w" r0 g3 | e. M. S3 |" s
- ;----------------------------------------------------------------------1 z: o @1 S' I& y& Y- f9 q
- ;播放上10曲
8 f, a* E, D) [' t$ t4 M6 V - Music_Play_Pre_10
; Q/ g- P+ Q, T0 c, f I6 l1 n - LDA FC_Music_Index2 i& i5 \+ O- j2 s, v6 z. @
- BEQ .End- J% y1 Q9 |) k* F
- SEC; Q! @' x5 g* N
- SBC #10! v( M. t" ]4 S
- BCS .Pre_10 g/ q7 ?* F% v G: Q( C
- LDA #$00; h1 X0 O5 e6 D# ?
- .Pre_10
1 p2 a) `( S# T* U$ m - STA FC_Music_Index
$ B4 x3 E% V5 [" e) J X# O - JSR Music_Init_Process
# n$ U' h% i: I4 d7 s$ b, G$ u6 b# _ - .End3 Q9 {) h5 w. p; K" Z
- RTS3 ^" _, M5 P* z+ O( c3 p
- ;----------------------------------------------------------------------( l$ f3 K# Z$ @: Y
- ;播放下10曲9 T* o- u# y, y' y7 V7 D' x7 p: [( L
- Music_Play_Next_10* r8 N \" p3 {; r( [3 A# D
- LDA FC_Music_Index
; o1 D' j( |+ j' x0 X& T! c$ F - CMP FC_Music_Max_Index
9 I: M* e: a$ n! @5 Y. o X - BCS .End
5 R' \2 r: B2 d& I4 R( d& M3 j' j - CLC
) d0 F- V8 x; G2 q/ N - ADC #109 N' k* g, v# Z& U) c. L
- CMP FC_Music_Max_Index% m n* D" `/ M, h8 B
- BCC .Next_10
9 s7 K' H' c) j- o - LDA FC_Music_Max_Index
$ Y: H j- S6 ?0 h& s5 F - .Next_10" h: h4 {3 `3 M6 g% ^
- STA FC_Music_Index
* Y) D y2 k, i& a5 Z: T9 T. l( b - JSR Music_Init_Process
0 v+ s* f4 R* ` - .End) { O6 X% v @) m! z/ K& [
- RTS
# x, H# Q. \8 B! M* v, [ - + x F a% t1 N: o
- ;----------------------------------------------------------------------5 i! B/ W) ]! i& |" { y- F- c& i
- ;8位十六进制转3位十进制制0 f; x. }' z8 A2 g8 ]1 {
- Hex8ToDec
( Z5 E! V; W2 u% z - STA FC_Dec_Data_1% n$ J: q K+ ^" M6 r7 O
- LDA #$005 A" \* \3 C# _; s* K7 Q8 x% e
- STA FC_Dec_Data_100$ b. t5 {8 E+ i7 [0 p9 [( w
- STA FC_Dec_Data_10" y+ r" h% ]! ]* y
- LDA FC_Dec_Data_1
, Q/ q/ c! \ Y1 K( ` S& l/ ]7 Q - .Convert_100
2 |: p" l, N; c; T' R5 P( C+ N/ Q - CMP #1000 ?. l! `$ F/ S* R
- BCC .Convert_103 ?- ~2 V: h/ Y/ v6 \0 |
- SEC
9 c9 ]$ z# l4 ?; w5 s5 U) x - SBC #100 W' z* {1 Q' l& g$ ?' S
- INC FC_Dec_Data_1000 F4 I* `1 n# U; v5 @2 q
- BNE .Convert_100
, ]; N# U' {% R) S- j- F: I4 A8 R8 v - .Convert_10* z9 G" ]% Y S7 g F7 S& \# X( G
- CMP #104 q/ ]9 |. X0 u
- BCC .End
& o. T$ B w' o: \ - SEC
. C) B7 r5 g7 d - SBC #10
3 z' ?! e$ E8 q# r - INC FC_Dec_Data_10
B+ y! U% D5 C - BNE .Convert_10' `+ ]6 |" |6 C- Y# S1 L0 U( a
- .End; c" o8 C9 f- v1 c* J
- STA FC_Dec_Data_1
L! B2 W3 e( i - RTS
# e, |) G( I j1 a( m- Q
% [7 g# D3 \8 C1 u+ h- ;----------------------------------------------------------------------" s* P" s; M0 R- P! I
- ;显示曲目信息
- C) z5 V. |6 `( f4 b7 I) g/ A - Music_Info_Display
: v0 z6 q& F* r# v0 u3 k - LDX FC_PPU_Buf_Count2 G+ v1 k6 S+ {5 }
- LDA #PPU_WRITE_MODE_CNT_LINE
3 I4 O& p6 S) J B3 E - STA Use_PPU_Buffer,X0 f q; N4 m$ o! w8 i' v) G
- INX
( D; [+ }- [2 e) R& C% `+ D# w* o - ! b! `* n" ~1 e2 l
- LDA #>MUSIC_INFO_POS
/ D5 W0 h4 s# p, F7 r6 O! [ - STA Use_PPU_Buffer,X
+ j8 U, G! |( M- a2 t t, }9 ? - INX5 L0 k% [( Q; J
- , R& ]2 @. L+ u6 j) r) c
- ;居中
4 L8 b, V5 I& j. p - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2* Q2 R: b$ \& C
- STA Use_PPU_Buffer,X
; ?$ `) X- [6 d1 ~ - INX V# W; u& p5 g
- " ^/ `: X+ N) m$ ^% V
- LDA #$05$ e4 s/ V2 `( g) O3 |
- STA Use_PPU_Buffer,X( y( T8 V2 P( j# H
- INX
1 d4 K' H) P, | - : d/ G7 n/ ^1 T9 Y: J+ R
- LDA FC_Music_Index
* H! i3 Y o& J* O& K% G# O6 X# n - CLC
" d. B, p% }2 O+ u" G4 T* f - ADC #$01
" a6 @4 U; R# d8 o8 O$ I - JSR Hex8ToDec
4 |4 ~8 L- p! i+ P! w% U - 1 q) c2 k1 n k6 J$ Y# v# f
- LDA FC_Dec_Data_10
2 Z X4 o7 m; L4 }/ _4 H - CLC2 q# e5 J8 {0 V. D
- ADC #'0'
9 X. O# p' ^ g1 x5 Y0 a7 w3 H, } - STA Use_PPU_Buffer,X
3 F+ o( i l) E# c1 m7 C - INX
) Z* m9 Y9 }: `3 R4 t -
9 Z! F& X0 W$ D - LDA FC_Dec_Data_1
9 p b. F, R7 c; t& t) j5 f9 z5 X - CLC4 r* @& o( \: j% B0 V
- ADC #'0'
: R- n6 [% K; j( Y% q - STA Use_PPU_Buffer,X
7 v6 z Y& @- T! b% {8 e - INX
7 T, {, J* k8 _; Q+ Q - 7 ~# ~8 g* n3 Y" x2 x- k, x
- LDA #'/'
+ d) `; y0 F# C5 q9 a2 G! { - STA Use_PPU_Buffer,X' U/ V+ O! S- \1 @
- INX& J' S# Y5 e8 i
- 5 U; ]. `8 E( A. d& I& R7 `4 Z
- LDA FC_Music_Max_Index
/ M% U& ^4 ^0 N- l5 h - CLC) Q2 r& o/ \- m7 Z0 m1 x8 M
- ADC #$011 i) y5 x6 S' W! `0 H3 r9 M
- JSR Hex8ToDec) ^& V& \6 q& r) ~( y
- * r" @( S6 r9 J( V1 ?+ Z8 n
- LDA FC_Dec_Data_10
, |5 k7 q4 P0 J6 T: a - CLC
, [: _+ p* }, W6 Q - ADC #'0'
|9 t- E8 [8 F2 A% r" m% e - STA Use_PPU_Buffer,X
& {4 W$ c" X' y - INX& N6 H; ?) W) W) R9 S8 u& [
- ) {9 L8 J4 W& x2 J0 l9 z: S7 }
- LDA FC_Dec_Data_1) g, U4 l; [. d
- CLC& U' |2 N& n8 B6 l/ I& y- F
- ADC #'0', I& q" y* I H1 F3 B$ T7 f. j2 ]
- STA Use_PPU_Buffer,X" _6 M2 K2 O" B" _ _0 ?( e
- INX
f6 _, s# C) f- m -
- q( [8 N' n! r3 A - .End
# k, M% g6 w, Y) F5 e9 b6 n - STX FC_PPU_Buf_Count
4 V( x8 B( a! ?1 o* o* ~9 h - RTS9 [ g$ Z2 V8 Y
- ; j$ W& c% L) u, Z
- ;----------------------------------------------------------------------
) i3 n+ B; v% G% n8 M - ;音乐曲目初始化处理
1 Z/ t$ D: L0 }8 a# f1 @ - Music_Init_Process
X" D% c' R$ J+ ?, i3 ^$ k4 a. A* }, h [ - PHA
; Z* Y5 M! d/ q, W; b - JSR Music_Clear_Process5 Q' q3 P. z' y3 X. a/ I3 e
- LDA #$1F$ o' k+ e' R9 [8 M2 W& p% {& D( H
- STA $4015( A9 D; W) C; ^4 }9 g# ^+ E
- PLA
8 s8 X/ b( t7 v3 l# u - JSR Music_Init_Addr
; |; G4 M' o( X5 Y% s - JSR Music_Info_Display5 Y! ]: w. d- Z3 y1 W8 M
- RTS
$ C* C5 f4 X4 `$ A, [) i+ o, e% |
2 Z% R# b9 T! \- ;----------------------------------------------------------------------
& C: ~9 `# G% M- T - ;音乐播放处理3 G' I4 h- r3 a; }
- Music_Play_Process- y9 ~+ S! b8 y& B
- JSR Music_Play_Addr: z3 m8 V( i+ s0 b0 e. M* |' z4 G! L
- RTS
I5 O4 V5 u) D$ I3 l8 @$ a6 x
/ e0 |4 f7 w" \& C' H- ;----------------------------------------------------------------------
3 n. B# c, ~* }) H8 W2 u7 m* D - ;音乐播放处理
- f' H: U! E4 y9 \+ j4 L9 _ - Music_Clear_Process
- K. q4 i2 @( [2 Q7 _ - .IF Music_Clear_Addr \5 t9 e% a% u. u" P3 }( P
- JSR Music_Clear_Addr$ a! l: R- Z- }
- RTS$ x0 Q @5 s5 ~- N7 e
- .ELSE {8 k5 b7 j; `0 C7 d; G0 M/ T5 I1 ~
- LDA #$1F
6 A& u% L; ]' b6 \+ ` - STA $4015
( A$ J1 Q5 ^. W' U+ X# b S - LDA #$00+ N- L6 \. A& g- I
- STA $4010- V2 u ]% I* p$ H
- LDX #$009 Q/ c# s# n) y+ J- s5 |
- LDA #$00
. N9 h5 A; v& I, w* F/ f - / U# L& H- ?! S+ [3 W0 [1 U3 y5 B& V
- .Music_Clear_Zreo_Page_0" \" t2 Q! K' l' A
- STA $00,X. o# }. _1 ~% F \
- INX
/ l8 A9 o. j4 Q9 g% `* R - CPX #Use_Zero_Page_Begin5 v' }4 z, W* v3 A4 B2 u8 i
- BCC .Music_Clear_Zreo_Page_0) k% V& F& K4 c4 N7 m
- 0 L: \7 _/ j, }- j3 B5 r
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
5 i2 D7 F9 O0 x$ E' N, g - .Music_Clear_Zreo_Page_1! \9 e) y# X2 w! ^1 H7 w( O
- STA $00,X
1 {2 l V$ c+ G }* ?: x/ ? - INX
; |4 u9 C: l2 a - BNE .Music_Clear_Zreo_Page_1
! w0 }# R2 {% f. e2 C' n5 [ -
- P' I' _; s% p% S) D# v7 s - Music_Clear_Process_1/ Z( _/ Q* V: l3 R) r4 }9 r/ a
- STA $0600,X
% N% I' k) E+ Q4 U2 f - STA $0700,X
) |( |' b/ n& N- f5 q! ~( Z8 n - INX
3 C3 V, Q* d! {( S6 Q) `" R - BNE Music_Clear_Process_1% p8 q7 }4 F7 j$ G" a* y8 E& i
- LDA #$10$ _8 C% J+ N0 ^, ~
- STA $4000" G6 W& A# ^2 q x' h/ J
- STA $4004' Q( o: D; ~3 N( V8 z: `5 V
- STA $400C# @, u' R1 C; q& l m1 K
- LDA #$00
- s2 a1 G# q* F2 q9 {# k* p - STA $40080 Y# O/ b5 m' d2 h, m
- LDA #$0F/ u4 h* Q$ W7 o% Y+ X
- STA $4015
0 Z3 z/ ?/ \2 z4 `/ V2 F5 ^" }- T5 ` - .ENDIF/ V7 g% l. z& I/ U1 `6 j
-
4 b8 |' y: j; A# F - RTS
6 o) E y: Q' q
& c, f: b, b4 g9 N1 K4 r/ p, P: I: a w- ;======================================================================
4 D6 H. y. |) w, x( P - ;重启处理
' ^3 ]4 B' b; m( Z. V - Reset_Program( [9 z) `) H$ s2 o$ z* O$ X2 |) h
- SEI) |- T, |$ X4 f/ @ t3 h' }8 D
- CLD
5 a+ }7 a V$ \$ _" e, `; T9 @ - LDA #$00' }. s) ]3 u" d0 `% T
- STA PPU_CTRL! o3 Y- n" ~& [% I
- STA PPU_MASK
- O3 ?. w" \' L - STA JOY2_FRAME
- P7 b' t. n0 {9 }, V7 B - STA APU_STATUS' W6 I0 d% ~$ ~" g2 f5 k. ?
-
, c" @9 j$ T* V9 H B8 D - ;等待屏幕准备完毕) H# O4 g+ t7 e
- LDX #$028 Q* J" R. A, {5 ?6 ^ ]/ [
- .Wait_For_Screen_Ready" R5 }# u5 m" G% F$ V4 S' `8 L
- LDA PPU_STATUS
4 V8 B) V. h% K: D% K1 P - BPL .Wait_For_Screen_Ready
3 M/ q$ i: G+ u Q - DEX8 ` I3 M- b0 E4 Q$ z
- BNE .Wait_For_Screen_Ready
8 Y- {. H+ ]& i - 3 T$ t$ ]! `6 `0 R' |( S
- ;清空调色板
4 n$ D, T. y. p( N2 y - Palette_Clear
: d. f- d# ~4 R" s; ]+ h$ @+ C$ e - LDA #$3F9 ~( e2 h! `" _# k
- STA PPU_ADDRESS
1 L& F) d; `9 n' ? - LDA #$00
$ K' l8 `/ b) k. L - STA PPU_ADDRESS" |! U$ L: B2 o) \: ~
- LDX #$20
& |" g' ]" ~$ _4 F - LDA #$0F
0 |2 {# r* \) B0 Y7 w - .Write_Data
- g' |1 E% Q a5 [5 v0 C - STA PPU_DATA
! p/ L& ^& I) B - DEX
4 v1 j& R; s! v8 ^) K$ z( c2 |7 I9 B - BNE .Write_Data
S# T: Y% x. J- v6 x2 _' c( u - 4 G! e! E# o" P8 V- ?( f
- ;清除声音 $4000-4013
9 T w: u) J; s; M' E" u* t9 X - LDY #$14
' L# ?, t) E" f2 M$ _: e0 {$ n - LDX #$00- [ k- M( C- ]
- .Sound_Clear# K- l& _, h, b+ s# z: S5 J2 N ]
- STA $4000,X
+ Z0 s& {/ u8 [5 z4 T R- S - INX
* e9 g5 c8 v3 t& h- Y- Q - DEY
" W$ z$ ?7 v9 j# ]8 P4 B - BNE .Sound_Clear
5 d5 i+ g1 x5 D6 ` -
. d* o* @9 p* _9 M2 q3 c8 V - ;清除 RAM $0000-07FF
, T+ S4 ~- U- X' O+ y. s - LDA #$00% s4 c) u1 W" ?( Y. V) D
- STA $00
3 d9 G$ c, T9 B5 R# X) p+ w2 {! o - STA $01
' q' Z/ G5 u, O1 g - TAY. l! L0 N( V; M, w7 G4 M8 @
- LDX #$08$ ]+ d' g: ]% M. ~! \
- .Memory_Clear3 f% _. g0 q1 B) c/ N e; u
- STA [$00],Y d0 ]# |) O6 U: z8 c
- INY& r0 q: g+ J4 }9 S% L
- BNE .Memory_Clear8 Z& q: r9 ?$ S' G; t9 [7 J/ X
- INC $019 L* O. l+ d- s" `/ O% n
- DEX
5 f8 i! V' S- V& ~; I% v0 o - BNE .Memory_Clear' S% n& F1 S* U& i( I! Z+ b9 |. X% P$ O& C
- 6 ?* {' i. x+ I" c) l$ l- u
- ;精灵缓冲初始化
; H3 K9 E! a( ?% X+ W% o - LDX #$00
- k' @8 W: `7 A3 a) B6 m! I @ - LDA #$F8
; H" J+ h7 S. f' w - .OAM_Clear6 b1 u) L6 g( W
- STA OAM_DMA_Buffer,X; a, X' \ P$ V: B! V
- INX
1 A. ~. S, _9 C4 @0 K* z - BNE .OAM_Clear
7 T v. G% i- V( Q0 g7 ~$ V+ s - 9 ~; w! I i, f
- ;栈指针初始化
8 R4 W% p2 h d+ L3 z5 R# f - LDX #$FF
9 k* }1 G5 Q* p$ d a& `( r9 n - TXS) C; r/ L; ]* F4 ?+ r4 y
-
5 s; Q/ N* A3 i" W. c3 b- e - JSR Nametable_Clear;命名表清空" N& a: w5 O8 p) T7 W2 I
- JSR Palette_Init;初始化调色板缓冲1 V4 x# k+ Y4 A; U, u* ~
- JSR Static_Text_Init;初始化静态文本; [6 ]2 @: i) }, S: H) l. m/ w
-
2 K' }: K7 } ^5 }7 A7 h - LDA #MUSIC_ITEM_TOTAL - 1
; ?, ^: t W5 f5 l - STA FC_Music_Max_Index
$ ] ^8 L1 ~3 \5 J: ]# \ -
8 e. b5 b" z4 x3 a( z6 ]6 J5 f* Y - LDA #$1F
- k f$ G) D) g9 A$ r4 Q - STA APU_STATUS m8 K4 k3 g1 V
- LDA #MUSIC_BGM - 1
3 Y r4 }: j* \: E3 I - STA FC_Music_Index
% ^* g& h8 p8 t' C. X - JSR Music_Init_Process;音乐播放
R8 U) B6 s, ]/ |: i -
( L% R7 {) j6 k1 r, ? - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
( |3 k5 ~, t. [3 Z C4 M% E) m- d - LDA #$1E# G# t7 t" P. c$ B. j' z$ L
- STA FC_PPU_Mask_Buf
1 F' p2 e( K3 f" I; B - ) T2 o* O; N5 w! `2 k
- ;启用NMI处理' S5 T- _0 I( E. d4 ^2 H* h
- LDA #$80( P9 O! \, m! ?2 {5 p% C
- STA PPU_CTRL
* C' F- |* ^0 k( y! t) x - 1 G; H6 _9 Q: Y& M
- ;程序循环, 剩余工作交给 NMI 中断处理
1 S4 V) m7 O" \% ?% r - .Loop! D! \+ ?8 X7 a4 X
- JMP .Loop$ [- l, r9 z* N; B5 F% V/ D3 K
" v6 @6 a# j$ M/ U* z5 X9 p, u- ;======================================================================8 ?$ p! J+ Y( I) t
- ;不可屏蔽中断处理0 K1 G3 O' q& _
- Nmi_Program+ K+ c6 r3 T9 n. j
- PHA: ?' h- F- j; }! X3 p. Q) _
- TXA
5 ?) w3 [) B. H* ]# H7 M1 S - PHA) c+ P! W" @5 [
- TYA2 ^8 T! H' s5 q- ]+ Y
- PHA" y$ `- L: l# Y; g
-
" f: e" V: L O) g$ r) `- `# U n - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
+ U* e( j+ x3 p Z# f2 T - & G5 b. Z0 h& z# i0 C+ d$ ^
- JSR FC_PPU_Procrss;PPU处理
, V+ L P5 }/ X s+ }# e& ?! _ -
8 `* H9 M7 Q/ G- N O7 @7 ] - ;精灵内存更新; w4 r% w4 s; i8 m/ D& e
- LDA #$00% ^ ^$ j+ r4 K! O o
- STA PPU_OAM_ADDR$ ?. y5 Q0 U" O$ s9 n( e
- LDA #OAM_DMA_Buffer / $0100
# ]$ f2 W9 u$ p5 C* h+ { - STA OAM_DMA0 H c- o7 C; X+ P$ N
-
* Z* q/ x# O: i- g8 k& X a5 V - JSR FC_Gamepad_Process;手柄输入处理
8 s' m( d2 R; t1 H; l p - JSR Music_Select_Process;音乐选曲处理 c5 }0 ^# d8 M4 F0 I
- JSR Music_Play_Process;音乐播放处理+ t! \5 D) U0 n' |: E
- 5 i" g x2 T( h. n9 ^
- PLA7 r7 K$ O" y5 K6 ~4 \
- TAY
$ U! q! e. C( U - PLA
0 C6 _4 y0 R; h) A% F - TAX! A8 F* p$ H3 f* J$ N' H
- PLA
2 J# t4 c/ u1 Z% O$ i
$ V# t( P U3 M; g6 j- RTI, [) t" x2 ^9 z; A
- & n. v2 T& [$ Q% l) x7 c8 }
- ;======================================================================
$ a) C; l; D/ \# s - ;请求中断处理
8 R( ]& G/ ~, J8 E2 S6 m - Irq_Program
- q# J* V- w( e; g' o$ J& ]4 v0 g - RTI: [* w. b; v7 \6 A/ Q' _' u* c
A, u7 ]4 R& d- U: J- ;======================================================================
% _: k4 P; g/ |: W* W! B# C - ;中断向量表5 ~& [% S' U6 b) o
- .ORG $FFFA" x% c6 }4 K: o/ I2 R4 Q
- .DW Nmi_Program ;NMI触发时执行9 ^7 V7 c* W! Q9 ~( L
- .DW Reset_Program ;载入ROM时最先执行2 c- D* e: F( p) k& m: ]
- .DW Irq_Program ;IRQ触发时执行
4 V) T1 k$ h2 ^7 E: U5 {. T8 E
复制代码
# L- s+ p9 p2 ?( R: K- L) u) W) p/ ~# N a+ l
7 A8 n& {4 L' {- p/ t# }$ Whttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|