|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
8 z! Y" _/ S" E( P* p' R( X
$ n8 z0 ^- c# n7 K% e5 u0 D; C+ Y以下是主框架代码:
: Z6 q% t: D. u2 h8 }3 Y1 a$ N- ;======================================================================
2 u' I' A# s6 G- d8 q* i - ;文件头 K1 O' }7 A* ]# S: x
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量7 m2 r4 v* @) k/ j7 b* g
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
; N3 s1 n' B, b+ T - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
! L$ L3 |$ Z0 u( L - ;======================================================================* S* D F5 w4 x9 d. ~9 R D
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
2 u& X; P7 u3 z1 G# T) \4 e - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 15 [# D, D+ t* J5 i
- ;======================================================================( c. }4 q0 h) k- l* n# j
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1: O& Z1 i5 `' a" V
- RESET_ADDR = $E000 ;主程序起始地址
9 h0 x* P& D D# J) ?, l, `: E - ;======================================================================
+ f! Q" U# `7 _3 o, ~9 d - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB! f1 B6 ~7 I. C% l! }4 t
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB) H) k8 P) k# Q, j
- .INESMAP 4 ;Mapper号 (0-4095)& L" S. u( r7 n- F/ m
- .INESSUBMAP 0 ;子Mapper号 (0-15)- F( D2 e7 n+ x7 U, v7 f; O/ V
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
" z$ ^2 E# m! Z - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
0 v }2 Z2 G1 X3 e - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数), K4 p* u v9 t/ b+ D
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
5 l; p# e7 |3 @7 E0 K- g - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
- D G3 u" a+ N$ h8 `+ P, w - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)" k/ t- q. C7 Q6 a6 P' H/ l
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
- u s: B) j: V9 p6 s - ;======================================================================0 K3 c* Y, q/ Z: c! o0 S
- .INCLUDE "fc_demo_config.asm" ;全局配置
- r: c. J% C3 k) l - .INCLUDE "fc_demo_constant.asm" ;NES常量
! j: W/ Z" i) I" \; E7 T - ;======================================================================; Y7 l6 z5 f3 ~1 }- l
- ;音乐配置
& s+ w% |8 L$ Q# Q1 S4 M* e - .IF 0 = MUSIC_THEME
7 w7 _2 n- w) m9 `( b1 N6 o# J/ Q - .INCLUDE "data/music/Gremlin 2/config.asm" \% r% ], [' u5 l
- .ENDIF7 `0 g' ]: O1 r' ~7 x
- 3 L1 D! h* S. Q
- .IF 1 = MUSIC_THEME! X8 r) {' h1 }1 d/ r: ]8 F' {1 F
- .INCLUDE "data/music/Raf World/config.asm"
( x. U. M* K- z# j6 L, u- R - .ENDIF4 t2 l+ D; f3 \, f- @/ J
-
/ [/ M% U- x+ A: T, x( j - .IF 2 = MUSIC_THEME
7 P e4 C/ Y6 s1 j) G - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
3 Z3 X6 {, j) V+ Z8 { - .ENDIF
2 C, x9 j1 j# A& F* N" ^ - & Q# n' b& q( S5 | x3 @
- ;======================================================================
0 H# k, Q$ K5 D7 m7 C - ;引用CHR图像数据
' p! A8 w9 s' g) W# N1 [8 M- t - .BANK NES_16KB_PRG_SIZE * 2
4 _& e1 W# y ]3 T - .ORG $00002 q3 o" ?5 w% z% h2 M" k
- .INCBIN "data/bkg.chr"7 F8 X+ A) ]& S. O2 P) ]! n
- .INCBIN "data/sp.chr"
1 h+ C4 \# X5 h% L$ M, w# B4 K - , H R( b9 e0 o- Z
- ;======================================================================
1 Q# |9 }& Q4 G/ S8 R4 `6 t% g - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
4 S) f6 L! @8 g' u2 q - .ORG RESET_ADDR
" O0 Y$ Z: r2 c4 @( N1 [ - ;======================================================================
$ H, |; `2 e. p) n - ;引用其他源文件% S+ s3 l% }8 T/ r
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
8 p' p% H t- c! V - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
' X. o, T: N, a* W: j - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理2 l0 f. c( j7 D9 V# z6 J1 t
- ;======================================================================) A1 f- d1 F. v; e4 D8 j. M+ t# T
- , U" @1 O$ v+ |6 h, x9 ~4 V* v% ~2 Z
- ;======================================================================
$ s5 `+ [% y: V8 }' _0 O - ;等待VBlank到来
$ T2 z( q( R, A# [$ F/ X - Wait_For_VBlank, C0 c6 w* S3 Q# k
- LDA PPU_STATUS
# L) x& v5 ~4 I7 }: V; @& ?/ @ - BPL Wait_For_VBlank+ Z* j0 |) \/ C/ x( F
- RTS8 Q1 f. f# E d c% x X$ U( V
* g. V' J1 l" x. }; C* O) M E6 ~- ;======================================================================
# \ O! o- u* C! Y b( _2 S2 z - ;调色板初始化: M; H3 i. {- W7 b* g% S( p+ j. ^+ s
- Palette_Init
8 K, z, O: V& G s - LDA #$3F* O5 f- p* h! n' Q
- STA PPU_ADDRESS$ w3 a$ ?0 Z2 A
- LDA #$00# l! b* a4 c; P, X3 q
- STA PPU_ADDRESS& C. \' `) G! D
- LDX #$00
4 _. \7 T# X' {5 C. R - LDY #$200 b3 E# u3 g) G' g/ w
- .Write_Data
5 H; a+ n5 d' X# y0 D0 Y - LDA Palette_Data,X
" V% f' j e/ @( v5 i$ s - STA FC_PPU_Pal_Addr,X8 \/ E5 U K) j# c5 i
- INX
1 s; n$ A9 r$ a# N$ @ - DEY6 F$ N% P1 o/ }& e
- BNE .Write_Data
! f% t% \4 S8 j+ [/ W1 v4 J - .End! e, q- w" |! b9 {
- RTS
. ]6 H M8 v- F2 s1 Y$ f' n
/ c8 _: B+ R5 y; Y- ;----------------------------------------% z$ Q; q0 W! h* x
- ;调色板数据5 ?' l$ d" n2 u3 W, s/ d
- Palette_Data
9 i. A7 p; Z2 o0 e7 T* N4 ^ - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B$ U; q% P7 K9 V
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22( M% [, A! t- J+ J
-
; X& K8 e) W0 k" m, j; M - ;======================================================================
/ o9 c3 `6 m9 v. W) _: M7 K - ;命名表清空
" `; T4 z! _/ N - Nametable_Clear5 l* ]: v2 y4 e3 }3 ]" j/ x
- LDA #$20( ~% i. u; J) A1 C
- STA PPU_ADDRESS
) y/ A3 D. g9 {4 x% K% Q& _ - LDA #$00: w. i3 Y- @( R! Z3 }9 I
- STA PPU_ADDRESS
1 ^* }, ~# h: t6 A" Y6 I/ _" j - LDA #$00
2 L8 |" `% i9 W1 R) b# U - LDX #$00
5 _- a4 s+ V/ Z% a$ ]. _ R - LDY #$08 K) }9 v. K% t- Y3 d* G( A2 b/ S9 e
- .Write_Data- C" n; [+ o7 h4 C0 B6 T
- STA PPU_DATA
/ S; Z4 P4 I" s; L6 {3 W* c - INX
" b8 u4 f& k, _3 \1 E% O - BNE .Write_Data. E2 K2 d; l/ S; A9 t
- DEY, H+ Q6 @; p! i6 g1 F8 i1 C
- BNE .Write_Data0 a. X" r) _, b0 B$ h6 d' j
- .End
5 c# p/ }" B6 k e5 A T - RTS
0 D9 p0 m& J4 R# F
3 C) Y' G2 j3 n- ;======================================================================
9 Q" F. k$ V+ R1 c; l8 m. p - ;音乐曲目切换3 x. t4 ^4 c% B/ t4 y
- Music_Select_Process
% \5 h% H! M7 G$ [3 X
/ B" H1 `. z5 Z/ y5 I- .Pre_Music;上一曲
. @, B+ O8 s& i" j$ O - LDA FC_Gamepad_Once7 t% l6 {. r7 ~* @, x8 _
- CMP #JOY_KEY_LEFT
0 K2 \; b1 w, X/ b2 x2 ?% [/ l2 b - BNE .Next_Music+ i: Y; N3 i& u% A
- JSR Music_Play_Pre
, C: h5 q8 }7 @2 X - .Next_Music;下一曲! s! _2 s) F$ K$ T
- LDA FC_Gamepad_Once6 Z2 }( P+ U/ R9 k( W
- CMP #JOY_KEY_RIGHT h/ S T' d! J4 L5 j0 L
- BNE .Next_10_Music
8 w3 A7 G7 X3 n5 X( j8 A0 r: G - JSR Music_Play_Next& |, S7 ?, A8 [+ b. k
- .Next_10_Music;上10曲
% } u- g. u/ A/ @3 j. J* N - LDA FC_Gamepad_Once
) }- l. S; u7 i- g* M2 [ - CMP #JOY_KEY_UP4 b" \/ R4 W) e. |& Q$ J
- BNE .Pre_10_Music% V0 Z E; v+ h2 c& t% q$ b. t% }
- JSR Music_Play_Next_10' X f: @# p5 I, w+ Z
- .Pre_10_Music;下10曲
% X4 Q2 n: k# T. H - LDA FC_Gamepad_Once
* B/ ~$ Z2 d1 e3 U/ B- F% D) D - CMP #JOY_KEY_DOWN# w* v; x) J' S4 V
- BNE .Reset5 r/ X& ~' ]" @& n: X
- JSR Music_Play_Pre_10. n8 D K% |2 L% ?9 `5 }
- .Reset;重播当前曲目" r: E$ @( L. i& Q
- LDA FC_Gamepad_Once
2 C5 N+ h& \; f* V/ n- l - CMP #JOY_KEY_START
' D; K2 W K: w5 Y( H- S8 l+ b6 @$ T - BNE .End6 }8 I, m9 s+ m; @6 p8 `
- LDA FC_Music_Index4 F8 t4 V! d' N7 e5 F3 u
- JSR Music_Init_Process! @' G* Z% ?5 M, z7 B
- .End" B6 R. Z( e! b( m5 z- S
- RTS( f: B" c0 f% z o b% D' [
- / {) l2 Q0 J! A$ K
- ;----------------------------------------------------------------------
$ r! }9 Z7 M5 x2 n4 a. \6 D - ;播放上一曲
! X( R R( B0 p5 N# m$ @# u - Music_Play_Pre
0 |7 L# l- I) t# W/ f/ u - LDA FC_Music_Index
6 n2 ]: j. \4 |7 | - BEQ .End
2 g. y) Q) P' m3 Z, x0 Z - DEC FC_Music_Index2 D4 e, o! t: `% }8 m: \
- LDA FC_Music_Index
; ` ]; K1 p. e0 O7 v9 z0 k - JSR Music_Init_Process
& z1 J2 j& ?- u - .End! L- z' `. L! C, ~# t) U
- RTS$ X: A! ^5 \ m2 h* O
- ;----------------------------------------------------------------------+ T/ Q) n v. v# i7 A
- ;播放下一曲
* n8 A1 ?; N0 y D) m7 u5 X* H - Music_Play_Next
) O8 O" }& ~$ ]) ]6 X7 b - LDA FC_Music_Index6 K8 n# T4 W3 ~
- CMP FC_Music_Max_Index: o) L1 ] u) z4 w" {" H
- BCS .End5 B$ X2 B& [) w3 {+ S3 U: d
- INC FC_Music_Index; h! H5 Z: }7 |$ y) \5 v, i
- LDA FC_Music_Index
h8 F& b( @# R: |/ |5 B! ^ - JSR Music_Init_Process5 ^; P9 `2 k0 ~" O7 x* b
- .End* w1 N+ H! `2 s- Z
- RTS
( a- F. K8 X! d- O; h - 4 y6 e! i/ W5 f
- ;----------------------------------------------------------------------
$ t" f3 \3 Q. n9 a" J - ;播放上10曲
& t% X7 t# ^# B% v1 C2 |3 s - Music_Play_Pre_10
" y! @& l% m# g' U1 a( P. Z - LDA FC_Music_Index
/ `7 Y1 y" k+ L) U0 v3 k# C - BEQ .End v3 Y1 S& Y( v' w7 ^! y
- SEC
5 h5 l7 c3 o( K+ p) q/ x - SBC #10! o' \: r0 y$ {! u1 J8 `$ o) C
- BCS .Pre_105 f. n8 j( k0 F# P i* e
- LDA #$00
, l3 z' a5 G/ ?3 \' }0 o - .Pre_108 l9 F4 F% ~- A: \7 {9 k$ {) Q
- STA FC_Music_Index4 B3 V" t7 v! L9 `8 X
- JSR Music_Init_Process
& D0 m! t4 K& Z7 T- S8 l* q7 r, b - .End
( ^# a# a: ]4 P; \/ q3 z - RTS; {+ ?0 s* D: G7 @ m; E) W$ D
- ;----------------------------------------------------------------------
; F h# ?$ S1 {! ]- ~2 y$ r - ;播放下10曲
& } l5 ~2 N/ Z' V1 l# B - Music_Play_Next_10
3 g# `' h( y9 ^/ {! O- c - LDA FC_Music_Index
$ V! M; J. L7 o: w - CMP FC_Music_Max_Index
8 @* u* w( \. [+ ^ n - BCS .End2 ^% v$ `, ]# ?8 x5 L3 c5 u
- CLC
2 O1 G- k9 F5 R5 ^2 Y - ADC #108 h5 V3 ~. |9 C5 u1 K
- CMP FC_Music_Max_Index
% p7 Q6 ]1 X/ B - BCC .Next_10# X( T, G& K; x& y
- LDA FC_Music_Max_Index
3 I* |/ y$ R/ ~7 @! @2 Z: A9 m6 [* y - .Next_10/ `( D" ^! k) |! K* d
- STA FC_Music_Index
0 e0 \' k* {7 n0 v. t- r - JSR Music_Init_Process
, \4 \; x8 X% n9 k; c; O# {/ F, T - .End' Y( A$ {! H4 k3 s; e. ~
- RTS x: \0 [( @+ V' j0 O
/ u. u! y2 Q, f5 e B% d1 e( w- ;----------------------------------------------------------------------3 j2 n" ~" k, h% Z, |) _' U+ l
- ;8位十六进制转3位十进制制- w1 I8 D, ?1 ?; R& A: }
- Hex8ToDec
3 M7 _% P* P1 a1 ` - STA FC_Dec_Data_1
- r: u4 Z* V x# b; Q - LDA #$00( S k4 c% K3 b
- STA FC_Dec_Data_100# z; J; {2 z4 L1 W4 |* f- a H
- STA FC_Dec_Data_10$ p/ V) A* R( K3 `% n
- LDA FC_Dec_Data_1! `7 }5 N# O) B8 m. }
- .Convert_100; M4 y4 o! C, O0 ?' o( T7 q
- CMP #1005 c. a% K3 j3 @! F* S
- BCC .Convert_10
, X( l! f1 S- n$ p1 [7 _( \ - SEC9 j+ D" ]/ ~( s: p' ?" h- d ^
- SBC #1001 C0 H" J3 R, d0 z" Q
- INC FC_Dec_Data_100
- K9 i% y+ m/ M3 v - BNE .Convert_100, P+ U6 j/ D; a- C8 W$ o
- .Convert_10
% v8 R$ G, J3 K3 v; y- R! g% y - CMP #10/ S& Q3 T3 G$ V7 b
- BCC .End. H- P+ P% h8 g: h; L9 x
- SEC; h& j1 V9 M; W* V- `
- SBC #10+ q7 S* V3 r5 x: U( J
- INC FC_Dec_Data_10
: F4 b$ i% ^# T. p- U9 b: d2 i - BNE .Convert_10- O) v# Q3 W4 V
- .End; |2 Q7 e, o+ Y* x3 m& ~. @/ _" m+ ]/ c
- STA FC_Dec_Data_1
# _( r$ }( h3 T" f - RTS' P' f, A& k2 O4 \! d
% M# l: q( }) t8 b& J* Z! R" L- ;----------------------------------------------------------------------/ q/ @5 ~* F, \, \8 K7 a. {5 D: L
- ;显示曲目信息3 E. S0 X8 [5 n6 ]8 ]2 C
- Music_Info_Display" I0 c9 }4 s( s" N/ a
- LDX FC_PPU_Buf_Count$ G1 ?9 `8 h* l) e9 [& L
- LDA #PPU_WRITE_MODE_CNT_LINE
7 d o5 y: D5 h - STA Use_PPU_Buffer,X
- Q a* j3 i8 v6 T - INX# l# g: v. K. ^7 K
- ; T/ v" B; V7 M$ g& m9 w" L
- LDA #>MUSIC_INFO_POS
* u& f# l5 A. R ~. R6 _1 I - STA Use_PPU_Buffer,X
3 t' ]" C/ w( U# B: F, n - INX/ h* N% [% r+ }" S0 v6 R
- 8 K+ j5 O# q$ s, p" a
- ;居中
2 {- t5 v" k0 {% r; Z - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
?0 K: u; R3 E7 \; T - STA Use_PPU_Buffer,X
6 p0 Z+ F7 x8 N# F! ~: g5 w - INX
+ k. {: Y. x; X! L4 M3 a -
: a) j5 a: u' ~/ D) e/ I# `( o - LDA #$05
( s3 ^7 g H W7 p6 A2 M/ ^" g - STA Use_PPU_Buffer,X
3 g) `; U% I- h5 j/ R- M - INX) i" d; L" {. ?; {5 x8 [
-
) `. y2 q. h+ C" @ - LDA FC_Music_Index
# i( P3 F- H" |( L, S! I" P - CLC
# j# w1 s- ~/ ^ - ADC #$01
d) R, `( i$ K, n0 }4 F4 I - JSR Hex8ToDec
! K! [1 ?: I6 [3 e; i6 P6 P# R -
, c; c$ r+ I+ Z$ i6 _. a5 S - LDA FC_Dec_Data_101 q7 t, y2 E! G0 }4 [
- CLC t2 _# C0 ?% _5 z7 A" c6 s' q
- ADC #'0'
. @2 \! a. s) b) v3 D9 X - STA Use_PPU_Buffer,X
+ W# W; p! K7 e! V9 F - INX4 r$ F" X5 T" X0 Z6 `2 Q
-
& C( S& p2 i. z: y - LDA FC_Dec_Data_1
+ J1 S6 a% S8 \1 N - CLC1 k2 y ]/ L9 g9 e
- ADC #'0'% j% q5 \3 L: e' [
- STA Use_PPU_Buffer,X
) |: `7 y4 K/ H0 L7 I- c - INX1 ]. J0 ^/ f( _! M
- 4 P2 G9 K4 k6 |: c
- LDA #'/'
4 J: _4 [# D/ k - STA Use_PPU_Buffer,X
4 {/ u z1 S/ U/ R* J! t - INX& {3 [( t j8 o' F. s8 H
-
& `( z& o( L- i" W. v - LDA FC_Music_Max_Index
- Y, o& `* Q% X y - CLC
0 R" _9 t8 b5 |; T1 t+ N1 x - ADC #$01& |5 Z6 @/ k2 T' j, Q# d% ?
- JSR Hex8ToDec* C8 r, K1 ]" X/ t5 u4 m7 o6 ?1 _
-
9 j3 ~: W% c6 `4 i - LDA FC_Dec_Data_10# C0 C& h' k5 P7 [- c
- CLC* m- }, a) o' D+ `5 ?1 I8 R" e4 q. D
- ADC #'0'! L- g9 }* [# I! L
- STA Use_PPU_Buffer,X) J; k7 E) n/ T
- INX o+ `6 V; O% E" i! z2 ?
- ; U% r0 a3 v( O* \" {, Q% }4 E
- LDA FC_Dec_Data_15 a# @2 ~8 a: a2 K
- CLC
( ^3 m, y# J+ N! D" ?/ d" Q: N - ADC #'0'
9 V. j4 m# b! x! T% ^, c - STA Use_PPU_Buffer,X
$ R& v4 S. b) R' _" z1 N6 ? - INX. N& Z) y# w/ i+ w1 b9 h( C
-
- X+ h1 P( @- @" u" y/ A - .End
[' g/ O$ Z# V- |0 Z& l$ O! x2 ?0 Z* U, P - STX FC_PPU_Buf_Count# O3 i( Y* U! y+ B
- RTS4 y. l. R) M' c+ T
/ C5 g; r; z& n" N/ v- ;----------------------------------------------------------------------
1 d0 W7 E" [# V( v# w' G- \1 F - ;音乐曲目初始化处理
0 t* o8 e- Y+ Y9 {7 K; X - Music_Init_Process' @& _0 I- B/ L& u6 r [& ~
- PHA; L4 M" r/ l5 V# s9 Z5 i, V; ~
- JSR Music_Clear_Process# \; ^2 r) k" M( k! _
- LDA #$1F
$ g) ^0 O/ r0 a - STA $4015$ Y+ M7 u& Z' _: f# ~8 p
- PLA6 N2 i- k1 M" A
- JSR Music_Init_Addr: M4 {6 D2 R( ?; C, l( f
- JSR Music_Info_Display& J( N8 o3 \0 U: s3 r' J
- RTS
. ^. o: O# q, z0 Y$ t/ Q U1 N& ]
( o1 }7 k! C4 R8 B- ;----------------------------------------------------------------------& D4 L# q. D- @$ y" W1 Z
- ;音乐播放处理4 }) c, y" q% z% S- R; M
- Music_Play_Process4 {3 K9 o8 B6 f2 A1 R( ^3 f
- JSR Music_Play_Addr4 N/ s! t! b7 _, w) u
- RTS
* M) ?' g& E$ w7 r% R* Z - - ~$ i2 C5 D! b
- ;----------------------------------------------------------------------* U* }3 A- |& |6 S: J( k. f
- ;音乐播放处理2 M/ b! U& ~+ X9 `: l
- Music_Clear_Process) u' j$ R6 S; |& N I: q( ^7 @
- .IF Music_Clear_Addr
% v$ `* j" q- P2 d7 a! D - JSR Music_Clear_Addr$ Q% j4 l. n- X% D' T
- RTS
0 G: l* Y9 O# }4 u8 B! i/ f - .ELSE
9 E/ a2 @. k( S" R/ m! ? K - LDA #$1F
( `, i) H) c: f. E5 P$ O - STA $4015 x) {1 k% N* q2 \9 \! B n+ r
- LDA #$00) R# C& U2 T0 A& x3 n$ @
- STA $4010
; `) }3 y) P: h6 S. V* v: A( ]# j - LDX #$00- ^( Z3 [5 O4 o8 t9 `: N
- LDA #$00# x% e' Z: O( J6 F4 n1 K
- " v9 j- G# U" E1 F- u% L' x2 P
- .Music_Clear_Zreo_Page_03 B2 T; I! E+ w4 W( o( q+ V) v5 H
- STA $00,X8 n. s( F/ V. f# C. A9 ]& l
- INX9 N# j7 e3 l3 M% }: d5 D0 k8 ^
- CPX #Use_Zero_Page_Begin
, J7 ~3 o1 W0 @5 j - BCC .Music_Clear_Zreo_Page_01 A6 B4 [+ u+ Q
- 2 `2 f% n: ^& X. T7 d
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
9 ]; W8 ~1 @- N: l1 y8 h2 z - .Music_Clear_Zreo_Page_1
7 w- y( y2 o2 p5 _" A% K3 L9 ]7 ] - STA $00,X
; ]4 w" `/ `' D6 ] - INX+ ^! Q3 v1 @+ Y0 d7 \
- BNE .Music_Clear_Zreo_Page_1
s+ j5 ^- i3 Z4 x) r1 p, D: H -
! P$ q- M' x$ V' e2 d" a - Music_Clear_Process_1! C0 A( W3 Q) D0 c! C$ S0 l
- STA $0600,X
3 D `7 Q/ O1 w' ~$ B9 w5 v - STA $0700,X$ q0 ]) h9 h/ Q; T r4 z, X
- INX+ @/ l: n+ |, P; h+ P* t$ l
- BNE Music_Clear_Process_1
. Y# g5 s0 u; c; h# @ - LDA #$101 k* i& i) T" `, R' u
- STA $4000- b( O: k [) V( _8 V. U
- STA $4004- [/ p N* R3 a4 Y
- STA $400C
q- m: ?" ?$ ~ - LDA #$00 W* Z9 u1 P- O& H! k
- STA $4008. D' r: Y* p. A w( l& {" k7 a
- LDA #$0F
& r6 \6 X" b! J& ^2 Z' ? - STA $4015
+ E1 s0 K+ l! t6 @$ w' y - .ENDIF4 N1 S1 N5 ]! m# }9 }
- ' W/ g; ~+ m- q+ @' w1 I
- RTS" x+ Q) }; m; d+ R0 R
* D, j9 Z& O& A4 Q1 b- ;======================================================================
4 n: \" w- e% ^2 y - ;重启处理8 j' _& j( F7 c" [: }" w8 e
- Reset_Program. m. C6 X/ u, c& F9 m$ @; T
- SEI' t. b; q. u! u! y
- CLD
% D% R# e, g6 Z$ \: w9 k - LDA #$001 }) B$ c4 T' a) N6 U! c0 |1 k
- STA PPU_CTRL6 u6 l$ F4 F& r% I) y! R' p$ e
- STA PPU_MASK$ O- m8 q* g( e, r8 G$ v
- STA JOY2_FRAME% K$ D: `" A( D) A" Z% `! c; S; d
- STA APU_STATUS/ Q. p. U4 C' x( x: @, N+ ]6 i
- ( j, C5 o; v; H/ m7 b! _+ m
- ;等待屏幕准备完毕8 Y- v4 c* o4 ?" J
- LDX #$02
1 F8 R z8 K4 s) y/ F& a1 K# n - .Wait_For_Screen_Ready
3 R+ d. ^0 W8 `7 n8 }% M - LDA PPU_STATUS
) K6 l& X# C6 g3 V; D8 S/ r5 y0 e& m - BPL .Wait_For_Screen_Ready$ K8 I) A3 [* R) Y/ \; d
- DEX
5 O+ h7 } H \ M6 E& B } - BNE .Wait_For_Screen_Ready! y2 U( m4 b* K `8 g0 d8 S
-
/ E V% n, e' Y; W4 C - ;清空调色板
7 S1 ]* s$ b) B% j4 t0 l4 a9 \ - Palette_Clear
0 V* p5 g2 O6 P1 Y% |) e - LDA #$3F& E5 c9 E8 D+ j- I' M5 F
- STA PPU_ADDRESS) v m$ i& K& i
- LDA #$007 \0 w" e1 m2 Y; i- [
- STA PPU_ADDRESS: w# a% k) X: ~8 C$ ]4 l6 D
- LDX #$20
# k' k# z7 U% G! T1 T7 C - LDA #$0F
4 P* n" T' {' t$ g7 z - .Write_Data. [5 ~3 q: g" `: ?
- STA PPU_DATA: p4 R! x: ~0 \' c$ D
- DEX) w' o; v2 A. n# Q5 ~
- BNE .Write_Data
2 `3 k9 m, Q6 }# ~ - / b) K& z! G. S* D! c
- ;清除声音 $4000-4013
$ X9 T1 g9 e7 K0 E4 z$ G- r9 t$ l - LDY #$143 Z- i9 k+ ^1 ]/ O8 y* c
- LDX #$00' O0 \( r/ m4 x. l
- .Sound_Clear% G# b! n8 j, R2 ]: N
- STA $4000,X- l2 W8 e1 }1 S2 r# }8 u& [9 l
- INX3 G% \0 O1 \; A" }+ u
- DEY; ]3 l2 ?) e8 q6 \% k8 `
- BNE .Sound_Clear! W# }% t. ~6 i* \' e
-
; A% ` I/ c8 Y' z# p; w - ;清除 RAM $0000-07FF
; w) h! U; p6 t8 J) w - LDA #$00
+ R* K( [8 M, s. |8 [ - STA $004 e$ G# t5 c7 A; q) G7 Y) \, {
- STA $01
$ c. I4 E7 m6 H; U" j) Q* n - TAY3 h- M: W8 t2 p7 c
- LDX #$08
- T6 R# J5 X( K- g/ M - .Memory_Clear
/ y# |2 E5 I0 V- H% E - STA [$00],Y, d$ [4 ^* h ^
- INY
8 [; C, x5 M3 t& i - BNE .Memory_Clear6 x( z) s: |7 Y7 q% o; K8 t7 H
- INC $01% q, M6 Q/ o- w& l7 ~2 k0 o
- DEX
/ u! M1 n4 U3 r% H$ r* Z3 X - BNE .Memory_Clear- D5 ?4 ? ~8 e: q
-
`, {9 v$ h. I - ;精灵缓冲初始化
" K( L9 d' e. z# N: Z5 S - LDX #$007 ?! `8 Z+ K# a' a! p
- LDA #$F8
9 X# Q( o7 y8 H8 u - .OAM_Clear
* ~. `/ i1 z/ d7 V. v - STA OAM_DMA_Buffer,X
3 S" t. u% v% o - INX& Z% [! i4 s$ m
- BNE .OAM_Clear; e+ F- S9 E. T1 E/ E
-
0 X+ v/ h [$ k - ;栈指针初始化4 o" O3 B* U6 ?& c7 a1 E
- LDX #$FF
8 H/ S* C3 x# w3 A6 r2 h' d - TXS$ R+ p5 g; Z( I3 ~; w0 Z# q2 F" ?
- 1 s3 y: k2 n7 u' r _
- JSR Nametable_Clear;命名表清空, n( ?. i k9 o
- JSR Palette_Init;初始化调色板缓冲
) Z: G0 |5 I( B* p/ U( |3 H - JSR Static_Text_Init;初始化静态文本; O$ N1 d1 }4 g' `" Y
- - `2 b9 V( R2 t
- LDA #MUSIC_ITEM_TOTAL - 1* e9 o* {( T+ m
- STA FC_Music_Max_Index! K) e2 D. ?: p4 X. r8 @
-
/ Y8 \8 B _0 C: l2 w9 X0 q - LDA #$1F: b; w6 O5 V2 K7 q8 M2 g' m
- STA APU_STATUS
& k& o/ |, ^ F* R) u2 f - LDA #MUSIC_BGM - 1
5 i7 n, {4 r2 M: z4 q - STA FC_Music_Index
: ~. Z$ K6 K! ~! r* Q2 \3 i - JSR Music_Init_Process;音乐播放& L6 d$ f \+ F$ J7 g& S/ y
-
' C! h- K# ?4 |% t) H. G/ ^ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
- }* R2 B9 n$ a$ W6 \ - LDA #$1E
+ C- H1 i9 ?. i( N5 o9 r# \ - STA FC_PPU_Mask_Buf
9 Z& _6 C: J+ x6 k6 P& d5 E8 \" z -
, j' Y9 D# V4 b5 Q" B* u+ \, G - ;启用NMI处理$ x, ]- t1 z2 c
- LDA #$80, b% ~- b" K( I; y7 X
- STA PPU_CTRL
/ k6 n3 O( T' X4 N -
/ w% | k5 c4 Z5 P2 K - ;程序循环, 剩余工作交给 NMI 中断处理4 O0 n; U% [0 \4 Z4 Q( P
- .Loop
) z; s( F+ ]9 p& ~" k - JMP .Loop
" v6 o% l- S5 U- |+ R
- K, x' F: u5 k7 D6 n# S% {- ;======================================================================
7 b; T& S0 D3 d+ x0 U - ;不可屏蔽中断处理' k. o @4 R1 p3 @0 s0 J: \
- Nmi_Program
+ X N# w* a, ~, l2 a - PHA
" r% m0 t. S" K" ?/ g: |; }) e- p) C - TXA5 J. W1 `+ a, t i
- PHA7 n6 w4 Z1 ?' \) Y8 x
- TYA
% D% A; d6 O m7 } - PHA
9 B1 P- A" `; X$ M+ @- a, r8 R -
0 b. ~1 I9 C; y5 E; X( z' M - LDA PPU_STATUS;读取使得 PPU状态寄存器复位0 } u6 v+ Z% j# s; l- ]4 P- m
-
; \5 O3 S3 S% `, Q - JSR FC_PPU_Procrss;PPU处理
3 \5 c* N3 f0 G& L- q4 U0 F7 T ? -
" o3 W, ?+ T( ^- G( S" t2 [ - ;精灵内存更新7 Y. i, F+ h# x( R3 `) Y$ _
- LDA #$00
0 Z* A6 \7 e, b4 ~( |/ L - STA PPU_OAM_ADDR$ D% ~' c2 d! v# F' y
- LDA #OAM_DMA_Buffer / $01007 Q1 e! A% C% w5 r {5 Y, q
- STA OAM_DMA
, p2 l. K. s( f - 2 i o# N! c6 c. X" F0 _( _7 F
- JSR FC_Gamepad_Process;手柄输入处理
* E9 b7 Z7 o! @$ }' i - JSR Music_Select_Process;音乐选曲处理% Y' O" I* \ v! I/ p& R
- JSR Music_Play_Process;音乐播放处理" r) b! ?4 f7 x0 x! o" \
-
' u0 a& |+ }& @9 q3 z1 R. h4 U - PLA2 c7 y# `% n0 R" o
- TAY4 G7 p N! @ v6 H
- PLA3 Z& {# ~) H& g2 s2 U
- TAX8 d/ _1 L5 q( q5 Y' x) M" e
- PLA. i! h, k& {( a- L \
- , J. V2 ~' E0 ?% G
- RTI4 a2 d; M, o+ R: z' T y8 \# M
- / R K2 L6 Y" q- h; ]( n O, \
- ;======================================================================
& Q! {1 C! B9 t) t" t3 ~ - ;请求中断处理
, f2 K% Q3 R( Q! a# P- a4 V - Irq_Program
, e6 `1 G) i4 M) N0 w: r1 ]# d' F - RTI8 N9 K. K, B1 F/ \& G H y* A
- 4 I6 `# A) ~1 N7 N; R
- ;======================================================================/ o( c7 F- H5 J) [7 \8 X% h! z
- ;中断向量表, C# P! D( _; u( e* L% x! h
- .ORG $FFFA
0 S* Q" y* V3 E. o+ j" ~ - .DW Nmi_Program ;NMI触发时执行
$ a- r/ ^6 q: Z0 ^! P - .DW Reset_Program ;载入ROM时最先执行
q0 b$ n/ {3 V) S" B- l5 Y* W - .DW Irq_Program ;IRQ触发时执行
# U3 P1 P& \0 L# |+ a/ `
复制代码
2 C5 L; p s- H: Q; K
5 ?/ x' `8 k* r- }! D- G$ `7 |& a# K; n
https://gitee.com/flame_cyclone/nesasm_3_2 |
评分
-
1
查看全部评分
-
|