|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
& E% i3 O# O2 U: q+ ? 5 t( @! G1 q. E* h# ?7 |0 V
以下是主框架代码:
" i+ p8 p3 }( g, }' Q- ;======================================================================" c4 S( \2 x) c& c- V
- ;文件头, s6 e% e7 n, G w" ]. R1 B2 O
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量; g9 b! @" G) q) S
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
0 H9 m/ Q, q+ H; O - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
0 u6 J+ u1 j ?3 v& }0 E - ;======================================================================; ?6 }" @2 [4 _/ x. Q- _* F" x r1 f3 ]
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
( o3 C9 y3 X' E% r- ` - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
( ~9 a3 T, V+ ?* j% o* f$ w - ;======================================================================6 ]; u$ ^9 X6 l8 P+ \
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
; g. p% r8 w; s4 J _ - RESET_ADDR = $E000 ;主程序起始地址
, c) H! X# [7 p - ;======================================================================2 B% ^) Z0 V* _6 Q h+ M" N
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
. O) ?' s0 m: _; L$ x- `5 M( i - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
$ ^! o0 `& S/ V: { - .INESMAP 4 ;Mapper号 (0-4095)
( |% p0 Z& e$ ]. m& f. z - .INESSUBMAP 0 ;子Mapper号 (0-15)
, S) r( C) @3 `. U- r9 G/ H - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏): Q/ }$ l7 W! ]
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)$ ]; G7 X3 E# e8 ]+ g. \0 \8 ^
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
' j6 `/ I; X8 b9 j+ n& s; ^ - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
) r) T8 C, B' p7 | - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
8 \7 l# m' K5 N - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)7 R$ @, A8 q$ } q7 y$ J* m
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)( i8 q% B) ?( e( s* ?+ I1 F
- ;======================================================================* z3 y1 b# [+ C, d
- .INCLUDE "fc_demo_config.asm" ;全局配置
8 t5 I% P, {2 ]" ] - .INCLUDE "fc_demo_constant.asm" ;NES常量
3 @+ V, R; ]! g: T: G- U - ;======================================================================
d, \- ]7 U& _& E - ;音乐配置
) v; f$ v, U% H, d8 K - .IF 0 = MUSIC_THEME
+ P* k' ]8 A0 U6 F - .INCLUDE "data/music/Gremlin 2/config.asm"
) W2 \+ M8 r/ _ - .ENDIF
9 g- Q- F" T1 z8 w+ y. ?+ F( P -
$ E4 Y& @, `# s; z( v* u( t - .IF 1 = MUSIC_THEME: {' q/ a" |) O9 I: V& @ R' M
- .INCLUDE "data/music/Raf World/config.asm"* N( x% A. _' q2 R% U4 d
- .ENDIF
3 W% a' C0 l. D1 z3 B8 ?; z5 G u - ! e* M2 v1 e9 x
- .IF 2 = MUSIC_THEME
/ ]2 D, [- |4 K7 W - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"7 u+ x! J) l& B
- .ENDIF
0 C9 t) h4 ~. D5 `# X
0 f+ m, g4 J/ \1 w# t- ;======================================================================
# H4 K5 C3 d' x* g i+ ^/ R - ;引用CHR图像数据
5 A2 [$ p# i/ S1 N% K - .BANK NES_16KB_PRG_SIZE * 20 r* O3 x* ^) g% Y
- .ORG $0000
* _7 d$ G* B4 {/ J( J - .INCBIN "data/bkg.chr"
7 _$ L" x, }2 {& I1 F - .INCBIN "data/sp.chr"4 _7 v& a4 w$ ~# Y* q
- 4 k7 f3 P$ ], O0 C5 P
- ;======================================================================: i/ z" J" x3 g, m/ k/ Q: H* @/ O
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
/ l f3 H5 L0 I8 ] - .ORG RESET_ADDR
- e, x0 X5 d- X* t1 {; a1 L - ;====================================================================== X5 R9 I2 b" W9 A# }2 h0 Z$ K
- ;引用其他源文件" w0 a9 t6 ?! _% J# j D$ t
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理/ }. X, ?7 A. x! @* t
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理1 p9 A/ r; |& `. u W
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理; T1 p1 M7 a# l) b8 }7 I6 o: y
- ;======================================================================7 V2 M. [/ g" n
- 9 C' c/ q* U7 a/ _" O$ ^
- ;======================================================================
5 {/ e! g3 M: K3 e4 K1 w - ;等待VBlank到来) N7 j- `. P- b4 u. b2 |
- Wait_For_VBlank7 x0 W$ _" X7 X2 o% v3 @
- LDA PPU_STATUS. r% m: m% v/ g. L! O
- BPL Wait_For_VBlank
8 z) r) g% n' d9 [- P* r/ s* I - RTS# Y/ ]2 R6 X7 X4 T: k" d7 W
- & b' C* d" `/ W' o2 _/ ]1 c
- ;======================================================================
# |" I, i8 G1 @* Y% z - ;调色板初始化
+ \0 b# I7 l1 g- P - Palette_Init/ d1 _+ C& V C
- LDA #$3F6 b, W, [+ n7 i% p: h; I' \1 r) ^1 C
- STA PPU_ADDRESS
& m* n: f. Y9 J5 T( R) F - LDA #$00
/ T0 \) S" P6 T: p- l2 ` - STA PPU_ADDRESS
. `5 H. R, s3 ^8 I7 z - LDX #$00" s. x" i- [4 [+ ?% x f
- LDY #$20
9 h: O( @4 z( ]. I9 Y/ |; V - .Write_Data
: H& y f. }# c2 Y- z; ~ - LDA Palette_Data,X
5 ~2 c3 v3 ^, u- M, N; F1 j - STA FC_PPU_Pal_Addr,X/ ?( _* H+ u! S" H2 m
- INX
- f6 i0 K5 _# b0 T* Q - DEY* R* U' l3 I& Z& V$ S
- BNE .Write_Data+ f9 `3 D/ Z2 V( F* \; a% F
- .End
' ]7 R* s! [2 `$ D* J - RTS
% Z0 `6 s- s% z% E. g - 4 n* g f3 z; f/ x) g+ e: k
- ;----------------------------------------& ?7 ~* I7 [; l" Q, k
- ;调色板数据2 Y$ H6 a; G2 m$ J# J
- Palette_Data; s7 J! x3 [3 n" E! N5 t& } z
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
4 s$ ?3 d9 c9 ]: k; R - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
9 h: L: W" r8 A8 z6 G: c( T - , ]' o9 s8 ~- K3 }0 N
- ;======================================================================; F- [3 @6 w, I; ]
- ;命名表清空
, q5 ~ p' R+ R6 Z8 p9 L# j- k - Nametable_Clear
/ b- ~/ q# u! `8 R: m - LDA #$203 w0 ]* c% D0 X
- STA PPU_ADDRESS( O( l1 N }, Q7 \3 O4 L
- LDA #$006 ]; j8 z( S% v
- STA PPU_ADDRESS
- O. K9 g# d# C3 I% ~3 U0 ^7 u - LDA #$003 _" J7 B. j; g; w7 W
- LDX #$00, {) Z9 H) J' _5 {& y: a9 x
- LDY #$08
/ P3 Y B' ?. X% g/ b - .Write_Data
% }. E4 V. L" E: A# ^; t - STA PPU_DATA% S1 j% Z3 k, f+ P
- INX
! M! O! w( w0 d6 S1 i; w* R! u - BNE .Write_Data- E" H" {1 v$ `5 m G
- DEY
6 l" p7 G; m) h$ B5 f8 B0 v1 K - BNE .Write_Data
" V9 N, E0 U3 S. N) j! f1 E" g3 @ - .End
L/ X1 v$ Q, z - RTS
* p( d% f5 x7 v( Q% I- {. b
) j8 O y* K$ ~; @ i$ A5 K+ u- ;======================================================================
, C& G( a$ @2 |4 ^, Q5 O1 m( r$ Q - ;音乐曲目切换% |: X' N1 F0 `$ c# j/ f9 x
- Music_Select_Process
7 F/ E* Z; D, t
0 u4 w5 ?1 q! S- `( y6 ?- .Pre_Music;上一曲5 P# I+ M" ?- J) x
- LDA FC_Gamepad_Once
) `0 N0 l" _! [& |( ^5 l% G w - CMP #JOY_KEY_LEFT+ e" y! o j5 Q$ q
- BNE .Next_Music
- |0 I7 `, I+ S0 I - JSR Music_Play_Pre
4 w+ D( W) h: J5 F - .Next_Music;下一曲
. X5 v$ x- W% b- {8 w0 `5 u1 E - LDA FC_Gamepad_Once/ M: d- S, ?, V" z
- CMP #JOY_KEY_RIGHT
% i1 @# W' `: j0 W1 k( f - BNE .Next_10_Music
" _0 P7 d! L: V% `: O- S8 O - JSR Music_Play_Next
/ g8 V* i; h u& e2 q& l( s$ w - .Next_10_Music;上10曲
6 c! v/ U* Z- a0 \ - LDA FC_Gamepad_Once, {$ J5 p- t0 d1 B. E
- CMP #JOY_KEY_UP
6 E8 z; x) q& W+ d/ B. c/ f - BNE .Pre_10_Music* R( z3 a4 o* O+ w- t1 ~, |; q
- JSR Music_Play_Next_10; V8 Z; M3 o! W' m4 O6 Z
- .Pre_10_Music;下10曲 n0 G/ a/ E9 I* `! q8 p
- LDA FC_Gamepad_Once
9 g4 y8 g9 k7 ^3 o. I0 \ Y - CMP #JOY_KEY_DOWN$ r4 x A+ x' O0 r" {
- BNE .Reset9 p' d3 T' X6 [. K3 U% J0 G7 d
- JSR Music_Play_Pre_10
! ~ V" W0 r8 `5 P/ p7 ]6 Z - .Reset;重播当前曲目4 w/ J& u7 r5 ?. ]1 f3 Y
- LDA FC_Gamepad_Once9 Y2 V: R) j [5 E- T) g, Y
- CMP #JOY_KEY_START8 j8 b: ^/ w. g2 \5 H
- BNE .End0 h0 M* w7 H) W) M: e( T3 p# ?; S
- LDA FC_Music_Index
" v) \$ ]" I) s6 r( X/ a" C - JSR Music_Init_Process
' i4 A5 R' Y% y) I3 ` - .End
1 l' P' }2 T, w+ ?2 @& X - RTS3 n. J, ]: c4 e/ R1 O( |: w) V
- - u8 z2 f* p7 w7 c: Y: Z, d
- ;----------------------------------------------------------------------
1 U9 D/ F" \) q9 \# A$ |* S- F - ;播放上一曲8 |# Y; F& u/ J
- Music_Play_Pre
3 h5 J6 f& L/ g: J! f# L7 @ - LDA FC_Music_Index
+ h; d0 r4 D: C) E: K& P4 p- `4 r- T$ P - BEQ .End1 a# n5 Q$ @1 T4 R
- DEC FC_Music_Index
" h) h. h B \3 z! W& N - LDA FC_Music_Index
" p$ x* G6 V& l! V; A - JSR Music_Init_Process
# B9 m" d- M1 z7 E& \ - .End% ~5 ^( m6 y6 C
- RTS6 z& K4 ^- C, n6 d) t% y6 P
- ;----------------------------------------------------------------------8 {& `( u7 Z3 ]& p; d7 n5 x% q
- ;播放下一曲3 E* q. G9 B- |; }, p7 f
- Music_Play_Next
; F( [1 x* k9 n5 U! w/ C. B2 n8 m - LDA FC_Music_Index7 D+ [( [" W/ [
- CMP FC_Music_Max_Index9 S3 q: ?1 O' p& m* ^* ]
- BCS .End# m% B% m4 c; N, s7 o: X: W
- INC FC_Music_Index
, \+ s! t3 R0 D/ f2 I6 ^" m - LDA FC_Music_Index/ D0 D+ r# N1 ~2 C
- JSR Music_Init_Process
, r7 R9 f* Y7 O0 d$ }: @ - .End
+ _0 O: V- n( P3 n4 c4 }2 C7 k - RTS
8 g/ z0 M3 n- D1 i# V
+ m6 b1 M# v8 H4 |( m! P+ t- ;----------------------------------------------------------------------! T+ B" T6 s5 u# J
- ;播放上10曲! E( l0 B) N! |. d
- Music_Play_Pre_10( R; e' G ~# p7 H2 ~3 @5 S9 t( ~
- LDA FC_Music_Index
. x G# z. q. N& J; T - BEQ .End3 @: g3 h' [: Z7 Z+ A
- SEC, \7 }+ N% y M$ n* i# \$ K
- SBC #10$ N4 E2 y8 {7 Y. I' t0 h, g$ }
- BCS .Pre_10
2 K- B0 K2 F$ `, \/ B: H - LDA #$00
9 t; h' d& B E+ y# Q; h6 D! G6 j - .Pre_10
4 }; I. B# F/ i" V& E; B - STA FC_Music_Index) }- M/ i, j. k+ _& s
- JSR Music_Init_Process
4 j4 S( L* F: ^8 z5 F( B - .End1 o6 ]& {1 ?, ~
- RTS
/ m! i9 Y+ }3 U( c. t/ Z2 I - ;----------------------------------------------------------------------1 W8 O* P. N7 y: e: G+ B) z" q
- ;播放下10曲
# ]& x0 U/ y8 \8 c# g% j3 N) _ - Music_Play_Next_10
0 u6 f$ q1 e. Z/ B3 Y - LDA FC_Music_Index
& k+ G/ g+ f9 s) Y0 \4 c( w& P - CMP FC_Music_Max_Index1 d% X% Q- Z& Z1 k" B
- BCS .End @% Z& d# \# A; J# s2 H
- CLC
$ P" B" b+ s& G. b1 j( G - ADC #107 c H/ B; m$ l7 i: @4 j& X" ^8 C2 N
- CMP FC_Music_Max_Index
" p: Q: U7 `/ k- f$ |" ?& ? - BCC .Next_10
9 a# \4 Z5 y6 J2 F# y3 N - LDA FC_Music_Max_Index
5 u* {5 J" P( V- z/ d - .Next_10 z2 v/ k* Y7 w8 n2 u0 G# Z: q! Q
- STA FC_Music_Index+ n8 F: k: F/ C8 |
- JSR Music_Init_Process
# E0 k; j+ D0 l - .End4 `% i6 G! B B2 G3 \* y q; _. e+ M, z
- RTS5 w0 v; }$ J$ y0 U, u
- n; `4 r, @- ^, n: f- ;----------------------------------------------------------------------
9 O5 Y+ r" |% X- o- B' M3 D2 x1 E2 h - ;8位十六进制转3位十进制制" H" r% u) J* I
- Hex8ToDec
% Y; h% ~: F" k3 e; O' { - STA FC_Dec_Data_1
- S! V4 d6 c! s: ] - LDA #$00; C. H H4 C9 ]2 c( ~" U; ~
- STA FC_Dec_Data_100
8 z$ N# O* Z0 J - STA FC_Dec_Data_10
4 J. G0 A" H1 ]7 l - LDA FC_Dec_Data_1
2 D3 h% ?1 G5 g: d _; k" j* | - .Convert_1009 ~! `; W# u9 O5 _+ p' S* C: ]6 z
- CMP #100
" O8 P) D9 Q% U* t/ n. h; K* i1 l - BCC .Convert_100 B7 S6 \% }6 Q" k j9 c! C
- SEC
! w6 {$ V& a, C) Z* U - SBC #100
, V& m% `9 A9 P4 V' q - INC FC_Dec_Data_1003 s7 Z+ Y( P/ F# q
- BNE .Convert_100
+ s5 s6 B/ g) y; u+ C: P$ z9 X( e2 e - .Convert_102 B! Z7 ?6 O- \
- CMP #10
- ~( @* d9 R9 A" A4 [9 o* m - BCC .End# [$ L/ a& \5 l: F
- SEC/ w# z. p4 A) X+ L3 {1 u3 ~
- SBC #10
% V- {! H7 A0 E, v - INC FC_Dec_Data_10+ I X% e1 z* Y
- BNE .Convert_10; j* X9 ]/ J; k6 ~3 D
- .End. p* V& Q9 }3 i5 x L
- STA FC_Dec_Data_1: {% p5 J3 \8 `7 [
- RTS
: w, }7 b- K' f k! P9 G6 n - " f% Z! p! o3 V. G. S& ]
- ;----------------------------------------------------------------------6 p2 T U) S/ {3 |
- ;显示曲目信息9 \+ s; m9 c& a2 E6 K0 [( o" }; W
- Music_Info_Display$ ?$ o- s0 Q# n l
- LDX FC_PPU_Buf_Count6 y e* @% l1 n! z
- LDA #PPU_WRITE_MODE_CNT_LINE
1 X, U1 Q$ ~5 E. f5 D6 t5 ~# u - STA Use_PPU_Buffer,X: U$ l6 c% B& w( }3 {' q
- INX5 k6 g5 D$ v( h( [0 u, B& O' m( u
- 7 F3 N( s9 J7 i- Z- K1 ?& p
- LDA #>MUSIC_INFO_POS
: `/ E6 J3 o; V l( S. q - STA Use_PPU_Buffer,X6 V2 H0 {2 c9 v$ D1 M8 x" _
- INX& F9 b2 t- f1 U1 r- N5 R
- - @) A& i# A- b O1 y
- ;居中
3 y+ v1 P; L* ]0 @ J2 x1 i( W9 M' _4 H - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
- X8 ~' y( ?+ b0 D4 V) I3 { - STA Use_PPU_Buffer,X( u5 e( h6 a( r$ \& L) T- I7 D
- INX
( M7 V4 _8 o+ N) T - * H- s% @" x) @5 o
- LDA #$05# \: ~7 N$ n) c
- STA Use_PPU_Buffer,X4 [/ l, |2 C4 D x7 L* \. [) h
- INX: z" S z2 J: o6 C- r1 |' N2 `& \
- J% S+ ~: @2 H8 _
- LDA FC_Music_Index
. ?( x" c" {( P - CLC
, j* K2 ?2 B3 t5 J3 j1 M - ADC #$010 Q( P+ t% E% D( a3 M- c) V
- JSR Hex8ToDec
9 V/ J7 l$ N1 I: T! Y+ ^8 X$ O% j -
% E' R+ ?( B0 J3 L a - LDA FC_Dec_Data_106 R0 _/ W8 r2 C$ x, S3 `0 D h
- CLC& w3 \- {( x1 X, z) {0 y+ d* ~
- ADC #'0'
; g0 C, B5 z# e, p6 a, K$ a2 u - STA Use_PPU_Buffer,X
7 x7 ^" L& z5 R0 K' A! _, G - INX
8 q& q/ c- ]9 W s6 ~1 r& d -
( o( v, J. V' T$ g. t) E: S8 { - LDA FC_Dec_Data_1
6 ~$ Z8 M% d/ J4 ` - CLC
/ j& ?' P, @# ?3 P - ADC #'0'
3 I; {/ _7 c# b. t - STA Use_PPU_Buffer,X/ y4 N# u8 u' u4 L+ A
- INX9 V% z6 W4 h Y V
-
# B j3 V: C" V( t0 p0 n - LDA #'/'
/ l% L# G; E, ]6 H+ Y/ e - STA Use_PPU_Buffer,X
& l1 L3 ~$ L8 p5 ~7 u - INX
. R: e A( `4 s/ f - : G5 n2 Y/ G c/ u( g: H* A
- LDA FC_Music_Max_Index% Y- y- ]* R" d
- CLC
& q0 j0 p4 I. s3 f7 T. g - ADC #$01
], e' U1 e2 V( ]( M - JSR Hex8ToDec7 b) Z# H6 R4 g# i; _, ]- t
- , C1 N: B' D0 ]( A! ^6 z+ U
- LDA FC_Dec_Data_10
! L+ ?# I& o% j - CLC
* q: u. {1 b( x0 r4 w2 B! i/ n - ADC #'0'/ o. W" W+ u" u. L
- STA Use_PPU_Buffer,X' E: @: `1 r* `" x7 {
- INX
3 X2 a+ `6 Y1 u; P+ F - & f8 \& k' A8 v4 H9 p/ v- A
- LDA FC_Dec_Data_16 k: P3 G( J8 D& K2 F; n, F
- CLC
/ t) ^0 f; m: D - ADC #'0'6 ?* c+ B7 k" S4 \: }, ?
- STA Use_PPU_Buffer,X3 ?1 Q" s0 i( V1 i q
- INX: V! F' j2 c5 `, w! A1 @
-
: x! e6 L: j3 A( E, L2 E - .End
& M& w7 Q+ M" Q: q - STX FC_PPU_Buf_Count
. E; F8 Y7 N, I n - RTS" X5 p+ U/ {/ Z, l& |9 M. ~5 L
- % N8 C, {3 X1 S9 C
- ;----------------------------------------------------------------------
* W; u! w; ^1 A/ c* w2 D! M) P - ;音乐曲目初始化处理$ a/ A7 [5 |! k$ B& ^: r5 F7 P& h) c
- Music_Init_Process& C: M0 W, L$ W" V
- PHA1 d: z! z, n6 V- D. a _
- JSR Music_Clear_Process
$ h- ^" B; a( f* Z& i _5 X - LDA #$1F4 f2 e3 l1 ~/ }6 B
- STA $4015
1 s! R# [! |" |" c - PLA
) y( u, H- h4 S - JSR Music_Init_Addr
, M/ C, V8 G& M1 H( B - JSR Music_Info_Display
3 k+ \, i4 j. m9 s' Z - RTS9 W4 R' V/ Q7 c! K' l
- $ D7 {7 }8 R* p. J4 [
- ;----------------------------------------------------------------------
3 _3 {7 n' k) J3 R2 N1 L) a; s3 _ - ;音乐播放处理, m9 Z9 F _& O: [& x
- Music_Play_Process5 W: v# [1 t0 b+ T4 e% f0 V* M; M! H
- JSR Music_Play_Addr# ^$ u4 y, F B3 t$ ?: h9 I8 \
- RTS( P8 L: \6 B- `# t6 F1 h
- ' R; }+ ]1 q. r5 Z8 s# z" s
- ;----------------------------------------------------------------------
& g+ f# K1 ?, H6 l8 e0 ]6 y - ;音乐播放处理
- w2 N, ?) {0 r6 G& ^ - Music_Clear_Process
! J! a1 w8 a/ J8 _- d - .IF Music_Clear_Addr. i+ ?# d3 R5 }- t
- JSR Music_Clear_Addr
( I) ~& ~/ T9 n: d6 m - RTS" i/ A$ s, J* R% f
- .ELSE
- i1 x: S* ?" e7 [ - LDA #$1F Y, O3 R( M4 e8 a0 V# E
- STA $4015
8 @7 z/ S9 w9 B, d/ ]# K" B* u: S - LDA #$00( E" ]& R2 W/ W$ _( P. C" C. c
- STA $4010
! X/ R3 Q) L) c- ~3 K0 [: G6 c - LDX #$00' z) M; ]9 Y- H. a- J9 J$ `
- LDA #$00
3 p- i8 V2 Q9 n6 g+ o/ z: w0 w - - H0 n0 R _0 l9 @4 z
- .Music_Clear_Zreo_Page_0
$ _" L3 b$ ^6 o: w* [ - STA $00,X
. ]( R+ ?4 `0 E7 q4 C - INX8 Z0 R$ c4 y( x6 }" K
- CPX #Use_Zero_Page_Begin
# ]' M5 a) A/ u; R - BCC .Music_Clear_Zreo_Page_0% D4 n4 y* d( s+ C% b D+ K$ l; \( i v* X+ j
- ; ]/ |: p' S" c' f! a
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size p! P4 o+ N+ u: X# n
- .Music_Clear_Zreo_Page_1
& R+ [0 |9 W" S, f6 g! y - STA $00,X# j+ f$ U ?' }) K5 z
- INX! x0 V& I# F* y: s
- BNE .Music_Clear_Zreo_Page_1
3 z3 w2 W6 G3 k$ T# _% m( p" y+ j - 4 Q! i; h& E V, W8 k* q
- Music_Clear_Process_1) T7 J3 F% z' X. W) ^* |7 n" @
- STA $0600,X
! C+ R8 {4 i7 V1 p8 \! \* N - STA $0700,X
% K& y9 Q! D9 N9 j2 o0 K - INX! k n- w! F3 k$ _4 `$ Q
- BNE Music_Clear_Process_1+ F$ q+ Z9 i8 [3 R+ _
- LDA #$10- ]) n1 z ] B4 `
- STA $4000
5 w# ]5 n, [7 C9 h9 _8 z - STA $4004
* e3 C) o: k5 d9 V3 v - STA $400C
. h0 I3 K# P/ W - LDA #$00% z8 b" V, E3 w5 |
- STA $40084 b% J3 J. k. q4 `, B( B6 r: Y2 G2 ?
- LDA #$0F
" d1 R% U8 d: C; X - STA $4015
2 S9 E9 [; R" V E' `! d - .ENDIF
8 q+ e# s* y( v - ) G0 k8 Q9 r. u# g! s5 t
- RTS! {# t/ n9 D) G% v
- # J1 R- U1 r2 s- X
- ;======================================================================8 \% v. _! o+ q4 l, D
- ;重启处理1 ]7 M% W K7 f2 L( _
- Reset_Program
5 B- c# Q5 w( C, x5 e - SEI
/ [$ f( L; ~% x/ s' [5 O8 g - CLD
# g% N$ _( r0 G" v; A Z - LDA #$00; R. H/ q: h9 j1 n( m0 |1 K7 T/ p! }
- STA PPU_CTRL
' z& }; J; p% V( M- A- p! j# ?' ?: U - STA PPU_MASK
, q8 u) g# W3 W$ c - STA JOY2_FRAME9 q; f& Y6 q0 B% g" |% c7 a
- STA APU_STATUS
, p3 T, a& C, G! a) t8 m" ] -
% p: c$ `% H6 o& ?* S- f8 M - ;等待屏幕准备完毕
. F ?/ @- b, Y/ I! T0 o' J8 j - LDX #$02
- b3 {/ i J4 e5 [ - .Wait_For_Screen_Ready( N/ U9 {+ m! C- L* o. ?3 D0 S
- LDA PPU_STATUS
' h2 A' `) y* ^2 a- N( w - BPL .Wait_For_Screen_Ready0 ` h o; {* v
- DEX
3 d3 y: Y8 v1 t* O- Z - BNE .Wait_For_Screen_Ready
4 E7 ?0 _+ w) k! t" | - 2 J: R$ k2 K$ e5 f( |/ i/ I
- ;清空调色板4 a( ~) O' ]6 Y- v( v
- Palette_Clear5 W$ F' I! q- A6 i% z- z% Q. s9 F
- LDA #$3F6 F! }* R8 H3 g. \" o' v! \1 @% C
- STA PPU_ADDRESS5 R; s7 Y: F9 S, Z1 v& F3 P- [& l
- LDA #$00( N4 z, f+ J" |, B$ g& X$ @/ R
- STA PPU_ADDRESS
3 k' u, E" \0 g0 ?( V/ b - LDX #$20; F) V& g; r4 Y! C# G
- LDA #$0F7 Z; m0 S. G! V! w
- .Write_Data
6 d$ T" p; I0 X0 g - STA PPU_DATA5 P e0 T7 K$ }. h
- DEX
0 Z$ X9 s) q/ R6 B6 r: w7 O( k - BNE .Write_Data& d' _- @/ K- Z+ z t+ I3 ^3 n
4 n: A( n6 T3 z0 a6 y- ;清除声音 $4000-40131 |1 B- X. J( t6 P5 Y# s
- LDY #$14
& I6 |$ Q5 `, l1 k, v& G% N3 y - LDX #$00! K: \2 A" U. a; o' h
- .Sound_Clear
' J4 I4 [$ s+ ^ - STA $4000,X- e% o& {* k+ t( A, |: ]' A
- INX
2 ~1 E! A: y5 G2 ]5 Q - DEY
% }2 l6 k) h$ |6 k) ]3 ?4 G - BNE .Sound_Clear5 s; c7 d2 }' t
-
. P- p; F$ N. i, A% {, C ] - ;清除 RAM $0000-07FF0 N7 W% a( y( O; l! U2 _
- LDA #$007 G! Q8 @* e: Y8 b
- STA $00! J s5 _# _* x% z! |0 a
- STA $01
1 V3 M7 i2 F; R- g* J( a - TAY! k6 [/ _) f/ h7 r, f: V2 T2 w
- LDX #$08( g8 J2 p& r4 G! P# s' i$ k
- .Memory_Clear% ]$ h s& V. X% b
- STA [$00],Y9 \: w) W& v4 q5 y! c
- INY8 _4 W% |; @4 B. I& P7 V! _
- BNE .Memory_Clear
& _& g0 v# Z( H, R/ t - INC $01
0 i. w, h: h% \ - DEX
$ [4 Z5 I; K' G' ~ - BNE .Memory_Clear
* t; A9 o8 S( D* G X G0 g0 l8 P -
+ b4 o1 V6 S" x+ B, k* T - ;精灵缓冲初始化
: J9 v8 w% O) j$ P& }7 Y, s' Y - LDX #$00
u" F% `3 `4 D% D$ a: F$ T - LDA #$F8
3 F6 J, h" O; Q5 H2 ^+ D& _# p - .OAM_Clear
3 _" w' s. B# G7 f9 | - STA OAM_DMA_Buffer,X
6 t# n. O( i7 N - INX
4 b0 v( j5 h) y+ c% v* N - BNE .OAM_Clear/ o& \6 K) \# T4 R& a
-
5 G% J: D/ Z2 J- p7 M; i7 R5 M" s - ;栈指针初始化
# P" N% j) ^& x' B6 o - LDX #$FF
: C. [3 u0 i- x j7 y) S; i0 d8 t - TXS# X5 s3 y1 c- H( U% K
-
% r6 U; I# l6 j) I. ~; W( h - JSR Nametable_Clear;命名表清空
, x) [+ X5 ~5 m* c2 N9 X5 T - JSR Palette_Init;初始化调色板缓冲4 V2 ?3 B) Q5 u9 C
- JSR Static_Text_Init;初始化静态文本
- l& c$ o! E# K" {& t; j6 _ - - _' R) k. z4 s* H( w- w# y1 T
- LDA #MUSIC_ITEM_TOTAL - 1
$ D! a6 E4 Z, v( i) m1 X) \) o - STA FC_Music_Max_Index
. p2 f, d. w4 r - * O+ g$ _8 n$ X5 r7 ~! a2 ^
- LDA #$1F e& G+ i& T& P: A# i. f
- STA APU_STATUS3 `6 t1 q6 _, f
- LDA #MUSIC_BGM - 1
2 G8 j- `# Q- H0 A [) c - STA FC_Music_Index
7 O. Y" g' R$ A6 y - JSR Music_Init_Process;音乐播放
0 i5 b4 U! B- H4 e# p6 {" D( @7 }& S: E -
x6 V/ O% H) \ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)$ w7 r0 t. M" P& O- w# Z9 N
- LDA #$1E" I8 u3 R# v* z" w) ? L5 o$ h
- STA FC_PPU_Mask_Buf
% C% _. I9 ^) ]/ \ -
( c+ t4 v( }/ I7 ]/ r - ;启用NMI处理- Z( `$ d4 w5 Q8 [1 b
- LDA #$80
9 D% W$ a6 Z) j9 c9 [4 T - STA PPU_CTRL% b3 V( |; z6 t. U
-
7 i l/ Q+ _$ [: L; ^/ Q8 `* } - ;程序循环, 剩余工作交给 NMI 中断处理
0 @1 u! S2 `" \* s5 ?% b* Y. Z$ R1 u - .Loop) f/ q0 G* o' }+ }9 \* @ P
- JMP .Loop& f& Y: R+ R4 M% H4 U% Z# T
. @- k) m Z& b! m0 J5 @! p- ;======================================================================
4 M" |5 p- h! ~0 p - ;不可屏蔽中断处理
" e0 h1 O. t+ Q- e3 u - Nmi_Program5 N W3 i4 X9 q) e; X
- PHA
2 U5 O; i! {; R& j6 J - TXA
* D9 y8 P, j0 T W0 Q' v - PHA1 L! P8 b; n: N2 p4 Y1 a- J
- TYA, F- h! ^- y) e+ r4 ~7 R' G
- PHA
: X- S& f7 _) k1 l0 ~" i9 P1 S -
8 i, p1 D& U7 A7 S, H - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
/ d* { t Y' r1 Q) n) c -
; N( S# g! g1 n1 `1 G0 } - JSR FC_PPU_Procrss;PPU处理) i5 ?- m- J2 U. | M$ v
-
) A7 J1 q& | N - ;精灵内存更新
, w) [8 p) W% H4 P e' L - LDA #$00/ C) X U q1 o' k' U8 I9 u
- STA PPU_OAM_ADDR5 H; A; _; \; c- z8 J
- LDA #OAM_DMA_Buffer / $01007 z2 G/ ?9 T3 F* W) i
- STA OAM_DMA7 x/ v) J* {4 l2 f: M7 I
-
8 L: y* d0 h- r8 M+ l3 u, n - JSR FC_Gamepad_Process;手柄输入处理% Q) U3 _' V3 j' L3 o
- JSR Music_Select_Process;音乐选曲处理
1 b6 ]0 [5 q" }! l - JSR Music_Play_Process;音乐播放处理
8 ?, o! U9 }) s5 v - ! @6 ^( V& H6 |( u- I4 c
- PLA
# C3 b6 O& |0 d+ o7 { - TAY8 T! J3 o1 [, k* B0 p, G
- PLA0 s: j9 d: s4 h8 p, B/ t) Q' ~
- TAX
$ Q3 n& ?: T* ~ p/ O- O: [ - PLA5 Q" u; z0 B, d/ O, h9 x
9 O4 S C, u _5 R- RTI
4 C% E, }8 u, X$ M - ; a* g) v5 Z. S
- ;======================================================================: M; n1 [# J6 |5 z
- ;请求中断处理
4 I I: u h' D8 n4 u - Irq_Program, a0 p. n4 X5 Z' p! T% c
- RTI
0 S+ Z3 J) `, h5 g2 L% [ T- C
6 E' {& n) f8 R7 k9 W. g( \' l- ;======================================================================6 d, q; C/ G! \: q( K: l
- ;中断向量表
, d7 u6 M4 z2 Q7 _4 p# H. A0 ^. w - .ORG $FFFA* ~" x( y. o# E5 ^; G5 W
- .DW Nmi_Program ;NMI触发时执行
8 @. Z9 S( m7 k' T- c* h5 |5 V - .DW Reset_Program ;载入ROM时最先执行
: Z# s; E4 e7 s, I' S" I: \ - .DW Irq_Program ;IRQ触发时执行
8 p& @- A) s6 H/ S2 A/ _& o# q" e3 M
复制代码
0 g9 q* K! V8 b' {! g8 o0 ~7 ^/ Z* w, T4 t6 s/ @; b" b7 a" U! n
+ X1 S Z+ _ U1 p7 Whttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|