|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下) s; x1 h, {0 q4 P! K% c3 K8 \3 y

7 H4 G7 V* `: T" V1 _" \/ ]以下是主框架代码:
- M0 r6 ?, _$ P& Q3 s3 d. G( Q- ;======================================================================
: M( G' {5 F3 g7 H/ m' _ - ;文件头. f, ?1 h% C6 @: f2 v. K7 a
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量& H/ r& g" J- B
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
3 R; e9 u4 A* M, k' M0 k - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码$ I3 I6 v4 D& P' D" T
- ;======================================================================
+ Y; ]0 k" Y3 H6 W( R6 y - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 21 {) O" h" ?5 ^+ N0 I3 C
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
, d9 r2 Y* Y, |+ T- l/ c1 z - ;======================================================================
4 a+ w( p( b6 H3 c - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
8 ]6 A* t; h9 Q) W* ] - RESET_ADDR = $E000 ;主程序起始地址
8 e: x7 l$ c5 g2 B E" G* F - ;======================================================================2 x/ o# Z! _! e2 W" N$ @: C
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB$ }, F6 f5 V( Y! k& R% e
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB3 G% t$ y/ g4 F" c
- .INESMAP 4 ;Mapper号 (0-4095)
6 r' ]" v, ~" ~# W0 j! e% r4 D - .INESSUBMAP 0 ;子Mapper号 (0-15)
' l9 ]7 Z: V H - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
, I1 B" L6 b, Q - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)* Z: f0 u- Z' V! X
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)' p& t; S4 y, P# P D
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
) s3 a9 j/ ]* Q - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
6 ~0 S% @. ?: \+ O7 Y& R - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)/ P/ }" _1 ~2 d3 r
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)$ d* u/ @/ X( ~, J, E
- ;======================================================================/ h! S8 {2 Q$ g6 C# ~' E; w7 ^
- .INCLUDE "fc_demo_config.asm" ;全局配置
0 B( Z: d& T, S* c l# p0 a - .INCLUDE "fc_demo_constant.asm" ;NES常量+ L4 C1 Z# P/ T6 }0 k' ~
- ;======================================================================$ B. R5 f' T {7 ~
- ;音乐配置: E4 g- {: u+ ~* a& h9 h
- .IF 0 = MUSIC_THEME ' l8 L7 | }( }# e0 U8 h
- .INCLUDE "data/music/Gremlin 2/config.asm"% X5 a2 o' y0 M$ K7 e( d
- .ENDIF
( X* Y' m: k6 i/ t7 U# b - 1 n! U8 i, w3 [. K) T& k
- .IF 1 = MUSIC_THEME% @1 X3 e h0 ~4 m- U
- .INCLUDE "data/music/Raf World/config.asm" ^% p$ T" y- V& C
- .ENDIF
1 v5 _ Z$ f9 h6 h -
! l0 [1 G- \8 m/ r - .IF 2 = MUSIC_THEME
' Y. q8 }2 p' K$ {: t - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"! J. H, D- D2 p% \8 E( D
- .ENDIF$ b/ t8 A7 w' w' O5 k: [* k ]
- : W0 p1 G+ `% [$ o
- ;======================================================================) i- q( z* T7 @
- ;引用CHR图像数据
! r1 q" Z! \5 a. K2 G6 K0 m - .BANK NES_16KB_PRG_SIZE * 2
5 } v Y1 ?$ y4 L. |( H- M9 ~ - .ORG $00002 `4 h3 z# ~) c0 O7 M' Q
- .INCBIN "data/bkg.chr"
" a7 s1 S; p* J+ O" H8 b - .INCBIN "data/sp.chr"
1 n8 p/ {; G* L2 D -
5 x. H- a5 V$ ?9 k# T - ;======================================================================) ~& N% a7 h7 p( L2 G- L8 n5 `
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank* _6 e: f) {& ]" [0 p* D( X
- .ORG RESET_ADDR4 d0 k+ w, F' {+ k9 b# }8 T
- ;======================================================================- D+ Z( P7 ~# @
- ;引用其他源文件
_; k4 k6 z7 G' x4 z* y - .INCLUDE "fc_demo_ppu.asm" ;PPU处理' A' A7 ~- ]7 m- z8 t, g
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
8 ?6 ^9 Y$ N( V# U1 l: [! _. s' N# l7 b - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
9 O* J6 i3 Z5 V; c9 z( i/ T' O - ;======================================================================' m2 ~8 {5 l! U% Y3 x w5 H! }
- 2 _* u; ^- f9 N5 `5 p; k) x
- ;======================================================================
0 \7 k/ o; W# L1 q# p$ E- [. f - ;等待VBlank到来
$ j7 j' ], U' @- E) Z - Wait_For_VBlank
+ e' {' W h$ a2 L: L- D5 G - LDA PPU_STATUS% p, I% O7 o/ z* {' v
- BPL Wait_For_VBlank
^: j% r [! D6 U, g: l4 g2 B+ H - RTS
8 Z/ ~1 b: X5 K: @0 z' J3 t - # o2 v' N! F @/ i3 |$ }7 P
- ;======================================================================. C/ B4 K* M) N1 M: J
- ;调色板初始化
1 o& k" j% V F4 S2 Y2 G - Palette_Init) N3 d, L$ r) A t7 y1 I6 g
- LDA #$3F. p9 a" T) k! K% `3 ]. \
- STA PPU_ADDRESS9 p. V- Y/ R' C% L6 k3 ]4 z
- LDA #$00
& e! e. j% ?9 v+ _# \ - STA PPU_ADDRESS1 f( S1 a6 D( H) ~8 P3 ?
- LDX #$009 J9 ]* r5 e* \
- LDY #$20
- }& T+ o) p7 I$ h Y - .Write_Data# ^; P9 q- R7 h( e* [
- LDA Palette_Data,X
% a7 d# [' K% G- _2 J8 `9 j [ - STA FC_PPU_Pal_Addr,X) I+ f* L5 i. C$ w- J
- INX
K+ G! L+ P: X' U4 c7 T! y - DEY
3 W* o' C4 c' U$ M+ M1 M( F- V - BNE .Write_Data3 T; d( `4 b. Q$ L: J" h! C5 s% o7 H
- .End8 s' t4 C. ~& E$ U8 p
- RTS
4 ]) m$ I# p3 y5 g$ c
! R, B, k W L( N* M: }: t- ;----------------------------------------; F6 B( X. n& F! S
- ;调色板数据% A) N9 c* ?0 |# C" t- k' O" b
- Palette_Data
% P! R1 `5 Q/ V7 G7 N8 I - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B0 H, L" J7 [6 \, S& Y0 @6 Q
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
/ Y6 C8 b" r \3 ]3 q2 B -
% e8 N" G! m7 T6 o1 u0 a - ;======================================================================
5 N- R- w# p3 Y, r$ n# C# \ - ;命名表清空0 L! U7 C9 { G
- Nametable_Clear
& `6 q8 g; H) ^- A+ d - LDA #$20% T, ]. u6 D, T. G& s7 o6 W
- STA PPU_ADDRESS- R% i" ~, K4 q; q) a
- LDA #$00
6 D J0 {( r2 D5 T; t! Q$ Y) f - STA PPU_ADDRESS; J8 v, z. M: t2 N, u% @
- LDA #$00
K* `3 x! j9 E1 E* x0 {* J5 g - LDX #$00
( I5 v" e) \2 [6 l( I% i* i( d& u - LDY #$083 P* }* Y2 ?3 y
- .Write_Data
9 Y; L9 t& q- l" ]; }, K! b - STA PPU_DATA
' h o( I* C; j7 R1 p0 Z2 v' o2 r - INX
( G$ U3 D6 _0 s) J" }% D' J6 L - BNE .Write_Data
) T! }4 G3 i: U$ b$ l( H - DEY8 d4 L4 y" E+ M, E& _9 f* E
- BNE .Write_Data8 j+ @1 r' F& Q4 }2 K& L& R
- .End
) r4 R* K/ N2 J/ r& ~ - RTS
" C: E7 |+ w, I1 Y7 ~9 \) ?0 z - " ^4 w. u5 K. n. ?. z( l
- ;======================================================================, ^4 u/ v2 j" {2 V: L
- ;音乐曲目切换, ^7 a% w. V5 m+ q% O; e8 j
- Music_Select_Process
2 V2 Z6 ]4 T3 p1 R' y
8 k+ b& ~4 O% b8 o3 w! [" B3 h- .Pre_Music;上一曲& V& m+ u& y0 D! s4 k
- LDA FC_Gamepad_Once
( R8 k# R, y- n - CMP #JOY_KEY_LEFT2 b! P$ ^# `2 @$ r: y* G* [" z* F8 o
- BNE .Next_Music9 e% Z6 Y1 G9 O( r
- JSR Music_Play_Pre
) m( b; n, f% i0 j& Q - .Next_Music;下一曲5 o" W, g* ?- V% I* b+ Z5 x
- LDA FC_Gamepad_Once3 Y9 l8 \2 h% b7 }" I Y! l
- CMP #JOY_KEY_RIGHT9 R: O5 d; G% U- d3 R B' _
- BNE .Next_10_Music5 \% ^5 t. w) C" L' ~) g
- JSR Music_Play_Next
# S0 _( ~' g& H- \4 h3 ]# s% \ - .Next_10_Music;上10曲
- v& j: t3 L- }" H$ j3 v5 f! j. T - LDA FC_Gamepad_Once
# K$ C0 ]8 V1 v* J4 G" [7 R - CMP #JOY_KEY_UP0 x% e+ h# K. e
- BNE .Pre_10_Music
7 e6 j+ y0 l- G$ T5 a - JSR Music_Play_Next_10
" O; {5 u4 s0 q% W8 z - .Pre_10_Music;下10曲
8 h6 @6 ]! q% k6 h2 u3 t. I6 ? - LDA FC_Gamepad_Once
; Y1 ^: M) i: M$ o4 D- ?6 k0 E6 B - CMP #JOY_KEY_DOWN
8 b3 d9 O) K n3 \3 x$ J* f, A - BNE .Reset
/ h8 s [ G9 f1 g0 r" X g - JSR Music_Play_Pre_10
' Q" _3 v) s% B+ k - .Reset;重播当前曲目
, f2 X/ d2 n6 c7 A- p9 s - LDA FC_Gamepad_Once: _* Y) _: \4 f1 C+ W
- CMP #JOY_KEY_START
, u; A# X! j* t9 @8 P. e5 w - BNE .End0 K/ e( g1 G" s
- LDA FC_Music_Index; [7 u- f8 S- r) A& l R% T
- JSR Music_Init_Process e! q9 Q) x4 E8 M4 @7 ]; O/ I
- .End
- S- @/ Z+ r/ m; F& S - RTS
# l+ n; G) [/ R1 s, O! m5 V! J1 g
6 s) v7 m: w9 r- [- ;----------------------------------------------------------------------3 l0 ^- K: B) @
- ;播放上一曲
+ a! J8 H: }' |" }2 |0 \' q - Music_Play_Pre$ ~$ A! l6 S' c( M
- LDA FC_Music_Index5 N: N# W3 U6 D" Z9 Y4 A: [9 D
- BEQ .End
. z+ e, V) x6 p7 j/ O - DEC FC_Music_Index
; V; p, H s7 d& c! ? - LDA FC_Music_Index
6 {. X9 S& z1 P$ L* ` - JSR Music_Init_Process0 c' D- R$ i) [- \
- .End5 p. G9 v8 M2 }* M6 E
- RTS8 t1 C7 g9 ^, H+ d% ]
- ;----------------------------------------------------------------------2 N8 j& k; e9 t4 V, O9 k0 j% s- I
- ;播放下一曲
3 C! _/ ^# [7 \) W - Music_Play_Next: }5 p0 d9 E: Z" H8 V' G) r, L
- LDA FC_Music_Index% @# I0 d9 s: c" o, R; E$ P5 t2 @ N
- CMP FC_Music_Max_Index# i1 m8 D: T6 I9 X
- BCS .End+ E7 Z- z I( k* y3 G" B" U! Q
- INC FC_Music_Index
3 o" u& ^7 h5 \ - LDA FC_Music_Index
8 P# q. Q9 K- l$ O* _% a `* F - JSR Music_Init_Process- t# p4 z/ H. W9 I; M0 F" ?7 y
- .End
' j" _0 e8 Z% H( ~ J - RTS
4 r& S$ \: r" b( j2 c* ^ z - 8 k. T% |) a4 v/ P5 C" D
- ;----------------------------------------------------------------------/ M A4 w" z8 D5 a7 W, c
- ;播放上10曲
" K* F: z% R* M, }, k9 v - Music_Play_Pre_10
) ]. B( u8 w. {0 k" g/ z - LDA FC_Music_Index
/ U# @3 J! _! K0 s - BEQ .End
: m, i2 `" Z) I4 U7 ?2 h - SEC7 N: \$ V5 L5 h9 i' y
- SBC #10
3 V* n C. D3 t - BCS .Pre_109 Z0 E$ f5 w0 V1 `1 w
- LDA #$00
5 j+ R: f, p1 {' V - .Pre_10
. h4 u0 b5 w" l9 {* ~8 x - STA FC_Music_Index
$ E0 L$ }( B: R& Q. g - JSR Music_Init_Process, L" S9 s0 f$ \5 J* x- X
- .End
, g! h/ z7 H; C+ c, r - RTS4 C9 \) n- e! P7 T! p
- ;----------------------------------------------------------------------$ \5 Q. {7 k5 u6 o0 {! X! Q
- ;播放下10曲* ~& A$ L* Q* s: X
- Music_Play_Next_10
/ y; ^& G. r; B5 _1 e: v8 K - LDA FC_Music_Index
. ]/ W) q) E) ^7 E; U- Z& a - CMP FC_Music_Max_Index
$ i8 F' \6 z4 x' w1 J1 t R - BCS .End
$ S1 \0 z! G2 I/ e) n9 e1 h - CLC
8 a6 e1 c+ P* r* Z - ADC #10$ s7 b# |! e+ D8 ]! m& o4 ]
- CMP FC_Music_Max_Index
& {- L P/ J& s7 Z& u5 w - BCC .Next_10- g: R- S/ l2 D R. b
- LDA FC_Music_Max_Index, s5 |, G: D, M% v+ N. ]2 ^6 {
- .Next_10# ~0 a/ y( N6 n) ^- Z
- STA FC_Music_Index
* G& g L. b( o% A& S- B - JSR Music_Init_Process7 b9 Q0 v# G0 R# `# |
- .End
0 L* Y! B: z0 t! g - RTS
% E/ Y4 V3 ?) y# c1 T: O - ; V7 r6 m! p- c9 I- O
- ;----------------------------------------------------------------------
3 {4 j: {$ o' m( J - ;8位十六进制转3位十进制制% h3 S4 X; C0 {" @ Q( U- d
- Hex8ToDec( n' y& |! y1 o# D6 O" s& y% K
- STA FC_Dec_Data_1: ? _* W) N3 U* w/ W# k
- LDA #$00
+ \9 j/ A9 e: }' h+ U - STA FC_Dec_Data_1001 j) r3 ^% V0 a
- STA FC_Dec_Data_10
5 P. b \6 B& q6 @! G" G, ? - LDA FC_Dec_Data_1
' D& Q& M# `% T - .Convert_100( R5 W) T W$ B( a* E7 V- m. q
- CMP #100
k# P) Y$ U0 m" p$ F! F* {2 G - BCC .Convert_10: i8 K: m3 v( l5 @
- SEC* V5 |- `1 D y4 Z T$ |. w
- SBC #100
' z9 j! ~2 Y o0 N1 W, U) `) u - INC FC_Dec_Data_100" |/ i9 @! \. Z8 \ z) @
- BNE .Convert_100
5 i- X+ }/ X" _! x0 x' q @ }) f - .Convert_106 o$ i8 {+ y. m" A+ v
- CMP #10& A: b/ [: [1 Z
- BCC .End
' o$ b& Q' i( ]+ t! _5 H - SEC
9 v1 q, _3 e* j* U4 `( ^7 Y+ k - SBC #10
% I) ]1 k' E, T1 Z% N - INC FC_Dec_Data_10# c) r {+ \6 i- W( ~
- BNE .Convert_109 x! K+ w1 t) E) k* ~# V/ \
- .End
" _. i$ P3 G/ U - STA FC_Dec_Data_1. F) q- k; c4 e# l; G
- RTS
8 f3 K8 v: u" O f7 J( E! f - + o5 a7 A. q, t3 U" O$ V! u1 V- E
- ;----------------------------------------------------------------------
! m6 F# R$ x1 g) J - ;显示曲目信息
6 w8 V2 B2 L. k8 b - Music_Info_Display
. `' \3 l, o. t) }1 ~ - LDX FC_PPU_Buf_Count" t5 G+ X' q. \* y/ p# v
- LDA #PPU_WRITE_MODE_CNT_LINE
+ z. N- j5 C; o5 E2 a/ Q - STA Use_PPU_Buffer,X+ d5 t. E& d: X- N4 e! U* Q
- INX
1 z" x# m8 y) Y& t1 Y; Z -
/ p1 E Y1 ?8 I8 C( T- n1 L - LDA #>MUSIC_INFO_POS# k p& E5 g2 e8 V; D. Q5 q7 @
- STA Use_PPU_Buffer,X( `" E3 }% I. b8 t3 b* u
- INX$ b9 Y$ e H3 W
-
( R" @: u( M) X3 Q: i* l/ u1 M - ;居中
3 G8 k9 t, Q$ W: d( v2 M - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
3 H1 j0 _2 O- }( t, N& B - STA Use_PPU_Buffer,X
: e# }4 ?8 Z- l9 t {) C& f, q/ | - INX
7 G/ d+ Y, a5 C3 ]0 u -
) m7 f. C; q* T8 F - LDA #$05; @, t ?6 P7 t6 [2 ?- v* K
- STA Use_PPU_Buffer,X5 S) T) d+ o) N. J
- INX
! O# r1 a5 j" Y* ~ -
: c) O9 m) Y I* W - LDA FC_Music_Index9 v6 r0 ?/ s- M7 R4 [* N
- CLC
& E" X- r# q3 q9 M0 m. F2 R& M - ADC #$01
9 w" |; D5 n ^' ^/ b3 |+ D - JSR Hex8ToDec3 c. J# d/ R$ B, ~
- $ L5 j4 {, ?. X$ ^
- LDA FC_Dec_Data_10
A' Q/ f; K) ^9 f. g) ^ - CLC0 z9 n! {7 C9 `7 S* V- e2 j' [
- ADC #'0', e- [9 z9 I" _6 @3 R
- STA Use_PPU_Buffer,X
9 |" j: ]- t5 t- z - INX
: g! K' _& { h9 {% ^# L - * c5 T& J$ t8 y
- LDA FC_Dec_Data_1
( i" g1 F: ?- f( J+ l' ~! K - CLC( z9 m0 u0 L! R4 W
- ADC #'0'
8 D$ N i3 L$ R, Y+ n& m - STA Use_PPU_Buffer,X
, V z. x# H1 T% G: A1 A - INX) S6 L0 P# p2 ]. w: G. F5 i
- " Q$ P$ Y' }+ `. y
- LDA #'/'
6 N$ y- C" K x0 R( }: S* \ - STA Use_PPU_Buffer,X# ~0 w$ h* H# h
- INX
( M) I, w$ B' I8 v* _ - 1 ? s, P4 L/ ^/ i; p
- LDA FC_Music_Max_Index; S# U- l2 N! F( r" N
- CLC
) @3 f6 v7 w0 C- W1 T - ADC #$01 Q* D5 M; J; w2 O3 d* m% m* n
- JSR Hex8ToDec
; e& O) V- W# f" n( V - , o/ d2 e, j7 u5 F% S) d# F
- LDA FC_Dec_Data_10) }/ i0 _( E* _% Q/ F2 m
- CLC8 C# ]0 D. t p& f! s* F. V
- ADC #'0'' O- z- o7 ]: t) S% p# R
- STA Use_PPU_Buffer,X# K! d: @$ u+ M4 H; G
- INX
^" i6 t) l- F5 v/ N4 R7 _ -
; L. u' h5 {4 o - LDA FC_Dec_Data_18 Y+ g V! z. [" R4 b
- CLC
. U* [' a, P' b" | - ADC #'0'- D2 e( y/ `7 e e4 ]4 a
- STA Use_PPU_Buffer,X7 t: ?3 }* g# _3 c
- INX
2 G' f( \% M) w+ e -
0 L& L0 A0 z0 O - .End) j3 `0 s7 k0 O# Z8 x. e! ?7 L
- STX FC_PPU_Buf_Count4 A5 u5 }7 k5 r, u2 B# ]+ V% ]- R
- RTS
. u# c& ~; L: Y5 B. h& |) z. C
; z) k' B8 Q! q+ v- ;----------------------------------------------------------------------
9 a0 m- X, A9 b4 D- a& O - ;音乐曲目初始化处理
# W! U' Y; x t9 n' c - Music_Init_Process6 c4 F% S, z+ t
- PHA" ^/ n {% P: t- w
- JSR Music_Clear_Process) N1 f9 C7 S, j* p# D
- LDA #$1F
5 R' S+ S+ _0 }- H - STA $40156 S7 m0 }! \1 \" W& w0 Q
- PLA l, g8 U' ~) m* b7 s& Y7 s) K
- JSR Music_Init_Addr
; x- J2 L. A/ X' W& Y) q- B( g. V - JSR Music_Info_Display
- k: }+ K0 e2 Y& g% i - RTS8 s# U0 F* Q0 t' S, }* }
- - w1 x* H) \1 o- @8 X( f
- ;----------------------------------------------------------------------
. K+ V G+ g3 i$ m. B" ] - ;音乐播放处理8 W7 b0 n2 H$ T! E- A& H
- Music_Play_Process
/ ], W7 F( Y W - JSR Music_Play_Addr' m4 h( `' T) m8 b$ G9 v
- RTS9 g5 G9 v/ z2 M5 p! p
# d& K6 f2 {& B r- ;----------------------------------------------------------------------
2 u% |4 @+ c" f, G- _ - ;音乐播放处理, S, R+ o- G4 x8 T
- Music_Clear_Process
9 F0 A, k7 C, T: ^. w) D - .IF Music_Clear_Addr/ c! C* F, w2 P g, ?
- JSR Music_Clear_Addr3 ~2 F3 H; L* l* g1 d
- RTS; d0 ]' x. l3 A3 ~% ]6 n
- .ELSE; ~( I9 ?4 D- R" [& x
- LDA #$1F' _: y+ t- [0 g: _
- STA $4015
0 A2 O) {6 j( f3 v/ e7 ]- ] - LDA #$00 A a+ {: u! M& b4 S9 s
- STA $4010. A3 R! q# f1 r- C
- LDX #$00
; N# R0 h( f" x( u' _ - LDA #$007 W' f, V4 b" ^+ _0 W
- / c$ n# u$ v4 Q/ d$ }, q4 u' x7 u
- .Music_Clear_Zreo_Page_0+ e, h p6 N" q# ^8 X* D6 O
- STA $00,X
7 I' @6 W1 a' z- c( s9 N; v P - INX( N& i* z/ f, k2 j4 x$ H
- CPX #Use_Zero_Page_Begin0 E6 U6 z# U0 Y
- BCC .Music_Clear_Zreo_Page_0
' P* q* |! s* ]7 Z" z, ~; m# d9 C - ' J( m8 k0 z% y8 K7 m
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
. e+ u! c; u, p5 j0 x/ { - .Music_Clear_Zreo_Page_1
- g z! d9 K" J8 a& P* z - STA $00,X
" L. q- p R4 z5 k' b - INX k+ H5 ]- A, s* Z5 B3 m
- BNE .Music_Clear_Zreo_Page_1
U7 d) u5 M, G) Q - 7 x! W3 ~% X& h4 x, }
- Music_Clear_Process_1
2 i7 j& i- I& `. r5 t j0 T6 c4 `- D, X& j - STA $0600,X
. `0 w, s# v+ o& z' T& j - STA $0700,X
. [+ O8 s# n8 A! ~' B - INX7 w. L. l/ D+ p$ i
- BNE Music_Clear_Process_1+ Y9 t% a" V9 R/ F/ l: i% E
- LDA #$10" O! {: T+ q# K8 F3 a- w; t$ }+ N
- STA $4000- c$ d# t. \! E, s4 K
- STA $4004
1 n- l8 a: M9 z( Y2 t# z1 M - STA $400C
1 F3 i; o6 ?" D' c+ v) v - LDA #$00
( E& L$ N; g9 p: i5 v" M- u5 A - STA $4008
4 c2 H0 y# `' \# E. I b U - LDA #$0F" ]2 Q O9 @3 L- L
- STA $4015, M; o. @1 {" M$ V; ?' M' w
- .ENDIF' R9 G" A) b: Y2 x9 Y/ t7 [
-
4 S+ D' _; D3 ^9 O N$ r* [+ w - RTS6 t, b% b2 l) Y8 T7 T5 A; S
; _5 F/ N4 O# k4 g; C- ;======================================================================2 d$ c$ Q. J7 [
- ;重启处理. u K& j5 Q- r& K
- Reset_Program
) `+ d6 Q' {+ o) Q6 m - SEI
' k% J& w, P( n3 q- d - CLD
4 u/ R( [& `/ k: g+ X6 y$ W s - LDA #$00
# _7 [) Z8 g: t& _; }9 ^1 A - STA PPU_CTRL, k. O7 }4 J4 {. f6 m% U$ D1 T( I
- STA PPU_MASK7 g, \" L0 c& i B9 Y2 t( c3 E& x1 }
- STA JOY2_FRAME
/ \3 z& k% V, Q. y9 y2 K - STA APU_STATUS
6 U; n1 @2 U0 N; P4 ^" Z3 w -
- i; e8 [4 W' A - ;等待屏幕准备完毕
2 B; Z" Y* @8 @ - LDX #$024 X6 T* D2 d7 y8 s0 d+ c
- .Wait_For_Screen_Ready l B6 a7 V# v- C2 N3 A) y( W9 t
- LDA PPU_STATUS+ v4 T3 n8 |/ O. c% l
- BPL .Wait_For_Screen_Ready
* h& }7 H& k; v/ t - DEX
6 m/ [( Y) T2 Q, N - BNE .Wait_For_Screen_Ready
) J; V$ I5 g& c7 L - ) L) T9 W0 W Q8 v
- ;清空调色板
1 J: U$ ^2 p b& J/ M# \$ T" T( t4 t - Palette_Clear
6 _$ P6 d1 P3 G( { - LDA #$3F
3 d( p+ v7 B. _* s - STA PPU_ADDRESS
& k2 Z$ \* \ _ - LDA #$00
* j5 G; y7 a8 L6 n5 G - STA PPU_ADDRESS
2 ]3 R! l/ C' v+ \: ~, {3 Q - LDX #$20
- z& c" ~( r5 M. n9 g9 z - LDA #$0F
; ?- Z I) h; D7 I - .Write_Data N$ @; [6 K1 c* G/ S
- STA PPU_DATA
( D$ ] ?% a6 ^+ N3 C. s1 A - DEX9 r3 y; ]6 P' p8 a0 t" y
- BNE .Write_Data
: o# t4 Z& l. z I3 M
2 T* i" [: M {; a/ j0 ]1 x- ;清除声音 $4000-4013
7 g. R" ]. h2 @$ v/ t* g8 J- e - LDY #$14
1 a$ T, ?' \% N) G, r3 O. } - LDX #$00
! q$ V _+ Y* k) z5 w" B, U4 _: L - .Sound_Clear2 s B# w# O& A ]7 T
- STA $4000,X/ P/ A% m3 n" \
- INX
2 O9 _2 x% `# J T6 F - DEY/ w. w4 {3 l* @ q! ^ {7 _
- BNE .Sound_Clear/ P( X8 a3 I( I; Q0 N
- 6 w; U) Z9 d1 [8 p V- q6 j4 m
- ;清除 RAM $0000-07FF
7 j8 j+ ~' Q/ Z/ B$ s1 J* k - LDA #$00$ N* ^- L9 y+ }, `+ Q: Z
- STA $00
. M: r/ R5 j+ s( J9 a - STA $01
" m. I" m. @/ B6 |% e t - TAY
3 h( e: H) s. R) y9 x2 G8 @ - LDX #$08- B* ^/ }6 W% ^. i9 S
- .Memory_Clear: A( B5 O/ _5 l7 K% H
- STA [$00],Y) L9 Z1 a0 V, R1 L# P+ S" j \. C
- INY7 e, R# V; G' ^: D
- BNE .Memory_Clear/ z" |. D8 N: L9 V; z5 |
- INC $01
9 r! B# z! D5 d$ @1 _& o. i - DEX
( }; ^) t- `! f6 D8 q% I - BNE .Memory_Clear5 a9 x: y/ b4 m' F
-
5 N, ~, e4 {' u4 w/ G/ g/ [ - ;精灵缓冲初始化$ p: r S- M% Z3 o1 z4 u
- LDX #$00
0 Z+ z: r" `% @' D3 _, q, [+ C - LDA #$F8
- m- F2 k' y% @1 ? - .OAM_Clear
3 U* ]9 @# x7 q' A b - STA OAM_DMA_Buffer,X. q3 f+ j/ L) `. o7 j. [
- INX3 c/ \$ j$ D* M# U/ F
- BNE .OAM_Clear
6 ?: U" v7 M5 S1 g7 u% Y+ F) @- F - 3 `2 E) Q" T3 _# I" ?' ^* Y
- ;栈指针初始化
* }! j( o: s7 y- I9 P - LDX #$FF
: A. Q' O2 h* v, r( f2 i- u& Q - TXS
; w" W/ i+ o+ d x+ p# }1 T -
" Q( _% `# X1 M9 @! _, f9 I! g. K - JSR Nametable_Clear;命名表清空7 ^: P1 i5 X$ Y/ ~, L) i' ~: A
- JSR Palette_Init;初始化调色板缓冲1 U1 A; q) [5 x3 d
- JSR Static_Text_Init;初始化静态文本
. ~4 F6 p( V( L2 r8 R - ' V r$ j: Z! ]6 f* {" K
- LDA #MUSIC_ITEM_TOTAL - 1
, o) l* L9 L8 ^5 R; ` - STA FC_Music_Max_Index
1 G; \ K( g# P F -
/ K5 m. \: z/ O, q: C% }) ? - LDA #$1F
4 v5 j! o- Q( p# B7 |4 O - STA APU_STATUS$ i! e! S j u, E5 o
- LDA #MUSIC_BGM - 1
0 e# y- k1 j. ]7 z. L - STA FC_Music_Index' C" Q9 ?, a; O' Y
- JSR Music_Init_Process;音乐播放
2 E" _ @& }/ h6 x. w2 W' I -
( |) c- p* e7 O' M. ] - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
7 q- R- C, v6 B! V+ L1 {5 ^; q! s - LDA #$1E
- A, o) h( _, m ?7 j6 i- B0 Q - STA FC_PPU_Mask_Buf6 I) x; L) i+ ~
- % F j+ u- Y# [& @* ]# U
- ;启用NMI处理
& q, c" o& e$ j3 _% ^0 d - LDA #$802 L8 c) E9 v8 i' u3 U, U# K
- STA PPU_CTRL
7 z* Y$ D1 u" N6 N. O( h, E -
+ a+ N1 {& w9 g% ^4 u8 ]1 n( W - ;程序循环, 剩余工作交给 NMI 中断处理
$ ^, O. E C/ m8 g# p! ~" Z - .Loop
1 q' Z1 H& a$ _! b - JMP .Loop( Q. D! ]0 l) }- v' f" I
( \7 [7 P4 J' Z# M7 P j% A0 c$ K6 X- ;======================================================================+ F$ f" ~" o6 T' d2 l; P3 x/ j
- ;不可屏蔽中断处理- [2 v/ m' p% o8 ~" r( D0 V
- Nmi_Program
9 Y; M' Y+ P) L' T5 M0 K - PHA# d7 W4 h0 ^. L2 j4 `$ Q
- TXA
: c V- e C7 J0 Y+ N5 |, w* j - PHA- g$ u, D& U) e% H6 n8 O
- TYA, h* @0 G$ e5 Z# e1 d
- PHA
% N& i4 K. Z0 z/ Z. k0 N* f4 A - # v Z- t# V- h1 a% i7 a
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位2 p( \+ v4 k( Y. I& I0 H7 k
-
# W. U p6 v6 t - JSR FC_PPU_Procrss;PPU处理
9 X; M7 R2 Q) F. z1 j I- z - " L& k$ D% D" g
- ;精灵内存更新
2 R) b' \: U" f2 B - LDA #$00/ W: c/ K: u- e( P( ~7 U6 P
- STA PPU_OAM_ADDR3 M5 r+ r6 a9 [; B* y5 E0 A, e4 ?
- LDA #OAM_DMA_Buffer / $0100, M$ L$ R8 J1 R$ }
- STA OAM_DMA1 w9 h! Y3 @5 L" m( D3 p+ t, H
- ( m! ?6 a5 d1 F8 b
- JSR FC_Gamepad_Process;手柄输入处理
+ ]# K' i, B7 g5 O) x& @7 s, w - JSR Music_Select_Process;音乐选曲处理* s& `) q. ]) z' J2 }. H
- JSR Music_Play_Process;音乐播放处理5 u6 H) r% Z+ g4 B8 o
-
6 w5 J$ B" T" T6 N - PLA* c v. ~7 A# @( q3 T# R1 z
- TAY4 ] s3 P X6 U; E7 e
- PLA) d7 ^ ~+ _% l! I* [3 [
- TAX. h, n) M8 _6 D4 U" g. G4 O
- PLA! h5 K; L9 C& T
# r- v/ H0 V5 |1 H- RTI
3 s- W3 l9 I! g @0 D1 D) U" c3 u
1 @2 s; \+ V f5 c* M2 r- ;======================================================================
. I1 E' R3 U) A1 U: {# }* w - ;请求中断处理
, F" d7 _4 v# B$ G ? - Irq_Program
- r- j+ @1 l; [0 v - RTI
, V; s ~7 M( M, @- v& G% d+ `, E2 J* ?
8 M5 o3 i3 G2 v# U5 i- ;======================================================================
" k% i Y3 r$ n - ;中断向量表
! n4 {5 Z. b6 x9 e, D$ A - .ORG $FFFA
0 G4 j+ S' W* R: z9 m6 { - .DW Nmi_Program ;NMI触发时执行9 M5 u+ v2 F! i+ P% i7 V# Q
- .DW Reset_Program ;载入ROM时最先执行
' {/ [7 E# T' _/ Q5 ?1 p3 q - .DW Irq_Program ;IRQ触发时执行
# |' S$ V% P9 h ~* q% W5 l
复制代码
; y8 A3 q1 g7 d4 d9 m. y9 k. e3 T) M: @9 q) g6 I; D2 j
5 `$ G. V6 V( d/ j6 A
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|