|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
- i) c# B6 b1 Y- }/ W : S* y _. O+ u/ T
以下是主框架代码:
/ J% l" l) T6 r1 |. j0 Z- ;======================================================================
2 g) c# R, p+ c0 C2 } - ;文件头1 u% Z* `' T/ W' ~ U
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
9 N$ {0 e6 \$ l' Q# o8 p+ v - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
" j( M% y+ }0 T - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码6 U) n0 H6 }, } I: A
- ;======================================================================6 G4 `0 q8 j) z f o; r
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2" G1 M$ v8 R- p' a
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 16 e6 s- @- o. l" c: x7 a
- ;======================================================================
. e8 \& }: k& f8 i4 ?' D - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
. I5 l' h6 n. X9 {; D - RESET_ADDR = $E000 ;主程序起始地址% @: n8 a2 t* b0 P" Y
- ;======================================================================. W, ?; }0 O9 r: V% I( I! n0 _
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB7 `2 U# U( y2 ]9 ~- d# Q, d4 T
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB" W( ^5 `. H5 F5 ^
- .INESMAP 4 ;Mapper号 (0-4095)
. U2 d+ Q1 t+ ~5 o* e - .INESSUBMAP 0 ;子Mapper号 (0-15)
# a+ K& k% b) f - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
1 o3 ?4 k6 ]7 C, o/ X - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
/ D. _2 N6 D t) e - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
0 C. x/ Y& Q5 E% f6 N3 I$ n - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)6 D1 ]% V8 V$ C/ L( k
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数); m* \8 G2 Q! e- s8 I7 E
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
; k7 W, w/ h6 o' R - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)5 m& L5 E4 n- U! Q
- ;======================================================================0 O1 J( g4 X g
- .INCLUDE "fc_demo_config.asm" ;全局配置) ^$ D2 Y4 Q. `' C/ H4 \, x! p
- .INCLUDE "fc_demo_constant.asm" ;NES常量
8 ]: L6 K) k1 ^ m. ?, ?) J3 I+ m - ;======================================================================
( D a8 _6 ` K* i - ;音乐配置
0 A2 O8 {) G7 f' p - .IF 0 = MUSIC_THEME
8 G+ X( Y' F, Y8 _' v1 l - .INCLUDE "data/music/Gremlin 2/config.asm"
% M0 ?# [" l7 d& q# M2 a4 j - .ENDIF* M- j' ~# S( V2 V5 m/ s/ \( r# F
-
( d- ~0 ^# N# Q* J - .IF 1 = MUSIC_THEME) v. F( T, c4 p; [" v; m3 l
- .INCLUDE "data/music/Raf World/config.asm"
8 R) I1 {/ o6 b7 } - .ENDIF
3 {. |" G( m1 S: L: `$ n - 5 }7 W6 U0 z" y
- .IF 2 = MUSIC_THEME / |' ~- ^1 B8 C2 M3 b8 S0 H
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"& H0 l3 n) F) ?" C6 b: ?7 ]8 t
- .ENDIF
, N; i+ Z2 o+ U/ T# A
! u3 v% V C9 N" O" k( L- ;======================================================================
+ D0 ] Z3 ~5 p; T - ;引用CHR图像数据- d: g4 Q3 D/ H
- .BANK NES_16KB_PRG_SIZE * 2
3 n2 \' n: R, d/ s* P* W' @ - .ORG $0000* Q x# f9 C4 Y. ~1 i1 \& I2 D' M5 Y
- .INCBIN "data/bkg.chr"9 U- R d+ l' W* t* Z
- .INCBIN "data/sp.chr"4 ~8 } v" C1 O& P! S
-
( g A" m2 i3 X' | - ;======================================================================
- k. ]/ G. Z. `" w" p5 G: M" W - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
P6 c, a1 d8 o) P, F1 w" X$ R' s - .ORG RESET_ADDR. d; b" l; L0 _! I) a B/ E$ ~
- ;======================================================================
3 D7 p% @# c: z7 E6 u4 n5 w1 U% x - ;引用其他源文件
- n: S7 x5 a, a - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
% v+ C3 ~6 N: f$ _, p! M2 N3 N: `3 ^ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理8 t6 ?7 D' ]6 Z, k' I8 p! v
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
0 ^* x$ n9 b: o% Z# D' d - ;======================================================================
$ U9 c" C/ ?9 Z& Z - - C7 [" D& N: U6 ]: B/ c2 }
- ;======================================================================
4 Z9 K8 G- G- J/ S0 D8 X; j) P - ;等待VBlank到来) q5 ` X' T4 F6 ~! U- s3 i5 X* ?
- Wait_For_VBlank0 t/ O( N, l& x
- LDA PPU_STATUS
, f8 {$ ~. j3 F0 A7 V# p7 j" u5 T - BPL Wait_For_VBlank d! I( \+ k* T2 {8 m% q
- RTS
; u5 h5 i7 g( m
0 X- K0 j0 l+ n2 A/ p8 U. L- ;======================================================================# D1 b7 M6 n8 {( W$ _8 i* L, V4 p5 Q
- ;调色板初始化* Q: h. }& Z+ D+ p6 B
- Palette_Init) \" f. p6 p/ Z
- LDA #$3F
$ A) N+ e Z" ^/ n& r' W - STA PPU_ADDRESS
4 n; v$ U5 l0 o2 I$ ~: O8 a$ \& h2 ] - LDA #$00
3 {$ k8 N/ R) k7 h7 q3 s - STA PPU_ADDRESS3 M% X4 p& [3 Y
- LDX #$00( h& B8 o4 v1 m/ Q& I
- LDY #$20
$ o) L4 u b7 G* Z/ V8 V o7 y5 C - .Write_Data, E4 X% f, e _9 e
- LDA Palette_Data,X' C9 U! M$ r% |+ O4 I1 `& n
- STA FC_PPU_Pal_Addr,X/ \3 y; y, s! f: O7 I6 \
- INX! A7 q) } `2 k
- DEY
; Y; \# D& {8 N$ I+ h+ i5 t4 E - BNE .Write_Data
6 t" H8 d; L) _3 m5 ] - .End8 P" P. n5 L" Y `; y
- RTS4 |6 h% x( G5 M7 z% J+ c4 V
- / i, A: T/ Z4 y
- ;----------------------------------------0 a( Y7 b& a5 @
- ;调色板数据
) J0 Z# I" x& x- X( z% G# a% X. q - Palette_Data
& H1 R5 a8 K4 z; `# g i - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
" O% _- H }5 v. F - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
" K C: d& ` `$ m% B. J -
( W% V8 o7 S4 N# R, A4 ~ - ;======================================================================( u9 n$ N7 i4 ?6 `4 I5 E/ G/ a$ g. {! l
- ;命名表清空
. }" q) X) a2 }; i8 Y: H - Nametable_Clear1 I4 d: W- Z* s) A$ p" S* L
- LDA #$206 r& ~# s9 G" b2 ~4 R
- STA PPU_ADDRESS% n! d7 \) @; ^2 z) x9 u+ P3 d
- LDA #$00% B% P+ f$ W2 s+ i
- STA PPU_ADDRESS
$ M( o" u& G }, {% v - LDA #$001 x* r! |/ E3 ?0 B
- LDX #$00
9 ^4 ?* _' b' u: [ - LDY #$08
- }0 G& a g: \% d8 R" N+ Z7 L9 z, W - .Write_Data
5 [6 {+ m- U. O; ~; n - STA PPU_DATA
; [' C+ d$ z* _/ O - INX
$ j, q5 m4 W$ ?* g; y - BNE .Write_Data( p# j$ X+ C' {- J" _
- DEY) W9 B; d% c% z# S4 N/ ]
- BNE .Write_Data
' Y, t, ~; l$ m- K5 o: N5 o - .End
0 p- T5 [3 k0 b; u( o0 S - RTS$ c1 U: F' a& X! M0 I. b
- / M' ^6 `5 M2 h( S1 ^
- ;======================================================================3 O/ Z! X- ^* C; C
- ;音乐曲目切换
* F$ p } n. S2 k9 X. s - Music_Select_Process
+ i$ Z2 l3 Y- E6 @! v! I7 w - 3 X5 R1 f/ l; e$ Y8 F% H
- .Pre_Music;上一曲7 u" Y/ b! T3 P$ p0 Q
- LDA FC_Gamepad_Once9 O& f; C+ t* q) n! e
- CMP #JOY_KEY_LEFT
j. M' z5 _9 z9 U3 J - BNE .Next_Music
$ X& |; h# N1 R- [ - JSR Music_Play_Pre
! l' s3 w7 T: S- ~ - .Next_Music;下一曲7 L' U" y. Y% A7 u5 J( r
- LDA FC_Gamepad_Once I) U, r/ @1 B0 _ |
- CMP #JOY_KEY_RIGHT2 O5 }. s+ W+ b. i
- BNE .Next_10_Music+ `1 ?3 |) B% W/ ~- [9 _# Z0 f
- JSR Music_Play_Next/ R0 }# g* `7 f) y% M: U
- .Next_10_Music;上10曲7 J0 a3 {* Z+ R1 g) [
- LDA FC_Gamepad_Once& K1 a/ }3 q% k' U
- CMP #JOY_KEY_UP7 z8 B# }$ L6 L. ^
- BNE .Pre_10_Music
% _3 x! d( T, S3 Y3 I - JSR Music_Play_Next_103 ^4 q, f# P! J& H8 B' q
- .Pre_10_Music;下10曲
6 E3 E, Y$ T0 [ n8 g - LDA FC_Gamepad_Once
+ a; o7 T* g1 X" l; ]: N - CMP #JOY_KEY_DOWN
- j& L5 _/ w: l% ^ - BNE .Reset2 ]1 y! g5 _- Y# q5 |; J @" Y
- JSR Music_Play_Pre_10
: W9 p: g7 k4 ^: ]. Z# E. } - .Reset;重播当前曲目
. n5 H& H6 T5 ?1 |2 e" h - LDA FC_Gamepad_Once' k. z* {. f2 K" _( F6 G# d9 ?( L8 a
- CMP #JOY_KEY_START: L+ W! T8 F$ o$ s- }
- BNE .End$ u# W% j( k, v+ R+ D2 c9 w
- LDA FC_Music_Index
; r \2 m7 R, e - JSR Music_Init_Process2 P; }7 U1 i$ ?( o p: y+ P) w1 I
- .End; p R8 n8 t2 S' y" ~) |; }
- RTS( t6 ^: i' A( a! f" e7 z
- " m9 P) X0 S$ B6 S
- ;----------------------------------------------------------------------; }* a7 Z# s" p7 C6 J% {. q
- ;播放上一曲
8 X6 E @+ R# v5 e" o, A* U - Music_Play_Pre
- a1 O6 d4 U6 ]6 o6 p; H - LDA FC_Music_Index
, C; m5 y) X7 K% ] - BEQ .End" e) k' c ^ S( R/ k) v! s3 n3 U
- DEC FC_Music_Index+ ?- a6 l- q, q1 X* L# W( S
- LDA FC_Music_Index
c3 b5 p0 k3 o3 U- J4 D& @ - JSR Music_Init_Process
" r+ \3 J3 V8 N! Q% r) d1 l - .End' w: ^' Z5 a" e+ S5 d1 T
- RTS! s$ |" F5 G: {
- ;----------------------------------------------------------------------
& }# c( l' f) u$ i& e% V1 f - ;播放下一曲+ v# z! ~* Y a4 N6 l
- Music_Play_Next
: ]# W- U' J3 B* s5 c8 w - LDA FC_Music_Index
9 v/ z! p2 w0 |% _4 h - CMP FC_Music_Max_Index! F1 [1 [$ A' n) U
- BCS .End& r; R( ]7 ?/ A8 Q
- INC FC_Music_Index
& }) i2 B( \1 v5 B; R - LDA FC_Music_Index
1 i/ H0 K: X- n6 b - JSR Music_Init_Process
5 ^: ^0 K2 s$ q+ K; M/ [) z3 A - .End
9 s. \8 s! u; X6 z - RTS3 r' ~5 f6 U) T
- ) f3 u/ v7 _' V( z; `
- ;----------------------------------------------------------------------
: I' ]% w( ^+ p/ c/ o& x) w - ;播放上10曲
) x2 ?3 c' {3 c8 ?1 N) d - Music_Play_Pre_10
1 {& o! V$ Z3 y: G \ - LDA FC_Music_Index
& x" [, ^; r4 J4 k: H8 I - BEQ .End! X4 {; w/ C- o7 j9 Q! G2 H3 ~
- SEC
7 {+ l9 G l0 Z8 C! g) ? - SBC #10
3 o, ?, I$ Z: p0 B# H - BCS .Pre_10
2 W; I5 @9 _1 }: B1 M - LDA #$00: E A) B2 }6 H' ^. _: W* H* D0 f
- .Pre_10
+ o7 b- J* q; R/ L C3 g8 J+ } - STA FC_Music_Index, w( J( K. k) h2 b
- JSR Music_Init_Process2 j2 J$ ?% F/ I4 d6 R
- .End: j( U8 z- C9 f i1 j: K
- RTS, U9 V6 z7 G0 u: Q: @
- ;---------------------------------------------------------------------- R0 W; M2 R2 Q2 T7 b
- ;播放下10曲
; b# u$ `: i4 t$ B: \1 V - Music_Play_Next_107 R4 q* ]& s) i0 @
- LDA FC_Music_Index
0 J9 _; f5 K r, `+ r7 h/ u% C! \- Z# x - CMP FC_Music_Max_Index+ q) d, B1 b, |( y! r9 M
- BCS .End4 \5 [' O F, U) I
- CLC
1 v* t3 z4 X7 L& M - ADC #10) R! b- p0 n% J5 X4 ]& Z6 U
- CMP FC_Music_Max_Index
1 L' G' p0 u! s' C' } - BCC .Next_10
1 m. L0 J8 W: U7 q4 C% x# R/ K - LDA FC_Music_Max_Index
) R0 W% c+ q& Z' _5 B& A - .Next_10
, |0 Z5 O. [- n0 B& c4 t- z - STA FC_Music_Index& Y/ \( u o) _* T5 O6 B
- JSR Music_Init_Process
5 h. m+ J: d" }2 ?* R& E& ~9 Z - .End
4 K& x& u% i: s4 G0 \, I - RTS
/ ^8 l1 x$ h( W
9 H5 {+ s" n3 I( y" c5 i- ;----------------------------------------------------------------------
! _# I$ c6 A1 v$ T( ^4 J - ;8位十六进制转3位十进制制6 M" x, I8 Y8 [. R
- Hex8ToDec
V% T" Q- F8 g/ Y1 q - STA FC_Dec_Data_1
! j2 ~% U) C) Y" ^1 ?0 x. I - LDA #$00
" a. [( M$ Q! m- _6 `+ |# S( c. Q' X - STA FC_Dec_Data_100
. g" ~* Z9 A4 H9 v - STA FC_Dec_Data_10
& J; ^' ` q% d ` p - LDA FC_Dec_Data_1
, I) @# v7 \8 t( X6 c" e% M - .Convert_100
1 k1 z6 n/ m% p- _+ I! ], W: P - CMP #100
6 W1 Z) W3 [/ P ^" a+ J - BCC .Convert_10
0 S/ i3 r. Y, Y/ K - SEC
8 b" W8 ]( p6 c. N5 T9 s - SBC #100
% ] m% D; h' x3 @4 ^2 W - INC FC_Dec_Data_100' B; t& r* A2 N1 |* X( [
- BNE .Convert_1005 Z/ C( T4 |1 a0 P% S# N) Q7 B9 v' }
- .Convert_10& ]0 s! I! ~( q! b" v
- CMP #10
6 ]! t: Z. e7 G4 x+ w s - BCC .End
3 Y' X, e2 b& a! N - SEC
; x: O9 I- s. r' U, k7 P - SBC #10
1 p% _4 T+ j& b - INC FC_Dec_Data_10
/ u2 T/ h, S- D: e8 ?3 Z - BNE .Convert_10( g* Z5 T8 s0 T, S' ]- Y* I
- .End
' |# z* e8 v; L4 A - STA FC_Dec_Data_1
- ^! A$ @; P* S4 G( t2 P7 ?. C; E - RTS) M& Q* ]: G' |* T6 j- j$ ]
- - n0 Q9 v8 Y) L9 q
- ;----------------------------------------------------------------------
5 J- f, b# J' C2 ]9 v! e - ;显示曲目信息$ I. n% }! I4 W1 `+ B' T" h
- Music_Info_Display- e& j- V/ R8 M# Z. z$ \
- LDX FC_PPU_Buf_Count: u) C5 x5 Z$ e4 Y7 L
- LDA #PPU_WRITE_MODE_CNT_LINE& Y8 T h& t; G( Q* W
- STA Use_PPU_Buffer,X2 n i5 P$ u/ a8 J
- INX7 r- m, e* w( V) [$ [/ {
- 7 \8 V! P6 w- @" }
- LDA #>MUSIC_INFO_POS! U) Q$ D; p( Q9 c5 l( G
- STA Use_PPU_Buffer,X
9 G h6 T% j, v6 {/ r: H; x - INX
( O; }9 W% r8 q8 c/ \. C - ( n7 P( ^7 b, x8 ]
- ;居中
3 Q2 _4 M2 z7 q* j9 T - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/28 R6 O$ W2 E% P& c( M/ X5 `
- STA Use_PPU_Buffer,X
* e1 J5 D) `/ [- R4 f - INX) J* X# H# G) m/ e: p
-
* e1 e3 I- Z) N' F - LDA #$05
* n0 y0 E! K5 M3 a/ _3 Z4 _ - STA Use_PPU_Buffer,X
2 W( m7 W& @+ @ m - INX6 c3 L: D* u! [5 k& D
- % ]" O2 c% Q/ T; U5 B+ `- A
- LDA FC_Music_Index
Z" Z# t: W. b1 l$ B) X" Y* x - CLC
: b$ S. _! ^# N6 K v5 P5 n3 e - ADC #$01" z: o5 R* w6 \
- JSR Hex8ToDec4 v8 j c; }" |. K9 a$ T3 N7 O4 S
- 6 H; l1 U1 u& p$ H3 P
- LDA FC_Dec_Data_109 o8 L+ K0 d0 a) \$ F5 B* _! r
- CLC
& r5 W* [7 O9 @/ W$ H+ G - ADC #'0'0 ^0 g; q- S7 w4 t7 t# @1 ^
- STA Use_PPU_Buffer,X
/ R% k3 I( T/ f$ W6 S - INX. I( `* h0 v. p" |2 j
-
) z8 h. i) |+ A. z! k0 V - LDA FC_Dec_Data_1
# K+ |4 `1 l$ c/ I& q - CLC0 a% G, R" ^, M K
- ADC #'0'' }/ Y5 w% q7 Q) g, u
- STA Use_PPU_Buffer,X
" _# I: b" G; v' O" f+ B7 d( Z1 ^) | - INX
/ `) v* H/ ?5 |4 M4 H- |2 b# R' s -
) b: a3 l) Y+ j f0 k% @ - LDA #'/'
9 p% _8 v3 e+ E! G - STA Use_PPU_Buffer,X
4 n( O" T8 w! X; p$ F" \' n - INX
D# t! e& {% i7 R$ a - ! S* Y. e1 n9 A. h9 y/ t; N! Q
- LDA FC_Music_Max_Index
$ t4 _* R; Z2 M' y& d/ s - CLC
; ^- U- `: Q& E8 d: B8 W) h - ADC #$01
5 P: L& m; n! D" L5 J5 h - JSR Hex8ToDec
) M+ X" n; G$ f1 z% U5 T& {5 i- i5 b -
3 ] V- F; j. B0 V3 n) t - LDA FC_Dec_Data_10
( B7 ]* X9 h3 ?7 T9 m6 h% l' \/ N - CLC' V1 v: M0 D8 M, H1 R
- ADC #'0'- i# {4 C* D7 H2 `% k0 V
- STA Use_PPU_Buffer,X
% `' l: N8 y# x/ {* f - INX) u _- N0 G4 ~
- 6 ?' ?, b2 ? ?6 B
- LDA FC_Dec_Data_11 I* [' G$ }* M- u! A
- CLC# q+ u# a9 `1 J7 {* l; v
- ADC #'0'
- e; o% C7 b" I2 l9 Z D7 v - STA Use_PPU_Buffer,X3 o3 `9 R- L8 i' m5 t" x E6 f
- INX, |3 T+ m# T G
-
, C% q$ f: u, H3 J% A - .End* \- k) N1 I& [# N
- STX FC_PPU_Buf_Count
0 h: ^* l6 j+ Y# a% F - RTS9 [: E" x! x! [
- 3 }$ Y6 K! U. Z% F* L/ O
- ;----------------------------------------------------------------------
0 ]; a% w. I! D8 H7 M - ;音乐曲目初始化处理
4 n* u; t- c; q - Music_Init_Process8 V8 ~! C, @# E. q1 O- z
- PHA) _1 m( ]& J, K8 A1 T- z6 ~1 k$ h
- JSR Music_Clear_Process" W4 U/ N3 i1 n% l/ z
- LDA #$1F
9 J0 A/ F; j/ m" C$ T0 k - STA $4015
, t/ y' X0 F4 m% z# h2 f/ E; s - PLA
9 e: o0 c6 g/ A2 R! K: A5 r+ \" P - JSR Music_Init_Addr
- A! v' ^9 t$ K - JSR Music_Info_Display
8 F7 y# }8 @3 g& h# i - RTS' E' h% k- o' ]0 p4 |
- 0 [/ I. a3 y6 v5 U
- ;----------------------------------------------------------------------2 r, t( Y+ ]; o: ]$ Q
- ;音乐播放处理
# O& J/ z% c: K. w9 N2 g) d* B0 _ - Music_Play_Process
7 q; O3 H% H M# M& h" I+ c3 o - JSR Music_Play_Addr
( e& h# {6 d* ~! U2 |' F' K - RTS
" N: ?* A' r1 i. j9 Y* r1 o+ F' P
* W* b* [( o0 t( b* k2 C7 I, o- ;----------------------------------------------------------------------
. I( ?4 F2 o1 P: T$ e/ j! N - ;音乐播放处理" A' o/ S/ W# Z+ v# L% R
- Music_Clear_Process$ E3 f w0 t7 A6 e' C s
- .IF Music_Clear_Addr* x+ v1 V4 y2 ?
- JSR Music_Clear_Addr
3 w5 e6 E9 U! p6 x. m+ U - RTS
3 R3 P( {7 C* Q. O; m3 X - .ELSE
. m) [5 s$ D4 e) z - LDA #$1F
: M( G# l7 A' T8 o - STA $4015( \$ ?) e" _3 S% i2 P
- LDA #$00
7 x* T6 y3 N* @# |! d- ^ - STA $4010
" q' R$ l, C6 H, J! R2 @ - LDX #$008 a" a6 K1 {9 X/ |6 \7 y+ m
- LDA #$00( u0 C' }" [; o% J, _8 y6 b
- # k) k, l" W! M5 U$ L
- .Music_Clear_Zreo_Page_0
6 J T4 v, Q2 P; ?$ e8 U# ^' C - STA $00,X& ^5 e* R8 g5 @7 ^
- INX
4 B$ F- ?, f. \5 C! n) l - CPX #Use_Zero_Page_Begin
# R& @$ I+ V4 S8 m - BCC .Music_Clear_Zreo_Page_0( `% A: _( h9 P% X, ^
- 5 q$ N& V1 i8 D2 L0 v" C8 C' l
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size- L5 H6 U S g* V! t. `9 \& @/ X
- .Music_Clear_Zreo_Page_1! ]( K4 o2 g+ }0 ~& _
- STA $00,X0 z- p1 D0 D9 s, a8 z
- INX# ^) L" v& M7 h8 j
- BNE .Music_Clear_Zreo_Page_11 _8 u4 q# y! q6 C
- 3 ^" t! p" D% p7 m% H
- Music_Clear_Process_1
8 ]$ N, n0 D" D& {, g2 X - STA $0600,X: h/ j r; F6 P3 u& ]
- STA $0700,X9 l( r- a: e9 Z* n4 l! G4 _
- INX
& L" v0 M3 I- U# b- u) n8 {3 C - BNE Music_Clear_Process_1
; U ^9 Z( N" D2 E( h: _) v5 ] - LDA #$10
# L, X6 f% G4 |# @ - STA $4000
% T0 Q# Q5 Y) k( Y8 f' P4 X - STA $40040 o4 y* C' `9 k: m/ f6 r- ~6 Z
- STA $400C
7 p4 Y# u+ d1 r3 A' X3 o- m' t - LDA #$00
, g" j: _& b- @ Q8 p9 x; \ - STA $40087 V3 X$ w: U0 b% S3 y. s% M5 ?
- LDA #$0F
- {0 D4 H1 F3 J4 e& L1 e; r w# a - STA $4015
" z' t$ V. R: w' L& _/ L - .ENDIF
1 g- l4 p1 [1 C6 S - 2 U4 b- Z: E: A8 g4 \) Y, b7 b
- RTS8 H1 p' @7 m& x% f4 p4 _) ?
) Y2 [+ }: ^- a1 H1 a- ;======================================================================, A' ?/ P' V# p/ W) a& I
- ;重启处理% }( @& y! ]9 w, }0 K" \
- Reset_Program
, s; X& u1 z" n( ?2 @ - SEI) x7 n, b$ v7 L) Q3 \
- CLD
" g4 P! u9 H4 X5 M( N) s8 ?1 ^ - LDA #$003 C+ K" U8 j% q% _9 u
- STA PPU_CTRL) G2 y7 P( n& x3 U* l( t& u; ^
- STA PPU_MASK
2 B) i! _; V! r& _( U - STA JOY2_FRAME4 u" ?" |' [$ c& _$ R) b
- STA APU_STATUS% Q- ]* w8 [6 g3 z- ~( Z
- ( e0 |8 T4 B/ C( W
- ;等待屏幕准备完毕
& {' Z- j% b" d3 \ ~, Y2 ] - LDX #$02
) d5 l6 i( O, @3 L$ u7 q - .Wait_For_Screen_Ready
( G' p7 l1 j+ C; A$ c - LDA PPU_STATUS! V4 q% W2 _# g( }
- BPL .Wait_For_Screen_Ready, p4 }) @! N4 V3 `% K b
- DEX& n/ T6 H& b; ^0 @7 r2 L; c. _
- BNE .Wait_For_Screen_Ready
H" ^: N/ K: f! N8 X4 R6 C1 t - * [& ~* r( u4 Z3 b* U+ v
- ;清空调色板
8 s( V. N: w9 s* I4 m) b - Palette_Clear
8 G+ B1 `6 K) {7 P1 L& y ^ - LDA #$3F
6 m4 G$ x4 ~: v u) p" K+ ~ - STA PPU_ADDRESS
- j0 l0 ?1 v j' w. r* v6 k - LDA #$00% l$ X) t& A" l/ }$ W* [' D
- STA PPU_ADDRESS z) A4 ^% D( I' F/ i3 P
- LDX #$20) [6 u4 G( \4 _( F
- LDA #$0F
$ S+ b2 D& w. N4 v/ w - .Write_Data' M7 O" @8 P0 A8 H4 n: ^& j
- STA PPU_DATA( G2 ^0 c& u. ?: y( D& \
- DEX
+ N4 P9 k z9 E, v7 y - BNE .Write_Data/ f% `) X( z/ n2 g/ T
( X3 k' d7 u1 k5 y, I5 _7 n2 P- ;清除声音 $4000-4013
, T, ?% K; | R% d - LDY #$14% q9 ^6 a8 ]" Q" u- m# U) @
- LDX #$00! B' k9 n. @+ m4 }' } d! [+ ]8 B, H! o
- .Sound_Clear
( L: | |3 g" U& |* C1 K - STA $4000,X
u8 G- r$ H/ m- D - INX" [! |2 P1 j' C/ ^) ~8 g
- DEY6 ~8 ~1 @# g c: ^3 h3 A9 l
- BNE .Sound_Clear. k& w8 n& Q! k
-
5 O. N2 r2 O* h3 o2 e: Q! A9 _6 r - ;清除 RAM $0000-07FF: o# C6 f, K2 g. F# t; D8 t: h
- LDA #$00
~; z4 w, f f1 r9 q - STA $00
' v y" ?- f& I4 q' s4 k+ S d5 V' s1 H - STA $01" g/ G Y- l, x6 G
- TAY
* W! c: x- H k/ }* C- D - LDX #$08
8 q6 z- t3 V2 h - .Memory_Clear1 |' B0 Z2 H" ]
- STA [$00],Y- e$ ^ a5 M# F8 E
- INY+ W( u0 J o) y" o, z; N
- BNE .Memory_Clear
7 s( c, \8 p2 v2 b1 A# D" V - INC $01" }2 I9 g3 n! U9 L( @. `1 m8 K
- DEX2 E8 a; j: W* ^( T
- BNE .Memory_Clear
$ ]: B9 T9 ~1 ]' ?$ ^8 K3 P -
. P5 H) \$ D) W+ U* N* [; ?3 _ - ;精灵缓冲初始化( |$ O% F4 U: S8 U2 J. `* q3 k
- LDX #$002 O$ m; `. e5 H g3 h. {$ l0 o1 n
- LDA #$F8$ O. }8 Q- n* Z9 @7 s
- .OAM_Clear
4 q2 I. {8 N2 x4 l8 U - STA OAM_DMA_Buffer,X
2 ^3 u& s1 C, c% Q9 C1 d) l% { - INX
: n2 N+ k6 y# @" W - BNE .OAM_Clear
: \' C# Z3 c& o% I2 E* t5 _' u - $ W& K2 i, A# w' `4 V. Q# d% F: a1 F
- ;栈指针初始化" ?. m5 ?: _, w: {& y" O' H
- LDX #$FF- `: Y3 W% b' u! |4 D" ^& t2 g+ x- a
- TXS
& B' [( p% T9 U5 I( B -
: M9 ?* y9 F* }1 v$ i1 T) c - JSR Nametable_Clear;命名表清空1 Z, W m3 z( O5 `: u
- JSR Palette_Init;初始化调色板缓冲
4 c5 u( b+ j( ~ - JSR Static_Text_Init;初始化静态文本5 T3 r4 @, D3 e4 ]
-
& q1 r6 `+ E# K& b - LDA #MUSIC_ITEM_TOTAL - 1
R. x7 |9 I1 |3 c - STA FC_Music_Max_Index, O/ P( X2 F J
- 8 u) E6 N* u9 s6 K6 p& V4 s
- LDA #$1F: E3 H" p s7 {) ]( d
- STA APU_STATUS$ B1 v5 s! W: G+ ~
- LDA #MUSIC_BGM - 1
+ S* }4 Q+ h! O) `. L, c' G - STA FC_Music_Index
9 S: J4 j: y! T1 v/ x8 V/ P$ O# V - JSR Music_Init_Process;音乐播放$ k% a) ]3 @% ^( k
- 1 E# Z4 p v) \# @( f
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)# v$ i, k) g; _$ l8 g+ n! L
- LDA #$1E
' O' ^# F( o, Z6 r+ I - STA FC_PPU_Mask_Buf+ K# j( C( s7 x3 {* `, Y9 y- Q
- 3 Q/ y4 K% |/ W8 n0 r' Y
- ;启用NMI处理
/ Y% J+ g! t5 N( ` - LDA #$80
A$ E4 n. C1 G, s - STA PPU_CTRL: n' c4 I' ?7 l/ W* f x1 v
- : ?* ^+ A: o0 S7 n" l* Z
- ;程序循环, 剩余工作交给 NMI 中断处理
A( h9 S0 f7 z* a s4 N( o% K/ W - .Loop& f6 U1 f1 C4 u; O
- JMP .Loop
/ W' h# C" d2 f' A# X. L% l
; Q' a$ O( I! l' A! Z5 ]/ ?- ;======================================================================
$ J, Z) F4 ?$ V8 o7 R- h - ;不可屏蔽中断处理# U; b6 U( x" m/ I, w% z8 Q
- Nmi_Program
0 z& F) e" [8 w" s1 G2 G - PHA
' _! u: R5 N3 N5 o - TXA
& Z" V0 Y G( ]( j1 I - PHA* A6 R; P9 g8 S6 q' Z
- TYA
! ?1 |% \2 M6 X# { [ - PHA
0 s' |; E5 H8 P! f3 o& i4 f9 ` -
" `5 |% l% ~* c) _0 b, o+ A W - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
1 p# d0 t- P; X9 J" g) o0 N7 ` -
! _; k: y! l1 k - JSR FC_PPU_Procrss;PPU处理
) [/ h" k6 g- s( W - 9 U, h+ a9 J% e! R
- ;精灵内存更新$ ]9 f w; ~% P' ~& \
- LDA #$00% c1 ?' O. a' M3 M! p+ H# ]) @
- STA PPU_OAM_ADDR
2 M" b& X( l, Q) w/ ] - LDA #OAM_DMA_Buffer / $0100
. F$ H7 [) i: I* `% C - STA OAM_DMA
, ^) u0 R; x7 Y! J" `6 b U& E7 m# [8 I -
# f$ Z2 [0 e( p - JSR FC_Gamepad_Process;手柄输入处理
# C5 K5 q' @, S7 E - JSR Music_Select_Process;音乐选曲处理
2 o; v9 c O% p4 ]$ u8 W( g - JSR Music_Play_Process;音乐播放处理, v* e4 @- i/ f! q
-
$ j" D B; ^; r D' G - PLA
4 e7 D4 y0 `) }1 z5 C* V4 \ - TAY9 i. H# T1 _/ b- |
- PLA
: P) K# y$ @+ n5 x. {, x% k0 B - TAX
4 }) Y4 q* w# w7 E - PLA
/ y6 W% ~- P4 X" E2 [
4 j1 K. `' I! w5 r& F; j- RTI' e$ W) Z4 O& S
- ; a+ K, @+ M5 a5 J4 B0 r3 G/ }9 ^
- ;======================================================================
3 ~/ N+ y( r# \ - ;请求中断处理
1 e: F z4 t& t: D - Irq_Program
* c) f, }0 R8 U3 ^4 H - RTI: ?; t, }: a$ A( N% Q, z: o$ s
" ]2 B' l) _; I- ;======================================================================( J3 T3 \. v$ ~/ x, W7 P& M
- ;中断向量表
6 o4 T/ B5 ~; G- u - .ORG $FFFA
0 x5 c4 n8 R/ I9 I* D1 H1 E - .DW Nmi_Program ;NMI触发时执行
" u. `! N* g' F9 T1 o% X: w - .DW Reset_Program ;载入ROM时最先执行
/ i t1 N" j0 K4 d, l - .DW Irq_Program ;IRQ触发时执行+ @% }+ D" j; @0 P) s
复制代码 * K- v/ L! S I3 o* F
8 g% ]4 e y0 x( d
/ ~! x3 y9 l8 Y
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|