|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
" u7 l. F w+ F: ~, I& p5 H
~6 u! [' p p以下是主框架代码:
( x+ F, _/ l2 n2 r- _" B2 F- ;======================================================================# h2 d( `7 u+ Y. w
- ;文件头* Y' D. n0 K7 A H
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量- i9 z, G$ {: f2 q, v1 W
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
! b1 h. k/ ]. @ - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码) Q1 W: O& K0 E5 N# d. s
- ;======================================================================
( H# C4 k* j$ h" I3 Z* M( o ]& v - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
a* [; O9 v$ T& T+ Y& D% @ - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 18 [. p$ E' E% z7 |! W& S
- ;======================================================================; S7 [ `1 l1 Q* i6 e @0 |& x
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 12 M& _. W2 {$ d; X( Z/ x
- RESET_ADDR = $E000 ;主程序起始地址+ Y" }1 F S5 F6 M
- ;======================================================================
4 @1 @0 s& h* N. H - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB4 I: u c/ W y- A( F
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
5 y; `/ x+ f# G! G1 R% o - .INESMAP 4 ;Mapper号 (0-4095)( G+ Q2 M: R7 l# r5 T8 w6 e" K$ ~
- .INESSUBMAP 0 ;子Mapper号 (0-15)* ]7 y$ ?% I$ x+ F; x+ ?. U% b3 D! L
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)3 h/ x0 H5 l7 S" Y& t K
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)1 v4 Y, ?; o; d6 f l+ d
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数) V' L4 c( }" W4 b1 s& X- c6 [
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)+ \$ G6 j K1 ?
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
3 ` z% q ]5 H2 ^& i- b) }' b - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
e4 Y1 L+ z4 w+ G$ U% m, o% ^ - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)0 i0 ^' w& I! d7 @2 L( J( d. f
- ;======================================================================9 G2 F: Y2 V/ [8 _( G8 Z
- .INCLUDE "fc_demo_config.asm" ;全局配置. P) [$ x5 B9 `# Z- z/ j1 E. h
- .INCLUDE "fc_demo_constant.asm" ;NES常量4 y9 V# V; g9 Y+ r
- ;======================================================================
6 X8 `; ~ W3 L* h( k - ;音乐配置
* w$ I3 {; j2 g, {1 K6 y c - .IF 0 = MUSIC_THEME - Z' U! ]. v, ?; Q5 p' e% c1 U
- .INCLUDE "data/music/Gremlin 2/config.asm"% _% Q3 k* V- E& s/ D7 K
- .ENDIF3 A) R2 g" |2 v
-
w6 Y0 n0 Y* Y& q3 f- c. J - .IF 1 = MUSIC_THEME* ^2 k2 \0 l# t( ]. d3 x8 M
- .INCLUDE "data/music/Raf World/config.asm"
! [3 ~; C. ]$ g- m! Z1 ~ - .ENDIF8 H& x& L; D6 \5 f5 e7 Z% n" O3 K
-
. U7 g2 j9 o1 l% } - .IF 2 = MUSIC_THEME
/ V% p6 x5 {' j, s2 ?0 V: z2 X - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
. \" a l1 `9 T' p - .ENDIF
( A5 `# T$ K; ^( e! ^; I2 ?$ W( v+ R - 0 H* y! s" G; x0 I
- ;======================================================================: Q0 G- {* L" v; w
- ;引用CHR图像数据+ ^0 @; ]9 k1 g
- .BANK NES_16KB_PRG_SIZE * 28 |; L6 p" k9 r4 e8 f- O
- .ORG $0000
" E7 o# C5 b% X4 L1 t4 t2 X, [0 [ - .INCBIN "data/bkg.chr"8 P. z% V: ~- f* h/ w* E5 Z+ O, r
- .INCBIN "data/sp.chr"
5 ]; T. D9 R2 _" H - / f V& `* o9 G3 V3 b
- ;======================================================================
2 @; v% J+ ]9 A) j. H% g - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank" K2 r* e) e' o2 y6 F
- .ORG RESET_ADDR
" X/ W# _1 c' }5 U3 R - ;======================================================================
# w# _# R6 d6 e2 h. E6 M9 r' a) ^" ^ - ;引用其他源文件- l# S1 [4 q; ?7 J2 ^# T
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理0 }. j0 u$ H# Y: ~! i8 @
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理2 {% b) {6 g+ S; }) G: G- t8 h2 [
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
3 S* \9 h: v0 ~" M - ;======================================================================# M: d3 x: y# S2 N
- $ N n* w4 K: r
- ;======================================================================
: |3 B$ u w/ f" X5 {3 s i- ~ - ;等待VBlank到来5 G) x6 B% Z7 }7 O8 O9 k
- Wait_For_VBlank
$ ~3 H! Z9 C8 u6 s! x - LDA PPU_STATUS
3 ] |, T' o- m( h - BPL Wait_For_VBlank/ W" T- m5 ^" ~
- RTS
$ M' X8 j. n5 s4 w+ e7 w - / f) Z, v% p8 Z3 s
- ;======================================================================
9 r; J- F2 V: P- i* U2 W6 Y% { - ;调色板初始化, w+ P. q l* e. {7 r
- Palette_Init! p' r8 u6 c& ^+ j9 S; B* [
- LDA #$3F) ^+ I2 i* o- T
- STA PPU_ADDRESS5 \9 G: T& `3 L: y: g$ W
- LDA #$00
5 M4 _; b4 h3 {' N2 N' _ - STA PPU_ADDRESS
: G$ l A7 `! [- q% q; W - LDX #$00* y( U' U( ?4 Q. h; t% d
- LDY #$205 ^* U, C% }$ d; s2 G* i- Z
- .Write_Data0 \6 ]+ U f! D8 T& V1 x
- LDA Palette_Data,X% i' O& M) X" u5 v8 E
- STA FC_PPU_Pal_Addr,X2 j8 a" Y% f! j+ |; ~% a, @
- INX
' A! ^) W! W: X2 h% w - DEY- s- k; {- S* q9 r# g& P
- BNE .Write_Data% h6 F; l# Q( f. m7 }% E
- .End
- g# V9 ~3 \/ B- F. T% F0 q - RTS$ c C" r" \( e% V+ m
- & ]/ ~& E5 u1 G5 Y/ y
- ;----------------------------------------% ]: S& }! g' D8 {
- ;调色板数据 P& s3 O, S9 S F* h- I2 U
- Palette_Data
9 n5 \8 D& @; }) |0 y& D: Z - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B7 A2 ?+ m( e7 D6 R
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
& `9 h) X+ v( n - 4 K) Y% I! ?7 s& ]$ g) N1 Y. A
- ;======================================================================
( E/ q, E; [( X" J# d - ;命名表清空+ d: [: v, C/ J3 {0 y; {
- Nametable_Clear0 B5 G; L M+ R; z) L
- LDA #$206 y- c! b" F( r/ y: B
- STA PPU_ADDRESS: d: h5 {; u3 E; |2 {
- LDA #$00
2 Q1 G& Y. Z0 ~; Y' B7 ~. A6 W1 g - STA PPU_ADDRESS
* S* z4 E) ~7 _1 T - LDA #$00
# L }- V, w& l& o8 G. _# q - LDX #$00
: d5 ~# I* J$ [ k f3 h1 J* N# v - LDY #$08# H' q! j% m$ }+ L3 u0 R5 ]& m/ J
- .Write_Data
( K! s. J- y- A: U/ h. R - STA PPU_DATA. Y$ u( o9 E1 S1 Q
- INX
* e0 `: A" L* k: i0 g - BNE .Write_Data* \9 r* k# {) M3 w' t" ?
- DEY% M( n4 ~9 Q* a, a1 H( w: ?2 T
- BNE .Write_Data8 Y6 M5 O- F9 H5 |7 S0 B1 c4 M
- .End
5 l$ M# J/ |! I9 t, l - RTS$ F9 X% v) E; v8 v
" W! _ w2 f% o% H! y- n, b- j; G$ D- ;======================================================================
# q- Y v3 K+ G: d) U- z3 k: g - ;音乐曲目切换
0 `. M: T/ ^" `3 c& g a - Music_Select_Process8 F; A8 ]6 I7 f* a& m$ e
- . U+ x- Z8 k% I$ O6 N/ f
- .Pre_Music;上一曲
% E9 P5 S+ L! V& R: X( B - LDA FC_Gamepad_Once
) Y9 u. l1 s# D( k% y Z8 c - CMP #JOY_KEY_LEFT
. | f' z1 u ?/ y5 T - BNE .Next_Music
! p: r( A3 x) d# m* \: w - JSR Music_Play_Pre
/ _7 f/ ~3 J( O3 d - .Next_Music;下一曲" g4 A5 D& x. {; _0 C% r4 j: K' k
- LDA FC_Gamepad_Once" ^ f0 H" i2 r0 _ \ y$ A
- CMP #JOY_KEY_RIGHT+ W4 s6 w3 v$ }3 }! X
- BNE .Next_10_Music% Q0 _9 @" A" y" y
- JSR Music_Play_Next3 C& i5 k6 ^" Q7 }6 O
- .Next_10_Music;上10曲
; [; }+ w o+ e; Q6 o. k - LDA FC_Gamepad_Once
+ X1 p) p% P2 I$ r! ] - CMP #JOY_KEY_UP) v5 t2 {/ `1 S J- B Y
- BNE .Pre_10_Music
" V) |3 C7 h* P: E* ? - JSR Music_Play_Next_10' P9 s5 w3 Q6 H6 ]
- .Pre_10_Music;下10曲
/ t0 R" Z: H0 s/ Q - LDA FC_Gamepad_Once }, A# {8 U' f
- CMP #JOY_KEY_DOWN2 z9 q7 j5 Y. a7 M W6 l6 b/ q
- BNE .Reset6 }8 @9 A' G( w6 ?' T
- JSR Music_Play_Pre_10
; K7 D0 j" j- Z8 r - .Reset;重播当前曲目
2 h) @& S3 z5 _- e - LDA FC_Gamepad_Once' ^, V' X# M: ]7 C( ~* Y+ Y
- CMP #JOY_KEY_START
2 ` x5 ^: o* N' W- V - BNE .End' y9 s. @, R8 ]
- LDA FC_Music_Index
5 { P" `/ q" T3 n7 Z9 ~ p$ [ - JSR Music_Init_Process ^. ]2 `, l* P' R% [" v& s
- .End
! B& a# U+ t4 o _6 ~* x: x - RTS' I% y/ s3 w) Y4 J8 |0 @* n
- - y/ S' \1 e V0 u1 z, W
- ;----------------------------------------------------------------------, ^7 F0 s5 F8 k% t! [: e1 G2 ^0 p' y
- ;播放上一曲9 p) D; N1 \: L5 r
- Music_Play_Pre
5 A4 @% [( q* K1 d. b - LDA FC_Music_Index5 k# W% [7 t" h
- BEQ .End
- j* {$ u2 q# P4 M- T% _5 _' \- H$ ~ - DEC FC_Music_Index
6 k$ q, x7 s8 r( L - LDA FC_Music_Index; Z( r1 j; A5 w3 M& d3 C
- JSR Music_Init_Process; x* W% \0 i5 }2 X2 g, t
- .End- ~# G2 Q g4 m( I% W: x
- RTS
0 y, f& `& B4 j - ;----------------------------------------------------------------------
" o% r- V0 N# x - ;播放下一曲
6 L" n8 d1 e. g; S5 E1 ^ - Music_Play_Next
( k/ {2 g% p7 V. ? - LDA FC_Music_Index) u. c' N4 t* o; B6 q, M) x. {
- CMP FC_Music_Max_Index
) `% v5 _) t6 _) x1 a3 ^ - BCS .End
1 [7 F& `# X4 A/ k - INC FC_Music_Index
7 R) m9 m% Y4 J7 h' F2 } - LDA FC_Music_Index1 N B( A- e2 @
- JSR Music_Init_Process
: i3 {2 z% d# \( C - .End! n3 r/ |1 v. E$ x4 K
- RTS& u" |/ I7 R5 M- b& t/ M
- 9 L/ |. n( p Q
- ;----------------------------------------------------------------------6 ~9 r* w& _ Q3 O
- ;播放上10曲
$ U; o! X) j, D - Music_Play_Pre_10
$ R- N/ i, V# Z/ Z, a - LDA FC_Music_Index
( y. ~/ i* R5 E l - BEQ .End) i9 \) b* x7 D; j" Z9 Q
- SEC
4 a3 F! f, `! I7 Y" w" E - SBC #10
& w5 {; P2 g( |% n7 A2 X; X, C/ { - BCS .Pre_10! }, m& G$ H5 X
- LDA #$00. f' A3 T9 Q! \; k/ |
- .Pre_10
- t4 H% ]7 n7 {' j - STA FC_Music_Index
# O; {7 I' A. {: X* c( A/ c& v4 } - JSR Music_Init_Process/ Y( p8 H6 a4 t$ ]
- .End8 W$ g" d, a: a, H8 \4 b1 a$ g
- RTS
/ G* P0 I+ Y0 R8 g* a9 {. w4 y - ;----------------------------------------------------------------------+ v# c: C: J% m! E, t
- ;播放下10曲
4 B% x) n% y9 i( @, M - Music_Play_Next_10
: v: b* ?: K! W( Y - LDA FC_Music_Index
. U0 z: W9 {7 I+ `' z - CMP FC_Music_Max_Index! \9 n3 L `$ ?' J
- BCS .End, w$ Q! t. [# |, Y/ `1 g
- CLC
4 S' w* b3 P8 R7 N, n$ U3 t! w - ADC #10- q3 d: S$ v* h! D9 W5 t
- CMP FC_Music_Max_Index
+ L6 l9 A& G* j$ C - BCC .Next_10- N) _1 g) l+ `: ^# W2 c! k
- LDA FC_Music_Max_Index4 t/ Y7 k5 |" ]$ u) G4 h& B$ x
- .Next_10' ?. |! s/ s+ Z% _& t$ ^9 ^* K2 \
- STA FC_Music_Index
, \# P6 I8 x/ k2 M, D - JSR Music_Init_Process
& L' @! K# @7 N; e. g# f - .End
! z/ Y! e) d T8 K - RTS9 [; [/ B9 p! b+ A% s. y
* Z5 i& { J( Z+ {% v7 V- f- ;----------------------------------------------------------------------) Y" t t9 [7 L7 P3 ?
- ;8位十六进制转3位十进制制! N; E, Y8 B) X# c
- Hex8ToDec6 t# A6 }; K2 N9 H5 x9 @1 U
- STA FC_Dec_Data_1
7 b k* m& U7 m1 e* g - LDA #$00$ ^8 E% M) t& j/ g$ ~) \: a
- STA FC_Dec_Data_100( L: |, o( P' C- [) V
- STA FC_Dec_Data_109 U U& B1 o: B/ Z$ j4 D7 p, E
- LDA FC_Dec_Data_11 _$ x7 l; M& z/ [9 y# w
- .Convert_1003 Q8 h% U: Z, q5 C) g
- CMP #100: A! [/ [/ n! s v
- BCC .Convert_10
2 A2 V6 D* C1 }) h6 E9 T( Q4 V - SEC
! U8 k* Y) O+ y0 z% S A - SBC #1005 j5 e# v3 K* C
- INC FC_Dec_Data_100/ ~ T$ Q7 z9 C3 b# z) |% y' d
- BNE .Convert_100
e5 K: W, K7 ^$ p4 p - .Convert_10$ M3 A6 v/ j; ]1 @5 ?" c7 w
- CMP #10
5 p Y: y; y3 M7 w - BCC .End8 a8 ?6 L7 L4 {
- SEC$ m" L/ u3 d7 K* n* z! N x3 ]
- SBC #10' `% B+ V8 h1 {! W6 w; ~
- INC FC_Dec_Data_10
) ]/ V2 ]3 G, B) ]) E" m/ t0 k - BNE .Convert_10: s) f& W( T) K
- .End
3 P2 q3 w% V$ ^6 W+ a - STA FC_Dec_Data_15 d- E& N: Y8 f) C0 v, a# K* D
- RTS
, @2 @ L7 h1 `0 \' b - ; Z4 ^, V6 v1 B1 u" M( l' x
- ;----------------------------------------------------------------------
6 a. X) E- d; W: I4 K - ;显示曲目信息
- u% t% G* X- M3 k3 U' T" P - Music_Info_Display) l& N5 [/ F7 a: M! d
- LDX FC_PPU_Buf_Count
% d9 t4 s, U" r - LDA #PPU_WRITE_MODE_CNT_LINE
& }& Z) R+ ~8 k8 { C* H - STA Use_PPU_Buffer,X, l. @+ x3 m4 k: u6 O
- INX
. y- B' f+ q4 ^6 a/ D -
# F0 `* O- z" C4 F' b1 s% _ - LDA #>MUSIC_INFO_POS
9 F( _7 A1 Z. T7 p2 N6 R: O) \ - STA Use_PPU_Buffer,X9 i% F; J6 Q8 w' [- q1 G
- INX
6 D0 _& w- J4 q; O5 a" o# Q0 b/ w -
6 d* T( x6 M K2 J5 p) } - ;居中8 l9 b+ r8 ]& S0 K _
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2/ Q |/ m3 [* [" Q
- STA Use_PPU_Buffer,X }( H" _( |% o c9 C8 Z/ G
- INX) ]% ^% g8 o) C( _& u
-
6 m8 o8 n" }! U2 z5 r1 T( J - LDA #$050 u' P" A/ g. ]3 A5 r5 w0 z/ l; j
- STA Use_PPU_Buffer,X3 D% E# L; G% v+ f) v5 {* k4 y- ?
- INX
3 P- a9 R! \7 p8 K8 _ - , v7 P: Z( |1 ~* y6 Z
- LDA FC_Music_Index2 K# I* E/ J2 I; v" l0 Y, D
- CLC
; o. e$ G3 ~1 S" n8 Q( i! d4 q K - ADC #$010 x- O. H# k; J. p4 o+ A/ C
- JSR Hex8ToDec: ?+ ^$ B4 Z4 A e) ~& @
- * R4 Z( V1 g0 { A4 G3 l& B
- LDA FC_Dec_Data_10$ F l4 F5 x# x
- CLC4 w$ P0 S- g6 j' D' K i6 @: I H- O
- ADC #'0', e0 {8 u# d' I5 O2 e; S
- STA Use_PPU_Buffer,X
; B& R, W& r. ^. Z - INX1 a g4 c* h& }3 d
- $ F9 E+ o" B+ e+ B; \' g7 e( E9 n
- LDA FC_Dec_Data_1
* M# h1 C5 C2 o4 E% O+ M% f/ d - CLC! x4 O/ q" C; H0 W! E6 a3 r& K
- ADC #'0') A8 f3 V8 R Y0 B& H( N0 d8 m
- STA Use_PPU_Buffer,X8 J k5 Y! w: j @
- INX
5 C' m# E' u3 Y& G& x) N - / \$ R& n9 ~* H( D! I D
- LDA #'/'7 i" C) _6 H6 w
- STA Use_PPU_Buffer,X: ?, _# G' A1 I/ @3 J
- INX" Z) N* z, T7 L0 f0 i1 M
- 7 w% J* T$ `0 `9 X. v: o3 ?# o
- LDA FC_Music_Max_Index
2 u5 A! k2 j R k. K/ ~. \ - CLC
5 s: O* A6 C% F! F ? - ADC #$01: p" ~( ^- _) ]+ O5 Z+ q8 C
- JSR Hex8ToDec
# G# |+ Y" ]% P! { -
6 v9 b& K1 `5 g3 { - LDA FC_Dec_Data_10
# {; J" U; v3 ]$ F+ Z* f2 { - CLC& K: s. M1 v9 k0 R7 ~" n! R8 c
- ADC #'0'
+ f _* y4 W* J' X - STA Use_PPU_Buffer,X
1 }) l9 q: i c7 M) D3 R - INX
4 C9 E; a$ G ? V6 o -
7 e q- N' Y3 J E' Z - LDA FC_Dec_Data_16 G" M: B$ X4 p
- CLC
; ?" i+ i7 `' Y5 U3 |7 } - ADC #'0'8 A+ T6 ?; a5 ]1 t, E; V
- STA Use_PPU_Buffer,X2 W( ?" T# j1 _7 Q
- INX
) J; _0 N( c) K - + F0 {- j. A, o
- .End
' h& N" q6 E9 ~& n3 _' d; ^# A* H - STX FC_PPU_Buf_Count
) ^- W4 L2 s: p M- I) m - RTS/ P; O+ Q& }; Y( W
1 L5 ^1 O7 Q2 z5 H- ;----------------------------------------------------------------------/ \ s, z/ ^/ ^! x
- ;音乐曲目初始化处理
) N/ y' b$ r7 o ] - Music_Init_Process. z! M% P2 K* z& P. X; p
- PHA
9 R' ~8 J1 j! c& a! O" |" v - JSR Music_Clear_Process
, n0 w5 q3 H3 F3 b3 y$ ? - LDA #$1F! C) T; d7 X6 w+ d1 E6 d9 j
- STA $40158 ~, i2 |6 ^$ W. ?5 d
- PLA
. _3 f+ C# q( r8 ] - JSR Music_Init_Addr' Z g) m- @( o4 b, W; l! a4 _
- JSR Music_Info_Display1 S! W; A! `) _4 b9 l
- RTS
' k& R1 e/ `8 I6 s8 x - + F9 a7 b5 I: Z5 j" D
- ;----------------------------------------------------------------------7 s9 m" e$ }- G; q
- ;音乐播放处理
" C) A2 V4 i) z W - Music_Play_Process
! | m9 b' l, j2 Z- L( j" `3 h - JSR Music_Play_Addr
* Q! |0 o* S4 A4 n4 D8 k - RTS
9 T* J4 ]4 y# A, [9 |" W6 \ - 9 S# g* |0 C3 r1 V5 U+ [
- ;----------------------------------------------------------------------6 w4 c- }8 S6 @; V% \8 y! _7 D
- ;音乐播放处理
& v7 A" L5 y: B' _ - Music_Clear_Process3 h( d9 m& L* _
- .IF Music_Clear_Addr
9 v. B) \0 p: o( C3 O/ A* d5 n( u) R; B - JSR Music_Clear_Addr
9 F! D1 v# ?) y9 _ - RTS5 K, w% @- s$ O3 Q+ b0 _- x
- .ELSE" v% ?0 P7 |% }1 e) K) a$ h. [
- LDA #$1F' G3 {% {! R# S) \& A% K/ z9 v% b
- STA $4015
) O2 ]5 g! B- ^) W - LDA #$00! h3 R% _0 ]8 j. n& e' b4 K
- STA $4010
0 e) F( X' _2 ?; ^3 F+ J - LDX #$00
# N* `# M( J7 Y; P8 B8 @5 H" P - LDA #$00
8 O% _: n& h# H8 ^# U - ! v6 C3 P/ U7 y$ V2 I4 T1 a# w
- .Music_Clear_Zreo_Page_0
/ m$ T l y7 T - STA $00,X
( }5 x% N* p6 T+ Z# R$ r - INX
8 O/ f' r2 ~3 Y- K* x$ n - CPX #Use_Zero_Page_Begin
" I7 t4 c3 o i, _( a - BCC .Music_Clear_Zreo_Page_0
. V9 p% I$ Z; B. ] -
4 k$ Z8 s9 C2 T# d$ H |" U - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
: b+ [, E7 j0 ~$ J( k; c' ` - .Music_Clear_Zreo_Page_1# T, g0 L& i B( e5 K' a# I
- STA $00,X
% e2 \9 p7 h9 b2 ~ - INX
# |! y7 b- K" A% N+ H - BNE .Music_Clear_Zreo_Page_1# G: h2 f& d0 S: Y2 ~, N! j
- ; G3 B6 b. m: b. ?9 g
- Music_Clear_Process_1; |# z, B/ J) d+ V* G K
- STA $0600,X* ] U, u p4 J6 X
- STA $0700,X
* f! V6 n( G+ W5 S - INX, {! I7 u D0 I) Q# v4 S9 ?0 _+ `
- BNE Music_Clear_Process_1
8 [. L- }7 K3 s - LDA #$10
2 l8 e X7 g% S4 z$ @ - STA $40005 N4 v2 C4 g7 v1 f6 g+ I+ a
- STA $4004! [, a! R: I" H5 s) R* H$ z1 ]
- STA $400C. _5 a3 Q' k! s8 y/ L( C$ F. h
- LDA #$00
, @ A: Q/ {2 s2 o K8 @ - STA $4008
& }! u, E9 O. c) e+ g9 C - LDA #$0F* Y. a) X. s! g, ~' y
- STA $40156 j+ P1 T& y1 Y; X, D. W6 b
- .ENDIF% Y* V5 S) B8 H6 k8 B
- # E s0 l* ]! Q7 m U3 l
- RTS
4 g: U+ V6 y5 K- f0 P. ]2 V
. C/ d* B: n. ?! ^# u# p2 W j- ;======================================================================6 C1 G6 z# T4 k4 W8 S
- ;重启处理1 K# {0 j9 i* Q J
- Reset_Program! P6 \& ?" R! r* l7 C- u
- SEI
h1 v9 S) |5 l" R2 n; K - CLD; u% F7 z0 r4 C7 j) V
- LDA #$006 T3 }+ }2 O) [3 |
- STA PPU_CTRL
s R4 _" r1 z6 f) K - STA PPU_MASK
; t4 Q, u% E" @ - STA JOY2_FRAME
9 l) R' {( o- {0 W) u2 j- s - STA APU_STATUS% s$ T& w3 S! U) I* i3 Y+ O
- ) N- M" T U ^
- ;等待屏幕准备完毕 h- a( S8 ^; c
- LDX #$02& J/ _) d9 J8 l! \
- .Wait_For_Screen_Ready
5 q7 }6 w/ v7 I - LDA PPU_STATUS
0 k+ o* e/ l9 O( k - BPL .Wait_For_Screen_Ready% p/ g3 o C3 c S3 z
- DEX7 ^* @; [( }& ~8 W$ [
- BNE .Wait_For_Screen_Ready5 m/ y& D2 _4 L- b. F
- 5 c' R9 Y2 w7 l
- ;清空调色板# U3 U( `* ^" k" ]6 ?' ?0 Q
- Palette_Clear
) v1 V e- w- ^5 i, `# y# H - LDA #$3F
0 e t0 X& {6 H3 o, U# @/ ]/ h( J* T - STA PPU_ADDRESS6 M5 M5 @0 e, |
- LDA #$006 k1 n) P4 u( y: U9 F, }
- STA PPU_ADDRESS/ c- T9 M% i3 ~9 E
- LDX #$20% @4 z/ b3 J% V4 Z
- LDA #$0F
6 a* t }# [( v% G+ c9 p1 p - .Write_Data: |5 ?5 g" z0 m W, N* O, q
- STA PPU_DATA, ]: o, R" \, q2 ?( ]
- DEX% P9 ]: C+ z' {4 g
- BNE .Write_Data
. Y, x% W! P/ {8 L. p - ! j4 i& W! d, E/ b
- ;清除声音 $4000-4013* i. @, [; Z% v( y g" `
- LDY #$14
6 W7 r/ u+ Q* r! G. [9 W. M - LDX #$00 \$ w/ ]* S7 m* z3 ^
- .Sound_Clear
3 v1 h9 N' X) m9 E, w* K1 z - STA $4000,X5 X, I7 Y. ?# v ?0 d6 F
- INX w' p, q: A2 u ?! N- P7 m
- DEY5 ^& K; `4 O; l) |6 V
- BNE .Sound_Clear. z$ w" e# _7 }0 q/ C) j/ N$ x
-
$ ]. s, X4 g5 K+ R; d& Y - ;清除 RAM $0000-07FF
9 E4 y3 j. m* p5 q* S) q4 F - LDA #$00
& i( G% S6 _, q& {+ j8 G - STA $00) T" U+ h" f2 d* O( K" `0 Q5 ~
- STA $01
: C! S; t( o9 ^3 Z' U - TAY
% x9 o- | h+ _' n+ Q2 U - LDX #$080 a2 {+ `' c) {2 ~) l
- .Memory_Clear' Z8 `- G6 @# _! H
- STA [$00],Y5 L* X5 W- J7 N% h O' U. I
- INY/ y1 X4 x7 a" b* d
- BNE .Memory_Clear9 h, c/ H0 M2 o# Y0 K
- INC $01* ~! K4 E1 G- R; j
- DEX; w3 j! M7 {2 L. Q) S" d- y
- BNE .Memory_Clear7 `; W. r0 j, P9 u) M# d( o
- ) h7 W7 D. z; D0 n; s* w, Y
- ;精灵缓冲初始化
+ p) V X; n9 H S5 c8 ` - LDX #$009 S& O) w. I9 ^& p+ `
- LDA #$F87 f/ k: g9 \5 G+ K3 e
- .OAM_Clear0 G6 Y4 k5 v |- u( Y
- STA OAM_DMA_Buffer,X7 ?& c6 r4 ~/ `8 E8 k) `
- INX5 S% T+ l% c/ ?- `% ~6 |8 E: o4 w$ I9 f
- BNE .OAM_Clear. Z0 n- G3 F' z/ j) i
- 1 o3 g2 S( c: n/ Z
- ;栈指针初始化
, }: x/ N, U7 t& ` X( U3 y- G9 a, N - LDX #$FF& \3 c0 t* P$ }
- TXS
) B- E; w1 }. [* x0 Q -
, _0 ~, G) m$ C3 c% p - JSR Nametable_Clear;命名表清空
& i9 W2 F+ A5 `. t3 R, i+ ? - JSR Palette_Init;初始化调色板缓冲
1 }5 C8 d5 C# P# j - JSR Static_Text_Init;初始化静态文本
' P1 h" O0 L% `3 H& Z) Y -
+ |) @$ V% z/ T7 Z B! m4 r% V3 s - LDA #MUSIC_ITEM_TOTAL - 1
7 S$ ^+ y+ T5 y G! M; Y4 O - STA FC_Music_Max_Index [- R" C' U. K9 f4 |) i4 a
-
: W; j. t: P9 Y" P T4 c9 d3 P, D) ? - LDA #$1F( b. \4 k% X2 x |, b
- STA APU_STATUS
7 W( P5 [5 [+ I. ]# X1 u, } - LDA #MUSIC_BGM - 1
3 |1 }# \) f) y B: D9 a8 b7 c5 P - STA FC_Music_Index7 \; V( J) R/ p7 l5 o
- JSR Music_Init_Process;音乐播放
9 _& d! r5 C3 l3 k# a -
7 S) l$ d: z! u1 k - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
7 Y' V( F( Z5 x - LDA #$1E
/ `5 M( b5 d5 Z+ A& U - STA FC_PPU_Mask_Buf
5 f" c$ _* g. K! b9 `# o; i -
: k6 r/ N% _3 m/ \% ^# O. n7 V - ;启用NMI处理
+ H) `- r: J6 i% a - LDA #$80
# p7 t: S/ g) ? - STA PPU_CTRL
. J% T0 V$ O1 }7 m; p - ( m5 Q) W$ e- Z6 p6 e% @ f
- ;程序循环, 剩余工作交给 NMI 中断处理/ M a0 ~9 t* G S3 N
- .Loop( c6 _ K7 J4 Z* C
- JMP .Loop; P! o& `" S7 D; }( j
, Z' [: f1 ?! Y1 p$ y/ {- ;======================================================================- y$ h2 q8 e$ r* [
- ;不可屏蔽中断处理
, u! M1 ^9 C0 I5 B! s/ U0 Y - Nmi_Program+ Y! D+ v% D! p/ j9 |# G+ k1 f
- PHA
% @5 H, Z2 _: K& _- K6 ?8 v - TXA
J0 H/ c8 J* ? - PHA
. i# @; n' ]" F4 x - TYA6 M5 M* z5 o. b2 \6 k' e. |2 D
- PHA5 z: o' D- x8 |% [2 F! P' E2 x
-
3 N5 M; h+ A" L2 V - LDA PPU_STATUS;读取使得 PPU状态寄存器复位; F4 t- J, G: e( Q8 F; b
- 3 j. C8 u7 Y* T9 V. c o, k
- JSR FC_PPU_Procrss;PPU处理: c5 M* k' r" c, b4 ?
- 5 s6 Y. t6 k9 ^$ i
- ;精灵内存更新
* i w* U, E9 T3 u- d - LDA #$00
: b0 a# B% q3 ?, I v O - STA PPU_OAM_ADDR4 N6 C7 H. A. B+ r
- LDA #OAM_DMA_Buffer / $0100" F* }2 _: f: b# b' P
- STA OAM_DMA: m' ]5 e7 W5 _. [) f
-
: W- ]& }8 X9 q3 `$ h - JSR FC_Gamepad_Process;手柄输入处理5 s8 [! a% n, D: G, z, z
- JSR Music_Select_Process;音乐选曲处理4 q* q7 k; e; d" r" Y
- JSR Music_Play_Process;音乐播放处理* [" Y7 Q5 l E2 d7 ~4 r2 S9 e N) w
- : c: O* Y0 |* h0 K" ~* d1 v
- PLA [/ p& q5 F6 h2 S3 g
- TAY0 ?3 ] n9 P* b0 v/ s4 H
- PLA
0 ]% }- g7 _. o - TAX0 a, Z8 Q; f5 g K, D7 g2 D
- PLA
5 l5 ?" C% k7 e+ s
3 Y5 K: ~4 R% s, ~% E. o- RTI" g( ]5 C7 C& m( A; l7 K; J6 y4 A
% x3 l4 H6 L. ^3 {- ;======================================================================* W! \8 `2 \' ~4 i. M1 v
- ;请求中断处理7 V$ B( J# p! r$ a' W5 s
- Irq_Program: O. n# y1 M) G% a
- RTI4 |8 y+ }" C+ ^: R T
- ! s- h1 Z+ J! B6 B6 L( N
- ;======================================================================
+ t0 d& d' v6 m - ;中断向量表
( C1 {" Y# q+ h+ C& f0 q - .ORG $FFFA$ W. o' [' w5 `, e! F+ |3 ?5 D
- .DW Nmi_Program ;NMI触发时执行
0 [* e, Z3 h! n7 N/ u, T - .DW Reset_Program ;载入ROM时最先执行
: Z; i/ R9 ]6 w; r - .DW Irq_Program ;IRQ触发时执行) G+ U, z: b: d; e/ p) g8 U
复制代码 2 D5 o5 V% `4 x# c
! ~1 U, l3 C+ ?' r' n
% Z$ x/ m, u$ O# Khttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|