|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下% Y; w# e4 K6 z7 u& f$ H5 G" \

; l3 T7 j8 h4 h& C2 ` S以下是主框架代码:
' }5 O+ c* i7 L# l- ;======================================================================5 N; D4 R$ H% q" K5 M1 v b
- ;文件头
# D/ l0 w3 V( t/ ?7 X _ - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量: s8 M) {1 o K2 r9 E: D8 D
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量! b9 [$ j! z5 i _* F* u
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
, K' W" u0 E; f) o) I- R1 j3 i - ;======================================================================# a! w1 C% x, s. f0 O% j& j
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
. ~/ p2 d0 n! Q$ k/ ?: O$ u' D - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1- J! N- Z6 ?' ]) j* A* g9 f
- ;======================================================================
1 n( V# Z7 M, d8 `9 t: o7 Y - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
; W* ]0 a& a' T% H - RESET_ADDR = $E000 ;主程序起始地址
9 O6 } l! f$ [ @6 | - ;======================================================================' U1 Z7 W) h) B; n3 D
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB5 Y4 Z# }8 B- G; P+ j1 M
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
6 _' E2 V+ K7 Z+ \. k - .INESMAP 4 ;Mapper号 (0-4095)
/ J; Z" k' y4 U7 F - .INESSUBMAP 0 ;子Mapper号 (0-15)
4 @; Y$ L' x) u4 K3 a - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
0 A7 x$ j3 q* j( \ - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
4 d3 h, ?8 z9 Y& |* O - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)! D2 h6 O& e2 Y l( ]- l
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
" }( U4 R+ _1 G: Y9 Z) X. {$ {! t - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
6 Y& j9 n: C- o- i - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)6 l9 {; J) I& D/ J
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
5 A# H8 s( A8 A4 v - ;======================================================================
; m8 T$ n0 _8 p - .INCLUDE "fc_demo_config.asm" ;全局配置
, ~$ t- s) m0 z' k: k' E4 E - .INCLUDE "fc_demo_constant.asm" ;NES常量
8 g3 h+ D; n3 i, B5 C2 m/ H - ;======================================================================
; [$ t: V" K0 ]2 y - ;音乐配置
; \! h/ O3 q# }8 X, W( Z1 _* D - .IF 0 = MUSIC_THEME " u9 @2 I3 ~6 n) _2 a9 R+ H% @' @
- .INCLUDE "data/music/Gremlin 2/config.asm"
( S' j7 m/ I5 m' D# {% c& ^ - .ENDIF. X$ J) R- _/ A/ p
- b8 k# o3 l+ z$ ~& I m4 U) R
- .IF 1 = MUSIC_THEME
7 j Y) ]6 V# O - .INCLUDE "data/music/Raf World/config.asm": `( b9 u' g& d% B8 _8 D# ?
- .ENDIF
2 p4 ?5 v" P+ t' T% U -
5 c$ t' n# j9 x1 ?" H - .IF 2 = MUSIC_THEME
1 c8 _9 C" N$ _; F4 |5 u; k - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
- M0 j7 [* q, Y& w4 v4 \ - .ENDIF3 Q) b) L2 @; \7 b4 O0 [6 D, U
' m) p* ^2 t- D( S% f+ i/ N' i5 ^- ;======================================================================7 A" H' `- u) q* l* y8 m( G- ]
- ;引用CHR图像数据
- f# m `/ L$ t) a - .BANK NES_16KB_PRG_SIZE * 2
; ]; r5 \$ h8 {/ X$ S - .ORG $0000
( y$ |0 m$ w9 E8 a7 T - .INCBIN "data/bkg.chr"
- s P }9 y6 V4 A - .INCBIN "data/sp.chr"& ~+ ?2 a/ t: T1 e# ~6 J; R8 Q4 w
- 9 l/ c- c% {( T5 P
- ;======================================================================& a) g* z9 ] k8 a. y
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
! y! [; M( s5 {$ H - .ORG RESET_ADDR
" Y: A% o! p! R# C( M d - ;======================================================================: S9 `, {$ y( k0 _) ?
- ;引用其他源文件7 C% k( i9 M) q7 g a! R! M/ Y+ I- @
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理: k& H5 g* T- J
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理! Z4 z6 `* G) ^
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理2 n2 g r0 g1 O/ {% b" j& c
- ;======================================================================9 W& V, x* [* z4 U
- 4 W# i7 X3 s/ x# j- t7 \0 X
- ;======================================================================$ @- Y, k! F% w }
- ;等待VBlank到来% i1 f2 B9 Q9 y/ O6 [% T
- Wait_For_VBlank8 g9 ] x! ~4 y. l4 i' M# o% X" g3 H/ q
- LDA PPU_STATUS
: Y& V5 s" S; m5 S+ B1 B% i - BPL Wait_For_VBlank( _ H" J- H5 O! N* s" F0 n7 V
- RTS
2 _2 I. Q* q- [
^% g0 [; ]: E6 v9 R- ;======================================================================+ p$ H- y$ D) d: T6 U+ i( N
- ;调色板初始化. c" @. w2 ], v
- Palette_Init
2 j9 a; K0 L2 w! e2 { - LDA #$3F. g& P. ^" S& Z8 Q% C) [7 A
- STA PPU_ADDRESS5 ]+ t! V6 p% s* x e+ x
- LDA #$00
0 T$ q- M# g# v% s6 D - STA PPU_ADDRESS- U" T& F1 \6 b) X; Z: q
- LDX #$00
9 x8 I4 T5 T1 T5 H6 `5 y - LDY #$20 ], D8 o0 o% T8 i6 i+ C
- .Write_Data
. r3 y0 C; Z) K9 s& k7 e: w - LDA Palette_Data,X0 V' Z6 p4 Z4 m
- STA FC_PPU_Pal_Addr,X
\7 k! M- V0 L$ S# W - INX
6 j( q; ?* U% X( A( |, Z - DEY
% D0 J2 E V& J7 U* d+ i8 J - BNE .Write_Data
( \ `4 q4 j- D+ J1 Y- o9 j - .End
6 z @, D& J/ Q- ]0 X" l+ a+ J& D0 r - RTS: a8 h: Z2 m0 |" T
, t5 d, x5 y% }& B; |. o0 p& ^( ?+ O- ;----------------------------------------
/ H7 W, h- _! ]) b" x5 u5 F - ;调色板数据9 g' L" S+ h, V1 v0 }, d
- Palette_Data7 u7 _7 t) K0 R: s2 D3 X
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
$ B5 _" n+ E; l - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22: [0 s" ^3 A, K- O% o
- 7 q) ^ |7 p* e% F& H2 u7 V
- ;======================================================================
9 R. O' o8 r F5 {( m - ;命名表清空9 g9 `1 B+ H9 a
- Nametable_Clear8 g. ]1 O# x! |. X( Z) h0 b
- LDA #$20! ~- Q# A( P. Y+ v4 u& \
- STA PPU_ADDRESS
+ R! s/ X* ~- e- v8 t - LDA #$005 S& K2 n, ?0 t* c
- STA PPU_ADDRESS
# {- G! b+ z+ a/ P* J+ A" [ - LDA #$00
& \2 ]4 s0 \7 w- P - LDX #$00
3 ^6 }4 U- s6 g7 @1 G - LDY #$08
5 r, P7 a2 ]- f: C/ a- b' x4 @1 a - .Write_Data
0 t& Y* p2 v" V- L, U5 ` - STA PPU_DATA
) S' a& T7 ]* @+ B1 }! u t - INX$ U5 F: Y- u1 r; N" O, w4 T
- BNE .Write_Data3 Q; v0 i. ~- p; U7 Y+ w! ]. e
- DEY9 ?- n3 q0 v8 B9 f6 y
- BNE .Write_Data6 u! L" b8 p+ }
- .End
9 l( m) k* Z) i# p7 _1 O4 G - RTS! F2 Z) a/ [, E
- / `* Q* e4 E% M2 @+ V, C; h1 V0 p' W3 U
- ;======================================================================% {3 k* S7 {1 n
- ;音乐曲目切换
) ~% `8 V0 F3 V* } - Music_Select_Process2 T1 g7 v# \3 `* Y! W6 {9 M9 ?
- 4 v+ H. G+ F% x6 F+ S+ _* w8 T
- .Pre_Music;上一曲" z7 _) O! R' o4 u! I
- LDA FC_Gamepad_Once
4 W" u9 }2 `7 {/ [2 Y3 D# o$ c+ \8 z4 E - CMP #JOY_KEY_LEFT9 Z' K) c- l( E
- BNE .Next_Music0 A! E: T( l7 c# h o3 N
- JSR Music_Play_Pre
! \# s" I) V0 j5 s. h+ _0 M - .Next_Music;下一曲
4 Q( ?% j0 n; r - LDA FC_Gamepad_Once/ s3 _, Z3 X! t/ p
- CMP #JOY_KEY_RIGHT
8 N ^" D" U7 [0 o) P- o - BNE .Next_10_Music
* {4 f. R4 O2 l- M - JSR Music_Play_Next) E2 n1 V, s6 t% k" t& k; [4 Z
- .Next_10_Music;上10曲
: Y) ^! e' P7 ]/ a+ J" @ - LDA FC_Gamepad_Once
# t8 `3 w! T; q8 z+ g2 o5 i - CMP #JOY_KEY_UP
5 @( L. { [) H7 U - BNE .Pre_10_Music
$ j7 D6 T! d5 } - JSR Music_Play_Next_10
& b& A- z3 k5 G* [9 z6 s3 ^ - .Pre_10_Music;下10曲
5 S f d) @! ]4 S4 m - LDA FC_Gamepad_Once
2 X* s' E7 ~6 O" y4 j2 s - CMP #JOY_KEY_DOWN0 W0 x7 |& i( {+ a. c8 \" [
- BNE .Reset
# [5 w, k# i0 }6 S. g& L - JSR Music_Play_Pre_10; s3 k" U% {5 R5 B& ~9 x
- .Reset;重播当前曲目6 ^! k, \9 Q( W. r9 c* s
- LDA FC_Gamepad_Once% t7 Z' f& t2 w6 a" A
- CMP #JOY_KEY_START2 W) m; G+ k* U( @. n
- BNE .End( z: Z. W; Q$ Z+ y0 `2 F
- LDA FC_Music_Index: u7 N8 H) F: O+ f' ^5 a
- JSR Music_Init_Process; ^0 {. x2 W2 p+ r% h' |
- .End
: J* G1 f4 j: [ - RTS6 q% @ K E( P9 f+ B7 B6 c. T
" v/ q, i* S1 B5 |3 M$ v5 `- ;----------------------------------------------------------------------" o, g; i i/ }$ O4 `) s
- ;播放上一曲9 F" Y% t6 e- s; \
- Music_Play_Pre- C. j& o7 o. y* y) p! r2 s# }% J) S
- LDA FC_Music_Index
1 Z+ ~8 B6 }/ h& G# ` - BEQ .End
; ?& N1 X8 c9 S* e6 s! ? - DEC FC_Music_Index( D" ]2 u- d) z9 c4 o7 |( K
- LDA FC_Music_Index" v* w% U! K! ?4 a
- JSR Music_Init_Process
: d$ J3 ~& S2 w$ ?5 n! {: x5 L3 t) z - .End1 E% h0 m6 {9 {9 u
- RTS
! |6 f% D/ i) C0 V( R) o/ [( \; Y: _8 Y - ;----------------------------------------------------------------------* V! Q; n! o6 O9 ~) S6 a
- ;播放下一曲
6 [# r( J: u1 w) ^, r. H - Music_Play_Next
/ n; b) v* T; a/ ^1 g. C! Z$ D - LDA FC_Music_Index
6 Q: _4 a: G& c - CMP FC_Music_Max_Index
6 h6 F1 b! m0 t. q, y0 r, A - BCS .End5 E2 \: N4 w# p* } h
- INC FC_Music_Index
* M) b: ]$ G3 u/ C - LDA FC_Music_Index
2 G5 h- V; x& R! d& r - JSR Music_Init_Process X8 z2 g2 @: k- M! U
- .End, M+ m$ e7 y) x5 l
- RTS& b6 s! s% q8 f+ G
( `2 a2 h/ W" I- ;----------------------------------------------------------------------! c( w6 C6 V8 m; g* c, H" D# m, Q0 G2 C
- ;播放上10曲0 ?0 i3 I6 Y, ]- A+ f# F0 `
- Music_Play_Pre_10: L# J7 H3 C0 d) P
- LDA FC_Music_Index
7 T5 s8 P* W$ ~, V2 ? - BEQ .End
4 O6 q. X7 |0 ?( P' Q1 ~ - SEC
" a6 \* L* s# b2 G5 c - SBC #10
. G- q/ w5 T: S7 ^" K3 r' V - BCS .Pre_10# ?* Z2 o% K1 w
- LDA #$00
# Z6 @7 G- S; g - .Pre_10
; k2 m; I+ G' ~" B; H- f5 j1 o8 M - STA FC_Music_Index
& \$ V8 j9 Y$ O$ N - JSR Music_Init_Process, ~. ^. P- L9 B4 D9 T/ q
- .End: o2 Y8 P- O: \" Z. Q
- RTS1 M$ H l9 z& |$ Z
- ;----------------------------------------------------------------------
4 C; U4 S6 S4 m* n) z - ;播放下10曲/ V ~' ? Z# D& f( f+ n( \
- Music_Play_Next_10" T! _( P1 _! S+ O) P! M) {
- LDA FC_Music_Index
2 t) G5 A' P' {9 E - CMP FC_Music_Max_Index4 R, q+ J+ Q' ^' \ U
- BCS .End2 W+ W* S2 Q! m, e# Q$ h
- CLC3 R) n4 {/ t* y
- ADC #109 r, m$ R& Q6 H( M/ P3 R
- CMP FC_Music_Max_Index
v) Q! K/ `" v - BCC .Next_10# V& ~! D. ^) Y, |: I V( I
- LDA FC_Music_Max_Index0 }" ~1 u9 s. T: r2 r9 [
- .Next_10. D5 [2 W* Y/ p5 ?2 }
- STA FC_Music_Index& s0 t5 X9 q/ e# Q$ \1 `
- JSR Music_Init_Process& n- M2 [: _& {) U* ~* J/ A+ R
- .End
* {6 i% |/ |, ?6 \; D2 l, g - RTS, t3 ^4 @4 j& R$ A a' `( Q
; T# q* k$ G( x- ;----------------------------------------------------------------------
2 @+ b, I9 g; _) H1 p. w' P - ;8位十六进制转3位十进制制
7 {: ]# ?9 }! f/ z8 U - Hex8ToDec
" R& K' g; z4 h, ?# @9 U - STA FC_Dec_Data_1
, _# C8 j+ N% W: S - LDA #$00/ F2 i W/ T5 ~, a8 A& j9 G
- STA FC_Dec_Data_100
8 s- F" j! E. U* O: S - STA FC_Dec_Data_100 ]7 c7 e/ h. x+ s; E
- LDA FC_Dec_Data_1+ E4 F& `# p& e
- .Convert_100
/ B- b% L4 x$ b4 D5 S$ M - CMP #100
* M/ ^+ A5 j" G Y- H3 Z7 I - BCC .Convert_10$ `0 |& m0 {; C: v
- SEC& f5 B& S, F8 b/ J: Q6 X, V; ~; o
- SBC #100# U; V' q1 q) S0 N9 Z5 s
- INC FC_Dec_Data_100
- C) z+ T0 m0 A7 K" Z( ^ - BNE .Convert_1001 g# w! ~4 e% o) `8 `. l: {( n
- .Convert_10
$ n% y2 I3 K" ^& ^ - CMP #10
+ Q7 z3 v- Q( n! \ - BCC .End; x# n- R; R( i' e o0 N
- SEC. D6 G/ ^; }3 N& }* c
- SBC #10
' Z4 `4 L! W ?& T0 k( R/ K - INC FC_Dec_Data_10' g7 M; J8 u& Q+ n
- BNE .Convert_10
8 s- H- {; L% h( r% ?4 e8 v - .End
5 E6 E! V. |9 S - STA FC_Dec_Data_1+ `& `0 G. y. q! H h- x
- RTS
6 f+ l/ u' [4 }: N: i
/ R. F! A0 P' u- N# p- ;----------------------------------------------------------------------
8 F% t; ^5 n/ G1 Z& v - ;显示曲目信息$ b2 ?+ F9 V9 Z
- Music_Info_Display
( Z" Y8 R6 ^/ j% p+ h$ ^! ?9 O# C - LDX FC_PPU_Buf_Count" ?' v0 Q! a8 @" t! u
- LDA #PPU_WRITE_MODE_CNT_LINE0 z4 R, s8 C n) H- p5 z+ ^0 ^
- STA Use_PPU_Buffer,X
% K" G; g7 T+ R' O - INX2 k1 k @3 C4 E* D: G# {
-
; C+ [/ w7 e6 T. K - LDA #>MUSIC_INFO_POS* o% p: L5 k$ c) d
- STA Use_PPU_Buffer,X2 U6 J& G' r5 g% `1 d$ y5 J
- INX
; \# T- m' n1 \0 F9 J -
0 ?/ W q7 _6 s- u- }" Z& U5 a) S - ;居中
& |9 G, M! K& p - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2- p& F, {, q+ G9 j: N# Q
- STA Use_PPU_Buffer,X6 y1 J: p( A4 Z- c7 C
- INX
8 ]9 c7 V9 ^( R* y. h - / C3 S8 {% v0 @& t7 Z* N9 g) Z
- LDA #$05
+ _4 ~' a! Q& W - STA Use_PPU_Buffer,X
" _. i8 J, x+ s7 S' G( o7 @5 {. Y - INX& D1 U' H! F( B
- 5 r0 x6 K" [8 _8 `- w3 B8 v! _. K
- LDA FC_Music_Index3 ]: u' W$ N) \
- CLC
2 h1 l) v K9 Y9 J& x - ADC #$01. |" Y* m" @7 B/ d j8 P
- JSR Hex8ToDec
. N- ]1 @5 c8 i5 v4 V -
6 y- } |% M4 F1 g# Z" ^1 z) d u - LDA FC_Dec_Data_10
0 [+ V T+ }! I* u" ~& u; d - CLC0 t: _3 u0 X" ^6 \4 U- [, p
- ADC #'0': P; s4 F( }; ~0 s7 [4 J
- STA Use_PPU_Buffer,X2 U1 m+ ~+ _6 o* ]
- INX% _0 @+ O4 h5 v
- 8 ]* U0 v6 J5 L, |8 B
- LDA FC_Dec_Data_1+ {& F: g% D) A: C% i
- CLC
" F9 m4 Z9 Z& p2 _! L - ADC #'0'
" u) @5 V3 N9 n! S- j* G - STA Use_PPU_Buffer,X: J8 t' G- f/ Q& G* E) `; G
- INX
1 i! j6 c3 ^" G7 a* L- S* q8 ]( M - + M/ Z" G, J! D- K% ^1 Y* g0 L; n
- LDA #'/'( Q+ z3 X" E$ `- a
- STA Use_PPU_Buffer,X
8 w/ N) A8 x S - INX
" o9 g# U. ~( Y3 R9 A- P7 i - # o8 c* r2 z, i5 c$ u7 X
- LDA FC_Music_Max_Index% ~* k& O- Q8 f
- CLC: @; N2 s( \+ B; A8 A/ J2 d
- ADC #$018 U, Y. i2 b6 E' f* J
- JSR Hex8ToDec/ n/ T7 m7 y/ Z T' l8 G$ Y X
-
& e) G* K; ?/ z# t2 I$ J - LDA FC_Dec_Data_10
* t! e6 h" G& s( c* C3 O - CLC3 }* x y+ _5 t9 V) B# B
- ADC #'0'/ [6 @# s$ i7 j, |2 C2 Z
- STA Use_PPU_Buffer,X1 n8 z9 ~ k' `# {/ I
- INX
6 j$ f) _' F6 d& m h! o q - ' M( d+ i/ }% N
- LDA FC_Dec_Data_1) R& F1 W$ U+ l# N3 n/ Z" V
- CLC
8 ]6 {: z$ _' u - ADC #'0'& }; g* T9 ?, c( X) G/ F' d# v
- STA Use_PPU_Buffer,X
1 e5 T3 \$ w3 Q - INX' I+ q# Y3 N- b" ]' E* U
-
; T6 W8 P5 F7 j, e - .End
2 [& a# K' G' O$ Z( _ - STX FC_PPU_Buf_Count
& T, c# A/ v' N1 V - RTS& o, H& s0 s6 F" |3 H# E0 ]
y" Y! {9 h% l: f- ;----------------------------------------------------------------------
8 ]% r/ i6 n# P, b& P* [) J: ? - ;音乐曲目初始化处理
* F( U* q) \1 w/ M6 C+ ?# A$ U) E - Music_Init_Process
/ X2 M* H$ @. O$ `4 F' w; T' Y - PHA
! x, V: _; h9 h; Y, | - JSR Music_Clear_Process
2 p7 x8 w4 }& ?1 E - LDA #$1F
9 A" T5 X1 ?3 t, E$ M$ r - STA $4015* f& |3 T$ x5 U# j8 E7 i: K" ]0 P
- PLA3 R3 K: Z: q' [6 O5 _0 d- w
- JSR Music_Init_Addr
3 z2 J; ?. Y! `; m - JSR Music_Info_Display) ^' ~% Q" h: ?, D. O- F& ^2 t/ ~
- RTS
3 c2 Y% {5 E5 ]% g
4 U# G8 o# @) T, A+ W- ;----------------------------------------------------------------------/ I% t) Z3 N3 f" U8 A
- ;音乐播放处理
9 Z" }4 A' S9 m0 S- ]# c% s0 h! s; J9 I - Music_Play_Process
9 i* Q. I8 Z) g4 y) V* b2 \, }- T - JSR Music_Play_Addr+ z% v( s/ L9 m9 ~- p
- RTS
3 n* `6 J7 P, l/ }; S% t - # n2 i& h$ g6 J" z7 A9 o" }
- ;----------------------------------------------------------------------
5 Y2 S6 ]1 D( e - ;音乐播放处理) u2 D3 R1 p9 s
- Music_Clear_Process* O7 e# Y( z: W& u& l
- .IF Music_Clear_Addr9 ^) d# J7 @2 A- @$ T O7 E
- JSR Music_Clear_Addr: C( r& m( z3 e
- RTS6 U, R/ _+ p, s! Y: b6 o
- .ELSE7 A. H! U/ A. i
- LDA #$1F
+ k+ u% R# s" O: ?* E+ [# j - STA $4015% b _- c; a2 W5 B2 C. i
- LDA #$002 L/ L4 {0 J0 h5 b9 E3 N
- STA $4010
' e( G3 ?7 j# Z - LDX #$00
, z' \5 A8 x# V8 F' D1 Y* p' S' r0 y - LDA #$004 Z' ^6 d4 e4 o+ l- Y
- ) y) k1 ~' w/ P
- .Music_Clear_Zreo_Page_0
6 [. n: @0 G1 R - STA $00,X
2 l/ e; j3 v3 r4 }; A9 Y3 q, u/ d - INX
n {7 ^5 @9 c - CPX #Use_Zero_Page_Begin" O. L" d; t, a% l& P5 j
- BCC .Music_Clear_Zreo_Page_0
7 B5 S. ?# X7 `0 {0 T4 I -
( g9 o6 B7 | _3 C* L2 [& E" A% s - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
5 u7 N8 ~+ T; I$ @/ O9 U- h) N- | - .Music_Clear_Zreo_Page_16 O0 d1 p$ ? P* Q, c# T' w6 y) \2 k
- STA $00,X4 c5 y% g$ n7 {( {0 ]2 [7 F
- INX
3 p% E6 A2 V4 q' L - BNE .Music_Clear_Zreo_Page_1: W1 j6 G- G: { o# |7 r. ~
- 5 A- J2 k: T2 u/ j+ c9 x2 E+ ~! F7 l
- Music_Clear_Process_1* r& N; K% _# Y8 |0 D, n$ `
- STA $0600,X# D6 L( A% J6 S9 `; g% a, c
- STA $0700,X
/ ?; W( |/ b7 ?6 l) U- | - INX
' A; K7 J5 V) W; ~0 ?+ L, I; l6 e - BNE Music_Clear_Process_15 H/ L3 O9 M+ f$ y- s
- LDA #$10
; ~# G, [4 b) [5 { - STA $4000
: l1 V: L4 u4 r6 L: Q - STA $4004
9 d9 F0 F9 Z2 v/ I - STA $400C
7 ]7 V' |( J+ @5 ~# L$ x* B - LDA #$00" b. n/ Z( [3 O" g3 ]5 B% _6 G8 w% T
- STA $40083 c& Y" e* ~0 J! H1 k- T. J# d
- LDA #$0F6 o9 r& E7 e" D+ i3 M! I
- STA $4015% g4 g& T; e7 i+ ]) W% x
- .ENDIF- J! m( P" K8 w/ v5 U0 E9 t
- ' J" Z; R0 }; X9 `& l3 A* v' X
- RTS; W6 r" e5 Z3 ]$ e W; G
- $ ^0 Q3 |0 l) s' _
- ;======================================================================& l+ A3 Z& R* w( J, C
- ;重启处理$ B! p7 F) W; J, a
- Reset_Program3 o! Y# Q4 k Z4 B1 V: ?& ?
- SEI
1 j, J2 a& A. |3 {! x - CLD! K* I7 J; ] T. k& a! S, P
- LDA #$00
9 W5 n3 Y+ m1 s5 e8 v8 I - STA PPU_CTRL
& k3 X% S, C6 P/ W - STA PPU_MASK
) L, [) H/ k% L7 n/ U3 K$ ^ - STA JOY2_FRAME
% K4 D1 n1 f1 `# V0 L. J- p* G+ Q/ G# G - STA APU_STATUS3 m& m$ l, Z0 ?! r* q" R% E$ _, q
- ; l8 p2 _) G8 I f$ ~
- ;等待屏幕准备完毕
- U0 y7 H4 u6 l) G - LDX #$02
7 T R g" ]) v, m. ]3 z - .Wait_For_Screen_Ready
3 \3 v+ m3 L: M, u" ~ - LDA PPU_STATUS1 u* K' G- h/ ]% v o G; `; ^
- BPL .Wait_For_Screen_Ready# y2 F3 q; a( ~/ S
- DEX
3 |0 }3 y/ ?+ x/ H+ e. `6 Q - BNE .Wait_For_Screen_Ready
2 Y9 D; _0 }% }6 \% w -
5 c4 t5 O7 z1 }" K: a8 n - ;清空调色板
$ F2 @/ M$ H2 n$ Y7 R! B - Palette_Clear/ f( D9 E$ F; K0 i4 B
- LDA #$3F
* `$ Q' ?) J. D- H- j7 g - STA PPU_ADDRESS
: F. L) k2 O& H$ ^9 y1 M3 } - LDA #$00
( a \& F8 B6 F( e* R5 Y- y3 ` - STA PPU_ADDRESS6 Y9 C) I) Z) i' d
- LDX #$20
7 W& O* A2 z4 Q# a$ F$ u/ d% y' h+ ^ - LDA #$0F! g- y, M d3 S' n# i3 h; ~
- .Write_Data, c! l9 t" K( V5 y: m/ ]8 c' ^: u+ C! n
- STA PPU_DATA
! a& c+ S) d" e# _ - DEX
9 x5 }: N. J2 M2 D& f - BNE .Write_Data: g! S" X( U% Z
- 6 I* ^4 d' Q( I" a$ p- D
- ;清除声音 $4000-4013
+ z) @6 q2 x' i' g - LDY #$14$ Z4 l. v: P* X5 O' k$ ?/ t0 b% F3 y
- LDX #$00+ K0 p9 N/ u) E6 A
- .Sound_Clear8 S6 {0 j: t8 p' Q7 {# J
- STA $4000,X2 S; J# [; Y4 T9 S1 M$ {
- INX
8 V0 Q' z9 C5 ^/ a4 _ - DEY
; P; z+ P y& r6 F. o5 V, |. W7 a& ]! @ - BNE .Sound_Clear8 R" u* H7 X3 M% \0 B. I( y# s- p# y
- 4 ^- c$ E- e7 k a3 X& B J
- ;清除 RAM $0000-07FF
. [! f% b: Y" [8 ? - LDA #$00
! c, P' x \. v% }6 {( H - STA $00
1 p. h( l: y$ J - STA $01" h% @6 p+ \% T4 O) p( A( l5 F2 V
- TAY
0 i. E6 O6 C3 r; z% P& h - LDX #$08# i( G3 ?( D* z* q" o0 ~
- .Memory_Clear# F7 C" z7 b* s# P) k4 b
- STA [$00],Y$ J0 }$ u8 o* q( A7 r
- INY
/ t, ~, V$ l$ j - BNE .Memory_Clear; x$ ~3 ]4 ], \
- INC $01: M+ [2 u+ n3 r5 R O" M t) o9 ~
- DEX
2 ]; E: `. m2 P( M+ P! m, O% R - BNE .Memory_Clear/ r6 j1 ^" V0 K) X6 @; m$ C
- # M6 p9 {; w& d C) e# a! |
- ;精灵缓冲初始化' K, f/ t5 v0 f3 U; r
- LDX #$00
1 R2 h$ C) |6 E' R& V9 T& H5 U - LDA #$F8
3 {; ] I( ]: D6 E2 B - .OAM_Clear# z& [$ y9 a# Q
- STA OAM_DMA_Buffer,X: ^# k. I# T# u7 T
- INX% T3 w. y0 _7 i4 ~" b
- BNE .OAM_Clear
7 v9 Y& ?+ A: `" e% z - 0 T3 n6 w/ v W$ m' s0 o, E
- ;栈指针初始化# F# c) D9 N2 {2 ^% b4 G
- LDX #$FF; N z, l5 ?3 t
- TXS
) f: ^" ~' a1 P' m) O5 Q - % H }6 p; d# z, [: {
- JSR Nametable_Clear;命名表清空4 E- W. D7 e' K7 f. m
- JSR Palette_Init;初始化调色板缓冲
+ J: T' x! ^! I [7 U# V: X3 W - JSR Static_Text_Init;初始化静态文本4 {# P h7 P' ~' E; e8 d6 A8 ~
- 4 J8 ]# t4 F) {8 |+ ^
- LDA #MUSIC_ITEM_TOTAL - 1
" |. c1 n: W* O3 L* C - STA FC_Music_Max_Index
( J% s( m% H, x6 f4 W - * K5 ~( Y+ k' Q" D% y5 F
- LDA #$1F
3 Y- ^- K: a7 P" J. F, A( d - STA APU_STATUS
1 R+ f- u! o% U% b - LDA #MUSIC_BGM - 11 M/ f+ a+ P8 l. E' U+ B
- STA FC_Music_Index
$ G* O* y: ~: _3 \ - JSR Music_Init_Process;音乐播放2 B! ^5 P( Z2 p' I
- ( H; D! Z+ ~& C! x
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
, p& U) D( O; O s - LDA #$1E& O7 k- R( q/ Z% ^/ h
- STA FC_PPU_Mask_Buf+ Q) [2 m+ M$ D. C
-
) t7 N) R' l- s/ v - ;启用NMI处理
0 I( U+ Y( |" y - LDA #$80, {0 c' Y4 z4 n# R5 x
- STA PPU_CTRL" g% p. L( r, i/ a P" R! `
-
2 d7 z- j+ i$ v! u j* u% Y" W; L - ;程序循环, 剩余工作交给 NMI 中断处理$ \6 Y$ `1 [ t% ?( z
- .Loop
; y! [. d& @+ Y- w9 n7 J - JMP .Loop8 i$ r* }* A/ Y# c7 d4 o% g- q5 @6 C
- " I; g' f9 F4 H! `8 L4 G, F
- ;======================================================================
: Q- Y2 |8 X/ n7 B - ;不可屏蔽中断处理$ ]2 g1 |+ B: Z8 c3 i
- Nmi_Program- V3 r' t5 ]% w p
- PHA: g- G4 b" B3 [. a6 L6 [+ r. s
- TXA! }9 n g, R6 g
- PHA
5 F- E7 [6 K) x - TYA% j \* u/ p( T4 U
- PHA! R; O# s$ r7 d/ G8 ^
- 3 H; Q/ p7 q. W/ W+ P1 m
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位7 }$ H i2 G! M) e6 X
- + U1 A8 d4 Z9 W( [* u$ A% R
- JSR FC_PPU_Procrss;PPU处理4 \# W5 ^' V& H# a. n$ W
-
, f* h5 b7 S( t - ;精灵内存更新
9 W2 ^& x/ n+ O5 w3 G3 W7 _ - LDA #$00
6 ?( q8 N/ ?8 Z$ b- d+ U - STA PPU_OAM_ADDR5 Z8 l- o/ n; R% D$ |9 E
- LDA #OAM_DMA_Buffer / $0100
& m, u9 k2 K) K, B8 _* i& @9 G5 Z - STA OAM_DMA) r" Q& p+ L. D. D8 t
- / j4 S8 H9 I/ U7 E, T% z9 \
- JSR FC_Gamepad_Process;手柄输入处理
5 r$ f$ f5 L% _0 U2 A - JSR Music_Select_Process;音乐选曲处理
; G5 f1 @! [3 _, X" {& y T - JSR Music_Play_Process;音乐播放处理- B j" b* U( @$ ~6 Y* G/ @
- $ r: o. ~9 }) Z6 c3 K0 U: U
- PLA2 g0 b/ {+ f$ `4 a3 q
- TAY8 ^! t; [3 Z2 D, B0 k; J" Z' x
- PLA
. m0 u! [* A: _7 U" t - TAX9 ~- j, n/ s. g" n+ |( N
- PLA) q- X& b- m/ p9 ~
8 y0 d, B6 Q8 \$ d2 g& u( g- RTI- N3 y) I5 Q ^ \# n/ O
' g) O# |. C3 k7 S/ Z- ;======================================================================
' ?5 u" ^" K: I T - ;请求中断处理
+ a7 n- j' ?4 O+ M: {& E - Irq_Program
" @) b/ [- K0 Y( ^- A - RTI8 \( c) T5 }6 H* H' M; l
' z- K% o/ n/ Z- ;======================================================================3 |$ F! s: n3 q5 g0 m5 T. D
- ;中断向量表
0 H) z9 H4 p" h9 B4 Z2 A! h6 F - .ORG $FFFA8 C1 r0 v% \) i( {3 O' a
- .DW Nmi_Program ;NMI触发时执行% ^/ {' t6 k; }- \( ]
- .DW Reset_Program ;载入ROM时最先执行
# H7 R6 N7 E/ t4 f: \ - .DW Irq_Program ;IRQ触发时执行
y& r! ~3 ^ }" H1 a/ C
复制代码
- `# j ^5 \6 l/ s" _ B3 Z, X: c; Y- P! c# N" d$ f8 W
: n/ d$ D( \, r3 xhttps://gitee.com/flame_cyclone/nesasm_3_2 |
评分
-
1
查看全部评分
-
|