|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下1 Y- }2 W9 v+ W1 q* z v. O6 ?
$ Q& e+ ~1 r G3 L G
以下是主框架代码:
7 ^% u s( ~, w' G" X7 v* _) K- F- ;======================================================================
- Y4 i& B, h2 b) Y# } - ;文件头2 {; n4 M+ T4 x2 F
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量* |. X$ b% j i; Y
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
* `. Y' o9 C& I5 e' k" A% R - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码" h" T: n V" K9 R- t& X/ K
- ;======================================================================
$ h( h) G) s0 l1 v8 Y3 v( ~) p+ G - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
4 L& L6 O" b F. x! O( K - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1) a" h' |+ Q6 I4 H( d' F' H5 u
- ;======================================================================
9 w% D/ Q' T/ j% ?. L: [: b0 f - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
$ { z# N" [( V - RESET_ADDR = $E000 ;主程序起始地址3 t, q7 l+ k0 q5 O
- ;======================================================================
_6 A/ K r( B# J - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
( [5 \" q% ^% J/ T. E4 o - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB, k' X( e* E, l; h
- .INESMAP 4 ;Mapper号 (0-4095)% _& d! i, i, R+ H2 P
- .INESSUBMAP 0 ;子Mapper号 (0-15)
4 I. Q& W2 i2 Z* r: r J5 ~* x - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)- f$ u. N1 @* [! @2 B
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在); A4 F. I w5 s. |
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
. V( b+ N" ^% M# S - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
% G; k% S8 g+ Z X/ \ t' H - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
& D# p# L$ `7 j& d - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数); P# A2 A; w5 z
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
: b" F* r9 |% P; ~0 x$ i - ;======================================================================
1 X4 S; G. J: G/ M, q/ h - .INCLUDE "fc_demo_config.asm" ;全局配置* _' W+ g2 j+ E8 V. X
- .INCLUDE "fc_demo_constant.asm" ;NES常量/ M3 t2 I3 y; M( a# B' f; z
- ;======================================================================4 x/ X/ |/ h8 |$ i* g( [/ W& }- I$ b
- ;音乐配置
8 S1 \8 Z' M" Q) c/ S3 s) [1 X - .IF 0 = MUSIC_THEME 0 P3 N$ @1 h) y! \0 }& J* P! j
- .INCLUDE "data/music/Gremlin 2/config.asm"7 P, s/ `" ~) e4 X# n" @2 [
- .ENDIF. l/ Q( _$ G; w0 R
- 7 Z! T& H, D2 F( ]3 `$ b
- .IF 1 = MUSIC_THEME/ X$ d' e# r6 Z2 j$ S
- .INCLUDE "data/music/Raf World/config.asm") b8 Y8 f. m" U! W+ G4 E8 d
- .ENDIF
5 V% o" b1 I2 Y* [) } -
5 Z' t* Q% m' h) k" `4 {3 K - .IF 2 = MUSIC_THEME c% R; B* s( Z" {1 K) q6 E
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"7 g( F, l6 p( f. v* C
- .ENDIF
6 w+ J5 m1 [2 P: S, Q
1 w8 Z8 }1 s1 k, i5 o! g, Q- ;======================================================================
0 ]; `! {+ Z# _3 R+ A - ;引用CHR图像数据$ b1 g8 @! q7 P3 H4 W
- .BANK NES_16KB_PRG_SIZE * 2
8 o% t# M2 q( g! j" v8 R - .ORG $0000# C$ s8 a2 u/ W' v$ S, V7 F; T
- .INCBIN "data/bkg.chr"
* v6 h* ^( f4 x) v) v - .INCBIN "data/sp.chr"
6 ]* c9 D& T9 P0 d; e' E -
- I1 S. r! l3 t8 k6 _" b' a - ;======================================================================
& b+ R5 z8 t% \; A/ a - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank8 e, [# p3 ~3 Y, r# B4 ]$ p
- .ORG RESET_ADDR9 }; W& f3 P4 y0 n! t4 G
- ;======================================================================( h0 ?( T- j5 e7 W6 l6 `3 Z
- ;引用其他源文件
! ]% ], b! Y) G/ y& b7 S" \. `1 S - .INCLUDE "fc_demo_ppu.asm" ;PPU处理2 M2 C. C O0 @( ~' X0 N
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
; s* h& h _1 B/ T% b1 O - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理6 L" t6 L* Z% ~4 b B. W
- ;======================================================================9 n; @- U p- B
- 0 a4 |- ]' m2 H+ G
- ;======================================================================
8 g4 a* L+ E3 h4 U, e8 _# c' i2 m# | - ;等待VBlank到来
1 |! O- M P8 d# O2 P4 O/ A" s - Wait_For_VBlank* {& K( ^$ E: ?& e% y
- LDA PPU_STATUS; i+ ?. K+ S! t k; z! D% o: B D
- BPL Wait_For_VBlank( Y& B. S; m2 P8 [2 ~! c
- RTS Q% x! ]8 q7 _2 G7 l
: B7 x1 G4 R( z3 b8 n- ;======================================================================6 M" y# B3 r7 v7 o! O' M& ?
- ;调色板初始化
! B1 z8 I: x0 B: o9 p - Palette_Init
6 M9 G! m& ^7 j - LDA #$3F
( z. a0 T8 O, v/ [, }# g$ Q - STA PPU_ADDRESS9 }8 o# I$ J- X' u
- LDA #$00
& y v- p) g; M( U) Y - STA PPU_ADDRESS
; k$ p; G' E! C - LDX #$00
3 \ l, a* Y0 b9 v - LDY #$20+ c' W( G. J* a+ T5 V- [( ~3 J
- .Write_Data
- K4 R9 Z: ?9 X& o - LDA Palette_Data,X
5 @$ [/ p& s* T' ~2 N- I4 l6 o, u - STA FC_PPU_Pal_Addr,X7 |; s0 ~% v+ Q0 `
- INX
5 n9 Q5 Q" K" y - DEY
0 ^# M* m! Y$ L6 B1 J0 @+ M - BNE .Write_Data
0 F6 d# Q0 Q1 u1 M% { - .End
8 F1 Q4 @! Y" _1 `- ^ m0 ? - RTS" c2 f0 _6 U6 K) \) Z2 ^
+ P1 O$ k+ Y- O! b4 i q- ;----------------------------------------
1 W9 h5 i- ^6 P6 Q0 u2 {* _3 c - ;调色板数据2 \+ c7 i; r3 f( A) V5 z4 a
- Palette_Data( d& m* z7 m. o2 l# w
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B* A7 O+ q" n2 ^1 M( c! a8 u
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
: D/ c( W" E8 n( u# ^' N- Y -
; [: W; J r% g - ;======================================================================
; M. p4 ?$ M L+ ? - ;命名表清空
8 w; ] B1 C# m% P! b' J( I1 M# `) f - Nametable_Clear) R+ y; H& a' y4 A% `
- LDA #$20' C0 A; _9 a, @$ p i
- STA PPU_ADDRESS8 L8 K1 o: ~5 W- ^) d0 o! h+ E
- LDA #$00
) I- n7 v$ I+ r6 Y1 d" p - STA PPU_ADDRESS. a# ^1 J& z9 Z
- LDA #$00+ j, r9 M, c' I2 d* z4 {* y9 a
- LDX #$00( s7 S" Q+ Q2 Q+ r7 p2 A
- LDY #$08
5 S& {& V, c: Z2 C3 K - .Write_Data9 x$ h% F# Y& O, I& @
- STA PPU_DATA
. ^( }) L# ]( ]; d; n - INX: ?' L/ Y; q) P% q
- BNE .Write_Data
. q5 L6 K0 K3 \! @ d% \' C1 k. a5 a - DEY
) e; h' ]" K* x/ q1 u' m' ~ - BNE .Write_Data
& T5 G0 p# Z' ~ - .End
( r0 t! X! H' P' ^" y4 F - RTS
; ~) |6 e# W( M1 N2 _8 K6 q* k% x9 t - / u/ o6 J8 B4 K! C" N
- ;======================================================================
' a1 t2 {, d! r1 |; @2 c! Y) i - ;音乐曲目切换! R/ T; V* B' J. S- b/ P! N
- Music_Select_Process
8 k+ E! h. p8 ^; @6 K - & g! @( ?7 q* U, m0 R
- .Pre_Music;上一曲
- u" m! V$ x: f6 @2 }) s - LDA FC_Gamepad_Once
* C" [% ?9 I1 v2 f& k - CMP #JOY_KEY_LEFT! @1 {* _' V, {, L
- BNE .Next_Music8 s# a3 A z9 [0 C. x$ W
- JSR Music_Play_Pre
% N0 f; m( M' ~7 G) t& ~ - .Next_Music;下一曲) ^! l0 W1 Q2 ~
- LDA FC_Gamepad_Once% V5 o( \; Y. W, l- ^7 R3 s% h7 x
- CMP #JOY_KEY_RIGHT
5 @% Y2 y6 c y; W - BNE .Next_10_Music! M2 A3 |8 q- C3 w* k$ Z
- JSR Music_Play_Next; Z9 P1 X# L7 I4 j2 ?, q% b
- .Next_10_Music;上10曲: U/ S. u- l v
- LDA FC_Gamepad_Once9 w* b+ r; B- P& U5 e# p
- CMP #JOY_KEY_UP* M/ W% X9 R; n3 B3 ?4 z8 K
- BNE .Pre_10_Music5 N9 U: W" W: z/ @* y$ X& L" e
- JSR Music_Play_Next_10# C, z/ T# W! N+ c0 w5 l' X
- .Pre_10_Music;下10曲/ F% N: x5 M" i3 t9 ]; B) b# A
- LDA FC_Gamepad_Once
+ F( Z3 m4 t5 R% ^( c" H, ^6 K - CMP #JOY_KEY_DOWN$ F- B; _4 k* H! Y' ~9 q; G
- BNE .Reset; z1 f l5 n+ D, w- A7 I: m
- JSR Music_Play_Pre_10
# {' z) p7 A3 Q' ~4 E1 Q - .Reset;重播当前曲目
& ^% h2 s" A+ ~" G) G" ~( B. V: L - LDA FC_Gamepad_Once
' K c5 o9 w7 Y+ B- | - CMP #JOY_KEY_START& G6 _ V g: @
- BNE .End
7 {, ^1 o# p. c - LDA FC_Music_Index( ?% W' o# @6 H4 q1 b" j0 b z* T
- JSR Music_Init_Process1 n4 O/ n* o" X9 [; G
- .End
8 Z3 R* s) M% _ [7 l - RTS
* y1 |; |- z# I6 J* c - : z3 V: E% Z9 f) P' D8 c* ]
- ;----------------------------------------------------------------------4 r" D/ ]: Z' _ n- d; c
- ;播放上一曲- [# a+ n r; D5 a
- Music_Play_Pre8 w0 ?( j4 D) f
- LDA FC_Music_Index, j1 l, z1 E; z! D
- BEQ .End8 M% F# C$ X5 x! [' {8 h0 b
- DEC FC_Music_Index+ _4 s/ h7 F7 @
- LDA FC_Music_Index0 ~; ^9 j% r* n
- JSR Music_Init_Process
9 H2 Y, n9 c/ f. T( Y- ?/ {. G% ~ - .End6 f/ x3 Z) ]7 l$ S
- RTS& v; R: y3 D! z; d) e8 }2 v7 g
- ;----------------------------------------------------------------------
% J% w, C2 b" o z2 k( \: y) Q - ;播放下一曲! n/ p, m& B1 p; @) ?( K( }! u
- Music_Play_Next
+ b# a! {& ?% L. Q2 W4 V7 { - LDA FC_Music_Index
) n3 V, N6 Z/ C - CMP FC_Music_Max_Index
7 \9 e4 U% m& s, r& E t - BCS .End4 ]& u; S' V8 o: D; ]3 P: [
- INC FC_Music_Index) s. q5 h6 [4 k7 P' o m' B* ]" }, S m
- LDA FC_Music_Index! I6 g9 B: F, J5 m+ i
- JSR Music_Init_Process
+ o4 N+ U4 t. o; R$ U- G2 s - .End5 y: |4 p$ j& y2 y
- RTS: {- X/ _; u( r5 b) y- |
7 u: ?: R+ q( n3 X/ F' A- p- ;----------------------------------------------------------------------) N* z; q: u8 j' g2 h+ C0 z
- ;播放上10曲$ ]& M( Y+ x, g" }3 R) A0 v
- Music_Play_Pre_10
. X$ {! g' f, S; K0 t/ Y - LDA FC_Music_Index* p- ?5 l/ }# T. }4 v/ L
- BEQ .End
( A) ]2 F' c* R( \7 d - SEC- L# n; R: Y* |+ D8 M
- SBC #10$ B }" D8 V4 J
- BCS .Pre_10
}$ X- X0 v9 a1 l | - LDA #$00
, e6 n% s0 `2 {9 W - .Pre_10/ k o2 ^5 a0 i9 B4 i
- STA FC_Music_Index
: o0 J( \$ i Q! ] - JSR Music_Init_Process
- t" m* m/ O' G/ s - .End7 J u7 J/ @9 P2 v# O) Y9 Y
- RTS1 Y* @& Z. b/ P W V
- ;---------------------------------------------------------------------- C3 R( J9 X# W1 I
- ;播放下10曲: \9 j# g7 D5 }7 f
- Music_Play_Next_10
2 o1 ~7 k* x) D% N/ p& `1 I - LDA FC_Music_Index! v5 I7 B5 T. ^0 Q5 q
- CMP FC_Music_Max_Index+ M2 N5 D, u C& g3 U7 j6 U
- BCS .End4 U" d! `: j' ]8 F5 U# S
- CLC* D( i# M0 W. k8 w
- ADC #107 W9 ~. o8 c7 I0 |8 ^
- CMP FC_Music_Max_Index
# G8 I3 N9 |+ _8 V2 S# s3 b - BCC .Next_10+ q* Y4 O, F3 H! Z% l' `6 I @
- LDA FC_Music_Max_Index6 L4 a* [+ x* t0 Q! ~8 b# q! ~; A
- .Next_10
( t+ W( \1 D( B( V7 a, R7 C - STA FC_Music_Index5 i+ h2 o& f3 {+ r# I
- JSR Music_Init_Process8 x% I8 Q. A$ m* {$ k/ ?
- .End
( t; i( a' I1 x" J - RTS
! y1 `- ?1 c' r# g) g - 5 j/ a4 P/ A& [9 s
- ;----------------------------------------------------------------------
5 R% Q1 D$ r1 T3 B - ;8位十六进制转3位十进制制
2 l5 G( Y S" H% p. v( e6 v6 d+ K - Hex8ToDec5 j6 r& _5 k2 T5 j( @
- STA FC_Dec_Data_16 t4 y a+ C ~( s8 w% m
- LDA #$00
7 B2 _, R5 h3 a - STA FC_Dec_Data_100; e7 \" F2 \, j5 p, y" n M9 I6 J) f
- STA FC_Dec_Data_105 e$ y4 Z7 s5 @& z9 Q( Q% U
- LDA FC_Dec_Data_18 ?( f5 j# C( s! z3 z
- .Convert_100
# w4 i7 y. S0 {- e - CMP #100
6 ]; N: h& q0 z2 z, U! v - BCC .Convert_10
4 d' S: \5 n" `, q9 _ M8 U - SEC
+ E, `+ H) a6 |4 Q x% D0 o2 G - SBC #100' j0 |8 |) e. E9 w7 `0 `8 f
- INC FC_Dec_Data_100
$ L y+ ~% d e C - BNE .Convert_100% z. y6 H! }/ ^5 j5 B4 \
- .Convert_10
4 n e0 C' x2 I( _- v - CMP #10 f0 F6 P( n0 Y- l- U
- BCC .End
8 V$ _9 b. k" r, r) B - SEC# |; k0 ^2 g' I" D3 A+ E
- SBC #10; w( \9 H; {: x- o! ?
- INC FC_Dec_Data_10; o2 `) G$ K/ o- |
- BNE .Convert_10- e, U& [. X( e' ]
- .End
- o# A4 @8 c! O5 G$ h+ A - STA FC_Dec_Data_1
1 \. o( Y3 s6 b8 Y9 ~% Z% R; U - RTS+ i# s" T5 _2 s
- 3 ~- F7 ]& w! ?4 s* z0 f
- ;----------------------------------------------------------------------
' b8 V3 W; E. L, M2 t# J, U - ;显示曲目信息
' @: j* C3 L( F1 Q% K - Music_Info_Display
' [5 f& Z. c) s - LDX FC_PPU_Buf_Count8 k# G* g( e2 L0 {9 o. s$ G v/ y2 [
- LDA #PPU_WRITE_MODE_CNT_LINE: |0 f \2 n6 r+ }+ a' s
- STA Use_PPU_Buffer,X1 f, l* O# c9 w" n9 M
- INX
* B J: R9 n! ~# G& C - 7 b [) ]) S8 I
- LDA #>MUSIC_INFO_POS. V8 ]- A7 t$ M4 _. G! H
- STA Use_PPU_Buffer,X
$ y G+ E% K5 o$ ?+ U1 |4 B. v - INX `% f1 I/ _/ u' _+ c" \ H
-
2 Z( Z# H9 c6 H0 E/ o - ;居中
' ]: i# ^" u! y' U - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2. U( f+ {' T# ? D$ V* U
- STA Use_PPU_Buffer,X
( O h/ a( H d - INX/ H' ?' _& O; z k6 M4 r
- 0 Z( ~, N s- o" e, @3 X; }
- LDA #$059 J% `; G# N# V) _& }! X8 r! K! Q4 f
- STA Use_PPU_Buffer,X
# z0 ~- n3 F, O* \8 I q - INX0 g) K( C7 m, }7 P6 q
-
# H0 A L$ C6 E+ @/ t - LDA FC_Music_Index2 k& h# u9 D8 k2 B$ N4 Q
- CLC+ \0 H# v* S: ?& z
- ADC #$01
- W4 e ?$ W3 |8 u( R; [ - JSR Hex8ToDec
+ a( C7 t* ?9 Y, ^# J6 x -
, ?0 v4 `+ T+ ?$ V2 d/ f5 c4 j - LDA FC_Dec_Data_10
% v' R, _* g: j2 n, K - CLC
, F+ A9 P+ m# O( T+ b( a! ~ - ADC #'0'$ O- o2 `$ p1 H& k3 u
- STA Use_PPU_Buffer,X) ^: ^& B* \* n; Q
- INX
7 ^4 J2 ?0 d2 J8 x+ u. _ - 8 W! ]' \! {" Y5 l% |
- LDA FC_Dec_Data_17 U- n3 Q8 o! ]+ O$ P7 a
- CLC+ U, l; N( U# {+ z' i
- ADC #'0'; O- ^* ~3 o) c. |1 w
- STA Use_PPU_Buffer,X3 J- {( }; v: g% _$ f5 H Z
- INX% | ]7 Q3 F" r- I& G$ w4 u4 b
- + r" A% Z H3 W# R
- LDA #'/'# T- W- B7 N R
- STA Use_PPU_Buffer,X
j- E8 c" g- V - INX4 @3 a$ s5 W, v+ r) j
- 9 i7 H, q* l6 k K3 N
- LDA FC_Music_Max_Index
1 X, q, ~$ J3 i3 G6 ~/ d - CLC [: N+ H) }5 B! ^! X a5 ^- J
- ADC #$01" \+ [" c. r) D' G
- JSR Hex8ToDec e6 y8 Y1 L) [3 \
-
- l& ?1 Y, Z3 e' J% W - LDA FC_Dec_Data_10+ V% U; A% }4 B2 ?- B3 J9 G1 o
- CLC
2 j; A5 m3 g$ f8 S+ X) f5 ^( j - ADC #'0': R4 }1 U- X: x( H2 C/ N9 S
- STA Use_PPU_Buffer,X( b* G% r2 Z7 k: f6 ]* m
- INX
0 }6 f" z8 m" U- m; P% w - ! ~9 f4 p# Y g; U- f6 @ F5 R
- LDA FC_Dec_Data_1
& l# p _' J% Y, S, J - CLC
1 g1 J* Q% S4 a6 Z. j8 c( [8 V - ADC #'0'1 ~$ s/ N- _6 n6 y& k0 f Y
- STA Use_PPU_Buffer,X
. g0 k# b5 Y- K4 u; P - INX
& W( l" ?9 m8 q) L* m. c, d - 2 \4 m, [: o# R, H, d
- .End! h8 b Y, @7 H9 c/ S- x! J4 T3 a
- STX FC_PPU_Buf_Count
6 `: T* M) |, p2 {2 |! M2 O0 ` - RTS/ G+ b- q) |9 S) Q- i3 D9 o
. |' K( _( }6 T+ H r7 {1 B/ L- ;----------------------------------------------------------------------, a8 X" R8 E: K+ C# X+ [
- ;音乐曲目初始化处理! L' |$ o$ ^' t4 Q
- Music_Init_Process5 B9 i1 A6 y& z l9 I# ^. G
- PHA
) k y7 Y; W* c1 u) C - JSR Music_Clear_Process% v) A' ]. H* J7 n& @+ G# {) J3 c
- LDA #$1F
# |9 }1 w2 V; Q' S J0 ~6 E - STA $4015
2 M6 x# @, z2 q* y - PLA
+ c5 y; g! u E& q! ?: l6 W; d - JSR Music_Init_Addr5 W4 o$ \. O$ D. ^1 D
- JSR Music_Info_Display1 O% n5 W2 J! U, L
- RTS1 [( f4 O! ] d! b' x: B
- 3 N7 C- }- A+ i& k& ^$ g
- ;----------------------------------------------------------------------
- F, V. z9 S# _% p. ] ] - ;音乐播放处理, {9 u$ e) Q4 D% V1 j) U8 F
- Music_Play_Process1 s# `! `# b- i0 m% K
- JSR Music_Play_Addr( W+ F/ C, r* j# {+ J4 C) ]# z
- RTS
% U2 H; q" o, s$ \' w' s
- ^% C3 K8 Y2 w- ;----------------------------------------------------------------------( p; @" n- F" V. J7 u
- ;音乐播放处理
7 a5 H( E s/ J - Music_Clear_Process% z" h; C' p. D, u3 n
- .IF Music_Clear_Addr
8 \* ?" s% B& @ ? - JSR Music_Clear_Addr4 B4 j6 o# x7 _, t% o c9 f [
- RTS: z% Q! o: A4 h0 l! @/ b
- .ELSE, Y. r' O% Q3 x! M7 |
- LDA #$1F N" f: |/ e0 Y4 P+ u; T
- STA $40151 w( a' x7 o4 e
- LDA #$00
9 `, U+ Y+ x. M - STA $4010
3 n' n1 @5 p4 j* f- T' r# ]$ T5 M) g6 c - LDX #$00' _6 K- p4 n a: V- ^# T4 [$ r
- LDA #$00$ o6 S/ j* A0 W& B) T; m* w' n; m- h
-
' M! b3 n3 F6 |3 V U" X0 x( A - .Music_Clear_Zreo_Page_0
. N2 H/ {! c5 @1 Z5 y - STA $00,X
; u$ G: o; F; I: u; F - INX. ^- K2 \( i- K# _7 |9 j; x' w
- CPX #Use_Zero_Page_Begin7 F5 S" d S6 t+ N( w
- BCC .Music_Clear_Zreo_Page_05 {. s, }* C* {5 \$ v( ^* A
- " V, q3 T# i7 ^9 _ D$ b2 Y6 N$ i
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
6 a; I3 ] k- o* D# {" G# x. _1 G8 U) p - .Music_Clear_Zreo_Page_16 H; \9 w# Q, Z1 Y: d
- STA $00,X
, G: E# |9 Y% ]! I* P5 [' u - INX
5 p( a( ]3 V8 s5 u) n - BNE .Music_Clear_Zreo_Page_1 O; ^) @* y) i& K2 U
-
C0 U' V5 G+ |' x" g. c( k - Music_Clear_Process_1
: `3 Y- d4 d2 r - STA $0600,X
, V: ~% v! E" P4 } - STA $0700,X
. c/ ]( }2 `# u) @2 Y - INX' b& n" u* J9 p( G5 \. }- T
- BNE Music_Clear_Process_1
c! d/ C/ o9 x. U8 r) w( B( M - LDA #$10
# s' B* l8 D/ J - STA $4000& @2 s1 r, e; \8 v7 x1 P ~
- STA $40046 ]1 w1 `+ K! h& w/ W* g% f8 Z
- STA $400C
6 _+ c) u; p- E: S/ \# p: {6 L3 [2 H9 f - LDA #$00
) N0 B: u" X" Y* W& w' s6 p) R1 J$ J - STA $4008
0 q- g5 `7 N. @6 a9 \ - LDA #$0F
0 }5 A! F e7 E# Q1 R - STA $4015( T" _' ~! d! [ n$ t
- .ENDIF2 U0 N! f I7 b% ^; o
-
* ~/ H1 D) x; n - RTS
# o. T7 {* O3 I; V4 K7 V, I, n
9 a/ s0 O9 @, R& F; t) w* D- ;======================================================================7 Z& w: T% i) E9 W7 ^) O
- ;重启处理
% I3 H/ q+ W+ ~5 j, z9 X - Reset_Program, y! G% p% {+ |/ w5 u7 S
- SEI
* s) K, [1 U2 I7 w$ S7 ` - CLD
) a) C8 n$ {% O8 _3 Z5 }5 Q( y - LDA #$00
, D5 t' A$ L+ }* w+ I& g1 S+ a$ C* y - STA PPU_CTRL. b- u6 p* `0 k: `( T
- STA PPU_MASK0 d8 U6 I/ @" ] I% h5 G* b9 M
- STA JOY2_FRAME
) H" F0 M! P7 a% s( d/ E! s - STA APU_STATUS
: P2 v J& p% x2 J1 V; T - . E% P5 ~/ d9 V/ O n. c5 h1 b
- ;等待屏幕准备完毕# M( s+ u- z" A
- LDX #$02
5 v3 h# B' n* b% Z - .Wait_For_Screen_Ready
! x. _: ]% H( l - LDA PPU_STATUS
9 Y7 ]1 Y7 s3 b- m: N0 ^ - BPL .Wait_For_Screen_Ready- l/ F& M- p7 S0 I4 V
- DEX9 ~' }$ s) X2 ]6 z# v W
- BNE .Wait_For_Screen_Ready# }3 ~: W* c( g! N/ ]
- : s/ h; J% K( R4 I" ~8 i* i
- ;清空调色板5 i2 L3 e' O! f- l" f
- Palette_Clear" n9 A# L" }2 h: K. p: \& X V% L
- LDA #$3F
* a( S. ^: c" L# ` - STA PPU_ADDRESS0 c5 K: f8 q& o6 k% U
- LDA #$00
9 h& y3 E" o$ s - STA PPU_ADDRESS- h1 T ^0 u/ {' ?( t, Q1 [" q D
- LDX #$207 ?! x% z+ F: g* M( T2 [
- LDA #$0F
. j' \+ I6 t- W, d - .Write_Data" e, N" t' m8 `0 Q+ j8 g
- STA PPU_DATA
1 A+ H# j1 W5 V' p- Y& v+ Y3 S - DEX
) k) f* E& z! ~* j/ A- j - BNE .Write_Data. p( F6 v% Z/ A# e4 y" ?+ K
$ r- P! }, Z5 i- ;清除声音 $4000-4013
! w" i5 f( w0 B$ j - LDY #$14
. m0 k; a# ?5 T+ t - LDX #$00: P$ K# V% p& Z$ ]- |9 I
- .Sound_Clear e( E/ ~! N2 \: G
- STA $4000,X
+ E2 O2 G) _ S# p3 g) e0 q' Q - INX \! i0 Z. M7 r$ j
- DEY2 e# F! U- L, B
- BNE .Sound_Clear% \! T+ I& l+ S5 z8 e
-
G' w% I. Z: s, q c' u; H/ a - ;清除 RAM $0000-07FF( C" D7 x2 C- b5 \: u0 |% ]
- LDA #$00
2 F7 V; L) s4 d5 P/ j - STA $00
5 i- K# K, J" P1 ^, }* i% O - STA $01
4 |) m9 Z+ Y- D+ Q0 U4 o: b; ^ - TAY$ L1 X! B, \) P/ h6 B
- LDX #$08* s, F' {# ~. k7 z" o9 L4 ]. u* I
- .Memory_Clear
9 R0 N" z( t5 f* h" r+ H - STA [$00],Y. w5 d6 Y+ b' N/ b/ f; j
- INY
$ h( s& o; p1 s! @- k8 P" l' ` - BNE .Memory_Clear
! ?7 R1 H/ w; c1 U0 h0 Y1 q0 k - INC $01/ a8 b( w5 J$ A @: A
- DEX9 ?$ \; g9 w3 X. C+ q% G
- BNE .Memory_Clear6 _. q8 M, o7 p/ }7 F5 R
-
8 q( ^, h8 Y- H; p - ;精灵缓冲初始化
5 i, U0 m" G, Z" @# } - LDX #$00" D3 Q% {3 c. |( t, e' S9 p
- LDA #$F8" b9 _8 [7 J: P. d: T
- .OAM_Clear
% F M- c2 C5 d% b d( b b7 E* ` - STA OAM_DMA_Buffer,X+ ]& G$ t" ?% b: m+ P& E6 w1 Q
- INX
/ G3 o0 b2 b7 T5 Y3 {& r/ w - BNE .OAM_Clear
- t& c y: M# j, N( ? - {/ _" d* D$ o
- ;栈指针初始化
9 p1 A5 I c; A- V8 j: J' l - LDX #$FF
5 a' e2 U- k6 k7 F - TXS7 @# [1 U7 p; ]; N( `
- - {- d9 z& Q' z
- JSR Nametable_Clear;命名表清空
- z+ q! x3 g. m: w/ ? - JSR Palette_Init;初始化调色板缓冲7 b) h9 a4 A3 E. }
- JSR Static_Text_Init;初始化静态文本, D* e9 T6 K; K: ]
-
3 j: B9 B- L5 E" [* B - LDA #MUSIC_ITEM_TOTAL - 1
. b" q/ |! u" G# \9 ]/ X - STA FC_Music_Max_Index+ c9 o+ J. F( `( u8 @( {
- + y3 y& R3 {+ p ?# r3 _/ X3 o4 ~
- LDA #$1F0 X; p+ k: [0 G" M* _
- STA APU_STATUS- m" M8 n( K" B$ m0 u* C8 S
- LDA #MUSIC_BGM - 1( l! }8 z$ n# J }4 Y
- STA FC_Music_Index9 w2 i7 \* |: r! u4 M, J- _
- JSR Music_Init_Process;音乐播放. i# T( D+ J. W0 j6 A
- ( _2 n& t2 Y2 b# n
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)4 `/ G4 Y7 D2 I# b. C8 g) B0 V
- LDA #$1E' t- f5 x0 p) w9 r6 ^+ l/ W' D; p
- STA FC_PPU_Mask_Buf! j' I9 f+ R+ N/ M1 L0 S( u
-
; y# b2 y" R1 z& F; Q u% r - ;启用NMI处理
- i, L/ r/ e n% ^! c! ~5 O - LDA #$80 l, Z( |$ o! V5 @1 w5 `6 } z
- STA PPU_CTRL
h# N3 W" _! h -
; ], }' ^% E$ ` - ;程序循环, 剩余工作交给 NMI 中断处理
1 j) y6 Y/ [( O: P; v6 ^ - .Loop
; g* P) }5 G% Z; j" `; s: D - JMP .Loop
7 H7 _9 \6 t3 l) j
: S# W2 U: o4 s7 K- ;======================================================================. D" y- T1 ~2 h2 W
- ;不可屏蔽中断处理
+ I' g+ Y4 u- H4 x2 z8 [& h5 _" N - Nmi_Program# r6 [ e# K, [, N5 k
- PHA
0 t# r. n0 @. v: t - TXA
/ _, x. a1 z1 B* J% S; L - PHA
* ^; {+ J, m( |/ K8 N - TYA
# v: S: d8 u4 P# M7 r) S - PHA
5 @, {# g+ ]+ p+ U6 t$ J; X' d2 T9 A' A+ d - 4 z: p% K, K" z. p6 D
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
j s5 y# p, Z/ W0 y1 j) x$ X - " l" R; g2 z7 t4 r, f" ?) @# w" b
- JSR FC_PPU_Procrss;PPU处理
) a1 _3 a/ b- k1 C7 c! O; x - t& C5 A9 @0 S% i8 g- \4 n
- ;精灵内存更新. E( `0 k" n7 g2 ~. R: I1 G
- LDA #$00
9 O* [! h& x k$ ^5 `& u - STA PPU_OAM_ADDR Z! g5 S; x" P8 n
- LDA #OAM_DMA_Buffer / $0100
! V* Z* t6 S* c% v: y& I) C3 z9 S - STA OAM_DMA8 g/ G" K' d# x$ u4 I6 ]
-
) m9 d5 M, v1 R1 i - JSR FC_Gamepad_Process;手柄输入处理7 T; n" p. U$ k3 ~" Y2 v
- JSR Music_Select_Process;音乐选曲处理
$ Z6 l6 t! @$ {. d - JSR Music_Play_Process;音乐播放处理1 t& @' F( h# o3 z$ G* {7 |, T
- - h, O! T2 d! L* _+ n
- PLA
, |( T3 X0 i% x. ~ - TAY
# ^2 T. [: z8 p; D - PLA! g& }- S/ C/ s/ E( A$ y
- TAX6 O( M! @4 F6 N' T6 ]
- PLA, U% n. g$ F( [ f
# m6 `6 H( X& [* y5 e+ \- RTI
) y6 `2 Q% e8 M1 e# z n2 Q( s
% W1 @8 {% i- u/ b0 s- ;======================================================================, n) k" ` j* C4 e$ s% q5 |" f! L6 Z
- ;请求中断处理
) \$ S( j" H. t# Z2 ~, F) z - Irq_Program
2 {3 }: c! [. b" ~ - RTI
, K! e+ v$ [' {( q3 x - + y0 ]# j. U. |: x
- ;======================================================================
9 r. a* Q* a3 P) a6 a - ;中断向量表. X4 U4 G# ^. u7 X
- .ORG $FFFA- U1 O+ K ~; E- R' a* j% B( _
- .DW Nmi_Program ;NMI触发时执行$ H7 A: m9 [ e; `) r4 K
- .DW Reset_Program ;载入ROM时最先执行! g. W; s7 r5 l
- .DW Irq_Program ;IRQ触发时执行2 L7 B d. ]& C
复制代码
6 n6 b4 q% _- y0 |9 T; V/ f
9 u9 U5 I+ V/ b5 H/ F; c' \2 C0 u4 c8 `4 n
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|