|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下( W& S9 n. { y6 U, S+ h5 C5 |
" ?; u: H9 J5 k. _2 q2 ?* T1 R9 |
以下是主框架代码:5 {& q* I, O2 k5 b+ E% a+ f
- ;======================================================================
4 q: m. M* c( |$ ~: d - ;文件头& s2 ]& M, o' z) Z" B
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量) L9 o7 `) k w2 @5 e7 X
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
* s$ Z/ L- A! E - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
; O0 Y1 n6 g e# t9 G/ ^3 z2 A; c - ;======================================================================% R: W. F# v% N; ?5 i$ w" L
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
4 y1 L7 }5 P: i4 h - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
3 q9 z% M1 `8 _' Z, n L' } - ;======================================================================
/ q# K" ]6 a; ] ] - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
! J2 a; @# p2 r* r4 ?! D - RESET_ADDR = $E000 ;主程序起始地址2 ]9 F$ }7 H4 G2 @5 B
- ;======================================================================
. J3 D* D, ]4 I6 ]0 D - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
! k2 w$ @2 X, p- L. j - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB9 B/ u- d* X/ ~( A9 R
- .INESMAP 4 ;Mapper号 (0-4095)
5 U+ w1 j5 ^- |' k - .INESSUBMAP 0 ;子Mapper号 (0-15)9 a' d) h9 A5 T8 P6 n c8 ^1 k
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
9 Z' ]- ^2 e# T6 `# k/ a - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)4 ^2 }4 N% b9 R5 P0 a1 x: R8 h
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数): U/ H8 Y$ P% _% r) ?
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)% X' G' l9 M0 o$ e
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)0 R; b# p0 W2 S! h" p" }0 R3 K
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)! h0 Z+ {& }: x0 r& v/ m0 G3 d
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy) D5 |0 W! u( S$ D
- ;======================================================================
, ^8 g) C) k$ Y# o - .INCLUDE "fc_demo_config.asm" ;全局配置$ l+ W L0 l, \0 \& G3 }8 Y3 l
- .INCLUDE "fc_demo_constant.asm" ;NES常量. B# O% s0 @" i8 p0 ]# W* @
- ;======================================================================7 F/ k' R' d }; V3 j
- ;音乐配置7 E* K- k) N; F$ _. ]$ V2 Z; S& ~
- .IF 0 = MUSIC_THEME
) j" v( P5 o j) g - .INCLUDE "data/music/Gremlin 2/config.asm"
( c( G/ h, _4 q* }; @ - .ENDIF) Q/ h1 H g, k/ m' ?# s$ U
- ' P5 J% w5 p; y" H
- .IF 1 = MUSIC_THEME3 P l* C/ ^6 R! t- O) x# R3 Q# i0 ^
- .INCLUDE "data/music/Raf World/config.asm" b1 j& a% ]0 W1 L% b$ U9 v" R, |, ^
- .ENDIF
# I/ m% U. V2 [3 u, j, I -
4 m' a5 n8 N$ y: _4 ~$ L - .IF 2 = MUSIC_THEME
4 x% `2 C S3 r - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
& M9 G- R) M# Y, G; @ - .ENDIF% u# x, q4 K( p4 w
- + { U7 D) k7 ^
- ;======================================================================! D. B# ?* \3 N! ]# M: D8 q* H8 ~. i1 U
- ;引用CHR图像数据
: `% z" [7 V4 @ c, s - .BANK NES_16KB_PRG_SIZE * 27 n$ {, h( P" @( \
- .ORG $0000- D3 W! ?% n+ X/ W4 A6 h
- .INCBIN "data/bkg.chr"
. U g' E! k- T5 u0 L. c - .INCBIN "data/sp.chr". j9 b* X8 ]) i4 z; R. F, i
- 5 m/ y" D+ B7 {' V5 m! t) {
- ;======================================================================
7 C9 ~7 a ~. e5 B; q. g3 L3 z! p - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
* d6 ^" c2 Z/ q - .ORG RESET_ADDR
; o( M8 K# J7 P# i6 x* L - ;======================================================================
$ Y" i5 O5 k4 [ - ;引用其他源文件1 T$ W1 a' R( I
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理, w# ^* r8 t Z, E0 } N g5 s
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
/ N( Z4 Z6 x* b% i - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
z" _6 |. b, p9 s# o# E$ z - ;======================================================================
% w6 r. J+ I; E8 B - 4 d3 O# p1 g8 [6 Y- X
- ;======================================================================1 }6 a/ d+ \* s* B# u0 g6 {: M( j- }
- ;等待VBlank到来
- e* p; I! l# L! i+ Z& l - Wait_For_VBlank
( o" \5 Z' h V1 Z& q - LDA PPU_STATUS$ h3 K) w& w6 }/ _# D; ^
- BPL Wait_For_VBlank
, P3 N: }7 k! ^ - RTS2 {5 R7 D! @& @% o% Z" U% u; R
- 5 q' r0 B: b2 G9 K" X7 H
- ;======================================================================# Y4 [) N% N5 `. t2 x
- ;调色板初始化
% z7 K6 {" o4 H4 @ f3 b2 { - Palette_Init" k( @2 i2 u9 t; z$ F
- LDA #$3F$ G* b1 B, y( u+ O7 X& v4 F
- STA PPU_ADDRESS
$ a3 ]5 O s j9 p5 u" ~ - LDA #$00- D" [" t: R( e2 @" l4 j' I& H
- STA PPU_ADDRESS+ }) t* X$ c+ h
- LDX #$00" d4 T' ]- k3 L+ J/ [0 `7 _5 y
- LDY #$20
1 q1 t. N8 F9 M1 g) _2 M - .Write_Data0 P1 n1 \) F" a1 V( Y* o
- LDA Palette_Data,X3 `2 `4 j! Y2 ?( S( E$ e
- STA FC_PPU_Pal_Addr,X
) q* w, m; d3 Z8 D4 F. H - INX
, a+ A4 x4 J2 a, U+ M - DEY
' U- E! J" ~. X' _ - BNE .Write_Data
/ l3 O9 H. |; q$ h1 r - .End
3 M1 U0 h X8 O: m& X8 w3 k - RTS
; n( B {% p, u B6 n9 W4 m& Z
" r* T% [4 J4 ^- ;----------------------------------------& p8 D2 T3 T6 [- t5 e
- ;调色板数据
( I4 V0 B& b5 b4 i ], i& F - Palette_Data% O3 P, O# J: @. U0 W
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
& y# \' u, C2 f7 w( m - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
6 ^9 c- Y8 ]2 P* } -
9 K! U/ p/ p6 q, l/ ]1 P) P6 Q, l - ;======================================================================
% a1 ?; l! i) \ - ;命名表清空3 J( V5 x( q5 y) m! N4 ^) K
- Nametable_Clear3 I0 ~1 K1 _$ z% n
- LDA #$20
) C* {; S6 d6 e0 s8 A+ J# z. r; \ - STA PPU_ADDRESS
- v I1 E) S: J# W6 L - LDA #$00+ e$ Z2 m( {2 y/ f0 k
- STA PPU_ADDRESS" w6 x' ?1 Z, Q# m% Q
- LDA #$00
0 G9 p- Y& ~0 ^7 d4 n& K - LDX #$00
1 g4 q1 l# T2 Q, g - LDY #$08 X& ~" d: v) D" j. u; m0 B" Y1 ] g
- .Write_Data8 l( X& e6 j* [- c* {5 ~
- STA PPU_DATA
; n E5 J2 x0 j$ M% E - INX
$ S, {: b/ I3 w" w - BNE .Write_Data; f! `; w6 h: S: y6 Q
- DEY8 M" A% P9 ^; P; ?9 }" M. V
- BNE .Write_Data" R) Z3 w! r9 L" W) r) n
- .End* T4 s; J3 \1 d1 J4 [; n- u7 l8 D5 l
- RTS
7 M0 h( B7 [# E+ W- | - 4 u( {0 C1 a; g: k- p% |4 N
- ;======================================================================
7 f% P6 l2 ]6 {9 P2 l7 d& n - ;音乐曲目切换/ f; R! L* J5 \1 X* v$ D" s
- Music_Select_Process
j" w5 o- }7 O2 }! I2 w1 u
* r% o: a6 }8 I8 v3 B5 f" g" |# {- .Pre_Music;上一曲. i7 I( Q, h& E3 i6 ]4 }& }
- LDA FC_Gamepad_Once
0 I6 ]2 }# C0 p& P1 \8 a - CMP #JOY_KEY_LEFT! {; I* U! P7 d! d4 x" _& s0 ^
- BNE .Next_Music
+ ]. `, R( P& c5 I8 c$ L - JSR Music_Play_Pre
- p0 E* b, |9 [2 ? c' F5 L% z - .Next_Music;下一曲# m' i' w, M4 ~- P; o
- LDA FC_Gamepad_Once7 y7 g; M. B8 c z2 Z
- CMP #JOY_KEY_RIGHT
1 H) N8 P+ S/ o' O5 C - BNE .Next_10_Music3 ~; P' q( H) D: y1 I
- JSR Music_Play_Next, x/ \$ o7 W4 }# }- {- Y; V
- .Next_10_Music;上10曲% I6 {- | y- k& d
- LDA FC_Gamepad_Once
' I9 l9 N( B+ H' K% N, I - CMP #JOY_KEY_UP: S! @% @8 U P0 V* E* h* q
- BNE .Pre_10_Music
3 Q9 u/ B; s' _$ j( _7 G - JSR Music_Play_Next_10* L, C* P7 B* `
- .Pre_10_Music;下10曲1 j p7 O/ j6 P: Q( a7 p
- LDA FC_Gamepad_Once
( Q) H+ W) \, Z1 j! T; ~- s0 x - CMP #JOY_KEY_DOWN
! J% E# R3 y& S - BNE .Reset
; f$ {1 U/ a; n+ A) W. {; q - JSR Music_Play_Pre_10 B5 }7 F* k- f( W/ r& q6 m
- .Reset;重播当前曲目
6 c( B+ a! _( V7 v/ \/ e, K8 O - LDA FC_Gamepad_Once
8 y! S: V0 g( u7 X' L, A - CMP #JOY_KEY_START* p! Y3 Y5 Z$ x$ J
- BNE .End! p2 Y3 V& \" _% o, p
- LDA FC_Music_Index
6 k& S+ B, F, R7 o - JSR Music_Init_Process) }. U* \, C* ?0 B* z! k, `
- .End' U; ~% o. }2 }* y& g6 I% `
- RTS/ X: o ]0 o3 u8 [0 c+ P
- 7 q0 b S- ?7 f
- ;----------------------------------------------------------------------
4 I0 b3 S) M3 Z' Z. | - ;播放上一曲
1 K' ?0 G% ~+ @- z% j - Music_Play_Pre
+ H8 _$ c/ u s - LDA FC_Music_Index
$ w3 J% o5 q+ R& G: R7 Q! C - BEQ .End& B7 @4 {- z8 e7 E/ d$ j
- DEC FC_Music_Index
2 t, T1 V* F+ Q* { - LDA FC_Music_Index
. O5 J! Z3 K7 v2 ]. ~, e - JSR Music_Init_Process6 p2 A% ~5 h4 M {1 H; i
- .End
8 u9 V& W1 U; F6 _0 J3 @4 F - RTS/ N* ? c. _" Z: c9 S; t
- ;----------------------------------------------------------------------
* Y% o# U x+ u - ;播放下一曲- u2 y1 ?3 w+ R% \: T8 W4 G( k
- Music_Play_Next
9 `* C* U' U* y' }5 G/ l: P* J - LDA FC_Music_Index" r7 Q: D# {8 S+ W( Q7 S
- CMP FC_Music_Max_Index- g1 T) @* }! F) j _
- BCS .End9 o6 Q2 p* Q$ A, D. J( d
- INC FC_Music_Index
) @: N- U f3 }0 H - LDA FC_Music_Index
- x, \1 V& I* Y) l5 w: j - JSR Music_Init_Process
! |% M" g4 j( q" a4 r - .End E' W& n0 ]$ U0 I& ]6 D
- RTS. \+ E# v- x9 y2 E+ c
- 9 X: i7 K+ y. e2 n: }' f- d5 @
- ;----------------------------------------------------------------------
$ c+ Y7 S& ?1 D% P8 l" m$ @* r) s5 i - ;播放上10曲8 e- E; n- d f' O
- Music_Play_Pre_10
9 a+ v0 Q0 N8 `7 J0 Y1 H7 R% U - LDA FC_Music_Index9 ^6 h a% M9 n3 G4 E
- BEQ .End% q9 \6 b# Q; B+ `; S
- SEC
( {& R* b7 N# r N0 K1 Z+ C - SBC #10
( T/ [4 x) R6 ?8 r/ S - BCS .Pre_109 s# j! i0 m% r0 L
- LDA #$00
& P* S u7 B# ^4 J - .Pre_106 ]5 c& G) S; P" \
- STA FC_Music_Index
( L( r) \4 D) d6 |: |& p2 Y* e, R A* U - JSR Music_Init_Process, g* c' f G2 {$ k* r0 {$ U
- .End
# b" z* g' D& B1 Y - RTS
' _/ O S0 I, d% Y - ;----------------------------------------------------------------------
5 h9 a/ |1 W ], g' n" A - ;播放下10曲
; \0 c# t) o9 K5 {& ] - Music_Play_Next_10% S0 z$ W, t4 c
- LDA FC_Music_Index
4 U8 b/ V6 S' d1 T) L$ t$ R& x: { - CMP FC_Music_Max_Index9 b. l, }2 u8 y: s: A
- BCS .End
( i- Q% F' U) p% h. k - CLC
+ E# A5 E/ a: Z - ADC #10
. W. D" t$ L* ] p& @6 Z) i# z H5 t - CMP FC_Music_Max_Index
5 J7 j7 Z7 m* P7 A) }. m - BCC .Next_10
- r1 Q1 m1 I. q - LDA FC_Music_Max_Index1 G" L. a% e7 I0 C7 J
- .Next_10, Z' a9 R, J) I5 _% S- a1 m
- STA FC_Music_Index
7 j: k! A& {* F - JSR Music_Init_Process
- m y) ?( l" O, \, k3 X+ \2 Z - .End
' B+ `4 I4 d7 v1 {. @' T - RTS
) q9 h2 N4 ]! _
0 [6 @6 Q2 \, _0 h# f0 Z$ g- ;----------------------------------------------------------------------* A" ~' E' A/ s/ `' e3 W* F% @
- ;8位十六进制转3位十进制制" o2 Q. E6 R( c
- Hex8ToDec
* C; s0 c% G5 l - STA FC_Dec_Data_1
& x8 k/ `3 x1 W% H) u2 H: T - LDA #$00/ _ Z8 J- n2 X5 M/ J# `9 m5 ?
- STA FC_Dec_Data_100
# k0 p( ?3 A# x - STA FC_Dec_Data_10
- Q; B2 e! f0 ?* I6 g3 f( z - LDA FC_Dec_Data_1
, J6 P0 u, q( R' i4 w - .Convert_1003 }3 _% v" j ~
- CMP #100. p) h9 |0 U/ s! c' |
- BCC .Convert_10
9 F: w0 E( P) e: D - SEC
$ a1 H/ n5 _! V/ a$ J - SBC #100
; V; T7 Y: i# U s( D8 K - INC FC_Dec_Data_100
% V6 x' @0 g/ z J( J+ c - BNE .Convert_100& z- F* ]! u3 x
- .Convert_10. D6 Y X @) r: K9 m! F
- CMP #10* H( w7 e/ |2 r- m7 y2 S& i. _
- BCC .End6 y4 h! E" s1 [' o4 f4 F- e
- SEC% N; A% V, H ?; n4 x
- SBC #10+ C1 Z; T( X8 s! c$ ~5 ]; S7 a @
- INC FC_Dec_Data_10* c! |0 u! [$ }% O" K% L) B& c, c
- BNE .Convert_10+ x. j% p: ^" U* \$ E
- .End' U" v. L$ s8 ^; z; y0 O5 O$ @0 \
- STA FC_Dec_Data_1! r2 x3 N1 W2 }" L; r( S6 E
- RTS& M" R$ p( Y+ ^; \9 \
`7 E! n, q) r2 u# d- ;----------------------------------------------------------------------
. z! |: [9 ]) Z6 E - ;显示曲目信息+ D. ^/ P, B1 D/ t, ~6 ^5 Z
- Music_Info_Display$ m: f7 ~7 h9 L
- LDX FC_PPU_Buf_Count% u- Z! [9 V, I Q1 Z% q0 Y
- LDA #PPU_WRITE_MODE_CNT_LINE. L+ @) W' G, s v! \" ?" D
- STA Use_PPU_Buffer,X6 F" ]% ~+ S4 g. @2 X, G5 m
- INX* J. N8 m; g# R
- ) [, i* b, }& p0 T6 i
- LDA #>MUSIC_INFO_POS
5 R" q, z* D( ~5 u) V& T" |& ~; y% B - STA Use_PPU_Buffer,X: y! s) _1 t( l/ U3 `* _& D
- INX) w5 }5 {6 e8 `- s0 C! t2 g2 x. k
-
1 d: ?# S/ u0 r% x& F: L( ? - ;居中, }. N2 W8 s7 G5 e
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
" f0 @$ m+ `; o( e" @2 e - STA Use_PPU_Buffer,X5 |) Z0 i5 y8 i) ~" U, y
- INX% S4 D2 j9 g5 h/ p) ~
-
5 Z. R8 i/ f2 o - LDA #$05
7 Q; J' W7 H* ?/ @$ K - STA Use_PPU_Buffer,X0 s% C' K( m$ | Z8 N+ z h
- INX: [8 G, q8 |' a, {- Z1 a( H" ?/ }
-
9 q7 o) U H' g5 r$ v! ~6 C - LDA FC_Music_Index
% E+ o9 t% A* j5 Y& ] - CLC
% {* [ X# v& o! w3 B6 O" G - ADC #$01. x% [# g0 T% [, `; W, S I
- JSR Hex8ToDec2 V* _9 O+ L4 i, v: w
- ; ?2 Z: k' ~: V7 K F/ _
- LDA FC_Dec_Data_100 ?. N% x0 A5 B: |, p1 r/ k
- CLC
5 X' \( S1 y) X - ADC #'0'7 y6 ~3 |# b- g T4 a1 ^+ b* W2 ?
- STA Use_PPU_Buffer,X
0 f2 {5 w* C) V6 q+ L; h$ s. j( d - INX" {7 `7 z+ [: _6 K$ z9 h
- 9 P) F% F0 f4 ?+ p) N% K
- LDA FC_Dec_Data_1
+ D2 l9 [! \# \1 J" g% H - CLC. [, w# H. B+ k
- ADC #'0'
* Y' `* o! O* A9 E0 N& H - STA Use_PPU_Buffer,X
# X/ c0 q5 W0 u( [' m2 a0 q - INX4 F2 |) }, v6 c9 z$ ~. Q1 e+ c
- 1 s) I; q. n: a* d, `% e
- LDA #'/'/ N* H8 [ C. R- D
- STA Use_PPU_Buffer,X; E( x e% D" Y: _
- INX; u3 c l' O5 q
- 1 O1 v0 L/ C X2 R+ ]1 \7 T0 H0 |
- LDA FC_Music_Max_Index
+ _8 p7 E( @9 [- q' d6 ~. Z - CLC
( _9 o, c+ g# p& j# i: F8 s* M - ADC #$01" B# S2 n+ ]# l) P) a
- JSR Hex8ToDec1 g0 B6 g; ` \- L4 e5 K
-
% v$ @7 C+ A9 n P - LDA FC_Dec_Data_10
# I7 h! R7 F2 H2 P. S - CLC; P; A+ U; j6 E" F* _# S M( V
- ADC #'0'/ Y9 j S2 M( f+ y: v
- STA Use_PPU_Buffer,X. ^, |" L, k9 m. m
- INX
! L* J. N# @8 B - # e" z: }* {* G) ?2 d
- LDA FC_Dec_Data_1
" f& O, O. m% Z9 t! @ - CLC$ o& G8 b. j: ~
- ADC #'0'
% o$ ^; P( s1 i. O1 I! e' W2 E - STA Use_PPU_Buffer,X
- g6 F# ~9 Q! c( ]! b6 z - INX. I6 A# j9 k% h* n& }
- 3 z% I: {2 F: A# N6 e% y! W
- .End
) W; O! l6 p) w) N - STX FC_PPU_Buf_Count# v$ Q6 a; t: W& X
- RTS/ Q/ h: Z: q6 o4 Y7 O/ E$ o
. v* m' {. k5 ^7 e: K8 \6 Z- ;----------------------------------------------------------------------* Y+ i, A- S' O5 I
- ;音乐曲目初始化处理
9 x6 c4 a* R1 ~ - Music_Init_Process/ C+ u. Q" [: E+ r3 a
- PHA
3 v# Y; j1 R# B i" z N( _. C - JSR Music_Clear_Process
# h- }) j7 [7 ^) F - LDA #$1F( ^3 b1 Q% m" w" ]
- STA $40151 ~9 l; a7 M' Q0 h
- PLA
, e9 g" P! _, t& R- L! y% L - JSR Music_Init_Addr, J$ l7 H# G/ |9 f: J
- JSR Music_Info_Display( i' S6 Q7 T2 {/ _) r
- RTS. i2 d) Q, t) Y6 L/ D
0 J9 Z5 a+ Y c' R- ;----------------------------------------------------------------------
9 e6 h( Y+ f- w7 t - ;音乐播放处理
% ?: n4 {! k0 w% n - Music_Play_Process, o7 \1 R4 u/ H5 o5 T
- JSR Music_Play_Addr
4 p; r+ m0 m% g9 S9 q3 f - RTS! J9 C0 Z0 |! d; h! ^
" Y0 _% G7 ~: \% z1 L- ;----------------------------------------------------------------------
7 V/ N# Q {, W6 C7 k - ;音乐播放处理
- H( i7 H% b$ X6 y1 N - Music_Clear_Process
: @" f' S$ Z7 `. O7 C$ L4 L" J - .IF Music_Clear_Addr
# a! Z1 V* Z+ X3 @1 T) Q; N - JSR Music_Clear_Addr
( ?! Y* u( \- |0 Y) o - RTS
9 P* k. v! Y% m" K - .ELSE j* I- h7 I6 k" D6 `
- LDA #$1F
7 ^4 D4 p. L( t# K" s1 `5 A - STA $4015
. D8 ~- }+ b9 b# a - LDA #$00, e2 p, z# U8 x* a6 v
- STA $4010% Z( a$ `$ ]: |: t0 {' {# w- ?
- LDX #$001 j3 `0 e- U2 ?8 N) @: L+ z' S
- LDA #$00
' P# U6 I& i! u. N! m* z - 3 ^$ i/ M4 T- m) e" d7 X& ^
- .Music_Clear_Zreo_Page_0
# W/ F9 A4 I3 w! f - STA $00,X
/ B6 B0 d) V+ g) T5 Z - INX9 `& x W1 E8 O' y# Y. }8 D- P
- CPX #Use_Zero_Page_Begin
# P8 [ J7 Y8 L$ q+ O - BCC .Music_Clear_Zreo_Page_0
! l' E1 h% |2 |- a -
/ }3 F) s# c+ X6 B - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size+ l; b* S) w1 S" s8 S9 T3 }* k
- .Music_Clear_Zreo_Page_1/ t9 C, w7 o J7 Y7 C+ M7 S
- STA $00,X
" G9 L7 l' d$ u9 A% T& T8 B, t( [ - INX% ^: m- G8 @% ]9 Q. ~7 @% i
- BNE .Music_Clear_Zreo_Page_1
8 u+ `" D7 z+ m - 9 n( y* B" L7 q$ u$ B% E$ D
- Music_Clear_Process_1- ^, |& K: e x+ }1 y# V) p( V S% u
- STA $0600,X
1 H/ \% {) q" E - STA $0700,X3 U1 v$ n; U, @" k
- INX- F* \4 z3 c4 d% R
- BNE Music_Clear_Process_1
5 t9 ]+ D. N( Z! T0 h2 ]" ^+ s - LDA #$10
% m& F5 b0 Z' ^1 C9 ?% I - STA $4000
9 R( {9 ~3 [" @6 ^, l5 E - STA $40045 n4 D H7 q0 x. \& h' y0 T
- STA $400C' [# B2 N% o/ {- o
- LDA #$00
& X* k4 ^1 ~4 ]6 Q2 X% U - STA $4008
( R2 V! E, b8 W/ M! g$ W0 S - LDA #$0F$ x5 i# J) C8 O- |- c3 |/ c
- STA $4015
* A( p2 S/ m" G- C5 I) z - .ENDIF
: w- M% X# H" B" q; y - 0 M7 ?& P# W" @
- RTS1 h1 O5 h$ g- d- W- V- ~0 o
- , w7 U: D4 Q/ M5 U6 i, Q
- ;======================================================================- ?5 F$ e0 B. f, D4 J7 |
- ;重启处理
, U# ~) L+ z+ y3 U' ]( R - Reset_Program
! V- F) F2 M; O- ~0 @0 l4 f- C - SEI' ?: D- i- Y4 x ~" Q
- CLD
4 Y) f/ p5 [; |7 s8 U - LDA #$005 D: y# U0 C! J
- STA PPU_CTRL9 }6 v' [! N8 L4 c' x5 B
- STA PPU_MASK& t" j- T) p$ B" ]9 y8 Z6 I
- STA JOY2_FRAME
! y, N) P4 J% I1 n1 V! p - STA APU_STATUS
" C8 ]" c; ~& N. Q# m( U+ e -
% s8 F4 V5 a1 p, b8 Z9 } - ;等待屏幕准备完毕
: D7 k& k, j# g* X- Z- m - LDX #$02" A" @# Y4 X" ]* @# m& Q2 S
- .Wait_For_Screen_Ready
& w. v4 @0 |! ~; G) r4 c5 k) r5 S - LDA PPU_STATUS* c: X: u% ^7 [! l; j
- BPL .Wait_For_Screen_Ready
) g4 m8 D1 C% W9 O( w7 u1 T - DEX8 V$ A4 K0 T: h7 i1 Q5 a/ a0 P
- BNE .Wait_For_Screen_Ready* { |8 o2 `; Q( k* O
- + `( F% @# ~: U3 L. {: z) V& a
- ;清空调色板
1 @9 P# i; C* t3 Q9 T - Palette_Clear' A0 X3 o+ d4 Z3 v
- LDA #$3F; |) ~0 l' x: a
- STA PPU_ADDRESS
! b. G3 V3 w" I& h1 v - LDA #$00
6 c( v G. e0 N) U - STA PPU_ADDRESS' e# l3 I' \0 Q- L
- LDX #$20
& ], O0 _+ R3 u1 k9 z - LDA #$0F* \ x' {; ^8 o9 p
- .Write_Data
' ^% s g4 v% B2 t" q. N - STA PPU_DATA
. H& B6 L4 B! A, K: k; }1 Y: [3 m. E - DEX: t# V! \2 m/ l, G+ F' `5 n1 K
- BNE .Write_Data
1 V) D/ }: q$ }* [4 [( _ - : e8 ]8 I2 n% n% t: B G, G/ M
- ;清除声音 $4000-40130 v: O$ }2 F- i8 j9 C
- LDY #$145 e8 }) L7 |. j
- LDX #$00) V7 W$ x- Y3 U9 i5 A( o
- .Sound_Clear
* M% B3 K T, R% u - STA $4000,X1 e' e2 w5 u6 v! I( g- k& H8 o# l
- INX1 @1 A. |& C% c& L) {5 u( A, Y
- DEY v1 T. w& f# }+ M% U% i& j
- BNE .Sound_Clear
' L* g! {( j+ O" a - 0 D j$ b5 f/ Q8 Z. }
- ;清除 RAM $0000-07FF8 ]! x' y) ^! m3 @1 F. U
- LDA #$00
5 I' v9 L, a' a) E" [$ F - STA $00/ Z4 e7 Z6 s, f3 W* P, o1 Q* Q
- STA $01
2 |% t% e! y9 |: b+ \, r - TAY$ w9 V- _7 {& d0 {$ [& F" i; h% S" N
- LDX #$08
. z4 ?( {( R4 E - .Memory_Clear
8 l6 A+ T0 |+ D4 Q* O, d - STA [$00],Y
+ |6 p' {& Z. J - INY
: O6 B9 z! U5 l1 F' S3 s; f - BNE .Memory_Clear
1 l. L% E& x# n0 _# G - INC $01# j q( J: z; i6 t) }1 E4 B/ |
- DEX
+ r; E9 V7 \) @* E4 x - BNE .Memory_Clear0 K7 G7 {* h- q- T! B" N
- 6 C* J2 S! `, l2 O r; r Q- \
- ;精灵缓冲初始化9 O) I4 r5 i5 X: i
- LDX #$00
3 `. [! a/ @3 N2 o8 s& F - LDA #$F8. J: J; F8 m: w# M
- .OAM_Clear- j* f/ e$ }4 ^0 g' F" U% R( L
- STA OAM_DMA_Buffer,X$ R. W/ v1 b4 V1 u7 b- L
- INX
! K& R# z% h2 ~/ t - BNE .OAM_Clear0 H: `( _5 x! |7 t1 ?
- " ^2 l5 g* l5 G
- ;栈指针初始化
. _ O7 m' T/ a. D- S+ l+ R; c - LDX #$FF
3 \+ M5 d* {$ ~; H& f - TXS1 q6 P+ G$ v2 u
-
9 H# `, B k3 [8 a' C$ l2 G' [ - JSR Nametable_Clear;命名表清空: Y4 ?. h/ U y8 W1 j; g
- JSR Palette_Init;初始化调色板缓冲
, ]. [7 x. z" h. l - JSR Static_Text_Init;初始化静态文本
" L5 J% U% \0 y5 d - ; n; M5 _ x* g; [, F
- LDA #MUSIC_ITEM_TOTAL - 1
) U) s3 g1 k; Y: R - STA FC_Music_Max_Index9 ?" i/ Y) f$ A$ z5 e8 X6 `" }4 Z
- 5 `. p( ]: g5 S0 U1 K* J
- LDA #$1F- S# \# c9 X& _8 B2 X( T( r. O& s
- STA APU_STATUS
; t3 r* J. k* s - LDA #MUSIC_BGM - 1
6 T( P$ O2 Y! z6 ?. E0 k - STA FC_Music_Index) v7 y4 |5 q% e. v; ^' P
- JSR Music_Init_Process;音乐播放; t' g) [. n2 t
- 5 {% n& ~: s4 g
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
, g9 u3 R, D! a" G- @6 \ - LDA #$1E
: n* ?& e% @' r. `* x- G3 } - STA FC_PPU_Mask_Buf" v* M: V `1 ?7 C( B
-
) O" x: Z8 U3 Q0 e - ;启用NMI处理$ @* y" @/ u) G: D/ W
- LDA #$80
! } e, z6 B0 i* w1 ]3 N8 c - STA PPU_CTRL
/ R- ~9 l$ c* @0 a" t9 t -
2 ]6 B0 I' `$ t: m2 l - ;程序循环, 剩余工作交给 NMI 中断处理
% J: b. V% ~/ ~8 Z8 j% K - .Loop! Z& m) p7 H) c- a* \: T
- JMP .Loop
) H2 F: M' e% V% O - - `0 }% K, F& {* r. F! P+ a3 C
- ;======================================================================* O: ]& I# Q3 z! e2 q% t" Z1 q9 C
- ;不可屏蔽中断处理9 X- @8 d6 x. W( I2 d
- Nmi_Program. y8 j( y; P3 Y6 ?
- PHA9 Y& I, {5 B/ r, w' Z+ N7 A4 K Y
- TXA
% n# b# ~ M) l- ] - PHA: Y4 k1 I; F+ D$ ~5 p1 s8 s
- TYA& [( \8 F+ N: u) z+ Z
- PHA
( |) o8 ^! ]8 J - % I6 P8 E+ o3 A# Y0 m( ~2 y( {7 M- l
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
7 O+ {, a+ Q; P' g2 _ - , z: B* J+ W( b. i" G
- JSR FC_PPU_Procrss;PPU处理
8 ^+ x6 ~ D% b/ D8 R( n - 6 B& l% @* J# K1 |; A7 X: H
- ;精灵内存更新
2 }' S3 L6 J, k& G" S% S - LDA #$00
5 C8 n4 O1 v. w: o( y - STA PPU_OAM_ADDR) Z$ N/ E, p4 C
- LDA #OAM_DMA_Buffer / $0100+ ^; G) {0 N. I& f) G" W* s, U
- STA OAM_DMA
& l9 t2 v0 {2 S -
+ q; Y1 v2 m+ O - JSR FC_Gamepad_Process;手柄输入处理; {* g8 v: p! Y6 s
- JSR Music_Select_Process;音乐选曲处理
0 n4 O. w) S; O - JSR Music_Play_Process;音乐播放处理6 b" m. a: V4 _, G3 v% K9 i1 {3 u
-
- ?- ^% R4 z* J P) z) X - PLA
: c5 V, A; J+ Q - TAY
6 W9 n" E' [6 t# x% D- v9 k - PLA
7 I) }. Y& d1 i, ` - TAX- r1 ?1 U9 M$ l7 D% p
- PLA
9 X& l1 S- d% U+ E - ' @' E, @/ e0 f$ T! F
- RTI+ u d; q* k* A4 P1 P: m% K: ~. L7 c
- . W! Z! A6 I: c9 u
- ;======================================================================
9 Z8 l+ m. d9 }$ i4 E - ;请求中断处理1 U W) b9 G' P; G3 b
- Irq_Program& l" i+ J9 `1 m0 s$ i3 L8 j! z, h! Y
- RTI
' z& g3 \3 J2 X6 L8 E - ' [6 W9 n# X. J# O( J
- ;======================================================================
- L" E6 U+ O6 A9 Z4 U- ~/ U- D/ I% l - ;中断向量表
7 r* r; ?# S9 J5 v- J; C4 c R/ N - .ORG $FFFA+ w) g# c* B1 G+ f, S
- .DW Nmi_Program ;NMI触发时执行
$ r, A; @: T4 e/ f4 _# p9 ]9 m - .DW Reset_Program ;载入ROM时最先执行
% o+ Y) c" G% S5 M - .DW Irq_Program ;IRQ触发时执行
9 s# p# P' C: M
复制代码
9 A( H. R) c7 Y$ e! M/ Z" S" J' q; {
& P1 N) X* g2 _5 B+ z$ q: H
+ V7 K/ J0 }8 ~! P( E+ c! k$ J" Uhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|