|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
8 T# o2 r4 z' ?' ]; j 8 d8 f5 [3 x$ z% C) Z0 V! I/ i( ?
以下是主框架代码:0 z; G: m, Q5 _
- ;====================================================================== C$ n7 A& Z5 w2 W" y& y
- ;文件头
( N$ i7 d) \% q6 k - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量8 v6 D7 V* Y; y4 j/ I
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
& d0 n) _( n' A2 s! _1 w - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码9 f% | m& c0 C( `9 ?
- ;======================================================================
2 T! o: l. ]5 A/ v6 T - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
9 c$ V; e, u" P - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1; o( h& I# ?$ |. `6 ]
- ;======================================================================
# G& o8 E3 R6 Q6 s6 W - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
# m& p$ [3 X3 j$ V- r i1 o5 A - RESET_ADDR = $E000 ;主程序起始地址& v2 B) d+ ]: ?8 S- B
- ;======================================================================
# s& Q5 ?: d& D. e& ]" z/ J$ \. w5 @ - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB2 \. S/ m4 l1 a! G
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
. U" Q+ R% O7 k' ~ - .INESMAP 4 ;Mapper号 (0-4095)
9 g8 [9 b4 N1 ^ q5 }5 {" h - .INESSUBMAP 0 ;子Mapper号 (0-15)
7 v. K% s8 u; P$ \1 N0 r - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)6 a. G5 H7 D- Z2 r/ t8 B5 \
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)" Y2 H- ]: ~; S- n& h
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
+ B: r G. L4 G$ R8 c - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
4 v: A+ L- G7 B, Z; [5 |6 v' ] - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)1 Z' S: d* h: k; X+ j! m4 H
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
5 y+ o" ^% f: u6 d( m - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
" x5 Z/ n5 P( l- B+ z( q: V" k - ;======================================================================2 S6 o( Z+ o+ L& j
- .INCLUDE "fc_demo_config.asm" ;全局配置
$ K3 W5 U2 s* {. O/ @; @+ v3 o- B - .INCLUDE "fc_demo_constant.asm" ;NES常量
5 \7 M6 g2 I+ A7 x& `- z# b0 a - ;======================================================================
- M/ j4 ~& k" C* N$ i2 h - ;音乐配置
1 ]2 s- }: u, h. V - .IF 0 = MUSIC_THEME $ t6 _5 S9 V; B0 F& T$ C7 p
- .INCLUDE "data/music/Gremlin 2/config.asm"7 Y4 |, S) x% A5 ?- w1 O3 k I
- .ENDIF
5 \( D2 c3 s7 L1 x- M -
4 I7 g& L- L7 U4 b" | - .IF 1 = MUSIC_THEME
0 U6 P6 }$ c+ K: ^% t7 S- \! z - .INCLUDE "data/music/Raf World/config.asm"1 P! b+ F0 ]: \! D* s2 B
- .ENDIF
/ e5 o5 @3 C1 o' O - & {# a, u3 {. g
- .IF 2 = MUSIC_THEME
9 o+ T _- C7 s - .INCLUDE "data/music/Ninja Gaiden 3/config.asm": a9 q, R4 ^0 u% ^# ~ W) H) O2 R
- .ENDIF
) T& y) \( q' d# H3 R1 ^ - , V: ?6 x( N0 [2 H6 ~
- ;======================================================================
y$ O4 k, q: O; k+ c$ N% J - ;引用CHR图像数据1 M% X* T% }' j. x4 E/ X: ]
- .BANK NES_16KB_PRG_SIZE * 2 n% Q8 |9 n. a1 z
- .ORG $0000
+ b Q" A- R: h4 g! E' B0 p. M; G - .INCBIN "data/bkg.chr"
( E% i- |) J; M; [: z1 g9 X - .INCBIN "data/sp.chr"
$ @0 \; x4 J! r - / |0 n! B! `& J+ N
- ;======================================================================5 s# f! N ]# c, \
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
5 V0 Z6 o% D/ F4 X0 J/ ?0 H. L' o2 T - .ORG RESET_ADDR
1 X# H8 L# P2 M% Z - ;======================================================================4 e+ n+ n0 ^7 w# c
- ;引用其他源文件
) k$ \( |2 A) z! M% X - .INCLUDE "fc_demo_ppu.asm" ;PPU处理; @ B! b/ k: V0 j: p0 _' [
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
- _2 [) A1 v# c: a; a4 Q - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
5 A5 Y* @2 }$ [5 k/ X4 b - ;======================================================================
! [, Z7 O4 c9 l/ h, F - q+ y8 O1 a& G V% ?
- ;======================================================================
6 O, h3 Z3 @/ y& p- r A - ;等待VBlank到来
1 {5 ]) V# a, a' O* P - Wait_For_VBlank- A. ^& B$ k; @1 s) v2 x+ w
- LDA PPU_STATUS! z; ~7 p1 {9 N2 z0 ]
- BPL Wait_For_VBlank
% J8 ` }# g) B4 w9 W - RTS
2 q" O$ S$ @$ j- p3 v, q
3 V& B- K% g% h- Q9 L; m- ;======================================================================. }' B( c3 t$ f/ P0 M5 e
- ;调色板初始化
: h" p+ e2 B" @* w+ r( B - Palette_Init
( \8 p1 q" V7 U$ G. ^ - LDA #$3F4 {( n5 L- f2 J# D! p& V+ n! O, H9 M
- STA PPU_ADDRESS4 O( p' V( B6 _% C
- LDA #$00
7 |+ S( }9 c/ K2 {1 G) P - STA PPU_ADDRESS# K/ I; K& ^) |' A* Q5 g
- LDX #$00. u7 Y! @: Y8 e4 s1 p2 P1 M. L; \
- LDY #$20, H' C9 }% n5 q6 I7 v
- .Write_Data- V0 a0 A" h( ~- t' F$ E
- LDA Palette_Data,X
4 G5 O8 f& {7 R$ v- \; W - STA FC_PPU_Pal_Addr,X* O) K" B& O6 b$ x( k; ^9 S
- INX
0 a- Y; ~$ A" E7 i- B - DEY
+ W1 Z3 S l/ T$ _3 w `: c* @0 g - BNE .Write_Data
0 ?. B" l- ^/ q; l* u7 Y; ]! D - .End7 T7 ^% r- @7 C& H8 U& b0 |+ [
- RTS
# z% _' l8 I: x; K2 m; N$ W- P - 2 ?5 u, G" R* u# k
- ;----------------------------------------
" y9 r) B% a% [, u - ;调色板数据5 Q. F. a- v6 y* ^9 ?, w
- Palette_Data
u+ z% \+ W4 H% g - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B, ~) b' k- B3 Y) d% @. ]2 ~' b% d
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 227 K/ @9 k, R# r) @7 b6 `8 v
-
- c' Z ^8 @5 a% K7 O! r - ;======================================================================5 Q! Q5 _ H# G$ m
- ;命名表清空& e8 D3 j. o, ], _8 v- _
- Nametable_Clear7 o6 g6 I) W/ J$ c- r3 D
- LDA #$20! R. w9 C$ V }9 L$ ?
- STA PPU_ADDRESS+ E7 d: S- F, K. U; B' k/ B
- LDA #$00
+ ?# h4 a! H" i* y% d* p2 F - STA PPU_ADDRESS$ [7 U; _, b- n" E7 D3 {; a
- LDA #$00
5 u2 {: I' }" w! [4 j) }0 B# Z9 b - LDX #$00: Y' E; C, U- J& [4 h$ l1 y1 o
- LDY #$08/ X w) {) {; k: O' r* [
- .Write_Data
' x! c( N a9 t7 S& u - STA PPU_DATA2 o# P4 d# e/ G0 s
- INX
1 ~3 P- n* A: j7 p - BNE .Write_Data' W% r. |; ?. i( H- q5 Q+ ^* X
- DEY9 u( r7 A s0 _2 B
- BNE .Write_Data/ e% m1 o9 B; {$ ?% @% h
- .End
- o6 L$ h7 d8 ^' K! g8 g% X6 v - RTS
% |6 c+ s, K+ d+ X# Y6 s
# ]* ?8 g, g9 ^4 ^+ x ?: @) z+ i- ;======================================================================
7 F; J- v8 O3 Y/ t+ F8 k6 a; Q - ;音乐曲目切换
9 _0 |, Z% [+ C5 U4 \) s$ d8 R' u' r - Music_Select_Process; I: X* o. ]8 f7 u2 g2 D, h' I! a
- 1 v; i3 p* N7 j3 _& L& `" M( M. W
- .Pre_Music;上一曲
' n2 T9 |* E/ ^3 Z6 p* B# ~# ` - LDA FC_Gamepad_Once$ o7 B0 u/ g' f% s" E
- CMP #JOY_KEY_LEFT7 B$ R# `0 Q F+ w7 B: g
- BNE .Next_Music3 J: Y' E7 m" c3 Y3 R
- JSR Music_Play_Pre
; R9 \ F5 A& N. c% B9 W - .Next_Music;下一曲2 H4 i' O6 N5 h
- LDA FC_Gamepad_Once
" O! G y* Y( r3 d" _# j' ` - CMP #JOY_KEY_RIGHT1 }, o% J! i4 D# |' b
- BNE .Next_10_Music1 E3 B# \( p. ~: E6 w1 O4 N
- JSR Music_Play_Next9 ~/ q5 Z; ?/ j3 {( m
- .Next_10_Music;上10曲
$ w+ T+ u. p* t - LDA FC_Gamepad_Once
! Y7 b: t6 P) n3 {6 o2 X; B - CMP #JOY_KEY_UP
6 ^7 ]" v+ B# L2 w - BNE .Pre_10_Music
' B% |" `! i2 ?* c- m( p - JSR Music_Play_Next_10. R: d9 f( U& E6 x
- .Pre_10_Music;下10曲
. S* j( h7 m3 Q' N* i* n - LDA FC_Gamepad_Once
- S+ b) B7 p. l - CMP #JOY_KEY_DOWN, v/ |" G* X3 V4 ?7 j
- BNE .Reset9 }* I+ p" _" A" i0 g! i
- JSR Music_Play_Pre_105 N/ s9 U: c) y, {9 I
- .Reset;重播当前曲目
9 C$ x8 n6 t1 [2 S! P - LDA FC_Gamepad_Once
) X. W5 f K* v/ T' P5 Y - CMP #JOY_KEY_START
( R- `$ a" T9 X& z ] - BNE .End: n% F* {/ h! V" [% q0 |9 j
- LDA FC_Music_Index" e6 T N5 P8 e5 X3 m
- JSR Music_Init_Process
# J" |. `/ r7 r+ j! M% ^7 K - .End
) e/ v; t2 Q4 I1 X! g) w - RTS6 W6 U$ D! q9 u1 U
8 b5 p; b+ M. F8 D9 D- ;----------------------------------------------------------------------
2 j) R3 k5 N- e - ;播放上一曲
: p0 r+ u- ?( k - Music_Play_Pre
+ U1 {4 U& o" ~6 H - LDA FC_Music_Index
5 g' V3 I7 x% R% Q* o6 r" g - BEQ .End
$ y7 ?: N. L) P; G' g2 w* x - DEC FC_Music_Index0 H1 W$ P: ^& c8 E
- LDA FC_Music_Index
; j, Z( c/ p6 `! b; J4 o9 E - JSR Music_Init_Process
- k% l6 P9 R7 s- Q - .End
3 w6 c0 Y8 p5 K# a - RTS+ m& ?7 V1 n* |* _3 d( u
- ;----------------------------------------------------------------------" Q% @; _& e) E5 B
- ;播放下一曲: U3 v. B3 c- S& g/ J/ p
- Music_Play_Next
; v0 l# d; g4 R; L d! G4 k0 m - LDA FC_Music_Index2 k$ i# \6 r* W1 W; ^9 t7 B& z
- CMP FC_Music_Max_Index1 c& `2 {& z' G1 |# a: Z) u
- BCS .End" o, |( r* E; e% Q5 E3 Y
- INC FC_Music_Index; [4 f9 c( ~: C
- LDA FC_Music_Index& P6 G" Q2 O7 D- J4 Y8 [
- JSR Music_Init_Process: H5 m$ u, r+ X) C& j
- .End
: M" w! x! l6 U; ]6 Q8 H - RTS6 j9 X4 Q& W6 [! m1 X
# C8 @3 L$ A2 P) E; O2 A' L- ;----------------------------------------------------------------------
: [; r6 K( o; l$ C4 t3 w* \ - ;播放上10曲* j# @4 t0 A4 R3 L
- Music_Play_Pre_10+ d% K7 C; E; T2 Q
- LDA FC_Music_Index- G5 J5 [$ i! e
- BEQ .End
* f" K- J! [9 f" \2 M Y) ^/ Z - SEC
: ]/ i. V2 X5 e' Y - SBC #10$ y/ |+ v) e: M7 s
- BCS .Pre_102 d9 b, I! G+ X# I, y% a
- LDA #$00
. V7 v& U6 H* k9 H, b - .Pre_10; c/ D. R. _4 z! g: ^0 T. D i: W
- STA FC_Music_Index: y. b7 S' n/ h5 o/ Q* {( G& h
- JSR Music_Init_Process
" }6 a, P' ]: g3 { - .End
! o: y0 p: j6 t8 X - RTS. z w4 T9 T4 r8 T: q V
- ;----------------------------------------------------------------------
- X6 `9 {9 E3 k5 E1 D5 T% a - ;播放下10曲
9 a' K# B/ t8 f) X# V& ? - Music_Play_Next_10
" V5 W' b. D S% i - LDA FC_Music_Index8 }2 M4 g" ?0 @" U
- CMP FC_Music_Max_Index
2 l( P: ?5 z+ Y8 ]; e* W: u: r - BCS .End% ?2 F% @; L7 D7 Y/ w
- CLC
8 O5 N: O! l ` - ADC #10
1 [9 i6 q3 k/ X8 R& K! K% Y - CMP FC_Music_Max_Index) X% P2 X E9 D; c' H) M
- BCC .Next_10
: v! f$ B4 j+ K Z0 X& u - LDA FC_Music_Max_Index( h# T% ]5 p" N5 L/ R7 C
- .Next_10
: G1 ]( N. y4 L [& m$ Q, y - STA FC_Music_Index. X' O) k% i1 A
- JSR Music_Init_Process2 U* [9 F+ r5 m, T, E: |
- .End3 C3 A2 g. T+ b+ R
- RTS
, U, P6 |+ H6 N; I - . Y! s! T; B+ B0 N0 Q
- ;----------------------------------------------------------------------
$ g/ v4 Y4 y1 S& |- K - ;8位十六进制转3位十进制制6 A* {' O% p: Q* t6 a) \" L
- Hex8ToDec
5 s. P3 u2 N \- } - STA FC_Dec_Data_19 }$ r B: C. s- h0 ^
- LDA #$00
2 _8 `6 s- N/ [: |6 @3 _* h - STA FC_Dec_Data_100+ b( n1 l# I+ j
- STA FC_Dec_Data_10* A% Q. l$ \, q+ ^+ {3 E4 J. ?
- LDA FC_Dec_Data_1
; w( f6 d" Q% V9 h) i$ ~8 \7 Q - .Convert_1004 j- \8 J7 M; @/ Q
- CMP #100
; f( o4 H: A9 m# K: z9 B; u - BCC .Convert_10
# B8 {! h! D' p, e; @ - SEC- M+ S+ Y9 y# z: I6 |% u
- SBC #100
' j8 M! l/ U( q7 G( U0 y- { - INC FC_Dec_Data_100
, L6 S5 J) ?, Q$ Q+ Z) a: e) q - BNE .Convert_100# `1 q& R% j9 l
- .Convert_10
- E$ z/ S! Q; e/ e9 U2 F - CMP #10
6 y1 y/ F/ O9 k - BCC .End
. \: H& j: Y6 m9 {& P - SEC$ z% f ?3 ` |5 u: W1 [4 N3 B
- SBC #10
1 `7 a5 {& z/ E" U. v7 | - INC FC_Dec_Data_10
1 ]- J$ z. D/ \) W" g& E2 ^ - BNE .Convert_10
3 X' a% P! M* \$ L4 O7 B& K - .End2 I) Y, P1 Q2 k, M
- STA FC_Dec_Data_16 h9 M% f" ^3 V* J
- RTS2 H" f# E6 S9 `: a* G0 q- @
- ) q, z! {+ P+ m2 |* i
- ;----------------------------------------------------------------------
( J0 I; C. N& v# [) g P - ;显示曲目信息* X4 k3 L# j3 s% W. Y
- Music_Info_Display
' _8 q1 c2 C' G- T9 _) o - LDX FC_PPU_Buf_Count
& Q% o2 ^4 h4 F8 M1 t1 H - LDA #PPU_WRITE_MODE_CNT_LINE
$ _: v& c6 f/ k6 t - STA Use_PPU_Buffer,X
* `2 ^0 k m2 f - INX
9 Q: q9 t+ `, h# H1 o" t; J - , J' a4 S, W" X+ d
- LDA #>MUSIC_INFO_POS
- i8 I8 e: p" A4 w$ A! n! c( h9 ^ - STA Use_PPU_Buffer,X) _, y* K0 _8 I. y
- INX
( V" \9 _: I, v2 @: d% z1 v - ( d( ]0 K6 z- J1 U( L
- ;居中
& x2 H4 j( x) _- f - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2- m3 y1 N$ M; t( Y8 v6 j" I
- STA Use_PPU_Buffer,X
7 x7 R; z# D4 G9 _& M; h+ _ - INX6 z w- L- _' A! t
- 3 Q& o; S8 \; O6 c+ |) c
- LDA #$05' p2 H/ `) b$ q" r3 [& e
- STA Use_PPU_Buffer,X! _8 X( D) g( q8 H1 D3 {
- INX
0 y9 V4 c( [: G6 d* { -
! p9 ^6 t* `( `' c - LDA FC_Music_Index" }0 W+ Q" A: @0 Y6 v/ G
- CLC
' W. }5 }/ m. I& ^9 g, L8 W! p - ADC #$01+ e T+ P) q0 d0 b& a: e7 \
- JSR Hex8ToDec" B7 P$ ?. ^) \& S+ [
- ! F- W m! R- S O9 T( j0 Y
- LDA FC_Dec_Data_10
. J5 a9 P5 `) C& l; t3 A - CLC
. K9 y; S, g) k( I. W. U/ q - ADC #'0'( C- u8 W" c; [! S0 m% {
- STA Use_PPU_Buffer,X7 x3 h* \/ ~( w" W- E
- INX
3 V- e0 J* a, w -
. a$ j5 X( m. a$ M; L2 f - LDA FC_Dec_Data_1
0 G# F; [/ q) M* D; F - CLC
, B! @/ I4 z" Z1 e- C - ADC #'0') Q1 {0 H3 j+ {' t! _
- STA Use_PPU_Buffer,X
) F. V( _. A, S+ O$ B [# a - INX0 _( m1 a# Z+ e
-
3 H( w5 U: ] f( Z! B - LDA #'/'
; R& L) s( ?% j: Q2 `3 z! a - STA Use_PPU_Buffer,X
0 o' e9 Q% V5 s - INX
" U8 |( k% w6 R! ]- R - $ m- w6 r5 {9 j. s
- LDA FC_Music_Max_Index
/ |. E3 M. L+ Z% A! G' e - CLC" } t! _/ O" o3 o. D
- ADC #$01- s* k4 i. ~' s% V. ~8 d
- JSR Hex8ToDec
7 B4 d4 P# s! t" g- o# Y$ d8 O - 6 u9 |/ n" L# K) B, }
- LDA FC_Dec_Data_10
% Y7 v. A8 E. c' ]5 s! r - CLC' b" ?) m$ i- Q
- ADC #'0'5 \" p! S( z" t! d3 N9 o
- STA Use_PPU_Buffer,X
9 z* M6 l: |( B j; H2 ?- v - INX& |. _7 L8 O/ K2 S( Z
-
; Q6 N) z, ]% R, F1 W( W+ `& J; ^! }1 [ - LDA FC_Dec_Data_1, O, U! B, R/ j! ^. K! A
- CLC1 n: X6 R1 T% ~( ^3 V! k5 A, N! @+ O
- ADC #'0'7 i% u, ^! {3 U. T$ C, N0 f
- STA Use_PPU_Buffer,X0 |% K5 q8 Y. _: e. d7 e
- INX K5 F6 [2 h' i; x& D7 B' B- `6 t
- 7 G/ F) C( K6 j5 W# Z3 B- f3 T
- .End
. ^) ~; ^0 q0 k - STX FC_PPU_Buf_Count
: c1 M1 P8 K* ^# a6 ? - RTS/ u3 }$ e" A6 q! M
- 9 v' J& z) H0 d, B: g) h9 V
- ;----------------------------------------------------------------------0 M& R, D3 d; m) _0 {8 d
- ;音乐曲目初始化处理
& [# L6 y P6 j1 ?) e - Music_Init_Process
# S' W+ f" N1 J - PHA
( o1 m4 R; n6 t W0 @ - JSR Music_Clear_Process
( L0 C- R! L0 L& u# _# @ - LDA #$1F/ z4 U' D7 b. r0 @/ I! A
- STA $4015
, t2 ]. J5 ^6 C4 Q - PLA
& Y; w0 a. `* \9 ]3 L, L* c - JSR Music_Init_Addr* [2 H& l# `1 T# E
- JSR Music_Info_Display
, B" X1 w$ t: G2 w" Q - RTS! ^, C7 t# N0 C) @% g" ~
- 1 u9 R1 {* N9 Z: I
- ;----------------------------------------------------------------------$ x1 ]7 d3 n" k- o
- ;音乐播放处理
0 i' T, n7 }0 ` - Music_Play_Process0 i! Q( n# {* h8 s! K3 z" ^2 V
- JSR Music_Play_Addr
' q) W, K ~/ A1 s! W# E) P - RTS5 T$ E6 C1 s n% U
- ( y& t l, }) v, o5 @2 d3 R, b# }
- ;----------------------------------------------------------------------
* b# d, }( B2 Z! h/ B5 F4 m - ;音乐播放处理
1 E7 R4 H8 L W3 S$ V - Music_Clear_Process" o, g# {. w6 `4 ]1 R
- .IF Music_Clear_Addr
+ _, p% w7 {; V( _ - JSR Music_Clear_Addr
& a' {+ S2 e& h - RTS
/ W$ y! d6 G/ b% Z - .ELSE
/ c( Z2 y) d2 U+ \* O3 U - LDA #$1F# p7 {. K/ q" C) }" {
- STA $4015* f, }5 H# P7 s! n+ l, m0 }1 U
- LDA #$00% m3 \9 z- v6 P" H& g2 z! |
- STA $4010+ F0 c/ _3 r; P6 ~1 ?
- LDX #$00- k! J* l- f' x
- LDA #$00
: S, P% V1 z1 k8 A3 I - ( a* L/ B: r/ s5 w+ l
- .Music_Clear_Zreo_Page_02 O5 c4 }# O6 A+ \7 |+ }* D) b
- STA $00,X. u/ }4 p) O* Y. U
- INX6 e6 R# x8 r8 `: g. w$ z
- CPX #Use_Zero_Page_Begin
9 T( o4 p. v$ I' s9 H: z! M) ?8 W, j - BCC .Music_Clear_Zreo_Page_03 M7 V# R: |8 C) u3 O& \+ ~
- 4 E1 J$ }5 o- R/ m! C6 z
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
/ G) N/ x: ?: S5 j - .Music_Clear_Zreo_Page_1
3 U/ [7 z% |" I. {- u t - STA $00,X% C; K; J% W6 _% c1 ~) r. Y9 _
- INX" N& Y1 D- B" _. H, p- V+ g/ v
- BNE .Music_Clear_Zreo_Page_1$ F. t6 p& M$ ]: a2 Z
- ; P+ ^# U' d8 z6 Q4 k* O
- Music_Clear_Process_15 U0 [: n+ R2 k8 v
- STA $0600,X
' p5 }) d/ F5 z2 z- ]3 k: W - STA $0700,X
7 O, @" b* K& h, @; W: ^0 r - INX
- w8 S& `- d- U) y+ A+ I' ~8 h2 i$ h3 H - BNE Music_Clear_Process_1
0 o3 a9 x% o n' | W9 [ | - LDA #$10
6 _6 Q* M; l7 r5 D) E% E - STA $4000
' x8 H7 S9 J b0 ^8 ?7 R3 ?0 [# A - STA $4004
7 z4 [# e! Z+ c) \8 U - STA $400C' H- W4 k* m+ R
- LDA #$00: O$ [1 Y' |2 @: e
- STA $4008
) m8 I7 o( n! h3 e+ F3 z5 I) E - LDA #$0F
5 l) s) a2 \0 S8 ]2 Q7 ? - STA $4015
9 e7 J8 E* ], ]/ d# d% N7 M. @ - .ENDIF9 V8 U" I4 N7 l" d( h6 x% K
- : m9 P# t! o$ N3 N. A& B8 w& ~
- RTS: @! Y t! }) [5 z8 W& B
$ G; m4 e& F( k6 V& ? S- ;======================================================================
, p3 H2 ?$ J' b1 D - ;重启处理
6 s7 L' t/ D3 Z9 T+ o2 | - Reset_Program
5 k( b( F$ z- ]7 D4 Y6 @: d+ }9 N - SEI
1 E9 {& Z( P4 S - CLD$ ?! n3 B) U7 ` y0 C
- LDA #$00# @, {1 k( C) h( D
- STA PPU_CTRL! _! p: c- X* X! N+ q9 V
- STA PPU_MASK$ p5 K3 e) t2 X1 f* D
- STA JOY2_FRAME
# A6 Z ]# b2 {/ E& F3 Y, m/ R - STA APU_STATUS% j; \" r+ y+ O7 g: |% Y6 B* i( f
- 6 }. Z/ \% T+ A* `* o
- ;等待屏幕准备完毕
0 ~: x0 f$ B' b( T - LDX #$027 s N2 _" @% Z* e* v/ `
- .Wait_For_Screen_Ready
6 g$ f6 z7 D1 R" N - LDA PPU_STATUS" T( Q5 C% v# y I# z% g
- BPL .Wait_For_Screen_Ready$ B" J2 _9 Z1 V* a& n
- DEX) |( S' c% M. [' K" s$ n- ]: S' [
- BNE .Wait_For_Screen_Ready
3 }' H: N* @7 | -
! Q. B" A. T% g* \3 C; ? - ;清空调色板
) e. h( w9 t6 q - Palette_Clear
. x5 m7 R) u* j. d {) b( D - LDA #$3F
5 d; R! |# `7 J/ B; W R p - STA PPU_ADDRESS
5 ?; C- a+ a7 w, I1 s4 o8 Z4 L - LDA #$00
% L' q, e4 ~8 V7 z9 O3 M! o - STA PPU_ADDRESS
1 O9 q% ` g! C' f - LDX #$20
l3 B! j D2 j - LDA #$0F2 z0 m6 Y7 u: j' _8 w0 z
- .Write_Data* }9 \) Y6 G4 ^7 b
- STA PPU_DATA
& ?5 M, d; d% O7 R+ G - DEX
' [2 y8 i' ?5 w7 F. P" O - BNE .Write_Data) L; |( q, \/ g( I
- 7 {$ X. v% b/ f/ [' [
- ;清除声音 $4000-4013
) V/ U" w' `( Z6 ~ - LDY #$147 {, K6 u5 s, X; ^+ F* c' H. D
- LDX #$00
* ~6 Q4 K, i( R/ M: h6 E* ]& p - .Sound_Clear$ _" R" d' a, W# _# l
- STA $4000,X. I4 Y6 [' m) j
- INX
, B$ K+ r# O! J% @5 s1 j# Q - DEY
4 k2 S. F" i3 g/ ^* T) B s - BNE .Sound_Clear/ P! F7 A: D, H; R6 P7 n
- - Y4 ?8 |4 U! D2 g' l$ u* P
- ;清除 RAM $0000-07FF9 t- t, p+ L! Q6 P* a) i; |
- LDA #$00
5 P, z: \' `) P - STA $00
* L: j* h! A& `( g5 }* I - STA $01
! A2 H8 D" `, D& y& G4 } - TAY
1 b9 s. A% Q$ e) W j- @6 G! h - LDX #$086 Z; o% y: r2 Y
- .Memory_Clear7 ?8 |* O8 j0 O
- STA [$00],Y; [3 N( v q8 ?. q, [1 X8 |
- INY$ V# l* z p- ~ [# U: c
- BNE .Memory_Clear$ e- a. e) W" Q( }. O
- INC $01( d& }. _. n# P) V( P# U5 f
- DEX
{9 y" @# L3 e* D6 } - BNE .Memory_Clear9 _" B3 W4 t4 C
-
, N& @3 d; c- Z - ;精灵缓冲初始化1 c# I2 @% q2 X# ^
- LDX #$00
/ ^2 h6 V: j) N, g7 S; i - LDA #$F83 E% H- e. Z/ r' b% j: q/ p
- .OAM_Clear2 B- b9 N2 O1 i3 s3 J9 w: v8 A& {
- STA OAM_DMA_Buffer,X/ m( K, r2 p2 M
- INX1 {+ S2 M9 h' Y
- BNE .OAM_Clear
. k1 s6 W! s, h' l% [* p1 {, v -
; d, D6 N/ _+ l2 y( L! X) p" F5 { - ;栈指针初始化" o! h: v3 q1 K. N- H
- LDX #$FF" [% Z- B H5 f9 U
- TXS
" k3 ^, B( P9 u( q7 L- {* A/ Y: V - + x7 `; d8 C9 M! K
- JSR Nametable_Clear;命名表清空1 y# D1 ]$ q) |+ k) J
- JSR Palette_Init;初始化调色板缓冲( R; v9 C$ d) ~
- JSR Static_Text_Init;初始化静态文本
. G: f. C7 C* `3 V -
+ [3 y4 f- w! G& J$ T. H8 [ - LDA #MUSIC_ITEM_TOTAL - 1
& S9 D5 n. t( T( D - STA FC_Music_Max_Index
/ ^5 N& \5 U0 S' I/ M - ; S( a w7 m; Y9 ?) S
- LDA #$1F7 Y+ L# p: y) \. s
- STA APU_STATUS
# |/ K6 A0 R6 e - LDA #MUSIC_BGM - 1
0 R2 ~7 ^/ e9 j3 e. [$ b - STA FC_Music_Index
& y. J( d% O7 {/ T - JSR Music_Init_Process;音乐播放
: ~, S$ E9 L6 {& o" E -
6 r2 X% t, i( O) Z* u* g$ N - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)" A, p* [" M& A- z5 i
- LDA #$1E7 H, t0 ?+ V! n; k
- STA FC_PPU_Mask_Buf; h5 K: |4 ~" C* S, w. J/ g
-
5 r' L4 a& ~6 J A - ;启用NMI处理
7 T/ E& o. g# B9 t- H) ] - LDA #$80
8 s1 k7 T$ M, P; H: `0 m - STA PPU_CTRL' x5 n' g; F* o" l3 a2 B
-
& O, [1 ?% w% e/ V9 n - ;程序循环, 剩余工作交给 NMI 中断处理
0 b! z! E& v' r( l- E/ R - .Loop9 T4 w9 x2 t/ [& Y- p$ T. S, t. y1 Q
- JMP .Loop
& Z; w- O1 ?8 ^, J8 x1 b - $ V2 h% f$ ?7 V7 h
- ;======================================================================$ v, _/ d4 ~7 @
- ;不可屏蔽中断处理; z& k7 {+ s8 c) y8 m. b
- Nmi_Program. ^6 D+ r9 O/ y1 u7 z
- PHA
! Z' M' m2 A" N% h3 x% P - TXA8 S, w4 X/ _, S# i
- PHA& e$ E/ D4 h& ~2 Q9 a' Y. v# @
- TYA
' C! P) j9 F2 Q8 ] {; B6 c - PHA8 D- {" o; {. u& H5 |
-
# _3 W2 D, }9 |- ` - LDA PPU_STATUS;读取使得 PPU状态寄存器复位: L$ [" i8 ^$ N0 V! r. t' L
- 5 t2 ]1 a+ [( q- ^) `2 I, t
- JSR FC_PPU_Procrss;PPU处理
. F' ^* k; H/ S5 F -
) e8 P( n$ w" o4 p& L, r# ^8 r' |! U - ;精灵内存更新" p7 T5 D8 n# s8 W( X0 I
- LDA #$00* F+ a( M1 Q2 f$ H
- STA PPU_OAM_ADDR- o7 q4 n6 g# s- m# k) R8 H; r
- LDA #OAM_DMA_Buffer / $0100' p: `$ E7 e; R& ^2 d) N
- STA OAM_DMA( X' H% C0 E8 ^8 q8 ?, U
-
! H: K- s$ w/ q% Q' p3 ~+ S7 H# z e - JSR FC_Gamepad_Process;手柄输入处理6 O+ M9 |$ Y# w# z" a' k. s+ |" V9 {
- JSR Music_Select_Process;音乐选曲处理4 L6 S/ F" w9 R+ G& V+ [
- JSR Music_Play_Process;音乐播放处理2 v, E! \6 @- Q9 u
- " y& x6 Q5 K6 f" x6 l0 G1 q% a8 y
- PLA4 @7 j9 H% [- i
- TAY% ~1 ?9 n/ m3 F( g
- PLA
& G/ ~' l# A- t+ ? - TAX
+ _1 w! g" l: k. N - PLA% `' W; m1 g& A
4 j* I2 A( i& a6 X, p- RTI6 O: s& e7 a3 m( h) k* C0 l
5 C% P+ C/ Y( `% N- ;======================================================================
, U. W4 D& r/ H: ^ - ;请求中断处理
& d4 K* g" N% V- Y8 N" B - Irq_Program4 L: K+ k8 r: U! d. U+ n
- RTI
0 w0 K+ {7 q" P/ V$ o - 9 E! f% g2 G# I$ y7 F. q* A7 W
- ;======================================================================( x/ `/ @5 j. X
- ;中断向量表$ Y- c- e+ k; A0 {* A$ d& R
- .ORG $FFFA
2 u5 i7 ]% x# r. ` - .DW Nmi_Program ;NMI触发时执行
8 y+ {1 ]7 d/ i3 _0 N r# ^5 u - .DW Reset_Program ;载入ROM时最先执行9 M& p! }, l7 G( w2 K' R; m% @+ g
- .DW Irq_Program ;IRQ触发时执行6 o B, j5 _( d7 ~: q& c
复制代码
2 L% w5 Y1 {6 N5 @+ n( e( c+ e Q) [! B; Q1 Z( Z) n& M- e. B
) f5 \) h' L1 _0 W, | o2 |$ x
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|