|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下 O4 g& |( ]8 i9 f/ I/ }) @# N

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