|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下3 z0 O& F8 _% Y9 N5 U1 z

! S' G( N9 X7 |8 h以下是主框架代码:
2 L" g/ k" _/ T5 Q% W" u7 H }- ;======================================================================/ V5 _: o5 Z& y2 o- J$ u4 C
- ;文件头1 b/ y7 q$ U1 e6 i- J
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
0 ~- k2 g2 ~- A4 |2 E - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量4 }+ u; e+ t! n" Q
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
[" v! _0 m0 F - ;======================================================================
q1 R( U1 C- i6 u5 a - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2( U0 z7 Z0 k. `* g; M' k
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
2 M% J/ w8 `+ ~% w& |5 P. @; y3 G5 A: U - ;======================================================================5 I9 p; p& w4 d4 A& e D( P$ ~
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
) g" R+ ^2 |" D4 u - RESET_ADDR = $E000 ;主程序起始地址
' K: t3 {* Y4 G" C4 F8 R1 G4 o - ;======================================================================
3 v: \- T; Q" g# G- Q; p! { - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB/ X8 y% D0 S" [" D
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB. g: e, s! x0 w+ A' m
- .INESMAP 4 ;Mapper号 (0-4095)* J) ~. C- s0 l, [. u! J
- .INESSUBMAP 0 ;子Mapper号 (0-15)% k" t G+ y! x! T8 ~$ v
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
! l: F3 @* v9 q0 @$ ]* a - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
" o9 O! o! S8 s, | - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)! ^" q* a0 Z# N) o8 {& ~
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
( i- j- O& S. g5 k - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数). [" m1 d2 W' Y H" n
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)2 O0 [: }# f" G7 c! I' n
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
5 D: T# ]" y6 ^5 G7 Y7 m/ N6 X - ;======================================================================
- d+ G4 q- l$ _8 r3 q0 n - .INCLUDE "fc_demo_config.asm" ;全局配置
# D- g' n. V- Z2 C+ Z; O/ ~ Q - .INCLUDE "fc_demo_constant.asm" ;NES常量& e6 J( C4 I: O( f: ~/ x
- ;======================================================================
4 I& A5 J/ o. j" K4 a - ;音乐配置; n$ {8 s4 e, P2 p8 `
- .IF 0 = MUSIC_THEME
: e) z3 q/ u" h7 p- X* a - .INCLUDE "data/music/Gremlin 2/config.asm"7 @7 G, w, r$ _1 ?" H
- .ENDIF
# Y$ m& k: Y* i- W -
: k3 A; d j4 L: `7 o n2 [ - .IF 1 = MUSIC_THEME
- @6 Q* h) e8 t8 V% `1 R - .INCLUDE "data/music/Raf World/config.asm"' `7 K7 E5 }3 G
- .ENDIF Y& g! g9 N* n- A9 B: h- I
- ' K# V( ?+ t# S( L
- .IF 2 = MUSIC_THEME " V& v, _" m; N) Z, `
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
/ R7 n2 r3 }$ k( R* c4 \$ v0 ~ - .ENDIF9 ?* |- U7 ^+ K* T! q
- 4 K8 G& f% s% j3 e5 K' E
- ;======================================================================
! q' D- V" F1 e - ;引用CHR图像数据
- s9 {" Y/ @1 u( ]( a - .BANK NES_16KB_PRG_SIZE * 2
! `: [4 R+ p9 K2 k - .ORG $00001 H! B1 _: N& [( P7 {
- .INCBIN "data/bkg.chr"0 q `! n6 F( }" X
- .INCBIN "data/sp.chr"" U9 d+ @( ]' J- [- i6 J
-
! V6 [" E9 I+ H, g, D5 P - ;======================================================================
! [0 N% ]1 U: Z% a' | - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank3 u; E5 c7 J3 `3 d6 l
- .ORG RESET_ADDR3 A! J( L$ O; h. o
- ;======================================================================0 K3 A. m) g; e+ u/ ~4 `# X
- ;引用其他源文件; z$ m+ t, P# }' F4 j" P# O
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
% o$ s4 I$ ^9 S) ^ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理8 a# h: g% l6 U9 j6 }2 H
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理: C" S' h! a- Q8 D% U+ ?: o0 e
- ;======================================================================
$ j X$ t; j% i; f3 t! I
9 ]! U9 Z2 v6 N6 I1 }3 t0 y- ;======================================================================
$ b# b: Z; s& s. p! L$ y - ;等待VBlank到来" i, Y. `- r7 a: |
- Wait_For_VBlank, Q; e1 Y$ C7 a' F% [, _
- LDA PPU_STATUS, x$ B0 }' T. H$ b& S
- BPL Wait_For_VBlank
4 p9 Q4 {4 R9 u$ [ - RTS9 ^2 S* ]2 c. m0 w4 }) \
- 3 i# z- B4 B# ~ }
- ;======================================================================
# b2 q8 b' `9 J9 z' T% S# ~( S - ;调色板初始化
; x3 [0 k) M# t# h1 a - Palette_Init+ e8 c# r, L+ m0 G" G2 r
- LDA #$3F
+ y: F- |7 {- V8 U# o - STA PPU_ADDRESS5 v+ X& r2 [( o8 `% B9 x
- LDA #$00
1 V% D2 Y2 b- F/ }. Z - STA PPU_ADDRESS
, |( R# D9 s7 J& R - LDX #$00
3 ]8 U6 k5 P* \4 U5 V! J# q' p: Z - LDY #$20$ o/ e' Z- m. F: x; X
- .Write_Data5 l8 g- u: ^: ~5 T6 U+ N
- LDA Palette_Data,X: C) k1 E o* a
- STA FC_PPU_Pal_Addr,X9 A7 l9 i& L: u9 |& j9 ^1 `. Y3 u
- INX) w0 o1 C' K& o' Z
- DEY. [: W; T, |: h7 O1 G0 K0 h* _
- BNE .Write_Data
. ~- |0 C7 L% A5 D4 S4 P - .End
% o7 K& Z% l9 `0 s" o* q - RTS
% C/ }- \# ^) I7 a5 P( |9 \" v
! Y1 \" d7 r' {' N9 I2 |0 D- ;---------------------------------------- ?6 u6 L) ~8 q
- ;调色板数据
; ^; c1 ~; U$ d3 P* v% |1 b% d+ n1 [ - Palette_Data
" j2 n' W% l1 a- Q - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
7 l7 ?& X1 r' e, `& f! O. P - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22' l' q0 |! U% [9 ]; L3 d
- - S4 _8 v; ^; }. M! D6 [: M
- ;======================================================================' w% G0 t) P/ |
- ;命名表清空" C+ Y2 p, O. [9 {+ e" S
- Nametable_Clear
# ?2 _5 ]5 j* k; b9 s& k - LDA #$20
8 Y n2 Z# U9 l4 T( g5 v - STA PPU_ADDRESS
) F" T1 ^) ^1 _7 Y' g2 x' D - LDA #$00
4 [/ Q; F8 }* L I. j/ F - STA PPU_ADDRESS1 e2 l9 N0 s W$ P1 z; ~
- LDA #$00/ m" J; j! b0 M5 b$ y. I+ h
- LDX #$005 i2 ^. x2 Z% \: w. f5 ~' t1 N3 M
- LDY #$08
; P! L2 g1 w) x( |: t& r# `0 N6 r5 m" S" Z - .Write_Data
' B; |; b) S/ H/ Y9 n - STA PPU_DATA2 }$ L1 d2 \9 s# n; h
- INX- t' ]0 l9 w! S2 P; a" Y, _
- BNE .Write_Data
3 R+ Y8 o& |7 o" B3 e ?0 r7 Y0 z - DEY* E* f8 b1 t/ P% n1 ^3 N6 }
- BNE .Write_Data4 |( w @. }3 s- I9 n
- .End. j( {- _$ x& a9 G
- RTS
% e& L! T9 P/ T; c0 E7 h' s - . v6 R6 t! g; ^
- ;======================================================================
' K( p0 ^1 M2 ~/ `2 A d( e - ;音乐曲目切换
R* D" T% E' T6 Y" n: z' D: D( z - Music_Select_Process
4 b3 ^2 k4 T- Y& z4 m - 6 O6 c7 w% z: y% c4 x# [$ ?
- .Pre_Music;上一曲
/ h. X9 j6 A; L6 n3 K - LDA FC_Gamepad_Once( @2 r# c2 P% Z, w0 g- ?% B
- CMP #JOY_KEY_LEFT- U5 c# G- Y4 q, P( g
- BNE .Next_Music
+ Y! k2 m# }1 l( [0 R - JSR Music_Play_Pre5 ~4 S& g# A! _
- .Next_Music;下一曲6 ^9 r( j9 S+ j8 x1 D; Q h
- LDA FC_Gamepad_Once
7 o( z' @- C' A; x - CMP #JOY_KEY_RIGHT
( c, s) r0 H v& b - BNE .Next_10_Music: _& M6 @: G* i# ^: _' b
- JSR Music_Play_Next, K% l' n* f& h# y4 w
- .Next_10_Music;上10曲
$ b+ T2 O1 r5 c/ H4 s - LDA FC_Gamepad_Once
% I/ `) O( Y5 I& @0 S/ X+ o, A- T - CMP #JOY_KEY_UP
2 Y1 o; A# a3 D/ Y# z - BNE .Pre_10_Music
7 h0 n! K# K6 b+ s# y - JSR Music_Play_Next_10. `3 _5 Q& a6 ?$ e$ ~
- .Pre_10_Music;下10曲4 H6 J$ T) G% m" J3 f ~7 t
- LDA FC_Gamepad_Once
' X3 d) d$ V' e/ G6 V! a* Y" { - CMP #JOY_KEY_DOWN9 i; Q. r# `# K! P% s% C! z' M
- BNE .Reset
5 {& A1 X# u1 A) \1 y4 O4 G# G - JSR Music_Play_Pre_10. ?) P, Q/ m2 D7 [
- .Reset;重播当前曲目( Y% Q0 Q. h9 w- U: d& \3 O% p" [
- LDA FC_Gamepad_Once
& h; @$ ~! |1 W8 v - CMP #JOY_KEY_START3 n2 ?( v5 p- b$ k& O" J, O
- BNE .End
9 \+ H2 t+ r. g; v% Q - LDA FC_Music_Index6 ^! u7 e/ D- z
- JSR Music_Init_Process
( T, I, x" K1 _8 x9 b4 A - .End$ N: E0 g1 k2 M y
- RTS
. H, u5 j9 ^; B- b - " _0 E4 ~5 G \4 e' g8 N; U9 k
- ;----------------------------------------------------------------------2 v! x5 F( _2 m1 j
- ;播放上一曲
' k. \5 `7 ]9 p7 p' x" ^: E - Music_Play_Pre% C- _. G% i5 k- d9 N
- LDA FC_Music_Index! O3 x7 U" F$ d* ?( A$ n
- BEQ .End% Z. ~* j) m: b9 ~$ ] A
- DEC FC_Music_Index
' @- I, J7 O2 ?* f. O @% @6 ^3 k - LDA FC_Music_Index% X8 l" i' F9 G
- JSR Music_Init_Process
. z5 X; i+ }3 M1 z - .End
8 \9 m( N# B3 N- D( f - RTS
" B5 o( y% i: u! H" J2 A0 ~7 L L - ;----------------------------------------------------------------------; T. V! S+ R3 q
- ;播放下一曲
$ ]1 j# x( C" T2 Q - Music_Play_Next$ s( z$ s$ F- ], ~
- LDA FC_Music_Index! L& P7 `0 M, V; W9 | Z# h
- CMP FC_Music_Max_Index
, C5 t* c w8 A! Q0 G# W - BCS .End. E0 O) Q& I$ ~: _3 e* y- R8 V6 Y% r
- INC FC_Music_Index X' m7 e; z7 p
- LDA FC_Music_Index1 O- ^4 a& `6 L9 M3 O2 o- L5 z
- JSR Music_Init_Process
[* b2 E0 ~- ^9 |+ p9 ^ - .End/ y0 ? S- g3 H1 l$ z1 Q1 X
- RTS& _+ g+ w0 r y2 Y" k5 `8 a
- & a3 ?1 }% \( [+ V
- ;----------------------------------------------------------------------! e: H6 @, Z' B" o4 J& e) c5 B; z
- ;播放上10曲
0 I9 v5 e- G+ H+ Y; C - Music_Play_Pre_10/ h6 g! X9 \/ _$ G% N# a2 r
- LDA FC_Music_Index A6 X2 b) }" O" V, D3 V
- BEQ .End
; ~8 L' H& @8 d' O( u - SEC0 z. K6 c7 N; A* ~8 K7 J H, M4 E
- SBC #10
% z7 R: n0 l2 a+ n6 {% U. {. z - BCS .Pre_105 a- a( B6 d/ c, ?
- LDA #$00! g! C: ` n9 d. W9 B5 |
- .Pre_10
3 g! P; `0 p5 i5 A: T/ C - STA FC_Music_Index/ v3 ?( k1 l& [+ e; o
- JSR Music_Init_Process3 j2 s& s2 S8 }2 D/ Z7 G; x
- .End5 Q+ L. [, e! M5 B% {: Y' Z
- RTS1 V" H5 N, C; |2 l8 L0 A7 a7 O
- ;----------------------------------------------------------------------
( z. F; U3 |/ r3 E& g - ;播放下10曲- M1 A$ u, C- m
- Music_Play_Next_10
/ a! e) r5 A7 O( n - LDA FC_Music_Index ~6 g1 M7 D" k: D
- CMP FC_Music_Max_Index4 c( x$ i7 Y6 \( g: h) \/ y2 f
- BCS .End* n; q) Z5 K5 g' _& Q
- CLC
$ C8 N; T/ ^" ~) D - ADC #10& W, D- a/ ^( A, y
- CMP FC_Music_Max_Index, N# f# y* P5 r0 [6 r' g4 B/ u
- BCC .Next_10
1 E( g" q) D! E$ } - LDA FC_Music_Max_Index& G- x6 V( U. {
- .Next_107 P% \5 z% \, R% R6 w
- STA FC_Music_Index' b |7 u% ^4 @+ N3 [( i i% Y
- JSR Music_Init_Process6 p( f Z2 h" ~
- .End* N5 a/ d' f n% y( g
- RTS+ S# a+ Z* a4 [0 d! h. j
, S# g8 l' M( J5 H# l- ;----------------------------------------------------------------------
8 y3 N' o6 g7 i1 r4 F) Q - ;8位十六进制转3位十进制制/ b# _1 \4 B; \0 u. F1 I
- Hex8ToDec# n5 O: [; C: K- G
- STA FC_Dec_Data_1
$ ~4 g9 S: B/ O* G3 A0 f - LDA #$00, U; P. H- F0 L6 B' ^
- STA FC_Dec_Data_100) k& s/ [! p+ d$ M( J
- STA FC_Dec_Data_109 B# }" o/ A6 ~
- LDA FC_Dec_Data_1
) J/ u( }3 L5 j5 [, ?4 d3 a - .Convert_100
5 R% i7 @' G m' ^" |/ n - CMP #100( H$ s! P1 |3 i* P' y, y
- BCC .Convert_10
8 _% v' @9 C6 R5 E - SEC4 h9 _' t; [3 V5 H) f
- SBC #100* W: D- D2 Z7 d+ t0 A; V7 F" n3 A
- INC FC_Dec_Data_100, K! V+ V% K0 J) G
- BNE .Convert_1003 i( `" Y: C# @# `( w
- .Convert_10
9 u0 o( M! @$ ]/ S8 ] - CMP #10
1 y; Q1 e M0 S; X% S( H& c - BCC .End
" _- e: R6 b6 L% @8 Q - SEC' {$ b; s3 Y3 H
- SBC #10
" b: m" _; T5 u8 F& R - INC FC_Dec_Data_103 z' H' z9 V$ z9 b' S
- BNE .Convert_10
" A* d) O8 x' } - .End% ?8 Y# O/ |1 T
- STA FC_Dec_Data_19 @ X6 L' L6 V' L/ |
- RTS0 J8 a* g- h ~1 o; y8 r) h
+ Q: | \/ E9 L- ;----------------------------------------------------------------------
! \; c6 ~- ]2 x, k0 l/ I/ d - ;显示曲目信息! u2 B `3 U0 i$ ?
- Music_Info_Display
" s+ K P! ?7 z3 C# U - LDX FC_PPU_Buf_Count+ P5 J1 F4 W Q& V- O$ {. r
- LDA #PPU_WRITE_MODE_CNT_LINE0 B9 K$ h! e- R0 A8 H5 v7 Q% [
- STA Use_PPU_Buffer,X
9 [- I+ R* c3 ^ - INX
- |9 h/ w4 q3 O# M7 J8 E$ l9 r% o/ O - ' V1 _/ @; A/ j/ Q- i6 R; ^3 x
- LDA #>MUSIC_INFO_POS6 J9 P6 v* f2 A9 {, L2 L
- STA Use_PPU_Buffer,X
! D! v' Y$ a3 Z1 u! u' j _2 Z - INX" x t, Z* R5 Z* d" s* S# A1 Q
- ; i H6 V, S- Q, T P
- ;居中
% U, N) F2 o. _6 q% N' [ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
; o3 w, L4 _' n, \ - STA Use_PPU_Buffer,X
2 e8 B: V& @: x3 S% ~1 } - INX1 ]2 A. M) h% f' S, O, Q
- * y0 j+ p( k _8 n4 v7 b
- LDA #$056 J9 N) z. A: j; W5 N
- STA Use_PPU_Buffer,X5 o2 z. y* k( }2 J6 R+ h
- INX5 ^3 m, b) W* j0 q) u7 ~4 k& U
-
# O! e. A7 T$ i* M/ d1 | - LDA FC_Music_Index
0 Z* m u( e- z0 v- n - CLC
% y, I' t' I2 L2 y9 h" S3 H# O - ADC #$01
4 d! i) l7 K4 `/ h+ l - JSR Hex8ToDec. k K* N! P5 v9 G3 ]6 ]7 }
-
( d; |$ ^6 D/ o0 g: t( ^ - LDA FC_Dec_Data_102 ?) Z3 G G" Q
- CLC
6 i1 ~: |! X, q; v6 W+ v: m& f% t8 y - ADC #'0'
* o% L! M$ w! S - STA Use_PPU_Buffer,X
+ }8 W% O9 Z, M) @: a - INX
4 |, J3 E5 C. I( W* E0 i* a - 1 p/ ~+ V/ D, M; t
- LDA FC_Dec_Data_1
$ y8 a$ L) l* C/ C0 K: V7 q4 O; O A - CLC4 u& s& E4 K! @7 e' ~
- ADC #'0'
$ G" F5 w1 O+ a! M3 C+ r - STA Use_PPU_Buffer,X
/ {3 q; q! r2 W! r( k - INX
4 f2 m8 H6 B+ ]# T5 y/ b* F* \ - . S3 y u% T, u+ I. ^' m, Z; v
- LDA #'/'+ }; F; m9 h4 F$ T* b9 j
- STA Use_PPU_Buffer,X5 [, g m% n% T6 Y
- INX
4 A$ Y- H: a9 ?8 _' N4 r/ T+ V' P - 7 `. A/ p! S7 J! ^+ }/ F
- LDA FC_Music_Max_Index" E. ?8 e- t9 I" [* \) r
- CLC
$ v) o {9 u& N) N7 F - ADC #$01
! I L/ Z/ W+ j! P( ^3 N - JSR Hex8ToDec
5 K" u0 m: g% Q+ Z8 q+ r; _ -
; {4 {: _$ i/ ?8 U! |2 C - LDA FC_Dec_Data_10
) p% g/ h2 c3 L% z8 n - CLC5 K/ m; c" B: v' `1 `3 N
- ADC #'0'
7 t4 @# t- {) Q6 u x" Q - STA Use_PPU_Buffer,X& f. ~# y) F0 A5 |
- INX
/ i+ z+ u2 g2 F1 ? - 2 T% }, R( A8 Z" A% ]4 b; Z
- LDA FC_Dec_Data_1
7 e+ [& }5 c$ C8 Q$ t6 |( S7 q! O - CLC" f' d' P \, c4 h% x
- ADC #'0'
& q H& ?* F8 A# g3 B) }( E! {: d - STA Use_PPU_Buffer,X N5 Z9 [2 u, x, w0 F2 B2 s: \8 ?% |
- INX( {2 g* O" O7 k
-
) F& `% Z- h) |0 C& k. E% j - .End
+ i3 s" f+ V( C3 H - STX FC_PPU_Buf_Count: W4 L3 q' D" S/ B ~: }) L
- RTS" I2 c. {" I9 D5 l/ o: J. C
- $ g% [( x1 H0 S" g* k6 v- e/ |
- ;----------------------------------------------------------------------& L7 w+ o" [( X8 \3 F
- ;音乐曲目初始化处理: M8 Y3 `4 d3 |6 Z; T
- Music_Init_Process
; D' a! D5 v: J2 o1 j( _ - PHA
4 Q) J+ Q p8 [1 I9 e( Z4 I$ W - JSR Music_Clear_Process2 X7 I" M* ^2 ]" O' x: W
- LDA #$1F
( H7 B+ U; P, M7 g0 X( s& z P - STA $4015
7 |3 k$ c) ]- C$ O' d2 }; r - PLA
" U9 G2 @5 e. J! ^" N - JSR Music_Init_Addr
@7 u1 E+ m$ i5 ]) ` - JSR Music_Info_Display: F( B# L. D' I Q! _
- RTS
$ Q% G- _( a: {- g! x
- E$ Q j6 s: Z% W0 S( L- ;----------------------------------------------------------------------
1 q+ {9 E6 r; e, z - ;音乐播放处理
9 H3 y4 } r M) D; L/ S9 A, a - Music_Play_Process) _ t/ g6 n' T- t
- JSR Music_Play_Addr
! ` K0 M `. D - RTS
0 C4 }: N1 ]/ ^0 L' L; M
; R J% ]% \ ^$ R% E0 T- K- ;----------------------------------------------------------------------( T7 ^% C) L3 [ S
- ;音乐播放处理, e6 | s: @" f2 y. A4 U8 P' m
- Music_Clear_Process
/ V& ]% o8 d7 \, h8 F% F. N - .IF Music_Clear_Addr
6 X0 o7 x! E. G+ G+ M" ? - JSR Music_Clear_Addr4 O* L: l3 Z8 w, q1 I5 U9 V+ ^
- RTS
! w: [! `( T" e g" Q - .ELSE6 ?# q! c* }5 b2 g! [ J2 g6 Y& q2 P
- LDA #$1F
8 @# O$ C! t9 }, C& N - STA $4015
; m3 B F. }- J/ c3 Q* y - LDA #$00
8 T8 K6 E& P3 g% b7 O - STA $4010& k2 K. ?/ [2 z9 o
- LDX #$00
# C2 ]5 x- ]; P5 ^8 b - LDA #$00$ @& Y; u9 ]) Z+ G Z v
- 3 J1 |) D3 N- z; e3 y- s% ^" T. V
- .Music_Clear_Zreo_Page_0
( `/ B( Q& \1 b* G9 } - STA $00,X2 p. Q- l2 w1 i, ]
- INX
) z0 r5 Z/ I+ ]! t& ~ - CPX #Use_Zero_Page_Begin2 G, A6 g! E# h
- BCC .Music_Clear_Zreo_Page_0+ r% Z, R! C6 J5 R7 v
- / K3 k; I* S) c+ h, I v2 x+ B/ V
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size* ?2 v" c0 u0 l" s$ K' `) U% A
- .Music_Clear_Zreo_Page_1
9 ]* J* P1 U3 D( k - STA $00,X. v; g' Z3 I2 q k$ h7 I& ?
- INX& S: `$ b, \9 W# |2 t w, D4 j, V
- BNE .Music_Clear_Zreo_Page_10 A0 ]6 I5 V2 s5 s* O
-
( @" I! y$ J% o - Music_Clear_Process_1" t6 S) Z9 N; H( X
- STA $0600,X
7 [+ K7 \, _7 Y: f) ` k3 X, X0 [) V! s - STA $0700,X1 ]' n' D. ^; A7 J& @& f9 C J
- INX
# l% O/ x8 l1 N# Q7 D9 }9 [0 b - BNE Music_Clear_Process_1
$ ~) V: ?2 N) v1 p0 N7 D5 j - LDA #$10
( e/ z1 P; {$ a1 k" T) W - STA $4000
( ]3 D% R3 b; ]. Y& n$ u1 K - STA $4004: ?( `" t+ j, |! u+ q
- STA $400C* c6 P( w( N R2 W8 u+ E
- LDA #$00
9 l3 q# T Q/ m - STA $4008' n! r! V* K" p
- LDA #$0F
' Q* W2 }9 q+ N - STA $4015
7 @4 m% h$ z+ y2 [% Z - .ENDIF
9 A& C* ^) F' P- H) B* d4 z4 @" O - % W# v( [7 b. r4 l, q, h7 m
- RTS
% b% x- c9 z4 m - ! H# N5 H. D7 @2 t
- ;======================================================================
. j! c5 a! {- O f& x0 q - ;重启处理
& J' L. @0 z" E7 S0 T7 |. E8 r9 ] - Reset_Program+ |# L) E, e4 Z
- SEI
% r) _2 T: g3 T* y$ z4 U - CLD
8 @- s! A) w. Y& q6 D - LDA #$00
3 q' m3 E$ a5 x" S% @' @ G - STA PPU_CTRL
+ b( C! }) M8 P" F0 R - STA PPU_MASK" O+ `7 x' n' k+ D i
- STA JOY2_FRAME1 V0 G! z- k. \3 ]
- STA APU_STATUS
2 o& O4 ]5 B. } -
& l2 q, p- |1 C3 \. q - ;等待屏幕准备完毕8 E2 e! A2 W' r# V, w
- LDX #$02
1 [ b! Z2 L, u, a! h - .Wait_For_Screen_Ready
% \- q H. o; G - LDA PPU_STATUS+ T) D) h @6 U4 g9 g
- BPL .Wait_For_Screen_Ready! L- Q/ P: G# N8 c2 P7 D
- DEX7 N0 ~& Q3 {% w6 g5 V# k y, `
- BNE .Wait_For_Screen_Ready
s! k0 ^5 B- H0 A; ] - ! ?/ [( T& D% l+ W- |0 {6 D
- ;清空调色板
! _' N1 k- W5 \1 {' J - Palette_Clear
% V4 B. b6 l0 k( d( T2 ] - LDA #$3F
- ^/ H. E8 O: C) V4 k - STA PPU_ADDRESS
* T* G& ^3 P% R8 u- C; z. ] - LDA #$00
5 f0 f% X" k3 u3 |: t. `/ C - STA PPU_ADDRESS
$ ?* r4 [( V' ?( ~ x% i$ c4 R - LDX #$20) ~3 V4 W1 n. A0 t# S3 a$ S8 D
- LDA #$0F+ J( q R9 ~6 v# N* b7 Z
- .Write_Data
. v$ i- A1 g! z' N- J2 g3 Y - STA PPU_DATA. D# O/ o1 j6 ~
- DEX
# I6 b; { o( t; J! [: B5 F3 o/ c$ s - BNE .Write_Data7 o; R9 K4 y* @
- ' Z( k0 p7 u+ V! M# s3 e" s3 K
- ;清除声音 $4000-4013
4 ?, m! {! H$ \$ D/ E - LDY #$14
" h& o" r; p( G+ e - LDX #$002 H7 `/ w- l* B# `4 R
- .Sound_Clear- z. C3 {9 j9 f8 h5 H3 J
- STA $4000,X
% X8 W! @2 V/ f# [ - INX
5 X( X* g: b q& O - DEY6 M/ X1 p3 W+ s5 J: Q
- BNE .Sound_Clear
( ?- |3 [. y4 E$ Y _: ^. c - ! Z) W8 O; }5 z: j
- ;清除 RAM $0000-07FF
! K* ]3 l1 x) H! U - LDA #$001 n% r, h/ q8 ~% l. r
- STA $00
: I0 N: s, W0 F: R+ U. q - STA $01
/ s0 r9 z& ~) C% ?9 c - TAY
3 z( H/ f/ ?$ W6 L/ N - LDX #$087 H# X8 N' ]2 w- p4 {- M
- .Memory_Clear0 } }, V ^& ^4 U n$ g4 ]
- STA [$00],Y( U) j" u! K, T# q
- INY F, w: v; d( U9 H- |) D
- BNE .Memory_Clear
6 Q9 W0 q/ ^* o' U Q1 E* Q - INC $012 V7 `4 J) Z, i8 W9 E1 o
- DEX
* z; X$ s" @. q - BNE .Memory_Clear
4 C0 ^9 A7 N2 Y: \! X, W -
) f; p7 ]* X- l - ;精灵缓冲初始化0 u0 J4 ?* S, |. A/ V: ~% V
- LDX #$00
, _, p4 s, t& @7 M - LDA #$F8
1 r9 w6 v9 w) t6 }1 X - .OAM_Clear3 N9 V5 X9 D4 U- m, a1 H
- STA OAM_DMA_Buffer,X( I3 ?( N3 l, y- Q0 ?+ d0 p
- INX6 P: G" O) }. ^6 s& C4 P/ u+ q
- BNE .OAM_Clear4 c% P7 V$ j7 s2 D3 ?: N# X
-
9 c6 t6 j1 S; M0 ?5 _ - ;栈指针初始化9 ~: z2 H6 A# M1 [3 H4 E# Q
- LDX #$FF
* {% ]3 n0 @6 Z0 q6 J: D - TXS
9 T/ @; v& V% o; ]% V -
) K$ R% Y9 ~8 R5 G - JSR Nametable_Clear;命名表清空
4 T# r d) e @& w9 v. U8 h - JSR Palette_Init;初始化调色板缓冲
# @9 p' {, \9 I% H - JSR Static_Text_Init;初始化静态文本& i1 p( d- O0 a2 V; h `
-
( Y; J( T! l+ [2 ? - LDA #MUSIC_ITEM_TOTAL - 1
9 k& W6 x% `, {" z8 `0 y8 | - STA FC_Music_Max_Index
; a. ^: A$ m S1 ` o. r -
1 n) l0 U- V+ \8 @2 B% | - LDA #$1F ~$ p% u- k/ Q% {# D' w. V ]
- STA APU_STATUS
4 y5 ^: m6 Z! D$ R, i, @6 b ^ - LDA #MUSIC_BGM - 1- x: v+ `) v/ e
- STA FC_Music_Index4 a7 D, n1 Y( L9 N9 v: C
- JSR Music_Init_Process;音乐播放
8 R% d: ~3 `* I4 z# ?$ C -
) U' k6 A7 p$ L @& L: |6 M( \4 P; y - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)* W0 V) Q) z) ~: A
- LDA #$1E
+ l% Z; Z/ _0 ^6 f! d# Z3 K }( m - STA FC_PPU_Mask_Buf
9 n6 b0 y7 J* \3 A, h - % |4 z- {% f2 Y: n9 T
- ;启用NMI处理1 X5 ^2 z( P& P/ |
- LDA #$80
! V4 L7 `/ ? P- V I- Z - STA PPU_CTRL
( }1 y0 M' f, S -
V& i/ {$ C) Z) \5 T$ K; W B K - ;程序循环, 剩余工作交给 NMI 中断处理. }5 v) b* G- J
- .Loop
2 w& v, e I6 O7 B - JMP .Loop2 e( W/ E, r, m8 l2 W
- % q% L! n; [) b2 Z( n) t4 f2 K
- ;======================================================================: P) E# Z" B- v% l
- ;不可屏蔽中断处理
: z2 Y! R: ]3 m0 v - Nmi_Program7 |! X, w k1 P+ j8 K1 T
- PHA
; P3 N. E( ~# I) {# d8 { - TXA$ @/ |* U# s, [
- PHA' a0 w2 V: q6 m" x
- TYA& e' k$ f* j& i6 g* X$ S) v
- PHA6 G# k) A2 t& T, k9 |
- 1 Y8 }1 T& u' R* P+ q5 W9 g$ H+ T/ Y
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
' t6 h, S! w7 B -
9 ] l; s2 E% ~0 I6 Q" T - JSR FC_PPU_Procrss;PPU处理$ l8 U: v: ^$ M0 x/ W) M
- 0 W; L; j7 H. c9 v4 m! O
- ;精灵内存更新# _$ C& E+ g6 ~9 H& P) ^5 _
- LDA #$00
5 V5 f% { {$ D, z! z4 v0 z# m* G - STA PPU_OAM_ADDR
( R6 z9 W1 h; L9 r4 v+ q L4 w - LDA #OAM_DMA_Buffer / $0100
6 ^& m4 [5 {. {7 V/ p) _ - STA OAM_DMA: t+ l" L* B7 z l( V- E
-
) _6 v( `+ M; g( b/ M; U- W - JSR FC_Gamepad_Process;手柄输入处理
: B, t2 G4 z; o - JSR Music_Select_Process;音乐选曲处理
4 z4 y/ a& `/ L- g9 A - JSR Music_Play_Process;音乐播放处理# x9 T: [2 t9 I# ^- E& n
- 1 b( X1 A% C5 b( o
- PLA" E+ [. A9 U* k: b. p2 j
- TAY( k' O, F6 G# ^1 D
- PLA
$ G, {# v2 c7 X7 Y. K( e1 e - TAX
) N( E. Z( C7 c6 h2 q6 f - PLA
( I @- W+ w! W0 h9 k* B% O+ a8 P
, g1 f4 l! a9 A4 u) r7 c0 e! p- RTI" }, s- a& \, \5 s) @ n# n- a
- - d& O7 q! j+ ]8 }+ J, _
- ;======================================================================* G- ?1 p& @" f0 g
- ;请求中断处理; i2 ?# x# _8 T# G5 J
- Irq_Program
9 [- M9 u. E1 U6 ?7 s - RTI
. ~3 J& c& p5 Q& f- } - * m! W% \! o e- M0 \8 r- v5 P( |, E
- ;======================================================================" G- G: H8 p! _. ]# `- R
- ;中断向量表
7 y5 M5 b% _! W, J& S) q' _ - .ORG $FFFA5 P1 G1 e; J0 A, \
- .DW Nmi_Program ;NMI触发时执行: H; }9 @& V' T
- .DW Reset_Program ;载入ROM时最先执行4 C8 W9 l8 y t: G" S! v2 {0 m p
- .DW Irq_Program ;IRQ触发时执行. R- Z. R, }& I- ~0 g3 c. |: x
复制代码
% ? x4 j) B. l# c, |) A, M4 n& Q& t) f0 i. Y' B9 }
% T9 n5 Q& J, x% a, ~6 [; @3 phttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|