|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下8 W: ^4 b' a8 M* }/ ^ t2 b

\5 ^5 Q" i( {/ p% p1 z; l J以下是主框架代码:
) O2 l6 j( k" ], p5 K I- ;======================================================================) j$ `5 l( k$ q, m
- ;文件头
, C# |: x" H" \& }0 B+ a0 b - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
8 Q+ _2 Y4 f3 j - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量! H# T' @! M. E0 r; b: S
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
( m2 O9 C3 o+ ^ - ;======================================================================
3 \! D" D# i5 Z1 B( d' ?4 [ - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
% p! Q6 i5 j7 N! A - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
) P2 [& _9 O6 `; e+ s - ;======================================================================+ {& V9 l9 o! ]7 V
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
8 O$ b+ T" ]5 J& Q- [ - RESET_ADDR = $E000 ;主程序起始地址! c( j/ t/ M; s$ _/ c- ~
- ;======================================================================; n2 k+ f4 y6 Y" x% J2 M
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
3 f; r1 j, {& `/ X6 T - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
& E+ j. U3 I7 k+ F - .INESMAP 4 ;Mapper号 (0-4095)
% K( H; j5 |" H6 A6 {3 O8 f - .INESSUBMAP 0 ;子Mapper号 (0-15)
6 k: y/ j9 C+ ` - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
h- D' L* _" A - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在), k$ g3 p9 K$ u6 @! {
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
) X/ d4 u; j# R0 r2 ^" E - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)- b& a$ c1 a2 @% a3 v
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)8 e8 f; M! Q1 v: a0 t/ J ?4 ^ ?
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
- v% O" O1 g. O1 v, i& D - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)2 [; h* B0 [5 f) T6 p6 T4 X
- ;======================================================================- I" M5 T& D% M r+ P! B
- .INCLUDE "fc_demo_config.asm" ;全局配置
7 G5 W4 G" a0 I. A. {" L/ D" k - .INCLUDE "fc_demo_constant.asm" ;NES常量3 H3 R$ M6 D8 J+ w) U# Z& K
- ;======================================================================
; u% T( X8 W7 }3 [; o6 q+ e - ;音乐配置1 F+ ~# k( P! `: s- k
- .IF 0 = MUSIC_THEME
' D1 [% V; w- X5 [9 T - .INCLUDE "data/music/Gremlin 2/config.asm"
$ t) r4 @5 S; }7 e! Z8 Q - .ENDIF. [. n' k; X" O# s; a0 y1 v! v* |
-
% p& [; J5 U- A# i! w1 y/ l H% | - .IF 1 = MUSIC_THEME8 z$ V1 N- E' Y' ^6 P% E6 d! l
- .INCLUDE "data/music/Raf World/config.asm"' ]1 q; m' I% I2 P9 h& p
- .ENDIF
, f2 f% Z% g2 M* Y/ @( R2 H -
2 A5 Y) O( Z* f1 p4 d% M; h) m - .IF 2 = MUSIC_THEME 8 k; g3 r4 i' I/ h* B
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
" S! j3 ^4 f% d' l2 f2 p/ u* T# H - .ENDIF
. Z* V$ Y' e+ i7 |4 i. a - ; j. o1 A: U1 e( l1 P' A
- ;======================================================================! c5 W, x" `" ?/ C. O. B9 [9 t5 i
- ;引用CHR图像数据3 W* N2 g) g/ X5 |" [: G3 |1 b- k- A# B
- .BANK NES_16KB_PRG_SIZE * 24 R2 z7 s8 n) ~/ l" w
- .ORG $0000, I8 [. _+ A3 c0 ], b% [
- .INCBIN "data/bkg.chr"
N9 z7 T( S# i4 S - .INCBIN "data/sp.chr"
" t/ y+ m( z; b3 T1 ^7 E$ }+ q - , n5 D; u, j9 {, r' A+ I% U% ~
- ;======================================================================0 ~4 b) v% z3 M0 a# P2 L
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
' p+ r" k0 N4 M0 p - .ORG RESET_ADDR
& I1 j3 F: Y. \( O - ;======================================================================
0 t7 R. ]7 p1 B" }0 z# J2 Q - ;引用其他源文件
E/ m+ o5 i m7 y1 v. C3 D - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
g. @* t. M# n: a1 T" ^0 b - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理" G. e: W4 y4 G; |) j& w2 K
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
+ Q( ]) b/ Q8 e1 h' z- W5 {1 C - ;======================================================================
" y& V- D# q# p4 F- f! O$ W6 ^
: @( V6 b- x- K: H; n. v- ;======================================================================
: n2 i9 Q {, r! v1 V0 T O- L - ;等待VBlank到来4 ]* \3 `2 b9 T; i
- Wait_For_VBlank
6 y) J& y; I6 d( `$ s - LDA PPU_STATUS
% d8 M/ j; ^6 [3 E# ^8 D - BPL Wait_For_VBlank( ~ J, O% [& M
- RTS9 C" J1 w5 x! u1 ]/ @
- 5 t, g8 k0 M8 M# Z( f, k# K$ X
- ;======================================================================
- C6 i5 p. P. x9 s7 \- E: r: Y - ;调色板初始化
1 ?7 B/ y& c# P! [5 y7 C3 S% ~- j, f - Palette_Init& h+ T+ U! Z/ |6 `, ^- Y" ]
- LDA #$3F
, n* r) S7 w. T2 ?% D; {7 c - STA PPU_ADDRESS# |9 }' A8 j9 e7 n
- LDA #$00% L4 z" G( z8 C, z5 \
- STA PPU_ADDRESS1 K, M. Q0 @7 `1 S4 ^/ h
- LDX #$00( `0 P% ~8 k* B; W* n+ r! l9 j
- LDY #$208 v9 \1 [& ?1 N/ A3 Z
- .Write_Data
9 h4 z3 d0 W* y$ s& e# o - LDA Palette_Data,X8 p5 w; T" C9 ~ C. V
- STA FC_PPU_Pal_Addr,X, ~% F! ?/ f9 W# M0 G: J; C. q
- INX
5 B. P2 ]# }6 |+ Y; c7 h/ e9 p: ~ - DEY& t! X4 c: W% h
- BNE .Write_Data/ T- A( G q/ N& ?
- .End
2 ]7 E% W) C6 k8 _; U# d - RTS3 P& Y9 n4 U2 h1 I
- 1 c) y* g8 c& o3 z! t$ ]
- ;----------------------------------------
4 y5 L6 Y4 q' K# F/ { - ;调色板数据
% m& f5 O0 U b, l( W0 R4 m, J - Palette_Data2 q' Z+ S# M, K. j$ s& o
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B; h/ f7 J$ j/ o
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22% N. r5 O/ B: U- r6 M
-
3 C0 r6 f! R! a0 @/ F6 T - ;======================================================================. Y* X0 Z q' V/ C3 V# o K
- ;命名表清空& J7 b9 S6 S+ l8 J; d
- Nametable_Clear+ d% ^+ @) z. k# i# k$ B
- LDA #$208 H; P1 I* }) ~4 K& U! Z# f& b3 T
- STA PPU_ADDRESS& O6 V9 b7 Y8 T6 t1 N8 ~
- LDA #$00
# s+ X: Q) ~5 G6 V7 B: n - STA PPU_ADDRESS
7 J) Z) @0 e, H% ]; m. g - LDA #$00
; F3 o$ Z6 j z4 X. ^ - LDX #$00' o: {( M; C |
- LDY #$08
4 G' V: C1 L7 K9 \ - .Write_Data
. w% S# C8 s& B: Y4 W; d- A - STA PPU_DATA6 r' r4 ]2 w+ s$ h
- INX
" _. k& l% d" i/ f& m - BNE .Write_Data/ S3 w8 s( ^) ~9 |& M
- DEY
0 b" H: Y2 y+ ^- Y - BNE .Write_Data
4 E& D& D* {, {4 R1 d* _7 ? - .End
2 B6 q2 ^) w, G6 ^* \# k0 M4 E2 a! @! N - RTS4 L9 j( Z) ~. K4 A# ?
- ; P/ `2 F( |* x
- ;======================================================================
0 g1 r$ t3 {: ^7 V% y1 { - ;音乐曲目切换
, D) y/ C) T# W4 v- W - Music_Select_Process
: }! K0 p; x( x* U6 S( F
) d7 H( v% w3 @: E6 T3 p- .Pre_Music;上一曲
1 D' i" k5 h9 Q* Q - LDA FC_Gamepad_Once* T, t- ?3 H6 E3 z4 |7 V8 I% _
- CMP #JOY_KEY_LEFT
$ E) C- Q0 F4 }# w - BNE .Next_Music1 w' n; U5 I$ A6 e) x, u" V0 e
- JSR Music_Play_Pre; k$ s) o$ _# ]% }4 T8 O
- .Next_Music;下一曲
. y9 T4 V: r+ u! M* ^! o; G. g - LDA FC_Gamepad_Once
7 m' B/ w% z! i( {% u - CMP #JOY_KEY_RIGHT
0 M6 F" E9 T3 l8 g9 |$ h - BNE .Next_10_Music
1 ]/ d& T. l* j0 P/ y+ h - JSR Music_Play_Next4 F& X) @3 X6 z4 `; Y ^
- .Next_10_Music;上10曲, D6 o7 }7 v' _- Q0 F
- LDA FC_Gamepad_Once
7 o4 [* r# L q# ]2 w" W - CMP #JOY_KEY_UP# f( ?5 D! m. A% \% N7 ?
- BNE .Pre_10_Music
0 d3 _2 C+ g7 @/ ?' B1 b3 T! v9 @ - JSR Music_Play_Next_10
0 V$ |5 u4 D' [5 X1 \3 { - .Pre_10_Music;下10曲* V' E$ q, q1 D8 X/ Y' I g' W- W+ N
- LDA FC_Gamepad_Once: [+ J7 z0 k! X M2 M6 i: |; g
- CMP #JOY_KEY_DOWN
* Z9 Y9 Y& n% y. r- u - BNE .Reset
, [) r+ L+ L7 d; F: K - JSR Music_Play_Pre_10" V* {5 a- \ R0 D& v
- .Reset;重播当前曲目
+ F$ k D( f! Q J - LDA FC_Gamepad_Once0 U6 z* z& V$ ^/ n# B ] |
- CMP #JOY_KEY_START
1 d8 ?7 S2 ?5 f: k - BNE .End
: P8 H! k4 _" t" ]* k - LDA FC_Music_Index3 c8 ?( O4 J2 N3 {
- JSR Music_Init_Process
6 ]! `) e. u. q& t6 p3 A - .End
; {0 ]2 {9 [$ U3 G9 |& X - RTS
2 [6 w( Z7 I5 {+ U( t# l# b/ g5 b& f
! k% S' v! Q0 }$ e8 t- ;----------------------------------------------------------------------
; R5 s* m7 x1 T1 L F - ;播放上一曲) Z. M* k5 q6 g
- Music_Play_Pre
/ o( k6 F8 y& u, u& W - LDA FC_Music_Index! J5 n8 Q# \8 K* A! [! g
- BEQ .End) N6 N& K5 _9 `2 t/ i1 I
- DEC FC_Music_Index
1 ^7 u0 d* Q3 ]1 ^ - LDA FC_Music_Index
( F0 h- e8 |8 ?- Q - JSR Music_Init_Process
& ~/ d c' z m- [* F - .End
0 F2 S8 P7 G: w. V- h: P4 K - RTS# l( ~4 T) r1 F- U* c! s
- ;----------------------------------------------------------------------6 I% T7 k) g/ E9 X+ \/ H' M5 z3 a) n
- ;播放下一曲+ M; J, w2 J2 f; P5 m& F/ l
- Music_Play_Next
4 \! w1 T7 \, s& }3 R6 z - LDA FC_Music_Index7 l d9 s% f7 t* K, e' x
- CMP FC_Music_Max_Index+ T- l6 {2 ]" W/ }. e0 J: [
- BCS .End) ~3 [' D% w/ X4 l \+ v, n8 y$ b
- INC FC_Music_Index0 H, U1 g$ F o5 j. {4 H3 x
- LDA FC_Music_Index# n% c# P2 v" y$ r) V
- JSR Music_Init_Process
, s. `, I) w, Z2 m4 N1 _) u0 W - .End
5 U; d% y- W. t. i i - RTS
+ A% V* |# i) [3 e- ?2 G - % T4 q4 {1 B, {4 H1 n- i! m! E
- ;----------------------------------------------------------------------
; ^+ u3 l/ A; k - ;播放上10曲
7 z* @' N/ l: u - Music_Play_Pre_10
$ x+ T! ^0 w. X2 _ - LDA FC_Music_Index
. C6 c/ o+ O3 z+ y4 g - BEQ .End9 G3 M( W2 J9 m) k0 H
- SEC
& z2 O; Z( v+ b3 E3 U# V+ ?. a - SBC #10. W/ R$ R6 @. H1 a$ c7 M
- BCS .Pre_103 @5 L" c+ {+ O
- LDA #$00
: ~6 [" I0 I1 k - .Pre_10
) i/ ?3 W5 n2 [7 ] - STA FC_Music_Index8 l6 A4 w/ d6 `- T7 z& b6 k. n/ Z
- JSR Music_Init_Process7 {/ O& m- J, j/ ?3 r2 Q. u
- .End( R F) D( V' d1 G
- RTS4 L7 X0 I, I4 C2 l1 N- v M
- ;----------------------------------------------------------------------
8 m' m8 z5 s$ G( X }! {6 I - ;播放下10曲
0 o1 b+ O/ l# I - Music_Play_Next_10
2 {# N8 l u0 m" T* A6 ` - LDA FC_Music_Index
$ w6 A( X( @9 p$ {7 E; p! B - CMP FC_Music_Max_Index' I0 @9 e7 x. C1 r
- BCS .End
# L# X( w1 Z; `( J - CLC
, J4 p( Y* F: ?9 S- S- {( o4 f6 r - ADC #10 Y5 [% j; C1 g7 Y$ |- g- a! }
- CMP FC_Music_Max_Index
! G% B( C% C# m0 \ - BCC .Next_10
5 D+ D' e# O/ d1 x - LDA FC_Music_Max_Index8 [! n0 Q1 V( V
- .Next_10' w8 {* o6 P! D6 e2 y; `
- STA FC_Music_Index- R- s( e G1 V* L% P, ?
- JSR Music_Init_Process( W1 H3 x+ F$ r, z* q
- .End& I" i0 L: M7 x |
- RTS. J' [5 p- @) c( D9 S# ~& h
9 n4 x0 i J+ O6 |. Q- ;----------------------------------------------------------------------
, v) B+ p# |2 f: f$ X - ;8位十六进制转3位十进制制
! r4 J4 |( g! w - Hex8ToDec
8 x% b: c! }) P! o0 K4 r* P - STA FC_Dec_Data_1- X; \# w8 a6 `4 Q
- LDA #$00" H/ F. [% L7 [; }* \: m8 p, I% C
- STA FC_Dec_Data_100
1 t# e8 r, x- L9 _ - STA FC_Dec_Data_10( ]8 \# w6 t" ~3 m' J% G+ k( L; x
- LDA FC_Dec_Data_1# E+ h g! c J* M B/ S ]7 l
- .Convert_100; M5 A$ q3 {: d3 o8 w4 C" z# E q+ i
- CMP #100
7 _. a9 o8 C6 `2 S/ s4 i - BCC .Convert_10
* O, s9 v: a- o5 [. N - SEC
+ G! U* k% ~- n5 k5 [ - SBC #100
3 k7 q0 q1 `7 a* I# z/ t, v - INC FC_Dec_Data_1005 K9 @" ~+ g7 i) u4 I
- BNE .Convert_1000 Q/ l% v- T* ^- p$ u6 q
- .Convert_10
) ~* f0 x' Q1 ^! {: n - CMP #10
! e: B2 z! v: a0 s7 l8 U - BCC .End
2 z" D1 Q1 V/ ^; R; @6 X* q/ y7 h - SEC
! V# z% L( N( s( m) S r - SBC #10
# z8 c4 [' A+ a6 ?* K - INC FC_Dec_Data_10& O4 e# X8 i5 F- f
- BNE .Convert_10
% H" }8 n/ e. V0 Q% B* l - .End- Q8 S4 g: s7 F( h
- STA FC_Dec_Data_1
$ P1 s( }2 k* e - RTS
5 C3 e' y3 Y. y
, N* a2 G6 i, c6 U0 t3 E5 S- ;----------------------------------------------------------------------
7 p# K6 w, n, N7 A! _ - ;显示曲目信息( R4 f+ d7 e2 [1 k$ A# Q$ [
- Music_Info_Display0 q6 T6 K* @0 S8 g2 W: H. v' s3 E
- LDX FC_PPU_Buf_Count( I2 G( p) o. M) H7 A
- LDA #PPU_WRITE_MODE_CNT_LINE
' G4 Y0 C7 E9 I! z - STA Use_PPU_Buffer,X$ E. m& V7 N+ ~# r/ t# Q
- INX3 k, H" l4 i7 i* S: Q+ x' {/ y
-
, x, q* I5 C1 G; W9 B) P8 d* l - LDA #>MUSIC_INFO_POS& @- M8 n7 f$ V' r$ \( H X( c
- STA Use_PPU_Buffer,X
& m# w$ z& A! L7 N( s: `* b9 t - INX
- K, x% r2 k4 o8 `8 T -
9 C; q9 j7 i2 J - ;居中0 z7 l* W' b2 a' e
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
|2 v1 y4 D1 |4 U: {1 D$ v - STA Use_PPU_Buffer,X
+ l1 N l+ q y/ ]" t, z; s% i - INX
) t2 r0 p1 X( G- C6 g -
& s A' {" ^+ x0 B( E: s - LDA #$05
# o* a! _! D4 v: _" d& k - STA Use_PPU_Buffer,X, |' v3 }; z8 _5 Y- A2 h
- INX
( L3 B: T0 _$ r6 E. Q6 M; ? -
+ G5 l% U4 i) E# q" j9 q w0 H - LDA FC_Music_Index
: R9 j2 B: U9 T7 v' L - CLC1 Z' q4 r8 m9 c& l
- ADC #$019 O$ M4 b, p3 c
- JSR Hex8ToDec
; |2 u1 X& t/ o0 B+ t -
* A5 s0 L4 A3 g- \ - LDA FC_Dec_Data_10
- }6 q( @1 H3 q4 u$ e, }1 q - CLC
2 X. j% H7 ]1 Z - ADC #'0'. @5 L# P% i$ q) ?* D) N
- STA Use_PPU_Buffer,X
* D$ T7 Z8 ?9 Y- F/ O8 ^ - INX; q0 u; l9 t |! ?
- / x! g6 n! ?" m- F
- LDA FC_Dec_Data_1
3 W; Z2 |- l r* e - CLC
; {5 C7 T* b) T7 P9 h6 }( V - ADC #'0'0 T+ T' k: R3 m* K
- STA Use_PPU_Buffer,X
" [: Z+ l* g8 A2 d( |$ S3 R' m6 Y - INX
! _- T% x# x4 M4 L: s. [2 G -
6 r2 x9 y: O, A/ H. A3 B. \; S - LDA #'/'
0 A3 ]# y* J, Z6 d - STA Use_PPU_Buffer,X
' c n+ c% C9 O5 P* p1 ~ - INX6 s! ]% R5 v( ^
- , d! C& i( r& F2 w3 s5 I0 a* Q7 i2 \
- LDA FC_Music_Max_Index
; o, D7 u5 I* F( A' z - CLC
! J4 t5 |4 L2 A$ t9 s1 V - ADC #$01
$ m( W- p" ]+ U/ T) j - JSR Hex8ToDec
! @ R2 @. m$ _( L/ j* t9 M - 9 ^9 m' g% K+ I$ C$ `/ q
- LDA FC_Dec_Data_10% ], Y* u+ `: n( B; _: z
- CLC
3 M4 ]9 }: k6 j8 k9 v4 f - ADC #'0'
3 e$ S. r! @6 K- ?4 Z, ] - STA Use_PPU_Buffer,X
3 P% g' F4 e% N# H3 [, `6 \ - INX; B- A, Y' S( W& [7 r
- / C' e7 e0 W" @$ P% F3 d7 ~0 R
- LDA FC_Dec_Data_1
% }2 R3 z" V7 {# N - CLC) G3 B( h, R/ ~2 a9 g
- ADC #'0'
( b' ~) ?8 O x4 z4 e- u& a - STA Use_PPU_Buffer,X( R- h, X# P! _. z
- INX. R- h& M3 N; O
- 4 }( Y P9 L5 I* k5 w6 f! h7 g
- .End/ i8 Z0 W7 F# |' V* e
- STX FC_PPU_Buf_Count' L" ]+ f" K4 C: i: O3 S
- RTS- s9 R9 n: u6 b( @8 y
- 8 Q1 c. [! l9 w" X w2 Q1 @
- ;---------------------------------------------------------------------- W& m8 A2 Q6 R5 t+ @+ t
- ;音乐曲目初始化处理 N7 E1 Z- P' x. t
- Music_Init_Process1 V0 g0 u/ H& T) p% J+ Z2 s2 f% A
- PHA
7 W9 S x2 {! ]/ P; h# \ - JSR Music_Clear_Process1 t4 q- m7 H# q/ E
- LDA #$1F+ T% W4 o* |& n: S4 X" E
- STA $4015
) h5 l3 p' d( S0 f4 a g6 U - PLA" g% W; _( {/ L3 X& G; T/ [
- JSR Music_Init_Addr: x3 ~% z6 ^+ N8 N. C
- JSR Music_Info_Display! J9 z- Y! D( d
- RTS
# X6 D2 E. @1 |& T2 g/ H6 @/ h - ; T Y* Z& @" x! }0 G% N* c0 y! s
- ;----------------------------------------------------------------------% h) c) |4 b* h" C" p9 W2 ~8 {1 E
- ;音乐播放处理$ u$ b/ P6 A4 w3 P" Y# l+ G% T
- Music_Play_Process
' Y1 ^$ p* `0 ^2 \, h, H% V - JSR Music_Play_Addr
: I4 n$ t! D9 Y+ G* O* H - RTS
5 C) b7 `* K7 {7 i" T( |* Y4 b
1 ?, A; w& ~" W6 c- ;----------------------------------------------------------------------, q, R$ l2 [8 g% y
- ;音乐播放处理
: e# F: l- [3 L4 ~7 ~+ k - Music_Clear_Process
; G: A/ R P- W( ^% f: [' l% o0 ~ - .IF Music_Clear_Addr
8 \9 D% B2 n! a' V& q - JSR Music_Clear_Addr
x, _+ l# B8 C, M& O% ]# j - RTS
: v9 @# D" D$ S+ t+ x - .ELSE
, }% V( ?; z4 f' h6 i - LDA #$1F
* B& |3 s, q% V- |; @! U - STA $4015
) E+ c. \; M+ i, ]7 F/ E - LDA #$00
# s9 H/ A# }7 U+ M" s7 J - STA $4010# z8 G$ o; m2 m9 R. K( ~1 `: ?
- LDX #$00' H* X: K K; s2 y
- LDA #$00% M" r- m& E3 Q2 n/ [7 F0 \
- k2 A' }# t( q
- .Music_Clear_Zreo_Page_08 y2 v3 |* n! S7 ?9 Z& f
- STA $00,X! ~1 a$ F% E* P
- INX- T g: H- _% ?& e$ P' o" |- g8 k
- CPX #Use_Zero_Page_Begin) F1 i4 `+ M8 }0 W
- BCC .Music_Clear_Zreo_Page_0! n8 J' w0 l+ N( _& R6 g
-
: T& k9 h# N9 Z - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size* s1 p5 M/ l! K8 K: o3 s
- .Music_Clear_Zreo_Page_1
: A3 M* [* s9 M* J j - STA $00,X
( ]- L+ g4 B1 q& S4 W - INX1 x3 b( j) [9 H) }6 D
- BNE .Music_Clear_Zreo_Page_1* _/ t$ G+ |$ R- g, T1 N
-
0 ? }, [: t" K - Music_Clear_Process_1
3 G0 o, Y, w) n. J - STA $0600,X4 U8 } b: [8 c% G5 E
- STA $0700,X7 U* F* G0 {) k) `- U
- INX
& j& w' {: O% q9 V, O* C- V, X: j - BNE Music_Clear_Process_1
1 l. E6 _' i% _ - LDA #$10
7 q$ ^ Y7 n1 ?% \9 s3 ] - STA $4000
- P. I# @% r1 m. C l! K( g. t - STA $4004% A. H& ]6 t0 t- w: B3 I9 x) P3 y0 F
- STA $400C
9 c) M6 S0 D% {& q5 l7 |- S( @7 I - LDA #$00& C# X3 P. s( Q2 s8 i! M* q
- STA $40086 W3 C* X! }5 x6 g* f J7 B
- LDA #$0F" R9 x+ p5 U: ^
- STA $4015
% ~- G c% S' s/ M1 s/ }3 _ - .ENDIF
% W' z/ Y/ I [( a -
; [; E9 r* h# ?8 d: w - RTS
+ g5 k" w/ n k- f/ T; V - $ q& }: i# Y& ]
- ;======================================================================
5 z. W& ~5 e5 z) ~7 x - ;重启处理/ \5 M! h: E, X* z) J& ]+ \
- Reset_Program: I3 |8 O2 O' d0 `. W
- SEI
6 R5 t( B' G0 ]( ^; X0 r8 b1 b - CLD# y) V' W4 R+ t- H0 s
- LDA #$00
2 S3 A1 [! L1 C, c! x3 m: N - STA PPU_CTRL, E" o" @# r9 p: {/ }3 Y
- STA PPU_MASK/ h9 V$ S" t7 P. y# c* E
- STA JOY2_FRAME* s9 }( S1 Z( _/ ^* z8 r% ]( {1 M
- STA APU_STATUS5 Q3 a6 h. \5 c2 s
- " w. q$ A7 d4 X. `# e u
- ;等待屏幕准备完毕
* }- Q9 n% @1 v+ C, H - LDX #$02+ b/ ?! P. B& Q4 v& p( J, S2 V3 a
- .Wait_For_Screen_Ready. V" C6 t7 `2 A6 L, ~, Z
- LDA PPU_STATUS
8 J/ |8 X: Q# l7 r - BPL .Wait_For_Screen_Ready
# O$ O- ]) F) h2 t - DEX0 G7 @8 v: l+ |. G
- BNE .Wait_For_Screen_Ready
' h# j; a8 ~3 D& W - 6 M# g7 D- \# p, o" \3 G. O+ h' ?
- ;清空调色板
: N. A& b' H2 |4 n& A - Palette_Clear
7 m" e3 v, ` A$ m& h& R# B: U) u" D; _ - LDA #$3F
8 d1 A% d! y# T( x - STA PPU_ADDRESS
7 B3 @' G5 R9 B1 E, Z8 c" D2 ^7 o* q - LDA #$00
) Q7 }/ T* Z4 M: F( s0 y - STA PPU_ADDRESS9 ~- p5 v G- q# O" j, ^
- LDX #$203 R* F+ K) \* ^4 Y* Z
- LDA #$0F# ~9 B" y. [8 }
- .Write_Data
: Y5 y5 z7 q" Y z - STA PPU_DATA" R2 V8 e5 H' X( u- G# w
- DEX, J+ w+ g4 H# d
- BNE .Write_Data
( W+ H- q9 A _9 Q5 _
& O4 J) m2 x* z3 ], g- ;清除声音 $4000-4013
& k0 i3 q! w% W% s/ G r - LDY #$14; ]: @3 N7 H/ ]: g8 K
- LDX #$00
7 i, ~: G) ] ^8 w# m$ ~- { - .Sound_Clear: N k* U3 O% ~# P7 S' {& i
- STA $4000,X
0 V( B c* h! F - INX
, g9 H6 _# e9 h8 R- N, L' ^. [5 h - DEY
: j! T# q2 | m$ h6 r - BNE .Sound_Clear
H+ J: x- X0 f1 v( Z - , r; Q; V/ i: h! A+ a
- ;清除 RAM $0000-07FF h+ v) m' w' D% ?
- LDA #$00* l7 B% E; p* k" P5 T) S
- STA $000 O) T3 j: K; Z. j
- STA $01) i" p9 N2 @* y
- TAY1 p8 q7 H8 E; k$ z
- LDX #$08" N/ v& n% }$ `! c
- .Memory_Clear2 x2 \$ M" f7 `2 D! I
- STA [$00],Y
; n! V: G: w& j8 e% B - INY
5 n9 J- v3 ^) d4 y; G - BNE .Memory_Clear" y' _" X) w; x" L* D- o+ U5 g7 ?
- INC $01
; I* T) m# F9 i# N - DEX2 ]& r, g/ G/ @# s% r, U& m0 D7 y
- BNE .Memory_Clear2 Y" F3 K- n, ~ i! B
- 7 H0 y1 C0 ^ ^. G$ f0 e/ m" @
- ;精灵缓冲初始化
( ^, ]' X7 L8 [" S( q$ U+ U9 O - LDX #$00
?& W, ]+ x& D0 p2 Q7 N6 ] - LDA #$F8* D; k/ j$ o) F( A. ]
- .OAM_Clear
; u5 o2 V$ P7 K* T5 l0 z - STA OAM_DMA_Buffer,X
& e. c3 H" g) s5 N - INX
; a9 K/ |: B3 y7 [/ b/ a! |1 z - BNE .OAM_Clear
) U# b! a3 b( w0 r$ m" _ -
8 ^, \; b3 [/ {" H8 ^% C5 @ - ;栈指针初始化
9 ~) G. Y X+ T+ _( \- J+ \ - LDX #$FF
Y' u+ M5 L5 l& ^5 w* u! m- { - TXS( t* e7 P8 m+ {/ I1 V7 j8 J
- 4 [" S7 z1 [1 k
- JSR Nametable_Clear;命名表清空4 J2 R1 _7 H1 v# X1 V, S
- JSR Palette_Init;初始化调色板缓冲
0 l; ~( K5 f+ ^ - JSR Static_Text_Init;初始化静态文本
4 e7 Y# a' X2 I* T8 H2 E) `1 [& b - ' K; S' z2 q8 D, E6 d! N- ^: I
- LDA #MUSIC_ITEM_TOTAL - 15 g3 m; o/ j d4 B& V
- STA FC_Music_Max_Index
7 l5 ?2 L- U4 ]2 \ V4 z. B2 J -
: E. s- p# c" b! K! g9 |. w - LDA #$1F
& M: H3 ^8 A/ {. Z( u - STA APU_STATUS
7 a/ f' u) c. i3 o - LDA #MUSIC_BGM - 1
+ ?4 t7 W/ L& c! @( Y - STA FC_Music_Index
: M8 R2 c( {! O% Q - JSR Music_Init_Process;音乐播放5 F7 j: D' q/ G' ~( _
- s1 ~# T; p( U3 [5 y/ P8 I3 Q5 y
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)( }$ e; Y# D! l: d! w
- LDA #$1E
8 f3 m' D! |$ A- f B& N2 y - STA FC_PPU_Mask_Buf
0 a0 l" y, C# f" E. M4 { - 7 ?) x2 F8 }% O+ n0 |5 E$ D
- ;启用NMI处理
* ] X. X4 |7 e9 }2 j/ R; ~# G - LDA #$80! l8 V1 Q- {0 }$ B( Y
- STA PPU_CTRL" O/ q7 y3 s4 a6 d* |
-
8 x% X8 B7 M6 n - ;程序循环, 剩余工作交给 NMI 中断处理6 p* R) ~$ t. [8 x0 T- v% w
- .Loop' a/ p3 e& x( I& A" g/ R+ Z
- JMP .Loop
1 w- k' x( R& f+ N/ C - " K) a5 n+ _* J1 q$ J
- ;======================================================================0 h& A( f6 [* E$ `+ a
- ;不可屏蔽中断处理8 i* Z' C% y( V5 T3 O
- Nmi_Program
1 {& T( B# V/ \2 a - PHA) u c9 U6 [ p8 t( v5 k* r8 ^
- TXA& a0 b* q' b" e; W. } r. g
- PHA; C& R% `7 K- C2 u( ]; d* J
- TYA) V! \- T* n4 ^$ ], ?1 F
- PHA4 y6 K2 I2 o. ^! b4 X" _ ^1 U
- 9 @& c; l9 J8 n S5 [
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位: J r. B3 `: A6 K7 W m; u' r- N8 e
- : [8 s1 ~' b7 y. N% ~
- JSR FC_PPU_Procrss;PPU处理
- Z8 o0 \0 F9 H7 X* t - . T1 E- F' F5 o6 W; R
- ;精灵内存更新4 w' [) O2 _* s* z- E! T: e
- LDA #$00
, h7 ~1 [# F: L- C9 j6 L. x - STA PPU_OAM_ADDR% i, D6 R1 ~: N0 E; y7 q
- LDA #OAM_DMA_Buffer / $0100- ]1 ~" O( d% D9 V: u- m- D7 B6 \1 v
- STA OAM_DMA
5 o1 P- N% Y; H; H* v7 |4 r& E+ H -
" o" Q: E) o3 i4 w: x - JSR FC_Gamepad_Process;手柄输入处理( j* D7 Z: L" J8 G5 u9 c
- JSR Music_Select_Process;音乐选曲处理
: H" ^% @8 }! B: t - JSR Music_Play_Process;音乐播放处理5 Z j6 C& d" `% O- Z
-
; s* b" M) @& y) F. u3 T/ Y7 e - PLA! \" Z) T$ |' o9 X2 R1 \6 M
- TAY
/ q8 ^; k" i7 D) D8 W8 E: B& E - PLA
1 } e( f2 Q5 u0 x, J- _) | - TAX5 X6 Y5 f1 h" ` q4 `1 ?% r8 l! {
- PLA
* y- u2 _( H0 J$ x7 F& t - ! i$ j- {2 M0 U: y# R/ }
- RTI
u* b9 [6 U/ c: ^3 G! e1 n% G4 A" d - 2 [& ^% |7 V9 }( k
- ;======================================================================
9 g" Y; n. t1 h - ;请求中断处理2 l2 x" X9 g5 s3 ]1 y+ ^8 \
- Irq_Program
; v7 M4 h4 Z, m2 \- n* r& E - RTI' S# T. Z5 B+ p; ~
$ b! o# {7 Q2 `' D: a B. A- ;======================================================================) O1 M5 Q2 c3 V& ?4 b
- ;中断向量表0 I/ S: D$ Y2 z; c: J9 @
- .ORG $FFFA4 f+ k1 R d. N
- .DW Nmi_Program ;NMI触发时执行
& z8 H' {% i. |6 G9 z. `) ? - .DW Reset_Program ;载入ROM时最先执行
7 J3 N# S8 @5 G6 w( J. l - .DW Irq_Program ;IRQ触发时执行
8 V5 ^2 C! v7 o. J; m$ n8 V2 \
复制代码
: t' L. f1 U! Z* O$ L5 a( j% y6 H- p; Q0 q2 b1 y; J }
! y* m' D6 U2 F) vhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|