|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下* q' L$ e, q U+ e6 l/ e Z& `) g

2 |6 v. q6 s+ V5 w) F6 q以下是主框架代码:
2 M1 C$ r2 h" Z; T; _* R- ;======================================================================
# { n0 [6 f: S7 n9 H - ;文件头
: Q! P/ |9 r* @5 w0 E8 J - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量. n. z, F1 q) V% V
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
2 }4 L/ }1 Y: K$ A; G" R0 U3 _ - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
" b, X8 e0 b& X7 M9 L - ;======================================================================3 ^5 m( j1 D: z$ s3 U
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2: W. y, S9 S8 v* y( y
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
0 {) S1 Q" c/ h: f2 m+ B# a! ` - ;======================================================================) A% B8 f: v/ W+ M) M
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
8 C) Q3 J0 L& L - RESET_ADDR = $E000 ;主程序起始地址
7 P& e7 [* v+ ?: W( d0 S6 S$ | - ;======================================================================6 k$ g6 ^6 `8 u" W8 v. E) C1 K1 G/ z9 N
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB; H# b% {3 c1 ?- \) g, ?9 r
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
& J2 k; Z9 P1 }) ]8 Y, D7 I - .INESMAP 4 ;Mapper号 (0-4095)
, C3 @ e8 o7 ]& i G/ v - .INESSUBMAP 0 ;子Mapper号 (0-15)
2 }$ P) G5 X5 h( @9 |8 r! D2 t: @ - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
& o! a9 i. U1 b% ] - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)6 {. i% Z& x. i |' t3 }. r( d
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)& Q7 |: O4 R4 H3 U; a, [
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)& V# M4 |3 Q# C: N: N
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)# V0 v: r0 H) r
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
) P5 u" G* j0 ` - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)* E9 f# O5 k8 G
- ;======================================================================- }( \& e$ L' S- }
- .INCLUDE "fc_demo_config.asm" ;全局配置) Q: i2 k' X5 j
- .INCLUDE "fc_demo_constant.asm" ;NES常量) ^4 \) i2 S' Q1 D Z, @2 Z" C; z! |
- ;======================================================================
$ |8 `4 K% M0 G* v- a' Z - ;音乐配置
9 }. H, D1 c/ m+ h4 e - .IF 0 = MUSIC_THEME
; ` J% ?/ S9 \5 K - .INCLUDE "data/music/Gremlin 2/config.asm"
* P) b- H! E. Z - .ENDIF/ s8 t4 {& f. I. G$ r: `2 e5 N
- 4 |5 A/ m) Q4 s" I/ R9 b
- .IF 1 = MUSIC_THEME
& `0 a* N+ M9 I0 M) w - .INCLUDE "data/music/Raf World/config.asm"& K: F; w. Z6 w- P& G
- .ENDIF4 K& s: {- s, A# m; B/ y& N# l9 }8 g
- 6 Q C5 \: }* [
- .IF 2 = MUSIC_THEME
1 r( U/ ]6 B, a) l/ _! ]( Y - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"+ L+ B" B1 L2 A. F3 N c' d
- .ENDIF
& X( f i5 \7 } X3 h$ t - 2 u$ r& ~ w8 y8 ^% C
- ;======================================================================% C4 q( k% g, h! Y8 J" D! _( @' K- {9 B) h
- ;引用CHR图像数据1 |: X" _1 P. O1 T4 E% v( @7 t
- .BANK NES_16KB_PRG_SIZE * 2
1 l) ]' K0 {9 I) T4 B2 B$ [ - .ORG $0000& c: ^8 u& p8 ^$ m
- .INCBIN "data/bkg.chr") S/ Y$ T" P6 f) y5 r
- .INCBIN "data/sp.chr"9 A* Q D1 t% Q7 T% B6 U6 r
-
0 }+ H$ w; F! ~. w: Y- } |# i - ;======================================================================" {3 j/ K' m/ N0 m. b$ S2 i2 x( F: s
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank! E" c5 g( P4 ~- [/ t* T/ b8 H
- .ORG RESET_ADDR; [5 Q/ D7 W, l
- ;======================================================================) a' S$ `6 i: d- ^7 i& c
- ;引用其他源文件& N$ [5 x$ f' l' T0 g+ |
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理. `+ v1 c x/ E1 i, C$ y
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
2 e$ O) R, B. q/ n5 q0 E4 S - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
6 [8 R) y0 p9 K4 _! p - ;======================================================================
* }6 M( r$ E+ F( X - 2 x, X( U# t' m/ t# g
- ;======================================================================9 X3 [0 Z6 c! c4 m; V
- ;等待VBlank到来% z% Q |" D! M- J: ^
- Wait_For_VBlank
2 w1 a$ U- u$ D3 P/ p - LDA PPU_STATUS) H/ B3 I' ?' ~: z4 g
- BPL Wait_For_VBlank
1 T' E. [+ }1 n2 z i - RTS
2 c# J( k+ @+ j; b' H
1 W8 w: Q d" _- ;======================================================================
# Y8 ^! c( t7 a" T - ;调色板初始化$ q/ h$ m) r9 [5 w" M2 M3 H
- Palette_Init
. v [- M# R* m6 U& C - LDA #$3F
% A G7 I% R- Q! W [1 w U2 A& C F - STA PPU_ADDRESS9 M- n3 N6 Q( n/ P, J3 q5 }
- LDA #$00' V/ r3 _& @/ H+ D/ L
- STA PPU_ADDRESS1 Z* Z# A: I- f/ e- A5 n
- LDX #$00
) u: Y( C0 ^/ X6 z1 S - LDY #$20
4 x- b% a6 ]5 r# Q0 N3 X& @- Y - .Write_Data L6 G0 l& T6 l0 V1 E& l% W8 r
- LDA Palette_Data,X% F: C. \- e' W; ~. d; c5 p6 @% U
- STA FC_PPU_Pal_Addr,X9 b- q: @4 H0 l$ H# Y
- INX8 I* R8 u1 {' i( |, s6 [8 |+ I
- DEY$ S7 E; e* {- g; d& f
- BNE .Write_Data
. M& ^& w2 A" W. V& I m' B - .End
- D" h" z7 K) ~, E. a- s7 J _ - RTS
+ a$ G/ s5 b6 Y9 ^7 ~
, C7 K$ j3 v2 t5 z" Z) r- ?- ;----------------------------------------4 t9 E* ?! P' o8 r+ o
- ;调色板数据
( u1 Y- R7 B* {9 M - Palette_Data
( h3 t6 u9 a$ ]* \- x8 M - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B) b: B6 |# W+ w% H- o: Q
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
! F" d/ R* y% W* d7 d8 G- j d -
+ Q& d' T; d( T( o - ;======================================================================/ G* {/ s8 `) J4 g1 G4 Y' g7 @
- ;命名表清空! z p- n& T P7 Z7 x
- Nametable_Clear
& A; X* Y: \* o* X$ d - LDA #$20! `5 U, ~. z* Z, I8 @0 ?; u* T
- STA PPU_ADDRESS
8 a8 S1 |9 i* H; O7 n6 g9 T, b X$ @" | - LDA #$00
- K! u1 R) \8 c - STA PPU_ADDRESS x3 L1 j6 E& G" _, U0 O$ Y% a' H
- LDA #$00* a1 l$ X0 e! P- }) g; n0 `) E2 p
- LDX #$006 E' j+ a4 z9 j9 ^2 w. q5 G
- LDY #$08
/ N8 u; d* T$ y7 J7 E9 x - .Write_Data
' j1 c- F% ?# q% F* k& k$ ^ - STA PPU_DATA
2 }) z( ^+ l o) x, R* v. K - INX
% o4 ?$ E y; _3 z" O6 b2 U - BNE .Write_Data
" w: g+ Z6 r; ~9 u! K - DEY) z. @/ k, i6 e2 ~
- BNE .Write_Data
5 Q5 R! A; b& U H! _( R: m - .End
6 |8 |; j4 ?* f7 f3 B - RTS
$ v& P# Z0 Z/ j; k3 [* m - ! F6 M" n/ w6 @; g- ]+ {# W- ]
- ;======================================================================; G; R; ~; L, `! @* w
- ;音乐曲目切换
# \- h. |3 f+ k% E - Music_Select_Process2 _+ R) v4 W% O4 e) n2 v* j1 h
1 \9 X X3 O6 o& G7 r; u1 E- .Pre_Music;上一曲1 D3 @9 C* o( b2 z
- LDA FC_Gamepad_Once
4 K" B" ]( q2 r y) x% x( G - CMP #JOY_KEY_LEFT" O0 v6 i$ `2 L
- BNE .Next_Music
1 ?& G6 W7 {# B: z - JSR Music_Play_Pre- W0 Q: U0 f- `- \" M
- .Next_Music;下一曲
1 y- e/ L$ \# q C: |: u - LDA FC_Gamepad_Once, Q/ A% }+ u1 j; S
- CMP #JOY_KEY_RIGHT( k5 k2 Z9 S3 G0 Z$ ~% c
- BNE .Next_10_Music- J$ U( \( c. I9 X" O
- JSR Music_Play_Next' d7 i% `, j+ v* g5 j/ G1 v
- .Next_10_Music;上10曲
4 s3 `' `6 }8 ` - LDA FC_Gamepad_Once
5 J, P3 e! r3 C2 e# l- n - CMP #JOY_KEY_UP3 e# J6 R" U. X `
- BNE .Pre_10_Music
$ C, }7 ^) n/ N' d7 `5 C1 V - JSR Music_Play_Next_103 \5 d8 f. k1 E
- .Pre_10_Music;下10曲* J6 c, Q# l# L: b1 t( V
- LDA FC_Gamepad_Once2 f( o, K5 S: O/ z n9 a
- CMP #JOY_KEY_DOWN
: A+ }/ \' Q; ^5 \1 n3 W) b! a - BNE .Reset+ e: I5 O% E- ^6 b& @7 L
- JSR Music_Play_Pre_10, O# V, A- s) k. X2 ~/ h
- .Reset;重播当前曲目
/ M+ W" m& g! d+ A, z6 L - LDA FC_Gamepad_Once2 q, \4 X/ b; `
- CMP #JOY_KEY_START, ~) P- ]/ U1 h5 y% c/ A% w: V
- BNE .End' k- I1 ^. s: v/ s9 N1 }
- LDA FC_Music_Index
4 m1 l! A( W9 ? K/ ? - JSR Music_Init_Process
& x" J+ u v& t* p, n2 W- w - .End
9 H4 s& S0 \& _" q6 X - RTS
! f4 j) n- _: a! M- h - 5 p1 T& h; c: J2 q8 |
- ;----------------------------------------------------------------------
. \5 x4 N4 f0 c' P& W3 x% \ - ;播放上一曲. m7 m# y" s; c. }% e9 E& s) E
- Music_Play_Pre
& t9 b2 H/ f/ F - LDA FC_Music_Index
! N- p# G& X- z* ^ - BEQ .End, F: @: T4 ~4 b8 \
- DEC FC_Music_Index
/ N) s" X% _1 _+ o( m( O - LDA FC_Music_Index
( s9 Z6 i- C O# e" ?, d9 A - JSR Music_Init_Process
* d' T' s0 L" a2 } - .End( A! g# a( G, i* |
- RTS
8 V0 t" ~' d! V* p- A - ;----------------------------------------------------------------------
9 E- q+ g% d* c7 J# \+ y - ;播放下一曲
( A; k% L& k1 @5 h3 t* ]; B - Music_Play_Next/ E, y, f' L; F# P
- LDA FC_Music_Index* d1 \% M/ N4 w- I& b8 V' Q
- CMP FC_Music_Max_Index
3 p& u" x1 `$ V' G1 J$ M3 ~ - BCS .End) {, A6 I. T4 O. _. i; Z
- INC FC_Music_Index
7 b( P, \5 v' }# O* ^2 U' r) Q0 L1 y - LDA FC_Music_Index: t/ V9 m) B+ G
- JSR Music_Init_Process
/ o8 e U+ Y- g5 g7 M - .End
' n' ~3 p4 `7 W5 E' M$ r4 B% } - RTS3 d+ u3 {' c' G
- 0 a# w, D) Q* n" v" Z
- ;----------------------------------------------------------------------' m1 k" b& l4 v3 V' H! [0 R( O, H+ L
- ;播放上10曲( w0 X* O/ k: F- m
- Music_Play_Pre_10
3 V* R) {3 D- i6 T - LDA FC_Music_Index2 {6 F1 \4 E- v4 _# {% @ i
- BEQ .End. w4 {. n9 u/ A' r# X8 q9 t
- SEC; U1 O7 G4 w X8 _7 Y) o3 n
- SBC #102 I& U8 g8 y! j3 [
- BCS .Pre_10
, ^( {# P" \% v2 x. x" }" | Y - LDA #$00# L7 S/ @2 m: y7 ]% Y6 P
- .Pre_10
. f0 ^/ U' m/ x) Z - STA FC_Music_Index, H6 T, Q. @6 W' r
- JSR Music_Init_Process2 X% v: C0 A' m, n+ w
- .End% p" J7 h f$ a \+ z
- RTS
6 V7 ]1 {+ b6 n! Q9 D8 U4 E3 B - ;----------------------------------------------------------------------3 x3 @+ H- ?! m! ?% m' S
- ;播放下10曲
: \; [) Q7 a7 B, d/ d& e - Music_Play_Next_10
$ o8 _" y) ~' O5 S4 Q$ S2 w - LDA FC_Music_Index
% g- ^" C: N+ w- g* X - CMP FC_Music_Max_Index& _- z" k" e \2 t
- BCS .End# e& {& }# L# w, F: j
- CLC3 ]* Q! F: V w5 G' R: A
- ADC #10
% I3 C& o& K( J* O - CMP FC_Music_Max_Index
# U- r( A% t M. ~: m+ f - BCC .Next_10* D$ A$ k) M) C
- LDA FC_Music_Max_Index
V( ]& f2 w# x' T - .Next_10# o4 Y4 ]' R9 e6 ^: C
- STA FC_Music_Index
# W7 n6 \3 @/ c& v - JSR Music_Init_Process, E( ^" |) K4 i
- .End0 N* o+ l/ e; x* L' I. r7 _
- RTS
! [. A. P2 y" p% }0 M$ }
( \. e" ^$ k% D4 p% j7 L& U' N% \1 ~% i- ;----------------------------------------------------------------------5 D* B7 j- s7 l
- ;8位十六进制转3位十进制制
: ^ q& L. M9 O5 m0 g/ D) g - Hex8ToDec2 r1 f3 e* R. M
- STA FC_Dec_Data_1% \9 I& p3 q6 @ J( Z& x; A, D
- LDA #$00, I/ g6 S/ l/ Y- @+ B1 x/ P$ g
- STA FC_Dec_Data_100
& e" F3 S% y$ ~+ a0 A; ] - STA FC_Dec_Data_10
- Y2 c8 q1 {0 n0 e - LDA FC_Dec_Data_17 G" L1 ^) h9 y) b
- .Convert_100( \( E) B( X( b# g6 K% L
- CMP #100) t' C' R8 |7 n+ c: g* h+ g
- BCC .Convert_10
! t5 l- O0 `, R8 ` - SEC- s; J) z2 k- t! \# I
- SBC #100( A( R* P3 o: E" X: q: h7 U: n4 k# Y" Y
- INC FC_Dec_Data_1005 R( t& T, I) |4 H5 C8 W
- BNE .Convert_100& I) _( p! a, }/ {* ]
- .Convert_10
1 Z' x( A% M8 ^& }" _ R: m - CMP #10: g; b; }" G% R( o
- BCC .End2 `& F) k- |- v
- SEC- ?4 a" B' m5 v# V2 g& m, k
- SBC #10
( W z4 V |0 n( m: _+ W; ]- d8 Q - INC FC_Dec_Data_10
, u8 i* ?: B [9 C5 } - BNE .Convert_10
$ s! Y2 ~7 c Z: n7 J: s - .End. E. {. \5 U/ Q R) r( @
- STA FC_Dec_Data_1 f1 E; e! [& S7 L$ p
- RTS6 M- j" \1 }# g0 v2 p
- ; ^/ N+ s6 k w2 M# G* H: n
- ;---------------------------------------------------------------------- ]- \6 H4 _% b. r4 G
- ;显示曲目信息; ^: s- `4 V* Q1 z6 w, Z4 }
- Music_Info_Display
" F( k+ w* X3 W, \ - LDX FC_PPU_Buf_Count) c' p- f; @. @5 g3 N2 G1 p
- LDA #PPU_WRITE_MODE_CNT_LINE7 m8 ?; e, L% z2 O+ u3 Y
- STA Use_PPU_Buffer,X* y' }7 e; y- C# U& X
- INX
' `7 k& Y# Q) j% r: }, X4 M- D - ' E. ~8 {/ r( d8 W
- LDA #>MUSIC_INFO_POS
6 X2 L' I* Q8 r - STA Use_PPU_Buffer,X
0 {& u- `8 J3 d" Z' D: e7 G - INX
+ _# e8 o7 q$ O2 R4 d* |/ O - 4 G' t: C% y9 C! h" e
- ;居中" ?$ b0 Y. a1 _- B
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
- [1 I7 S4 C; H! I2 W! e - STA Use_PPU_Buffer,X5 t: m8 w2 p9 U- }" d) O2 u1 U
- INX9 Z; x; O0 e& g+ d$ f5 o
-
4 r+ b& `# x: S# z0 T2 d2 j$ d - LDA #$051 x! ?2 ^5 W7 \ n1 Q% U0 t1 S6 x
- STA Use_PPU_Buffer,X! Z" H F/ d4 G4 L+ {4 Z* s
- INX
) n6 F3 Z& K$ u& C6 P7 v) s8 w - 3 L. }! f: B" k
- LDA FC_Music_Index
, K4 m8 a8 p5 H# w8 C6 v - CLC
% h- E( E! ]% R- L - ADC #$01
8 q, e2 }/ V0 S+ `% H1 o0 r9 S - JSR Hex8ToDec% T7 s; `+ X4 S$ S1 H
- / d8 t( S* b5 y, |* U' P# E
- LDA FC_Dec_Data_10
& C, t- i4 Z7 R8 R3 n - CLC: y8 T4 P1 m3 v( N
- ADC #'0'
8 t R% W6 W" F4 e - STA Use_PPU_Buffer,X' q- y; I6 u9 V& k8 e# N
- INX
0 n5 z( S# t% z% w7 F' F -
" c- |8 g7 O" {+ l$ o% i - LDA FC_Dec_Data_1! x1 w2 e$ f6 I& |/ R
- CLC, R+ A6 ~6 c, H5 x
- ADC #'0'1 [/ l9 m, R) ~& P5 R
- STA Use_PPU_Buffer,X
2 W: @5 I. a, n- E! T% l( h - INX
" ]: e4 n D6 w4 G! b -
f0 ]2 ~8 I& j; I+ r3 { - LDA #'/'
* {. I. L$ ] _ - STA Use_PPU_Buffer,X" I% m# ]7 X" v/ ^% L% r
- INX# n0 {9 o5 E, ^. C" J3 R7 t. O
-
/ d; G+ Z7 s4 o' d4 y - LDA FC_Music_Max_Index
) D$ Z# @8 A$ u9 ?+ \. g - CLC& S3 l. o% h/ L) W+ ~& M! {- E4 h. |
- ADC #$01
, S% T1 v5 Y6 }, T1 q - JSR Hex8ToDec9 j) z# M9 c/ t
- * B4 K/ f# x/ `( l: B- s n: ^+ Y
- LDA FC_Dec_Data_10
N- S+ O E* _1 V0 \ - CLC
+ \: \5 _+ }+ r- W( H r7 J& I0 v% w3 w - ADC #'0': E9 [+ ^/ ?. t( |; D5 Q
- STA Use_PPU_Buffer,X
/ c- R: B1 n( `# A7 x - INX" h; e7 k9 C, s0 `
- ' }9 }' w% t! e
- LDA FC_Dec_Data_14 `% x7 x5 o9 k* i; } I3 H
- CLC
8 y) @# M5 x* U7 z+ q - ADC #'0'/ F' c9 U9 `8 a. N: M: o# }
- STA Use_PPU_Buffer,X
* u4 m( t0 y% g9 [ - INX% G- _0 S' O1 R2 J" m# M. p
-
2 W0 ]+ z" X, e3 ^) k% t - .End4 U1 g# s1 s& ~
- STX FC_PPU_Buf_Count2 [/ c, i% _5 [! v" |2 S# l
- RTS. }3 s) h3 V ^8 m
8 K, U/ I, ~# \( |( }$ a- ;----------------------------------------------------------------------
8 K2 B5 {& X; t4 x- S4 x - ;音乐曲目初始化处理
6 F/ Y# G0 h" |; o1 @: f, N9 v- H - Music_Init_Process; i! P u2 @7 n, j: q- Y
- PHA
1 t6 h# g" M+ R0 g; r- q% V2 c - JSR Music_Clear_Process% L" T8 I; ^; X2 y( w+ M
- LDA #$1F
4 e" L6 P1 T9 p9 U2 J' O+ o7 z/ { - STA $40158 h9 v* o- {+ o
- PLA' Z' Z* m1 L" ]( q. s2 P9 b
- JSR Music_Init_Addr
+ }0 J" F% C/ G% q - JSR Music_Info_Display
1 A3 X5 N- y" p6 R - RTS! F3 e @/ c/ n& B- c8 i) b
- . \; c2 \" q( s) R& U
- ;----------------------------------------------------------------------6 D) f% U% o2 u
- ;音乐播放处理 {) R" x% R3 Y& ?- w/ ~8 s
- Music_Play_Process4 V2 o1 M8 ]. t. J$ m( A2 a
- JSR Music_Play_Addr
8 H' u& i% U# ^- |+ T - RTS
& d' A. P, }8 M) a5 V" C4 Z) X' d
5 q6 [8 g' q) P$ l9 D- ;----------------------------------------------------------------------
. Q; s9 X7 r H0 P7 m. e$ `, ` - ;音乐播放处理! g; ~; R8 o& R; {/ y/ S
- Music_Clear_Process) o! K# {5 \. L: K' Q- a
- .IF Music_Clear_Addr
3 s# x0 t. J: B0 n8 e n - JSR Music_Clear_Addr# B) g& X) s# Z& L$ {+ m9 `
- RTS
" \7 E/ d: c" ~9 i' q" w - .ELSE/ W& A/ V$ f+ v+ i7 V
- LDA #$1F
9 k( E0 y$ H) H) U0 ]- _; X - STA $4015
0 J! }6 ^# P6 P - LDA #$00
4 `5 E. E. n! a: M) b - STA $40106 w' z, |3 t2 U; y/ n* e
- LDX #$00' ?6 B+ W9 R9 @/ G" p' y+ j
- LDA #$00+ ?+ \8 a" M$ w- @
-
5 W1 P: l9 O6 ?% V8 q8 w/ O - .Music_Clear_Zreo_Page_0$ b% ^; t! E( N( r: a* c# [% z
- STA $00,X- l% L' P9 ^- G z, N
- INX' o# u8 Y, S" Q/ M' X! g
- CPX #Use_Zero_Page_Begin9 V1 c7 D. i0 |2 B4 V
- BCC .Music_Clear_Zreo_Page_0, }- s5 f! O m( v
- + D. O. \% W& p6 ~8 E5 c
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
' G/ A% [; a, C. }0 B9 t - .Music_Clear_Zreo_Page_1; ^! _- T, w2 o1 C a* [
- STA $00,X& F: t/ l$ n0 s# D3 d* K" [% Q& M
- INX8 L2 b: w, r( Y3 o0 x
- BNE .Music_Clear_Zreo_Page_1" G2 N6 X/ h( A, n
-
' ^. F- p a( p& B7 R) _/ `$ } - Music_Clear_Process_1
$ G. R# P/ O3 ~) Y" D, a6 k - STA $0600,X3 Q: t' C3 z% `8 g; ]/ R/ f2 f& i
- STA $0700,X2 G: M& M: e% I/ F
- INX; o$ z# ~$ Q. ~$ b2 t
- BNE Music_Clear_Process_1
+ l, g* T. I8 b: p$ T - LDA #$10
+ p+ t6 z/ `9 p - STA $4000- `4 X% K* M+ C
- STA $4004* B2 M. Z3 V. w, S! ^
- STA $400C* j0 l. c0 G' `! l* V b' L
- LDA #$002 x( W1 z5 ]( G6 f5 ^
- STA $4008" @ i2 u! i/ ^
- LDA #$0F! t5 M# j t3 v) R& W. X
- STA $4015* s, v( C, x$ ^/ N2 }
- .ENDIF
/ z9 R% b, }$ {6 x+ a/ Y& ~ - ( B: b% _7 D& Z1 ?; X. J: E$ f
- RTS! Z( [6 e9 O D5 ?) E
- : i2 H, e! x2 H4 ]
- ;======================================================================6 j) d' B( p/ p# A6 G! e F
- ;重启处理
( _- |; _% k+ T* z7 a1 O! k - Reset_Program& k3 a n! V+ s) I4 F. M( J
- SEI* v' I+ v1 t$ G! E2 H) A
- CLD7 e$ [% y9 b# R+ R
- LDA #$002 l/ p) j* E3 ]9 [7 A
- STA PPU_CTRL
# B) d% [9 ^& R" X - STA PPU_MASK
1 A8 a }3 D" v# R% N: W! M; H F - STA JOY2_FRAME
* u9 H+ O: X/ I; W( y |, I9 b$ m - STA APU_STATUS! c/ F9 E O0 X! k" h; p
- / u& ~8 x5 W1 l
- ;等待屏幕准备完毕6 }: v( ^8 M" C7 s6 O
- LDX #$02
/ _9 F; {$ r/ g" F9 O - .Wait_For_Screen_Ready: n9 P4 R( g0 d6 z: W$ E1 L2 ~
- LDA PPU_STATUS: Q0 ~* l* L# V4 G
- BPL .Wait_For_Screen_Ready4 Y3 Y; Z9 b. O- m" B" }' P
- DEX7 v# x* T; M3 F( O& z# {
- BNE .Wait_For_Screen_Ready
' v$ _3 r; C. F8 Q - , H/ b6 R5 U1 d1 P
- ;清空调色板2 `+ F0 D+ u q% Q& u
- Palette_Clear
5 f b& o' U( E7 X4 \0 s8 _2 `& \ - LDA #$3F) R/ k' @1 p% J( U$ Q% ~& | Z
- STA PPU_ADDRESS9 h0 B& I: k8 V# R, e6 u
- LDA #$00
" t; {9 W8 D3 a) P, V - STA PPU_ADDRESS. c) b8 ~5 `8 q4 X6 V# v
- LDX #$20
$ {3 l0 @4 I9 ^) v - LDA #$0F1 \0 s* K% K" r3 I! h* _
- .Write_Data
! t" J2 L& E, r! ^ - STA PPU_DATA- q0 J: c! s( Z& w3 X& O4 H% b) t
- DEX) j3 @9 I/ u( m% \& \
- BNE .Write_Data
& g5 v" n7 @- O# O. J5 k0 [& ` - $ i* J% [2 m* T; Y) B5 _( X/ \
- ;清除声音 $4000-4013
0 m8 u. k9 w$ `* F; R- S - LDY #$14
: s& T0 F, {6 d; z - LDX #$00
# M% \, v6 G; Y - .Sound_Clear
4 Y/ W" E }. [& {9 M1 W3 b - STA $4000,X) K6 |" S& W% Y0 v' q) ~
- INX1 M8 I1 H. S9 [
- DEY* d) B3 t3 q3 P4 s
- BNE .Sound_Clear* v9 S, c. g- V: t c
- . d% M% f3 R B
- ;清除 RAM $0000-07FF; B. h; y# J5 q' r
- LDA #$00
' M# C/ L k- G3 f* x - STA $005 \! O: }% u3 J8 t
- STA $01
- o! k7 P8 o* D - TAY
5 G5 a6 Z j& o% b* G1 G - LDX #$083 i0 l3 M6 B1 Z* }9 W. \7 b
- .Memory_Clear0 Q' @- u+ y8 F3 o
- STA [$00],Y
6 ~; o$ K; `9 e! G - INY
" ?( x- w7 z7 b9 `4 V3 x - BNE .Memory_Clear0 e' Q+ i( q. Q! e+ X! ~% x
- INC $01; J8 V7 {! I+ N o4 r7 J
- DEX! t- w1 G P/ U! Y" l- L7 K
- BNE .Memory_Clear* }; h" Y) |1 C" `5 _0 h) N) N( a
- ! k3 ^; h2 k$ X* y# s
- ;精灵缓冲初始化. W1 U3 M v/ n$ q
- LDX #$00% s# }. I! O. u' T# F
- LDA #$F88 D5 G' {5 P7 p, Z) K2 j3 Q8 k
- .OAM_Clear
& a2 f# v, T' A: r0 | - STA OAM_DMA_Buffer,X
7 ~7 {2 f6 j8 w9 d# E; u - INX( \( ~* q4 w1 l4 G
- BNE .OAM_Clear
, c& e' ~( S; U - 8 S2 X( { a: V; [
- ;栈指针初始化
; T& X+ r% x8 b4 ~% m6 { - LDX #$FF
% I0 a6 K! J. I% x& t1 i- F - TXS; I3 o; z x+ v/ u. ?; Q/ G
-
! i( Y; e- S3 [ - JSR Nametable_Clear;命名表清空
8 j9 B6 y- L8 X( u" v+ N% e - JSR Palette_Init;初始化调色板缓冲
u9 k( \4 |# Q - JSR Static_Text_Init;初始化静态文本' M% ]1 W0 u. O3 S3 S% f G
-
9 `: e" T' X* w% F9 n2 I, A - LDA #MUSIC_ITEM_TOTAL - 1
7 }0 Z. P* a V z+ S5 o - STA FC_Music_Max_Index7 g7 A+ D- y$ l5 x+ X, {* R+ @( c
-
6 Z) S& K% @+ ?( \ - LDA #$1F
9 w: V( D% O" v/ X$ w - STA APU_STATUS9 K3 H; N5 [& b: D- p; I1 }
- LDA #MUSIC_BGM - 1# _; m% u6 M- v1 p( ^0 s" [6 ]
- STA FC_Music_Index* d7 K4 h6 X0 N r/ {4 ?
- JSR Music_Init_Process;音乐播放
$ b6 s0 v$ F4 ~& t - ; J# ]# X/ \- {9 [6 D8 q
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)$ f9 m; U( T) P9 K
- LDA #$1E# ^) e0 k& q, g! l0 p" ]
- STA FC_PPU_Mask_Buf Q l2 b3 c2 Z4 d2 m. _' l* r
-
9 B" d, a+ G3 ^5 M0 n! a# M - ;启用NMI处理) ]& e5 j6 B/ M( t' z/ e
- LDA #$805 s% `! ]0 i2 R' m' q
- STA PPU_CTRL
( \3 Z: ~" k0 F, { -
5 h% S% S" T0 \7 c# L - ;程序循环, 剩余工作交给 NMI 中断处理7 b$ X6 d$ y2 n
- .Loop1 v! ~& C- @/ @$ u* v9 L: ]) N; h; ?
- JMP .Loop* W3 a4 p. e; P7 L( ]
- ! a% |, n3 \* d
- ;======================================================================; c* l# f8 Q$ {. G) y
- ;不可屏蔽中断处理: g8 n2 k) o- C% z! |0 K) l
- Nmi_Program
7 n$ f ~& H/ C4 M5 c% Z3 @ - PHA
# Q p- p4 R2 @5 I2 R3 `! f - TXA
( G: I' R" v2 E - PHA
# V! ^. Y$ Z1 R8 _ - TYA# Y7 J6 p* a& K! w
- PHA
- q0 T/ _$ M3 N+ L# H3 \5 b -
' j: o. M- A0 B, }/ K8 Y& a; I - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
8 S9 U3 D( I$ R - / B% ?# R8 b/ _9 f# D4 U
- JSR FC_PPU_Procrss;PPU处理
* \! g' i; c/ y \1 |" A - 2 e6 `6 F: P& i2 s% M# f3 |4 u c( [
- ;精灵内存更新
- k5 L; ~+ H# l% V( U1 Y - LDA #$00
7 a6 Q* ^+ v+ k& u - STA PPU_OAM_ADDR+ q5 n' y* Q! r% F& L7 x9 k
- LDA #OAM_DMA_Buffer / $0100/ Z- J' Y; x2 F3 \" O/ p4 D
- STA OAM_DMA
9 q: M" _9 f A6 @ - ! R/ e5 Q, U* y! L; m' n% d
- JSR FC_Gamepad_Process;手柄输入处理
0 U/ c* i" \/ j" m - JSR Music_Select_Process;音乐选曲处理$ A/ w" O& g+ J9 b/ H
- JSR Music_Play_Process;音乐播放处理 |' Q' [, S6 V8 c
- 1 e# g7 X0 J/ }1 F* Z, z6 m2 j% B
- PLA
2 K+ J5 t, K$ y8 A - TAY: v6 C$ B- [ s: y9 _$ Y1 v
- PLA$ x! f7 E G" ?# a; a+ { m
- TAX
4 k3 K1 o0 y5 v - PLA
! N: x8 Y, c. n( {4 Q# {$ m! _! G) T - 9 G% [$ c5 ]0 w c9 x5 ]
- RTI; b- q) ?2 U: G' K/ Q; Y( W
- % g: \; [3 }/ R# t* o
- ;======================================================================
1 ^2 f, k& v6 P. u - ;请求中断处理
) u! H5 B' i* C% r$ t - Irq_Program; Z! R0 O4 x. O- M' I4 p* D
- RTI
8 v6 U) I6 J _
" B) X/ ]+ L# n# T$ e- ;======================================================================7 F0 R/ L/ _$ M% O- Z. |
- ;中断向量表! O3 E) `+ p7 M7 H' D+ ~0 d
- .ORG $FFFA
: S: A6 n5 j4 B8 [$ T M - .DW Nmi_Program ;NMI触发时执行
5 Y. f& R# J; `& v/ q% E - .DW Reset_Program ;载入ROM时最先执行
1 c6 H y) T0 s0 z" I - .DW Irq_Program ;IRQ触发时执行
8 Q- O3 S7 _: S& G0 o P u
复制代码 " `% e U& ~" q* k1 T; k/ c
- X1 Y8 a$ M9 r8 P! U( x5 @7 A$ Z3 y. G( B3 f( v6 f3 i: D6 J
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|