|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
* H! G6 S5 N; f. D' Q+ ?! `& [( z ) [; b' m: W9 ?7 w! ~
以下是主框架代码:- H) U, z+ ], s/ V& W* @
- ;======================================================================9 M/ R# C @1 F+ N! n
- ;文件头
6 `; G: O# F7 O7 z( w N b - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
7 |) ]) a0 z: i$ v0 j. q: S6 z - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量( F( h! m- O3 z6 {
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
9 j; l$ V- x& j( a& e - ;======================================================================
3 q6 i6 R9 g& Y* I, O - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
9 `; z7 K4 z1 o+ t - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1* G% R% f. P: a F1 u+ A8 S" B' v; ?
- ;======================================================================
' o+ x( |- D! v - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
' E8 v/ Z! }/ S! b3 f6 k( Q - RESET_ADDR = $E000 ;主程序起始地址. |3 I+ R8 ^1 j7 i- w" [# o C
- ;======================================================================5 K' w- D0 a# [% k, ?* w
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
2 N# J" ?* @/ D - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB: d. d7 p9 s2 z0 S6 U: B" _
- .INESMAP 4 ;Mapper号 (0-4095) z* S$ }0 M, P, V0 N8 Z# L
- .INESSUBMAP 0 ;子Mapper号 (0-15)
6 J( D6 O6 X+ M5 N/ ~( `; A - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
3 r4 G, [, m2 y. Z- R0 U - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)$ N5 G" g; t N* K6 p& s) O: P
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
' T; y3 d6 |) ~( d# n3 [4 |$ U - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)+ U+ k, u1 u' B
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
' g$ {% V4 a$ X) L - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
h+ `8 v: d3 X) p0 }* H9 r( { - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)7 l/ G# A$ `& h
- ;======================================================================
/ I/ ?3 [6 J% O$ C/ ]; [" V$ U - .INCLUDE "fc_demo_config.asm" ;全局配置
" k' d8 h# W; o - .INCLUDE "fc_demo_constant.asm" ;NES常量 \ T6 B3 M$ E1 V: T
- ;======================================================================
7 I ]) R% j# T, G s& T U+ i - ;音乐配置5 j: z, p0 |" i& `2 h4 |
- .IF 0 = MUSIC_THEME 4 g" | e/ G( ~4 C% e+ F# ?
- .INCLUDE "data/music/Gremlin 2/config.asm"
" a! O8 C3 w" q8 L5 Z7 i' ~; o - .ENDIF
' o1 ?+ G' G! Q& s* @ -
. X; l3 I" r5 b6 T - .IF 1 = MUSIC_THEME
5 v6 Z+ h& L% F/ E - .INCLUDE "data/music/Raf World/config.asm"
: b$ O- A0 s. r* H' g/ H - .ENDIF5 D+ H( W0 T, R5 X* z6 p
-
, [2 `4 \' j; C7 o. Y$ P! V: g+ N - .IF 2 = MUSIC_THEME
/ }( _2 f; L# c7 ], C c" | - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
" S+ s1 T h2 y, R( m, r - .ENDIF0 m0 m, \6 N- t& G
1 Y7 q& t6 z" H3 R3 r- ;======================================================================% ^! k. v2 Z' A: {8 G6 o0 e7 k
- ;引用CHR图像数据# U; ~5 [9 c+ O" {: j
- .BANK NES_16KB_PRG_SIZE * 2- v4 e9 s& ^* ?- K4 W0 z
- .ORG $0000
. z$ V- ]+ A/ ~5 F& y9 O/ r - .INCBIN "data/bkg.chr"$ B+ J6 a+ w' _: ~4 T7 _2 N7 a5 z7 `
- .INCBIN "data/sp.chr"
. D+ k% w6 C, T) j' V2 Q - + M! y. _( H! Y1 u4 u
- ;======================================================================6 J- Z+ t! Y, E. m
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
5 m/ @* R/ L# E2 k0 S - .ORG RESET_ADDR
5 R! D7 I _+ S - ;======================================================================! o% W6 a6 x. x" c
- ;引用其他源文件
8 ~* P8 T' @4 D, F# Q$ [ - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
" T6 s0 ?) n; T0 _ Z, D" { - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理! |6 W1 R3 f" A- ?0 U, L0 X9 Y5 a& q
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
9 ~0 b) @- `6 a1 O - ;======================================================================
& B2 R8 K* E5 n) E; T- w6 b
( R. T; r8 Q3 l2 C- ;======================================================================
+ _* f/ f5 B+ N: E, K% F+ c; I - ;等待VBlank到来+ Z" q1 S" w/ b) L+ j$ J2 m7 y
- Wait_For_VBlank1 q& x2 H ~4 j- K* B' _( M
- LDA PPU_STATUS4 v1 i' G! y2 K
- BPL Wait_For_VBlank/ K5 X: K/ ]* f; X: B' E$ E3 |) l
- RTS0 i+ w. c( `0 W& D6 B8 W% l
- + }* T+ ]. E* }
- ;======================================================================
6 Q/ a, n! ?3 p+ p1 J - ;调色板初始化( `7 Z0 w- F) ? ?
- Palette_Init5 e1 z- N3 X+ L$ g5 J% \
- LDA #$3F3 o9 F) ?1 ?) \) W
- STA PPU_ADDRESS9 F9 _1 V3 V$ H; P' A; m
- LDA #$00. Y8 ]2 [ B" n' p
- STA PPU_ADDRESS9 Z1 [/ X$ s: Z& O( U
- LDX #$00
v/ h9 d$ h. E/ g' e; q7 f - LDY #$20
) K1 F; W/ |- u2 v& a - .Write_Data
2 T2 X3 l2 C3 O5 d9 l: q - LDA Palette_Data,X
# s/ y; x7 [/ _' ? - STA FC_PPU_Pal_Addr,X
4 E3 `! o) K9 ], ]1 L% U - INX
# @& v" Q9 p% d7 Y: y. e9 ~! ] - DEY' n) X" [! J F. g+ n* Q
- BNE .Write_Data
& w0 R. \. J# B/ {# r# w - .End
& M3 U% V$ U' t2 h; E: q5 B) o7 c; ?5 r - RTS( R# o& S) R+ d9 T0 a6 @+ e
4 s4 ]8 {2 k6 O: c. o- ;----------------------------------------$ P7 ?, Q, {9 W: i2 ?& T3 U/ B: q
- ;调色板数据( i1 V( C- H) q
- Palette_Data
% D5 m/ E* H2 ^: y - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
; ]! F9 c' t6 o V# J5 } - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 221 |9 B& v( {7 G4 a9 [7 m
- / [: s8 ]3 n1 M& O
- ;======================================================================# h9 D- [# H$ s& r- Q# K% \! X- E
- ;命名表清空1 m V4 g0 g8 x8 I; L6 V+ V
- Nametable_Clear
+ V2 B) F4 _% S% U/ U) w1 w! @( U - LDA #$20
J- [2 q a p8 N- I9 s/ ` - STA PPU_ADDRESS+ M, u; `) a( n% Q. j5 k3 h# R* l
- LDA #$00
" J; N5 |2 ~* D' }. F - STA PPU_ADDRESS
3 x7 A8 n0 ~) m% H' n - LDA #$00
% A0 G$ p; d) z& E - LDX #$00+ w0 ]6 I4 Q( c: _
- LDY #$083 J R2 z) `4 X1 Y9 p
- .Write_Data1 \+ O! c$ E! N, ]1 F7 e
- STA PPU_DATA
( x0 q# w4 J& O' f U4 T5 q - INX$ O0 d/ ?/ k% Q# S5 \5 i
- BNE .Write_Data
' N3 x- k8 c' e8 G - DEY" {% C; y3 R- e7 s
- BNE .Write_Data
# I7 @; V; ^* b& ]1 Z# Y! z5 E - .End! e, q/ P+ F# ~! [ B5 ?' D4 @; Q
- RTS* ~& }/ n9 B! y* I* n/ V
- $ f, X! |% K1 f8 `7 _% J3 R1 r
- ;======================================================================! M' |7 S0 }! Q
- ;音乐曲目切换9 W( v+ I& Q- t6 O+ f( j
- Music_Select_Process
6 r7 m$ t6 p* H, o - - n) Z+ Q( h- y# U
- .Pre_Music;上一曲
# n2 X% ]* P7 b2 r- H - LDA FC_Gamepad_Once8 @: p) [5 i# P
- CMP #JOY_KEY_LEFT
6 f+ q: |# \4 T3 f0 {; R - BNE .Next_Music9 e# x: c4 f6 L$ e" H
- JSR Music_Play_Pre( E5 @/ f/ k; d2 y) D( L9 n/ G
- .Next_Music;下一曲& G# R9 O+ R' O% z
- LDA FC_Gamepad_Once
: E/ U# B ]( R, Z# t - CMP #JOY_KEY_RIGHT# V6 a2 d" x- |, R3 W' N/ B# U
- BNE .Next_10_Music
`4 O% y6 ^) k p, R& o9 W - JSR Music_Play_Next
+ S, Z* f1 h" Q% [ s. V% _, E, ~ - .Next_10_Music;上10曲
0 F" O- ]8 n; c4 J ^# |6 m - LDA FC_Gamepad_Once5 `2 i( t0 ^/ G
- CMP #JOY_KEY_UP/ J! a' o' q# z
- BNE .Pre_10_Music2 y# C/ h8 E! j& g
- JSR Music_Play_Next_10
1 h2 R* q: S& P/ E8 d - .Pre_10_Music;下10曲 c* v4 c1 s) L/ m6 ~! B
- LDA FC_Gamepad_Once/ C0 I0 N$ s/ E9 B
- CMP #JOY_KEY_DOWN
! e8 O5 \2 I7 N8 c! v - BNE .Reset
6 G/ N: {! Z% I2 X" R$ q0 d - JSR Music_Play_Pre_10
3 ^7 O+ w- a, {: l# a - .Reset;重播当前曲目& W- `- _2 X9 |9 s7 x7 ^
- LDA FC_Gamepad_Once
0 J3 U& M9 K$ @# [$ u# Q9 [ - CMP #JOY_KEY_START
7 S* s2 M# M! N - BNE .End( p! t# _9 \* Z
- LDA FC_Music_Index
7 b) ^) R1 p* v/ g# g6 `/ l - JSR Music_Init_Process' f. l4 P1 f5 l/ q/ B3 D
- .End
2 A, N4 c4 B: ^+ X3 K* H - RTS0 D: b5 o! i" o7 p" O5 `1 ]* C& w
3 ]0 H: _, |8 p) h6 k- ;----------------------------------------------------------------------0 w% c$ a: t/ i/ s ?
- ;播放上一曲
8 M- u3 z4 q- x7 ^. w4 Y% O - Music_Play_Pre6 t- s0 M, J( Q/ D' c, j
- LDA FC_Music_Index
1 J: O7 t0 W/ W) | - BEQ .End3 D# E( ^2 i5 r" Y8 g4 [
- DEC FC_Music_Index0 |* _ A) t+ u9 Z
- LDA FC_Music_Index
0 I5 V+ j4 F0 b2 `! k$ L: z5 S - JSR Music_Init_Process
! `* j* X, u. E8 K - .End
3 D: z' _" s4 x# q - RTS
% @. ~! e8 X5 A" e n4 s* u' s0 D - ;----------------------------------------------------------------------# v7 v) s; y& T
- ;播放下一曲
( r( n- k, A& O. E - Music_Play_Next
4 ?5 K+ j1 ^- m3 ~9 I - LDA FC_Music_Index) }, J- u1 O8 c0 ^1 Y5 t
- CMP FC_Music_Max_Index! A. F P- m, T* ~# A% J: C
- BCS .End2 W5 l; p# K' H
- INC FC_Music_Index
* j) U) x0 C+ A$ ]0 X% z) _) j - LDA FC_Music_Index' \- d! h: h; ~4 h- G
- JSR Music_Init_Process
4 s6 i7 k ]! Z* q - .End
, z) ^; p5 A/ s/ }" b0 ` - RTS. g; L- Y9 p) @) L5 P
- + \# M2 z5 {0 `' v
- ;----------------------------------------------------------------------
0 d9 K; U/ M3 \2 }2 E3 H - ;播放上10曲6 o2 i# J, c& ~8 ^$ B5 J2 z. `
- Music_Play_Pre_10
7 D( N4 R* Y. E% _) X8 G: F - LDA FC_Music_Index
$ X: u* F8 I; S5 B - BEQ .End
$ C' `% l& ^" e, c1 p0 @6 I - SEC1 O0 s4 x, J y, Z
- SBC #10, l2 `# o! y9 l. k" i: |
- BCS .Pre_10/ Q. C, h1 Q8 S! S/ {! ?3 I
- LDA #$00
+ n9 Z$ k$ y% i/ t, r$ |9 H - .Pre_10
! t% ]$ O3 x4 W5 S9 k; H - STA FC_Music_Index3 N/ D5 Y- c' v7 S7 j- c- ^
- JSR Music_Init_Process
( t' F& @! w% V- F+ x" f - .End3 X/ ~( H6 v0 {& E
- RTS+ D# p1 p( u) D
- ;----------------------------------------------------------------------# ~2 m/ k! V% i/ Q
- ;播放下10曲 p: P/ e! |+ G8 i6 d
- Music_Play_Next_10
) P" n# d/ }5 P# S0 g - LDA FC_Music_Index
3 V7 n% G5 G+ ^3 k( x, a; j - CMP FC_Music_Max_Index+ S: B- C$ |- F5 S. }$ N
- BCS .End
0 {! v {/ O! v @# R - CLC5 w+ U& p5 g' x; a' X, D
- ADC #10: f- r" r, O6 X" t5 W# g
- CMP FC_Music_Max_Index' p) `- D( X/ r
- BCC .Next_10
" r; y8 Y9 H) g' W# s4 [) a - LDA FC_Music_Max_Index
% x" `$ z. G, \- x( W! j - .Next_10
4 u$ O f# w% O5 l7 G+ n - STA FC_Music_Index" x' C* H0 B8 ?! f o+ m
- JSR Music_Init_Process
q+ d, L9 \. }( N& h - .End
$ o( {$ a+ D m# U+ f, T - RTS8 W5 {8 ~. o4 W6 j" J
- : H6 Z% h# c9 l
- ;----------------------------------------------------------------------
$ `! p e! ~3 z1 J1 u4 J* c - ;8位十六进制转3位十进制制
1 z1 m9 S; F) ~: |6 W: d - Hex8ToDec
$ F. j5 O" Y- u; {# {6 W - STA FC_Dec_Data_18 I9 l. B5 ]9 o6 k
- LDA #$00
- T7 d- e G' {4 x, t6 N1 O0 Q - STA FC_Dec_Data_100/ L8 H' h6 g) f2 ~5 I4 i/ g
- STA FC_Dec_Data_10
) l G' Q! L2 B" q2 A - LDA FC_Dec_Data_1
9 }. `; z) q# N% I' h4 D# r8 N - .Convert_100
' p0 P5 P0 _% ?: T* W, t1 J; ] - CMP #100
+ O' k+ t4 p5 ?: f# n1 z% A - BCC .Convert_10! z& M) g- M1 S, ?' ?
- SEC4 g$ v$ z2 x5 a7 q; T
- SBC #1003 S! R4 ?: z4 }, v0 l5 j
- INC FC_Dec_Data_100
9 A" M' F* Z4 X2 p. S - BNE .Convert_100
, V6 K+ O4 W2 `* m7 X - .Convert_10
: c6 ~+ @0 Y4 X* S F2 A2 I8 m6 t3 z - CMP #10- N8 |; @) @( C8 @) J$ d
- BCC .End
& n# _! O4 T. k1 X! i - SEC' I8 t% ~; O7 J& Z3 K
- SBC #10. @1 X5 z6 G+ R4 P, r& l O4 c7 i# y
- INC FC_Dec_Data_10
% R) p0 u1 o* [% P3 R - BNE .Convert_10% ^. K0 l+ g: l& L7 t) c, X! H" _% J
- .End
! z9 v- z" ]5 g* ] b# R; j8 w - STA FC_Dec_Data_1
) b" r0 d* H2 G2 \1 x! m+ } - RTS
: O1 v- k; U# R! J9 S+ Z - 7 d" O$ E' }/ W8 o9 G; H* B% A
- ;----------------------------------------------------------------------
- l* s* s% [: s0 u3 F - ;显示曲目信息
; _7 H# r* f( G& M/ | - Music_Info_Display
* w, s: M; p3 ?; C6 a* }1 A$ g; K6 P - LDX FC_PPU_Buf_Count
! ]: v% R8 _5 Q2 N1 @ - LDA #PPU_WRITE_MODE_CNT_LINE
* j+ v3 z m; Q; Y. k8 q. o - STA Use_PPU_Buffer,X8 @5 B( w$ W! Z& M5 |4 z* R
- INX2 @/ c, }9 i3 v
- 6 R" L% i6 [# D' ~. h
- LDA #>MUSIC_INFO_POS
( f+ c$ H3 k1 b m! k - STA Use_PPU_Buffer,X
$ t4 q& n7 y* |4 h( Y. z% f - INX
3 b, q8 M6 A, `" _ -
+ L5 ^4 w3 r0 J* w6 u - ;居中' [; v0 s o4 a$ I- f3 @: \
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2/ P' u b) z% ]
- STA Use_PPU_Buffer,X& n) n/ v! L, s1 g* h% H) i4 d( J
- INX
/ o2 V1 P8 u' P/ d! f -
- G* k3 V! a+ [5 C# a" G - LDA #$056 y8 g9 g, g3 v" p" R
- STA Use_PPU_Buffer,X. p! l. l: S. x' u
- INX2 R, |5 }7 B8 q# @5 z, U b) f
-
& M4 y0 p# W/ M. a - LDA FC_Music_Index
9 r0 ]# v7 ~# ]" r" ]# }$ ]8 K - CLC3 |% I( o# m/ S6 j, s
- ADC #$015 ]9 O3 d1 j" A
- JSR Hex8ToDec
, i X$ y6 R! J6 ? - 0 F7 ~8 l% r" L j/ W
- LDA FC_Dec_Data_10# ]) U& z0 S7 U _0 [7 w4 H" j
- CLC7 f0 g$ S' P$ ^2 x/ S" V
- ADC #'0'/ Y# S5 {& p0 X1 F! ]1 S
- STA Use_PPU_Buffer,X# i2 T: J0 q3 T v& Y
- INX0 z. L: k/ ~) X2 C7 F0 M9 _" X
- 7 U3 |$ o- U$ S" r6 ?4 @1 a# s4 z' I& T
- LDA FC_Dec_Data_1
* A$ J: p2 d m5 L - CLC
3 {: |0 F$ S2 S - ADC #'0'6 q+ y% } K! i
- STA Use_PPU_Buffer,X
% o' G" i! Z! V- }1 E( K. I - INX, ^6 k; L) A0 V t) q: L
- 0 W8 [" O2 W1 w2 Z" v2 _( Y* U3 Q' {
- LDA #'/'0 c8 }0 j9 ~( X2 J/ \! [4 Z
- STA Use_PPU_Buffer,X( J; e2 f) K5 F% d( Z3 u
- INX
0 S+ y! w H( G+ }( e -
% P% M' g% C. B/ ~6 e% v - LDA FC_Music_Max_Index0 j5 w" P( G7 w1 M
- CLC& ]- _3 C2 a0 Q) \
- ADC #$01
6 k8 ?3 t4 \* B' ^ - JSR Hex8ToDec! L- F: m* k( N/ c1 N+ ?
-
0 m7 z4 h* Y, S/ e - LDA FC_Dec_Data_109 E. e: W0 c! u
- CLC
8 j/ _4 C( c& n8 Z1 f - ADC #'0'2 T3 j4 E6 g. [' x* u
- STA Use_PPU_Buffer,X# \2 G V/ d [5 `4 L; }% k
- INX- a7 W: \8 P/ k8 J
- ; b) f' d f' d8 `$ t/ H( Z
- LDA FC_Dec_Data_1
. h- ~2 q0 v4 Z2 w# \! ? - CLC
9 N3 x8 o: r7 M& K8 ^1 H) X/ u5 W: v - ADC #'0'! I" ^; F0 p! O( l1 e3 B y$ J
- STA Use_PPU_Buffer,X, c: E, u7 Y3 j/ _. J) E
- INX
+ h) U' o4 }# {" i5 w5 P. @ -
; `( w; v/ [( ^7 e3 J3 O - .End) ]" s6 b' G9 o) q: t5 s& S
- STX FC_PPU_Buf_Count. ^' m! [2 G* }6 a2 N& C1 a
- RTS. q7 H) _9 C/ ~" j- f3 X0 E
- 7 Q* s9 n0 _# E/ [
- ;----------------------------------------------------------------------
& i4 z/ Q. y8 ]: }. a) G. t - ;音乐曲目初始化处理, O( ?; f- I4 u* y$ C) X; q
- Music_Init_Process
! X M& N s) l' U& p) Q - PHA- l: ~+ i& \ i4 A1 a6 z, L& e+ o
- JSR Music_Clear_Process: N1 Z! s3 v5 d8 T
- LDA #$1F
( ?) N5 w+ J J" }: _6 u* g5 b- G9 W - STA $40157 x+ C5 e" B3 s: A I2 m) v
- PLA
6 ~8 I' K: c* W1 B+ `6 r: u+ O - JSR Music_Init_Addr
, Y1 C e1 x& i5 P - JSR Music_Info_Display
+ f0 K4 ]& `, A! e( ?/ b - RTS% c5 V4 D; O" l9 R L8 r# x5 w" N
- 9 N( m: O; O( ^. m5 }/ v" J
- ;----------------------------------------------------------------------
% b4 F6 l! ~+ I4 z& w" \6 U6 q3 ^ - ;音乐播放处理: V' q9 w: y2 ]! n! D
- Music_Play_Process! y- ]. [" G/ ^: m6 m4 m9 B& Y
- JSR Music_Play_Addr
+ k$ J6 S& y' n( O8 |0 G9 y - RTS; B) h3 z0 A+ `6 Q5 K& s
S! C$ `0 [7 @3 U" K$ u( S/ E- ;----------------------------------------------------------------------% k& w3 K, s: J+ ~
- ;音乐播放处理
6 [9 G* [* }0 ^" d- r - Music_Clear_Process
- ?) d5 o2 }7 h* D* [ - .IF Music_Clear_Addr/ d% |! |1 l/ P; A, x, f
- JSR Music_Clear_Addr7 P8 R) M- r9 A- a; r) q8 H2 p
- RTS
" P6 G+ a9 B! Q+ f. i: ~: c - .ELSE
. m& X( H& A! a6 G1 _) S }' O - LDA #$1F
$ J+ Z0 W9 ^' m6 |8 m0 r! j0 z - STA $4015
5 B- ]9 U7 E1 Z - LDA #$00& j6 f8 n A" A9 P5 {
- STA $40105 \! q9 E+ Z. p2 k& D0 H c1 Q
- LDX #$009 `% J/ w' r. R- \' h+ D" R
- LDA #$00
! F2 z' S. M' g M - : L, O: D* v, {6 Q. Z% @
- .Music_Clear_Zreo_Page_0$ |% Q5 ~* _! }7 \2 O; z+ ]# f k7 ?
- STA $00,X+ e' L' ]6 x" l1 C2 j' `; j
- INX5 w* P4 K3 S4 p9 l: d3 O, C3 c
- CPX #Use_Zero_Page_Begin
" @7 B. f1 G3 H, `2 m - BCC .Music_Clear_Zreo_Page_0
0 C( E" k7 d4 T& P9 o - ! c3 \- }6 ^5 `4 ~# z r5 p* F0 R1 h; G. R
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size& o& |5 z/ L; i
- .Music_Clear_Zreo_Page_1) c+ w9 Z0 ?) ?+ ]
- STA $00,X% l$ b* Q* D' P% [. @
- INX4 R- c9 O4 V' O% B D9 M
- BNE .Music_Clear_Zreo_Page_1
- D8 f( P. N5 J8 Z -
' X M) t9 }$ @# m" n - Music_Clear_Process_1% q( f* w$ y% a" K. s
- STA $0600,X3 u b" X/ t$ g1 t1 E1 I# J
- STA $0700,X
, p5 j1 `' U: S! p( K$ c, T& a - INX
/ o8 @+ k1 {, c: c: [6 I - BNE Music_Clear_Process_10 @; d3 z6 e J& K8 V
- LDA #$10
; k6 H0 `$ _0 w) D0 p& v - STA $4000/ U+ n( V% {) I9 i$ ?
- STA $4004
6 \; t4 }* t/ a - STA $400C. b4 {8 z# c) C/ `$ O& `
- LDA #$00* ^% w" R( ^' s
- STA $40080 B' N, r/ m3 b, r, [
- LDA #$0F
+ B- `: F* ~6 v0 U; I. o+ j - STA $4015
9 W* e+ L$ a* F+ H - .ENDIF/ d4 V; \9 O# E; N9 V/ f
- 5 q5 p% J9 l; A
- RTS
2 ^8 t7 y! i" a7 t2 L - $ i% ?7 l" u% m/ k, Q
- ;======================================================================" Q4 ^4 K+ ]" B6 s( @% D
- ;重启处理
5 i4 y- t3 l; K3 y$ f4 L- l* _ - Reset_Program1 q9 _7 W2 Q# M N
- SEI/ ^8 J8 ?2 d. R$ F X
- CLD
9 o9 M( J- U% V$ s - LDA #$00
6 z' R# H% f' \ F" ]+ a - STA PPU_CTRL9 V+ l( d: G$ L W
- STA PPU_MASK
, P! c* R3 W: h: u/ u' Z" `. X - STA JOY2_FRAME0 p0 ?8 X1 l$ s5 [9 }+ f
- STA APU_STATUS
( S; h3 ]+ q* I- n7 [& [% S - / C& P' R* K; @' V$ ?1 W9 t
- ;等待屏幕准备完毕$ Z6 S2 ^/ N/ v8 o
- LDX #$022 M3 D% F5 Y1 T0 W3 o% D" y; G" j
- .Wait_For_Screen_Ready; y7 P( l; Z/ O2 \, T
- LDA PPU_STATUS3 @% {9 G, Z- o1 V" r+ ?! F
- BPL .Wait_For_Screen_Ready0 ^) d8 A2 O7 X* H# t7 r3 n5 Z, C
- DEX- u8 j3 ]4 u3 J) y: n/ w& A8 l
- BNE .Wait_For_Screen_Ready
$ [2 h' D1 w2 H; V! l( a2 P- I- ?9 N5 P - ! L$ U5 d% c0 v2 k! x C* J
- ;清空调色板
* i* @* |; Y7 u* B - Palette_Clear& S7 D- {$ M3 p0 Q& K
- LDA #$3F
' ^( }% _7 L' m% b - STA PPU_ADDRESS
4 ?1 ~8 q; z$ ^$ a - LDA #$00
! U% [8 N( t0 \$ d7 l7 a9 u e - STA PPU_ADDRESS
8 S+ x/ _! I# } k1 E2 ?, Z8 u - LDX #$20
: `/ I- X$ p2 B) D) p$ i2 ~5 } |7 m* b0 a - LDA #$0F; D8 G) ^3 e% j# D9 l9 P
- .Write_Data
+ m/ O$ R; o9 b" f* g: L - STA PPU_DATA: S- J4 H0 S8 h C! h
- DEX/ E( d. w* V' E2 @0 h- ]
- BNE .Write_Data0 {) P+ f" E r0 S( g( ]
- + m+ j) W }! t" c
- ;清除声音 $4000-4013
+ W/ X- {( j7 V, f5 m% d* a; K - LDY #$14& ~. e h+ S6 G+ K5 J
- LDX #$007 J F) i+ k, R7 {3 P
- .Sound_Clear
0 `2 m" f' h7 [& r6 Z( ] - STA $4000,X
! w) S' R. O+ ~0 d4 i+ J$ [ - INX9 c( K b K, C% c6 Q) ^! @' K" ^" k
- DEY
, f- s7 r+ L# ]5 W - BNE .Sound_Clear+ t% b7 B5 I$ L- L+ _. g
-
1 s: q2 E% i2 e! ~4 { - ;清除 RAM $0000-07FF( k, K4 e7 q- R! K! Y* C1 Y) `; W
- LDA #$009 F+ a. [: _( K* m1 N" Y* Y
- STA $00
2 v9 }7 _1 ]1 T- O! U - STA $01/ v4 m8 n b; R3 I
- TAY
8 R2 i7 B* [/ K- v8 z4 k - LDX #$085 P: ?& J( m2 K) D8 ?% t! A; ?
- .Memory_Clear5 m' f, ? a/ y3 a/ f
- STA [$00],Y
2 T9 a+ k( K# h8 z; `2 V) G - INY
/ o7 ?) |, Z6 g9 H7 E - BNE .Memory_Clear% q2 m1 O: F3 W8 _* d' m& T# a
- INC $01
1 T. P q5 l: i! a/ L' O$ J - DEX
, D9 \2 s/ b$ M) X - BNE .Memory_Clear
; p9 D+ m' ?# W' {0 @. \ -
+ \- O4 E, {# h3 f0 _0 Q - ;精灵缓冲初始化$ y% m6 _% H2 D0 x& f$ ~
- LDX #$00" F" B6 C% k _' e' x' a
- LDA #$F8: X* D( u3 X- a; i
- .OAM_Clear- v9 Y# a$ X ~
- STA OAM_DMA_Buffer,X
, R6 p; x5 c( N+ w8 t! v$ t - INX
3 W; {- n/ o) r& e' h$ D - BNE .OAM_Clear) t/ [& _. \6 ?7 w/ E
-
. Q, v0 D+ S2 z6 f6 u - ;栈指针初始化
/ B. j, g2 X1 @ - LDX #$FF
, n, ~3 u! C W& V; M4 f - TXS
- H8 M7 D! e7 S7 O# a* P -
* u. {0 T" s1 F# ~: J1 Z: Q! c - JSR Nametable_Clear;命名表清空$ j. H' z2 F. I/ N8 L7 H
- JSR Palette_Init;初始化调色板缓冲' ?9 m. Q% y' }5 i1 c1 m% a: C
- JSR Static_Text_Init;初始化静态文本) d6 x, n, q: ~& K
- ! s9 p" n; }2 a0 x I, n* M
- LDA #MUSIC_ITEM_TOTAL - 1 t7 _9 \2 Y5 `7 D; D4 u- ?
- STA FC_Music_Max_Index1 u# D! r2 B, K/ b r1 w
-
8 P& m5 _% S, L1 F - LDA #$1F, Q8 K7 z/ M, N( Y4 i; a/ E
- STA APU_STATUS
N! U, |) A, w- @! B - LDA #MUSIC_BGM - 19 s/ q% F+ t& {; f3 \: W9 _' b8 i
- STA FC_Music_Index6 Q& K) n/ }, o: b- I
- JSR Music_Init_Process;音乐播放
T) u4 ~8 N. d- y2 @ -
0 e* t1 d# L% \, B. K9 l - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)+ p2 w- K9 g' k" z
- LDA #$1E( A, Z) V; I* C6 U7 O
- STA FC_PPU_Mask_Buf/ @4 Y8 M6 ?% n7 \* G2 o$ P$ {6 u
- 9 `/ k( ?( b% S2 L; L
- ;启用NMI处理" r$ a. a/ H9 {( b3 U
- LDA #$80
7 \* K m% [0 |' ?8 [8 o - STA PPU_CTRL6 ~. |( i# r# _. j% ^7 }
-
+ ^8 W3 ^2 }' Q1 H: l, g9 z2 F5 t3 b! M) v - ;程序循环, 剩余工作交给 NMI 中断处理" g; P; g7 Z: \
- .Loop# H9 P2 ]3 K* p! _- P9 A, F6 G
- JMP .Loop
* m1 ]! Z) a* _% Z- v - . N$ @; p o# |: `4 _4 M6 a4 E
- ;====================================================================== u6 B1 _* b1 |# M& k2 ~+ y
- ;不可屏蔽中断处理
5 G0 J) {3 w- C2 R% W$ T W - Nmi_Program" i$ f4 p( Q" e6 H) h9 ` M
- PHA
; y$ g' N- T( A1 o8 H - TXA
* X9 {. ?" V) m - PHA
7 y G7 p5 L/ }/ X* ^ - TYA
6 b Z8 n1 |4 @ - PHA
. ~; R( _/ ?1 H: _5 _1 O. E -
0 u! ^+ V, S9 i1 D4 L) u( T6 u - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
/ f$ P, f5 J! |+ ^) l -
/ ]! R+ B# v, I+ r) M6 _ - JSR FC_PPU_Procrss;PPU处理5 P2 \; [, S& C9 _& S$ b3 ~- h& [
- & ~. |- l, E$ ^. ^9 j6 f; t& n( [( r4 @
- ;精灵内存更新; P' ^8 }5 m# b ?# d8 v
- LDA #$00% f0 s- o0 g2 {# Z4 E
- STA PPU_OAM_ADDR" T2 P: G3 C8 }8 c: m
- LDA #OAM_DMA_Buffer / $0100
9 N3 a, K. w# E - STA OAM_DMA
9 Z/ q1 C. O: A8 @ -
6 x! i5 E8 U* B* _ - JSR FC_Gamepad_Process;手柄输入处理7 X0 C' s4 t. A2 b: Z7 x
- JSR Music_Select_Process;音乐选曲处理
8 v0 F# E4 o* g9 q- Z% ]0 a% O6 o - JSR Music_Play_Process;音乐播放处理4 a- T( x; V- a
-
9 B& X& F/ C& n& \) i8 R - PLA
$ k6 D; s6 z( @# s& O- B9 S6 F - TAY- ^8 ], a- @0 ~ {% i% U
- PLA/ t6 O3 W5 P! s, ~
- TAX! `$ V. ?& d9 N: l
- PLA
6 U/ c2 W4 Z& ^$ \6 y1 @: k- R, s. f - ( e3 e* [1 t$ N$ R: V7 A. t! \
- RTI
1 f4 p$ v) `" k. V5 _) m+ n- N1 ~% C& V: I
- @2 K, {$ P* c) j' M$ E. c; o- ;======================================================================. M" q7 t( m, T" A5 s$ ^9 [ K
- ;请求中断处理
+ C# V, [8 X( K6 F - Irq_Program# a4 Y4 K" R4 q! t- L& K
- RTI
& F4 |) b2 f) Z) y3 N - ! I9 R6 R9 K: ]& r
- ;======================================================================
7 {% _' Z7 L9 r5 V; d1 K - ;中断向量表
+ v& k: l9 {4 |- s - .ORG $FFFA- H" N3 x6 h: D9 [/ h
- .DW Nmi_Program ;NMI触发时执行
2 b- V5 @* q% a# Z - .DW Reset_Program ;载入ROM时最先执行
; T. p% I9 f8 t' [ - .DW Irq_Program ;IRQ触发时执行
. V% p4 L% @* U
复制代码
, c# @; e ~. e1 r0 M; \( T2 x, ?+ P w! ~$ v6 Q
( |) Y2 T5 X4 a/ |) Khttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|