|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下0 J- m: S K1 B+ A

) f+ r& {3 }( e8 H3 H以下是主框架代码:
* a# T1 b; A& u: O5 n8 t- ;======================================================================8 ]2 W1 d* ?, a; G
- ;文件头. {% x9 f4 A+ Z/ g, I
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
! {. {) n9 g, z2 R9 H2 T V - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量* t3 m) H6 o+ ]. H3 I
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码; V: B% _1 H+ j/ g
- ;======================================================================
+ W4 B- n) [& @0 V - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
* B$ W9 y% X" M2 r - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
' S$ w5 X# f4 ?0 Y# ~6 x. q* ^ - ;======================================================================4 L% r: `+ P5 `4 i, |6 i
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
% L0 x, D u- x) f+ W* C - RESET_ADDR = $E000 ;主程序起始地址
7 t9 Q' Q! x! X! u) M7 B - ;======================================================================( F2 y. W( `- I4 e7 e+ k; }
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
/ m$ x% H3 q& k+ x( I" K8 N - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB0 F I6 n1 K1 C2 R
- .INESMAP 4 ;Mapper号 (0-4095)# S6 Y) ~. D% ^1 e% _' f' O; W3 w' F0 A
- .INESSUBMAP 0 ;子Mapper号 (0-15)
# s2 J9 U1 U; X. c- X6 c" A A' S - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)" D4 J, F( o+ E( o
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在), H) g; b+ F" q% T6 `( C5 b
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)2 f3 s2 m1 H) }8 t: x9 F
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)& d9 q/ Z4 I4 `: O" C8 ?1 v
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数): P- @ d- U& P3 A a1 l% x9 `- F
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
6 ]+ u4 t) G+ I. a: w" x; P# _5 G - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy); ?; w$ ?- h/ ?4 W4 g& i, |
- ;======================================================================
9 v9 p+ S) Y+ C; a, `7 b- V - .INCLUDE "fc_demo_config.asm" ;全局配置
) H9 k2 e* S$ O8 q! b- l - .INCLUDE "fc_demo_constant.asm" ;NES常量
@, y% a3 Y( l6 `2 M( L - ;======================================================================7 e' t- k) E& g- H# y
- ;音乐配置
0 W( c c# w4 p - .IF 0 = MUSIC_THEME , m8 u# l$ y9 y: G1 d/ h: P- \ x* S
- .INCLUDE "data/music/Gremlin 2/config.asm"
# a- g4 H+ ~5 L/ T" F5 n/ k- [/ G - .ENDIF
7 e; C% Q( x* D$ |. q' u" E$ d - & Y: i% C' f7 s
- .IF 1 = MUSIC_THEME$ l0 _; s+ K- `2 I
- .INCLUDE "data/music/Raf World/config.asm"
2 K! z0 u \7 E' E: Z& | - .ENDIF
4 a& b' ~$ F# p( G: o -
& X7 k+ o# K0 _3 r4 Q3 Z - .IF 2 = MUSIC_THEME * m4 [, t3 @: K2 n7 J4 f
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
( S8 G0 K; L7 h% D - .ENDIF
5 B4 e! }6 O4 \ - $ B6 K7 z- W' S
- ;======================================================================0 ^! c+ ]9 Z' g1 r4 U
- ;引用CHR图像数据; g+ ^/ m) I; ]; t( X0 x* W
- .BANK NES_16KB_PRG_SIZE * 2/ [: u3 T9 j1 p m( @! V
- .ORG $0000
" R6 N8 g' F& z8 l2 P; h - .INCBIN "data/bkg.chr"% p- d t; o6 D5 y% S
- .INCBIN "data/sp.chr"+ _6 X0 T, \& f1 F# v
- 5 i7 k4 e8 O y% S
- ;======================================================================' q0 i9 r) K0 m8 s1 _4 Q- }: I* _
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
/ w% ~) L l2 u# H - .ORG RESET_ADDR
& \+ @( J7 `; L5 ^ - ;======================================================================
7 m, Z5 K8 p4 e' p - ;引用其他源文件 F+ w3 f9 y! y1 k! z
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理) G+ R0 g& n; S0 ?5 X
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理$ E# R1 S0 \/ N! m
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
; _; f% p! _& M [ - ;======================================================================0 s& |, @3 S) J% T3 E6 @3 V
- 2 c1 b" h. K8 B+ s
- ;======================================================================
3 D' t" V/ {1 S$ {# q% S. j - ;等待VBlank到来
7 M! x/ i6 `) z, p - Wait_For_VBlank
8 p% u* _$ V: R8 t. U2 @' ? - LDA PPU_STATUS6 F3 r1 `/ ~8 U
- BPL Wait_For_VBlank
8 f' [6 G/ Z. G0 Y& I0 K7 l+ B - RTS$ l' @% j2 G: r9 D& ^* D
& J5 O f4 w3 |7 I- ;======================================================================
0 [) k0 T# g6 T3 [- e0 W) i& D# l - ;调色板初始化
4 n5 j5 }+ q) w! o - Palette_Init
# A, X h+ {4 D: \7 p - LDA #$3F
' @! h! F; a9 T: v# h! } - STA PPU_ADDRESS/ _$ E# X# `- o$ R. ~" P
- LDA #$007 K; `- Y- G9 R! h
- STA PPU_ADDRESS8 h! F9 J1 H) }& o
- LDX #$00
$ U) B$ J7 H6 ~( Z8 o% Z - LDY #$20' b) W7 K* x7 b
- .Write_Data
$ v- V f( m" ] - LDA Palette_Data,X8 Y- {5 F, Z* |; D, a3 ^4 e
- STA FC_PPU_Pal_Addr,X6 W0 Q/ Z. b4 I/ D
- INX
0 F6 l5 h& i& a% k! ^ - DEY' e# H9 B! ]( W( \0 A
- BNE .Write_Data
8 w D$ J4 Z$ K - .End3 C: w6 U4 b- ?
- RTS
/ [9 `6 K$ F1 |
0 ]% J: C9 h b0 |. j5 E1 S% C" {- ;----------------------------------------* |+ `2 T7 L# Q; g5 S
- ;调色板数据1 Z5 o$ C; v6 W$ O5 D0 D6 q
- Palette_Data
2 W: ]+ ^! \; E - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B* H* Q* f0 |1 o9 g: j: ~" Q
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
' X, K/ l% h: z7 z -
5 C0 k5 T) w p. y - ;======================================================================. ^/ H8 X: O7 r) r. t
- ;命名表清空
8 k8 k' p9 O* p$ R. s: t9 r - Nametable_Clear5 a' x8 U. T, _$ z4 U2 t
- LDA #$201 f) P) b- x) O: U$ Z
- STA PPU_ADDRESS
' t- Q7 \7 k6 `) G - LDA #$001 X3 } y! N' S8 }# ^
- STA PPU_ADDRESS
' r& }" x" R* J - LDA #$00: G4 l' Q/ Z% L! c
- LDX #$00! H" Y) v" z* S6 ?2 L7 U
- LDY #$08+ G! C; J: w, }$ m, T( R
- .Write_Data: X9 I0 z+ a4 A! W" F i0 Y. n4 @
- STA PPU_DATA
1 A/ p3 h9 w7 Y' N& r - INX' U7 d( J4 e4 l. t
- BNE .Write_Data' f0 n1 W0 U9 s
- DEY# \( X: H z5 V) W6 k* [# L
- BNE .Write_Data
7 G# c5 S2 N& e. L7 ]9 m; r - .End
3 `( Y; c. R6 t4 `: T - RTS
* B* L) d" O/ q$ ^- L1 `" x% E; p
3 U/ t8 d k- L, O5 D8 v5 n- ;======================================================================
" d+ [0 q# F$ x6 ]3 m; I - ;音乐曲目切换3 w3 n# t, c! ^+ k1 i6 S
- Music_Select_Process
9 J1 n l) e( O' a( L
( }- G6 x0 r0 m' |0 E' z/ T4 _0 P- .Pre_Music;上一曲
5 H/ {8 V" R' L2 ^+ F# J - LDA FC_Gamepad_Once0 ]. N, e7 y" P6 ?6 M3 d( V
- CMP #JOY_KEY_LEFT9 t1 Q9 _& l1 q; J2 @; X- {6 x" r
- BNE .Next_Music
6 i9 n4 F9 `) P7 X- l - JSR Music_Play_Pre/ R" |, y9 s/ f0 W* {
- .Next_Music;下一曲
+ P: o0 ]- O" R Z - LDA FC_Gamepad_Once
+ `. \) {: X6 N - CMP #JOY_KEY_RIGHT
% ?: W9 [! x% B6 B% l: F' N9 Z2 H+ ~ - BNE .Next_10_Music. R7 H) O7 g' A6 d3 _& @
- JSR Music_Play_Next
7 i. L+ ]* ]2 X3 q8 H8 Q+ E6 D - .Next_10_Music;上10曲
5 B \$ k/ _, G5 z. k - LDA FC_Gamepad_Once. p0 _- }9 M6 l1 ?: Z
- CMP #JOY_KEY_UP# g6 m. w. W6 l6 B, V& Q! C
- BNE .Pre_10_Music* Y/ n; U. b; s- U* u
- JSR Music_Play_Next_10
2 E% a* k1 T3 E0 v% R& [ - .Pre_10_Music;下10曲
: t* B% g% W1 D0 {% ~# z - LDA FC_Gamepad_Once2 y" r) {! I; g* { V# i' D" Y6 _
- CMP #JOY_KEY_DOWN
1 z9 F; N) B, \9 U - BNE .Reset
( n* K& j: O& _. G$ U - JSR Music_Play_Pre_101 _% h" A! ?) R- n x' m! D
- .Reset;重播当前曲目
( V" g+ H9 l" T: }7 I1 m - LDA FC_Gamepad_Once
$ f8 e7 t1 j/ J - CMP #JOY_KEY_START
w' |6 Q- _& B% f% P; d3 M. x - BNE .End$ Q5 o Y# c; S4 o+ |
- LDA FC_Music_Index5 F0 V) E9 W! d* A' r* }. L
- JSR Music_Init_Process
' A+ s: m! E; [3 F& s1 L - .End
& W1 {/ V( h! b1 W3 v0 F - RTS! r0 ^! ]7 p& c# B# y: J9 e5 @+ ~
- 2 y! R, w$ B, [) Q2 f# ?
- ;----------------------------------------------------------------------
3 K$ Q" r9 k( @ - ;播放上一曲0 {: g3 W5 t9 @$ j& h
- Music_Play_Pre8 y3 \5 z! A3 L0 N7 O6 O, S
- LDA FC_Music_Index, h0 ?/ x9 M, v. z. m1 O6 b
- BEQ .End
+ N% r7 O' [# e# U( o- n - DEC FC_Music_Index5 X7 X0 N) x# E5 r. `" \
- LDA FC_Music_Index
/ a" R* C# x, M2 _ - JSR Music_Init_Process
' |6 M6 h; T% r' l+ ` - .End7 {0 g6 [' ?' ?/ R2 a+ Q
- RTS \0 E+ T: p5 _7 S
- ;----------------------------------------------------------------------; B' H3 J4 n3 P! s- W2 I, E
- ;播放下一曲0 P! ^- z' W$ n0 H, Q( y/ l
- Music_Play_Next
5 \7 v# A. h% Y' i2 u - LDA FC_Music_Index& @' C0 r+ ?. t. W! h; T, z
- CMP FC_Music_Max_Index U; g$ C: |; h0 m" P% Q
- BCS .End, c7 T* Y+ `2 X4 [* N
- INC FC_Music_Index
q0 o6 [5 X! V& N& a - LDA FC_Music_Index' I7 T3 z6 e+ Y/ S" ]4 K
- JSR Music_Init_Process
% T) N+ m) e; U) | W+ D4 `4 Y - .End
6 e0 ^ \4 K6 P- I - RTS
2 C) Q3 C# ^$ k1 ^, ^ - # w; ]6 W3 }2 L' G
- ;----------------------------------------------------------------------
( C6 S( x, c; `/ b - ;播放上10曲: d' U7 [) f0 r
- Music_Play_Pre_10
! N( f5 D: g5 }. j - LDA FC_Music_Index
) I7 }9 ^- x I/ R" d' u - BEQ .End/ ? w% \( J& \% ]) E/ a: G
- SEC' r( j2 k! b8 W' G
- SBC #10
. q1 ^3 u" ~( T5 W7 ?" | - BCS .Pre_10
0 j$ E' p7 U2 p' ?2 Q! E4 t9 j - LDA #$00
+ c5 d9 S/ a7 s7 \6 r9 b - .Pre_10
- c' i2 Y8 {( B% o - STA FC_Music_Index3 ^2 z t, E2 }' z! m
- JSR Music_Init_Process
' W4 [( g& G% T3 V2 u - .End
6 h6 r# _3 L" O& I - RTS( _, v9 \0 E1 e& t+ o1 y1 y. N6 Q$ N( G
- ;----------------------------------------------------------------------
u, \* L! `: U4 e/ ?( ]3 Z, A% I# I5 q - ;播放下10曲5 l4 \7 }1 t2 f1 u% Q( Q- J
- Music_Play_Next_10+ d4 t% O- A6 C2 _
- LDA FC_Music_Index; I" W8 m+ O4 Y. `7 b( u5 z* T2 c
- CMP FC_Music_Max_Index
# H+ F; g7 O J' a - BCS .End8 a* V( H2 d# I! S
- CLC' X: f4 {: [. v: \1 `
- ADC #10+ z1 g. {% R' d; w
- CMP FC_Music_Max_Index
3 J8 n U6 i! a1 \) h - BCC .Next_103 z$ v1 T# ~: {/ ?! s
- LDA FC_Music_Max_Index! c4 d. ~8 Z/ F6 d) E* U0 P
- .Next_10
" K: M* R" q* w6 S" I. C - STA FC_Music_Index0 k4 N/ c: |2 A+ \
- JSR Music_Init_Process6 l" t- H: m* Q+ ~- y! L# l6 @
- .End4 D& u, B" Q% `4 y: W4 r
- RTS) R0 W, x1 F) |9 n1 M( {. P; |
) V' s* @) N6 j6 X* q* O! t, V% r- g- ;----------------------------------------------------------------------
; |: i5 P; N3 B3 S - ;8位十六进制转3位十进制制- v z; u/ B7 J; U; O5 r
- Hex8ToDec# P" u5 G1 H% X
- STA FC_Dec_Data_17 R+ b8 P3 i$ U$ |
- LDA #$007 z9 C( Q( r4 g9 V% t; ?* d1 F
- STA FC_Dec_Data_1006 j4 X$ K, A/ _! Q# d) x
- STA FC_Dec_Data_10* }5 E. N7 v$ U5 D6 a' I# ]
- LDA FC_Dec_Data_1- |) f2 ?% \; c2 o0 @
- .Convert_1006 F" n$ W. s! \
- CMP #100
( N6 U3 F2 ^2 v. o7 I5 @ - BCC .Convert_10& `' j, J( i! k3 q4 P. @
- SEC3 X, n! b5 D* n5 Z. I p
- SBC #1006 g: j0 T. z* J$ D2 U$ j
- INC FC_Dec_Data_1008 m2 R4 t$ u0 [8 C4 q
- BNE .Convert_100
2 k% m9 k- E5 D3 o* o - .Convert_10
3 `! e1 z2 d7 ^7 F- z. j, N1 I - CMP #102 Z4 S6 X+ f3 _8 N3 R
- BCC .End
7 K8 Z7 Q! ]7 y$ [ - SEC
8 _. i, `1 k% M! I% _& O - SBC #10; C+ x7 \( O% g& n: H* N6 T: ~' E
- INC FC_Dec_Data_108 e# H/ U# w5 [. O) h2 [
- BNE .Convert_10) c9 E; J* o. ^# v& A: F
- .End
: z p: e' {" |& E - STA FC_Dec_Data_1
3 a4 w" j3 G$ V, z1 [5 d - RTS6 H9 w. O( E9 s: F2 k. y4 J5 Y
- ( S: w! X# P- } m5 K) A
- ;----------------------------------------------------------------------
; Z- I* u2 u8 o% V2 F$ {4 _% ] - ;显示曲目信息
0 b) a- m5 `5 U4 _ w - Music_Info_Display
( h h X7 Z) f% m3 g - LDX FC_PPU_Buf_Count6 ]" M- T7 x$ q; J
- LDA #PPU_WRITE_MODE_CNT_LINE) E7 ~5 I' Q- D. f7 y* {" B. f/ t( R
- STA Use_PPU_Buffer,X! y& T0 N6 b! ~( g: j
- INX
& t" }5 E$ N) k5 q7 y -
2 D: K4 o! p; m& x2 E1 ] - LDA #>MUSIC_INFO_POS. C! t: I& ?5 U
- STA Use_PPU_Buffer,X$ V$ W0 u4 j3 o, k0 g: X" k2 i
- INX7 \+ m4 i3 o2 D3 a* Y
-
- d0 s2 z6 m+ P: d) f: Y; r - ;居中
# B# Q+ B2 ?9 z; Z, ^7 v! h7 e) E - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2/ H8 G) I5 n! c1 Z
- STA Use_PPU_Buffer,X' s+ c! A6 [9 u8 u: L4 x2 ]' l
- INX8 k1 y1 i h; J* g
-
( [6 k* u4 q2 S- b3 Q - LDA #$05+ ~' A$ M& ~ j$ l& [! h) w4 Y& m
- STA Use_PPU_Buffer,X
+ `3 ]; k) R5 G N - INX! X u! F3 k$ M* o! ]( S
-
1 @2 y7 w( n1 @. p - LDA FC_Music_Index# U- g& G% X- Q) ^3 ^. _! k, N* ~( U
- CLC+ ~0 r% c8 w2 k8 f) c* }, q& k
- ADC #$01* K% D3 @, f# K& |' J% J+ ]% y K: [
- JSR Hex8ToDec
4 S$ K: m& q# O& N) ~8 o - ( S1 o' y7 u9 ?
- LDA FC_Dec_Data_10
6 t* q+ f/ y/ n R- B- Q0 J1 O - CLC/ ~, Z+ {# H& h. J
- ADC #'0'7 h) H5 W# J3 r5 X; e# Y
- STA Use_PPU_Buffer,X- W$ o! D, A7 q: q C. n' L- H
- INX q2 A, R8 h4 O( n6 N" r. l
-
- T+ A. a: r$ m - LDA FC_Dec_Data_1
6 O( Z. l' b7 f) } y2 S - CLC
% a& W! T0 j X) _1 ^# c* r" c5 _ - ADC #'0'
& `0 A+ S2 W0 n/ y8 V/ O - STA Use_PPU_Buffer,X ]3 d' m- U9 s/ B+ t
- INX* A& L7 D' i" p& A/ ^3 J8 T7 e
-
& |* G8 j: h, m) O/ _7 l - LDA #'/'+ d& |" j- l6 \/ q
- STA Use_PPU_Buffer,X: Y( {$ u. r2 }% o6 i3 m7 x0 ]
- INX
0 r: G, r7 t! N5 b7 i$ |% {- s - & \; c( I* n9 A) e
- LDA FC_Music_Max_Index
* g: R- d! t' V3 s% s0 Q+ H4 E - CLC1 j# }6 N+ v3 Y6 \: k3 h
- ADC #$01# x5 Z! `+ Y" A/ W
- JSR Hex8ToDec
0 w# o( P p) F - 8 w8 A) O5 k' h, N7 M$ G/ P
- LDA FC_Dec_Data_10
% A4 Q9 t$ ^4 ^/ a u - CLC
3 z- h1 e# B; B% j# a - ADC #'0'
3 p6 ~$ u' M, X - STA Use_PPU_Buffer,X, l7 k& K/ ^" t& w' }3 p. \
- INX" z) h, f. s; x3 V0 q3 L/ _
-
3 B m, l! ]3 X* \' W% {, }- D - LDA FC_Dec_Data_1# L$ d6 K. x: i; D
- CLC- u1 W1 R3 _( P& R6 @- F$ E
- ADC #'0'1 p3 B; A q" r# o
- STA Use_PPU_Buffer,X
) W5 L) x( C0 t* O9 m, `/ u - INX
8 b( l( d( \- X - 2 W4 j* ^( C: w0 E" i
- .End
( U/ r* ?3 V! j# g - STX FC_PPU_Buf_Count, `, B: \0 _2 Y; o9 B' _/ z
- RTS7 A8 x( g- g9 g( K! |& B
- 6 B7 g, q6 D, U: V+ @
- ;----------------------------------------------------------------------
4 p5 V9 V- ~( ^4 } - ;音乐曲目初始化处理
0 N1 f; o* i& x+ d - Music_Init_Process% x/ }& W6 q# l8 z
- PHA* p0 J" `1 F. s
- JSR Music_Clear_Process* p' ~9 \$ X+ h( S
- LDA #$1F- N. j. e9 S# M; ^' w
- STA $4015
7 e' H. x; ]2 K) Q& t - PLA. g+ q4 @% e9 r# Z
- JSR Music_Init_Addr6 |1 u3 i9 N0 ?+ K, e d
- JSR Music_Info_Display
6 m3 `' a" e0 c/ ~2 g5 t0 J4 b) i1 D( j - RTS
$ K2 |) D- u2 b - 7 @$ P- A1 O9 ^
- ;----------------------------------------------------------------------
% `- j% Z5 b/ x I( D- E - ;音乐播放处理: i% O6 w6 c: s" l. f: O
- Music_Play_Process
% K3 s# x7 F, C! i: z - JSR Music_Play_Addr
M4 R. ^' E9 f9 W, J9 C. { - RTS! }3 R% |7 C, E! [9 ?7 J
- $ _. y ?* N: r& p3 ~
- ;----------------------------------------------------------------------/ {* ]) r9 \+ x* `! \6 {+ s
- ;音乐播放处理
4 q4 h+ V" o7 F - Music_Clear_Process. j3 r' w3 I) \2 d/ `
- .IF Music_Clear_Addr
1 Q3 w! a/ K9 M9 q2 ] - JSR Music_Clear_Addr# N8 d# M. p& N, b1 T5 `
- RTS
9 ~" ~) W5 _( S% K1 Q% ^ - .ELSE
1 A: P6 d0 v. I/ q5 D" V; B' L - LDA #$1F
( T, y/ |$ g* P3 {2 A, d/ `: o - STA $4015% F; ~. d: G. Z
- LDA #$00
0 u' @5 g6 O% X( W - STA $4010- J1 @+ U! U, o" t
- LDX #$00
9 R6 h- y/ ]7 U0 Y6 z9 _. u - LDA #$00- a2 r( @6 {2 `% T/ x
-
$ [/ X) I' _! q+ }+ a1 L( w - .Music_Clear_Zreo_Page_0: F A/ F- k3 \" I r& b
- STA $00,X3 ]2 r8 o, b6 A
- INX `' S. X6 T2 Q! K% I( |6 O
- CPX #Use_Zero_Page_Begin1 V1 ]9 m) |/ L, r. Q* C3 b% ?
- BCC .Music_Clear_Zreo_Page_0
# [+ E. E7 F$ y8 k, N& L0 \8 H9 j -
2 K; a1 L+ |0 C: i4 h2 B* i0 P - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size" D3 \: s0 l! W! ~$ @3 j
- .Music_Clear_Zreo_Page_10 W6 u8 L. ^/ r5 ]( {! g
- STA $00,X
0 l$ I$ u( R8 w" o7 l# e4 @ - INX
; W: r2 \8 ?2 c! J1 a9 n% k - BNE .Music_Clear_Zreo_Page_1
6 |5 g$ [ Z6 T$ b% k) J, e -
" e$ n9 d/ i/ Z: @: D - Music_Clear_Process_12 s5 X; Z" H1 R- `9 M
- STA $0600,X3 Z# W1 T: u% n! x) [) }/ w) y, [
- STA $0700,X
3 k& g5 a/ n: K1 p$ | - INX( W1 j# p9 K2 t: q+ [
- BNE Music_Clear_Process_19 G: V8 S2 D" x, v
- LDA #$101 K" J: r O* `& c5 }3 {- K. }# p5 x
- STA $4000/ ~$ r V: S7 e, r
- STA $4004
8 P. ^, Q( m! x. ~+ n7 B* l - STA $400C5 y2 ?+ l' L% e T8 H
- LDA #$00. h; x/ Y7 V+ m. @& v' Z6 V
- STA $4008
9 d2 M6 @7 m' f3 [3 O" Y' h% l' C1 i6 q - LDA #$0F
( A$ N, ?# z/ `6 v - STA $4015
, |0 R8 @) w* j - .ENDIF
* f9 a. D; E' j/ n - - U2 b2 N0 Q# G. j5 I6 f* ~3 J
- RTS
& u- }0 j) t0 A4 _$ a0 X- q
1 c7 ^" e# [* b$ B; j- ;======================================================================' K+ k; m5 `9 v- N" Q
- ;重启处理" Z4 {5 H% x5 C p3 [! v$ q
- Reset_Program- W0 _$ [- e1 u& t( O
- SEI
5 v" [) F+ e. K& J - CLD
. U$ A3 O6 n# w7 e+ }6 D - LDA #$00
7 p2 {$ G, x% I. v - STA PPU_CTRL |. ]: J7 F9 u! U2 n
- STA PPU_MASK( t: K/ @" \( |. q, ?! F. m
- STA JOY2_FRAME
6 @" N# b' ] v5 B - STA APU_STATUS T( N) z- X, {0 L- p h
-
& S* c1 {; y' U$ m: Z( L& f - ;等待屏幕准备完毕
' o4 g: M# I' i/ Y9 }) r: G! X - LDX #$026 O/ K+ b1 S2 [8 x
- .Wait_For_Screen_Ready8 m$ ]4 E% D; p8 A( s
- LDA PPU_STATUS
( H2 F* W$ |) L7 Q. Q- f& r - BPL .Wait_For_Screen_Ready+ P: t+ s( b$ D1 e) W1 R
- DEX
& P3 i0 y4 X" ^8 b - BNE .Wait_For_Screen_Ready
1 N' G6 o6 I) x* }+ k - 9 |9 z- W J0 J, f
- ;清空调色板5 |! Y* v" b2 W7 f x, P! s! O
- Palette_Clear
3 N" L; | r# t N% E$ W - LDA #$3F
' h! T$ z6 i$ i - STA PPU_ADDRESS- h$ p: V9 Z* z" c8 v/ c
- LDA #$00# Y( f. M& x% J6 w8 ~
- STA PPU_ADDRESS# P, }' o& H1 [. S7 L: I
- LDX #$20
6 n$ q/ S; [' q% k7 O" z - LDA #$0F
a: ^/ v8 V3 U3 F - .Write_Data
) w7 L5 W7 s. M" f" R - STA PPU_DATA
5 N ?7 k, ]/ p - DEX4 t! |1 r7 ^5 ~2 W$ K" `& d* j
- BNE .Write_Data
- M5 u; u0 f; H1 V) ?, X - 0 ^; U# E5 t7 Q1 x
- ;清除声音 $4000-4013/ e: j1 y) a2 M2 K# J5 a' I' A
- LDY #$14
! }- }3 ?4 n8 T2 J N) ?# k+ M - LDX #$002 z7 Q! l4 W% k$ q' g
- .Sound_Clear2 L' m9 V0 _5 s9 |* H( c6 o& v) j
- STA $4000,X
) V7 s2 u( I+ T7 h4 p - INX
0 {2 I3 K7 Z: A* Z, J: a5 b - DEY6 X2 g* o# C% G7 H) a
- BNE .Sound_Clear. z5 L2 w3 A- G
-
( a0 A5 S y* I/ |- b - ;清除 RAM $0000-07FF3 c5 M: A. t. X# i# y0 R% B% U
- LDA #$00( C/ r8 G/ J1 S9 i3 ]" K, L
- STA $00
c/ X$ Q1 G! x - STA $01
5 ?2 x* t9 Q0 F2 B+ ? - TAY5 H" c+ p- Q2 u: q) @& X: f
- LDX #$087 x9 f2 e$ D9 _# z( X
- .Memory_Clear3 A" G; k. i3 {
- STA [$00],Y
+ l( U1 Z8 Z7 D2 Z8 M - INY
* ?. B* ]" Y# u* Z, h - BNE .Memory_Clear5 }) Q) P3 j" K' g7 I
- INC $01
! a: P/ p, F( J5 y - DEX
$ R: n$ j, Z: P. p( Z - BNE .Memory_Clear
% ?2 b% c/ H: h -
( w' X, Y9 \- T9 {$ K! U% Q: { i3 E - ;精灵缓冲初始化" n2 A; [4 z$ w. @: L# R
- LDX #$004 d) @5 O+ @ C# i, ?# {+ _
- LDA #$F8" H1 o& e' P( b9 f; w& Y
- .OAM_Clear7 O" f* h" S2 H
- STA OAM_DMA_Buffer,X6 G8 @8 C6 j8 i+ B% V2 c- f
- INX- e1 P2 z }# G
- BNE .OAM_Clear1 F" B. F7 S6 G* D9 o* \
-
% `- G8 @8 L; {, T* i$ _& p- d' v - ;栈指针初始化% ^. v' i0 T, T b" i
- LDX #$FF
' J; m: g u5 G - TXS
$ |% O% z1 R6 p$ y -
2 _1 f! W1 s; y0 i# h - JSR Nametable_Clear;命名表清空
4 C/ f" E, O( E- x; |3 F - JSR Palette_Init;初始化调色板缓冲
2 u5 v' y% v2 C5 L - JSR Static_Text_Init;初始化静态文本
) J) L. M% i+ Z% S/ {& Z9 R- y# A -
- ]$ f. z# Y" B. b( m F - LDA #MUSIC_ITEM_TOTAL - 12 E0 c( s" S, a, S# P
- STA FC_Music_Max_Index5 b" W- z8 p3 y7 R& s
- 0 s+ W5 K! U0 i" s# N3 g
- LDA #$1F
+ q+ P9 T" V( s5 v - STA APU_STATUS) S3 w) |) G+ |+ n! P
- LDA #MUSIC_BGM - 17 Z' M9 V. ~" i9 ^" r( R! R ^
- STA FC_Music_Index
( o: r- m7 g& C* T" G0 ~3 S' _! ~ - JSR Music_Init_Process;音乐播放
; F9 a7 Q3 l4 c0 a - ( [/ P0 P2 t% }
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)/ z k* f J5 d9 C* R: c
- LDA #$1E) K2 W0 K' ^% a& i3 L% I
- STA FC_PPU_Mask_Buf
% Y) |- U& O0 t+ x$ V -
% L- ]4 p' E# U+ M ]5 E( y% Q - ;启用NMI处理
: Y! S4 ]/ V) m/ L$ p - LDA #$80
/ [' b+ k$ U" ]% e7 ? - STA PPU_CTRL
: _7 |+ W3 ]6 I2 y$ ~& A y - 0 P( _# _1 c* ^& S" u2 |2 _# M) m
- ;程序循环, 剩余工作交给 NMI 中断处理' |% q9 J! R* ]7 E
- .Loop8 o# y5 V& I5 a% d4 z L2 n6 j
- JMP .Loop8 G/ h" H) b+ k+ n- ~6 k) g8 k
0 y* S# Q# ]. {- ;======================================================================4 c# x) U+ [, e3 r- D) L
- ;不可屏蔽中断处理
$ A' r) G, H8 z0 N3 I$ h - Nmi_Program
9 Q! d: ~. {# H- F3 Q - PHA p4 I) n# Y6 ^8 u5 ]; W9 V
- TXA
8 e6 b+ k0 O1 i* u - PHA
3 u) c. g1 b+ M - TYA
# a5 q* h( y1 I z6 h - PHA, t( {" \) v8 k2 ^8 f' K* r
-
- y9 W1 o" ~. e - LDA PPU_STATUS;读取使得 PPU状态寄存器复位" g2 b. _) \( n4 i
- : g$ j& }+ y0 s% {. ~8 d- s
- JSR FC_PPU_Procrss;PPU处理: r8 M7 _8 U: }5 ]: Y! q7 M6 _
-
; K9 p4 h+ ]- u$ X! e. z8 p& b - ;精灵内存更新
1 B n! r- ^9 l% V6 _ - LDA #$00* f. `- C! D5 m* z9 e$ G$ I
- STA PPU_OAM_ADDR0 [- }7 B/ r d2 `9 j) R
- LDA #OAM_DMA_Buffer / $0100
' p( T" n' r! q7 y5 j5 z/ \ - STA OAM_DMA
# V: D6 ?. C, O8 U6 k - ( S. h9 S' S* r# K( l$ J6 h2 n1 I
- JSR FC_Gamepad_Process;手柄输入处理
" n% L! W5 G- R9 t( [; a6 s - JSR Music_Select_Process;音乐选曲处理
$ O B) I2 f* l - JSR Music_Play_Process;音乐播放处理
/ D4 E, l+ P( B* q) I -
1 W* R1 O/ ]7 ?# h }3 @ - PLA
2 w1 G/ `& s- d8 B3 d" y5 m; D; I- g - TAY
( w6 X) t+ r$ v - PLA* P6 [- m6 Q( ^
- TAX, E" `0 m4 V* D+ P4 c- J' e
- PLA1 |, a7 H M' ~* W, c! e& X' }! r5 X
! h0 V9 P9 A3 g- RTI0 E6 _( m" R8 a; k" i$ j
, |4 x4 l0 D/ @9 y2 d- ;======================================================================5 M; s- A( q r/ G$ h/ j; r
- ;请求中断处理 E. \( {& A7 s3 D( N4 O9 H' h
- Irq_Program
) w, e: \0 k6 `7 } - RTI
: r2 d! X* C7 i" v: T/ o9 l
: A4 K, i3 f2 ~! `- ;======================================================================
2 | i( L5 s- ]( R - ;中断向量表
% m! I9 o/ o3 W9 u* D - .ORG $FFFA. T+ v, ?2 @) r
- .DW Nmi_Program ;NMI触发时执行
9 s1 T. Q3 m+ w m - .DW Reset_Program ;载入ROM时最先执行' h0 E3 J3 U0 `4 g! l
- .DW Irq_Program ;IRQ触发时执行6 D: N) o/ A$ K. ^% ], h6 E
复制代码
4 [/ Q$ {4 e! A9 h) Y, I6 n/ e
7 ~1 c. H$ a V3 L0 K) W2 D; b
5 h& C5 F& \$ }) l# C) _https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|